2 The TPM2 definition block in ACPI table for TCG2 physical presence
5 Copyright (c) 2015 - 2017, Intel Corporation. All rights reserved.<BR>
6 (c)Copyright 2016 HP Development Company, L.P.<BR>
7 Copyright (c) 2017, Microsoft Corporation. All rights reserved. <BR>
8 This program and the accompanying materials
9 are licensed and made available under the terms and conditions of the BSD License
10 which accompanies this distribution. The full text of the license may be found at
11 http://opensource.org/licenses/bsd-license.php
13 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
14 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
36 // TAG for patching TPM2.0 _HID
38 Name (_HID, "NNNN0000")
40 Name (_CID, "MSFT0101")
43 // Readable name of this device, don't know if this way is correct yet
45 Name (_STR, Unicode ("TPM 2.0 Device"))
48 // Operational region for Smi port access
50 OperationRegion (SMIP, SystemIO, 0xB2, 1)
51 Field (SMIP, ByteAcc, NoLock, Preserve)
57 // Operational region for TPM access
59 OperationRegion (TPMR, SystemMemory, 0xfed40000, 0x5000)
60 Field (TPMR, AnyAcc, NoLock, Preserve)
62 ACC0, 8, // TPM_ACCESS_0
64 INTE, 32, // TPM_INT_ENABLE_0
65 INTV, 8, // TPM_INT_VECTOR_0
67 INTS, 32, // TPM_INT_STATUS_0
68 INTF, 32, // TPM_INTF_CAPABILITY_0
69 STS0, 32, // TPM_STS_0
71 FIFO, 32, // TPM_DATA_FIFO_0
73 TID0, 32, // TPM_INTERFACE_ID_0
78 // Operational region for TPM support, TPM Physical Presence and TPM Memory Clear
79 // Region Offset 0xFFFF0000 and Length 0xF0 will be fixed in C code.
81 OperationRegion (TNVS, SystemMemory, 0xFFFF0000, 0xF0)
82 Field (TNVS, AnyAcc, NoLock, Preserve)
84 PPIN, 8, // Software SMI for Physical Presence Interface
85 PPIP, 32, // Used for save physical presence paramter
86 PPRP, 32, // Physical Presence request operation response
87 PPRQ, 32, // Physical Presence request operation
88 PPRM, 32, // Physical Presence request operation parameter
89 LPPR, 32, // Last Physical Presence request operation
90 FRET, 32, // Physical Presence function return code
91 MCIN, 8, // Software SMI for Memory Clear Interface
92 MCIP, 32, // Used for save the Mor paramter
93 MORD, 32, // Memory Overwrite Request Data
94 MRET, 32, // Memory Overwrite function return code
95 UCRQ, 32 // Phyical Presence request operation to Get User Confirmation Status
98 Name(RESO, ResourceTemplate () {
99 Memory32Fixed (ReadWrite, 0xfed40000, 0x5000, REGS)
100 Interrupt(ResourceConsumer, Level, ActiveLow, Shared, , , IRQ) {12}
104 // Return the resource consumed by TPM device.
106 Method(_CRS,0,Serialized)
112 // Set resources consumed by the TPM device. This is used to
113 // assign an interrupt number to the device. The input byte stream
114 // has to be the same as returned by _CRS (according to ACPI spec).
116 Method(_SRS,1,Serialized)
119 // Update resource descriptor
120 // Use the field name to identify the offsets in the argument
121 // buffer and RESO buffer.
123 CreateDWordField(Arg0, ^IRQ._INT, IRQ0)
124 CreateDWordField(RESO, ^IRQ._INT, LIRQ)
127 CreateBitField(Arg0, ^IRQ._HE, ITRG)
128 CreateBitField(RESO, ^IRQ._HE, LTRG)
131 CreateBitField(Arg0, ^IRQ._LL, ILVL)
132 CreateBitField(RESO, ^IRQ._LL, LLVL)
136 // Update TPM FIFO PTP/TIS interface only, identified by TPM_INTERFACE_ID_x lowest
138 // 0000 - FIFO interface as defined in PTP for TPM 2.0 is active
139 // 1111 - FIFO interface as defined in TIS1.3 is active
141 If (LOr(LEqual (And (TID0, 0x0F), 0x00), LEqual (And (TID0, 0x0F), 0x0F))) {
143 // If FIFO interface, interrupt vector register is
144 // available. TCG PTP specification allows only
145 // values 1..15 in this field. For other interrupts
146 // the field should stay 0.
148 If (LLess (IRQ0, 16)) {
149 Store (And(IRQ0, 0xF), INTV)
152 // Interrupt enable register (TPM_INT_ENABLE_x) bits 3:4
153 // contains settings for interrupt polarity.
154 // The other bits of the byte enable individual interrupts.
155 // They should be all be zero, but to avoid changing the
156 // configuration, the other bits are be preserved.
162 // ACPI spec definitions:
163 // _HE: '1' is Edge, '0' is Level
164 // _LL: '1' is ActiveHigh, '0' is ActiveLow (inverted from TCG spec)
166 If (LEqual (ITRG, 1)) {
167 Or(INTE, 0x00000010, INTE)
169 And(INTE, 0xFFFFFFEF, INTE)
171 if (LEqual (ILVL, 0)) {
172 Or(INTE, 0x00000008, INTE)
174 And(INTE, 0xFFFFFFF7, INTE)
180 // Possible resource settings.
181 // The format of the data has to follow the same format as
182 // _CRS (according to ACPI spec).
184 Name (_PRS, ResourceTemplate() {
185 Memory32Fixed (ReadWrite, 0xfed40000, 0x5000)
186 Interrupt(ResourceConsumer, Level, ActiveLow, Shared, , , SIRQ) {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}
189 Method (PTS, 1, Serialized)
192 // Detect Sx state for MOR, only S4, S5 need to handle
194 If (LAnd (LLess (Arg0, 6), LGreater (Arg0, 3)))
197 // Bit4 -- DisableAutoDetect. 0 -- Firmware MAY autodetect.
199 If (LNot (And (MORD, 0x10)))
202 // Triggle the SMI through ACPI _PTS method.
207 // Triggle the SMI interrupt
217 if (LEqual (ACC0, 0xff))
225 // TCG Hardware Information
227 Method (HINF, 3, Serialized, 0, {BuffObj, PkgObj}, {UnknownObj, UnknownObj, UnknownObj}) // IntObj, IntObj, PkgObj
230 // Switch by function index
232 Switch (ToInteger(Arg1))
239 Return (Buffer () {0x03})
244 // Return failure if no TPM present
246 Name(TPMV, Package () {0x01, Package () {0x2, 0x0}})
247 if (LEqual (_STA (), 0x00))
249 Return (Package () {0x00})
253 // Return TPM version
259 Return (Buffer () {0})
262 Name(TPM2, Package (0x02){
267 Name(TPM3, Package (0x03){
274 // TCG Physical Presence Interface
276 Method (TPPI, 3, Serialized, 0, {BuffObj, PkgObj, IntObj, StrObj}, {UnknownObj, UnknownObj, UnknownObj}) // IntObj, IntObj, PkgObj
279 // Switch by function index
281 Switch (ToInteger(Arg1))
286 // Standard query, supports function 1-8
288 Return (Buffer () {0xFF, 0x01})
293 // a) Get Physical Presence Interface Version
300 // b) Submit TPM Operation Request to Pre-OS Environment
303 Store (DerefOf (Index (Arg2, 0x00)), PPRQ)
308 // Triggle the SMI interrupt
318 // c) Get Pending TPM Operation Requested By the OS
321 Store (PPRQ, Index (TPM2, 0x01))
327 // d) Get Platform-Specific Action to Transition to Pre-OS Environment
334 // e) Return TPM Operation Response to OS Environment
339 // Triggle the SMI interrupt
343 Store (LPPR, Index (TPM3, 0x01))
344 Store (PPRP, Index (TPM3, 0x02))
352 // f) Submit preferred user language (Not implemented)
361 // g) Submit TPM Operation Request to Pre-OS Environment 2
364 Store (DerefOf (Index (Arg2, 0x00)), PPRQ)
366 If (LEqual (PPRQ, 23)) {
367 Store (DerefOf (Index (Arg2, 0x01)), PPRM)
371 // Triggle the SMI interrupt
379 // e) Get User Confirmation Status for Operation
382 Store (DerefOf (Index (Arg2, 0x00)), UCRQ)
385 // Triggle the SMI interrupt
397 Method (TMCI, 3, Serialized, 0, IntObj, {UnknownObj, UnknownObj, UnknownObj}) // IntObj, IntObj, PkgObj
400 // Switch by function index
402 Switch (ToInteger (Arg1))
407 // Standard query, supports function 1-1
409 Return (Buffer () {0x03})
414 // Save the Operation Value of the Request to MORD (reserved memory)
416 Store (DerefOf (Index (Arg2, 0x00)), MORD)
419 // Triggle the SMI through ACPI _DSM method.
424 // Triggle the SMI interrupt
434 Method (_DSM, 4, Serialized, 0, UnknownObj, {BuffObj, IntObj, IntObj, PkgObj})
438 // TCG Hardware Information
440 If(LEqual(Arg0, ToUUID ("cf8e16a5-c1e8-4e25-b712-4f54a96702c8")))
442 Return (HINF (Arg1, Arg2, Arg3))
446 // TCG Physical Presence Interface
448 If(LEqual(Arg0, ToUUID ("3dddfaa6-361b-4eb4-a424-8d10089d1653")))
450 Return (TPPI (Arg1, Arg2, Arg3))
454 // TCG Memory Clear Interface
456 If(LEqual(Arg0, ToUUID ("376054ed-cc13-4675-901c-4756d7f2d45d")))
458 Return (TMCI (Arg1, Arg2, Arg3))
461 Return (Buffer () {0})