/** @file
  Opal Specification defined values and structures.

  (TCG Storage Architecture Core Specification, Version 2.01, Revision 1.00,
  https://trustedcomputinggroup.org/tcg-storage-architecture-core-specification/

  Storage Work Group Storage Security Subsystem Class: Pyrite, Version 1.00 Final, Revision 1.00,
  https://trustedcomputinggroup.org/tcg-storage-security-subsystem-class-pyrite/

  Storage Work Group Storage Security Subsystem Class: Opal, Version 2.01 Final, Revision 1.00,
  https://trustedcomputinggroup.org/storage-work-group-storage-security-subsystem-class-opal/

  TCG Storage Security Subsystem Class: Opalite Version 1.00 Revision 1.00,
  https://trustedcomputinggroup.org/tcg-storage-security-subsystem-class-opalite/)

  Check http://trustedcomputinggroup.org for latest specification updates.

Copyright (c) 2016 - 2018, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution.  The full text of the license may be found at
http://opensource.org/licenses/bsd-license.php

THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

**/

#ifndef _TCG_STORAGE_OPAL_H_
#define _TCG_STORAGE_OPAL_H_

#include <IndustryStandard/TcgStorageCore.h>

#define OPAL_UID_ADMIN_SP                   TCG_TO_UID(0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x00, 0x01)
#define OPAL_UID_ADMIN_SP_C_PIN_MSID        TCG_TO_UID(0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x84, 0x02)
#define OPAL_UID_ADMIN_SP_C_PIN_SID         TCG_TO_UID(0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x01)
#define OPAL_UID_LOCKING_SP                 TCG_TO_UID(0x00, 0x00, 0x02, 0x05, 0x00, 0x00, 0x00, 0x02)

// ADMIN_SP
// Authorities
#define OPAL_ADMIN_SP_ANYBODY_AUTHORITY     TCG_TO_UID(0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01)
#define OPAL_ADMIN_SP_ADMINS_AUTHORITY      TCG_TO_UID(0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x02)
#define OPAL_ADMIN_SP_MAKERS_AUTHORITY      TCG_TO_UID(0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x03)
#define OPAL_ADMIN_SP_SID_AUTHORITY         TCG_TO_UID(0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x06)
#define OPAL_ADMIN_SP_ADMIN1_AUTHORITY      TCG_TO_UID(0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x02, 0x01)
#define OPAL_ADMIN_SP_PSID_AUTHORITY        TCG_TO_UID(0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0xFF, 0x01)

#define OPAL_ADMIN_SP_ACTIVATE_METHOD       TCG_TO_UID(0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x03)
#define OPAL_ADMIN_SP_REVERT_METHOD         TCG_TO_UID(0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x02)

// ADMIN_SP
// Data Removal mechanism
#define OPAL_UID_ADMIN_SP_DATA_REMOVAL_MECHANISM  TCG_TO_UID(0x00, 0x00, 0x11, 0x01, 0x00, 0x00, 0x00, 0x01)

// LOCKING SP
// Authorities
#define OPAL_LOCKING_SP_ANYBODY_AUTHORITY   TCG_TO_UID(0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01)
#define OPAL_LOCKING_SP_ADMINS_AUTHORITY    TCG_TO_UID(0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x02)
#define OPAL_LOCKING_SP_ADMIN1_AUTHORITY    TCG_TO_UID(0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00, 0x01)
#define OPAL_LOCKING_SP_USERS_AUTHORITY     TCG_TO_UID(0x00, 0x00, 0x00, 0x09, 0x00, 0x03, 0x00, 0x00)
#define OPAL_LOCKING_SP_USER1_AUTHORITY     TCG_TO_UID(0x00, 0x00, 0x00, 0x09, 0x00, 0x03, 0x00, 0x01)

#define OPAL_LOCKING_SP_REVERTSP_METHOD     TCG_TO_UID(0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x11)

// C_PIN Table Rows
#define OPAL_LOCKING_SP_C_PIN_ADMIN1        TCG_TO_UID( 0x00, 0x00, 0x00, 0x0B, 0x00, 0x01, 0x00, 0x01 )
#define OPAL_LOCKING_SP_C_PIN_USER1         TCG_TO_UID( 0x00, 0x00, 0x00, 0x0B, 0x00, 0x03, 0x00, 0x01 )

// Locking Table
#define OPAL_LOCKING_SP_LOCKING_GLOBALRANGE TCG_TO_UID( 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x01 )
#define OPAL_LOCKING_SP_LOCKING_RANGE1      TCG_TO_UID( 0x00, 0x00, 0x08, 0x02, 0x00, 0x03, 0x00, 0x01 )


// LOCKING SP ACE Table Preconfiguration
#define OPAL_LOCKING_SP_ACE_LOCKING_GLOBALRANGE_GET_ALL      TCG_TO_UID( 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0xD0, 0x00 )
#define OPAL_LOCKING_SP_ACE_LOCKING_GLOBALRANGE_SET_RDLOCKED TCG_TO_UID( 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0xE0, 0x00 )
#define OPAL_LOCKING_SP_ACE_LOCKING_GLOBALRANGE_SET_WRLOCKED TCG_TO_UID( 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0xE8, 0x00 )

