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