-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
ndctl/papr_scm,uapi: Add support for PAPR nvdimm specific methods
Introduce support for PAPR NVDIMM Specific Methods (PDSM) in papr_scm module and add the command family NVDIMM_FAMILY_PAPR to the white list of NVDIMM command sets. Also advertise support for ND_CMD_CALL for the nvdimm command mask and implement necessary scaffolding in the module to handle ND_CMD_CALL ioctl and PDSM requests that we receive. The layout of the PDSM request as we expect from libnvdimm/libndctl is described in newly introduced uapi header 'papr_pdsm.h' which defines a 'struct nd_pkg_pdsm' and a maximal union named 'nd_pdsm_payload'. These new structs together with 'struct nd_cmd_pkg' for a pdsm envelop thats sent by libndctl to libnvdimm and serviced by papr_scm in 'papr_scm_service_pdsm()'. The PDSM request is communicated by member 'struct nd_cmd_pkg.nd_command' together with other information on the pdsm payload (size-in, size-out). The patch also introduces 'struct pdsm_cmd_desc' instances of which are stored in an array __pdsm_cmd_descriptors[] indexed with PDSM cmd and corresponding access function pdsm_cmd_desc() is introduced. 'struct pdsm_cdm_desc' holds the service function for a given PDSM and corresponding payload in/out sizes. A new function papr_scm_service_pdsm() is introduced and is called from papr_scm_ndctl() in case of a PDSM request is received via ND_CMD_CALL command from libnvdimm. The function performs validation on the PDSM payload based on info present in corresponding PDSM descriptor and if valid calls the 'struct pdcm_cmd_desc.service' function to service the PDSM. Signed-off-by: Vaibhav Jain <vaibhav@linux.ibm.com> Cc: "Aneesh Kumar K . V" <aneesh.kumar@linux.ibm.com> Cc: Dan Williams <dan.j.williams@intel.com> Cc: Michael Ellerman <mpe@ellerman.id.au> Cc: Ira Weiny <ira.weiny@intel.com> Link: https://lore.kernel.org/r/20200615124407.32596-6-vaibhav@linux.ibm.com Signed-off-by: Dan Williams <dan.j.williams@intel.com>
- Loading branch information
Vaibhav Jain
authored and
Dan Williams
committed
Jun 16, 2020
1 parent
b5f38f0
commit f517f79
Showing
3 changed files
with
285 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,95 @@ | ||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ | ||
/* | ||
* PAPR nvDimm Specific Methods (PDSM) and structs for libndctl | ||
* | ||
* (C) Copyright IBM 2020 | ||
* | ||
* Author: Vaibhav Jain <vaibhav at linux.ibm.com> | ||
*/ | ||
|
||
#ifndef _UAPI_ASM_POWERPC_PAPR_PDSM_H_ | ||
#define _UAPI_ASM_POWERPC_PAPR_PDSM_H_ | ||
|
||
#include <linux/types.h> | ||
#include <linux/ndctl.h> | ||
|
||
/* | ||
* PDSM Envelope: | ||
* | ||
* The ioctl ND_CMD_CALL exchange data between user-space and kernel via | ||
* envelope which consists of 2 headers sections and payload sections as | ||
* illustrated below: | ||
* +-----------------+---------------+---------------------------+ | ||
* | 64-Bytes | 8-Bytes | Max 184-Bytes | | ||
* +-----------------+---------------+---------------------------+ | ||
* | ND-HEADER | PDSM-HEADER | PDSM-PAYLOAD | | ||
* +-----------------+---------------+---------------------------+ | ||
* | nd_family | | | | ||
* | nd_size_out | cmd_status | | | ||
* | nd_size_in | reserved | nd_pdsm_payload | | ||
* | nd_command | payload --> | | | ||
* | nd_fw_size | | | | ||
* | nd_payload ---> | | | | ||
* +---------------+-----------------+---------------------------+ | ||
* | ||
* ND Header: | ||
* This is the generic libnvdimm header described as 'struct nd_cmd_pkg' | ||
* which is interpreted by libnvdimm before passed on to papr_scm. Important | ||
* member fields used are: | ||
* 'nd_family' : (In) NVDIMM_FAMILY_PAPR_SCM | ||
* 'nd_size_in' : (In) PDSM-HEADER + PDSM-IN-PAYLOAD (usually 0) | ||
* 'nd_size_out' : (In) PDSM-HEADER + PDSM-RETURN-PAYLOAD | ||
* 'nd_command' : (In) One of PAPR_PDSM_XXX | ||
* 'nd_fw_size' : (Out) PDSM-HEADER + size of actual payload returned | ||
* | ||
* PDSM Header: | ||
* This is papr-scm specific header that precedes the payload. This is defined | ||
* as nd_cmd_pdsm_pkg. Following fields aare available in this header: | ||
* | ||
* 'cmd_status' : (Out) Errors if any encountered while servicing PDSM. | ||
* 'reserved' : Not used, reserved for future and should be set to 0. | ||
* 'payload' : A union of all the possible payload structs | ||
* | ||
* PDSM Payload: | ||
* | ||
* The layout of the PDSM Payload is defined by various structs shared between | ||
* papr_scm and libndctl so that contents of payload can be interpreted. As such | ||
* its defined as a union of all possible payload structs as | ||
* 'union nd_pdsm_payload'. Based on the value of 'nd_cmd_pkg.nd_command' | ||
* appropriate member of the union is accessed. | ||
*/ | ||
|
||
/* Max payload size that we can handle */ | ||
#define ND_PDSM_PAYLOAD_MAX_SIZE 184 | ||
|
||
/* Max payload size that we can handle */ | ||
#define ND_PDSM_HDR_SIZE \ | ||
(sizeof(struct nd_pkg_pdsm) - ND_PDSM_PAYLOAD_MAX_SIZE) | ||
|
||
/* | ||
* Methods to be embedded in ND_CMD_CALL request. These are sent to the kernel | ||
* via 'nd_cmd_pkg.nd_command' member of the ioctl struct | ||
*/ | ||
enum papr_pdsm { | ||
PAPR_PDSM_MIN = 0x0, | ||
PAPR_PDSM_MAX, | ||
}; | ||
|
||
/* Maximal union that can hold all possible payload types */ | ||
union nd_pdsm_payload { | ||
__u8 buf[ND_PDSM_PAYLOAD_MAX_SIZE]; | ||
} __packed; | ||
|
||
/* | ||
* PDSM-header + payload expected with ND_CMD_CALL ioctl from libnvdimm | ||
* Valid member of union 'payload' is identified via 'nd_cmd_pkg.nd_command' | ||
* that should always precede this struct when sent to papr_scm via CMD_CALL | ||
* interface. | ||
*/ | ||
struct nd_pkg_pdsm { | ||
__s32 cmd_status; /* Out: Sub-cmd status returned back */ | ||
__u16 reserved[2]; /* Ignored and to be set as '0' */ | ||
union nd_pdsm_payload payload; | ||
} __packed; | ||
|
||
#endif /* _UAPI_ASM_POWERPC_PAPR_PDSM_H_ */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters