mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-06 17:23:56 -06:00
hw/ppc/spapr_caps: Rework spapr_caps to use uint8 internal representation
Currently spapr_caps are tied to boolean values (on or off). This patch reworks the caps so that they can have any uint8 value. This allows more capabilities with various values to be represented in the same way internally. Capabilities are numbered in ascending order. The internal representation of capability values is an array of uint8s in the sPAPRMachineState, indexed by capability number. Capabilities can have their own name, description, options, getter and setter functions, type and allow functions. They also each have their own section in the migration stream. Capabilities are only migrated if they were explictly set on the command line, with the assumption that otherwise the default will match. On migration we ensure that the capability value on the destination is greater than or equal to the capability value from the source. So long at this remains the case then the migration is considered compatible and allowed to continue. This patch implements generic getter and setter functions for boolean capabilities. It also converts the existings cap-htm, cap-vsx and cap-dfp capabilities to this new format. Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
This commit is contained in:
parent
2d1fb9bc8e
commit
4e5fe3688e
3 changed files with 230 additions and 192 deletions
|
@ -320,7 +320,7 @@ static void spapr_populate_pa_features(sPAPRMachineState *spapr,
|
|||
*/
|
||||
pa_features[3] |= 0x20;
|
||||
}
|
||||
if (spapr_has_cap(spapr, SPAPR_CAP_HTM) && pa_size > 24) {
|
||||
if ((spapr_get_cap(spapr, SPAPR_CAP_HTM) != 0) && pa_size > 24) {
|
||||
pa_features[24] |= 0x80; /* Transactional memory support */
|
||||
}
|
||||
if (legacy_guest && pa_size > 40) {
|
||||
|
@ -563,7 +563,7 @@ static void spapr_populate_cpu_dt(CPUState *cs, void *fdt, int offset,
|
|||
*
|
||||
* Only CPUs for which we create core types in spapr_cpu_core.c
|
||||
* are possible, and all of those have VMX */
|
||||
if (spapr_has_cap(spapr, SPAPR_CAP_VSX)) {
|
||||
if (spapr_get_cap(spapr, SPAPR_CAP_VSX) != 0) {
|
||||
_FDT((fdt_setprop_cell(fdt, offset, "ibm,vmx", 2)));
|
||||
} else {
|
||||
_FDT((fdt_setprop_cell(fdt, offset, "ibm,vmx", 1)));
|
||||
|
@ -572,7 +572,7 @@ static void spapr_populate_cpu_dt(CPUState *cs, void *fdt, int offset,
|
|||
/* Advertise DFP (Decimal Floating Point) if available
|
||||
* 0 / no property == no DFP
|
||||
* 1 == DFP available */
|
||||
if (spapr_has_cap(spapr, SPAPR_CAP_DFP)) {
|
||||
if (spapr_get_cap(spapr, SPAPR_CAP_DFP) != 0) {
|
||||
_FDT((fdt_setprop_cell(fdt, offset, "ibm,dfp", 1)));
|
||||
}
|
||||
|
||||
|
@ -1586,6 +1586,18 @@ static bool spapr_vga_init(PCIBus *pci_bus, Error **errp)
|
|||
}
|
||||
}
|
||||
|
||||
static int spapr_pre_load(void *opaque)
|
||||
{
|
||||
int rc;
|
||||
|
||||
rc = spapr_caps_pre_load(opaque);
|
||||
if (rc) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int spapr_post_load(void *opaque, int version_id)
|
||||
{
|
||||
sPAPRMachineState *spapr = (sPAPRMachineState *)opaque;
|
||||
|
@ -1627,6 +1639,18 @@ static int spapr_post_load(void *opaque, int version_id)
|
|||
return err;
|
||||
}
|
||||
|
||||
static int spapr_pre_save(void *opaque)
|
||||
{
|
||||
int rc;
|
||||
|
||||
rc = spapr_caps_pre_save(opaque);
|
||||
if (rc) {
|
||||
return rc;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool version_before_3(void *opaque, int version_id)
|
||||
{
|
||||
return version_id < 3;
|
||||
|
@ -1747,7 +1771,9 @@ static const VMStateDescription vmstate_spapr = {
|
|||
.name = "spapr",
|
||||
.version_id = 3,
|
||||
.minimum_version_id = 1,
|
||||
.pre_load = spapr_pre_load,
|
||||
.post_load = spapr_post_load,
|
||||
.pre_save = spapr_pre_save,
|
||||
.fields = (VMStateField[]) {
|
||||
/* used to be @next_irq */
|
||||
VMSTATE_UNUSED_BUFFER(version_before_3, 0, 4),
|
||||
|
@ -1762,7 +1788,9 @@ static const VMStateDescription vmstate_spapr = {
|
|||
&vmstate_spapr_ov5_cas,
|
||||
&vmstate_spapr_patb_entry,
|
||||
&vmstate_spapr_pending_events,
|
||||
&vmstate_spapr_caps,
|
||||
&vmstate_spapr_cap_htm,
|
||||
&vmstate_spapr_cap_vsx,
|
||||
&vmstate_spapr_cap_dfp,
|
||||
NULL
|
||||
}
|
||||
};
|
||||
|
@ -2323,8 +2351,6 @@ static void spapr_machine_init(MachineState *machine)
|
|||
char *filename;
|
||||
Error *resize_hpt_err = NULL;
|
||||
|
||||
spapr_caps_validate(spapr, &error_fatal);
|
||||
|
||||
msi_nonbroken = true;
|
||||
|
||||
QLIST_INIT(&spapr->phbs);
|
||||
|
@ -3834,7 +3860,9 @@ static void spapr_machine_class_init(ObjectClass *oc, void *data)
|
|||
*/
|
||||
mc->numa_mem_align_shift = 28;
|
||||
|
||||
smc->default_caps = spapr_caps(SPAPR_CAP_VSX | SPAPR_CAP_DFP);
|
||||
smc->default_caps.caps[SPAPR_CAP_HTM] = SPAPR_CAP_OFF;
|
||||
smc->default_caps.caps[SPAPR_CAP_VSX] = SPAPR_CAP_ON;
|
||||
smc->default_caps.caps[SPAPR_CAP_DFP] = SPAPR_CAP_ON;
|
||||
spapr_caps_add_properties(smc, &error_abort);
|
||||
}
|
||||
|
||||
|
@ -3916,8 +3944,7 @@ static void spapr_machine_2_11_class_options(MachineClass *mc)
|
|||
sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
|
||||
|
||||
spapr_machine_2_12_class_options(mc);
|
||||
smc->default_caps = spapr_caps(SPAPR_CAP_HTM | SPAPR_CAP_VSX
|
||||
| SPAPR_CAP_DFP);
|
||||
smc->default_caps.caps[SPAPR_CAP_HTM] = SPAPR_CAP_ON;
|
||||
SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_2_11);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue