drm/amdgpu: cleanup HW_IP query
Move the code into a separate function. Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Chunming Zhou <david1.zhou@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
62347a3300
commit
a245daf3d7
@ -263,65 +263,15 @@ static int amdgpu_firmware_info(struct drm_amdgpu_info_firmware *fw_info,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
static int amdgpu_hw_ip_info(struct amdgpu_device *adev,
|
||||||
* Userspace get information ioctl
|
struct drm_amdgpu_info *info,
|
||||||
*/
|
struct drm_amdgpu_info_hw_ip *result)
|
||||||
/**
|
|
||||||
* amdgpu_info_ioctl - answer a device specific request.
|
|
||||||
*
|
|
||||||
* @adev: amdgpu device pointer
|
|
||||||
* @data: request object
|
|
||||||
* @filp: drm filp
|
|
||||||
*
|
|
||||||
* This function is used to pass device specific parameters to the userspace
|
|
||||||
* drivers. Examples include: pci device id, pipeline parms, tiling params,
|
|
||||||
* etc. (all asics).
|
|
||||||
* Returns 0 on success, -EINVAL on failure.
|
|
||||||
*/
|
|
||||||
static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
|
|
||||||
{
|
{
|
||||||
struct amdgpu_device *adev = dev->dev_private;
|
|
||||||
struct drm_amdgpu_info *info = data;
|
|
||||||
struct amdgpu_mode_info *minfo = &adev->mode_info;
|
|
||||||
void __user *out = (void __user *)(uintptr_t)info->return_pointer;
|
|
||||||
uint32_t size = info->return_size;
|
|
||||||
struct drm_crtc *crtc;
|
|
||||||
uint32_t ui32 = 0;
|
|
||||||
uint64_t ui64 = 0;
|
|
||||||
int i, j, found;
|
|
||||||
int ui32_size = sizeof(ui32);
|
|
||||||
|
|
||||||
if (!info->return_size || !info->return_pointer)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
/* Ensure IB tests are run on ring */
|
|
||||||
flush_delayed_work(&adev->late_init_work);
|
|
||||||
|
|
||||||
switch (info->query) {
|
|
||||||
case AMDGPU_INFO_ACCEL_WORKING:
|
|
||||||
ui32 = adev->accel_working;
|
|
||||||
return copy_to_user(out, &ui32, min(size, 4u)) ? -EFAULT : 0;
|
|
||||||
case AMDGPU_INFO_CRTC_FROM_ID:
|
|
||||||
for (i = 0, found = 0; i < adev->mode_info.num_crtc; i++) {
|
|
||||||
crtc = (struct drm_crtc *)minfo->crtcs[i];
|
|
||||||
if (crtc && crtc->base.id == info->mode_crtc.id) {
|
|
||||||
struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
|
|
||||||
ui32 = amdgpu_crtc->crtc_id;
|
|
||||||
found = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!found) {
|
|
||||||
DRM_DEBUG_KMS("unknown crtc id %d\n", info->mode_crtc.id);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
return copy_to_user(out, &ui32, min(size, 4u)) ? -EFAULT : 0;
|
|
||||||
case AMDGPU_INFO_HW_IP_INFO: {
|
|
||||||
struct drm_amdgpu_info_hw_ip ip = {};
|
|
||||||
enum amd_ip_block_type type;
|
|
||||||
uint32_t ring_mask = 0;
|
|
||||||
uint32_t ib_start_alignment = 0;
|
uint32_t ib_start_alignment = 0;
|
||||||
uint32_t ib_size_alignment = 0;
|
uint32_t ib_size_alignment = 0;
|
||||||
|
enum amd_ip_block_type type;
|
||||||
|
uint32_t ring_mask = 0;
|
||||||
|
unsigned int i, j;
|
||||||
|
|
||||||
if (info->query_hw_ip.ip_instance >= AMDGPU_HW_IP_INSTANCE_MAX_COUNT)
|
if (info->query_hw_ip.ip_instance >= AMDGPU_HW_IP_INSTANCE_MAX_COUNT)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@ -399,20 +349,86 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < adev->num_ip_blocks; i++) {
|
for (i = 0; i < adev->num_ip_blocks; i++)
|
||||||
if (adev->ip_blocks[i].version->type == type &&
|
if (adev->ip_blocks[i].version->type == type &&
|
||||||
adev->ip_blocks[i].status.valid) {
|
adev->ip_blocks[i].status.valid)
|
||||||
ip.hw_ip_version_major = adev->ip_blocks[i].version->major;
|
break;
|
||||||
ip.hw_ip_version_minor = adev->ip_blocks[i].version->minor;
|
|
||||||
ip.capabilities_flags = 0;
|
if (i == adev->num_ip_blocks)
|
||||||
ip.available_rings = ring_mask;
|
return 0;
|
||||||
ip.ib_start_alignment = ib_start_alignment;
|
|
||||||
ip.ib_size_alignment = ib_size_alignment;
|
result->hw_ip_version_major = adev->ip_blocks[i].version->major;
|
||||||
|
result->hw_ip_version_minor = adev->ip_blocks[i].version->minor;
|
||||||
|
result->capabilities_flags = 0;
|
||||||
|
result->available_rings = ring_mask;
|
||||||
|
result->ib_start_alignment = ib_start_alignment;
|
||||||
|
result->ib_size_alignment = ib_size_alignment;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Userspace get information ioctl
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* amdgpu_info_ioctl - answer a device specific request.
|
||||||
|
*
|
||||||
|
* @adev: amdgpu device pointer
|
||||||
|
* @data: request object
|
||||||
|
* @filp: drm filp
|
||||||
|
*
|
||||||
|
* This function is used to pass device specific parameters to the userspace
|
||||||
|
* drivers. Examples include: pci device id, pipeline parms, tiling params,
|
||||||
|
* etc. (all asics).
|
||||||
|
* Returns 0 on success, -EINVAL on failure.
|
||||||
|
*/
|
||||||
|
static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)
|
||||||
|
{
|
||||||
|
struct amdgpu_device *adev = dev->dev_private;
|
||||||
|
struct drm_amdgpu_info *info = data;
|
||||||
|
struct amdgpu_mode_info *minfo = &adev->mode_info;
|
||||||
|
void __user *out = (void __user *)(uintptr_t)info->return_pointer;
|
||||||
|
uint32_t size = info->return_size;
|
||||||
|
struct drm_crtc *crtc;
|
||||||
|
uint32_t ui32 = 0;
|
||||||
|
uint64_t ui64 = 0;
|
||||||
|
int i, found;
|
||||||
|
int ui32_size = sizeof(ui32);
|
||||||
|
|
||||||
|
if (!info->return_size || !info->return_pointer)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
/* Ensure IB tests are run on ring */
|
||||||
|
flush_delayed_work(&adev->late_init_work);
|
||||||
|
|
||||||
|
switch (info->query) {
|
||||||
|
case AMDGPU_INFO_ACCEL_WORKING:
|
||||||
|
ui32 = adev->accel_working;
|
||||||
|
return copy_to_user(out, &ui32, min(size, 4u)) ? -EFAULT : 0;
|
||||||
|
case AMDGPU_INFO_CRTC_FROM_ID:
|
||||||
|
for (i = 0, found = 0; i < adev->mode_info.num_crtc; i++) {
|
||||||
|
crtc = (struct drm_crtc *)minfo->crtcs[i];
|
||||||
|
if (crtc && crtc->base.id == info->mode_crtc.id) {
|
||||||
|
struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
|
||||||
|
ui32 = amdgpu_crtc->crtc_id;
|
||||||
|
found = 1;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return copy_to_user(out, &ip,
|
if (!found) {
|
||||||
min((size_t)size, sizeof(ip))) ? -EFAULT : 0;
|
DRM_DEBUG_KMS("unknown crtc id %d\n", info->mode_crtc.id);
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
return copy_to_user(out, &ui32, min(size, 4u)) ? -EFAULT : 0;
|
||||||
|
case AMDGPU_INFO_HW_IP_INFO: {
|
||||||
|
struct drm_amdgpu_info_hw_ip ip = {};
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = amdgpu_hw_ip_info(adev, info, &ip);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
ret = copy_to_user(out, &ip, min((size_t)size, sizeof(ip)));
|
||||||
|
return ret ? -EFAULT : 0;
|
||||||
}
|
}
|
||||||
case AMDGPU_INFO_HW_IP_COUNT: {
|
case AMDGPU_INFO_HW_IP_COUNT: {
|
||||||
enum amd_ip_block_type type;
|
enum amd_ip_block_type type;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user