From nobody Fri Nov 1 10:26:44 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; spf=none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) smtp.mailfrom=edk2-devel-bounces@lists.01.org Return-Path: Received: from ml01.01.org (ml01.01.org [198.145.21.10]) by mx.zohomail.com with SMTPS id 1516861505843576.4580875756144; Wed, 24 Jan 2018 22:25:05 -0800 (PST) Received: from [127.0.0.1] (localhost [IPv6:::1]) by ml01.01.org (Postfix) with ESMTP id 3CE2A2034A8B2; Wed, 24 Jan 2018 22:19:35 -0800 (PST) Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 86A1D21E256A0 for ; Wed, 24 Jan 2018 22:19:34 -0800 (PST) Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 24 Jan 2018 22:25:02 -0800 Received: from czhan46-mobl1.ccr.corp.intel.com ([10.239.192.90]) by fmsmga006.fm.intel.com with ESMTP; 24 Jan 2018 22:25:01 -0800 X-Original-To: edk2-devel@lists.01.org Received-SPF: none (zoho.com: 198.145.21.10 is neither permitted nor denied by domain of lists.01.org) client-ip=198.145.21.10; envelope-from=edk2-devel-bounces@lists.01.org; helo=ml01.01.org; Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=134.134.136.24; helo=mga09.intel.com; envelope-from=chao.b.zhang@intel.com; receiver=edk2-devel@lists.01.org X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.46,409,1511856000"; d="scan'208";a="198635761" From: "Zhang, Chao B" To: edk2-devel@lists.01.org Date: Thu, 25 Jan 2018 14:24:59 +0800 Message-Id: <20180125062459.14532-1-chao.b.zhang@intel.com> X-Mailer: git-send-email 2.11.0.windows.1 Subject: [edk2] [PATCH] SecurityPkg: Tcg2Smm: Enable TPM2.0 interrupt support X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Yao Jiewen , Chao Zhang , Ronald Aigner MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Errors-To: edk2-devel-bounces@lists.01.org Sender: "edk2-devel" X-ZohoMail: RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" 1. Expose _CRS, _SRS, _PRS control method to support TPM interrupt 2. Provide 2 PCDs to configure _CRS and _PRS returned data Cc: Yao Jiewen Cc: Ronald Aigner Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Chao Zhang --- SecurityPkg/SecurityPkg.dec | 12 +- SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.c | 268 ++++++++++++++++++++++++++++++++= +++- SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.h | 24 +++- SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.inf | 5 +- SecurityPkg/Tcg/Tcg2Smm/Tpm.asl | 96 ++++++++++--- 5 files changed, 383 insertions(+), 22 deletions(-) diff --git a/SecurityPkg/SecurityPkg.dec b/SecurityPkg/SecurityPkg.dec index 50dbe95..a2b3191 100644 --- a/SecurityPkg/SecurityPkg.dec +++ b/SecurityPkg/SecurityPkg.dec @@ -5,7 +5,7 @@ # It also provides the definitions(including PPIs/PROTOCOLs/GUIDs and lib= rary classes) # and libraries instances, which are used for those features. # -# Copyright (c) 2009 - 2017, Intel Corporation. All rights reserved.
+# Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.
# (C) Copyright 2015 Hewlett Packard Enterprise Development LP
# Copyright (c) 2017, Microsoft Corporation. All rights reserved.
# This program and the accompanying materials are licensed and made availa= ble under @@ -450,6 +450,16 @@ # @Prompt Initial setting of TCG2 Persistent Firmware Management Flags gEfiSecurityPkgTokenSpaceGuid.PcdTcg2PhysicalPresenceFlags|0x300E2|UINT3= 2|0x0001001B =20 + ## Indicate current TPM2 Interrupt Number reported by _CRS control metho= d.

+ # TPM2 Interrupt feature is disabled If the pcd is set to 0.
+ # @Prompt Current TPM2 Interrupt Number + gEfiSecurityPkgTokenSpaceGuid.PcdTpm2IrqNum|0x12|UINT32|0x0001001C + + ## Indicate platform possible TPM2 Interrupt Number reported by _PRS con= trol method.

