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