diff options
author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2019-07-20 00:07:56 -0400 |
---|---|---|
committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2019-07-20 00:07:56 -0400 |
commit | c39f2d9db0fd81ea20bb5cce9b3f082ca63753e2 (patch) | |
tree | 8e80ed5601b4fb8880a2ca8e08802bc8b1f850bd /drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c | |
parent | 597473720f4dc69749542bfcfed4a927a43d935e (diff) | |
parent | 771a081e44a9baa1991ef011cc453ef425591740 (diff) |
Merge branch 'next' into for-linus
Prepare second round of input updates for 5.3 merge window.
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c')
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c | 73 |
1 files changed, 66 insertions, 7 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c index b61e1dc61b4c..f96d75c6e099 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c | |||
@@ -28,8 +28,6 @@ | |||
28 | #include "atom.h" | 28 | #include "atom.h" |
29 | #include "atombios.h" | 29 | #include "atombios.h" |
30 | 30 | ||
31 | #define get_index_into_master_table(master_table, table_name) (offsetof(struct master_table, table_name) / sizeof(uint16_t)) | ||
32 | |||
33 | bool amdgpu_atomfirmware_gpu_supports_virtualization(struct amdgpu_device *adev) | 31 | bool amdgpu_atomfirmware_gpu_supports_virtualization(struct amdgpu_device *adev) |
34 | { | 32 | { |
35 | int index = get_index_into_master_table(atom_master_list_of_data_tables_v2_1, | 33 | int index = get_index_into_master_table(atom_master_list_of_data_tables_v2_1, |
@@ -238,10 +236,71 @@ int amdgpu_atomfirmware_get_vram_type(struct amdgpu_device *adev) | |||
238 | return 0; | 236 | return 0; |
239 | } | 237 | } |
240 | 238 | ||
239 | /* | ||
240 | * Return true if vbios enabled ecc by default, if umc info table is available | ||
241 | * or false if ecc is not enabled or umc info table is not available | ||
242 | */ | ||
243 | bool amdgpu_atomfirmware_mem_ecc_supported(struct amdgpu_device *adev) | ||
244 | { | ||
245 | struct amdgpu_mode_info *mode_info = &adev->mode_info; | ||
246 | int index; | ||
247 | u16 data_offset, size; | ||
248 | union umc_info *umc_info; | ||
249 | u8 frev, crev; | ||
250 | bool ecc_default_enabled = false; | ||
251 | |||
252 | index = get_index_into_master_table(atom_master_list_of_data_tables_v2_1, | ||
253 | umc_info); | ||
254 | |||
255 | if (amdgpu_atom_parse_data_header(mode_info->atom_context, | ||
256 | index, &size, &frev, &crev, &data_offset)) { | ||
257 | /* support umc_info 3.1+ */ | ||
258 | if ((frev == 3 && crev >= 1) || (frev > 3)) { | ||
259 | umc_info = (union umc_info *) | ||
260 | (mode_info->atom_context->bios + data_offset); | ||
261 | ecc_default_enabled = | ||
262 | (le32_to_cpu(umc_info->v31.umc_config) & | ||
263 | UMC_CONFIG__DEFAULT_MEM_ECC_ENABLE) ? true : false; | ||
264 | } | ||
265 | } | ||
266 | |||
267 | return ecc_default_enabled; | ||
268 | } | ||
269 | |||
241 | union firmware_info { | 270 | union firmware_info { |
242 | struct atom_firmware_info_v3_1 v31; | 271 | struct atom_firmware_info_v3_1 v31; |
243 | }; | 272 | }; |
244 | 273 | ||
274 | /* | ||
275 | * Return true if vbios supports sram ecc or false if not | ||
276 | */ | ||
277 | bool amdgpu_atomfirmware_sram_ecc_supported(struct amdgpu_device *adev) | ||
278 | { | ||
279 | struct amdgpu_mode_info *mode_info = &adev->mode_info; | ||
280 | int index; | ||
281 | u16 data_offset, size; | ||
282 | union firmware_info *firmware_info; | ||
283 | u8 frev, crev; | ||
284 | bool sram_ecc_supported = false; | ||
285 | |||
286 | index = get_index_into_master_table(atom_master_list_of_data_tables_v2_1, | ||
287 | firmwareinfo); | ||
288 | |||
289 | if (amdgpu_atom_parse_data_header(adev->mode_info.atom_context, | ||
290 | index, &size, &frev, &crev, &data_offset)) { | ||
291 | /* support firmware_info 3.1 + */ | ||
292 | if ((frev == 3 && crev >=1) || (frev > 3)) { | ||
293 | firmware_info = (union firmware_info *) | ||
294 | (mode_info->atom_context->bios + data_offset); | ||
295 | sram_ecc_supported = | ||
296 | (le32_to_cpu(firmware_info->v31.firmware_capability) & | ||
297 | ATOM_FIRMWARE_CAP_SRAM_ECC) ? true : false; | ||
298 | } | ||
299 | } | ||
300 | |||
301 | return sram_ecc_supported; | ||
302 | } | ||
303 | |||
245 | union smu_info { | 304 | union smu_info { |
246 | struct atom_smu_info_v3_1 v31; | 305 | struct atom_smu_info_v3_1 v31; |
247 | }; | 306 | }; |
@@ -346,11 +405,11 @@ int amdgpu_atomfirmware_get_gfx_info(struct amdgpu_device *adev) | |||
346 | (mode_info->atom_context->bios + data_offset); | 405 | (mode_info->atom_context->bios + data_offset); |
347 | switch (crev) { | 406 | switch (crev) { |
348 | case 4: | 407 | case 4: |
349 | adev->gfx.config.max_shader_engines = gfx_info->v24.gc_num_se; | 408 | adev->gfx.config.max_shader_engines = gfx_info->v24.max_shader_engines; |
350 | adev->gfx.config.max_cu_per_sh = gfx_info->v24.gc_num_cu_per_sh; | 409 | adev->gfx.config.max_cu_per_sh = gfx_info->v24.max_cu_per_sh; |
351 | adev->gfx.config.max_sh_per_se = gfx_info->v24.gc_num_sh_per_se; | 410 | adev->gfx.config.max_sh_per_se = gfx_info->v24.max_sh_per_se; |
352 | adev->gfx.config.max_backends_per_se = gfx_info->v24.gc_num_rb_per_se; | 411 | adev->gfx.config.max_backends_per_se = gfx_info->v24.max_backends_per_se; |
353 | adev->gfx.config.max_texture_channel_caches = gfx_info->v24.gc_num_tccs; | 412 | adev->gfx.config.max_texture_channel_caches = gfx_info->v24.max_texture_channel_caches; |
354 | adev->gfx.config.max_gprs = le16_to_cpu(gfx_info->v24.gc_num_gprs); | 413 | adev->gfx.config.max_gprs = le16_to_cpu(gfx_info->v24.gc_num_gprs); |
355 | adev->gfx.config.max_gs_threads = gfx_info->v24.gc_num_max_gs_thds; | 414 | adev->gfx.config.max_gs_threads = gfx_info->v24.gc_num_max_gs_thds; |
356 | adev->gfx.config.gs_vgt_table_depth = gfx_info->v24.gc_gs_table_depth; | 415 | adev->gfx.config.gs_vgt_table_depth = gfx_info->v24.gc_gs_table_depth; |