blob: d18d66ce41b3ae6be073adc31e974ab11a620af4 [file] [log] [blame]
/* 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__ */