Lines Matching refs:dev

38 	int (*fn)(struct opal_dev *dev, void *data);
41 typedef int (cont_fn)(struct opal_dev *dev);
222 static int end_opal_session_error(struct opal_dev *dev);
223 static int opal_discovery0_step(struct opal_dev *dev);
334 static int opal_get_key(struct opal_dev *dev, struct opal_key *key) in opal_get_key() argument
455 static int opal_send_cmd(struct opal_dev *dev) in opal_send_cmd() argument
457 return dev->send_recv(dev->data, dev->comid, TCG_SECP_01, in opal_send_cmd()
458 dev->cmd, IO_BUFFER_LENGTH, in opal_send_cmd()
462 static int opal_recv_cmd(struct opal_dev *dev) in opal_recv_cmd() argument
464 return dev->send_recv(dev->data, dev->comid, TCG_SECP_01, in opal_recv_cmd()
465 dev->resp, IO_BUFFER_LENGTH, in opal_recv_cmd()
469 static int opal_recv_check(struct opal_dev *dev) in opal_recv_check() argument
472 void *buffer = dev->resp; in opal_recv_check()
486 ret = opal_recv_cmd(dev); in opal_recv_check()
492 static int opal_send_recv(struct opal_dev *dev, cont_fn *cont) in opal_send_recv() argument
496 ret = opal_send_cmd(dev); in opal_send_recv()
499 ret = opal_recv_cmd(dev); in opal_send_recv()
502 ret = opal_recv_check(dev); in opal_send_recv()
505 return cont(dev); in opal_send_recv()
508 static void check_geometry(struct opal_dev *dev, const void *data) in check_geometry() argument
512 dev->align = be64_to_cpu(geo->alignment_granularity); in check_geometry()
513 dev->lowest_lba = be64_to_cpu(geo->lowest_aligned_lba); in check_geometry()
514 dev->logical_block_size = be32_to_cpu(geo->logical_block_size); in check_geometry()
515 dev->align_required = geo->reserved01 & 1; in check_geometry()
518 static int execute_step(struct opal_dev *dev, in execute_step() argument
521 int error = step->fn(dev, step->data); in execute_step()
532 static int execute_steps(struct opal_dev *dev, in execute_steps() argument
539 error = opal_discovery0_step(dev); in execute_steps()
544 error = execute_step(dev, &steps[state], state); in execute_steps()
561 end_opal_session_error(dev); in execute_steps()
566 static int opal_discovery0_end(struct opal_dev *dev, void *data) in opal_discovery0_end() argument
572 const struct d0_header *hdr = (struct d0_header *)dev->resp; in opal_discovery0_end()
573 const u8 *epos = dev->resp, *cpos = dev->resp; in opal_discovery0_end()
577 print_buffer(dev->resp, hlen); in opal_discovery0_end()
578 dev->flags &= OPAL_FL_SUPPORTED; in opal_discovery0_end()
589 if (buf_out && copy_to_user(buf_out, dev->resp, len_out)) in opal_discovery0_end()
609 dev->flags |= OPAL_FL_SUM_SUPPORTED; in opal_discovery0_end()
612 check_geometry(dev, body); in opal_discovery0_end()
616 dev->flags |= OPAL_FL_LOCKING_SUPPORTED; in opal_discovery0_end()
618 dev->flags |= OPAL_FL_LOCKING_ENABLED; in opal_discovery0_end()
620 dev->flags |= OPAL_FL_LOCKED; in opal_discovery0_end()
622 dev->flags |= OPAL_FL_MBR_ENABLED; in opal_discovery0_end()
624 dev->flags |= OPAL_FL_MBR_DONE; in opal_discovery0_end()
665 dev->comid = comid; in opal_discovery0_end()
670 static int opal_discovery0(struct opal_dev *dev, void *data) in opal_discovery0() argument
674 memset(dev->resp, 0, IO_BUFFER_LENGTH); in opal_discovery0()
675 dev->comid = OPAL_DISCOVERY_COMID; in opal_discovery0()
676 ret = opal_recv_cmd(dev); in opal_discovery0()
680 return opal_discovery0_end(dev, data); in opal_discovery0()
683 static int opal_discovery0_step(struct opal_dev *dev) in opal_discovery0_step() argument
689 return execute_step(dev, &discovery0_step, 0); in opal_discovery0_step()
1169 static int parse_and_check_status(struct opal_dev *dev) in parse_and_check_status() argument
1173 print_buffer(dev->cmd, dev->pos); in parse_and_check_status()
1175 error = response_parse(dev->resp, IO_BUFFER_LENGTH, &dev->parsed); in parse_and_check_status()
1181 return response_status(&dev->parsed); in parse_and_check_status()
1184 static void clear_opal_cmd(struct opal_dev *dev) in clear_opal_cmd() argument
1186 dev->pos = sizeof(struct opal_header); in clear_opal_cmd()
1187 memset(dev->cmd, 0, IO_BUFFER_LENGTH); in clear_opal_cmd()
1190 static int cmd_start(struct opal_dev *dev, const u8 *uid, const u8 *method) in cmd_start() argument
1194 clear_opal_cmd(dev); in cmd_start()
1195 set_comid(dev, dev->comid); in cmd_start()
1197 add_token_u8(&err, dev, OPAL_CALL); in cmd_start()
1198 add_token_bytestring(&err, dev, uid, OPAL_UID_LENGTH); in cmd_start()
1199 add_token_bytestring(&err, dev, method, OPAL_METHOD_LENGTH); in cmd_start()
1206 add_token_u8(&err, dev, OPAL_STARTLIST); in cmd_start()
1211 static int start_opal_session_cont(struct opal_dev *dev) in start_opal_session_cont() argument
1216 error = parse_and_check_status(dev); in start_opal_session_cont()
1220 hsn = response_get_u64(&dev->parsed, 4); in start_opal_session_cont()
1221 tsn = response_get_u64(&dev->parsed, 5); in start_opal_session_cont()
1228 dev->hsn = hsn; in start_opal_session_cont()
1229 dev->tsn = tsn; in start_opal_session_cont()
1234 static void add_suspend_info(struct opal_dev *dev, in add_suspend_info() argument
1239 list_for_each_entry(iter, &dev->unlk_lst, node) { in add_suspend_info()
1246 list_add_tail(&sus->node, &dev->unlk_lst); in add_suspend_info()
1249 static int end_session_cont(struct opal_dev *dev) in end_session_cont() argument
1251 dev->hsn = 0; in end_session_cont()
1252 dev->tsn = 0; in end_session_cont()
1254 return parse_and_check_status(dev); in end_session_cont()
1257 static int finalize_and_send(struct opal_dev *dev, cont_fn cont) in finalize_and_send() argument
1261 ret = cmd_finalize(dev, dev->hsn, dev->tsn); in finalize_and_send()
1267 print_buffer(dev->cmd, dev->pos); in finalize_and_send()
1269 return opal_send_recv(dev, cont); in finalize_and_send()
1272 static int generic_get_columns(struct opal_dev *dev, const u8 *table, in generic_get_columns() argument
1277 err = cmd_start(dev, table, opalmethod[OPAL_GET]); in generic_get_columns()
1279 add_token_u8(&err, dev, OPAL_STARTLIST); in generic_get_columns()
1281 add_token_u8(&err, dev, OPAL_STARTNAME); in generic_get_columns()
1282 add_token_u8(&err, dev, OPAL_STARTCOLUMN); in generic_get_columns()
1283 add_token_u64(&err, dev, start_column); in generic_get_columns()
1284 add_token_u8(&err, dev, OPAL_ENDNAME); in generic_get_columns()
1286 add_token_u8(&err, dev, OPAL_STARTNAME); in generic_get_columns()
1287 add_token_u8(&err, dev, OPAL_ENDCOLUMN); in generic_get_columns()
1288 add_token_u64(&err, dev, end_column); in generic_get_columns()
1289 add_token_u8(&err, dev, OPAL_ENDNAME); in generic_get_columns()
1291 add_token_u8(&err, dev, OPAL_ENDLIST); in generic_get_columns()
1296 return finalize_and_send(dev, parse_and_check_status); in generic_get_columns()
1303 static int generic_get_column(struct opal_dev *dev, const u8 *table, in generic_get_column() argument
1306 return generic_get_columns(dev, table, column, column); in generic_get_column()
1314 static int generic_get_table_info(struct opal_dev *dev, const u8 *table_uid, in generic_get_table_info() argument
1329 return generic_get_column(dev, uid, column); in generic_get_table_info()
1332 static int gen_key(struct opal_dev *dev, void *data) in gen_key() argument
1337 memcpy(uid, dev->prev_data, min(sizeof(uid), dev->prev_d_len)); in gen_key()
1338 kfree(dev->prev_data); in gen_key()
1339 dev->prev_data = NULL; in gen_key()
1341 err = cmd_start(dev, uid, opalmethod[OPAL_GENKEY]); in gen_key()
1349 return finalize_and_send(dev, parse_and_check_status); in gen_key()
1352 static int get_active_key_cont(struct opal_dev *dev) in get_active_key_cont() argument
1358 error = parse_and_check_status(dev); in get_active_key_cont()
1362 keylen = response_get_string(&dev->parsed, 4, &activekey); in get_active_key_cont()
1369 dev->prev_data = kmemdup(activekey, keylen, GFP_KERNEL); in get_active_key_cont()
1371 if (!dev->prev_data) in get_active_key_cont()
1374 dev->prev_d_len = keylen; in get_active_key_cont()
1379 static int get_active_key(struct opal_dev *dev, void *data) in get_active_key() argument
1389 err = generic_get_column(dev, uid, OPAL_ACTIVEKEY); in get_active_key()
1393 return get_active_key_cont(dev); in get_active_key()
1396 static int generic_table_write_data(struct opal_dev *dev, const u64 data, in generic_table_write_data() argument
1406 err = generic_get_table_info(dev, uid, OPAL_TABLE_ROWS); in generic_table_write_data()
1412 len = response_get_u64(&dev->parsed, 4); in generic_table_write_data()
1421 err = cmd_start(dev, uid, opalmethod[OPAL_SET]); in generic_table_write_data()
1422 add_token_u8(&err, dev, OPAL_STARTNAME); in generic_table_write_data()
1423 add_token_u8(&err, dev, OPAL_WHERE); in generic_table_write_data()
1424 add_token_u64(&err, dev, offset + off); in generic_table_write_data()
1425 add_token_u8(&err, dev, OPAL_ENDNAME); in generic_table_write_data()
1427 add_token_u8(&err, dev, OPAL_STARTNAME); in generic_table_write_data()
1428 add_token_u8(&err, dev, OPAL_VALUES); in generic_table_write_data()
1436 len = min(remaining_size(dev) - (2+1+CMD_FINALIZE_BYTES_NEEDED), in generic_table_write_data()
1440 dst = add_bytestring_header(&err, dev, len); in generic_table_write_data()
1449 dev->pos += len; in generic_table_write_data()
1451 add_token_u8(&err, dev, OPAL_ENDNAME); in generic_table_write_data()
1455 err = finalize_and_send(dev, parse_and_check_status); in generic_table_write_data()
1465 static int generic_lr_enable_disable(struct opal_dev *dev, in generic_lr_enable_disable() argument
1471 err = cmd_start(dev, uid, opalmethod[OPAL_SET]); in generic_lr_enable_disable()
1473 add_token_u8(&err, dev, OPAL_STARTNAME); in generic_lr_enable_disable()
1474 add_token_u8(&err, dev, OPAL_VALUES); in generic_lr_enable_disable()
1475 add_token_u8(&err, dev, OPAL_STARTLIST); in generic_lr_enable_disable()
1477 add_token_u8(&err, dev, OPAL_STARTNAME); in generic_lr_enable_disable()
1478 add_token_u8(&err, dev, OPAL_READLOCKENABLED); in generic_lr_enable_disable()
1479 add_token_u8(&err, dev, rle); in generic_lr_enable_disable()
1480 add_token_u8(&err, dev, OPAL_ENDNAME); in generic_lr_enable_disable()
1482 add_token_u8(&err, dev, OPAL_STARTNAME); in generic_lr_enable_disable()
1483 add_token_u8(&err, dev, OPAL_WRITELOCKENABLED); in generic_lr_enable_disable()
1484 add_token_u8(&err, dev, wle); in generic_lr_enable_disable()
1485 add_token_u8(&err, dev, OPAL_ENDNAME); in generic_lr_enable_disable()
1487 add_token_u8(&err, dev, OPAL_STARTNAME); in generic_lr_enable_disable()
1488 add_token_u8(&err, dev, OPAL_READLOCKED); in generic_lr_enable_disable()
1489 add_token_u8(&err, dev, rl); in generic_lr_enable_disable()
1490 add_token_u8(&err, dev, OPAL_ENDNAME); in generic_lr_enable_disable()
1492 add_token_u8(&err, dev, OPAL_STARTNAME); in generic_lr_enable_disable()
1493 add_token_u8(&err, dev, OPAL_WRITELOCKED); in generic_lr_enable_disable()
1494 add_token_u8(&err, dev, wl); in generic_lr_enable_disable()
1495 add_token_u8(&err, dev, OPAL_ENDNAME); in generic_lr_enable_disable()
1497 add_token_u8(&err, dev, OPAL_ENDLIST); in generic_lr_enable_disable()
1498 add_token_u8(&err, dev, OPAL_ENDNAME); in generic_lr_enable_disable()
1503 static inline int enable_global_lr(struct opal_dev *dev, u8 *uid, in enable_global_lr() argument
1508 err = generic_lr_enable_disable(dev, uid, !!setup->RLE, !!setup->WLE, in enable_global_lr()
1516 static int setup_locking_range(struct opal_dev *dev, void *data) in setup_locking_range() argument
1529 err = enable_global_lr(dev, uid, setup); in setup_locking_range()
1531 err = cmd_start(dev, uid, opalmethod[OPAL_SET]); in setup_locking_range()
1533 add_token_u8(&err, dev, OPAL_STARTNAME); in setup_locking_range()
1534 add_token_u8(&err, dev, OPAL_VALUES); in setup_locking_range()
1535 add_token_u8(&err, dev, OPAL_STARTLIST); in setup_locking_range()
1537 add_token_u8(&err, dev, OPAL_STARTNAME); in setup_locking_range()
1538 add_token_u8(&err, dev, OPAL_RANGESTART); in setup_locking_range()
1539 add_token_u64(&err, dev, setup->range_start); in setup_locking_range()
1540 add_token_u8(&err, dev, OPAL_ENDNAME); in setup_locking_range()
1542 add_token_u8(&err, dev, OPAL_STARTNAME); in setup_locking_range()
1543 add_token_u8(&err, dev, OPAL_RANGELENGTH); in setup_locking_range()
1544 add_token_u64(&err, dev, setup->range_length); in setup_locking_range()
1545 add_token_u8(&err, dev, OPAL_ENDNAME); in setup_locking_range()
1547 add_token_u8(&err, dev, OPAL_STARTNAME); in setup_locking_range()
1548 add_token_u8(&err, dev, OPAL_READLOCKENABLED); in setup_locking_range()
1549 add_token_u64(&err, dev, !!setup->RLE); in setup_locking_range()
1550 add_token_u8(&err, dev, OPAL_ENDNAME); in setup_locking_range()
1552 add_token_u8(&err, dev, OPAL_STARTNAME); in setup_locking_range()
1553 add_token_u8(&err, dev, OPAL_WRITELOCKENABLED); in setup_locking_range()
1554 add_token_u64(&err, dev, !!setup->WLE); in setup_locking_range()
1555 add_token_u8(&err, dev, OPAL_ENDNAME); in setup_locking_range()
1557 add_token_u8(&err, dev, OPAL_ENDLIST); in setup_locking_range()
1558 add_token_u8(&err, dev, OPAL_ENDNAME); in setup_locking_range()
1565 return finalize_and_send(dev, parse_and_check_status); in setup_locking_range()
1613 static int locking_range_status(struct opal_dev *dev, void *data) in locking_range_status() argument
1626 err = generic_get_columns(dev, lr_buffer, OPAL_RANGESTART, in locking_range_status()
1636 err = response_get_column(&dev->parsed, &tok_n, OPAL_RANGESTART, in locking_range_status()
1642 err = response_get_column(&dev->parsed, &tok_n, OPAL_RANGELENGTH, in locking_range_status()
1648 err = response_get_column(&dev->parsed, &tok_n, OPAL_READLOCKENABLED, in locking_range_status()
1656 err = response_get_column(&dev->parsed, &tok_n, OPAL_WRITELOCKENABLED, in locking_range_status()
1664 err = response_get_column(&dev->parsed, &tok_n, OPAL_READLOCKED, &resp); in locking_range_status()
1671 err = response_get_column(&dev->parsed, &tok_n, OPAL_WRITELOCKED, &resp); in locking_range_status()
1691 static int start_generic_opal_session(struct opal_dev *dev, in start_generic_opal_session() argument
1704 err = cmd_start(dev, opaluid[OPAL_SMUID_UID], in start_generic_opal_session()
1707 add_token_u64(&err, dev, hsn); in start_generic_opal_session()
1708 add_token_bytestring(&err, dev, opaluid[sp_type], OPAL_UID_LENGTH); in start_generic_opal_session()
1709 add_token_u8(&err, dev, 1); in start_generic_opal_session()
1717 add_token_u8(&err, dev, OPAL_STARTNAME); in start_generic_opal_session()
1718 add_token_u8(&err, dev, 0); /* HostChallenge */ in start_generic_opal_session()
1719 add_token_bytestring(&err, dev, key, key_len); in start_generic_opal_session()
1720 add_token_u8(&err, dev, OPAL_ENDNAME); in start_generic_opal_session()
1721 add_token_u8(&err, dev, OPAL_STARTNAME); in start_generic_opal_session()
1722 add_token_u8(&err, dev, 3); /* HostSignAuth */ in start_generic_opal_session()
1723 add_token_bytestring(&err, dev, opaluid[auth], in start_generic_opal_session()
1725 add_token_u8(&err, dev, OPAL_ENDNAME); in start_generic_opal_session()
1737 return finalize_and_send(dev, start_opal_session_cont); in start_generic_opal_session()
1740 static int start_anybodyASP_opal_session(struct opal_dev *dev, void *data) in start_anybodyASP_opal_session() argument
1742 return start_generic_opal_session(dev, OPAL_ANYBODY_UID, in start_anybodyASP_opal_session()
1746 static int start_SIDASP_opal_session(struct opal_dev *dev, void *data) in start_SIDASP_opal_session() argument
1749 const u8 *key = dev->prev_data; in start_SIDASP_opal_session()
1754 ret = start_generic_opal_session(dev, OPAL_SID_UID, in start_SIDASP_opal_session()
1759 ret = start_generic_opal_session(dev, OPAL_SID_UID, in start_SIDASP_opal_session()
1761 key, dev->prev_d_len); in start_SIDASP_opal_session()
1763 dev->prev_data = NULL; in start_SIDASP_opal_session()
1769 static int start_admin1LSP_opal_session(struct opal_dev *dev, void *data) in start_admin1LSP_opal_session() argument
1773 return start_generic_opal_session(dev, OPAL_ADMIN1_UID, in start_admin1LSP_opal_session()
1778 static int start_PSID_opal_session(struct opal_dev *dev, void *data) in start_PSID_opal_session() argument
1782 return start_generic_opal_session(dev, OPAL_PSID_UID, in start_PSID_opal_session()
1788 static int start_auth_opal_session(struct opal_dev *dev, void *data) in start_auth_opal_session() argument
1810 err = cmd_start(dev, opaluid[OPAL_SMUID_UID], in start_auth_opal_session()
1813 add_token_u64(&err, dev, hsn); in start_auth_opal_session()
1814 add_token_bytestring(&err, dev, opaluid[OPAL_LOCKINGSP_UID], in start_auth_opal_session()
1816 add_token_u8(&err, dev, 1); in start_auth_opal_session()
1817 add_token_u8(&err, dev, OPAL_STARTNAME); in start_auth_opal_session()
1818 add_token_u8(&err, dev, 0); in start_auth_opal_session()
1819 add_token_bytestring(&err, dev, key, keylen); in start_auth_opal_session()
1820 add_token_u8(&err, dev, OPAL_ENDNAME); in start_auth_opal_session()
1821 add_token_u8(&err, dev, OPAL_STARTNAME); in start_auth_opal_session()
1822 add_token_u8(&err, dev, 3); in start_auth_opal_session()
1823 add_token_bytestring(&err, dev, lk_ul_user, OPAL_UID_LENGTH); in start_auth_opal_session()
1824 add_token_u8(&err, dev, OPAL_ENDNAME); in start_auth_opal_session()
1831 return finalize_and_send(dev, start_opal_session_cont); in start_auth_opal_session()
1834 static int revert_tper(struct opal_dev *dev, void *data) in revert_tper() argument
1838 err = cmd_start(dev, opaluid[OPAL_ADMINSP_UID], in revert_tper()
1845 return finalize_and_send(dev, parse_and_check_status); in revert_tper()
1848 static int internal_activate_user(struct opal_dev *dev, void *data) in internal_activate_user() argument
1857 err = cmd_start(dev, uid, opalmethod[OPAL_SET]); in internal_activate_user()
1858 add_token_u8(&err, dev, OPAL_STARTNAME); in internal_activate_user()
1859 add_token_u8(&err, dev, OPAL_VALUES); in internal_activate_user()
1860 add_token_u8(&err, dev, OPAL_STARTLIST); in internal_activate_user()
1861 add_token_u8(&err, dev, OPAL_STARTNAME); in internal_activate_user()
1862 add_token_u8(&err, dev, 5); /* Enabled */ in internal_activate_user()
1863 add_token_u8(&err, dev, OPAL_TRUE); in internal_activate_user()
1864 add_token_u8(&err, dev, OPAL_ENDNAME); in internal_activate_user()
1865 add_token_u8(&err, dev, OPAL_ENDLIST); in internal_activate_user()
1866 add_token_u8(&err, dev, OPAL_ENDNAME); in internal_activate_user()
1873 return finalize_and_send(dev, parse_and_check_status); in internal_activate_user()
1876 static int revert_lsp(struct opal_dev *dev, void *data) in revert_lsp() argument
1881 err = cmd_start(dev, opaluid[OPAL_THISSP_UID], in revert_lsp()
1883 add_token_u8(&err, dev, OPAL_STARTNAME); in revert_lsp()
1884 add_token_u64(&err, dev, OPAL_KEEP_GLOBAL_RANGE_KEY); in revert_lsp()
1885 add_token_u8(&err, dev, (rev->options & OPAL_PRESERVE) ? in revert_lsp()
1887 add_token_u8(&err, dev, OPAL_ENDNAME); in revert_lsp()
1893 return finalize_and_send(dev, parse_and_check_status); in revert_lsp()
1896 static int erase_locking_range(struct opal_dev *dev, void *data) in erase_locking_range() argument
1905 err = cmd_start(dev, uid, opalmethod[OPAL_ERASE]); in erase_locking_range()
1912 return finalize_and_send(dev, parse_and_check_status); in erase_locking_range()
1915 static int set_mbr_done(struct opal_dev *dev, void *data) in set_mbr_done() argument
1920 err = cmd_start(dev, opaluid[OPAL_MBRCONTROL], in set_mbr_done()
1923 add_token_u8(&err, dev, OPAL_STARTNAME); in set_mbr_done()
1924 add_token_u8(&err, dev, OPAL_VALUES); in set_mbr_done()
1925 add_token_u8(&err, dev, OPAL_STARTLIST); in set_mbr_done()
1926 add_token_u8(&err, dev, OPAL_STARTNAME); in set_mbr_done()
1927 add_token_u8(&err, dev, OPAL_MBRDONE); in set_mbr_done()
1928 add_token_u8(&err, dev, *mbr_done_tf); /* Done T or F */ in set_mbr_done()
1929 add_token_u8(&err, dev, OPAL_ENDNAME); in set_mbr_done()
1930 add_token_u8(&err, dev, OPAL_ENDLIST); in set_mbr_done()
1931 add_token_u8(&err, dev, OPAL_ENDNAME); in set_mbr_done()
1938 return finalize_and_send(dev, parse_and_check_status); in set_mbr_done()
1941 static int set_mbr_enable_disable(struct opal_dev *dev, void *data) in set_mbr_enable_disable() argument
1946 err = cmd_start(dev, opaluid[OPAL_MBRCONTROL], in set_mbr_enable_disable()
1949 add_token_u8(&err, dev, OPAL_STARTNAME); in set_mbr_enable_disable()
1950 add_token_u8(&err, dev, OPAL_VALUES); in set_mbr_enable_disable()
1951 add_token_u8(&err, dev, OPAL_STARTLIST); in set_mbr_enable_disable()
1952 add_token_u8(&err, dev, OPAL_STARTNAME); in set_mbr_enable_disable()
1953 add_token_u8(&err, dev, OPAL_MBRENABLE); in set_mbr_enable_disable()
1954 add_token_u8(&err, dev, *mbr_en_dis); in set_mbr_enable_disable()
1955 add_token_u8(&err, dev, OPAL_ENDNAME); in set_mbr_enable_disable()
1956 add_token_u8(&err, dev, OPAL_ENDLIST); in set_mbr_enable_disable()
1957 add_token_u8(&err, dev, OPAL_ENDNAME); in set_mbr_enable_disable()
1964 return finalize_and_send(dev, parse_and_check_status); in set_mbr_enable_disable()
1967 static int write_shadow_mbr(struct opal_dev *dev, void *data) in write_shadow_mbr() argument
1971 return generic_table_write_data(dev, shadow->data, shadow->offset, in write_shadow_mbr()
1976 struct opal_dev *dev) in generic_pw_cmd() argument
1980 err = cmd_start(dev, cpin_uid, opalmethod[OPAL_SET]); in generic_pw_cmd()
1982 add_token_u8(&err, dev, OPAL_STARTNAME); in generic_pw_cmd()
1983 add_token_u8(&err, dev, OPAL_VALUES); in generic_pw_cmd()
1984 add_token_u8(&err, dev, OPAL_STARTLIST); in generic_pw_cmd()
1985 add_token_u8(&err, dev, OPAL_STARTNAME); in generic_pw_cmd()
1986 add_token_u8(&err, dev, OPAL_PIN); in generic_pw_cmd()
1987 add_token_bytestring(&err, dev, key, key_len); in generic_pw_cmd()
1988 add_token_u8(&err, dev, OPAL_ENDNAME); in generic_pw_cmd()
1989 add_token_u8(&err, dev, OPAL_ENDLIST); in generic_pw_cmd()
1990 add_token_u8(&err, dev, OPAL_ENDNAME); in generic_pw_cmd()
1995 static int set_new_pw(struct opal_dev *dev, void *data) in set_new_pw() argument
2011 cpin_uid, dev)) { in set_new_pw()
2016 return finalize_and_send(dev, parse_and_check_status); in set_new_pw()
2019 static int set_sid_cpin_pin(struct opal_dev *dev, void *data) in set_sid_cpin_pin() argument
2026 if (generic_pw_cmd(key->key, key->key_len, cpin_uid, dev)) { in set_sid_cpin_pin()
2030 return finalize_and_send(dev, parse_and_check_status); in set_sid_cpin_pin()
2034 struct opal_dev *dev, in add_authority_object_ref() argument
2038 add_token_u8(err, dev, OPAL_STARTNAME); in add_authority_object_ref()
2039 add_token_bytestring(err, dev, in add_authority_object_ref()
2042 add_token_bytestring(err, dev, uid, uid_len); in add_authority_object_ref()
2043 add_token_u8(err, dev, OPAL_ENDNAME); in add_authority_object_ref()
2047 struct opal_dev *dev, in add_boolean_object_ref() argument
2050 add_token_u8(err, dev, OPAL_STARTNAME); in add_boolean_object_ref()
2051 add_token_bytestring(err, dev, opaluid[OPAL_HALF_UID_BOOLEAN_ACE], in add_boolean_object_ref()
2053 add_token_u8(err, dev, boolean_op); in add_boolean_object_ref()
2054 add_token_u8(err, dev, OPAL_ENDNAME); in add_boolean_object_ref()
2057 static int set_lr_boolean_ace(struct opal_dev *dev, in set_lr_boolean_ace() argument
2071 err = cmd_start(dev, lr_buffer, opalmethod[OPAL_SET]); in set_lr_boolean_ace()
2073 add_token_u8(&err, dev, OPAL_STARTNAME); in set_lr_boolean_ace()
2074 add_token_u8(&err, dev, OPAL_VALUES); in set_lr_boolean_ace()
2076 add_token_u8(&err, dev, OPAL_STARTLIST); in set_lr_boolean_ace()
2077 add_token_u8(&err, dev, OPAL_STARTNAME); in set_lr_boolean_ace()
2078 add_token_u8(&err, dev, 3); in set_lr_boolean_ace()
2080 add_token_u8(&err, dev, OPAL_STARTLIST); in set_lr_boolean_ace()
2092 add_authority_object_ref(&err, dev, user_uid, sizeof(user_uid)); in set_lr_boolean_ace()
2100 add_boolean_object_ref(&err, dev, OPAL_BOOLEAN_OR); in set_lr_boolean_ace()
2103 add_token_u8(&err, dev, OPAL_ENDLIST); in set_lr_boolean_ace()
2104 add_token_u8(&err, dev, OPAL_ENDNAME); in set_lr_boolean_ace()
2105 add_token_u8(&err, dev, OPAL_ENDLIST); in set_lr_boolean_ace()
2106 add_token_u8(&err, dev, OPAL_ENDNAME); in set_lr_boolean_ace()
2111 static int add_user_to_lr(struct opal_dev *dev, void *data) in add_user_to_lr() argument
2119 err = set_lr_boolean_ace(dev, in add_user_to_lr()
2130 return finalize_and_send(dev, parse_and_check_status); in add_user_to_lr()
2133 static int add_user_to_lr_ace(struct opal_dev *dev, void *data) in add_user_to_lr_ace() argument
2142 err = set_lr_boolean_ace(dev, OPAL_LOCKINGRANGE_ACE_START_TO_KEY, in add_user_to_lr_ace()
2151 return finalize_and_send(dev, parse_and_check_status); in add_user_to_lr_ace()
2154 static int lock_unlock_locking_range(struct opal_dev *dev, void *data) in lock_unlock_locking_range() argument
2182 err = cmd_start(dev, lr_buffer, opalmethod[OPAL_SET]); in lock_unlock_locking_range()
2184 add_token_u8(&err, dev, OPAL_STARTNAME); in lock_unlock_locking_range()
2185 add_token_u8(&err, dev, OPAL_VALUES); in lock_unlock_locking_range()
2186 add_token_u8(&err, dev, OPAL_STARTLIST); in lock_unlock_locking_range()
2188 add_token_u8(&err, dev, OPAL_STARTNAME); in lock_unlock_locking_range()
2189 add_token_u8(&err, dev, OPAL_READLOCKED); in lock_unlock_locking_range()
2190 add_token_u8(&err, dev, read_locked); in lock_unlock_locking_range()
2191 add_token_u8(&err, dev, OPAL_ENDNAME); in lock_unlock_locking_range()
2193 add_token_u8(&err, dev, OPAL_STARTNAME); in lock_unlock_locking_range()
2194 add_token_u8(&err, dev, OPAL_WRITELOCKED); in lock_unlock_locking_range()
2195 add_token_u8(&err, dev, write_locked); in lock_unlock_locking_range()
2196 add_token_u8(&err, dev, OPAL_ENDNAME); in lock_unlock_locking_range()
2198 add_token_u8(&err, dev, OPAL_ENDLIST); in lock_unlock_locking_range()
2199 add_token_u8(&err, dev, OPAL_ENDNAME); in lock_unlock_locking_range()
2206 return finalize_and_send(dev, parse_and_check_status); in lock_unlock_locking_range()
2210 static int lock_unlock_locking_range_sum(struct opal_dev *dev, void *data) in lock_unlock_locking_range_sum() argument
2217 clear_opal_cmd(dev); in lock_unlock_locking_range_sum()
2218 set_comid(dev, dev->comid); in lock_unlock_locking_range_sum()
2240 ret = generic_lr_enable_disable(dev, lr_buffer, 1, 1, in lock_unlock_locking_range_sum()
2248 return finalize_and_send(dev, parse_and_check_status); in lock_unlock_locking_range_sum()
2251 static int activate_lsp(struct opal_dev *dev, void *data) in activate_lsp() argument
2257 err = cmd_start(dev, opaluid[OPAL_LOCKINGSP_UID], in activate_lsp()
2266 add_token_u8(&err, dev, OPAL_STARTNAME); in activate_lsp()
2267 add_token_u64(&err, dev, OPAL_SUM_SET_LIST); in activate_lsp()
2269 add_token_u8(&err, dev, OPAL_STARTLIST); in activate_lsp()
2270 add_token_bytestring(&err, dev, user_lr, OPAL_UID_LENGTH); in activate_lsp()
2273 add_token_bytestring(&err, dev, user_lr, OPAL_UID_LENGTH); in activate_lsp()
2275 add_token_u8(&err, dev, OPAL_ENDLIST); in activate_lsp()
2276 add_token_u8(&err, dev, OPAL_ENDNAME); in activate_lsp()
2284 return finalize_and_send(dev, parse_and_check_status); in activate_lsp()
2288 static int get_lsp_lifecycle(struct opal_dev *dev, void *data) in get_lsp_lifecycle() argument
2293 err = generic_get_column(dev, opaluid[OPAL_LOCKINGSP_UID], in get_lsp_lifecycle()
2298 lc_status = response_get_u64(&dev->parsed, 4); in get_lsp_lifecycle()
2309 static int get_msid_cpin_pin(struct opal_dev *dev, void *data) in get_msid_cpin_pin() argument
2315 err = generic_get_column(dev, opaluid[OPAL_C_PIN_MSID], OPAL_PIN); in get_msid_cpin_pin()
2319 strlen = response_get_string(&dev->parsed, 4, &msid_pin); in get_msid_cpin_pin()
2325 dev->prev_data = kmemdup(msid_pin, strlen, GFP_KERNEL); in get_msid_cpin_pin()
2326 if (!dev->prev_data) in get_msid_cpin_pin()
2329 dev->prev_d_len = strlen; in get_msid_cpin_pin()
2334 static int write_table_data(struct opal_dev *dev, void *data) in write_table_data() argument
2338 return generic_table_write_data(dev, write_tbl->data, write_tbl->offset, in write_table_data()
2342 static int read_table_data_cont(struct opal_dev *dev) in read_table_data_cont() argument
2347 err = parse_and_check_status(dev); in read_table_data_cont()
2351 dev->prev_d_len = response_get_string(&dev->parsed, 1, &data_read); in read_table_data_cont()
2352 dev->prev_data = (void *)data_read; in read_table_data_cont()
2353 if (!dev->prev_data) { in read_table_data_cont()
2370 static int read_table_data(struct opal_dev *dev, void *data) in read_table_data() argument
2379 err = generic_get_table_info(dev, read_tbl->table_uid, OPAL_TABLE_ROWS); in read_table_data()
2385 table_len = response_get_u64(&dev->parsed, 4); in read_table_data()
2395 err = cmd_start(dev, read_tbl->table_uid, opalmethod[OPAL_GET]); in read_table_data()
2397 add_token_u8(&err, dev, OPAL_STARTLIST); in read_table_data()
2398 add_token_u8(&err, dev, OPAL_STARTNAME); in read_table_data()
2399 add_token_u8(&err, dev, OPAL_STARTROW); in read_table_data()
2400 add_token_u64(&err, dev, offset + off); /* start row value */ in read_table_data()
2401 add_token_u8(&err, dev, OPAL_ENDNAME); in read_table_data()
2403 add_token_u8(&err, dev, OPAL_STARTNAME); in read_table_data()
2404 add_token_u8(&err, dev, OPAL_ENDROW); in read_table_data()
2407 add_token_u64(&err, dev, offset + off + len); /* end row value in read_table_data()
2409 add_token_u8(&err, dev, OPAL_ENDNAME); in read_table_data()
2410 add_token_u8(&err, dev, OPAL_ENDLIST); in read_table_data()
2417 err = finalize_and_send(dev, read_table_data_cont); in read_table_data()
2422 if (dev->prev_d_len > len + 1) { in read_table_data()
2428 if (copy_to_user(dst + off, dev->prev_data, dev->prev_d_len)) { in read_table_data()
2433 dev->prev_data = NULL; in read_table_data()
2441 static int end_opal_session(struct opal_dev *dev, void *data) in end_opal_session() argument
2445 clear_opal_cmd(dev); in end_opal_session()
2446 set_comid(dev, dev->comid); in end_opal_session()
2447 add_token_u8(&err, dev, OPAL_ENDOFSESSION); in end_opal_session()
2452 return finalize_and_send(dev, end_session_cont); in end_opal_session()
2455 static int end_opal_session_error(struct opal_dev *dev) in end_opal_session_error() argument
2461 return execute_step(dev, &error_end_session, 0); in end_opal_session_error()
2464 static inline void setup_opal_dev(struct opal_dev *dev) in setup_opal_dev() argument
2466 dev->tsn = 0; in setup_opal_dev()
2467 dev->hsn = 0; in setup_opal_dev()
2468 dev->prev_data = NULL; in setup_opal_dev()
2471 static int check_opal_support(struct opal_dev *dev) in check_opal_support() argument
2475 mutex_lock(&dev->dev_lock); in check_opal_support()
2476 setup_opal_dev(dev); in check_opal_support()
2477 ret = opal_discovery0_step(dev); in check_opal_support()
2479 dev->flags |= OPAL_FL_SUPPORTED; in check_opal_support()
2480 mutex_unlock(&dev->dev_lock); in check_opal_support()
2485 static void clean_opal_dev(struct opal_dev *dev) in clean_opal_dev() argument
2490 mutex_lock(&dev->dev_lock); in clean_opal_dev()
2491 list_for_each_entry_safe(suspend, next, &dev->unlk_lst, node) { in clean_opal_dev()
2495 mutex_unlock(&dev->dev_lock); in clean_opal_dev()
2498 void free_opal_dev(struct opal_dev *dev) in free_opal_dev() argument
2500 if (!dev) in free_opal_dev()
2503 clean_opal_dev(dev); in free_opal_dev()
2504 kfree(dev->resp); in free_opal_dev()
2505 kfree(dev->cmd); in free_opal_dev()
2506 kfree(dev); in free_opal_dev()
2512 struct opal_dev *dev; in init_opal_dev() local
2514 dev = kmalloc(sizeof(*dev), GFP_KERNEL); in init_opal_dev()
2515 if (!dev) in init_opal_dev()
2522 dev->cmd = kmalloc(IO_BUFFER_LENGTH, GFP_KERNEL); in init_opal_dev()
2523 if (!dev->cmd) in init_opal_dev()
2526 dev->resp = kmalloc(IO_BUFFER_LENGTH, GFP_KERNEL); in init_opal_dev()
2527 if (!dev->resp) in init_opal_dev()
2530 INIT_LIST_HEAD(&dev->unlk_lst); in init_opal_dev()
2531 mutex_init(&dev->dev_lock); in init_opal_dev()
2532 dev->flags = 0; in init_opal_dev()
2533 dev->data = data; in init_opal_dev()
2534 dev->send_recv = send_recv; in init_opal_dev()
2535 if (check_opal_support(dev) != 0) { in init_opal_dev()
2540 return dev; in init_opal_dev()
2543 kfree(dev->resp); in init_opal_dev()
2546 kfree(dev->cmd); in init_opal_dev()
2549 kfree(dev); in init_opal_dev()
2555 static int opal_secure_erase_locking_range(struct opal_dev *dev, in opal_secure_erase_locking_range() argument
2566 ret = opal_get_key(dev, &opal_session->opal_key); in opal_secure_erase_locking_range()
2569 mutex_lock(&dev->dev_lock); in opal_secure_erase_locking_range()
2570 setup_opal_dev(dev); in opal_secure_erase_locking_range()
2571 ret = execute_steps(dev, erase_steps, ARRAY_SIZE(erase_steps)); in opal_secure_erase_locking_range()
2572 mutex_unlock(&dev->dev_lock); in opal_secure_erase_locking_range()
2577 static int opal_get_discv(struct opal_dev *dev, struct opal_discovery *discv) in opal_get_discv() argument
2584 mutex_lock(&dev->dev_lock); in opal_get_discv()
2585 setup_opal_dev(dev); in opal_get_discv()
2586 ret = execute_step(dev, &discovery0_step, 0); in opal_get_discv()
2587 mutex_unlock(&dev->dev_lock); in opal_get_discv()
2593 static int opal_revertlsp(struct opal_dev *dev, struct opal_revert_lsp *rev) in opal_revertlsp() argument
2602 ret = opal_get_key(dev, &rev->key); in opal_revertlsp()
2605 mutex_lock(&dev->dev_lock); in opal_revertlsp()
2606 setup_opal_dev(dev); in opal_revertlsp()
2607 ret = execute_steps(dev, steps, ARRAY_SIZE(steps)); in opal_revertlsp()
2608 mutex_unlock(&dev->dev_lock); in opal_revertlsp()
2613 static int opal_erase_locking_range(struct opal_dev *dev, in opal_erase_locking_range() argument
2623 ret = opal_get_key(dev, &opal_session->opal_key); in opal_erase_locking_range()
2626 mutex_lock(&dev->dev_lock); in opal_erase_locking_range()
2627 setup_opal_dev(dev); in opal_erase_locking_range()
2628 ret = execute_steps(dev, erase_steps, ARRAY_SIZE(erase_steps)); in opal_erase_locking_range()
2629 mutex_unlock(&dev->dev_lock); in opal_erase_locking_range()
2634 static int opal_enable_disable_shadow_mbr(struct opal_dev *dev, in opal_enable_disable_shadow_mbr() argument
2654 ret = opal_get_key(dev, &opal_mbr->key); in opal_enable_disable_shadow_mbr()
2657 mutex_lock(&dev->dev_lock); in opal_enable_disable_shadow_mbr()
2658 setup_opal_dev(dev); in opal_enable_disable_shadow_mbr()
2659 ret = execute_steps(dev, mbr_steps, ARRAY_SIZE(mbr_steps)); in opal_enable_disable_shadow_mbr()
2660 mutex_unlock(&dev->dev_lock); in opal_enable_disable_shadow_mbr()
2665 static int opal_set_mbr_done(struct opal_dev *dev, in opal_set_mbr_done() argument
2682 ret = opal_get_key(dev, &mbr_done->key); in opal_set_mbr_done()
2685 mutex_lock(&dev->dev_lock); in opal_set_mbr_done()
2686 setup_opal_dev(dev); in opal_set_mbr_done()
2687 ret = execute_steps(dev, mbr_steps, ARRAY_SIZE(mbr_steps)); in opal_set_mbr_done()
2688 mutex_unlock(&dev->dev_lock); in opal_set_mbr_done()
2693 static int opal_write_shadow_mbr(struct opal_dev *dev, in opal_write_shadow_mbr() argument
2706 ret = opal_get_key(dev, &info->key); in opal_write_shadow_mbr()
2709 mutex_lock(&dev->dev_lock); in opal_write_shadow_mbr()
2710 setup_opal_dev(dev); in opal_write_shadow_mbr()
2711 ret = execute_steps(dev, mbr_steps, ARRAY_SIZE(mbr_steps)); in opal_write_shadow_mbr()
2712 mutex_unlock(&dev->dev_lock); in opal_write_shadow_mbr()
2717 static int opal_save(struct opal_dev *dev, struct opal_lock_unlock *lk_unlk) in opal_save() argument
2728 mutex_lock(&dev->dev_lock); in opal_save()
2729 setup_opal_dev(dev); in opal_save()
2730 add_suspend_info(dev, suspend); in opal_save()
2731 mutex_unlock(&dev->dev_lock); in opal_save()
2736 static int opal_add_user_to_lr(struct opal_dev *dev, in opal_add_user_to_lr() argument
2766 ret = opal_get_key(dev, &lk_unlk->session.opal_key); in opal_add_user_to_lr()
2769 mutex_lock(&dev->dev_lock); in opal_add_user_to_lr()
2770 setup_opal_dev(dev); in opal_add_user_to_lr()
2771 ret = execute_steps(dev, steps, ARRAY_SIZE(steps)); in opal_add_user_to_lr()
2772 mutex_unlock(&dev->dev_lock); in opal_add_user_to_lr()
2777 static int opal_reverttper(struct opal_dev *dev, struct opal_key *opal, bool psid) in opal_reverttper() argument
2791 ret = opal_get_key(dev, opal); in opal_reverttper()
2795 mutex_lock(&dev->dev_lock); in opal_reverttper()
2796 setup_opal_dev(dev); in opal_reverttper()
2798 ret = execute_steps(dev, psid_revert_steps, in opal_reverttper()
2801 ret = execute_steps(dev, revert_steps, in opal_reverttper()
2803 mutex_unlock(&dev->dev_lock); in opal_reverttper()
2810 clean_opal_dev(dev); in opal_reverttper()
2815 static int __opal_lock_unlock(struct opal_dev *dev, in __opal_lock_unlock() argument
2830 return execute_steps(dev, unlock_sum_steps, in __opal_lock_unlock()
2833 return execute_steps(dev, unlock_steps, in __opal_lock_unlock()
2837 static int __opal_set_mbr_done(struct opal_dev *dev, struct opal_key *key) in __opal_set_mbr_done() argument
2846 return execute_steps(dev, mbrdone_step, ARRAY_SIZE(mbrdone_step)); in __opal_set_mbr_done()
2849 static void opal_lock_check_for_saved_key(struct opal_dev *dev, in opal_lock_check_for_saved_key() argument
2872 setup_opal_dev(dev); in opal_lock_check_for_saved_key()
2873 list_for_each_entry(iter, &dev->unlk_lst, node) { in opal_lock_check_for_saved_key()
2887 static int opal_lock_unlock(struct opal_dev *dev, in opal_lock_unlock() argument
2895 mutex_lock(&dev->dev_lock); in opal_lock_unlock()
2896 opal_lock_check_for_saved_key(dev, lk_unlk); in opal_lock_unlock()
2897 ret = opal_get_key(dev, &lk_unlk->session.opal_key); in opal_lock_unlock()
2899 ret = __opal_lock_unlock(dev, lk_unlk); in opal_lock_unlock()
2900 mutex_unlock(&dev->dev_lock); in opal_lock_unlock()
2905 static int opal_take_ownership(struct opal_dev *dev, struct opal_key *opal) in opal_take_ownership() argument
2917 if (!dev) in opal_take_ownership()
2920 ret = opal_get_key(dev, opal); in opal_take_ownership()
2923 mutex_lock(&dev->dev_lock); in opal_take_ownership()
2924 setup_opal_dev(dev); in opal_take_ownership()
2925 ret = execute_steps(dev, owner_steps, ARRAY_SIZE(owner_steps)); in opal_take_ownership()
2926 mutex_unlock(&dev->dev_lock); in opal_take_ownership()
2931 static int opal_activate_lsp(struct opal_dev *dev, in opal_activate_lsp() argument
2945 ret = opal_get_key(dev, &opal_lr_act->key); in opal_activate_lsp()
2948 mutex_lock(&dev->dev_lock); in opal_activate_lsp()
2949 setup_opal_dev(dev); in opal_activate_lsp()
2950 ret = execute_steps(dev, active_steps, ARRAY_SIZE(active_steps)); in opal_activate_lsp()
2951 mutex_unlock(&dev->dev_lock); in opal_activate_lsp()
2956 static int opal_setup_locking_range(struct opal_dev *dev, in opal_setup_locking_range() argument
2966 ret = opal_get_key(dev, &opal_lrs->session.opal_key); in opal_setup_locking_range()
2969 mutex_lock(&dev->dev_lock); in opal_setup_locking_range()
2970 setup_opal_dev(dev); in opal_setup_locking_range()
2971 ret = execute_steps(dev, lr_steps, ARRAY_SIZE(lr_steps)); in opal_setup_locking_range()
2972 mutex_unlock(&dev->dev_lock); in opal_setup_locking_range()
2977 static int opal_locking_range_status(struct opal_dev *dev, in opal_locking_range_status() argument
2988 mutex_lock(&dev->dev_lock); in opal_locking_range_status()
2989 setup_opal_dev(dev); in opal_locking_range_status()
2990 ret = execute_steps(dev, lr_steps, ARRAY_SIZE(lr_steps)); in opal_locking_range_status()
2991 mutex_unlock(&dev->dev_lock); in opal_locking_range_status()
3004 static int opal_set_new_pw(struct opal_dev *dev, struct opal_new_pw *opal_pw) in opal_set_new_pw() argument
3017 mutex_lock(&dev->dev_lock); in opal_set_new_pw()
3018 setup_opal_dev(dev); in opal_set_new_pw()
3019 ret = execute_steps(dev, pw_steps, ARRAY_SIZE(pw_steps)); in opal_set_new_pw()
3020 mutex_unlock(&dev->dev_lock); in opal_set_new_pw()
3033 static int opal_activate_user(struct opal_dev *dev, in opal_activate_user() argument
3050 ret = opal_get_key(dev, &opal_session->opal_key); in opal_activate_user()
3053 mutex_lock(&dev->dev_lock); in opal_activate_user()
3054 setup_opal_dev(dev); in opal_activate_user()
3055 ret = execute_steps(dev, act_steps, ARRAY_SIZE(act_steps)); in opal_activate_user()
3056 mutex_unlock(&dev->dev_lock); in opal_activate_user()
3061 bool opal_unlock_from_suspend(struct opal_dev *dev) in opal_unlock_from_suspend() argument
3067 if (!dev) in opal_unlock_from_suspend()
3070 if (!(dev->flags & OPAL_FL_SUPPORTED)) in opal_unlock_from_suspend()
3073 mutex_lock(&dev->dev_lock); in opal_unlock_from_suspend()
3074 setup_opal_dev(dev); in opal_unlock_from_suspend()
3076 list_for_each_entry(suspend, &dev->unlk_lst, node) { in opal_unlock_from_suspend()
3077 dev->tsn = 0; in opal_unlock_from_suspend()
3078 dev->hsn = 0; in opal_unlock_from_suspend()
3080 ret = __opal_lock_unlock(dev, &suspend->unlk); in opal_unlock_from_suspend()
3088 if (dev->flags & OPAL_FL_MBR_ENABLED) { in opal_unlock_from_suspend()
3089 ret = __opal_set_mbr_done(dev, &suspend->unlk.session.opal_key); in opal_unlock_from_suspend()
3094 mutex_unlock(&dev->dev_lock); in opal_unlock_from_suspend()
3100 static int opal_read_table(struct opal_dev *dev, in opal_read_table() argument
3113 return execute_steps(dev, read_table_steps, in opal_read_table()
3117 static int opal_write_table(struct opal_dev *dev, in opal_write_table() argument
3130 return execute_steps(dev, write_table_steps, in opal_write_table()
3134 static int opal_generic_read_write_table(struct opal_dev *dev, in opal_generic_read_write_table() argument
3139 ret = opal_get_key(dev, &rw_tbl->key); in opal_generic_read_write_table()
3142 mutex_lock(&dev->dev_lock); in opal_generic_read_write_table()
3143 setup_opal_dev(dev); in opal_generic_read_write_table()
3148 ret = opal_read_table(dev, rw_tbl); in opal_generic_read_write_table()
3151 ret = opal_write_table(dev, rw_tbl); in opal_generic_read_write_table()
3160 mutex_unlock(&dev->dev_lock); in opal_generic_read_write_table()
3165 static int opal_get_status(struct opal_dev *dev, void __user *data) in opal_get_status() argument
3173 if (!check_opal_support(dev)) in opal_get_status()
3174 sts.flags = dev->flags; in opal_get_status()
3182 static int opal_get_geometry(struct opal_dev *dev, void __user *data) in opal_get_geometry() argument
3186 if (check_opal_support(dev)) in opal_get_geometry()
3189 geo.align = dev->align_required; in opal_get_geometry()
3190 geo.logical_block_size = dev->logical_block_size; in opal_get_geometry()
3191 geo.alignment_granularity = dev->align; in opal_get_geometry()
3192 geo.lowest_aligned_lba = dev->lowest_lba; in opal_get_geometry()
3202 int sed_ioctl(struct opal_dev *dev, unsigned int cmd, void __user *arg) in sed_ioctl() argument
3209 if (!dev) in sed_ioctl()
3211 if (!(dev->flags & OPAL_FL_SUPPORTED)) in sed_ioctl()
3222 ret = opal_save(dev, p); in sed_ioctl()
3225 ret = opal_lock_unlock(dev, p); in sed_ioctl()
3228 ret = opal_take_ownership(dev, p); in sed_ioctl()
3231 ret = opal_activate_lsp(dev, p); in sed_ioctl()
3234 ret = opal_set_new_pw(dev, p); in sed_ioctl()
3237 ret = opal_activate_user(dev, p); in sed_ioctl()
3240 ret = opal_reverttper(dev, p, false); in sed_ioctl()
3243 ret = opal_setup_locking_range(dev, p); in sed_ioctl()
3246 ret = opal_add_user_to_lr(dev, p); in sed_ioctl()
3249 ret = opal_enable_disable_shadow_mbr(dev, p); in sed_ioctl()
3252 ret = opal_set_mbr_done(dev, p); in sed_ioctl()
3255 ret = opal_write_shadow_mbr(dev, p); in sed_ioctl()
3258 ret = opal_erase_locking_range(dev, p); in sed_ioctl()
3261 ret = opal_secure_erase_locking_range(dev, p); in sed_ioctl()
3264 ret = opal_reverttper(dev, p, true); in sed_ioctl()
3267 ret = opal_generic_read_write_table(dev, p); in sed_ioctl()
3270 ret = opal_get_status(dev, arg); in sed_ioctl()
3273 ret = opal_locking_range_status(dev, p, arg); in sed_ioctl()
3276 ret = opal_get_geometry(dev, arg); in sed_ioctl()
3279 ret = opal_revertlsp(dev, p); in sed_ioctl()
3282 ret = opal_get_discv(dev, p); in sed_ioctl()