mirror of https://github.com/xemu-project/xemu.git
ppc patch queue 20200720
Here are some assorted fixes for qemu-5.1: * SLOF update with improved TPM handling, and fix for possible stack overflows on many-vcpu machines * Fix for NUMA distances on NVLink2 attached GPU memory nodes * Fixes to fail more gracefully on attempting to plug unsupported PCI bridge types * Don't allow pnv-psi device to be user created -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEdfRlhq5hpmzETofcbDjKyiDZs5IFAl8VK7EACgkQbDjKyiDZ s5K7HxAAjFAzlKD7AiF7u0TbuvBFx3J3zxIcCnd3W0ViBiZ4FOybjf7/q8R8Wu94 MrNv/15fZLbS6rcUCERFnEr+TpFgZ/mUn0JuoJWI0AUrI+FtUaCj9kznjwfzU0jN gU75F6R5q1GzS8ENHZWm1xWHVTk3OBj1eWQu8ialx9Kx4TMc9hTdgIYhQoB6+WD3 nyIR6FUlMutYvPcODJS/HHLLT9Nc3w0zQAOYz7B+OgBKWkM61H3L17ITg9eo9YDz /xPz+41DqYC1FsTcTB91572lbePCURScJc2xE8GvuGMwNmdDoTMq+EALCLlTawIJ 68w6e+y4uymnDwSGRn0j3Wopc6iggEbeIukgO1GZLUwyACOLWXtwGh3SOxEcmsYH CiUgBkZ0k07lyXAlMmpIwrc90qPXh7Ox4m24DsH+A0eSNPUtuWOht4dLrHbuAkkf 5KMhTBWMOnLxUilrp+U3Xsuo5BUQVAy6eBI1sCYaLHTJIFoBg0G0g7xg7q/23nnc DX0RtZgjJdlFjfbzFzetSJYzd8Xf5P9Giqx0XZ+w6vpPTXBsDA57MqpICXiEQGSk OeVp51dWrWL1FIRoEL1O7YZBu57Oi1hpl1JVG3bxCKa+lxiVw6ZLXGL9m8otOc1/ iSr3WpTI9wOo5Ele3lkl0NQjNeGnJ401UpmGCkEclp2zmMdCGrU= =CYAQ -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/dgibson/tags/ppc-for-5.1-20200720' into staging ppc patch queue 20200720 Here are some assorted fixes for qemu-5.1: * SLOF update with improved TPM handling, and fix for possible stack overflows on many-vcpu machines * Fix for NUMA distances on NVLink2 attached GPU memory nodes * Fixes to fail more gracefully on attempting to plug unsupported PCI bridge types * Don't allow pnv-psi device to be user created # gpg: Signature made Mon 20 Jul 2020 06:29:21 BST # gpg: using RSA key 75F46586AE61A66CC44E87DC6C38CACA20D9B392 # gpg: Good signature from "David Gibson <david@gibson.dropbear.id.au>" [full] # gpg: aka "David Gibson (Red Hat) <dgibson@redhat.com>" [full] # gpg: aka "David Gibson (ozlabs.org) <dgibson@ozlabs.org>" [full] # gpg: aka "David Gibson (kernel.org) <dwg@kernel.org>" [unknown] # Primary key fingerprint: 75F4 6586 AE61 A66C C44E 87DC 6C38 CACA 20D9 B392 * remotes/dgibson/tags/ppc-for-5.1-20200720: pseries: Update SLOF firmware image spapr: Add a new level of NUMA for GPUs spapr_pci: Robustify support of PCI bridges ppc/pnv: Make PSI device types not user creatable Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
1e6c50ad85
|
@ -929,6 +929,7 @@ static void pnv_psi_class_init(ObjectClass *klass, void *data)
|
||||||
dc->desc = "PowerNV PSI Controller";
|
dc->desc = "PowerNV PSI Controller";
|
||||||
device_class_set_props(dc, pnv_psi_properties);
|
device_class_set_props(dc, pnv_psi_properties);
|
||||||
dc->reset = pnv_psi_reset;
|
dc->reset = pnv_psi_reset;
|
||||||
|
dc->user_creatable = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const TypeInfo pnv_psi_info = {
|
static const TypeInfo pnv_psi_info = {
|
||||||
|
|
|
@ -890,10 +890,16 @@ static int spapr_dt_rng(void *fdt)
|
||||||
static void spapr_dt_rtas(SpaprMachineState *spapr, void *fdt)
|
static void spapr_dt_rtas(SpaprMachineState *spapr, void *fdt)
|
||||||
{
|
{
|
||||||
MachineState *ms = MACHINE(spapr);
|
MachineState *ms = MACHINE(spapr);
|
||||||
|
SpaprMachineClass *smc = SPAPR_MACHINE_GET_CLASS(ms);
|
||||||
int rtas;
|
int rtas;
|
||||||
GString *hypertas = g_string_sized_new(256);
|
GString *hypertas = g_string_sized_new(256);
|
||||||
GString *qemu_hypertas = g_string_sized_new(256);
|
GString *qemu_hypertas = g_string_sized_new(256);
|
||||||
uint32_t refpoints[] = { cpu_to_be32(0x4), cpu_to_be32(0x4) };
|
uint32_t refpoints[] = {
|
||||||
|
cpu_to_be32(0x4),
|
||||||
|
cpu_to_be32(0x4),
|
||||||
|
cpu_to_be32(0x2),
|
||||||
|
};
|
||||||
|
uint32_t nr_refpoints = ARRAY_SIZE(refpoints);
|
||||||
uint64_t max_device_addr = MACHINE(spapr)->device_memory->base +
|
uint64_t max_device_addr = MACHINE(spapr)->device_memory->base +
|
||||||
memory_region_size(&MACHINE(spapr)->device_memory->mr);
|
memory_region_size(&MACHINE(spapr)->device_memory->mr);
|
||||||
uint32_t lrdr_capacity[] = {
|
uint32_t lrdr_capacity[] = {
|
||||||
|
@ -945,8 +951,12 @@ static void spapr_dt_rtas(SpaprMachineState *spapr, void *fdt)
|
||||||
qemu_hypertas->str, qemu_hypertas->len));
|
qemu_hypertas->str, qemu_hypertas->len));
|
||||||
g_string_free(qemu_hypertas, TRUE);
|
g_string_free(qemu_hypertas, TRUE);
|
||||||
|
|
||||||
|
if (smc->pre_5_1_assoc_refpoints) {
|
||||||
|
nr_refpoints = 2;
|
||||||
|
}
|
||||||
|
|
||||||
_FDT(fdt_setprop(fdt, rtas, "ibm,associativity-reference-points",
|
_FDT(fdt_setprop(fdt, rtas, "ibm,associativity-reference-points",
|
||||||
refpoints, sizeof(refpoints)));
|
refpoints, nr_refpoints * sizeof(refpoints[0])));
|
||||||
|
|
||||||
_FDT(fdt_setprop(fdt, rtas, "ibm,max-associativity-domains",
|
_FDT(fdt_setprop(fdt, rtas, "ibm,max-associativity-domains",
|
||||||
maxdomains, sizeof(maxdomains)));
|
maxdomains, sizeof(maxdomains)));
|
||||||
|
@ -4584,9 +4594,16 @@ DEFINE_SPAPR_MACHINE(5_1, "5.1", true);
|
||||||
*/
|
*/
|
||||||
static void spapr_machine_5_0_class_options(MachineClass *mc)
|
static void spapr_machine_5_0_class_options(MachineClass *mc)
|
||||||
{
|
{
|
||||||
|
SpaprMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
|
||||||
|
static GlobalProperty compat[] = {
|
||||||
|
{ TYPE_SPAPR_PCI_HOST_BRIDGE, "pre-5.1-associativity", "on" },
|
||||||
|
};
|
||||||
|
|
||||||
spapr_machine_5_1_class_options(mc);
|
spapr_machine_5_1_class_options(mc);
|
||||||
compat_props_add(mc->compat_props, hw_compat_5_0, hw_compat_5_0_len);
|
compat_props_add(mc->compat_props, hw_compat_5_0, hw_compat_5_0_len);
|
||||||
|
compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat));
|
||||||
mc->numa_mem_supported = true;
|
mc->numa_mem_supported = true;
|
||||||
|
smc->pre_5_1_assoc_refpoints = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_SPAPR_MACHINE(5_0, "5.0", false);
|
DEFINE_SPAPR_MACHINE(5_0, "5.0", false);
|
||||||
|
|
|
@ -1480,6 +1480,57 @@ static void spapr_pci_bridge_plug(SpaprPhbState *phb,
|
||||||
add_drcs(phb, bus);
|
add_drcs(phb, bus);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Returns non-zero if the value of "chassis_nr" is already in use */
|
||||||
|
static int check_chassis_nr(Object *obj, void *opaque)
|
||||||
|
{
|
||||||
|
int new_chassis_nr =
|
||||||
|
object_property_get_uint(opaque, "chassis_nr", &error_abort);
|
||||||
|
int chassis_nr =
|
||||||
|
object_property_get_uint(obj, "chassis_nr", NULL);
|
||||||
|
|
||||||
|
if (!object_dynamic_cast(obj, TYPE_PCI_BRIDGE)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Skip unsupported bridge types */
|
||||||
|
if (!chassis_nr) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Skip self */
|
||||||
|
if (obj == opaque) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return chassis_nr == new_chassis_nr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool bridge_has_valid_chassis_nr(Object *bridge, Error **errp)
|
||||||
|
{
|
||||||
|
int chassis_nr =
|
||||||
|
object_property_get_uint(bridge, "chassis_nr", NULL);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* slotid_cap_init() already ensures that "chassis_nr" isn't null for
|
||||||
|
* standard PCI bridges, so this really tells if "chassis_nr" is present
|
||||||
|
* or not.
|
||||||
|
*/
|
||||||
|
if (!chassis_nr) {
|
||||||
|
error_setg(errp, "PCI Bridge lacks a \"chassis_nr\" property");
|
||||||
|
error_append_hint(errp, "Try -device pci-bridge instead.\n");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* We want unique values for "chassis_nr" */
|
||||||
|
if (object_child_foreach_recursive(object_get_root(), check_chassis_nr,
|
||||||
|
bridge)) {
|
||||||
|
error_setg(errp, "Bridge chassis %d already in use", chassis_nr);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static void spapr_pci_plug(HotplugHandler *plug_handler,
|
static void spapr_pci_plug(HotplugHandler *plug_handler,
|
||||||
DeviceState *plugged_dev, Error **errp)
|
DeviceState *plugged_dev, Error **errp)
|
||||||
{
|
{
|
||||||
|
@ -1508,6 +1559,9 @@ static void spapr_pci_plug(HotplugHandler *plug_handler,
|
||||||
g_assert(drc);
|
g_assert(drc);
|
||||||
|
|
||||||
if (pc->is_bridge) {
|
if (pc->is_bridge) {
|
||||||
|
if (!bridge_has_valid_chassis_nr(OBJECT(plugged_dev), errp)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
spapr_pci_bridge_plug(phb, PCI_BRIDGE(plugged_dev));
|
spapr_pci_bridge_plug(phb, PCI_BRIDGE(plugged_dev));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2035,6 +2089,8 @@ static Property spapr_phb_properties[] = {
|
||||||
pcie_ecs, true),
|
pcie_ecs, true),
|
||||||
DEFINE_PROP_UINT64("gpa", SpaprPhbState, nv2_gpa_win_addr, 0),
|
DEFINE_PROP_UINT64("gpa", SpaprPhbState, nv2_gpa_win_addr, 0),
|
||||||
DEFINE_PROP_UINT64("atsd", SpaprPhbState, nv2_atsd_win_addr, 0),
|
DEFINE_PROP_UINT64("atsd", SpaprPhbState, nv2_atsd_win_addr, 0),
|
||||||
|
DEFINE_PROP_BOOL("pre-5.1-associativity", SpaprPhbState,
|
||||||
|
pre_5_1_assoc, false),
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -362,9 +362,9 @@ void spapr_phb_nvgpu_ram_populate_dt(SpaprPhbState *sphb, void *fdt)
|
||||||
&error_abort);
|
&error_abort);
|
||||||
uint32_t associativity[] = {
|
uint32_t associativity[] = {
|
||||||
cpu_to_be32(0x4),
|
cpu_to_be32(0x4),
|
||||||
SPAPR_GPU_NUMA_ID,
|
cpu_to_be32(nvslot->numa_id),
|
||||||
SPAPR_GPU_NUMA_ID,
|
cpu_to_be32(nvslot->numa_id),
|
||||||
SPAPR_GPU_NUMA_ID,
|
cpu_to_be32(nvslot->numa_id),
|
||||||
cpu_to_be32(nvslot->numa_id)
|
cpu_to_be32(nvslot->numa_id)
|
||||||
};
|
};
|
||||||
uint64_t size = object_property_get_uint(nv_mrobj, "size", NULL);
|
uint64_t size = object_property_get_uint(nv_mrobj, "size", NULL);
|
||||||
|
@ -375,6 +375,13 @@ void spapr_phb_nvgpu_ram_populate_dt(SpaprPhbState *sphb, void *fdt)
|
||||||
_FDT(off);
|
_FDT(off);
|
||||||
_FDT((fdt_setprop_string(fdt, off, "device_type", "memory")));
|
_FDT((fdt_setprop_string(fdt, off, "device_type", "memory")));
|
||||||
_FDT((fdt_setprop(fdt, off, "reg", mem_reg, sizeof(mem_reg))));
|
_FDT((fdt_setprop(fdt, off, "reg", mem_reg, sizeof(mem_reg))));
|
||||||
|
|
||||||
|
if (sphb->pre_5_1_assoc) {
|
||||||
|
associativity[1] = SPAPR_GPU_NUMA_ID;
|
||||||
|
associativity[2] = SPAPR_GPU_NUMA_ID;
|
||||||
|
associativity[3] = SPAPR_GPU_NUMA_ID;
|
||||||
|
}
|
||||||
|
|
||||||
_FDT((fdt_setprop(fdt, off, "ibm,associativity", associativity,
|
_FDT((fdt_setprop(fdt, off, "ibm,associativity", associativity,
|
||||||
sizeof(associativity))));
|
sizeof(associativity))));
|
||||||
|
|
||||||
|
|
|
@ -94,6 +94,7 @@ struct SpaprPhbState {
|
||||||
hwaddr nv2_gpa_win_addr;
|
hwaddr nv2_gpa_win_addr;
|
||||||
hwaddr nv2_atsd_win_addr;
|
hwaddr nv2_atsd_win_addr;
|
||||||
SpaprPhbPciNvGpuConfig *nvgpus;
|
SpaprPhbPciNvGpuConfig *nvgpus;
|
||||||
|
bool pre_5_1_assoc;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define SPAPR_PCI_MEM_WIN_BUS_OFFSET 0x80000000ULL
|
#define SPAPR_PCI_MEM_WIN_BUS_OFFSET 0x80000000ULL
|
||||||
|
|
|
@ -129,6 +129,7 @@ struct SpaprMachineClass {
|
||||||
bool linux_pci_probe;
|
bool linux_pci_probe;
|
||||||
bool smp_threads_vsmt; /* set VSMT to smp_threads by default */
|
bool smp_threads_vsmt; /* set VSMT to smp_threads by default */
|
||||||
hwaddr rma_limit; /* clamp the RMA to this size */
|
hwaddr rma_limit; /* clamp the RMA to this size */
|
||||||
|
bool pre_5_1_assoc_refpoints;
|
||||||
|
|
||||||
void (*phb_placement)(SpaprMachineState *spapr, uint32_t index,
|
void (*phb_placement)(SpaprMachineState *spapr, uint32_t index,
|
||||||
uint64_t *buid, hwaddr *pio,
|
uint64_t *buid, hwaddr *pio,
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
- SLOF (Slimline Open Firmware) is a free IEEE 1275 Open Firmware
|
- SLOF (Slimline Open Firmware) is a free IEEE 1275 Open Firmware
|
||||||
implementation for certain IBM POWER hardware. The sources are at
|
implementation for certain IBM POWER hardware. The sources are at
|
||||||
https://github.com/aik/SLOF, and the image currently in qemu is
|
https://github.com/aik/SLOF, and the image currently in qemu is
|
||||||
built from git tag qemu-slof-20200327.
|
built from git tag qemu-slof-20200717.
|
||||||
|
|
||||||
- sgabios (the Serial Graphics Adapter option ROM) provides a means for
|
- sgabios (the Serial Graphics Adapter option ROM) provides a means for
|
||||||
legacy x86 software to communicate with an attached serial console as
|
legacy x86 software to communicate with an attached serial console as
|
||||||
|
|
BIN
pc-bios/slof.bin
BIN
pc-bios/slof.bin
Binary file not shown.
|
@ -1 +1 @@
|
||||||
Subproject commit 8e012d6fddb62be833d746cef3f03e6c8beecde0
|
Subproject commit e18ddad8516ff2cfe36ec130200318f7251aa78c
|
Loading…
Reference in New Issue