diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 13 | 
1 files changed, 10 insertions, 3 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c index a0ea6fe8d060..66782be5917b 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c @@ -618,30 +618,37 @@ int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)  			return -EINVAL;  		if (adev->xcp_mgr && adev->xcp_mgr->num_xcps > 0 && -		    fpriv->xcp_id >= 0 && fpriv->xcp_id < adev->xcp_mgr->num_xcps) { +		    fpriv->xcp_id < adev->xcp_mgr->num_xcps) {  			xcp = &adev->xcp_mgr->xcp[fpriv->xcp_id];  			switch (type) {  			case AMD_IP_BLOCK_TYPE_GFX:  				ret = amdgpu_xcp_get_inst_details(xcp, AMDGPU_XCP_GFX, &inst_mask); +				if (ret) +					return ret;  				count = hweight32(inst_mask);  				break;  			case AMD_IP_BLOCK_TYPE_SDMA:  				ret = amdgpu_xcp_get_inst_details(xcp, AMDGPU_XCP_SDMA, &inst_mask); +				if (ret) +					return ret;  				count = hweight32(inst_mask);  				break;  			case AMD_IP_BLOCK_TYPE_JPEG:  				ret = amdgpu_xcp_get_inst_details(xcp, AMDGPU_XCP_VCN, &inst_mask); +				if (ret) +					return ret;  				count = hweight32(inst_mask) * adev->jpeg.num_jpeg_rings;  				break;  			case AMD_IP_BLOCK_TYPE_VCN:  				ret = amdgpu_xcp_get_inst_details(xcp, AMDGPU_XCP_VCN, &inst_mask); +				if (ret) +					return ret;  				count = hweight32(inst_mask);  				break;  			default:  				return -EINVAL;  			} -			if (ret) -				return ret; +  			return copy_to_user(out, &count, min(size, 4u)) ? -EFAULT : 0;  		} |