Message ID | 20220922122155.1326543-5-robert.hu@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Support ACPI NVDIMM Label Methods | expand |
On Thu, 22 Sep 2022 20:21:54 +0800 Robert Hoo <robert.hu@linux.intel.com> wrote: > 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> Reviewed-by: Igor Mammedov <imammedo@redhat.com> > --- > hw/acpi/nvdimm.c | 95 ++++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 95 insertions(+) > > diff --git a/hw/acpi/nvdimm.c b/hw/acpi/nvdimm.c > index afff911c1e..a3b25a92f3 100644 > --- a/hw/acpi/nvdimm.c > +++ b/hw/acpi/nvdimm.c > @@ -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); > }
diff --git a/hw/acpi/nvdimm.c b/hw/acpi/nvdimm.c index afff911c1e..a3b25a92f3 100644 --- a/hw/acpi/nvdimm.c +++ b/hw/acpi/nvdimm.c @@ -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); }
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> --- hw/acpi/nvdimm.c | 95 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+)