xref: /spdk/lib/nvme/nvme_opal_internal.h (revision b30d57cdad6d2bc75cc1e4e2ebbcebcb0d98dcfa)
1 /*-
2  *   BSD LICENSE
3  *
4  *   Copyright (c) Intel Corporation.
5  *   All rights reserved.
6  *
7  *   Redistribution and use in source and binary forms, with or without
8  *   modification, are permitted provided that the following conditions
9  *   are met:
10  *
11  *     * Redistributions of source code must retain the above copyright
12  *       notice, this list of conditions and the following disclaimer.
13  *     * Redistributions in binary form must reproduce the above copyright
14  *       notice, this list of conditions and the following disclaimer in
15  *       the documentation and/or other materials provided with the
16  *       distribution.
17  *     * Neither the name of Intel Corporation nor the names of its
18  *       contributors may be used to endorse or promote products derived
19  *       from this software without specific prior written permission.
20  *
21  *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22  *   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23  *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24  *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25  *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26  *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
27  *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28  *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29  *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30  *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
31  *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  */
33 
34 #ifndef SPDK_OPAL_INTERNAL_H
35 #define SPDK_OPAL_INTERNAL_H
36 
37 #include "spdk/opal_spec.h"
38 #include "spdk/opal.h"
39 #include "spdk/scsi_spec.h"
40 
41 #define IO_BUFFER_LENGTH		2048
42 #define MAX_TOKS			64
43 #define OPAL_KEY_MAX			256
44 #define OPAL_UID_LENGTH			8
45 
46 #define GENERIC_HOST_SESSION_NUM	0x69
47 
48 #define OPAL_INVAL_PARAM		12
49 
50 #define SPDK_DTAERROR_NO_METHOD_STATUS	0x89
51 
52 enum opal_token_type {
53 	OPAL_DTA_TOKENID_BYTESTRING	= 0xE0,
54 	OPAL_DTA_TOKENID_SINT		= 0xE1,
55 	OPAL_DTA_TOKENID_UINT		= 0xE2,
56 	OPAL_DTA_TOKENID_TOKEN		= 0xE3, /* actual token is returned */
57 	OPAL_DTA_TOKENID_INVALID	= 0X0,
58 };
59 
60 enum opal_atom_width {
61 	OPAL_WIDTH_TINY,    /* 1 byte in length */
62 	OPAL_WIDTH_SHORT,   /* a 1-byte header and contain up to 15 bytes of data */
63 	OPAL_WIDTH_MEDIUM,  /* a 2-byte header and contain up to 2047 bytes of data */
64 	OPAL_WIDTH_LONG,    /* a 4-byte header and which contain up to 16,777,215 bytes of data */
65 	OPAL_WIDTH_TOKEN
66 };
67 
68 enum opal_uid_enum {
69 	/* users */
70 	UID_SMUID,
71 	UID_THISSP,
72 	UID_ADMINSP,
73 	UID_LOCKINGSP,
74 	UID_ANYBODY,
75 	UID_SID,
76 	UID_ADMIN1,
77 	UID_USER1,
78 	UID_USER2,
79 
80 	/* tables */
81 	UID_LOCKINGRANGE_GLOBAL,
82 	UID_LOCKINGRANGE_ACE_RDLOCKED,
83 	UID_LOCKINGRANGE_ACE_WRLOCKED,
84 	UID_MBRCONTROL,
85 	UID_MBR,
86 	UID_AUTHORITY_TABLE,
87 	UID_C_PIN_TABLE,
88 	UID_LOCKING_INFO_TABLE,
89 	UID_PSID,
90 
91 	/* C_PIN_TABLE object ID's */
92 	UID_C_PIN_MSID,
93 	UID_C_PIN_SID,
94 	UID_C_PIN_ADMIN1,
95 	UID_C_PIN_USER1,
96 
97 	/* half UID's (only first 4 bytes used) */
98 	UID_HALF_AUTHORITY_OBJ_REF,
99 	UID_HALF_BOOLEAN_ACE,
100 };
101 
102 /* enum for indexing the spdk_opal_method array */
103 enum opal_method_enum {
104 	PROPERTIES_METHOD,
105 	STARTSESSION_METHOD,
106 	REVERT_METHOD,
107 	ACTIVATE_METHOD,
108 	NEXT_METHOD,
109 	GETACL_METHOD,
110 	GENKEY_METHOD,
111 	REVERTSP_METHOD,
112 	GET_METHOD,
113 	SET_METHOD,
114 	AUTHENTICATE_METHOD,
115 	RANDOM_METHOD,
116 	ERASE_METHOD,
117 };
118 
119 struct spdk_opal_key {
120 	uint8_t key_len;
121 	uint8_t key[OPAL_KEY_MAX];
122 };
123 
124 const uint8_t spdk_opal_uid[][OPAL_UID_LENGTH] = {
125 	/* users */
126 	[UID_SMUID] = /* Session Manager UID */
127 	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff },
128 	[UID_THISSP] =
129 	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
130 	[UID_ADMINSP] =
131 	{ 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x00, 0x01 },
132 	[UID_LOCKINGSP] =
133 	{ 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x00, 0x02 },
134 	[UID_ANYBODY] =
135 	{ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01 },
136 	[UID_SID] = /* Security Identifier UID */
137 	{ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x06 },
138 	[UID_ADMIN1] =
139 	{ 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00, 0x01 },
140 	[UID_USER1] =
141 	{ 0x00, 0x00, 0x00, 0x09, 0x00, 0x03, 0x00, 0x01 },
142 	[UID_USER2] =
143 	{ 0x00, 0x00, 0x00, 0x09, 0x00, 0x03, 0x00, 0x02 },
144 
145 	/* tables */
146 	[UID_LOCKINGRANGE_GLOBAL] =
147 	{ 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x01 },
148 	[UID_LOCKINGRANGE_ACE_RDLOCKED] =
149 	{ 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0xE0, 0x01 },
150 	[UID_LOCKINGRANGE_ACE_WRLOCKED] =
151 	{ 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0xE8, 0x01 },
152 	[UID_MBRCONTROL] =
153 	{ 0x00, 0x00, 0x08, 0x03, 0x00, 0x00, 0x00, 0x01 },
154 	[UID_MBR] =
155 	{ 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00 },
156 	[UID_AUTHORITY_TABLE] =
157 	{ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00},
158 	[UID_C_PIN_TABLE] =
159 	{ 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00},
160 	[UID_LOCKING_INFO_TABLE] =
161 	{ 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01 },
162 	[UID_PSID] =
163 	{ 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0xff, 0x01 },
164 
165 	/* C_PIN_TABLE object ID's */
166 	[UID_C_PIN_MSID] =
167 	{ 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x84, 0x02},
168 	[UID_C_PIN_SID] =
169 	{ 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01},
170 	[UID_C_PIN_ADMIN1] =
171 	{ 0x00, 0x00, 0x00, 0x0B, 0x00, 0x01, 0x00, 0x01},
172 	[UID_C_PIN_USER1] =
173 	{ 0x00, 0x00, 0x00, 0x0B, 0x00, 0x03, 0x00, 0x01},
174 
175 	/* half UID's (only first 4 bytes used) */
176 	[UID_HALF_AUTHORITY_OBJ_REF] =
177 	{ 0x00, 0x00, 0x0C, 0x05, 0xff, 0xff, 0xff, 0xff },
178 	[UID_HALF_BOOLEAN_ACE] =
179 	{ 0x00, 0x00, 0x04, 0x0E, 0xff, 0xff, 0xff, 0xff },
180 };
181 
182 /*
183  * TCG Storage SSC Methods.
184  */
185 const uint8_t spdk_opal_method[][OPAL_UID_LENGTH] = {
186 	[PROPERTIES_METHOD] =
187 	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x01 },
188 	[STARTSESSION_METHOD] =
189 	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x02 },
190 	[REVERT_METHOD] =
191 	{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x02 },
192 	[ACTIVATE_METHOD] =
193 	{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x03 },
194 	[NEXT_METHOD] =
195 	{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x08 },
196 	[GETACL_METHOD] =
197 	{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0d },
198 	[GENKEY_METHOD] =
199 	{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10 },
200 	[REVERTSP_METHOD] =
201 	{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x11 },
202 	[GET_METHOD] =
203 	{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x16 },
204 	[SET_METHOD] =
205 	{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x17 },
206 	[AUTHENTICATE_METHOD] =
207 	{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1c },
208 	[RANDOM_METHOD] =
209 	{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x01 },
210 	[ERASE_METHOD] =
211 	{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x08, 0x03 },
212 };
213 
214 /*
215  * Response token
216  */
217 struct spdk_opal_resp_token {
218 	const uint8_t *pos;
219 	uint8_t _padding[7];
220 	union {
221 		uint64_t unsigned_num;
222 		int64_t signed_num;
223 	} stored;
224 	size_t len; /* header + data */
225 	enum opal_token_type type;
226 	enum opal_atom_width width;
227 };
228 
229 struct spdk_opal_resp_parsed {
230 	int num;
231 	struct spdk_opal_resp_token resp_tokens[MAX_TOKS];
232 };
233 
234 /* header of a response */
235 struct spdk_opal_header {
236 	struct spdk_opal_compacket com_packet;
237 	struct spdk_opal_packet packet;
238 	struct spdk_opal_data_subpacket sub_packet;
239 };
240 
241 struct opal_session;
242 struct spdk_opal_dev;
243 
244 typedef void (*opal_sess_cb)(struct opal_session *sess, int status, void *ctx);
245 
246 struct opal_session {
247 	uint32_t hsn;
248 	uint32_t tsn;
249 	size_t cmd_pos;
250 	uint8_t cmd[IO_BUFFER_LENGTH];
251 	uint8_t resp[IO_BUFFER_LENGTH];
252 	struct spdk_opal_resp_parsed parsed_resp;
253 
254 	opal_sess_cb sess_cb;
255 	void *cb_arg;
256 	bool done;
257 	int status;
258 	struct spdk_opal_dev *dev;
259 };
260 
261 struct spdk_opal_dev {
262 	struct spdk_nvme_ctrlr *ctrlr;
263 
264 	uint16_t comid;
265 
266 	struct spdk_opal_d0_features_info feat_info;
267 
268 	uint8_t max_ranges; /* max locking range number */
269 	struct spdk_opal_locking_range_info locking_ranges[SPDK_OPAL_MAX_LOCKING_RANGE];
270 };
271 
272 #endif
273