xref: /openbmc/linux/block/sed-opal.c (revision 18afb028)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright © 2016 Intel Corporation
4  *
5  * Authors:
6  *    Scott  Bauer      <scott.bauer@intel.com>
7  *    Rafael Antognolli <rafael.antognolli@intel.com>
8  */
9 
10 #define pr_fmt(fmt) KBUILD_MODNAME ":OPAL: " fmt
11 
12 #include <linux/delay.h>
13 #include <linux/device.h>
14 #include <linux/kernel.h>
15 #include <linux/list.h>
16 #include <linux/blkdev.h>
17 #include <linux/slab.h>
18 #include <linux/uaccess.h>
19 #include <uapi/linux/sed-opal.h>
20 #include <linux/sed-opal.h>
21 #include <linux/string.h>
22 #include <linux/kdev_t.h>
23 #include <linux/key.h>
24 #include <linux/key-type.h>
25 #include <keys/user-type.h>
26 
27 #include "opal_proto.h"
28 
29 #define IO_BUFFER_LENGTH 2048
30 #define MAX_TOKS 64
31 
32 /* Number of bytes needed by cmd_finalize. */
33 #define CMD_FINALIZE_BYTES_NEEDED 7
34 
35 static struct key *sed_opal_keyring;
36 
37 struct opal_step {
38 	int (*fn)(struct opal_dev *dev, void *data);
39 	void *data;
40 };
41 typedef int (cont_fn)(struct opal_dev *dev);
42 
43 enum opal_atom_width {
44 	OPAL_WIDTH_TINY,
45 	OPAL_WIDTH_SHORT,
46 	OPAL_WIDTH_MEDIUM,
47 	OPAL_WIDTH_LONG,
48 	OPAL_WIDTH_TOKEN
49 };
50 
51 /*
52  * On the parsed response, we don't store again the toks that are already
53  * stored in the response buffer. Instead, for each token, we just store a
54  * pointer to the position in the buffer where the token starts, and the size
55  * of the token in bytes.
56  */
57 struct opal_resp_tok {
58 	const u8 *pos;
59 	size_t len;
60 	enum opal_response_token type;
61 	enum opal_atom_width width;
62 	union {
63 		u64 u;
64 		s64 s;
65 	} stored;
66 };
67 
68 /*
69  * From the response header it's not possible to know how many tokens there are
70  * on the payload. So we hardcode that the maximum will be MAX_TOKS, and later
71  * if we start dealing with messages that have more than that, we can increase
72  * this number. This is done to avoid having to make two passes through the
73  * response, the first one counting how many tokens we have and the second one
74  * actually storing the positions.
75  */
76 struct parsed_resp {
77 	int num;
78 	struct opal_resp_tok toks[MAX_TOKS];
79 };
80 
81 struct opal_dev {
82 	u32 flags;
83 
84 	void *data;
85 	sec_send_recv *send_recv;
86 
87 	struct mutex dev_lock;
88 	u16 comid;
89 	u32 hsn;
90 	u32 tsn;
91 	u64 align; /* alignment granularity */
92 	u64 lowest_lba;
93 	u32 logical_block_size;
94 	u8  align_required; /* ALIGN: 0 or 1 */
95 
96 	size_t pos;
97 	u8 *cmd;
98 	u8 *resp;
99 
100 	struct parsed_resp parsed;
101 	size_t prev_d_len;
102 	void *prev_data;
103 
104 	struct list_head unlk_lst;
105 };
106 
107 
108 static const u8 opaluid[][OPAL_UID_LENGTH] = {
109 	/* users */
110 	[OPAL_SMUID_UID] =
111 		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff },
112 	[OPAL_THISSP_UID] =
113 		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
114 	[OPAL_ADMINSP_UID] =
115 		{ 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x00, 0x01 },
116 	[OPAL_LOCKINGSP_UID] =
117 		{ 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x00, 0x02 },
118 	[OPAL_ENTERPRISE_LOCKINGSP_UID] =
119 		{ 0x00, 0x00, 0x02, 0x05, 0x00, 0x01, 0x00, 0x01 },
120 	[OPAL_ANYBODY_UID] =
121 		{ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01 },
122 	[OPAL_SID_UID] =
123 		{ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x06 },
124 	[OPAL_ADMIN1_UID] =
125 		{ 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00, 0x01 },
126 	[OPAL_USER1_UID] =
127 		{ 0x00, 0x00, 0x00, 0x09, 0x00, 0x03, 0x00, 0x01 },
128 	[OPAL_USER2_UID] =
129 		{ 0x00, 0x00, 0x00, 0x09, 0x00, 0x03, 0x00, 0x02 },
130 	[OPAL_PSID_UID] =
131 		{ 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0xff, 0x01 },
132 	[OPAL_ENTERPRISE_BANDMASTER0_UID] =
133 		{ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x80, 0x01 },
134 	[OPAL_ENTERPRISE_ERASEMASTER_UID] =
135 		{ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x84, 0x01 },
136 
137 	/* tables */
138 	[OPAL_TABLE_TABLE] =
139 		{ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01 },
140 	[OPAL_LOCKINGRANGE_GLOBAL] =
141 		{ 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x01 },
142 	[OPAL_LOCKINGRANGE_ACE_START_TO_KEY] =
143 		{ 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0xD0, 0x01 },
144 	[OPAL_LOCKINGRANGE_ACE_RDLOCKED] =
145 		{ 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0xE0, 0x01 },
146 	[OPAL_LOCKINGRANGE_ACE_WRLOCKED] =
147 		{ 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0xE8, 0x01 },
148 	[OPAL_MBRCONTROL] =
149 		{ 0x00, 0x00, 0x08, 0x03, 0x00, 0x00, 0x00, 0x01 },
150 	[OPAL_MBR] =
151 		{ 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00 },
152 	[OPAL_AUTHORITY_TABLE] =
153 		{ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00},
154 	[OPAL_C_PIN_TABLE] =
155 		{ 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00},
156 	[OPAL_LOCKING_INFO_TABLE] =
157 		{ 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01 },
158 	[OPAL_ENTERPRISE_LOCKING_INFO_TABLE] =
159 		{ 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00 },
160 	[OPAL_DATASTORE] =
161 		{ 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00 },
162 
163 	/* C_PIN_TABLE object ID's */
164 	[OPAL_C_PIN_MSID] =
165 		{ 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x84, 0x02},
166 	[OPAL_C_PIN_SID] =
167 		{ 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01},
168 	[OPAL_C_PIN_ADMIN1] =
169 		{ 0x00, 0x00, 0x00, 0x0B, 0x00, 0x01, 0x00, 0x01},
170 
171 	/* half UID's (only first 4 bytes used) */
172 	[OPAL_HALF_UID_AUTHORITY_OBJ_REF] =
173 		{ 0x00, 0x00, 0x0C, 0x05, 0xff, 0xff, 0xff, 0xff },
174 	[OPAL_HALF_UID_BOOLEAN_ACE] =
175 		{ 0x00, 0x00, 0x04, 0x0E, 0xff, 0xff, 0xff, 0xff },
176 
177 	/* special value for omitted optional parameter */
178 	[OPAL_UID_HEXFF] =
179 		{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
180 };
181 
182 /*
183  * TCG Storage SSC Methods.
184  * Derived from: TCG_Storage_Architecture_Core_Spec_v2.01_r1.00
185  * Section: 6.3 Assigned UIDs
186  */
187 static const u8 opalmethod[][OPAL_METHOD_LENGTH] = {
188 	[OPAL_PROPERTIES] =
189 		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x01 },
190 	[OPAL_STARTSESSION] =
191 		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x02 },
192 	[OPAL_REVERT] =
193 		{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x02 },
194 	[OPAL_ACTIVATE] =
195 		{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x03 },
196 	[OPAL_EGET] =
197 		{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06 },
198 	[OPAL_ESET] =
199 		{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07 },
200 	[OPAL_NEXT] =
201 		{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x08 },
202 	[OPAL_EAUTHENTICATE] =
203 		{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0c },
204 	[OPAL_GETACL] =
205 		{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0d },
206 	[OPAL_GENKEY] =
207 		{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10 },
208 	[OPAL_REVERTSP] =
209 		{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x11 },
210 	[OPAL_GET] =
211 		{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x16 },
212 	[OPAL_SET] =
213 		{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x17 },
214 	[OPAL_AUTHENTICATE] =
215 		{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1c },
216 	[OPAL_RANDOM] =
217 		{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x01 },
218 	[OPAL_ERASE] =
219 		{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x08, 0x03 },
220 };
221 
222 static int end_opal_session_error(struct opal_dev *dev);
223 static int opal_discovery0_step(struct opal_dev *dev);
224 
225 struct opal_suspend_data {
226 	struct opal_lock_unlock unlk;
227 	u8 lr;
228 	struct list_head node;
229 };
230 
231 /*
232  * Derived from:
233  * TCG_Storage_Architecture_Core_Spec_v2.01_r1.00
234  * Section: 5.1.5 Method Status Codes
235  */
236 static const char * const opal_errors[] = {
237 	"Success",
238 	"Not Authorized",
239 	"Unknown Error",
240 	"SP Busy",
241 	"SP Failed",
242 	"SP Disabled",
243 	"SP Frozen",
244 	"No Sessions Available",
245 	"Uniqueness Conflict",
246 	"Insufficient Space",
247 	"Insufficient Rows",
248 	"Invalid Function",
249 	"Invalid Parameter",
250 	"Invalid Reference",
251 	"Unknown Error",
252 	"TPER Malfunction",
253 	"Transaction Failure",
254 	"Response Overflow",
255 	"Authority Locked Out",
256 };
257 
258 static const char *opal_error_to_human(int error)
259 {
260 	if (error == 0x3f)
261 		return "Failed";
262 
263 	if (error >= ARRAY_SIZE(opal_errors) || error < 0)
264 		return "Unknown Error";
265 
266 	return opal_errors[error];
267 }
268 
269 static void print_buffer(const u8 *ptr, u32 length)
270 {
271 #ifdef DEBUG
272 	print_hex_dump_bytes("OPAL: ", DUMP_PREFIX_OFFSET, ptr, length);
273 	pr_debug("\n");
274 #endif
275 }
276 
277 /*
278  * Allocate/update a SED Opal key and add it to the SED Opal keyring.
279  */
280 static int update_sed_opal_key(const char *desc, u_char *key_data, int keylen)
281 {
282 	key_ref_t kr;
283 
284 	if (!sed_opal_keyring)
285 		return -ENOKEY;
286 
287 	kr = key_create_or_update(make_key_ref(sed_opal_keyring, true), "user",
288 				  desc, (const void *)key_data, keylen,
289 				  KEY_USR_VIEW | KEY_USR_SEARCH | KEY_USR_WRITE,
290 				  KEY_ALLOC_NOT_IN_QUOTA | KEY_ALLOC_BUILT_IN |
291 					KEY_ALLOC_BYPASS_RESTRICTION);
292 	if (IS_ERR(kr)) {
293 		pr_err("Error adding SED key (%ld)\n", PTR_ERR(kr));
294 		return PTR_ERR(kr);
295 	}
296 
297 	return 0;
298 }
299 
300 /*
301  * Read a SED Opal key from the SED Opal keyring.
302  */
303 static int read_sed_opal_key(const char *key_name, u_char *buffer, int buflen)
304 {
305 	int ret;
306 	key_ref_t kref;
307 	struct key *key;
308 
309 	if (!sed_opal_keyring)
310 		return -ENOKEY;
311 
312 	kref = keyring_search(make_key_ref(sed_opal_keyring, true),
313 			      &key_type_user, key_name, true);
314 
315 	if (IS_ERR(kref))
316 		ret = PTR_ERR(kref);
317 
318 	key = key_ref_to_ptr(kref);
319 	down_read(&key->sem);
320 	ret = key_validate(key);
321 	if (ret == 0) {
322 		if (buflen > key->datalen)
323 			buflen = key->datalen;
324 
325 		ret = key->type->read(key, (char *)buffer, buflen);
326 	}
327 	up_read(&key->sem);
328 
329 	key_ref_put(kref);
330 
331 	return ret;
332 }
333 
334 static int opal_get_key(struct opal_dev *dev, struct opal_key *key)
335 {
336 	int ret = 0;
337 
338 	switch (key->key_type) {
339 	case OPAL_INCLUDED:
340 		/* the key is ready to use */
341 		break;
342 	case OPAL_KEYRING:
343 		/* the key is in the keyring */
344 		ret = read_sed_opal_key(OPAL_AUTH_KEY, key->key, OPAL_KEY_MAX);
345 		if (ret > 0) {
346 			if (ret > U8_MAX) {
347 				ret = -ENOSPC;
348 				goto error;
349 			}
350 			key->key_len = ret;
351 			key->key_type = OPAL_INCLUDED;
352 		}
353 		break;
354 	default:
355 		ret = -EINVAL;
356 		break;
357 	}
358 	if (ret < 0)
359 		goto error;
360 
361 	/* must have a PEK by now or it's an error */
362 	if (key->key_type != OPAL_INCLUDED || key->key_len == 0) {
363 		ret = -EINVAL;
364 		goto error;
365 	}
366 	return 0;
367 error:
368 	pr_debug("Error getting password: %d\n", ret);
369 	return ret;
370 }
371 
372 static bool check_tper(const void *data)
373 {
374 	const struct d0_tper_features *tper = data;
375 	u8 flags = tper->supported_features;
376 
377 	if (!(flags & TPER_SYNC_SUPPORTED)) {
378 		pr_debug("TPer sync not supported. flags = %d\n",
379 			 tper->supported_features);
380 		return false;
381 	}
382 
383 	return true;
384 }
385 
386 static bool check_lcksuppt(const void *data)
387 {
388 	const struct d0_locking_features *lfeat = data;
389 	u8 sup_feat = lfeat->supported_features;
390 
391 	return !!(sup_feat & LOCKING_SUPPORTED_MASK);
392 }
393 
394 static bool check_lckenabled(const void *data)
395 {
396 	const struct d0_locking_features *lfeat = data;
397 	u8 sup_feat = lfeat->supported_features;
398 
399 	return !!(sup_feat & LOCKING_ENABLED_MASK);
400 }
401 
402 static bool check_locked(const void *data)
403 {
404 	const struct d0_locking_features *lfeat = data;
405 	u8 sup_feat = lfeat->supported_features;
406 
407 	return !!(sup_feat & LOCKED_MASK);
408 }
409 
410 static bool check_mbrenabled(const void *data)
411 {
412 	const struct d0_locking_features *lfeat = data;
413 	u8 sup_feat = lfeat->supported_features;
414 
415 	return !!(sup_feat & MBR_ENABLED_MASK);
416 }
417 
418 static bool check_mbrdone(const void *data)
419 {
420 	const struct d0_locking_features *lfeat = data;
421 	u8 sup_feat = lfeat->supported_features;
422 
423 	return !!(sup_feat & MBR_DONE_MASK);
424 }
425 
426 static bool check_sum(const void *data)
427 {
428 	const struct d0_single_user_mode *sum = data;
429 	u32 nlo = be32_to_cpu(sum->num_locking_objects);
430 
431 	if (nlo == 0) {
432 		pr_debug("Need at least one locking object.\n");
433 		return false;
434 	}
435 
436 	pr_debug("Number of locking objects: %d\n", nlo);
437 
438 	return true;
439 }
440 
441 static u16 get_comid_v100(const void *data)
442 {
443 	const struct d0_opal_v100 *v100 = data;
444 
445 	return be16_to_cpu(v100->baseComID);
446 }
447 
448 static u16 get_comid_v200(const void *data)
449 {
450 	const struct d0_opal_v200 *v200 = data;
451 
452 	return be16_to_cpu(v200->baseComID);
453 }
454 
455 static int opal_send_cmd(struct opal_dev *dev)
456 {
457 	return dev->send_recv(dev->data, dev->comid, TCG_SECP_01,
458 			      dev->cmd, IO_BUFFER_LENGTH,
459 			      true);
460 }
461 
462 static int opal_recv_cmd(struct opal_dev *dev)
463 {
464 	return dev->send_recv(dev->data, dev->comid, TCG_SECP_01,
465 			      dev->resp, IO_BUFFER_LENGTH,
466 			      false);
467 }
468 
469 static int opal_recv_check(struct opal_dev *dev)
470 {
471 	size_t buflen = IO_BUFFER_LENGTH;
472 	void *buffer = dev->resp;
473 	struct opal_header *hdr = buffer;
474 	int ret;
475 
476 	do {
477 		pr_debug("Sent OPAL command: outstanding=%d, minTransfer=%d\n",
478 			 hdr->cp.outstandingData,
479 			 hdr->cp.minTransfer);
480 
481 		if (hdr->cp.outstandingData == 0 ||
482 		    hdr->cp.minTransfer != 0)
483 			return 0;
484 
485 		memset(buffer, 0, buflen);
486 		ret = opal_recv_cmd(dev);
487 	} while (!ret);
488 
489 	return ret;
490 }
491 
492 static int opal_send_recv(struct opal_dev *dev, cont_fn *cont)
493 {
494 	int ret;
495 
496 	ret = opal_send_cmd(dev);
497 	if (ret)
498 		return ret;
499 	ret = opal_recv_cmd(dev);
500 	if (ret)
501 		return ret;
502 	ret = opal_recv_check(dev);
503 	if (ret)
504 		return ret;
505 	return cont(dev);
506 }
507 
508 static void check_geometry(struct opal_dev *dev, const void *data)
509 {
510 	const struct d0_geometry_features *geo = data;
511 
512 	dev->align = be64_to_cpu(geo->alignment_granularity);
513 	dev->lowest_lba = be64_to_cpu(geo->lowest_aligned_lba);
514 	dev->logical_block_size = be32_to_cpu(geo->logical_block_size);
515 	dev->align_required = geo->reserved01 & 1;
516 }
517 
518 static int execute_step(struct opal_dev *dev,
519 			const struct opal_step *step, size_t stepIndex)
520 {
521 	int error = step->fn(dev, step->data);
522 
523 	if (error) {
524 		pr_debug("Step %zu (%pS) failed with error %d: %s\n",
525 			 stepIndex, step->fn, error,
526 			 opal_error_to_human(error));
527 	}
528 
529 	return error;
530 }
531 
532 static int execute_steps(struct opal_dev *dev,
533 			 const struct opal_step *steps, size_t n_steps)
534 {
535 	size_t state = 0;
536 	int error;
537 
538 	/* first do a discovery0 */
539 	error = opal_discovery0_step(dev);
540 	if (error)
541 		return error;
542 
543 	for (state = 0; state < n_steps; state++) {
544 		error = execute_step(dev, &steps[state], state);
545 		if (error)
546 			goto out_error;
547 	}
548 
549 	return 0;
550 
551 out_error:
552 	/*
553 	 * For each OPAL command the first step in steps starts some sort of
554 	 * session. If an error occurred in the initial discovery0 or if an
555 	 * error occurred in the first step (and thus stopping the loop with
556 	 * state == 0) then there was an error before or during the attempt to
557 	 * start a session. Therefore we shouldn't attempt to terminate a
558 	 * session, as one has not yet been created.
559 	 */
560 	if (state > 0)
561 		end_opal_session_error(dev);
562 
563 	return error;
564 }
565 
566 static int opal_discovery0_end(struct opal_dev *dev, void *data)
567 {
568 	struct opal_discovery *discv_out = data; /* may be NULL */
569 	u8 __user *buf_out;
570 	u64 len_out;
571 	bool found_com_id = false, supported = true, single_user = false;
572 	const struct d0_header *hdr = (struct d0_header *)dev->resp;
573 	const u8 *epos = dev->resp, *cpos = dev->resp;
574 	u16 comid = 0;
575 	u32 hlen = be32_to_cpu(hdr->length);
576 
577 	print_buffer(dev->resp, hlen);
578 	dev->flags &= OPAL_FL_SUPPORTED;
579 
580 	if (hlen > IO_BUFFER_LENGTH - sizeof(*hdr)) {
581 		pr_debug("Discovery length overflows buffer (%zu+%u)/%u\n",
582 			 sizeof(*hdr), hlen, IO_BUFFER_LENGTH);
583 		return -EFAULT;
584 	}
585 
586 	if (discv_out) {
587 		buf_out = (u8 __user *)(uintptr_t)discv_out->data;
588 		len_out = min_t(u64, discv_out->size, hlen);
589 		if (buf_out && copy_to_user(buf_out, dev->resp, len_out))
590 			return -EFAULT;
591 
592 		discv_out->size = hlen; /* actual size of data */
593 	}
594 
595 	epos += hlen; /* end of buffer */
596 	cpos += sizeof(*hdr); /* current position on buffer */
597 
598 	while (cpos < epos && supported) {
599 		const struct d0_features *body =
600 			(const struct d0_features *)cpos;
601 
602 		switch (be16_to_cpu(body->code)) {
603 		case FC_TPER:
604 			supported = check_tper(body->features);
605 			break;
606 		case FC_SINGLEUSER:
607 			single_user = check_sum(body->features);
608 			if (single_user)
609 				dev->flags |= OPAL_FL_SUM_SUPPORTED;
610 			break;
611 		case FC_GEOMETRY:
612 			check_geometry(dev, body);
613 			break;
614 		case FC_LOCKING:
615 			if (check_lcksuppt(body->features))
616 				dev->flags |= OPAL_FL_LOCKING_SUPPORTED;
617 			if (check_lckenabled(body->features))
618 				dev->flags |= OPAL_FL_LOCKING_ENABLED;
619 			if (check_locked(body->features))
620 				dev->flags |= OPAL_FL_LOCKED;
621 			if (check_mbrenabled(body->features))
622 				dev->flags |= OPAL_FL_MBR_ENABLED;
623 			if (check_mbrdone(body->features))
624 				dev->flags |= OPAL_FL_MBR_DONE;
625 			break;
626 		case FC_ENTERPRISE:
627 		case FC_DATASTORE:
628 			/* some ignored properties */
629 			pr_debug("Found OPAL feature description: %d\n",
630 				 be16_to_cpu(body->code));
631 			break;
632 		case FC_OPALV100:
633 			comid = get_comid_v100(body->features);
634 			found_com_id = true;
635 			break;
636 		case FC_OPALV200:
637 			comid = get_comid_v200(body->features);
638 			found_com_id = true;
639 			break;
640 		case 0xbfff ... 0xffff:
641 			/* vendor specific, just ignore */
642 			break;
643 		default:
644 			pr_debug("OPAL Unknown feature: %d\n",
645 				 be16_to_cpu(body->code));
646 
647 		}
648 		cpos += body->length + 4;
649 	}
650 
651 	if (!supported) {
652 		pr_debug("This device is not Opal enabled. Not Supported!\n");
653 		return -EOPNOTSUPP;
654 	}
655 
656 	if (!single_user)
657 		pr_debug("Device doesn't support single user mode\n");
658 
659 
660 	if (!found_com_id) {
661 		pr_debug("Could not find OPAL comid for device. Returning early\n");
662 		return -EOPNOTSUPP;
663 	}
664 
665 	dev->comid = comid;
666 
667 	return 0;
668 }
669 
670 static int opal_discovery0(struct opal_dev *dev, void *data)
671 {
672 	int ret;
673 
674 	memset(dev->resp, 0, IO_BUFFER_LENGTH);
675 	dev->comid = OPAL_DISCOVERY_COMID;
676 	ret = opal_recv_cmd(dev);
677 	if (ret)
678 		return ret;
679 
680 	return opal_discovery0_end(dev, data);
681 }
682 
683 static int opal_discovery0_step(struct opal_dev *dev)
684 {
685 	const struct opal_step discovery0_step = {
686 		opal_discovery0, NULL
687 	};
688 
689 	return execute_step(dev, &discovery0_step, 0);
690 }
691 
692 static size_t remaining_size(struct opal_dev *cmd)
693 {
694 	return IO_BUFFER_LENGTH - cmd->pos;
695 }
696 
697 static bool can_add(int *err, struct opal_dev *cmd, size_t len)
698 {
699 	if (*err)
700 		return false;
701 
702 	if (remaining_size(cmd) < len) {
703 		pr_debug("Error adding %zu bytes: end of buffer.\n", len);
704 		*err = -ERANGE;
705 		return false;
706 	}
707 
708 	return true;
709 }
710 
711 static void add_token_u8(int *err, struct opal_dev *cmd, u8 tok)
712 {
713 	if (!can_add(err, cmd, 1))
714 		return;
715 
716 	cmd->cmd[cmd->pos++] = tok;
717 }
718 
719 static void add_short_atom_header(struct opal_dev *cmd, bool bytestring,
720 				  bool has_sign, int len)
721 {
722 	u8 atom;
723 	int err = 0;
724 
725 	atom = SHORT_ATOM_ID;
726 	atom |= bytestring ? SHORT_ATOM_BYTESTRING : 0;
727 	atom |= has_sign ? SHORT_ATOM_SIGNED : 0;
728 	atom |= len & SHORT_ATOM_LEN_MASK;
729 
730 	add_token_u8(&err, cmd, atom);
731 }
732 
733 static void add_medium_atom_header(struct opal_dev *cmd, bool bytestring,
734 				   bool has_sign, int len)
735 {
736 	u8 header0;
737 
738 	header0 = MEDIUM_ATOM_ID;
739 	header0 |= bytestring ? MEDIUM_ATOM_BYTESTRING : 0;
740 	header0 |= has_sign ? MEDIUM_ATOM_SIGNED : 0;
741 	header0 |= (len >> 8) & MEDIUM_ATOM_LEN_MASK;
742 
743 	cmd->cmd[cmd->pos++] = header0;
744 	cmd->cmd[cmd->pos++] = len;
745 }
746 
747 static void add_token_u64(int *err, struct opal_dev *cmd, u64 number)
748 {
749 	size_t len;
750 	int msb;
751 
752 	if (!(number & ~TINY_ATOM_DATA_MASK)) {
753 		add_token_u8(err, cmd, number);
754 		return;
755 	}
756 
757 	msb = fls64(number);
758 	len = DIV_ROUND_UP(msb, 8);
759 
760 	if (!can_add(err, cmd, len + 1)) {
761 		pr_debug("Error adding u64: end of buffer.\n");
762 		return;
763 	}
764 	add_short_atom_header(cmd, false, false, len);
765 	while (len--)
766 		add_token_u8(err, cmd, number >> (len * 8));
767 }
768 
769 static u8 *add_bytestring_header(int *err, struct opal_dev *cmd, size_t len)
770 {
771 	size_t header_len = 1;
772 	bool is_short_atom = true;
773 
774 	if (len & ~SHORT_ATOM_LEN_MASK) {
775 		header_len = 2;
776 		is_short_atom = false;
777 	}
778 
779 	if (!can_add(err, cmd, header_len + len)) {
780 		pr_debug("Error adding bytestring: end of buffer.\n");
781 		return NULL;
782 	}
783 
784 	if (is_short_atom)
785 		add_short_atom_header(cmd, true, false, len);
786 	else
787 		add_medium_atom_header(cmd, true, false, len);
788 
789 	return &cmd->cmd[cmd->pos];
790 }
791 
792 static void add_token_bytestring(int *err, struct opal_dev *cmd,
793 				 const u8 *bytestring, size_t len)
794 {
795 	u8 *start;
796 
797 	start = add_bytestring_header(err, cmd, len);
798 	if (!start)
799 		return;
800 	memcpy(start, bytestring, len);
801 	cmd->pos += len;
802 }
803 
804 static int build_locking_range(u8 *buffer, size_t length, u8 lr)
805 {
806 	if (length > OPAL_UID_LENGTH) {
807 		pr_debug("Can't build locking range. Length OOB\n");
808 		return -ERANGE;
809 	}
810 
811 	memcpy(buffer, opaluid[OPAL_LOCKINGRANGE_GLOBAL], OPAL_UID_LENGTH);
812 
813 	if (lr == 0)
814 		return 0;
815 
816 	buffer[5] = LOCKING_RANGE_NON_GLOBAL;
817 	buffer[7] = lr;
818 
819 	return 0;
820 }
821 
822 static int build_locking_user(u8 *buffer, size_t length, u8 lr)
823 {
824 	if (length > OPAL_UID_LENGTH) {
825 		pr_debug("Can't build locking range user. Length OOB\n");
826 		return -ERANGE;
827 	}
828 
829 	memcpy(buffer, opaluid[OPAL_USER1_UID], OPAL_UID_LENGTH);
830 
831 	buffer[7] = lr + 1;
832 
833 	return 0;
834 }
835 
836 static void set_comid(struct opal_dev *cmd, u16 comid)
837 {
838 	struct opal_header *hdr = (struct opal_header *)cmd->cmd;
839 
840 	hdr->cp.extendedComID[0] = comid >> 8;
841 	hdr->cp.extendedComID[1] = comid;
842 	hdr->cp.extendedComID[2] = 0;
843 	hdr->cp.extendedComID[3] = 0;
844 }
845 
846 static int cmd_finalize(struct opal_dev *cmd, u32 hsn, u32 tsn)
847 {
848 	struct opal_header *hdr;
849 	int err = 0;
850 
851 	/*
852 	 * Close the parameter list opened from cmd_start.
853 	 * The number of bytes added must be equal to
854 	 * CMD_FINALIZE_BYTES_NEEDED.
855 	 */
856 	add_token_u8(&err, cmd, OPAL_ENDLIST);
857 
858 	add_token_u8(&err, cmd, OPAL_ENDOFDATA);
859 	add_token_u8(&err, cmd, OPAL_STARTLIST);
860 	add_token_u8(&err, cmd, 0);
861 	add_token_u8(&err, cmd, 0);
862 	add_token_u8(&err, cmd, 0);
863 	add_token_u8(&err, cmd, OPAL_ENDLIST);
864 
865 	if (err) {
866 		pr_debug("Error finalizing command.\n");
867 		return -EFAULT;
868 	}
869 
870 	hdr = (struct opal_header *) cmd->cmd;
871 
872 	hdr->pkt.tsn = cpu_to_be32(tsn);
873 	hdr->pkt.hsn = cpu_to_be32(hsn);
874 
875 	hdr->subpkt.length = cpu_to_be32(cmd->pos - sizeof(*hdr));
876 	while (cmd->pos % 4) {
877 		if (cmd->pos >= IO_BUFFER_LENGTH) {
878 			pr_debug("Error: Buffer overrun\n");
879 			return -ERANGE;
880 		}
881 		cmd->cmd[cmd->pos++] = 0;
882 	}
883 	hdr->pkt.length = cpu_to_be32(cmd->pos - sizeof(hdr->cp) -
884 				      sizeof(hdr->pkt));
885 	hdr->cp.length = cpu_to_be32(cmd->pos - sizeof(hdr->cp));
886 
887 	return 0;
888 }
889 
890 static const struct opal_resp_tok *response_get_token(
891 				const struct parsed_resp *resp,
892 				int n)
893 {
894 	const struct opal_resp_tok *tok;
895 
896 	if (!resp) {
897 		pr_debug("Response is NULL\n");
898 		return ERR_PTR(-EINVAL);
899 	}
900 
901 	if (n >= resp->num) {
902 		pr_debug("Token number doesn't exist: %d, resp: %d\n",
903 			 n, resp->num);
904 		return ERR_PTR(-EINVAL);
905 	}
906 
907 	tok = &resp->toks[n];
908 	if (tok->len == 0) {
909 		pr_debug("Token length must be non-zero\n");
910 		return ERR_PTR(-EINVAL);
911 	}
912 
913 	return tok;
914 }
915 
916 static ssize_t response_parse_tiny(struct opal_resp_tok *tok,
917 				   const u8 *pos)
918 {
919 	tok->pos = pos;
920 	tok->len = 1;
921 	tok->width = OPAL_WIDTH_TINY;
922 
923 	if (pos[0] & TINY_ATOM_SIGNED) {
924 		tok->type = OPAL_DTA_TOKENID_SINT;
925 	} else {
926 		tok->type = OPAL_DTA_TOKENID_UINT;
927 		tok->stored.u = pos[0] & 0x3f;
928 	}
929 
930 	return tok->len;
931 }
932 
933 static ssize_t response_parse_short(struct opal_resp_tok *tok,
934 				    const u8 *pos)
935 {
936 	tok->pos = pos;
937 	tok->len = (pos[0] & SHORT_ATOM_LEN_MASK) + 1;
938 	tok->width = OPAL_WIDTH_SHORT;
939 
940 	if (pos[0] & SHORT_ATOM_BYTESTRING) {
941 		tok->type = OPAL_DTA_TOKENID_BYTESTRING;
942 	} else if (pos[0] & SHORT_ATOM_SIGNED) {
943 		tok->type = OPAL_DTA_TOKENID_SINT;
944 	} else {
945 		u64 u_integer = 0;
946 		ssize_t i, b = 0;
947 
948 		tok->type = OPAL_DTA_TOKENID_UINT;
949 		if (tok->len > 9) {
950 			pr_debug("uint64 with more than 8 bytes\n");
951 			return -EINVAL;
952 		}
953 		for (i = tok->len - 1; i > 0; i--) {
954 			u_integer |= ((u64)pos[i] << (8 * b));
955 			b++;
956 		}
957 		tok->stored.u = u_integer;
958 	}
959 
960 	return tok->len;
961 }
962 
963 static ssize_t response_parse_medium(struct opal_resp_tok *tok,
964 				     const u8 *pos)
965 {
966 	tok->pos = pos;
967 	tok->len = (((pos[0] & MEDIUM_ATOM_LEN_MASK) << 8) | pos[1]) + 2;
968 	tok->width = OPAL_WIDTH_MEDIUM;
969 
970 	if (pos[0] & MEDIUM_ATOM_BYTESTRING)
971 		tok->type = OPAL_DTA_TOKENID_BYTESTRING;
972 	else if (pos[0] & MEDIUM_ATOM_SIGNED)
973 		tok->type = OPAL_DTA_TOKENID_SINT;
974 	else
975 		tok->type = OPAL_DTA_TOKENID_UINT;
976 
977 	return tok->len;
978 }
979 
980 static ssize_t response_parse_long(struct opal_resp_tok *tok,
981 				   const u8 *pos)
982 {
983 	tok->pos = pos;
984 	tok->len = ((pos[1] << 16) | (pos[2] << 8) | pos[3]) + 4;
985 	tok->width = OPAL_WIDTH_LONG;
986 
987 	if (pos[0] & LONG_ATOM_BYTESTRING)
988 		tok->type = OPAL_DTA_TOKENID_BYTESTRING;
989 	else if (pos[0] & LONG_ATOM_SIGNED)
990 		tok->type = OPAL_DTA_TOKENID_SINT;
991 	else
992 		tok->type = OPAL_DTA_TOKENID_UINT;
993 
994 	return tok->len;
995 }
996 
997 static ssize_t response_parse_token(struct opal_resp_tok *tok,
998 				    const u8 *pos)
999 {
1000 	tok->pos = pos;
1001 	tok->len = 1;
1002 	tok->type = OPAL_DTA_TOKENID_TOKEN;
1003 	tok->width = OPAL_WIDTH_TOKEN;
1004 
1005 	return tok->len;
1006 }
1007 
1008 static int response_parse(const u8 *buf, size_t length,
1009 			  struct parsed_resp *resp)
1010 {
1011 	const struct opal_header *hdr;
1012 	struct opal_resp_tok *iter;
1013 	int num_entries = 0;
1014 	int total;
1015 	ssize_t token_length;
1016 	const u8 *pos;
1017 	u32 clen, plen, slen;
1018 
1019 	if (!buf)
1020 		return -EFAULT;
1021 
1022 	if (!resp)
1023 		return -EFAULT;
1024 
1025 	hdr = (struct opal_header *)buf;
1026 	pos = buf;
1027 	pos += sizeof(*hdr);
1028 
1029 	clen = be32_to_cpu(hdr->cp.length);
1030 	plen = be32_to_cpu(hdr->pkt.length);
1031 	slen = be32_to_cpu(hdr->subpkt.length);
1032 	pr_debug("Response size: cp: %u, pkt: %u, subpkt: %u\n",
1033 		 clen, plen, slen);
1034 
1035 	if (clen == 0 || plen == 0 || slen == 0 ||
1036 	    slen > IO_BUFFER_LENGTH - sizeof(*hdr)) {
1037 		pr_debug("Bad header length. cp: %u, pkt: %u, subpkt: %u\n",
1038 			 clen, plen, slen);
1039 		print_buffer(pos, sizeof(*hdr));
1040 		return -EINVAL;
1041 	}
1042 
1043 	if (pos > buf + length)
1044 		return -EFAULT;
1045 
1046 	iter = resp->toks;
1047 	total = slen;
1048 	print_buffer(pos, total);
1049 	while (total > 0) {
1050 		if (pos[0] <= TINY_ATOM_BYTE) /* tiny atom */
1051 			token_length = response_parse_tiny(iter, pos);
1052 		else if (pos[0] <= SHORT_ATOM_BYTE) /* short atom */
1053 			token_length = response_parse_short(iter, pos);
1054 		else if (pos[0] <= MEDIUM_ATOM_BYTE) /* medium atom */
1055 			token_length = response_parse_medium(iter, pos);
1056 		else if (pos[0] <= LONG_ATOM_BYTE) /* long atom */
1057 			token_length = response_parse_long(iter, pos);
1058 		else /* TOKEN */
1059 			token_length = response_parse_token(iter, pos);
1060 
1061 		if (token_length < 0)
1062 			return token_length;
1063 
1064 		pos += token_length;
1065 		total -= token_length;
1066 		iter++;
1067 		num_entries++;
1068 	}
1069 
1070 	resp->num = num_entries;
1071 
1072 	return 0;
1073 }
1074 
1075 static size_t response_get_string(const struct parsed_resp *resp, int n,
1076 				  const char **store)
1077 {
1078 	u8 skip;
1079 	const struct opal_resp_tok *tok;
1080 
1081 	*store = NULL;
1082 	tok = response_get_token(resp, n);
1083 	if (IS_ERR(tok))
1084 		return 0;
1085 
1086 	if (tok->type != OPAL_DTA_TOKENID_BYTESTRING) {
1087 		pr_debug("Token is not a byte string!\n");
1088 		return 0;
1089 	}
1090 
1091 	switch (tok->width) {
1092 	case OPAL_WIDTH_TINY:
1093 	case OPAL_WIDTH_SHORT:
1094 		skip = 1;
1095 		break;
1096 	case OPAL_WIDTH_MEDIUM:
1097 		skip = 2;
1098 		break;
1099 	case OPAL_WIDTH_LONG:
1100 		skip = 4;
1101 		break;
1102 	default:
1103 		pr_debug("Token has invalid width!\n");
1104 		return 0;
1105 	}
1106 
1107 	*store = tok->pos + skip;
1108 
1109 	return tok->len - skip;
1110 }
1111 
1112 static u64 response_get_u64(const struct parsed_resp *resp, int n)
1113 {
1114 	const struct opal_resp_tok *tok;
1115 
1116 	tok = response_get_token(resp, n);
1117 	if (IS_ERR(tok))
1118 		return 0;
1119 
1120 	if (tok->type != OPAL_DTA_TOKENID_UINT) {
1121 		pr_debug("Token is not unsigned int: %d\n", tok->type);
1122 		return 0;
1123 	}
1124 
1125 	if (tok->width != OPAL_WIDTH_TINY && tok->width != OPAL_WIDTH_SHORT) {
1126 		pr_debug("Atom is not short or tiny: %d\n", tok->width);
1127 		return 0;
1128 	}
1129 
1130 	return tok->stored.u;
1131 }
1132 
1133 static bool response_token_matches(const struct opal_resp_tok *token, u8 match)
1134 {
1135 	if (IS_ERR(token) ||
1136 	    token->type != OPAL_DTA_TOKENID_TOKEN ||
1137 	    token->pos[0] != match)
1138 		return false;
1139 	return true;
1140 }
1141 
1142 static u8 response_status(const struct parsed_resp *resp)
1143 {
1144 	const struct opal_resp_tok *tok;
1145 
1146 	tok = response_get_token(resp, 0);
1147 	if (response_token_matches(tok, OPAL_ENDOFSESSION))
1148 		return 0;
1149 
1150 	if (resp->num < 5)
1151 		return DTAERROR_NO_METHOD_STATUS;
1152 
1153 	tok = response_get_token(resp, resp->num - 5);
1154 	if (!response_token_matches(tok, OPAL_STARTLIST))
1155 		return DTAERROR_NO_METHOD_STATUS;
1156 
1157 	tok = response_get_token(resp, resp->num - 1);
1158 	if (!response_token_matches(tok, OPAL_ENDLIST))
1159 		return DTAERROR_NO_METHOD_STATUS;
1160 
1161 	return response_get_u64(resp, resp->num - 4);
1162 }
1163 
1164 /* Parses and checks for errors */
1165 static int parse_and_check_status(struct opal_dev *dev)
1166 {
1167 	int error;
1168 
1169 	print_buffer(dev->cmd, dev->pos);
1170 
1171 	error = response_parse(dev->resp, IO_BUFFER_LENGTH, &dev->parsed);
1172 	if (error) {
1173 		pr_debug("Couldn't parse response.\n");
1174 		return error;
1175 	}
1176 
1177 	return response_status(&dev->parsed);
1178 }
1179 
1180 static void clear_opal_cmd(struct opal_dev *dev)
1181 {
1182 	dev->pos = sizeof(struct opal_header);
1183 	memset(dev->cmd, 0, IO_BUFFER_LENGTH);
1184 }
1185 
1186 static int cmd_start(struct opal_dev *dev, const u8 *uid, const u8 *method)
1187 {
1188 	int err = 0;
1189 
1190 	clear_opal_cmd(dev);
1191 	set_comid(dev, dev->comid);
1192 
1193 	add_token_u8(&err, dev, OPAL_CALL);
1194 	add_token_bytestring(&err, dev, uid, OPAL_UID_LENGTH);
1195 	add_token_bytestring(&err, dev, method, OPAL_METHOD_LENGTH);
1196 
1197 	/*
1198 	 * Every method call is followed by its parameters enclosed within
1199 	 * OPAL_STARTLIST and OPAL_ENDLIST tokens. We automatically open the
1200 	 * parameter list here and close it later in cmd_finalize.
1201 	 */
1202 	add_token_u8(&err, dev, OPAL_STARTLIST);
1203 
1204 	return err;
1205 }
1206 
1207 static int start_opal_session_cont(struct opal_dev *dev)
1208 {
1209 	u32 hsn, tsn;
1210 	int error = 0;
1211 
1212 	error = parse_and_check_status(dev);
1213 	if (error)
1214 		return error;
1215 
1216 	hsn = response_get_u64(&dev->parsed, 4);
1217 	tsn = response_get_u64(&dev->parsed, 5);
1218 
1219 	if (hsn != GENERIC_HOST_SESSION_NUM || tsn < FIRST_TPER_SESSION_NUM) {
1220 		pr_debug("Couldn't authenticate session\n");
1221 		return -EPERM;
1222 	}
1223 
1224 	dev->hsn = hsn;
1225 	dev->tsn = tsn;
1226 
1227 	return 0;
1228 }
1229 
1230 static void add_suspend_info(struct opal_dev *dev,
1231 			     struct opal_suspend_data *sus)
1232 {
1233 	struct opal_suspend_data *iter;
1234 
1235 	list_for_each_entry(iter, &dev->unlk_lst, node) {
1236 		if (iter->lr == sus->lr) {
1237 			list_del(&iter->node);
1238 			kfree(iter);
1239 			break;
1240 		}
1241 	}
1242 	list_add_tail(&sus->node, &dev->unlk_lst);
1243 }
1244 
1245 static int end_session_cont(struct opal_dev *dev)
1246 {
1247 	dev->hsn = 0;
1248 	dev->tsn = 0;
1249 
1250 	return parse_and_check_status(dev);
1251 }
1252 
1253 static int finalize_and_send(struct opal_dev *dev, cont_fn cont)
1254 {
1255 	int ret;
1256 
1257 	ret = cmd_finalize(dev, dev->hsn, dev->tsn);
1258 	if (ret) {
1259 		pr_debug("Error finalizing command buffer: %d\n", ret);
1260 		return ret;
1261 	}
1262 
1263 	print_buffer(dev->cmd, dev->pos);
1264 
1265 	return opal_send_recv(dev, cont);
1266 }
1267 
1268 static int generic_get_columns(struct opal_dev *dev, const u8 *table,
1269 			       u64 start_column, u64 end_column)
1270 {
1271 	int err;
1272 
1273 	err = cmd_start(dev, table, opalmethod[OPAL_GET]);
1274 
1275 	add_token_u8(&err, dev, OPAL_STARTLIST);
1276 
1277 	add_token_u8(&err, dev, OPAL_STARTNAME);
1278 	add_token_u8(&err, dev, OPAL_STARTCOLUMN);
1279 	add_token_u64(&err, dev, start_column);
1280 	add_token_u8(&err, dev, OPAL_ENDNAME);
1281 
1282 	add_token_u8(&err, dev, OPAL_STARTNAME);
1283 	add_token_u8(&err, dev, OPAL_ENDCOLUMN);
1284 	add_token_u64(&err, dev, end_column);
1285 	add_token_u8(&err, dev, OPAL_ENDNAME);
1286 
1287 	add_token_u8(&err, dev, OPAL_ENDLIST);
1288 
1289 	if (err)
1290 		return err;
1291 
1292 	return finalize_and_send(dev, parse_and_check_status);
1293 }
1294 
1295 /*
1296  * request @column from table @table on device @dev. On success, the column
1297  * data will be available in dev->resp->tok[4]
1298  */
1299 static int generic_get_column(struct opal_dev *dev, const u8 *table,
1300 			      u64 column)
1301 {
1302 	return generic_get_columns(dev, table, column, column);
1303 }
1304 
1305 /*
1306  * see TCG SAS 5.3.2.3 for a description of the available columns
1307  *
1308  * the result is provided in dev->resp->tok[4]
1309  */
1310 static int generic_get_table_info(struct opal_dev *dev, const u8 *table_uid,
1311 				  u64 column)
1312 {
1313 	u8 uid[OPAL_UID_LENGTH];
1314 	const unsigned int half = OPAL_UID_LENGTH_HALF;
1315 
1316 	/* sed-opal UIDs can be split in two halves:
1317 	 *  first:  actual table index
1318 	 *  second: relative index in the table
1319 	 * so we have to get the first half of the OPAL_TABLE_TABLE and use the
1320 	 * first part of the target table as relative index into that table
1321 	 */
1322 	memcpy(uid, opaluid[OPAL_TABLE_TABLE], half);
1323 	memcpy(uid + half, table_uid, half);
1324 
1325 	return generic_get_column(dev, uid, column);
1326 }
1327 
1328 static int gen_key(struct opal_dev *dev, void *data)
1329 {
1330 	u8 uid[OPAL_UID_LENGTH];
1331 	int err;
1332 
1333 	memcpy(uid, dev->prev_data, min(sizeof(uid), dev->prev_d_len));
1334 	kfree(dev->prev_data);
1335 	dev->prev_data = NULL;
1336 
1337 	err = cmd_start(dev, uid, opalmethod[OPAL_GENKEY]);
1338 
1339 	if (err) {
1340 		pr_debug("Error building gen key command\n");
1341 		return err;
1342 
1343 	}
1344 
1345 	return finalize_and_send(dev, parse_and_check_status);
1346 }
1347 
1348 static int get_active_key_cont(struct opal_dev *dev)
1349 {
1350 	const char *activekey;
1351 	size_t keylen;
1352 	int error = 0;
1353 
1354 	error = parse_and_check_status(dev);
1355 	if (error)
1356 		return error;
1357 
1358 	keylen = response_get_string(&dev->parsed, 4, &activekey);
1359 	if (!activekey) {
1360 		pr_debug("%s: Couldn't extract the Activekey from the response\n",
1361 			 __func__);
1362 		return OPAL_INVAL_PARAM;
1363 	}
1364 
1365 	dev->prev_data = kmemdup(activekey, keylen, GFP_KERNEL);
1366 
1367 	if (!dev->prev_data)
1368 		return -ENOMEM;
1369 
1370 	dev->prev_d_len = keylen;
1371 
1372 	return 0;
1373 }
1374 
1375 static int get_active_key(struct opal_dev *dev, void *data)
1376 {
1377 	u8 uid[OPAL_UID_LENGTH];
1378 	int err;
1379 	u8 *lr = data;
1380 
1381 	err = build_locking_range(uid, sizeof(uid), *lr);
1382 	if (err)
1383 		return err;
1384 
1385 	err = generic_get_column(dev, uid, OPAL_ACTIVEKEY);
1386 	if (err)
1387 		return err;
1388 
1389 	return get_active_key_cont(dev);
1390 }
1391 
1392 static int generic_table_write_data(struct opal_dev *dev, const u64 data,
1393 				    u64 offset, u64 size, const u8 *uid)
1394 {
1395 	const u8 __user *src = (u8 __user *)(uintptr_t)data;
1396 	u8 *dst;
1397 	u64 len;
1398 	size_t off = 0;
1399 	int err;
1400 
1401 	/* do we fit in the available space? */
1402 	err = generic_get_table_info(dev, uid, OPAL_TABLE_ROWS);
1403 	if (err) {
1404 		pr_debug("Couldn't get the table size\n");
1405 		return err;
1406 	}
1407 
1408 	len = response_get_u64(&dev->parsed, 4);
1409 	if (size > len || offset > len - size) {
1410 		pr_debug("Does not fit in the table (%llu vs. %llu)\n",
1411 			  offset + size, len);
1412 		return -ENOSPC;
1413 	}
1414 
1415 	/* do the actual transmission(s) */
1416 	while (off < size) {
1417 		err = cmd_start(dev, uid, opalmethod[OPAL_SET]);
1418 		add_token_u8(&err, dev, OPAL_STARTNAME);
1419 		add_token_u8(&err, dev, OPAL_WHERE);
1420 		add_token_u64(&err, dev, offset + off);
1421 		add_token_u8(&err, dev, OPAL_ENDNAME);
1422 
1423 		add_token_u8(&err, dev, OPAL_STARTNAME);
1424 		add_token_u8(&err, dev, OPAL_VALUES);
1425 
1426 		/*
1427 		 * The bytestring header is either 1 or 2 bytes, so assume 2.
1428 		 * There also needs to be enough space to accommodate the
1429 		 * trailing OPAL_ENDNAME (1 byte) and tokens added by
1430 		 * cmd_finalize.
1431 		 */
1432 		len = min(remaining_size(dev) - (2+1+CMD_FINALIZE_BYTES_NEEDED),
1433 			  (size_t)(size - off));
1434 		pr_debug("Write bytes %zu+%llu/%llu\n", off, len, size);
1435 
1436 		dst = add_bytestring_header(&err, dev, len);
1437 		if (!dst)
1438 			break;
1439 
1440 		if (copy_from_user(dst, src + off, len)) {
1441 			err = -EFAULT;
1442 			break;
1443 		}
1444 
1445 		dev->pos += len;
1446 
1447 		add_token_u8(&err, dev, OPAL_ENDNAME);
1448 		if (err)
1449 			break;
1450 
1451 		err = finalize_and_send(dev, parse_and_check_status);
1452 		if (err)
1453 			break;
1454 
1455 		off += len;
1456 	}
1457 
1458 	return err;
1459 }
1460 
1461 static int generic_lr_enable_disable(struct opal_dev *dev,
1462 				     u8 *uid, bool rle, bool wle,
1463 				     bool rl, bool wl)
1464 {
1465 	int err;
1466 
1467 	err = cmd_start(dev, uid, opalmethod[OPAL_SET]);
1468 
1469 	add_token_u8(&err, dev, OPAL_STARTNAME);
1470 	add_token_u8(&err, dev, OPAL_VALUES);
1471 	add_token_u8(&err, dev, OPAL_STARTLIST);
1472 
1473 	add_token_u8(&err, dev, OPAL_STARTNAME);
1474 	add_token_u8(&err, dev, OPAL_READLOCKENABLED);
1475 	add_token_u8(&err, dev, rle);
1476 	add_token_u8(&err, dev, OPAL_ENDNAME);
1477 
1478 	add_token_u8(&err, dev, OPAL_STARTNAME);
1479 	add_token_u8(&err, dev, OPAL_WRITELOCKENABLED);
1480 	add_token_u8(&err, dev, wle);
1481 	add_token_u8(&err, dev, OPAL_ENDNAME);
1482 
1483 	add_token_u8(&err, dev, OPAL_STARTNAME);
1484 	add_token_u8(&err, dev, OPAL_READLOCKED);
1485 	add_token_u8(&err, dev, rl);
1486 	add_token_u8(&err, dev, OPAL_ENDNAME);
1487 
1488 	add_token_u8(&err, dev, OPAL_STARTNAME);
1489 	add_token_u8(&err, dev, OPAL_WRITELOCKED);
1490 	add_token_u8(&err, dev, wl);
1491 	add_token_u8(&err, dev, OPAL_ENDNAME);
1492 
1493 	add_token_u8(&err, dev, OPAL_ENDLIST);
1494 	add_token_u8(&err, dev, OPAL_ENDNAME);
1495 
1496 	return err;
1497 }
1498 
1499 static inline int enable_global_lr(struct opal_dev *dev, u8 *uid,
1500 				   struct opal_user_lr_setup *setup)
1501 {
1502 	int err;
1503 
1504 	err = generic_lr_enable_disable(dev, uid, !!setup->RLE, !!setup->WLE,
1505 					0, 0);
1506 	if (err)
1507 		pr_debug("Failed to create enable global lr command\n");
1508 
1509 	return err;
1510 }
1511 
1512 static int setup_locking_range(struct opal_dev *dev, void *data)
1513 {
1514 	u8 uid[OPAL_UID_LENGTH];
1515 	struct opal_user_lr_setup *setup = data;
1516 	u8 lr;
1517 	int err;
1518 
1519 	lr = setup->session.opal_key.lr;
1520 	err = build_locking_range(uid, sizeof(uid), lr);
1521 	if (err)
1522 		return err;
1523 
1524 	if (lr == 0)
1525 		err = enable_global_lr(dev, uid, setup);
1526 	else {
1527 		err = cmd_start(dev, uid, opalmethod[OPAL_SET]);
1528 
1529 		add_token_u8(&err, dev, OPAL_STARTNAME);
1530 		add_token_u8(&err, dev, OPAL_VALUES);
1531 		add_token_u8(&err, dev, OPAL_STARTLIST);
1532 
1533 		add_token_u8(&err, dev, OPAL_STARTNAME);
1534 		add_token_u8(&err, dev, OPAL_RANGESTART);
1535 		add_token_u64(&err, dev, setup->range_start);
1536 		add_token_u8(&err, dev, OPAL_ENDNAME);
1537 
1538 		add_token_u8(&err, dev, OPAL_STARTNAME);
1539 		add_token_u8(&err, dev, OPAL_RANGELENGTH);
1540 		add_token_u64(&err, dev, setup->range_length);
1541 		add_token_u8(&err, dev, OPAL_ENDNAME);
1542 
1543 		add_token_u8(&err, dev, OPAL_STARTNAME);
1544 		add_token_u8(&err, dev, OPAL_READLOCKENABLED);
1545 		add_token_u64(&err, dev, !!setup->RLE);
1546 		add_token_u8(&err, dev, OPAL_ENDNAME);
1547 
1548 		add_token_u8(&err, dev, OPAL_STARTNAME);
1549 		add_token_u8(&err, dev, OPAL_WRITELOCKENABLED);
1550 		add_token_u64(&err, dev, !!setup->WLE);
1551 		add_token_u8(&err, dev, OPAL_ENDNAME);
1552 
1553 		add_token_u8(&err, dev, OPAL_ENDLIST);
1554 		add_token_u8(&err, dev, OPAL_ENDNAME);
1555 	}
1556 	if (err) {
1557 		pr_debug("Error building Setup Locking range command.\n");
1558 		return err;
1559 	}
1560 
1561 	return finalize_and_send(dev, parse_and_check_status);
1562 }
1563 
1564 static int response_get_column(const struct parsed_resp *resp,
1565 			       int *iter,
1566 			       u8 column,
1567 			       u64 *value)
1568 {
1569 	const struct opal_resp_tok *tok;
1570 	int n = *iter;
1571 	u64 val;
1572 
1573 	tok = response_get_token(resp, n);
1574 	if (IS_ERR(tok))
1575 		return PTR_ERR(tok);
1576 
1577 	if (!response_token_matches(tok, OPAL_STARTNAME)) {
1578 		pr_debug("Unexpected response token type %d.\n", n);
1579 		return OPAL_INVAL_PARAM;
1580 	}
1581 	n++;
1582 
1583 	if (response_get_u64(resp, n) != column) {
1584 		pr_debug("Token %d does not match expected column %u.\n",
1585 			 n, column);
1586 		return OPAL_INVAL_PARAM;
1587 	}
1588 	n++;
1589 
1590 	val = response_get_u64(resp, n);
1591 	n++;
1592 
1593 	tok = response_get_token(resp, n);
1594 	if (IS_ERR(tok))
1595 		return PTR_ERR(tok);
1596 
1597 	if (!response_token_matches(tok, OPAL_ENDNAME)) {
1598 		pr_debug("Unexpected response token type %d.\n", n);
1599 		return OPAL_INVAL_PARAM;
1600 	}
1601 	n++;
1602 
1603 	*value = val;
1604 	*iter = n;
1605 
1606 	return 0;
1607 }
1608 
1609 static int locking_range_status(struct opal_dev *dev, void *data)
1610 {
1611 	u8 lr_buffer[OPAL_UID_LENGTH];
1612 	u64 resp;
1613 	bool rlocked, wlocked;
1614 	int err, tok_n = 2;
1615 	struct opal_lr_status *lrst = data;
1616 
1617 	err = build_locking_range(lr_buffer, sizeof(lr_buffer),
1618 				  lrst->session.opal_key.lr);
1619 	if (err)
1620 		return err;
1621 
1622 	err = generic_get_columns(dev, lr_buffer, OPAL_RANGESTART,
1623 				  OPAL_WRITELOCKED);
1624 	if (err) {
1625 		pr_debug("Couldn't get lr %u table columns %d to %d.\n",
1626 			 lrst->session.opal_key.lr, OPAL_RANGESTART,
1627 			 OPAL_WRITELOCKED);
1628 		return err;
1629 	}
1630 
1631 	/* range start */
1632 	err = response_get_column(&dev->parsed, &tok_n, OPAL_RANGESTART,
1633 				  &lrst->range_start);
1634 	if (err)
1635 		return err;
1636 
1637 	/* range length */
1638 	err = response_get_column(&dev->parsed, &tok_n, OPAL_RANGELENGTH,
1639 				  &lrst->range_length);
1640 	if (err)
1641 		return err;
1642 
1643 	/* RLE */
1644 	err = response_get_column(&dev->parsed, &tok_n, OPAL_READLOCKENABLED,
1645 				  &resp);
1646 	if (err)
1647 		return err;
1648 
1649 	lrst->RLE = !!resp;
1650 
1651 	/* WLE */
1652 	err = response_get_column(&dev->parsed, &tok_n, OPAL_WRITELOCKENABLED,
1653 				  &resp);
1654 	if (err)
1655 		return err;
1656 
1657 	lrst->WLE = !!resp;
1658 
1659 	/* read locked */
1660 	err = response_get_column(&dev->parsed, &tok_n, OPAL_READLOCKED, &resp);
1661 	if (err)
1662 		return err;
1663 
1664 	rlocked = !!resp;
1665 
1666 	/* write locked */
1667 	err = response_get_column(&dev->parsed, &tok_n, OPAL_WRITELOCKED, &resp);
1668 	if (err)
1669 		return err;
1670 
1671 	wlocked = !!resp;
1672 
1673 	/* opal_lock_state can not map 'read locked' only state. */
1674 	lrst->l_state = OPAL_RW;
1675 	if (rlocked && wlocked)
1676 		lrst->l_state = OPAL_LK;
1677 	else if (wlocked)
1678 		lrst->l_state = OPAL_RO;
1679 	else if (rlocked) {
1680 		pr_debug("Can not report read locked only state.\n");
1681 		return -EINVAL;
1682 	}
1683 
1684 	return 0;
1685 }
1686 
1687 static int start_generic_opal_session(struct opal_dev *dev,
1688 				      enum opal_uid auth,
1689 				      enum opal_uid sp_type,
1690 				      const char *key,
1691 				      u8 key_len)
1692 {
1693 	u32 hsn;
1694 	int err;
1695 
1696 	if (key == NULL && auth != OPAL_ANYBODY_UID)
1697 		return OPAL_INVAL_PARAM;
1698 
1699 	hsn = GENERIC_HOST_SESSION_NUM;
1700 	err = cmd_start(dev, opaluid[OPAL_SMUID_UID],
1701 			opalmethod[OPAL_STARTSESSION]);
1702 
1703 	add_token_u64(&err, dev, hsn);
1704 	add_token_bytestring(&err, dev, opaluid[sp_type], OPAL_UID_LENGTH);
1705 	add_token_u8(&err, dev, 1);
1706 
1707 	switch (auth) {
1708 	case OPAL_ANYBODY_UID:
1709 		break;
1710 	case OPAL_ADMIN1_UID:
1711 	case OPAL_SID_UID:
1712 	case OPAL_PSID_UID:
1713 		add_token_u8(&err, dev, OPAL_STARTNAME);
1714 		add_token_u8(&err, dev, 0); /* HostChallenge */
1715 		add_token_bytestring(&err, dev, key, key_len);
1716 		add_token_u8(&err, dev, OPAL_ENDNAME);
1717 		add_token_u8(&err, dev, OPAL_STARTNAME);
1718 		add_token_u8(&err, dev, 3); /* HostSignAuth */
1719 		add_token_bytestring(&err, dev, opaluid[auth],
1720 				     OPAL_UID_LENGTH);
1721 		add_token_u8(&err, dev, OPAL_ENDNAME);
1722 		break;
1723 	default:
1724 		pr_debug("Cannot start Admin SP session with auth %d\n", auth);
1725 		return OPAL_INVAL_PARAM;
1726 	}
1727 
1728 	if (err) {
1729 		pr_debug("Error building start adminsp session command.\n");
1730 		return err;
1731 	}
1732 
1733 	return finalize_and_send(dev, start_opal_session_cont);
1734 }
1735 
1736 static int start_anybodyASP_opal_session(struct opal_dev *dev, void *data)
1737 {
1738 	return start_generic_opal_session(dev, OPAL_ANYBODY_UID,
1739 					  OPAL_ADMINSP_UID, NULL, 0);
1740 }
1741 
1742 static int start_SIDASP_opal_session(struct opal_dev *dev, void *data)
1743 {
1744 	int ret;
1745 	const u8 *key = dev->prev_data;
1746 
1747 	if (!key) {
1748 		const struct opal_key *okey = data;
1749 
1750 		ret = start_generic_opal_session(dev, OPAL_SID_UID,
1751 						 OPAL_ADMINSP_UID,
1752 						 okey->key,
1753 						 okey->key_len);
1754 	} else {
1755 		ret = start_generic_opal_session(dev, OPAL_SID_UID,
1756 						 OPAL_ADMINSP_UID,
1757 						 key, dev->prev_d_len);
1758 		kfree(key);
1759 		dev->prev_data = NULL;
1760 	}
1761 
1762 	return ret;
1763 }
1764 
1765 static int start_admin1LSP_opal_session(struct opal_dev *dev, void *data)
1766 {
1767 	struct opal_key *key = data;
1768 
1769 	return start_generic_opal_session(dev, OPAL_ADMIN1_UID,
1770 					  OPAL_LOCKINGSP_UID,
1771 					  key->key, key->key_len);
1772 }
1773 
1774 static int start_PSID_opal_session(struct opal_dev *dev, void *data)
1775 {
1776 	const struct opal_key *okey = data;
1777 
1778 	return start_generic_opal_session(dev, OPAL_PSID_UID,
1779 					  OPAL_ADMINSP_UID,
1780 					  okey->key,
1781 					  okey->key_len);
1782 }
1783 
1784 static int start_auth_opal_session(struct opal_dev *dev, void *data)
1785 {
1786 	struct opal_session_info *session = data;
1787 	u8 lk_ul_user[OPAL_UID_LENGTH];
1788 	size_t keylen = session->opal_key.key_len;
1789 	int err = 0;
1790 
1791 	u8 *key = session->opal_key.key;
1792 	u32 hsn = GENERIC_HOST_SESSION_NUM;
1793 
1794 	if (session->sum)
1795 		err = build_locking_user(lk_ul_user, sizeof(lk_ul_user),
1796 					 session->opal_key.lr);
1797 	else if (session->who != OPAL_ADMIN1 && !session->sum)
1798 		err = build_locking_user(lk_ul_user, sizeof(lk_ul_user),
1799 					 session->who - 1);
1800 	else
1801 		memcpy(lk_ul_user, opaluid[OPAL_ADMIN1_UID], OPAL_UID_LENGTH);
1802 
1803 	if (err)
1804 		return err;
1805 
1806 	err = cmd_start(dev, opaluid[OPAL_SMUID_UID],
1807 			opalmethod[OPAL_STARTSESSION]);
1808 
1809 	add_token_u64(&err, dev, hsn);
1810 	add_token_bytestring(&err, dev, opaluid[OPAL_LOCKINGSP_UID],
1811 			     OPAL_UID_LENGTH);
1812 	add_token_u8(&err, dev, 1);
1813 	add_token_u8(&err, dev, OPAL_STARTNAME);
1814 	add_token_u8(&err, dev, 0);
1815 	add_token_bytestring(&err, dev, key, keylen);
1816 	add_token_u8(&err, dev, OPAL_ENDNAME);
1817 	add_token_u8(&err, dev, OPAL_STARTNAME);
1818 	add_token_u8(&err, dev, 3);
1819 	add_token_bytestring(&err, dev, lk_ul_user, OPAL_UID_LENGTH);
1820 	add_token_u8(&err, dev, OPAL_ENDNAME);
1821 
1822 	if (err) {
1823 		pr_debug("Error building STARTSESSION command.\n");
1824 		return err;
1825 	}
1826 
1827 	return finalize_and_send(dev, start_opal_session_cont);
1828 }
1829 
1830 static int revert_tper(struct opal_dev *dev, void *data)
1831 {
1832 	int err;
1833 
1834 	err = cmd_start(dev, opaluid[OPAL_ADMINSP_UID],
1835 			opalmethod[OPAL_REVERT]);
1836 	if (err) {
1837 		pr_debug("Error building REVERT TPER command.\n");
1838 		return err;
1839 	}
1840 
1841 	return finalize_and_send(dev, parse_and_check_status);
1842 }
1843 
1844 static int internal_activate_user(struct opal_dev *dev, void *data)
1845 {
1846 	struct opal_session_info *session = data;
1847 	u8 uid[OPAL_UID_LENGTH];
1848 	int err;
1849 
1850 	memcpy(uid, opaluid[OPAL_USER1_UID], OPAL_UID_LENGTH);
1851 	uid[7] = session->who;
1852 
1853 	err = cmd_start(dev, uid, opalmethod[OPAL_SET]);
1854 	add_token_u8(&err, dev, OPAL_STARTNAME);
1855 	add_token_u8(&err, dev, OPAL_VALUES);
1856 	add_token_u8(&err, dev, OPAL_STARTLIST);
1857 	add_token_u8(&err, dev, OPAL_STARTNAME);
1858 	add_token_u8(&err, dev, 5); /* Enabled */
1859 	add_token_u8(&err, dev, OPAL_TRUE);
1860 	add_token_u8(&err, dev, OPAL_ENDNAME);
1861 	add_token_u8(&err, dev, OPAL_ENDLIST);
1862 	add_token_u8(&err, dev, OPAL_ENDNAME);
1863 
1864 	if (err) {
1865 		pr_debug("Error building Activate UserN command.\n");
1866 		return err;
1867 	}
1868 
1869 	return finalize_and_send(dev, parse_and_check_status);
1870 }
1871 
1872 static int revert_lsp(struct opal_dev *dev, void *data)
1873 {
1874 	struct opal_revert_lsp *rev = data;
1875 	int err;
1876 
1877 	err = cmd_start(dev, opaluid[OPAL_THISSP_UID],
1878 			opalmethod[OPAL_REVERTSP]);
1879 	add_token_u8(&err, dev, OPAL_STARTNAME);
1880 	add_token_u64(&err, dev, OPAL_KEEP_GLOBAL_RANGE_KEY);
1881 	add_token_u8(&err, dev, (rev->options & OPAL_PRESERVE) ?
1882 			OPAL_TRUE : OPAL_FALSE);
1883 	add_token_u8(&err, dev, OPAL_ENDNAME);
1884 	if (err) {
1885 		pr_debug("Error building REVERT SP command.\n");
1886 		return err;
1887 	}
1888 
1889 	return finalize_and_send(dev, parse_and_check_status);
1890 }
1891 
1892 static int erase_locking_range(struct opal_dev *dev, void *data)
1893 {
1894 	struct opal_session_info *session = data;
1895 	u8 uid[OPAL_UID_LENGTH];
1896 	int err;
1897 
1898 	if (build_locking_range(uid, sizeof(uid), session->opal_key.lr) < 0)
1899 		return -ERANGE;
1900 
1901 	err = cmd_start(dev, uid, opalmethod[OPAL_ERASE]);
1902 
1903 	if (err) {
1904 		pr_debug("Error building Erase Locking Range Command.\n");
1905 		return err;
1906 	}
1907 
1908 	return finalize_and_send(dev, parse_and_check_status);
1909 }
1910 
1911 static int set_mbr_done(struct opal_dev *dev, void *data)
1912 {
1913 	u8 *mbr_done_tf = data;
1914 	int err;
1915 
1916 	err = cmd_start(dev, opaluid[OPAL_MBRCONTROL],
1917 			opalmethod[OPAL_SET]);
1918 
1919 	add_token_u8(&err, dev, OPAL_STARTNAME);
1920 	add_token_u8(&err, dev, OPAL_VALUES);
1921 	add_token_u8(&err, dev, OPAL_STARTLIST);
1922 	add_token_u8(&err, dev, OPAL_STARTNAME);
1923 	add_token_u8(&err, dev, OPAL_MBRDONE);
1924 	add_token_u8(&err, dev, *mbr_done_tf); /* Done T or F */
1925 	add_token_u8(&err, dev, OPAL_ENDNAME);
1926 	add_token_u8(&err, dev, OPAL_ENDLIST);
1927 	add_token_u8(&err, dev, OPAL_ENDNAME);
1928 
1929 	if (err) {
1930 		pr_debug("Error Building set MBR Done command\n");
1931 		return err;
1932 	}
1933 
1934 	return finalize_and_send(dev, parse_and_check_status);
1935 }
1936 
1937 static int set_mbr_enable_disable(struct opal_dev *dev, void *data)
1938 {
1939 	u8 *mbr_en_dis = data;
1940 	int err;
1941 
1942 	err = cmd_start(dev, opaluid[OPAL_MBRCONTROL],
1943 			opalmethod[OPAL_SET]);
1944 
1945 	add_token_u8(&err, dev, OPAL_STARTNAME);
1946 	add_token_u8(&err, dev, OPAL_VALUES);
1947 	add_token_u8(&err, dev, OPAL_STARTLIST);
1948 	add_token_u8(&err, dev, OPAL_STARTNAME);
1949 	add_token_u8(&err, dev, OPAL_MBRENABLE);
1950 	add_token_u8(&err, dev, *mbr_en_dis);
1951 	add_token_u8(&err, dev, OPAL_ENDNAME);
1952 	add_token_u8(&err, dev, OPAL_ENDLIST);
1953 	add_token_u8(&err, dev, OPAL_ENDNAME);
1954 
1955 	if (err) {
1956 		pr_debug("Error Building set MBR done command\n");
1957 		return err;
1958 	}
1959 
1960 	return finalize_and_send(dev, parse_and_check_status);
1961 }
1962 
1963 static int write_shadow_mbr(struct opal_dev *dev, void *data)
1964 {
1965 	struct opal_shadow_mbr *shadow = data;
1966 
1967 	return generic_table_write_data(dev, shadow->data, shadow->offset,
1968 					shadow->size, opaluid[OPAL_MBR]);
1969 }
1970 
1971 static int generic_pw_cmd(u8 *key, size_t key_len, u8 *cpin_uid,
1972 			  struct opal_dev *dev)
1973 {
1974 	int err;
1975 
1976 	err = cmd_start(dev, cpin_uid, opalmethod[OPAL_SET]);
1977 
1978 	add_token_u8(&err, dev, OPAL_STARTNAME);
1979 	add_token_u8(&err, dev, OPAL_VALUES);
1980 	add_token_u8(&err, dev, OPAL_STARTLIST);
1981 	add_token_u8(&err, dev, OPAL_STARTNAME);
1982 	add_token_u8(&err, dev, OPAL_PIN);
1983 	add_token_bytestring(&err, dev, key, key_len);
1984 	add_token_u8(&err, dev, OPAL_ENDNAME);
1985 	add_token_u8(&err, dev, OPAL_ENDLIST);
1986 	add_token_u8(&err, dev, OPAL_ENDNAME);
1987 
1988 	return err;
1989 }
1990 
1991 static int set_new_pw(struct opal_dev *dev, void *data)
1992 {
1993 	u8 cpin_uid[OPAL_UID_LENGTH];
1994 	struct opal_session_info *usr = data;
1995 
1996 	memcpy(cpin_uid, opaluid[OPAL_C_PIN_ADMIN1], OPAL_UID_LENGTH);
1997 
1998 	if (usr->who != OPAL_ADMIN1) {
1999 		cpin_uid[5] = 0x03;
2000 		if (usr->sum)
2001 			cpin_uid[7] = usr->opal_key.lr + 1;
2002 		else
2003 			cpin_uid[7] = usr->who;
2004 	}
2005 
2006 	if (generic_pw_cmd(usr->opal_key.key, usr->opal_key.key_len,
2007 			   cpin_uid, dev)) {
2008 		pr_debug("Error building set password command.\n");
2009 		return -ERANGE;
2010 	}
2011 
2012 	return finalize_and_send(dev, parse_and_check_status);
2013 }
2014 
2015 static int set_sid_cpin_pin(struct opal_dev *dev, void *data)
2016 {
2017 	u8 cpin_uid[OPAL_UID_LENGTH];
2018 	struct opal_key *key = data;
2019 
2020 	memcpy(cpin_uid, opaluid[OPAL_C_PIN_SID], OPAL_UID_LENGTH);
2021 
2022 	if (generic_pw_cmd(key->key, key->key_len, cpin_uid, dev)) {
2023 		pr_debug("Error building Set SID cpin\n");
2024 		return -ERANGE;
2025 	}
2026 	return finalize_and_send(dev, parse_and_check_status);
2027 }
2028 
2029 static void add_authority_object_ref(int *err,
2030 				     struct opal_dev *dev,
2031 				     const u8 *uid,
2032 				     size_t uid_len)
2033 {
2034 	add_token_u8(err, dev, OPAL_STARTNAME);
2035 	add_token_bytestring(err, dev,
2036 			     opaluid[OPAL_HALF_UID_AUTHORITY_OBJ_REF],
2037 			     OPAL_UID_LENGTH/2);
2038 	add_token_bytestring(err, dev, uid, uid_len);
2039 	add_token_u8(err, dev, OPAL_ENDNAME);
2040 }
2041 
2042 static void add_boolean_object_ref(int *err,
2043 				   struct opal_dev *dev,
2044 				   u8 boolean_op)
2045 {
2046 	add_token_u8(err, dev, OPAL_STARTNAME);
2047 	add_token_bytestring(err, dev, opaluid[OPAL_HALF_UID_BOOLEAN_ACE],
2048 			     OPAL_UID_LENGTH/2);
2049 	add_token_u8(err, dev, boolean_op);
2050 	add_token_u8(err, dev, OPAL_ENDNAME);
2051 }
2052 
2053 static int set_lr_boolean_ace(struct opal_dev *dev,
2054 			      unsigned int opal_uid,
2055 			      u8 lr,
2056 			      const u8 *users,
2057 			      size_t users_len)
2058 {
2059 	u8 lr_buffer[OPAL_UID_LENGTH];
2060 	u8 user_uid[OPAL_UID_LENGTH];
2061 	u8 u;
2062 	int err;
2063 
2064 	memcpy(lr_buffer, opaluid[opal_uid], OPAL_UID_LENGTH);
2065 	lr_buffer[7] = lr;
2066 
2067 	err = cmd_start(dev, lr_buffer, opalmethod[OPAL_SET]);
2068 
2069 	add_token_u8(&err, dev, OPAL_STARTNAME);
2070 	add_token_u8(&err, dev, OPAL_VALUES);
2071 
2072 	add_token_u8(&err, dev, OPAL_STARTLIST);
2073 	add_token_u8(&err, dev, OPAL_STARTNAME);
2074 	add_token_u8(&err, dev, 3);
2075 
2076 	add_token_u8(&err, dev, OPAL_STARTLIST);
2077 
2078 	for (u = 0; u < users_len; u++) {
2079 		if (users[u] == OPAL_ADMIN1)
2080 			memcpy(user_uid, opaluid[OPAL_ADMIN1_UID],
2081 			       OPAL_UID_LENGTH);
2082 		else {
2083 			memcpy(user_uid, opaluid[OPAL_USER1_UID],
2084 			       OPAL_UID_LENGTH);
2085 			user_uid[7] = users[u];
2086 		}
2087 
2088 		add_authority_object_ref(&err, dev, user_uid, sizeof(user_uid));
2089 
2090 		/*
2091 		 * Add boolean operator in postfix only with
2092 		 * two or more authorities being added in ACE
2093 		 * expresion.
2094 		 * */
2095 		if (u > 0)
2096 			add_boolean_object_ref(&err, dev, OPAL_BOOLEAN_OR);
2097 	}
2098 
2099 	add_token_u8(&err, dev, OPAL_ENDLIST);
2100 	add_token_u8(&err, dev, OPAL_ENDNAME);
2101 	add_token_u8(&err, dev, OPAL_ENDLIST);
2102 	add_token_u8(&err, dev, OPAL_ENDNAME);
2103 
2104 	return err;
2105 }
2106 
2107 static int add_user_to_lr(struct opal_dev *dev, void *data)
2108 {
2109 	int err;
2110 	struct opal_lock_unlock *lkul = data;
2111 	const u8 users[] = {
2112 		lkul->session.who
2113 	};
2114 
2115 	err = set_lr_boolean_ace(dev,
2116 				 lkul->l_state == OPAL_RW ?
2117 					OPAL_LOCKINGRANGE_ACE_WRLOCKED :
2118 					OPAL_LOCKINGRANGE_ACE_RDLOCKED,
2119 				 lkul->session.opal_key.lr, users,
2120 				 ARRAY_SIZE(users));
2121 	if (err) {
2122 		pr_debug("Error building add user to locking range command.\n");
2123 		return err;
2124 	}
2125 
2126 	return finalize_and_send(dev, parse_and_check_status);
2127 }
2128 
2129 static int add_user_to_lr_ace(struct opal_dev *dev, void *data)
2130 {
2131 	int err;
2132 	struct opal_lock_unlock *lkul = data;
2133 	const u8 users[] = {
2134 		OPAL_ADMIN1,
2135 		lkul->session.who
2136 	};
2137 
2138 	err = set_lr_boolean_ace(dev, OPAL_LOCKINGRANGE_ACE_START_TO_KEY,
2139 				 lkul->session.opal_key.lr, users,
2140 				 ARRAY_SIZE(users));
2141 
2142 	if (err) {
2143 		pr_debug("Error building add user to locking ranges ACEs.\n");
2144 		return err;
2145 	}
2146 
2147 	return finalize_and_send(dev, parse_and_check_status);
2148 }
2149 
2150 static int lock_unlock_locking_range(struct opal_dev *dev, void *data)
2151 {
2152 	u8 lr_buffer[OPAL_UID_LENGTH];
2153 	struct opal_lock_unlock *lkul = data;
2154 	u8 read_locked = 1, write_locked = 1;
2155 	int err = 0;
2156 
2157 	if (build_locking_range(lr_buffer, sizeof(lr_buffer),
2158 				lkul->session.opal_key.lr) < 0)
2159 		return -ERANGE;
2160 
2161 	switch (lkul->l_state) {
2162 	case OPAL_RO:
2163 		read_locked = 0;
2164 		write_locked = 1;
2165 		break;
2166 	case OPAL_RW:
2167 		read_locked = 0;
2168 		write_locked = 0;
2169 		break;
2170 	case OPAL_LK:
2171 		/* vars are initialized to locked */
2172 		break;
2173 	default:
2174 		pr_debug("Tried to set an invalid locking state... returning to uland\n");
2175 		return OPAL_INVAL_PARAM;
2176 	}
2177 
2178 	err = cmd_start(dev, lr_buffer, opalmethod[OPAL_SET]);
2179 
2180 	add_token_u8(&err, dev, OPAL_STARTNAME);
2181 	add_token_u8(&err, dev, OPAL_VALUES);
2182 	add_token_u8(&err, dev, OPAL_STARTLIST);
2183 
2184 	add_token_u8(&err, dev, OPAL_STARTNAME);
2185 	add_token_u8(&err, dev, OPAL_READLOCKED);
2186 	add_token_u8(&err, dev, read_locked);
2187 	add_token_u8(&err, dev, OPAL_ENDNAME);
2188 
2189 	add_token_u8(&err, dev, OPAL_STARTNAME);
2190 	add_token_u8(&err, dev, OPAL_WRITELOCKED);
2191 	add_token_u8(&err, dev, write_locked);
2192 	add_token_u8(&err, dev, OPAL_ENDNAME);
2193 
2194 	add_token_u8(&err, dev, OPAL_ENDLIST);
2195 	add_token_u8(&err, dev, OPAL_ENDNAME);
2196 
2197 	if (err) {
2198 		pr_debug("Error building SET command.\n");
2199 		return err;
2200 	}
2201 
2202 	return finalize_and_send(dev, parse_and_check_status);
2203 }
2204 
2205 
2206 static int lock_unlock_locking_range_sum(struct opal_dev *dev, void *data)
2207 {
2208 	u8 lr_buffer[OPAL_UID_LENGTH];
2209 	u8 read_locked = 1, write_locked = 1;
2210 	struct opal_lock_unlock *lkul = data;
2211 	int ret;
2212 
2213 	clear_opal_cmd(dev);
2214 	set_comid(dev, dev->comid);
2215 
2216 	if (build_locking_range(lr_buffer, sizeof(lr_buffer),
2217 				lkul->session.opal_key.lr) < 0)
2218 		return -ERANGE;
2219 
2220 	switch (lkul->l_state) {
2221 	case OPAL_RO:
2222 		read_locked = 0;
2223 		write_locked = 1;
2224 		break;
2225 	case OPAL_RW:
2226 		read_locked = 0;
2227 		write_locked = 0;
2228 		break;
2229 	case OPAL_LK:
2230 		/* vars are initialized to locked */
2231 		break;
2232 	default:
2233 		pr_debug("Tried to set an invalid locking state.\n");
2234 		return OPAL_INVAL_PARAM;
2235 	}
2236 	ret = generic_lr_enable_disable(dev, lr_buffer, 1, 1,
2237 					read_locked, write_locked);
2238 
2239 	if (ret < 0) {
2240 		pr_debug("Error building SET command.\n");
2241 		return ret;
2242 	}
2243 
2244 	return finalize_and_send(dev, parse_and_check_status);
2245 }
2246 
2247 static int activate_lsp(struct opal_dev *dev, void *data)
2248 {
2249 	struct opal_lr_act *opal_act = data;
2250 	u8 user_lr[OPAL_UID_LENGTH];
2251 	int err, i;
2252 
2253 	err = cmd_start(dev, opaluid[OPAL_LOCKINGSP_UID],
2254 			opalmethod[OPAL_ACTIVATE]);
2255 
2256 	if (opal_act->sum) {
2257 		err = build_locking_range(user_lr, sizeof(user_lr),
2258 					  opal_act->lr[0]);
2259 		if (err)
2260 			return err;
2261 
2262 		add_token_u8(&err, dev, OPAL_STARTNAME);
2263 		add_token_u64(&err, dev, OPAL_SUM_SET_LIST);
2264 
2265 		add_token_u8(&err, dev, OPAL_STARTLIST);
2266 		add_token_bytestring(&err, dev, user_lr, OPAL_UID_LENGTH);
2267 		for (i = 1; i < opal_act->num_lrs; i++) {
2268 			user_lr[7] = opal_act->lr[i];
2269 			add_token_bytestring(&err, dev, user_lr, OPAL_UID_LENGTH);
2270 		}
2271 		add_token_u8(&err, dev, OPAL_ENDLIST);
2272 		add_token_u8(&err, dev, OPAL_ENDNAME);
2273 	}
2274 
2275 	if (err) {
2276 		pr_debug("Error building Activate LockingSP command.\n");
2277 		return err;
2278 	}
2279 
2280 	return finalize_and_send(dev, parse_and_check_status);
2281 }
2282 
2283 /* Determine if we're in the Manufactured Inactive or Active state */
2284 static int get_lsp_lifecycle(struct opal_dev *dev, void *data)
2285 {
2286 	u8 lc_status;
2287 	int err;
2288 
2289 	err = generic_get_column(dev, opaluid[OPAL_LOCKINGSP_UID],
2290 				 OPAL_LIFECYCLE);
2291 	if (err)
2292 		return err;
2293 
2294 	lc_status = response_get_u64(&dev->parsed, 4);
2295 	/* 0x08 is Manufactured Inactive */
2296 	/* 0x09 is Manufactured */
2297 	if (lc_status != OPAL_MANUFACTURED_INACTIVE) {
2298 		pr_debug("Couldn't determine the status of the Lifecycle state\n");
2299 		return -ENODEV;
2300 	}
2301 
2302 	return 0;
2303 }
2304 
2305 static int get_msid_cpin_pin(struct opal_dev *dev, void *data)
2306 {
2307 	const char *msid_pin;
2308 	size_t strlen;
2309 	int err;
2310 
2311 	err = generic_get_column(dev, opaluid[OPAL_C_PIN_MSID], OPAL_PIN);
2312 	if (err)
2313 		return err;
2314 
2315 	strlen = response_get_string(&dev->parsed, 4, &msid_pin);
2316 	if (!msid_pin) {
2317 		pr_debug("Couldn't extract MSID_CPIN from response\n");
2318 		return OPAL_INVAL_PARAM;
2319 	}
2320 
2321 	dev->prev_data = kmemdup(msid_pin, strlen, GFP_KERNEL);
2322 	if (!dev->prev_data)
2323 		return -ENOMEM;
2324 
2325 	dev->prev_d_len = strlen;
2326 
2327 	return 0;
2328 }
2329 
2330 static int write_table_data(struct opal_dev *dev, void *data)
2331 {
2332 	struct opal_read_write_table *write_tbl = data;
2333 
2334 	return generic_table_write_data(dev, write_tbl->data, write_tbl->offset,
2335 					write_tbl->size, write_tbl->table_uid);
2336 }
2337 
2338 static int read_table_data_cont(struct opal_dev *dev)
2339 {
2340 	int err;
2341 	const char *data_read;
2342 
2343 	err = parse_and_check_status(dev);
2344 	if (err)
2345 		return err;
2346 
2347 	dev->prev_d_len = response_get_string(&dev->parsed, 1, &data_read);
2348 	dev->prev_data = (void *)data_read;
2349 	if (!dev->prev_data) {
2350 		pr_debug("%s: Couldn't read data from the table.\n", __func__);
2351 		return OPAL_INVAL_PARAM;
2352 	}
2353 
2354 	return 0;
2355 }
2356 
2357 /*
2358  * IO_BUFFER_LENGTH = 2048
2359  * sizeof(header) = 56
2360  * No. of Token Bytes in the Response = 11
2361  * MAX size of data that can be carried in response buffer
2362  * at a time is : 2048 - (56 + 11) = 1981 = 0x7BD.
2363  */
2364 #define OPAL_MAX_READ_TABLE (0x7BD)
2365 
2366 static int read_table_data(struct opal_dev *dev, void *data)
2367 {
2368 	struct opal_read_write_table *read_tbl = data;
2369 	int err;
2370 	size_t off = 0, max_read_size = OPAL_MAX_READ_TABLE;
2371 	u64 table_len, len;
2372 	u64 offset = read_tbl->offset, read_size = read_tbl->size - 1;
2373 	u8 __user *dst;
2374 
2375 	err = generic_get_table_info(dev, read_tbl->table_uid, OPAL_TABLE_ROWS);
2376 	if (err) {
2377 		pr_debug("Couldn't get the table size\n");
2378 		return err;
2379 	}
2380 
2381 	table_len = response_get_u64(&dev->parsed, 4);
2382 
2383 	/* Check if the user is trying to read from the table limits */
2384 	if (read_size > table_len || offset > table_len - read_size) {
2385 		pr_debug("Read size exceeds the Table size limits (%llu vs. %llu)\n",
2386 			  offset + read_size, table_len);
2387 		return -EINVAL;
2388 	}
2389 
2390 	while (off < read_size) {
2391 		err = cmd_start(dev, read_tbl->table_uid, opalmethod[OPAL_GET]);
2392 
2393 		add_token_u8(&err, dev, OPAL_STARTLIST);
2394 		add_token_u8(&err, dev, OPAL_STARTNAME);
2395 		add_token_u8(&err, dev, OPAL_STARTROW);
2396 		add_token_u64(&err, dev, offset + off); /* start row value */
2397 		add_token_u8(&err, dev, OPAL_ENDNAME);
2398 
2399 		add_token_u8(&err, dev, OPAL_STARTNAME);
2400 		add_token_u8(&err, dev, OPAL_ENDROW);
2401 
2402 		len = min(max_read_size, (size_t)(read_size - off));
2403 		add_token_u64(&err, dev, offset + off + len); /* end row value
2404 							       */
2405 		add_token_u8(&err, dev, OPAL_ENDNAME);
2406 		add_token_u8(&err, dev, OPAL_ENDLIST);
2407 
2408 		if (err) {
2409 			pr_debug("Error building read table data command.\n");
2410 			break;
2411 		}
2412 
2413 		err = finalize_and_send(dev, read_table_data_cont);
2414 		if (err)
2415 			break;
2416 
2417 		/* len+1: This includes the NULL terminator at the end*/
2418 		if (dev->prev_d_len > len + 1) {
2419 			err = -EOVERFLOW;
2420 			break;
2421 		}
2422 
2423 		dst = (u8 __user *)(uintptr_t)read_tbl->data;
2424 		if (copy_to_user(dst + off, dev->prev_data, dev->prev_d_len)) {
2425 			pr_debug("Error copying data to userspace\n");
2426 			err = -EFAULT;
2427 			break;
2428 		}
2429 		dev->prev_data = NULL;
2430 
2431 		off += len;
2432 	}
2433 
2434 	return err;
2435 }
2436 
2437 static int end_opal_session(struct opal_dev *dev, void *data)
2438 {
2439 	int err = 0;
2440 
2441 	clear_opal_cmd(dev);
2442 	set_comid(dev, dev->comid);
2443 	add_token_u8(&err, dev, OPAL_ENDOFSESSION);
2444 
2445 	if (err < 0)
2446 		return err;
2447 
2448 	return finalize_and_send(dev, end_session_cont);
2449 }
2450 
2451 static int end_opal_session_error(struct opal_dev *dev)
2452 {
2453 	const struct opal_step error_end_session = {
2454 		end_opal_session,
2455 	};
2456 
2457 	return execute_step(dev, &error_end_session, 0);
2458 }
2459 
2460 static inline void setup_opal_dev(struct opal_dev *dev)
2461 {
2462 	dev->tsn = 0;
2463 	dev->hsn = 0;
2464 	dev->prev_data = NULL;
2465 }
2466 
2467 static int check_opal_support(struct opal_dev *dev)
2468 {
2469 	int ret;
2470 
2471 	mutex_lock(&dev->dev_lock);
2472 	setup_opal_dev(dev);
2473 	ret = opal_discovery0_step(dev);
2474 	if (!ret)
2475 		dev->flags |= OPAL_FL_SUPPORTED;
2476 	mutex_unlock(&dev->dev_lock);
2477 
2478 	return ret;
2479 }
2480 
2481 static void clean_opal_dev(struct opal_dev *dev)
2482 {
2483 
2484 	struct opal_suspend_data *suspend, *next;
2485 
2486 	mutex_lock(&dev->dev_lock);
2487 	list_for_each_entry_safe(suspend, next, &dev->unlk_lst, node) {
2488 		list_del(&suspend->node);
2489 		kfree(suspend);
2490 	}
2491 	mutex_unlock(&dev->dev_lock);
2492 }
2493 
2494 void free_opal_dev(struct opal_dev *dev)
2495 {
2496 	if (!dev)
2497 		return;
2498 
2499 	clean_opal_dev(dev);
2500 	kfree(dev->resp);
2501 	kfree(dev->cmd);
2502 	kfree(dev);
2503 }
2504 EXPORT_SYMBOL(free_opal_dev);
2505 
2506 struct opal_dev *init_opal_dev(void *data, sec_send_recv *send_recv)
2507 {
2508 	struct opal_dev *dev;
2509 
2510 	dev = kmalloc(sizeof(*dev), GFP_KERNEL);
2511 	if (!dev)
2512 		return NULL;
2513 
2514 	/*
2515 	 * Presumably DMA-able buffers must be cache-aligned. Kmalloc makes
2516 	 * sure the allocated buffer is DMA-safe in that regard.
2517 	 */
2518 	dev->cmd = kmalloc(IO_BUFFER_LENGTH, GFP_KERNEL);
2519 	if (!dev->cmd)
2520 		goto err_free_dev;
2521 
2522 	dev->resp = kmalloc(IO_BUFFER_LENGTH, GFP_KERNEL);
2523 	if (!dev->resp)
2524 		goto err_free_cmd;
2525 
2526 	INIT_LIST_HEAD(&dev->unlk_lst);
2527 	mutex_init(&dev->dev_lock);
2528 	dev->flags = 0;
2529 	dev->data = data;
2530 	dev->send_recv = send_recv;
2531 	if (check_opal_support(dev) != 0) {
2532 		pr_debug("Opal is not supported on this device\n");
2533 		goto err_free_resp;
2534 	}
2535 
2536 	return dev;
2537 
2538 err_free_resp:
2539 	kfree(dev->resp);
2540 
2541 err_free_cmd:
2542 	kfree(dev->cmd);
2543 
2544 err_free_dev:
2545 	kfree(dev);
2546 
2547 	return NULL;
2548 }
2549 EXPORT_SYMBOL(init_opal_dev);
2550 
2551 static int opal_secure_erase_locking_range(struct opal_dev *dev,
2552 					   struct opal_session_info *opal_session)
2553 {
2554 	const struct opal_step erase_steps[] = {
2555 		{ start_auth_opal_session, opal_session },
2556 		{ get_active_key, &opal_session->opal_key.lr },
2557 		{ gen_key, },
2558 		{ end_opal_session, }
2559 	};
2560 	int ret;
2561 
2562 	ret = opal_get_key(dev, &opal_session->opal_key);
2563 	if (ret)
2564 		return ret;
2565 	mutex_lock(&dev->dev_lock);
2566 	setup_opal_dev(dev);
2567 	ret = execute_steps(dev, erase_steps, ARRAY_SIZE(erase_steps));
2568 	mutex_unlock(&dev->dev_lock);
2569 
2570 	return ret;
2571 }
2572 
2573 static int opal_get_discv(struct opal_dev *dev, struct opal_discovery *discv)
2574 {
2575 	const struct opal_step discovery0_step = {
2576 		opal_discovery0, discv
2577 	};
2578 	int ret = 0;
2579 
2580 	mutex_lock(&dev->dev_lock);
2581 	setup_opal_dev(dev);
2582 	ret = execute_step(dev, &discovery0_step, 0);
2583 	mutex_unlock(&dev->dev_lock);
2584 	if (ret)
2585 		return ret;
2586 	return discv->size; /* modified to actual length of data */
2587 }
2588 
2589 static int opal_revertlsp(struct opal_dev *dev, struct opal_revert_lsp *rev)
2590 {
2591 	/* controller will terminate session */
2592 	const struct opal_step steps[] = {
2593 		{ start_admin1LSP_opal_session, &rev->key },
2594 		{ revert_lsp, rev }
2595 	};
2596 	int ret;
2597 
2598 	ret = opal_get_key(dev, &rev->key);
2599 	if (ret)
2600 		return ret;
2601 	mutex_lock(&dev->dev_lock);
2602 	setup_opal_dev(dev);
2603 	ret = execute_steps(dev, steps, ARRAY_SIZE(steps));
2604 	mutex_unlock(&dev->dev_lock);
2605 
2606 	return ret;
2607 }
2608 
2609 static int opal_erase_locking_range(struct opal_dev *dev,
2610 				    struct opal_session_info *opal_session)
2611 {
2612 	const struct opal_step erase_steps[] = {
2613 		{ start_auth_opal_session, opal_session },
2614 		{ erase_locking_range, opal_session },
2615 		{ end_opal_session, }
2616 	};
2617 	int ret;
2618 
2619 	ret = opal_get_key(dev, &opal_session->opal_key);
2620 	if (ret)
2621 		return ret;
2622 	mutex_lock(&dev->dev_lock);
2623 	setup_opal_dev(dev);
2624 	ret = execute_steps(dev, erase_steps, ARRAY_SIZE(erase_steps));
2625 	mutex_unlock(&dev->dev_lock);
2626 
2627 	return ret;
2628 }
2629 
2630 static int opal_enable_disable_shadow_mbr(struct opal_dev *dev,
2631 					  struct opal_mbr_data *opal_mbr)
2632 {
2633 	u8 enable_disable = opal_mbr->enable_disable == OPAL_MBR_ENABLE ?
2634 		OPAL_TRUE : OPAL_FALSE;
2635 
2636 	const struct opal_step mbr_steps[] = {
2637 		{ start_admin1LSP_opal_session, &opal_mbr->key },
2638 		{ set_mbr_done, &enable_disable },
2639 		{ end_opal_session, },
2640 		{ start_admin1LSP_opal_session, &opal_mbr->key },
2641 		{ set_mbr_enable_disable, &enable_disable },
2642 		{ end_opal_session, }
2643 	};
2644 	int ret;
2645 
2646 	if (opal_mbr->enable_disable != OPAL_MBR_ENABLE &&
2647 	    opal_mbr->enable_disable != OPAL_MBR_DISABLE)
2648 		return -EINVAL;
2649 
2650 	ret = opal_get_key(dev, &opal_mbr->key);
2651 	if (ret)
2652 		return ret;
2653 	mutex_lock(&dev->dev_lock);
2654 	setup_opal_dev(dev);
2655 	ret = execute_steps(dev, mbr_steps, ARRAY_SIZE(mbr_steps));
2656 	mutex_unlock(&dev->dev_lock);
2657 
2658 	return ret;
2659 }
2660 
2661 static int opal_set_mbr_done(struct opal_dev *dev,
2662 			     struct opal_mbr_done *mbr_done)
2663 {
2664 	u8 mbr_done_tf = mbr_done->done_flag == OPAL_MBR_DONE ?
2665 		OPAL_TRUE : OPAL_FALSE;
2666 
2667 	const struct opal_step mbr_steps[] = {
2668 		{ start_admin1LSP_opal_session, &mbr_done->key },
2669 		{ set_mbr_done, &mbr_done_tf },
2670 		{ end_opal_session, }
2671 	};
2672 	int ret;
2673 
2674 	if (mbr_done->done_flag != OPAL_MBR_DONE &&
2675 	    mbr_done->done_flag != OPAL_MBR_NOT_DONE)
2676 		return -EINVAL;
2677 
2678 	ret = opal_get_key(dev, &mbr_done->key);
2679 	if (ret)
2680 		return ret;
2681 	mutex_lock(&dev->dev_lock);
2682 	setup_opal_dev(dev);
2683 	ret = execute_steps(dev, mbr_steps, ARRAY_SIZE(mbr_steps));
2684 	mutex_unlock(&dev->dev_lock);
2685 
2686 	return ret;
2687 }
2688 
2689 static int opal_write_shadow_mbr(struct opal_dev *dev,
2690 				 struct opal_shadow_mbr *info)
2691 {
2692 	const struct opal_step mbr_steps[] = {
2693 		{ start_admin1LSP_opal_session, &info->key },
2694 		{ write_shadow_mbr, info },
2695 		{ end_opal_session, }
2696 	};
2697 	int ret;
2698 
2699 	if (info->size == 0)
2700 		return 0;
2701 
2702 	ret = opal_get_key(dev, &info->key);
2703 	if (ret)
2704 		return ret;
2705 	mutex_lock(&dev->dev_lock);
2706 	setup_opal_dev(dev);
2707 	ret = execute_steps(dev, mbr_steps, ARRAY_SIZE(mbr_steps));
2708 	mutex_unlock(&dev->dev_lock);
2709 
2710 	return ret;
2711 }
2712 
2713 static int opal_save(struct opal_dev *dev, struct opal_lock_unlock *lk_unlk)
2714 {
2715 	struct opal_suspend_data *suspend;
2716 
2717 	suspend = kzalloc(sizeof(*suspend), GFP_KERNEL);
2718 	if (!suspend)
2719 		return -ENOMEM;
2720 
2721 	suspend->unlk = *lk_unlk;
2722 	suspend->lr = lk_unlk->session.opal_key.lr;
2723 
2724 	mutex_lock(&dev->dev_lock);
2725 	setup_opal_dev(dev);
2726 	add_suspend_info(dev, suspend);
2727 	mutex_unlock(&dev->dev_lock);
2728 
2729 	return 0;
2730 }
2731 
2732 static int opal_add_user_to_lr(struct opal_dev *dev,
2733 			       struct opal_lock_unlock *lk_unlk)
2734 {
2735 	const struct opal_step steps[] = {
2736 		{ start_admin1LSP_opal_session, &lk_unlk->session.opal_key },
2737 		{ add_user_to_lr, lk_unlk },
2738 		{ add_user_to_lr_ace, lk_unlk },
2739 		{ end_opal_session, }
2740 	};
2741 	int ret;
2742 
2743 	if (lk_unlk->l_state != OPAL_RO &&
2744 	    lk_unlk->l_state != OPAL_RW) {
2745 		pr_debug("Locking state was not RO or RW\n");
2746 		return -EINVAL;
2747 	}
2748 
2749 	if (lk_unlk->session.who < OPAL_USER1 ||
2750 	    lk_unlk->session.who > OPAL_USER9) {
2751 		pr_debug("Authority was not within the range of users: %d\n",
2752 			 lk_unlk->session.who);
2753 		return -EINVAL;
2754 	}
2755 
2756 	if (lk_unlk->session.sum) {
2757 		pr_debug("%s not supported in sum. Use setup locking range\n",
2758 			 __func__);
2759 		return -EINVAL;
2760 	}
2761 
2762 	ret = opal_get_key(dev, &lk_unlk->session.opal_key);
2763 	if (ret)
2764 		return ret;
2765 	mutex_lock(&dev->dev_lock);
2766 	setup_opal_dev(dev);
2767 	ret = execute_steps(dev, steps, ARRAY_SIZE(steps));
2768 	mutex_unlock(&dev->dev_lock);
2769 
2770 	return ret;
2771 }
2772 
2773 static int opal_reverttper(struct opal_dev *dev, struct opal_key *opal, bool psid)
2774 {
2775 	/* controller will terminate session */
2776 	const struct opal_step revert_steps[] = {
2777 		{ start_SIDASP_opal_session, opal },
2778 		{ revert_tper, }
2779 	};
2780 	const struct opal_step psid_revert_steps[] = {
2781 		{ start_PSID_opal_session, opal },
2782 		{ revert_tper, }
2783 	};
2784 
2785 	int ret;
2786 
2787 	ret = opal_get_key(dev, opal);
2788 
2789 	if (ret)
2790 		return ret;
2791 	mutex_lock(&dev->dev_lock);
2792 	setup_opal_dev(dev);
2793 	if (psid)
2794 		ret = execute_steps(dev, psid_revert_steps,
2795 				    ARRAY_SIZE(psid_revert_steps));
2796 	else
2797 		ret = execute_steps(dev, revert_steps,
2798 				    ARRAY_SIZE(revert_steps));
2799 	mutex_unlock(&dev->dev_lock);
2800 
2801 	/*
2802 	 * If we successfully reverted lets clean
2803 	 * any saved locking ranges.
2804 	 */
2805 	if (!ret)
2806 		clean_opal_dev(dev);
2807 
2808 	return ret;
2809 }
2810 
2811 static int __opal_lock_unlock(struct opal_dev *dev,
2812 			      struct opal_lock_unlock *lk_unlk)
2813 {
2814 	const struct opal_step unlock_steps[] = {
2815 		{ start_auth_opal_session, &lk_unlk->session },
2816 		{ lock_unlock_locking_range, lk_unlk },
2817 		{ end_opal_session, }
2818 	};
2819 	const struct opal_step unlock_sum_steps[] = {
2820 		{ start_auth_opal_session, &lk_unlk->session },
2821 		{ lock_unlock_locking_range_sum, lk_unlk },
2822 		{ end_opal_session, }
2823 	};
2824 
2825 	if (lk_unlk->session.sum)
2826 		return execute_steps(dev, unlock_sum_steps,
2827 				     ARRAY_SIZE(unlock_sum_steps));
2828 	else
2829 		return execute_steps(dev, unlock_steps,
2830 				     ARRAY_SIZE(unlock_steps));
2831 }
2832 
2833 static int __opal_set_mbr_done(struct opal_dev *dev, struct opal_key *key)
2834 {
2835 	u8 mbr_done_tf = OPAL_TRUE;
2836 	const struct opal_step mbrdone_step[] = {
2837 		{ start_admin1LSP_opal_session, key },
2838 		{ set_mbr_done, &mbr_done_tf },
2839 		{ end_opal_session, }
2840 	};
2841 
2842 	return execute_steps(dev, mbrdone_step, ARRAY_SIZE(mbrdone_step));
2843 }
2844 
2845 static void opal_lock_check_for_saved_key(struct opal_dev *dev,
2846 			    struct opal_lock_unlock *lk_unlk)
2847 {
2848 	struct opal_suspend_data *iter;
2849 
2850 	if (lk_unlk->l_state != OPAL_LK ||
2851 			lk_unlk->session.opal_key.key_len > 0)
2852 		return;
2853 
2854 	/*
2855 	 * Usually when closing a crypto device (eg: dm-crypt with LUKS) the
2856 	 * volume key is not required, as it requires root privileges anyway,
2857 	 * and root can deny access to a disk in many ways regardless.
2858 	 * Requiring the volume key to lock the device is a peculiarity of the
2859 	 * OPAL specification. Given we might already have saved the key if
2860 	 * the user requested it via the 'IOC_OPAL_SAVE' ioctl, we can use
2861 	 * that key to lock the device if no key was provided here, the
2862 	 * locking range matches and the appropriate flag was passed with
2863 	 * 'IOC_OPAL_SAVE'.
2864 	 * This allows integrating OPAL with tools and libraries that are used
2865 	 * to the common behaviour and do not ask for the volume key when
2866 	 * closing a device.
2867 	 */
2868 	setup_opal_dev(dev);
2869 	list_for_each_entry(iter, &dev->unlk_lst, node) {
2870 		if ((iter->unlk.flags & OPAL_SAVE_FOR_LOCK) &&
2871 				iter->lr == lk_unlk->session.opal_key.lr &&
2872 				iter->unlk.session.opal_key.key_len > 0) {
2873 			lk_unlk->session.opal_key.key_len =
2874 				iter->unlk.session.opal_key.key_len;
2875 			memcpy(lk_unlk->session.opal_key.key,
2876 				iter->unlk.session.opal_key.key,
2877 				iter->unlk.session.opal_key.key_len);
2878 			break;
2879 		}
2880 	}
2881 }
2882 
2883 static int opal_lock_unlock(struct opal_dev *dev,
2884 			    struct opal_lock_unlock *lk_unlk)
2885 {
2886 	int ret;
2887 
2888 	if (lk_unlk->session.who > OPAL_USER9)
2889 		return -EINVAL;
2890 
2891 	mutex_lock(&dev->dev_lock);
2892 	opal_lock_check_for_saved_key(dev, lk_unlk);
2893 	ret = opal_get_key(dev, &lk_unlk->session.opal_key);
2894 	if (!ret)
2895 		ret = __opal_lock_unlock(dev, lk_unlk);
2896 	mutex_unlock(&dev->dev_lock);
2897 
2898 	return ret;
2899 }
2900 
2901 static int opal_take_ownership(struct opal_dev *dev, struct opal_key *opal)
2902 {
2903 	const struct opal_step owner_steps[] = {
2904 		{ start_anybodyASP_opal_session, },
2905 		{ get_msid_cpin_pin, },
2906 		{ end_opal_session, },
2907 		{ start_SIDASP_opal_session, opal },
2908 		{ set_sid_cpin_pin, opal },
2909 		{ end_opal_session, }
2910 	};
2911 	int ret;
2912 
2913 	if (!dev)
2914 		return -ENODEV;
2915 
2916 	ret = opal_get_key(dev, opal);
2917 	if (ret)
2918 		return ret;
2919 	mutex_lock(&dev->dev_lock);
2920 	setup_opal_dev(dev);
2921 	ret = execute_steps(dev, owner_steps, ARRAY_SIZE(owner_steps));
2922 	mutex_unlock(&dev->dev_lock);
2923 
2924 	return ret;
2925 }
2926 
2927 static int opal_activate_lsp(struct opal_dev *dev,
2928 			     struct opal_lr_act *opal_lr_act)
2929 {
2930 	const struct opal_step active_steps[] = {
2931 		{ start_SIDASP_opal_session, &opal_lr_act->key },
2932 		{ get_lsp_lifecycle, },
2933 		{ activate_lsp, opal_lr_act },
2934 		{ end_opal_session, }
2935 	};
2936 	int ret;
2937 
2938 	if (!opal_lr_act->num_lrs || opal_lr_act->num_lrs > OPAL_MAX_LRS)
2939 		return -EINVAL;
2940 
2941 	ret = opal_get_key(dev, &opal_lr_act->key);
2942 	if (ret)
2943 		return ret;
2944 	mutex_lock(&dev->dev_lock);
2945 	setup_opal_dev(dev);
2946 	ret = execute_steps(dev, active_steps, ARRAY_SIZE(active_steps));
2947 	mutex_unlock(&dev->dev_lock);
2948 
2949 	return ret;
2950 }
2951 
2952 static int opal_setup_locking_range(struct opal_dev *dev,
2953 				    struct opal_user_lr_setup *opal_lrs)
2954 {
2955 	const struct opal_step lr_steps[] = {
2956 		{ start_auth_opal_session, &opal_lrs->session },
2957 		{ setup_locking_range, opal_lrs },
2958 		{ end_opal_session, }
2959 	};
2960 	int ret;
2961 
2962 	ret = opal_get_key(dev, &opal_lrs->session.opal_key);
2963 	if (ret)
2964 		return ret;
2965 	mutex_lock(&dev->dev_lock);
2966 	setup_opal_dev(dev);
2967 	ret = execute_steps(dev, lr_steps, ARRAY_SIZE(lr_steps));
2968 	mutex_unlock(&dev->dev_lock);
2969 
2970 	return ret;
2971 }
2972 
2973 static int opal_locking_range_status(struct opal_dev *dev,
2974 			  struct opal_lr_status *opal_lrst,
2975 			  void __user *data)
2976 {
2977 	const struct opal_step lr_steps[] = {
2978 		{ start_auth_opal_session, &opal_lrst->session },
2979 		{ locking_range_status, opal_lrst },
2980 		{ end_opal_session, }
2981 	};
2982 	int ret;
2983 
2984 	mutex_lock(&dev->dev_lock);
2985 	setup_opal_dev(dev);
2986 	ret = execute_steps(dev, lr_steps, ARRAY_SIZE(lr_steps));
2987 	mutex_unlock(&dev->dev_lock);
2988 
2989 	/* skip session info when copying back to uspace */
2990 	if (!ret && copy_to_user(data + offsetof(struct opal_lr_status, range_start),
2991 				(void *)opal_lrst + offsetof(struct opal_lr_status, range_start),
2992 				sizeof(*opal_lrst) - offsetof(struct opal_lr_status, range_start))) {
2993 		pr_debug("Error copying status to userspace\n");
2994 		return -EFAULT;
2995 	}
2996 
2997 	return ret;
2998 }
2999 
3000 static int opal_set_new_pw(struct opal_dev *dev, struct opal_new_pw *opal_pw)
3001 {
3002 	const struct opal_step pw_steps[] = {
3003 		{ start_auth_opal_session, &opal_pw->session },
3004 		{ set_new_pw, &opal_pw->new_user_pw },
3005 		{ end_opal_session, }
3006 	};
3007 	int ret;
3008 
3009 	if (opal_pw->session.who > OPAL_USER9  ||
3010 	    opal_pw->new_user_pw.who > OPAL_USER9)
3011 		return -EINVAL;
3012 
3013 	mutex_lock(&dev->dev_lock);
3014 	setup_opal_dev(dev);
3015 	ret = execute_steps(dev, pw_steps, ARRAY_SIZE(pw_steps));
3016 	mutex_unlock(&dev->dev_lock);
3017 
3018 	if (ret)
3019 		return ret;
3020 
3021 	/* update keyring with new password */
3022 	ret = update_sed_opal_key(OPAL_AUTH_KEY,
3023 				  opal_pw->new_user_pw.opal_key.key,
3024 				  opal_pw->new_user_pw.opal_key.key_len);
3025 
3026 	return ret;
3027 }
3028 
3029 static int opal_activate_user(struct opal_dev *dev,
3030 			      struct opal_session_info *opal_session)
3031 {
3032 	const struct opal_step act_steps[] = {
3033 		{ start_admin1LSP_opal_session, &opal_session->opal_key },
3034 		{ internal_activate_user, opal_session },
3035 		{ end_opal_session, }
3036 	};
3037 	int ret;
3038 
3039 	/* We can't activate Admin1 it's active as manufactured */
3040 	if (opal_session->who < OPAL_USER1 ||
3041 	    opal_session->who > OPAL_USER9) {
3042 		pr_debug("Who was not a valid user: %d\n", opal_session->who);
3043 		return -EINVAL;
3044 	}
3045 
3046 	ret = opal_get_key(dev, &opal_session->opal_key);
3047 	if (ret)
3048 		return ret;
3049 	mutex_lock(&dev->dev_lock);
3050 	setup_opal_dev(dev);
3051 	ret = execute_steps(dev, act_steps, ARRAY_SIZE(act_steps));
3052 	mutex_unlock(&dev->dev_lock);
3053 
3054 	return ret;
3055 }
3056 
3057 bool opal_unlock_from_suspend(struct opal_dev *dev)
3058 {
3059 	struct opal_suspend_data *suspend;
3060 	bool was_failure = false;
3061 	int ret = 0;
3062 
3063 	if (!dev)
3064 		return false;
3065 
3066 	if (!(dev->flags & OPAL_FL_SUPPORTED))
3067 		return false;
3068 
3069 	mutex_lock(&dev->dev_lock);
3070 	setup_opal_dev(dev);
3071 
3072 	list_for_each_entry(suspend, &dev->unlk_lst, node) {
3073 		dev->tsn = 0;
3074 		dev->hsn = 0;
3075 
3076 		ret = __opal_lock_unlock(dev, &suspend->unlk);
3077 		if (ret) {
3078 			pr_debug("Failed to unlock LR %hhu with sum %d\n",
3079 				 suspend->unlk.session.opal_key.lr,
3080 				 suspend->unlk.session.sum);
3081 			was_failure = true;
3082 		}
3083 
3084 		if (dev->flags & OPAL_FL_MBR_ENABLED) {
3085 			ret = __opal_set_mbr_done(dev, &suspend->unlk.session.opal_key);
3086 			if (ret)
3087 				pr_debug("Failed to set MBR Done in S3 resume\n");
3088 		}
3089 	}
3090 	mutex_unlock(&dev->dev_lock);
3091 
3092 	return was_failure;
3093 }
3094 EXPORT_SYMBOL(opal_unlock_from_suspend);
3095 
3096 static int opal_read_table(struct opal_dev *dev,
3097 			   struct opal_read_write_table *rw_tbl)
3098 {
3099 	const struct opal_step read_table_steps[] = {
3100 		{ start_admin1LSP_opal_session, &rw_tbl->key },
3101 		{ read_table_data, rw_tbl },
3102 		{ end_opal_session, }
3103 	};
3104 	int ret = 0;
3105 
3106 	if (!rw_tbl->size)
3107 		return ret;
3108 
3109 	return execute_steps(dev, read_table_steps,
3110 			     ARRAY_SIZE(read_table_steps));
3111 }
3112 
3113 static int opal_write_table(struct opal_dev *dev,
3114 			    struct opal_read_write_table *rw_tbl)
3115 {
3116 	const struct opal_step write_table_steps[] = {
3117 		{ start_admin1LSP_opal_session, &rw_tbl->key },
3118 		{ write_table_data, rw_tbl },
3119 		{ end_opal_session, }
3120 	};
3121 	int ret = 0;
3122 
3123 	if (!rw_tbl->size)
3124 		return ret;
3125 
3126 	return execute_steps(dev, write_table_steps,
3127 			     ARRAY_SIZE(write_table_steps));
3128 }
3129 
3130 static int opal_generic_read_write_table(struct opal_dev *dev,
3131 					 struct opal_read_write_table *rw_tbl)
3132 {
3133 	int ret, bit_set;
3134 
3135 	ret = opal_get_key(dev, &rw_tbl->key);
3136 	if (ret)
3137 		return ret;
3138 	mutex_lock(&dev->dev_lock);
3139 	setup_opal_dev(dev);
3140 
3141 	bit_set = fls64(rw_tbl->flags) - 1;
3142 	switch (bit_set) {
3143 	case OPAL_READ_TABLE:
3144 		ret = opal_read_table(dev, rw_tbl);
3145 		break;
3146 	case OPAL_WRITE_TABLE:
3147 		ret = opal_write_table(dev, rw_tbl);
3148 		break;
3149 	default:
3150 		pr_debug("Invalid bit set in the flag (%016llx).\n",
3151 			 rw_tbl->flags);
3152 		ret = -EINVAL;
3153 		break;
3154 	}
3155 
3156 	mutex_unlock(&dev->dev_lock);
3157 
3158 	return ret;
3159 }
3160 
3161 static int opal_get_status(struct opal_dev *dev, void __user *data)
3162 {
3163 	struct opal_status sts = {0};
3164 
3165 	/*
3166 	 * check_opal_support() error is not fatal,
3167 	 * !dev->supported is a valid condition
3168 	 */
3169 	if (!check_opal_support(dev))
3170 		sts.flags = dev->flags;
3171 	if (copy_to_user(data, &sts, sizeof(sts))) {
3172 		pr_debug("Error copying status to userspace\n");
3173 		return -EFAULT;
3174 	}
3175 	return 0;
3176 }
3177 
3178 static int opal_get_geometry(struct opal_dev *dev, void __user *data)
3179 {
3180 	struct opal_geometry geo = {0};
3181 
3182 	if (check_opal_support(dev))
3183 		return -EINVAL;
3184 
3185 	geo.align = dev->align_required;
3186 	geo.logical_block_size = dev->logical_block_size;
3187 	geo.alignment_granularity =  dev->align;
3188 	geo.lowest_aligned_lba = dev->lowest_lba;
3189 
3190 	if (copy_to_user(data, &geo, sizeof(geo))) {
3191 		pr_debug("Error copying geometry data to userspace\n");
3192 		return -EFAULT;
3193 	}
3194 
3195 	return 0;
3196 }
3197 
3198 int sed_ioctl(struct opal_dev *dev, unsigned int cmd, void __user *arg)
3199 {
3200 	void *p;
3201 	int ret = -ENOTTY;
3202 
3203 	if (!capable(CAP_SYS_ADMIN))
3204 		return -EACCES;
3205 	if (!dev)
3206 		return -EOPNOTSUPP;
3207 	if (!(dev->flags & OPAL_FL_SUPPORTED))
3208 		return -EOPNOTSUPP;
3209 
3210 	if (cmd & IOC_IN) {
3211 		p = memdup_user(arg, _IOC_SIZE(cmd));
3212 		if (IS_ERR(p))
3213 			return PTR_ERR(p);
3214 	}
3215 
3216 	switch (cmd) {
3217 	case IOC_OPAL_SAVE:
3218 		ret = opal_save(dev, p);
3219 		break;
3220 	case IOC_OPAL_LOCK_UNLOCK:
3221 		ret = opal_lock_unlock(dev, p);
3222 		break;
3223 	case IOC_OPAL_TAKE_OWNERSHIP:
3224 		ret = opal_take_ownership(dev, p);
3225 		break;
3226 	case IOC_OPAL_ACTIVATE_LSP:
3227 		ret = opal_activate_lsp(dev, p);
3228 		break;
3229 	case IOC_OPAL_SET_PW:
3230 		ret = opal_set_new_pw(dev, p);
3231 		break;
3232 	case IOC_OPAL_ACTIVATE_USR:
3233 		ret = opal_activate_user(dev, p);
3234 		break;
3235 	case IOC_OPAL_REVERT_TPR:
3236 		ret = opal_reverttper(dev, p, false);
3237 		break;
3238 	case IOC_OPAL_LR_SETUP:
3239 		ret = opal_setup_locking_range(dev, p);
3240 		break;
3241 	case IOC_OPAL_ADD_USR_TO_LR:
3242 		ret = opal_add_user_to_lr(dev, p);
3243 		break;
3244 	case IOC_OPAL_ENABLE_DISABLE_MBR:
3245 		ret = opal_enable_disable_shadow_mbr(dev, p);
3246 		break;
3247 	case IOC_OPAL_MBR_DONE:
3248 		ret = opal_set_mbr_done(dev, p);
3249 		break;
3250 	case IOC_OPAL_WRITE_SHADOW_MBR:
3251 		ret = opal_write_shadow_mbr(dev, p);
3252 		break;
3253 	case IOC_OPAL_ERASE_LR:
3254 		ret = opal_erase_locking_range(dev, p);
3255 		break;
3256 	case IOC_OPAL_SECURE_ERASE_LR:
3257 		ret = opal_secure_erase_locking_range(dev, p);
3258 		break;
3259 	case IOC_OPAL_PSID_REVERT_TPR:
3260 		ret = opal_reverttper(dev, p, true);
3261 		break;
3262 	case IOC_OPAL_GENERIC_TABLE_RW:
3263 		ret = opal_generic_read_write_table(dev, p);
3264 		break;
3265 	case IOC_OPAL_GET_STATUS:
3266 		ret = opal_get_status(dev, arg);
3267 		break;
3268 	case IOC_OPAL_GET_LR_STATUS:
3269 		ret = opal_locking_range_status(dev, p, arg);
3270 		break;
3271 	case IOC_OPAL_GET_GEOMETRY:
3272 		ret = opal_get_geometry(dev, arg);
3273 		break;
3274 	case IOC_OPAL_REVERT_LSP:
3275 		ret = opal_revertlsp(dev, p);
3276 		break;
3277 	case IOC_OPAL_DISCOVERY:
3278 		ret = opal_get_discv(dev, p);
3279 		break;
3280 
3281 	default:
3282 		break;
3283 	}
3284 
3285 	if (cmd & IOC_IN)
3286 		kfree(p);
3287 	return ret;
3288 }
3289 EXPORT_SYMBOL_GPL(sed_ioctl);
3290 
3291 static int __init sed_opal_init(void)
3292 {
3293 	struct key *kr;
3294 
3295 	kr = keyring_alloc(".sed_opal",
3296 			   GLOBAL_ROOT_UID, GLOBAL_ROOT_GID, current_cred(),
3297 			   (KEY_POS_ALL & ~KEY_POS_SETATTR) | KEY_USR_VIEW |
3298 			   KEY_USR_READ | KEY_USR_SEARCH | KEY_USR_WRITE,
3299 			   KEY_ALLOC_NOT_IN_QUOTA,
3300 			   NULL, NULL);
3301 	if (IS_ERR(kr))
3302 		return PTR_ERR(kr);
3303 
3304 	sed_opal_keyring = kr;
3305 
3306 	return 0;
3307 }
3308 late_initcall(sed_opal_init);
3309