Linux Audio

Check our new training course

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