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