• Home
  • Raw
  • Download

Lines Matching refs:dev

33 	int (*fn)(struct opal_dev *dev, void *data);
36 typedef int (cont_fn)(struct opal_dev *dev);
214 static int end_opal_session_error(struct opal_dev *dev);
215 static int opal_discovery0_step(struct opal_dev *dev);
320 static int opal_send_cmd(struct opal_dev *dev) in opal_send_cmd() argument
322 return dev->send_recv(dev->data, dev->comid, TCG_SECP_01, in opal_send_cmd()
323 dev->cmd, IO_BUFFER_LENGTH, in opal_send_cmd()
327 static int opal_recv_cmd(struct opal_dev *dev) in opal_recv_cmd() argument
329 return dev->send_recv(dev->data, dev->comid, TCG_SECP_01, in opal_recv_cmd()
330 dev->resp, IO_BUFFER_LENGTH, in opal_recv_cmd()
334 static int opal_recv_check(struct opal_dev *dev) in opal_recv_check() argument
337 void *buffer = dev->resp; in opal_recv_check()
351 ret = opal_recv_cmd(dev); in opal_recv_check()
357 static int opal_send_recv(struct opal_dev *dev, cont_fn *cont) in opal_send_recv() argument
361 ret = opal_send_cmd(dev); in opal_send_recv()
364 ret = opal_recv_cmd(dev); in opal_send_recv()
367 ret = opal_recv_check(dev); in opal_send_recv()
370 return cont(dev); in opal_send_recv()
373 static void check_geometry(struct opal_dev *dev, const void *data) in check_geometry() argument
377 dev->align = be64_to_cpu(geo->alignment_granularity); in check_geometry()
378 dev->lowest_lba = be64_to_cpu(geo->lowest_aligned_lba); in check_geometry()
381 static int execute_step(struct opal_dev *dev, in execute_step() argument
384 int error = step->fn(dev, step->data); in execute_step()
395 static int execute_steps(struct opal_dev *dev, in execute_steps() argument
402 error = opal_discovery0_step(dev); in execute_steps()
407 error = execute_step(dev, &steps[state], state); in execute_steps()
424 end_opal_session_error(dev); in execute_steps()
429 static int opal_discovery0_end(struct opal_dev *dev) in opal_discovery0_end() argument
432 const struct d0_header *hdr = (struct d0_header *)dev->resp; in opal_discovery0_end()
433 const u8 *epos = dev->resp, *cpos = dev->resp; in opal_discovery0_end()
437 print_buffer(dev->resp, hlen); in opal_discovery0_end()
438 dev->mbr_enabled = false; in opal_discovery0_end()
461 check_geometry(dev, body); in opal_discovery0_end()
464 dev->mbr_enabled = check_mbrenabled(body->features); in opal_discovery0_end()
505 dev->comid = comid; in opal_discovery0_end()
510 static int opal_discovery0(struct opal_dev *dev, void *data) in opal_discovery0() argument
514 memset(dev->resp, 0, IO_BUFFER_LENGTH); in opal_discovery0()
515 dev->comid = OPAL_DISCOVERY_COMID; in opal_discovery0()
516 ret = opal_recv_cmd(dev); in opal_discovery0()
520 return opal_discovery0_end(dev); in opal_discovery0()
523 static int opal_discovery0_step(struct opal_dev *dev) in opal_discovery0_step() argument
529 return execute_step(dev, &discovery0_step, 0); in opal_discovery0_step()
1005 static int parse_and_check_status(struct opal_dev *dev) in parse_and_check_status() argument
1009 print_buffer(dev->cmd, dev->pos); in parse_and_check_status()
1011 error = response_parse(dev->resp, IO_BUFFER_LENGTH, &dev->parsed); in parse_and_check_status()
1017 return response_status(&dev->parsed); in parse_and_check_status()
1020 static void clear_opal_cmd(struct opal_dev *dev) in clear_opal_cmd() argument
1022 dev->pos = sizeof(struct opal_header); in clear_opal_cmd()
1023 memset(dev->cmd, 0, IO_BUFFER_LENGTH); in clear_opal_cmd()
1026 static int cmd_start(struct opal_dev *dev, const u8 *uid, const u8 *method) in cmd_start() argument
1030 clear_opal_cmd(dev); in cmd_start()
1031 set_comid(dev, dev->comid); in cmd_start()
1033 add_token_u8(&err, dev, OPAL_CALL); in cmd_start()
1034 add_token_bytestring(&err, dev, uid, OPAL_UID_LENGTH); in cmd_start()
1035 add_token_bytestring(&err, dev, method, OPAL_METHOD_LENGTH); in cmd_start()
1042 add_token_u8(&err, dev, OPAL_STARTLIST); in cmd_start()
1047 static int start_opal_session_cont(struct opal_dev *dev) in start_opal_session_cont() argument
1052 error = parse_and_check_status(dev); in start_opal_session_cont()
1056 hsn = response_get_u64(&dev->parsed, 4); in start_opal_session_cont()
1057 tsn = response_get_u64(&dev->parsed, 5); in start_opal_session_cont()
1064 dev->hsn = hsn; in start_opal_session_cont()
1065 dev->tsn = tsn; in start_opal_session_cont()
1070 static void add_suspend_info(struct opal_dev *dev, in add_suspend_info() argument
1075 list_for_each_entry(iter, &dev->unlk_lst, node) { in add_suspend_info()
1082 list_add_tail(&sus->node, &dev->unlk_lst); in add_suspend_info()
1085 static int end_session_cont(struct opal_dev *dev) in end_session_cont() argument
1087 dev->hsn = 0; in end_session_cont()
1088 dev->tsn = 0; in end_session_cont()
1090 return parse_and_check_status(dev); in end_session_cont()
1093 static int finalize_and_send(struct opal_dev *dev, cont_fn cont) in finalize_and_send() argument
1097 ret = cmd_finalize(dev, dev->hsn, dev->tsn); in finalize_and_send()
1103 print_buffer(dev->cmd, dev->pos); in finalize_and_send()
1105 return opal_send_recv(dev, cont); in finalize_and_send()
1112 static int generic_get_column(struct opal_dev *dev, const u8 *table, in generic_get_column() argument
1117 err = cmd_start(dev, table, opalmethod[OPAL_GET]); in generic_get_column()
1119 add_token_u8(&err, dev, OPAL_STARTLIST); in generic_get_column()
1121 add_token_u8(&err, dev, OPAL_STARTNAME); in generic_get_column()
1122 add_token_u8(&err, dev, OPAL_STARTCOLUMN); in generic_get_column()
1123 add_token_u64(&err, dev, column); in generic_get_column()
1124 add_token_u8(&err, dev, OPAL_ENDNAME); in generic_get_column()
1126 add_token_u8(&err, dev, OPAL_STARTNAME); in generic_get_column()
1127 add_token_u8(&err, dev, OPAL_ENDCOLUMN); in generic_get_column()
1128 add_token_u64(&err, dev, column); in generic_get_column()
1129 add_token_u8(&err, dev, OPAL_ENDNAME); in generic_get_column()
1131 add_token_u8(&err, dev, OPAL_ENDLIST); in generic_get_column()
1136 return finalize_and_send(dev, parse_and_check_status); in generic_get_column()
1144 static int generic_get_table_info(struct opal_dev *dev, const u8 *table_uid, in generic_get_table_info() argument
1159 return generic_get_column(dev, uid, column); in generic_get_table_info()
1162 static int gen_key(struct opal_dev *dev, void *data) in gen_key() argument
1167 memcpy(uid, dev->prev_data, min(sizeof(uid), dev->prev_d_len)); in gen_key()
1168 kfree(dev->prev_data); in gen_key()
1169 dev->prev_data = NULL; in gen_key()
1171 err = cmd_start(dev, uid, opalmethod[OPAL_GENKEY]); in gen_key()
1179 return finalize_and_send(dev, parse_and_check_status); in gen_key()
1182 static int get_active_key_cont(struct opal_dev *dev) in get_active_key_cont() argument
1188 error = parse_and_check_status(dev); in get_active_key_cont()
1192 keylen = response_get_string(&dev->parsed, 4, &activekey); in get_active_key_cont()
1199 dev->prev_data = kmemdup(activekey, keylen, GFP_KERNEL); in get_active_key_cont()
1201 if (!dev->prev_data) in get_active_key_cont()
1204 dev->prev_d_len = keylen; in get_active_key_cont()
1209 static int get_active_key(struct opal_dev *dev, void *data) in get_active_key() argument
1219 err = generic_get_column(dev, uid, OPAL_ACTIVEKEY); in get_active_key()
1223 return get_active_key_cont(dev); in get_active_key()
1226 static int generic_table_write_data(struct opal_dev *dev, const u64 data, in generic_table_write_data() argument
1236 err = generic_get_table_info(dev, uid, OPAL_TABLE_ROWS); in generic_table_write_data()
1242 len = response_get_u64(&dev->parsed, 4); in generic_table_write_data()
1251 err = cmd_start(dev, uid, opalmethod[OPAL_SET]); in generic_table_write_data()
1252 add_token_u8(&err, dev, OPAL_STARTNAME); in generic_table_write_data()
1253 add_token_u8(&err, dev, OPAL_WHERE); in generic_table_write_data()
1254 add_token_u64(&err, dev, offset + off); in generic_table_write_data()
1255 add_token_u8(&err, dev, OPAL_ENDNAME); in generic_table_write_data()
1257 add_token_u8(&err, dev, OPAL_STARTNAME); in generic_table_write_data()
1258 add_token_u8(&err, dev, OPAL_VALUES); in generic_table_write_data()
1266 len = min(remaining_size(dev) - (2+1+CMD_FINALIZE_BYTES_NEEDED), in generic_table_write_data()
1270 dst = add_bytestring_header(&err, dev, len); in generic_table_write_data()
1279 dev->pos += len; in generic_table_write_data()
1281 add_token_u8(&err, dev, OPAL_ENDNAME); in generic_table_write_data()
1285 err = finalize_and_send(dev, parse_and_check_status); in generic_table_write_data()
1295 static int generic_lr_enable_disable(struct opal_dev *dev, in generic_lr_enable_disable() argument
1301 err = cmd_start(dev, uid, opalmethod[OPAL_SET]); in generic_lr_enable_disable()
1303 add_token_u8(&err, dev, OPAL_STARTNAME); in generic_lr_enable_disable()
1304 add_token_u8(&err, dev, OPAL_VALUES); in generic_lr_enable_disable()
1305 add_token_u8(&err, dev, OPAL_STARTLIST); in generic_lr_enable_disable()
1307 add_token_u8(&err, dev, OPAL_STARTNAME); in generic_lr_enable_disable()
1308 add_token_u8(&err, dev, OPAL_READLOCKENABLED); in generic_lr_enable_disable()
1309 add_token_u8(&err, dev, rle); in generic_lr_enable_disable()
1310 add_token_u8(&err, dev, OPAL_ENDNAME); in generic_lr_enable_disable()
1312 add_token_u8(&err, dev, OPAL_STARTNAME); in generic_lr_enable_disable()
1313 add_token_u8(&err, dev, OPAL_WRITELOCKENABLED); in generic_lr_enable_disable()
1314 add_token_u8(&err, dev, wle); in generic_lr_enable_disable()
1315 add_token_u8(&err, dev, OPAL_ENDNAME); in generic_lr_enable_disable()
1317 add_token_u8(&err, dev, OPAL_STARTNAME); in generic_lr_enable_disable()
1318 add_token_u8(&err, dev, OPAL_READLOCKED); in generic_lr_enable_disable()
1319 add_token_u8(&err, dev, rl); in generic_lr_enable_disable()
1320 add_token_u8(&err, dev, OPAL_ENDNAME); in generic_lr_enable_disable()
1322 add_token_u8(&err, dev, OPAL_STARTNAME); in generic_lr_enable_disable()
1323 add_token_u8(&err, dev, OPAL_WRITELOCKED); in generic_lr_enable_disable()
1324 add_token_u8(&err, dev, wl); in generic_lr_enable_disable()
1325 add_token_u8(&err, dev, OPAL_ENDNAME); in generic_lr_enable_disable()
1327 add_token_u8(&err, dev, OPAL_ENDLIST); in generic_lr_enable_disable()
1328 add_token_u8(&err, dev, OPAL_ENDNAME); in generic_lr_enable_disable()
1333 static inline int enable_global_lr(struct opal_dev *dev, u8 *uid, in enable_global_lr() argument
1338 err = generic_lr_enable_disable(dev, uid, !!setup->RLE, !!setup->WLE, in enable_global_lr()
1346 static int setup_locking_range(struct opal_dev *dev, void *data) in setup_locking_range() argument
1359 err = enable_global_lr(dev, uid, setup); in setup_locking_range()
1361 err = cmd_start(dev, uid, opalmethod[OPAL_SET]); in setup_locking_range()
1363 add_token_u8(&err, dev, OPAL_STARTNAME); in setup_locking_range()
1364 add_token_u8(&err, dev, OPAL_VALUES); in setup_locking_range()
1365 add_token_u8(&err, dev, OPAL_STARTLIST); in setup_locking_range()
1367 add_token_u8(&err, dev, OPAL_STARTNAME); in setup_locking_range()
1368 add_token_u8(&err, dev, OPAL_RANGESTART); in setup_locking_range()
1369 add_token_u64(&err, dev, setup->range_start); in setup_locking_range()
1370 add_token_u8(&err, dev, OPAL_ENDNAME); in setup_locking_range()
1372 add_token_u8(&err, dev, OPAL_STARTNAME); in setup_locking_range()
1373 add_token_u8(&err, dev, OPAL_RANGELENGTH); in setup_locking_range()
1374 add_token_u64(&err, dev, setup->range_length); in setup_locking_range()
1375 add_token_u8(&err, dev, OPAL_ENDNAME); in setup_locking_range()
1377 add_token_u8(&err, dev, OPAL_STARTNAME); in setup_locking_range()
1378 add_token_u8(&err, dev, OPAL_READLOCKENABLED); in setup_locking_range()
1379 add_token_u64(&err, dev, !!setup->RLE); in setup_locking_range()
1380 add_token_u8(&err, dev, OPAL_ENDNAME); in setup_locking_range()
1382 add_token_u8(&err, dev, OPAL_STARTNAME); in setup_locking_range()
1383 add_token_u8(&err, dev, OPAL_WRITELOCKENABLED); in setup_locking_range()
1384 add_token_u64(&err, dev, !!setup->WLE); in setup_locking_range()
1385 add_token_u8(&err, dev, OPAL_ENDNAME); in setup_locking_range()
1387 add_token_u8(&err, dev, OPAL_ENDLIST); in setup_locking_range()
1388 add_token_u8(&err, dev, OPAL_ENDNAME); in setup_locking_range()
1395 return finalize_and_send(dev, parse_and_check_status); in setup_locking_range()
1398 static int start_generic_opal_session(struct opal_dev *dev, in start_generic_opal_session() argument
1411 err = cmd_start(dev, opaluid[OPAL_SMUID_UID], in start_generic_opal_session()
1414 add_token_u64(&err, dev, hsn); in start_generic_opal_session()
1415 add_token_bytestring(&err, dev, opaluid[sp_type], OPAL_UID_LENGTH); in start_generic_opal_session()
1416 add_token_u8(&err, dev, 1); in start_generic_opal_session()
1424 add_token_u8(&err, dev, OPAL_STARTNAME); in start_generic_opal_session()
1425 add_token_u8(&err, dev, 0); /* HostChallenge */ in start_generic_opal_session()
1426 add_token_bytestring(&err, dev, key, key_len); in start_generic_opal_session()
1427 add_token_u8(&err, dev, OPAL_ENDNAME); in start_generic_opal_session()
1428 add_token_u8(&err, dev, OPAL_STARTNAME); in start_generic_opal_session()
1429 add_token_u8(&err, dev, 3); /* HostSignAuth */ in start_generic_opal_session()
1430 add_token_bytestring(&err, dev, opaluid[auth], in start_generic_opal_session()
1432 add_token_u8(&err, dev, OPAL_ENDNAME); in start_generic_opal_session()
1444 return finalize_and_send(dev, start_opal_session_cont); in start_generic_opal_session()
1447 static int start_anybodyASP_opal_session(struct opal_dev *dev, void *data) in start_anybodyASP_opal_session() argument
1449 return start_generic_opal_session(dev, OPAL_ANYBODY_UID, in start_anybodyASP_opal_session()
1453 static int start_SIDASP_opal_session(struct opal_dev *dev, void *data) in start_SIDASP_opal_session() argument
1456 const u8 *key = dev->prev_data; in start_SIDASP_opal_session()
1461 ret = start_generic_opal_session(dev, OPAL_SID_UID, in start_SIDASP_opal_session()
1466 ret = start_generic_opal_session(dev, OPAL_SID_UID, in start_SIDASP_opal_session()
1468 key, dev->prev_d_len); in start_SIDASP_opal_session()
1470 dev->prev_data = NULL; in start_SIDASP_opal_session()
1476 static int start_admin1LSP_opal_session(struct opal_dev *dev, void *data) in start_admin1LSP_opal_session() argument
1480 return start_generic_opal_session(dev, OPAL_ADMIN1_UID, in start_admin1LSP_opal_session()
1485 static int start_PSID_opal_session(struct opal_dev *dev, void *data) in start_PSID_opal_session() argument
1489 return start_generic_opal_session(dev, OPAL_PSID_UID, in start_PSID_opal_session()
1495 static int start_auth_opal_session(struct opal_dev *dev, void *data) in start_auth_opal_session() argument
1517 err = cmd_start(dev, opaluid[OPAL_SMUID_UID], in start_auth_opal_session()
1520 add_token_u64(&err, dev, hsn); in start_auth_opal_session()
1521 add_token_bytestring(&err, dev, opaluid[OPAL_LOCKINGSP_UID], in start_auth_opal_session()
1523 add_token_u8(&err, dev, 1); in start_auth_opal_session()
1524 add_token_u8(&err, dev, OPAL_STARTNAME); in start_auth_opal_session()
1525 add_token_u8(&err, dev, 0); in start_auth_opal_session()
1526 add_token_bytestring(&err, dev, key, keylen); in start_auth_opal_session()
1527 add_token_u8(&err, dev, OPAL_ENDNAME); in start_auth_opal_session()
1528 add_token_u8(&err, dev, OPAL_STARTNAME); in start_auth_opal_session()
1529 add_token_u8(&err, dev, 3); in start_auth_opal_session()
1530 add_token_bytestring(&err, dev, lk_ul_user, OPAL_UID_LENGTH); in start_auth_opal_session()
1531 add_token_u8(&err, dev, OPAL_ENDNAME); in start_auth_opal_session()
1538 return finalize_and_send(dev, start_opal_session_cont); in start_auth_opal_session()
1541 static int revert_tper(struct opal_dev *dev, void *data) in revert_tper() argument
1545 err = cmd_start(dev, opaluid[OPAL_ADMINSP_UID], in revert_tper()
1552 return finalize_and_send(dev, parse_and_check_status); in revert_tper()
1555 static int internal_activate_user(struct opal_dev *dev, void *data) in internal_activate_user() argument
1564 err = cmd_start(dev, uid, opalmethod[OPAL_SET]); in internal_activate_user()
1565 add_token_u8(&err, dev, OPAL_STARTNAME); in internal_activate_user()
1566 add_token_u8(&err, dev, OPAL_VALUES); in internal_activate_user()
1567 add_token_u8(&err, dev, OPAL_STARTLIST); in internal_activate_user()
1568 add_token_u8(&err, dev, OPAL_STARTNAME); in internal_activate_user()
1569 add_token_u8(&err, dev, 5); /* Enabled */ in internal_activate_user()
1570 add_token_u8(&err, dev, OPAL_TRUE); in internal_activate_user()
1571 add_token_u8(&err, dev, OPAL_ENDNAME); in internal_activate_user()
1572 add_token_u8(&err, dev, OPAL_ENDLIST); in internal_activate_user()
1573 add_token_u8(&err, dev, OPAL_ENDNAME); in internal_activate_user()
1580 return finalize_and_send(dev, parse_and_check_status); in internal_activate_user()
1583 static int erase_locking_range(struct opal_dev *dev, void *data) in erase_locking_range() argument
1592 err = cmd_start(dev, uid, opalmethod[OPAL_ERASE]); in erase_locking_range()
1599 return finalize_and_send(dev, parse_and_check_status); in erase_locking_range()
1602 static int set_mbr_done(struct opal_dev *dev, void *data) in set_mbr_done() argument
1607 err = cmd_start(dev, opaluid[OPAL_MBRCONTROL], in set_mbr_done()
1610 add_token_u8(&err, dev, OPAL_STARTNAME); in set_mbr_done()
1611 add_token_u8(&err, dev, OPAL_VALUES); in set_mbr_done()
1612 add_token_u8(&err, dev, OPAL_STARTLIST); in set_mbr_done()
1613 add_token_u8(&err, dev, OPAL_STARTNAME); in set_mbr_done()
1614 add_token_u8(&err, dev, OPAL_MBRDONE); in set_mbr_done()
1615 add_token_u8(&err, dev, *mbr_done_tf); /* Done T or F */ in set_mbr_done()
1616 add_token_u8(&err, dev, OPAL_ENDNAME); in set_mbr_done()
1617 add_token_u8(&err, dev, OPAL_ENDLIST); in set_mbr_done()
1618 add_token_u8(&err, dev, OPAL_ENDNAME); in set_mbr_done()
1625 return finalize_and_send(dev, parse_and_check_status); in set_mbr_done()
1628 static int set_mbr_enable_disable(struct opal_dev *dev, void *data) in set_mbr_enable_disable() argument
1633 err = cmd_start(dev, opaluid[OPAL_MBRCONTROL], in set_mbr_enable_disable()
1636 add_token_u8(&err, dev, OPAL_STARTNAME); in set_mbr_enable_disable()
1637 add_token_u8(&err, dev, OPAL_VALUES); in set_mbr_enable_disable()
1638 add_token_u8(&err, dev, OPAL_STARTLIST); in set_mbr_enable_disable()
1639 add_token_u8(&err, dev, OPAL_STARTNAME); in set_mbr_enable_disable()
1640 add_token_u8(&err, dev, OPAL_MBRENABLE); in set_mbr_enable_disable()
1641 add_token_u8(&err, dev, *mbr_en_dis); in set_mbr_enable_disable()
1642 add_token_u8(&err, dev, OPAL_ENDNAME); in set_mbr_enable_disable()
1643 add_token_u8(&err, dev, OPAL_ENDLIST); in set_mbr_enable_disable()
1644 add_token_u8(&err, dev, OPAL_ENDNAME); in set_mbr_enable_disable()
1651 return finalize_and_send(dev, parse_and_check_status); in set_mbr_enable_disable()
1654 static int write_shadow_mbr(struct opal_dev *dev, void *data) in write_shadow_mbr() argument
1658 return generic_table_write_data(dev, shadow->data, shadow->offset, in write_shadow_mbr()
1663 struct opal_dev *dev) in generic_pw_cmd() argument
1667 err = cmd_start(dev, cpin_uid, opalmethod[OPAL_SET]); in generic_pw_cmd()
1669 add_token_u8(&err, dev, OPAL_STARTNAME); in generic_pw_cmd()
1670 add_token_u8(&err, dev, OPAL_VALUES); in generic_pw_cmd()
1671 add_token_u8(&err, dev, OPAL_STARTLIST); in generic_pw_cmd()
1672 add_token_u8(&err, dev, OPAL_STARTNAME); in generic_pw_cmd()
1673 add_token_u8(&err, dev, OPAL_PIN); in generic_pw_cmd()
1674 add_token_bytestring(&err, dev, key, key_len); in generic_pw_cmd()
1675 add_token_u8(&err, dev, OPAL_ENDNAME); in generic_pw_cmd()
1676 add_token_u8(&err, dev, OPAL_ENDLIST); in generic_pw_cmd()
1677 add_token_u8(&err, dev, OPAL_ENDNAME); in generic_pw_cmd()
1682 static int set_new_pw(struct opal_dev *dev, void *data) in set_new_pw() argument
1698 cpin_uid, dev)) { in set_new_pw()
1703 return finalize_and_send(dev, parse_and_check_status); in set_new_pw()
1706 static int set_sid_cpin_pin(struct opal_dev *dev, void *data) in set_sid_cpin_pin() argument
1713 if (generic_pw_cmd(key->key, key->key_len, cpin_uid, dev)) { in set_sid_cpin_pin()
1717 return finalize_and_send(dev, parse_and_check_status); in set_sid_cpin_pin()
1720 static int add_user_to_lr(struct opal_dev *dev, void *data) in add_user_to_lr() argument
1740 err = cmd_start(dev, lr_buffer, opalmethod[OPAL_SET]); in add_user_to_lr()
1742 add_token_u8(&err, dev, OPAL_STARTNAME); in add_user_to_lr()
1743 add_token_u8(&err, dev, OPAL_VALUES); in add_user_to_lr()
1745 add_token_u8(&err, dev, OPAL_STARTLIST); in add_user_to_lr()
1746 add_token_u8(&err, dev, OPAL_STARTNAME); in add_user_to_lr()
1747 add_token_u8(&err, dev, 3); in add_user_to_lr()
1749 add_token_u8(&err, dev, OPAL_STARTLIST); in add_user_to_lr()
1752 add_token_u8(&err, dev, OPAL_STARTNAME); in add_user_to_lr()
1753 add_token_bytestring(&err, dev, in add_user_to_lr()
1756 add_token_bytestring(&err, dev, user_uid, OPAL_UID_LENGTH); in add_user_to_lr()
1757 add_token_u8(&err, dev, OPAL_ENDNAME); in add_user_to_lr()
1760 add_token_u8(&err, dev, OPAL_STARTNAME); in add_user_to_lr()
1761 add_token_bytestring(&err, dev, in add_user_to_lr()
1764 add_token_bytestring(&err, dev, user_uid, OPAL_UID_LENGTH); in add_user_to_lr()
1765 add_token_u8(&err, dev, OPAL_ENDNAME); in add_user_to_lr()
1768 add_token_u8(&err, dev, OPAL_STARTNAME); in add_user_to_lr()
1769 add_token_bytestring(&err, dev, opaluid[OPAL_HALF_UID_BOOLEAN_ACE], in add_user_to_lr()
1771 add_token_u8(&err, dev, 1); in add_user_to_lr()
1772 add_token_u8(&err, dev, OPAL_ENDNAME); in add_user_to_lr()
1775 add_token_u8(&err, dev, OPAL_ENDLIST); in add_user_to_lr()
1776 add_token_u8(&err, dev, OPAL_ENDNAME); in add_user_to_lr()
1777 add_token_u8(&err, dev, OPAL_ENDLIST); in add_user_to_lr()
1778 add_token_u8(&err, dev, OPAL_ENDNAME); in add_user_to_lr()
1785 return finalize_and_send(dev, parse_and_check_status); in add_user_to_lr()
1788 static int lock_unlock_locking_range(struct opal_dev *dev, void *data) in lock_unlock_locking_range() argument
1816 err = cmd_start(dev, lr_buffer, opalmethod[OPAL_SET]); in lock_unlock_locking_range()
1818 add_token_u8(&err, dev, OPAL_STARTNAME); in lock_unlock_locking_range()
1819 add_token_u8(&err, dev, OPAL_VALUES); in lock_unlock_locking_range()
1820 add_token_u8(&err, dev, OPAL_STARTLIST); in lock_unlock_locking_range()
1822 add_token_u8(&err, dev, OPAL_STARTNAME); in lock_unlock_locking_range()
1823 add_token_u8(&err, dev, OPAL_READLOCKED); in lock_unlock_locking_range()
1824 add_token_u8(&err, dev, read_locked); in lock_unlock_locking_range()
1825 add_token_u8(&err, dev, OPAL_ENDNAME); in lock_unlock_locking_range()
1827 add_token_u8(&err, dev, OPAL_STARTNAME); in lock_unlock_locking_range()
1828 add_token_u8(&err, dev, OPAL_WRITELOCKED); in lock_unlock_locking_range()
1829 add_token_u8(&err, dev, write_locked); in lock_unlock_locking_range()
1830 add_token_u8(&err, dev, OPAL_ENDNAME); in lock_unlock_locking_range()
1832 add_token_u8(&err, dev, OPAL_ENDLIST); in lock_unlock_locking_range()
1833 add_token_u8(&err, dev, OPAL_ENDNAME); in lock_unlock_locking_range()
1840 return finalize_and_send(dev, parse_and_check_status); in lock_unlock_locking_range()
1844 static int lock_unlock_locking_range_sum(struct opal_dev *dev, void *data) in lock_unlock_locking_range_sum() argument
1851 clear_opal_cmd(dev); in lock_unlock_locking_range_sum()
1852 set_comid(dev, dev->comid); in lock_unlock_locking_range_sum()
1874 ret = generic_lr_enable_disable(dev, lr_buffer, 1, 1, in lock_unlock_locking_range_sum()
1882 return finalize_and_send(dev, parse_and_check_status); in lock_unlock_locking_range_sum()
1885 static int activate_lsp(struct opal_dev *dev, void *data) in activate_lsp() argument
1891 err = cmd_start(dev, opaluid[OPAL_LOCKINGSP_UID], in activate_lsp()
1900 add_token_u8(&err, dev, OPAL_STARTNAME); in activate_lsp()
1901 add_token_u64(&err, dev, OPAL_SUM_SET_LIST); in activate_lsp()
1903 add_token_u8(&err, dev, OPAL_STARTLIST); in activate_lsp()
1904 add_token_bytestring(&err, dev, user_lr, OPAL_UID_LENGTH); in activate_lsp()
1907 add_token_bytestring(&err, dev, user_lr, OPAL_UID_LENGTH); in activate_lsp()
1909 add_token_u8(&err, dev, OPAL_ENDLIST); in activate_lsp()
1910 add_token_u8(&err, dev, OPAL_ENDNAME); in activate_lsp()
1918 return finalize_and_send(dev, parse_and_check_status); in activate_lsp()
1922 static int get_lsp_lifecycle(struct opal_dev *dev, void *data) in get_lsp_lifecycle() argument
1927 err = generic_get_column(dev, opaluid[OPAL_LOCKINGSP_UID], in get_lsp_lifecycle()
1932 lc_status = response_get_u64(&dev->parsed, 4); in get_lsp_lifecycle()
1943 static int get_msid_cpin_pin(struct opal_dev *dev, void *data) in get_msid_cpin_pin() argument
1949 err = generic_get_column(dev, opaluid[OPAL_C_PIN_MSID], OPAL_PIN); in get_msid_cpin_pin()
1953 strlen = response_get_string(&dev->parsed, 4, &msid_pin); in get_msid_cpin_pin()
1959 dev->prev_data = kmemdup(msid_pin, strlen, GFP_KERNEL); in get_msid_cpin_pin()
1960 if (!dev->prev_data) in get_msid_cpin_pin()
1963 dev->prev_d_len = strlen; in get_msid_cpin_pin()
1968 static int write_table_data(struct opal_dev *dev, void *data) in write_table_data() argument
1972 return generic_table_write_data(dev, write_tbl->data, write_tbl->offset, in write_table_data()
1976 static int read_table_data_cont(struct opal_dev *dev) in read_table_data_cont() argument
1981 err = parse_and_check_status(dev); in read_table_data_cont()
1985 dev->prev_d_len = response_get_string(&dev->parsed, 1, &data_read); in read_table_data_cont()
1986 dev->prev_data = (void *)data_read; in read_table_data_cont()
1987 if (!dev->prev_data) { in read_table_data_cont()
2004 static int read_table_data(struct opal_dev *dev, void *data) in read_table_data() argument
2013 err = generic_get_table_info(dev, read_tbl->table_uid, OPAL_TABLE_ROWS); in read_table_data()
2019 table_len = response_get_u64(&dev->parsed, 4); in read_table_data()
2029 err = cmd_start(dev, read_tbl->table_uid, opalmethod[OPAL_GET]); in read_table_data()
2031 add_token_u8(&err, dev, OPAL_STARTLIST); in read_table_data()
2032 add_token_u8(&err, dev, OPAL_STARTNAME); in read_table_data()
2033 add_token_u8(&err, dev, OPAL_STARTROW); in read_table_data()
2034 add_token_u64(&err, dev, offset + off); /* start row value */ in read_table_data()
2035 add_token_u8(&err, dev, OPAL_ENDNAME); in read_table_data()
2037 add_token_u8(&err, dev, OPAL_STARTNAME); in read_table_data()
2038 add_token_u8(&err, dev, OPAL_ENDROW); in read_table_data()
2041 add_token_u64(&err, dev, offset + off + len); /* end row value in read_table_data()
2043 add_token_u8(&err, dev, OPAL_ENDNAME); in read_table_data()
2044 add_token_u8(&err, dev, OPAL_ENDLIST); in read_table_data()
2051 err = finalize_and_send(dev, read_table_data_cont); in read_table_data()
2056 if (dev->prev_d_len > len + 1) { in read_table_data()
2062 if (copy_to_user(dst + off, dev->prev_data, dev->prev_d_len)) { in read_table_data()
2067 dev->prev_data = NULL; in read_table_data()
2075 static int end_opal_session(struct opal_dev *dev, void *data) in end_opal_session() argument
2079 clear_opal_cmd(dev); in end_opal_session()
2080 set_comid(dev, dev->comid); in end_opal_session()
2081 add_token_u8(&err, dev, OPAL_ENDOFSESSION); in end_opal_session()
2086 return finalize_and_send(dev, end_session_cont); in end_opal_session()
2089 static int end_opal_session_error(struct opal_dev *dev) in end_opal_session_error() argument
2095 return execute_step(dev, &error_end_session, 0); in end_opal_session_error()
2098 static inline void setup_opal_dev(struct opal_dev *dev) in setup_opal_dev() argument
2100 dev->tsn = 0; in setup_opal_dev()
2101 dev->hsn = 0; in setup_opal_dev()
2102 dev->prev_data = NULL; in setup_opal_dev()
2105 static int check_opal_support(struct opal_dev *dev) in check_opal_support() argument
2109 mutex_lock(&dev->dev_lock); in check_opal_support()
2110 setup_opal_dev(dev); in check_opal_support()
2111 ret = opal_discovery0_step(dev); in check_opal_support()
2112 dev->supported = !ret; in check_opal_support()
2113 mutex_unlock(&dev->dev_lock); in check_opal_support()
2118 static void clean_opal_dev(struct opal_dev *dev) in clean_opal_dev() argument
2123 mutex_lock(&dev->dev_lock); in clean_opal_dev()
2124 list_for_each_entry_safe(suspend, next, &dev->unlk_lst, node) { in clean_opal_dev()
2128 mutex_unlock(&dev->dev_lock); in clean_opal_dev()
2131 void free_opal_dev(struct opal_dev *dev) in free_opal_dev() argument
2133 if (!dev) in free_opal_dev()
2136 clean_opal_dev(dev); in free_opal_dev()
2137 kfree(dev->resp); in free_opal_dev()
2138 kfree(dev->cmd); in free_opal_dev()
2139 kfree(dev); in free_opal_dev()
2145 struct opal_dev *dev; in init_opal_dev() local
2147 dev = kmalloc(sizeof(*dev), GFP_KERNEL); in init_opal_dev()
2148 if (!dev) in init_opal_dev()
2155 dev->cmd = kmalloc(IO_BUFFER_LENGTH, GFP_KERNEL); in init_opal_dev()
2156 if (!dev->cmd) in init_opal_dev()
2159 dev->resp = kmalloc(IO_BUFFER_LENGTH, GFP_KERNEL); in init_opal_dev()
2160 if (!dev->resp) in init_opal_dev()
2163 INIT_LIST_HEAD(&dev->unlk_lst); in init_opal_dev()
2164 mutex_init(&dev->dev_lock); in init_opal_dev()
2165 dev->data = data; in init_opal_dev()
2166 dev->send_recv = send_recv; in init_opal_dev()
2167 if (check_opal_support(dev) != 0) { in init_opal_dev()
2172 return dev; in init_opal_dev()
2175 kfree(dev->resp); in init_opal_dev()
2178 kfree(dev->cmd); in init_opal_dev()
2181 kfree(dev); in init_opal_dev()
2187 static int opal_secure_erase_locking_range(struct opal_dev *dev, in opal_secure_erase_locking_range() argument
2198 mutex_lock(&dev->dev_lock); in opal_secure_erase_locking_range()
2199 setup_opal_dev(dev); in opal_secure_erase_locking_range()
2200 ret = execute_steps(dev, erase_steps, ARRAY_SIZE(erase_steps)); in opal_secure_erase_locking_range()
2201 mutex_unlock(&dev->dev_lock); in opal_secure_erase_locking_range()
2206 static int opal_erase_locking_range(struct opal_dev *dev, in opal_erase_locking_range() argument
2216 mutex_lock(&dev->dev_lock); in opal_erase_locking_range()
2217 setup_opal_dev(dev); in opal_erase_locking_range()
2218 ret = execute_steps(dev, erase_steps, ARRAY_SIZE(erase_steps)); in opal_erase_locking_range()
2219 mutex_unlock(&dev->dev_lock); in opal_erase_locking_range()
2224 static int opal_enable_disable_shadow_mbr(struct opal_dev *dev, in opal_enable_disable_shadow_mbr() argument
2244 mutex_lock(&dev->dev_lock); in opal_enable_disable_shadow_mbr()
2245 setup_opal_dev(dev); in opal_enable_disable_shadow_mbr()
2246 ret = execute_steps(dev, mbr_steps, ARRAY_SIZE(mbr_steps)); in opal_enable_disable_shadow_mbr()
2247 mutex_unlock(&dev->dev_lock); in opal_enable_disable_shadow_mbr()
2252 static int opal_set_mbr_done(struct opal_dev *dev, in opal_set_mbr_done() argument
2269 mutex_lock(&dev->dev_lock); in opal_set_mbr_done()
2270 setup_opal_dev(dev); in opal_set_mbr_done()
2271 ret = execute_steps(dev, mbr_steps, ARRAY_SIZE(mbr_steps)); in opal_set_mbr_done()
2272 mutex_unlock(&dev->dev_lock); in opal_set_mbr_done()
2277 static int opal_write_shadow_mbr(struct opal_dev *dev, in opal_write_shadow_mbr() argument
2290 mutex_lock(&dev->dev_lock); in opal_write_shadow_mbr()
2291 setup_opal_dev(dev); in opal_write_shadow_mbr()
2292 ret = execute_steps(dev, mbr_steps, ARRAY_SIZE(mbr_steps)); in opal_write_shadow_mbr()
2293 mutex_unlock(&dev->dev_lock); in opal_write_shadow_mbr()
2298 static int opal_save(struct opal_dev *dev, struct opal_lock_unlock *lk_unlk) in opal_save() argument
2309 mutex_lock(&dev->dev_lock); in opal_save()
2310 setup_opal_dev(dev); in opal_save()
2311 add_suspend_info(dev, suspend); in opal_save()
2312 mutex_unlock(&dev->dev_lock); in opal_save()
2317 static int opal_add_user_to_lr(struct opal_dev *dev, in opal_add_user_to_lr() argument
2346 mutex_lock(&dev->dev_lock); in opal_add_user_to_lr()
2347 setup_opal_dev(dev); in opal_add_user_to_lr()
2348 ret = execute_steps(dev, steps, ARRAY_SIZE(steps)); in opal_add_user_to_lr()
2349 mutex_unlock(&dev->dev_lock); in opal_add_user_to_lr()
2354 static int opal_reverttper(struct opal_dev *dev, struct opal_key *opal, bool psid) in opal_reverttper() argument
2368 mutex_lock(&dev->dev_lock); in opal_reverttper()
2369 setup_opal_dev(dev); in opal_reverttper()
2371 ret = execute_steps(dev, psid_revert_steps, in opal_reverttper()
2374 ret = execute_steps(dev, revert_steps, in opal_reverttper()
2376 mutex_unlock(&dev->dev_lock); in opal_reverttper()
2383 clean_opal_dev(dev); in opal_reverttper()
2388 static int __opal_lock_unlock(struct opal_dev *dev, in __opal_lock_unlock() argument
2403 return execute_steps(dev, unlock_sum_steps, in __opal_lock_unlock()
2406 return execute_steps(dev, unlock_steps, in __opal_lock_unlock()
2410 static int __opal_set_mbr_done(struct opal_dev *dev, struct opal_key *key) in __opal_set_mbr_done() argument
2419 return execute_steps(dev, mbrdone_step, ARRAY_SIZE(mbrdone_step)); in __opal_set_mbr_done()
2422 static int opal_lock_unlock(struct opal_dev *dev, in opal_lock_unlock() argument
2430 mutex_lock(&dev->dev_lock); in opal_lock_unlock()
2431 ret = __opal_lock_unlock(dev, lk_unlk); in opal_lock_unlock()
2432 mutex_unlock(&dev->dev_lock); in opal_lock_unlock()
2437 static int opal_take_ownership(struct opal_dev *dev, struct opal_key *opal) in opal_take_ownership() argument
2449 if (!dev) in opal_take_ownership()
2452 mutex_lock(&dev->dev_lock); in opal_take_ownership()
2453 setup_opal_dev(dev); in opal_take_ownership()
2454 ret = execute_steps(dev, owner_steps, ARRAY_SIZE(owner_steps)); in opal_take_ownership()
2455 mutex_unlock(&dev->dev_lock); in opal_take_ownership()
2460 static int opal_activate_lsp(struct opal_dev *dev, in opal_activate_lsp() argument
2474 mutex_lock(&dev->dev_lock); in opal_activate_lsp()
2475 setup_opal_dev(dev); in opal_activate_lsp()
2476 ret = execute_steps(dev, active_steps, ARRAY_SIZE(active_steps)); in opal_activate_lsp()
2477 mutex_unlock(&dev->dev_lock); in opal_activate_lsp()
2482 static int opal_setup_locking_range(struct opal_dev *dev, in opal_setup_locking_range() argument
2492 mutex_lock(&dev->dev_lock); in opal_setup_locking_range()
2493 setup_opal_dev(dev); in opal_setup_locking_range()
2494 ret = execute_steps(dev, lr_steps, ARRAY_SIZE(lr_steps)); in opal_setup_locking_range()
2495 mutex_unlock(&dev->dev_lock); in opal_setup_locking_range()
2500 static int opal_set_new_pw(struct opal_dev *dev, struct opal_new_pw *opal_pw) in opal_set_new_pw() argument
2513 mutex_lock(&dev->dev_lock); in opal_set_new_pw()
2514 setup_opal_dev(dev); in opal_set_new_pw()
2515 ret = execute_steps(dev, pw_steps, ARRAY_SIZE(pw_steps)); in opal_set_new_pw()
2516 mutex_unlock(&dev->dev_lock); in opal_set_new_pw()
2521 static int opal_activate_user(struct opal_dev *dev, in opal_activate_user() argument
2538 mutex_lock(&dev->dev_lock); in opal_activate_user()
2539 setup_opal_dev(dev); in opal_activate_user()
2540 ret = execute_steps(dev, act_steps, ARRAY_SIZE(act_steps)); in opal_activate_user()
2541 mutex_unlock(&dev->dev_lock); in opal_activate_user()
2546 bool opal_unlock_from_suspend(struct opal_dev *dev) in opal_unlock_from_suspend() argument
2552 if (!dev) in opal_unlock_from_suspend()
2555 if (!dev->supported) in opal_unlock_from_suspend()
2558 mutex_lock(&dev->dev_lock); in opal_unlock_from_suspend()
2559 setup_opal_dev(dev); in opal_unlock_from_suspend()
2561 list_for_each_entry(suspend, &dev->unlk_lst, node) { in opal_unlock_from_suspend()
2562 dev->tsn = 0; in opal_unlock_from_suspend()
2563 dev->hsn = 0; in opal_unlock_from_suspend()
2565 ret = __opal_lock_unlock(dev, &suspend->unlk); in opal_unlock_from_suspend()
2573 if (dev->mbr_enabled) { in opal_unlock_from_suspend()
2574 ret = __opal_set_mbr_done(dev, &suspend->unlk.session.opal_key); in opal_unlock_from_suspend()
2579 mutex_unlock(&dev->dev_lock); in opal_unlock_from_suspend()
2585 static int opal_read_table(struct opal_dev *dev, in opal_read_table() argument
2598 return execute_steps(dev, read_table_steps, in opal_read_table()
2602 static int opal_write_table(struct opal_dev *dev, in opal_write_table() argument
2615 return execute_steps(dev, write_table_steps, in opal_write_table()
2619 static int opal_generic_read_write_table(struct opal_dev *dev, in opal_generic_read_write_table() argument
2624 mutex_lock(&dev->dev_lock); in opal_generic_read_write_table()
2625 setup_opal_dev(dev); in opal_generic_read_write_table()
2630 ret = opal_read_table(dev, rw_tbl); in opal_generic_read_write_table()
2633 ret = opal_write_table(dev, rw_tbl); in opal_generic_read_write_table()
2642 mutex_unlock(&dev->dev_lock); in opal_generic_read_write_table()
2647 int sed_ioctl(struct opal_dev *dev, unsigned int cmd, void __user *arg) in sed_ioctl() argument
2654 if (!dev) in sed_ioctl()
2656 if (!dev->supported) in sed_ioctl()
2665 ret = opal_save(dev, p); in sed_ioctl()
2668 ret = opal_lock_unlock(dev, p); in sed_ioctl()
2671 ret = opal_take_ownership(dev, p); in sed_ioctl()
2674 ret = opal_activate_lsp(dev, p); in sed_ioctl()
2677 ret = opal_set_new_pw(dev, p); in sed_ioctl()
2680 ret = opal_activate_user(dev, p); in sed_ioctl()
2683 ret = opal_reverttper(dev, p, false); in sed_ioctl()
2686 ret = opal_setup_locking_range(dev, p); in sed_ioctl()
2689 ret = opal_add_user_to_lr(dev, p); in sed_ioctl()
2692 ret = opal_enable_disable_shadow_mbr(dev, p); in sed_ioctl()
2695 ret = opal_set_mbr_done(dev, p); in sed_ioctl()
2698 ret = opal_write_shadow_mbr(dev, p); in sed_ioctl()
2701 ret = opal_erase_locking_range(dev, p); in sed_ioctl()
2704 ret = opal_secure_erase_locking_range(dev, p); in sed_ioctl()
2707 ret = opal_reverttper(dev, p, true); in sed_ioctl()
2710 ret = opal_generic_read_write_table(dev, p); in sed_ioctl()