diff options
author | Hawking Zhang <Hawking.Zhang@amd.com> | 2018-10-11 09:48:00 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2018-11-06 14:02:40 -0500 |
commit | 51e7177f361ab804e788ae4924e1f5a73c76ef52 (patch) | |
tree | d8926ccdd484fe4c4648b9e139c716891838bb87 | |
parent | f0cfa19579fae3bd06366ebccdba26020bb6214a (diff) |
drm/amdgpu/psp: init/de-init xgmi ta microcode
Add ucode handling for psp xgmi ta firmware.
Signed-off-by: Hawking Zhang <Hawking.Zhang@amd.com>
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h | 12 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/psp_v11_0.c | 38 |
3 files changed, 42 insertions, 10 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c index a18a8c91d52b..b00592d60132 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_psp.c | |||
@@ -90,6 +90,8 @@ static int psp_sw_fini(void *handle) | |||
90 | adev->psp.sos_fw = NULL; | 90 | adev->psp.sos_fw = NULL; |
91 | release_firmware(adev->psp.asd_fw); | 91 | release_firmware(adev->psp.asd_fw); |
92 | adev->psp.asd_fw = NULL; | 92 | adev->psp.asd_fw = NULL; |
93 | release_firmware(adev->psp.ta_fw); | ||
94 | adev->psp.ta_fw = NULL; | ||
93 | return 0; | 95 | return 0; |
94 | } | 96 | } |
95 | 97 | ||
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h index aa6641b944a0..7ac25a1c7853 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.h | |||
@@ -58,6 +58,17 @@ struct psp_firmware_header_v1_0 { | |||
58 | }; | 58 | }; |
59 | 59 | ||
60 | /* version_major=1, version_minor=0 */ | 60 | /* version_major=1, version_minor=0 */ |
61 | struct ta_firmware_header_v1_0 { | ||
62 | struct common_firmware_header header; | ||
63 | uint32_t ta_xgmi_ucode_version; | ||
64 | uint32_t ta_xgmi_offset_bytes; | ||
65 | uint32_t ta_xgmi_size_bytes; | ||
66 | uint32_t ta_ras_ucode_version; | ||
67 | uint32_t ta_ras_offset_bytes; | ||
68 | uint32_t ta_ras_size_bytes; | ||
69 | }; | ||
70 | |||
71 | /* version_major=1, version_minor=0 */ | ||
61 | struct gfx_firmware_header_v1_0 { | 72 | struct gfx_firmware_header_v1_0 { |
62 | struct common_firmware_header header; | 73 | struct common_firmware_header header; |
63 | uint32_t ucode_feature_version; | 74 | uint32_t ucode_feature_version; |
@@ -170,6 +181,7 @@ union amdgpu_firmware_header { | |||
170 | struct mc_firmware_header_v1_0 mc; | 181 | struct mc_firmware_header_v1_0 mc; |
171 | struct smc_firmware_header_v1_0 smc; | 182 | struct smc_firmware_header_v1_0 smc; |
172 | struct psp_firmware_header_v1_0 psp; | 183 | struct psp_firmware_header_v1_0 psp; |
184 | struct ta_firmware_header_v1_0 ta; | ||
173 | struct gfx_firmware_header_v1_0 gfx; | 185 | struct gfx_firmware_header_v1_0 gfx; |
174 | struct rlc_firmware_header_v1_0 rlc; | 186 | struct rlc_firmware_header_v1_0 rlc; |
175 | struct rlc_firmware_header_v2_0 rlc_v2_0; | 187 | struct rlc_firmware_header_v2_0 rlc_v2_0; |
diff --git a/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c b/drivers/gpu/drm/amd/amdgpu/psp_v11_0.c index 2372f4220ecb..902b0e6a02bf 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_ta.bin"); | ||
37 | 38 | ||
38 | /* address block */ | 39 | /* address block */ |
39 | #define smnMP1_FIRMWARE_FLAGS 0x3010024 | 40 | #define smnMP1_FIRMWARE_FLAGS 0x3010024 |
@@ -98,7 +99,8 @@ static int psp_v11_0_init_microcode(struct psp_context *psp) | |||
98 | const char *chip_name; | 99 | const char *chip_name; |
99 | char fw_name[30]; | 100 | char fw_name[30]; |
100 | int err = 0; | 101 | int err = 0; |
101 | const struct psp_firmware_header_v1_0 *hdr; | 102 | const struct psp_firmware_header_v1_0 *sos_hdr; |
103 | const struct ta_firmware_header_v1_0 *ta_hdr; | ||
102 | 104 | ||
103 | DRM_DEBUG("\n"); | 105 | DRM_DEBUG("\n"); |
104 | 106 | ||
@@ -119,16 +121,32 @@ static int psp_v11_0_init_microcode(struct psp_context *psp) | |||
119 | if (err) | 121 | if (err) |
120 | goto out; | 122 | goto out; |
121 | 123 | ||
122 | hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.sos_fw->data; | 124 | sos_hdr = (const struct psp_firmware_header_v1_0 *)adev->psp.sos_fw->data; |
123 | adev->psp.sos_fw_version = le32_to_cpu(hdr->header.ucode_version); | 125 | adev->psp.sos_fw_version = le32_to_cpu(sos_hdr->header.ucode_version); |
124 | adev->psp.sos_feature_version = le32_to_cpu(hdr->ucode_feature_version); | 126 | adev->psp.sos_feature_version = le32_to_cpu(sos_hdr->ucode_feature_version); |
125 | adev->psp.sos_bin_size = le32_to_cpu(hdr->sos_size_bytes); | 127 | adev->psp.sos_bin_size = le32_to_cpu(sos_hdr->sos_size_bytes); |
126 | adev->psp.sys_bin_size = le32_to_cpu(hdr->header.ucode_size_bytes) - | 128 | adev->psp.sys_bin_size = le32_to_cpu(sos_hdr->header.ucode_size_bytes) - |
127 | le32_to_cpu(hdr->sos_size_bytes); | 129 | le32_to_cpu(sos_hdr->sos_size_bytes); |
128 | adev->psp.sys_start_addr = (uint8_t *)hdr + | 130 | adev->psp.sys_start_addr = (uint8_t *)sos_hdr + |
129 | le32_to_cpu(hdr->header.ucode_array_offset_bytes); | 131 | le32_to_cpu(sos_hdr->header.ucode_array_offset_bytes); |
130 | adev->psp.sos_start_addr = (uint8_t *)adev->psp.sys_start_addr + | 132 | adev->psp.sos_start_addr = (uint8_t *)adev->psp.sys_start_addr + |
131 | le32_to_cpu(hdr->sos_offset_bytes); | 133 | le32_to_cpu(sos_hdr->sos_offset_bytes); |
134 | |||
135 | snprintf(fw_name, sizeof(fw_name), "amdgpu/%s_ta.bin", chip_name); | ||
136 | err = request_firmware(&adev->psp.ta_fw, fw_name, adev->dev); | ||
137 | if (err) | ||
138 | goto out; | ||
139 | |||
140 | err = amdgpu_ucode_validate(adev->psp.ta_fw); | ||
141 | if (err) | ||
142 | goto out; | ||
143 | |||
144 | 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); | ||
146 | adev->psp.ta_xgmi_ucode_size = le32_to_cpu(ta_hdr->ta_xgmi_size_bytes); | ||
147 | adev->psp.ta_xgmi_start_addr = (uint8_t *)ta_hdr + | ||
148 | le32_to_cpu(ta_hdr->header.ucode_array_offset_bytes); | ||
149 | |||
132 | return 0; | 150 | return 0; |
133 | out: | 151 | out: |
134 | if (err) { | 152 | if (err) { |