[PATCH] drm/amdgpu: fix getting vram info for gfx12
Alex Deucher
alexdeucher at gmail.com
Mon May 13 16:58:34 UTC 2024
On Mon, May 13, 2024 at 11:32 AM Min, Frank <Frank.Min at amd.com> wrote:
>
> [AMD Official Use Only - AMD Internal Distribution Only]
>
> From: Frank Min <Frank.Min at amd.com>
>
> gfx12 query video mem channel/type/width from umc_info of atom list, so fix it accordingly.
>
> Signed-off-by: Frank Min <Frank.Min at amd.com>
Acked-by: Alex Deucher <alexander.deucher at amd.com>
> ---
> .../gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c | 263 ++++++++++--------
> 1 file changed, 148 insertions(+), 115 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
> index a6d64bdbbb14..6fe84151332e 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
> @@ -289,7 +289,6 @@ static int convert_atom_mem_type_to_vram_type(struct amdgpu_device *adev,
> return vram_type;
> }
>
> -
> int
> amdgpu_atomfirmware_get_vram_info(struct amdgpu_device *adev,
> int *vram_width, int *vram_type,
> @@ -300,6 +299,7 @@ amdgpu_atomfirmware_get_vram_info(struct amdgpu_device *adev,
> u16 data_offset, size;
> union igp_info *igp_info;
> union vram_info *vram_info;
> + union umc_info *umc_info;
> union vram_module *vram_module;
> u8 frev, crev;
> u8 mem_type;
> @@ -311,10 +311,16 @@ amdgpu_atomfirmware_get_vram_info(struct amdgpu_device *adev,
> if (adev->flags & AMD_IS_APU)
> index = get_index_into_master_table(atom_master_list_of_data_tables_v2_1,
> integratedsysteminfo);
> - else
> - index = get_index_into_master_table(atom_master_list_of_data_tables_v2_1,
> - vram_info);
> -
> + else {
> + switch (amdgpu_ip_version(adev, GC_HWIP, 0)) {
> + case IP_VERSION(12, 0, 0):
> + case IP_VERSION(12, 0, 1):
> + index = get_index_into_master_table(atom_master_list_of_data_tables_v2_1, umc_info);
> + break;
> + default:
> + index = get_index_into_master_table(atom_master_list_of_data_tables_v2_1, vram_info);
> + }
> + }
> if (amdgpu_atom_parse_data_header(mode_info->atom_context,
> index, &size,
> &frev, &crev, &data_offset)) {
> @@ -368,123 +374,150 @@ amdgpu_atomfirmware_get_vram_info(struct amdgpu_device *adev,
> return -EINVAL;
> }
> } else {
> - vram_info = (union vram_info *)
> - (mode_info->atom_context->bios + data_offset);
> - module_id = (RREG32(adev->bios_scratch_reg_offset + 4) & 0x00ff0000) >> 16;
> - if (frev == 3) {
> - switch (crev) {
> - /* v30 */
> - case 0:
> - vram_module = (union vram_module *)vram_info->v30.vram_module;
> - mem_vendor = (vram_module->v30.dram_vendor_id) & 0xF;
> - if (vram_vendor)
> - *vram_vendor = mem_vendor;
> - mem_type = vram_info->v30.memory_type;
> - if (vram_type)
> - *vram_type = convert_atom_mem_type_to_vram_type(adev, mem_type);
> - mem_channel_number = vram_info->v30.channel_num;
> - mem_channel_width = vram_info->v30.channel_width;
> - if (vram_width)
> - *vram_width = mem_channel_number * (1 << mem_channel_width);
> - break;
> - default:
> - return -EINVAL;
> - }
> - } else if (frev == 2) {
> - switch (crev) {
> - /* v23 */
> - case 3:
> - if (module_id > vram_info->v23.vram_module_num)
> - module_id = 0;
> - vram_module = (union vram_module *)vram_info->v23.vram_module;
> - while (i < module_id) {
> - vram_module = (union vram_module *)
> - ((u8 *)vram_module + vram_module->v9.vram_module_size);
> - i++;
> - }
> - mem_type = vram_module->v9.memory_type;
> - if (vram_type)
> - *vram_type = convert_atom_mem_type_to_vram_type(adev, mem_type);
> - mem_channel_number = vram_module->v9.channel_num;
> - mem_channel_width = vram_module->v9.channel_width;
> - if (vram_width)
> - *vram_width = mem_channel_number * (1 << mem_channel_width);
> - mem_vendor = (vram_module->v9.vender_rev_id) & 0xF;
> - if (vram_vendor)
> - *vram_vendor = mem_vendor;
> - break;
> - /* v24 */
> - case 4:
> - if (module_id > vram_info->v24.vram_module_num)
> - module_id = 0;
> - vram_module = (union vram_module *)vram_info->v24.vram_module;
> - while (i < module_id) {
> - vram_module = (union vram_module *)
> - ((u8 *)vram_module + vram_module->v10.vram_module_size);
> - i++;
> + switch (amdgpu_ip_version(adev, GC_HWIP, 0)) {
> + case IP_VERSION(12, 0, 0):
> + case IP_VERSION(12, 0, 1):
> + umc_info = (union umc_info *)(mode_info->atom_context->bios +
> +data_offset);
> +
> + if (frev == 4) {
> + switch (crev) {
> + case 0:
> + mem_channel_number = le32_to_cpu(umc_info->v40.channel_num);
> + mem_type = le32_to_cpu(umc_info->v40.vram_type);
> + mem_channel_width = le32_to_cpu(umc_info->v40.channel_width);
> + mem_vendor = RREG32(adev->bios_scratch_reg_offset + 4) & 0xF;
> + if (vram_vendor)
> + *vram_vendor = mem_vendor;
> + if (vram_type)
> + *vram_type = convert_atom_mem_type_to_vram_type(adev, mem_type);
> + if (vram_width)
> + *vram_width = mem_channel_number * (1 << mem_channel_width);
> + break;
> + default:
> + return -EINVAL;
> }
> - mem_type = vram_module->v10.memory_type;
> - if (vram_type)
> - *vram_type = convert_atom_mem_type_to_vram_type(adev, mem_type);
> - mem_channel_number = vram_module->v10.channel_num;
> - mem_channel_width = vram_module->v10.channel_width;
> - if (vram_width)
> - *vram_width = mem_channel_number * (1 << mem_channel_width);
> - mem_vendor = (vram_module->v10.vender_rev_id) & 0xF;
> - if (vram_vendor)
> - *vram_vendor = mem_vendor;
> - break;
> - /* v25 */
> - case 5:
> - if (module_id > vram_info->v25.vram_module_num)
> - module_id = 0;
> - vram_module = (union vram_module *)vram_info->v25.vram_module;
> - while (i < module_id) {
> - vram_module = (union vram_module *)
> - ((u8 *)vram_module + vram_module->v11.vram_module_size);
> - i++;
> + } else
> + return -EINVAL;
> + break;
> + default:
> + vram_info = (union vram_info *)
> + (mode_info->atom_context->bios + data_offset);
> +
> + module_id = (RREG32(adev->bios_scratch_reg_offset + 4) & 0x00ff0000) >> 16;
> + if (frev == 3) {
> + switch (crev) {
> + /* v30 */
> + case 0:
> + vram_module = (union vram_module *)vram_info->v30.vram_module;
> + mem_vendor = (vram_module->v30.dram_vendor_id) & 0xF;
> + if (vram_vendor)
> + *vram_vendor = mem_vendor;
> + mem_type = vram_info->v30.memory_type;
> + if (vram_type)
> + *vram_type = convert_atom_mem_type_to_vram_type(adev, mem_type);
> + mem_channel_number = vram_info->v30.channel_num;
> + mem_channel_width = vram_info->v30.channel_width;
> + if (vram_width)
> + *vram_width = mem_channel_number * (1 << mem_channel_width);
> + break;
> + default:
> + return -EINVAL;
> }
> - mem_type = vram_module->v11.memory_type;
> - if (vram_type)
> - *vram_type = convert_atom_mem_type_to_vram_type(adev, mem_type);
> - mem_channel_number = vram_module->v11.channel_num;
> - mem_channel_width = vram_module->v11.channel_width;
> - if (vram_width)
> - *vram_width = mem_channel_number * (1 << mem_channel_width);
> - mem_vendor = (vram_module->v11.vender_rev_id) & 0xF;
> - if (vram_vendor)
> - *vram_vendor = mem_vendor;
> - break;
> - /* v26 */
> - case 6:
> - if (module_id > vram_info->v26.vram_module_num)
> - module_id = 0;
> - vram_module = (union vram_module *)vram_info->v26.vram_module;
> - while (i < module_id) {
> - vram_module = (union vram_module *)
> - ((u8 *)vram_module + vram_module->v9.vram_module_size);
> - i++;
> + } else if (frev == 2) {
> + switch (crev) {
> + /* v23 */
> + case 3:
> + if (module_id > vram_info->v23.vram_module_num)
> + module_id = 0;
> + vram_module = (union vram_module *)vram_info->v23.vram_module;
> + while (i < module_id) {
> + vram_module = (union vram_module *)
> + ((u8 *)vram_module + vram_module->v9.vram_module_size);
> + i++;
> + }
> + mem_type = vram_module->v9.memory_type;
> + if (vram_type)
> + *vram_type = convert_atom_mem_type_to_vram_type(adev, mem_type);
> + mem_channel_number = vram_module->v9.channel_num;
> + mem_channel_width = vram_module->v9.channel_width;
> + if (vram_width)
> + *vram_width = mem_channel_number * (1 << mem_channel_width);
> + mem_vendor = (vram_module->v9.vender_rev_id) & 0xF;
> + if (vram_vendor)
> + *vram_vendor = mem_vendor;
> + break;
> + /* v24 */
> + case 4:
> + if (module_id > vram_info->v24.vram_module_num)
> + module_id = 0;
> + vram_module = (union vram_module *)vram_info->v24.vram_module;
> + while (i < module_id) {
> + vram_module = (union vram_module *)
> + ((u8 *)vram_module + vram_module->v10.vram_module_size);
> + i++;
> + }
> + mem_type = vram_module->v10.memory_type;
> + if (vram_type)
> + *vram_type = convert_atom_mem_type_to_vram_type(adev, mem_type);
> + mem_channel_number = vram_module->v10.channel_num;
> + mem_channel_width = vram_module->v10.channel_width;
> + if (vram_width)
> + *vram_width = mem_channel_number * (1 << mem_channel_width);
> + mem_vendor = (vram_module->v10.vender_rev_id) & 0xF;
> + if (vram_vendor)
> + *vram_vendor = mem_vendor;
> + break;
> + /* v25 */
> + case 5:
> + if (module_id > vram_info->v25.vram_module_num)
> + module_id = 0;
> + vram_module = (union vram_module *)vram_info->v25.vram_module;
> + while (i < module_id) {
> + vram_module = (union vram_module *)
> + ((u8 *)vram_module + vram_module->v11.vram_module_size);
> + i++;
> + }
> + mem_type = vram_module->v11.memory_type;
> + if (vram_type)
> + *vram_type = convert_atom_mem_type_to_vram_type(adev, mem_type);
> + mem_channel_number = vram_module->v11.channel_num;
> + mem_channel_width = vram_module->v11.channel_width;
> + if (vram_width)
> + *vram_width = mem_channel_number * (1 << mem_channel_width);
> + mem_vendor = (vram_module->v11.vender_rev_id) & 0xF;
> + if (vram_vendor)
> + *vram_vendor = mem_vendor;
> + break;
> + /* v26 */
> + case 6:
> + if (module_id > vram_info->v26.vram_module_num)
> + module_id = 0;
> + vram_module = (union vram_module *)vram_info->v26.vram_module;
> + while (i < module_id) {
> + vram_module = (union vram_module *)
> + ((u8 *)vram_module + vram_module->v9.vram_module_size);
> + i++;
> + }
> + mem_type = vram_module->v9.memory_type;
> + if (vram_type)
> + *vram_type = convert_atom_mem_type_to_vram_type(adev, mem_type);
> + mem_channel_number = vram_module->v9.channel_num;
> + mem_channel_width = vram_module->v9.channel_width;
> + if (vram_width)
> + *vram_width = mem_channel_number * (1 << mem_channel_width);
> + mem_vendor = (vram_module->v9.vender_rev_id) & 0xF;
> + if (vram_vendor)
> + *vram_vendor = mem_vendor;
> + break;
> + default:
> + return -EINVAL;
> }
> - mem_type = vram_module->v9.memory_type;
> - if (vram_type)
> - *vram_type = convert_atom_mem_type_to_vram_type(adev, mem_type);
> - mem_channel_number = vram_module->v9.channel_num;
> - mem_channel_width = vram_module->v9.channel_width;
> - if (vram_width)
> - *vram_width = mem_channel_number * (1 << mem_channel_width);
> - mem_vendor = (vram_module->v9.vender_rev_id) & 0xF;
> - if (vram_vendor)
> - *vram_vendor = mem_vendor;
> - break;
> - default:
> + } else {
> + /* invalid frev */
> return -EINVAL;
> }
> - } else {
> - /* invalid frev */
> - return -EINVAL;
> }
> }
> -
> }
>
> return 0;
> --
> 2.34.1
>
More information about the amd-gfx
mailing list