Merge tag 'irq-urgent-2024-03-23' of git://git.kernel.org/pub/scm/linux/kernel/git...
[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/blkdev.h>
17 #include <linux/slab.h>
18 #include <linux/uaccess.h>
19 #include <uapi/linux/sed-opal.h>
20 #include <linux/sed-opal.h>
21 #include <linux/sed-opal-key.h>
22 #include <linux/string.h>
23 #include <linux/kdev_t.h>
24 #include <linux/key.h>
25 #include <linux/key-type.h>
26 #include <keys/user-type.h>
27
28 #include "opal_proto.h"
29
30 #define IO_BUFFER_LENGTH 2048
31 #define MAX_TOKS 64
32
33 /* Number of bytes needed by cmd_finalize. */
34 #define CMD_FINALIZE_BYTES_NEEDED 7
35
36 static struct key *sed_opal_keyring;
37
38 struct opal_step {
39         int (*fn)(struct opal_dev *dev, void *data);
40         void *data;
41 };
42 typedef int (cont_fn)(struct opal_dev *dev);
43
44 enum opal_atom_width {
45         OPAL_WIDTH_TINY,
46         OPAL_WIDTH_SHORT,
47         OPAL_WIDTH_MEDIUM,
48         OPAL_WIDTH_LONG,
49         OPAL_WIDTH_TOKEN
50 };
51
52 /*
53  * On the parsed response, we don't store again the toks that are already
54  * stored in the response buffer. Instead, for each token, we just store a
55  * pointer to the position in the buffer where the token starts, and the size
56  * of the token in bytes.
57  */
58 struct opal_resp_tok {
59         const u8 *pos;
60         size_t len;
61         enum opal_response_token type;
62         enum opal_atom_width width;
63         union {
64                 u64 u;
65                 s64 s;
66         } stored;
67 };
68
69 /*
70  * From the response header it's not possible to know how many tokens there are
71  * on the payload. So we hardcode that the maximum will be MAX_TOKS, and later
72  * if we start dealing with messages that have more than that, we can increase
73  * this number. This is done to avoid having to make two passes through the
74  * response, the first one counting how many tokens we have and the second one
75  * actually storing the positions.
76  */
77 struct parsed_resp {
78         int num;
79         struct opal_resp_tok toks[MAX_TOKS];
80 };
81
82 struct opal_dev {
83         u32 flags;
84
85         void *data;
86         sec_send_recv *send_recv;
87
88         struct mutex dev_lock;
89         u16 comid;
90         u32 hsn;
91         u32 tsn;
92         u64 align; /* alignment granularity */
93         u64 lowest_lba;
94         u32 logical_block_size;
95         u8  align_required; /* ALIGN: 0 or 1 */
96
97         size_t pos;
98         u8 *cmd;
99         u8 *resp;
100
101         struct parsed_resp parsed;
102         size_t prev_d_len;
103         void *prev_data;
104
105         struct list_head unlk_lst;
106 };
107
108
109 static const u8 opaluid[][OPAL_UID_LENGTH] = {
110         /* users */
111         [OPAL_SMUID_UID] =
112                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff },
113         [OPAL_THISSP_UID] =
114                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 },
115         [OPAL_ADMINSP_UID] =
116                 { 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x00, 0x01 },
117         [OPAL_LOCKINGSP_UID] =
118                 { 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x00, 0x02 },
119         [OPAL_ENTERPRISE_LOCKINGSP_UID] =
120                 { 0x00, 0x00, 0x02, 0x05, 0x00, 0x01, 0x00, 0x01 },
121         [OPAL_ANYBODY_UID] =
122                 { 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01 },
123         [OPAL_SID_UID] =
124                 { 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x06 },
125         [OPAL_ADMIN1_UID] =
126                 { 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00, 0x01 },
127         [OPAL_USER1_UID] =
128                 { 0x00, 0x00, 0x00, 0x09, 0x00, 0x03, 0x00, 0x01 },
129         [OPAL_USER2_UID] =
130                 { 0x00, 0x00, 0x00, 0x09, 0x00, 0x03, 0x00, 0x02 },
131         [OPAL_PSID_UID] =
132                 { 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0xff, 0x01 },
133         [OPAL_ENTERPRISE_BANDMASTER0_UID] =
134                 { 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x80, 0x01 },
135         [OPAL_ENTERPRISE_ERASEMASTER_UID] =
136                 { 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x84, 0x01 },
137
138         /* tables */
139         [OPAL_TABLE_TABLE] =
140                 { 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01 },
141         [OPAL_LOCKINGRANGE_GLOBAL] =
142                 { 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x01 },
143         [OPAL_LOCKINGRANGE_ACE_START_TO_KEY] =
144                 { 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0xD0, 0x01 },
145         [OPAL_LOCKINGRANGE_ACE_RDLOCKED] =
146                 { 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0xE0, 0x01 },
147         [OPAL_LOCKINGRANGE_ACE_WRLOCKED] =
148                 { 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0xE8, 0x01 },
149         [OPAL_MBRCONTROL] =
150                 { 0x00, 0x00, 0x08, 0x03, 0x00, 0x00, 0x00, 0x01 },
151         [OPAL_MBR] =
152                 { 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00 },
153         [OPAL_AUTHORITY_TABLE] =
154                 { 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00},
155         [OPAL_C_PIN_TABLE] =
156                 { 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00},
157         [OPAL_LOCKING_INFO_TABLE] =
158                 { 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01 },
159         [OPAL_ENTERPRISE_LOCKING_INFO_TABLE] =
160                 { 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x00 },
161         [OPAL_DATASTORE] =
162                 { 0x00, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00 },
163
164         /* C_PIN_TABLE object ID's */
165         [OPAL_C_PIN_MSID] =
166                 { 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x84, 0x02},
167         [OPAL_C_PIN_SID] =
168                 { 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01},
169         [OPAL_C_PIN_ADMIN1] =
170                 { 0x00, 0x00, 0x00, 0x0B, 0x00, 0x01, 0x00, 0x01},
171
172         /* half UID's (only first 4 bytes used) */
173         [OPAL_HALF_UID_AUTHORITY_OBJ_REF] =
174                 { 0x00, 0x00, 0x0C, 0x05, 0xff, 0xff, 0xff, 0xff },
175         [OPAL_HALF_UID_BOOLEAN_ACE] =
176                 { 0x00, 0x00, 0x04, 0x0E, 0xff, 0xff, 0xff, 0xff },
177
178         /* special value for omitted optional parameter */
179         [OPAL_UID_HEXFF] =
180                 { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
181 };
182
183 /*
184  * TCG Storage SSC Methods.
185  * Derived from: TCG_Storage_Architecture_Core_Spec_v2.01_r1.00
186  * Section: 6.3 Assigned UIDs
187  */
188 static const u8 opalmethod[][OPAL_METHOD_LENGTH] = {
189         [OPAL_PROPERTIES] =
190                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x01 },
191         [OPAL_STARTSESSION] =
192                 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x02 },
193         [OPAL_REVERT] =
194                 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x02 },
195         [OPAL_ACTIVATE] =
196                 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x03 },
197         [OPAL_EGET] =
198                 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06 },
199         [OPAL_ESET] =
200                 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07 },
201         [OPAL_NEXT] =
202                 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x08 },
203         [OPAL_EAUTHENTICATE] =
204                 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0c },
205         [OPAL_GETACL] =
206                 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0d },
207         [OPAL_GENKEY] =
208                 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10 },
209         [OPAL_REVERTSP] =
210                 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x11 },
211         [OPAL_GET] =
212                 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x16 },
213         [OPAL_SET] =
214                 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x17 },
215         [OPAL_AUTHENTICATE] =
216                 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1c },
217         [OPAL_RANDOM] =
218                 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x01 },
219         [OPAL_ERASE] =
220                 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x08, 0x03 },
221 };
222
223 static int end_opal_session_error(struct opal_dev *dev);
224 static int opal_discovery0_step(struct opal_dev *dev);
225
226 struct opal_suspend_data {
227         struct opal_lock_unlock unlk;
228         u8 lr;
229         struct list_head node;
230 };
231
232 /*
233  * Derived from:
234  * TCG_Storage_Architecture_Core_Spec_v2.01_r1.00
235  * Section: 5.1.5 Method Status Codes
236  */
237 static const char * const opal_errors[] = {
238         "Success",
239         "Not Authorized",
240         "Unknown Error",
241         "SP Busy",
242         "SP Failed",
243         "SP Disabled",
244         "SP Frozen",
245         "No Sessions Available",
246         "Uniqueness Conflict",
247         "Insufficient Space",
248         "Insufficient Rows",
249         "Invalid Function",
250         "Invalid Parameter",
251         "Invalid Reference",
252         "Unknown Error",
253         "TPER Malfunction",
254         "Transaction Failure",
255         "Response Overflow",
256         "Authority Locked Out",
257 };
258
259 static const char *opal_error_to_human(int error)
260 {
261         if (error == 0x3f)
262                 return "Failed";
263
264         if (error >= ARRAY_SIZE(opal_errors) || error < 0)
265                 return "Unknown Error";
266
267         return opal_errors[error];
268 }
269
270 static void print_buffer(const u8 *ptr, u32 length)
271 {
272 #ifdef DEBUG
273         print_hex_dump_bytes("OPAL: ", DUMP_PREFIX_OFFSET, ptr, length);
274         pr_debug("\n");
275 #endif
276 }
277
278 /*
279  * Allocate/update a SED Opal key and add it to the SED Opal keyring.
280  */
281 static int update_sed_opal_key(const char *desc, u_char *key_data, int keylen)
282 {
283         key_ref_t kr;
284
285         if (!sed_opal_keyring)
286                 return -ENOKEY;
287
288         kr = key_create_or_update(make_key_ref(sed_opal_keyring, true), "user",
289                                   desc, (const void *)key_data, keylen,
290                                   KEY_USR_VIEW | KEY_USR_SEARCH | KEY_USR_WRITE,
291                                   KEY_ALLOC_NOT_IN_QUOTA | KEY_ALLOC_BUILT_IN |
292                                         KEY_ALLOC_BYPASS_RESTRICTION);
293         if (IS_ERR(kr)) {
294                 pr_err("Error adding SED key (%ld)\n", PTR_ERR(kr));
295                 return PTR_ERR(kr);
296         }
297
298         return 0;
299 }
300
301 /*
302  * Read a SED Opal key from the SED Opal keyring.
303  */
304 static int read_sed_opal_key(const char *key_name, u_char *buffer, int buflen)
305 {
306         int ret;
307         key_ref_t kref;
308         struct key *key;
309
310         if (!sed_opal_keyring)
311                 return -ENOKEY;
312
313         kref = keyring_search(make_key_ref(sed_opal_keyring, true),
314                               &key_type_user, key_name, true);
315
316         if (IS_ERR(kref))
317                 ret = PTR_ERR(kref);
318
319         key = key_ref_to_ptr(kref);
320         down_read(&key->sem);
321         ret = key_validate(key);
322         if (ret == 0) {
323                 if (buflen > key->datalen)
324                         buflen = key->datalen;
325
326                 ret = key->type->read(key, (char *)buffer, buflen);
327         }
328         up_read(&key->sem);
329
330         key_ref_put(kref);
331
332         return ret;
333 }
334
335 static int opal_get_key(struct opal_dev *dev, struct opal_key *key)
336 {
337         int ret = 0;
338
339         switch (key->key_type) {
340         case OPAL_INCLUDED:
341                 /* the key is ready to use */
342                 break;
343         case OPAL_KEYRING:
344                 /* the key is in the keyring */
345                 ret = read_sed_opal_key(OPAL_AUTH_KEY, key->key, OPAL_KEY_MAX);
346                 if (ret > 0) {
347                         if (ret > U8_MAX) {
348                                 ret = -ENOSPC;
349                                 goto error;
350                         }
351                         key->key_len = ret;
352                         key->key_type = OPAL_INCLUDED;
353                 }
354                 break;
355         default:
356                 ret = -EINVAL;
357                 break;
358         }
359         if (ret < 0)
360                 goto error;
361
362         /* must have a PEK by now or it's an error */
363         if (key->key_type != OPAL_INCLUDED || key->key_len == 0) {
364                 ret = -EINVAL;
365                 goto error;
366         }
367         return 0;
368 error:
369         pr_debug("Error getting password: %d\n", ret);
370         return ret;
371 }
372
373 static bool check_tper(const void *data)
374 {
375         const struct d0_tper_features *tper = data;
376         u8 flags = tper->supported_features;
377
378         if (!(flags & TPER_SYNC_SUPPORTED)) {
379                 pr_debug("TPer sync not supported. flags = %d\n",
380                          tper->supported_features);
381                 return false;
382         }
383
384         return true;
385 }
386
387 static bool check_lcksuppt(const void *data)
388 {
389         const struct d0_locking_features *lfeat = data;
390         u8 sup_feat = lfeat->supported_features;
391
392         return !!(sup_feat & LOCKING_SUPPORTED_MASK);
393 }
394
395 static bool check_lckenabled(const void *data)
396 {
397         const struct d0_locking_features *lfeat = data;
398         u8 sup_feat = lfeat->supported_features;
399
400         return !!(sup_feat & LOCKING_ENABLED_MASK);
401 }
402
403 static bool check_locked(const void *data)
404 {
405         const struct d0_locking_features *lfeat = data;
406         u8 sup_feat = lfeat->supported_features;
407
408         return !!(sup_feat & LOCKED_MASK);
409 }
410
411 static bool check_mbrenabled(const void *data)
412 {
413         const struct d0_locking_features *lfeat = data;
414         u8 sup_feat = lfeat->supported_features;
415
416         return !!(sup_feat & MBR_ENABLED_MASK);
417 }
418
419 static bool check_mbrdone(const void *data)
420 {
421         const struct d0_locking_features *lfeat = data;
422         u8 sup_feat = lfeat->supported_features;
423
424         return !!(sup_feat & MBR_DONE_MASK);
425 }
426
427 static bool check_sum(const void *data)
428 {
429         const struct d0_single_user_mode *sum = data;
430         u32 nlo = be32_to_cpu(sum->num_locking_objects);
431
432         if (nlo == 0) {
433                 pr_debug("Need at least one locking object.\n");
434                 return false;
435         }
436
437         pr_debug("Number of locking objects: %d\n", nlo);
438
439         return true;
440 }
441
442 static u16 get_comid_v100(const void *data)
443 {
444         const struct d0_opal_v100 *v100 = data;
445
446         return be16_to_cpu(v100->baseComID);
447 }
448
449 static u16 get_comid_v200(const void *data)
450 {
451         const struct d0_opal_v200 *v200 = data;
452
453         return be16_to_cpu(v200->baseComID);
454 }
455
456 static int opal_send_cmd(struct opal_dev *dev)
457 {
458         return dev->send_recv(dev->data, dev->comid, TCG_SECP_01,
459                               dev->cmd, IO_BUFFER_LENGTH,
460                               true);
461 }
462
463 static int opal_recv_cmd(struct opal_dev *dev)
464 {
465         return dev->send_recv(dev->data, dev->comid, TCG_SECP_01,
466                               dev->resp, IO_BUFFER_LENGTH,
467                               false);
468 }
469
470 static int opal_recv_check(struct opal_dev *dev)
471 {
472         size_t buflen = IO_BUFFER_LENGTH;
473         void *buffer = dev->resp;
474         struct opal_header *hdr = buffer;
475         int ret;
476
477         do {
478                 pr_debug("Sent OPAL command: outstanding=%d, minTransfer=%d\n",
479                          hdr->cp.outstandingData,
480                          hdr->cp.minTransfer);
481
482                 if (hdr->cp.outstandingData == 0 ||
483                     hdr->cp.minTransfer != 0)
484                         return 0;
485
486                 memset(buffer, 0, buflen);
487                 ret = opal_recv_cmd(dev);
488         } while (!ret);
489
490         return ret;
491 }
492
493 static int opal_send_recv(struct opal_dev *dev, cont_fn *cont)
494 {
495         int ret;
496
497         ret = opal_send_cmd(dev);
498         if (ret)
499                 return ret;
500         ret = opal_recv_cmd(dev);
501         if (ret)
502                 return ret;
503         ret = opal_recv_check(dev);
504         if (ret)
505                 return ret;
506         return cont(dev);
507 }
508
509 static void check_geometry(struct opal_dev *dev, const void *data)
510 {
511         const struct d0_geometry_features *geo = data;
512
513         dev->align = be64_to_cpu(geo->alignment_granularity);
514         dev->lowest_lba = be64_to_cpu(geo->lowest_aligned_lba);
515         dev->logical_block_size = be32_to_cpu(geo->logical_block_size);
516         dev->align_required = geo->reserved01 & 1;
517 }
518
519 static int execute_step(struct opal_dev *dev,
520                         const struct opal_step *step, size_t stepIndex)
521 {
522         int error = step->fn(dev, step->data);
523
524         if (error) {
525                 pr_debug("Step %zu (%pS) failed with error %d: %s\n",
526                          stepIndex, step->fn, error,
527                          opal_error_to_human(error));
528         }
529
530         return error;
531 }
532
533 static int execute_steps(struct opal_dev *dev,
534                          const struct opal_step *steps, size_t n_steps)
535 {
536         size_t state = 0;
537         int error;
538
539         /* first do a discovery0 */
540         error = opal_discovery0_step(dev);
541         if (error)
542                 return error;
543
544         for (state = 0; state < n_steps; state++) {
545                 error = execute_step(dev, &steps[state], state);
546                 if (error)
547                         goto out_error;
548         }
549
550         return 0;
551
552 out_error:
553         /*
554          * For each OPAL command the first step in steps starts some sort of
555          * session. If an error occurred in the initial discovery0 or if an
556          * error occurred in the first step (and thus stopping the loop with
557          * state == 0) then there was an error before or during the attempt to
558          * start a session. Therefore we shouldn't attempt to terminate a
559          * session, as one has not yet been created.
560          */
561         if (state > 0)
562                 end_opal_session_error(dev);
563
564         return error;
565 }
566
567 static int opal_discovery0_end(struct opal_dev *dev, void *data)
568 {
569         struct opal_discovery *discv_out = data; /* may be NULL */
570         u8 __user *buf_out;
571         u64 len_out;
572         bool found_com_id = false, supported = true, single_user = false;
573         const struct d0_header *hdr = (struct d0_header *)dev->resp;
574         const u8 *epos = dev->resp, *cpos = dev->resp;
575         u16 comid = 0;
576         u32 hlen = be32_to_cpu(hdr->length);
577
578         print_buffer(dev->resp, hlen);
579         dev->flags &= OPAL_FL_SUPPORTED;
580
581         if (hlen > IO_BUFFER_LENGTH - sizeof(*hdr)) {
582                 pr_debug("Discovery length overflows buffer (%zu+%u)/%u\n",
583                          sizeof(*hdr), hlen, IO_BUFFER_LENGTH);
584                 return -EFAULT;
585         }
586
587         if (discv_out) {
588                 buf_out = (u8 __user *)(uintptr_t)discv_out->data;
589                 len_out = min_t(u64, discv_out->size, hlen);
590                 if (buf_out && copy_to_user(buf_out, dev->resp, len_out))
591                         return -EFAULT;
592
593                 discv_out->size = hlen; /* actual size of data */
594         }
595
596         epos += hlen; /* end of buffer */
597         cpos += sizeof(*hdr); /* current position on buffer */
598
599         while (cpos < epos && supported) {
600                 const struct d0_features *body =
601                         (const struct d0_features *)cpos;
602
603                 switch (be16_to_cpu(body->code)) {
604                 case FC_TPER:
605                         supported = check_tper(body->features);
606                         break;
607                 case FC_SINGLEUSER:
608                         single_user = check_sum(body->features);
609                         if (single_user)
610                                 dev->flags |= OPAL_FL_SUM_SUPPORTED;
611                         break;
612                 case FC_GEOMETRY:
613                         check_geometry(dev, body);
614                         break;
615                 case FC_LOCKING:
616                         if (check_lcksuppt(body->features))
617                                 dev->flags |= OPAL_FL_LOCKING_SUPPORTED;
618                         if (check_lckenabled(body->features))
619                                 dev->flags |= OPAL_FL_LOCKING_ENABLED;
620                         if (check_locked(body->features))
621                                 dev->flags |= OPAL_FL_LOCKED;
622                         if (check_mbrenabled(body->features))
623                                 dev->flags |= OPAL_FL_MBR_ENABLED;
624                         if (check_mbrdone(body->features))
625                                 dev->flags |= OPAL_FL_MBR_DONE;
626                         break;
627                 case FC_ENTERPRISE:
628                 case FC_DATASTORE:
629                         /* some ignored properties */
630                         pr_debug("Found OPAL feature description: %d\n",
631                                  be16_to_cpu(body->code));
632                         break;
633                 case FC_OPALV100:
634                         comid = get_comid_v100(body->features);
635                         found_com_id = true;
636                         break;
637                 case FC_OPALV200:
638                         comid = get_comid_v200(body->features);
639                         found_com_id = true;
640                         break;
641                 case 0xbfff ... 0xffff:
642                         /* vendor specific, just ignore */
643                         break;
644                 default:
645                         pr_debug("OPAL Unknown feature: %d\n",
646                                  be16_to_cpu(body->code));
647
648                 }
649                 cpos += body->length + 4;
650         }
651
652         if (!supported) {
653                 pr_debug("This device is not Opal enabled. Not Supported!\n");
654                 return -EOPNOTSUPP;
655         }
656
657         if (!single_user)
658                 pr_debug("Device doesn't support single user mode\n");
659
660
661         if (!found_com_id) {
662                 pr_debug("Could not find OPAL comid for device. Returning early\n");
663                 return -EOPNOTSUPP;
664         }
665
666         dev->comid = comid;
667
668         return 0;
669 }
670
671 static int opal_discovery0(struct opal_dev *dev, void *data)
672 {
673         int ret;
674
675         memset(dev->resp, 0, IO_BUFFER_LENGTH);
676         dev->comid = OPAL_DISCOVERY_COMID;
677         ret = opal_recv_cmd(dev);
678         if (ret)
679                 return ret;
680
681         return opal_discovery0_end(dev, data);
682 }
683
684 static int opal_discovery0_step(struct opal_dev *dev)
685 {
686         const struct opal_step discovery0_step = {
687                 opal_discovery0, NULL
688         };
689
690         return execute_step(dev, &discovery0_step, 0);
691 }
692
693 static size_t remaining_size(struct opal_dev *cmd)
694 {
695         return IO_BUFFER_LENGTH - cmd->pos;
696 }
697
698 static bool can_add(int *err, struct opal_dev *cmd, size_t len)
699 {
700         if (*err)
701                 return false;
702
703         if (remaining_size(cmd) < len) {
704                 pr_debug("Error adding %zu bytes: end of buffer.\n", len);
705                 *err = -ERANGE;
706                 return false;
707         }
708
709         return true;
710 }
711
712 static void add_token_u8(int *err, struct opal_dev *cmd, u8 tok)
713 {
714         if (!can_add(err, cmd, 1))
715                 return;
716
717         cmd->cmd[cmd->pos++] = tok;
718 }
719
720 static void add_short_atom_header(struct opal_dev *cmd, bool bytestring,
721                                   bool has_sign, int len)
722 {
723         u8 atom;
724         int err = 0;
725
726         atom = SHORT_ATOM_ID;
727         atom |= bytestring ? SHORT_ATOM_BYTESTRING : 0;
728         atom |= has_sign ? SHORT_ATOM_SIGNED : 0;
729         atom |= len & SHORT_ATOM_LEN_MASK;
730
731         add_token_u8(&err, cmd, atom);
732 }
733
734 static void add_medium_atom_header(struct opal_dev *cmd, bool bytestring,
735                                    bool has_sign, int len)
736 {
737         u8 header0;
738
739         header0 = MEDIUM_ATOM_ID;
740         header0 |= bytestring ? MEDIUM_ATOM_BYTESTRING : 0;
741         header0 |= has_sign ? MEDIUM_ATOM_SIGNED : 0;
742         header0 |= (len >> 8) & MEDIUM_ATOM_LEN_MASK;
743
744         cmd->cmd[cmd->pos++] = header0;
745         cmd->cmd[cmd->pos++] = len;
746 }
747
748 static void add_token_u64(int *err, struct opal_dev *cmd, u64 number)
749 {
750         size_t len;
751         int msb;
752
753         if (!(number & ~TINY_ATOM_DATA_MASK)) {
754                 add_token_u8(err, cmd, number);
755                 return;
756         }
757
758         msb = fls64(number);
759         len = DIV_ROUND_UP(msb, 8);
760
761         if (!can_add(err, cmd, len + 1)) {
762                 pr_debug("Error adding u64: end of buffer.\n");
763                 return;
764         }
765         add_short_atom_header(cmd, false, false, len);
766         while (len--)
767                 add_token_u8(err, cmd, number >> (len * 8));
768 }
769
770 static u8 *add_bytestring_header(int *err, struct opal_dev *cmd, size_t len)
771 {
772         size_t header_len = 1;
773         bool is_short_atom = true;
774
775         if (len & ~SHORT_ATOM_LEN_MASK) {
776                 header_len = 2;
777                 is_short_atom = false;
778         }
779
780         if (!can_add(err, cmd, header_len + len)) {
781                 pr_debug("Error adding bytestring: end of buffer.\n");
782                 return NULL;
783         }
784
785         if (is_short_atom)
786                 add_short_atom_header(cmd, true, false, len);
787         else
788                 add_medium_atom_header(cmd, true, false, len);
789
790         return &cmd->cmd[cmd->pos];
791 }
792
793 static void add_token_bytestring(int *err, struct opal_dev *cmd,
794                                  const u8 *bytestring, size_t len)
795 {
796         u8 *start;
797
798         start = add_bytestring_header(err, cmd, len);
799         if (!start)
800                 return;
801         memcpy(start, bytestring, len);
802         cmd->pos += len;
803 }
804
805 static int build_locking_range(u8 *buffer, size_t length, u8 lr)
806 {
807         if (length > OPAL_UID_LENGTH) {
808                 pr_debug("Can't build locking range. Length OOB\n");
809                 return -ERANGE;
810         }
811
812         memcpy(buffer, opaluid[OPAL_LOCKINGRANGE_GLOBAL], OPAL_UID_LENGTH);
813
814         if (lr == 0)
815                 return 0;
816
817         buffer[5] = LOCKING_RANGE_NON_GLOBAL;
818         buffer[7] = lr;
819
820         return 0;
821 }
822
823 static int build_locking_user(u8 *buffer, size_t length, u8 lr)
824 {
825         if (length > OPAL_UID_LENGTH) {
826                 pr_debug("Can't build locking range user. Length OOB\n");
827                 return -ERANGE;
828         }
829
830         memcpy(buffer, opaluid[OPAL_USER1_UID], OPAL_UID_LENGTH);
831
832         buffer[7] = lr + 1;
833
834         return 0;
835 }
836
837 static void set_comid(struct opal_dev *cmd, u16 comid)
838 {
839         struct opal_header *hdr = (struct opal_header *)cmd->cmd;
840
841         hdr->cp.extendedComID[0] = comid >> 8;
842         hdr->cp.extendedComID[1] = comid;
843         hdr->cp.extendedComID[2] = 0;
844         hdr->cp.extendedComID[3] = 0;
845 }
846
847 static int cmd_finalize(struct opal_dev *cmd, u32 hsn, u32 tsn)
848 {
849         struct opal_header *hdr;
850         int err = 0;
851
852         /*
853          * Close the parameter list opened from cmd_start.
854          * The number of bytes added must be equal to
855          * CMD_FINALIZE_BYTES_NEEDED.
856          */
857         add_token_u8(&err, cmd, OPAL_ENDLIST);
858
859         add_token_u8(&err, cmd, OPAL_ENDOFDATA);
860         add_token_u8(&err, cmd, OPAL_STARTLIST);
861         add_token_u8(&err, cmd, 0);
862         add_token_u8(&err, cmd, 0);
863         add_token_u8(&err, cmd, 0);
864         add_token_u8(&err, cmd, OPAL_ENDLIST);
865
866         if (err) {
867                 pr_debug("Error finalizing command.\n");
868                 return -EFAULT;
869         }
870
871         hdr = (struct opal_header *) cmd->cmd;
872
873         hdr->pkt.tsn = cpu_to_be32(tsn);
874         hdr->pkt.hsn = cpu_to_be32(hsn);
875
876         hdr->subpkt.length = cpu_to_be32(cmd->pos - sizeof(*hdr));
877         while (cmd->pos % 4) {
878                 if (cmd->pos >= IO_BUFFER_LENGTH) {
879                         pr_debug("Error: Buffer overrun\n");
880                         return -ERANGE;
881                 }
882                 cmd->cmd[cmd->pos++] = 0;
883         }
884         hdr->pkt.length = cpu_to_be32(cmd->pos - sizeof(hdr->cp) -
885                                       sizeof(hdr->pkt));
886         hdr->cp.length = cpu_to_be32(cmd->pos - sizeof(hdr->cp));
887
888         return 0;
889 }
890
891 static const struct opal_resp_tok *response_get_token(
892                                 const struct parsed_resp *resp,
893                                 int n)
894 {
895         const struct opal_resp_tok *tok;
896
897         if (!resp) {
898                 pr_debug("Response is NULL\n");
899                 return ERR_PTR(-EINVAL);
900         }
901
902         if (n >= resp->num) {
903                 pr_debug("Token number doesn't exist: %d, resp: %d\n",
904                          n, resp->num);
905                 return ERR_PTR(-EINVAL);
906         }
907
908         tok = &resp->toks[n];
909         if (tok->len == 0) {
910                 pr_debug("Token length must be non-zero\n");
911                 return ERR_PTR(-EINVAL);
912         }
913
914         return tok;
915 }
916
917 static ssize_t response_parse_tiny(struct opal_resp_tok *tok,
918                                    const u8 *pos)
919 {
920         tok->pos = pos;
921         tok->len = 1;
922         tok->width = OPAL_WIDTH_TINY;
923
924         if (pos[0] & TINY_ATOM_SIGNED) {
925                 tok->type = OPAL_DTA_TOKENID_SINT;
926         } else {
927                 tok->type = OPAL_DTA_TOKENID_UINT;
928                 tok->stored.u = pos[0] & 0x3f;
929         }
930
931         return tok->len;
932 }
933
934 static ssize_t response_parse_short(struct opal_resp_tok *tok,
935                                     const u8 *pos)
936 {
937         tok->pos = pos;
938         tok->len = (pos[0] & SHORT_ATOM_LEN_MASK) + 1;
939         tok->width = OPAL_WIDTH_SHORT;
940
941         if (pos[0] & SHORT_ATOM_BYTESTRING) {
942                 tok->type = OPAL_DTA_TOKENID_BYTESTRING;
943         } else if (pos[0] & SHORT_ATOM_SIGNED) {
944                 tok->type = OPAL_DTA_TOKENID_SINT;
945         } else {
946                 u64 u_integer = 0;
947                 ssize_t i, b = 0;
948
949                 tok->type = OPAL_DTA_TOKENID_UINT;
950                 if (tok->len > 9) {
951                         pr_debug("uint64 with more than 8 bytes\n");
952                         return -EINVAL;
953                 }
954                 for (i = tok->len - 1; i > 0; i--) {
955                         u_integer |= ((u64)pos[i] << (8 * b));
956                         b++;
957                 }
958                 tok->stored.u = u_integer;
959         }
960
961         return tok->len;
962 }
963
964 static ssize_t response_parse_medium(struct opal_resp_tok *tok,
965                                      const u8 *pos)
966 {
967         tok->pos = pos;
968         tok->len = (((pos[0] & MEDIUM_ATOM_LEN_MASK) << 8) | pos[1]) + 2;
969         tok->width = OPAL_WIDTH_MEDIUM;
970
971         if (pos[0] & MEDIUM_ATOM_BYTESTRING)
972                 tok->type = OPAL_DTA_TOKENID_BYTESTRING;
973         else if (pos[0] & MEDIUM_ATOM_SIGNED)
974                 tok->type = OPAL_DTA_TOKENID_SINT;
975         else
976                 tok->type = OPAL_DTA_TOKENID_UINT;
977
978         return tok->len;
979 }
980
981 static ssize_t response_parse_long(struct opal_resp_tok *tok,
982                                    const u8 *pos)
983 {
984         tok->pos = pos;
985         tok->len = ((pos[1] << 16) | (pos[2] << 8) | pos[3]) + 4;
986         tok->width = OPAL_WIDTH_LONG;
987
988         if (pos[0] & LONG_ATOM_BYTESTRING)
989                 tok->type = OPAL_DTA_TOKENID_BYTESTRING;
990         else if (pos[0] & LONG_ATOM_SIGNED)
991                 tok->type = OPAL_DTA_TOKENID_SINT;
992         else
993                 tok->type = OPAL_DTA_TOKENID_UINT;
994
995         return tok->len;
996 }
997
998 static ssize_t response_parse_token(struct opal_resp_tok *tok,
999                                     const u8 *pos)
1000 {
1001         tok->pos = pos;
1002         tok->len = 1;
1003         tok->type = OPAL_DTA_TOKENID_TOKEN;
1004         tok->width = OPAL_WIDTH_TOKEN;
1005
1006         return tok->len;
1007 }
1008
1009 static int response_parse(const u8 *buf, size_t length,
1010                           struct parsed_resp *resp)
1011 {
1012         const struct opal_header *hdr;
1013         struct opal_resp_tok *iter;
1014         int num_entries = 0;
1015         int total;
1016         ssize_t token_length;
1017         const u8 *pos;
1018         u32 clen, plen, slen;
1019
1020         if (!buf)
1021                 return -EFAULT;
1022
1023         if (!resp)
1024                 return -EFAULT;
1025
1026         hdr = (struct opal_header *)buf;
1027         pos = buf;
1028         pos += sizeof(*hdr);
1029
1030         clen = be32_to_cpu(hdr->cp.length);
1031         plen = be32_to_cpu(hdr->pkt.length);
1032         slen = be32_to_cpu(hdr->subpkt.length);
1033         pr_debug("Response size: cp: %u, pkt: %u, subpkt: %u\n",
1034                  clen, plen, slen);
1035
1036         if (clen == 0 || plen == 0 || slen == 0 ||
1037             slen > IO_BUFFER_LENGTH - sizeof(*hdr)) {
1038                 pr_debug("Bad header length. cp: %u, pkt: %u, subpkt: %u\n",
1039                          clen, plen, slen);
1040                 print_buffer(pos, sizeof(*hdr));
1041                 return -EINVAL;
1042         }
1043
1044         if (pos > buf + length)
1045                 return -EFAULT;
1046
1047         iter = resp->toks;
1048         total = slen;
1049         print_buffer(pos, total);
1050         while (total > 0) {
1051                 if (pos[0] <= TINY_ATOM_BYTE) /* tiny atom */
1052                         token_length = response_parse_tiny(iter, pos);
1053                 else if (pos[0] <= SHORT_ATOM_BYTE) /* short atom */
1054                         token_length = response_parse_short(iter, pos);
1055                 else if (pos[0] <= MEDIUM_ATOM_BYTE) /* medium atom */
1056                         token_length = response_parse_medium(iter, pos);
1057                 else if (pos[0] <= LONG_ATOM_BYTE) /* long atom */
1058                         token_length = response_parse_long(iter, pos);
1059                 else if (pos[0] == EMPTY_ATOM_BYTE) /* empty atom */
1060                         token_length = 1;
1061                 else /* TOKEN */
1062                         token_length = response_parse_token(iter, pos);
1063
1064                 if (token_length < 0)
1065                         return token_length;
1066
1067                 if (pos[0] != EMPTY_ATOM_BYTE)
1068                         num_entries++;
1069
1070                 pos += token_length;
1071                 total -= token_length;
1072                 iter++;
1073         }
1074
1075         resp->num = num_entries;
1076
1077         return 0;
1078 }
1079
1080 static size_t response_get_string(const struct parsed_resp *resp, int n,
1081                                   const char **store)
1082 {
1083         u8 skip;
1084         const struct opal_resp_tok *tok;
1085
1086         *store = NULL;
1087         tok = response_get_token(resp, n);
1088         if (IS_ERR(tok))
1089                 return 0;
1090
1091         if (tok->type != OPAL_DTA_TOKENID_BYTESTRING) {
1092                 pr_debug("Token is not a byte string!\n");
1093                 return 0;
1094         }
1095
1096         switch (tok->width) {
1097         case OPAL_WIDTH_TINY:
1098         case OPAL_WIDTH_SHORT:
1099                 skip = 1;
1100                 break;
1101         case OPAL_WIDTH_MEDIUM:
1102                 skip = 2;
1103                 break;
1104         case OPAL_WIDTH_LONG:
1105                 skip = 4;
1106                 break;
1107         default:
1108                 pr_debug("Token has invalid width!\n");
1109                 return 0;
1110         }
1111
1112         *store = tok->pos + skip;
1113
1114         return tok->len - skip;
1115 }
1116
1117 static u64 response_get_u64(const struct parsed_resp *resp, int n)
1118 {
1119         const struct opal_resp_tok *tok;
1120
1121         tok = response_get_token(resp, n);
1122         if (IS_ERR(tok))
1123                 return 0;
1124
1125         if (tok->type != OPAL_DTA_TOKENID_UINT) {
1126                 pr_debug("Token is not unsigned int: %d\n", tok->type);
1127                 return 0;
1128         }
1129
1130         if (tok->width != OPAL_WIDTH_TINY && tok->width != OPAL_WIDTH_SHORT) {
1131                 pr_debug("Atom is not short or tiny: %d\n", tok->width);
1132                 return 0;
1133         }
1134
1135         return tok->stored.u;
1136 }
1137
1138 static bool response_token_matches(const struct opal_resp_tok *token, u8 match)
1139 {
1140         if (IS_ERR(token) ||
1141             token->type != OPAL_DTA_TOKENID_TOKEN ||
1142             token->pos[0] != match)
1143                 return false;
1144         return true;
1145 }
1146
1147 static u8 response_status(const struct parsed_resp *resp)
1148 {
1149         const struct opal_resp_tok *tok;
1150
1151         tok = response_get_token(resp, 0);
1152         if (response_token_matches(tok, OPAL_ENDOFSESSION))
1153                 return 0;
1154
1155         if (resp->num < 5)
1156                 return DTAERROR_NO_METHOD_STATUS;
1157
1158         tok = response_get_token(resp, resp->num - 5);
1159         if (!response_token_matches(tok, OPAL_STARTLIST))
1160                 return DTAERROR_NO_METHOD_STATUS;
1161
1162         tok = response_get_token(resp, resp->num - 1);
1163         if (!response_token_matches(tok, OPAL_ENDLIST))
1164                 return DTAERROR_NO_METHOD_STATUS;
1165
1166         return response_get_u64(resp, resp->num - 4);
1167 }
1168
1169 /* Parses and checks for errors */
1170 static int parse_and_check_status(struct opal_dev *dev)
1171 {
1172         int error;
1173
1174         print_buffer(dev->cmd, dev->pos);
1175
1176         error = response_parse(dev->resp, IO_BUFFER_LENGTH, &dev->parsed);
1177         if (error) {
1178                 pr_debug("Couldn't parse response.\n");
1179                 return error;
1180         }
1181
1182         return response_status(&dev->parsed);
1183 }
1184
1185 static void clear_opal_cmd(struct opal_dev *dev)
1186 {
1187         dev->pos = sizeof(struct opal_header);
1188         memset(dev->cmd, 0, IO_BUFFER_LENGTH);
1189 }
1190
1191 static int cmd_start(struct opal_dev *dev, const u8 *uid, const u8 *method)
1192 {
1193         int err = 0;
1194
1195         clear_opal_cmd(dev);
1196         set_comid(dev, dev->comid);
1197
1198         add_token_u8(&err, dev, OPAL_CALL);
1199         add_token_bytestring(&err, dev, uid, OPAL_UID_LENGTH);
1200         add_token_bytestring(&err, dev, method, OPAL_METHOD_LENGTH);
1201
1202         /*
1203          * Every method call is followed by its parameters enclosed within
1204          * OPAL_STARTLIST and OPAL_ENDLIST tokens. We automatically open the
1205          * parameter list here and close it later in cmd_finalize.
1206          */
1207         add_token_u8(&err, dev, OPAL_STARTLIST);
1208
1209         return err;
1210 }
1211
1212 static int start_opal_session_cont(struct opal_dev *dev)
1213 {
1214         u32 hsn, tsn;
1215         int error;
1216
1217         error = parse_and_check_status(dev);
1218         if (error)
1219                 return error;
1220
1221         hsn = response_get_u64(&dev->parsed, 4);
1222         tsn = response_get_u64(&dev->parsed, 5);
1223
1224         if (hsn != GENERIC_HOST_SESSION_NUM || tsn < FIRST_TPER_SESSION_NUM) {
1225                 pr_debug("Couldn't authenticate session\n");
1226                 return -EPERM;
1227         }
1228
1229         dev->hsn = hsn;
1230         dev->tsn = tsn;
1231
1232         return 0;
1233 }
1234
1235 static void add_suspend_info(struct opal_dev *dev,
1236                              struct opal_suspend_data *sus)
1237 {
1238         struct opal_suspend_data *iter;
1239
1240         list_for_each_entry(iter, &dev->unlk_lst, node) {
1241                 if (iter->lr == sus->lr) {
1242                         list_del(&iter->node);
1243                         kfree(iter);
1244                         break;
1245                 }
1246         }
1247         list_add_tail(&sus->node, &dev->unlk_lst);
1248 }
1249
1250 static int end_session_cont(struct opal_dev *dev)
1251 {
1252         dev->hsn = 0;
1253         dev->tsn = 0;
1254
1255         return parse_and_check_status(dev);
1256 }
1257
1258 static int finalize_and_send(struct opal_dev *dev, cont_fn cont)
1259 {
1260         int ret;
1261
1262         ret = cmd_finalize(dev, dev->hsn, dev->tsn);
1263         if (ret) {
1264                 pr_debug("Error finalizing command buffer: %d\n", ret);
1265                 return ret;
1266         }
1267
1268         print_buffer(dev->cmd, dev->pos);
1269
1270         return opal_send_recv(dev, cont);
1271 }
1272
1273 static int generic_get_columns(struct opal_dev *dev, const u8 *table,
1274                                u64 start_column, u64 end_column)
1275 {
1276         int err;
1277
1278         err = cmd_start(dev, table, opalmethod[OPAL_GET]);
1279
1280         add_token_u8(&err, dev, OPAL_STARTLIST);
1281
1282         add_token_u8(&err, dev, OPAL_STARTNAME);
1283         add_token_u8(&err, dev, OPAL_STARTCOLUMN);
1284         add_token_u64(&err, dev, start_column);
1285         add_token_u8(&err, dev, OPAL_ENDNAME);
1286
1287         add_token_u8(&err, dev, OPAL_STARTNAME);
1288         add_token_u8(&err, dev, OPAL_ENDCOLUMN);
1289         add_token_u64(&err, dev, end_column);
1290         add_token_u8(&err, dev, OPAL_ENDNAME);
1291
1292         add_token_u8(&err, dev, OPAL_ENDLIST);
1293
1294         if (err)
1295                 return err;
1296
1297         return finalize_and_send(dev, parse_and_check_status);
1298 }
1299
1300 /*
1301  * request @column from table @table on device @dev. On success, the column
1302  * data will be available in dev->resp->tok[4]
1303  */
1304 static int generic_get_column(struct opal_dev *dev, const u8 *table,
1305                               u64 column)
1306 {
1307         return generic_get_columns(dev, table, column, column);
1308 }
1309
1310 /*
1311  * see TCG SAS 5.3.2.3 for a description of the available columns
1312  *
1313  * the result is provided in dev->resp->tok[4]
1314  */
1315 static int generic_get_table_info(struct opal_dev *dev, const u8 *table_uid,
1316                                   u64 column)
1317 {
1318         u8 uid[OPAL_UID_LENGTH];
1319         const unsigned int half = OPAL_UID_LENGTH_HALF;
1320
1321         /* sed-opal UIDs can be split in two halves:
1322          *  first:  actual table index
1323          *  second: relative index in the table
1324          * so we have to get the first half of the OPAL_TABLE_TABLE and use the
1325          * first part of the target table as relative index into that table
1326          */
1327         memcpy(uid, opaluid[OPAL_TABLE_TABLE], half);
1328         memcpy(uid + half, table_uid, half);
1329
1330         return generic_get_column(dev, uid, column);
1331 }
1332
1333 static int gen_key(struct opal_dev *dev, void *data)
1334 {
1335         u8 uid[OPAL_UID_LENGTH];
1336         int err;
1337
1338         memcpy(uid, dev->prev_data, min(sizeof(uid), dev->prev_d_len));
1339         kfree(dev->prev_data);
1340         dev->prev_data = NULL;
1341
1342         err = cmd_start(dev, uid, opalmethod[OPAL_GENKEY]);
1343
1344         if (err) {
1345                 pr_debug("Error building gen key command\n");
1346                 return err;
1347
1348         }
1349
1350         return finalize_and_send(dev, parse_and_check_status);
1351 }
1352
1353 static int get_active_key_cont(struct opal_dev *dev)
1354 {
1355         const char *activekey;
1356         size_t keylen;
1357         int error;
1358
1359         error = parse_and_check_status(dev);
1360         if (error)
1361                 return error;
1362
1363         keylen = response_get_string(&dev->parsed, 4, &activekey);
1364         if (!activekey) {
1365                 pr_debug("%s: Couldn't extract the Activekey from the response\n",
1366                          __func__);
1367                 return OPAL_INVAL_PARAM;
1368         }
1369
1370         dev->prev_data = kmemdup(activekey, keylen, GFP_KERNEL);
1371
1372         if (!dev->prev_data)
1373                 return -ENOMEM;
1374
1375         dev->prev_d_len = keylen;
1376
1377         return 0;
1378 }
1379
1380 static int get_active_key(struct opal_dev *dev, void *data)
1381 {
1382         u8 uid[OPAL_UID_LENGTH];
1383         int err;
1384         u8 *lr = data;
1385
1386         err = build_locking_range(uid, sizeof(uid), *lr);
1387         if (err)
1388                 return err;
1389
1390         err = generic_get_column(dev, uid, OPAL_ACTIVEKEY);
1391         if (err)
1392                 return err;
1393
1394         return get_active_key_cont(dev);
1395 }
1396
1397 static int generic_table_write_data(struct opal_dev *dev, const u64 data,
1398                                     u64 offset, u64 size, const u8 *uid)
1399 {
1400         const u8 __user *src = (u8 __user *)(uintptr_t)data;
1401         u8 *dst;
1402         u64 len;
1403         size_t off = 0;
1404         int err;
1405
1406         /* do we fit in the available space? */
1407         err = generic_get_table_info(dev, uid, OPAL_TABLE_ROWS);
1408         if (err) {
1409                 pr_debug("Couldn't get the table size\n");
1410                 return err;
1411         }
1412
1413         len = response_get_u64(&dev->parsed, 4);
1414         if (size > len || offset > len - size) {
1415                 pr_debug("Does not fit in the table (%llu vs. %llu)\n",
1416                           offset + size, len);
1417                 return -ENOSPC;
1418         }
1419
1420         /* do the actual transmission(s) */
1421         while (off < size) {
1422                 err = cmd_start(dev, uid, opalmethod[OPAL_SET]);
1423                 add_token_u8(&err, dev, OPAL_STARTNAME);
1424                 add_token_u8(&err, dev, OPAL_WHERE);
1425                 add_token_u64(&err, dev, offset + off);
1426                 add_token_u8(&err, dev, OPAL_ENDNAME);
1427
1428                 add_token_u8(&err, dev, OPAL_STARTNAME);
1429                 add_token_u8(&err, dev, OPAL_VALUES);
1430
1431                 /*
1432                  * The bytestring header is either 1 or 2 bytes, so assume 2.
1433                  * There also needs to be enough space to accommodate the
1434                  * trailing OPAL_ENDNAME (1 byte) and tokens added by
1435                  * cmd_finalize.
1436                  */
1437                 len = min(remaining_size(dev) - (2+1+CMD_FINALIZE_BYTES_NEEDED),
1438                           (size_t)(size - off));
1439                 pr_debug("Write bytes %zu+%llu/%llu\n", off, len, size);
1440
1441                 dst = add_bytestring_header(&err, dev, len);
1442                 if (!dst)
1443                         break;
1444
1445                 if (copy_from_user(dst, src + off, len)) {
1446                         err = -EFAULT;
1447                         break;
1448                 }
1449
1450                 dev->pos += len;
1451
1452                 add_token_u8(&err, dev, OPAL_ENDNAME);
1453                 if (err)
1454                         break;
1455
1456                 err = finalize_and_send(dev, parse_and_check_status);
1457                 if (err)
1458                         break;
1459
1460                 off += len;
1461         }
1462
1463         return err;
1464 }
1465
1466 static int generic_lr_enable_disable(struct opal_dev *dev,
1467                                      u8 *uid, bool rle, bool wle,
1468                                      bool rl, bool wl)
1469 {
1470         int err;
1471
1472         err = cmd_start(dev, uid, opalmethod[OPAL_SET]);
1473
1474         add_token_u8(&err, dev, OPAL_STARTNAME);
1475         add_token_u8(&err, dev, OPAL_VALUES);
1476         add_token_u8(&err, dev, OPAL_STARTLIST);
1477
1478         add_token_u8(&err, dev, OPAL_STARTNAME);
1479         add_token_u8(&err, dev, OPAL_READLOCKENABLED);
1480         add_token_u8(&err, dev, rle);
1481         add_token_u8(&err, dev, OPAL_ENDNAME);
1482
1483         add_token_u8(&err, dev, OPAL_STARTNAME);
1484         add_token_u8(&err, dev, OPAL_WRITELOCKENABLED);
1485         add_token_u8(&err, dev, wle);
1486         add_token_u8(&err, dev, OPAL_ENDNAME);
1487
1488         add_token_u8(&err, dev, OPAL_STARTNAME);
1489         add_token_u8(&err, dev, OPAL_READLOCKED);
1490         add_token_u8(&err, dev, rl);
1491         add_token_u8(&err, dev, OPAL_ENDNAME);
1492
1493         add_token_u8(&err, dev, OPAL_STARTNAME);
1494         add_token_u8(&err, dev, OPAL_WRITELOCKED);
1495         add_token_u8(&err, dev, wl);
1496         add_token_u8(&err, dev, OPAL_ENDNAME);
1497
1498         add_token_u8(&err, dev, OPAL_ENDLIST);
1499         add_token_u8(&err, dev, OPAL_ENDNAME);
1500
1501         return err;
1502 }
1503
1504 static inline int enable_global_lr(struct opal_dev *dev, u8 *uid,
1505                                    struct opal_user_lr_setup *setup)
1506 {
1507         int err;
1508
1509         err = generic_lr_enable_disable(dev, uid, !!setup->RLE, !!setup->WLE,
1510                                         0, 0);
1511         if (err)
1512                 pr_debug("Failed to create enable global lr command\n");
1513
1514         return err;
1515 }
1516
1517 static int setup_locking_range(struct opal_dev *dev, void *data)
1518 {
1519         u8 uid[OPAL_UID_LENGTH];
1520         struct opal_user_lr_setup *setup = data;
1521         u8 lr;
1522         int err;
1523
1524         lr = setup->session.opal_key.lr;
1525         err = build_locking_range(uid, sizeof(uid), lr);
1526         if (err)
1527                 return err;
1528
1529         if (lr == 0)
1530                 err = enable_global_lr(dev, uid, setup);
1531         else {
1532                 err = cmd_start(dev, uid, opalmethod[OPAL_SET]);
1533
1534                 add_token_u8(&err, dev, OPAL_STARTNAME);
1535                 add_token_u8(&err, dev, OPAL_VALUES);
1536                 add_token_u8(&err, dev, OPAL_STARTLIST);
1537
1538                 add_token_u8(&err, dev, OPAL_STARTNAME);
1539                 add_token_u8(&err, dev, OPAL_RANGESTART);
1540                 add_token_u64(&err, dev, setup->range_start);
1541                 add_token_u8(&err, dev, OPAL_ENDNAME);
1542
1543                 add_token_u8(&err, dev, OPAL_STARTNAME);
1544                 add_token_u8(&err, dev, OPAL_RANGELENGTH);
1545                 add_token_u64(&err, dev, setup->range_length);
1546                 add_token_u8(&err, dev, OPAL_ENDNAME);
1547
1548                 add_token_u8(&err, dev, OPAL_STARTNAME);
1549                 add_token_u8(&err, dev, OPAL_READLOCKENABLED);
1550                 add_token_u64(&err, dev, !!setup->RLE);
1551                 add_token_u8(&err, dev, OPAL_ENDNAME);
1552
1553                 add_token_u8(&err, dev, OPAL_STARTNAME);
1554                 add_token_u8(&err, dev, OPAL_WRITELOCKENABLED);
1555                 add_token_u64(&err, dev, !!setup->WLE);
1556                 add_token_u8(&err, dev, OPAL_ENDNAME);
1557
1558                 add_token_u8(&err, dev, OPAL_ENDLIST);
1559                 add_token_u8(&err, dev, OPAL_ENDNAME);
1560         }
1561         if (err) {
1562                 pr_debug("Error building Setup Locking range command.\n");
1563                 return err;
1564         }
1565
1566         return finalize_and_send(dev, parse_and_check_status);
1567 }
1568
1569 static int response_get_column(const struct parsed_resp *resp,
1570                                int *iter,
1571                                u8 column,
1572                                u64 *value)
1573 {
1574         const struct opal_resp_tok *tok;
1575         int n = *iter;
1576         u64 val;
1577
1578         tok = response_get_token(resp, n);
1579         if (IS_ERR(tok))
1580                 return PTR_ERR(tok);
1581
1582         if (!response_token_matches(tok, OPAL_STARTNAME)) {
1583                 pr_debug("Unexpected response token type %d.\n", n);
1584                 return OPAL_INVAL_PARAM;
1585         }
1586         n++;
1587
1588         if (response_get_u64(resp, n) != column) {
1589                 pr_debug("Token %d does not match expected column %u.\n",
1590                          n, column);
1591                 return OPAL_INVAL_PARAM;
1592         }
1593         n++;
1594
1595         val = response_get_u64(resp, n);
1596         n++;
1597
1598         tok = response_get_token(resp, n);
1599         if (IS_ERR(tok))
1600                 return PTR_ERR(tok);
1601
1602         if (!response_token_matches(tok, OPAL_ENDNAME)) {
1603                 pr_debug("Unexpected response token type %d.\n", n);
1604                 return OPAL_INVAL_PARAM;
1605         }
1606         n++;
1607
1608         *value = val;
1609         *iter = n;
1610
1611         return 0;
1612 }
1613
1614 static int locking_range_status(struct opal_dev *dev, void *data)
1615 {
1616         u8 lr_buffer[OPAL_UID_LENGTH];
1617         u64 resp;
1618         bool rlocked, wlocked;
1619         int err, tok_n = 2;
1620         struct opal_lr_status *lrst = data;
1621
1622         err = build_locking_range(lr_buffer, sizeof(lr_buffer),
1623                                   lrst->session.opal_key.lr);
1624         if (err)
1625                 return err;
1626
1627         err = generic_get_columns(dev, lr_buffer, OPAL_RANGESTART,
1628                                   OPAL_WRITELOCKED);
1629         if (err) {
1630                 pr_debug("Couldn't get lr %u table columns %d to %d.\n",
1631                          lrst->session.opal_key.lr, OPAL_RANGESTART,
1632                          OPAL_WRITELOCKED);
1633                 return err;
1634         }
1635
1636         /* range start */
1637         err = response_get_column(&dev->parsed, &tok_n, OPAL_RANGESTART,
1638                                   &lrst->range_start);
1639         if (err)
1640                 return err;
1641
1642         /* range length */
1643         err = response_get_column(&dev->parsed, &tok_n, OPAL_RANGELENGTH,
1644                                   &lrst->range_length);
1645         if (err)
1646                 return err;
1647
1648         /* RLE */
1649         err = response_get_column(&dev->parsed, &tok_n, OPAL_READLOCKENABLED,
1650                                   &resp);
1651         if (err)
1652                 return err;
1653
1654         lrst->RLE = !!resp;
1655
1656         /* WLE */
1657         err = response_get_column(&dev->parsed, &tok_n, OPAL_WRITELOCKENABLED,
1658                                   &resp);
1659         if (err)
1660                 return err;
1661
1662         lrst->WLE = !!resp;
1663
1664         /* read locked */
1665         err = response_get_column(&dev->parsed, &tok_n, OPAL_READLOCKED, &resp);
1666         if (err)
1667                 return err;
1668
1669         rlocked = !!resp;
1670
1671         /* write locked */
1672         err = response_get_column(&dev->parsed, &tok_n, OPAL_WRITELOCKED, &resp);
1673         if (err)
1674                 return err;
1675
1676         wlocked = !!resp;
1677
1678         /* opal_lock_state can not map 'read locked' only state. */
1679         lrst->l_state = OPAL_RW;
1680         if (rlocked && wlocked)
1681                 lrst->l_state = OPAL_LK;
1682         else if (wlocked)
1683                 lrst->l_state = OPAL_RO;
1684         else if (rlocked) {
1685                 pr_debug("Can not report read locked only state.\n");
1686                 return -EINVAL;
1687         }
1688
1689         return 0;
1690 }
1691
1692 static int start_generic_opal_session(struct opal_dev *dev,
1693                                       enum opal_uid auth,
1694                                       enum opal_uid sp_type,
1695                                       const char *key,
1696                                       u8 key_len)
1697 {
1698         u32 hsn;
1699         int err;
1700
1701         if (key == NULL && auth != OPAL_ANYBODY_UID)
1702                 return OPAL_INVAL_PARAM;
1703
1704         hsn = GENERIC_HOST_SESSION_NUM;
1705         err = cmd_start(dev, opaluid[OPAL_SMUID_UID],
1706                         opalmethod[OPAL_STARTSESSION]);
1707
1708         add_token_u64(&err, dev, hsn);
1709         add_token_bytestring(&err, dev, opaluid[sp_type], OPAL_UID_LENGTH);
1710         add_token_u8(&err, dev, 1);
1711
1712         switch (auth) {
1713         case OPAL_ANYBODY_UID:
1714                 break;
1715         case OPAL_ADMIN1_UID:
1716         case OPAL_SID_UID:
1717         case OPAL_PSID_UID:
1718                 add_token_u8(&err, dev, OPAL_STARTNAME);
1719                 add_token_u8(&err, dev, 0); /* HostChallenge */
1720                 add_token_bytestring(&err, dev, key, key_len);
1721                 add_token_u8(&err, dev, OPAL_ENDNAME);
1722                 add_token_u8(&err, dev, OPAL_STARTNAME);
1723                 add_token_u8(&err, dev, 3); /* HostSignAuth */
1724                 add_token_bytestring(&err, dev, opaluid[auth],
1725                                      OPAL_UID_LENGTH);
1726                 add_token_u8(&err, dev, OPAL_ENDNAME);
1727                 break;
1728         default:
1729                 pr_debug("Cannot start Admin SP session with auth %d\n", auth);
1730                 return OPAL_INVAL_PARAM;
1731         }
1732
1733         if (err) {
1734                 pr_debug("Error building start adminsp session command.\n");
1735                 return err;
1736         }
1737
1738         return finalize_and_send(dev, start_opal_session_cont);
1739 }
1740
1741 static int start_anybodyASP_opal_session(struct opal_dev *dev, void *data)
1742 {
1743         return start_generic_opal_session(dev, OPAL_ANYBODY_UID,
1744                                           OPAL_ADMINSP_UID, NULL, 0);
1745 }
1746
1747 static int start_SIDASP_opal_session(struct opal_dev *dev, void *data)
1748 {
1749         int ret;
1750         const u8 *key = dev->prev_data;
1751
1752         if (!key) {
1753                 const struct opal_key *okey = data;
1754
1755                 ret = start_generic_opal_session(dev, OPAL_SID_UID,
1756                                                  OPAL_ADMINSP_UID,
1757                                                  okey->key,
1758                                                  okey->key_len);
1759         } else {
1760                 ret = start_generic_opal_session(dev, OPAL_SID_UID,
1761                                                  OPAL_ADMINSP_UID,
1762                                                  key, dev->prev_d_len);
1763                 kfree(key);
1764                 dev->prev_data = NULL;
1765         }
1766
1767         return ret;
1768 }
1769
1770 static int start_admin1LSP_opal_session(struct opal_dev *dev, void *data)
1771 {
1772         struct opal_key *key = data;
1773
1774         return start_generic_opal_session(dev, OPAL_ADMIN1_UID,
1775                                           OPAL_LOCKINGSP_UID,
1776                                           key->key, key->key_len);
1777 }
1778
1779 static int start_PSID_opal_session(struct opal_dev *dev, void *data)
1780 {
1781         const struct opal_key *okey = data;
1782
1783         return start_generic_opal_session(dev, OPAL_PSID_UID,
1784                                           OPAL_ADMINSP_UID,
1785                                           okey->key,
1786                                           okey->key_len);
1787 }
1788
1789 static int start_auth_opal_session(struct opal_dev *dev, void *data)
1790 {
1791         struct opal_session_info *session = data;
1792         u8 lk_ul_user[OPAL_UID_LENGTH];
1793         size_t keylen = session->opal_key.key_len;
1794         int err = 0;
1795
1796         u8 *key = session->opal_key.key;
1797         u32 hsn = GENERIC_HOST_SESSION_NUM;
1798
1799         if (session->sum)
1800                 err = build_locking_user(lk_ul_user, sizeof(lk_ul_user),
1801                                          session->opal_key.lr);
1802         else if (session->who != OPAL_ADMIN1 && !session->sum)
1803                 err = build_locking_user(lk_ul_user, sizeof(lk_ul_user),
1804                                          session->who - 1);
1805         else
1806                 memcpy(lk_ul_user, opaluid[OPAL_ADMIN1_UID], OPAL_UID_LENGTH);
1807
1808         if (err)
1809                 return err;
1810
1811         err = cmd_start(dev, opaluid[OPAL_SMUID_UID],
1812                         opalmethod[OPAL_STARTSESSION]);
1813
1814         add_token_u64(&err, dev, hsn);
1815         add_token_bytestring(&err, dev, opaluid[OPAL_LOCKINGSP_UID],
1816                              OPAL_UID_LENGTH);
1817         add_token_u8(&err, dev, 1);
1818         add_token_u8(&err, dev, OPAL_STARTNAME);
1819         add_token_u8(&err, dev, 0);
1820         add_token_bytestring(&err, dev, key, keylen);
1821         add_token_u8(&err, dev, OPAL_ENDNAME);
1822         add_token_u8(&err, dev, OPAL_STARTNAME);
1823         add_token_u8(&err, dev, 3);
1824         add_token_bytestring(&err, dev, lk_ul_user, OPAL_UID_LENGTH);
1825         add_token_u8(&err, dev, OPAL_ENDNAME);
1826
1827         if (err) {
1828                 pr_debug("Error building STARTSESSION command.\n");
1829                 return err;
1830         }
1831
1832         return finalize_and_send(dev, start_opal_session_cont);
1833 }
1834
1835 static int revert_tper(struct opal_dev *dev, void *data)
1836 {
1837         int err;
1838
1839         err = cmd_start(dev, opaluid[OPAL_ADMINSP_UID],
1840                         opalmethod[OPAL_REVERT]);
1841         if (err) {
1842                 pr_debug("Error building REVERT TPER command.\n");
1843                 return err;
1844         }
1845
1846         return finalize_and_send(dev, parse_and_check_status);
1847 }
1848
1849 static int internal_activate_user(struct opal_dev *dev, void *data)
1850 {
1851         struct opal_session_info *session = data;
1852         u8 uid[OPAL_UID_LENGTH];
1853         int err;
1854
1855         memcpy(uid, opaluid[OPAL_USER1_UID], OPAL_UID_LENGTH);
1856         uid[7] = session->who;
1857
1858         err = cmd_start(dev, uid, opalmethod[OPAL_SET]);
1859         add_token_u8(&err, dev, OPAL_STARTNAME);
1860         add_token_u8(&err, dev, OPAL_VALUES);
1861         add_token_u8(&err, dev, OPAL_STARTLIST);
1862         add_token_u8(&err, dev, OPAL_STARTNAME);
1863         add_token_u8(&err, dev, 5); /* Enabled */
1864         add_token_u8(&err, dev, OPAL_TRUE);
1865         add_token_u8(&err, dev, OPAL_ENDNAME);
1866         add_token_u8(&err, dev, OPAL_ENDLIST);
1867         add_token_u8(&err, dev, OPAL_ENDNAME);
1868
1869         if (err) {
1870                 pr_debug("Error building Activate UserN command.\n");
1871                 return err;
1872         }
1873
1874         return finalize_and_send(dev, parse_and_check_status);
1875 }
1876
1877 static int revert_lsp(struct opal_dev *dev, void *data)
1878 {
1879         struct opal_revert_lsp *rev = data;
1880         int err;
1881
1882         err = cmd_start(dev, opaluid[OPAL_THISSP_UID],
1883                         opalmethod[OPAL_REVERTSP]);
1884         add_token_u8(&err, dev, OPAL_STARTNAME);
1885         add_token_u64(&err, dev, OPAL_KEEP_GLOBAL_RANGE_KEY);
1886         add_token_u8(&err, dev, (rev->options & OPAL_PRESERVE) ?
1887                         OPAL_TRUE : OPAL_FALSE);
1888         add_token_u8(&err, dev, OPAL_ENDNAME);
1889         if (err) {
1890                 pr_debug("Error building REVERT SP command.\n");
1891                 return err;
1892         }
1893
1894         return finalize_and_send(dev, parse_and_check_status);
1895 }
1896
1897 static int erase_locking_range(struct opal_dev *dev, void *data)
1898 {
1899         struct opal_session_info *session = data;
1900         u8 uid[OPAL_UID_LENGTH];
1901         int err;
1902
1903         if (build_locking_range(uid, sizeof(uid), session->opal_key.lr) < 0)
1904                 return -ERANGE;
1905
1906         err = cmd_start(dev, uid, opalmethod[OPAL_ERASE]);
1907
1908         if (err) {
1909                 pr_debug("Error building Erase Locking Range Command.\n");
1910                 return err;
1911         }
1912
1913         return finalize_and_send(dev, parse_and_check_status);
1914 }
1915
1916 static int set_mbr_done(struct opal_dev *dev, void *data)
1917 {
1918         u8 *mbr_done_tf = data;
1919         int err;
1920
1921         err = cmd_start(dev, opaluid[OPAL_MBRCONTROL],
1922                         opalmethod[OPAL_SET]);
1923
1924         add_token_u8(&err, dev, OPAL_STARTNAME);
1925         add_token_u8(&err, dev, OPAL_VALUES);
1926         add_token_u8(&err, dev, OPAL_STARTLIST);
1927         add_token_u8(&err, dev, OPAL_STARTNAME);
1928         add_token_u8(&err, dev, OPAL_MBRDONE);
1929         add_token_u8(&err, dev, *mbr_done_tf); /* Done T or F */
1930         add_token_u8(&err, dev, OPAL_ENDNAME);
1931         add_token_u8(&err, dev, OPAL_ENDLIST);
1932         add_token_u8(&err, dev, OPAL_ENDNAME);
1933
1934         if (err) {
1935                 pr_debug("Error Building set MBR Done command\n");
1936                 return err;
1937         }
1938
1939         return finalize_and_send(dev, parse_and_check_status);
1940 }
1941
1942 static int set_mbr_enable_disable(struct opal_dev *dev, void *data)
1943 {
1944         u8 *mbr_en_dis = data;
1945         int err;
1946
1947         err = cmd_start(dev, opaluid[OPAL_MBRCONTROL],
1948                         opalmethod[OPAL_SET]);
1949
1950         add_token_u8(&err, dev, OPAL_STARTNAME);
1951         add_token_u8(&err, dev, OPAL_VALUES);
1952         add_token_u8(&err, dev, OPAL_STARTLIST);
1953         add_token_u8(&err, dev, OPAL_STARTNAME);
1954         add_token_u8(&err, dev, OPAL_MBRENABLE);
1955         add_token_u8(&err, dev, *mbr_en_dis);
1956         add_token_u8(&err, dev, OPAL_ENDNAME);
1957         add_token_u8(&err, dev, OPAL_ENDLIST);
1958         add_token_u8(&err, dev, OPAL_ENDNAME);
1959
1960         if (err) {
1961                 pr_debug("Error Building set MBR done command\n");
1962                 return err;
1963         }
1964
1965         return finalize_and_send(dev, parse_and_check_status);
1966 }
1967
1968 static int write_shadow_mbr(struct opal_dev *dev, void *data)
1969 {
1970         struct opal_shadow_mbr *shadow = data;
1971
1972         return generic_table_write_data(dev, shadow->data, shadow->offset,
1973                                         shadow->size, opaluid[OPAL_MBR]);
1974 }
1975
1976 static int generic_pw_cmd(u8 *key, size_t key_len, u8 *cpin_uid,
1977                           struct opal_dev *dev)
1978 {
1979         int err;
1980
1981         err = cmd_start(dev, cpin_uid, opalmethod[OPAL_SET]);
1982
1983         add_token_u8(&err, dev, OPAL_STARTNAME);
1984         add_token_u8(&err, dev, OPAL_VALUES);
1985         add_token_u8(&err, dev, OPAL_STARTLIST);
1986         add_token_u8(&err, dev, OPAL_STARTNAME);
1987         add_token_u8(&err, dev, OPAL_PIN);
1988         add_token_bytestring(&err, dev, key, key_len);
1989         add_token_u8(&err, dev, OPAL_ENDNAME);
1990         add_token_u8(&err, dev, OPAL_ENDLIST);
1991         add_token_u8(&err, dev, OPAL_ENDNAME);
1992
1993         return err;
1994 }
1995
1996 static int set_new_pw(struct opal_dev *dev, void *data)
1997 {
1998         u8 cpin_uid[OPAL_UID_LENGTH];
1999         struct opal_session_info *usr = data;
2000
2001         memcpy(cpin_uid, opaluid[OPAL_C_PIN_ADMIN1], OPAL_UID_LENGTH);
2002
2003         if (usr->who != OPAL_ADMIN1) {
2004                 cpin_uid[5] = 0x03;
2005                 if (usr->sum)
2006                         cpin_uid[7] = usr->opal_key.lr + 1;
2007                 else
2008                         cpin_uid[7] = usr->who;
2009         }
2010
2011         if (generic_pw_cmd(usr->opal_key.key, usr->opal_key.key_len,
2012                            cpin_uid, dev)) {
2013                 pr_debug("Error building set password command.\n");
2014                 return -ERANGE;
2015         }
2016
2017         return finalize_and_send(dev, parse_and_check_status);
2018 }
2019
2020 static int set_sid_cpin_pin(struct opal_dev *dev, void *data)
2021 {
2022         u8 cpin_uid[OPAL_UID_LENGTH];
2023         struct opal_key *key = data;
2024
2025         memcpy(cpin_uid, opaluid[OPAL_C_PIN_SID], OPAL_UID_LENGTH);
2026
2027         if (generic_pw_cmd(key->key, key->key_len, cpin_uid, dev)) {
2028                 pr_debug("Error building Set SID cpin\n");
2029                 return -ERANGE;
2030         }
2031         return finalize_and_send(dev, parse_and_check_status);
2032 }
2033
2034 static void add_authority_object_ref(int *err,
2035                                      struct opal_dev *dev,
2036                                      const u8 *uid,
2037                                      size_t uid_len)
2038 {
2039         add_token_u8(err, dev, OPAL_STARTNAME);
2040         add_token_bytestring(err, dev,
2041                              opaluid[OPAL_HALF_UID_AUTHORITY_OBJ_REF],
2042                              OPAL_UID_LENGTH/2);
2043         add_token_bytestring(err, dev, uid, uid_len);
2044         add_token_u8(err, dev, OPAL_ENDNAME);
2045 }
2046
2047 static void add_boolean_object_ref(int *err,
2048                                    struct opal_dev *dev,
2049                                    u8 boolean_op)
2050 {
2051         add_token_u8(err, dev, OPAL_STARTNAME);
2052         add_token_bytestring(err, dev, opaluid[OPAL_HALF_UID_BOOLEAN_ACE],
2053                              OPAL_UID_LENGTH/2);
2054         add_token_u8(err, dev, boolean_op);
2055         add_token_u8(err, dev, OPAL_ENDNAME);
2056 }
2057
2058 static int set_lr_boolean_ace(struct opal_dev *dev,
2059                               unsigned int opal_uid,
2060                               u8 lr,
2061                               const u8 *users,
2062                               size_t users_len)
2063 {
2064         u8 lr_buffer[OPAL_UID_LENGTH];
2065         u8 user_uid[OPAL_UID_LENGTH];
2066         u8 u;
2067         int err;
2068
2069         memcpy(lr_buffer, opaluid[opal_uid], OPAL_UID_LENGTH);
2070         lr_buffer[7] = lr;
2071
2072         err = cmd_start(dev, lr_buffer, opalmethod[OPAL_SET]);
2073
2074         add_token_u8(&err, dev, OPAL_STARTNAME);
2075         add_token_u8(&err, dev, OPAL_VALUES);
2076
2077         add_token_u8(&err, dev, OPAL_STARTLIST);
2078         add_token_u8(&err, dev, OPAL_STARTNAME);
2079         add_token_u8(&err, dev, 3);
2080
2081         add_token_u8(&err, dev, OPAL_STARTLIST);
2082
2083         for (u = 0; u < users_len; u++) {
2084                 if (users[u] == OPAL_ADMIN1)
2085                         memcpy(user_uid, opaluid[OPAL_ADMIN1_UID],
2086                                OPAL_UID_LENGTH);
2087                 else {
2088                         memcpy(user_uid, opaluid[OPAL_USER1_UID],
2089                                OPAL_UID_LENGTH);
2090                         user_uid[7] = users[u];
2091                 }
2092
2093                 add_authority_object_ref(&err, dev, user_uid, sizeof(user_uid));
2094
2095                 /*
2096                  * Add boolean operator in postfix only with
2097                  * two or more authorities being added in ACE
2098                  * expresion.
2099                  * */
2100                 if (u > 0)
2101                         add_boolean_object_ref(&err, dev, OPAL_BOOLEAN_OR);
2102         }
2103
2104         add_token_u8(&err, dev, OPAL_ENDLIST);
2105         add_token_u8(&err, dev, OPAL_ENDNAME);
2106         add_token_u8(&err, dev, OPAL_ENDLIST);
2107         add_token_u8(&err, dev, OPAL_ENDNAME);
2108
2109         return err;
2110 }
2111
2112 static int add_user_to_lr(struct opal_dev *dev, void *data)
2113 {
2114         int err;
2115         struct opal_lock_unlock *lkul = data;
2116         const u8 users[] = {
2117                 lkul->session.who
2118         };
2119
2120         err = set_lr_boolean_ace(dev,
2121                                  lkul->l_state == OPAL_RW ?
2122                                         OPAL_LOCKINGRANGE_ACE_WRLOCKED :
2123                                         OPAL_LOCKINGRANGE_ACE_RDLOCKED,
2124                                  lkul->session.opal_key.lr, users,
2125                                  ARRAY_SIZE(users));
2126         if (err) {
2127                 pr_debug("Error building add user to locking range command.\n");
2128                 return err;
2129         }
2130
2131         return finalize_and_send(dev, parse_and_check_status);
2132 }
2133
2134 static int add_user_to_lr_ace(struct opal_dev *dev, void *data)
2135 {
2136         int err;
2137         struct opal_lock_unlock *lkul = data;
2138         const u8 users[] = {
2139                 OPAL_ADMIN1,
2140                 lkul->session.who
2141         };
2142
2143         err = set_lr_boolean_ace(dev, OPAL_LOCKINGRANGE_ACE_START_TO_KEY,
2144                                  lkul->session.opal_key.lr, users,
2145                                  ARRAY_SIZE(users));
2146
2147         if (err) {
2148                 pr_debug("Error building add user to locking ranges ACEs.\n");
2149                 return err;
2150         }
2151
2152         return finalize_and_send(dev, parse_and_check_status);
2153 }
2154
2155 static int lock_unlock_locking_range(struct opal_dev *dev, void *data)
2156 {
2157         u8 lr_buffer[OPAL_UID_LENGTH];
2158         struct opal_lock_unlock *lkul = data;
2159         u8 read_locked = 1, write_locked = 1;
2160         int err;
2161
2162         if (build_locking_range(lr_buffer, sizeof(lr_buffer),
2163                                 lkul->session.opal_key.lr) < 0)
2164                 return -ERANGE;
2165
2166         switch (lkul->l_state) {
2167         case OPAL_RO:
2168                 read_locked = 0;
2169                 write_locked = 1;
2170                 break;
2171         case OPAL_RW:
2172                 read_locked = 0;
2173                 write_locked = 0;
2174                 break;
2175         case OPAL_LK:
2176                 /* vars are initialized to locked */
2177                 break;
2178         default:
2179                 pr_debug("Tried to set an invalid locking state... returning to uland\n");
2180                 return OPAL_INVAL_PARAM;
2181         }
2182
2183         err = cmd_start(dev, lr_buffer, opalmethod[OPAL_SET]);
2184
2185         add_token_u8(&err, dev, OPAL_STARTNAME);
2186         add_token_u8(&err, dev, OPAL_VALUES);
2187         add_token_u8(&err, dev, OPAL_STARTLIST);
2188
2189         add_token_u8(&err, dev, OPAL_STARTNAME);
2190         add_token_u8(&err, dev, OPAL_READLOCKED);
2191         add_token_u8(&err, dev, read_locked);
2192         add_token_u8(&err, dev, OPAL_ENDNAME);
2193
2194         add_token_u8(&err, dev, OPAL_STARTNAME);
2195         add_token_u8(&err, dev, OPAL_WRITELOCKED);
2196         add_token_u8(&err, dev, write_locked);
2197         add_token_u8(&err, dev, OPAL_ENDNAME);
2198
2199         add_token_u8(&err, dev, OPAL_ENDLIST);
2200         add_token_u8(&err, dev, OPAL_ENDNAME);
2201
2202         if (err) {
2203                 pr_debug("Error building SET command.\n");
2204                 return err;
2205         }
2206
2207         return finalize_and_send(dev, parse_and_check_status);
2208 }
2209
2210
2211 static int lock_unlock_locking_range_sum(struct opal_dev *dev, void *data)
2212 {
2213         u8 lr_buffer[OPAL_UID_LENGTH];
2214         u8 read_locked = 1, write_locked = 1;
2215         struct opal_lock_unlock *lkul = data;
2216         int ret;
2217
2218         clear_opal_cmd(dev);
2219         set_comid(dev, dev->comid);
2220
2221         if (build_locking_range(lr_buffer, sizeof(lr_buffer),
2222                                 lkul->session.opal_key.lr) < 0)
2223                 return -ERANGE;
2224
2225         switch (lkul->l_state) {
2226         case OPAL_RO:
2227                 read_locked = 0;
2228                 write_locked = 1;
2229                 break;
2230         case OPAL_RW:
2231                 read_locked = 0;
2232                 write_locked = 0;
2233                 break;
2234         case OPAL_LK:
2235                 /* vars are initialized to locked */
2236                 break;
2237         default:
2238                 pr_debug("Tried to set an invalid locking state.\n");
2239                 return OPAL_INVAL_PARAM;
2240         }
2241         ret = generic_lr_enable_disable(dev, lr_buffer, 1, 1,
2242                                         read_locked, write_locked);
2243
2244         if (ret < 0) {
2245                 pr_debug("Error building SET command.\n");
2246                 return ret;
2247         }
2248
2249         return finalize_and_send(dev, parse_and_check_status);
2250 }
2251
2252 static int activate_lsp(struct opal_dev *dev, void *data)
2253 {
2254         struct opal_lr_act *opal_act = data;
2255         u8 user_lr[OPAL_UID_LENGTH];
2256         int err, i;
2257
2258         err = cmd_start(dev, opaluid[OPAL_LOCKINGSP_UID],
2259                         opalmethod[OPAL_ACTIVATE]);
2260
2261         if (opal_act->sum) {
2262                 err = build_locking_range(user_lr, sizeof(user_lr),
2263                                           opal_act->lr[0]);
2264                 if (err)
2265                         return err;
2266
2267                 add_token_u8(&err, dev, OPAL_STARTNAME);
2268                 add_token_u64(&err, dev, OPAL_SUM_SET_LIST);
2269
2270                 add_token_u8(&err, dev, OPAL_STARTLIST);
2271                 add_token_bytestring(&err, dev, user_lr, OPAL_UID_LENGTH);
2272                 for (i = 1; i < opal_act->num_lrs; i++) {
2273                         user_lr[7] = opal_act->lr[i];
2274                         add_token_bytestring(&err, dev, user_lr, OPAL_UID_LENGTH);
2275                 }
2276                 add_token_u8(&err, dev, OPAL_ENDLIST);
2277                 add_token_u8(&err, dev, OPAL_ENDNAME);
2278         }
2279
2280         if (err) {
2281                 pr_debug("Error building Activate LockingSP command.\n");
2282                 return err;
2283         }
2284
2285         return finalize_and_send(dev, parse_and_check_status);
2286 }
2287
2288 /* Determine if we're in the Manufactured Inactive or Active state */
2289 static int get_lsp_lifecycle(struct opal_dev *dev, void *data)
2290 {
2291         u8 lc_status;
2292         int err;
2293
2294         err = generic_get_column(dev, opaluid[OPAL_LOCKINGSP_UID],
2295                                  OPAL_LIFECYCLE);
2296         if (err)
2297                 return err;
2298
2299         lc_status = response_get_u64(&dev->parsed, 4);
2300         /* 0x08 is Manufactured Inactive */
2301         /* 0x09 is Manufactured */
2302         if (lc_status != OPAL_MANUFACTURED_INACTIVE) {
2303                 pr_debug("Couldn't determine the status of the Lifecycle state\n");
2304                 return -ENODEV;
2305         }
2306
2307         return 0;
2308 }
2309
2310 static int get_msid_cpin_pin(struct opal_dev *dev, void *data)
2311 {
2312         const char *msid_pin;
2313         size_t strlen;
2314         int err;
2315
2316         err = generic_get_column(dev, opaluid[OPAL_C_PIN_MSID], OPAL_PIN);
2317         if (err)
2318                 return err;
2319
2320         strlen = response_get_string(&dev->parsed, 4, &msid_pin);
2321         if (!msid_pin) {
2322                 pr_debug("Couldn't extract MSID_CPIN from response\n");
2323                 return OPAL_INVAL_PARAM;
2324         }
2325
2326         dev->prev_data = kmemdup(msid_pin, strlen, GFP_KERNEL);
2327         if (!dev->prev_data)
2328                 return -ENOMEM;
2329
2330         dev->prev_d_len = strlen;
2331
2332         return 0;
2333 }
2334
2335 static int write_table_data(struct opal_dev *dev, void *data)
2336 {
2337         struct opal_read_write_table *write_tbl = data;
2338
2339         return generic_table_write_data(dev, write_tbl->data, write_tbl->offset,
2340                                         write_tbl->size, write_tbl->table_uid);
2341 }
2342
2343 static int read_table_data_cont(struct opal_dev *dev)
2344 {
2345         int err;
2346         const char *data_read;
2347
2348         err = parse_and_check_status(dev);
2349         if (err)
2350                 return err;
2351
2352         dev->prev_d_len = response_get_string(&dev->parsed, 1, &data_read);
2353         dev->prev_data = (void *)data_read;
2354         if (!dev->prev_data) {
2355                 pr_debug("%s: Couldn't read data from the table.\n", __func__);
2356                 return OPAL_INVAL_PARAM;
2357         }
2358
2359         return 0;
2360 }
2361
2362 /*
2363  * IO_BUFFER_LENGTH = 2048
2364  * sizeof(header) = 56
2365  * No. of Token Bytes in the Response = 11
2366  * MAX size of data that can be carried in response buffer
2367  * at a time is : 2048 - (56 + 11) = 1981 = 0x7BD.
2368  */
2369 #define OPAL_MAX_READ_TABLE (0x7BD)
2370
2371 static int read_table_data(struct opal_dev *dev, void *data)
2372 {
2373         struct opal_read_write_table *read_tbl = data;
2374         int err;
2375         size_t off = 0, max_read_size = OPAL_MAX_READ_TABLE;
2376         u64 table_len, len;
2377         u64 offset = read_tbl->offset, read_size = read_tbl->size - 1;
2378         u8 __user *dst;
2379
2380         err = generic_get_table_info(dev, read_tbl->table_uid, OPAL_TABLE_ROWS);
2381         if (err) {
2382                 pr_debug("Couldn't get the table size\n");
2383                 return err;
2384         }
2385
2386         table_len = response_get_u64(&dev->parsed, 4);
2387
2388         /* Check if the user is trying to read from the table limits */
2389         if (read_size > table_len || offset > table_len - read_size) {
2390                 pr_debug("Read size exceeds the Table size limits (%llu vs. %llu)\n",
2391                           offset + read_size, table_len);
2392                 return -EINVAL;
2393         }
2394
2395         while (off < read_size) {
2396                 err = cmd_start(dev, read_tbl->table_uid, opalmethod[OPAL_GET]);
2397
2398                 add_token_u8(&err, dev, OPAL_STARTLIST);
2399                 add_token_u8(&err, dev, OPAL_STARTNAME);
2400                 add_token_u8(&err, dev, OPAL_STARTROW);
2401                 add_token_u64(&err, dev, offset + off); /* start row value */
2402                 add_token_u8(&err, dev, OPAL_ENDNAME);
2403
2404                 add_token_u8(&err, dev, OPAL_STARTNAME);
2405                 add_token_u8(&err, dev, OPAL_ENDROW);
2406
2407                 len = min(max_read_size, (size_t)(read_size - off));
2408                 add_token_u64(&err, dev, offset + off + len); /* end row value
2409                                                                */
2410                 add_token_u8(&err, dev, OPAL_ENDNAME);
2411                 add_token_u8(&err, dev, OPAL_ENDLIST);
2412
2413                 if (err) {
2414                         pr_debug("Error building read table data command.\n");
2415                         break;
2416                 }
2417
2418                 err = finalize_and_send(dev, read_table_data_cont);
2419                 if (err)
2420                         break;
2421
2422                 /* len+1: This includes the NULL terminator at the end*/
2423                 if (dev->prev_d_len > len + 1) {
2424                         err = -EOVERFLOW;
2425                         break;
2426                 }
2427
2428                 dst = (u8 __user *)(uintptr_t)read_tbl->data;
2429                 if (copy_to_user(dst + off, dev->prev_data, dev->prev_d_len)) {
2430                         pr_debug("Error copying data to userspace\n");
2431                         err = -EFAULT;
2432                         break;
2433                 }
2434                 dev->prev_data = NULL;
2435
2436                 off += len;
2437         }
2438
2439         return err;
2440 }
2441
2442 static int end_opal_session(struct opal_dev *dev, void *data)
2443 {
2444         int err = 0;
2445
2446         clear_opal_cmd(dev);
2447         set_comid(dev, dev->comid);
2448         add_token_u8(&err, dev, OPAL_ENDOFSESSION);
2449
2450         if (err < 0)
2451                 return err;
2452
2453         return finalize_and_send(dev, end_session_cont);
2454 }
2455
2456 static int end_opal_session_error(struct opal_dev *dev)
2457 {
2458         const struct opal_step error_end_session = {
2459                 end_opal_session,
2460         };
2461
2462         return execute_step(dev, &error_end_session, 0);
2463 }
2464
2465 static inline void setup_opal_dev(struct opal_dev *dev)
2466 {
2467         dev->tsn = 0;
2468         dev->hsn = 0;
2469         dev->prev_data = NULL;
2470 }
2471
2472 static int check_opal_support(struct opal_dev *dev)
2473 {
2474         int ret;
2475
2476         mutex_lock(&dev->dev_lock);
2477         setup_opal_dev(dev);
2478         ret = opal_discovery0_step(dev);
2479         if (!ret)
2480                 dev->flags |= OPAL_FL_SUPPORTED;
2481         mutex_unlock(&dev->dev_lock);
2482
2483         return ret;
2484 }
2485
2486 static void clean_opal_dev(struct opal_dev *dev)
2487 {
2488
2489         struct opal_suspend_data *suspend, *next;
2490
2491         mutex_lock(&dev->dev_lock);
2492         list_for_each_entry_safe(suspend, next, &dev->unlk_lst, node) {
2493                 list_del(&suspend->node);
2494                 kfree(suspend);
2495         }
2496         mutex_unlock(&dev->dev_lock);
2497 }
2498
2499 void free_opal_dev(struct opal_dev *dev)
2500 {
2501         if (!dev)
2502                 return;
2503
2504         clean_opal_dev(dev);
2505         kfree(dev->resp);
2506         kfree(dev->cmd);
2507         kfree(dev);
2508 }
2509 EXPORT_SYMBOL(free_opal_dev);
2510
2511 struct opal_dev *init_opal_dev(void *data, sec_send_recv *send_recv)
2512 {
2513         struct opal_dev *dev;
2514
2515         dev = kmalloc(sizeof(*dev), GFP_KERNEL);
2516         if (!dev)
2517                 return NULL;
2518
2519         /*
2520          * Presumably DMA-able buffers must be cache-aligned. Kmalloc makes
2521          * sure the allocated buffer is DMA-safe in that regard.
2522          */
2523         dev->cmd = kmalloc(IO_BUFFER_LENGTH, GFP_KERNEL);
2524         if (!dev->cmd)
2525                 goto err_free_dev;
2526
2527         dev->resp = kmalloc(IO_BUFFER_LENGTH, GFP_KERNEL);
2528         if (!dev->resp)
2529                 goto err_free_cmd;
2530
2531         INIT_LIST_HEAD(&dev->unlk_lst);
2532         mutex_init(&dev->dev_lock);
2533         dev->flags = 0;
2534         dev->data = data;
2535         dev->send_recv = send_recv;
2536         if (check_opal_support(dev) != 0) {
2537                 pr_debug("Opal is not supported on this device\n");
2538                 goto err_free_resp;
2539         }
2540
2541         return dev;
2542
2543 err_free_resp:
2544         kfree(dev->resp);
2545
2546 err_free_cmd:
2547         kfree(dev->cmd);
2548
2549 err_free_dev:
2550         kfree(dev);
2551
2552         return NULL;
2553 }
2554 EXPORT_SYMBOL(init_opal_dev);
2555
2556 static int opal_secure_erase_locking_range(struct opal_dev *dev,
2557                                            struct opal_session_info *opal_session)
2558 {
2559         const struct opal_step erase_steps[] = {
2560                 { start_auth_opal_session, opal_session },
2561                 { get_active_key, &opal_session->opal_key.lr },
2562                 { gen_key, },
2563                 { end_opal_session, }
2564         };
2565         int ret;
2566
2567         ret = opal_get_key(dev, &opal_session->opal_key);
2568         if (ret)
2569                 return ret;
2570         mutex_lock(&dev->dev_lock);
2571         setup_opal_dev(dev);
2572         ret = execute_steps(dev, erase_steps, ARRAY_SIZE(erase_steps));
2573         mutex_unlock(&dev->dev_lock);
2574
2575         return ret;
2576 }
2577
2578 static int opal_get_discv(struct opal_dev *dev, struct opal_discovery *discv)
2579 {
2580         const struct opal_step discovery0_step = {
2581                 opal_discovery0, discv
2582         };
2583         int ret;
2584
2585         mutex_lock(&dev->dev_lock);
2586         setup_opal_dev(dev);
2587         ret = execute_step(dev, &discovery0_step, 0);
2588         mutex_unlock(&dev->dev_lock);
2589         if (ret)
2590                 return ret;
2591         return discv->size; /* modified to actual length of data */
2592 }
2593
2594 static int opal_revertlsp(struct opal_dev *dev, struct opal_revert_lsp *rev)
2595 {
2596         /* controller will terminate session */
2597         const struct opal_step steps[] = {
2598                 { start_admin1LSP_opal_session, &rev->key },
2599                 { revert_lsp, rev }
2600         };
2601         int ret;
2602
2603         ret = opal_get_key(dev, &rev->key);
2604         if (ret)
2605                 return ret;
2606         mutex_lock(&dev->dev_lock);
2607         setup_opal_dev(dev);
2608         ret = execute_steps(dev, steps, ARRAY_SIZE(steps));
2609         mutex_unlock(&dev->dev_lock);
2610
2611         return ret;
2612 }
2613
2614 static int opal_erase_locking_range(struct opal_dev *dev,
2615                                     struct opal_session_info *opal_session)
2616 {
2617         const struct opal_step erase_steps[] = {
2618                 { start_auth_opal_session, opal_session },
2619                 { erase_locking_range, opal_session },
2620                 { end_opal_session, }
2621         };
2622         int ret;
2623
2624         ret = opal_get_key(dev, &opal_session->opal_key);
2625         if (ret)
2626                 return ret;
2627         mutex_lock(&dev->dev_lock);
2628         setup_opal_dev(dev);
2629         ret = execute_steps(dev, erase_steps, ARRAY_SIZE(erase_steps));
2630         mutex_unlock(&dev->dev_lock);
2631
2632         return ret;
2633 }
2634
2635 static int opal_enable_disable_shadow_mbr(struct opal_dev *dev,
2636                                           struct opal_mbr_data *opal_mbr)
2637 {
2638         u8 enable_disable = opal_mbr->enable_disable == OPAL_MBR_ENABLE ?
2639                 OPAL_TRUE : OPAL_FALSE;
2640
2641         const struct opal_step mbr_steps[] = {
2642                 { start_admin1LSP_opal_session, &opal_mbr->key },
2643                 { set_mbr_done, &enable_disable },
2644                 { end_opal_session, },
2645                 { start_admin1LSP_opal_session, &opal_mbr->key },
2646                 { set_mbr_enable_disable, &enable_disable },
2647                 { end_opal_session, }
2648         };
2649         int ret;
2650
2651         if (opal_mbr->enable_disable != OPAL_MBR_ENABLE &&
2652             opal_mbr->enable_disable != OPAL_MBR_DISABLE)
2653                 return -EINVAL;
2654
2655         ret = opal_get_key(dev, &opal_mbr->key);
2656         if (ret)
2657                 return ret;
2658         mutex_lock(&dev->dev_lock);
2659         setup_opal_dev(dev);
2660         ret = execute_steps(dev, mbr_steps, ARRAY_SIZE(mbr_steps));
2661         mutex_unlock(&dev->dev_lock);
2662
2663         return ret;
2664 }
2665
2666 static int opal_set_mbr_done(struct opal_dev *dev,
2667                              struct opal_mbr_done *mbr_done)
2668 {
2669         u8 mbr_done_tf = mbr_done->done_flag == OPAL_MBR_DONE ?
2670                 OPAL_TRUE : OPAL_FALSE;
2671
2672         const struct opal_step mbr_steps[] = {
2673                 { start_admin1LSP_opal_session, &mbr_done->key },
2674                 { set_mbr_done, &mbr_done_tf },
2675                 { end_opal_session, }
2676         };
2677         int ret;
2678
2679         if (mbr_done->done_flag != OPAL_MBR_DONE &&
2680             mbr_done->done_flag != OPAL_MBR_NOT_DONE)
2681                 return -EINVAL;
2682
2683         ret = opal_get_key(dev, &mbr_done->key);
2684         if (ret)
2685                 return ret;
2686         mutex_lock(&dev->dev_lock);
2687         setup_opal_dev(dev);
2688         ret = execute_steps(dev, mbr_steps, ARRAY_SIZE(mbr_steps));
2689         mutex_unlock(&dev->dev_lock);
2690
2691         return ret;
2692 }
2693
2694 static int opal_write_shadow_mbr(struct opal_dev *dev,
2695                                  struct opal_shadow_mbr *info)
2696 {
2697         const struct opal_step mbr_steps[] = {
2698                 { start_admin1LSP_opal_session, &info->key },
2699                 { write_shadow_mbr, info },
2700                 { end_opal_session, }
2701         };
2702         int ret;
2703
2704         if (info->size == 0)
2705                 return 0;
2706
2707         ret = opal_get_key(dev, &info->key);
2708         if (ret)
2709                 return ret;
2710         mutex_lock(&dev->dev_lock);
2711         setup_opal_dev(dev);
2712         ret = execute_steps(dev, mbr_steps, ARRAY_SIZE(mbr_steps));
2713         mutex_unlock(&dev->dev_lock);
2714
2715         return ret;
2716 }
2717
2718 static int opal_save(struct opal_dev *dev, struct opal_lock_unlock *lk_unlk)
2719 {
2720         struct opal_suspend_data *suspend;
2721
2722         suspend = kzalloc(sizeof(*suspend), GFP_KERNEL);
2723         if (!suspend)
2724                 return -ENOMEM;
2725
2726         suspend->unlk = *lk_unlk;
2727         suspend->lr = lk_unlk->session.opal_key.lr;
2728
2729         mutex_lock(&dev->dev_lock);
2730         setup_opal_dev(dev);
2731         add_suspend_info(dev, suspend);
2732         mutex_unlock(&dev->dev_lock);
2733
2734         return 0;
2735 }
2736
2737 static int opal_add_user_to_lr(struct opal_dev *dev,
2738                                struct opal_lock_unlock *lk_unlk)
2739 {
2740         const struct opal_step steps[] = {
2741                 { start_admin1LSP_opal_session, &lk_unlk->session.opal_key },
2742                 { add_user_to_lr, lk_unlk },
2743                 { add_user_to_lr_ace, lk_unlk },
2744                 { end_opal_session, }
2745         };
2746         int ret;
2747
2748         if (lk_unlk->l_state != OPAL_RO &&
2749             lk_unlk->l_state != OPAL_RW) {
2750                 pr_debug("Locking state was not RO or RW\n");
2751                 return -EINVAL;
2752         }
2753
2754         if (lk_unlk->session.who < OPAL_USER1 ||
2755             lk_unlk->session.who > OPAL_USER9) {
2756                 pr_debug("Authority was not within the range of users: %d\n",
2757                          lk_unlk->session.who);
2758                 return -EINVAL;
2759         }
2760
2761         if (lk_unlk->session.sum) {
2762                 pr_debug("%s not supported in sum. Use setup locking range\n",
2763                          __func__);
2764                 return -EINVAL;
2765         }
2766
2767         ret = opal_get_key(dev, &lk_unlk->session.opal_key);
2768         if (ret)
2769                 return ret;
2770         mutex_lock(&dev->dev_lock);
2771         setup_opal_dev(dev);
2772         ret = execute_steps(dev, steps, ARRAY_SIZE(steps));
2773         mutex_unlock(&dev->dev_lock);
2774
2775         return ret;
2776 }
2777
2778 static int opal_reverttper(struct opal_dev *dev, struct opal_key *opal, bool psid)
2779 {
2780         /* controller will terminate session */
2781         const struct opal_step revert_steps[] = {
2782                 { start_SIDASP_opal_session, opal },
2783                 { revert_tper, }
2784         };
2785         const struct opal_step psid_revert_steps[] = {
2786                 { start_PSID_opal_session, opal },
2787                 { revert_tper, }
2788         };
2789
2790         int ret;
2791
2792         ret = opal_get_key(dev, opal);
2793
2794         if (ret)
2795                 return ret;
2796         mutex_lock(&dev->dev_lock);
2797         setup_opal_dev(dev);
2798         if (psid)
2799                 ret = execute_steps(dev, psid_revert_steps,
2800                                     ARRAY_SIZE(psid_revert_steps));
2801         else
2802                 ret = execute_steps(dev, revert_steps,
2803                                     ARRAY_SIZE(revert_steps));
2804         mutex_unlock(&dev->dev_lock);
2805
2806         /*
2807          * If we successfully reverted lets clean
2808          * any saved locking ranges.
2809          */
2810         if (!ret)
2811                 clean_opal_dev(dev);
2812
2813         return ret;
2814 }
2815
2816 static int __opal_lock_unlock(struct opal_dev *dev,
2817                               struct opal_lock_unlock *lk_unlk)
2818 {
2819         const struct opal_step unlock_steps[] = {
2820                 { start_auth_opal_session, &lk_unlk->session },
2821                 { lock_unlock_locking_range, lk_unlk },
2822                 { end_opal_session, }
2823         };
2824         const struct opal_step unlock_sum_steps[] = {
2825                 { start_auth_opal_session, &lk_unlk->session },
2826                 { lock_unlock_locking_range_sum, lk_unlk },
2827                 { end_opal_session, }
2828         };
2829
2830         if (lk_unlk->session.sum)
2831                 return execute_steps(dev, unlock_sum_steps,
2832                                      ARRAY_SIZE(unlock_sum_steps));
2833         else
2834                 return execute_steps(dev, unlock_steps,
2835                                      ARRAY_SIZE(unlock_steps));
2836 }
2837
2838 static int __opal_set_mbr_done(struct opal_dev *dev, struct opal_key *key)
2839 {
2840         u8 mbr_done_tf = OPAL_TRUE;
2841         const struct opal_step mbrdone_step[] = {
2842                 { start_admin1LSP_opal_session, key },
2843                 { set_mbr_done, &mbr_done_tf },
2844                 { end_opal_session, }
2845         };
2846
2847         return execute_steps(dev, mbrdone_step, ARRAY_SIZE(mbrdone_step));
2848 }
2849
2850 static void opal_lock_check_for_saved_key(struct opal_dev *dev,
2851                             struct opal_lock_unlock *lk_unlk)
2852 {
2853         struct opal_suspend_data *iter;
2854
2855         if (lk_unlk->l_state != OPAL_LK ||
2856                         lk_unlk->session.opal_key.key_len > 0)
2857                 return;
2858
2859         /*
2860          * Usually when closing a crypto device (eg: dm-crypt with LUKS) the
2861          * volume key is not required, as it requires root privileges anyway,
2862          * and root can deny access to a disk in many ways regardless.
2863          * Requiring the volume key to lock the device is a peculiarity of the
2864          * OPAL specification. Given we might already have saved the key if
2865          * the user requested it via the 'IOC_OPAL_SAVE' ioctl, we can use
2866          * that key to lock the device if no key was provided here, the
2867          * locking range matches and the appropriate flag was passed with
2868          * 'IOC_OPAL_SAVE'.
2869          * This allows integrating OPAL with tools and libraries that are used
2870          * to the common behaviour and do not ask for the volume key when
2871          * closing a device.
2872          */
2873         setup_opal_dev(dev);
2874         list_for_each_entry(iter, &dev->unlk_lst, node) {
2875                 if ((iter->unlk.flags & OPAL_SAVE_FOR_LOCK) &&
2876                                 iter->lr == lk_unlk->session.opal_key.lr &&
2877                                 iter->unlk.session.opal_key.key_len > 0) {
2878                         lk_unlk->session.opal_key.key_len =
2879                                 iter->unlk.session.opal_key.key_len;
2880                         memcpy(lk_unlk->session.opal_key.key,
2881                                 iter->unlk.session.opal_key.key,
2882                                 iter->unlk.session.opal_key.key_len);
2883                         break;
2884                 }
2885         }
2886 }
2887
2888 static int opal_lock_unlock(struct opal_dev *dev,
2889                             struct opal_lock_unlock *lk_unlk)
2890 {
2891         int ret;
2892
2893         if (lk_unlk->session.who > OPAL_USER9)
2894                 return -EINVAL;
2895
2896         mutex_lock(&dev->dev_lock);
2897         opal_lock_check_for_saved_key(dev, lk_unlk);
2898         ret = opal_get_key(dev, &lk_unlk->session.opal_key);
2899         if (!ret)
2900                 ret = __opal_lock_unlock(dev, lk_unlk);
2901         mutex_unlock(&dev->dev_lock);
2902
2903         return ret;
2904 }
2905
2906 static int opal_take_ownership(struct opal_dev *dev, struct opal_key *opal)
2907 {
2908         const struct opal_step owner_steps[] = {
2909                 { start_anybodyASP_opal_session, },
2910                 { get_msid_cpin_pin, },
2911                 { end_opal_session, },
2912                 { start_SIDASP_opal_session, opal },
2913                 { set_sid_cpin_pin, opal },
2914                 { end_opal_session, }
2915         };
2916         int ret;
2917
2918         if (!dev)
2919                 return -ENODEV;
2920
2921         ret = opal_get_key(dev, opal);
2922         if (ret)
2923                 return ret;
2924         mutex_lock(&dev->dev_lock);
2925         setup_opal_dev(dev);
2926         ret = execute_steps(dev, owner_steps, ARRAY_SIZE(owner_steps));
2927         mutex_unlock(&dev->dev_lock);
2928
2929         return ret;
2930 }
2931
2932 static int opal_activate_lsp(struct opal_dev *dev,
2933                              struct opal_lr_act *opal_lr_act)
2934 {
2935         const struct opal_step active_steps[] = {
2936                 { start_SIDASP_opal_session, &opal_lr_act->key },
2937                 { get_lsp_lifecycle, },
2938                 { activate_lsp, opal_lr_act },
2939                 { end_opal_session, }
2940         };
2941         int ret;
2942
2943         if (!opal_lr_act->num_lrs || opal_lr_act->num_lrs > OPAL_MAX_LRS)
2944                 return -EINVAL;
2945
2946         ret = opal_get_key(dev, &opal_lr_act->key);
2947         if (ret)
2948                 return ret;
2949         mutex_lock(&dev->dev_lock);
2950         setup_opal_dev(dev);
2951         ret = execute_steps(dev, active_steps, ARRAY_SIZE(active_steps));
2952         mutex_unlock(&dev->dev_lock);
2953
2954         return ret;
2955 }
2956
2957 static int opal_setup_locking_range(struct opal_dev *dev,
2958                                     struct opal_user_lr_setup *opal_lrs)
2959 {
2960         const struct opal_step lr_steps[] = {
2961                 { start_auth_opal_session, &opal_lrs->session },
2962                 { setup_locking_range, opal_lrs },
2963                 { end_opal_session, }
2964         };
2965         int ret;
2966
2967         ret = opal_get_key(dev, &opal_lrs->session.opal_key);
2968         if (ret)
2969                 return ret;
2970         mutex_lock(&dev->dev_lock);
2971         setup_opal_dev(dev);
2972         ret = execute_steps(dev, lr_steps, ARRAY_SIZE(lr_steps));
2973         mutex_unlock(&dev->dev_lock);
2974
2975         return ret;
2976 }
2977
2978 static int opal_locking_range_status(struct opal_dev *dev,
2979                           struct opal_lr_status *opal_lrst,
2980                           void __user *data)
2981 {
2982         const struct opal_step lr_steps[] = {
2983                 { start_auth_opal_session, &opal_lrst->session },
2984                 { locking_range_status, opal_lrst },
2985                 { end_opal_session, }
2986         };
2987         int ret;
2988
2989         mutex_lock(&dev->dev_lock);
2990         setup_opal_dev(dev);
2991         ret = execute_steps(dev, lr_steps, ARRAY_SIZE(lr_steps));
2992         mutex_unlock(&dev->dev_lock);
2993
2994         /* skip session info when copying back to uspace */
2995         if (!ret && copy_to_user(data + offsetof(struct opal_lr_status, range_start),
2996                                 (void *)opal_lrst + offsetof(struct opal_lr_status, range_start),
2997                                 sizeof(*opal_lrst) - offsetof(struct opal_lr_status, range_start))) {
2998                 pr_debug("Error copying status to userspace\n");
2999                 return -EFAULT;
3000         }
3001
3002         return ret;
3003 }
3004
3005 static int opal_set_new_pw(struct opal_dev *dev, struct opal_new_pw *opal_pw)
3006 {
3007         const struct opal_step pw_steps[] = {
3008                 { start_auth_opal_session, &opal_pw->session },
3009                 { set_new_pw, &opal_pw->new_user_pw },
3010                 { end_opal_session, }
3011         };
3012         int ret;
3013
3014         if (opal_pw->session.who > OPAL_USER9  ||
3015             opal_pw->new_user_pw.who > OPAL_USER9)
3016                 return -EINVAL;
3017
3018         mutex_lock(&dev->dev_lock);
3019         setup_opal_dev(dev);
3020         ret = execute_steps(dev, pw_steps, ARRAY_SIZE(pw_steps));
3021         mutex_unlock(&dev->dev_lock);
3022
3023         if (ret)
3024                 return ret;
3025
3026         /* update keyring and key store with new password */
3027         ret = sed_write_key(OPAL_AUTH_KEY,
3028                             opal_pw->new_user_pw.opal_key.key,
3029                             opal_pw->new_user_pw.opal_key.key_len);
3030         if (ret != -EOPNOTSUPP)
3031                 pr_warn("error updating SED key: %d\n", ret);
3032
3033         ret = update_sed_opal_key(OPAL_AUTH_KEY,
3034                                   opal_pw->new_user_pw.opal_key.key,
3035                                   opal_pw->new_user_pw.opal_key.key_len);
3036
3037         return ret;
3038 }
3039
3040 static int opal_activate_user(struct opal_dev *dev,
3041                               struct opal_session_info *opal_session)
3042 {
3043         const struct opal_step act_steps[] = {
3044                 { start_admin1LSP_opal_session, &opal_session->opal_key },
3045                 { internal_activate_user, opal_session },
3046                 { end_opal_session, }
3047         };
3048         int ret;
3049
3050         /* We can't activate Admin1 it's active as manufactured */
3051         if (opal_session->who < OPAL_USER1 ||
3052             opal_session->who > OPAL_USER9) {
3053                 pr_debug("Who was not a valid user: %d\n", opal_session->who);
3054                 return -EINVAL;
3055         }
3056
3057         ret = opal_get_key(dev, &opal_session->opal_key);
3058         if (ret)
3059                 return ret;
3060         mutex_lock(&dev->dev_lock);
3061         setup_opal_dev(dev);
3062         ret = execute_steps(dev, act_steps, ARRAY_SIZE(act_steps));
3063         mutex_unlock(&dev->dev_lock);
3064
3065         return ret;
3066 }
3067
3068 bool opal_unlock_from_suspend(struct opal_dev *dev)
3069 {
3070         struct opal_suspend_data *suspend;
3071         bool was_failure = false;
3072         int ret;
3073
3074         if (!dev)
3075                 return false;
3076
3077         if (!(dev->flags & OPAL_FL_SUPPORTED))
3078                 return false;
3079
3080         mutex_lock(&dev->dev_lock);
3081         setup_opal_dev(dev);
3082
3083         list_for_each_entry(suspend, &dev->unlk_lst, node) {
3084                 dev->tsn = 0;
3085                 dev->hsn = 0;
3086
3087                 ret = __opal_lock_unlock(dev, &suspend->unlk);
3088                 if (ret) {
3089                         pr_debug("Failed to unlock LR %hhu with sum %d\n",
3090                                  suspend->unlk.session.opal_key.lr,
3091                                  suspend->unlk.session.sum);
3092                         was_failure = true;
3093                 }
3094
3095                 if (dev->flags & OPAL_FL_MBR_ENABLED) {
3096                         ret = __opal_set_mbr_done(dev, &suspend->unlk.session.opal_key);
3097                         if (ret)
3098                                 pr_debug("Failed to set MBR Done in S3 resume\n");
3099                 }
3100         }
3101         mutex_unlock(&dev->dev_lock);
3102
3103         return was_failure;
3104 }
3105 EXPORT_SYMBOL(opal_unlock_from_suspend);
3106
3107 static int opal_read_table(struct opal_dev *dev,
3108                            struct opal_read_write_table *rw_tbl)
3109 {
3110         const struct opal_step read_table_steps[] = {
3111                 { start_admin1LSP_opal_session, &rw_tbl->key },
3112                 { read_table_data, rw_tbl },
3113                 { end_opal_session, }
3114         };
3115
3116         if (!rw_tbl->size)
3117                 return 0;
3118
3119         return execute_steps(dev, read_table_steps,
3120                              ARRAY_SIZE(read_table_steps));
3121 }
3122
3123 static int opal_write_table(struct opal_dev *dev,
3124                             struct opal_read_write_table *rw_tbl)
3125 {
3126         const struct opal_step write_table_steps[] = {
3127                 { start_admin1LSP_opal_session, &rw_tbl->key },
3128                 { write_table_data, rw_tbl },
3129                 { end_opal_session, }
3130         };
3131
3132         if (!rw_tbl->size)
3133                 return 0;
3134
3135         return execute_steps(dev, write_table_steps,
3136                              ARRAY_SIZE(write_table_steps));
3137 }
3138
3139 static int opal_generic_read_write_table(struct opal_dev *dev,
3140                                          struct opal_read_write_table *rw_tbl)
3141 {
3142         int ret, bit_set;
3143
3144         ret = opal_get_key(dev, &rw_tbl->key);
3145         if (ret)
3146                 return ret;
3147         mutex_lock(&dev->dev_lock);
3148         setup_opal_dev(dev);
3149
3150         bit_set = fls64(rw_tbl->flags) - 1;
3151         switch (bit_set) {
3152         case OPAL_READ_TABLE:
3153                 ret = opal_read_table(dev, rw_tbl);
3154                 break;
3155         case OPAL_WRITE_TABLE:
3156                 ret = opal_write_table(dev, rw_tbl);
3157                 break;
3158         default:
3159                 pr_debug("Invalid bit set in the flag (%016llx).\n",
3160                          rw_tbl->flags);
3161                 ret = -EINVAL;
3162                 break;
3163         }
3164
3165         mutex_unlock(&dev->dev_lock);
3166
3167         return ret;
3168 }
3169
3170 static int opal_get_status(struct opal_dev *dev, void __user *data)
3171 {
3172         struct opal_status sts = {0};
3173
3174         /*
3175          * check_opal_support() error is not fatal,
3176          * !dev->supported is a valid condition
3177          */
3178         if (!check_opal_support(dev))
3179                 sts.flags = dev->flags;
3180         if (copy_to_user(data, &sts, sizeof(sts))) {
3181                 pr_debug("Error copying status to userspace\n");
3182                 return -EFAULT;
3183         }
3184         return 0;
3185 }
3186
3187 static int opal_get_geometry(struct opal_dev *dev, void __user *data)
3188 {
3189         struct opal_geometry geo = {0};
3190
3191         if (check_opal_support(dev))
3192                 return -EINVAL;
3193
3194         geo.align = dev->align_required;
3195         geo.logical_block_size = dev->logical_block_size;
3196         geo.alignment_granularity =  dev->align;
3197         geo.lowest_aligned_lba = dev->lowest_lba;
3198
3199         if (copy_to_user(data, &geo, sizeof(geo))) {
3200                 pr_debug("Error copying geometry data to userspace\n");
3201                 return -EFAULT;
3202         }
3203
3204         return 0;
3205 }
3206
3207 int sed_ioctl(struct opal_dev *dev, unsigned int cmd, void __user *arg)
3208 {
3209         void *p;
3210         int ret = -ENOTTY;
3211
3212         if (!capable(CAP_SYS_ADMIN))
3213                 return -EACCES;
3214         if (!dev)
3215                 return -EOPNOTSUPP;
3216         if (!(dev->flags & OPAL_FL_SUPPORTED))
3217                 return -EOPNOTSUPP;
3218
3219         if (cmd & IOC_IN) {
3220                 p = memdup_user(arg, _IOC_SIZE(cmd));
3221                 if (IS_ERR(p))
3222                         return PTR_ERR(p);
3223         }
3224
3225         switch (cmd) {
3226         case IOC_OPAL_SAVE:
3227                 ret = opal_save(dev, p);
3228                 break;
3229         case IOC_OPAL_LOCK_UNLOCK:
3230                 ret = opal_lock_unlock(dev, p);
3231                 break;
3232         case IOC_OPAL_TAKE_OWNERSHIP:
3233                 ret = opal_take_ownership(dev, p);
3234                 break;
3235         case IOC_OPAL_ACTIVATE_LSP:
3236                 ret = opal_activate_lsp(dev, p);
3237                 break;
3238         case IOC_OPAL_SET_PW:
3239                 ret = opal_set_new_pw(dev, p);
3240                 break;
3241         case IOC_OPAL_ACTIVATE_USR:
3242                 ret = opal_activate_user(dev, p);
3243                 break;
3244         case IOC_OPAL_REVERT_TPR:
3245                 ret = opal_reverttper(dev, p, false);
3246                 break;
3247         case IOC_OPAL_LR_SETUP:
3248                 ret = opal_setup_locking_range(dev, p);
3249                 break;
3250         case IOC_OPAL_ADD_USR_TO_LR:
3251                 ret = opal_add_user_to_lr(dev, p);
3252                 break;
3253         case IOC_OPAL_ENABLE_DISABLE_MBR:
3254                 ret = opal_enable_disable_shadow_mbr(dev, p);
3255                 break;
3256         case IOC_OPAL_MBR_DONE:
3257                 ret = opal_set_mbr_done(dev, p);
3258                 break;
3259         case IOC_OPAL_WRITE_SHADOW_MBR:
3260                 ret = opal_write_shadow_mbr(dev, p);
3261                 break;
3262         case IOC_OPAL_ERASE_LR:
3263                 ret = opal_erase_locking_range(dev, p);
3264                 break;
3265         case IOC_OPAL_SECURE_ERASE_LR:
3266                 ret = opal_secure_erase_locking_range(dev, p);
3267                 break;
3268         case IOC_OPAL_PSID_REVERT_TPR:
3269                 ret = opal_reverttper(dev, p, true);
3270                 break;
3271         case IOC_OPAL_GENERIC_TABLE_RW:
3272                 ret = opal_generic_read_write_table(dev, p);
3273                 break;
3274         case IOC_OPAL_GET_STATUS:
3275                 ret = opal_get_status(dev, arg);
3276                 break;
3277         case IOC_OPAL_GET_LR_STATUS:
3278                 ret = opal_locking_range_status(dev, p, arg);
3279                 break;
3280         case IOC_OPAL_GET_GEOMETRY:
3281                 ret = opal_get_geometry(dev, arg);
3282                 break;
3283         case IOC_OPAL_REVERT_LSP:
3284                 ret = opal_revertlsp(dev, p);
3285                 break;
3286         case IOC_OPAL_DISCOVERY:
3287                 ret = opal_get_discv(dev, p);
3288                 break;
3289
3290         default:
3291                 break;
3292         }
3293
3294         if (cmd & IOC_IN)
3295                 kfree(p);
3296         return ret;
3297 }
3298 EXPORT_SYMBOL_GPL(sed_ioctl);
3299
3300 static int __init sed_opal_init(void)
3301 {
3302         struct key *kr;
3303         char init_sed_key[OPAL_KEY_MAX];
3304         int keylen = OPAL_KEY_MAX - 1;
3305
3306         kr = keyring_alloc(".sed_opal",
3307                            GLOBAL_ROOT_UID, GLOBAL_ROOT_GID, current_cred(),
3308                            (KEY_POS_ALL & ~KEY_POS_SETATTR) | KEY_USR_VIEW |
3309                            KEY_USR_READ | KEY_USR_SEARCH | KEY_USR_WRITE,
3310                            KEY_ALLOC_NOT_IN_QUOTA,
3311                            NULL, NULL);
3312         if (IS_ERR(kr))
3313                 return PTR_ERR(kr);
3314
3315         sed_opal_keyring = kr;
3316
3317         if (sed_read_key(OPAL_AUTH_KEY, init_sed_key, &keylen) < 0) {
3318                 memset(init_sed_key, '\0', sizeof(init_sed_key));
3319                 keylen = OPAL_KEY_MAX - 1;
3320         }
3321
3322         return update_sed_opal_key(OPAL_AUTH_KEY, init_sed_key, keylen);
3323 }
3324 late_initcall(sed_opal_init);