]> Git Repo - linux.git/blobdiff - drivers/gpu/drm/amd/amdgpu/amdgpu_atomfirmware.c
Merge tag 'vfs-5.4-merge-1' of git://git.kernel.org/pub/scm/fs/xfs/xfs-linux
[linux.git] / drivers / gpu / drm / amd / amdgpu / amdgpu_atomfirmware.c
index f96d75c6e0996b2ff102d6ee0bd93bcd9517fb5b..daf687428cdb7a08fbb69e87bf1dcf8e19240f5d 100644 (file)
@@ -20,7 +20,7 @@
  * OTHER DEALINGS IN THE SOFTWARE.
  *
  */
-#include <drm/drmP.h>
+
 #include <drm/amdgpu_drm.h>
 #include "amdgpu.h"
 #include "atomfirmware.h"
@@ -118,6 +118,7 @@ union umc_info {
 
 union vram_info {
        struct atom_vram_info_header_v2_3 v23;
+       struct atom_vram_info_header_v2_4 v24;
 };
 /*
  * Return vram width from integrated system info table, if available,
@@ -126,22 +127,50 @@ union vram_info {
 int amdgpu_atomfirmware_get_vram_width(struct amdgpu_device *adev)
 {
        struct amdgpu_mode_info *mode_info = &adev->mode_info;
-       int index = get_index_into_master_table(atom_master_list_of_data_tables_v2_1,
-                                               integratedsysteminfo);
+       int index;
        u16 data_offset, size;
        union igp_info *igp_info;
+       union vram_info *vram_info;
+       u32 mem_channel_number;
+       u32 mem_channel_width;
        u8 frev, crev;
 
+       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);
+
        /* get any igp specific overrides */
        if (amdgpu_atom_parse_data_header(mode_info->atom_context, index, &size,
                                   &frev, &crev, &data_offset)) {
-               igp_info = (union igp_info *)
-                       (mode_info->atom_context->bios + data_offset);
-               switch (crev) {
-               case 11:
-                       return igp_info->v11.umachannelnumber * 64;
-               default:
-                       return 0;
+               if (adev->flags & AMD_IS_APU) {
+                       igp_info = (union igp_info *)
+                               (mode_info->atom_context->bios + data_offset);
+                       switch (crev) {
+                       case 11:
+                               mem_channel_number = igp_info->v11.umachannelnumber;
+                               /* channel width is 64 */
+                               return mem_channel_number * 64;
+                       default:
+                               return 0;
+                       }
+               } else {
+                       vram_info = (union vram_info *)
+                               (mode_info->atom_context->bios + data_offset);
+                       switch (crev) {
+                       case 3:
+                               mem_channel_number = vram_info->v23.vram_module[0].channel_num;
+                               mem_channel_width = vram_info->v23.vram_module[0].channel_width;
+                               return mem_channel_number * (1 << mem_channel_width);
+                       case 4:
+                               mem_channel_number = vram_info->v24.vram_module[0].channel_num;
+                               mem_channel_width = vram_info->v24.vram_module[0].channel_width;
+                               return mem_channel_number * (1 << mem_channel_width);
+                       default:
+                               return 0;
+                       }
                }
        }
 
@@ -179,6 +208,9 @@ static int convert_atom_mem_type_to_vram_type (struct amdgpu_device *adev,
                case ATOM_DGPU_VRAM_TYPE_HBM2:
                        vram_type = AMDGPU_VRAM_TYPE_HBM;
                        break;
+               case ATOM_DGPU_VRAM_TYPE_GDDR6:
+                       vram_type = AMDGPU_VRAM_TYPE_GDDR6;
+                       break;
                default:
                        vram_type = AMDGPU_VRAM_TYPE_UNKNOWN;
                        break;
@@ -227,6 +259,9 @@ int amdgpu_atomfirmware_get_vram_type(struct amdgpu_device *adev)
                        case 3:
                                mem_type = vram_info->v23.vram_module[0].memory_type;
                                return convert_atom_mem_type_to_vram_type(adev, mem_type);
+                       case 4:
+                               mem_type = vram_info->v24.vram_module[0].memory_type;
+                               return convert_atom_mem_type_to_vram_type(adev, mem_type);
                        default:
                                return 0;
                        }
This page took 0.035859 seconds and 4 git commands to generate.