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