|
@@ -39,11 +39,7 @@
|
|
|
|
|
|
#define SPAPR_GPU_NUMA_ID (cpu_to_be32(1))
|
|
|
|
|
|
-struct spapr_phb_pci_nvgpu_config {
|
|
|
- uint64_t nv2_ram_current;
|
|
|
- uint64_t nv2_atsd_current;
|
|
|
- int num; /* number of non empty (i.e. tgt!=0) entries in slots[] */
|
|
|
- struct spapr_phb_pci_nvgpu_slot {
|
|
|
+typedef struct SpaprPhbPciNvGpuSlot {
|
|
|
uint64_t tgt;
|
|
|
uint64_t gpa;
|
|
|
unsigned numa_id;
|
|
@@ -54,12 +50,18 @@ struct spapr_phb_pci_nvgpu_config {
|
|
|
PCIDevice *npdev;
|
|
|
uint32_t link_speed;
|
|
|
} links[NVGPU_MAX_LINKS];
|
|
|
- } slots[NVGPU_MAX_NUM];
|
|
|
+} SpaprPhbPciNvGpuSlot;
|
|
|
+
|
|
|
+struct SpaprPhbPciNvGpuConfig {
|
|
|
+ uint64_t nv2_ram_current;
|
|
|
+ uint64_t nv2_atsd_current;
|
|
|
+ int num; /* number of non empty (i.e. tgt!=0) entries in slots[] */
|
|
|
+ SpaprPhbPciNvGpuSlot slots[NVGPU_MAX_NUM];
|
|
|
Error *errp;
|
|
|
};
|
|
|
|
|
|
-static struct spapr_phb_pci_nvgpu_slot *
|
|
|
-spapr_nvgpu_get_slot(struct spapr_phb_pci_nvgpu_config *nvgpus, uint64_t tgt)
|
|
|
+static SpaprPhbPciNvGpuSlot *
|
|
|
+spapr_nvgpu_get_slot(SpaprPhbPciNvGpuConfig *nvgpus, uint64_t tgt)
|
|
|
{
|
|
|
int i;
|
|
|
|
|
@@ -81,13 +83,13 @@ spapr_nvgpu_get_slot(struct spapr_phb_pci_nvgpu_config *nvgpus, uint64_t tgt)
|
|
|
return &nvgpus->slots[i];
|
|
|
}
|
|
|
|
|
|
-static void spapr_pci_collect_nvgpu(struct spapr_phb_pci_nvgpu_config *nvgpus,
|
|
|
+static void spapr_pci_collect_nvgpu(SpaprPhbPciNvGpuConfig *nvgpus,
|
|
|
PCIDevice *pdev, uint64_t tgt,
|
|
|
MemoryRegion *mr, Error **errp)
|
|
|
{
|
|
|
MachineState *machine = MACHINE(qdev_get_machine());
|
|
|
SpaprMachineState *spapr = SPAPR_MACHINE(machine);
|
|
|
- struct spapr_phb_pci_nvgpu_slot *nvslot = spapr_nvgpu_get_slot(nvgpus, tgt);
|
|
|
+ SpaprPhbPciNvGpuSlot *nvslot = spapr_nvgpu_get_slot(nvgpus, tgt);
|
|
|
|
|
|
if (!nvslot) {
|
|
|
error_setg(errp, "Found too many GPUs per vPHB");
|
|
@@ -102,11 +104,11 @@ static void spapr_pci_collect_nvgpu(struct spapr_phb_pci_nvgpu_config *nvgpus,
|
|
|
++spapr->gpu_numa_id;
|
|
|
}
|
|
|
|
|
|
-static void spapr_pci_collect_nvnpu(struct spapr_phb_pci_nvgpu_config *nvgpus,
|
|
|
+static void spapr_pci_collect_nvnpu(SpaprPhbPciNvGpuConfig *nvgpus,
|
|
|
PCIDevice *pdev, uint64_t tgt,
|
|
|
MemoryRegion *mr, Error **errp)
|
|
|
{
|
|
|
- struct spapr_phb_pci_nvgpu_slot *nvslot = spapr_nvgpu_get_slot(nvgpus, tgt);
|
|
|
+ SpaprPhbPciNvGpuSlot *nvslot = spapr_nvgpu_get_slot(nvgpus, tgt);
|
|
|
int j;
|
|
|
|
|
|
if (!nvslot) {
|
|
@@ -138,7 +140,7 @@ static void spapr_phb_pci_collect_nvgpu(PCIBus *bus, PCIDevice *pdev,
|
|
|
|
|
|
if (tgt) {
|
|
|
Error *local_err = NULL;
|
|
|
- struct spapr_phb_pci_nvgpu_config *nvgpus = opaque;
|
|
|
+ SpaprPhbPciNvGpuConfig *nvgpus = opaque;
|
|
|
Object *mr_gpu = object_property_get_link(po, "nvlink2-mr[0]", NULL);
|
|
|
Object *mr_npu = object_property_get_link(po, "nvlink2-atsd-mr[0]",
|
|
|
NULL);
|
|
@@ -177,7 +179,7 @@ void spapr_phb_nvgpu_setup(SpaprPhbState *sphb, Error **errp)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- sphb->nvgpus = g_new0(struct spapr_phb_pci_nvgpu_config, 1);
|
|
|
+ sphb->nvgpus = g_new0(SpaprPhbPciNvGpuConfig, 1);
|
|
|
sphb->nvgpus->nv2_ram_current = sphb->nv2_gpa_win_addr;
|
|
|
sphb->nvgpus->nv2_atsd_current = sphb->nv2_atsd_win_addr;
|
|
|
|
|
@@ -194,7 +196,7 @@ void spapr_phb_nvgpu_setup(SpaprPhbState *sphb, Error **errp)
|
|
|
/* Add found GPU RAM and ATSD MRs if found */
|
|
|
for (i = 0, valid_gpu_num = 0; i < sphb->nvgpus->num; ++i) {
|
|
|
Object *nvmrobj;
|
|
|
- struct spapr_phb_pci_nvgpu_slot *nvslot = &sphb->nvgpus->slots[i];
|
|
|
+ SpaprPhbPciNvGpuSlot *nvslot = &sphb->nvgpus->slots[i];
|
|
|
|
|
|
if (!nvslot->gpdev) {
|
|
|
continue;
|
|
@@ -242,7 +244,7 @@ void spapr_phb_nvgpu_free(SpaprPhbState *sphb)
|
|
|
}
|
|
|
|
|
|
for (i = 0; i < sphb->nvgpus->num; ++i) {
|
|
|
- struct spapr_phb_pci_nvgpu_slot *nvslot = &sphb->nvgpus->slots[i];
|
|
|
+ SpaprPhbPciNvGpuSlot *nvslot = &sphb->nvgpus->slots[i];
|
|
|
Object *nv_mrobj = object_property_get_link(OBJECT(nvslot->gpdev),
|
|
|
"nvlink2-mr[0]", NULL);
|
|
|
|
|
@@ -276,7 +278,7 @@ void spapr_phb_nvgpu_populate_dt(SpaprPhbState *sphb, void *fdt, int bus_off,
|
|
|
}
|
|
|
|
|
|
for (i = 0; (i < sphb->nvgpus->num) && (atsdnum < ARRAY_SIZE(atsd)); ++i) {
|
|
|
- struct spapr_phb_pci_nvgpu_slot *nvslot = &sphb->nvgpus->slots[i];
|
|
|
+ SpaprPhbPciNvGpuSlot *nvslot = &sphb->nvgpus->slots[i];
|
|
|
|
|
|
if (!nvslot->gpdev) {
|
|
|
continue;
|
|
@@ -354,7 +356,7 @@ void spapr_phb_nvgpu_ram_populate_dt(SpaprPhbState *sphb, void *fdt)
|
|
|
|
|
|
/* Add memory nodes for GPU RAM and mark them unusable */
|
|
|
for (i = 0; i < sphb->nvgpus->num; ++i) {
|
|
|
- struct spapr_phb_pci_nvgpu_slot *nvslot = &sphb->nvgpus->slots[i];
|
|
|
+ SpaprPhbPciNvGpuSlot *nvslot = &sphb->nvgpus->slots[i];
|
|
|
Object *nv_mrobj = object_property_get_link(OBJECT(nvslot->gpdev),
|
|
|
"nvlink2-mr[0]", NULL);
|
|
|
uint32_t associativity[] = {
|
|
@@ -398,7 +400,7 @@ void spapr_phb_nvgpu_populate_pcidev_dt(PCIDevice *dev, void *fdt, int offset,
|
|
|
}
|
|
|
|
|
|
for (i = 0; i < sphb->nvgpus->num; ++i) {
|
|
|
- struct spapr_phb_pci_nvgpu_slot *nvslot = &sphb->nvgpus->slots[i];
|
|
|
+ SpaprPhbPciNvGpuSlot *nvslot = &sphb->nvgpus->slots[i];
|
|
|
|
|
|
/* Skip "slot" without attached GPU */
|
|
|
if (!nvslot->gpdev) {
|