| /* SPDX-License-Identifier: GPL-2.0-only */ |
| |
| #ifndef __ACPI_CRAT_H__ |
| #define __ACPI_CRAT_H__ |
| |
| #include <stdint.h> |
| |
| enum crat_entry_type { |
| CRAT_HSA_PROC_UNIT_TYPE, |
| CRAT_MEMORY_TYPE, |
| CRAT_CACHE_TYPE, |
| CRAT_TLB_TYPE, |
| CRAT_FPU_TYPE, |
| CRAT_IO_TYPE, |
| CRAT_MAX_TYPE, |
| }; |
| |
| #define CRAT_HSA_PR_FLAG_EN_SHFT 0 |
| #define CRAT_HSA_PR_FLAG_EN (0x1 << CRAT_HSA_PR_FLAG_EN_SHFT) |
| #define CRAT_HSA_PR_FLAG_HOT_PLUG_SHFT 1 |
| #define CRAT_HSA_PR_FLAG_HOT_PLUG (0x1 << CRAT_HSA_PR_FLAG_HOT_PLUG_SHFT) |
| #define CRAT_HSA_PR_FLAG_CPU_PRES_SHFT 2 |
| #define CRAT_HSA_PR_FLAG_CPU_PRES (0x1 << CRAT_HSA_PR_FLAG_CPU_PRES_SHFT) |
| #define CRAT_HSA_PR_FLAG_GPU_PRES_SHFT 3 |
| #define CRAT_HSA_PR_FLAG_GPU_PRES (0x1 << CRAT_HSA_PR_FLAG_GPU_PRES_SHFT) |
| #define CRAT_HSA_PR_FLAG_CRAT_HSAMMU_SHFT 4 |
| #define CRAT_HSA_PR_FLAG_CRAT_HSAMMU (0x1 << CRAT_HSA_PR_FLAG_CRAT_HSAMMU_SHFT) |
| #define CRAT_HSA_PR_FLAG_VAL_LIM_SHFT 5 |
| #define CRAT_HSA_PR_FLAG_VAL_LIM (0x7 << CRAT_HSA_PR_FLAG_VAL_LIM_SHFT) |
| #define CRAT_HSA_PR_FLAG_ATOM_OPS_SHFT 8 |
| #define CRAT_HSA_PR_FLAG_ATOM_OPS (0x3 << CRAT_HSA_PR_FLAG_ATOM_OPS_SHFT) |
| #define CRAT_HSA_PR_FLAG_SMT_CAPS_SHFT 10 |
| #define CRAT_HSA_PR_FLAG_SMT_CAPS (0x3 << CRAT_HSA_PR_FLAG_SMT_CAPS_SHFT) |
| |
| /* CRAT HSA Processing Unit Affinity Structure */ |
| struct crat_hsa_processing_unit { |
| uint8_t type; |
| uint8_t length; |
| uint16_t reserved; |
| uint32_t flags; |
| uint32_t proximity_node; |
| uint32_t processor_id_low; |
| uint16_t num_cpu_cores; |
| uint16_t num_simd_cores; |
| uint16_t max_waves_simd; |
| uint16_t io_count; |
| uint16_t hsa_capability; |
| uint16_t lds_size_in_kb; |
| uint8_t wave_front_size; |
| uint8_t num_shader_banks; |
| uint16_t uengine_identifier; |
| uint8_t num_arrays; |
| uint8_t num_cu_per_array; |
| uint8_t num_simd_per_cu; |
| uint8_t max_slots_scratch_cu; |
| uint8_t reserved1[4]; |
| } __packed; |
| |
| #define CRAT_L1_CACHE 1 |
| #define CRAT_L2_CACHE 2 |
| #define CRAT_L3_CACHE 3 |
| |
| #define CRAT_MEM_FLAG_EN_SHFT 0 |
| #define CRAT_MEM_FLAG_EN (0x1 << CRAT_MEM_FLAG_EN_SHFT) |
| #define CRAT_MEM_FLAG_HOT_PLUG_SHFT 1 |
| #define CRAT_MEM_FLAG_HOT_PLUG (0x1 << CRAT_MEM_FLAG_HOT_PLUG_SHFT) |
| #define CRAT_MEM_FLAG_NV_SHFT 2 |
| #define CRAT_MEM_FLAG_NV (0x1 << CRAT_MEM_FLAG_NV_SHFT) |
| #define CRAT_MEM_FLAG_ATOM_OPS_SHFT 3 |
| #define CRAT_MEM_FLAG_ATOM_OPS (0x3 << CRAT_MEM_FLAG_ATOM_OPS_SHFT) |
| |
| /* CRAT Memory Affinity Structure */ |
| struct crat_memory { |
| uint8_t type; |
| uint8_t length; |
| uint16_t reserved; |
| uint32_t flags; |
| uint32_t proximity_domain; |
| uint32_t base_address_low; |
| uint32_t base_address_high; |
| uint32_t length_low; |
| uint32_t length_high; |
| uint32_t width; |
| uint8_t reserved1[8]; |
| } __packed; |
| |
| #define CRAT_CACHE_FLAG_EN_SHFT 0 |
| #define CRAT_CACHE_FLAG_EN (0x1 << CRAT_CACHE_FLAG_EN_SHFT) |
| #define CRAT_CACHE_FLAG_DATA_CACHE_SHFT 1 |
| #define CRAT_CACHE_FLAG_DATA_CACHE (0x1 << CRAT_CACHE_FLAG_DATA_CACHE_SHFT) |
| #define CRAT_CACHE_FLAG_INSTR_CACHE_SHFT 2 |
| #define CRAT_CACHE_FLAG_INSTR_CACHE (0x1 << CRAT_CACHE_FLAG_INSTR_CACHE_SHFT) |
| #define CRAT_CACHE_FLAG_CPU_CACHE_SHFT 3 |
| #define CRAT_CACHE_FLAG_CPU_CACHE (0x1 << CRAT_CACHE_FLAG_CPU_CACHE_SHFT) |
| #define CRAT_CACHE_FLAG_SIMD_CACHE_SHFT 4 |
| #define CRAT_CACHE_FLAG_SIMD_CACHE (0x1 << CRAT_CACHE_FLAG_SIMD_CACHE_SHFT) |
| #define CRAT_CACHE_FLAG_GDS_SHFT 5 |
| #define CRAT_CACHE_FLAG_GDS (0x1 << CRAT_CACHE_FLAG_GDS_SHFT) |
| #define CRAT_CACHE_FLAG_ATOMIC_OPS_SHFT 6 |
| #define CRAT_CACHE_FLAG_ATOMIC_OPS (0x1 << CRAT_CACHE_FLAG_ATOMIC_OPS_SHFT) |
| |
| /* CRAT Cache Affinity Structure */ |
| struct crat_cache { |
| uint8_t type; |
| uint8_t length; |
| uint16_t reserved; |
| uint32_t flags; |
| uint32_t proc_id_low; |
| uint8_t sibling_map[32]; |
| uint32_t cache_size; |
| uint8_t cache_level; |
| uint8_t lines_per_tag; |
| uint16_t cache_line_size; |
| uint8_t associativity; |
| uint8_t cache_properties; |
| uint16_t cache_latency; |
| uint8_t reserved1[8]; |
| } __packed; |
| |
| enum tlb_type { |
| tlb_2m, |
| tlb_4k, |
| tlb_1g, |
| tlb_type_max, |
| }; |
| |
| #define CRAT_TLB_FLAG_EN_SHFT 0 |
| #define CRAT_TLB_FLAG_EN (0x1 << CRAT_TLB_FLAG_EN_SHFT) |
| #define CRAT_TLB_FLAG_DATA_TLB_SHFT 1 |
| #define CRAT_TLB_FLAG_DATA_TLB (0x1 << CRAT_TLB_FLAG_DATA_TLB_SHFT) |
| #define CRAT_TLB_FLAG_INSTR_TLB_SHFT 2 |
| #define CRAT_TLB_FLAG_INSTR_TLB (0x1 << CRAT_TLB_FLAG_INSTR_TLB_SHFT) |
| #define CRAT_TLB_FLAG_CPU_TLB_SHFT 3 |
| #define CRAT_TLB_FLAG_CPU_TLB (0x1 << CRAT_TLB_FLAG_CPU_TLB_SHFT) |
| #define CRAT_TLB_FLAG_SIMD_TLB_SHFT 4 |
| #define CRAT_TLB_FLAG_SIMD_TLB (0x1 << CRAT_TLB_FLAG_SIMD_TLB_SHFT) |
| #define CRAT_TLB_FLAG_4K_BASE_256_SHFT 5 |
| #define CRAT_TLB_FLAG_4K_BASE_256 (0x1 << CRAT_TLB_FLAG_4K_BASE_256_SHFT) |
| #define CRAT_TLB_FLAG_2MB_BASE_256_SHFT 7 |
| #define CRAT_TLB_FLAG_2MB_BASE_256 (0x1 << CRAT_TLB_FLAG_2MB_BASE_256_SHFT) |
| #define CRAT_TLB_FLAG_1GB_BASE_256_SHFT 9 |
| #define CRAT_TLB_FLAG_1GB_BASE_256 (0x1 << CRAT_TLB_FLAG_1GB_BASE_256_SHFT) |
| |
| /* CRAT TLB Affinity Structure */ |
| struct crat_tlb { |
| uint8_t type; |
| uint8_t length; |
| uint16_t reserved; |
| uint32_t flags; |
| uint32_t proc_id_low; |
| uint8_t sibling_map[32]; |
| uint32_t tlb_level; |
| uint8_t data_tlb_2mb_assoc; |
| uint8_t data_tlb_2mb_size; |
| uint8_t instr_tlb_2mb_assoc; |
| uint8_t instr_tlb_2mb_size; |
| uint8_t data_tlb_4k_assoc; |
| uint8_t data_tlb_4k_size; |
| uint8_t instr_tlb_4k_assoc; |
| uint8_t instr_tlb_4k_size; |
| uint8_t data_tlb_1g_assoc; |
| uint8_t data_tlb_1g_size; |
| uint8_t instr_tlb_1g_assoc; |
| uint8_t instr_tlb_1g_size; |
| uint8_t reserved1[4]; |
| } __packed; |
| |
| #define CRAT_FPU_FLAG_EN_SHFT 0 |
| #define CRAT_FPU_FLAG_EN (0x1 << CRAT_TLB_FLAG_EN_SHFT) |
| |
| /* CRAT FPU Affinity Structure */ |
| struct crat_fpu { |
| uint8_t type; |
| uint8_t length; |
| uint16_t reserved; |
| uint32_t flags; |
| uint32_t proc_id_low; |
| uint8_t sibling_map[32]; |
| uint32_t fpu_size; |
| uint8_t reserved1[16]; |
| } __packed; |
| |
| #define CRAT_IO_FLAG_EN_SHFT 0 |
| #define CRAT_IO_FLAG_EN (0x1 << CRAT_IO_FLAG_EN_SHFT) |
| #define CRAT_IO_FLAG_COHER_SHFT 1 |
| #define CRAT_IO_FLAG_COHER (0x1 << CRAT_IO_FLAG_COHER_SHFT) |
| |
| /* CRAT IO Affinity Structure */ |
| struct crat_io { |
| uint8_t type; |
| uint8_t length; |
| uint16_t reserved; |
| uint32_t flags; |
| uint32_t proximity_domain_from; |
| uint32_t proximity_domain_to; |
| uint8_t io_type; |
| uint8_t version_major; |
| uint16_t version_minor; |
| uint32_t minimum_latency; |
| uint32_t maximum_latency; |
| uint32_t minimum_bandwidth; |
| uint32_t maximum_bandwidth; |
| uint32_t recommended_transfer_size; |
| uint8_t reserved1[24]; |
| } __packed; |
| |
| #endif /* __ACPI_CRAT_H__ */ |