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