1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright (C) 2019 Intel Corporation. 3 * All rights reserved. 4 */ 5 6 #ifndef SPDK_OPAL_INTERNAL_H 7 #define SPDK_OPAL_INTERNAL_H 8 9 #include "spdk/opal_spec.h" 10 #include "spdk/opal.h" 11 #include "spdk/scsi_spec.h" 12 13 #define IO_BUFFER_LENGTH 2048 14 #define MAX_TOKS 64 15 #define OPAL_KEY_MAX 256 16 #define OPAL_UID_LENGTH 8 17 18 #define GENERIC_HOST_SESSION_NUM 0x69 19 20 #define OPAL_INVAL_PARAM 12 21 22 #define SPDK_DTAERROR_NO_METHOD_STATUS 0x89 23 24 enum opal_token_type { 25 OPAL_DTA_TOKENID_BYTESTRING = 0xE0, 26 OPAL_DTA_TOKENID_SINT = 0xE1, 27 OPAL_DTA_TOKENID_UINT = 0xE2, 28 OPAL_DTA_TOKENID_TOKEN = 0xE3, /* actual token is returned */ 29 OPAL_DTA_TOKENID_INVALID = 0X0, 30 }; 31 32 enum opal_atom_width { 33 OPAL_WIDTH_TINY, /* 1 byte in length */ 34 OPAL_WIDTH_SHORT, /* a 1-byte header and contain up to 15 bytes of data */ 35 OPAL_WIDTH_MEDIUM, /* a 2-byte header and contain up to 2047 bytes of data */ 36 OPAL_WIDTH_LONG, /* a 4-byte header and which contain up to 16,777,215 bytes of data */ 37 OPAL_WIDTH_TOKEN 38 }; 39 40 enum opal_uid_enum { 41 /* users */ 42 UID_SMUID, 43 UID_THISSP, 44 UID_ADMINSP, 45 UID_LOCKINGSP, 46 UID_ANYBODY, 47 UID_SID, 48 UID_ADMIN1, 49 UID_USER1, 50 UID_USER2, 51 52 /* tables */ 53 UID_LOCKINGRANGE_GLOBAL, 54 UID_LOCKINGRANGE_ACE_RDLOCKED, 55 UID_LOCKINGRANGE_ACE_WRLOCKED, 56 UID_MBRCONTROL, 57 UID_MBR, 58 UID_AUTHORITY_TABLE, 59 UID_C_PIN_TABLE, 60 UID_LOCKING_INFO_TABLE, 61 UID_PSID, 62 63 /* C_PIN_TABLE object ID's */ 64 UID_C_PIN_MSID, 65 UID_C_PIN_SID, 66 UID_C_PIN_ADMIN1, 67 UID_C_PIN_USER1, 68 69 /* half UID's (only first 4 bytes used) */ 70 UID_HALF_AUTHORITY_OBJ_REF, 71 UID_HALF_BOOLEAN_ACE, 72 }; 73 74 /* enum for indexing the spdk_opal_method array */ 75 enum opal_method_enum { 76 PROPERTIES_METHOD, 77 STARTSESSION_METHOD, 78 REVERT_METHOD, 79 ACTIVATE_METHOD, 80 NEXT_METHOD, 81 GETACL_METHOD, 82 GENKEY_METHOD, 83 REVERTSP_METHOD, 84 GET_METHOD, 85 SET_METHOD, 86 AUTHENTICATE_METHOD, 87 RANDOM_METHOD, 88 ERASE_METHOD, 89 }; 90 91 struct spdk_opal_key { 92 uint8_t key_len; 93 uint8_t key[OPAL_KEY_MAX]; 94 }; 95 96 const uint8_t spdk_opal_uid[][OPAL_UID_LENGTH] = { 97 /* users */ 98 [UID_SMUID] = /* Session Manager UID */ 99 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff }, 100 [UID_THISSP] = 101 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }, 102 [UID_ADMINSP] = 103 { 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x00, 0x01 }, 104 [UID_LOCKINGSP] = 105 { 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x00, 0x02 }, 106 [UID_ANYBODY] = 107 { 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01 }, 108 [UID_SID] = /* Security Identifier UID */ 109 { 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x06 }, 110 [UID_ADMIN1] = 111 { 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00, 0x01 }, 112 [UID_USER1] = 113 { 0x00, 0x00, 0x00, 0x09, 0x00, 0x03, 0x00, 0x01 }, 114 [UID_USER2] = 115 { 0x00, 0x00, 0x00, 0x09, 0x00, 0x03, 0x00, 0x02 }, 116 117 /* tables */ 118 [UID_LOCKINGRANGE_GLOBAL] = 119 { 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x01 }, 120 [UID_LOCKINGRANGE_ACE_RDLOCKED] = 121 { 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0xE0, 0x01 }, 122 [UID_LOCKINGRANGE_ACE_WRLOCKED] = 123 { 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0xE8, 0x01 }, 124 [UID_MBRCONTROL] = 125 { 0x00, 0x00, 0x08, 0x03, 0x00, 0x00, 0x00, 0x01 }, 126 [UID_MBR] = 127 { 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00 }, 128 [UID_AUTHORITY_TABLE] = 129 { 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00}, 130 [UID_C_PIN_TABLE] = 131 { 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00}, 132 [UID_LOCKING_INFO_TABLE] = 133 { 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01 }, 134 [UID_PSID] = 135 { 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0xff, 0x01 }, 136 137 /* C_PIN_TABLE object ID's */ 138 [UID_C_PIN_MSID] = 139 { 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x84, 0x02}, 140 [UID_C_PIN_SID] = 141 { 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01}, 142 [UID_C_PIN_ADMIN1] = 143 { 0x00, 0x00, 0x00, 0x0B, 0x00, 0x01, 0x00, 0x01}, 144 [UID_C_PIN_USER1] = 145 { 0x00, 0x00, 0x00, 0x0B, 0x00, 0x03, 0x00, 0x01}, 146 147 /* half UID's (only first 4 bytes used) */ 148 [UID_HALF_AUTHORITY_OBJ_REF] = 149 { 0x00, 0x00, 0x0C, 0x05, 0xff, 0xff, 0xff, 0xff }, 150 [UID_HALF_BOOLEAN_ACE] = 151 { 0x00, 0x00, 0x04, 0x0E, 0xff, 0xff, 0xff, 0xff }, 152 }; 153 154 /* 155 * TCG Storage SSC Methods. 156 */ 157 const uint8_t spdk_opal_method[][OPAL_UID_LENGTH] = { 158 [PROPERTIES_METHOD] = 159 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x01 }, 160 [STARTSESSION_METHOD] = 161 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x02 }, 162 [REVERT_METHOD] = 163 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x02 }, 164 [ACTIVATE_METHOD] = 165 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x03 }, 166 [NEXT_METHOD] = 167 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x08 }, 168 [GETACL_METHOD] = 169 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0d }, 170 [GENKEY_METHOD] = 171 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10 }, 172 [REVERTSP_METHOD] = 173 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x11 }, 174 [GET_METHOD] = 175 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x16 }, 176 [SET_METHOD] = 177 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x17 }, 178 [AUTHENTICATE_METHOD] = 179 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1c }, 180 [RANDOM_METHOD] = 181 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x01 }, 182 [ERASE_METHOD] = 183 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x08, 0x03 }, 184 }; 185 186 /* 187 * Response token 188 */ 189 struct spdk_opal_resp_token { 190 const uint8_t *pos; 191 uint8_t _padding[7]; 192 union { 193 uint64_t unsigned_num; 194 int64_t signed_num; 195 } stored; 196 size_t len; /* header + data */ 197 enum opal_token_type type; 198 enum opal_atom_width width; 199 }; 200 201 struct spdk_opal_resp_parsed { 202 int num; 203 struct spdk_opal_resp_token resp_tokens[MAX_TOKS]; 204 }; 205 206 /* header of a response */ 207 struct spdk_opal_header { 208 struct spdk_opal_compacket com_packet; 209 struct spdk_opal_packet packet; 210 struct spdk_opal_data_subpacket sub_packet; 211 }; 212 213 struct opal_session; 214 struct spdk_opal_dev; 215 216 typedef void (*opal_sess_cb)(struct opal_session *sess, int status, void *ctx); 217 218 struct opal_session { 219 uint32_t hsn; 220 uint32_t tsn; 221 size_t cmd_pos; 222 uint8_t cmd[IO_BUFFER_LENGTH]; 223 uint8_t resp[IO_BUFFER_LENGTH]; 224 struct spdk_opal_resp_parsed parsed_resp; 225 226 opal_sess_cb sess_cb; 227 void *cb_arg; 228 bool done; 229 int status; 230 struct spdk_opal_dev *dev; 231 }; 232 233 struct spdk_opal_dev { 234 struct spdk_nvme_ctrlr *ctrlr; 235 236 uint16_t comid; 237 238 struct spdk_opal_d0_features_info feat_info; 239 240 uint8_t max_ranges; /* max locking range number */ 241 struct spdk_opal_locking_range_info locking_ranges[SPDK_OPAL_MAX_LOCKING_RANGE]; 242 }; 243 244 #endif 245