1*32cad1ffSPhilippe Mathieu-Daudé #ifndef SYSTEM_NUMA_H 2*32cad1ffSPhilippe Mathieu-Daudé #define SYSTEM_NUMA_H 3*32cad1ffSPhilippe Mathieu-Daudé 4*32cad1ffSPhilippe Mathieu-Daudé #include "qemu/bitmap.h" 5*32cad1ffSPhilippe Mathieu-Daudé #include "qapi/qapi-types-machine.h" 6*32cad1ffSPhilippe Mathieu-Daudé 7*32cad1ffSPhilippe Mathieu-Daudé struct CPUArchId; 8*32cad1ffSPhilippe Mathieu-Daudé 9*32cad1ffSPhilippe Mathieu-Daudé #define MAX_NODES 128 10*32cad1ffSPhilippe Mathieu-Daudé #define NUMA_NODE_UNASSIGNED MAX_NODES 11*32cad1ffSPhilippe Mathieu-Daudé #define NUMA_DISTANCE_MIN 10 12*32cad1ffSPhilippe Mathieu-Daudé #define NUMA_DISTANCE_DEFAULT 20 13*32cad1ffSPhilippe Mathieu-Daudé #define NUMA_DISTANCE_MAX 254 14*32cad1ffSPhilippe Mathieu-Daudé #define NUMA_DISTANCE_UNREACHABLE 255 15*32cad1ffSPhilippe Mathieu-Daudé 16*32cad1ffSPhilippe Mathieu-Daudé /* the value of AcpiHmatLBInfo flags */ 17*32cad1ffSPhilippe Mathieu-Daudé enum { 18*32cad1ffSPhilippe Mathieu-Daudé HMAT_LB_MEM_MEMORY = 0, 19*32cad1ffSPhilippe Mathieu-Daudé HMAT_LB_MEM_CACHE_1ST_LEVEL = 1, 20*32cad1ffSPhilippe Mathieu-Daudé HMAT_LB_MEM_CACHE_2ND_LEVEL = 2, 21*32cad1ffSPhilippe Mathieu-Daudé HMAT_LB_MEM_CACHE_3RD_LEVEL = 3, 22*32cad1ffSPhilippe Mathieu-Daudé HMAT_LB_LEVELS /* must be the last entry */ 23*32cad1ffSPhilippe Mathieu-Daudé }; 24*32cad1ffSPhilippe Mathieu-Daudé 25*32cad1ffSPhilippe Mathieu-Daudé /* the value of AcpiHmatLBInfo data type */ 26*32cad1ffSPhilippe Mathieu-Daudé enum { 27*32cad1ffSPhilippe Mathieu-Daudé HMAT_LB_DATA_ACCESS_LATENCY = 0, 28*32cad1ffSPhilippe Mathieu-Daudé HMAT_LB_DATA_READ_LATENCY = 1, 29*32cad1ffSPhilippe Mathieu-Daudé HMAT_LB_DATA_WRITE_LATENCY = 2, 30*32cad1ffSPhilippe Mathieu-Daudé HMAT_LB_DATA_ACCESS_BANDWIDTH = 3, 31*32cad1ffSPhilippe Mathieu-Daudé HMAT_LB_DATA_READ_BANDWIDTH = 4, 32*32cad1ffSPhilippe Mathieu-Daudé HMAT_LB_DATA_WRITE_BANDWIDTH = 5, 33*32cad1ffSPhilippe Mathieu-Daudé HMAT_LB_TYPES /* must be the last entry */ 34*32cad1ffSPhilippe Mathieu-Daudé }; 35*32cad1ffSPhilippe Mathieu-Daudé 36*32cad1ffSPhilippe Mathieu-Daudé #define UINT16_BITS 16 37*32cad1ffSPhilippe Mathieu-Daudé 38*32cad1ffSPhilippe Mathieu-Daudé typedef struct NodeInfo { 39*32cad1ffSPhilippe Mathieu-Daudé uint64_t node_mem; 40*32cad1ffSPhilippe Mathieu-Daudé struct HostMemoryBackend *node_memdev; 41*32cad1ffSPhilippe Mathieu-Daudé bool present; 42*32cad1ffSPhilippe Mathieu-Daudé bool has_cpu; 43*32cad1ffSPhilippe Mathieu-Daudé bool has_gi; 44*32cad1ffSPhilippe Mathieu-Daudé uint8_t lb_info_provided; 45*32cad1ffSPhilippe Mathieu-Daudé uint16_t initiator; 46*32cad1ffSPhilippe Mathieu-Daudé uint8_t distance[MAX_NODES]; 47*32cad1ffSPhilippe Mathieu-Daudé } NodeInfo; 48*32cad1ffSPhilippe Mathieu-Daudé 49*32cad1ffSPhilippe Mathieu-Daudé typedef struct NumaNodeMem { 50*32cad1ffSPhilippe Mathieu-Daudé uint64_t node_mem; 51*32cad1ffSPhilippe Mathieu-Daudé uint64_t node_plugged_mem; 52*32cad1ffSPhilippe Mathieu-Daudé } NumaNodeMem; 53*32cad1ffSPhilippe Mathieu-Daudé 54*32cad1ffSPhilippe Mathieu-Daudé struct HMAT_LB_Data { 55*32cad1ffSPhilippe Mathieu-Daudé uint8_t initiator; 56*32cad1ffSPhilippe Mathieu-Daudé uint8_t target; 57*32cad1ffSPhilippe Mathieu-Daudé uint64_t data; 58*32cad1ffSPhilippe Mathieu-Daudé }; 59*32cad1ffSPhilippe Mathieu-Daudé typedef struct HMAT_LB_Data HMAT_LB_Data; 60*32cad1ffSPhilippe Mathieu-Daudé 61*32cad1ffSPhilippe Mathieu-Daudé struct HMAT_LB_Info { 62*32cad1ffSPhilippe Mathieu-Daudé /* Indicates it's memory or the specified level memory side cache. */ 63*32cad1ffSPhilippe Mathieu-Daudé uint8_t hierarchy; 64*32cad1ffSPhilippe Mathieu-Daudé 65*32cad1ffSPhilippe Mathieu-Daudé /* Present the type of data, access/read/write latency or bandwidth. */ 66*32cad1ffSPhilippe Mathieu-Daudé uint8_t data_type; 67*32cad1ffSPhilippe Mathieu-Daudé 68*32cad1ffSPhilippe Mathieu-Daudé /* The range bitmap of bandwidth for calculating common base */ 69*32cad1ffSPhilippe Mathieu-Daudé uint64_t range_bitmap; 70*32cad1ffSPhilippe Mathieu-Daudé 71*32cad1ffSPhilippe Mathieu-Daudé /* The common base unit for latencies or bandwidths */ 72*32cad1ffSPhilippe Mathieu-Daudé uint64_t base; 73*32cad1ffSPhilippe Mathieu-Daudé 74*32cad1ffSPhilippe Mathieu-Daudé /* Array to store the latencies or bandwidths */ 75*32cad1ffSPhilippe Mathieu-Daudé GArray *list; 76*32cad1ffSPhilippe Mathieu-Daudé }; 77*32cad1ffSPhilippe Mathieu-Daudé typedef struct HMAT_LB_Info HMAT_LB_Info; 78*32cad1ffSPhilippe Mathieu-Daudé 79*32cad1ffSPhilippe Mathieu-Daudé struct NumaState { 80*32cad1ffSPhilippe Mathieu-Daudé /* Number of NUMA nodes */ 81*32cad1ffSPhilippe Mathieu-Daudé int num_nodes; 82*32cad1ffSPhilippe Mathieu-Daudé 83*32cad1ffSPhilippe Mathieu-Daudé /* Allow setting NUMA distance for different NUMA nodes */ 84*32cad1ffSPhilippe Mathieu-Daudé bool have_numa_distance; 85*32cad1ffSPhilippe Mathieu-Daudé 86*32cad1ffSPhilippe Mathieu-Daudé /* Detect if HMAT support is enabled. */ 87*32cad1ffSPhilippe Mathieu-Daudé bool hmat_enabled; 88*32cad1ffSPhilippe Mathieu-Daudé 89*32cad1ffSPhilippe Mathieu-Daudé /* NUMA nodes information */ 90*32cad1ffSPhilippe Mathieu-Daudé NodeInfo nodes[MAX_NODES]; 91*32cad1ffSPhilippe Mathieu-Daudé 92*32cad1ffSPhilippe Mathieu-Daudé /* NUMA nodes HMAT Locality Latency and Bandwidth Information */ 93*32cad1ffSPhilippe Mathieu-Daudé HMAT_LB_Info *hmat_lb[HMAT_LB_LEVELS][HMAT_LB_TYPES]; 94*32cad1ffSPhilippe Mathieu-Daudé 95*32cad1ffSPhilippe Mathieu-Daudé /* Memory Side Cache Information Structure */ 96*32cad1ffSPhilippe Mathieu-Daudé NumaHmatCacheOptions *hmat_cache[MAX_NODES][HMAT_LB_LEVELS]; 97*32cad1ffSPhilippe Mathieu-Daudé }; 98*32cad1ffSPhilippe Mathieu-Daudé typedef struct NumaState NumaState; 99*32cad1ffSPhilippe Mathieu-Daudé 100*32cad1ffSPhilippe Mathieu-Daudé void set_numa_options(MachineState *ms, NumaOptions *object, Error **errp); 101*32cad1ffSPhilippe Mathieu-Daudé void parse_numa_opts(MachineState *ms); 102*32cad1ffSPhilippe Mathieu-Daudé void parse_numa_hmat_lb(NumaState *numa_state, NumaHmatLBOptions *node, 103*32cad1ffSPhilippe Mathieu-Daudé Error **errp); 104*32cad1ffSPhilippe Mathieu-Daudé void parse_numa_hmat_cache(MachineState *ms, NumaHmatCacheOptions *node, 105*32cad1ffSPhilippe Mathieu-Daudé Error **errp); 106*32cad1ffSPhilippe Mathieu-Daudé void numa_complete_configuration(MachineState *ms); 107*32cad1ffSPhilippe Mathieu-Daudé void query_numa_node_mem(NumaNodeMem node_mem[], MachineState *ms); 108*32cad1ffSPhilippe Mathieu-Daudé extern QemuOptsList qemu_numa_opts; 109*32cad1ffSPhilippe Mathieu-Daudé void numa_cpu_pre_plug(const struct CPUArchId *slot, DeviceState *dev, 110*32cad1ffSPhilippe Mathieu-Daudé Error **errp); 111*32cad1ffSPhilippe Mathieu-Daudé bool numa_uses_legacy_mem(void); 112*32cad1ffSPhilippe Mathieu-Daudé 113*32cad1ffSPhilippe Mathieu-Daudé #endif 114