xref: /linux/include/uapi/linux/ndctl.h (revision 62232e45f4a265abb43f0acf16e58f5d0b6e1ec9)
1*62232e45SDan Williams /*
2*62232e45SDan Williams  * Copyright (c) 2014-2015, Intel Corporation.
3*62232e45SDan Williams  *
4*62232e45SDan Williams  * This program is free software; you can redistribute it and/or modify it
5*62232e45SDan Williams  * under the terms and conditions of the GNU Lesser General Public License,
6*62232e45SDan Williams  * version 2.1, as published by the Free Software Foundation.
7*62232e45SDan Williams  *
8*62232e45SDan Williams  * This program is distributed in the hope it will be useful, but WITHOUT ANY
9*62232e45SDan Williams  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
10*62232e45SDan Williams  * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
11*62232e45SDan Williams  * more details.
12*62232e45SDan Williams  */
13*62232e45SDan Williams #ifndef __NDCTL_H__
14*62232e45SDan Williams #define __NDCTL_H__
15*62232e45SDan Williams 
16*62232e45SDan Williams #include <linux/types.h>
17*62232e45SDan Williams 
18*62232e45SDan Williams struct nd_cmd_smart {
19*62232e45SDan Williams 	__u32 status;
20*62232e45SDan Williams 	__u8 data[128];
21*62232e45SDan Williams } __packed;
22*62232e45SDan Williams 
23*62232e45SDan Williams struct nd_cmd_smart_threshold {
24*62232e45SDan Williams 	__u32 status;
25*62232e45SDan Williams 	__u8 data[8];
26*62232e45SDan Williams } __packed;
27*62232e45SDan Williams 
28*62232e45SDan Williams struct nd_cmd_dimm_flags {
29*62232e45SDan Williams 	__u32 status;
30*62232e45SDan Williams 	__u32 flags;
31*62232e45SDan Williams } __packed;
32*62232e45SDan Williams 
33*62232e45SDan Williams struct nd_cmd_get_config_size {
34*62232e45SDan Williams 	__u32 status;
35*62232e45SDan Williams 	__u32 config_size;
36*62232e45SDan Williams 	__u32 max_xfer;
37*62232e45SDan Williams } __packed;
38*62232e45SDan Williams 
39*62232e45SDan Williams struct nd_cmd_get_config_data_hdr {
40*62232e45SDan Williams 	__u32 in_offset;
41*62232e45SDan Williams 	__u32 in_length;
42*62232e45SDan Williams 	__u32 status;
43*62232e45SDan Williams 	__u8 out_buf[0];
44*62232e45SDan Williams } __packed;
45*62232e45SDan Williams 
46*62232e45SDan Williams struct nd_cmd_set_config_hdr {
47*62232e45SDan Williams 	__u32 in_offset;
48*62232e45SDan Williams 	__u32 in_length;
49*62232e45SDan Williams 	__u8 in_buf[0];
50*62232e45SDan Williams } __packed;
51*62232e45SDan Williams 
52*62232e45SDan Williams struct nd_cmd_vendor_hdr {
53*62232e45SDan Williams 	__u32 opcode;
54*62232e45SDan Williams 	__u32 in_length;
55*62232e45SDan Williams 	__u8 in_buf[0];
56*62232e45SDan Williams } __packed;
57*62232e45SDan Williams 
58*62232e45SDan Williams struct nd_cmd_vendor_tail {
59*62232e45SDan Williams 	__u32 status;
60*62232e45SDan Williams 	__u32 out_length;
61*62232e45SDan Williams 	__u8 out_buf[0];
62*62232e45SDan Williams } __packed;
63*62232e45SDan Williams 
64*62232e45SDan Williams struct nd_cmd_ars_cap {
65*62232e45SDan Williams 	__u64 address;
66*62232e45SDan Williams 	__u64 length;
67*62232e45SDan Williams 	__u32 status;
68*62232e45SDan Williams 	__u32 max_ars_out;
69*62232e45SDan Williams } __packed;
70*62232e45SDan Williams 
71*62232e45SDan Williams struct nd_cmd_ars_start {
72*62232e45SDan Williams 	__u64 address;
73*62232e45SDan Williams 	__u64 length;
74*62232e45SDan Williams 	__u16 type;
75*62232e45SDan Williams 	__u8 reserved[6];
76*62232e45SDan Williams 	__u32 status;
77*62232e45SDan Williams } __packed;
78*62232e45SDan Williams 
79*62232e45SDan Williams struct nd_cmd_ars_status {
80*62232e45SDan Williams 	__u32 status;
81*62232e45SDan Williams 	__u32 out_length;
82*62232e45SDan Williams 	__u64 address;
83*62232e45SDan Williams 	__u64 length;
84*62232e45SDan Williams 	__u16 type;
85*62232e45SDan Williams 	__u32 num_records;
86*62232e45SDan Williams 	struct nd_ars_record {
87*62232e45SDan Williams 		__u32 handle;
88*62232e45SDan Williams 		__u32 flags;
89*62232e45SDan Williams 		__u64 err_address;
90*62232e45SDan Williams 		__u64 mask;
91*62232e45SDan Williams 	} __packed records[0];
92*62232e45SDan Williams } __packed;
93*62232e45SDan Williams 
94*62232e45SDan Williams enum {
95*62232e45SDan Williams 	ND_CMD_IMPLEMENTED = 0,
96*62232e45SDan Williams 
97*62232e45SDan Williams 	/* bus commands */
98*62232e45SDan Williams 	ND_CMD_ARS_CAP = 1,
99*62232e45SDan Williams 	ND_CMD_ARS_START = 2,
100*62232e45SDan Williams 	ND_CMD_ARS_STATUS = 3,
101*62232e45SDan Williams 
102*62232e45SDan Williams 	/* per-dimm commands */
103*62232e45SDan Williams 	ND_CMD_SMART = 1,
104*62232e45SDan Williams 	ND_CMD_SMART_THRESHOLD = 2,
105*62232e45SDan Williams 	ND_CMD_DIMM_FLAGS = 3,
106*62232e45SDan Williams 	ND_CMD_GET_CONFIG_SIZE = 4,
107*62232e45SDan Williams 	ND_CMD_GET_CONFIG_DATA = 5,
108*62232e45SDan Williams 	ND_CMD_SET_CONFIG_DATA = 6,
109*62232e45SDan Williams 	ND_CMD_VENDOR_EFFECT_LOG_SIZE = 7,
110*62232e45SDan Williams 	ND_CMD_VENDOR_EFFECT_LOG = 8,
111*62232e45SDan Williams 	ND_CMD_VENDOR = 9,
112*62232e45SDan Williams };
113*62232e45SDan Williams 
114*62232e45SDan Williams static inline const char *nvdimm_bus_cmd_name(unsigned cmd)
115*62232e45SDan Williams {
116*62232e45SDan Williams 	static const char * const names[] = {
117*62232e45SDan Williams 		[ND_CMD_ARS_CAP] = "ars_cap",
118*62232e45SDan Williams 		[ND_CMD_ARS_START] = "ars_start",
119*62232e45SDan Williams 		[ND_CMD_ARS_STATUS] = "ars_status",
120*62232e45SDan Williams 	};
121*62232e45SDan Williams 
122*62232e45SDan Williams 	if (cmd < ARRAY_SIZE(names) && names[cmd])
123*62232e45SDan Williams 		return names[cmd];
124*62232e45SDan Williams 	return "unknown";
125*62232e45SDan Williams }
126*62232e45SDan Williams 
127*62232e45SDan Williams static inline const char *nvdimm_cmd_name(unsigned cmd)
128*62232e45SDan Williams {
129*62232e45SDan Williams 	static const char * const names[] = {
130*62232e45SDan Williams 		[ND_CMD_SMART] = "smart",
131*62232e45SDan Williams 		[ND_CMD_SMART_THRESHOLD] = "smart_thresh",
132*62232e45SDan Williams 		[ND_CMD_DIMM_FLAGS] = "flags",
133*62232e45SDan Williams 		[ND_CMD_GET_CONFIG_SIZE] = "get_size",
134*62232e45SDan Williams 		[ND_CMD_GET_CONFIG_DATA] = "get_data",
135*62232e45SDan Williams 		[ND_CMD_SET_CONFIG_DATA] = "set_data",
136*62232e45SDan Williams 		[ND_CMD_VENDOR_EFFECT_LOG_SIZE] = "effect_size",
137*62232e45SDan Williams 		[ND_CMD_VENDOR_EFFECT_LOG] = "effect_log",
138*62232e45SDan Williams 		[ND_CMD_VENDOR] = "vendor",
139*62232e45SDan Williams 	};
140*62232e45SDan Williams 
141*62232e45SDan Williams 	if (cmd < ARRAY_SIZE(names) && names[cmd])
142*62232e45SDan Williams 		return names[cmd];
143*62232e45SDan Williams 	return "unknown";
144*62232e45SDan Williams }
145*62232e45SDan Williams 
146*62232e45SDan Williams #define ND_IOCTL 'N'
147*62232e45SDan Williams 
148*62232e45SDan Williams #define ND_IOCTL_SMART			_IOWR(ND_IOCTL, ND_CMD_SMART,\
149*62232e45SDan Williams 					struct nd_cmd_smart)
150*62232e45SDan Williams 
151*62232e45SDan Williams #define ND_IOCTL_SMART_THRESHOLD	_IOWR(ND_IOCTL, ND_CMD_SMART_THRESHOLD,\
152*62232e45SDan Williams 					struct nd_cmd_smart_threshold)
153*62232e45SDan Williams 
154*62232e45SDan Williams #define ND_IOCTL_DIMM_FLAGS		_IOWR(ND_IOCTL, ND_CMD_DIMM_FLAGS,\
155*62232e45SDan Williams 					struct nd_cmd_dimm_flags)
156*62232e45SDan Williams 
157*62232e45SDan Williams #define ND_IOCTL_GET_CONFIG_SIZE	_IOWR(ND_IOCTL, ND_CMD_GET_CONFIG_SIZE,\
158*62232e45SDan Williams 					struct nd_cmd_get_config_size)
159*62232e45SDan Williams 
160*62232e45SDan Williams #define ND_IOCTL_GET_CONFIG_DATA	_IOWR(ND_IOCTL, ND_CMD_GET_CONFIG_DATA,\
161*62232e45SDan Williams 					struct nd_cmd_get_config_data_hdr)
162*62232e45SDan Williams 
163*62232e45SDan Williams #define ND_IOCTL_SET_CONFIG_DATA	_IOWR(ND_IOCTL, ND_CMD_SET_CONFIG_DATA,\
164*62232e45SDan Williams 					struct nd_cmd_set_config_hdr)
165*62232e45SDan Williams 
166*62232e45SDan Williams #define ND_IOCTL_VENDOR			_IOWR(ND_IOCTL, ND_CMD_VENDOR,\
167*62232e45SDan Williams 					struct nd_cmd_vendor_hdr)
168*62232e45SDan Williams 
169*62232e45SDan Williams #define ND_IOCTL_ARS_CAP		_IOWR(ND_IOCTL, ND_CMD_ARS_CAP,\
170*62232e45SDan Williams 					struct nd_cmd_ars_cap)
171*62232e45SDan Williams 
172*62232e45SDan Williams #define ND_IOCTL_ARS_START		_IOWR(ND_IOCTL, ND_CMD_ARS_START,\
173*62232e45SDan Williams 					struct nd_cmd_ars_start)
174*62232e45SDan Williams 
175*62232e45SDan Williams #define ND_IOCTL_ARS_STATUS		_IOWR(ND_IOCTL, ND_CMD_ARS_STATUS,\
176*62232e45SDan Williams 					struct nd_cmd_ars_status)
177*62232e45SDan Williams 
178*62232e45SDan Williams #endif /* __NDCTL_H__ */
179