#define OPAL_LOCKING_SP_ACE_K_AES_256_GLOBALRANGE_GENKEY TCG_TO_UID( 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0xB8, 0x00 )
#define OPAL_LOCKING_SP_ACE_K_AES_128_GLOBALRANGE_GENKEY TCG_TO_UID( 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0xB0, 0x00 )


// LOCKING SP LockingInfo Table Preconfiguration
#define OPAL_LOCKING_SP_LOCKING_INFO TCG_TO_UID( 0x00, 0x00, 0x08, 0x01, 0x00, 0x00, 0x00, 0x01 )

#define OPAL_LOCKING_SP_LOCKINGINFO_ALIGNMENTREQUIRED_COL       0x7
#define OPAL_LOCKING_SP_LOCKINGINFO_LOGICALBLOCKSIZE_COL        0x8
#define OPAL_LOCKING_SP_LOCKINGINFO_ALIGNMENTGRANULARITY_COL    0x9
#define OPAL_LOCKING_SP_LOCKINGINFO_LOWESTALIGNEDLBA_COL        0xA

// K_AES_256 Table Preconfiguration
#define OPAL_LOCKING_SP_K_AES_256_GLOBALRANGE_KEY TCG_TO_UID( 0x00, 0x00, 0x08, 0x06, 0x00, 0x00, 0x00, 0x01 )

// K_AES_128 Table Preconfiguration
#define OPAL_LOCKING_SP_K_AES_128_GLOBALRANGE_KEY TCG_TO_UID( 0x00, 0x00, 0x08, 0x05, 0x00, 0x00, 0x00, 0x01 )

// Minimum Properties that an Opal Compliant SD Shall support
#define OPAL_MIN_MAX_COM_PACKET_SIZE            2048
#define OPAL_MIN_MAX_REPONSE_COM_PACKET_SIZE    2048
#define OPAL_MIN_MAX_PACKET_SIZE                2028
#define OPAL_MIN_MAX_IND_TOKEN_SIZE             1992
#define OPAL_MIN_MAX_PACKETS                    1
#define OPAL_MIN_MAX_SUBPACKETS                 1
#define OPAL_MIN_MAX_METHODS                    1
#define OPAL_MIN_MAX_SESSIONS                   1
#define OPAL_MIN_MAX_AUTHENTICATIONS            2
#define OPAL_MIN_MAX_TRANSACTION_LIMIT          1

#define OPAL_ADMIN_SP_PIN_COL  3
#define OPAL_LOCKING_SP_C_PIN_TRYLIMIT_COL 5
#define OPAL_RANDOM_METHOD_MAX_COUNT_SIZE 32

// Data Removal Mechanism column.
#define OPAL_ADMIN_SP_ACTIVE_DATA_REMOVAL_MECHANISM_COL  1

//
// Supported Data Removal Mechanism.
// Detail see Pyrite SSC v2 spec.
//
typedef enum {
  OverwriteDataErase = 0,
  BlockErase,
  CryptoErase,
  Unmap,
  ResetWritePointers,
  VendorSpecificErase,
  ResearvedMechanism
} SUPPORTED_DATA_REMOVAL_MECHANISM;

#pragma pack(1)

typedef struct _OPAL_GEOMETRY_REPORTING_FEATURE {
  TCG_LEVEL0_FEATURE_DESCRIPTOR_HEADER Header;
  UINT8                                Reserved[8];
  UINT32                               LogicalBlockSizeBE;
  UINT64                               AlignmentGranularityBE;
  UINT64                               LowestAlignedLBABE;
} OPAL_GEOMETRY_REPORTING_FEATURE;

typedef struct _OPAL_SINGLE_USER_MODE_FEATURE  {
  TCG_LEVEL0_FEATURE_DESCRIPTOR_HEADER Header;
  UINT32                               NumLockingObjectsSupportedBE;
  UINT8                                Any : 1;
  UINT8                                All : 1;
  UINT8                                Policy : 1;
  UINT8                                Reserved : 5;
  UINT8                                Reserved2[7];
} OPAL_SINGLE_USER_MODE_FEATURE;

typedef struct _OPAL_DATASTORE_TABLE_FEATURE {
  TCG_LEVEL0_FEATURE_DESCRIPTOR_HEADER Header;
  UINT16                               Reserved;
  UINT16                               MaxNumTablesBE;
  UINT32                               MaxTotalSizeBE;
  UINT32                               SizeAlignmentBE;
} OPAL_DATASTORE_TABLE_FEATURE;

typedef struct _OPAL_SSCV1_FEATURE_DESCRIPTOR {
  TCG_LEVEL0_FEATURE_DESCRIPTOR_HEADER Header;
  UINT16                               BaseComdIdBE;
  UINT16                               NumComIdsBE;
  UINT8                                RangeCrossing : 1;
  UINT8                                Reserved : 7;
  UINT8                                Future[11];
} OPAL_SSCV1_FEATURE_DESCRIPTOR;

