aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
diff options
context:
space:
mode:
authorDmitry Torokhov <dmitry.torokhov@gmail.com>2019-07-20 00:07:56 -0400
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2019-07-20 00:07:56 -0400
commitc39f2d9db0fd81ea20bb5cce9b3f082ca63753e2 (patch)
tree8e80ed5601b4fb8880a2ca8e08802bc8b1f850bd /drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
parent597473720f4dc69749542bfcfed4a927a43d935e (diff)
parent771a081e44a9baa1991ef011cc453ef425591740 (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.c73
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
33bool amdgpu_atomfirmware_gpu_supports_virtualization(struct amdgpu_device *adev) 31bool 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 */
243bool 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
241union firmware_info { 270union 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 */
277bool 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
245union smu_info { 304union 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;