Enable DSM pass thru for root functions
Subsystems (2)
cover Enable DSM pass thru for root functions
The new ACPI 6.2 spec has added new NVDIMM root DSM functions that managibility and test software needs to call.
This patch set enables the calling of root functions DSMs via the pass thru mechanism.
Details
__nd_ioctl:
Check pass thru functions against nd_cmd_clear_to_send.
acpi_nfit_init_dsms:
Set additional bits in cmd_mask for new functions.
ndctl.h:
Define data structure for the new 6.2 functions.
Add new function names to nvdimm_bus_cmd_name.
Jerry Hoemann (3):
libnvdimm: passthru functions clear to send acpi, nfit: Enable DSM pass thru for root functions.
libnvdimm: New ACPI 6.2 DSM functions
drivers/acpi/nfit/core.c | 3 ++- drivers/nvdimm/bus.c | 4 +++- include/uapi/linux/ndctl.h | 45 ++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 49 insertions(+), 3 deletions(-)
Signature · 6 lines
1.8.5.6 _______________________________________________ Linux-nvdimm mailing list [email protected] https://lists.01.org/mailman/listinfo/linux-nvdimm
PATCH 1/3 libnvdimm: passthru functions clear to send
Have dsm functions called via the pass thru mechanism also be checked against clear to send.
--- drivers/nvdimm/bus.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/nvdimm/bus.c +3 -1
@@ -907,6 +907,7 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm,static char in_env[ND_CMD_MAX_ENVELOPE ];const struct nd_cmd_desc *desc =NULL ;unsigned int cmd =_IOC_NR (ioctl_cmd); +unsigned int func = cmd;void __user *p = (void __user *) arg;struct device *dev = &nvdimm_bus->dev;struct nd_cmd_pkg pkg;
@@ -972,6 +973,7 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm, }if (cmd ==ND_CMD_CALL ) { + func = pkg.nd_command;dev_dbg (dev,"%s:%s, idx: %llu, in: %zu, out: %zu, len %zu\n" , __func__, dimm_name, pkg.nd_command, in_len, out_len, buf_len);
@@ -1020,7 +1022,7 @@ static int __nd_ioctl(struct nvdimm_bus *nvdimm_bus, struct nvdimm *nvdimm, }nvdimm_bus_lock (&nvdimm_bus->dev); - rc =nd_cmd_clear_to_send (nvdimm_bus, nvdimm, cmd, buf); + rc =nd_cmd_clear_to_send (nvdimm_bus, nvdimm, func, buf);if (rc) goto out_unlock;
Signature · 6 lines
1.8.5.6 _______________________________________________ Linux-nvdimm mailing list [email protected] https://lists.01.org/mailman/listinfo/linux-nvdimm
PATCH 2/3 acpi, nfit: Enable DSM pass thru for root functions.
In reply to Jerry HoemannSet ND_CMD_CALL in the cmd_mask to enable calling root functions via the pass trhu mechanism.
--- drivers/acpi/nfit/core.c | 3 ++- include/uapi/linux/ndctl.h | 1 + 2 files changed, 3 insertions(+), 1 deletion(-)
drivers/acpi/nfit/core.c +2 -1
@@ -1620,9 +1620,10 @@ static void acpi_nfit_init_dsms(struct acpi_nfit_desc *acpi_desc)if (!adev)return ; -for (i =ND_CMD_ARS_CAP ; i <=ND_CMD_CLEAR_ERROR ; i++) +for (i =ND_CMD_ARS_CAP ; i <ND_CMD_CALL ; i++)if (acpi_check_dsm (adev->handle, uuid,1 ,1ULL << i))set_bit (i, &nd_desc->cmd_mask); +set_bit (ND_CMD_CALL , &nd_desc->cmd_mask); } static ssize_t range_index_show(struct device *dev,
include/uapi/linux/ndctl.h +1 -0
@@ -179,6 +179,7 @@ static inline const char *nvdimm_bus_cmd_name(unsigned cmd) [ND_CMD_ARS_START] = "ars_start", [ND_CMD_ARS_STATUS] = "ars_status", [ND_CMD_CLEAR_ERROR] = "clear_error", + [ND_CMD_CALL] = "cmd_call", };if (cmd <ARRAY_SIZE (names) && names[cmd])
Signature · 6 lines
1.8.5.6 _______________________________________________ Linux-nvdimm mailing list [email protected] https://lists.01.org/mailman/listinfo/linux-nvdimm
PATCH 3/3 libnvdimm: New ACPI 6.2 DSM functions
In reply to Jerry HoemannACPI 6.2 added new NVDIMM root DSM functions. Define their data structures.
Update the definition of nd_cmd_ars_cap to match the 6.2 spec.
Add the new 6.2 functions names to nvdimm_bus_cmd_name.
--- include/uapi/linux/ndctl.h | 44 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-)
include/uapi/linux/ndctl.h +43 -1
@@ -105,7 +105,8 @@ struct nd_cmd_ars_cap {__u32 status;__u32 max_ars_out;__u32 clear_err_unit; -__u32 reserved; +__u16 flags; +__u16 reserved; } __packed;struct nd_cmd_ars_start {
@@ -144,6 +145,43 @@ struct nd_cmd_clear_error {__u64 cleared; } __packed; +struct nd_cmd_trans_spa { +__u64 spa; +__u32 status; +__u8 flags; +__u8 _reserved[3 ]; +__u64 trans_length; +__u32 num_nvdimms; +struct nd_nvdimm_device { +__u32 nfit_device_handle; +__u32 _reserved; +__u64 dpa; + } __packed devices[0]; + +} __packed; + +struct nd_cmd_ars_err_inj { +__u64 err_inj_spa_range_base; +__u64 err_inj_spa_range_length; +__u8 err_inj_options; +__u32 status; +} __packed; + +struct nd_cmd_ars_err_inj_clr { +__u64 err_inj_clr_spa_range_base; +__u64 err_inj_clr_spa_range_length; +__u32 status; +} __packed; + +struct nd_cmd_ars_err_inj_stat { +__u32 status; +__u32 inj_err_rec_count; +struct nd_error_stat_query_record { +__u64 err_inj_stat_spa_range_base; +__u64 err_inj_stat_spa_range_length; + } __packed record[0]; +} __packed; +enum {ND_CMD_IMPLEMENTED =0 ,
@@ -179,6 +217,10 @@ static inline const char *nvdimm_bus_cmd_name(unsigned cmd) [ND_CMD_ARS_START] = "ars_start", [ND_CMD_ARS_STATUS] = "ars_status", [ND_CMD_CLEAR_ERROR] = "clear_error", + [5] = "trans_spa", + [7] = "ars_err_inj", + [8] = "ars_err_inj_clr", + [9] = "ars_err_inj_stat", [ND_CMD_CALL] = "cmd_call", };
Signature · 6 lines
1.8.5.6 _______________________________________________ Linux-nvdimm mailing list [email protected] https://lists.01.org/mailman/listinfo/linux-nvdimm
Re: [PATCH 3/3] libnvdimm: New ACPI 6.2 DSM functions
include/uapi/linux/ndctl.h static inline const char *nvdimm_bus_cmd_name(unsigned cmd) · line 225
Quoted 10 lines · Jerry Hoemann
include/uapi/linux/ndctl.h +4
-0@@ -179,6 +217,10 @@ static inline const char *nvdimm_bus_cmd_name(unsigned cmd) [ND_CMD_ARS_START] = "ars_start", [ND_CMD_ARS_STATUS] = "ars_status", [ND_CMD_CLEAR_ERROR] = "clear_error", + [5] = "trans_spa", + [7] = "ars_err_inj", + [8] = "ars_err_inj_clr", + [9] = "ars_err_inj_stat", [ND_CMD_CALL] = "cmd_call", };
Can you please add the new values to the enum in uapi/ndctl.h? I don't really like the magic numbers here.
Signature · 10 lines
Johannes Thumshirn Storage [email protected] +49 911 74053 689 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg GF: Felix Imendörffer, Jane Smithard, Graham Norton HRB 21284 (AG Nürnberg) Key fingerprint = EC38 9CAB C2C4 F25D 8600 D0D0 0393 969D 2D76 0850 _______________________________________________ Linux-nvdimm mailing list [email protected] https://lists.01.org/mailman/listinfo/linux-nvdimm
Re: [PATCH 3/3] libnvdimm: New ACPI 6.2 DSM functions
Quoted 14 lines · Johannes Thumshirn
include/uapi/linux/ndctl.h static inline const char *nvdimm_bus_cmd_name(unsigned cmd) · line 225
Quoted 10 lines · Jerry Hoemann
include/uapi/linux/ndctl.h +4
-0@@ -179,6 +217,10 @@ static inline const char *nvdimm_bus_cmd_name(unsigned cmd) [ND_CMD_ARS_START] = "ars_start", [ND_CMD_ARS_STATUS] = "ars_status", [ND_CMD_CLEAR_ERROR] = "clear_error", + [5] = "trans_spa", + [7] = "ars_err_inj", + [8] = "ars_err_inj_clr", + [9] = "ars_err_inj_stat", [ND_CMD_CALL] = "cmd_call", };Can you please add the new values to the enum in
uapi/ndctl.h? I don't really like the magic numbers here.
I think the reason Jerry didn't add them is due to symmetry. All the current ND_CMD_ definitions have corresponding ND_IOCTL_ definitions. These new commands we're only adding function number support and using ND_CMD_CALL for the ioctl transport. We can still add definitions for them, but perhaps with an ACPI_NFIT_DSM_ prefix? The only consumer in the kernel of this is debug output code. I think perhaps we should just delete them here and either print raw numbers or enable acpi_nfit_ctl() to the decode and not rely on nvdimm_bus_cmd_name() which is meant to represent NVDIMM bus type generic command numbers.
_______________________________________________
Linux-nvdimm mailing list
[email protected]
https://lists.01.org/mailman/listinfo/linux-nvdimm
Re: [PATCH 3/3] libnvdimm: New ACPI 6.2 DSM functions
Quoted 16 lines · Dan Williams
Quoted 14 lines · Johannes Thumshirn
include/uapi/linux/ndctl.h static inline const char *nvdimm_bus_cmd_name(unsigned cmd) · line 225
Quoted 10 lines · Jerry Hoemann
include/uapi/linux/ndctl.h +4
-0@@ -179,6 +217,10 @@ static inline const char *nvdimm_bus_cmd_name(unsigned cmd) [ND_CMD_ARS_START] = "ars_start", [ND_CMD_ARS_STATUS] = "ars_status", [ND_CMD_CLEAR_ERROR] = "clear_error", + [5] = "trans_spa", + [7] = "ars_err_inj", + [8] = "ars_err_inj_clr", + [9] = "ars_err_inj_stat", [ND_CMD_CALL] = "cmd_call", };Can you please add the new values to the enum in
uapi/ndctl.h? I don't really like the magic numbers here.
Quoted 4 lines
I think the reason Jerry didn't add them is due to symmetry. All the current
ND_CMD_definitions have correspondingND_IOCTL_definitions. These new commands we're only adding function number support and usingND_CMD_CALLfor the ioctl transport.
Yes, this is correct.
Quoted 6 lines
We can still add definitions for
them, but perhaps with anACPI_NFIT_DSM_prefix? The only consumer in the kernel of this is debug output code. I think perhaps we should just delete them here and either print raw numbers or enableacpi_nfit_ctl()to the decode and not rely onnvdimm_bus_cmd_name()which is meant to represent NVDIMM bus type generic command numbers.
This also comes into play when doing:
cat /sys/class/nd/ndctl0/device/nd/ndctl0/device/commands
Without change here the new functions would show up as "unknown unknown unknown unknown."
Dan, are you suggesting I change the above to:
[ND_CMD_CLEAR_ERROR] = "clear_error",
+ [5] = "5",
+ [7] = "7",
+ [8] = "8",
+ [9] = "9",
[ND_CMD_CALL] = "cmd_call",Note, "6" is currently reserved by ACPI. I could add that also.
Signature · 7 lines
----------------------------------------------------------------------------- Jerry Hoemann Software Engineer Hewlett Packard Enterprise ----------------------------------------------------------------------------- _______________________________________________ Linux-nvdimm mailing list [email protected] https://lists.01.org/mailman/listinfo/linux-nvdimm
Re: [PATCH 3/3] libnvdimm: New ACPI 6.2 DSM functions
Quoted 39 lines · Jerry Hoemann
Quoted 16 lines · Dan Williams
Quoted 14 lines · Johannes Thumshirn
include/uapi/linux/ndctl.h static inline const char *nvdimm_bus_cmd_name(unsigned cmd) · line 225
Quoted 10 lines · Jerry Hoemann
include/uapi/linux/ndctl.h +4
-0@@ -179,6 +217,10 @@ static inline const char *nvdimm_bus_cmd_name(unsigned cmd) [ND_CMD_ARS_START] = "ars_start", [ND_CMD_ARS_STATUS] = "ars_status", [ND_CMD_CLEAR_ERROR] = "clear_error", + [5] = "trans_spa", + [7] = "ars_err_inj", + [8] = "ars_err_inj_clr", + [9] = "ars_err_inj_stat", [ND_CMD_CALL] = "cmd_call", };Can you please add the new values to the enum in
uapi/ndctl.h? I don't really like the magic numbers here.Quoted 4 lines
I think the reason Jerry didn't add them is due to symmetry. All the current
ND_CMD_definitions have correspondingND_IOCTL_definitions. These new commands we're only adding function number support and usingND_CMD_CALLfor the ioctl transport.Yes, this is correct.
Quoted 6 lines
We can still add definitions for
them, but perhaps with anACPI_NFIT_DSM_prefix? The only consumer in the kernel of this is debug output code. I think perhaps we should just delete them here and either print raw numbers or enableacpi_nfit_ctl()to the decode and not rely onnvdimm_bus_cmd_name()which is meant to represent NVDIMM bus type generic command numbers.This also comes into play when doing:
cat
/sys/class/nd/ndctl0/device/nd/ndctl0/device/commandsWithout change here the new functions would show up as "unknown unknown unknown unknown."
Dan, are you suggesting I change the above to:
Quoted 8 lines
[ND_CMD_CLEAR_ERROR] = "clear_error", + [5] = "5", + [7] = "7", + [8] = "8", + [9] = "9", [ND_CMD_CALL] = "cmd_call",Note, "6" is currently reserved by ACPI. I could add that also.
I think it should behave the same as the dimm level 'cmd' vs 'func' distinction. Where only the ND_CMD instances are enumerated in the sysfs '/sys/bus/nd/devices/ndbus0/commands' attribute. The rest of the supported functions are identified in the 'dsm_mask' attribute. We don't currently have one of those for the bus level but we can add it to "/sys/bus/nd/devices/ndbus0/nfit/dsm_mask". This would be similar to "/sys/bus/nd/devices/nmem0/nfit/dsm_mask".
_______________________________________________
Linux-nvdimm mailing list
[email protected]
https://lists.01.org/mailman/listinfo/linux-nvdimm