]> git.proxmox.com Git - mirror_edk2.git/blobdiff - SecurityPkg/Tcg/Tcg2Smm/Tpm.asl
UefiCpuPkg/PiSmmCpuDxeSmm: patch "gSmbase" with PatchInstructionX86()
[mirror_edk2.git] / SecurityPkg / Tcg / Tcg2Smm / Tpm.asl
index 80dfb3bd4e5867acb301d37813cd10e0a25ed078..f58efca1443de177d451849b29ccf5535fa5c139 100644 (file)
@@ -2,7 +2,9 @@
   The TPM2 definition block in ACPI table for TCG2 physical presence  \r
   and MemoryClear.\r
 \r
-Copyright (c) 2015, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.<BR>\r
+(c)Copyright 2016 HP Development Company, L.P.<BR>\r
+Copyright (c) 2017, Microsoft Corporation.  All rights reserved. <BR>\r
 This program and the accompanying materials \r
 are licensed and made available under the terms and conditions of the BSD License \r
 which accompanies this distribution.  The full text of the license may be found at \r
@@ -29,19 +31,18 @@ DefinitionBlock (
       //\r
       // TCG2\r
       //\r
-      Name (_HID, "MSFT0101")\r
-      \r
+\r
       //\r
-      // Readable name of this device, don't know if this way is correct yet\r
+      //  TAG for patching TPM2.0 _HID\r
       //\r
-      Name (_STR, Unicode ("TPM 2.0 Device"))\r
+      Name (_HID, "NNNN0000")\r
+\r
+      Name (_CID, "MSFT0101")\r
 \r
       //\r
-      // Return the resource consumed by TPM device\r
+      // Readable name of this device, don't know if this way is correct yet\r
       //\r
-      Name (_CRS, ResourceTemplate () {\r
-        Memory32Fixed (ReadOnly, 0xfed40000, 0x5000)\r
-      })\r
+      Name (_STR, Unicode ("TPM 2.0 Device"))\r
 \r
       //\r
       // Operational region for Smi port access\r
@@ -58,7 +59,19 @@ DefinitionBlock (
       OperationRegion (TPMR, SystemMemory, 0xfed40000, 0x5000)\r
       Field (TPMR, AnyAcc, NoLock, Preserve)\r
       {\r
-        ACC0, 8,\r
+        ACC0, 8,  // TPM_ACCESS_0\r
+        Offset(0x8),\r
+        INTE, 32, // TPM_INT_ENABLE_0\r
+        INTV, 8,  // TPM_INT_VECTOR_0\r
+        Offset(0x10),\r
+        INTS, 32, // TPM_INT_STATUS_0\r
+        INTF, 32, // TPM_INTF_CAPABILITY_0\r
+        STS0, 32, // TPM_STS_0\r
+        Offset(0x24),\r
+        FIFO, 32, // TPM_DATA_FIFO_0\r
+        Offset(0x30),\r
+        TID0, 32, // TPM_INTERFACE_ID_0\r
+                  // ignore the rest\r
       }\r
 \r
       //\r
@@ -78,7 +91,159 @@ DefinitionBlock (
         MCIN,   8,  //   Software SMI for Memory Clear Interface\r
         MCIP,   32, //   Used for save the Mor paramter\r
         MORD,   32, //   Memory Overwrite Request Data\r
-        MRET,   32  //   Memory Overwrite function return code\r
+        MRET,   32, //   Memory Overwrite function return code\r
+        UCRQ,   32, //   Phyical Presence request operation to Get User Confirmation Status\r
+        IRQN,   32, //   IRQ Number for _CRS\r
+        SFRB,   8   //   Is shortformed Pkglength for resource buffer\r
+      }\r
+\r
+      //\r
+      // Possible resource settings returned by  _PRS method\r
+      //   RESS : ResourceTemplate with PkgLength <=63\r
+      //   RESL : ResourceTemplate with PkgLength > 63\r
+      //\r
+      // The format of the data has to follow the same format as\r
+      // _CRS (according to ACPI spec).\r
+      //\r
+      Name (RESS, ResourceTemplate() {\r
+        Memory32Fixed (ReadWrite, 0xfed40000, 0x5000)\r
+        Interrupt(ResourceConsumer, Level, ActiveLow, Shared, , , ) {1,2,3,4,5,6,7,8,9,10}\r
+      })\r
+\r
+      Name (RESL, ResourceTemplate() {\r
+        Memory32Fixed (ReadWrite, 0xfed40000, 0x5000)\r
+        Interrupt(ResourceConsumer, Level, ActiveLow, Shared, , , ) {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}\r
+      })\r
+\r
+      //\r
+      // Current resource settings for _CRS method\r
+      //\r
+      Name(RES0, ResourceTemplate () {\r
+        Memory32Fixed (ReadWrite, 0xfed40000, 0x5000, REG0)\r
+        Interrupt(ResourceConsumer, Level, ActiveLow, Shared, , , INTR) {12}\r
+      })\r
+\r
+      Name(RES1, ResourceTemplate () {\r
+        Memory32Fixed (ReadWrite, 0xfed40000, 0x5000, REG1)\r
+      })\r
+\r
+\r
+      //\r
+      // Return the resource consumed by TPM device.\r
+      //\r
+      Method(_CRS,0,Serialized)\r
+      {\r
+        //\r
+        // IRQNum = 0 means disable IRQ support\r
+        //\r
+        If (LEqual(IRQN, 0)) {\r
+          Return (RES1)\r
+        }\r
+        Else\r
+        {\r
+          CreateDWordField(RES0, ^INTR._INT, LIRQ)\r
+          Store(IRQN, LIRQ)\r
+          Return (RES0)\r
+        }\r
+      }\r
+\r
+      //\r
+      // Set resources consumed by the TPM device. This is used to\r
+      // assign an interrupt number to the device. The input byte stream\r
+      // has to be the same as returned by _CRS (according to ACPI spec).\r
+      //\r
+      // Platform may choose to override this function with specific interrupt\r
+      // programing logic to replace FIFO/TIS SIRQ registers programing\r
+      //\r
+      Method(_SRS,1,Serialized)\r
+      {\r
+        //\r
+        // Do not configure Interrupt if IRQ Num is configured 0 by default\r
+        //\r
+        If (LEqual(IRQN, 0)) {\r
+          Return (0)\r
+        }\r
+\r
+        //\r
+        // Update resource descriptor\r
+        // Use the field name to identify the offsets in the argument\r
+        // buffer and RES0 buffer.\r
+        //\r
+        CreateDWordField(Arg0, ^INTR._INT, IRQ0)\r
+        CreateDWordField(RES0, ^INTR._INT, LIRQ)\r
+        Store(IRQ0, LIRQ)\r
+        Store(IRQ0, IRQN)\r
+\r
+        CreateBitField(Arg0, ^INTR._HE, ITRG)\r
+        CreateBitField(RES0, ^INTR._HE, LTRG)\r
+        Store(ITRG, LTRG)\r
+\r
+        CreateBitField(Arg0, ^INTR._LL, ILVL)\r
+        CreateBitField(RES0, ^INTR._LL, LLVL)\r
+        Store(ILVL, LLVL)\r
+\r
+        //\r
+        // Update TPM FIFO PTP/TIS interface only, identified by TPM_INTERFACE_ID_x lowest\r
+        // nibble.\r
+        // 0000 - FIFO interface as defined in PTP for TPM 2.0 is active\r
+        // 1111 - FIFO interface as defined in TIS1.3 is active\r
+        //\r
+        If (LOr(LEqual (And (TID0, 0x0F), 0x00), LEqual (And (TID0, 0x0F), 0x0F))) {\r
+          //\r
+          // If FIFO interface, interrupt vector register is\r
+          // available. TCG PTP specification allows only\r
+          // values 1..15 in this field. For other interrupts\r
+          // the field should stay 0.\r
+          //\r
+          If (LLess (IRQ0, 16)) {\r
+            Store (And(IRQ0, 0xF), INTV)\r
+          }\r
+          //\r
+          // Interrupt enable register (TPM_INT_ENABLE_x) bits 3:4\r
+          // contains settings for interrupt polarity.\r
+          // The other bits of the byte enable individual interrupts.\r
+          // They should be all be zero, but to avoid changing the\r
+          // configuration, the other bits are be preserved.\r
+          // 00 - high level\r
+          // 01 - low level\r
+          // 10 - rising edge\r
+          // 11 - falling edge\r
+          //\r
+          // ACPI spec definitions:\r
+          // _HE: '1' is Edge, '0' is Level\r
+          // _LL: '1' is ActiveHigh, '0' is ActiveLow (inverted from TCG spec)\r
+          //\r
+          If (LEqual (ITRG, 1)) {\r
+            Or(INTE, 0x00000010, INTE)\r
+          } Else {\r
+            And(INTE, 0xFFFFFFEF, INTE)\r
+          }\r
+          if (LEqual (ILVL, 0)) {\r
+            Or(INTE, 0x00000008, INTE)\r
+          } Else {\r
+            And(INTE, 0xFFFFFFF7, INTE)\r
+          }\r
+        }\r
+      }\r
+\r
+      Method(_PRS,0,Serialized)\r
+      {\r
+        //\r
+        // IRQNum = 0 means disable IRQ support\r
+        //\r
+        If (LEqual(IRQN, 0)) {\r
+          Return (RES1)\r
+        } ElseIf(LEqual(SFRB, 0)) {\r
+          //\r
+          // Long format. Possible resources PkgLength > 63\r
+          //\r
+          Return (RESL)\r
+        } Else {\r
+          //\r
+          // Short format. Possible resources PkgLength <=63\r
+          //\r
+          Return (RESS)\r
+        }\r
       }\r
 \r
       Method (PTS, 1, Serialized)\r
@@ -187,7 +352,7 @@ DefinitionBlock (
             //\r
             // a) Get Physical Presence Interface Version\r
             //\r
-            Return ("1.2")\r
+            Return ("$PV")\r
           }\r
           Case (2)\r
           {\r
@@ -196,6 +361,7 @@ DefinitionBlock (
             //\r
                   \r
             Store (DerefOf (Index (Arg2, 0x00)), PPRQ)\r
+            Store (0, PPRM)\r
             Store (0x02, PPIP)\r
               \r
             //\r
@@ -273,7 +439,7 @@ DefinitionBlock (
             // e) Get User Confirmation Status for Operation\r
             //\r
             Store (8, PPIP)\r
-            Store (DerefOf (Index (Arg2, 0x00)), PPRQ)\r
+            Store (DerefOf (Index (Arg2, 0x00)), UCRQ)\r
                   \r
             //\r
             // Triggle the SMI interrupt\r