diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c | 39 | 
1 files changed, 36 insertions, 3 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c index dfd1c98efa7c..36c763310df5 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c @@ -197,6 +197,27 @@ void amdgpu_ucode_print_sdma_hdr(const struct common_firmware_header *hdr)  	}  } +void amdgpu_ucode_print_gpu_info_hdr(const struct common_firmware_header *hdr) +{ +	uint16_t version_major = le16_to_cpu(hdr->header_version_major); +	uint16_t version_minor = le16_to_cpu(hdr->header_version_minor); + +	DRM_DEBUG("GPU_INFO\n"); +	amdgpu_ucode_print_common_hdr(hdr); + +	if (version_major == 1) { +		const struct gpu_info_firmware_header_v1_0 *gpu_info_hdr = +			container_of(hdr, struct gpu_info_firmware_header_v1_0, header); + +		DRM_DEBUG("version_major: %u\n", +			  le16_to_cpu(gpu_info_hdr->version_major)); +		DRM_DEBUG("version_minor: %u\n", +			  le16_to_cpu(gpu_info_hdr->version_minor)); +	} else { +		DRM_ERROR("Unknown gpu_info ucode version: %u.%u\n", version_major, version_minor); +	} +} +  int amdgpu_ucode_validate(const struct firmware *fw)  {  	const struct common_firmware_header *hdr = @@ -253,6 +274,11 @@ amdgpu_ucode_get_load_type(struct amdgpu_device *adev, int load_type)  			return AMDGPU_FW_LOAD_DIRECT;  		else  			return AMDGPU_FW_LOAD_PSP; +	case CHIP_RAVEN: +		if (load_type != 2) +			return AMDGPU_FW_LOAD_DIRECT; +		else +			return AMDGPU_FW_LOAD_PSP;  	default:  		DRM_ERROR("Unknow firmware load type\n");  	} @@ -332,8 +358,6 @@ static int amdgpu_ucode_patch_jt(struct amdgpu_firmware_info *ucode,  			   (le32_to_cpu(header->jt_offset) * 4);  	memcpy(dst_addr, src_addr, le32_to_cpu(header->jt_size) * 4); -	ucode->ucode_size += le32_to_cpu(header->jt_size) * 4; -  	return 0;  } @@ -347,9 +371,15 @@ int amdgpu_ucode_init_bo(struct amdgpu_device *adev)  	struct amdgpu_firmware_info *ucode = NULL;  	const struct common_firmware_header *header = NULL; +	if (!adev->firmware.fw_size) { +		dev_warn(adev->dev, "No ip firmware need to load\n"); +		return 0; +	} +  	err = amdgpu_bo_create(adev, adev->firmware.fw_size, PAGE_SIZE, true,  				amdgpu_sriov_vf(adev) ? AMDGPU_GEM_DOMAIN_VRAM : AMDGPU_GEM_DOMAIN_GTT, -				0, NULL, NULL, bo); +				AMDGPU_GEM_CREATE_VRAM_CONTIGUOUS, +				NULL, NULL, 0, bo);  	if (err) {  		dev_err(adev->dev, "(%d) Firmware buffer allocate failed\n", err);  		goto failed; @@ -428,6 +458,9 @@ int amdgpu_ucode_fini_bo(struct amdgpu_device *adev)  	int i;  	struct amdgpu_firmware_info *ucode = NULL; +	if (!adev->firmware.fw_size) +		return 0; +  	for (i = 0; i < adev->firmware.max_ucodes; i++) {  		ucode = &adev->firmware.ucode[i];  		if (ucode->fw) { |