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 /drivers/gpu | |
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
Diffstat (limited to 'drivers/gpu')
-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 | } |