From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=104.47.38.90; helo=nam02-bl2-obe.outbound.protection.outlook.com; envelope-from=christopher.co@microsoft.com; receiver=edk2-devel@lists.01.org Received: from NAM02-BL2-obe.outbound.protection.outlook.com (mail-bl2nam02on0090.outbound.protection.outlook.com [104.47.38.90]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id BBF6021154113 for ; Fri, 21 Sep 2018 01:26:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=AYb51B1mxSybR9Fx1BOeeNBYTos0yYWkoXs6hWVKFys=; b=DNdlnI1180MnWLvIcH2yulWICOTpzidIounwLiMYrZctmyp6qwVxXpWp8/HFpaL3nQXiUaloLfubmRLmwJ6jJbiGhJ9QYfkXz2+7jr7Yfs0HUmWJmDIoCeOJQnS27rFDksh2jgttjg8zZDd03F4ZUfYuCdM5OUia5QSSDlcZ0pc= Received: from DM5PR2101MB1128.namprd21.prod.outlook.com (52.132.133.20) by DM5PR2101MB0727.namprd21.prod.outlook.com (10.167.110.39) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1185.6; Fri, 21 Sep 2018 08:26:08 +0000 Received: from DM5PR2101MB1128.namprd21.prod.outlook.com ([fe80::81f8:300e:d90:d49]) by DM5PR2101MB1128.namprd21.prod.outlook.com ([fe80::81f8:300e:d90:d49%3]) with mapi id 15.20.1164.008; Fri, 21 Sep 2018 08:26:08 +0000 From: Chris Co To: "edk2-devel@lists.01.org" CC: Ard Biesheuvel , Leif Lindholm , Michael D Kinney Thread-Topic: [PATCH edk2-platforms 16/27] Silicon/NXP: Add i.MX6 Timer DXE driver Thread-Index: AQHUUYS/2ss3Ycw7KkmJDyN1egAQHQ== Date: Fri, 21 Sep 2018 08:26:08 +0000 Message-ID: <20180921082542.35768-17-christopher.co@microsoft.com> References: <20180921082542.35768-1-christopher.co@microsoft.com> In-Reply-To: <20180921082542.35768-1-christopher.co@microsoft.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-clientproxiedby: MWHPR17CA0054.namprd17.prod.outlook.com (2603:10b6:300:93::16) To DM5PR2101MB1128.namprd21.prod.outlook.com (2603:10b6:4:a8::20) x-ms-exchange-messagesentrepresentingtype: 1 x-originating-ip: [2001:4898:80e8:8:388a:edc9:7085:c18] x-ms-publictraffictype: Email x-microsoft-exchange-diagnostics: 1; DM5PR2101MB0727; 6:rCz71zR3y2aViYkigXECIAx6ORnpLoowGHvJeKutPD4+AAuyJROUsC3gHg5tKmgAes8CF+b0xH8BKIbtDRKLImiAsztlyMg125XVbkvdnyJhBaoDudUQWWThe/5VAjHvY6VdNq4P7HfWCK0BJ1h2uRbr9jqdbrzPl4y0d+tx84Azu/eDdozQf475A7kaffn4A+V7dwroEQZfpiJVW5iO1w/aJ5BcdDFHxALcsrG47eEioWQ6eGNIqslf9LqdWA3DEDddCjo+i56uX7ll9Yci9gLHl1PmzjVsLvpJRc6kPVAptWz/gRMI+m1V3mxa3O2nyX/Qcri2cVDhJUMrhhhbq3SY5QHvoi3P0E8ePyh1bWIl9elFlpqsUJ5xkPvnQnCXI23l01htQVUnMI3sDbokr8Wia63shas2+PH6/2TiDpBhzbzZzbh1M6WBNtLh8w4MmhnvtnaURvI+KXA0NzWs4g==; 5:oN7KiXJe6LZ7q47xrJ7/6iTrUKGk406ppAO8JNr2y4busc6Cbs8Rv4QsvJTwD4XJc8dxLJ1cQBinxhBhmNcnfjoX9K5AMnA/ioys+QgF2mv5i73YBYh/AAupSYaXae/vLB7liNMz01ZpbiUCKm+4eTloigEWgHpsz63bKToQfv8=; 7:X8uRiM1C5dNzZ3S+g4cvPlEtTlBLlVym5jANvILSjkRyEWQOEP16g7ZPeZoDHtTQxgPYzu2Z9+BI4A7ezDXTlZFSvHzfsNsJzj7g+5pJU9yoxzOSqfO0Y8VE4ZVB+XDI93Me1PNVA1ppeR0PcAtfInQHvopwMt+pKQ5+gVKF3YdSpIvmMT12zDvSXjk+N3T/GzLxbxucP3RCvMb1W/CPsxGBtqrtyVU+EsYhqMxhHLPAIHeJkoV9gktlP2wXMKXv x-ms-office365-filtering-correlation-id: 12ea740a-4674-46fa-b0d8-08d61f9be15d x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: BCL:0; PCL:0; RULEID:(7020095)(4652040)(8989299)(4534165)(4627221)(201703031133081)(201702281549075)(8990200)(5600074)(711020)(4618075)(2017052603328)(7193020); SRVR:DM5PR2101MB0727; x-ms-traffictypediagnostic: DM5PR2101MB0727: x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:(28532068793085)(89211679590171)(12401385986421)(228905959029699); x-ms-exchange-senderadcheck: 1 x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(3231355)(2280164)(944501410)(52105095)(2018427008)(93006095)(93001095)(3002001)(10201501046)(6055026)(149027)(150027)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123562045)(20161123560045)(20161123564045)(20161123558120)(201708071742011)(7699051)(76991041); SRVR:DM5PR2101MB0727; BCL:0; PCL:0; RULEID:; SRVR:DM5PR2101MB0727; x-forefront-prvs: 0802ADD973 x-forefront-antispam-report: SFV:NSPM; SFS:(10019020)(1496009)(39860400002)(396003)(136003)(376002)(366004)(346002)(199004)(189003)(8676002)(81156014)(25786009)(446003)(2900100001)(102836004)(46003)(52116002)(6346003)(81166006)(11346002)(105586002)(2351001)(8936002)(386003)(4326008)(76176011)(6506007)(10090500001)(5250100002)(7736002)(2616005)(486006)(305945005)(53376002)(6116002)(186003)(16799955002)(1076002)(2501003)(476003)(6916009)(99286004)(22452003)(97736004)(45954006)(71200400001)(71190400001)(72206003)(478600001)(966005)(6306002)(10290500003)(5640700003)(14454004)(36756003)(86362001)(19627235002)(6436002)(15188155005)(2906002)(86612001)(106356001)(54906003)(316002)(6486002)(256004)(6512007)(14444005)(68736007)(5660300001)(53936002)(60540400001)(44824005); DIR:OUT; SFP:1102; SCL:1; SRVR:DM5PR2101MB0727; H:DM5PR2101MB1128.namprd21.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1; received-spf: None (protection.outlook.com: microsoft.com does not designate permitted sender hosts) authentication-results: spf=none (sender IP is ) smtp.mailfrom=Christopher.Co@microsoft.com; x-microsoft-antispam-message-info: fmNT8/AmOrUdRxemuhs95r0kwfP6KOpQf55Sx39ZDsye9XTtIcCcYGwrYwO/HmmJmGSczhdgkk55tPgWW/qgIKJKsS+GqzMrahsmZgIinavYiEFmHAsDX6RrSvKfa2wLWEp32j1ZoW5gWfFTXgi8fyb3fpGzIGJY0XQX56mnFIaJGYdM5asKp8cEDfmin79V2XhQLcXc1/vi/y4ZNCGmxg8SjRUEumiPV9+HesR+sGjsCDEC4c7VVCS1SXErwwa3nJWY7ly94uauozqv3A6mZfbyrc9bk6ugwSZ0iztFMb4UtHCz0smqbYW1jxhTv9fOXBx7qkRREgftmvOnrJ7vmR5yBtkoFw9Z43i0dxpiHHGj3VQbmUM66xgWNWGpXzT+O6TdKFTDLWeYBunYMWyHKT+4xF4TW+1KTAnRc4BHAqNn20BfmLXmn+3j0pGhR8GL5SajPmAUdYE+i8njk25+/f8w9X6y3BM0AqwIpirI8bxOXtkkufhBXbkcoJwhQifilJiiToTdwexHfIckwg6crX2T7QiR54HLKjZN3qRUHobaVYquBF40sTmR66+OxHeL spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM MIME-Version: 1.0 X-OriginatorOrg: microsoft.com X-MS-Exchange-CrossTenant-Network-Message-Id: 12ea740a-4674-46fa-b0d8-08d61f9be15d X-MS-Exchange-CrossTenant-originalarrivaltime: 21 Sep 2018 08:26:08.4659 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 72f988bf-86f1-41af-91ab-2d7cd011db47 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM5PR2101MB0727 Subject: [PATCH edk2-platforms 16/27] Silicon/NXP: Add i.MX6 Timer DXE driver X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 21 Sep 2018 08:26:10 -0000 Content-Language: en-US Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable This adds DXE support for EPIT timer on NXP i.MX6 SoCs. Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Christopher Co Cc: Ard Biesheuvel Cc: Leif Lindholm Cc: Michael D Kinney --- Silicon/NXP/iMX6Pkg/Drivers/TimerDxe/Timer.c | 278 ++++++++++++++++++= ++ Silicon/NXP/iMX6Pkg/Drivers/TimerDxe/TimerDxe.inf | 55 ++++ 2 files changed, 333 insertions(+) diff --git a/Silicon/NXP/iMX6Pkg/Drivers/TimerDxe/Timer.c b/Silicon/NXP/iMX= 6Pkg/Drivers/TimerDxe/Timer.c new file mode 100644 index 000000000000..6b4db6185b48 --- /dev/null +++ b/Silicon/NXP/iMX6Pkg/Drivers/TimerDxe/Timer.c @@ -0,0 +1,278 @@ +/** @file +* +* Copyright (c) 2018 Microsoft Corporation. All rights reserved. +* +* This program and the accompanying materials +* are licensed and made available under the terms and conditions of the B= SD License +* which accompanies this distribution. The full text of the license may = be found at +* http://opensource.org/licenses/bsd-license.php +* +* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IM= PLIED. +* +**/ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include + +// The notification function to call on every timer interrupt. +volatile EFI_TIMER_NOTIFY mTimerNotifyFunction =3D (EFI_TIMER_NOTIFY) NULL= ; +EFI_EVENT EfiExitBootServicesEvent =3D (EFI_EVENT) NULL; + +// Cached copy of the Hardware Interrupt protocol instance +EFI_HARDWARE_INTERRUPT_PROTOCOL *gInterrupt =3D NULL; + +// Cached interrupt vector +volatile UINTN mVector; +UINT64 mCurrentTimerPeriod; + +EFI_STATUS +EFIAPI +TimerDriverRegisterHandler ( + IN EFI_TIMER_ARCH_PROTOCOL *This, + IN EFI_TIMER_NOTIFY NotifyFunction + ) +{ + DEBUG ((DEBUG_VERBOSE, "++TimerDriverRegisterHandler()\n")); + if ((NotifyFunction =3D=3D NULL) && (mTimerNotifyFunction =3D=3D NULL)) = { + return EFI_INVALID_PARAMETER; + } + + if ((NotifyFunction !=3D NULL) && (mTimerNotifyFunction !=3D NULL)) { + return EFI_ALREADY_STARTED; + } + + mTimerNotifyFunction =3D NotifyFunction; + DEBUG ((DEBUG_VERBOSE, "--TimerDriverRegisterHandler()=3Dok\n")); + return EFI_SUCCESS; +} + +EFI_STATUS +EFIAPI +TimerDriverSetTimerPeriod ( + IN EFI_TIMER_ARCH_PROTOCOL *This, + IN UINT64 TimerPeriod + ) +{ + PCSP_EPIT_REG pEpit; + UINT16 EpitPreScalar; + EFI_STATUS Status; + UINT32 TimerCount; + UINT32 Value; + + DEBUG ((DEBUG_VERBOSE, "++TimerDriverSetTimerPeriod(%d)\n", TimerPeriod)= ); + + pEpit =3D (PCSP_EPIT_REG) CSP_BASE_REG_PA_EPIT1; + DEBUG ((DEBUG_VERBOSE, + "TimerDriverSetTimerPeriod() disable timer. EPIT_REG adr=3D%p\n"= , pEpit)); + + // First stop the timer. + Value =3D MmioRead32 ((UINTN)&pEpit->CR); + Value &=3D ~(((1 << EPIT_CR_EN_WID) - 1) << EPIT_CR_EN_LSH); + Value |=3D (EPIT_CR_EN_DISABLE << EPIT_CR_EN_LSH); + MmioWrite32 ((UINTN)&pEpit->CR, Value); + + if (TimerPeriod =3D=3D 0) { + Status =3D gInterrupt->DisableInterruptSource (gInterrupt, mVector); + mCurrentTimerPeriod =3D 0; + DEBUG ((DEBUG_VERBOSE, "--TimerDriverSetTimerPeriod() Timer Disabled\n= ")); + return Status; + } + + // Configure EPIT to be sourced from iMX6 24 MHz crystal oscialltor + // Aim to have UEFI tick counting at 1 MHz clock or another frequency as= set in pcd + EpitPreScalar =3D 68; + DEBUG ((DEBUG_VERBOSE, + "TimerDriverSetTimerPeriod() using corrected EPIT prescalar=3D%d= \n", + EpitPreScalar)); + + MmioWrite32 ((UINTN)&pEpit->CR, + (EPIT_CR_ENMOD_LOAD << EPIT_CR_ENMOD_LSH) | + (EPIT_CR_OCIEN_ENABLE << EPIT_CR_OCIEN_LSH) | + (EPIT_CR_RLD_RELOAD << EPIT_CR_RLD_LSH) | + ((EpitPreScalar - 1) << EPIT_CR_PRESCALAR_LSH) | + (EPIT_CR_SWR_NORESET << EPIT_CR_SWR_LSH) | + (EPIT_CR_IOVW_OVR << EPIT_CR_IOVW_LSH) | + (EPIT_CR_DBGEN_ACTIVE << EPIT_CR_DBGEN_LSH) | + (EPIT_CR_WAITEN_ENABLE << EPIT_CR_WAITEN_LSH) | + (EPIT_CR_DOZEN_ENABLE << EPIT_CR_DOZEN_LSH) | + (EPIT_CR_STOPEN_ENABLE << EPIT_CR_STOPEN_LSH) | + (EPIT_CR_OM_DICONNECT << EPIT_CR_OM_LSH) | + (EPIT_CR_CLKSRC_IPGCLK << EPIT_CR_CLKSRC_LSH)); + + // Clear timer compare interrupt flag (write-1-clear) + MmioWrite32 ((UINTN)&pEpit->SR, ((1 << EPIT_SR_OCIF_WID) - 1) << EPIT_SR= _OCIF_LSH); + TimerCount =3D (UINT32) (TimerPeriod / 10); + if ((UINT64)TimerCount > (UINT64)0xffffffff) { + TimerCount =3D 0xffffffff; + } + + mCurrentTimerPeriod =3D TimerPeriod; + MmioWrite32 ((UINTN)&pEpit->CMPR, TimerCount); + MmioWrite32 ((UINTN)&pEpit->LR, TimerCount); + Status =3D gInterrupt->EnableInterruptSource (gInterrupt, mVector); + + // Turn the timer on + Value =3D MmioRead32 ((UINTN)&pEpit->CR); + Value &=3D ~(((1 << EPIT_CR_EN_WID) - 1) << EPIT_CR_EN_LSH); + Value |=3D EPIT_CR_EN_ENABLE << EPIT_CR_EN_LSH; + MmioWrite32 ((UINTN)&pEpit->CR, Value); + + DEBUG ((DEBUG_VERBOSE, "--TimerDriverSetTimerPeriod(%d)=3D%Xh\n", TimerP= eriod, + Status)); + return Status; +} + +EFI_STATUS +EFIAPI +TimerDriverGetTimerPeriod ( + IN EFI_TIMER_ARCH_PROTOCOL *This, + OUT UINT64 *TimerPeriod + ) +{ + *TimerPeriod =3D mCurrentTimerPeriod; + DEBUG ((DEBUG_VERBOSE, "+-TimerDriverGetTimerPeriod(%d)=3Dok\n", + mCurrentTimerPeriod)); + return EFI_SUCCESS; +} + +VOID +EFIAPI +TimerInterruptHandler ( + IN HARDWARE_INTERRUPT_SOURCE Source, + IN EFI_SYSTEM_CONTEXT SystemContext + ) +{ + EFI_TPL OriginalTPL; + PCSP_EPIT_REG pEpit; + + pEpit =3D (PCSP_EPIT_REG) CSP_BASE_REG_PA_EPIT1; + + // DXE core uses this callback for the EFI timer tick. The DXE core uses= locks + // that raise to TPL_HIGH and then restore back to current level. Thus w= e need + // to make sure TPL level is set to TPL_HIGH while we are handling the t= imer tick. + OriginalTPL =3D gBS->RaiseTPL (TPL_HIGH_LEVEL); + + // Check if the timer interrupt is active + if (MmioRead32 ((UINTN)&pEpit->SR) !=3D 0) { + // Acknowledge the EPIT interrupt + MmioWrite32 ((UINTN)&pEpit->SR, 0x1); + + // Signal EOI to avoid losing subsequent ticks from long duration hand= lers + gInterrupt->EndOfInterrupt (gInterrupt, Source); + + if (mTimerNotifyFunction) { + mTimerNotifyFunction (mCurrentTimerPeriod); + } + } + + gBS->RestoreTPL (OriginalTPL); +} + +EFI_STATUS +EFIAPI +TimerDriverGenerateSoftInterrupt ( + IN EFI_TIMER_ARCH_PROTOCOL *This + ) +{ + return EFI_UNSUPPORTED; +} + +EFI_TIMER_ARCH_PROTOCOL gTimer =3D { + TimerDriverRegisterHandler, + TimerDriverSetTimerPeriod, + TimerDriverGetTimerPeriod, + TimerDriverGenerateSoftInterrupt +}; + +VOID +EFIAPI +ExitBootServicesEvent ( + IN EFI_EVENT Event, + IN VOID *Context + ) +{ + EFI_STATUS Status; + + DEBUG ((DEBUG_INFO, "Disabling EPIT timer on ExitBootServicesEvent")); + + // Disable the timer + Status =3D TimerDriverSetTimerPeriod (&gTimer, 0); + ASSERT_EFI_ERROR (Status); +} + +EFI_STATUS +EFIAPI +TimerInitialize ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable +) +{ + EFI_HANDLE Handle; + EFI_STATUS Status; + DEBUG ((DEBUG_VERBOSE, "++TimerInitialize()\n")); + + Handle =3D NULL; + mVector =3D IRQ_EPIT1; + + // Find the interrupt controller protocol. + Status =3D gBS->LocateProtocol ( + &gHardwareInterruptProtocolGuid, + NULL, + (VOID **) &gInterrupt); + ASSERT_EFI_ERROR (Status); + + // Disable the timer + Status =3D TimerDriverSetTimerPeriod (&gTimer, 0); + ASSERT_EFI_ERROR (Status); + + // Install interrupt handler + Status =3D gInterrupt->RegisterInterruptSource (gInterrupt, mVector, + TimerInterruptHandler); + ASSERT_EFI_ERROR (Status); + + // Set up default timer + Status =3D TimerDriverSetTimerPeriod (&gTimer, FixedPcdGet32 (PcdTimerPe= riod)); + ASSERT_EFI_ERROR (Status); + + DEBUG (( + DEBUG_VERBOSE, + "EPIT Timer initialized to default period %d x 100ns ~ %dms\n", + FixedPcdGet32 (PcdTimerPeriod), + FixedPcdGet32 (PcdTimerPeriod) / 10000)); + + // Install the Timer Architectural Protocol onto a new handle + Status =3D gBS->InstallMultipleProtocolInterfaces ( + &Handle, + &gEfiTimerArchProtocolGuid, + &gTimer, + NULL); + + ASSERT_EFI_ERROR (Status); + + // Register for ExitBootServicesEvent + Status =3D gBS->CreateEvent ( + EVT_SIGNAL_EXIT_BOOT_SERVICES, + TPL_NOTIFY, + ExitBootServicesEvent, + NULL, + &EfiExitBootServicesEvent); + + ASSERT_EFI_ERROR (Status); + + DEBUG ((DEBUG_VERBOSE, "--TimerInitialize()\n")); + return Status; +} diff --git a/Silicon/NXP/iMX6Pkg/Drivers/TimerDxe/TimerDxe.inf b/Silicon/NX= P/iMX6Pkg/Drivers/TimerDxe/TimerDxe.inf new file mode 100644 index 000000000000..adcc158e29ab --- /dev/null +++ b/Silicon/NXP/iMX6Pkg/Drivers/TimerDxe/TimerDxe.inf @@ -0,0 +1,55 @@ +#/** @file +# +# Copyright (c) 2009, Apple Inc. All rights reserved.
+# Copyright (c) 2018 Microsoft Corporation. All rights reserved. +# +# All rights reserved. This program and the accompanying materials +# are licensed and made available under the terms and conditions of the B= SD License +# which accompanies this distribution. The full text of the license may = be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IM= PLIED. +# +#**/ + +[Defines] + INF_VERSION =3D 0x0001001A + BASE_NAME =3D iMX6TimerDxe + FILE_GUID =3D 7CAF576F-F1D9-4104-A922-CB64537FD7AE + MODULE_TYPE =3D DXE_DRIVER + VERSION_STRING =3D 1.0 + ENTRY_POINT =3D TimerInitialize + +[Sources.common] + Timer.c + +[Packages] + ArmPkg/ArmPkg.dec + EmbeddedPkg/EmbeddedPkg.dec + MdePkg/MdePkg.dec + Silicon/NXP/iMX6Pkg/iMX6Pkg.dec + +[LibraryClasses] + BaseLib + BaseMemoryLib + DebugLib + IoLib + PerformanceLib + UefiBootServicesTableLib + UefiDriverEntryPoint + UefiLib + UefiRuntimeServicesTableLib + +[Guids] + +[Protocols] + gEfiTimerArchProtocolGuid + gHardwareInterruptProtocolGuid + +[Pcd.common] + gEmbeddedTokenSpaceGuid.PcdEmbeddedFdPerformanceCounterPeriodInNanosecon= ds + gEmbeddedTokenSpaceGuid.PcdTimerPeriod + +[Depex] + gHardwareInterruptProtocolGuid --=20 2.16.2.gvfs.1.33.gf5370f1