acpi/nvdimm: Implement ACPI NVDIMM Label Methods
Recent ACPI spec [1] has defined NVDIMM Label Methods _LS{I,R,W}, which deprecates corresponding _DSM Functions defined by PMEM _DSM Interface spec [2]. Since the semantics of the new Label Methods are almost same as old _DSM methods, the implementations here simply wrapper old ones. ASL form diff can be found in next patch of updating golden master binaries. [1] ACPI Spec v6.4, 6.5.10 NVDIMM Label Methods https://uefi.org/sites/default/files/resources/ACPI_Spec_6_4_Jan22.pdf [2] Intel PMEM _DSM Interface Spec v2.0, 3.10 Deprecated Functions https://pmem.io/documents/IntelOptanePMem_DSM_Interface-V2.0.pdf Signed-off-by: Robert Hoo <robert.hu@linux.intel.com> Message-Id: <20220922122155.1326543-5-robert.hu@linux.intel.com> Reviewed-by: Igor Mammedov <imammedo@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
d773f38be3
commit
4ad44f624b
@ -1243,6 +1243,7 @@ static void nvdimm_build_fit(Aml *dev)
|
||||
static void nvdimm_build_nvdimm_devices(Aml *root_dev, uint32_t ram_slots)
|
||||
{
|
||||
uint32_t slot;
|
||||
Aml *method, *pkg, *field, *com_call;
|
||||
|
||||
for (slot = 0; slot < ram_slots; slot++) {
|
||||
uint32_t handle = nvdimm_slot_to_handle(slot);
|
||||
@ -1260,6 +1261,100 @@ static void nvdimm_build_nvdimm_devices(Aml *root_dev, uint32_t ram_slots)
|
||||
*/
|
||||
aml_append(nvdimm_dev, aml_name_decl("_ADR", aml_int(handle)));
|
||||
|
||||
/*
|
||||
* ACPI v6.4: Section 6.5.10 NVDIMM Label Methods
|
||||
*/
|
||||
/* _LSI */
|
||||
method = aml_method("_LSI", 0, AML_SERIALIZED);
|
||||
com_call = aml_call5(NVDIMM_COMMON_DSM,
|
||||
aml_touuid(NVDIMM_DEVICE_DSM_UUID),
|
||||
aml_int(1), aml_int(4), aml_int(0),
|
||||
aml_int(handle));
|
||||
aml_append(method, aml_store(com_call, aml_local(0)));
|
||||
|
||||
aml_append(method, aml_create_dword_field(aml_local(0),
|
||||
aml_int(0), "STTS"));
|
||||
aml_append(method, aml_create_dword_field(aml_local(0), aml_int(4),
|
||||
"SLSA"));
|
||||
aml_append(method, aml_create_dword_field(aml_local(0), aml_int(8),
|
||||
"MAXT"));
|
||||
|
||||
pkg = aml_package(3);
|
||||
aml_append(pkg, aml_name("STTS"));
|
||||
aml_append(pkg, aml_name("SLSA"));
|
||||
aml_append(pkg, aml_name("MAXT"));
|
||||
aml_append(method, aml_store(pkg, aml_local(1)));
|
||||
aml_append(method, aml_return(aml_local(1)));
|
||||
|
||||
aml_append(nvdimm_dev, method);
|
||||
|
||||
/* _LSR */
|
||||
method = aml_method("_LSR", 2, AML_SERIALIZED);
|
||||
aml_append(method, aml_name_decl("INPT", aml_buffer(8, NULL)));
|
||||
|
||||
aml_append(method, aml_create_dword_field(aml_name("INPT"),
|
||||
aml_int(0), "OFST"));
|
||||
aml_append(method, aml_create_dword_field(aml_name("INPT"),
|
||||
aml_int(4), "LEN"));
|
||||
aml_append(method, aml_store(aml_arg(0), aml_name("OFST")));
|
||||
aml_append(method, aml_store(aml_arg(1), aml_name("LEN")));
|
||||
|
||||
pkg = aml_package(1);
|
||||
aml_append(pkg, aml_name("INPT"));
|
||||
aml_append(method, aml_store(pkg, aml_local(0)));
|
||||
|
||||
com_call = aml_call5(NVDIMM_COMMON_DSM,
|
||||
aml_touuid(NVDIMM_DEVICE_DSM_UUID),
|
||||
aml_int(1), aml_int(5), aml_local(0),
|
||||
aml_int(handle));
|
||||
aml_append(method, aml_store(com_call, aml_local(3)));
|
||||
field = aml_create_dword_field(aml_local(3), aml_int(0), "STTS");
|
||||
aml_append(method, field);
|
||||
field = aml_create_field(aml_local(3), aml_int(32),
|
||||
aml_shiftleft(aml_name("LEN"), aml_int(3)),
|
||||
"LDAT");
|
||||
aml_append(method, field);
|
||||
aml_append(method, aml_name_decl("LSA", aml_buffer(0, NULL)));
|
||||
aml_append(method, aml_to_buffer(aml_name("LDAT"), aml_name("LSA")));
|
||||
|
||||
pkg = aml_package(2);
|
||||
aml_append(pkg, aml_name("STTS"));
|
||||
aml_append(pkg, aml_name("LSA"));
|
||||
|
||||
aml_append(method, aml_store(pkg, aml_local(1)));
|
||||
aml_append(method, aml_return(aml_local(1)));
|
||||
|
||||
aml_append(nvdimm_dev, method);
|
||||
|
||||
/* _LSW */
|
||||
method = aml_method("_LSW", 3, AML_SERIALIZED);
|
||||
aml_append(method, aml_store(aml_arg(2), aml_local(2)));
|
||||
aml_append(method, aml_name_decl("INPT", aml_buffer(8, NULL)));
|
||||
field = aml_create_dword_field(aml_name("INPT"),
|
||||
aml_int(0), "OFST");
|
||||
aml_append(method, field);
|
||||
field = aml_create_dword_field(aml_name("INPT"),
|
||||
aml_int(4), "TLEN");
|
||||
aml_append(method, field);
|
||||
aml_append(method, aml_store(aml_arg(0), aml_name("OFST")));
|
||||
aml_append(method, aml_store(aml_arg(1), aml_name("TLEN")));
|
||||
|
||||
aml_append(method, aml_concatenate(aml_name("INPT"), aml_local(2),
|
||||
aml_name("INPT")));
|
||||
pkg = aml_package(1);
|
||||
aml_append(pkg, aml_name("INPT"));
|
||||
aml_append(method, aml_store(pkg, aml_local(0)));
|
||||
com_call = aml_call5(NVDIMM_COMMON_DSM,
|
||||
aml_touuid(NVDIMM_DEVICE_DSM_UUID),
|
||||
aml_int(1), aml_int(6), aml_local(0),
|
||||
aml_int(handle));
|
||||
aml_append(method, aml_store(com_call, aml_local(3)));
|
||||
field = aml_create_dword_field(aml_local(3), aml_int(0), "STTS");
|
||||
aml_append(method, field);
|
||||
aml_append(method, aml_return(aml_name("STTS")));
|
||||
|
||||
aml_append(nvdimm_dev, method);
|
||||
|
||||
nvdimm_build_device_dsm(nvdimm_dev, handle);
|
||||
aml_append(root_dev, nvdimm_dev);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user