Home | History | Annotate | Download | only in IndustryStandard
      1 /** @file
      2   Platform TPM Profile Specification definition for TPM2.0.
      3   It covers both FIFO and CRB interface.
      4 
      5 Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
      6 This program and the accompanying materials
      7 are licensed and made available under the terms and conditions of the BSD License
      8 which accompanies this distribution.  The full text of the license may be found at
      9 http://opensource.org/licenses/bsd-license.php
     10 
     11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     13 
     14 **/
     15 
     16 #ifndef _TPM_PTP_H_
     17 #define _TPM_PTP_H_
     18 
     19 //
     20 // PTP FIFO definition
     21 //
     22 
     23 //
     24 // Set structure alignment to 1-byte
     25 //
     26 #pragma pack (1)
     27 
     28 //
     29 // Register set map as specified in PTP specification Chapter 5
     30 //
     31 typedef struct {
     32   ///
     33   /// Used to gain ownership for this particular port.
     34   ///
     35   UINT8                             Access;             // 0
     36   UINT8                             Reserved1[7];       // 1
     37   ///
     38   /// Controls interrupts.
     39   ///
     40   UINT32                            IntEnable;          // 8
     41   ///
     42   /// SIRQ vector to be used by the TPM.
     43   ///
     44   UINT8                             IntVector;          // 0ch
     45   UINT8                             Reserved2[3];       // 0dh
     46   ///
     47   /// What caused interrupt.
     48   ///
     49   UINT32                            IntSts;             // 10h
     50   ///
     51   /// Shows which interrupts are supported by that particular TPM.
     52   ///
     53   UINT32                            InterfaceCapability;// 14h
     54   ///
     55   /// Status Register. Provides status of the TPM.
     56   ///
     57   UINT8                             Status;             // 18h
     58   ///
     59   /// Number of consecutive writes that can be done to the TPM.
     60   ///
     61   UINT16                            BurstCount;         // 19h
     62   ///
     63   /// Additional Status Register.
     64   ///
     65   UINT8                             StatusEx;           // 1Bh
     66   UINT8                             Reserved3[8];
     67   ///
     68   /// Read or write FIFO, depending on transaction.
     69   ///
     70   UINT32                            DataFifo;           // 24h
     71   UINT8                             Reserved4[8];       // 28h
     72   ///
     73   /// Used to identify the Interface types supported by the TPM.
     74   ///
     75   UINT32                            InterfaceId;        // 30h
     76   UINT8                             Reserved5[0x4c];    // 34h
     77   ///
     78   /// Extended ReadFIFO or WriteFIFO, depending on the current bus cycle (read or write)
     79   ///
     80   UINT32                            XDataFifo;          // 80h
     81   UINT8                             Reserved6[0xe7c];   // 84h
     82   ///
     83   /// Vendor ID
     84   ///
     85   UINT16                            Vid;                // 0f00h
     86   ///
     87   /// Device ID
     88   ///
     89   UINT16                            Did;                // 0f02h
     90   ///
     91   /// Revision ID
     92   ///
     93   UINT8                             Rid;                // 0f04h
     94   UINT8                             Reserved[0xfb];     // 0f05h
     95 } PTP_FIFO_REGISTERS;
     96 
     97 //
     98 // Restore original structure alignment
     99 //
    100 #pragma pack ()
    101 
    102 //
    103 // Define pointer types used to access TIS registers on PC
    104 //
    105 typedef PTP_FIFO_REGISTERS  *PTP_FIFO_REGISTERS_PTR;
    106 
    107 //
    108 // Define bits of FIFO Interface Identifier Register
    109 //
    110 typedef union {
    111   struct {
    112     UINT32   InterfaceType:4;
    113     UINT32   InterfaceVersion:4;
    114     UINT32   CapLocality:1;
    115     UINT32   Reserved1:2;
    116     UINT32   CapDataXferSizeSupport:2;
    117     UINT32   CapFIFO:1;
    118     UINT32   CapCRB:1;
    119     UINT32   CapIFRes:2;
    120     UINT32   InterfaceSelector:2;
    121     UINT32   IntfSelLock:1;
    122     UINT32   Reserved2:4;
    123     UINT32   Reserved3:8;
    124   } Bits;
    125   UINT32   Uint32;
    126 } PTP_FIFO_INTERFACE_IDENTIFIER;
    127 
    128 //
    129 // Define bits of FIFO Interface Capability Register
    130 //
    131 typedef union {
    132   struct {
    133     UINT32   DataAvailIntSupport:1;
    134     UINT32   StsValidIntSupport:1;
    135     UINT32   LocalityChangeIntSupport:1;
    136     UINT32   InterruptLevelHigh:1;
    137     UINT32   InterruptLevelLow:1;
    138     UINT32   InterruptEdgeRising:1;
    139     UINT32   InterruptEdgeFalling:1;
    140     UINT32   CommandReadyIntSupport:1;
    141     UINT32   BurstCountStatic:1;
    142     UINT32   DataTransferSizeSupport:2;
    143     UINT32   Reserved:17;
    144     UINT32   InterfaceVersion:3;
    145     UINT32   Reserved2:1;
    146   } Bits;
    147   UINT32   Uint32;
    148 } PTP_FIFO_INTERFACE_CAPABILITY;
    149 
    150 ///
    151 /// InterfaceVersion
    152 ///
    153 #define INTERFACE_CAPABILITY_INTERFACE_VERSION_TIS_12  0x0
    154 #define INTERFACE_CAPABILITY_INTERFACE_VERSION_TIS_13  0x2
    155 #define INTERFACE_CAPABILITY_INTERFACE_VERSION_PTP     0x3
    156 
    157 
    158 //
    159 // Define bits of ACCESS and STATUS registers
    160 //
    161 
    162 ///
    163 /// This bit is a 1 to indicate that the other bits in this register are valid.
    164 ///
    165 #define PTP_FIFO_VALID                BIT7
    166 ///
    167 /// Indicate that this locality is active.
    168 ///
    169 #define PTP_FIFO_ACC_ACTIVE           BIT5
    170 ///
    171 /// Set to 1 to indicate that this locality had the TPM taken away while
    172 /// this locality had the TIS_PC_ACC_ACTIVE bit set.
    173 ///
    174 #define PTP_FIFO_ACC_SEIZED           BIT4
    175 ///
    176 /// Set to 1 to indicate that TPM MUST reset the
    177 /// TIS_PC_ACC_ACTIVE bit and remove ownership for localities less than the
    178 /// locality that is writing this bit.
    179 ///
    180 #define PTP_FIFO_ACC_SEIZE            BIT3
    181 ///
    182 /// When this bit is 1, another locality is requesting usage of the TPM.
    183 ///
    184 #define PTP_FIFO_ACC_PENDIND          BIT2
    185 ///
    186 /// Set to 1 to indicate that this locality is requesting to use TPM.
    187 ///
    188 #define PTP_FIFO_ACC_RQUUSE           BIT1
    189 ///
    190 /// A value of 1 indicates that a T/OS has not been established on the platform
    191 ///
    192 #define PTP_FIFO_ACC_ESTABLISH        BIT0
    193 
    194 ///
    195 /// This field indicates that STS_DATA and STS_EXPECT are valid
    196 ///
    197 #define PTP_FIFO_STS_VALID            BIT7
    198 ///
    199 /// When this bit is 1, TPM is in the Ready state,
    200 /// indicating it is ready to receive a new command.
    201 ///
    202 #define PTP_FIFO_STS_READY            BIT6
    203 ///
    204 /// Write a 1 to this bit to cause the TPM to execute that command.
    205 ///
    206 #define PTP_FIFO_STS_GO               BIT5
    207 ///
    208 /// This bit indicates that the TPM has data available as a response.
    209 ///
    210 #define PTP_FIFO_STS_DATA             BIT4
    211 ///
    212 /// The TPM sets this bit to a value of 1 when it expects another byte of data for a command.
    213 ///
    214 #define PTP_FIFO_STS_EXPECT           BIT3
    215 ///
    216 /// Indicates that the TPM has completed all self-test actions following a TPM_ContinueSelfTest command.
    217 ///
    218 #define PTP_FIFO_STS_SELFTEST_DONE    BIT2
    219 ///
    220 /// Writes a 1 to this bit to force the TPM to re-send the response.
    221 ///
    222 #define PTP_FIFO_STS_RETRY            BIT1
    223 
    224 ///
    225 /// TPM Family Identifier.
    226 /// 00: TPM 1.2 Family
    227 /// 01: TPM 2.0 Family
    228 ///
    229 #define PTP_FIFO_STS_EX_TPM_FAMILY    (BIT2 | BIT3)
    230 #define PTP_FIFO_STS_EX_TPM_FAMILY_OFFSET    (2)
    231 #define PTP_FIFO_STS_EX_TPM_FAMILY_TPM12    (0)
    232 #define PTP_FIFO_STS_EX_TPM_FAMILY_TPM20    (BIT2)
    233 ///
    234 /// A write of 1 after tpmGo and before dataAvail aborts the currently executing command, resulting in a response of TPM_RC_CANCELLED.
    235 /// A write of 1 after dataAvail and before tpmGo is ignored by the TPM.
    236 ///
    237 #define PTP_FIFO_STS_EX_CANCEL        BIT0
    238 
    239 
    240 //
    241 // PTP CRB definition
    242 //
    243 
    244 //
    245 // Set structure alignment to 1-byte
    246 //
    247 #pragma pack (1)
    248 
    249 //
    250 // Register set map as specified in PTP specification Chapter 5
    251 //
    252 typedef struct {
    253   ///
    254   /// Used to determine current state of Locality of the TPM.
    255   ///
    256   UINT32                            LocalityState;             // 0
    257   UINT8                             Reserved1[4];              // 4
    258   ///
    259   /// Used to gain control of the TPM by this Locality.
    260   ///
    261   UINT32                            LocalityControl;           // 8
    262   ///
    263   /// Used to determine whether Locality has been granted or Seized.
    264   ///
    265   UINT32                            LocalityStatus;            // 0ch
    266   UINT8                             Reserved2[0x20];           // 10h
    267   ///
    268   /// Used to identify the Interface types supported by the TPM.
    269   ///
    270   UINT32                            InterfaceId;               // 30h
    271   ///
    272   /// Vendor ID
    273   ///
    274   UINT16                            Vid;                       // 34h
    275   ///
    276   /// Device ID
    277   ///
    278   UINT16                            Did;                       // 36h
    279   ///
    280   /// Optional Register used in low memory environments prior to CRB_DATA_BUFFER availability.
    281   ///
    282   UINT64                            CrbControlExtension;       // 38h
    283   ///
    284   /// Register used to initiate transactions for the CRB interface.
    285   ///
    286   UINT32                            CrbControlRequest;         // 40h
    287   ///
    288   /// Register used by the TPM to provide status of the CRB interface.
    289   ///
    290   UINT32                            CrbControlStatus;          // 44h
    291   ///
    292   /// Register used by software to cancel command processing.
    293   ///
    294   UINT32                            CrbControlCancel;          // 48h
    295   ///
    296   /// Register used to indicate presence of command or response data in the CRB buffer.
    297   ///
    298   UINT32                            CrbControlStart;           // 4Ch
    299   ///
    300   /// Register used to configure and respond to interrupts.
    301   ///
    302   UINT32                            CrbInterruptEnable;        // 50h
    303   UINT32                            CrbInterruptStatus;        // 54h
    304   ///
    305   /// Size of the Command buffer.
    306   ///
    307   UINT32                            CrbControlCommandSize;     // 58h
    308   ///
    309   /// Command buffer start address
    310   ///
    311   UINT32                            CrbControlCommandAddressLow;   // 5Ch
    312   UINT32                            CrbControlCommandAddressHigh;  // 60h
    313   ///
    314   /// Size of the Response buffer
    315   ///
    316   UINT32                            CrbControlResponseSize;    // 64h
    317   ///
    318   /// Address of the start of the Response buffer
    319   ///
    320   UINT64                            CrbControlResponseAddrss;  // 68h
    321   UINT8                             Reserved4[0x10];           // 70h
    322   ///
    323   /// Command/Response Data may be defined as large as 3968 (0xF80).
    324   ///
    325   UINT8                             CrbDataBuffer[0xF80];      // 80h
    326 } PTP_CRB_REGISTERS;
    327 
    328 //
    329 // Define pointer types used to access CRB registers on PTP
    330 //
    331 typedef PTP_CRB_REGISTERS  *PTP_CRB_REGISTERS_PTR;
    332 
    333 //
    334 // Define bits of CRB Interface Identifier Register
    335 //
    336 typedef union {
    337   struct {
    338     UINT32   InterfaceType:4;
    339     UINT32   InterfaceVersion:4;
    340     UINT32   CapLocality:1;
    341     UINT32   Reserved1:2;
    342     UINT32   CapDataXferSizeSupport:2;
    343     UINT32   CapFIFO:1;
    344     UINT32   CapCRB:1;
    345     UINT32   CapIFRes:2;
    346     UINT32   InterfaceSelector:2;
    347     UINT32   IntfSelLock:1;
    348     UINT32   Reserved2:4;
    349     UINT32   Rid:8;
    350   } Bits;
    351   UINT32   Uint32;
    352 } PTP_CRB_INTERFACE_IDENTIFIER;
    353 
    354 ///
    355 /// InterfaceType
    356 ///
    357 #define PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_FIFO  0x0
    358 #define PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_CRB   0x1
    359 #define PTP_INTERFACE_IDENTIFIER_INTERFACE_TYPE_TIS   0xF
    360 
    361 ///
    362 /// InterfaceVersion
    363 ///
    364 #define PTP_INTERFACE_IDENTIFIER_INTERFACE_VERSION_FIFO  0x0
    365 #define PTP_INTERFACE_IDENTIFIER_INTERFACE_VERSION_CRB   0x1
    366 
    367 ///
    368 /// InterfaceSelector
    369 ///
    370 #define PTP_INTERFACE_IDENTIFIER_INTERFACE_SELECTOR_FIFO  0x0
    371 #define PTP_INTERFACE_IDENTIFIER_INTERFACE_SELECTOR_CRB   0x1
    372 
    373 //
    374 // Define bits of Locality State Register
    375 //
    376 
    377 ///
    378 /// This bit indicates whether all other bits of this register contain valid values, if it is a 1.
    379 ///
    380 #define PTP_CRB_LOCALITY_STATE_TPM_REG_VALID_STATUS       BIT7
    381 
    382 ///
    383 /// 000 - Locality 0
    384 /// 001 - Locality 1
    385 /// 010 - Locality 2
    386 /// 011 - Locality 3
    387 /// 100 - Locality 4
    388 ///
    389 #define PTP_CRB_LOCALITY_STATE_ACTIVE_LOCALITY_MASK       (BIT2 | BIT3 | BIT4)
    390 #define PTP_CRB_LOCALITY_STATE_ACTIVE_LOCALITY_0          (0)
    391 #define PTP_CRB_LOCALITY_STATE_ACTIVE_LOCALITY_1          (BIT2)
    392 #define PTP_CRB_LOCALITY_STATE_ACTIVE_LOCALITY_2          (BIT3)
    393 #define PTP_CRB_LOCALITY_STATE_ACTIVE_LOCALITY_3          (BIT2 | BIT3)
    394 #define PTP_CRB_LOCALITY_STATE_ACTIVE_LOCALITY_4          (BIT4)
    395 
    396 ///
    397 /// A 0 indicates to the host that no locality is assigned.
    398 /// A 1 indicates a locality has been assigned.
    399 ///
    400 #define PTP_CRB_LOCALITY_STATE_LOCALITY_ASSIGNED          BIT1
    401 
    402 ///
    403 /// The TPM clears this bit to 0 upon receipt of _TPM_Hash_End
    404 /// The TPM sets this bit to a 1 when the TPM_LOC_CTRL_x.resetEstablishment field is set to 1.
    405 ///
    406 #define PTP_CRB_LOCALITY_STATE_TPM_ESTABLISHED            BIT0
    407 
    408 //
    409 // Define bits of Locality Control Register
    410 //
    411 
    412 ///
    413 /// Writes (1): Reset TPM_LOC_STATE_x.tpmEstablished bit if the write occurs from Locality 3 or 4.
    414 ///
    415 #define PTP_CRB_LOCALITY_CONTROL_RESET_ESTABLISHMENT_BIT  BIT3
    416 
    417 ///
    418 /// Writes (1): The TPM gives control of the TPM to the locality setting this bit if it is the higher priority locality.
    419 ///
    420 #define PTP_CRB_LOCALITY_CONTROL_SEIZE                    BIT2
    421 
    422 ///
    423 /// Writes (1): The active Locality is done with the TPM.
    424 ///
    425 #define PTP_CRB_LOCALITY_CONTROL_RELINQUISH               BIT1
    426 
    427 ///
    428 /// Writes (1): Interrupt the TPM and generate a locality arbitration algorithm.
    429 ///
    430 #define PTP_CRB_LOCALITY_CONTROL_REQUEST_ACCESS           BIT0
    431 
    432 //
    433 // Define bits of Locality Status Register
    434 //
    435 
    436 ///
    437 /// 0: A higher locality has not initiated a Seize arbitration process.
    438 /// 1: A higher locality has Seized the TPM from this locality.
    439 ///
    440 #define PTP_CRB_LOCALITY_STATUS_BEEN_SEIZED               BIT1
    441 
    442 ///
    443 /// 0: Locality has not been granted to the TPM.
    444 /// 1: Locality has been granted access to the TPM
    445 ///
    446 #define PTP_CRB_LOCALITY_STATUS_GRANTED                   BIT0
    447 
    448 //
    449 // Define bits of CRB Control Area Request Register
    450 //
    451 
    452 ///
    453 /// Used by Software to indicate transition the TPM to and from the Idle state
    454 /// 1: Set by Software to indicate response has been read from the response buffer and TPM can transition to Idle
    455 /// 0: Cleared to 0 by TPM to acknowledge the request when TPM enters Idle state.
    456 /// TPM SHALL complete this transition within TIMEOUT_C.
    457 ///
    458 #define PTP_CRB_CONTROL_AREA_REQUEST_GO_IDLE              BIT1
    459 
    460 ///
    461 /// Used by Software to request the TPM transition to the Ready State.
    462 /// 1: Set to 1 by Software to indicate the TPM should be ready to receive a command.
    463 /// 0: Cleared to 0 by TPM to acknowledge the request.
    464 /// TPM SHALL complete this transition within TIMEOUT_C.
    465 ///
    466 #define PTP_CRB_CONTROL_AREA_REQUEST_COMMAND_READY        BIT0
    467 
    468 //
    469 // Define bits of CRB Control Area Status Register
    470 //
    471 
    472 ///
    473 /// Used by TPM to indicate it is in the Idle State
    474 /// 1: Set by TPM when in the Idle State
    475 /// 0: Cleared by TPM on receipt of TPM_CRB_CTRL_REQ_x.cmdReady when TPM transitions to the Ready State.
    476 /// SHALL be cleared by TIMEOUT_C.
    477 ///
    478 #define PTP_CRB_CONTROL_AREA_STATUS_TPM_IDLE              BIT1
    479 
    480 ///
    481 /// Used by the TPM to indicate current status.
    482 /// 1: Set by TPM to indicate a FATAL Error
    483 /// 0: Indicates TPM is operational
    484 ///
    485 #define PTP_CRB_CONTROL_AREA_STATUS_TPM_STATUS            BIT0
    486 
    487 //
    488 // Define bits of CRB Control Cancel Register
    489 //
    490 
    491 ///
    492 /// Used by software to cancel command processing Reads return correct value
    493 /// Writes (0000 0001h): Cancel a command
    494 /// Writes (0000 0000h): Clears field when command has been cancelled
    495 ///
    496 #define PTP_CRB_CONTROL_CANCEL                            BIT0
    497 
    498 //
    499 // Define bits of CRB Control Start Register
    500 //
    501 
    502 ///
    503 /// When set by software, indicates a command is ready for processing.
    504 /// Writes (0000 0001h): TPM transitions to Command Execution
    505 /// Writes (0000 0000h): TPM clears this field and transitions to Command Completion
    506 ///
    507 #define PTP_CRB_CONTROL_START                             BIT0
    508 
    509 //
    510 // Restore original structure alignment
    511 //
    512 #pragma pack ()
    513 
    514 //
    515 // Default TimeOut value
    516 //
    517 #define PTP_TIMEOUT_A               (750 * 1000)   // 750ms
    518 #define PTP_TIMEOUT_B               (2000 * 1000)  // 2s
    519 #define PTP_TIMEOUT_C               (200 * 1000)   // 200ms
    520 #define PTP_TIMEOUT_D               (30 * 1000)    // 30ms
    521 
    522 #endif