diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c | 65 | 
1 files changed, 61 insertions, 4 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c index bc0440f7a31d..662976292535 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cgs.c @@ -616,7 +616,7 @@ static int amdgpu_cgs_irq_put(struct cgs_device *cgs_device, unsigned src_id, un  	return amdgpu_irq_put(adev, adev->irq.sources[src_id], type);  } -int amdgpu_cgs_set_clockgating_state(struct cgs_device *cgs_device, +static int amdgpu_cgs_set_clockgating_state(struct cgs_device *cgs_device,  				  enum amd_ip_block_type block_type,  				  enum amd_clockgating_state state)  { @@ -637,7 +637,7 @@ int amdgpu_cgs_set_clockgating_state(struct cgs_device *cgs_device,  	return r;  } -int amdgpu_cgs_set_powergating_state(struct cgs_device *cgs_device, +static int amdgpu_cgs_set_powergating_state(struct cgs_device *cgs_device,  				  enum amd_ip_block_type block_type,  				  enum amd_powergating_state state)  { @@ -711,6 +711,47 @@ static int amdgpu_cgs_rel_firmware(struct cgs_device *cgs_device, enum cgs_ucode  	return -EINVAL;  } +static uint16_t amdgpu_get_firmware_version(struct cgs_device *cgs_device, +					enum cgs_ucode_id type) +{ +	CGS_FUNC_ADEV; +	uint16_t fw_version; + +	switch (type) { +		case CGS_UCODE_ID_SDMA0: +			fw_version = adev->sdma.instance[0].fw_version; +			break; +		case CGS_UCODE_ID_SDMA1: +			fw_version = adev->sdma.instance[1].fw_version; +			break; +		case CGS_UCODE_ID_CP_CE: +			fw_version = adev->gfx.ce_fw_version; +			break; +		case CGS_UCODE_ID_CP_PFP: +			fw_version = adev->gfx.pfp_fw_version; +			break; +		case CGS_UCODE_ID_CP_ME: +			fw_version = adev->gfx.me_fw_version; +			break; +		case CGS_UCODE_ID_CP_MEC: +			fw_version = adev->gfx.mec_fw_version; +			break; +		case CGS_UCODE_ID_CP_MEC_JT1: +			fw_version = adev->gfx.mec_fw_version; +			break; +		case CGS_UCODE_ID_CP_MEC_JT2: +			fw_version = adev->gfx.mec_fw_version; +			break; +		case CGS_UCODE_ID_RLC_G: +			fw_version = adev->gfx.rlc_fw_version; +			break; +		default: +			DRM_ERROR("firmware type %d do not have version\n", type); +			fw_version = 0; +	} +	return fw_version; +} +  static int amdgpu_cgs_get_firmware_info(struct cgs_device *cgs_device,  					enum cgs_ucode_id type,  					struct cgs_firmware_info *info) @@ -741,6 +782,7 @@ static int amdgpu_cgs_get_firmware_info(struct cgs_device *cgs_device,  		info->mc_addr = gpu_addr;  		info->image_size = data_size;  		info->version = (uint16_t)le32_to_cpu(header->header.ucode_version); +		info->fw_version = amdgpu_get_firmware_version(cgs_device, type);  		info->feature_version = (uint16_t)le32_to_cpu(header->ucode_feature_version);  	} else {  		char fw_name[30] = {0}; @@ -753,10 +795,19 @@ static int amdgpu_cgs_get_firmware_info(struct cgs_device *cgs_device,  		if (!adev->pm.fw) {  			switch (adev->asic_type) {  			case CHIP_TOPAZ: -				strcpy(fw_name, "amdgpu/topaz_smc.bin"); +				if (((adev->pdev->device == 0x6900) && (adev->pdev->revision == 0x81)) || +				    ((adev->pdev->device == 0x6900) && (adev->pdev->revision == 0x83)) || +				    ((adev->pdev->device == 0x6907) && (adev->pdev->revision == 0x87))) +					strcpy(fw_name, "amdgpu/topaz_k_smc.bin"); +				else +					strcpy(fw_name, "amdgpu/topaz_smc.bin");  				break;  			case CHIP_TONGA: -				strcpy(fw_name, "amdgpu/tonga_smc.bin"); +				if (((adev->pdev->device == 0x6939) && (adev->pdev->revision == 0xf1)) || +				    ((adev->pdev->device == 0x6938) && (adev->pdev->revision == 0xf1))) +					strcpy(fw_name, "amdgpu/tonga_k_smc.bin"); +				else +					strcpy(fw_name, "amdgpu/tonga_smc.bin");  				break;  			case CHIP_FIJI:  				strcpy(fw_name, "amdgpu/fiji_smc.bin"); @@ -848,6 +899,12 @@ static int amdgpu_cgs_query_system_info(struct cgs_device *cgs_device,  	case CGS_SYSTEM_INFO_GFX_SE_INFO:  		sys_info->value = adev->gfx.config.max_shader_engines;  		break; +	case CGS_SYSTEM_INFO_PCIE_SUB_SYS_ID: +		sys_info->value = adev->pdev->subsystem_device; +		break; +	case CGS_SYSTEM_INFO_PCIE_SUB_SYS_VENDOR_ID: +		sys_info->value = adev->pdev->subsystem_vendor; +		break;  	default:  		return -ENODEV;  	}  |