• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/** @file
2  The TPM2 definition block in ACPI table for TrEE physical presence
3  and MemoryClear.
4
5Copyright (c) 2013 - 2015, Intel Corporation. All rights reserved.<BR>
6This program and the accompanying materials
7are licensed and made available under the terms and conditions of the BSD License
8which accompanies this distribution.  The full text of the license may be found at
9http://opensource.org/licenses/bsd-license.php
10
11THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13
14**/
15
16DefinitionBlock (
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      // TREE
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 (ReadWrite, 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        LPPR,   32, //   Last Physical Presence request operation
76        FRET,   32, //   Physical Presence function return code
77        MCIN,   8,  //   Software SMI for Memory Clear Interface
78        MCIP,   32, //   Used for save the Mor paramter
79        MORD,   32, //   Memory Overwrite Request Data
80        MRET,   32  //   Memory Overwrite function return code
81      }
82
83      Method (PTS, 1, Serialized)
84      {
85        //
86        // Detect Sx state for MOR, only S4, S5 need to handle
87        //
88        If (LAnd (LLess (Arg0, 6), LGreater (Arg0, 3)))
89        {
90          //
91          // Bit4 -- DisableAutoDetect. 0 -- Firmware MAY autodetect.
92          //
93          If (LNot (And (MORD, 0x10)))
94          {
95            //
96            // Triggle the SMI through ACPI _PTS method.
97            //
98            Store (0x02, MCIP)
99
100            //
101            // Triggle the SMI interrupt
102            //
103            Store (MCIN, IOB2)
104          }
105        }
106        Return (0)
107      }
108
109      Method (_STA, 0)
110      {
111        if (LEqual (ACC0, 0xff))
112        {
113            Return (0)
114        }
115        Return (0x0f)
116      }
117
118      //
119      // TCG Hardware Information
120      //
121      Method (HINF, 3, Serialized, 0, {BuffObj, PkgObj}, {UnknownObj, UnknownObj, UnknownObj}) // IntObj, IntObj, PkgObj
122      {
123        //
124        // Switch by function index
125        //
126        Switch (ToInteger(Arg1))
127        {
128          Case (0)
129          {
130            //
131            // Standard query
132            //
133            Return (Buffer () {0x03})
134          }
135          Case (1)
136          {
137            //
138            // Return failure if no TPM present
139            //
140            Name(TPMV, Package () {0x01, Package () {0x2, 0x0}})
141            if (LEqual (_STA (), 0x00))
142            {
143              Return (Package () {0x00})
144            }
145
146            //
147            // Return TPM version
148            //
149            Return (TPMV)
150          }
151          Default {BreakPoint}
152        }
153        Return (Buffer () {0})
154      }
155
156      Name(TPM2, Package (0x02){
157        Zero,
158        Zero
159      })
160
161      Name(TPM3, Package (0x03){
162        Zero,
163        Zero,
164        Zero
165      })
166
167      //
168      // TCG Physical Presence Interface
169      //
170      Method (TPPI, 3, Serialized, 0, {BuffObj, PkgObj, IntObj, StrObj}, {UnknownObj, UnknownObj, UnknownObj}) // IntObj, IntObj, PkgObj
171      {
172        //
173        // Switch by function index
174        //
175        Switch (ToInteger(Arg1))
176        {
177          Case (0)
178          {
179            //
180            // Standard query, supports function 1-8
181            //
182            Return (Buffer () {0xFF, 0x01})
183          }
184          Case (1)
185          {
186            //
187            // a) Get Physical Presence Interface Version
188            //
189            Return ("1.2")
190          }
191          Case (2)
192          {
193            //
194            // b) Submit TPM Operation Request to Pre-OS Environment
195            //
196
197            Store (DerefOf (Index (Arg2, 0x00)), PPRQ)
198            Store (0x02, PPIP)
199
200            //
201            // Triggle the SMI interrupt
202            //
203            Store (PPIN, IOB2)
204            Return (FRET)
205
206
207          }
208          Case (3)
209          {
210            //
211            // c) Get Pending TPM Operation Requested By the OS
212            //
213
214            Store (PPRQ, Index (TPM2, 0x01))
215            Return (TPM2)
216          }
217          Case (4)
218          {
219            //
220            // d) Get Platform-Specific Action to Transition to Pre-OS Environment
221            //
222            Return (2)
223          }
224          Case (5)
225          {
226            //
227            // e) Return TPM Operation Response to OS Environment
228            //
229            Store (0x05, PPIP)
230
231            //
232            // Triggle the SMI interrupt
233            //
234            Store (PPIN, IOB2)
235
236            Store (LPPR, Index (TPM3, 0x01))
237            Store (PPRP, Index (TPM3, 0x02))
238
239            Return (TPM3)
240          }
241          Case (6)
242          {
243
244            //
245            // f) Submit preferred user language (Not implemented)
246            //
247
248            Return (3)
249
250          }
251          Case (7)
252          {
253            //
254            // g) Submit TPM Operation Request to Pre-OS Environment 2
255            //
256            Store (7, PPIP)
257            Store (DerefOf (Index (Arg2, 0x00)), PPRQ)
258
259            //
260            // Triggle the SMI interrupt
261            //
262            Store (PPIN, IOB2)
263            Return (FRET)
264          }
265          Case (8)
266          {
267            //
268            // e) Get User Confirmation Status for Operation
269            //
270            Store (8, PPIP)
271            Store (DerefOf (Index (Arg2, 0x00)), PPRQ)
272
273            //
274            // Triggle the SMI interrupt
275            //
276            Store (PPIN, IOB2)
277
278            Return (FRET)
279          }
280
281          Default {BreakPoint}
282        }
283        Return (1)
284      }
285
286      Method (TMCI, 3, Serialized, 0, IntObj, {UnknownObj, UnknownObj, UnknownObj}) // IntObj, IntObj, PkgObj
287      {
288        //
289        // Switch by function index
290        //
291        Switch (ToInteger (Arg1))
292        {
293          Case (0)
294          {
295            //
296            // Standard query, supports function 1-1
297            //
298            Return (Buffer () {0x03})
299          }
300          Case (1)
301          {
302            //
303            // Save the Operation Value of the Request to MORD (reserved memory)
304            //
305            Store (DerefOf (Index (Arg2, 0x00)), MORD)
306
307            //
308            // Triggle the SMI through ACPI _DSM method.
309            //
310            Store (0x01, MCIP)
311
312            //
313            // Triggle the SMI interrupt
314            //
315            Store (MCIN, IOB2)
316            Return (MRET)
317          }
318          Default {BreakPoint}
319        }
320        Return (1)
321      }
322
323      Method (_DSM, 4, Serialized, 0, UnknownObj, {BuffObj, IntObj, IntObj, PkgObj})
324      {
325
326        //
327        // TCG Hardware Information
328        //
329        If(LEqual(Arg0, ToUUID ("cf8e16a5-c1e8-4e25-b712-4f54a96702c8")))
330        {
331          Return (HINF (Arg1, Arg2, Arg3))
332        }
333
334        //
335        // TCG Physical Presence Interface
336        //
337        If(LEqual(Arg0, ToUUID ("3dddfaa6-361b-4eb4-a424-8d10089d1653")))
338        {
339          Return (TPPI (Arg1, Arg2, Arg3))
340        }
341
342        //
343        // TCG Memory Clear Interface
344        //
345        If(LEqual(Arg0, ToUUID ("376054ed-cc13-4675-901c-4756d7f2d45d")))
346        {
347          Return (TMCI (Arg1, Arg2, Arg3))
348        }
349
350        Return (Buffer () {0})
351      }
352    }
353  }
354}
355