typedef struct _OPAL_SSCV2_FEATURE_DESCRIPTOR {
  TCG_LEVEL0_FEATURE_DESCRIPTOR_HEADER Header;
  UINT16                               BaseComdIdBE;
  UINT16                               NumComIdsBE;
  UINT8                                Reserved;
  UINT16                               NumLockingSpAdminAuthoritiesSupportedBE;
  UINT16                               NumLockingSpUserAuthoritiesSupportedBE;
  UINT8                                InitialCPINSIDPIN;
  UINT8                                CPINSIDPINRevertBehavior;
  UINT8                                Future[5];
} OPAL_SSCV2_FEATURE_DESCRIPTOR;

typedef struct _OPAL_SSCLITE_FEATURE_DESCRIPTOR {
  TCG_LEVEL0_FEATURE_DESCRIPTOR_HEADER Header;
  UINT16                               BaseComdIdBE;
  UINT16                               NumComIdsBE;
  UINT8                                Reserved[5];
  UINT8                                InitialCPINSIDPIN;
  UINT8                                CPINSIDPINRevertBehavior;
  UINT8                                Future[5];
} OPAL_SSCLITE_FEATURE_DESCRIPTOR;

typedef struct _PYRITE_SSC_FEATURE_DESCRIPTOR {
  TCG_LEVEL0_FEATURE_DESCRIPTOR_HEADER Header;
  UINT16                               BaseComdIdBE;
  UINT16                               NumComIdsBE;
  UINT8                                Reserved[5];
  UINT8                                InitialCPINSIDPIN;
  UINT8                                CPINSIDPINRevertBehavior;
  UINT8                                Future[5];
} PYRITE_SSC_FEATURE_DESCRIPTOR;

typedef struct _PYRITE_SSCV2_FEATURE_DESCRIPTOR {
  TCG_LEVEL0_FEATURE_DESCRIPTOR_HEADER Header;
  UINT16                               BaseComdIdBE;
  UINT16                               NumComIdsBE;
  UINT8                                Reserved[5];
  UINT8                                InitialCPINSIDPIN;
  UINT8                                CPINSIDPINRevertBehavior;
  UINT8                                Future[5];
} PYRITE_SSCV2_FEATURE_DESCRIPTOR;

typedef struct _DATA_REMOVAL_FEATURE_DESCRIPTOR {
  TCG_LEVEL0_FEATURE_DESCRIPTOR_HEADER Header;
  UINT8                                Reserved;
  UINT8                                OperationProcessing : 1;
  UINT8                                Reserved2 : 7;
  UINT8                                RemovalMechanism;
  UINT8                                FormatBit0 : 1;   // Data Removal Time Format for Bit 0
  UINT8                                FormatBit1 : 1;   // Data Removal Time Format for Bit 1
  UINT8                                FormatBit2 : 1;   // Data Removal Time Format for Bit 2
  UINT8                                FormatBit3 : 1;   // Data Removal Time Format for Bit 3
  UINT8                                FormatBit4 : 1;   // Data Removal Time Format for Bit 4
  UINT8                                FormatBit5 : 1;   // Data Removal Time Format for Bit 5
  UINT8                                Reserved3 : 2;
  UINT16                               TimeBit0;         // Data Removal Time for Supported Data Removal Mechanism Bit 0
  UINT16                               TimeBit1;         // Data Removal Time for Supported Data Removal Mechanism Bit 1
  UINT16                               TimeBit2;         // Data Removal Time for Supported Data Removal Mechanism Bit 2
  UINT16                               TimeBit3;         // Data Removal Time for Supported Data Removal Mechanism Bit 3
  UINT16                               TimeBit4;         // Data Removal Time for Supported Data Removal Mechanism Bit 4
  UINT16                               TimeBit5;         // Data Removal Time for Supported Data Removal Mechanism Bit 5
  UINT8                                Future[16];
} DATA_REMOVAL_FEATURE_DESCRIPTOR;

typedef union {
  TCG_LEVEL0_FEATURE_DESCRIPTOR_HEADER     CommonHeader;
  TCG_TPER_FEATURE_DESCRIPTOR              Tper;
  TCG_LOCKING_FEATURE_DESCRIPTOR           Locking;
  OPAL_GEOMETRY_REPORTING_FEATURE          Geometry;
  OPAL_SINGLE_USER_MODE_FEATURE            SingleUser;
  OPAL_DATASTORE_TABLE_FEATURE             DataStore;
  OPAL_SSCV1_FEATURE_DESCRIPTOR            OpalSscV1;
  OPAL_SSCV2_FEATURE_DESCRIPTOR            OpalSscV2;
  OPAL_SSCLITE_FEATURE_DESCRIPTOR          OpalSscLite;
  PYRITE_SSC_FEATURE_DESCRIPTOR            PyriteSsc;
  PYRITE_SSCV2_FEATURE_DESCRIPTOR          PyriteSscV2;
  TCG_BLOCK_SID_FEATURE_DESCRIPTOR         BlockSid;
  DATA_REMOVAL_FEATURE_DESCRIPTOR          DataRemoval;
} OPAL_LEVEL0_FEATURE_DESCRIPTOR;

#pragma pack()

#endif // _OPAL_H_
