diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 42 | 
1 files changed, 39 insertions, 3 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c index 7aa7e52ca784..ca945055e683 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c @@ -43,6 +43,7 @@  #include "amdgpu_gem.h"  #include "amdgpu_display.h"  #include "amdgpu_ras.h" +#include "amd_pcie.h"  void amdgpu_unregister_gpu_instance(struct amdgpu_device *adev)  { @@ -767,6 +768,7 @@ int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)  	case AMDGPU_INFO_DEV_INFO: {  		struct drm_amdgpu_info_device *dev_info;  		uint64_t vm_size; +		uint32_t pcie_gen_mask;  		int ret;  		dev_info = kzalloc(sizeof(*dev_info), GFP_KERNEL); @@ -785,15 +787,20 @@ int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)  		if (adev->pm.dpm_enabled) {  			dev_info->max_engine_clock = amdgpu_dpm_get_sclk(adev, false) * 10;  			dev_info->max_memory_clock = amdgpu_dpm_get_mclk(adev, false) * 10; +			dev_info->min_engine_clock = amdgpu_dpm_get_sclk(adev, true) * 10; +			dev_info->min_memory_clock = amdgpu_dpm_get_mclk(adev, true) * 10;  		} else { -			dev_info->max_engine_clock = adev->clock.default_sclk * 10; -			dev_info->max_memory_clock = adev->clock.default_mclk * 10; +			dev_info->max_engine_clock = +				dev_info->min_engine_clock = +					adev->clock.default_sclk * 10; +			dev_info->max_memory_clock = +				dev_info->min_memory_clock = +					adev->clock.default_mclk * 10;  		}  		dev_info->enabled_rb_pipes_mask = adev->gfx.config.backend_enable_mask;  		dev_info->num_rb_pipes = adev->gfx.config.max_backends_per_se *  			adev->gfx.config.max_shader_engines;  		dev_info->num_hw_gfx_contexts = adev->gfx.config.max_hw_contexts; -		dev_info->_pad = 0;  		dev_info->ids_flags = 0;  		if (adev->flags & AMD_IS_APU)  			dev_info->ids_flags |= AMDGPU_IDS_FLAGS_FUSION; @@ -847,6 +854,17 @@ int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)  		dev_info->tcc_disabled_mask = adev->gfx.config.tcc_disabled_mask; +		/* Combine the chip gen mask with the platform (CPU/mobo) mask. */ +		pcie_gen_mask = adev->pm.pcie_gen_mask & (adev->pm.pcie_gen_mask >> 16); +		dev_info->pcie_gen = fls(pcie_gen_mask); +		dev_info->pcie_num_lanes = +			adev->pm.pcie_mlw_mask & CAIL_PCIE_LINK_WIDTH_SUPPORT_X32 ? 32 : +			adev->pm.pcie_mlw_mask & CAIL_PCIE_LINK_WIDTH_SUPPORT_X16 ? 16 : +			adev->pm.pcie_mlw_mask & CAIL_PCIE_LINK_WIDTH_SUPPORT_X12 ? 12 : +			adev->pm.pcie_mlw_mask & CAIL_PCIE_LINK_WIDTH_SUPPORT_X8 ? 8 : +			adev->pm.pcie_mlw_mask & CAIL_PCIE_LINK_WIDTH_SUPPORT_X4 ? 4 : +			adev->pm.pcie_mlw_mask & CAIL_PCIE_LINK_WIDTH_SUPPORT_X2 ? 2 : 1; +  		ret = copy_to_user(out, dev_info,  				   min((size_t)size, sizeof(*dev_info))) ? -EFAULT : 0;  		kfree(dev_info); @@ -1014,6 +1032,24 @@ int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file *filp)  			}  			ui32 /= 100;  			break; +		case AMDGPU_INFO_SENSOR_PEAK_PSTATE_GFX_SCLK: +			/* get peak pstate sclk in Mhz */ +			if (amdgpu_dpm_read_sensor(adev, +						   AMDGPU_PP_SENSOR_PEAK_PSTATE_SCLK, +						   (void *)&ui32, &ui32_size)) { +				return -EINVAL; +			} +			ui32 /= 100; +			break; +		case AMDGPU_INFO_SENSOR_PEAK_PSTATE_GFX_MCLK: +			/* get peak pstate mclk in Mhz */ +			if (amdgpu_dpm_read_sensor(adev, +						   AMDGPU_PP_SENSOR_PEAK_PSTATE_MCLK, +						   (void *)&ui32, &ui32_size)) { +				return -EINVAL; +			} +			ui32 /= 100; +			break;  		default:  			DRM_DEBUG_KMS("Invalid request %d\n",  				      info->sensor_info.type); | 
