xref: /openbmc/linux/block/sed-opal.c (revision 160b8e75)
1 /*
2  * Copyright © 2016 Intel Corporation
3  *
4  * Authors:
5  *    Scott  Bauer      <scott.bauer@intel.com>
6  *    Rafael Antognolli <rafael.antognolli@intel.com>
7  *
8  * This program is free software; you can redistribute it and/or modify it
9  * under the terms and conditions of the GNU General Public License,
10  * version 2, as published by the Free Software Foundation.
11  *
12  * This program is distributed in the hope it will be useful, but WITHOUT
13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
15  * more details.
16  */
17 
18 #define pr_fmt(fmt) KBUILD_MODNAME ":OPAL: " fmt
19 
20 #include <linux/delay.h>
21 #include <linux/device.h>
22 #include <linux/kernel.h>
23 #include <linux/list.h>
24 #include <linux/genhd.h>
25 #include <linux/slab.h>
26 #include <linux/uaccess.h>
27 #include <uapi/linux/sed-opal.h>
28 #include <linux/sed-opal.h>
29 #include <linux/string.h>
30 #include <linux/kdev_t.h>
31 
32 #include "opal_proto.h"
33 
34 #define IO_BUFFER_LENGTH 2048
35 #define MAX_TOKS 64
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 	bool supported;
83 	bool mbr_enabled;
84 
85 	void *data;
86 	sec_send_recv *send_recv;
87 
88 	const struct opal_step *steps;
89 	struct mutex dev_lock;
90 	u16 comid;
91 	u32 hsn;
92 	u32 tsn;
93 	u64 align;
94 	u64 lowest_lba;
95 
96 	size_t pos;
97 	u8 cmd[IO_BUFFER_LENGTH];
98 	u8 resp[IO_BUFFER_LENGTH];
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 
139 	[OPAL_LOCKINGRANGE_GLOBAL] =
140 		{ 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x01 },
141 	[OPAL_LOCKINGRANGE_ACE_RDLOCKED] =
142 		{ 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0xE0, 0x01 },
143 	[OPAL_LOCKINGRANGE_ACE_WRLOCKED] =
144 		{ 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0xE8, 0x01 },
145 	[OPAL_MBRCONTROL] =
146 		{ 0x00, 0x00, 0x08, 0x03, 0x00, 0x00, 0x00, 0x01 },
147 	[OPAL_MBR] =
148 		{ 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00 },
149 	[OPAL_AUTHORITY_TABLE] =
150 		{ 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00},
151 	[OPAL_C_PIN_TABLE] =
152 		{ 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00},
153 	[OPAL_LOCKING_INFO_TABLE] =
154 		{ 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01 },
155 	[OPAL_ENTERPRISE_LOCKING_INFO_TABLE] =
156 		{ 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00 },
157 
158 	/* C_PIN_TABLE object ID's */
159 
160         [OPAL_C_PIN_MSID] =
161 		{ 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x84, 0x02},
162 	[OPAL_C_PIN_SID] =
163 		{ 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01},
164 	[OPAL_C_PIN_ADMIN1] =
165 		{ 0x00, 0x00, 0x00, 0x0B, 0x00, 0x01, 0x00, 0x01},
166 
167 	/* half UID's (only first 4 bytes used) */
168 
169 	[OPAL_HALF_UID_AUTHORITY_OBJ_REF] =
170 		{ 0x00, 0x00, 0x0C, 0x05, 0xff, 0xff, 0xff, 0xff },
171 	[OPAL_HALF_UID_BOOLEAN_ACE] =
172 		{ 0x00, 0x00, 0x04, 0x0E, 0xff, 0xff, 0xff, 0xff },
173 
174 	/* special value for omitted optional parameter */
175 	[OPAL_UID_HEXFF] =
176 		{ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
177 };
178 
179 /*
180  * TCG Storage SSC Methods.
181  * Derived from: TCG_Storage_Architecture_Core_Spec_v2.01_r1.00
182  * Section: 6.3 Assigned UIDs
183  */
184 static const u8 opalmethod[][OPAL_UID_LENGTH] = {
185 	[OPAL_PROPERTIES] =
186 		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x01 },
187 	[OPAL_STARTSESSION] =
188 		{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x02 },
189 	[OPAL_REVERT] =
190 		{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x02 },
191 	[OPAL_ACTIVATE] =
192 		{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x03 },
193 	[OPAL_EGET] =
194 		{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06 },
195 	[OPAL_ESET] =
196 		{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07 },
197 	[OPAL_NEXT] =
198 		{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x08 },
199 	[OPAL_EAUTHENTICATE] =
200 		{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0c },
201 	[OPAL_GETACL] =
202 		{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0d },
203 	[OPAL_GENKEY] =
204 		{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10 },
205 	[OPAL_REVERTSP] =
206 		{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x11 },
207 	[OPAL_GET] =
208 		{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x16 },
209 	[OPAL_SET] =
210 		{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x17 },
211 	[OPAL_AUTHENTICATE] =
212 		{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1c },
213 	[OPAL_RANDOM] =
214 		{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x01 },
215 	[OPAL_ERASE] =
216 		{ 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x08, 0x03 },
217 };
218 
219 static int end_opal_session_error(struct opal_dev *dev);
220 
221 struct opal_suspend_data {
222 	struct opal_lock_unlock unlk;
223 	u8 lr;
224 	struct list_head node;
225 };
226 
227 /*
228  * Derived from:
229  * TCG_Storage_Architecture_Core_Spec_v2.01_r1.00
230  * Section: 5.1.5 Method Status Codes
231  */
232 static const char * const opal_errors[] = {
233 	"Success",
234 	"Not Authorized",
235 	"Unknown Error",
236 	"SP Busy",
237 	"SP Failed",
238 	"SP Disabled",
239 	"SP Frozen",
240 	"No Sessions Available",
241 	"Uniqueness Conflict",
242 	"Insufficient Space",
243 	"Insufficient Rows",
244 	"Invalid Function",
245 	"Invalid Parameter",
246 	"Invalid Reference",
247 	"Unknown Error",
248 	"TPER Malfunction",
249 	"Transaction Failure",
250 	"Response Overflow",
251 	"Authority Locked Out",
252 };
253 
254 static const char *opal_error_to_human(int error)
255 {
256 	if (error == 0x3f)
257 		return "Failed";
258 
259 	if (error >= ARRAY_SIZE(opal_errors) || error < 0)
260 		return "Unknown Error";
261 
262 	return opal_errors[error];
263 }
264 
265 static void print_buffer(const u8 *ptr, u32 length)
266 {
267 #ifdef DEBUG
268 	print_hex_dump_bytes("OPAL: ", DUMP_PREFIX_OFFSET, ptr, length);
269 	pr_debug("\n");
270 #endif
271 }
272 
273 static bool check_tper(const void *data)
274 {
275 	const struct d0_tper_features *tper = data;
276 	u8 flags = tper->supported_features;
277 
278 	if (!(flags & TPER_SYNC_SUPPORTED)) {
279 		pr_debug("TPer sync not supported. flags = %d\n",
280 			 tper->supported_features);
281 		return false;
282 	}
283 
284 	return true;
285 }
286 
287 static bool check_mbrenabled(const void *data)
288 {
289 	const struct d0_locking_features *lfeat = data;
290 	u8 sup_feat = lfeat->supported_features;
291 
292 	return !!(sup_feat & MBR_ENABLED_MASK);
293 }
294 
295 static bool check_sum(const void *data)
296 {
297 	const struct d0_single_user_mode *sum = data;
298 	u32 nlo = be32_to_cpu(sum->num_locking_objects);
299 
300 	if (nlo == 0) {
301 		pr_debug("Need at least one locking object.\n");
302 		return false;
303 	}
304 
305 	pr_debug("Number of locking objects: %d\n", nlo);
306 
307 	return true;
308 }
309 
310 static u16 get_comid_v100(const void *data)
311 {
312 	const struct d0_opal_v100 *v100 = data;
313 
314 	return be16_to_cpu(v100->baseComID);
315 }
316 
317 static u16 get_comid_v200(const void *data)
318 {
319 	const struct d0_opal_v200 *v200 = data;
320 
321 	return be16_to_cpu(v200->baseComID);
322 }
323 
324 static int opal_send_cmd(struct opal_dev *dev)
325 {
326 	return dev->send_recv(dev->data, dev->comid, TCG_SECP_01,
327 			      dev->cmd, IO_BUFFER_LENGTH,
328 			      true);
329 }
330 
331 static int opal_recv_cmd(struct opal_dev *dev)
332 {
333 	return dev->send_recv(dev->data, dev->comid, TCG_SECP_01,
334 			      dev->resp, IO_BUFFER_LENGTH,
335 			      false);
336 }
337 
338 static int opal_recv_check(struct opal_dev *dev)
339 {
340 	size_t buflen = IO_BUFFER_LENGTH;
341 	void *buffer = dev->resp;
342 	struct opal_header *hdr = buffer;
343 	int ret;
344 
345 	do {
346 		pr_debug("Sent OPAL command: outstanding=%d, minTransfer=%d\n",
347 			 hdr->cp.outstandingData,
348 			 hdr->cp.minTransfer);
349 
350 		if (hdr->cp.outstandingData == 0 ||
351 		    hdr->cp.minTransfer != 0)
352 			return 0;
353 
354 		memset(buffer, 0, buflen);
355 		ret = opal_recv_cmd(dev);
356 	} while (!ret);
357 
358 	return ret;
359 }
360 
361 static int opal_send_recv(struct opal_dev *dev, cont_fn *cont)
362 {
363 	int ret;
364 
365 	ret = opal_send_cmd(dev);
366 	if (ret)
367 		return ret;
368 	ret = opal_recv_cmd(dev);
369 	if (ret)
370 		return ret;
371 	ret = opal_recv_check(dev);
372 	if (ret)
373 		return ret;
374 	return cont(dev);
375 }
376 
377 static void check_geometry(struct opal_dev *dev, const void *data)
378 {
379 	const struct d0_geometry_features *geo = data;
380 
381 	dev->align = geo->alignment_granularity;
382 	dev->lowest_lba = geo->lowest_aligned_lba;
383 }
384 
385 static int next(struct opal_dev *dev)
386 {
387 	const struct opal_step *step;
388 	int state = 0, error = 0;
389 
390 	do {
391 		step = &dev->steps[state];
392 		if (!step->fn)
393 			break;
394 
395 		error = step->fn(dev, step->data);
396 		if (error) {
397 			pr_debug("Error on step function: %d with error %d: %s\n",
398 				 state, error,
399 				 opal_error_to_human(error));
400 
401 			/* For each OPAL command we do a discovery0 then we
402 			 * start some sort of session.
403 			 * If we haven't passed state 1 then there was an error
404 			 * on discovery0 or during the attempt to start a
405 			 * session. Therefore we shouldn't attempt to terminate
406 			 * a session, as one has not yet been created.
407 			 */
408 			if (state > 1) {
409 				end_opal_session_error(dev);
410 				return error;
411 			}
412 
413 		}
414 		state++;
415 	} while (!error);
416 
417 	return error;
418 }
419 
420 static int opal_discovery0_end(struct opal_dev *dev)
421 {
422 	bool found_com_id = false, supported = true, single_user = false;
423 	const struct d0_header *hdr = (struct d0_header *)dev->resp;
424 	const u8 *epos = dev->resp, *cpos = dev->resp;
425 	u16 comid = 0;
426 	u32 hlen = be32_to_cpu(hdr->length);
427 
428 	print_buffer(dev->resp, hlen);
429 	dev->mbr_enabled = false;
430 
431 	if (hlen > IO_BUFFER_LENGTH - sizeof(*hdr)) {
432 		pr_debug("Discovery length overflows buffer (%zu+%u)/%u\n",
433 			 sizeof(*hdr), hlen, IO_BUFFER_LENGTH);
434 		return -EFAULT;
435 	}
436 
437 	epos += hlen; /* end of buffer */
438 	cpos += sizeof(*hdr); /* current position on buffer */
439 
440 	while (cpos < epos && supported) {
441 		const struct d0_features *body =
442 			(const struct d0_features *)cpos;
443 
444 		switch (be16_to_cpu(body->code)) {
445 		case FC_TPER:
446 			supported = check_tper(body->features);
447 			break;
448 		case FC_SINGLEUSER:
449 			single_user = check_sum(body->features);
450 			break;
451 		case FC_GEOMETRY:
452 			check_geometry(dev, body);
453 			break;
454 		case FC_LOCKING:
455 			dev->mbr_enabled = check_mbrenabled(body->features);
456 			break;
457 		case FC_ENTERPRISE:
458 		case FC_DATASTORE:
459 			/* some ignored properties */
460 			pr_debug("Found OPAL feature description: %d\n",
461 				 be16_to_cpu(body->code));
462 			break;
463 		case FC_OPALV100:
464 			comid = get_comid_v100(body->features);
465 			found_com_id = true;
466 			break;
467 		case FC_OPALV200:
468 			comid = get_comid_v200(body->features);
469 			found_com_id = true;
470 			break;
471 		case 0xbfff ... 0xffff:
472 			/* vendor specific, just ignore */
473 			break;
474 		default:
475 			pr_debug("OPAL Unknown feature: %d\n",
476 				 be16_to_cpu(body->code));
477 
478 		}
479 		cpos += body->length + 4;
480 	}
481 
482 	if (!supported) {
483 		pr_debug("This device is not Opal enabled. Not Supported!\n");
484 		return -EOPNOTSUPP;
485 	}
486 
487 	if (!single_user)
488 		pr_debug("Device doesn't support single user mode\n");
489 
490 
491 	if (!found_com_id) {
492 		pr_debug("Could not find OPAL comid for device. Returning early\n");
493 		return -EOPNOTSUPP;;
494 	}
495 
496 	dev->comid = comid;
497 
498 	return 0;
499 }
500 
501 static int opal_discovery0(struct opal_dev *dev, void *data)
502 {
503 	int ret;
504 
505 	memset(dev->resp, 0, IO_BUFFER_LENGTH);
506 	dev->comid = OPAL_DISCOVERY_COMID;
507 	ret = opal_recv_cmd(dev);
508 	if (ret)
509 		return ret;
510 	return opal_discovery0_end(dev);
511 }
512 
513 static void add_token_u8(int *err, struct opal_dev *cmd, u8 tok)
514 {
515 	if (*err)
516 		return;
517 	if (cmd->pos >= IO_BUFFER_LENGTH - 1) {
518 		pr_debug("Error adding u8: end of buffer.\n");
519 		*err = -ERANGE;
520 		return;
521 	}
522 	cmd->cmd[cmd->pos++] = tok;
523 }
524 
525 static void add_short_atom_header(struct opal_dev *cmd, bool bytestring,
526 				  bool has_sign, int len)
527 {
528 	u8 atom;
529 	int err = 0;
530 
531 	atom = SHORT_ATOM_ID;
532 	atom |= bytestring ? SHORT_ATOM_BYTESTRING : 0;
533 	atom |= has_sign ? SHORT_ATOM_SIGNED : 0;
534 	atom |= len & SHORT_ATOM_LEN_MASK;
535 
536 	add_token_u8(&err, cmd, atom);
537 }
538 
539 static void add_medium_atom_header(struct opal_dev *cmd, bool bytestring,
540 				   bool has_sign, int len)
541 {
542 	u8 header0;
543 
544 	header0 = MEDIUM_ATOM_ID;
545 	header0 |= bytestring ? MEDIUM_ATOM_BYTESTRING : 0;
546 	header0 |= has_sign ? MEDIUM_ATOM_SIGNED : 0;
547 	header0 |= (len >> 8) & MEDIUM_ATOM_LEN_MASK;
548 	cmd->cmd[cmd->pos++] = header0;
549 	cmd->cmd[cmd->pos++] = len;
550 }
551 
552 static void add_token_u64(int *err, struct opal_dev *cmd, u64 number)
553 {
554 
555 	size_t len;
556 	int msb;
557 	u8 n;
558 
559 	if (!(number & ~TINY_ATOM_DATA_MASK)) {
560 		add_token_u8(err, cmd, number);
561 		return;
562 	}
563 
564 	msb = fls(number);
565 	len = DIV_ROUND_UP(msb, 4);
566 
567 	if (cmd->pos >= IO_BUFFER_LENGTH - len - 1) {
568 		pr_debug("Error adding u64: end of buffer.\n");
569 		*err = -ERANGE;
570 		return;
571 	}
572 	add_short_atom_header(cmd, false, false, len);
573 	while (len--) {
574 		n = number >> (len * 8);
575 		add_token_u8(err, cmd, n);
576 	}
577 }
578 
579 static void add_token_bytestring(int *err, struct opal_dev *cmd,
580 				 const u8 *bytestring, size_t len)
581 {
582 	size_t header_len = 1;
583 	bool is_short_atom = true;
584 
585 	if (*err)
586 		return;
587 
588 	if (len & ~SHORT_ATOM_LEN_MASK) {
589 		header_len = 2;
590 		is_short_atom = false;
591 	}
592 
593 	if (len >= IO_BUFFER_LENGTH - cmd->pos - header_len) {
594 		pr_debug("Error adding bytestring: end of buffer.\n");
595 		*err = -ERANGE;
596 		return;
597 	}
598 
599 	if (is_short_atom)
600 		add_short_atom_header(cmd, true, false, len);
601 	else
602 		add_medium_atom_header(cmd, true, false, len);
603 
604 	memcpy(&cmd->cmd[cmd->pos], bytestring, len);
605 	cmd->pos += len;
606 
607 }
608 
609 static int build_locking_range(u8 *buffer, size_t length, u8 lr)
610 {
611 	if (length > OPAL_UID_LENGTH) {
612 		pr_debug("Can't build locking range. Length OOB\n");
613 		return -ERANGE;
614 	}
615 
616 	memcpy(buffer, opaluid[OPAL_LOCKINGRANGE_GLOBAL], OPAL_UID_LENGTH);
617 
618 	if (lr == 0)
619 		return 0;
620 	buffer[5] = LOCKING_RANGE_NON_GLOBAL;
621 	buffer[7] = lr;
622 
623 	return 0;
624 }
625 
626 static int build_locking_user(u8 *buffer, size_t length, u8 lr)
627 {
628 	if (length > OPAL_UID_LENGTH) {
629 		pr_debug("Can't build locking range user, Length OOB\n");
630 		return -ERANGE;
631 	}
632 
633 	memcpy(buffer, opaluid[OPAL_USER1_UID], OPAL_UID_LENGTH);
634 
635 	buffer[7] = lr + 1;
636 
637 	return 0;
638 }
639 
640 static void set_comid(struct opal_dev *cmd, u16 comid)
641 {
642 	struct opal_header *hdr = (struct opal_header *)cmd->cmd;
643 
644 	hdr->cp.extendedComID[0] = comid >> 8;
645 	hdr->cp.extendedComID[1] = comid;
646 	hdr->cp.extendedComID[2] = 0;
647 	hdr->cp.extendedComID[3] = 0;
648 }
649 
650 static int cmd_finalize(struct opal_dev *cmd, u32 hsn, u32 tsn)
651 {
652 	struct opal_header *hdr;
653 	int err = 0;
654 
655 	add_token_u8(&err, cmd, OPAL_ENDOFDATA);
656 	add_token_u8(&err, cmd, OPAL_STARTLIST);
657 	add_token_u8(&err, cmd, 0);
658 	add_token_u8(&err, cmd, 0);
659 	add_token_u8(&err, cmd, 0);
660 	add_token_u8(&err, cmd, OPAL_ENDLIST);
661 
662 	if (err) {
663 		pr_debug("Error finalizing command.\n");
664 		return -EFAULT;
665 	}
666 
667 	hdr = (struct opal_header *) cmd->cmd;
668 
669 	hdr->pkt.tsn = cpu_to_be32(tsn);
670 	hdr->pkt.hsn = cpu_to_be32(hsn);
671 
672 	hdr->subpkt.length = cpu_to_be32(cmd->pos - sizeof(*hdr));
673 	while (cmd->pos % 4) {
674 		if (cmd->pos >= IO_BUFFER_LENGTH) {
675 			pr_debug("Error: Buffer overrun\n");
676 			return -ERANGE;
677 		}
678 		cmd->cmd[cmd->pos++] = 0;
679 	}
680 	hdr->pkt.length = cpu_to_be32(cmd->pos - sizeof(hdr->cp) -
681 				      sizeof(hdr->pkt));
682 	hdr->cp.length = cpu_to_be32(cmd->pos - sizeof(hdr->cp));
683 
684 	return 0;
685 }
686 
687 static const struct opal_resp_tok *response_get_token(
688 				const struct parsed_resp *resp,
689 				int n)
690 {
691 	const struct opal_resp_tok *tok;
692 
693 	if (n >= resp->num) {
694 		pr_debug("Token number doesn't exist: %d, resp: %d\n",
695 			 n, resp->num);
696 		return ERR_PTR(-EINVAL);
697 	}
698 
699 	tok = &resp->toks[n];
700 	if (tok->len == 0) {
701 		pr_debug("Token length must be non-zero\n");
702 		return ERR_PTR(-EINVAL);
703 	}
704 
705 	return tok;
706 }
707 
708 static ssize_t response_parse_tiny(struct opal_resp_tok *tok,
709 				   const u8 *pos)
710 {
711 	tok->pos = pos;
712 	tok->len = 1;
713 	tok->width = OPAL_WIDTH_TINY;
714 
715 	if (pos[0] & TINY_ATOM_SIGNED) {
716 		tok->type = OPAL_DTA_TOKENID_SINT;
717 	} else {
718 		tok->type = OPAL_DTA_TOKENID_UINT;
719 		tok->stored.u = pos[0] & 0x3f;
720 	}
721 
722 	return tok->len;
723 }
724 
725 static ssize_t response_parse_short(struct opal_resp_tok *tok,
726 				    const u8 *pos)
727 {
728 	tok->pos = pos;
729 	tok->len = (pos[0] & SHORT_ATOM_LEN_MASK) + 1;
730 	tok->width = OPAL_WIDTH_SHORT;
731 
732 	if (pos[0] & SHORT_ATOM_BYTESTRING) {
733 		tok->type = OPAL_DTA_TOKENID_BYTESTRING;
734 	} else if (pos[0] & SHORT_ATOM_SIGNED) {
735 		tok->type = OPAL_DTA_TOKENID_SINT;
736 	} else {
737 		u64 u_integer = 0;
738 		ssize_t i, b = 0;
739 
740 		tok->type = OPAL_DTA_TOKENID_UINT;
741 		if (tok->len > 9) {
742 			pr_debug("uint64 with more than 8 bytes\n");
743 			return -EINVAL;
744 		}
745 		for (i = tok->len - 1; i > 0; i--) {
746 			u_integer |= ((u64)pos[i] << (8 * b));
747 			b++;
748 		}
749 		tok->stored.u = u_integer;
750 	}
751 
752 	return tok->len;
753 }
754 
755 static ssize_t response_parse_medium(struct opal_resp_tok *tok,
756 				     const u8 *pos)
757 {
758 	tok->pos = pos;
759 	tok->len = (((pos[0] & MEDIUM_ATOM_LEN_MASK) << 8) | pos[1]) + 2;
760 	tok->width = OPAL_WIDTH_MEDIUM;
761 
762 	if (pos[0] & MEDIUM_ATOM_BYTESTRING)
763 		tok->type = OPAL_DTA_TOKENID_BYTESTRING;
764 	else if (pos[0] & MEDIUM_ATOM_SIGNED)
765 		tok->type = OPAL_DTA_TOKENID_SINT;
766 	else
767 		tok->type = OPAL_DTA_TOKENID_UINT;
768 
769 	return tok->len;
770 }
771 
772 static ssize_t response_parse_long(struct opal_resp_tok *tok,
773 				   const u8 *pos)
774 {
775 	tok->pos = pos;
776 	tok->len = ((pos[1] << 16) | (pos[2] << 8) | pos[3]) + 4;
777 	tok->width = OPAL_WIDTH_LONG;
778 
779 	if (pos[0] & LONG_ATOM_BYTESTRING)
780 		tok->type = OPAL_DTA_TOKENID_BYTESTRING;
781 	else if (pos[0] & LONG_ATOM_SIGNED)
782 		tok->type = OPAL_DTA_TOKENID_SINT;
783 	else
784 		tok->type = OPAL_DTA_TOKENID_UINT;
785 
786 	return tok->len;
787 }
788 
789 static ssize_t response_parse_token(struct opal_resp_tok *tok,
790 				    const u8 *pos)
791 {
792 	tok->pos = pos;
793 	tok->len = 1;
794 	tok->type = OPAL_DTA_TOKENID_TOKEN;
795 	tok->width = OPAL_WIDTH_TOKEN;
796 
797 	return tok->len;
798 }
799 
800 static int response_parse(const u8 *buf, size_t length,
801 			  struct parsed_resp *resp)
802 {
803 	const struct opal_header *hdr;
804 	struct opal_resp_tok *iter;
805 	int num_entries = 0;
806 	int total;
807 	ssize_t token_length;
808 	const u8 *pos;
809 	u32 clen, plen, slen;
810 
811 	if (!buf)
812 		return -EFAULT;
813 
814 	if (!resp)
815 		return -EFAULT;
816 
817 	hdr = (struct opal_header *)buf;
818 	pos = buf;
819 	pos += sizeof(*hdr);
820 
821 	clen = be32_to_cpu(hdr->cp.length);
822 	plen = be32_to_cpu(hdr->pkt.length);
823 	slen = be32_to_cpu(hdr->subpkt.length);
824 	pr_debug("Response size: cp: %u, pkt: %u, subpkt: %u\n",
825 		 clen, plen, slen);
826 
827 	if (clen == 0 || plen == 0 || slen == 0 ||
828 	    slen > IO_BUFFER_LENGTH - sizeof(*hdr)) {
829 		pr_debug("Bad header length. cp: %u, pkt: %u, subpkt: %u\n",
830 			 clen, plen, slen);
831 		print_buffer(pos, sizeof(*hdr));
832 		return -EINVAL;
833 	}
834 
835 	if (pos > buf + length)
836 		return -EFAULT;
837 
838 	iter = resp->toks;
839 	total = slen;
840 	print_buffer(pos, total);
841 	while (total > 0) {
842 		if (pos[0] <= TINY_ATOM_BYTE) /* tiny atom */
843 			token_length = response_parse_tiny(iter, pos);
844 		else if (pos[0] <= SHORT_ATOM_BYTE) /* short atom */
845 			token_length = response_parse_short(iter, pos);
846 		else if (pos[0] <= MEDIUM_ATOM_BYTE) /* medium atom */
847 			token_length = response_parse_medium(iter, pos);
848 		else if (pos[0] <= LONG_ATOM_BYTE) /* long atom */
849 			token_length = response_parse_long(iter, pos);
850 		else /* TOKEN */
851 			token_length = response_parse_token(iter, pos);
852 
853 		if (token_length < 0)
854 			return token_length;
855 
856 		pos += token_length;
857 		total -= token_length;
858 		iter++;
859 		num_entries++;
860 	}
861 
862 	if (num_entries == 0) {
863 		pr_debug("Couldn't parse response.\n");
864 		return -EINVAL;
865 	}
866 	resp->num = num_entries;
867 
868 	return 0;
869 }
870 
871 static size_t response_get_string(const struct parsed_resp *resp, int n,
872 				  const char **store)
873 {
874 	*store = NULL;
875 	if (!resp) {
876 		pr_debug("Response is NULL\n");
877 		return 0;
878 	}
879 
880 	if (n > resp->num) {
881 		pr_debug("Response has %d tokens. Can't access %d\n",
882 			 resp->num, n);
883 		return 0;
884 	}
885 
886 	if (resp->toks[n].type != OPAL_DTA_TOKENID_BYTESTRING) {
887 		pr_debug("Token is not a byte string!\n");
888 		return 0;
889 	}
890 
891 	*store = resp->toks[n].pos + 1;
892 	return resp->toks[n].len - 1;
893 }
894 
895 static u64 response_get_u64(const struct parsed_resp *resp, int n)
896 {
897 	if (!resp) {
898 		pr_debug("Response is NULL\n");
899 		return 0;
900 	}
901 
902 	if (n > resp->num) {
903 		pr_debug("Response has %d tokens. Can't access %d\n",
904 			 resp->num, n);
905 		return 0;
906 	}
907 
908 	if (resp->toks[n].type != OPAL_DTA_TOKENID_UINT) {
909 		pr_debug("Token is not unsigned it: %d\n",
910 			 resp->toks[n].type);
911 		return 0;
912 	}
913 
914 	if (!(resp->toks[n].width == OPAL_WIDTH_TINY ||
915 	      resp->toks[n].width == OPAL_WIDTH_SHORT)) {
916 		pr_debug("Atom is not short or tiny: %d\n",
917 			 resp->toks[n].width);
918 		return 0;
919 	}
920 
921 	return resp->toks[n].stored.u;
922 }
923 
924 static bool response_token_matches(const struct opal_resp_tok *token, u8 match)
925 {
926 	if (IS_ERR(token) ||
927 	    token->type != OPAL_DTA_TOKENID_TOKEN ||
928 	    token->pos[0] != match)
929 		return false;
930 	return true;
931 }
932 
933 static u8 response_status(const struct parsed_resp *resp)
934 {
935 	const struct opal_resp_tok *tok;
936 
937 	tok = response_get_token(resp, 0);
938 	if (response_token_matches(tok, OPAL_ENDOFSESSION))
939 		return 0;
940 
941 	if (resp->num < 5)
942 		return DTAERROR_NO_METHOD_STATUS;
943 
944 	tok = response_get_token(resp, resp->num - 5);
945 	if (!response_token_matches(tok, OPAL_STARTLIST))
946 		return DTAERROR_NO_METHOD_STATUS;
947 
948 	tok = response_get_token(resp, resp->num - 1);
949 	if (!response_token_matches(tok, OPAL_ENDLIST))
950 		return DTAERROR_NO_METHOD_STATUS;
951 
952 	return response_get_u64(resp, resp->num - 4);
953 }
954 
955 /* Parses and checks for errors */
956 static int parse_and_check_status(struct opal_dev *dev)
957 {
958 	int error;
959 
960 	print_buffer(dev->cmd, dev->pos);
961 
962 	error = response_parse(dev->resp, IO_BUFFER_LENGTH, &dev->parsed);
963 	if (error) {
964 		pr_debug("Couldn't parse response.\n");
965 		return error;
966 	}
967 
968 	return response_status(&dev->parsed);
969 }
970 
971 static void clear_opal_cmd(struct opal_dev *dev)
972 {
973 	dev->pos = sizeof(struct opal_header);
974 	memset(dev->cmd, 0, IO_BUFFER_LENGTH);
975 }
976 
977 static int start_opal_session_cont(struct opal_dev *dev)
978 {
979 	u32 hsn, tsn;
980 	int error = 0;
981 
982 	error = parse_and_check_status(dev);
983 	if (error)
984 		return error;
985 
986 	hsn = response_get_u64(&dev->parsed, 4);
987 	tsn = response_get_u64(&dev->parsed, 5);
988 
989 	if (hsn == 0 && tsn == 0) {
990 		pr_debug("Couldn't authenticate session\n");
991 		return -EPERM;
992 	}
993 
994 	dev->hsn = hsn;
995 	dev->tsn = tsn;
996 	return 0;
997 }
998 
999 static void add_suspend_info(struct opal_dev *dev,
1000 			     struct opal_suspend_data *sus)
1001 {
1002 	struct opal_suspend_data *iter;
1003 
1004 	list_for_each_entry(iter, &dev->unlk_lst, node) {
1005 		if (iter->lr == sus->lr) {
1006 			list_del(&iter->node);
1007 			kfree(iter);
1008 			break;
1009 		}
1010 	}
1011 	list_add_tail(&sus->node, &dev->unlk_lst);
1012 }
1013 
1014 static int end_session_cont(struct opal_dev *dev)
1015 {
1016 	dev->hsn = 0;
1017 	dev->tsn = 0;
1018 	return parse_and_check_status(dev);
1019 }
1020 
1021 static int finalize_and_send(struct opal_dev *dev, cont_fn cont)
1022 {
1023 	int ret;
1024 
1025 	ret = cmd_finalize(dev, dev->hsn, dev->tsn);
1026 	if (ret) {
1027 		pr_debug("Error finalizing command buffer: %d\n", ret);
1028 		return ret;
1029 	}
1030 
1031 	print_buffer(dev->cmd, dev->pos);
1032 
1033 	return opal_send_recv(dev, cont);
1034 }
1035 
1036 static int gen_key(struct opal_dev *dev, void *data)
1037 {
1038 	u8 uid[OPAL_UID_LENGTH];
1039 	int err = 0;
1040 
1041 	clear_opal_cmd(dev);
1042 	set_comid(dev, dev->comid);
1043 
1044 	memcpy(uid, dev->prev_data, min(sizeof(uid), dev->prev_d_len));
1045 	kfree(dev->prev_data);
1046 	dev->prev_data = NULL;
1047 
1048 	add_token_u8(&err, dev, OPAL_CALL);
1049 	add_token_bytestring(&err, dev, uid, OPAL_UID_LENGTH);
1050 	add_token_bytestring(&err, dev, opalmethod[OPAL_GENKEY],
1051 			     OPAL_UID_LENGTH);
1052 	add_token_u8(&err, dev, OPAL_STARTLIST);
1053 	add_token_u8(&err, dev, OPAL_ENDLIST);
1054 
1055 	if (err) {
1056 		pr_debug("Error building gen key command\n");
1057 		return err;
1058 
1059 	}
1060 	return finalize_and_send(dev, parse_and_check_status);
1061 }
1062 
1063 static int get_active_key_cont(struct opal_dev *dev)
1064 {
1065 	const char *activekey;
1066 	size_t keylen;
1067 	int error = 0;
1068 
1069 	error = parse_and_check_status(dev);
1070 	if (error)
1071 		return error;
1072 	keylen = response_get_string(&dev->parsed, 4, &activekey);
1073 	if (!activekey) {
1074 		pr_debug("%s: Couldn't extract the Activekey from the response\n",
1075 			 __func__);
1076 		return OPAL_INVAL_PARAM;
1077 	}
1078 	dev->prev_data = kmemdup(activekey, keylen, GFP_KERNEL);
1079 
1080 	if (!dev->prev_data)
1081 		return -ENOMEM;
1082 
1083 	dev->prev_d_len = keylen;
1084 
1085 	return 0;
1086 }
1087 
1088 static int get_active_key(struct opal_dev *dev, void *data)
1089 {
1090 	u8 uid[OPAL_UID_LENGTH];
1091 	int err = 0;
1092 	u8 *lr = data;
1093 
1094 	clear_opal_cmd(dev);
1095 	set_comid(dev, dev->comid);
1096 
1097 	err = build_locking_range(uid, sizeof(uid), *lr);
1098 	if (err)
1099 		return err;
1100 
1101 	err = 0;
1102 	add_token_u8(&err, dev, OPAL_CALL);
1103 	add_token_bytestring(&err, dev, uid, OPAL_UID_LENGTH);
1104 	add_token_bytestring(&err, dev, opalmethod[OPAL_GET], OPAL_UID_LENGTH);
1105 	add_token_u8(&err, dev, OPAL_STARTLIST);
1106 	add_token_u8(&err, dev, OPAL_STARTLIST);
1107 	add_token_u8(&err, dev, OPAL_STARTNAME);
1108 	add_token_u8(&err, dev, 3); /* startCloumn */
1109 	add_token_u8(&err, dev, 10); /* ActiveKey */
1110 	add_token_u8(&err, dev, OPAL_ENDNAME);
1111 	add_token_u8(&err, dev, OPAL_STARTNAME);
1112 	add_token_u8(&err, dev, 4); /* endColumn */
1113 	add_token_u8(&err, dev, 10); /* ActiveKey */
1114 	add_token_u8(&err, dev, OPAL_ENDNAME);
1115 	add_token_u8(&err, dev, OPAL_ENDLIST);
1116 	add_token_u8(&err, dev, OPAL_ENDLIST);
1117 	if (err) {
1118 		pr_debug("Error building get active key command\n");
1119 		return err;
1120 	}
1121 
1122 	return finalize_and_send(dev, get_active_key_cont);
1123 }
1124 
1125 static int generic_lr_enable_disable(struct opal_dev *dev,
1126 				     u8 *uid, bool rle, bool wle,
1127 				     bool rl, bool wl)
1128 {
1129 	int err = 0;
1130 
1131 	add_token_u8(&err, dev, OPAL_CALL);
1132 	add_token_bytestring(&err, dev, uid, OPAL_UID_LENGTH);
1133 	add_token_bytestring(&err, dev, opalmethod[OPAL_SET], OPAL_UID_LENGTH);
1134 
1135 	add_token_u8(&err, dev, OPAL_STARTLIST);
1136 	add_token_u8(&err, dev, OPAL_STARTNAME);
1137 	add_token_u8(&err, dev, OPAL_VALUES);
1138 	add_token_u8(&err, dev, OPAL_STARTLIST);
1139 
1140 	add_token_u8(&err, dev, OPAL_STARTNAME);
1141 	add_token_u8(&err, dev, 5); /* ReadLockEnabled */
1142 	add_token_u8(&err, dev, rle);
1143 	add_token_u8(&err, dev, OPAL_ENDNAME);
1144 
1145 	add_token_u8(&err, dev, OPAL_STARTNAME);
1146 	add_token_u8(&err, dev, 6); /* WriteLockEnabled */
1147 	add_token_u8(&err, dev, wle);
1148 	add_token_u8(&err, dev, OPAL_ENDNAME);
1149 
1150 	add_token_u8(&err, dev, OPAL_STARTNAME);
1151 	add_token_u8(&err, dev, OPAL_READLOCKED);
1152 	add_token_u8(&err, dev, rl);
1153 	add_token_u8(&err, dev, OPAL_ENDNAME);
1154 
1155 	add_token_u8(&err, dev, OPAL_STARTNAME);
1156 	add_token_u8(&err, dev, OPAL_WRITELOCKED);
1157 	add_token_u8(&err, dev, wl);
1158 	add_token_u8(&err, dev, OPAL_ENDNAME);
1159 
1160 	add_token_u8(&err, dev, OPAL_ENDLIST);
1161 	add_token_u8(&err, dev, OPAL_ENDNAME);
1162 	add_token_u8(&err, dev, OPAL_ENDLIST);
1163 	return err;
1164 }
1165 
1166 static inline int enable_global_lr(struct opal_dev *dev, u8 *uid,
1167 				   struct opal_user_lr_setup *setup)
1168 {
1169 	int err;
1170 
1171 	err = generic_lr_enable_disable(dev, uid, !!setup->RLE, !!setup->WLE,
1172 					0, 0);
1173 	if (err)
1174 		pr_debug("Failed to create enable global lr command\n");
1175 	return err;
1176 }
1177 
1178 static int setup_locking_range(struct opal_dev *dev, void *data)
1179 {
1180 	u8 uid[OPAL_UID_LENGTH];
1181 	struct opal_user_lr_setup *setup = data;
1182 	u8 lr;
1183 	int err = 0;
1184 
1185 	clear_opal_cmd(dev);
1186 	set_comid(dev, dev->comid);
1187 
1188 	lr = setup->session.opal_key.lr;
1189 	err = build_locking_range(uid, sizeof(uid), lr);
1190 	if (err)
1191 		return err;
1192 
1193 	if (lr == 0)
1194 		err = enable_global_lr(dev, uid, setup);
1195 	else {
1196 		add_token_u8(&err, dev, OPAL_CALL);
1197 		add_token_bytestring(&err, dev, uid, OPAL_UID_LENGTH);
1198 		add_token_bytestring(&err, dev, opalmethod[OPAL_SET],
1199 				     OPAL_UID_LENGTH);
1200 
1201 		add_token_u8(&err, dev, OPAL_STARTLIST);
1202 		add_token_u8(&err, dev, OPAL_STARTNAME);
1203 		add_token_u8(&err, dev, OPAL_VALUES);
1204 		add_token_u8(&err, dev, OPAL_STARTLIST);
1205 
1206 		add_token_u8(&err, dev, OPAL_STARTNAME);
1207 		add_token_u8(&err, dev, 3); /* Ranges Start */
1208 		add_token_u64(&err, dev, setup->range_start);
1209 		add_token_u8(&err, dev, OPAL_ENDNAME);
1210 
1211 		add_token_u8(&err, dev, OPAL_STARTNAME);
1212 		add_token_u8(&err, dev, 4); /* Ranges length */
1213 		add_token_u64(&err, dev, setup->range_length);
1214 		add_token_u8(&err, dev, OPAL_ENDNAME);
1215 
1216 		add_token_u8(&err, dev, OPAL_STARTNAME);
1217 		add_token_u8(&err, dev, 5); /*ReadLockEnabled */
1218 		add_token_u64(&err, dev, !!setup->RLE);
1219 		add_token_u8(&err, dev, OPAL_ENDNAME);
1220 
1221 		add_token_u8(&err, dev, OPAL_STARTNAME);
1222 		add_token_u8(&err, dev, 6); /*WriteLockEnabled*/
1223 		add_token_u64(&err, dev, !!setup->WLE);
1224 		add_token_u8(&err, dev, OPAL_ENDNAME);
1225 
1226 		add_token_u8(&err, dev, OPAL_ENDLIST);
1227 		add_token_u8(&err, dev, OPAL_ENDNAME);
1228 		add_token_u8(&err, dev, OPAL_ENDLIST);
1229 
1230 	}
1231 	if (err) {
1232 		pr_debug("Error building Setup Locking range command.\n");
1233 		return err;
1234 
1235 	}
1236 
1237 	return finalize_and_send(dev, parse_and_check_status);
1238 }
1239 
1240 static int start_generic_opal_session(struct opal_dev *dev,
1241 				      enum opal_uid auth,
1242 				      enum opal_uid sp_type,
1243 				      const char *key,
1244 				      u8 key_len)
1245 {
1246 	u32 hsn;
1247 	int err = 0;
1248 
1249 	if (key == NULL && auth != OPAL_ANYBODY_UID)
1250 		return OPAL_INVAL_PARAM;
1251 
1252 	clear_opal_cmd(dev);
1253 
1254 	set_comid(dev, dev->comid);
1255 	hsn = GENERIC_HOST_SESSION_NUM;
1256 
1257 	add_token_u8(&err, dev, OPAL_CALL);
1258 	add_token_bytestring(&err, dev, opaluid[OPAL_SMUID_UID],
1259 			     OPAL_UID_LENGTH);
1260 	add_token_bytestring(&err, dev, opalmethod[OPAL_STARTSESSION],
1261 			     OPAL_UID_LENGTH);
1262 	add_token_u8(&err, dev, OPAL_STARTLIST);
1263 	add_token_u64(&err, dev, hsn);
1264 	add_token_bytestring(&err, dev, opaluid[sp_type], OPAL_UID_LENGTH);
1265 	add_token_u8(&err, dev, 1);
1266 
1267 	switch (auth) {
1268 	case OPAL_ANYBODY_UID:
1269 		add_token_u8(&err, dev, OPAL_ENDLIST);
1270 		break;
1271 	case OPAL_ADMIN1_UID:
1272 	case OPAL_SID_UID:
1273 		add_token_u8(&err, dev, OPAL_STARTNAME);
1274 		add_token_u8(&err, dev, 0); /* HostChallenge */
1275 		add_token_bytestring(&err, dev, key, key_len);
1276 		add_token_u8(&err, dev, OPAL_ENDNAME);
1277 		add_token_u8(&err, dev, OPAL_STARTNAME);
1278 		add_token_u8(&err, dev, 3); /* HostSignAuth */
1279 		add_token_bytestring(&err, dev, opaluid[auth],
1280 				     OPAL_UID_LENGTH);
1281 		add_token_u8(&err, dev, OPAL_ENDNAME);
1282 		add_token_u8(&err, dev, OPAL_ENDLIST);
1283 		break;
1284 	default:
1285 		pr_debug("Cannot start Admin SP session with auth %d\n", auth);
1286 		return OPAL_INVAL_PARAM;
1287 	}
1288 
1289 	if (err) {
1290 		pr_debug("Error building start adminsp session command.\n");
1291 		return err;
1292 	}
1293 
1294 	return finalize_and_send(dev, start_opal_session_cont);
1295 }
1296 
1297 static int start_anybodyASP_opal_session(struct opal_dev *dev, void *data)
1298 {
1299 	return start_generic_opal_session(dev, OPAL_ANYBODY_UID,
1300 					  OPAL_ADMINSP_UID, NULL, 0);
1301 }
1302 
1303 static int start_SIDASP_opal_session(struct opal_dev *dev, void *data)
1304 {
1305 	int ret;
1306 	const u8 *key = dev->prev_data;
1307 
1308 	if (!key) {
1309 		const struct opal_key *okey = data;
1310 		ret = start_generic_opal_session(dev, OPAL_SID_UID,
1311 						 OPAL_ADMINSP_UID,
1312 						 okey->key,
1313 						 okey->key_len);
1314 	} else {
1315 		ret = start_generic_opal_session(dev, OPAL_SID_UID,
1316 						 OPAL_ADMINSP_UID,
1317 						 key, dev->prev_d_len);
1318 		kfree(key);
1319 		dev->prev_data = NULL;
1320 	}
1321 	return ret;
1322 }
1323 
1324 static int start_admin1LSP_opal_session(struct opal_dev *dev, void *data)
1325 {
1326 	struct opal_key *key = data;
1327 	return start_generic_opal_session(dev, OPAL_ADMIN1_UID,
1328 					  OPAL_LOCKINGSP_UID,
1329 					  key->key, key->key_len);
1330 }
1331 
1332 static int start_auth_opal_session(struct opal_dev *dev, void *data)
1333 {
1334 	struct opal_session_info *session = data;
1335 	u8 lk_ul_user[OPAL_UID_LENGTH];
1336 	size_t keylen = session->opal_key.key_len;
1337 	int err = 0;
1338 
1339 	u8 *key = session->opal_key.key;
1340 	u32 hsn = GENERIC_HOST_SESSION_NUM;
1341 
1342 	clear_opal_cmd(dev);
1343 	set_comid(dev, dev->comid);
1344 
1345 	if (session->sum) {
1346 		err = build_locking_user(lk_ul_user, sizeof(lk_ul_user),
1347 					 session->opal_key.lr);
1348 		if (err)
1349 			return err;
1350 
1351 	} else if (session->who != OPAL_ADMIN1 && !session->sum) {
1352 		err = build_locking_user(lk_ul_user, sizeof(lk_ul_user),
1353 					 session->who - 1);
1354 		if (err)
1355 			return err;
1356 	} else
1357 		memcpy(lk_ul_user, opaluid[OPAL_ADMIN1_UID], OPAL_UID_LENGTH);
1358 
1359 	add_token_u8(&err, dev, OPAL_CALL);
1360 	add_token_bytestring(&err, dev, opaluid[OPAL_SMUID_UID],
1361 			     OPAL_UID_LENGTH);
1362 	add_token_bytestring(&err, dev, opalmethod[OPAL_STARTSESSION],
1363 			     OPAL_UID_LENGTH);
1364 
1365 	add_token_u8(&err, dev, OPAL_STARTLIST);
1366 	add_token_u64(&err, dev, hsn);
1367 	add_token_bytestring(&err, dev, opaluid[OPAL_LOCKINGSP_UID],
1368 			     OPAL_UID_LENGTH);
1369 	add_token_u8(&err, dev, 1);
1370 	add_token_u8(&err, dev, OPAL_STARTNAME);
1371 	add_token_u8(&err, dev, 0);
1372 	add_token_bytestring(&err, dev, key, keylen);
1373 	add_token_u8(&err, dev, OPAL_ENDNAME);
1374 	add_token_u8(&err, dev, OPAL_STARTNAME);
1375 	add_token_u8(&err, dev, 3);
1376 	add_token_bytestring(&err, dev, lk_ul_user, OPAL_UID_LENGTH);
1377 	add_token_u8(&err, dev, OPAL_ENDNAME);
1378 	add_token_u8(&err, dev, OPAL_ENDLIST);
1379 
1380 	if (err) {
1381 		pr_debug("Error building STARTSESSION command.\n");
1382 		return err;
1383 	}
1384 
1385 	return finalize_and_send(dev, start_opal_session_cont);
1386 }
1387 
1388 static int revert_tper(struct opal_dev *dev, void *data)
1389 {
1390 	int err = 0;
1391 
1392 	clear_opal_cmd(dev);
1393 	set_comid(dev, dev->comid);
1394 
1395 	add_token_u8(&err, dev, OPAL_CALL);
1396 	add_token_bytestring(&err, dev, opaluid[OPAL_ADMINSP_UID],
1397 			     OPAL_UID_LENGTH);
1398 	add_token_bytestring(&err, dev, opalmethod[OPAL_REVERT],
1399 			     OPAL_UID_LENGTH);
1400 	add_token_u8(&err, dev, OPAL_STARTLIST);
1401 	add_token_u8(&err, dev, OPAL_ENDLIST);
1402 	if (err) {
1403 		pr_debug("Error building REVERT TPER command.\n");
1404 		return err;
1405 	}
1406 
1407 	return finalize_and_send(dev, parse_and_check_status);
1408 }
1409 
1410 static int internal_activate_user(struct opal_dev *dev, void *data)
1411 {
1412 	struct opal_session_info *session = data;
1413 	u8 uid[OPAL_UID_LENGTH];
1414 	int err = 0;
1415 
1416 	clear_opal_cmd(dev);
1417 	set_comid(dev, dev->comid);
1418 
1419 	memcpy(uid, opaluid[OPAL_USER1_UID], OPAL_UID_LENGTH);
1420 	uid[7] = session->who;
1421 
1422 	add_token_u8(&err, dev, OPAL_CALL);
1423 	add_token_bytestring(&err, dev, uid, OPAL_UID_LENGTH);
1424 	add_token_bytestring(&err, dev, opalmethod[OPAL_SET], OPAL_UID_LENGTH);
1425 	add_token_u8(&err, dev, OPAL_STARTLIST);
1426 	add_token_u8(&err, dev, OPAL_STARTNAME);
1427 	add_token_u8(&err, dev, OPAL_VALUES);
1428 	add_token_u8(&err, dev, OPAL_STARTLIST);
1429 	add_token_u8(&err, dev, OPAL_STARTNAME);
1430 	add_token_u8(&err, dev, 5); /* Enabled */
1431 	add_token_u8(&err, dev, OPAL_TRUE);
1432 	add_token_u8(&err, dev, OPAL_ENDNAME);
1433 	add_token_u8(&err, dev, OPAL_ENDLIST);
1434 	add_token_u8(&err, dev, OPAL_ENDNAME);
1435 	add_token_u8(&err, dev, OPAL_ENDLIST);
1436 
1437 	if (err) {
1438 		pr_debug("Error building Activate UserN command.\n");
1439 		return err;
1440 	}
1441 
1442 	return finalize_and_send(dev, parse_and_check_status);
1443 }
1444 
1445 static int erase_locking_range(struct opal_dev *dev, void *data)
1446 {
1447 	struct opal_session_info *session = data;
1448 	u8 uid[OPAL_UID_LENGTH];
1449 	int err = 0;
1450 
1451 	clear_opal_cmd(dev);
1452 	set_comid(dev, dev->comid);
1453 
1454 	if (build_locking_range(uid, sizeof(uid), session->opal_key.lr) < 0)
1455 		return -ERANGE;
1456 
1457 	add_token_u8(&err, dev, OPAL_CALL);
1458 	add_token_bytestring(&err, dev, uid, OPAL_UID_LENGTH);
1459 	add_token_bytestring(&err, dev, opalmethod[OPAL_ERASE],
1460 			     OPAL_UID_LENGTH);
1461 	add_token_u8(&err, dev, OPAL_STARTLIST);
1462 	add_token_u8(&err, dev, OPAL_ENDLIST);
1463 
1464 	if (err) {
1465 		pr_debug("Error building Erase Locking Range Command.\n");
1466 		return err;
1467 	}
1468 	return finalize_and_send(dev, parse_and_check_status);
1469 }
1470 
1471 static int set_mbr_done(struct opal_dev *dev, void *data)
1472 {
1473 	u8 *mbr_done_tf = data;
1474 	int err = 0;
1475 
1476 	clear_opal_cmd(dev);
1477 	set_comid(dev, dev->comid);
1478 
1479 	add_token_u8(&err, dev, OPAL_CALL);
1480 	add_token_bytestring(&err, dev, opaluid[OPAL_MBRCONTROL],
1481 			     OPAL_UID_LENGTH);
1482 	add_token_bytestring(&err, dev, opalmethod[OPAL_SET], OPAL_UID_LENGTH);
1483 	add_token_u8(&err, dev, OPAL_STARTLIST);
1484 	add_token_u8(&err, dev, OPAL_STARTNAME);
1485 	add_token_u8(&err, dev, OPAL_VALUES);
1486 	add_token_u8(&err, dev, OPAL_STARTLIST);
1487 	add_token_u8(&err, dev, OPAL_STARTNAME);
1488 	add_token_u8(&err, dev, 2); /* Done */
1489 	add_token_u8(&err, dev, *mbr_done_tf); /* Done T or F */
1490 	add_token_u8(&err, dev, OPAL_ENDNAME);
1491 	add_token_u8(&err, dev, OPAL_ENDLIST);
1492 	add_token_u8(&err, dev, OPAL_ENDNAME);
1493 	add_token_u8(&err, dev, OPAL_ENDLIST);
1494 
1495 	if (err) {
1496 		pr_debug("Error Building set MBR Done command\n");
1497 		return err;
1498 	}
1499 
1500 	return finalize_and_send(dev, parse_and_check_status);
1501 }
1502 
1503 static int set_mbr_enable_disable(struct opal_dev *dev, void *data)
1504 {
1505 	u8 *mbr_en_dis = data;
1506 	int err = 0;
1507 
1508 	clear_opal_cmd(dev);
1509 	set_comid(dev, dev->comid);
1510 
1511 	add_token_u8(&err, dev, OPAL_CALL);
1512 	add_token_bytestring(&err, dev, opaluid[OPAL_MBRCONTROL],
1513 			     OPAL_UID_LENGTH);
1514 	add_token_bytestring(&err, dev, opalmethod[OPAL_SET], OPAL_UID_LENGTH);
1515 	add_token_u8(&err, dev, OPAL_STARTLIST);
1516 	add_token_u8(&err, dev, OPAL_STARTNAME);
1517 	add_token_u8(&err, dev, OPAL_VALUES);
1518 	add_token_u8(&err, dev, OPAL_STARTLIST);
1519 	add_token_u8(&err, dev, OPAL_STARTNAME);
1520 	add_token_u8(&err, dev, 1);
1521 	add_token_u8(&err, dev, *mbr_en_dis);
1522 	add_token_u8(&err, dev, OPAL_ENDNAME);
1523 	add_token_u8(&err, dev, OPAL_ENDLIST);
1524 	add_token_u8(&err, dev, OPAL_ENDNAME);
1525 	add_token_u8(&err, dev, OPAL_ENDLIST);
1526 
1527 	if (err) {
1528 		pr_debug("Error Building set MBR done command\n");
1529 		return err;
1530 	}
1531 
1532 	return finalize_and_send(dev, parse_and_check_status);
1533 }
1534 
1535 static int generic_pw_cmd(u8 *key, size_t key_len, u8 *cpin_uid,
1536 			  struct opal_dev *dev)
1537 {
1538 	int err = 0;
1539 
1540 	clear_opal_cmd(dev);
1541 	set_comid(dev, dev->comid);
1542 
1543 	add_token_u8(&err, dev, OPAL_CALL);
1544 	add_token_bytestring(&err, dev, cpin_uid, OPAL_UID_LENGTH);
1545 	add_token_bytestring(&err, dev, opalmethod[OPAL_SET],
1546 			     OPAL_UID_LENGTH);
1547 	add_token_u8(&err, dev, OPAL_STARTLIST);
1548 	add_token_u8(&err, dev, OPAL_STARTNAME);
1549 	add_token_u8(&err, dev, OPAL_VALUES);
1550 	add_token_u8(&err, dev, OPAL_STARTLIST);
1551 	add_token_u8(&err, dev, OPAL_STARTNAME);
1552 	add_token_u8(&err, dev, 3); /* PIN */
1553 	add_token_bytestring(&err, dev, key, key_len);
1554 	add_token_u8(&err, dev, OPAL_ENDNAME);
1555 	add_token_u8(&err, dev, OPAL_ENDLIST);
1556 	add_token_u8(&err, dev, OPAL_ENDNAME);
1557 	add_token_u8(&err, dev, OPAL_ENDLIST);
1558 
1559 	return err;
1560 }
1561 
1562 static int set_new_pw(struct opal_dev *dev, void *data)
1563 {
1564 	u8 cpin_uid[OPAL_UID_LENGTH];
1565 	struct opal_session_info *usr = data;
1566 
1567 	memcpy(cpin_uid, opaluid[OPAL_C_PIN_ADMIN1], OPAL_UID_LENGTH);
1568 
1569 	if (usr->who != OPAL_ADMIN1) {
1570 		cpin_uid[5] = 0x03;
1571 		if (usr->sum)
1572 			cpin_uid[7] = usr->opal_key.lr + 1;
1573 		else
1574 			cpin_uid[7] = usr->who;
1575 	}
1576 
1577 	if (generic_pw_cmd(usr->opal_key.key, usr->opal_key.key_len,
1578 			   cpin_uid, dev)) {
1579 		pr_debug("Error building set password command.\n");
1580 		return -ERANGE;
1581 	}
1582 
1583 	return finalize_and_send(dev, parse_and_check_status);
1584 }
1585 
1586 static int set_sid_cpin_pin(struct opal_dev *dev, void *data)
1587 {
1588 	u8 cpin_uid[OPAL_UID_LENGTH];
1589 	struct opal_key *key = data;
1590 
1591 	memcpy(cpin_uid, opaluid[OPAL_C_PIN_SID], OPAL_UID_LENGTH);
1592 
1593 	if (generic_pw_cmd(key->key, key->key_len, cpin_uid, dev)) {
1594 		pr_debug("Error building Set SID cpin\n");
1595 		return -ERANGE;
1596 	}
1597 	return finalize_and_send(dev, parse_and_check_status);
1598 }
1599 
1600 static int add_user_to_lr(struct opal_dev *dev, void *data)
1601 {
1602 	u8 lr_buffer[OPAL_UID_LENGTH];
1603 	u8 user_uid[OPAL_UID_LENGTH];
1604 	struct opal_lock_unlock *lkul = data;
1605 	int err = 0;
1606 
1607 	clear_opal_cmd(dev);
1608 	set_comid(dev, dev->comid);
1609 
1610 	memcpy(lr_buffer, opaluid[OPAL_LOCKINGRANGE_ACE_RDLOCKED],
1611 	       OPAL_UID_LENGTH);
1612 
1613 	if (lkul->l_state == OPAL_RW)
1614 		memcpy(lr_buffer, opaluid[OPAL_LOCKINGRANGE_ACE_WRLOCKED],
1615 		       OPAL_UID_LENGTH);
1616 
1617 	lr_buffer[7] = lkul->session.opal_key.lr;
1618 
1619 	memcpy(user_uid, opaluid[OPAL_USER1_UID], OPAL_UID_LENGTH);
1620 
1621 	user_uid[7] = lkul->session.who;
1622 
1623 	add_token_u8(&err, dev, OPAL_CALL);
1624 	add_token_bytestring(&err, dev, lr_buffer, OPAL_UID_LENGTH);
1625 	add_token_bytestring(&err, dev, opalmethod[OPAL_SET],
1626 			     OPAL_UID_LENGTH);
1627 
1628 	add_token_u8(&err, dev, OPAL_STARTLIST);
1629 	add_token_u8(&err, dev, OPAL_STARTNAME);
1630 	add_token_u8(&err, dev, OPAL_VALUES);
1631 
1632 	add_token_u8(&err, dev, OPAL_STARTLIST);
1633 	add_token_u8(&err, dev, OPAL_STARTNAME);
1634 	add_token_u8(&err, dev, 3);
1635 
1636 	add_token_u8(&err, dev, OPAL_STARTLIST);
1637 
1638 
1639 	add_token_u8(&err, dev, OPAL_STARTNAME);
1640 	add_token_bytestring(&err, dev,
1641 			     opaluid[OPAL_HALF_UID_AUTHORITY_OBJ_REF],
1642 			     OPAL_UID_LENGTH/2);
1643 	add_token_bytestring(&err, dev, user_uid, OPAL_UID_LENGTH);
1644 	add_token_u8(&err, dev, OPAL_ENDNAME);
1645 
1646 
1647 	add_token_u8(&err, dev, OPAL_STARTNAME);
1648 	add_token_bytestring(&err, dev,
1649 			     opaluid[OPAL_HALF_UID_AUTHORITY_OBJ_REF],
1650 			     OPAL_UID_LENGTH/2);
1651 	add_token_bytestring(&err, dev, user_uid, OPAL_UID_LENGTH);
1652 	add_token_u8(&err, dev, OPAL_ENDNAME);
1653 
1654 
1655 	add_token_u8(&err, dev, OPAL_STARTNAME);
1656 	add_token_bytestring(&err, dev, opaluid[OPAL_HALF_UID_BOOLEAN_ACE],
1657 			     OPAL_UID_LENGTH/2);
1658 	add_token_u8(&err, dev, 1);
1659 	add_token_u8(&err, dev, OPAL_ENDNAME);
1660 
1661 
1662 	add_token_u8(&err, dev, OPAL_ENDLIST);
1663 	add_token_u8(&err, dev, OPAL_ENDNAME);
1664 	add_token_u8(&err, dev, OPAL_ENDLIST);
1665 	add_token_u8(&err, dev, OPAL_ENDNAME);
1666 	add_token_u8(&err, dev, OPAL_ENDLIST);
1667 
1668 	if (err) {
1669 		pr_debug("Error building add user to locking range command.\n");
1670 		return err;
1671 	}
1672 
1673 	return finalize_and_send(dev, parse_and_check_status);
1674 }
1675 
1676 static int lock_unlock_locking_range(struct opal_dev *dev, void *data)
1677 {
1678 	u8 lr_buffer[OPAL_UID_LENGTH];
1679 	struct opal_lock_unlock *lkul = data;
1680 	u8 read_locked = 1, write_locked = 1;
1681 	int err = 0;
1682 
1683 	clear_opal_cmd(dev);
1684 	set_comid(dev, dev->comid);
1685 
1686 	if (build_locking_range(lr_buffer, sizeof(lr_buffer),
1687 				lkul->session.opal_key.lr) < 0)
1688 		return -ERANGE;
1689 
1690 	switch (lkul->l_state) {
1691 	case OPAL_RO:
1692 		read_locked = 0;
1693 		write_locked = 1;
1694 		break;
1695 	case OPAL_RW:
1696 		read_locked = 0;
1697 		write_locked = 0;
1698 		break;
1699 	case OPAL_LK:
1700 		/* vars are initalized to locked */
1701 		break;
1702 	default:
1703 		pr_debug("Tried to set an invalid locking state... returning to uland\n");
1704 		return OPAL_INVAL_PARAM;
1705 	}
1706 
1707 	add_token_u8(&err, dev, OPAL_CALL);
1708 	add_token_bytestring(&err, dev, lr_buffer, OPAL_UID_LENGTH);
1709 	add_token_bytestring(&err, dev, opalmethod[OPAL_SET], OPAL_UID_LENGTH);
1710 	add_token_u8(&err, dev, OPAL_STARTLIST);
1711 	add_token_u8(&err, dev, OPAL_STARTNAME);
1712 	add_token_u8(&err, dev, OPAL_VALUES);
1713 	add_token_u8(&err, dev, OPAL_STARTLIST);
1714 
1715 	add_token_u8(&err, dev, OPAL_STARTNAME);
1716 	add_token_u8(&err, dev, OPAL_READLOCKED);
1717 	add_token_u8(&err, dev, read_locked);
1718 	add_token_u8(&err, dev, OPAL_ENDNAME);
1719 
1720 	add_token_u8(&err, dev, OPAL_STARTNAME);
1721 	add_token_u8(&err, dev, OPAL_WRITELOCKED);
1722 	add_token_u8(&err, dev, write_locked);
1723 	add_token_u8(&err, dev, OPAL_ENDNAME);
1724 
1725 	add_token_u8(&err, dev, OPAL_ENDLIST);
1726 	add_token_u8(&err, dev, OPAL_ENDNAME);
1727 	add_token_u8(&err, dev, OPAL_ENDLIST);
1728 
1729 	if (err) {
1730 		pr_debug("Error building SET command.\n");
1731 		return err;
1732 	}
1733 	return finalize_and_send(dev, parse_and_check_status);
1734 }
1735 
1736 
1737 static int lock_unlock_locking_range_sum(struct opal_dev *dev, void *data)
1738 {
1739 	u8 lr_buffer[OPAL_UID_LENGTH];
1740 	u8 read_locked = 1, write_locked = 1;
1741 	struct opal_lock_unlock *lkul = data;
1742 	int ret;
1743 
1744 	clear_opal_cmd(dev);
1745 	set_comid(dev, dev->comid);
1746 
1747 	if (build_locking_range(lr_buffer, sizeof(lr_buffer),
1748 				lkul->session.opal_key.lr) < 0)
1749 		return -ERANGE;
1750 
1751 	switch (lkul->l_state) {
1752 	case OPAL_RO:
1753 		read_locked = 0;
1754 		write_locked = 1;
1755 		break;
1756 	case OPAL_RW:
1757 		read_locked = 0;
1758 		write_locked = 0;
1759 		break;
1760 	case OPAL_LK:
1761 		/* vars are initalized to locked */
1762 		break;
1763 	default:
1764 		pr_debug("Tried to set an invalid locking state.\n");
1765 		return OPAL_INVAL_PARAM;
1766 	}
1767 	ret = generic_lr_enable_disable(dev, lr_buffer, 1, 1,
1768 					read_locked, write_locked);
1769 
1770 	if (ret < 0) {
1771 		pr_debug("Error building SET command.\n");
1772 		return ret;
1773 	}
1774 	return finalize_and_send(dev, parse_and_check_status);
1775 }
1776 
1777 static int activate_lsp(struct opal_dev *dev, void *data)
1778 {
1779 	struct opal_lr_act *opal_act = data;
1780 	u8 user_lr[OPAL_UID_LENGTH];
1781 	u8 uint_3 = 0x83;
1782 	int err = 0, i;
1783 
1784 	clear_opal_cmd(dev);
1785 	set_comid(dev, dev->comid);
1786 
1787 	add_token_u8(&err, dev, OPAL_CALL);
1788 	add_token_bytestring(&err, dev, opaluid[OPAL_LOCKINGSP_UID],
1789 			     OPAL_UID_LENGTH);
1790 	add_token_bytestring(&err, dev, opalmethod[OPAL_ACTIVATE],
1791 			     OPAL_UID_LENGTH);
1792 
1793 
1794 	if (opal_act->sum) {
1795 		err = build_locking_range(user_lr, sizeof(user_lr),
1796 					  opal_act->lr[0]);
1797 		if (err)
1798 			return err;
1799 
1800 		add_token_u8(&err, dev, OPAL_STARTLIST);
1801 		add_token_u8(&err, dev, OPAL_STARTNAME);
1802 		add_token_u8(&err, dev, uint_3);
1803 		add_token_u8(&err, dev, 6);
1804 		add_token_u8(&err, dev, 0);
1805 		add_token_u8(&err, dev, 0);
1806 
1807 		add_token_u8(&err, dev, OPAL_STARTLIST);
1808 		add_token_bytestring(&err, dev, user_lr, OPAL_UID_LENGTH);
1809 		for (i = 1; i < opal_act->num_lrs; i++) {
1810 			user_lr[7] = opal_act->lr[i];
1811 			add_token_bytestring(&err, dev, user_lr, OPAL_UID_LENGTH);
1812 		}
1813 		add_token_u8(&err, dev, OPAL_ENDLIST);
1814 		add_token_u8(&err, dev, OPAL_ENDNAME);
1815 		add_token_u8(&err, dev, OPAL_ENDLIST);
1816 
1817 	} else {
1818 		add_token_u8(&err, dev, OPAL_STARTLIST);
1819 		add_token_u8(&err, dev, OPAL_ENDLIST);
1820 	}
1821 
1822 	if (err) {
1823 		pr_debug("Error building Activate LockingSP command.\n");
1824 		return err;
1825 	}
1826 
1827 	return finalize_and_send(dev, parse_and_check_status);
1828 }
1829 
1830 static int get_lsp_lifecycle_cont(struct opal_dev *dev)
1831 {
1832 	u8 lc_status;
1833 	int error = 0;
1834 
1835 	error = parse_and_check_status(dev);
1836 	if (error)
1837 		return error;
1838 
1839 	lc_status = response_get_u64(&dev->parsed, 4);
1840 	/* 0x08 is Manufacured Inactive */
1841 	/* 0x09 is Manufactured */
1842 	if (lc_status != OPAL_MANUFACTURED_INACTIVE) {
1843 		pr_debug("Couldn't determine the status of the Lifecycle state\n");
1844 		return -ENODEV;
1845 	}
1846 
1847 	return 0;
1848 }
1849 
1850 /* Determine if we're in the Manufactured Inactive or Active state */
1851 static int get_lsp_lifecycle(struct opal_dev *dev, void *data)
1852 {
1853 	int err = 0;
1854 
1855 	clear_opal_cmd(dev);
1856 	set_comid(dev, dev->comid);
1857 
1858 	add_token_u8(&err, dev, OPAL_CALL);
1859 	add_token_bytestring(&err, dev, opaluid[OPAL_LOCKINGSP_UID],
1860 			     OPAL_UID_LENGTH);
1861 	add_token_bytestring(&err, dev, opalmethod[OPAL_GET], OPAL_UID_LENGTH);
1862 
1863 	add_token_u8(&err, dev, OPAL_STARTLIST);
1864 	add_token_u8(&err, dev, OPAL_STARTLIST);
1865 
1866 	add_token_u8(&err, dev, OPAL_STARTNAME);
1867 	add_token_u8(&err, dev, 3); /* Start Column */
1868 	add_token_u8(&err, dev, 6); /* Lifecycle Column */
1869 	add_token_u8(&err, dev, OPAL_ENDNAME);
1870 
1871 	add_token_u8(&err, dev, OPAL_STARTNAME);
1872 	add_token_u8(&err, dev, 4); /* End Column */
1873 	add_token_u8(&err, dev, 6); /* Lifecycle Column */
1874 	add_token_u8(&err, dev, OPAL_ENDNAME);
1875 
1876 	add_token_u8(&err, dev, OPAL_ENDLIST);
1877 	add_token_u8(&err, dev, OPAL_ENDLIST);
1878 
1879 	if (err) {
1880 		pr_debug("Error Building GET Lifecycle Status command\n");
1881 		return err;
1882 	}
1883 
1884 	return finalize_and_send(dev, get_lsp_lifecycle_cont);
1885 }
1886 
1887 static int get_msid_cpin_pin_cont(struct opal_dev *dev)
1888 {
1889 	const char *msid_pin;
1890 	size_t strlen;
1891 	int error = 0;
1892 
1893 	error = parse_and_check_status(dev);
1894 	if (error)
1895 		return error;
1896 
1897 	strlen = response_get_string(&dev->parsed, 4, &msid_pin);
1898 	if (!msid_pin) {
1899 		pr_debug("%s: Couldn't extract PIN from response\n", __func__);
1900 		return OPAL_INVAL_PARAM;
1901 	}
1902 
1903 	dev->prev_data = kmemdup(msid_pin, strlen, GFP_KERNEL);
1904 	if (!dev->prev_data)
1905 		return -ENOMEM;
1906 
1907 	dev->prev_d_len = strlen;
1908 
1909 	return 0;
1910 }
1911 
1912 static int get_msid_cpin_pin(struct opal_dev *dev, void *data)
1913 {
1914 	int err = 0;
1915 
1916 	clear_opal_cmd(dev);
1917 	set_comid(dev, dev->comid);
1918 
1919 	add_token_u8(&err, dev, OPAL_CALL);
1920 	add_token_bytestring(&err, dev, opaluid[OPAL_C_PIN_MSID],
1921 			     OPAL_UID_LENGTH);
1922 	add_token_bytestring(&err, dev, opalmethod[OPAL_GET], OPAL_UID_LENGTH);
1923 
1924 	add_token_u8(&err, dev, OPAL_STARTLIST);
1925 	add_token_u8(&err, dev, OPAL_STARTLIST);
1926 
1927 	add_token_u8(&err, dev, OPAL_STARTNAME);
1928 	add_token_u8(&err, dev, 3); /* Start Column */
1929 	add_token_u8(&err, dev, 3); /* PIN */
1930 	add_token_u8(&err, dev, OPAL_ENDNAME);
1931 
1932 	add_token_u8(&err, dev, OPAL_STARTNAME);
1933 	add_token_u8(&err, dev, 4); /* End Column */
1934 	add_token_u8(&err, dev, 3); /* Lifecycle Column */
1935 	add_token_u8(&err, dev, OPAL_ENDNAME);
1936 
1937 	add_token_u8(&err, dev, OPAL_ENDLIST);
1938 	add_token_u8(&err, dev, OPAL_ENDLIST);
1939 
1940 	if (err) {
1941 		pr_debug("Error building Get MSID CPIN PIN command.\n");
1942 		return err;
1943 	}
1944 
1945 	return finalize_and_send(dev, get_msid_cpin_pin_cont);
1946 }
1947 
1948 static int end_opal_session(struct opal_dev *dev, void *data)
1949 {
1950 	int err = 0;
1951 
1952 	clear_opal_cmd(dev);
1953 	set_comid(dev, dev->comid);
1954 	add_token_u8(&err, dev, OPAL_ENDOFSESSION);
1955 
1956 	if (err < 0)
1957 		return err;
1958 	return finalize_and_send(dev, end_session_cont);
1959 }
1960 
1961 static int end_opal_session_error(struct opal_dev *dev)
1962 {
1963 	const struct opal_step error_end_session[] = {
1964 		{ end_opal_session, },
1965 		{ NULL, }
1966 	};
1967 	dev->steps = error_end_session;
1968 	return next(dev);
1969 }
1970 
1971 static inline void setup_opal_dev(struct opal_dev *dev,
1972 				  const struct opal_step *steps)
1973 {
1974 	dev->steps = steps;
1975 	dev->tsn = 0;
1976 	dev->hsn = 0;
1977 	dev->prev_data = NULL;
1978 }
1979 
1980 static int check_opal_support(struct opal_dev *dev)
1981 {
1982 	const struct opal_step steps[] = {
1983 		{ opal_discovery0, },
1984 		{ NULL, }
1985 	};
1986 	int ret;
1987 
1988 	mutex_lock(&dev->dev_lock);
1989 	setup_opal_dev(dev, steps);
1990 	ret = next(dev);
1991 	dev->supported = !ret;
1992 	mutex_unlock(&dev->dev_lock);
1993 	return ret;
1994 }
1995 
1996 static void clean_opal_dev(struct opal_dev *dev)
1997 {
1998 
1999 	struct opal_suspend_data *suspend, *next;
2000 
2001 	mutex_lock(&dev->dev_lock);
2002 	list_for_each_entry_safe(suspend, next, &dev->unlk_lst, node) {
2003 		list_del(&suspend->node);
2004 		kfree(suspend);
2005 	}
2006 	mutex_unlock(&dev->dev_lock);
2007 }
2008 
2009 void free_opal_dev(struct opal_dev *dev)
2010 {
2011 	if (!dev)
2012 		return;
2013 	clean_opal_dev(dev);
2014 	kfree(dev);
2015 }
2016 EXPORT_SYMBOL(free_opal_dev);
2017 
2018 struct opal_dev *init_opal_dev(void *data, sec_send_recv *send_recv)
2019 {
2020 	struct opal_dev *dev;
2021 
2022 	dev = kmalloc(sizeof(*dev), GFP_KERNEL);
2023 	if (!dev)
2024 		return NULL;
2025 
2026 	INIT_LIST_HEAD(&dev->unlk_lst);
2027 	mutex_init(&dev->dev_lock);
2028 	dev->data = data;
2029 	dev->send_recv = send_recv;
2030 	if (check_opal_support(dev) != 0) {
2031 		pr_debug("Opal is not supported on this device\n");
2032 		kfree(dev);
2033 		return NULL;
2034 	}
2035 	return dev;
2036 }
2037 EXPORT_SYMBOL(init_opal_dev);
2038 
2039 static int opal_secure_erase_locking_range(struct opal_dev *dev,
2040 					   struct opal_session_info *opal_session)
2041 {
2042 	const struct opal_step erase_steps[] = {
2043 		{ opal_discovery0, },
2044 		{ start_auth_opal_session, opal_session },
2045 		{ get_active_key, &opal_session->opal_key.lr },
2046 		{ gen_key, },
2047 		{ end_opal_session, },
2048 		{ NULL, }
2049 	};
2050 	int ret;
2051 
2052 	mutex_lock(&dev->dev_lock);
2053 	setup_opal_dev(dev, erase_steps);
2054 	ret = next(dev);
2055 	mutex_unlock(&dev->dev_lock);
2056 	return ret;
2057 }
2058 
2059 static int opal_erase_locking_range(struct opal_dev *dev,
2060 				    struct opal_session_info *opal_session)
2061 {
2062 	const struct opal_step erase_steps[] = {
2063 		{ opal_discovery0, },
2064 		{ start_auth_opal_session, opal_session },
2065 		{ erase_locking_range, opal_session },
2066 		{ end_opal_session, },
2067 		{ NULL, }
2068 	};
2069 	int ret;
2070 
2071 	mutex_lock(&dev->dev_lock);
2072 	setup_opal_dev(dev, erase_steps);
2073 	ret = next(dev);
2074 	mutex_unlock(&dev->dev_lock);
2075 	return ret;
2076 }
2077 
2078 static int opal_enable_disable_shadow_mbr(struct opal_dev *dev,
2079 					  struct opal_mbr_data *opal_mbr)
2080 {
2081 	const struct opal_step mbr_steps[] = {
2082 		{ opal_discovery0, },
2083 		{ start_admin1LSP_opal_session, &opal_mbr->key },
2084 		{ set_mbr_done, &opal_mbr->enable_disable },
2085 		{ end_opal_session, },
2086 		{ start_admin1LSP_opal_session, &opal_mbr->key },
2087 		{ set_mbr_enable_disable, &opal_mbr->enable_disable },
2088 		{ end_opal_session, },
2089 		{ NULL, }
2090 	};
2091 	int ret;
2092 
2093 	if (opal_mbr->enable_disable != OPAL_MBR_ENABLE &&
2094 	    opal_mbr->enable_disable != OPAL_MBR_DISABLE)
2095 		return -EINVAL;
2096 
2097 	mutex_lock(&dev->dev_lock);
2098 	setup_opal_dev(dev, mbr_steps);
2099 	ret = next(dev);
2100 	mutex_unlock(&dev->dev_lock);
2101 	return ret;
2102 }
2103 
2104 static int opal_save(struct opal_dev *dev, struct opal_lock_unlock *lk_unlk)
2105 {
2106 	struct opal_suspend_data *suspend;
2107 
2108 	suspend = kzalloc(sizeof(*suspend), GFP_KERNEL);
2109 	if (!suspend)
2110 		return -ENOMEM;
2111 
2112 	suspend->unlk = *lk_unlk;
2113 	suspend->lr = lk_unlk->session.opal_key.lr;
2114 
2115 	mutex_lock(&dev->dev_lock);
2116 	setup_opal_dev(dev, NULL);
2117 	add_suspend_info(dev, suspend);
2118 	mutex_unlock(&dev->dev_lock);
2119 	return 0;
2120 }
2121 
2122 static int opal_add_user_to_lr(struct opal_dev *dev,
2123 			       struct opal_lock_unlock *lk_unlk)
2124 {
2125 	const struct opal_step steps[] = {
2126 		{ opal_discovery0, },
2127 		{ start_admin1LSP_opal_session, &lk_unlk->session.opal_key },
2128 		{ add_user_to_lr, lk_unlk },
2129 		{ end_opal_session, },
2130 		{ NULL, }
2131 	};
2132 	int ret;
2133 
2134 	if (lk_unlk->l_state != OPAL_RO &&
2135 	    lk_unlk->l_state != OPAL_RW) {
2136 		pr_debug("Locking state was not RO or RW\n");
2137 		return -EINVAL;
2138 	}
2139 	if (lk_unlk->session.who < OPAL_USER1 ||
2140 	    lk_unlk->session.who > OPAL_USER9) {
2141 		pr_debug("Authority was not within the range of users: %d\n",
2142 			 lk_unlk->session.who);
2143 		return -EINVAL;
2144 	}
2145 	if (lk_unlk->session.sum) {
2146 		pr_debug("%s not supported in sum. Use setup locking range\n",
2147 			 __func__);
2148 		return -EINVAL;
2149 	}
2150 
2151 	mutex_lock(&dev->dev_lock);
2152 	setup_opal_dev(dev, steps);
2153 	ret = next(dev);
2154 	mutex_unlock(&dev->dev_lock);
2155 	return ret;
2156 }
2157 
2158 static int opal_reverttper(struct opal_dev *dev, struct opal_key *opal)
2159 {
2160 	const struct opal_step revert_steps[] = {
2161 		{ opal_discovery0, },
2162 		{ start_SIDASP_opal_session, opal },
2163 		{ revert_tper, }, /* controller will terminate session */
2164 		{ NULL, }
2165 	};
2166 	int ret;
2167 
2168 	mutex_lock(&dev->dev_lock);
2169 	setup_opal_dev(dev, revert_steps);
2170 	ret = next(dev);
2171 	mutex_unlock(&dev->dev_lock);
2172 
2173 	/*
2174 	 * If we successfully reverted lets clean
2175 	 * any saved locking ranges.
2176 	 */
2177 	if (!ret)
2178 		clean_opal_dev(dev);
2179 
2180 	return ret;
2181 }
2182 
2183 static int __opal_lock_unlock(struct opal_dev *dev,
2184 			      struct opal_lock_unlock *lk_unlk)
2185 {
2186 	const struct opal_step unlock_steps[] = {
2187 		{ opal_discovery0, },
2188 		{ start_auth_opal_session, &lk_unlk->session },
2189 		{ lock_unlock_locking_range, lk_unlk },
2190 		{ end_opal_session, },
2191 		{ NULL, }
2192 	};
2193 	const struct opal_step unlock_sum_steps[] = {
2194 		{ opal_discovery0, },
2195 		{ start_auth_opal_session, &lk_unlk->session },
2196 		{ lock_unlock_locking_range_sum, lk_unlk },
2197 		{ end_opal_session, },
2198 		{ NULL, }
2199 	};
2200 
2201 	dev->steps = lk_unlk->session.sum ? unlock_sum_steps : unlock_steps;
2202 	return next(dev);
2203 }
2204 
2205 static int __opal_set_mbr_done(struct opal_dev *dev, struct opal_key *key)
2206 {
2207 	u8 mbr_done_tf = 1;
2208 	const struct opal_step mbrdone_step [] = {
2209 		{ opal_discovery0, },
2210 		{ start_admin1LSP_opal_session, key },
2211 		{ set_mbr_done, &mbr_done_tf },
2212 		{ end_opal_session, },
2213 		{ NULL, }
2214 	};
2215 
2216 	dev->steps = mbrdone_step;
2217 	return next(dev);
2218 }
2219 
2220 static int opal_lock_unlock(struct opal_dev *dev,
2221 			    struct opal_lock_unlock *lk_unlk)
2222 {
2223 	int ret;
2224 
2225 	if (lk_unlk->session.who < OPAL_ADMIN1 ||
2226 	    lk_unlk->session.who > OPAL_USER9)
2227 		return -EINVAL;
2228 
2229 	mutex_lock(&dev->dev_lock);
2230 	ret = __opal_lock_unlock(dev, lk_unlk);
2231 	mutex_unlock(&dev->dev_lock);
2232 	return ret;
2233 }
2234 
2235 static int opal_take_ownership(struct opal_dev *dev, struct opal_key *opal)
2236 {
2237 	const struct opal_step owner_steps[] = {
2238 		{ opal_discovery0, },
2239 		{ start_anybodyASP_opal_session, },
2240 		{ get_msid_cpin_pin, },
2241 		{ end_opal_session, },
2242 		{ start_SIDASP_opal_session, opal },
2243 		{ set_sid_cpin_pin, opal },
2244 		{ end_opal_session, },
2245 		{ NULL, }
2246 	};
2247 	int ret;
2248 
2249 	if (!dev)
2250 		return -ENODEV;
2251 
2252 	mutex_lock(&dev->dev_lock);
2253 	setup_opal_dev(dev, owner_steps);
2254 	ret = next(dev);
2255 	mutex_unlock(&dev->dev_lock);
2256 	return ret;
2257 }
2258 
2259 static int opal_activate_lsp(struct opal_dev *dev, struct opal_lr_act *opal_lr_act)
2260 {
2261 	const struct opal_step active_steps[] = {
2262 		{ opal_discovery0, },
2263 		{ start_SIDASP_opal_session, &opal_lr_act->key },
2264 		{ get_lsp_lifecycle, },
2265 		{ activate_lsp, opal_lr_act },
2266 		{ end_opal_session, },
2267 		{ NULL, }
2268 	};
2269 	int ret;
2270 
2271 	if (!opal_lr_act->num_lrs || opal_lr_act->num_lrs > OPAL_MAX_LRS)
2272 		return -EINVAL;
2273 
2274 	mutex_lock(&dev->dev_lock);
2275 	setup_opal_dev(dev, active_steps);
2276 	ret = next(dev);
2277 	mutex_unlock(&dev->dev_lock);
2278 	return ret;
2279 }
2280 
2281 static int opal_setup_locking_range(struct opal_dev *dev,
2282 				    struct opal_user_lr_setup *opal_lrs)
2283 {
2284 	const struct opal_step lr_steps[] = {
2285 		{ opal_discovery0, },
2286 		{ start_auth_opal_session, &opal_lrs->session },
2287 		{ setup_locking_range, opal_lrs },
2288 		{ end_opal_session, },
2289 		{ NULL, }
2290 	};
2291 	int ret;
2292 
2293 	mutex_lock(&dev->dev_lock);
2294 	setup_opal_dev(dev, lr_steps);
2295 	ret = next(dev);
2296 	mutex_unlock(&dev->dev_lock);
2297 	return ret;
2298 }
2299 
2300 static int opal_set_new_pw(struct opal_dev *dev, struct opal_new_pw *opal_pw)
2301 {
2302 	const struct opal_step pw_steps[] = {
2303 		{ opal_discovery0, },
2304 		{ start_auth_opal_session, &opal_pw->session },
2305 		{ set_new_pw, &opal_pw->new_user_pw },
2306 		{ end_opal_session, },
2307 		{ NULL }
2308 	};
2309 	int ret;
2310 
2311 	if (opal_pw->session.who < OPAL_ADMIN1 ||
2312 	    opal_pw->session.who > OPAL_USER9  ||
2313 	    opal_pw->new_user_pw.who < OPAL_ADMIN1 ||
2314 	    opal_pw->new_user_pw.who > OPAL_USER9)
2315 		return -EINVAL;
2316 
2317 	mutex_lock(&dev->dev_lock);
2318 	setup_opal_dev(dev, pw_steps);
2319 	ret = next(dev);
2320 	mutex_unlock(&dev->dev_lock);
2321 	return ret;
2322 }
2323 
2324 static int opal_activate_user(struct opal_dev *dev,
2325 			      struct opal_session_info *opal_session)
2326 {
2327 	const struct opal_step act_steps[] = {
2328 		{ opal_discovery0, },
2329 		{ start_admin1LSP_opal_session, &opal_session->opal_key },
2330 		{ internal_activate_user, opal_session },
2331 		{ end_opal_session, },
2332 		{ NULL, }
2333 	};
2334 	int ret;
2335 
2336 	/* We can't activate Admin1 it's active as manufactured */
2337 	if (opal_session->who < OPAL_USER1 ||
2338 	    opal_session->who > OPAL_USER9) {
2339 		pr_debug("Who was not a valid user: %d\n", opal_session->who);
2340 		return -EINVAL;
2341 	}
2342 
2343 	mutex_lock(&dev->dev_lock);
2344 	setup_opal_dev(dev, act_steps);
2345 	ret = next(dev);
2346 	mutex_unlock(&dev->dev_lock);
2347 	return ret;
2348 }
2349 
2350 bool opal_unlock_from_suspend(struct opal_dev *dev)
2351 {
2352 	struct opal_suspend_data *suspend;
2353 	bool was_failure = false;
2354 	int ret = 0;
2355 
2356 	if (!dev)
2357 		return false;
2358 	if (!dev->supported)
2359 		return false;
2360 
2361 	mutex_lock(&dev->dev_lock);
2362 	setup_opal_dev(dev, NULL);
2363 
2364 	list_for_each_entry(suspend, &dev->unlk_lst, node) {
2365 		dev->tsn = 0;
2366 		dev->hsn = 0;
2367 
2368 		ret = __opal_lock_unlock(dev, &suspend->unlk);
2369 		if (ret) {
2370 			pr_debug("Failed to unlock LR %hhu with sum %d\n",
2371 				 suspend->unlk.session.opal_key.lr,
2372 				 suspend->unlk.session.sum);
2373 			was_failure = true;
2374 		}
2375 		if (dev->mbr_enabled) {
2376 			ret = __opal_set_mbr_done(dev, &suspend->unlk.session.opal_key);
2377 			if (ret)
2378 				pr_debug("Failed to set MBR Done in S3 resume\n");
2379 		}
2380 	}
2381 	mutex_unlock(&dev->dev_lock);
2382 	return was_failure;
2383 }
2384 EXPORT_SYMBOL(opal_unlock_from_suspend);
2385 
2386 int sed_ioctl(struct opal_dev *dev, unsigned int cmd, void __user *arg)
2387 {
2388 	void *p;
2389 	int ret = -ENOTTY;
2390 
2391 	if (!capable(CAP_SYS_ADMIN))
2392 		return -EACCES;
2393 	if (!dev)
2394 		return -ENOTSUPP;
2395 	if (!dev->supported)
2396 		return -ENOTSUPP;
2397 
2398 	p = memdup_user(arg, _IOC_SIZE(cmd));
2399 	if (IS_ERR(p))
2400 		return PTR_ERR(p);
2401 
2402 	switch (cmd) {
2403 	case IOC_OPAL_SAVE:
2404 		ret = opal_save(dev, p);
2405 		break;
2406 	case IOC_OPAL_LOCK_UNLOCK:
2407 		ret = opal_lock_unlock(dev, p);
2408 		break;
2409 	case IOC_OPAL_TAKE_OWNERSHIP:
2410 		ret = opal_take_ownership(dev, p);
2411 		break;
2412 	case IOC_OPAL_ACTIVATE_LSP:
2413 		ret = opal_activate_lsp(dev, p);
2414 		break;
2415 	case IOC_OPAL_SET_PW:
2416 		ret = opal_set_new_pw(dev, p);
2417 		break;
2418 	case IOC_OPAL_ACTIVATE_USR:
2419 		ret = opal_activate_user(dev, p);
2420 		break;
2421 	case IOC_OPAL_REVERT_TPR:
2422 		ret = opal_reverttper(dev, p);
2423 		break;
2424 	case IOC_OPAL_LR_SETUP:
2425 		ret = opal_setup_locking_range(dev, p);
2426 		break;
2427 	case IOC_OPAL_ADD_USR_TO_LR:
2428 		ret = opal_add_user_to_lr(dev, p);
2429 		break;
2430 	case IOC_OPAL_ENABLE_DISABLE_MBR:
2431 		ret = opal_enable_disable_shadow_mbr(dev, p);
2432 		break;
2433 	case IOC_OPAL_ERASE_LR:
2434 		ret = opal_erase_locking_range(dev, p);
2435 		break;
2436 	case IOC_OPAL_SECURE_ERASE_LR:
2437 		ret = opal_secure_erase_locking_range(dev, p);
2438 		break;
2439 	default:
2440 		break;
2441 	}
2442 
2443 	kfree(p);
2444 	return ret;
2445 }
2446 EXPORT_SYMBOL_GPL(sed_ioctl);
2447