[PATCH 6/8] drm/amdgpu: add helper function to init sos ucode

Luben Tuikov luben.tuikov at amd.com
Mon Apr 20 15:37:49 UTC 2020


On 2020-04-20 6:16 a.m., Hawking Zhang wrote:
> driver already had psp_firmware_header struture to
> deal with different layout of sos ucode. the sos
> micorcode initialization could be common one.
> 
> Signed-off-by: Hawking Zhang <Hawking.Zhang at amd.com>
> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | 70 +++++++++++++++++++++++++++++++++
>  drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h |  2 +
>  2 files changed, 72 insertions(+)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
> index 3656068..730f98a 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c
> @@ -1876,6 +1876,76 @@ int psp_init_asd_microcode(struct psp_context *psp,
>  	return err;
>  }
>  
> +int psp_init_sos_microcode(struct psp_context *psp,
> +			   const char *chip_name)
> +{
> +	struct amdgpu_device *adev = psp->adev;
> +	char fw_name[30];
> +	const struct psp_firmware_header_v1_0 *sos_hdr;
> +	const struct psp_firmware_header_v1_1 *sos_hdr_v1_1;
> +	const struct psp_firmware_header_v1_2 *sos_hdr_v1_2;
> +	int err = 0;
> +
> +	if (!chip_name) {
> +		dev_err(adev->dev, "invalid chip name for sos microcode\n");
> +		return -EINVAL;
> +	}
> +
> +	snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_sos.bin", chip_name);
> +	err = request_firmware(&adev->psp.sos_fw, fw_name, adev->dev);
> +	if (err)
> +		goto out;
> +
> +	err = amdgpu_ucode_validate(adev->psp.sos_fw);
> +	if (err)
> +		goto out;
> +
> +	sos_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.sos_fw->data;
> +	amdgpu_ucode_print_psp_hdr(&sos_hdr->header);
> +
> +	switch (sos_hdr->header.header_version_major) {
> +	case 1:
> +		adev->psp.sos_fw_version = le32_to_cpu(sos_hdr->header.ucode_version);
> +		adev->psp.sos_feature_version = le32_to_cpu(sos_hdr->ucode_feature_version);
> +		adev->psp.sos_bin_size = le32_to_cpu(sos_hdr->sos_size_bytes);
> +		adev->psp.sys_bin_size = le32_to_cpu(sos_hdr->sos_offset_bytes);
> +		adev->psp.sys_start_addr = (uint8_t *)sos_hdr +
> +				le32_to_cpu(sos_hdr->header.ucode_array_offset_bytes);
> +		adev->psp.sos_start_addr = (uint8_t *)adev->psp.sys_start_addr +
> +				le32_to_cpu(sos_hdr->sos_offset_bytes);
> +		if (sos_hdr->header.header_version_minor == 1) {
> +			sos_hdr_v1_1 = (const struct psp_firmware_header_v1_1 *)adev->psp.sos_fw->data;
> +			adev->psp.toc_bin_size = le32_to_cpu(sos_hdr_v1_1->toc_size_bytes);
> +			adev->psp.toc_start_addr = (uint8_t *)adev->psp.sys_start_addr +
> +					le32_to_cpu(sos_hdr_v1_1->toc_offset_bytes);
> +			adev->psp.kdb_bin_size = le32_to_cpu(sos_hdr_v1_1->kdb_size_bytes);
> +			adev->psp.kdb_start_addr = (uint8_t *)adev->psp.sys_start_addr +
> +					le32_to_cpu(sos_hdr_v1_1->kdb_offset_bytes);
> +		}
> +		if (sos_hdr->header.header_version_minor == 2) {
> +			sos_hdr_v1_2 = (const struct psp_firmware_header_v1_2 *)adev->psp.sos_fw->data;
> +			adev->psp.kdb_bin_size = le32_to_cpu(sos_hdr_v1_2->kdb_size_bytes);
> +			adev->psp.kdb_start_addr = (uint8_t *)adev->psp.sys_start_addr +
> +						    le32_to_cpu(sos_hdr_v1_2->kdb_offset_bytes);
> +		}
> +		break;
> +	default:
> +		dev_err(adev->dev,
> +			"unsupported psp sos firmware\n");
> +		err = -EINVAL;
> +		goto out;
> +	}
> +
> +	return 0;
> +out:
> +	dev_err(adev->dev,
> +		"failed to init sos firmware\n");

The message is vague. Print the name of the firmware which
the driver wasn't able to load, don't use "failed to init"
as it doesn't give specific information, use this instead:

	dev_err(adev->dev, "Failed to load firmware \"%s\"\n", fw_name);

Like the rest of the driver does.

Regards,
Luben

> +	release_firmware(adev->psp.sos_fw);
> +	adev->psp.sos_fw = NULL;
> +
> +	return err;
> +}
> +
>  static int psp_set_clockgating_state(void *handle,
>  				     enum amd_clockgating_state state)
>  {
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
> index a763148..7fcd63d 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.h
> @@ -387,4 +387,6 @@ int psp_ring_cmd_submit(struct psp_context *psp,
>  			int index);
>  int psp_init_asd_microcode(struct psp_context *psp,
>  			   const char *chip_name);
> +int psp_init_sos_microcode(struct psp_context *psp,
> +			   const char *chip_name);
>  #endif
> 



More information about the amd-gfx mailing list