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