1 /*- 2 * BSD LICENSE 3 * 4 * Copyright (c) Intel Corporation. 5 * All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 11 * * Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * * Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in 15 * the documentation and/or other materials provided with the 16 * distribution. 17 * * Neither the name of Intel Corporation nor the names of its 18 * contributors may be used to endorse or promote products derived 19 * from this software without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 25 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 */ 33 34 #ifndef SPDK_OPAL_INTERNAL_H 35 #define SPDK_OPAL_INTERNAL_H 36 37 #include "spdk/opal_spec.h" 38 #include "spdk/opal.h" 39 #include "spdk/scsi_spec.h" 40 41 #define IO_BUFFER_LENGTH 2048 42 #define MAX_TOKS 64 43 #define OPAL_KEY_MAX 256 44 #define OPAL_UID_LENGTH 8 45 46 #define GENERIC_HOST_SESSION_NUM 0x69 47 48 #define OPAL_INVAL_PARAM 12 49 50 #define SPDK_DTAERROR_NO_METHOD_STATUS 0x89 51 52 enum opal_token_type { 53 OPAL_DTA_TOKENID_BYTESTRING = 0xE0, 54 OPAL_DTA_TOKENID_SINT = 0xE1, 55 OPAL_DTA_TOKENID_UINT = 0xE2, 56 OPAL_DTA_TOKENID_TOKEN = 0xE3, /* actual token is returned */ 57 OPAL_DTA_TOKENID_INVALID = 0X0, 58 }; 59 60 enum opal_atom_width { 61 OPAL_WIDTH_TINY, /* 1 byte in length */ 62 OPAL_WIDTH_SHORT, /* a 1-byte header and contain up to 15 bytes of data */ 63 OPAL_WIDTH_MEDIUM, /* a 2-byte header and contain up to 2047 bytes of data */ 64 OPAL_WIDTH_LONG, /* a 4-byte header and which contain up to 16,777,215 bytes of data */ 65 OPAL_WIDTH_TOKEN 66 }; 67 68 enum opal_uid_enum { 69 /* users */ 70 UID_SMUID, 71 UID_THISSP, 72 UID_ADMINSP, 73 UID_LOCKINGSP, 74 UID_ANYBODY, 75 UID_SID, 76 UID_ADMIN1, 77 UID_USER1, 78 UID_USER2, 79 80 /* tables */ 81 UID_LOCKINGRANGE_GLOBAL, 82 UID_LOCKINGRANGE_ACE_RDLOCKED, 83 UID_LOCKINGRANGE_ACE_WRLOCKED, 84 UID_MBRCONTROL, 85 UID_MBR, 86 UID_AUTHORITY_TABLE, 87 UID_C_PIN_TABLE, 88 UID_LOCKING_INFO_TABLE, 89 UID_PSID, 90 91 /* C_PIN_TABLE object ID's */ 92 UID_C_PIN_MSID, 93 UID_C_PIN_SID, 94 UID_C_PIN_ADMIN1, 95 UID_C_PIN_USER1, 96 97 /* half UID's (only first 4 bytes used) */ 98 UID_HALF_AUTHORITY_OBJ_REF, 99 UID_HALF_BOOLEAN_ACE, 100 }; 101 102 /* enum for indexing the spdk_opal_method array */ 103 enum opal_method_enum { 104 PROPERTIES_METHOD, 105 STARTSESSION_METHOD, 106 REVERT_METHOD, 107 ACTIVATE_METHOD, 108 NEXT_METHOD, 109 GETACL_METHOD, 110 GENKEY_METHOD, 111 REVERTSP_METHOD, 112 GET_METHOD, 113 SET_METHOD, 114 AUTHENTICATE_METHOD, 115 RANDOM_METHOD, 116 ERASE_METHOD, 117 }; 118 119 struct spdk_opal_key { 120 uint8_t key_len; 121 uint8_t key[OPAL_KEY_MAX]; 122 }; 123 124 const uint8_t spdk_opal_uid[][OPAL_UID_LENGTH] = { 125 /* users */ 126 [UID_SMUID] = /* Session Manager UID */ 127 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff }, 128 [UID_THISSP] = 129 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 }, 130 [UID_ADMINSP] = 131 { 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x00, 0x01 }, 132 [UID_LOCKINGSP] = 133 { 0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x00, 0x02 }, 134 [UID_ANYBODY] = 135 { 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01 }, 136 [UID_SID] = /* Security Identifier UID */ 137 { 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x06 }, 138 [UID_ADMIN1] = 139 { 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00, 0x01 }, 140 [UID_USER1] = 141 { 0x00, 0x00, 0x00, 0x09, 0x00, 0x03, 0x00, 0x01 }, 142 [UID_USER2] = 143 { 0x00, 0x00, 0x00, 0x09, 0x00, 0x03, 0x00, 0x02 }, 144 145 /* tables */ 146 [UID_LOCKINGRANGE_GLOBAL] = 147 { 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x01 }, 148 [UID_LOCKINGRANGE_ACE_RDLOCKED] = 149 { 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0xE0, 0x01 }, 150 [UID_LOCKINGRANGE_ACE_WRLOCKED] = 151 { 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0xE8, 0x01 }, 152 [UID_MBRCONTROL] = 153 { 0x00, 0x00, 0x08, 0x03, 0x00, 0x00, 0x00, 0x01 }, 154 [UID_MBR] = 155 { 0x00, 0x00, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00 }, 156 [UID_AUTHORITY_TABLE] = 157 { 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00}, 158 [UID_C_PIN_TABLE] = 159 { 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00}, 160 [UID_LOCKING_INFO_TABLE] = 161 { 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01 }, 162 [UID_PSID] = 163 { 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0xff, 0x01 }, 164 165 /* C_PIN_TABLE object ID's */ 166 [UID_C_PIN_MSID] = 167 { 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x84, 0x02}, 168 [UID_C_PIN_SID] = 169 { 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01}, 170 [UID_C_PIN_ADMIN1] = 171 { 0x00, 0x00, 0x00, 0x0B, 0x00, 0x01, 0x00, 0x01}, 172 [UID_C_PIN_USER1] = 173 { 0x00, 0x00, 0x00, 0x0B, 0x00, 0x03, 0x00, 0x01}, 174 175 /* half UID's (only first 4 bytes used) */ 176 [UID_HALF_AUTHORITY_OBJ_REF] = 177 { 0x00, 0x00, 0x0C, 0x05, 0xff, 0xff, 0xff, 0xff }, 178 [UID_HALF_BOOLEAN_ACE] = 179 { 0x00, 0x00, 0x04, 0x0E, 0xff, 0xff, 0xff, 0xff }, 180 }; 181 182 /* 183 * TCG Storage SSC Methods. 184 */ 185 const uint8_t spdk_opal_method[][OPAL_UID_LENGTH] = { 186 [PROPERTIES_METHOD] = 187 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x01 }, 188 [STARTSESSION_METHOD] = 189 { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x02 }, 190 [REVERT_METHOD] = 191 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x02 }, 192 [ACTIVATE_METHOD] = 193 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x03 }, 194 [NEXT_METHOD] = 195 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x08 }, 196 [GETACL_METHOD] = 197 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0d }, 198 [GENKEY_METHOD] = 199 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x10 }, 200 [REVERTSP_METHOD] = 201 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x11 }, 202 [GET_METHOD] = 203 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x16 }, 204 [SET_METHOD] = 205 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x17 }, 206 [AUTHENTICATE_METHOD] = 207 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x1c }, 208 [RANDOM_METHOD] = 209 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x01 }, 210 [ERASE_METHOD] = 211 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x08, 0x03 }, 212 }; 213 214 /* 215 * Response token 216 */ 217 struct spdk_opal_resp_token { 218 const uint8_t *pos; 219 uint8_t _padding[7]; 220 union { 221 uint64_t unsigned_num; 222 int64_t signed_num; 223 } stored; 224 size_t len; /* header + data */ 225 enum opal_token_type type; 226 enum opal_atom_width width; 227 }; 228 229 struct spdk_opal_resp_parsed { 230 int num; 231 struct spdk_opal_resp_token resp_tokens[MAX_TOKS]; 232 }; 233 234 /* header of a response */ 235 struct spdk_opal_header { 236 struct spdk_opal_compacket com_packet; 237 struct spdk_opal_packet packet; 238 struct spdk_opal_data_subpacket sub_packet; 239 }; 240 241 struct opal_session; 242 struct spdk_opal_dev; 243 244 typedef void (*opal_sess_cb)(struct opal_session *sess, int status, void *ctx); 245 246 struct opal_session { 247 uint32_t hsn; 248 uint32_t tsn; 249 size_t cmd_pos; 250 uint8_t cmd[IO_BUFFER_LENGTH]; 251 uint8_t resp[IO_BUFFER_LENGTH]; 252 struct spdk_opal_resp_parsed parsed_resp; 253 254 opal_sess_cb sess_cb; 255 void *cb_arg; 256 bool done; 257 int status; 258 struct spdk_opal_dev *dev; 259 }; 260 261 struct spdk_opal_dev { 262 struct spdk_nvme_ctrlr *ctrlr; 263 264 uint16_t comid; 265 266 struct spdk_opal_d0_features_info feat_info; 267 268 uint8_t max_ranges; /* max locking range number */ 269 struct spdk_opal_locking_range_info locking_ranges[SPDK_OPAL_MAX_LOCKING_RANGE]; 270 }; 271 272 #endif 273