Home | History | Annotate | Download | only in Tcg2Smm
      1 /** @file
      2   The TPM2 definition block in ACPI table for TCG2 physical presence
      3   and MemoryClear.
      4 
      5 Copyright (c) 2015, 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 DefinitionBlock (
     17   "Tpm.aml",
     18   "SSDT",
     19   2,
     20   "INTEL ",
     21   "Tpm2Tabl",
     22   0x1000
     23   )
     24 {
     25   Scope (\_SB)
     26   {
     27     Device (TPM)
     28     {
     29       //
     30       // TCG2
     31       //
     32       Name (_HID, "MSFT0101")
     33 
     34       //
     35       // Readable name of this device, don't know if this way is correct yet
     36       //
     37       Name (_STR, Unicode ("TPM 2.0 Device"))
     38 
     39       //
     40       // Return the resource consumed by TPM device
     41       //
     42       Name (_CRS, ResourceTemplate () {
     43         Memory32Fixed (ReadOnly, 0xfed40000, 0x5000)
     44       })
     45 
     46       //
     47       // Operational region for Smi port access
     48       //
     49       OperationRegion (SMIP, SystemIO, 0xB2, 1)
     50       Field (SMIP, ByteAcc, NoLock, Preserve)
     51       {
     52           IOB2, 8
     53       }
     54 
     55       //
     56       // Operational region for TPM access
     57       //
     58       OperationRegion (TPMR, SystemMemory, 0xfed40000, 0x5000)
     59       Field (TPMR, AnyAcc, NoLock, Preserve)
     60       {
     61         ACC0, 8,
     62       }
     63 
     64       //
     65       // Operational region for TPM support, TPM Physical Presence and TPM Memory Clear
     66       // Region Offset 0xFFFF0000 and Length 0xF0 will be fixed in C code.
     67       //
     68       OperationRegion (TNVS, SystemMemory, 0xFFFF0000, 0xF0)
     69       Field (TNVS, AnyAcc, NoLock, Preserve)
     70       {
     71         PPIN,   8,  //   Software SMI for Physical Presence Interface
     72         PPIP,   32, //   Used for save physical presence paramter
     73         PPRP,   32, //   Physical Presence request operation response
     74         PPRQ,   32, //   Physical Presence request operation
     75         PPRM,   32, //   Physical Presence request operation parameter
     76         LPPR,   32, //   Last Physical Presence request operation
     77         FRET,   32, //   Physical Presence function return code
     78         MCIN,   8,  //   Software SMI for Memory Clear Interface
     79         MCIP,   32, //   Used for save the Mor paramter
     80         MORD,   32, //   Memory Overwrite Request Data
     81         MRET,   32  //   Memory Overwrite function return code
     82       }
     83 
     84       Method (PTS, 1, Serialized)
     85       {
     86         //
     87         // Detect Sx state for MOR, only S4, S5 need to handle
     88         //
     89         If (LAnd (LLess (Arg0, 6), LGreater (Arg0, 3)))
     90         {
     91           //
     92           // Bit4 -- DisableAutoDetect. 0 -- Firmware MAY autodetect.
     93           //
     94           If (LNot (And (MORD, 0x10)))
     95           {
     96             //
     97             // Triggle the SMI through ACPI _PTS method.
     98             //
     99             Store (0x02, MCIP)
    100 
    101             //
    102             // Triggle the SMI interrupt
    103             //
    104             Store (MCIN, IOB2)
    105           }
    106         }
    107         Return (0)
    108       }
    109 
    110       Method (_STA, 0)
    111       {
    112         if (LEqual (ACC0, 0xff))
    113         {
    114             Return (0)
    115         }
    116         Return (0x0f)
    117       }
    118 
    119       //
    120       // TCG Hardware Information
    121       //
    122       Method (HINF, 3, Serialized, 0, {BuffObj, PkgObj}, {UnknownObj, UnknownObj, UnknownObj}) // IntObj, IntObj, PkgObj
    123       {
    124         //
    125         // Switch by function index
    126         //
    127         Switch (ToInteger(Arg1))
    128         {
    129           Case (0)
    130           {
    131             //
    132             // Standard query
    133             //
    134             Return (Buffer () {0x03})
    135           }
    136           Case (1)
    137           {
    138             //
    139             // Return failure if no TPM present
    140             //
    141             Name(TPMV, Package () {0x01, Package () {0x2, 0x0}})
    142             if (LEqual (_STA (), 0x00))
    143             {
    144               Return (Package () {0x00})
    145             }
    146 
    147             //
    148             // Return TPM version
    149             //
    150             Return (TPMV)
    151           }
    152           Default {BreakPoint}
    153         }
    154         Return (Buffer () {0})
    155       }
    156 
    157       Name(TPM2, Package (0x02){
    158         Zero,
    159         Zero
    160       })
    161 
    162       Name(TPM3, Package (0x03){
    163         Zero,
    164         Zero,
    165         Zero
    166       })
    167 
    168       //
    169       // TCG Physical Presence Interface
    170       //
    171       Method (TPPI, 3, Serialized, 0, {BuffObj, PkgObj, IntObj, StrObj}, {UnknownObj, UnknownObj, UnknownObj}) // IntObj, IntObj, PkgObj
    172       {
    173         //
    174         // Switch by function index
    175         //
    176         Switch (ToInteger(Arg1))
    177         {
    178           Case (0)
    179           {
    180             //
    181             // Standard query, supports function 1-8
    182             //
    183             Return (Buffer () {0xFF, 0x01})
    184           }
    185           Case (1)
    186           {
    187             //
    188             // a) Get Physical Presence Interface Version
    189             //
    190             Return ("1.2")
    191           }
    192           Case (2)
    193           {
    194             //
    195             // b) Submit TPM Operation Request to Pre-OS Environment
    196             //
    197 
    198             Store (DerefOf (Index (Arg2, 0x00)), PPRQ)
    199             Store (0x02, PPIP)
    200 
    201             //
    202             // Triggle the SMI interrupt
    203             //
    204             Store (PPIN, IOB2)
    205             Return (FRET)
    206 
    207 
    208           }
    209           Case (3)
    210           {
    211             //
    212             // c) Get Pending TPM Operation Requested By the OS
    213             //
    214 
    215             Store (PPRQ, Index (TPM2, 0x01))
    216             Return (TPM2)
    217           }
    218           Case (4)
    219           {
    220             //
    221             // d) Get Platform-Specific Action to Transition to Pre-OS Environment
    222             //
    223             Return (2)
    224           }
    225           Case (5)
    226           {
    227             //
    228             // e) Return TPM Operation Response to OS Environment
    229             //
    230             Store (0x05, PPIP)
    231 
    232             //
    233             // Triggle the SMI interrupt
    234             //
    235             Store (PPIN, IOB2)
    236 
    237             Store (LPPR, Index (TPM3, 0x01))
    238             Store (PPRP, Index (TPM3, 0x02))
    239 
    240             Return (TPM3)
    241           }
    242           Case (6)
    243           {
    244 
    245             //
    246             // f) Submit preferred user language (Not implemented)
    247             //
    248 
    249             Return (3)
    250 
    251           }
    252           Case (7)
    253           {
    254             //
    255             // g) Submit TPM Operation Request to Pre-OS Environment 2
    256             //
    257             Store (7, PPIP)
    258             Store (DerefOf (Index (Arg2, 0x00)), PPRQ)
    259             Store (0, PPRM)
    260             If (LEqual (PPRQ, 23)) {
    261               Store (DerefOf (Index (Arg2, 0x01)), PPRM)
    262             }
    263 
    264             //
    265             // Triggle the SMI interrupt
    266             //
    267             Store (PPIN, IOB2)
    268             Return (FRET)
    269           }
    270           Case (8)
    271           {
    272             //
    273             // e) Get User Confirmation Status for Operation
    274             //
    275             Store (8, PPIP)
    276             Store (DerefOf (Index (Arg2, 0x00)), PPRQ)
    277 
    278             //
    279             // Triggle the SMI interrupt
    280             //
    281             Store (PPIN, IOB2)
    282 
    283             Return (FRET)
    284           }
    285 
    286           Default {BreakPoint}
    287         }
    288         Return (1)
    289       }
    290 
    291       Method (TMCI, 3, Serialized, 0, IntObj, {UnknownObj, UnknownObj, UnknownObj}) // IntObj, IntObj, PkgObj
    292       {
    293         //
    294         // Switch by function index
    295         //
    296         Switch (ToInteger (Arg1))
    297         {
    298           Case (0)
    299           {
    300             //
    301             // Standard query, supports function 1-1
    302             //
    303             Return (Buffer () {0x03})
    304           }
    305           Case (1)
    306           {
    307             //
    308             // Save the Operation Value of the Request to MORD (reserved memory)
    309             //
    310             Store (DerefOf (Index (Arg2, 0x00)), MORD)
    311 
    312             //
    313             // Triggle the SMI through ACPI _DSM method.
    314             //
    315             Store (0x01, MCIP)
    316 
    317             //
    318             // Triggle the SMI interrupt
    319             //
    320             Store (MCIN, IOB2)
    321             Return (MRET)
    322           }
    323           Default {BreakPoint}
    324         }
    325         Return (1)
    326       }
    327 
    328       Method (_DSM, 4, Serialized, 0, UnknownObj, {BuffObj, IntObj, IntObj, PkgObj})
    329       {
    330 
    331         //
    332         // TCG Hardware Information
    333         //
    334         If(LEqual(Arg0, ToUUID ("cf8e16a5-c1e8-4e25-b712-4f54a96702c8")))
    335         {
    336           Return (HINF (Arg1, Arg2, Arg3))
    337         }
    338 
    339         //
    340         // TCG Physical Presence Interface
    341         //
    342         If(LEqual(Arg0, ToUUID ("3dddfaa6-361b-4eb4-a424-8d10089d1653")))
    343         {
    344           Return (TPPI (Arg1, Arg2, Arg3))
    345         }
    346 
    347         //
    348         // TCG Memory Clear Interface
    349         //
    350         If(LEqual(Arg0, ToUUID ("376054ed-cc13-4675-901c-4756d7f2d45d")))
    351         {
    352           Return (TMCI (Arg1, Arg2, Arg3))
    353         }
    354 
    355         Return (Buffer () {0})
    356       }
    357     }
    358   }
    359 }
    360