Skip to content

Commit

Permalink
nfit: update address range scrub commands to the acpi 6.1 format
Browse files Browse the repository at this point in the history
The original format of these commands from the "NVDIMM DSM Interface
Example" [1] are superseded by the ACPI 6.1 definition of the "NVDIMM Root
Device _DSMs" [2].

[1]: http://pmem.io/documents/NVDIMM_DSM_Interface_Example.pdf
[2]: http://www.uefi.org/sites/default/files/resources/ACPI_6_1.pdf
     "9.20.7 NVDIMM Root Device _DSMs"

Changes include:
1/ New 'restart' fields in ars_status, unfortunately these are
   implemented in the middle of the existing definition so this change
   is not backwards compatible.  The expectation is that shipping
   platforms will only ever support the ACPI 6.1 definition.

2/ New status values for ars_start ('busy') and ars_status ('overflow').

Cc: Vishal Verma <vishal.l.verma@intel.com>
Cc: Linda Knippers <linda.knippers@hpe.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Dan Williams <dan.j.williams@intel.com>
  • Loading branch information
Dan Williams committed Feb 24, 2016
1 parent 747ffe1 commit 4577b06
Show file tree
Hide file tree
Showing 4 changed files with 19 additions and 12 deletions.
6 changes: 3 additions & 3 deletions drivers/acpi/nfit.c
Original file line number Diff line number Diff line change
Expand Up @@ -1503,9 +1503,7 @@ static int ars_do_start(struct nvdimm_bus_descriptor *nd_desc,
case 1:
/* ARS unsupported, but we should never get here */
return 0;
case 2:
return -EINVAL;
case 3:
case 6:
/* ARS is in progress */
msleep(1000);
break;
Expand Down Expand Up @@ -1537,6 +1535,8 @@ static int ars_get_status(struct nvdimm_bus_descriptor *nd_desc,
case 2:
/* No ARS performed for the current boot */
return 0;
case 3:
/* TODO: error list overflow support */
default:
return -ENXIO;
}
Expand Down
12 changes: 6 additions & 6 deletions drivers/nvdimm/bus.c
Original file line number Diff line number Diff line change
Expand Up @@ -382,14 +382,14 @@ static const struct nd_cmd_desc __nd_cmd_bus_descs[] = {
[ND_CMD_ARS_CAP] = {
.in_num = 2,
.in_sizes = { 8, 8, },
.out_num = 2,
.out_sizes = { 4, 4, },
.out_num = 4,
.out_sizes = { 4, 4, 4, 4, },
},
[ND_CMD_ARS_START] = {
.in_num = 4,
.in_sizes = { 8, 8, 2, 6, },
.out_num = 1,
.out_sizes = { 4, },
.in_num = 5,
.in_sizes = { 8, 8, 2, 1, 5, },
.out_num = 2,
.out_sizes = { 4, 4, },
},
[ND_CMD_ARS_STATUS] = {
.out_num = 3,
Expand Down
2 changes: 1 addition & 1 deletion include/linux/libnvdimm.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ enum {

/* need to set a limit somewhere, but yes, this is likely overkill */
ND_IOCTL_MAX_BUFLEN = SZ_4M,
ND_CMD_MAX_ELEM = 4,
ND_CMD_MAX_ELEM = 5,
ND_CMD_MAX_ENVELOPE = 16,
ND_MAX_MAPPINGS = 32,

Expand Down
11 changes: 9 additions & 2 deletions include/uapi/linux/ndctl.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,26 +66,33 @@ struct nd_cmd_ars_cap {
__u64 length;
__u32 status;
__u32 max_ars_out;
__u32 clear_err_unit;
__u32 reserved;
} __packed;

struct nd_cmd_ars_start {
__u64 address;
__u64 length;
__u16 type;
__u8 reserved[6];
__u8 flags;
__u8 reserved[5];
__u32 status;
__u32 scrub_time;
} __packed;

struct nd_cmd_ars_status {
__u32 status;
__u32 out_length;
__u64 address;
__u64 length;
__u64 restart_address;
__u64 restart_length;
__u16 type;
__u16 flags;
__u32 num_records;
struct nd_ars_record {
__u32 handle;
__u32 flags;
__u32 reserved;
__u64 err_address;
__u64 length;
} __packed records[0];
Expand Down

0 comments on commit 4577b06

Please sign in to comment.