The PAPR standard[1][3] provides suitable mechanisms to query the health and performance stats of an NVDIMM via various hcalls as described in Ref[2]. Until now these stats were never available nor exposed to the user-space tools like 'ndctl'. This is partly due to PAPR platform not having support for ACPI and NFIT. Hence 'ndctl' is unable to query and report the dimm health status and a user had no way to determine the current health status of a NDVIMM.
To overcome this limitation this patch-set updates papr_scm kernel module to query and fetch nvdimm health and performance stats using hcalls described in Ref[2]. This health and performance stats are then exposed to userspace via syfs and Dimm-Specific-Methods(DSM) issued by libndctl. These changes coupled with proposed ndtcl changes located at Ref[4] should provide a way for the user to retrieve NVDIMM health status using ndtcl. Below is a sample output using proposed kernel + ndctl for PAPR NVDIMM in an emulation environment: # ndctl list -DH [ { "dev":"nmem0", "health":{ "health_state":"fatal", "shutdown_state":"dirty" } } ] PAPR Dimm-Specific-Methods(DSM) ================================ As the name suggests DSMs are used by vendor specific code in libndctl to execute certain operations or fetch certain information for NVDIMMS. DSMs can be sent to papr_scm module via libndctl (userspace) and libnvdimm(kernel) using the ND_CMD_CALL ioctl which can be handled in the dimm control function papr_scm_ndctl(). For PAPR this patchset proposes two DSMs defined in the newly introduced uapi header named 'papr_scm_dsm.h', that directly map to hcalls provided by PHYP to query NVDIMM health and stats. These DSMs are: * DSM_PAPR_SCM_HEALTH: Which map to hcall H_SCM_HEALTH and returns dimm health. * DSM_PAPR_SCM_STATS: Which map to hcall H_SCM_PERFORMANCE_STATS and returns dimm performance stats. P.S: The current patch-set only provides an implementation for servicing DSM_PAPR_SCM_HEALTH and a future patch will add support for DSM_PAPR_SCM_STATS. The ioctl ND_CMD_CALL can also transfer data between user-space and kernel via 'envelopes'. The envelop is part of a 'struct nd_cmd_pkg' which in return is wrapped in a user defined struct which in our case is a newly introduced 'struct nd_papr_scm_cmd_pkg'. Apart from 'envelope header' this struct holds 'payload', 'payload offset', 'payload version' and 'command status'. The 'payload' field of the envelop holds a struct depending on the DSM method used and should be one of the structs defined in newly introduced uapi header 'papr_scm_dsm.h'. This makes it possible for libndctl/kernel to share the same definitions for these DSM structs. Earlier Work ============ An earlier RFC patch set titled "powerpc/papr_scm: Implement support for reporting DIMM health and stats" [5] was proposed which tried to achieve same functionality albeit with a different approach i.e papr_scm module acted as a pass-through for the DSM calls from libndctl. This patch-set however departs from that design by decoupling the libndctl <--> papr_scm and papr_scm <--> phyp interfaces. This provides more flexibility compared to earlier approach were these two interfaces were coupled with each other. Structure of the patch-set ========================== The initial 3 patches of the patch-set add functionality of issuing necessary HCALLs to PHYP to retrieve the dimm health/performance stats information and exposing them to user-space via sysfs attributes. Subsequent patches deal with defining and implementing support for NVDIMM_FAMILY_PAPR_SCM DSM command family and implementing the payload versioning scheme as mentioned above. References: [1]: "Power Architecture Platform Reference" https://en.wikipedia.org/wiki/Power_Architecture_Platform_Reference [2]: "[DOC,v2] powerpc: Provide initial documentation for PAPR hcalls" https://patchwork.ozlabs.org/patch/1154292/ [3]: "Linux on Power Architecture Platform Reference" https://members.openpowerfoundation.org/document/dl/469 [4]: https://github.com/vaibhav92/ndctl/tree/papr_scm_health_v1 [5]: https://lore.kernel.org/linuxppc-dev/20200129152844.71286-1-vaib...@linux.ibm.com/ Vaibhav Jain (8): powerpc: Add asm header 'papr_scm.h' describing the papr-scm interface powerpc/papr_scm: Provide support for fetching dimm health information powerpc/papr_scm: Fetch dimm performance stats from PHYP UAPI: ndctl: Introduce NVDIMM_FAMILY_PAPR_SCM as a new NVDIMM DSM family powerpc/uapi: Introduce uapi header 'papr_scm_dsm.h' for papr_scm DSMs powerpc/papr_scm: Add support for handling PAPR DSM commands powerpc/papr_scm: Re-implement 'papr_flags' using 'nd_papr_scm_dimm_health_stat' powerpc/papr_scm: Implement support for DSM_PAPR_SCM_HEALTH arch/powerpc/include/asm/papr_scm.h | 68 ++++ arch/powerpc/include/uapi/asm/papr_scm_dsm.h | 143 +++++++ arch/powerpc/platforms/pseries/papr_scm.c | 399 ++++++++++++++++++- include/uapi/linux/ndctl.h | 1 + 4 files changed, 602 insertions(+), 9 deletions(-) create mode 100644 arch/powerpc/include/asm/papr_scm.h create mode 100644 arch/powerpc/include/uapi/asm/papr_scm_dsm.h -- 2.24.1