smb: client: Fix minor whitespace errors and warnings
[linux-modified.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 /* TOKEN */
1060                         token_length = response_parse_token(iter, pos);
1061
1062                 if (token_length < 0)
1063                         return token_length;
1064
1065                 pos += token_length;
1066                 total -= token_length;
1067                 iter++;
1068                 num_entries++;
1069         }
1070
1071         resp->num = num_entries;
1072
1073         return 0;
1074 }
1075
1076 static size_t response_get_string(const struct parsed_resp *resp, int n,
1077                                   const char **store)
1078 {
1079         u8 skip;
1080         const struct opal_resp_tok *tok;
1081
1082         *store = NULL;
1083         tok = response_get_token(resp, n);
1084         if (IS_ERR(tok))
1085                 return 0;
1086
1087         if (tok->type != OPAL_DTA_TOKENID_BYTESTRING) {
1088                 pr_debug("Token is not a byte string!\n");
1089                 return 0;
1090         }
1091
1092         switch (tok->width) {
1093         case OPAL_WIDTH_TINY:
1094         case OPAL_WIDTH_SHORT:
1095                 skip = 1;
1096                 break;
1097         case OPAL_WIDTH_MEDIUM:
1098                 skip = 2;
1099                 break;
1100         case OPAL_WIDTH_LONG:
1101                 skip = 4;
1102                 break;
1103         default:
1104                 pr_debug("Token has invalid width!\n");
1105                 return 0;
1106         }
1107
1108         *store = tok->pos + skip;
1109
1110         return tok->len - skip;
1111 }
1112
1113 static u64 response_get_u64(const struct parsed_resp *resp, int n)
1114 {
1115         const struct opal_resp_tok *tok;
1116
1117         tok = response_get_token(resp, n);
1118         if (IS_ERR(tok))
1119                 return 0;
1120
1121         if (tok->type != OPAL_DTA_TOKENID_UINT) {
1122                 pr_debug("Token is not unsigned int: %d\n", tok->type);
1123                 return 0;
1124         }
1125
1126         if (tok->width != OPAL_WIDTH_TINY && tok->width != OPAL_WIDTH_SHORT) {
1127                 pr_debug("Atom is not short or tiny: %d\n", tok->width);
1128                 return 0;
1129         }
1130
1131         return tok->stored.u;
1132 }
1133
1134 static bool response_token_matches(const struct opal_resp_tok *token, u8 match)
1135 {
1136         if (IS_ERR(token) ||
1137             token->type != OPAL_DTA_TOKENID_TOKEN ||
1138             token->pos[0] != match)
1139                 return false;
1140         return true;
1141 }
1142
1143 static u8 response_status(const struct parsed_resp *resp)
1144 {
1145         const struct opal_resp_tok *tok;
1146
1147         tok = response_get_token(resp, 0);
1148         if (response_token_matches(tok, OPAL_ENDOFSESSION))
1149                 return 0;
1150
1151         if (resp->num < 5)
1152                 return DTAERROR_NO_METHOD_STATUS;
1153
1154         tok = response_get_token(resp, resp->num - 5);
1155         if (!response_token_matches(tok, OPAL_STARTLIST))
1156                 return DTAERROR_NO_METHOD_STATUS;
1157
1158         tok = response_get_token(resp, resp->num - 1);
1159         if (!response_token_matches(tok, OPAL_ENDLIST))
1160                 return DTAERROR_NO_METHOD_STATUS;
1161
1162         return response_get_u64(resp, resp->num - 4);
1163 }
1164
1165 /* Parses and checks for errors */
1166 static int parse_and_check_status(struct opal_dev *dev)
1167 {
1168         int error;
1169
1170         print_buffer(dev->cmd, dev->pos);
1171
1172         error = response_parse(dev->resp, IO_BUFFER_LENGTH, &dev->parsed);
1173         if (error) {
1174                 pr_debug("Couldn't parse response.\n");
1175                 return error;
1176         }
1177
1178         return response_status(&dev->parsed);
1179 }
1180
1181 static void clear_opal_cmd(struct opal_dev *dev)
1182 {
1183         dev->pos = sizeof(struct opal_header);
1184         memset(dev->cmd, 0, IO_BUFFER_LENGTH);
1185 }
1186
1187 static int cmd_start(struct opal_dev *dev, const u8 *uid, const u8 *method)
1188 {
1189         int err = 0;
1190
1191         clear_opal_cmd(dev);
1192         set_comid(dev, dev->comid);
1193
1194         add_token_u8(&err, dev, OPAL_CALL);
1195         add_token_bytestring(&err, dev, uid, OPAL_UID_LENGTH);
1196         add_token_bytestring(&err, dev, method, OPAL_METHOD_LENGTH);
1197
1198         /*
1199          * Every method call is followed by its parameters enclosed within
1200          * OPAL_STARTLIST and OPAL_ENDLIST tokens. We automatically open the
1201          * parameter list here and close it later in cmd_finalize.
1202          */
1203         add_token_u8(&err, dev, OPAL_STARTLIST);
1204
1205         return err;
1206 }
1207
1208 static int start_opal_session_cont(struct opal_dev *dev)
1209 {
1210         u32 hsn, tsn;
1211         int error = 0;
1212
1213         error = parse_and_check_status(dev);
1214         if (error)
1215                 return error;
1216
1217         hsn = response_get_u64(&dev->parsed, 4);
1218         tsn = response_get_u64(&dev->parsed, 5);
1219
1220         if (hsn != GENERIC_HOST_SESSION_NUM || tsn < FIRST_TPER_SESSION_NUM) {
1221                 pr_debug("Couldn't authenticate session\n");
1222                 return -EPERM;
1223         }
1224
1225         dev->hsn = hsn;
1226         dev->tsn = tsn;
1227
1228         return 0;
1229 }
1230
1231 static void add_suspend_info(struct opal_dev *dev,
1232                              struct opal_suspend_data *sus)
1233 {
1234         struct opal_suspend_data *iter;
1235
1236         list_for_each_entry(iter, &dev->unlk_lst, node) {
1237                 if (iter->lr == sus->lr) {
1238                         list_del(&iter->node);
1239                         kfree(iter);
1240                         break;
1241                 }
1242         }
1243         list_add_tail(&sus->node, &dev->unlk_lst);
1244 }
1245
1246 static int end_session_cont(struct opal_dev *dev)
1247 {
1248         dev->hsn = 0;
1249         dev->tsn = 0;
1250
1251         return parse_and_check_status(dev);
1252 }
1253
1254 static int finalize_and_send(struct opal_dev *dev, cont_fn cont)
1255 {
1256         int ret;
1257
1258         ret = cmd_finalize(dev, dev->hsn, dev->tsn);
1259         if (ret) {
1260                 pr_debug("Error finalizing command buffer: %d\n", ret);
1261                 return ret;
1262         }
1263
1264         print_buffer(dev->cmd, dev->pos);
1265
1266         return opal_send_recv(dev, cont);
1267 }
1268
1269 static int generic_get_columns(struct opal_dev *dev, const u8 *table,
1270                                u64 start_column, u64 end_column)
1271 {
1272         int err;
1273
1274         err = cmd_start(dev, table, opalmethod[OPAL_GET]);
1275
1276         add_token_u8(&err, dev, OPAL_STARTLIST);
1277
1278         add_token_u8(&err, dev, OPAL_STARTNAME);
1279         add_token_u8(&err, dev, OPAL_STARTCOLUMN);
1280         add_token_u64(&err, dev, start_column);
1281         add_token_u8(&err, dev, OPAL_ENDNAME);
1282
1283         add_token_u8(&err, dev, OPAL_STARTNAME);
1284         add_token_u8(&err, dev, OPAL_ENDCOLUMN);
1285         add_token_u64(&err, dev, end_column);
1286         add_token_u8(&err, dev, OPAL_ENDNAME);
1287
1288         add_token_u8(&err, dev, OPAL_ENDLIST);
1289
1290         if (err)
1291                 return err;
1292
1293         return finalize_and_send(dev, parse_and_check_status);
1294 }
1295
1296 /*
1297  * request @column from table @table on device @dev. On success, the column
1298  * data will be available in dev->resp->tok[4]
1299  */
1300 static int generic_get_column(struct opal_dev *dev, const u8 *table,
1301                               u64 column)
1302 {
1303         return generic_get_columns(dev, table, column, column);
1304 }
1305
1306 /*
1307  * see TCG SAS 5.3.2.3 for a description of the available columns
1308  *
1309  * the result is provided in dev->resp->tok[4]
1310  */
1311 static int generic_get_table_info(struct opal_dev *dev, const u8 *table_uid,
1312                                   u64 column)
1313 {
1314         u8 uid[OPAL_UID_LENGTH];
1315         const unsigned int half = OPAL_UID_LENGTH_HALF;
1316
1317         /* sed-opal UIDs can be split in two halves:
1318          *  first:  actual table index
1319          *  second: relative index in the table
1320          * so we have to get the first half of the OPAL_TABLE_TABLE and use the
1321          * first part of the target table as relative index into that table
1322          */
1323         memcpy(uid, opaluid[OPAL_TABLE_TABLE], half);
1324         memcpy(uid + half, table_uid, half);
1325
1326         return generic_get_column(dev, uid, column);
1327 }
1328
1329 static int gen_key(struct opal_dev *dev, void *data)
1330 {
1331         u8 uid[OPAL_UID_LENGTH];
1332         int err;
1333
1334         memcpy(uid, dev->prev_data, min(sizeof(uid), dev->prev_d_len));
1335         kfree(dev->prev_data);
1336         dev->prev_data = NULL;
1337
1338         err = cmd_start(dev, uid, opalmethod[OPAL_GENKEY]);
1339
1340         if (err) {
1341                 pr_debug("Error building gen key command\n");
1342                 return err;
1343
1344         }
1345
1346         return finalize_and_send(dev, parse_and_check_status);
1347 }
1348
1349 static int get_active_key_cont(struct opal_dev *dev)
1350 {
1351         const char *activekey;
1352         size_t keylen;
1353         int error = 0;
1354
1355         error = parse_and_check_status(dev);
1356         if (error)
1357                 return error;
1358
1359         keylen = response_get_string(&dev->parsed, 4, &activekey);
1360         if (!activekey) {
1361                 pr_debug("%s: Couldn't extract the Activekey from the response\n",
1362                          __func__);
1363                 return OPAL_INVAL_PARAM;
1364         }
1365
1366         dev->prev_data = kmemdup(activekey, keylen, GFP_KERNEL);
1367
1368         if (!dev->prev_data)
1369                 return -ENOMEM;
1370
1371         dev->prev_d_len = keylen;
1372
1373         return 0;
1374 }
1375
1376 static int get_active_key(struct opal_dev *dev, void *data)
1377 {
1378         u8 uid[OPAL_UID_LENGTH];
1379         int err;
1380         u8 *lr = data;
1381
1382         err = build_locking_range(uid, sizeof(uid), *lr);
1383         if (err)
1384                 return err;
1385
1386         err = generic_get_column(dev, uid, OPAL_ACTIVEKEY);
1387         if (err)
1388                 return err;
1389
1390         return get_active_key_cont(dev);
1391 }
1392
1393 static int generic_table_write_data(struct opal_dev *dev, const u64 data,
1394                                     u64 offset, u64 size, const u8 *uid)
1395 {
1396         const u8 __user *src = (u8 __user *)(uintptr_t)data;
1397         u8 *dst;
1398         u64 len;
1399         size_t off = 0;
1400         int err;
1401
1402         /* do we fit in the available space? */
1403         err = generic_get_table_info(dev, uid, OPAL_TABLE_ROWS);
1404         if (err) {
1405                 pr_debug("Couldn't get the table size\n");
1406                 return err;
1407         }
1408
1409         len = response_get_u64(&dev->parsed, 4);
1410         if (size > len || offset > len - size) {
1411                 pr_debug("Does not fit in the table (%llu vs. %llu)\n",
1412                           offset + size, len);
1413                 return -ENOSPC;
1414         }
1415
1416         /* do the actual transmission(s) */
1417         while (off < size) {
1418                 err = cmd_start(dev, uid, opalmethod[OPAL_SET]);
1419                 add_token_u8(&err, dev, OPAL_STARTNAME);
1420                 add_token_u8(&err, dev, OPAL_WHERE);
1421                 add_token_u64(&err, dev, offset + off);
1422                 add_token_u8(&err, dev, OPAL_ENDNAME);
1423
1424                 add_token_u8(&err, dev, OPAL_STARTNAME);
1425                 add_token_u8(&err, dev, OPAL_VALUES);
1426
1427                 /*
1428                  * The bytestring header is either 1 or 2 bytes, so assume 2.
1429                  * There also needs to be enough space to accommodate the
1430                  * trailing OPAL_ENDNAME (1 byte) and tokens added by
1431                  * cmd_finalize.
1432                  */
1433                 len = min(remaining_size(dev) - (2+1+CMD_FINALIZE_BYTES_NEEDED),
1434                           (size_t)(size - off));
1435                 pr_debug("Write bytes %zu+%llu/%llu\n", off, len, size);
1436
1437                 dst = add_bytestring_header(&err, dev, len);
1438                 if (!dst)
1439                         break;
1440
1441                 if (copy_from_user(dst, src + off, len)) {
1442                         err = -EFAULT;
1443                         break;
1444                 }
1445
1446                 dev->pos += len;
1447
1448                 add_token_u8(&err, dev, OPAL_ENDNAME);
1449                 if (err)
1450                         break;
1451
1452                 err = finalize_and_send(dev, parse_and_check_status);
1453                 if (err)
1454                         break;
1455
1456                 off += len;
1457         }
1458
1459         return err;
1460 }
1461
1462 static int generic_lr_enable_disable(struct opal_dev *dev,
1463                                      u8 *uid, bool rle, bool wle,
1464                                      bool rl, bool wl)
1465 {
1466         int err;
1467
1468         err = cmd_start(dev, uid, opalmethod[OPAL_SET]);
1469
1470         add_token_u8(&err, dev, OPAL_STARTNAME);
1471         add_token_u8(&err, dev, OPAL_VALUES);
1472         add_token_u8(&err, dev, OPAL_STARTLIST);
1473
1474         add_token_u8(&err, dev, OPAL_STARTNAME);
1475         add_token_u8(&err, dev, OPAL_READLOCKENABLED);
1476         add_token_u8(&err, dev, rle);
1477         add_token_u8(&err, dev, OPAL_ENDNAME);
1478
1479         add_token_u8(&err, dev, OPAL_STARTNAME);
1480         add_token_u8(&err, dev, OPAL_WRITELOCKENABLED);
1481         add_token_u8(&err, dev, wle);
1482         add_token_u8(&err, dev, OPAL_ENDNAME);
1483
1484         add_token_u8(&err, dev, OPAL_STARTNAME);
1485         add_token_u8(&err, dev, OPAL_READLOCKED);
1486         add_token_u8(&err, dev, rl);
1487         add_token_u8(&err, dev, OPAL_ENDNAME);
1488
1489         add_token_u8(&err, dev, OPAL_STARTNAME);
1490         add_token_u8(&err, dev, OPAL_WRITELOCKED);
1491         add_token_u8(&err, dev, wl);
1492         add_token_u8(&err, dev, OPAL_ENDNAME);
1493
1494         add_token_u8(&err, dev, OPAL_ENDLIST);
1495         add_token_u8(&err, dev, OPAL_ENDNAME);
1496
1497         return err;
1498 }
1499
1500 static inline int enable_global_lr(struct opal_dev *dev, u8 *uid,
1501                                    struct opal_user_lr_setup *setup)
1502 {
1503         int err;
1504
1505         err = generic_lr_enable_disable(dev, uid, !!setup->RLE, !!setup->WLE,
1506                                         0, 0);
1507         if (err)
1508                 pr_debug("Failed to create enable global lr command\n");
1509
1510         return err;
1511 }
1512
1513 static int setup_locking_range(struct opal_dev *dev, void *data)
1514 {
1515         u8 uid[OPAL_UID_LENGTH];
1516         struct opal_user_lr_setup *setup = data;
1517         u8 lr;
1518         int err;
1519
1520         lr = setup->session.opal_key.lr;
1521         err = build_locking_range(uid, sizeof(uid), lr);
1522         if (err)
1523                 return err;
1524
1525         if (lr == 0)
1526                 err = enable_global_lr(dev, uid, setup);
1527         else {
1528                 err = cmd_start(dev, uid, opalmethod[OPAL_SET]);
1529
1530                 add_token_u8(&err, dev, OPAL_STARTNAME);
1531                 add_token_u8(&err, dev, OPAL_VALUES);
1532                 add_token_u8(&err, dev, OPAL_STARTLIST);
1533
1534                 add_token_u8(&err, dev, OPAL_STARTNAME);
1535                 add_token_u8(&err, dev, OPAL_RANGESTART);
1536                 add_token_u64(&err, dev, setup->range_start);
1537                 add_token_u8(&err, dev, OPAL_ENDNAME);
1538
1539                 add_token_u8(&err, dev, OPAL_STARTNAME);
1540                 add_token_u8(&err, dev, OPAL_RANGELENGTH);
1541                 add_token_u64(&err, dev, setup->range_length);
1542                 add_token_u8(&err, dev, OPAL_ENDNAME);
1543
1544                 add_token_u8(&err, dev, OPAL_STARTNAME);
1545                 add_token_u8(&err, dev, OPAL_READLOCKENABLED);
1546                 add_token_u64(&err, dev, !!setup->RLE);
1547                 add_token_u8(&err, dev, OPAL_ENDNAME);
1548
1549                 add_token_u8(&err, dev, OPAL_STARTNAME);
1550                 add_token_u8(&err, dev, OPAL_WRITELOCKENABLED);
1551                 add_token_u64(&err, dev, !!setup->WLE);
1552                 add_token_u8(&err, dev, OPAL_ENDNAME);
1553
1554                 add_token_u8(&err, dev, OPAL_ENDLIST);
1555                 add_token_u8(&err, dev, OPAL_ENDNAME);
1556         }
1557         if (err) {
1558                 pr_debug("Error building Setup Locking range command.\n");
1559                 return err;
1560         }
1561
1562         return finalize_and_send(dev, parse_and_check_status);
1563 }
1564
1565 static int response_get_column(const struct parsed_resp *resp,
1566                                int *iter,
1567                                u8 column,
1568                                u64 *value)
1569 {
1570         const struct opal_resp_tok *tok;
1571         int n = *iter;
1572         u64 val;
1573
1574         tok = response_get_token(resp, n);
1575         if (IS_ERR(tok))
1576                 return PTR_ERR(tok);
1577
1578         if (!response_token_matches(tok, OPAL_STARTNAME)) {
1579                 pr_debug("Unexpected response token type %d.\n", n);
1580                 return OPAL_INVAL_PARAM;
1581         }
1582         n++;
1583
1584         if (response_get_u64(resp, n) != column) {
1585                 pr_debug("Token %d does not match expected column %u.\n",
1586                          n, column);
1587                 return OPAL_INVAL_PARAM;
1588         }
1589         n++;
1590
1591         val = response_get_u64(resp, n);
1592         n++;
1593
1594         tok = response_get_token(resp, n);
1595         if (IS_ERR(tok))
1596                 return PTR_ERR(tok);
1597
1598         if (!response_token_matches(tok, OPAL_ENDNAME)) {
1599                 pr_debug("Unexpected response token type %d.\n", n);
1600                 return OPAL_INVAL_PARAM;
1601         }
1602         n++;
1603
1604         *value = val;
1605         *iter = n;
1606
1607         return 0;
1608 }
1609
1610 static int locking_range_status(struct opal_dev *dev, void *data)
1611 {
1612         u8 lr_buffer[OPAL_UID_LENGTH];
1613         u64 resp;
1614         bool rlocked, wlocked;
1615         int err, tok_n = 2;
1616         struct opal_lr_status *lrst = data;
1617
1618         err = build_locking_range(lr_buffer, sizeof(lr_buffer),
1619                                   lrst->session.opal_key.lr);
1620         if (err)
1621                 return err;
1622
1623         err = generic_get_columns(dev, lr_buffer, OPAL_RANGESTART,
1624                                   OPAL_WRITELOCKED);
1625         if (err) {
1626                 pr_debug("Couldn't get lr %u table columns %d to %d.\n",
1627                          lrst->session.opal_key.lr, OPAL_RANGESTART,
1628                          OPAL_WRITELOCKED);
1629                 return err;
1630         }
1631
1632         /* range start */
1633         err = response_get_column(&dev->parsed, &tok_n, OPAL_RANGESTART,
1634                                   &lrst->range_start);
1635         if (err)
1636                 return err;
1637
1638         /* range length */
1639         err = response_get_column(&dev->parsed, &tok_n, OPAL_RANGELENGTH,
1640                                   &lrst->range_length);
1641         if (err)
1642                 return err;
1643
1644         /* RLE */
1645         err = response_get_column(&dev->parsed, &tok_n, OPAL_READLOCKENABLED,
1646                                   &resp);
1647         if (err)
1648                 return err;
1649
1650         lrst->RLE = !!resp;
1651
1652         /* WLE */
1653         err = response_get_column(&dev->parsed, &tok_n, OPAL_WRITELOCKENABLED,
1654                                   &resp);
1655         if (err)
1656                 return err;
1657
1658         lrst->WLE = !!resp;
1659
1660         /* read locked */
1661         err = response_get_column(&dev->parsed, &tok_n, OPAL_READLOCKED, &resp);
1662         if (err)
1663                 return err;
1664
1665         rlocked = !!resp;
1666
1667         /* write locked */
1668         err = response_get_column(&dev->parsed, &tok_n, OPAL_WRITELOCKED, &resp);
1669         if (err)
1670                 return err;
1671
1672         wlocked = !!resp;
1673
1674         /* opal_lock_state can not map 'read locked' only state. */
1675         lrst->l_state = OPAL_RW;
1676         if (rlocked && wlocked)
1677                 lrst->l_state = OPAL_LK;
1678         else if (wlocked)
1679                 lrst->l_state = OPAL_RO;
1680         else if (rlocked) {
1681                 pr_debug("Can not report read locked only state.\n");
1682                 return -EINVAL;
1683         }
1684
1685         return 0;
1686 }
1687
1688 static int start_generic_opal_session(struct opal_dev *dev,
1689                                       enum opal_uid auth,
1690                                       enum opal_uid sp_type,
1691                                       const char *key,
1692                                       u8 key_len)
1693 {
1694         u32 hsn;
1695         int err;
1696
1697         if (key == NULL && auth != OPAL_ANYBODY_UID)
1698                 return OPAL_INVAL_PARAM;
1699
1700         hsn = GENERIC_HOST_SESSION_NUM;
1701         err = cmd_start(dev, opaluid[OPAL_SMUID_UID],
1702                         opalmethod[OPAL_STARTSESSION]);
1703
1704         add_token_u64(&err, dev, hsn);
1705         add_token_bytestring(&err, dev, opaluid[sp_type], OPAL_UID_LENGTH);
1706         add_token_u8(&err, dev, 1);
1707
1708         switch (auth) {
1709         case OPAL_ANYBODY_UID:
1710                 break;
1711         case OPAL_ADMIN1_UID:
1712         case OPAL_SID_UID:
1713         case OPAL_PSID_UID:
1714                 add_token_u8(&err, dev, OPAL_STARTNAME);
1715                 add_token_u8(&err, dev, 0); /* HostChallenge */
1716                 add_token_bytestring(&err, dev, key, key_len);
1717                 add_token_u8(&err, dev, OPAL_ENDNAME);
1718                 add_token_u8(&err, dev, OPAL_STARTNAME);
1719                 add_token_u8(&err, dev, 3); /* HostSignAuth */
1720                 add_token_bytestring(&err, dev, opaluid[auth],
1721                                      OPAL_UID_LENGTH);
1722                 add_token_u8(&err, dev, OPAL_ENDNAME);
1723                 break;
1724         default:
1725                 pr_debug("Cannot start Admin SP session with auth %d\n", auth);
1726                 return OPAL_INVAL_PARAM;
1727         }
1728
1729         if (err) {
1730                 pr_debug("Error building start adminsp session command.\n");
1731                 return err;
1732         }
1733
1734         return finalize_and_send(dev, start_opal_session_cont);
1735 }
1736
1737 static int start_anybodyASP_opal_session(struct opal_dev *dev, void *data)
1738 {
1739         return start_generic_opal_session(dev, OPAL_ANYBODY_UID,
1740                                           OPAL_ADMINSP_UID, NULL, 0);
1741 }
1742
1743 static int start_SIDASP_opal_session(struct opal_dev *dev, void *data)
1744 {
1745         int ret;
1746         const u8 *key = dev->prev_data;
1747
1748         if (!key) {
1749                 const struct opal_key *okey = data;
1750
1751                 ret = start_generic_opal_session(dev, OPAL_SID_UID,
1752                                                  OPAL_ADMINSP_UID,
1753                                                  okey->key,
1754                                                  okey->key_len);
1755         } else {
1756                 ret = start_generic_opal_session(dev, OPAL_SID_UID,
1757                                                  OPAL_ADMINSP_UID,
1758                                                  key, dev->prev_d_len);
1759                 kfree(key);
1760                 dev->prev_data = NULL;
1761         }
1762
1763         return ret;
1764 }
1765
1766 static int start_admin1LSP_opal_session(struct opal_dev *dev, void *data)
1767 {
1768         struct opal_key *key = data;
1769
1770         return start_generic_opal_session(dev, OPAL_ADMIN1_UID,
1771                                           OPAL_LOCKINGSP_UID,
1772                                           key->key, key->key_len);
1773 }
1774
1775 static int start_PSID_opal_session(struct opal_dev *dev, void *data)
1776 {
1777         const struct opal_key *okey = data;
1778
1779         return start_generic_opal_session(dev, OPAL_PSID_UID,
1780                                           OPAL_ADMINSP_UID,
1781                                           okey->key,
1782                                           okey->key_len);
1783 }
1784
1785 static int start_auth_opal_session(struct opal_dev *dev, void *data)
1786 {
1787         struct opal_session_info *session = data;
1788         u8 lk_ul_user[OPAL_UID_LENGTH];
1789         size_t keylen = session->opal_key.key_len;
1790         int err = 0;
1791
1792         u8 *key = session->opal_key.key;
1793         u32 hsn = GENERIC_HOST_SESSION_NUM;
1794
1795         if (session->sum)
1796                 err = build_locking_user(lk_ul_user, sizeof(lk_ul_user),
1797                                          session->opal_key.lr);
1798         else if (session->who != OPAL_ADMIN1 && !session->sum)
1799                 err = build_locking_user(lk_ul_user, sizeof(lk_ul_user),
1800                                          session->who - 1);
1801         else
1802                 memcpy(lk_ul_user, opaluid[OPAL_ADMIN1_UID], OPAL_UID_LENGTH);
1803
1804         if (err)
1805                 return err;
1806
1807         err = cmd_start(dev, opaluid[OPAL_SMUID_UID],
1808                         opalmethod[OPAL_STARTSESSION]);
1809
1810         add_token_u64(&err, dev, hsn);
1811         add_token_bytestring(&err, dev, opaluid[OPAL_LOCKINGSP_UID],
1812                              OPAL_UID_LENGTH);
1813         add_token_u8(&err, dev, 1);
1814         add_token_u8(&err, dev, OPAL_STARTNAME);
1815         add_token_u8(&err, dev, 0);
1816         add_token_bytestring(&err, dev, key, keylen);
1817         add_token_u8(&err, dev, OPAL_ENDNAME);
1818         add_token_u8(&err, dev, OPAL_STARTNAME);
1819         add_token_u8(&err, dev, 3);
1820         add_token_bytestring(&err, dev, lk_ul_user, OPAL_UID_LENGTH);
1821         add_token_u8(&err, dev, OPAL_ENDNAME);
1822
1823         if (err) {
1824                 pr_debug("Error building STARTSESSION command.\n");
1825                 return err;
1826         }
1827
1828         return finalize_and_send(dev, start_opal_session_cont);
1829 }
1830
1831 static int revert_tper(struct opal_dev *dev, void *data)
1832 {
1833         int err;
1834
1835         err = cmd_start(dev, opaluid[OPAL_ADMINSP_UID],
1836                         opalmethod[OPAL_REVERT]);
1837         if (err) {
1838                 pr_debug("Error building REVERT TPER command.\n");
1839                 return err;
1840         }
1841
1842         return finalize_and_send(dev, parse_and_check_status);
1843 }
1844
1845 static int internal_activate_user(struct opal_dev *dev, void *data)
1846 {
1847         struct opal_session_info *session = data;
1848         u8 uid[OPAL_UID_LENGTH];
1849         int err;
1850
1851         memcpy(uid, opaluid[OPAL_USER1_UID], OPAL_UID_LENGTH);
1852         uid[7] = session->who;
1853
1854         err = cmd_start(dev, uid, opalmethod[OPAL_SET]);
1855         add_token_u8(&err, dev, OPAL_STARTNAME);
1856         add_token_u8(&err, dev, OPAL_VALUES);
1857         add_token_u8(&err, dev, OPAL_STARTLIST);
1858         add_token_u8(&err, dev, OPAL_STARTNAME);
1859         add_token_u8(&err, dev, 5); /* Enabled */
1860         add_token_u8(&err, dev, OPAL_TRUE);
1861         add_token_u8(&err, dev, OPAL_ENDNAME);
1862         add_token_u8(&err, dev, OPAL_ENDLIST);
1863         add_token_u8(&err, dev, OPAL_ENDNAME);
1864
1865         if (err) {
1866                 pr_debug("Error building Activate UserN command.\n");
1867                 return err;
1868         }
1869
1870         return finalize_and_send(dev, parse_and_check_status);
1871 }
1872
1873 static int revert_lsp(struct opal_dev *dev, void *data)
1874 {
1875         struct opal_revert_lsp *rev = data;
1876         int err;
1877
1878         err = cmd_start(dev, opaluid[OPAL_THISSP_UID],
1879                         opalmethod[OPAL_REVERTSP]);
1880         add_token_u8(&err, dev, OPAL_STARTNAME);
1881         add_token_u64(&err, dev, OPAL_KEEP_GLOBAL_RANGE_KEY);
1882         add_token_u8(&err, dev, (rev->options & OPAL_PRESERVE) ?
1883                         OPAL_TRUE : OPAL_FALSE);
1884         add_token_u8(&err, dev, OPAL_ENDNAME);
1885         if (err) {
1886                 pr_debug("Error building REVERT SP command.\n");
1887                 return err;
1888         }
1889
1890         return finalize_and_send(dev, parse_and_check_status);
1891 }
1892
1893 static int erase_locking_range(struct opal_dev *dev, void *data)
1894 {
1895         struct opal_session_info *session = data;
1896         u8 uid[OPAL_UID_LENGTH];
1897         int err;
1898
1899         if (build_locking_range(uid, sizeof(uid), session->opal_key.lr) < 0)
1900                 return -ERANGE;
1901
1902         err = cmd_start(dev, uid, opalmethod[OPAL_ERASE]);
1903
1904         if (err) {
1905                 pr_debug("Error building Erase Locking Range Command.\n");
1906                 return err;
1907         }
1908
1909         return finalize_and_send(dev, parse_and_check_status);
1910 }
1911
1912 static int set_mbr_done(struct opal_dev *dev, void *data)
1913 {
1914         u8 *mbr_done_tf = data;
1915         int err;
1916
1917         err = cmd_start(dev, opaluid[OPAL_MBRCONTROL],
1918                         opalmethod[OPAL_SET]);
1919
1920         add_token_u8(&err, dev, OPAL_STARTNAME);
1921         add_token_u8(&err, dev, OPAL_VALUES);
1922         add_token_u8(&err, dev, OPAL_STARTLIST);
1923         add_token_u8(&err, dev, OPAL_STARTNAME);
1924         add_token_u8(&err, dev, OPAL_MBRDONE);
1925         add_token_u8(&err, dev, *mbr_done_tf); /* Done T or F */
1926         add_token_u8(&err, dev, OPAL_ENDNAME);
1927         add_token_u8(&err, dev, OPAL_ENDLIST);
1928         add_token_u8(&err, dev, OPAL_ENDNAME);
1929
1930         if (err) {
1931                 pr_debug("Error Building set MBR Done command\n");
1932                 return err;
1933         }
1934
1935         return finalize_and_send(dev, parse_and_check_status);
1936 }
1937
1938 static int set_mbr_enable_disable(struct opal_dev *dev, void *data)
1939 {
1940         u8 *mbr_en_dis = data;
1941         int err;
1942
1943         err = cmd_start(dev, opaluid[OPAL_MBRCONTROL],
1944                         opalmethod[OPAL_SET]);
1945
1946         add_token_u8(&err, dev, OPAL_STARTNAME);
1947         add_token_u8(&err, dev, OPAL_VALUES);
1948         add_token_u8(&err, dev, OPAL_STARTLIST);
1949         add_token_u8(&err, dev, OPAL_STARTNAME);
1950         add_token_u8(&err, dev, OPAL_MBRENABLE);
1951         add_token_u8(&err, dev, *mbr_en_dis);
1952         add_token_u8(&err, dev, OPAL_ENDNAME);
1953         add_token_u8(&err, dev, OPAL_ENDLIST);
1954         add_token_u8(&err, dev, OPAL_ENDNAME);
1955
1956         if (err) {
1957                 pr_debug("Error Building set MBR done command\n");
1958                 return err;
1959         }
1960
1961         return finalize_and_send(dev, parse_and_check_status);
1962 }
1963
1964 static int write_shadow_mbr(struct opal_dev *dev, void *data)
1965 {
1966         struct opal_shadow_mbr *shadow = data;
1967
1968         return generic_table_write_data(dev, shadow->data, shadow->offset,
1969                                         shadow->size, opaluid[OPAL_MBR]);
1970 }
1971
1972 static int generic_pw_cmd(u8 *key, size_t key_len, u8 *cpin_uid,
1973                           struct opal_dev *dev)
1974 {
1975         int err;
1976
1977         err = cmd_start(dev, cpin_uid, opalmethod[OPAL_SET]);
1978
1979         add_token_u8(&err, dev, OPAL_STARTNAME);
1980         add_token_u8(&err, dev, OPAL_VALUES);
1981         add_token_u8(&err, dev, OPAL_STARTLIST);
1982         add_token_u8(&err, dev, OPAL_STARTNAME);
1983         add_token_u8(&err, dev, OPAL_PIN);
1984         add_token_bytestring(&err, dev, key, key_len);
1985         add_token_u8(&err, dev, OPAL_ENDNAME);
1986         add_token_u8(&err, dev, OPAL_ENDLIST);
1987         add_token_u8(&err, dev, OPAL_ENDNAME);
1988
1989         return err;
1990 }
1991
1992 static int set_new_pw(struct opal_dev *dev, void *data)
1993 {
1994         u8 cpin_uid[OPAL_UID_LENGTH];
1995         struct opal_session_info *usr = data;
1996
1997         memcpy(cpin_uid, opaluid[OPAL_C_PIN_ADMIN1], OPAL_UID_LENGTH);
1998
1999         if (usr->who != OPAL_ADMIN1) {
2000                 cpin_uid[5] = 0x03;
2001                 if (usr->sum)
2002                         cpin_uid[7] = usr->opal_key.lr + 1;
2003                 else
2004                         cpin_uid[7] = usr->who;
2005         }
2006
2007         if (generic_pw_cmd(usr->opal_key.key, usr->opal_key.key_len,
2008                            cpin_uid, dev)) {
2009                 pr_debug("Error building set password command.\n");
2010                 return -ERANGE;
2011         }
2012
2013         return finalize_and_send(dev, parse_and_check_status);
2014 }
2015
2016 static int set_sid_cpin_pin(struct opal_dev *dev, void *data)
2017 {
2018         u8 cpin_uid[OPAL_UID_LENGTH];
2019         struct opal_key *key = data;
2020
2021         memcpy(cpin_uid, opaluid[OPAL_C_PIN_SID], OPAL_UID_LENGTH);
2022
2023         if (generic_pw_cmd(key->key, key->key_len, cpin_uid, dev)) {
2024                 pr_debug("Error building Set SID cpin\n");
2025                 return -ERANGE;
2026         }
2027         return finalize_and_send(dev, parse_and_check_status);
2028 }
2029
2030 static void add_authority_object_ref(int *err,
2031                                      struct opal_dev *dev,
2032                                      const u8 *uid,
2033                                      size_t uid_len)
2034 {
2035         add_token_u8(err, dev, OPAL_STARTNAME);
2036         add_token_bytestring(err, dev,
2037                              opaluid[OPAL_HALF_UID_AUTHORITY_OBJ_REF],
2038                              OPAL_UID_LENGTH/2);
2039         add_token_bytestring(err, dev, uid, uid_len);
2040         add_token_u8(err, dev, OPAL_ENDNAME);
2041 }
2042
2043 static void add_boolean_object_ref(int *err,
2044                                    struct opal_dev *dev,
2045                                    u8 boolean_op)
2046 {
2047         add_token_u8(err, dev, OPAL_STARTNAME);
2048         add_token_bytestring(err, dev, opaluid[OPAL_HALF_UID_BOOLEAN_ACE],
2049                              OPAL_UID_LENGTH/2);
2050         add_token_u8(err, dev, boolean_op);
2051         add_token_u8(err, dev, OPAL_ENDNAME);
2052 }
2053
2054 static int set_lr_boolean_ace(struct opal_dev *dev,
2055                               unsigned int opal_uid,
2056                               u8 lr,
2057                               const u8 *users,
2058                               size_t users_len)
2059 {
2060         u8 lr_buffer[OPAL_UID_LENGTH];
2061         u8 user_uid[OPAL_UID_LENGTH];
2062         u8 u;
2063         int err;
2064
2065         memcpy(lr_buffer, opaluid[opal_uid], OPAL_UID_LENGTH);
2066         lr_buffer[7] = lr;
2067
2068         err = cmd_start(dev, lr_buffer, opalmethod[OPAL_SET]);
2069
2070         add_token_u8(&err, dev, OPAL_STARTNAME);
2071         add_token_u8(&err, dev, OPAL_VALUES);
2072
2073         add_token_u8(&err, dev, OPAL_STARTLIST);
2074         add_token_u8(&err, dev, OPAL_STARTNAME);
2075         add_token_u8(&err, dev, 3);
2076
2077         add_token_u8(&err, dev, OPAL_STARTLIST);
2078
2079         for (u = 0; u < users_len; u++) {
2080                 if (users[u] == OPAL_ADMIN1)
2081                         memcpy(user_uid, opaluid[OPAL_ADMIN1_UID],
2082                                OPAL_UID_LENGTH);
2083                 else {
2084                         memcpy(user_uid, opaluid[OPAL_USER1_UID],
2085                                OPAL_UID_LENGTH);
2086                         user_uid[7] = users[u];
2087                 }
2088
2089                 add_authority_object_ref(&err, dev, user_uid, sizeof(user_uid));
2090
2091                 /*
2092                  * Add boolean operator in postfix only with
2093                  * two or more authorities being added in ACE
2094                  * expresion.
2095                  * */
2096                 if (u > 0)
2097                         add_boolean_object_ref(&err, dev, OPAL_BOOLEAN_OR);
2098         }
2099
2100         add_token_u8(&err, dev, OPAL_ENDLIST);
2101         add_token_u8(&err, dev, OPAL_ENDNAME);
2102         add_token_u8(&err, dev, OPAL_ENDLIST);
2103         add_token_u8(&err, dev, OPAL_ENDNAME);
2104
2105         return err;
2106 }
2107
2108 static int add_user_to_lr(struct opal_dev *dev, void *data)
2109 {
2110         int err;
2111         struct opal_lock_unlock *lkul = data;
2112         const u8 users[] = {
2113                 lkul->session.who
2114         };
2115
2116         err = set_lr_boolean_ace(dev,
2117                                  lkul->l_state == OPAL_RW ?
2118                                         OPAL_LOCKINGRANGE_ACE_WRLOCKED :
2119                                         OPAL_LOCKINGRANGE_ACE_RDLOCKED,
2120                                  lkul->session.opal_key.lr, users,
2121                                  ARRAY_SIZE(users));
2122         if (err) {
2123                 pr_debug("Error building add user to locking range command.\n");
2124                 return err;
2125         }
2126
2127         return finalize_and_send(dev, parse_and_check_status);
2128 }
2129
2130 static int add_user_to_lr_ace(struct opal_dev *dev, void *data)
2131 {
2132         int err;
2133         struct opal_lock_unlock *lkul = data;
2134         const u8 users[] = {
2135                 OPAL_ADMIN1,
2136                 lkul->session.who
2137         };
2138
2139         err = set_lr_boolean_ace(dev, OPAL_LOCKINGRANGE_ACE_START_TO_KEY,
2140                                  lkul->session.opal_key.lr, users,
2141                                  ARRAY_SIZE(users));
2142
2143         if (err) {
2144                 pr_debug("Error building add user to locking ranges ACEs.\n");
2145                 return err;
2146         }
2147
2148         return finalize_and_send(dev, parse_and_check_status);
2149 }
2150
2151 static int lock_unlock_locking_range(struct opal_dev *dev, void *data)
2152 {
2153         u8 lr_buffer[OPAL_UID_LENGTH];
2154         struct opal_lock_unlock *lkul = data;
2155         u8 read_locked = 1, write_locked = 1;
2156         int err = 0;
2157
2158         if (build_locking_range(lr_buffer, sizeof(lr_buffer),
2159                                 lkul->session.opal_key.lr) < 0)
2160                 return -ERANGE;
2161
2162         switch (lkul->l_state) {
2163         case OPAL_RO:
2164                 read_locked = 0;
2165                 write_locked = 1;
2166                 break;
2167         case OPAL_RW:
2168                 read_locked = 0;
2169                 write_locked = 0;
2170                 break;
2171         case OPAL_LK:
2172                 /* vars are initialized to locked */
2173                 break;
2174         default:
2175                 pr_debug("Tried to set an invalid locking state... returning to uland\n");
2176                 return OPAL_INVAL_PARAM;
2177         }
2178
2179         err = cmd_start(dev, lr_buffer, opalmethod[OPAL_SET]);
2180
2181         add_token_u8(&err, dev, OPAL_STARTNAME);
2182         add_token_u8(&err, dev, OPAL_VALUES);
2183         add_token_u8(&err, dev, OPAL_STARTLIST);
2184
2185         add_token_u8(&err, dev, OPAL_STARTNAME);
2186         add_token_u8(&err, dev, OPAL_READLOCKED);
2187         add_token_u8(&err, dev, read_locked);
2188         add_token_u8(&err, dev, OPAL_ENDNAME);
2189
2190         add_token_u8(&err, dev, OPAL_STARTNAME);
2191         add_token_u8(&err, dev, OPAL_WRITELOCKED);
2192         add_token_u8(&err, dev, write_locked);
2193         add_token_u8(&err, dev, OPAL_ENDNAME);
2194
2195         add_token_u8(&err, dev, OPAL_ENDLIST);
2196         add_token_u8(&err, dev, OPAL_ENDNAME);
2197
2198         if (err) {
2199                 pr_debug("Error building SET command.\n");
2200                 return err;
2201         }
2202
2203         return finalize_and_send(dev, parse_and_check_status);
2204 }
2205
2206
2207 static int lock_unlock_locking_range_sum(struct opal_dev *dev, void *data)
2208 {
2209         u8 lr_buffer[OPAL_UID_LENGTH];
2210         u8 read_locked = 1, write_locked = 1;
2211         struct opal_lock_unlock *lkul = data;
2212         int ret;
2213
2214         clear_opal_cmd(dev);
2215         set_comid(dev, dev->comid);
2216
2217         if (build_locking_range(lr_buffer, sizeof(lr_buffer),
2218                                 lkul->session.opal_key.lr) < 0)
2219                 return -ERANGE;
2220
2221         switch (lkul->l_state) {
2222         case OPAL_RO:
2223                 read_locked = 0;
2224                 write_locked = 1;
2225                 break;
2226         case OPAL_RW:
2227                 read_locked = 0;
2228                 write_locked = 0;
2229                 break;
2230         case OPAL_LK:
2231                 /* vars are initialized to locked */
2232                 break;
2233         default:
2234                 pr_debug("Tried to set an invalid locking state.\n");
2235                 return OPAL_INVAL_PARAM;
2236         }
2237         ret = generic_lr_enable_disable(dev, lr_buffer, 1, 1,
2238                                         read_locked, write_locked);
2239
2240         if (ret < 0) {
2241                 pr_debug("Error building SET command.\n");
2242                 return ret;
2243         }
2244
2245         return finalize_and_send(dev, parse_and_check_status);
2246 }
2247
2248 static int activate_lsp(struct opal_dev *dev, void *data)
2249 {
2250         struct opal_lr_act *opal_act = data;
2251         u8 user_lr[OPAL_UID_LENGTH];
2252         int err, i;
2253
2254         err = cmd_start(dev, opaluid[OPAL_LOCKINGSP_UID],
2255                         opalmethod[OPAL_ACTIVATE]);
2256
2257         if (opal_act->sum) {
2258                 err = build_locking_range(user_lr, sizeof(user_lr),
2259                                           opal_act->lr[0]);
2260                 if (err)
2261                         return err;
2262
2263                 add_token_u8(&err, dev, OPAL_STARTNAME);
2264                 add_token_u64(&err, dev, OPAL_SUM_SET_LIST);
2265
2266                 add_token_u8(&err, dev, OPAL_STARTLIST);
2267                 add_token_bytestring(&err, dev, user_lr, OPAL_UID_LENGTH);
2268                 for (i = 1; i < opal_act->num_lrs; i++) {
2269                         user_lr[7] = opal_act->lr[i];
2270                         add_token_bytestring(&err, dev, user_lr, OPAL_UID_LENGTH);
2271                 }
2272                 add_token_u8(&err, dev, OPAL_ENDLIST);
2273                 add_token_u8(&err, dev, OPAL_ENDNAME);
2274         }
2275
2276         if (err) {
2277                 pr_debug("Error building Activate LockingSP command.\n");
2278                 return err;
2279         }
2280
2281         return finalize_and_send(dev, parse_and_check_status);
2282 }
2283
2284 /* Determine if we're in the Manufactured Inactive or Active state */
2285 static int get_lsp_lifecycle(struct opal_dev *dev, void *data)
2286 {
2287         u8 lc_status;
2288         int err;
2289
2290         err = generic_get_column(dev, opaluid[OPAL_LOCKINGSP_UID],
2291                                  OPAL_LIFECYCLE);
2292         if (err)
2293                 return err;
2294
2295         lc_status = response_get_u64(&dev->parsed, 4);
2296         /* 0x08 is Manufactured Inactive */
2297         /* 0x09 is Manufactured */
2298         if (lc_status != OPAL_MANUFACTURED_INACTIVE) {
2299                 pr_debug("Couldn't determine the status of the Lifecycle state\n");
2300                 return -ENODEV;
2301         }
2302
2303         return 0;
2304 }
2305
2306 static int get_msid_cpin_pin(struct opal_dev *dev, void *data)
2307 {
2308         const char *msid_pin;
2309         size_t strlen;
2310         int err;
2311
2312         err = generic_get_column(dev, opaluid[OPAL_C_PIN_MSID], OPAL_PIN);
2313         if (err)
2314                 return err;
2315
2316         strlen = response_get_string(&dev->parsed, 4, &msid_pin);
2317         if (!msid_pin) {
2318                 pr_debug("Couldn't extract MSID_CPIN from response\n");
2319                 return OPAL_INVAL_PARAM;
2320         }
2321
2322         dev->prev_data = kmemdup(msid_pin, strlen, GFP_KERNEL);
2323         if (!dev->prev_data)
2324                 return -ENOMEM;
2325
2326         dev->prev_d_len = strlen;
2327
2328         return 0;
2329 }
2330
2331 static int write_table_data(struct opal_dev *dev, void *data)
2332 {
2333         struct opal_read_write_table *write_tbl = data;
2334
2335         return generic_table_write_data(dev, write_tbl->data, write_tbl->offset,
2336                                         write_tbl->size, write_tbl->table_uid);
2337 }
2338
2339 static int read_table_data_cont(struct opal_dev *dev)
2340 {
2341         int err;
2342         const char *data_read;
2343
2344         err = parse_and_check_status(dev);
2345         if (err)
2346                 return err;
2347
2348         dev->prev_d_len = response_get_string(&dev->parsed, 1, &data_read);
2349         dev->prev_data = (void *)data_read;
2350         if (!dev->prev_data) {
2351                 pr_debug("%s: Couldn't read data from the table.\n", __func__);
2352                 return OPAL_INVAL_PARAM;
2353         }
2354
2355         return 0;
2356 }
2357
2358 /*
2359  * IO_BUFFER_LENGTH = 2048
2360  * sizeof(header) = 56
2361  * No. of Token Bytes in the Response = 11
2362  * MAX size of data that can be carried in response buffer
2363  * at a time is : 2048 - (56 + 11) = 1981 = 0x7BD.
2364  */
2365 #define OPAL_MAX_READ_TABLE (0x7BD)
2366
2367 static int read_table_data(struct opal_dev *dev, void *data)
2368 {
2369         struct opal_read_write_table *read_tbl = data;
2370         int err;
2371         size_t off = 0, max_read_size = OPAL_MAX_READ_TABLE;
2372         u64 table_len, len;
2373         u64 offset = read_tbl->offset, read_size = read_tbl->size - 1;
2374         u8 __user *dst;
2375
2376         err = generic_get_table_info(dev, read_tbl->table_uid, OPAL_TABLE_ROWS);
2377         if (err) {
2378                 pr_debug("Couldn't get the table size\n");
2379                 return err;
2380         }
2381
2382         table_len = response_get_u64(&dev->parsed, 4);
2383
2384         /* Check if the user is trying to read from the table limits */
2385         if (read_size > table_len || offset > table_len - read_size) {
2386                 pr_debug("Read size exceeds the Table size limits (%llu vs. %llu)\n",
2387                           offset + read_size, table_len);
2388                 return -EINVAL;
2389         }
2390
2391         while (off < read_size) {
2392                 err = cmd_start(dev, read_tbl->table_uid, opalmethod[OPAL_GET]);
2393
2394                 add_token_u8(&err, dev, OPAL_STARTLIST);
2395                 add_token_u8(&err, dev, OPAL_STARTNAME);
2396                 add_token_u8(&err, dev, OPAL_STARTROW);
2397                 add_token_u64(&err, dev, offset + off); /* start row value */
2398                 add_token_u8(&err, dev, OPAL_ENDNAME);
2399
2400                 add_token_u8(&err, dev, OPAL_STARTNAME);
2401                 add_token_u8(&err, dev, OPAL_ENDROW);
2402
2403                 len = min(max_read_size, (size_t)(read_size - off));
2404                 add_token_u64(&err, dev, offset + off + len); /* end row value
2405                                                                */
2406                 add_token_u8(&err, dev, OPAL_ENDNAME);
2407                 add_token_u8(&err, dev, OPAL_ENDLIST);
2408
2409                 if (err) {
2410                         pr_debug("Error building read table data command.\n");
2411                         break;
2412                 }
2413
2414                 err = finalize_and_send(dev, read_table_data_cont);
2415                 if (err)
2416                         break;
2417
2418                 /* len+1: This includes the NULL terminator at the end*/
2419                 if (dev->prev_d_len > len + 1) {
2420                         err = -EOVERFLOW;
2421                         break;
2422                 }
2423
2424                 dst = (u8 __user *)(uintptr_t)read_tbl->data;
2425                 if (copy_to_user(dst + off, dev->prev_data, dev->prev_d_len)) {
2426                         pr_debug("Error copying data to userspace\n");
2427                         err = -EFAULT;
2428                         break;
2429                 }
2430                 dev->prev_data = NULL;
2431
2432                 off += len;
2433         }
2434
2435         return err;
2436 }
2437
2438 static int end_opal_session(struct opal_dev *dev, void *data)
2439 {
2440         int err = 0;
2441
2442         clear_opal_cmd(dev);
2443         set_comid(dev, dev->comid);
2444         add_token_u8(&err, dev, OPAL_ENDOFSESSION);
2445
2446         if (err < 0)
2447                 return err;
2448
2449         return finalize_and_send(dev, end_session_cont);
2450 }
2451
2452 static int end_opal_session_error(struct opal_dev *dev)
2453 {
2454         const struct opal_step error_end_session = {
2455                 end_opal_session,
2456         };
2457
2458         return execute_step(dev, &error_end_session, 0);
2459 }
2460
2461 static inline void setup_opal_dev(struct opal_dev *dev)
2462 {
2463         dev->tsn = 0;
2464         dev->hsn = 0;
2465         dev->prev_data = NULL;
2466 }
2467
2468 static int check_opal_support(struct opal_dev *dev)
2469 {
2470         int ret;
2471
2472         mutex_lock(&dev->dev_lock);
2473         setup_opal_dev(dev);
2474         ret = opal_discovery0_step(dev);
2475         if (!ret)
2476                 dev->flags |= OPAL_FL_SUPPORTED;
2477         mutex_unlock(&dev->dev_lock);
2478
2479         return ret;
2480 }
2481
2482 static void clean_opal_dev(struct opal_dev *dev)
2483 {
2484
2485         struct opal_suspend_data *suspend, *next;
2486
2487         mutex_lock(&dev->dev_lock);
2488         list_for_each_entry_safe(suspend, next, &dev->unlk_lst, node) {
2489                 list_del(&suspend->node);
2490                 kfree(suspend);
2491         }
2492         mutex_unlock(&dev->dev_lock);
2493 }
2494
2495 void free_opal_dev(struct opal_dev *dev)
2496 {
2497         if (!dev)
2498                 return;
2499
2500         clean_opal_dev(dev);
2501         kfree(dev->resp);
2502         kfree(dev->cmd);
2503         kfree(dev);
2504 }
2505 EXPORT_SYMBOL(free_opal_dev);
2506
2507 struct opal_dev *init_opal_dev(void *data, sec_send_recv *send_recv)
2508 {
2509         struct opal_dev *dev;
2510
2511         dev = kmalloc(sizeof(*dev), GFP_KERNEL);
2512         if (!dev)
2513                 return NULL;
2514
2515         /*
2516          * Presumably DMA-able buffers must be cache-aligned. Kmalloc makes
2517          * sure the allocated buffer is DMA-safe in that regard.
2518          */
2519         dev->cmd = kmalloc(IO_BUFFER_LENGTH, GFP_KERNEL);
2520         if (!dev->cmd)
2521                 goto err_free_dev;
2522
2523         dev->resp = kmalloc(IO_BUFFER_LENGTH, GFP_KERNEL);
2524         if (!dev->resp)
2525                 goto err_free_cmd;
2526
2527         INIT_LIST_HEAD(&dev->unlk_lst);
2528         mutex_init(&dev->dev_lock);
2529         dev->flags = 0;
2530         dev->data = data;
2531         dev->send_recv = send_recv;
2532         if (check_opal_support(dev) != 0) {
2533                 pr_debug("Opal is not supported on this device\n");
2534                 goto err_free_resp;
2535         }
2536
2537         return dev;
2538
2539 err_free_resp:
2540         kfree(dev->resp);
2541
2542 err_free_cmd:
2543         kfree(dev->cmd);
2544
2545 err_free_dev:
2546         kfree(dev);
2547
2548         return NULL;
2549 }
2550 EXPORT_SYMBOL(init_opal_dev);
2551
2552 static int opal_secure_erase_locking_range(struct opal_dev *dev,
2553                                            struct opal_session_info *opal_session)
2554 {
2555         const struct opal_step erase_steps[] = {
2556                 { start_auth_opal_session, opal_session },
2557                 { get_active_key, &opal_session->opal_key.lr },
2558                 { gen_key, },
2559                 { end_opal_session, }
2560         };
2561         int ret;
2562
2563         ret = opal_get_key(dev, &opal_session->opal_key);
2564         if (ret)
2565                 return ret;
2566         mutex_lock(&dev->dev_lock);
2567         setup_opal_dev(dev);
2568         ret = execute_steps(dev, erase_steps, ARRAY_SIZE(erase_steps));
2569         mutex_unlock(&dev->dev_lock);
2570
2571         return ret;
2572 }
2573
2574 static int opal_get_discv(struct opal_dev *dev, struct opal_discovery *discv)
2575 {
2576         const struct opal_step discovery0_step = {
2577                 opal_discovery0, discv
2578         };
2579         int ret = 0;
2580
2581         mutex_lock(&dev->dev_lock);
2582         setup_opal_dev(dev);
2583         ret = execute_step(dev, &discovery0_step, 0);
2584         mutex_unlock(&dev->dev_lock);
2585         if (ret)
2586                 return ret;
2587         return discv->size; /* modified to actual length of data */
2588 }
2589
2590 static int opal_revertlsp(struct opal_dev *dev, struct opal_revert_lsp *rev)
2591 {
2592         /* controller will terminate session */
2593         const struct opal_step steps[] = {
2594                 { start_admin1LSP_opal_session, &rev->key },
2595                 { revert_lsp, rev }
2596         };
2597         int ret;
2598
2599         ret = opal_get_key(dev, &rev->key);
2600         if (ret)
2601                 return ret;
2602         mutex_lock(&dev->dev_lock);
2603         setup_opal_dev(dev);
2604         ret = execute_steps(dev, steps, ARRAY_SIZE(steps));
2605         mutex_unlock(&dev->dev_lock);
2606
2607         return ret;
2608 }
2609
2610 static int opal_erase_locking_range(struct opal_dev *dev,
2611                                     struct opal_session_info *opal_session)
2612 {
2613         const struct opal_step erase_steps[] = {
2614                 { start_auth_opal_session, opal_session },
2615                 { erase_locking_range, opal_session },
2616                 { end_opal_session, }
2617         };
2618         int ret;
2619
2620         ret = opal_get_key(dev, &opal_session->opal_key);
2621         if (ret)
2622                 return ret;
2623         mutex_lock(&dev->dev_lock);
2624         setup_opal_dev(dev);
2625         ret = execute_steps(dev, erase_steps, ARRAY_SIZE(erase_steps));
2626         mutex_unlock(&dev->dev_lock);
2627
2628         return ret;
2629 }
2630
2631 static int opal_enable_disable_shadow_mbr(struct opal_dev *dev,
2632                                           struct opal_mbr_data *opal_mbr)
2633 {
2634         u8 enable_disable = opal_mbr->enable_disable == OPAL_MBR_ENABLE ?
2635                 OPAL_TRUE : OPAL_FALSE;
2636
2637         const struct opal_step mbr_steps[] = {
2638                 { start_admin1LSP_opal_session, &opal_mbr->key },
2639                 { set_mbr_done, &enable_disable },
2640                 { end_opal_session, },
2641                 { start_admin1LSP_opal_session, &opal_mbr->key },
2642                 { set_mbr_enable_disable, &enable_disable },
2643                 { end_opal_session, }
2644         };
2645         int ret;
2646
2647         if (opal_mbr->enable_disable != OPAL_MBR_ENABLE &&
2648             opal_mbr->enable_disable != OPAL_MBR_DISABLE)
2649                 return -EINVAL;
2650
2651         ret = opal_get_key(dev, &opal_mbr->key);
2652         if (ret)
2653                 return ret;
2654         mutex_lock(&dev->dev_lock);
2655         setup_opal_dev(dev);
2656         ret = execute_steps(dev, mbr_steps, ARRAY_SIZE(mbr_steps));
2657         mutex_unlock(&dev->dev_lock);
2658
2659         return ret;
2660 }
2661
2662 static int opal_set_mbr_done(struct opal_dev *dev,
2663                              struct opal_mbr_done *mbr_done)
2664 {
2665         u8 mbr_done_tf = mbr_done->done_flag == OPAL_MBR_DONE ?
2666                 OPAL_TRUE : OPAL_FALSE;
2667
2668         const struct opal_step mbr_steps[] = {
2669                 { start_admin1LSP_opal_session, &mbr_done->key },
2670                 { set_mbr_done, &mbr_done_tf },
2671                 { end_opal_session, }
2672         };
2673         int ret;
2674
2675         if (mbr_done->done_flag != OPAL_MBR_DONE &&
2676             mbr_done->done_flag != OPAL_MBR_NOT_DONE)
2677                 return -EINVAL;
2678
2679         ret = opal_get_key(dev, &mbr_done->key);
2680         if (ret)
2681                 return ret;
2682         mutex_lock(&dev->dev_lock);
2683         setup_opal_dev(dev);
2684         ret = execute_steps(dev, mbr_steps, ARRAY_SIZE(mbr_steps));
2685         mutex_unlock(&dev->dev_lock);
2686
2687         return ret;
2688 }
2689
2690 static int opal_write_shadow_mbr(struct opal_dev *dev,
2691                                  struct opal_shadow_mbr *info)
2692 {
2693         const struct opal_step mbr_steps[] = {
2694                 { start_admin1LSP_opal_session, &info->key },
2695                 { write_shadow_mbr, info },
2696                 { end_opal_session, }
2697         };
2698         int ret;
2699
2700         if (info->size == 0)
2701                 return 0;
2702
2703         ret = opal_get_key(dev, &info->key);
2704         if (ret)
2705                 return ret;
2706         mutex_lock(&dev->dev_lock);
2707         setup_opal_dev(dev);
2708         ret = execute_steps(dev, mbr_steps, ARRAY_SIZE(mbr_steps));
2709         mutex_unlock(&dev->dev_lock);
2710
2711         return ret;
2712 }
2713
2714 static int opal_save(struct opal_dev *dev, struct opal_lock_unlock *lk_unlk)
2715 {
2716         struct opal_suspend_data *suspend;
2717
2718         suspend = kzalloc(sizeof(*suspend), GFP_KERNEL);
2719         if (!suspend)
2720                 return -ENOMEM;
2721
2722         suspend->unlk = *lk_unlk;
2723         suspend->lr = lk_unlk->session.opal_key.lr;
2724
2725         mutex_lock(&dev->dev_lock);
2726         setup_opal_dev(dev);
2727         add_suspend_info(dev, suspend);
2728         mutex_unlock(&dev->dev_lock);
2729
2730         return 0;
2731 }
2732
2733 static int opal_add_user_to_lr(struct opal_dev *dev,
2734                                struct opal_lock_unlock *lk_unlk)
2735 {
2736         const struct opal_step steps[] = {
2737                 { start_admin1LSP_opal_session, &lk_unlk->session.opal_key },
2738                 { add_user_to_lr, lk_unlk },
2739                 { add_user_to_lr_ace, lk_unlk },
2740                 { end_opal_session, }
2741         };
2742         int ret;
2743
2744         if (lk_unlk->l_state != OPAL_RO &&
2745             lk_unlk->l_state != OPAL_RW) {
2746                 pr_debug("Locking state was not RO or RW\n");
2747                 return -EINVAL;
2748         }
2749
2750         if (lk_unlk->session.who < OPAL_USER1 ||
2751             lk_unlk->session.who > OPAL_USER9) {
2752                 pr_debug("Authority was not within the range of users: %d\n",
2753                          lk_unlk->session.who);
2754                 return -EINVAL;
2755         }
2756
2757         if (lk_unlk->session.sum) {
2758                 pr_debug("%s not supported in sum. Use setup locking range\n",
2759                          __func__);
2760                 return -EINVAL;
2761         }
2762
2763         ret = opal_get_key(dev, &lk_unlk->session.opal_key);
2764         if (ret)
2765                 return ret;
2766         mutex_lock(&dev->dev_lock);
2767         setup_opal_dev(dev);
2768         ret = execute_steps(dev, steps, ARRAY_SIZE(steps));
2769         mutex_unlock(&dev->dev_lock);
2770
2771         return ret;
2772 }
2773
2774 static int opal_reverttper(struct opal_dev *dev, struct opal_key *opal, bool psid)
2775 {
2776         /* controller will terminate session */
2777         const struct opal_step revert_steps[] = {
2778                 { start_SIDASP_opal_session, opal },
2779                 { revert_tper, }
2780         };
2781         const struct opal_step psid_revert_steps[] = {
2782                 { start_PSID_opal_session, opal },
2783                 { revert_tper, }
2784         };
2785
2786         int ret;
2787
2788         ret = opal_get_key(dev, opal);
2789
2790         if (ret)
2791                 return ret;
2792         mutex_lock(&dev->dev_lock);
2793         setup_opal_dev(dev);
2794         if (psid)
2795                 ret = execute_steps(dev, psid_revert_steps,
2796                                     ARRAY_SIZE(psid_revert_steps));
2797         else
2798                 ret = execute_steps(dev, revert_steps,
2799                                     ARRAY_SIZE(revert_steps));
2800         mutex_unlock(&dev->dev_lock);
2801
2802         /*
2803          * If we successfully reverted lets clean
2804          * any saved locking ranges.
2805          */
2806         if (!ret)
2807                 clean_opal_dev(dev);
2808
2809         return ret;
2810 }
2811
2812 static int __opal_lock_unlock(struct opal_dev *dev,
2813                               struct opal_lock_unlock *lk_unlk)
2814 {
2815         const struct opal_step unlock_steps[] = {
2816                 { start_auth_opal_session, &lk_unlk->session },
2817                 { lock_unlock_locking_range, lk_unlk },
2818                 { end_opal_session, }
2819         };
2820         const struct opal_step unlock_sum_steps[] = {
2821                 { start_auth_opal_session, &lk_unlk->session },
2822                 { lock_unlock_locking_range_sum, lk_unlk },
2823                 { end_opal_session, }
2824         };
2825
2826         if (lk_unlk->session.sum)
2827                 return execute_steps(dev, unlock_sum_steps,
2828                                      ARRAY_SIZE(unlock_sum_steps));
2829         else
2830                 return execute_steps(dev, unlock_steps,
2831                                      ARRAY_SIZE(unlock_steps));
2832 }
2833
2834 static int __opal_set_mbr_done(struct opal_dev *dev, struct opal_key *key)
2835 {
2836         u8 mbr_done_tf = OPAL_TRUE;
2837         const struct opal_step mbrdone_step[] = {
2838                 { start_admin1LSP_opal_session, key },
2839                 { set_mbr_done, &mbr_done_tf },
2840                 { end_opal_session, }
2841         };
2842
2843         return execute_steps(dev, mbrdone_step, ARRAY_SIZE(mbrdone_step));
2844 }
2845
2846 static void opal_lock_check_for_saved_key(struct opal_dev *dev,
2847                             struct opal_lock_unlock *lk_unlk)
2848 {
2849         struct opal_suspend_data *iter;
2850
2851         if (lk_unlk->l_state != OPAL_LK ||
2852                         lk_unlk->session.opal_key.key_len > 0)
2853                 return;
2854
2855         /*
2856          * Usually when closing a crypto device (eg: dm-crypt with LUKS) the
2857          * volume key is not required, as it requires root privileges anyway,
2858          * and root can deny access to a disk in many ways regardless.
2859          * Requiring the volume key to lock the device is a peculiarity of the
2860          * OPAL specification. Given we might already have saved the key if
2861          * the user requested it via the 'IOC_OPAL_SAVE' ioctl, we can use
2862          * that key to lock the device if no key was provided here, the
2863          * locking range matches and the appropriate flag was passed with
2864          * 'IOC_OPAL_SAVE'.
2865          * This allows integrating OPAL with tools and libraries that are used
2866          * to the common behaviour and do not ask for the volume key when
2867          * closing a device.
2868          */
2869         setup_opal_dev(dev);
2870         list_for_each_entry(iter, &dev->unlk_lst, node) {
2871                 if ((iter->unlk.flags & OPAL_SAVE_FOR_LOCK) &&
2872                                 iter->lr == lk_unlk->session.opal_key.lr &&
2873                                 iter->unlk.session.opal_key.key_len > 0) {
2874                         lk_unlk->session.opal_key.key_len =
2875                                 iter->unlk.session.opal_key.key_len;
2876                         memcpy(lk_unlk->session.opal_key.key,
2877                                 iter->unlk.session.opal_key.key,
2878                                 iter->unlk.session.opal_key.key_len);
2879                         break;
2880                 }
2881         }
2882 }
2883
2884 static int opal_lock_unlock(struct opal_dev *dev,
2885                             struct opal_lock_unlock *lk_unlk)
2886 {
2887         int ret;
2888
2889         if (lk_unlk->session.who > OPAL_USER9)
2890                 return -EINVAL;
2891
2892         mutex_lock(&dev->dev_lock);
2893         opal_lock_check_for_saved_key(dev, lk_unlk);
2894         ret = opal_get_key(dev, &lk_unlk->session.opal_key);
2895         if (!ret)
2896                 ret = __opal_lock_unlock(dev, lk_unlk);
2897         mutex_unlock(&dev->dev_lock);
2898
2899         return ret;
2900 }
2901
2902 static int opal_take_ownership(struct opal_dev *dev, struct opal_key *opal)
2903 {
2904         const struct opal_step owner_steps[] = {
2905                 { start_anybodyASP_opal_session, },
2906                 { get_msid_cpin_pin, },
2907                 { end_opal_session, },
2908                 { start_SIDASP_opal_session, opal },
2909                 { set_sid_cpin_pin, opal },
2910                 { end_opal_session, }
2911         };
2912         int ret;
2913
2914         if (!dev)
2915                 return -ENODEV;
2916
2917         ret = opal_get_key(dev, opal);
2918         if (ret)
2919                 return ret;
2920         mutex_lock(&dev->dev_lock);
2921         setup_opal_dev(dev);
2922         ret = execute_steps(dev, owner_steps, ARRAY_SIZE(owner_steps));
2923         mutex_unlock(&dev->dev_lock);
2924
2925         return ret;
2926 }
2927
2928 static int opal_activate_lsp(struct opal_dev *dev,
2929                              struct opal_lr_act *opal_lr_act)
2930 {
2931         const struct opal_step active_steps[] = {
2932                 { start_SIDASP_opal_session, &opal_lr_act->key },
2933                 { get_lsp_lifecycle, },
2934                 { activate_lsp, opal_lr_act },
2935                 { end_opal_session, }
2936         };
2937         int ret;
2938
2939         if (!opal_lr_act->num_lrs || opal_lr_act->num_lrs > OPAL_MAX_LRS)
2940                 return -EINVAL;
2941
2942         ret = opal_get_key(dev, &opal_lr_act->key);
2943         if (ret)
2944                 return ret;
2945         mutex_lock(&dev->dev_lock);
2946         setup_opal_dev(dev);
2947         ret = execute_steps(dev, active_steps, ARRAY_SIZE(active_steps));
2948         mutex_unlock(&dev->dev_lock);
2949
2950         return ret;
2951 }
2952
2953 static int opal_setup_locking_range(struct opal_dev *dev,
2954                                     struct opal_user_lr_setup *opal_lrs)
2955 {
2956         const struct opal_step lr_steps[] = {
2957                 { start_auth_opal_session, &opal_lrs->session },
2958                 { setup_locking_range, opal_lrs },
2959                 { end_opal_session, }
2960         };
2961         int ret;
2962
2963         ret = opal_get_key(dev, &opal_lrs->session.opal_key);
2964         if (ret)
2965                 return ret;
2966         mutex_lock(&dev->dev_lock);
2967         setup_opal_dev(dev);
2968         ret = execute_steps(dev, lr_steps, ARRAY_SIZE(lr_steps));
2969         mutex_unlock(&dev->dev_lock);
2970
2971         return ret;
2972 }
2973
2974 static int opal_locking_range_status(struct opal_dev *dev,
2975                           struct opal_lr_status *opal_lrst,
2976                           void __user *data)
2977 {
2978         const struct opal_step lr_steps[] = {
2979                 { start_auth_opal_session, &opal_lrst->session },
2980                 { locking_range_status, opal_lrst },
2981                 { end_opal_session, }
2982         };
2983         int ret;
2984
2985         mutex_lock(&dev->dev_lock);
2986         setup_opal_dev(dev);
2987         ret = execute_steps(dev, lr_steps, ARRAY_SIZE(lr_steps));
2988         mutex_unlock(&dev->dev_lock);
2989
2990         /* skip session info when copying back to uspace */
2991         if (!ret && copy_to_user(data + offsetof(struct opal_lr_status, range_start),
2992                                 (void *)opal_lrst + offsetof(struct opal_lr_status, range_start),
2993                                 sizeof(*opal_lrst) - offsetof(struct opal_lr_status, range_start))) {
2994                 pr_debug("Error copying status to userspace\n");
2995                 return -EFAULT;
2996         }
2997
2998         return ret;
2999 }
3000
3001 static int opal_set_new_pw(struct opal_dev *dev, struct opal_new_pw *opal_pw)
3002 {
3003         const struct opal_step pw_steps[] = {
3004                 { start_auth_opal_session, &opal_pw->session },
3005                 { set_new_pw, &opal_pw->new_user_pw },
3006                 { end_opal_session, }
3007         };
3008         int ret;
3009
3010         if (opal_pw->session.who > OPAL_USER9  ||
3011             opal_pw->new_user_pw.who > OPAL_USER9)
3012                 return -EINVAL;
3013
3014         mutex_lock(&dev->dev_lock);
3015         setup_opal_dev(dev);
3016         ret = execute_steps(dev, pw_steps, ARRAY_SIZE(pw_steps));
3017         mutex_unlock(&dev->dev_lock);
3018
3019         if (ret)
3020                 return ret;
3021
3022         /* update keyring and key store with new password */
3023         ret = sed_write_key(OPAL_AUTH_KEY,
3024                             opal_pw->new_user_pw.opal_key.key,
3025                             opal_pw->new_user_pw.opal_key.key_len);
3026         if (ret != -EOPNOTSUPP)
3027                 pr_warn("error updating SED key: %d\n", ret);
3028
3029         ret = update_sed_opal_key(OPAL_AUTH_KEY,
3030                                   opal_pw->new_user_pw.opal_key.key,
3031                                   opal_pw->new_user_pw.opal_key.key_len);
3032
3033         return ret;
3034 }
3035
3036 static int opal_activate_user(struct opal_dev *dev,
3037                               struct opal_session_info *opal_session)
3038 {
3039         const struct opal_step act_steps[] = {
3040                 { start_admin1LSP_opal_session, &opal_session->opal_key },
3041                 { internal_activate_user, opal_session },
3042                 { end_opal_session, }
3043         };
3044         int ret;
3045
3046         /* We can't activate Admin1 it's active as manufactured */
3047         if (opal_session->who < OPAL_USER1 ||
3048             opal_session->who > OPAL_USER9) {
3049                 pr_debug("Who was not a valid user: %d\n", opal_session->who);
3050                 return -EINVAL;
3051         }
3052
3053         ret = opal_get_key(dev, &opal_session->opal_key);
3054         if (ret)
3055                 return ret;
3056         mutex_lock(&dev->dev_lock);
3057         setup_opal_dev(dev);
3058         ret = execute_steps(dev, act_steps, ARRAY_SIZE(act_steps));
3059         mutex_unlock(&dev->dev_lock);
3060
3061         return ret;
3062 }
3063
3064 bool opal_unlock_from_suspend(struct opal_dev *dev)
3065 {
3066         struct opal_suspend_data *suspend;
3067         bool was_failure = false;
3068         int ret = 0;
3069
3070         if (!dev)
3071                 return false;
3072
3073         if (!(dev->flags & OPAL_FL_SUPPORTED))
3074                 return false;
3075
3076         mutex_lock(&dev->dev_lock);
3077         setup_opal_dev(dev);
3078
3079         list_for_each_entry(suspend, &dev->unlk_lst, node) {
3080                 dev->tsn = 0;
3081                 dev->hsn = 0;
3082
3083                 ret = __opal_lock_unlock(dev, &suspend->unlk);
3084                 if (ret) {
3085                         pr_debug("Failed to unlock LR %hhu with sum %d\n",
3086                                  suspend->unlk.session.opal_key.lr,
3087                                  suspend->unlk.session.sum);
3088                         was_failure = true;
3089                 }
3090
3091                 if (dev->flags & OPAL_FL_MBR_ENABLED) {
3092                         ret = __opal_set_mbr_done(dev, &suspend->unlk.session.opal_key);
3093                         if (ret)
3094                                 pr_debug("Failed to set MBR Done in S3 resume\n");
3095                 }
3096         }
3097         mutex_unlock(&dev->dev_lock);
3098
3099         return was_failure;
3100 }
3101 EXPORT_SYMBOL(opal_unlock_from_suspend);
3102
3103 static int opal_read_table(struct opal_dev *dev,
3104                            struct opal_read_write_table *rw_tbl)
3105 {
3106         const struct opal_step read_table_steps[] = {
3107                 { start_admin1LSP_opal_session, &rw_tbl->key },
3108                 { read_table_data, rw_tbl },
3109                 { end_opal_session, }
3110         };
3111         int ret = 0;
3112
3113         if (!rw_tbl->size)
3114                 return ret;
3115
3116         return execute_steps(dev, read_table_steps,
3117                              ARRAY_SIZE(read_table_steps));
3118 }
3119
3120 static int opal_write_table(struct opal_dev *dev,
3121                             struct opal_read_write_table *rw_tbl)
3122 {
3123         const struct opal_step write_table_steps[] = {
3124                 { start_admin1LSP_opal_session, &rw_tbl->key },
3125                 { write_table_data, rw_tbl },
3126                 { end_opal_session, }
3127         };
3128         int ret = 0;
3129
3130         if (!rw_tbl->size)
3131                 return ret;
3132
3133         return execute_steps(dev, write_table_steps,
3134                              ARRAY_SIZE(write_table_steps));
3135 }
3136
3137 static int opal_generic_read_write_table(struct opal_dev *dev,
3138                                          struct opal_read_write_table *rw_tbl)
3139 {
3140         int ret, bit_set;
3141
3142         ret = opal_get_key(dev, &rw_tbl->key);
3143         if (ret)
3144                 return ret;
3145         mutex_lock(&dev->dev_lock);
3146         setup_opal_dev(dev);
3147
3148         bit_set = fls64(rw_tbl->flags) - 1;
3149         switch (bit_set) {
3150         case OPAL_READ_TABLE:
3151                 ret = opal_read_table(dev, rw_tbl);
3152                 break;
3153         case OPAL_WRITE_TABLE:
3154                 ret = opal_write_table(dev, rw_tbl);
3155                 break;
3156         default:
3157                 pr_debug("Invalid bit set in the flag (%016llx).\n",
3158                          rw_tbl->flags);
3159                 ret = -EINVAL;
3160                 break;
3161         }
3162
3163         mutex_unlock(&dev->dev_lock);
3164
3165         return ret;
3166 }
3167
3168 static int opal_get_status(struct opal_dev *dev, void __user *data)
3169 {
3170         struct opal_status sts = {0};
3171
3172         /*
3173          * check_opal_support() error is not fatal,
3174          * !dev->supported is a valid condition
3175          */
3176         if (!check_opal_support(dev))
3177                 sts.flags = dev->flags;
3178         if (copy_to_user(data, &sts, sizeof(sts))) {
3179                 pr_debug("Error copying status to userspace\n");
3180                 return -EFAULT;
3181         }
3182         return 0;
3183 }
3184
3185 static int opal_get_geometry(struct opal_dev *dev, void __user *data)
3186 {
3187         struct opal_geometry geo = {0};
3188
3189         if (check_opal_support(dev))
3190                 return -EINVAL;
3191
3192         geo.align = dev->align_required;
3193         geo.logical_block_size = dev->logical_block_size;
3194         geo.alignment_granularity =  dev->align;
3195         geo.lowest_aligned_lba = dev->lowest_lba;
3196
3197         if (copy_to_user(data, &geo, sizeof(geo))) {
3198                 pr_debug("Error copying geometry data to userspace\n");
3199                 return -EFAULT;
3200         }
3201
3202         return 0;
3203 }
3204
3205 int sed_ioctl(struct opal_dev *dev, unsigned int cmd, void __user *arg)
3206 {
3207         void *p;
3208         int ret = -ENOTTY;
3209
3210         if (!capable(CAP_SYS_ADMIN))
3211                 return -EACCES;
3212         if (!dev)
3213                 return -EOPNOTSUPP;
3214         if (!(dev->flags & OPAL_FL_SUPPORTED))
3215                 return -EOPNOTSUPP;
3216
3217         if (cmd & IOC_IN) {
3218                 p = memdup_user(arg, _IOC_SIZE(cmd));
3219                 if (IS_ERR(p))
3220                         return PTR_ERR(p);
3221         }
3222
3223         switch (cmd) {
3224         case IOC_OPAL_SAVE:
3225                 ret = opal_save(dev, p);
3226                 break;
3227         case IOC_OPAL_LOCK_UNLOCK:
3228                 ret = opal_lock_unlock(dev, p);
3229                 break;
3230         case IOC_OPAL_TAKE_OWNERSHIP:
3231                 ret = opal_take_ownership(dev, p);
3232                 break;
3233         case IOC_OPAL_ACTIVATE_LSP:
3234                 ret = opal_activate_lsp(dev, p);
3235                 break;
3236         case IOC_OPAL_SET_PW:
3237                 ret = opal_set_new_pw(dev, p);
3238                 break;
3239         case IOC_OPAL_ACTIVATE_USR:
3240                 ret = opal_activate_user(dev, p);
3241                 break;
3242         case IOC_OPAL_REVERT_TPR:
3243                 ret = opal_reverttper(dev, p, false);
3244                 break;
3245         case IOC_OPAL_LR_SETUP:
3246                 ret = opal_setup_locking_range(dev, p);
3247                 break;
3248         case IOC_OPAL_ADD_USR_TO_LR:
3249                 ret = opal_add_user_to_lr(dev, p);
3250                 break;
3251         case IOC_OPAL_ENABLE_DISABLE_MBR:
3252                 ret = opal_enable_disable_shadow_mbr(dev, p);
3253                 break;
3254         case IOC_OPAL_MBR_DONE:
3255                 ret = opal_set_mbr_done(dev, p);
3256                 break;
3257         case IOC_OPAL_WRITE_SHADOW_MBR:
3258                 ret = opal_write_shadow_mbr(dev, p);
3259                 break;
3260         case IOC_OPAL_ERASE_LR:
3261                 ret = opal_erase_locking_range(dev, p);
3262                 break;
3263         case IOC_OPAL_SECURE_ERASE_LR:
3264                 ret = opal_secure_erase_locking_range(dev, p);
3265                 break;
3266         case IOC_OPAL_PSID_REVERT_TPR:
3267                 ret = opal_reverttper(dev, p, true);
3268                 break;
3269         case IOC_OPAL_GENERIC_TABLE_RW:
3270                 ret = opal_generic_read_write_table(dev, p);
3271                 break;
3272         case IOC_OPAL_GET_STATUS:
3273                 ret = opal_get_status(dev, arg);
3274                 break;
3275         case IOC_OPAL_GET_LR_STATUS:
3276                 ret = opal_locking_range_status(dev, p, arg);
3277                 break;
3278         case IOC_OPAL_GET_GEOMETRY:
3279                 ret = opal_get_geometry(dev, arg);
3280                 break;
3281         case IOC_OPAL_REVERT_LSP:
3282                 ret = opal_revertlsp(dev, p);
3283                 break;
3284         case IOC_OPAL_DISCOVERY:
3285                 ret = opal_get_discv(dev, p);
3286                 break;
3287
3288         default:
3289                 break;
3290         }
3291
3292         if (cmd & IOC_IN)
3293                 kfree(p);
3294         return ret;
3295 }
3296 EXPORT_SYMBOL_GPL(sed_ioctl);
3297
3298 static int __init sed_opal_init(void)
3299 {
3300         struct key *kr;
3301         char init_sed_key[OPAL_KEY_MAX];
3302         int keylen = OPAL_KEY_MAX - 1;
3303
3304         kr = keyring_alloc(".sed_opal",
3305                            GLOBAL_ROOT_UID, GLOBAL_ROOT_GID, current_cred(),
3306                            (KEY_POS_ALL & ~KEY_POS_SETATTR) | KEY_USR_VIEW |
3307                            KEY_USR_READ | KEY_USR_SEARCH | KEY_USR_WRITE,
3308                            KEY_ALLOC_NOT_IN_QUOTA,
3309                            NULL, NULL);
3310         if (IS_ERR(kr))
3311                 return PTR_ERR(kr);
3312
3313         sed_opal_keyring = kr;
3314
3315         if (sed_read_key(OPAL_AUTH_KEY, init_sed_key, &keylen) < 0) {
3316                 memset(init_sed_key, '\0', sizeof(init_sed_key));
3317                 keylen = OPAL_KEY_MAX - 1;
3318         }
3319
3320         return update_sed_opal_key(OPAL_AUTH_KEY, init_sed_key, keylen);
3321 }
3322 late_initcall(sed_opal_init);