1/** @file
2  The TPM2 definition block in ACPI table for TCG2 physical presence
3  and MemoryClear.
4
5Copyright (c) 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      // 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