diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c | 33 | 
1 files changed, 25 insertions, 8 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c index 1d9d187de6ee..183a976ba29d 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sdma.c @@ -158,6 +158,7 @@ static int amdgpu_sdma_init_inst_ctx(struct amdgpu_sdma_instance *sdma_inst)  	const struct common_firmware_header *header = NULL;  	const struct sdma_firmware_header_v1_0 *hdr;  	const struct sdma_firmware_header_v2_0 *hdr_v2; +	const struct sdma_firmware_header_v3_0 *hdr_v3;  	header = (const struct common_firmware_header *)  		sdma_inst->fw->data; @@ -174,6 +175,11 @@ static int amdgpu_sdma_init_inst_ctx(struct amdgpu_sdma_instance *sdma_inst)  		sdma_inst->fw_version = le32_to_cpu(hdr_v2->header.ucode_version);  		sdma_inst->feature_version = le32_to_cpu(hdr_v2->ucode_feature_version);  		break; +	case 3: +		hdr_v3 = (const struct sdma_firmware_header_v3_0 *)sdma_inst->fw->data; +		sdma_inst->fw_version = le32_to_cpu(hdr_v3->header.ucode_version); +		sdma_inst->feature_version = le32_to_cpu(hdr_v3->ucode_feature_version); +		break;  	default:  		return -EINVAL;  	} @@ -206,16 +212,17 @@ int amdgpu_sdma_init_microcode(struct amdgpu_device *adev,  	const struct common_firmware_header *header = NULL;  	int err, i;  	const struct sdma_firmware_header_v2_0 *sdma_hdr; +	const struct sdma_firmware_header_v3_0 *sdma_hv3;  	uint16_t version_major;  	char ucode_prefix[30]; -	char fw_name[52];  	amdgpu_ucode_ip_version_decode(adev, SDMA0_HWIP, ucode_prefix, sizeof(ucode_prefix));  	if (instance == 0) -		snprintf(fw_name, sizeof(fw_name), "amdgpu/%s.bin", ucode_prefix); +		err = amdgpu_ucode_request(adev, &adev->sdma.instance[instance].fw, +					   "amdgpu/%s.bin", ucode_prefix);  	else -		snprintf(fw_name, sizeof(fw_name), "amdgpu/%s%d.bin", ucode_prefix, instance); -	err = amdgpu_ucode_request(adev, &adev->sdma.instance[instance].fw, fw_name); +		err = amdgpu_ucode_request(adev, &adev->sdma.instance[instance].fw, +					   "amdgpu/%s%d.bin", ucode_prefix, instance);  	if (err)  		goto out; @@ -251,11 +258,12 @@ int amdgpu_sdma_init_microcode(struct amdgpu_device *adev,  				else {  					/* Use a single copy per SDMA firmware type. PSP uses the same instance for all  					 * groups of SDMAs */ -					if (amdgpu_ip_version(adev, SDMA0_HWIP, -							      0) == -						    IP_VERSION(4, 4, 2) && +					if ((amdgpu_ip_version(adev, SDMA0_HWIP, 0) == +						IP_VERSION(4, 4, 2) || +					     amdgpu_ip_version(adev, SDMA0_HWIP, 0) == +						IP_VERSION(4, 4, 5)) &&  					    adev->firmware.load_type == -						    AMDGPU_FW_LOAD_PSP && +						AMDGPU_FW_LOAD_PSP &&  					    adev->sdma.num_inst_per_aid == i) {  						break;  					} @@ -281,6 +289,15 @@ int amdgpu_sdma_init_microcode(struct amdgpu_device *adev,  			adev->firmware.fw_size +=  				ALIGN(le32_to_cpu(sdma_hdr->ctl_ucode_size_bytes), PAGE_SIZE);  			break; +		case 3: +			sdma_hv3 = (const struct sdma_firmware_header_v3_0 *) +				adev->sdma.instance[0].fw->data; +			info = &adev->firmware.ucode[AMDGPU_UCODE_ID_SDMA_RS64]; +			info->ucode_id = AMDGPU_UCODE_ID_SDMA_RS64; +			info->fw = adev->sdma.instance[0].fw; +			adev->firmware.fw_size += +				ALIGN(le32_to_cpu(sdma_hv3->ucode_size_bytes), PAGE_SIZE); +			break;  		default:  			err = -EINVAL;  		} |