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

drm/amdgpu/atomfirmware: simplify the interface to get vram info

fetch both the vram type and width in one function call. This
avoids having to parse the same data table twice to get the two
pieces of data.

Reviewed-by: Xiaojie Yuan <xiaojie.yuan@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

+37 -71
+2 -32
drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
··· 169 169 return vram_type; 170 170 } 171 171 172 - static int 173 - amdgpu_atomfirmware_get_vram_info(struct amdgpu_device *adev, 174 - int *vram_width, int *vram_type) 172 + int amdgpu_atomfirmware_get_vram_info(struct amdgpu_device *adev, 173 + int *vram_width, int *vram_type) 175 174 { 176 175 struct amdgpu_mode_info *mode_info = &adev->mode_info; 177 176 int index, i = 0; ··· 183 184 u32 mem_channel_number; 184 185 u32 mem_channel_width; 185 186 u32 module_id; 186 - 187 187 188 188 if (adev->flags & AMD_IS_APU) 189 189 index = get_index_into_master_table(atom_master_list_of_data_tables_v2_1, ··· 257 259 } 258 260 259 261 return 0; 260 - } 261 - 262 - /* 263 - * Return vram width from integrated system info table, if available, 264 - * or 0 if not. 265 - */ 266 - int amdgpu_atomfirmware_get_vram_width(struct amdgpu_device *adev) 267 - { 268 - int vram_width = 0, vram_type = 0; 269 - int r = amdgpu_atomfirmware_get_vram_info(adev, &vram_width, &vram_type); 270 - if (r) 271 - return 0; 272 - 273 - return vram_width; 274 - } 275 - 276 - /* 277 - * Return vram type from either integrated system info table 278 - * or umc info table, if available, or 0 (TYPE_UNKNOWN) if not 279 - */ 280 - int amdgpu_atomfirmware_get_vram_type(struct amdgpu_device *adev) 281 - { 282 - int vram_width = 0, vram_type = 0; 283 - int r = amdgpu_atomfirmware_get_vram_info(adev, &vram_width, &vram_type); 284 - if (r) 285 - return 0; 286 - 287 - return vram_type; 288 262 } 289 263 290 264 /*
+2 -2
drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.h
··· 29 29 bool amdgpu_atomfirmware_gpu_supports_virtualization(struct amdgpu_device *adev); 30 30 void amdgpu_atomfirmware_scratch_regs_init(struct amdgpu_device *adev); 31 31 int amdgpu_atomfirmware_allocate_fb_scratch(struct amdgpu_device *adev); 32 - int amdgpu_atomfirmware_get_vram_width(struct amdgpu_device *adev); 33 - int amdgpu_atomfirmware_get_vram_type(struct amdgpu_device *adev); 32 + int amdgpu_atomfirmware_get_vram_info(struct amdgpu_device *adev, 33 + int *vram_width, int *vram_type); 34 34 int amdgpu_atomfirmware_get_clock_info(struct amdgpu_device *adev); 35 35 int amdgpu_atomfirmware_get_gfx_info(struct amdgpu_device *adev); 36 36 bool amdgpu_atomfirmware_mem_ecc_supported(struct amdgpu_device *adev);
+8 -13
drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c
··· 539 539 */ 540 540 static int gmc_v10_0_mc_init(struct amdgpu_device *adev) 541 541 { 542 - int chansize, numchan; 543 - 544 - if (!amdgpu_emu_mode) 545 - adev->gmc.vram_width = amdgpu_atomfirmware_get_vram_width(adev); 546 - else { 547 - /* hard code vram_width for emulation */ 548 - chansize = 128; 549 - numchan = 1; 550 - adev->gmc.vram_width = numchan * chansize; 551 - } 552 - 553 542 /* Could aper size report 0 ? */ 554 543 adev->gmc.aper_base = pci_resource_start(adev->pdev, 0); 555 544 adev->gmc.aper_size = pci_resource_len(adev->pdev, 0); ··· 624 635 625 636 static int gmc_v10_0_sw_init(void *handle) 626 637 { 627 - int r; 638 + int r, vram_width = 0, vram_type = 0; 628 639 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 629 640 630 641 gfxhub_v2_0_init(adev); ··· 632 643 633 644 spin_lock_init(&adev->gmc.invalidate_lock); 634 645 635 - adev->gmc.vram_type = amdgpu_atomfirmware_get_vram_type(adev); 646 + r = amdgpu_atomfirmware_get_vram_info(adev, &vram_width, &vram_type); 647 + if (!amdgpu_emu_mode) 648 + adev->gmc.vram_width = vram_width; 649 + else 650 + adev->gmc.vram_width = 1 * 128; /* numchan * chansize */ 651 + 652 + adev->gmc.vram_type = vram_type; 636 653 switch (adev->asic_type) { 637 654 case CHIP_NAVI10: 638 655 case CHIP_NAVI14:
+25 -24
drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c
··· 895 895 */ 896 896 static int gmc_v9_0_mc_init(struct amdgpu_device *adev) 897 897 { 898 - int chansize, numchan; 899 898 int r; 900 - 901 - if (amdgpu_sriov_vf(adev)) { 902 - /* For Vega10 SR-IOV, vram_width can't be read from ATOM as RAVEN, 903 - * and DF related registers is not readable, seems hardcord is the 904 - * only way to set the correct vram_width 905 - */ 906 - adev->gmc.vram_width = 2048; 907 - } else if (amdgpu_emu_mode != 1) { 908 - adev->gmc.vram_width = amdgpu_atomfirmware_get_vram_width(adev); 909 - } 910 - 911 - if (!adev->gmc.vram_width) { 912 - /* hbm memory channel size */ 913 - if (adev->flags & AMD_IS_APU) 914 - chansize = 64; 915 - else 916 - chansize = 128; 917 - 918 - numchan = adev->df_funcs->get_hbm_channel_number(adev); 919 - adev->gmc.vram_width = numchan * chansize; 920 - } 921 899 922 900 /* size in MB on si */ 923 901 adev->gmc.mc_vram_size = ··· 1011 1033 1012 1034 static int gmc_v9_0_sw_init(void *handle) 1013 1035 { 1014 - int r; 1036 + int r, vram_width = 0, vram_type = 0; 1015 1037 struct amdgpu_device *adev = (struct amdgpu_device *)handle; 1016 1038 1017 1039 gfxhub_v1_0_init(adev); ··· 1022 1044 1023 1045 spin_lock_init(&adev->gmc.invalidate_lock); 1024 1046 1025 - adev->gmc.vram_type = amdgpu_atomfirmware_get_vram_type(adev); 1047 + r = amdgpu_atomfirmware_get_vram_info(adev, &vram_width, &vram_type); 1048 + if (amdgpu_sriov_vf(adev)) 1049 + /* For Vega10 SR-IOV, vram_width can't be read from ATOM as RAVEN, 1050 + * and DF related registers is not readable, seems hardcord is the 1051 + * only way to set the correct vram_width 1052 + */ 1053 + adev->gmc.vram_width = 2048; 1054 + else if (amdgpu_emu_mode != 1) 1055 + adev->gmc.vram_width = vram_width; 1056 + 1057 + if (!adev->gmc.vram_width) { 1058 + int chansize, numchan; 1059 + 1060 + /* hbm memory channel size */ 1061 + if (adev->flags & AMD_IS_APU) 1062 + chansize = 64; 1063 + else 1064 + chansize = 128; 1065 + 1066 + numchan = adev->df_funcs->get_hbm_channel_number(adev); 1067 + adev->gmc.vram_width = numchan * chansize; 1068 + } 1069 + 1070 + adev->gmc.vram_type = vram_type; 1026 1071 switch (adev->asic_type) { 1027 1072 case CHIP_RAVEN: 1028 1073 adev->num_vmhubs = 2;