pc: fixes

A couple of fixes to acpi and nvdimm.
 
 Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
 -----BEGIN PGP SIGNATURE-----
 
 iQEcBAABAgAGBQJbHsufAAoJECgfDbjSjVRp7rUH/ivy7ZOfJU98VemRJK325KJ2
 AzsJgn3jKBvlaq4WtsQdspi+eTi9p0kupFJqFxRdpDgPnYjjegDGOjY0RrnhPL19
 lXpwWixZvWAL5zZ60p8RYZxYP9AeFUDQ8wX091uB8phQfBdTUwxCE88bznv2ZUbz
 He3rEMJpMZIorUe8P+RVrUNWHcIdvCZkqYhxt0nZR4YkeaANVCngXGaexBzxdRXR
 oT3cKsmshFPMV+LUr3/os3I5YiOSLCWflTCgnlhhW0rKPbDWFJOtqF78bjLJrR/p
 9SuqW0vmB3JcXXsSWUFvuBo4K0hXgNZEI2hrFVxhkXtw5Ij35ufCCizhmalAaVk=
 =m9VP
 -----END PGP SIGNATURE-----

Merge remote-tracking branch 'remotes/mst/tags/for_upstream' into staging

pc: fixes

A couple of fixes to acpi and nvdimm.

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>

# gpg: Signature made Mon 11 Jun 2018 20:21:03 BST
# gpg:                using RSA key 281F0DB8D28D5469
# gpg: Good signature from "Michael S. Tsirkin <mst@kernel.org>"
# gpg:                 aka "Michael S. Tsirkin <mst@redhat.com>"
# Primary key fingerprint: 0270 606B 6F3C DF3D 0B17  0970 C350 3912 AFBE 8E67
#      Subkey fingerprint: 5D09 FD08 71C8 F85B 94CA  8A0D 281F 0DB8 D28D 5469

* remotes/mst/tags/for_upstream:
  nvdimm: make persistence option symbolic
  hw/i386: Update SSDT table used by "make check"

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2018-06-12 12:42:15 +01:00
commit 59f3a1c6ac
7 changed files with 34 additions and 41 deletions

View File

@ -154,29 +154,22 @@ guest software that this vNVDIMM device contains a region that cannot
accept persistent writes. In result, for example, the guest Linux accept persistent writes. In result, for example, the guest Linux
NVDIMM driver, marks such vNVDIMM device as read-only. NVDIMM driver, marks such vNVDIMM device as read-only.
Platform Capabilities NVDIMM Persistence
--------------------- ------------------
ACPI 6.2 Errata A added support for a new Platform Capabilities Structure ACPI 6.2 Errata A added support for a new Platform Capabilities Structure
which allows the platform to communicate what features it supports related to which allows the platform to communicate what features it supports related to
NVDIMM data durability. Users can provide a capabilities value to a guest via NVDIMM data persistence. Users can provide a persistence value to a guest via
the optional "nvdimm-cap" machine command line option: the optional "nvdimm-persistence" machine command line option:
-machine pc,accel=kvm,nvdimm,nvdimm-cap=2 -machine pc,accel=kvm,nvdimm,nvdimm-persistence=cpu
This "nvdimm-cap" field is an integer, and is the combined value of the There are currently two valid values for this option:
various capability bits defined in table 5-137 of the ACPI 6.2 Errata A spec.
Here is a quick summary of the three bits that are defined as of that spec: "mem-ctrl" - The platform supports flushing dirty data from the memory
controller to the NVDIMMs in the event of power loss.
Bit[0] - CPU Cache Flush to NVDIMM Durability on Power Loss Capable. "cpu" - The platform supports flushing dirty data from the CPU cache to
Bit[1] - Memory Controller Flush to NVDIMM Durability on Power Loss Capable. the NVDIMMs in the event of power loss. This implies that the
Note: If bit 0 is set to 1 then this bit shall be set to 1 as well. platform also supports flushing dirty data through the memory
Bit[2] - Byte Addressable Persistent Memory Hardware Mirroring Capable. controller on power loss.
So, a "nvdimm-cap" value of 2 would mean that the platform supports Memory
Controller Flush on Power Loss, a value of 3 would mean that the platform
supports CPU Cache Flush and Memory Controller Flush on Power Loss, etc.
For a complete list of the flags available and for more detailed descriptions,
please consult the ACPI spec.

View File

@ -404,8 +404,8 @@ static GArray *nvdimm_build_device_structure(AcpiNVDIMMState *state)
} }
g_slist_free(device_list); g_slist_free(device_list);
if (state->capabilities) { if (state->persistence) {
nvdimm_build_structure_caps(structures, state->capabilities); nvdimm_build_structure_caps(structures, state->persistence);
} }
return structures; return structures;

View File