+ # Possible TPM2 Interrupt Number Buffer will not be reported if TPM2 Int= errupt feature is disabled.
+ # @Prompt Possible TPM2 Interrupt Number buffer + gEfiSecurityPkgTokenSpaceGuid.PcdTpm2PossibleIrqNumBuf|{0x12, 0x00, 0x00= , 0x00}|VOID*|0x0001001D + [PcdsDynamic, PcdsDynamicEx] =20 ## This PCD indicates Hash mask for TPM 2.0. Bit definition strictly fol= lows TCG Algorithm Registry.

diff --git a/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.c b/SecurityPkg/Tcg/Tcg2Smm/Tc= g2Smm.c index 5a1fd3e..5ad042e 100644 --- a/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.c +++ b/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.c @@ -9,7 +9,7 @@ =20 PhysicalPresenceCallback() and MemoryClearCallback() will receive untrus= ted input and do some check. =20 -Copyright (c) 2015 - 2017, Intel Corporation. All rights reserved.
+Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.
This program and the accompanying materials=20 are licensed and made available under the terms and conditions of the BSD = License=20 which accompanies this distribution. The full text of the license may be = found at=20 @@ -304,6 +304,251 @@ UpdatePPVersion ( } =20 /** + Patch interrupt resources returned by TPM _PRS. ResourceTemplate to patc= h is determined by input + interrupt buffer size. BufferSize, PkgLength and interrupt descirptor in= ByteList need to be patched + + @param[in, out] Table The TPM item in ACPI table. + @param[in] IrqBuffer Input new IRQ buffer. + @param[in] IrqBuffserSize Input new IRQ buffer size. + + @return patch status. + +**/ +EFI_STATUS +UpdatePossibleResource ( + EFI_ACPI_DESCRIPTION_HEADER *Table, + UINT32 *IrqBuffer, + UINT32 IrqBuffserSize + ) +{ + UINT8 *DataPtr; + UINT8 *DataEndPtr; + UINT32 NewPkgLength; + UINT32 OrignalPkgLength; + + NewPkgLength =3D 0; + OrignalPkgLength =3D 0; + DataEndPtr =3D NULL; + + // + // Follow ACPI spec + // 6.4.3 Extend Interrupt Descriptor. + // 19.3.3 ASL Resource Template + // 20 AML specification + // to patch TPM ACPI object _PRS returned ResourceTemplate() containing = 2 resource descriptors and an auto appended End Tag + // + // AML data is organized by following rule. + // Code need to patch BufferSize and PkgLength and interrupt descirptor= in ByteList + // + // =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D Buffer =3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + // DefBuffer :=3D BufferOp PkgLength BufferSize ByteList + // BufferOp :=3D 0x11 + // + // =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3DPkgLength=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + // PkgLength :=3D PkgLeadByte | + // | + // | + // + // + // PkgLeadByte :=3D + // + // + // + //=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3DBufferSize=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + // BufferSize :=3D Integar + // Integar :=3D ByteConst|WordConst|DwordConst.... + // + // ByteConst :=3D BytePrefix ByteData + // + //=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3DByteList=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + // ByteList :=3D ByteData ByteList + // + //=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + + // + // 1. Check TPM_PRS_RESS with PkgLength <=3D63 can hold the input interr= upt number buffer for patching + // + for (DataPtr =3D (UINT8 *)(Table + 1); + DataPtr < (UINT8 *) ((UINT8 *) Table + Table->Length - (TPM_PRS_RES= _NAME_SIZE + TPM_POS_RES_TEMPLATE_MIN_SIZE)); + DataPtr +=3D 1) { + if (CompareMem(DataPtr, TPM_PRS_RESS, TPM_PRS_RES_NAME_SIZE) =3D=3D 0)= { + // + // Jump over object name & BufferOp + // + DataPtr +=3D TPM_PRS_RES_NAME_SIZE + 1; + + if ((*DataPtr & (BIT7|BIT6)) =3D=3D 0) { + OrignalPkgLength =3D (UINT32)*DataPtr; + DataEndPtr =3D DataPtr + OrignalPkgLength; + + // + // Jump over PkgLength =3D PkgLeadByte only + // + NewPkgLength++; + + // + // Jump over BufferSize + // + if (*(DataPtr + 1) =3D=3D AML_BYTE_PREFIX) { + NewPkgLength +=3D 2; + } else if (*(DataPtr + 1) =3D=3D AML_WORD_PREFIX) { + NewPkgLength +=3D 3; + } else if (*(DataPtr + 1) =3D=3D AML_DWORD_PREFIX) { + NewPkgLength +=3D 5; + } else { + ASSERT(FALSE); + return EFI_UNSUPPORTED; + } + } else { + ASSERT(FALSE); + return EFI_UNSUPPORTED; + } + + // + // Include Memory32Fixed Descritor (12 Bytes) + Interrupt Descriptor= header(5 Bytes) + End Tag(2 Bytes) + // + NewPkgLength +=3D 19 + IrqBuffserSize; + if (NewPkgLength > 63) { + break; + } + + if (NewPkgLength > OrignalPkgLength) { + ASSERT(FALSE); + return EFI_INVALID_PARAMETER; + } + + // + // 1.1 Patch PkgLength + // + *DataPtr =3D (UINT8)NewPkgLength; + + // + // 1.2 Patch BufferSize =3D sizeof(Memory32Fixed Descritor + Interru= pt Descriptor + End Tag). + // It is Little endian. So only patch lowest byte of BufferSize= due to current interrupt number limit. + // + *(DataPtr + 2) =3D (UINT8)(IrqBuffserSize + 19); + + // + // Notify _PRS to report short formed ResourceTemplate + // + mTcgNvs->IsShortFormPkgLength =3D TRUE; + + break; + } + } + + // + // 2. Use TPM_PRS_RESL with PkgLength > 63 to hold longer input interrup= t number buffer for patching + // + if (NewPkgLength > 63) { + NewPkgLength =3D 0; + OrignalPkgLength =3D 0; + for (DataPtr =3D (UINT8 *)(Table + 1); + DataPtr < (UINT8 *) ((UINT8 *) Table + Table->Length - (TPM_PRS_R= ES_NAME_SIZE + TPM_POS_RES_TEMPLATE_MIN_SIZE)); + DataPtr +=3D 1) { + if (CompareMem(DataPtr, TPM_PRS_RESL, TPM_PRS_RES_NAME_SIZE) =3D=3D = 0) { + // + // Jump over object name & BufferOp + // + DataPtr +=3D TPM_PRS_RES_NAME_SIZE + 1; + + if ((*DataPtr & (BIT7|BIT6)) !=3D 0) { + OrignalPkgLength =3D (UINT32)(*(DataPtr + 1) << 4) + (*DataPtr &= 0x0F); + DataEndPtr =3D DataPtr + OrignalPkgLength; + // + // Jump over PkgLength =3D PkgLeadByte + ByteData length + // + NewPkgLength +=3D 1 + ((*DataPtr & (BIT7|BIT6)) >> 6); + + // + // Jump over BufferSize + // + if (*(DataPtr + NewPkgLength) =3D=3D AML_BYTE_PREFIX) { + NewPkgLength +=3D 2; + } else if (*(DataPtr + NewPkgLength) =3D=3D AML_WORD_PREFIX) { + NewPkgLength +=3D 3; + } else if (*(DataPtr + NewPkgLength) =3D=3D AML_DWORD_PREFIX) { + NewPkgLength +=3D 5; + } else { + ASSERT(FALSE); + return EFI_UNSUPPORTED; + } + } else { + ASSERT(FALSE); + return EFI_UNSUPPORTED; + } + + // + // Include Memory32Fixed Descritor (12 Bytes) + Interrupt Descript= or header(5 Bytes) + End Tag(2 Bytes) + // + NewPkgLength +=3D 19 + IrqBuffserSize; + + if (NewPkgLength > OrignalPkgLength) { + ASSERT(FALSE); + return EFI_INVALID_PARAMETER; + } + + // + // 2.1 Patch PkgLength. Only patch PkgLeadByte and first ByteData + // + *DataPtr =3D (UINT8)((*DataPtr) & 0xF0) | (NewPkgLength & 0x0F); + *(DataPtr + 1) =3D (UINT8)((NewPkgLength & 0xFF0) >> 4); + + // + // 2.2 Patch BufferSize =3D sizeof(Memory32Fixed Descritor + Inter= rupt Descriptor + End Tag). + // It is Little endian. Only patch lowest byte of BufferSize d= ue to current interrupt number limit. + // + *(DataPtr + 2 + ((*DataPtr & (BIT7|BIT6)) >> 6)) =3D (UINT8)(IrqBu= ffserSize + 19); + + // + // Notify _PRS to report short formed ResourceTemplate + // + mTcgNvs->IsShortFormPkgLength =3D FALSE; + break; + } + } + } + + if (DataPtr >=3D (UINT8 *) ((UINT8 *) Table + Table->Length - (TPM_PRS_R= ES_NAME_SIZE + TPM_POS_RES_TEMPLATE_MIN_SIZE))) { + return EFI_NOT_FOUND; + } + + // + // 3. Move DataPtr to Interrupt descriptor header and patch interrupt de= scriptor. + // 5 bytes for interrupt descriptor header, 2 bytes for End Tag + // + DataPtr +=3D NewPkgLength - (5 + IrqBuffserSize + 2); + // + // 3.1 Patch Length bit[7:0] of Interrupt descirptor patch interrupt d= escriptor + // + *(DataPtr + 1) =3D (UINT8)(2 + IrqBuffserSize); + // + // 3.2 Patch Interrupt Table Length + // + *(DataPtr + 4) =3D (UINT8)(IrqBuffserSize / sizeof(UINT32)); + // + // 3.3 Copy patched InterruptNumBuffer + // + CopyMem(DataPtr + 5, IrqBuffer, IrqBuffserSize); + + // + // 4. Jump over Interrupt descirptor and Patch END Tag, set Checksum fie= ld to 0 + // + DataPtr +=3D 5 + IrqBuffserSize; + *DataPtr =3D ACPI_END_TAG_DESCRIPTOR; + *(DataPtr + 1) =3D 0; + + // + // 5. Jump over whole ResourceTemplate. Stuff rest bytes to NOOP + // + for (DataPtr +=3D 2; DataPtr < DataEndPtr; DataPtr++) { + *DataPtr =3D AML_NOOP_OP; + } + + return EFI_SUCCESS; +} + +/** Patch TPM2 device HID string. The initial string tag in TPM2 ACPI table= is "NNN0000". =20 @param[in, out] Table The TPM2 SSDT ACPI table. @@ -424,6 +669,8 @@ PublishAcpiTable ( UINTN TableKey; EFI_ACPI_DESCRIPTION_HEADER *Table; UINTN TableSize; + UINT32 *PossibleIrqNumBuf; + UINT32 PossibleIrqNumBufSize; =20 Status =3D GetSectionFromFv ( &gEfiCallerIdGuid, @@ -454,6 +701,23 @@ PublishAcpiTable ( return Status; } =20 + if (PcdGet32(PcdTpm2IrqNum) !=3D 0) { + // + // Patch _PRS interrupt resource only when TPM interrupt is supported + // + PossibleIrqNumBuf =3D (UINT32 *)PcdGetPtr(PcdTpm2PossibleIrqNumBuf= ); + PossibleIrqNumBufSize =3D (UINT32)PcdGetSize(PcdTpm2PossibleIrqNumBuf); + + if (PossibleIrqNumBufSize <=3D MAX_PRS_INT_BUF_SIZE && (PossibleIrqNum= BufSize % sizeof(UINT32)) =3D=3D 0) { + Status =3D UpdatePossibleResource(Table, PossibleIrqNumBuf, Possible= IrqNumBufSize); + DEBUG (( + DEBUG_INFO, + "UpdatePossibleResource status - %x\n", + Status + )); + } + } + // // Measure to PCR[0] with event EV_POST_CODE ACPI DATA // @@ -471,6 +735,8 @@ PublishAcpiTable ( CopyMem (Table->OemId, PcdGetPtr (PcdAcpiDefaultOemId), sizeof (Table->O= emId) ); mTcgNvs =3D AssignOpRegion (Table, SIGNATURE_32 ('T', 'N', 'V', 'S'), (U= INT16) sizeof (TCG_NVS)); ASSERT (mTcgNvs !=3D NULL); + mTcgNvs->TpmIrqNum =3D PcdGet32(PcdTpm2IrqNum); + mTcgNvs->IsShortFormPkgLength =3D FALSE; =20 // // Publish the TPM ACPI table. Table is re-checksumed. diff --git a/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.h b/SecurityPkg/Tcg/Tcg2Smm/Tc= g2Smm.h index 100804c..732452c 100644 --- a/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.h +++ b/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.h @@ -1,7 +1,7 @@ /** @file The header file for Tcg2 SMM driver. =20 -Copyright (c) 2015 - 2017, Intel Corporation. All rights reserved.
+Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.
This program and the accompanying materials=20 are licensed and made available under the terms and conditions of the BSD = License=20 which accompanies this distribution. The full text of the license may be = found at=20 @@ -39,6 +39,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER= EXPRESS OR IMPLIED. #include #include #include +#include =20 #include =20 @@ -64,6 +65,8 @@ typedef struct { PHYSICAL_PRESENCE_NVS PhysicalPresence; MEMORY_CLEAR_NVS MemoryClear; UINT32 PPRequestUserConfirm; + UINT32 TpmIrqNum; + BOOLEAN IsShortFormPkgLength; } TCG_NVS; =20 typedef struct { @@ -102,4 +105,23 @@ typedef struct { #define TPM_HID_PNP_SIZE 8 #define TPM_HID_ACPI_SIZE 9 =20 +#define TPM_PRS_RESL "RESL" +#define TPM_PRS_RESS "RESS" +#define TPM_PRS_RES_NAME_SIZE 4 +// +// Minimum PRS resource template size +// 1 byte for BufferOp +// 1 byte for PkgLength +// 2 bytes for BufferSize +// 12 bytes for Memory32Fixed descriptor +// 5 bytes for Interrupt descriptor +// 2 bytes for END Tag +// +#define TPM_POS_RES_TEMPLATE_MIN_SIZE (1 + 1 = + 2 + 12 + 5 + 2) + +// +// Max Interrupt buffer size for PRS interrupt resource +// Now support 15 interrupts in maxmum +// +#define MAX_PRS_INT_BUF_SIZE (15*4) #endif // __TCG_SMM_H__ diff --git a/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.inf b/SecurityPkg/Tcg/Tcg2Smm/= Tcg2Smm.inf index c709743..86e1816 100644 --- a/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.inf +++ b/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.inf @@ -16,7 +16,7 @@ # This driver will have external input - variable and ACPINvs data in SMM= mode. # This external input must be validated carefully to avoid security issue. # -# Copyright (c) 2015 - 2017, Intel Corporation. All rights reserved.
+# Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.
# This program and the accompanying materials # are licensed and made available under the terms and conditions of the BS= D License # which accompanies this distribution. The full text of the license may be= found at @@ -58,6 +58,7 @@ Tpm2CommandLib Tcg2PhysicalPresenceLib IoLib + PcdLib =20 [Guids] ## SOMETIMES_PRODUCES ## Variable:L"MemoryOverwriteRequestControl" @@ -82,6 +83,8 @@ gEfiSecurityPkgTokenSpaceGuid.PcdTcgPhysicalPresenceInterfaceVer ## CON= SUMES gEfiSecurityPkgTokenSpaceGuid.PcdTpm2AcpiTableRev ## CON= SUMES gEfiSecurityPkgTokenSpaceGuid.PcdTpmPlatformClass ## SOM= ETIMES_CONSUMES + gEfiSecurityPkgTokenSpaceGuid.PcdTpm2IrqNum ## CONSUMES + gEfiSecurityPkgTokenSpaceGuid.PcdTpm2PossibleIrqNumBuf ## CONSUMES =20 [Depex] gEfiAcpiTableProtocolGuid AND diff --git a/SecurityPkg/Tcg/Tcg2Smm/Tpm.asl b/SecurityPkg/Tcg/Tcg2Smm/Tpm.= asl index f528305..f58efca 100644 --- a/SecurityPkg/Tcg/Tcg2Smm/Tpm.asl +++ b/SecurityPkg/Tcg/Tcg2Smm/Tpm.asl @@ -2,7 +2,7 @@ The TPM2 definition block in ACPI table for TCG2 physical presence =20 and MemoryClear. =20 -Copyright (c) 2015 - 2017, Intel Corporation. All rights reserved.
+Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.
(c)Copyright 2016 HP Development Company, L.P.
Copyright (c) 2017, Microsoft Corporation. All rights reserved.
This program and the accompanying materials=20 @@ -92,20 +92,59 @@ DefinitionBlock ( MCIP, 32, // Used for save the Mor paramter MORD, 32, // Memory Overwrite Request Data MRET, 32, // Memory Overwrite function return code - UCRQ, 32 // Phyical Presence request operation to Get User Co= nfirmation Status=20 + UCRQ, 32, // Phyical Presence request operation to Get User Co= nfirmation Status + IRQN, 32, // IRQ Number for _CRS + SFRB, 8 // Is shortformed Pkglength for resource buffer } =20 - Name(RESO, ResourceTemplate () { - Memory32Fixed (ReadWrite, 0xfed40000, 0x5000, REGS) + // + // Possible resource settings returned by _PRS method + // RESS : ResourceTemplate with PkgLength <=3D63 + // RESL : ResourceTemplate with PkgLength > 63 + // + // The format of the data has to follow the same format as + // _CRS (according to ACPI spec). + // + Name (RESS, ResourceTemplate() { + Memory32Fixed (ReadWrite, 0xfed40000, 0x5000) + Interrupt(ResourceConsumer, Level, ActiveLow, Shared, , , ) {1,2,3= ,4,5,6,7,8,9,10} + }) + + Name (RESL, ResourceTemplate() { + Memory32Fixed (ReadWrite, 0xfed40000, 0x5000) + Interrupt(ResourceConsumer, Level, ActiveLow, Shared, , , ) {1,2,3= ,4,5,6,7,8,9,10,11,12,13,14,15} + }) + + // + // Current resource settings for _CRS method + // + Name(RES0, ResourceTemplate () { + Memory32Fixed (ReadWrite, 0xfed40000, 0x5000, REG0) Interrupt(ResourceConsumer, Level, ActiveLow, Shared, , , INTR) {1= 2} }) =20 + Name(RES1, ResourceTemplate () { + Memory32Fixed (ReadWrite, 0xfed40000, 0x5000, REG1) + }) + + // // Return the resource consumed by TPM device. // Method(_CRS,0,Serialized) { - Return(RESO) + // + // IRQNum =3D 0 means disable IRQ support + // + If (LEqual(IRQN, 0)) { + Return (RES1) + } + Else + { + CreateDWordField(RES0, ^INTR._INT, LIRQ) + Store(IRQN, LIRQ) + Return (RES0) + } } =20 // @@ -113,23 +152,34 @@ DefinitionBlock ( // assign an interrupt number to the device. The input byte stream // has to be the same as returned by _CRS (according to ACPI spec). // + // Platform may choose to override this function with specific inter= rupt + // programing logic to replace FIFO/TIS SIRQ registers programing + // Method(_SRS,1,Serialized) { // + // Do not configure Interrupt if IRQ Num is configured 0 by default + // + If (LEqual(IRQN, 0)) { + Return (0) + } + + // // Update resource descriptor // Use the field name to identify the offsets in the argument - // buffer and RESO buffer. + // buffer and RES0 buffer. // CreateDWordField(Arg0, ^INTR._INT, IRQ0) - CreateDWordField(RESO, ^INTR._INT, LIRQ) + CreateDWordField(RES0, ^INTR._INT, LIRQ) Store(IRQ0, LIRQ) + Store(IRQ0, IRQN) =20 CreateBitField(Arg0, ^INTR._HE, ITRG) - CreateBitField(RESO, ^INTR._HE, LTRG) + CreateBitField(RES0, ^INTR._HE, LTRG) Store(ITRG, LTRG) =20 CreateBitField(Arg0, ^INTR._LL, ILVL) - CreateBitField(RESO, ^INTR._LL, LLVL) + CreateBitField(RES0, ^INTR._LL, LLVL) Store(ILVL, LLVL) =20 // @@ -176,15 +226,25 @@ DefinitionBlock ( } } =20 - // - // Possible resource settings. - // The format of the data has to follow the same format as - // _CRS (according to ACPI spec). - // - Name (_PRS, ResourceTemplate() { - Memory32Fixed (ReadWrite, 0xfed40000, 0x5000) - Interrupt(ResourceConsumer, Level, ActiveLow, Shared, , , SIRQ) {1= ,2,3,4,5,6,7,8,9,10,11,12,13,14,15} - }) + Method(_PRS,0,Serialized) + { + // + // IRQNum =3D 0 means disable IRQ support + // + If (LEqual(IRQN, 0)) { + Return (RES1) + } ElseIf(LEqual(SFRB, 0)) { + // + // Long format. Possible resources PkgLength > 63 + // + Return (RESL) + } Else { + // + // Short format. Possible resources PkgLength <=3D63 + // + Return (RESS) + } + } =20 Method (PTS, 1, Serialized) { =20 --=20 1.9.5.msysgit.1 _______________________________________________ edk2-devel mailing list edk2-devel@lists.01.org https://lists.01.org/mailman/listinfo/edk2-devel