cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

sed-opal.c (63981B)


      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	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);