ac/gpu_info: use drm_amdgpu_device_info instead of amdgpu_gpu_info
authorMarek Olšák <marek.olsak@amd.com>
Mon, 11 Jul 2022 04:24:46 +0000 (00:24 -0400)
committerMarge Bot <emma+marge@anholt.net>
Wed, 27 Jul 2022 05:01:38 +0000 (05:01 +0000)
These fields are identical but the latter is from libdrm.

Reviewed-by: Pierre-Eric Pelloux-Prayer <pierre-eric.pelloux-prayer@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17411>

src/amd/common/ac_gpu_info.c

index aafa495..147948f 100644 (file)
@@ -96,8 +96,86 @@ struct drm_amdgpu_memory_info {
    struct drm_amdgpu_heap_info gtt;
 };
 struct drm_amdgpu_info_device {
+   /** PCI Device ID */
+   uint32_t device_id;
+   /** Internal chip revision: A0, A1, etc.) */
+   uint32_t chip_rev;
+   uint32_t external_rev;
+   /** Revision id in PCI Config space */
+   uint32_t pci_rev;
+   uint32_t family;
+   uint32_t num_shader_engines;
+   uint32_t num_shader_arrays_per_engine;
+   /* in KHz */
+   uint32_t gpu_counter_freq;
+   uint64_t max_engine_clock;
+   uint64_t max_memory_clock;
+   /* cu information */
+   uint32_t cu_active_number;
+   /* NOTE: cu_ao_mask is INVALID, DON'T use it */
+   uint32_t cu_ao_mask;
+   uint32_t cu_bitmap[4][4];
+   /** Render backend pipe mask. One render backend is CB+DB. */
+   uint32_t enabled_rb_pipes_mask;
+   uint32_t num_rb_pipes;
+   uint32_t num_hw_gfx_contexts;
+   uint32_t _pad;
+   uint64_t ids_flags;
+   /** Starting virtual address for UMDs. */
+   uint64_t virtual_address_offset;
+   /** The maximum virtual address */
+   uint64_t virtual_address_max;
+   /** Required alignment of virtual addresses. */
+   uint32_t virtual_address_alignment;
+   /** Page table entry - fragment size */
+   uint32_t pte_fragment_size;
+   uint32_t gart_page_size;
+   /** constant engine ram size*/
+   uint32_t ce_ram_size;
+   /** video memory type info*/
+   uint32_t vram_type;
+   /** video memory bit width*/
+   uint32_t vram_bit_width;
+   /* vce harvesting instance */
+   uint32_t vce_harvest_config;
+   /* gfx double offchip LDS buffers */
+   uint32_t gc_double_offchip_lds_buf;
+   /* NGG Primitive Buffer */
+   uint64_t prim_buf_gpu_addr;
+   /* NGG Position Buffer */
+   uint64_t pos_buf_gpu_addr;
+   /* NGG Control Sideband */
+   uint64_t cntl_sb_buf_gpu_addr;
+   /* NGG Parameter Cache */
+   uint64_t param_buf_gpu_addr;
+   uint32_t prim_buf_size;
+   uint32_t pos_buf_size;
+   uint32_t cntl_sb_buf_size;
+   uint32_t param_buf_size;
+   /* wavefront size*/
+   uint32_t wave_front_size;
+   /* shader visible vgprs*/
+   uint32_t num_shader_visible_vgprs;
+   /* CU per shader array*/
+   uint32_t num_cu_per_sh;
+   /* number of tcc blocks*/
    uint32_t num_tcc_blocks;
+   /* gs vgt table depth*/
+   uint32_t gs_vgt_table_depth;
+   /* gs primitive buffer depth*/
+   uint32_t gs_prim_buffer_depth;
+   /* max gs wavefront per vgt*/
+   uint32_t max_gs_waves_per_vgt;
+   uint32_t _pad1;
+   /* always on cu bitmap */
+   uint32_t cu_ao_bitmap[4][4];
+   /** Starting high virtual address for UMDs. */
+   uint64_t high_va_offset;
+   /** The maximum high virtual address */
+   uint64_t high_va_max;
+   /* gfx10 pa_sc_tile_steering_override */
    uint32_t pa_sc_tile_steering_override;
+   /* disabled TCCs */
    uint64_t tcc_disabled_mask;
 };
 struct drm_amdgpu_info_hw_ip {
@@ -324,15 +402,13 @@ static uint64_t fix_vram_size(uint64_t size)
 }
 
 static bool