@ -2181,31 +2181,30 @@ static void pc_machine_set_nvdimm(Object *obj, bool value, Error **errp)
pcms->acpi_nvdimm_state.is_enabled = value; pcms->acpi_nvdimm_state.is_enabled = value;
} }
static void pc_machine_get_nvdimm_capabilities(Object *obj, Visitor *v, static char *pc_machine_get_nvdimm_persistence(Object *obj, Error **errp)
const char *name, void *opaque,
Error **errp)
{ {
PCMachineState *pcms = PC_MACHINE(obj); PCMachineState *pcms = PC_MACHINE(obj);
uint32_t value = pcms->acpi_nvdimm_state.capabilities;
visit_type_uint32(v, name, &value, errp); return g_strdup(pcms->acpi_nvdimm_state.persistence_string);
} }
static void pc_machine_set_nvdimm_capabilities(Object *obj, Visitor *v, static void pc_machine_set_nvdimm_persistence(Object *obj, const char *value,
const char *name, void *opaque,
Error **errp) Error **errp)
{ {
PCMachineState *pcms = PC_MACHINE(obj); PCMachineState *pcms = PC_MACHINE(obj);
Error *error = NULL; AcpiNVDIMMState *nvdimm_state = &pcms->acpi_nvdimm_state;
uint32_t value;
visit_type_uint32(v, name, &value, &error); if (strcmp(value, "cpu") == 0)
if (error) { nvdimm_state->persistence = 3;
error_propagate(errp, error); else if (strcmp(value, "mem-ctrl") == 0)
return; nvdimm_state->persistence = 2;
else {
error_report("-machine nvdimm-persistence=%s: unsupported option", value);
exit(EXIT_FAILURE);
} }
pcms->acpi_nvdimm_state.capabilities = value; g_free(nvdimm_state->persistence_string);
nvdimm_state->persistence_string = g_strdup(value);
} }
static bool pc_machine_get_smbus(Object *obj, Error **errp) static bool pc_machine_get_smbus(Object *obj, Error **errp)
@ -2421,9 +2420,9 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
object_class_property_add_bool(oc, PC_MACHINE_NVDIMM, object_class_property_add_bool(oc, PC_MACHINE_NVDIMM,
pc_machine_get_nvdimm, pc_machine_set_nvdimm, &error_abort); pc_machine_get_nvdimm, pc_machine_set_nvdimm, &error_abort);
object_class_property_add(oc, PC_MACHINE_NVDIMM_CAP, "uint32", object_class_property_add_str(oc, PC_MACHINE_NVDIMM_PERSIST,
pc_machine_get_nvdimm_capabilities, pc_machine_get_nvdimm_persistence,
pc_machine_set_nvdimm_capabilities, NULL, NULL, &error_abort); pc_machine_set_nvdimm_persistence, &error_abort);
object_class_property_add_bool(oc, PC_MACHINE_SMBUS, object_class_property_add_bool(oc, PC_MACHINE_SMBUS,
pc_machine_get_smbus, pc_machine_set_smbus, &error_abort); pc_machine_get_smbus, pc_machine_set_smbus, &error_abort);

View File

@ -76,7 +76,7 @@ struct PCMachineState {
#define PC_MACHINE_VMPORT "vmport" #define PC_MACHINE_VMPORT "vmport"
#define PC_MACHINE_SMM "smm" #define PC_MACHINE_SMM "smm"
#define PC_MACHINE_NVDIMM "nvdimm" #define PC_MACHINE_NVDIMM "nvdimm"
#define PC_MACHINE_NVDIMM_CAP "nvdimm-cap" #define PC_MACHINE_NVDIMM_PERSIST "nvdimm-persistence"
#define PC_MACHINE_SMBUS "smbus" #define PC_MACHINE_SMBUS "smbus"
#define PC_MACHINE_SATA "sata" #define PC_MACHINE_SATA "sata"
#define PC_MACHINE_PIT "pit" #define PC_MACHINE_PIT "pit"

View File

@ -138,7 +138,8 @@ struct AcpiNVDIMMState {
/* /*
* Platform capabilities, section 5.2.25.9 of ACPI 6.2 Errata A * Platform capabilities, section 5.2.25.9 of ACPI 6.2 Errata A
*/ */
int32_t capabilities; int32_t persistence;
char *persistence_string;
}; };
typedef struct AcpiNVDIMMState AcpiNVDIMMState; typedef struct AcpiNVDIMMState AcpiNVDIMMState;

View File

@ -830,7 +830,7 @@ static void test_acpi_tcg_dimm_pxm(const char *machine)
memset(&data, 0, sizeof(data)); memset(&data, 0, sizeof(data));
data.machine = machine; data.machine = machine;
data.variant = ".dimmpxm"; data.variant = ".dimmpxm";
test_acpi_one(" -machine nvdimm=on,nvdimm-cap=3" test_acpi_one(" -machine nvdimm=on,nvdimm-persistence=cpu"
" -smp 4,sockets=4" " -smp 4,sockets=4"
" -m 128M,slots=3,maxmem=1G" " -m 128M,slots=3,maxmem=1G"
" -numa node,mem=32M,nodeid=0" " -numa node,mem=32M,nodeid=0"