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