mirror of
https://github.com/mii443/qemu.git
synced 2025-12-07 13:08:31 +00:00
spapr: introduce SpaprMachineState::numa_assoc_array
The next step to centralize all NUMA/associativity handling in the spapr machine is to create a 'one stop place' for all things ibm,associativity. This patch introduces numa_assoc_array, a 2 dimensional array that will store all ibm,associativity arrays of all NUMA nodes. This array is initialized in a new spapr_numa_associativity_init() function, called in spapr_machine_init(). It is being initialized with the same values used in other ibm,associativity properties around spapr files (i.e. all zeros, last value is node_id). The idea is to remove all hardcoded definitions and FDT writes of ibm,associativity arrays, doing instead a call to the new helper spapr_numa_write_associativity_dt() helper, that will be able to write the DT with the correct values. We'll start small, handling the trivial cases first. The remaining instances of ibm,associativity will be handled next. Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com> Message-Id: <20200903220639.563090-2-danielhb413@gmail.com> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
committed by
David Gibson
parent
6ee1d62e6a
commit
f1aa45fffe
@@ -105,6 +105,16 @@ typedef enum {
|
||||
|
||||
#define FDT_MAX_SIZE 0x100000
|
||||
|
||||
/*
|
||||
* NUMA related macros. MAX_DISTANCE_REF_POINTS was taken
|
||||
* from Taken from Linux kernel arch/powerpc/mm/numa.h.
|
||||
*
|
||||
* NUMA_ASSOC_SIZE is the base array size of an ibm,associativity
|
||||
* array for any non-CPU resource.
|
||||
*/
|
||||
#define MAX_DISTANCE_REF_POINTS 4
|
||||
#define NUMA_ASSOC_SIZE (MAX_DISTANCE_REF_POINTS + 1)
|
||||
|
||||
typedef struct SpaprCapabilities SpaprCapabilities;
|
||||
struct SpaprCapabilities {
|
||||
uint8_t caps[SPAPR_CAP_NUM];
|
||||
@@ -231,6 +241,8 @@ struct SpaprMachineState {
|
||||
unsigned gpu_numa_id;
|
||||
SpaprTpmProxy *tpm_proxy;
|
||||
|
||||
uint32_t numa_assoc_array[MAX_NODES][NUMA_ASSOC_SIZE];
|
||||
|
||||
Error *fwnmi_migration_blocker;
|
||||
};
|
||||
|
||||
|
||||
@@ -13,8 +13,19 @@
|
||||
#ifndef HW_SPAPR_NUMA_H
|
||||
#define HW_SPAPR_NUMA_H
|
||||
|
||||
#include "hw/boards.h"
|
||||
#include "hw/ppc/spapr.h"
|
||||
|
||||
/*
|
||||
* Having both SpaprMachineState and MachineState as arguments
|
||||
* feels odd, but it will spare a MACHINE() call inside the
|
||||
* function. spapr_machine_init() is the only caller for it, and
|
||||
* it has both pointers resolved already.
|
||||
*/
|
||||
void spapr_numa_associativity_init(SpaprMachineState *spapr,
|
||||
MachineState *machine);
|
||||
void spapr_numa_write_rtas_dt(SpaprMachineState *spapr, void *fdt, int rtas);
|
||||
void spapr_numa_write_associativity_dt(SpaprMachineState *spapr, void *fdt,
|
||||
int offset, int nodeid);
|
||||
|
||||
#endif /* HW_SPAPR_NUMA_H */
|
||||
|
||||
@@ -27,7 +27,7 @@ QEMU_BUILD_BUG_ON(SPAPR_MINIMUM_SCM_BLOCK_SIZE % SPAPR_MEMORY_BLOCK_SIZE);
|
||||
|
||||
int spapr_pmem_dt_populate(SpaprDrc *drc, SpaprMachineState *spapr,
|
||||
void *fdt, int *fdt_start_offset, Error **errp);
|
||||
void spapr_dt_persistent_memory(void *fdt);
|
||||
void spapr_dt_persistent_memory(SpaprMachineState *spapr, void *fdt);
|
||||
void spapr_nvdimm_validate(HotplugHandler *hotplug_dev, NVDIMMDevice *nvdimm,
|
||||
uint64_t size, Error **errp);
|
||||
void spapr_add_nvdimm(DeviceState *dev, uint64_t slot, Error **errp);
|
||||
|
||||
Reference in New Issue
Block a user