2abd4af9ef6112496c8121513fc478594f2cce80
[mirror_edk2.git] / SecurityPkg / Tcg / Tcg2Smm / Tpm.asl
1 /** @file
2 The TPM2 definition block in ACPI table for TCG2 physical presence
3 and MemoryClear.
4
5 Copyright (c) 2015 - 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 "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.3")
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 }