1/** @file 2 The TPM2 definition block in ACPI table for TCG2 physical presence 3 and MemoryClear. 4 5Copyright (c) 2015 - 2017, Intel Corporation. All rights reserved.<BR> 6(c)Copyright 2016 HP Development Company, L.P.<BR> 7This program and the accompanying materials 8are licensed and made available under the terms and conditions of the BSD License 9which accompanies this distribution. The full text of the license may be found at 10http://opensource.org/licenses/bsd-license.php 11 12THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 13WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 14 15**/ 16 17DefinitionBlock ( 18 "Tpm.aml", 19 "SSDT", 20 2, 21 "INTEL ", 22 "Tpm2Tabl", 23 0x1000 24 ) 25{ 26 Scope (\_SB) 27 { 28 Device (TPM) 29 { 30 // 31 // TCG2 32 // 33 34 // 35 // TAG for patching TPM2.0 _HID 36 // 37 Name (_HID, "NNNN0000") 38 39 Name (_CID, "MSFT0101") 40 41 // 42 // Readable name of this device, don't know if this way is correct yet 43 // 44 Name (_STR, Unicode ("TPM 2.0 Device")) 45 46 // 47 // Return the resource consumed by TPM device 48 // 49 Name (_CRS, ResourceTemplate () { 50 Memory32Fixed (ReadWrite, 0xfed40000, 0x5000) 51 }) 52 53 // 54 // Operational region for Smi port access 55 // 56 OperationRegion (SMIP, SystemIO, 0xB2, 1) 57 Field (SMIP, ByteAcc, NoLock, Preserve) 58 { 59 IOB2, 8 60 } 61 62 // 63 // Operational region for TPM access 64 // 65 OperationRegion (TPMR, SystemMemory, 0xfed40000, 0x5000) 66 Field (TPMR, AnyAcc, NoLock, Preserve) 67 { 68 ACC0, 8, 69 } 70 71 // 72 // Operational region for TPM support, TPM Physical Presence and TPM Memory Clear 73 // Region Offset 0xFFFF0000 and Length 0xF0 will be fixed in C code. 74 // 75 OperationRegion (TNVS, SystemMemory, 0xFFFF0000, 0xF0) 76 Field (TNVS, AnyAcc, NoLock, Preserve) 77 { 78 PPIN, 8, // Software SMI for Physical Presence Interface 79 PPIP, 32, // Used for save physical presence paramter 80 PPRP, 32, // Physical Presence request operation response 81 PPRQ, 32, // Physical Presence request operation 82 PPRM, 32, // Physical Presence request operation parameter 83 LPPR, 32, // Last Physical Presence request operation 84 FRET, 32, // Physical Presence function return code 85 MCIN, 8, // Software SMI for Memory Clear Interface 86 MCIP, 32, // Used for save the Mor paramter 87 MORD, 32, // Memory Overwrite Request Data 88 MRET, 32, // Memory Overwrite function return code 89 UCRQ, 32 // Phyical Presence request operation to Get User Confirmation Status 90 } 91 92 Method (PTS, 1, Serialized) 93 { 94 // 95 // Detect Sx state for MOR, only S4, S5 need to handle 96 // 97 If (LAnd (LLess (Arg0, 6), LGreater (Arg0, 3))) 98 { 99 // 100 // Bit4 -- DisableAutoDetect. 0 -- Firmware MAY autodetect. 101 // 102 If (LNot (And (MORD, 0x10))) 103 { 104 // 105 // Triggle the SMI through ACPI _PTS method. 106 // 107 Store (0x02, MCIP) 108 109 // 110 // Triggle the SMI interrupt 111 // 112 Store (MCIN, IOB2) 113 } 114 } 115 Return (0) 116 } 117 118 Method (_STA, 0) 119 { 120 if (LEqual (ACC0, 0xff)) 121 { 122 Return (0) 123 } 124 Return (0x0f) 125 } 126 127 // 128 // TCG Hardware Information 129 // 130 Method (HINF, 3, Serialized, 0, {BuffObj, PkgObj}, {UnknownObj, UnknownObj, UnknownObj}) // IntObj, IntObj, PkgObj 131 { 132 // 133 // Switch by function index 134 // 135 Switch (ToInteger(Arg1)) 136 { 137 Case (0) 138 { 139 // 140 // Standard query 141 // 142 Return (Buffer () {0x03}) 143 } 144 Case (1) 145 { 146 // 147 // Return failure if no TPM present 148 // 149 Name(TPMV, Package () {0x01, Package () {0x2, 0x0}}) 150 if (LEqual (_STA (), 0x00)) 151 { 152 Return (Package () {0x00}) 153 } 154 155 // 156 // Return TPM version 157 // 158 Return (TPMV) 159 } 160 Default {BreakPoint} 161 } 162 Return (Buffer () {0}) 163 } 164 165 Name(TPM2, Package (0x02){ 166 Zero, 167 Zero 168 }) 169 170 Name(TPM3, Package (0x03){ 171 Zero, 172 Zero, 173 Zero 174 }) 175 176 // 177 // TCG Physical Presence Interface 178 // 179 Method (TPPI, 3, Serialized, 0, {BuffObj, PkgObj, IntObj, StrObj}, {UnknownObj, UnknownObj, UnknownObj}) // IntObj, IntObj, PkgObj 180 { 181 // 182 // Switch by function index 183 // 184 Switch (ToInteger(Arg1)) 185 { 186 Case (0) 187 { 188 // 189 // Standard query, supports function 1-8 190 // 191 Return (Buffer () {0xFF, 0x01}) 192 } 193 Case (1) 194 { 195 // 196 // a) Get Physical Presence Interface Version 197 // 198 Return ("$PV") 199 } 200 Case (2) 201 { 202 // 203 // b) Submit TPM Operation Request to Pre-OS Environment 204 // 205 206 Store (DerefOf (Index (Arg2, 0x00)), PPRQ) 207 Store (0, PPRM) 208 Store (0x02, PPIP) 209 210 // 211 // Triggle the SMI interrupt 212 // 213 Store (PPIN, IOB2) 214 Return (FRET) 215 216 217 } 218 Case (3) 219 { 220 // 221 // c) Get Pending TPM Operation Requested By the OS 222 // 223 224 Store (PPRQ, Index (TPM2, 0x01)) 225 Return (TPM2) 226 } 227 Case (4) 228 { 229 // 230 // d) Get Platform-Specific Action to Transition to Pre-OS Environment 231 // 232 Return (2) 233 } 234 Case (5) 235 { 236 // 237 // e) Return TPM Operation Response to OS Environment 238 // 239 Store (0x05, PPIP) 240 241 // 242 // Triggle the SMI interrupt 243 // 244 Store (PPIN, IOB2) 245 246 Store (LPPR, Index (TPM3, 0x01)) 247 Store (PPRP, Index (TPM3, 0x02)) 248 249 Return (TPM3) 250 } 251 Case (6) 252 { 253 254 // 255 // f) Submit preferred user language (Not implemented) 256 // 257 258 Return (3) 259 260 } 261 Case (7) 262 { 263 // 264 // g) Submit TPM Operation Request to Pre-OS Environment 2 265 // 266 Store (7, PPIP) 267 Store (DerefOf (Index (Arg2, 0x00)), PPRQ) 268 Store (0, PPRM) 269 If (LEqual (PPRQ, 23)) { 270 Store (DerefOf (Index (Arg2, 0x01)), PPRM) 271 } 272 273 // 274 // Triggle the SMI interrupt 275 // 276 Store (PPIN, IOB2) 277 Return (FRET) 278 } 279 Case (8) 280 { 281 // 282 // e) Get User Confirmation Status for Operation 283 // 284 Store (8, PPIP) 285 Store (DerefOf (Index (Arg2, 0x00)), UCRQ) 286 287 // 288 // Triggle the SMI interrupt 289 // 290 Store (PPIN, IOB2) 291 292 Return (FRET) 293 } 294 295 Default {BreakPoint} 296 } 297 Return (1) 298 } 299 300 Method (TMCI, 3, Serialized, 0, IntObj, {UnknownObj, UnknownObj, UnknownObj}) // IntObj, IntObj, PkgObj 301 { 302 // 303 // Switch by function index 304 // 305 Switch (ToInteger (Arg1)) 306 { 307 Case (0) 308 { 309 // 310 // Standard query, supports function 1-1 311 // 312 Return (Buffer () {0x03}) 313 } 314 Case (1) 315 { 316 // 317 // Save the Operation Value of the Request to MORD (reserved memory) 318 // 319 Store (DerefOf (Index (Arg2, 0x00)), MORD) 320 321 // 322 // Triggle the SMI through ACPI _DSM method. 323 // 324 Store (0x01, MCIP) 325 326 // 327 // Triggle the SMI interrupt 328 // 329 Store (MCIN, IOB2) 330 Return (MRET) 331 } 332 Default {BreakPoint} 333 } 334 Return (1) 335 } 336 337 Method (_DSM, 4, Serialized, 0, UnknownObj, {BuffObj, IntObj, IntObj, PkgObj}) 338 { 339 340 // 341 // TCG Hardware Information 342 // 343 If(LEqual(Arg0, ToUUID ("cf8e16a5-c1e8-4e25-b712-4f54a96702c8"))) 344 { 345 Return (HINF (Arg1, Arg2, Arg3)) 346 } 347 348 // 349 // TCG Physical Presence Interface 350 // 351 If(LEqual(Arg0, ToUUID ("3dddfaa6-361b-4eb4-a424-8d10089d1653"))) 352 { 353 Return (TPPI (Arg1, Arg2, Arg3)) 354 } 355 356 // 357 // TCG Memory Clear Interface 358 // 359 If(LEqual(Arg0, ToUUID ("376054ed-cc13-4675-901c-4756d7f2d45d"))) 360 { 361 Return (TMCI (Arg1, Arg2, Arg3)) 362 } 363 364 Return (Buffer () {0}) 365 } 366 } 367 } 368} 369