1  /* SPDX-License-Identifier: GPL-2.0 */
2  /*
3   * Copyright © 2016 Intel Corporation
4   *
5   * Authors:
6   *    Rafael Antognolli <rafael.antognolli@intel.com>
7   *    Scott  Bauer      <scott.bauer@intel.com>
8   */
9  #include <linux/types.h>
10  
11  #ifndef _OPAL_PROTO_H
12  #define _OPAL_PROTO_H
13  
14  /*
15   * These constant values come from:
16   * SPC-4 section
17   * 6.30 SECURITY PROTOCOL IN command / table 265.
18   */
19  enum {
20  	TCG_SECP_00 = 0,
21  	TCG_SECP_01,
22  };
23  
24  /*
25   * Token defs derived from:
26   * TCG_Storage_Architecture_Core_Spec_v2.01_r1.00
27   * 3.2.2 Data Stream Encoding
28   */
29  enum opal_response_token {
30  	OPAL_DTA_TOKENID_BYTESTRING = 0xe0,
31  	OPAL_DTA_TOKENID_SINT = 0xe1,
32  	OPAL_DTA_TOKENID_UINT = 0xe2,
33  	OPAL_DTA_TOKENID_TOKEN = 0xe3, /* actual token is returned */
34  	OPAL_DTA_TOKENID_INVALID = 0X0
35  };
36  
37  #define DTAERROR_NO_METHOD_STATUS 0x89
38  #define GENERIC_HOST_SESSION_NUM 0x41
39  #define FIRST_TPER_SESSION_NUM	4096
40  
41  #define TPER_SYNC_SUPPORTED 0x01
42  /* FC_LOCKING features */
43  #define LOCKING_SUPPORTED_MASK 0x01
44  #define LOCKING_ENABLED_MASK 0x02
45  #define LOCKED_MASK 0x04
46  #define MBR_ENABLED_MASK 0x10
47  #define MBR_DONE_MASK 0x20
48  
49  #define TINY_ATOM_DATA_MASK 0x3F
50  #define TINY_ATOM_SIGNED 0x40
51  
52  #define SHORT_ATOM_ID 0x80
53  #define SHORT_ATOM_BYTESTRING 0x20
54  #define SHORT_ATOM_SIGNED 0x10
55  #define SHORT_ATOM_LEN_MASK 0xF
56  
57  #define MEDIUM_ATOM_ID 0xC0
58  #define MEDIUM_ATOM_BYTESTRING 0x10
59  #define MEDIUM_ATOM_SIGNED 0x8
60  #define MEDIUM_ATOM_LEN_MASK 0x7
61  
62  #define LONG_ATOM_ID 0xe0
63  #define LONG_ATOM_BYTESTRING 0x2
64  #define LONG_ATOM_SIGNED 0x1
65  
66  /* Derived from TCG Core spec 2.01 Section:
67   * 3.2.2.1
68   * Data Type
69   */
70  #define TINY_ATOM_BYTE   0x7F
71  #define SHORT_ATOM_BYTE  0xBF
72  #define MEDIUM_ATOM_BYTE 0xDF
73  #define LONG_ATOM_BYTE   0xE3
74  #define EMPTY_ATOM_BYTE  0xFF
75  
76  #define OPAL_INVAL_PARAM 12
77  #define OPAL_MANUFACTURED_INACTIVE 0x08
78  #define OPAL_DISCOVERY_COMID 0x0001
79  
80  #define LOCKING_RANGE_NON_GLOBAL 0x03
81  /*
82   * User IDs used in the TCG storage SSCs
83   * Derived from: TCG_Storage_Architecture_Core_Spec_v2.01_r1.00
84   * Section: 6.3 Assigned UIDs
85   */
86  #define OPAL_METHOD_LENGTH 8
87  #define OPAL_MSID_KEYLEN 15
88  #define OPAL_UID_LENGTH_HALF 4
89  
90  /*
91   * Boolean operators from TCG Core spec 2.01 Section:
92   * 5.1.3.11
93   * Table 61
94   */
95  #define OPAL_BOOLEAN_AND 0
96  #define OPAL_BOOLEAN_OR  1
97  #define OPAL_BOOLEAN_NOT 2
98  
99  /* Enum to index OPALUID array */
100  enum opal_uid {
101  	/* users */
102  	OPAL_SMUID_UID,
103  	OPAL_THISSP_UID,
104  	OPAL_ADMINSP_UID,
105  	OPAL_LOCKINGSP_UID,
106  	OPAL_ENTERPRISE_LOCKINGSP_UID,
107  	OPAL_ANYBODY_UID,
108  	OPAL_SID_UID,
109  	OPAL_ADMIN1_UID,
110  	OPAL_USER1_UID,
111  	OPAL_USER2_UID,
112  	OPAL_PSID_UID,
113  	OPAL_ENTERPRISE_BANDMASTER0_UID,
114  	OPAL_ENTERPRISE_ERASEMASTER_UID,
115  	/* tables */
116  	OPAL_TABLE_TABLE,
117  	OPAL_LOCKINGRANGE_GLOBAL,
118  	OPAL_LOCKINGRANGE_ACE_START_TO_KEY,
119  	OPAL_LOCKINGRANGE_ACE_RDLOCKED,
120  	OPAL_LOCKINGRANGE_ACE_WRLOCKED,
121  	OPAL_MBRCONTROL,
122  	OPAL_MBR,
123  	OPAL_AUTHORITY_TABLE,
124  	OPAL_C_PIN_TABLE,
125  	OPAL_LOCKING_INFO_TABLE,
126  	OPAL_ENTERPRISE_LOCKING_INFO_TABLE,
127  	OPAL_DATASTORE,
128  	/* C_PIN_TABLE object ID's */
129  	OPAL_C_PIN_MSID,
130  	OPAL_C_PIN_SID,
131  	OPAL_C_PIN_ADMIN1,
132  	/* half UID's (only first 4 bytes used) */
133  	OPAL_HALF_UID_AUTHORITY_OBJ_REF,
134  	OPAL_HALF_UID_BOOLEAN_ACE,
135  	/* omitted optional parameter */
136  	OPAL_UID_HEXFF,
137  };
138  
139  /* Enum for indexing the OPALMETHOD array */
140  enum opal_method {
141  	OPAL_PROPERTIES,
142  	OPAL_STARTSESSION,
143  	OPAL_REVERT,
144  	OPAL_ACTIVATE,
145  	OPAL_EGET,
146  	OPAL_ESET,
147  	OPAL_NEXT,
148  	OPAL_EAUTHENTICATE,
149  	OPAL_GETACL,
150  	OPAL_GENKEY,
151  	OPAL_REVERTSP,
152  	OPAL_GET,
153  	OPAL_SET,
154  	OPAL_AUTHENTICATE,
155  	OPAL_RANDOM,
156  	OPAL_ERASE,
157  };
158  
159  enum opal_token {
160  	/* Boolean */
161  	OPAL_TRUE = 0x01,
162  	OPAL_FALSE = 0x00,
163  	OPAL_BOOLEAN_EXPR = 0x03,
164  	/* cellblocks */
165  	OPAL_TABLE = 0x00,
166  	OPAL_STARTROW = 0x01,
167  	OPAL_ENDROW = 0x02,
168  	OPAL_STARTCOLUMN = 0x03,
169  	OPAL_ENDCOLUMN = 0x04,
170  	OPAL_VALUES = 0x01,
171  	/* table table */
172  	OPAL_TABLE_UID = 0x00,
173  	OPAL_TABLE_NAME = 0x01,
174  	OPAL_TABLE_COMMON = 0x02,
175  	OPAL_TABLE_TEMPLATE = 0x03,
176  	OPAL_TABLE_KIND = 0x04,
177  	OPAL_TABLE_COLUMN = 0x05,
178  	OPAL_TABLE_COLUMNS = 0x06,
179  	OPAL_TABLE_ROWS = 0x07,
180  	OPAL_TABLE_ROWS_FREE = 0x08,
181  	OPAL_TABLE_ROW_BYTES = 0x09,
182  	OPAL_TABLE_LASTID = 0x0A,
183  	OPAL_TABLE_MIN = 0x0B,
184  	OPAL_TABLE_MAX = 0x0C,
185  	/* authority table */
186  	OPAL_PIN = 0x03,
187  	/* locking tokens */
188  	OPAL_RANGESTART = 0x03,
189  	OPAL_RANGELENGTH = 0x04,
190  	OPAL_READLOCKENABLED = 0x05,
191  	OPAL_WRITELOCKENABLED = 0x06,
192  	OPAL_READLOCKED = 0x07,
193  	OPAL_WRITELOCKED = 0x08,
194  	OPAL_ACTIVEKEY = 0x0A,
195  	/* lockingsp table */
196  	OPAL_LIFECYCLE = 0x06,
197  	/* locking info table */
198  	OPAL_MAXRANGES = 0x04,
199  	/* mbr control */
200  	OPAL_MBRENABLE = 0x01,
201  	OPAL_MBRDONE = 0x02,
202  	/* properties */
203  	OPAL_HOSTPROPERTIES = 0x00,
204  	/* atoms */
205  	OPAL_STARTLIST = 0xf0,
206  	OPAL_ENDLIST = 0xf1,
207  	OPAL_STARTNAME = 0xf2,
208  	OPAL_ENDNAME = 0xf3,
209  	OPAL_CALL = 0xf8,
210  	OPAL_ENDOFDATA = 0xf9,
211  	OPAL_ENDOFSESSION = 0xfa,
212  	OPAL_STARTTRANSACTON = 0xfb,
213  	OPAL_ENDTRANSACTON = 0xfC,
214  	OPAL_EMPTYATOM = 0xff,
215  	OPAL_WHERE = 0x00,
216  };
217  
218  /* Locking state for a locking range */
219  enum opal_lockingstate {
220  	OPAL_LOCKING_READWRITE = 0x01,
221  	OPAL_LOCKING_READONLY = 0x02,
222  	OPAL_LOCKING_LOCKED = 0x03,
223  };
224  
225  enum opal_parameter {
226  	OPAL_SUM_SET_LIST = 0x060000,
227  };
228  
229  enum opal_revertlsp {
230  	OPAL_KEEP_GLOBAL_RANGE_KEY = 0x060000,
231  };
232  
233  /* Packets derived from:
234   * TCG_Storage_Architecture_Core_Spec_v2.01_r1.00
235   * Secion: 3.2.3 ComPackets, Packets & Subpackets
236   */
237  
238  /* Comm Packet (header) for transmissions. */
239  struct opal_compacket {
240  	__be32 reserved0;
241  	u8 extendedComID[4];
242  	__be32 outstandingData;
243  	__be32 minTransfer;
244  	__be32 length;
245  };
246  
247  /* Packet structure. */
248  struct opal_packet {
249  	__be32 tsn;
250  	__be32 hsn;
251  	__be32 seq_number;
252  	__be16 reserved0;
253  	__be16 ack_type;
254  	__be32 acknowledgment;
255  	__be32 length;
256  };
257  
258  /* Data sub packet header */
259  struct opal_data_subpacket {
260  	u8 reserved0[6];
261  	__be16 kind;
262  	__be32 length;
263  };
264  
265  /* header of a response */
266  struct opal_header {
267  	struct opal_compacket cp;
268  	struct opal_packet pkt;
269  	struct opal_data_subpacket subpkt;
270  };
271  
272  #define FC_TPER       0x0001
273  #define FC_LOCKING    0x0002
274  #define FC_GEOMETRY   0x0003
275  #define FC_ENTERPRISE 0x0100
276  #define FC_DATASTORE  0x0202
277  #define FC_SINGLEUSER 0x0201
278  #define FC_OPALV100   0x0200
279  #define FC_OPALV200   0x0203
280  
281  /*
282   * The Discovery 0 Header. As defined in
283   * Opal SSC Documentation
284   * Section: 3.3.5 Capability Discovery
285   */
286  struct d0_header {
287  	__be32 length; /* the length of the header 48 in 2.00.100 */
288  	__be32 revision; /**< revision of the header 1 in 2.00.100 */
289  	__be32 reserved01;
290  	__be32 reserved02;
291  	/*
292  	 * the remainder of the structure is vendor specific and will not be
293  	 * addressed now
294  	 */
295  	u8 ignored[32];
296  };
297  
298  /*
299   * TPer Feature Descriptor. Contains flags indicating support for the
300   * TPer features described in the OPAL specification. The names match the
301   * OPAL terminology
302   *
303   * code == 0x001 in 2.00.100
304   */
305  struct d0_tper_features {
306  	/*
307  	 * supported_features bits:
308  	 * bit 7: reserved
309  	 * bit 6: com ID management
310  	 * bit 5: reserved
311  	 * bit 4: streaming support
312  	 * bit 3: buffer management
313  	 * bit 2: ACK/NACK
314  	 * bit 1: async
315  	 * bit 0: sync
316  	 */
317  	u8 supported_features;
318  	/*
319  	 * bytes 5 through 15 are reserved, but we represent the first 3 as
320  	 * u8 to keep the other two 32bits integers aligned.
321  	 */
322  	u8 reserved01[3];
323  	__be32 reserved02;
324  	__be32 reserved03;
325  };
326  
327  /*
328   * Locking Feature Descriptor. Contains flags indicating support for the
329   * locking features described in the OPAL specification. The names match the
330   * OPAL terminology
331   *
332   * code == 0x0002 in 2.00.100
333   */
334  struct d0_locking_features {
335  	/*
336  	 * supported_features bits:
337  	 * bits 6-7: reserved
338  	 * bit 5: MBR done
339  	 * bit 4: MBR enabled
340  	 * bit 3: media encryption
341  	 * bit 2: locked
342  	 * bit 1: locking enabled
343  	 * bit 0: locking supported
344  	 */
345  	u8 supported_features;
346  	/*
347  	 * bytes 5 through 15 are reserved, but we represent the first 3 as
348  	 * u8 to keep the other two 32bits integers aligned.
349  	 */
350  	u8 reserved01[3];
351  	__be32 reserved02;
352  	__be32 reserved03;
353  };
354  
355  /*
356   * Geometry Feature Descriptor. Contains flags indicating support for the
357   * geometry features described in the OPAL specification. The names match the
358   * OPAL terminology
359   *
360   * code == 0x0003 in 2.00.100
361   */
362  struct d0_geometry_features {
363  	/*
364  	 * skip 32 bits from header, needed to align the struct to 64 bits.
365  	 */
366  	u8 header[4];
367  	/*
368  	 * reserved01:
369  	 * bits 1-6: reserved
370  	 * bit 0: align
371  	 */
372  	u8 reserved01;
373  	u8 reserved02[7];
374  	__be32 logical_block_size;
375  	__be64 alignment_granularity;
376  	__be64 lowest_aligned_lba;
377  };
378  
379  /*
380   * Enterprise SSC Feature
381   *
382   * code == 0x0100
383   */
384  struct d0_enterprise_ssc {
385  	__be16 baseComID;
386  	__be16 numComIDs;
387  	/* range_crossing:
388  	 * bits 1-6: reserved
389  	 * bit 0: range crossing
390  	 */
391  	u8 range_crossing;
392  	u8 reserved01;
393  	__be16 reserved02;
394  	__be32 reserved03;
395  	__be32 reserved04;
396  };
397  
398  /*
399   * Opal V1 feature
400   *
401   * code == 0x0200
402   */
403  struct d0_opal_v100 {
404  	__be16 baseComID;
405  	__be16 numComIDs;
406  };
407  
408  /*
409   * Single User Mode feature
410   *
411   * code == 0x0201
412   */
413  struct d0_single_user_mode {
414  	__be32 num_locking_objects;
415  	/* reserved01:
416  	 * bit 0: any
417  	 * bit 1: all
418  	 * bit 2: policy
419  	 * bits 3-7: reserved
420  	 */
421  	u8 reserved01;
422  	u8 reserved02;
423  	__be16 reserved03;
424  	__be32 reserved04;
425  };
426  
427  /*
428   * Additonal Datastores feature
429   *
430   * code == 0x0202
431   */
432  struct d0_datastore_table {
433  	__be16 reserved01;
434  	__be16 max_tables;
435  	__be32 max_size_tables;
436  	__be32 table_size_alignment;
437  };
438  
439  /*
440   * OPAL 2.0 feature
441   *
442   * code == 0x0203
443   */
444  struct d0_opal_v200 {
445  	__be16 baseComID;
446  	__be16 numComIDs;
447  	/* range_crossing:
448  	 * bits 1-6: reserved
449  	 * bit 0: range crossing
450  	 */
451  	u8 range_crossing;
452  	/* num_locking_admin_auth:
453  	 * not aligned to 16 bits, so use two u8.
454  	 * stored in big endian:
455  	 * 0: MSB
456  	 * 1: LSB
457  	 */
458  	u8 num_locking_admin_auth[2];
459  	/* num_locking_user_auth:
460  	 * not aligned to 16 bits, so use two u8.
461  	 * stored in big endian:
462  	 * 0: MSB
463  	 * 1: LSB
464  	 */
465  	u8 num_locking_user_auth[2];
466  	u8 initialPIN;
467  	u8 revertedPIN;
468  	u8 reserved01;
469  	__be32 reserved02;
470  };
471  
472  /* Union of features used to parse the discovery 0 response */
473  struct d0_features {
474  	__be16 code;
475  	/*
476  	 * r_version bits:
477  	 * bits 4-7: version
478  	 * bits 0-3: reserved
479  	 */
480  	u8 r_version;
481  	u8 length;
482  	u8 features[];
483  };
484  
485  #endif /* _OPAL_PROTO_H */
486