Message ID | PU1P153MB01691690696D8F83FC1872C7BF900@PU1P153MB0169.APCP153.PROD.OUTLOOK.COM (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | nfit: Collect shutdown status for NVDIMM_FAMILY_HYPERV | expand |
On Wed, Jan 30, 2019 at 10:49 AM Dexuan Cui <decui@microsoft.com> wrote: > > > See http://www.uefi.org/RFIC_LIST ("Virtual NVDIMM 0x1901"): > "Get Unsafe Shutdown Count (Function Index 2)". > > Let's expose the info to the userspace (e.g. ntctl) via sysfs. > > Signed-off-by: Dexuan Cui <decui@microsoft.com> > --- > drivers/acpi/nfit/core.c | 51 ++++++++++++++++++++++++++++++++++++++ > drivers/acpi/nfit/hyperv.h | 26 +++++++++++++++++++ > 2 files changed, 77 insertions(+) > create mode 100644 drivers/acpi/nfit/hyperv.h Looks ok to me, but if we grow any more of these "shutdown count" retrievals I'll want to take a look at being able to call acpi_nfit_ctl() earlier in the init process so that this data marshaling can be unified.
On Wed, Jan 30, 2019 at 06:48:40PM +0000, Dexuan Cui wrote: > > See http://www.uefi.org/RFIC_LIST ("Virtual NVDIMM 0x1901"): > "Get Unsafe Shutdown Count (Function Index 2)". > > Let's expose the info to the userspace (e.g. ntctl) via sysfs. If you add a new sysfs file, you need to add a new Documentation/ABI/ update as well :(
> From: Greg KH <gregkh@linuxfoundation.org> > Sent: Wednesday, January 30, 2019 11:38 AM > > On Wed, Jan 30, 2019 at 06:48:40PM +0000, Dexuan Cui wrote: > > > > Let's expose the info to the userspace (e.g. ntctl) via sysfs. > > If you add a new sysfs file, you need to add a new Documentation/ABI/ > update as well :( It's an existing sysfs node, which was originally added by Dan in Sep 2018: /sys/bus/nd/devices/nmem0/nfit/dirty_shutdown. Before this patch, the node doesn't appear when Linux runs on Hyper-V, and with this patch, the node can appear now. However, indeed, the node and the other related nodes have not been documented in Documentation/ABI/testing/sysfs-bus-nfit yet. I suppose Dan would add that? Thanks, -- Dexuan
> From: Linux-nvdimm <linux-nvdimm-bounces@lists.01.org> On Behalf Of > Dexuan Cui > Sent: Wednesday, January 30, 2019 12:03 PM > To: Greg KH <gregkh@linuxfoundation.org> > Cc: Josh Poulson <jopoulso@microsoft.com>; linux-nvdimm@lists.01.org; > Haiyang Zhang <haiyangz@microsoft.com>; > driverdev-devel@linuxdriverproject.org; Rafael J. Wysocki > <rjw@rjwysocki.net>; linux-kernel@vger.kernel.org; Michael Kelley > <mikelley@microsoft.com>; Sasha Levin <Alexander.Levin@microsoft.com>; > linux-acpi@vger.kernel.org; Ross Zwisler <zwisler@kernel.org>; Stephen > Hemminger <sthemmin@microsoft.com>; Len Brown <lenb@kernel.org> > Subject: RE: [PATCH] nfit: Collect shutdown status for > NVDIMM_FAMILY_HYPERV > > > From: Greg KH <gregkh@linuxfoundation.org> > > Sent: Wednesday, January 30, 2019 11:38 AM > > > > On Wed, Jan 30, 2019 at 06:48:40PM +0000, Dexuan Cui wrote: > > > > > > Let's expose the info to the userspace (e.g. ntctl) via sysfs. > > > > If you add a new sysfs file, you need to add a new Documentation/ABI/ > > update as well :( > > It's an existing sysfs node, which was originally added by Dan in Sep 2018: > /sys/bus/nd/devices/nmem0/nfit/dirty_shutdown. > > Before this patch, the node doesn't appear when Linux runs on Hyper-V, > and with this patch, the node can appear now. > > However, indeed, the node and the other related nodes have not been > documented in Documentation/ABI/testing/sysfs-bus-nfit yet. > I suppose Dan would add that? Actually the other nodes have been documented, and only the "dirty_shutdown" is missed. It should be straightfoward. Let me make a patch for this. Thanks for the reminder, Greg! Thanks, -- Dexuan
diff --git a/drivers/acpi/nfit/core.c b/drivers/acpi/nfit/core.c index d5a164b6833a..d504da34ce34 100644 --- a/drivers/acpi/nfit/core.c +++ b/drivers/acpi/nfit/core.c @@ -25,6 +25,7 @@ #include <asm/cacheflush.h> #include <acpi/nfit.h> #include "intel.h" +#include "hyperv.h" #include "nfit.h" /* @@ -1802,6 +1803,54 @@ __weak void nfit_intel_shutdown_status(struct nfit_mem *nfit_mem) } } +__weak void nfit_hyperv_shutdown_status(struct nfit_mem *nfit_mem) +{ + struct device *dev = &nfit_mem->adev->dev; + struct nd_hyperv_shutdown_status status; + union acpi_object in_buf = { + .buffer.type = ACPI_TYPE_BUFFER, + .buffer.length = 0, + }; + union acpi_object in_obj = { + .package.type = ACPI_TYPE_PACKAGE, + .package.count = 1, + .package.elements = &in_buf, + }; + const u8 func = ND_HYPERV_GET_UNSAFE_SHUTDOWN_COUNT; + const guid_t *guid = to_nfit_uuid(nfit_mem->family); + u8 revid = nfit_dsm_revid(nfit_mem->family, func); + struct acpi_device *adev = nfit_mem->adev; + acpi_handle handle = adev->handle; + union acpi_object *out_obj; + + if ((nfit_mem->dsm_mask & BIT(func)) == 0) + return; + + out_obj = acpi_evaluate_dsm(handle, guid, revid, func, &in_obj); + if (!out_obj || out_obj->type != ACPI_TYPE_BUFFER + || out_obj->buffer.length < sizeof(status)) { + dev_dbg(dev->parent, + "%s: failed to get Unsafe Shutdown Count\n", + dev_name(dev)); + ACPI_FREE(out_obj); + return; + } + + memcpy(&status, out_obj->buffer.pointer, sizeof(status)); + ACPI_FREE(out_obj); + + if (status.general_err != 0) { + dev_dbg(dev->parent, + "%s: failed to get Unsafe Shutdown Count: err=0x%x\n", + dev_name(dev), status.status); + return; + } + + set_bit(NFIT_MEM_DIRTY_COUNT, &nfit_mem->flags); + nfit_mem->dirty_shutdown = status.shutdown_count; +} + + static void populate_shutdown_status(struct nfit_mem *nfit_mem) { /* @@ -1811,6 +1860,8 @@ static void populate_shutdown_status(struct nfit_mem *nfit_mem) */ if (nfit_mem->family == NVDIMM_FAMILY_INTEL) nfit_intel_shutdown_status(nfit_mem); + else if (nfit_mem->family == NVDIMM_FAMILY_HYPERV) + nfit_hyperv_shutdown_status(nfit_mem); } static int acpi_nfit_add_dimm(struct acpi_nfit_desc *acpi_desc, diff --git a/drivers/acpi/nfit/hyperv.h b/drivers/acpi/nfit/hyperv.h new file mode 100644 index 000000000000..c4a25b8624cc --- /dev/null +++ b/drivers/acpi/nfit/hyperv.h @@ -0,0 +1,26 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright(c) 2019 Microsoft Corporation. All rights reserved. + * Hyper-V specific definitions for _DSM of Hyper-V Virtual NVDIMM + * + * See http://www.uefi.org/RFIC_LIST (Virtual NVDIMM 0x1901) + */ +#ifndef _NFIT_HYPERV_H_ +#define _NFIT_HYPERV_H_ + +#define ND_HYPERV_GET_UNSAFE_SHUTDOWN_COUNT 2 + +struct nd_hyperv_shutdown_status { + union { + u32 status; + struct { + u16 general_err; + u8 func_err; + u8 vendor_err; + }; + }; + u32 shutdown_count; +} __packed; + + +#endif
See http://www.uefi.org/RFIC_LIST ("Virtual NVDIMM 0x1901"): "Get Unsafe Shutdown Count (Function Index 2)". Let's expose the info to the userspace (e.g. ntctl) via sysfs. Signed-off-by: Dexuan Cui <decui@microsoft.com> --- drivers/acpi/nfit/core.c | 51 ++++++++++++++++++++++++++++++++++++++ drivers/acpi/nfit/hyperv.h | 26 +++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 drivers/acpi/nfit/hyperv.h