mirror of https://github.com/xemu-project/xemu.git
ppc/pnv: use class attribute to limit SMT threads for different machines
Use a class attribute to specify the number of SMT threads per core permitted for different machines, 8 for powernv8 and 4 for powernv9/10. Reviewed-by: Cédric Le Goater <clg@redhat.com> Reviewed-by: Harsh Prateek Bora <harshpb@linux.ibm.com> Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
This commit is contained in:
parent
60d30cff84
commit
d76cb5a53b
12
hw/ppc/pnv.c
12
hw/ppc/pnv.c
|
@ -899,6 +899,7 @@ static void pnv_init(MachineState *machine)
|
||||||
PnvMachineState *pnv = PNV_MACHINE(machine);
|
PnvMachineState *pnv = PNV_MACHINE(machine);
|
||||||
MachineClass *mc = MACHINE_GET_CLASS(machine);
|
MachineClass *mc = MACHINE_GET_CLASS(machine);
|
||||||
PnvMachineClass *pmc = PNV_MACHINE_GET_CLASS(machine);
|
PnvMachineClass *pmc = PNV_MACHINE_GET_CLASS(machine);
|
||||||
|
int max_smt_threads = pmc->max_smt_threads;
|
||||||
char *fw_filename;
|
char *fw_filename;
|
||||||
long fw_size;
|
long fw_size;
|
||||||
uint64_t chip_ram_start = 0;
|
uint64_t chip_ram_start = 0;
|
||||||
|
@ -997,17 +998,19 @@ static void pnv_init(MachineState *machine)
|
||||||
pnv->num_chips =
|
pnv->num_chips =
|
||||||
machine->smp.max_cpus / (machine->smp.cores * machine->smp.threads);
|
machine->smp.max_cpus / (machine->smp.cores * machine->smp.threads);
|
||||||
|
|
||||||
if (machine->smp.threads > 8) {
|
if (machine->smp.threads > max_smt_threads) {
|
||||||
error_report("Cannot support more than 8 threads/core "
|
error_report("Cannot support more than %d threads/core "
|
||||||
"on a powernv machine");
|
"on %s machine", max_smt_threads, mc->desc);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!is_power_of_2(machine->smp.threads)) {
|
if (!is_power_of_2(machine->smp.threads)) {
|
||||||
error_report("Cannot support %d threads/core on a powernv"
|
error_report("Cannot support %d threads/core on a powernv"
|
||||||
"machine because it must be a power of 2",
|
"machine because it must be a power of 2",
|
||||||
machine->smp.threads);
|
machine->smp.threads);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* TODO: should we decide on how many chips we can create based
|
* TODO: should we decide on how many chips we can create based
|
||||||
* on #cores and Venice vs. Murano vs. Naples chip type etc...,
|
* on #cores and Venice vs. Murano vs. Naples chip type etc...,
|
||||||
|
@ -2490,6 +2493,7 @@ static void pnv_machine_power8_class_init(ObjectClass *oc, void *data)
|
||||||
|
|
||||||
pmc->compat = compat;
|
pmc->compat = compat;
|
||||||
pmc->compat_size = sizeof(compat);
|
pmc->compat_size = sizeof(compat);
|
||||||
|
pmc->max_smt_threads = 8;
|
||||||
|
|
||||||
machine_class_allow_dynamic_sysbus_dev(mc, TYPE_PNV_PHB);
|
machine_class_allow_dynamic_sysbus_dev(mc, TYPE_PNV_PHB);
|
||||||
}
|
}
|
||||||
|
@ -2514,6 +2518,7 @@ static void pnv_machine_power9_class_init(ObjectClass *oc, void *data)
|
||||||
|
|
||||||
pmc->compat = compat;
|
pmc->compat = compat;
|
||||||
pmc->compat_size = sizeof(compat);
|
pmc->compat_size = sizeof(compat);
|
||||||
|
pmc->max_smt_threads = 4;
|
||||||
pmc->dt_power_mgt = pnv_dt_power_mgt;
|
pmc->dt_power_mgt = pnv_dt_power_mgt;
|
||||||
|
|
||||||
machine_class_allow_dynamic_sysbus_dev(mc, TYPE_PNV_PHB);
|
machine_class_allow_dynamic_sysbus_dev(mc, TYPE_PNV_PHB);
|
||||||
|
@ -2538,6 +2543,7 @@ static void pnv_machine_p10_common_class_init(ObjectClass *oc, void *data)
|
||||||
|
|
||||||
pmc->compat = compat;
|
pmc->compat = compat;
|
||||||
pmc->compat_size = sizeof(compat);
|
pmc->compat_size = sizeof(compat);
|
||||||
|
pmc->max_smt_threads = 4;
|
||||||
pmc->dt_power_mgt = pnv_dt_power_mgt;
|
pmc->dt_power_mgt = pnv_dt_power_mgt;
|
||||||
|
|
||||||
xfc->match_nvt = pnv10_xive_match_nvt;
|
xfc->match_nvt = pnv10_xive_match_nvt;
|
||||||
|
|
|
@ -76,6 +76,7 @@ struct PnvMachineClass {
|
||||||
/*< public >*/
|
/*< public >*/
|
||||||
const char *compat;
|
const char *compat;
|
||||||
int compat_size;
|
int compat_size;
|
||||||
|
int max_smt_threads;
|
||||||
|
|
||||||
void (*dt_power_mgt)(PnvMachineState *pnv, void *fdt);
|
void (*dt_power_mgt)(PnvMachineState *pnv, void *fdt);
|
||||||
void (*i2c_init)(PnvMachineState *pnv);
|
void (*i2c_init)(PnvMachineState *pnv);
|
||||||
|
|
Loading…
Reference in New Issue