xref: /openbmc/qemu/include/system/numa.h (revision 65cb7129f4160c7e07a0da107f888ec73ae96776)
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