xref: /spdk/lib/nvme/nvme_opal_internal.h (revision a6dbe3721eb3b5990707fc3e378c95e505dd8ab5)
1 /*   SPDX-License-Identifier: BSD-3-Clause
2  *   Copyright (C) 2019 Intel Corporation.
3  *   All rights reserved.
4  */
5 
6 #ifndef SPDK_OPAL_INTERNAL_H
7 #define SPDK_OPAL_INTERNAL_H
8 
9 #include "spdk/opal_spec.h"
10 #include "spdk/opal.h"
11 #include "spdk/scsi_spec.h"
12 
13 #define IO_BUFFER_LENGTH		2048
14 #define MAX_TOKS			64
15 #define OPAL_KEY_MAX			256
16 #define OPAL_UID_LENGTH			8
17 
18 #define GENERIC_HOST_SESSION_NUM	0x69
19 
20 #define OPAL_INVAL_PARAM		12
21 
22 #define SPDK_DTAERROR_NO_METHOD_STATUS	0x89
23 
24 enum opal_token_type {
25 	OPAL_DTA_TOKENID_BYTESTRING	= 0xE0,
26 	OPAL_DTA_TOKENID_SINT		= 0xE1,
27 	OPAL_DTA_TOKENID_UINT		= 0xE2,
28 	OPAL_DTA_TOKENID_TOKEN		= 0xE3, /* actual token is returned */
29 	OPAL_DTA_TOKENID_INVALID	= 0X0,
30 };
31 
32 enum opal_atom_width {
33 	OPAL_WIDTH_TINY,    /* 1 byte in length */
34 	OPAL_WIDTH_SHORT,   /* a 1-byte header and contain up to 15 bytes of data */
35 	OPAL_WIDTH_MEDIUM,  /* a 2-byte header and contain up to 2047 bytes of data */
36 	OPAL_WIDTH_LONG,    /* a 4-byte header and which contain up to 16,777,215 bytes of data */
37 	OPAL_WIDTH_TOKEN
38 };
39 
40 enum opal_uid_enum {
41 	/* users */
42 	UID_SMUID,
43 	UID_THISSP,
44 	UID_ADMINSP,
45 	UID_LOCKINGSP,
46 	UID_ANYBODY,
47 	UID_SID,
48 	UID_ADMIN1,
49 	UID_USER1,
50 	UID_USER2,
51 
52 	/* tables */
53 	UID_LOCKINGRANGE_GLOBAL,
54 	UID_LOCKINGRANGE_ACE_RDLOCKED,
55 	UID_LOCKINGRANGE_ACE_WRLOCKED,
56 	UID_MBRCONTROL,
57 	UID_MBR,
58 	UID_AUTHORITY_TABLE,
59 	UID_C_PIN_TABLE,
60 	UID_LOCKING_INFO_TABLE,
61 	UID_PSID,
62 
63 	/* C_PIN_TABLE object ID's */
64 	UID_C_PIN_MSID,
65 	UID_C_PIN_SID,
66 	UID_C_PIN_ADMIN1,
67 	UID_C_PIN_USER1,
68 
69 	/* half UID's (only first 4 bytes used) */
70 	UID_HALF_AUTHORITY_OBJ_REF,
71 	UID_HALF_BOOLEAN_ACE,
72 };
73 
74 /* enum for indexing the spdk_opal_method array */
75 enum opal_method_enum {
76 	PROPERTIES_METHOD,
77 	STARTSESSION_METHOD,
78 	REVERT_METHOD,
79 	ACTIVATE_METHOD,
80 	NEXT_METHOD,
81 	GETACL_METHOD,
82 	GENKEY_METHOD,
83 	REVERTSP_METHOD,
84 	GET_METHOD,
85 	SET_METHOD,
86 	AUTHENTICATE_METHOD,
87 	RANDOM_METHOD,
88 	ERASE_METHOD,
89 };
90 
91 struct spdk_opal_key {
92 	uint8_t key_len;
93 	uint8_t key[OPAL_KEY_MAX];
94 };
95 
96 const uint8_t spdk_opal_uid[][OPAL_UID_LENGTH] = {
97 	/* users */
98 	[UID_SMUID] = /* Session Manager UID */
99 	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff },
100 	[UID_THISSP] =
101 	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
102 	[UID_ADMINSP] =
103 	{ 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x00, 0x01 },
104 	[UID_LOCKINGSP] =
105 	{ 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x00, 0x02 },
106 	[UID_ANYBODY] =
107 	{ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01 },
108 	[UID_SID] = /* Security Identifier UID */
109 	{ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x06 },
110 	[UID_ADMIN1] =
111 	{ 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00, 0x01 },
112 	[UID_USER1] =
113 	{ 0x00, 0x00, 0x00, 0x09, 0x00, 0x03, 0x00, 0x01 },
114 	[UID_USER2] =
115 	{ 0x00, 0x00, 0x00, 0x09, 0x00, 0x03, 0x00, 0x02 },
116 
117 	/* tables */
118 	[UID_LOCKINGRANGE_GLOBAL] =
119 	{ 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x01 },
120 	[UID_LOCKINGRANGE_ACE_RDLOCKED] =
121 	{ 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0xE0, 0x01 },
122 	[UID_LOCKINGRANGE_ACE_WRLOCKED] =
123 	{ 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0xE8, 0x01 },
124 	[UID_MBRCONTROL] =
125 	{ 0x00, 0x00, 0x08, 0x03, 0x00, 0x00, 0x00, 0x01 },
126 	[UID_MBR] =
127 	{ 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00 },
128 	[UID_AUTHORITY_TABLE] =
129 	{ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00},
130 	[UID_C_PIN_TABLE] =
131 	{ 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00},
132 	[UID_LOCKING_INFO_TABLE] =
133 	{ 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01 },
134 	[UID_PSID] =
135 	{ 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0xff, 0x01 },
136 
137 	/* C_PIN_TABLE object ID's */
138 	[UID_C_PIN_MSID] =
139 	{ 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x84, 0x02},
140 	[UID_C_PIN_SID] =
141 	{ 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01},
142 	[UID_C_PIN_ADMIN1] =
143 	{ 0x00, 0x00, 0x00, 0x0B, 0x00, 0x01, 0x00, 0x01},
144 	[UID_C_PIN_USER1] =
145 	{ 0x00, 0x00, 0x00, 0x0B, 0x00, 0x03, 0x00, 0x01},
146 
147 	/* half UID's (only first 4 bytes used) */
148 	[UID_HALF_AUTHORITY_OBJ_REF] =
149 	{ 0x00, 0x00, 0x0C, 0x05, 0xff, 0xff, 0xff, 0xff },
150 	[UID_HALF_BOOLEAN_ACE] =
151 	{ 0x00, 0x00, 0x04, 0x0E, 0xff, 0xff, 0xff, 0xff },
152 };
153 
154 /*
155  * TCG Storage SSC Methods.
156  */
157 const uint8_t spdk_opal_method[][OPAL_UID_LENGTH] = {
158 	[PROPERTIES_METHOD] =
159 	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x01 },
160 	[STARTSESSION_METHOD] =
161 	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x02 },
162 	[REVERT_METHOD] =
163 	{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x02 },
164 	[ACTIVATE_METHOD] =
165 	{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x03 },
166 	[NEXT_METHOD] =
167 	{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x08 },
168 	[GETACL_METHOD] =
169 	{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0d },
170 	[GENKEY_METHOD] =
171 	{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10 },
172 	[REVERTSP_METHOD] =
173 	{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x11 },
174 	[GET_METHOD] =
175 	{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x16 },
176 	[SET_METHOD] =
177 	{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x17 },
178 	[AUTHENTICATE_METHOD] =
179 	{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1c },
180 	[RANDOM_METHOD] =
181 	{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x01 },
182 	[ERASE_METHOD] =
183 	{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x08, 0x03 },
184 };
185 
186 /*
187  * Response token
188  */
189 struct spdk_opal_resp_token {
190 	const uint8_t *pos;
191 	uint8_t _padding[7];
192 	union {
193 		uint64_t unsigned_num;
194 		int64_t signed_num;
195 	} stored;
196 	size_t len; /* header + data */
197 	enum opal_token_type type;
198 	enum opal_atom_width width;
199 };
200 
201 struct spdk_opal_resp_parsed {
202 	int num;
203 	struct spdk_opal_resp_token resp_tokens[MAX_TOKS];
204 };
205 
206 /* header of a response */
207 struct spdk_opal_header {
208 	struct spdk_opal_compacket com_packet;
209 	struct spdk_opal_packet packet;
210 	struct spdk_opal_data_subpacket sub_packet;
211 };
212 
213 struct opal_session;
214 struct spdk_opal_dev;
215 
216 typedef void (*opal_sess_cb)(struct opal_session *sess, int status, void *ctx);
217 
218 struct opal_session {
219 	uint32_t hsn;
220 	uint32_t tsn;
221 	size_t cmd_pos;
222 	uint8_t cmd[IO_BUFFER_LENGTH];
223 	uint8_t resp[IO_BUFFER_LENGTH];
224 	struct spdk_opal_resp_parsed parsed_resp;
225 
226 	opal_sess_cb sess_cb;
227 	void *cb_arg;
228 	bool done;
229 	int status;
230 	struct spdk_opal_dev *dev;
231 };
232 
233 struct spdk_opal_dev {
234 	struct spdk_nvme_ctrlr *ctrlr;
235 
236 	uint16_t comid;
237 
238 	struct spdk_opal_d0_features_info feat_info;
239 
240 	uint8_t max_ranges; /* max locking range number */
241 	struct spdk_opal_locking_range_info locking_ranges[SPDK_OPAL_MAX_LOCKING_RANGE];
242 };
243 
244 #endif
245