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