1 /* 2 * Copyright © 2017 Advanced Micro Devices, Inc. 3 * 4 * SPDX-License-Identifier: MIT 5 */ 6 7 #ifndef AC_GPU_INFO_H 8 #define AC_GPU_INFO_H 9 10 #include <stdbool.h> 11 #include "util/macros.h" 12 #include "amd_family.h" 13 14 #ifdef __cplusplus 15 extern "C" { 16 #endif 17 18 #define AMD_MAX_SE 32 19 #define AMD_MAX_SA_PER_SE 2 20 #define AMD_MAX_WGP 60 21 22 struct amdgpu_gpu_info; 23 24 struct amd_ip_info { 25 uint8_t ver_major; 26 uint8_t ver_minor; 27 uint8_t ver_rev; 28 uint8_t num_queues; 29 uint8_t num_instances; 30 uint32_t ib_alignment; 31 uint32_t ib_pad_dw_mask; 32 }; 33 34 struct radeon_info { 35 /* Device info. */ 36 const char *name; 37 char lowercase_name[32]; 38 const char *marketing_name; 39 char dev_filename[32]; 40 uint32_t num_se; /* only enabled SEs */ 41 uint32_t num_rb; /* only enabled RBs */ 42 uint32_t num_cu; /* only enabled CUs */ 43 uint32_t max_gpu_freq_mhz; /* also known as the shader clock */ 44 uint32_t max_gflops; 45 uint32_t sqc_inst_cache_size; 46 uint32_t sqc_scalar_cache_size; 47 uint32_t num_sqc_per_wgp; 48 uint32_t tcp_cache_size; 49 uint32_t l1_cache_size; 50 uint32_t l2_cache_size; 51 uint32_t l3_cache_size_mb; 52 uint32_t num_tcc_blocks; /* also the number of memory channels */ 53 uint32_t memory_freq_mhz; 54 uint32_t memory_freq_mhz_effective; 55 uint32_t memory_bus_width; 56 uint32_t memory_bandwidth_gbps; 57 uint32_t pcie_gen; 58 uint32_t pcie_num_lanes; 59 uint32_t pcie_bandwidth_mbps; 60 uint32_t clock_crystal_freq; 61 struct amd_ip_info ip[AMD_NUM_IP_TYPES]; 62 63 /* Identification. */ 64 /* PCI info: domain:bus:dev:func */ 65 struct { 66 uint32_t domain; 67 uint32_t bus; 68 uint32_t dev; 69 uint32_t func; 70 bool valid; 71 } pci; 72 73 uint32_t pci_id; 74 uint32_t pci_rev_id; 75 enum radeon_family family; 76 enum amd_gfx_level gfx_level; 77 uint32_t family_id; 78 uint32_t chip_external_rev; 79 uint32_t chip_rev; /* 0 = A0, 1 = A1, etc. */ 80 81 /* Flags. */ 82 bool family_overridden; /* AMD_FORCE_FAMILY was used, skip command submission */ 83 bool is_pro_graphics; 84 bool has_graphics; /* false if the chip is compute-only */ 85 bool has_clear_state; 86 bool has_distributed_tess; 87 bool has_dcc_constant_encode; 88 bool has_tc_compatible_htile; 89 bool has_etc_support; 90 bool has_rbplus; /* if RB+ registers exist */ 91 bool rbplus_allowed; /* if RB+ is allowed */ 92 bool has_load_ctx_reg_pkt; 93 bool has_out_of_order_rast; 94 bool has_packed_math_16bit; 95 bool has_accelerated_dot_product; 96 bool cpdma_prefetch_writes_memory; 97 bool has_gfx9_scissor_bug; 98 bool has_tc_compat_zrange_bug; 99 bool has_small_prim_filter_sample_loc_bug; 100 bool has_ls_vgpr_init_bug; 101 bool has_pops_missed_overlap_bug; 102 bool has_null_index_buffer_clamping_bug; 103 bool has_zero_index_buffer_bug; 104 bool has_image_load_dcc_bug; 105 bool has_two_planes_iterate256_bug; 106 bool has_vgt_flush_ngg_legacy_bug; 107 bool has_cs_regalloc_hang_bug; 108 bool has_async_compute_threadgroup_bug; 109 bool has_async_compute_align32_bug; 110 bool has_32bit_predication; 111 bool has_3d_cube_border_color_mipmap; 112 bool has_image_opcodes; 113 bool never_stop_sq_perf_counters; 114 bool has_sqtt_rb_harvest_bug; 115 bool has_sqtt_auto_flush_mode_bug; 116 bool never_send_perfcounter_stop; 117 bool discardable_allows_big_page; 118 bool has_export_conflict_bug; 119 bool has_vrs_ds_export_bug; 120 bool has_taskmesh_indirect0_bug; 121 bool sdma_supports_sparse; /* Whether SDMA can safely access sparse resources. */ 122 bool sdma_supports_compression; /* Whether SDMA supports DCC and HTILE. */ 123 bool has_set_context_pairs; 124 bool has_set_context_pairs_packed; 125 bool has_set_sh_pairs; 126 bool has_set_sh_pairs_packed; 127 bool has_set_uconfig_pairs; 128 bool needs_llvm_wait_wa; /* True if the chip needs to workarounds based on s_waitcnt_deptr but 129 * the LLVM version doesn't work with multiparts shaders. 130 */ 131 132 /* conformant_trunc_coord is equal to TA_CNTL2.TRUNCATE_COORD_MODE, which exists since gfx11. 133 * 134 * If TA_CNTL2.TRUNCATE_COORD_MODE == 0, coordinate truncation is the same as gfx10 and older. 135 * 136 * If TA_CNTL2.TRUNCATE_COORD_MODE == 1, coordinate truncation is adjusted to be D3D9/GL/Vulkan 137 * conformant if you also set TRUNC_COORD. Coordinate truncation uses D3D10+ behaviour if 138 * TRUNC_COORD is unset. 139 * 140 * Behavior if TA_CNTL2.TRUNCATE_COORD_MODE == 1: 141 * truncate_coord_xy = TRUNC_COORD && (xy_filter == Point && !gather); 142 * truncate_coord_z = TRUNC_COORD && (z_filter == Point); 143 * truncate_coord_layer = false; 144 * 145 * Behavior if TA_CNTL2.TRUNCATE_COORD_MODE == 0: 146 * truncate_coord_xy = TRUNC_COORD; 147 * truncate_coord_z = TRUNC_COORD; 148 * truncate_coord_layer = TRUNC_COORD; 149 * 150 * AnisoPoint is treated as Point. 151 */ 152 bool conformant_trunc_coord; 153 154 /* Display features. */ 155 /* There are 2 display DCC codepaths, because display expects unaligned DCC. */ 156 /* Disable RB and pipe alignment to skip the retile blit. (1 RB chips only) */ 157 bool use_display_dcc_unaligned; 158 /* Allocate both aligned and unaligned DCC and use the retile blit. */ 159 bool use_display_dcc_with_retile_blit; 160 161 /* Memory info. */ 162 uint32_t pte_fragment_size; 163 uint32_t gart_page_size; 164 uint32_t gart_size_kb; 165 uint32_t vram_size_kb; 166 uint64_t vram_vis_size_kb; 167 uint32_t vram_type; 168 uint32_t max_heap_size_kb; 169 uint32_t min_alloc_size; 170 uint32_t address32_hi; 171 bool has_dedicated_vram; 172 bool all_vram_visible; 173 bool has_l2_uncached; 174 bool r600_has_virtual_memory; 175 uint32_t max_tcc_blocks; 176 uint32_t tcc_cache_line_size; 177 bool tcc_rb_non_coherent; /* whether L2 inv is needed for render->texture transitions */ 178 bool cp_sdma_ge_use_system_memory_scope; 179 unsigned pc_lines; 180 uint32_t lds_size_per_workgroup; 181 uint32_t lds_alloc_granularity; 182 uint32_t lds_encode_granularity; 183 184 /* CP info. */ 185 bool gfx_ib_pad_with_type2; 186 bool has_cp_dma; 187 uint32_t me_fw_version; 188 uint32_t me_fw_feature; 189 uint32_t mec_fw_version; 190 uint32_t mec_fw_feature; 191 uint32_t pfp_fw_version; 192 uint32_t pfp_fw_feature; 193 194 /* Multimedia info. */ 195 uint32_t uvd_fw_version; 196 uint32_t vce_fw_version; 197 uint32_t vce_harvest_config; 198 uint32_t vcn_dec_version; 199 uint32_t vcn_enc_major_version; 200 uint32_t vcn_enc_minor_version; 201 struct video_caps_info { 202 struct video_codec_cap { 203 uint32_t valid; 204 uint32_t max_width; 205 uint32_t max_height; 206 uint32_t max_pixels_per_frame; 207 uint32_t max_level; 208 uint32_t pad; 209 } codec_info[8]; /* the number of available codecs */ 210 } dec_caps, enc_caps; 211 212 enum vcn_version vcn_ip_version; 213 enum sdma_version sdma_ip_version; 214 215 /* Kernel & winsys capabilities. */ 216 uint32_t drm_major; /* version */ 217 uint32_t drm_minor; 218 uint32_t drm_patchlevel; 219 uint32_t max_submitted_ibs[AMD_NUM_IP_TYPES]; 220 bool is_amdgpu; 221 bool has_userptr; 222 bool has_syncobj; 223 bool has_timeline_syncobj; 224 bool has_fence_to_handle; 225 bool has_local_buffers; 226 bool has_bo_metadata; 227 bool has_eqaa_surface_allocator; 228 bool has_sparse_vm_mappings; 229 bool has_scheduled_fence_dependency; 230 bool has_gang_submit; 231 bool has_gpuvm_fault_query; 232 bool has_pcie_bandwidth_info; 233 bool has_stable_pstate; 234 /* Whether SR-IOV is enabled or amdgpu.mcbp=1 was set on the kernel command line. */ 235 bool register_shadowing_required; 236 bool has_tmz_support; 237 bool kernel_has_modifiers; 238 239 /* If the kernel driver uses CU reservation for high priority compute on gfx10+, it programs 240 * a global CU mask in the hw that is AND'ed with CU_EN register fields set by userspace. 241 * The packet that does the AND'ing is SET_SH_REG_INDEX(index = 3). If you don't use 242 * SET_SH_REG_INDEX, the global CU mask will not be applied. 243 * 244 * If uses_kernel_cu_mask is true, use SET_SH_REG_INDEX. 245 * 246 * If uses_kernel_cu_mask is false, SET_SH_REG_INDEX shouldn't be used because it only 247 * increases CP overhead and doesn't have any other effect. 248 * 249 * The alternative to this is to set the AMD_CU_MASK environment variable that has the same 250 * effect on radeonsi and RADV and doesn't need SET_SH_REG_INDEX. 251 */ 252 bool uses_kernel_cu_mask; 253 254 /* Shader cores. */ 255 uint16_t cu_mask[AMD_MAX_SE][AMD_MAX_SA_PER_SE]; 256 uint32_t r600_max_quad_pipes; /* wave size / 16 */ 257 uint32_t max_good_cu_per_sa; 258 uint32_t min_good_cu_per_sa; /* min != max if SAs have different # of CUs */ 259 uint32_t max_se; /* number of shader engines incl. disabled ones */ 260 uint32_t max_sa_per_se; /* shader arrays per shader engine */ 261 uint32_t num_cu_per_sh; 262 uint32_t max_waves_per_simd; 263 uint32_t num_physical_sgprs_per_simd; 264 uint32_t num_physical_wave64_vgprs_per_simd; 265 uint32_t num_simd_per_compute_unit; 266 uint32_t min_sgpr_alloc; 267 uint32_t max_sgpr_alloc; 268 uint32_t sgpr_alloc_granularity; 269 uint32_t min_wave64_vgpr_alloc; 270 uint32_t max_vgpr_alloc; 271 uint32_t wave64_vgpr_alloc_granularity; 272 uint32_t max_scratch_waves; 273 bool has_scratch_base_registers; 274 275 /* Pos, prim, and attribute rings. */ 276 uint32_t attribute_ring_size_per_se; /* GFX11+ */ 277 uint32_t pos_ring_size_per_se; /* GFX12+ */ 278 uint32_t prim_ring_size_per_se; /* GFX12+ */ 279 uint32_t pos_ring_offset; /* GFX12+ */ 280 uint32_t prim_ring_offset; /* GFX12+ */ 281 uint32_t total_attribute_pos_prim_ring_size; /* GFX11+ */ 282 283 /* Render backends (color + depth blocks). */ 284 uint32_t r300_num_gb_pipes; 285 uint32_t r300_num_z_pipes; 286 uint32_t r600_gb_backend_map; /* R600 harvest config */ 287 bool r600_gb_backend_map_valid; 288 uint32_t r600_num_banks; 289 uint32_t mc_arb_ramcfg; 290 uint32_t gb_addr_config; 291 uint32_t pa_sc_tile_steering_override; /* CLEAR_STATE also sets this */ 292 uint32_t max_render_backends; /* number of render backends incl. disabled ones */ 293 uint32_t num_tile_pipes; /* pipe count from PIPE_CONFIG */ 294 uint32_t pipe_interleave_bytes; 295 uint64_t enabled_rb_mask; /* bitmask of enabled physical RBs, up to max_render_backends bits */ 296 uint64_t max_alignment; /* from addrlib */ 297 uint32_t pbb_max_alloc_count; 298 299 /* Tile modes. */ 300 uint32_t si_tile_mode_array[32]; 301 uint32_t cik_macrotile_mode_array[16]; 302 303 /* AMD_CU_MASK environment variable or ~0. */ 304 bool spi_cu_en_has_effect; 305 uint32_t spi_cu_en; 306 307 struct { 308 uint32_t shadow_size; 309 uint32_t shadow_alignment; 310 uint32_t csa_size; 311 uint32_t csa_alignment; 312 } fw_based_mcbp; 313 bool has_fw_based_shadowing; 314 }; 315 316 bool ac_query_gpu_info(int fd, void *dev_p, struct radeon_info *info, 317 bool require_pci_bus_info); 318 319 void ac_compute_driver_uuid(char *uuid, size_t size); 320 321 void ac_compute_device_uuid(const struct radeon_info *info, char *uuid, size_t size); 322 void ac_print_gpu_info(const struct radeon_info *info, FILE *f); 323 int ac_get_gs_table_depth(enum amd_gfx_level gfx_level, enum radeon_family family); 324 void ac_get_raster_config(const struct radeon_info *info, uint32_t *raster_config_p, 325 uint32_t *raster_config_1_p, uint32_t *se_tile_repeat_p); 326 void ac_get_harvested_configs(const struct radeon_info *info, unsigned raster_config, 327 unsigned *cik_raster_config_1_p, unsigned *raster_config_se); 328 unsigned ac_get_compute_resource_limits(const struct radeon_info *info, 329 unsigned waves_per_threadgroup, unsigned max_waves_per_sh, 330 unsigned threadgroups_per_cu); 331 332 struct ac_hs_info { 333 uint32_t tess_offchip_block_dw_size; 334 uint32_t max_offchip_buffers; 335 uint32_t hs_offchip_param; 336 uint32_t tess_factor_ring_size; 337 uint32_t tess_offchip_ring_offset; 338 uint32_t tess_offchip_ring_size; 339 }; 340 341 void ac_get_hs_info(const struct radeon_info *info, 342 struct ac_hs_info *hs); 343 344 /* Task rings BO layout information. 345 * This BO is shared between GFX and ACE queues so that the ACE and GFX 346 * firmware can cooperate on task->mesh dispatches and is also used to 347 * store the task payload which is passed to mesh shaders. 348 * 349 * The driver only needs to create this BO once, 350 * and it will always be able to accommodate the maximum needed 351 * task payload size. 352 * 353 * The following memory layout is used: 354 * 1. Control buffer: 9 DWORDs, 256 byte aligned 355 * Used by the firmware to maintain the current state. 356 * (padding) 357 * 2. Draw ring: 4 DWORDs per entry, 256 byte aligned 358 * Task shaders store the mesh dispatch size here. 359 * (padding) 360 * 3. Payload ring: 16K bytes per entry, 256 byte aligned. 361 * This is where task payload is stored by task shaders and 362 * read by mesh shaders. 363 * 364 */ 365 struct ac_task_info { 366 uint32_t draw_ring_offset; 367 uint32_t payload_ring_offset; 368 uint32_t bo_size_bytes; 369 uint16_t num_entries; 370 }; 371 372 /* Size of each payload entry in the task payload ring. 373 * Spec requires minimum 16K bytes. 374 */ 375 #define AC_TASK_PAYLOAD_ENTRY_BYTES 16384 376 377 /* Size of each draw entry in the task draw ring. 378 * 4 DWORDs per entry. 379 */ 380 #define AC_TASK_DRAW_ENTRY_BYTES 16 381 382 /* Size of the task control buffer. 9 DWORDs. */ 383 #define AC_TASK_CTRLBUF_BYTES 36 384 385 void ac_get_task_info(const struct radeon_info *info, 386 struct ac_task_info *task_info); 387 388 uint32_t ac_memory_ops_per_clock(uint32_t vram_type); 389 390 uint32_t ac_gfx103_get_cu_mask_ps(const struct radeon_info *info); 391 392 #ifdef __cplusplus 393 } 394 #endif 395 396 #endif /* AC_GPU_INFO_H */ 397