diff options
| author | Evan Quan <evan.quan@amd.com> | 2018-12-20 09:44:54 -0500 |
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2018-12-21 15:26:49 -0500 |
| commit | 06d6370e7b200882ab23bafd86a4024c7571c778 (patch) | |
| tree | 5c77ceed2c7efb710518b9ba6e420977f7fa3d6e | |
| parent | 8c9d90eebd23b6d40ddf4ce5df5ca2b932336a06 (diff) | |
drm/amdgpu: add Vega20 PSP ASD firmware loading
Add PSP ASD firmware loading on Vega20. Not sure why
this was missing before.
Signed-off-by: Evan Quan <evan.quan@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Cc: stable@vger.kernel.org
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/psp_v11_0.c | 40 |
1 files changed, 31 insertions, 9 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c b/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c index 138d552bb022..0c6e7f9b143f 100644 --- a/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c +++ b/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c | |||
| @@ -34,6 +34,7 @@ | |||
| 34 | #include "nbio/nbio_7_4_offset.h" | 34 | #include "nbio/nbio_7_4_offset.h" |
| 35 | 35 | ||
| 36 | MODULE_FIRMWARE("amdgpu/vega20_sos.bin"); | 36 | MODULE_FIRMWARE("amdgpu/vega20_sos.bin"); |
| 37 | MODULE_FIRMWARE("amdgpu/vega20_asd.bin"); | ||
| 37 | MODULE_FIRMWARE("amdgpu/vega20_ta.bin"); | 38 | MODULE_FIRMWARE("amdgpu/vega20_ta.bin"); |
| 38 | 39 | ||
| 39 | /* address block */ | 40 | /* address block */ |
| @@ -100,6 +101,7 @@ static int psp_v11_0_init_microcode(struct psp_context *psp) | |||
| 100 | char fw_name[30]; | 101 | char fw_name[30]; |
| 101 | int err = 0; | 102 | int err = 0; |
| 102 | const struct psp_firmware_header_v1_0 *sos_hdr; | 103 | const struct psp_firmware_header_v1_0 *sos_hdr; |
| 104 | const struct psp_firmware_header_v1_0 *asd_hdr; | ||
| 103 | const struct ta_firmware_header_v1_0 *ta_hdr; | 105 | const struct ta_firmware_header_v1_0 *ta_hdr; |
| 104 | 106 | ||
| 105 | DRM_DEBUG("\n"); | 107 | DRM_DEBUG("\n"); |
| @@ -132,14 +134,30 @@ static int psp_v11_0_init_microcode(struct psp_context *psp) | |||
| 132 | adev->psp.sos_start_addr = (uint8_t *)adev->psp.sys_start_addr + | 134 | adev->psp.sos_start_addr = (uint8_t *)adev->psp.sys_start_addr + |
| 133 | le32_to_cpu(sos_hdr->sos_offset_bytes); | 135 | le32_to_cpu(sos_hdr->sos_offset_bytes); |
| 134 | 136 | ||
| 137 | snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_asd.bin", chip_name); | ||
| 138 | err = request_firmware(&adev->psp.asd_fw, fw_name, adev->dev); | ||
| 139 | if (err) | ||
| 140 | goto out1; | ||
| 141 | |||
| 142 | err = amdgpu_ucode_validate(adev->psp.asd_fw); | ||
| 143 | if (err) | ||
| 144 | goto out1; | ||
| 145 | |||
| 146 | asd_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.asd_fw->data; | ||
| 147 | adev->psp.asd_fw_version = le32_to_cpu(asd_hdr->header.ucode_version); | ||
| 148 | adev->psp.asd_feature_version = le32_to_cpu(asd_hdr->ucode_feature_version); | ||
| 149 | adev->psp.asd_ucode_size = le32_to_cpu(asd_hdr->header.ucode_size_bytes); | ||
| 150 | adev->psp.asd_start_addr = (uint8_t *)asd_hdr + | ||
| 151 | le32_to_cpu(asd_hdr->header.ucode_array_offset_bytes); | ||
| 152 | |||
| 135 | snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ta.bin", chip_name); | 153 | snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ta.bin", chip_name); |
| 136 | err = request_firmware(&adev->psp.ta_fw, fw_name, adev->dev); | 154 | err = request_firmware(&adev->psp.ta_fw, fw_name, adev->dev); |
| 137 | if (err) | 155 | if (err) |
| 138 | goto out; | 156 | goto out2; |
| 139 | 157 | ||
| 140 | err = amdgpu_ucode_validate(adev->psp.ta_fw); | 158 | err = amdgpu_ucode_validate(adev->psp.ta_fw); |
| 141 | if (err) | 159 | if (err) |
| 142 | goto out; | 160 | goto out2; |
| 143 | 161 | ||
| 144 | ta_hdr = (const struct ta_firmware_header_v1_0 *)adev->psp.ta_fw->data; | 162 | ta_hdr = (const struct ta_firmware_header_v1_0 *)adev->psp.ta_fw->data; |
| 145 | adev->psp.ta_xgmi_ucode_version = le32_to_cpu(ta_hdr->ta_xgmi_ucode_version); | 163 | adev->psp.ta_xgmi_ucode_version = le32_to_cpu(ta_hdr->ta_xgmi_ucode_version); |
| @@ -148,14 +166,18 @@ static int psp_v11_0_init_microcode(struct psp_context *psp) | |||
| 148 | le32_to_cpu(ta_hdr->header.ucode_array_offset_bytes); | 166 | le32_to_cpu(ta_hdr->header.ucode_array_offset_bytes); |
| 149 | 167 | ||
| 150 | return 0; | 168 | return 0; |
| 169 | |||
| 170 | out2: | ||
| 171 | release_firmware(adev->psp.ta_fw); | ||
| 172 | adev->psp.ta_fw = NULL; | ||
| 173 | out1: | ||
| 174 | release_firmware(adev->psp.asd_fw); | ||
| 175 | adev->psp.asd_fw = NULL; | ||
| 151 | out: | 176 | out: |
| 152 | if (err) { | 177 | dev_err(adev->dev, |
| 153 | dev_err(adev->dev, | 178 | "psp v11.0: Failed to load firmware \"%s\"\n", fw_name); |
| 154 | "psp v11.0: Failed to load firmware \"%s\"\n", | 179 | release_firmware(adev->psp.sos_fw); |
| 155 | fw_name); | 180 | adev->psp.sos_fw = NULL; |
| 156 | release_firmware(adev->psp.sos_fw); | ||
| 157 | adev->psp.sos_fw = NULL; | ||
| 158 | } | ||
| 159 | 181 | ||
| 160 | return err; | 182 | return err; |
| 161 | } | 183 | } |