-has_tmz_support(amdgpu_device_handle dev,
-                struct radeon_info *info,
-                struct amdgpu_gpu_info *amdinfo)
+has_tmz_support(amdgpu_device_handle dev, struct radeon_info *info, uint32_t ids_flags)
 {
    struct amdgpu_bo_alloc_request request = {0};
    int r;
    amdgpu_bo_handle bo;
 
-   if (amdinfo->ids_flags & AMDGPU_IDS_FLAGS_TMZ)
+   if (ids_flags & AMDGPU_IDS_FLAGS_TMZ)
       return true;
 
    /* AMDGPU_IDS_FLAGS_TMZ is supported starting from drm_minor 40 */
@@ -707,18 +783,18 @@ bool ac_query_gpu_info(int fd, void *dev_p, struct radeon_info *info,
    info->all_vram_visible = info->vram_size_kb * 0.9 < info->vram_vis_size_kb;
 
    /* Set chip identification. */
-   info->pci_id = amdinfo->asic_id; /* TODO: is this correct? */
-   info->pci_rev_id = amdinfo->pci_rev_id;
-   info->vce_harvest_config = amdinfo->vce_harvest_config;
+   info->pci_id = device_info.device_id;
+   info->pci_rev_id = device_info.pci_rev;
+   info->vce_harvest_config = device_info.vce_harvest_config;
 
 #define identify_chip2(asic, chipname)                                                             \
-   if (ASICREV_IS(amdinfo->chip_external_rev, asic)) {                                             \
+   if (ASICREV_IS(device_info.external_rev, asic)) {                                             \
       info->family = CHIP_##chipname;                                                              \
       info->name = #chipname;                                                                      \
    }
 #define identify_chip(chipname) identify_chip2(chipname, chipname)
 
-   switch (amdinfo->family_id) {
+   switch (device_info.family) {
    case FAMILY_SI:
       identify_chip(TAHITI);
       identify_chip(PITCAIRN);
@@ -794,7 +870,7 @@ bool ac_query_gpu_info(int fd, void *dev_p, struct radeon_info *info,
 
    if (!info->name) {
       fprintf(stderr, "amdgpu: unknown (family_id, chip_external_rev): (%u, %u)\n",
-              amdinfo->family_id, amdinfo->chip_external_rev);
+              device_info.family, device_info.external_rev);
       return false;
    }
 
@@ -827,15 +903,15 @@ bool ac_query_gpu_info(int fd, void *dev_p, struct radeon_info *info,
                                util_get_cpu_caps()->family >= CPU_AMD_ZEN3 &&
                                util_get_cpu_caps()->family < CPU_AMD_LAST;
 
-   info->family_id = amdinfo->family_id;
-   info->chip_external_rev = amdinfo->chip_external_rev;
+   info->family_id = device_info.family;
+   info->chip_external_rev = device_info.external_rev;
    info->marketing_name = amdgpu_get_marketing_name(dev);
    info->is_pro_graphics = info->marketing_name && (strstr(info->marketing_name, "Pro") ||
                                                     strstr(info->marketing_name, "PRO") ||
                                                     strstr(info->marketing_name, "Frontier"));
 
    /* Set which chips have dedicated VRAM. */
-   info->has_dedicated_vram = !(amdinfo->ids_flags & AMDGPU_IDS_FLAGS_FUSION);
+   info->has_dedicated_vram = !(device_info.ids_flags & AMDGPU_IDS_FLAGS_FUSION);
 
    /* The kernel can split large buffers in VRAM but not in GTT, so large
     * allocations can fail or cause buffer movement failures in the kernel.
@@ -845,19 +921,19 @@ bool ac_query_gpu_info(int fd, void *dev_p, struct radeon_info *info,
    else
       info->max_heap_size_kb = info->gart_size_kb;
 
-   info->vram_type = amdinfo->vram_type;
-   info->memory_bus_width = amdinfo->vram_bit_width;
+   info->vram_type = device_info.vram_type;
+   info->memory_bus_width = device_info.vram_bit_width;
 
    /* Set which chips have uncached device memory. */
    info->has_l2_uncached = info->gfx_level >= GFX9;
 
    /* Set hardware information. */
    /* convert the shader/memory clocks from KHz to MHz */
-   info->max_gpu_freq_mhz = amdinfo->max_engine_clk / 1000;
-   info->memory_freq_mhz_effective = info->memory_freq_mhz = amdinfo->max_memory_clk / 1000;
+   info->max_gpu_freq_mhz = device_info.max_engine_clock / 1000;
+   info->memory_freq_mhz_effective = info->memory_freq_mhz = device_info.max_memory_clock / 1000;
    info->max_tcc_blocks = device_info.num_tcc_blocks;
-   info->max_se = amdinfo->num_shader_engines;
-   info->max_sa_per_se = amdinfo->num_shader_arrays_per_engine;
+   info->max_se = device_info.num_shader_engines;
+   info->max_sa_per_se = device_info.num_shader_arrays_per_engine;
    info->uvd_fw_version = info->ip[AMD_IP_UVD].num_queues ? uvd_version : 0;
    info->vce_fw_version = info->ip[AMD_IP_VCE].num_queues ? vce_version : 0;
 
@@ -898,18 +974,18 @@ bool ac_query_gpu_info(int fd, void *dev_p, struct radeon_info *info,
     */
    info->has_sparse_vm_mappings = info->gfx_level >= GFX7 && info->drm_minor >= 13;
    info->has_scheduled_fence_dependency = info->drm_minor >= 28;
-   info->mid_command_buffer_preemption_enabled = amdinfo->ids_flags & AMDGPU_IDS_FLAGS_PREEMPTION;
-   info->has_tmz_support = has_tmz_support(dev, info, amdinfo);
+   info->mid_command_buffer_preemption_enabled = device_info.ids_flags & AMDGPU_IDS_FLAGS_PREEMPTION;
+   info->has_tmz_support = has_tmz_support(dev, info, device_info.ids_flags);
    info->kernel_has_modifiers = has_modifiers(fd);
    info->has_graphics = info->ip[AMD_IP_GFX].num_queues > 0;
 
    info->pa_sc_tile_steering_override = device_info.pa_sc_tile_steering_override;
-   info->max_render_backends = amdinfo->rb_pipes;
+   info->max_render_backends = device_info.num_rb_pipes;
    /* The value returned by the kernel driver was wrong. */
    if (info->family == CHIP_KAVERI)
       info->max_render_backends = 2;
 
-   info->clock_crystal_freq = amdinfo->gpu_counter_freq;
+   info->clock_crystal_freq = device_info.gpu_counter_freq;
    if (!info->clock_crystal_freq) {
       fprintf(stderr, "amdgpu: clock crystal frequency is 0, timestamps will be wrong\n");
       info->clock_crystal_freq = 1;
@@ -971,11 +1047,11 @@ bool ac_query_gpu_info(int fd, void *dev_p, struct radeon_info *info,
    info->mc_arb_ramcfg = amdinfo->mc_arb_ramcfg;
    info->gb_addr_config = amdinfo->gb_addr_cfg;
    if (info->gfx_level >= GFX9) {
-      info->num_tile_pipes = 1 << G_0098F8_NUM_PIPES(amdinfo->gb_addr_cfg);
-      info->pipe_interleave_bytes = 256 << G_0098F8_PIPE_INTERLEAVE_SIZE_GFX9(amdinfo->gb_addr_cfg);
+      info->num_tile_pipes = 1 << G_0098F8_NUM_PIPES(info->gb_addr_config);
+      info->pipe_interleave_bytes = 256 << G_0098F8_PIPE_INTERLEAVE_SIZE_GFX9(info->gb_addr_config);
    } else {
       info->num_tile_pipes = cik_get_num_tile_pipes(amdinfo);
-      info->pipe_interleave_bytes = 256 << G_0098F8_PIPE_INTERLEAVE_SIZE_GFX6(amdinfo->gb_addr_cfg);
+      info->pipe_interleave_bytes = 256 << G_0098F8_PIPE_INTERLEAVE_SIZE_GFX6(info->gb_addr_config);
    }
    info->r600_has_virtual_memory = true;
 
@@ -1098,7 +1174,7 @@ bool ac_query_gpu_info(int fd, void *dev_p, struct radeon_info *info,
       for (j = 0; j < info->max_sa_per_se; j++) {
          if (info->gfx_level >= GFX11) {
             assert(info->max_sa_per_se <= 2);
-            info->cu_mask[i][j] = amdinfo->cu_bitmap[i % 4][(i / 4) * 2 + j];
+            info->cu_mask[i][j] = device_info.cu_bitmap[i % 4][(i / 4) * 2 + j];
          } else if (info->family == CHIP_ARCTURUS) {
             /* The CU bitmap in amd gpu info structure is
              * 4x4 size array, and it's usually suitable for Vega
@@ -1112,9 +1188,9 @@ bool ac_query_gpu_info(int fd, void *dev_p, struct radeon_info *info,
              *    SE7 --> cu_bitmap[3][1]
              */
             assert(info->max_sa_per_se == 1);
-            info->cu_mask[i][0] = amdinfo->cu_bitmap[i % 4][i / 4];
+            info->cu_mask[i][0] = device_info.cu_bitmap[i % 4][i / 4];
          } else {
-            info->cu_mask[i][j] = amdinfo->cu_bitmap[i][j];
+            info->cu_mask[i][j] = device_info.cu_bitmap[i][j];
          }
          info->num_cu += util_bitcount(info->cu_mask[i][j]);
       }