Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amdgpu: add atomfirmware helper function to query fw cap

Fimware capability was changed from 16 bits to 32 bits
for atomfirmware. add helper funciton to query firmware
capability and cache the value at early stage.

Signed-off-by: Hawking Zhang <Hawking.Zhang@amd.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: John Clements <john.clements@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Hawking Zhang and committed by
Alex Deucher
5968c6a2 ed9d2053

+44 -12
+3
drivers/gpu/drm/amd/amdgpu/amdgpu_atombios.c
··· 1828 1828 if (adev->is_atom_fw) { 1829 1829 amdgpu_atomfirmware_scratch_regs_init(adev); 1830 1830 amdgpu_atomfirmware_allocate_fb_scratch(adev); 1831 + /* cached firmware_flags for further usage */ 1832 + adev->mode_info.firmware_flags = 1833 + amdgpu_atomfirmware_query_firmware_capability(adev); 1831 1834 } else { 1832 1835 amdgpu_atombios_scratch_regs_init(adev); 1833 1836 amdgpu_atombios_allocate_fb_scratch(adev);
+39 -11
drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
··· 29 29 #include "atombios.h" 30 30 #include "soc15_hw_ip.h" 31 31 32 + union firmware_info { 33 + struct atom_firmware_info_v3_1 v31; 34 + struct atom_firmware_info_v3_2 v32; 35 + struct atom_firmware_info_v3_3 v33; 36 + struct atom_firmware_info_v3_4 v34; 37 + }; 38 + 39 + /* 40 + * Helper function to query firmware capability 41 + * 42 + * @adev: amdgpu_device pointer 43 + * 44 + * Return firmware_capability in firmwareinfo table on success or 0 if not 45 + */ 46 + uint32_t amdgpu_atomfirmware_query_firmware_capability(struct amdgpu_device *adev) 47 + { 48 + struct amdgpu_mode_info *mode_info = &adev->mode_info; 49 + int index; 50 + u16 data_offset, size; 51 + union firmware_info *firmware_info; 52 + u8 frev, crev; 53 + u32 fw_cap = 0; 54 + 55 + index = get_index_into_master_table(atom_master_list_of_data_tables_v2_1, 56 + firmwareinfo); 57 + 58 + if (amdgpu_atom_parse_data_header(adev->mode_info.atom_context, 59 + index, &size, &frev, &crev, &data_offset)) { 60 + /* support firmware_info 3.1 + */ 61 + if ((frev == 3 && crev >=1) || (frev > 3)) { 62 + firmware_info = (union firmware_info *) 63 + (mode_info->atom_context->bios + data_offset); 64 + fw_cap = le32_to_cpu(firmware_info->v31.firmware_capability); 65 + } 66 + } 67 + 68 + return fw_cap; 69 + } 70 + 32 71 bool amdgpu_atomfirmware_gpu_supports_virtualization(struct amdgpu_device *adev) 33 72 { 34 73 int index = get_index_into_master_table(atom_master_list_of_data_tables_v2_1, ··· 439 400 return ecc_default_enabled; 440 401 } 441 402 442 - union firmware_info { 443 - struct atom_firmware_info_v3_1 v31; 444 - struct atom_firmware_info_v3_2 v32; 445 - struct atom_firmware_info_v3_3 v33; 446 - struct atom_firmware_info_v3_4 v34; 447 - }; 448 - 449 403 /* 450 404 * Return true if vbios supports sram ecc or false if not 451 405 */ ··· 497 465 498 466 adev->pm.current_sclk = adev->clock.default_sclk; 499 467 adev->pm.current_mclk = adev->clock.default_mclk; 500 - 501 - /* not technically a clock, but... */ 502 - adev->mode_info.firmware_flags = 503 - le32_to_cpu(firmware_info->v31.firmware_capability); 504 468 505 469 ret = 0; 506 470 }
+1
drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.h
··· 26 26 27 27 #define get_index_into_master_table(master_table, table_name) (offsetof(struct master_table, table_name) / sizeof(uint16_t)) 28 28 29 + uint32_t amdgpu_atomfirmware_query_firmware_capability(struct amdgpu_device *adev); 29 30 bool amdgpu_atomfirmware_gpu_supports_virtualization(struct amdgpu_device *adev); 30 31 void amdgpu_atomfirmware_scratch_regs_init(struct amdgpu_device *adev); 31 32 int amdgpu_atomfirmware_allocate_fb_scratch(struct amdgpu_device *adev);
+1 -1
drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
··· 344 344 /* pointer to fbdev info structure */ 345 345 struct amdgpu_fbdev *rfbdev; 346 346 /* firmware flags */ 347 - u16 firmware_flags; 347 + u32 firmware_flags; 348 348 /* pointer to backlight encoder */ 349 349 struct amdgpu_encoder *bl_encoder; 350 350 u8 bl_level; /* saved backlight level */