From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by spool.mail.gandi.net (Postfix) with ESMTPS id 45971D801D3 for ; Wed, 20 Sep 2023 14:33:30 +0000 (UTC) DKIM-Signature: a=rsa-sha256; bh=rUNBtJSk1XrtEEZM0BPsHxf+79b9rN5bWYMU6PwCQEM=; c=relaxed/simple; d=groups.io; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:MIME-Version:Precedence:List-Subscribe:List-Help:Sender:List-Id:Mailing-List:Delivered-To:Reply-To:List-Unsubscribe-Post:List-Unsubscribe:Content-Transfer-Encoding; s=20140610; t=1695220409; v=1; b=XTJ/cb4mdZKERKAWHXMO/q4BeDmd6y6gxu+cuEtbSW/pK4sqLc/OPDJtj3hrXFwQzTVs7f2u bzPhq1WPp65DvBPgy+jmvbue+2StiqG/vqUlqDDeO++q49u4o+eM/dOGt2sSJFLpLVI2DhV9voX KKM8IFKUktAu5RGIeClIZL5U= X-Received: by 127.0.0.2 with SMTP id V0LRYY7687511x84VEyhBsfD; Wed, 20 Sep 2023 07:33:29 -0700 X-Received: from muminek.juszkiewicz.com.pl (muminek.juszkiewicz.com.pl [213.251.184.221]) by mx.groups.io with SMTP id smtpd.web10.41201.1695220407575210980 for ; Wed, 20 Sep 2023 07:33:28 -0700 X-Received: from localhost (localhost [127.0.0.1]) by muminek.juszkiewicz.com.pl (Postfix) with ESMTP id 5A065260662; Wed, 20 Sep 2023 16:33:25 +0200 (CEST) X-Virus-Scanned: Debian amavis at juszkiewicz.com.pl X-Received: from muminek.juszkiewicz.com.pl ([127.0.0.1]) by localhost (muminek.juszkiewicz.com.pl [127.0.0.1]) (amavis, port 10024) with ESMTP id YZTDsWlLv9zl; Wed, 20 Sep 2023 16:33:23 +0200 (CEST) X-Received: from applejack.lan (83.11.3.58.ipv4.supernova.orange.pl [83.11.3.58]) by muminek.juszkiewicz.com.pl (Postfix) with ESMTPSA id 19278260933; Wed, 20 Sep 2023 16:33:22 +0200 (CEST) From: "Marcin Juszkiewicz" To: devel@edk2.groups.io Cc: Leif Lindholm , Ard Biesheuvel , Graeme Gregory , Marcin Juszkiewicz Subject: [edk2-devel] [PATCH edk2-platforms 2/2] Silicon/SbsaQemu: generate GTDT from C Date: Wed, 20 Sep 2023 16:33:18 +0200 Message-ID: <20230920143318.430456-3-marcin.juszkiewicz@linaro.org> In-Reply-To: <20230920143318.430456-1-marcin.juszkiewicz@linaro.org> References: <20230920143318.430456-1-marcin.juszkiewicz@linaro.org> MIME-Version: 1.0 Precedence: Bulk List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,marcin.juszkiewicz@linaro.org List-Unsubscribe-Post: List-Unsubscribe=One-Click List-Unsubscribe: X-Gm-Message-State: XEniaqHQG0oM4d2Tdn6QpDt1x7686176AA= Content-Transfer-Encoding: quoted-printable X-GND-Status: LEGIT Authentication-Results: spool.mail.gandi.net; dkim=pass header.d=groups.io header.s=20140610 header.b="XTJ/cb4m"; spf=pass (spool.mail.gandi.net: domain of bounce@groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce@groups.io; dmarc=fail reason="SPF not aligned (relaxed), DKIM not aligned (relaxed)" header.from=linaro.org (policy=none) We need to have some conditional code while generating GTDT due to adding non-secure EL2 virtual timer. Signed-off-by: Marcin Juszkiewicz --- .../Qemu/SbsaQemu/AcpiTables/AcpiTables.inf | 1 - .../SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.inf | 6 + .../Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.h | 29 +++++ .../Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c | 101 +++++++++++++++++ Silicon/Qemu/SbsaQemu/AcpiTables/Gtdt.aslc | 107 ------------------ 5 files changed, 136 insertions(+), 108 deletions(-) delete mode 100644 Silicon/Qemu/SbsaQemu/AcpiTables/Gtdt.aslc diff --git a/Silicon/Qemu/SbsaQemu/AcpiTables/AcpiTables.inf b/Silicon/Qe= mu/SbsaQemu/AcpiTables/AcpiTables.inf index 97021f7971c7..61ff3dff3356 100644 --- a/Silicon/Qemu/SbsaQemu/AcpiTables/AcpiTables.inf +++ b/Silicon/Qemu/SbsaQemu/AcpiTables/AcpiTables.inf @@ -19,7 +19,6 @@ [Sources] Dbg2.aslc Dsdt.asl Fadt.aslc - Gtdt.aslc Mcfg.aslc Spcr.aslc =20 diff --git a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDx= e.inf b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.inf index 14d760b36400..19f186f4310c 100644 --- a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.inf +++ b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.inf @@ -68,3 +68,9 @@ [FixedPcd] gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultOemId gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultOemTableId gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiDefaultOemRevision + + gArmTokenSpaceGuid.PcdArmArchTimerSecIntrNum + gArmTokenSpaceGuid.PcdArmArchTimerIntrNum + gArmTokenSpaceGuid.PcdArmArchTimerHypIntrNum + gArmTokenSpaceGuid.PcdArmArchTimerVirtIntrNum + gArmTokenSpaceGuid.PcdArmArchTimerHypVirtIntrNum diff --git a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDx= e.h b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.h index f13ee3f738c2..7c9074b10960 100644 --- a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.h +++ b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.h @@ -34,4 +34,33 @@ typedef struct { SBSA_EFI_ACPI_6_0_IO_REMAPPING_RC_NODE RcNode; } SBSA_IO_REMAPPING_STRUCTURE; =20 +typedef struct { + EFI_ACPI_6_3_GENERIC_TIMER_DESCRIPTION_TABLE mGtdt; + EFI_ACPI_6_3_GTDT_SBSA_GENERIC_WATCHDOG_STRUCTURE mGwdt; +} GENERIC_TIMER_DESCRIPTION_TABLES; + +#ifndef SYSTEM_TIMER_BASE_ADDRESS + #define SYSTEM_TIMER_BASE_ADDRESS MAX_ADDRESS +#endif + +#define GTDT_TIMER_LEVEL_TRIGGERED 0 +#define GTDT_TIMER_ACTIVE_LOW EFI_ACPI_6_3_GTDT_TIMER_FLAG_TIMER_I= NTERRUPT_POLARITY +#define GTDT_TIMER_ALWAYS_ON EFI_ACPI_6_3_GTDT_TIMER_FLAG_ALWAYS_= ON_CAPABILITY + +#define GTDT_GTIMER_FLAGS (GTDT_TIMER_ACTIVE_LOW | \ + GTDT_TIMER_LEVEL_TRIGGERED | \ + GTDT_TIMER_ALWAYS_ON) + +#define SBSA_PLATFORM_WATCHDOG_COUNT 1 +#define SBSA_PLATFORM_TIMER_COUNT (SBSA_PLATFORM_WATCHDOG_COUNT) + +#define SBSAQEMU_WDT_REFRESH_FRAME_BASE 0x50010000 +#define SBSAQEMU_WDT_CONTROL_FRAME_BASE 0x50011000 +#define SBSAQEMU_WDT_IRQ 48 + +#define GTDT_WDTIMER_LEVEL_TRIGGERED 0 +#define GTDT_WDTIMER_ACTIVE_HIGH 0 + +#define GTDT_WDTIMER_FLAGS (GTDT_WDTIMER_ACTIVE_HIGH | GTDT_WDT= IMER_LEVEL_TRIGGERED) + #endif diff --git a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDx= e.c b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c index e52256616936..1f10214e264b 100644 --- a/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c +++ b/Silicon/Qemu/SbsaQemu/Drivers/SbsaQemuAcpiDxe/SbsaQemuAcpiDxe.c @@ -11,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -586,6 +587,101 @@ AddPpttTable ( return Status; } =20 +/* + * A function that adds the GTDT ACPI table. + */ +EFI_STATUS +AddGtdtTable ( + IN EFI_ACPI_TABLE_PROTOCOL *AcpiTable + ) +{ + EFI_STATUS Status; + UINTN TableHandle; + UINT32 TableSize; + EFI_PHYSICAL_ADDRESS PageAddress; + UINT8 *New; + + TableSize =3D sizeof (EFI_ACPI_6_5_GENERIC_TIMER_DESCRIPTION_TABLE) + + sizeof (EFI_ACPI_6_3_GTDT_SBSA_GENERIC_WATCHDOG_STRUCTURE); + + Status =3D gBS->AllocatePages ( + AllocateAnyPages, + EfiACPIReclaimMemory, + EFI_SIZE_TO_PAGES (TableSize), + &PageAddress + ); + + if (EFI_ERROR(Status)) { + DEBUG ((DEBUG_ERROR, "Failed to allocate pages for GTDT table\n")); + return EFI_OUT_OF_RESOURCES; + } + + EFI_ACPI_6_3_GENERIC_TIMER_DESCRIPTION_TABLE Gtdt =3D { + + SBSAQEMU_ACPI_HEADER ( + EFI_ACPI_6_3_GENERIC_TIMER_DESCRIPTION_TABLE_SIGNATURE, + GENERIC_TIMER_DESCRIPTION_TABLES, + EFI_ACPI_6_3_GENERIC_TIMER_DESCRIPTION_TABLE_REVISION), + + SYSTEM_TIMER_BASE_ADDRESS, // UINT64 PhysicalA= ddress + 0, // UINT32 Reserved + FixedPcdGet32 (PcdArmArchTimerSecIntrNum), // UINT32 SecurePL1= TimerGSIV + GTDT_GTIMER_FLAGS, // UINT32 SecurePL1= TimerFlags + FixedPcdGet32 (PcdArmArchTimerIntrNum), // UINT32 NonSecure= PL1TimerGSIV + GTDT_GTIMER_FLAGS, // UINT32 NonSecure= PL1TimerFlags + FixedPcdGet32 (PcdArmArchTimerVirtIntrNum), // UINT32 VirtualTi= merGSIV + GTDT_GTIMER_FLAGS, // UINT32 VirtualTi= merFlags + FixedPcdGet32 (PcdArmArchTimerHypIntrNum), // UINT32 NonSecure= PL2TimerGSIV + GTDT_GTIMER_FLAGS, // UINT32 NonSecure= PL2TimerFlags + MAX_ADDRESS, // UINT64 CntReadBa= sePhysicalAddress + SBSA_PLATFORM_TIMER_COUNT, // UINT32 PlatformT= imerCount + sizeof(EFI_ACPI_6_3_GENERIC_TIMER_DESCRIPTION_TABLE), + // UINT32 PlatformT= imerOffset + FixedPcdGet32 (PcdArmArchTimerHypVirtIntrNum),// UINT32 VirtualPL= 2TimerGSIV + GTDT_GTIMER_FLAGS // UINT32 VirtualPL= 2TimerFlags + }; + + // Non-secure EL2 virtual timer requires VHE support (v8.1+) + if (! ArmHasVhe()) { + Gtdt.VirtualPL2TimerGSIV =3D 0; + Gtdt.VirtualPL2TimerFlags =3D 0; + } + + EFI_ACPI_6_3_GTDT_SBSA_GENERIC_WATCHDOG_STRUCTURE Gwdt =3D { + EFI_ACPI_6_3_GTDT_SBSA_GENERIC_WATCHDOG, + sizeof(EFI_ACPI_6_3_GTDT_SBSA_GENERIC_WATCHDOG_STRUCTURE), + EFI_ACPI_RESERVED_WORD, + SBSAQEMU_WDT_REFRESH_FRAME_BASE, + SBSAQEMU_WDT_CONTROL_FRAME_BASE, + SBSAQEMU_WDT_IRQ, + GTDT_WDTIMER_FLAGS + }; + + New =3D (UINT8 *)(UINTN) PageAddress; + ZeroMem (New, TableSize); + + CopyMem (New, &Gtdt, sizeof (EFI_ACPI_6_3_GENERIC_TIMER_DESCRIPTION_TA= BLE)); + New +=3D sizeof (EFI_ACPI_6_3_GENERIC_TIMER_DESCRIPTION_TABLE); + + CopyMem (New, &Gwdt, sizeof (EFI_ACPI_6_3_GTDT_SBSA_GENERIC_WATCHDOG_S= TRUCTURE)); + New +=3D sizeof (EFI_ACPI_6_3_GTDT_SBSA_GENERIC_WATCHDOG_STRUCTURE); + + // Perform Checksum + AcpiPlatformChecksum ((UINT8*) PageAddress, TableSize); + + Status =3D AcpiTable->InstallAcpiTable ( + AcpiTable, + (EFI_ACPI_COMMON_HEADER *)PageAddress, + TableSize, + &TableHandle + ); + if (EFI_ERROR(Status)) { + DEBUG ((DEBUG_ERROR, "Failed to install GTDT table\n")); + } + + return Status; +} + EFI_STATUS EFIAPI InitializeSbsaQemuAcpiDxe ( @@ -637,5 +733,10 @@ InitializeSbsaQemuAcpiDxe ( DEBUG ((DEBUG_ERROR, "Failed to add PPTT table\n")); } =20 + Status =3D AddGtdtTable (AcpiTable); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_ERROR, "Failed to add GTDT table\n")); + } + return EFI_SUCCESS; } diff --git a/Silicon/Qemu/SbsaQemu/AcpiTables/Gtdt.aslc b/Silicon/Qemu/Sb= saQemu/AcpiTables/Gtdt.aslc deleted file mode 100644 index ba145aff6413..000000000000 --- a/Silicon/Qemu/SbsaQemu/AcpiTables/Gtdt.aslc +++ /dev/null @@ -1,107 +0,0 @@ -/** @file -* Generic Timer Description Table (GTDT) -* -* Copyrignt (c) 2020, Linaro Limited. All rights reserved. -* -* SPDX-License-Identifier: BSD-2-Clause-Patent -**/ - -#include -#include -#include -#include - -#define GTDT_GLOBAL_FLAGS_MAPPED EFI_ACPI_5_0_GTDT_GLOBAL_FLAG_MEMO= RY_MAPPED_BLOCK_PRESENT -#define GTDT_GLOBAL_FLAGS_NOT_MAPPED 0 -#define GTDT_GLOBAL_FLAGS_EDGE EFI_ACPI_5_0_GTDT_GLOBAL_FLAG_INTE= RRUPT_MODE -#define GTDT_GLOBAL_FLAGS_LEVEL 0 - -// Note: We could have a build flag that switches between memory mapped/= non-memory mapped timer -#ifdef SYSTEM_TIMER_BASE_ADDRESS - #define GTDT_GLOBAL_FLAGS (GTDT_GLOBAL_FLAGS_MAPPED | GTDT= _GLOBAL_FLAGS_LEVEL) -#else - #define GTDT_GLOBAL_FLAGS (GTDT_GLOBAL_FLAGS_NOT_MAPPED | = GTDT_GLOBAL_FLAGS_LEVEL) - #define SYSTEM_TIMER_BASE_ADDRESS 0xFFFFFFFFFFFFFFFF -#endif - -#define GTDT_TIMER_EDGE_TRIGGERED EFI_ACPI_6_3_GTDT_TIMER_FLAG_TIMER_I= NTERRUPT_MODE -#define GTDT_TIMER_LEVEL_TRIGGERED 0 -#define GTDT_TIMER_ACTIVE_LOW EFI_ACPI_6_3_GTDT_TIMER_FLAG_TIMER_I= NTERRUPT_POLARITY -#define GTDT_TIMER_ACTIVE_HIGH 0 -#define GTDT_TIMER_ALWAYS_ON EFI_ACPI_6_3_GTDT_TIMER_FLAG_ALWAYS_= ON_CAPABILITY - -#define GTDT_GTIMER_FLAGS (GTDT_TIMER_ACTIVE_LOW | \ - GTDT_TIMER_LEVEL_TRIGGERED | \ - GTDT_TIMER_ALWAYS_ON) - -#define SBSA_PLATFORM_WATCHDOG_COUNT 1 -#define SBSA_PLATFORM_TIMER_COUNT (SBSA_PLATFORM_WATCHDOG_COUNT) - -#define SBSAQEMU_WDT_REFRESH_FRAME_BASE 0x50010000 -#define SBSAQEMU_WDT_CONTROL_FRAME_BASE 0x50011000 -#define SBSAQEMU_WDT_IRQ 48 - -#define GTDT_WDTIMER_EDGE_TRIGGERED EFI_ACPI_6_3_GTDT_SBSA_GENERIC_WAT= CHDOG_FLAG_TIMER_INTERRUPT_MODE -#define GTDT_WDTIMER_LEVEL_TRIGGERED 0 -#define GTDT_WDTIMER_ACTIVE_LOW EFI_ACPI_6_3_GTDT_SBSA_GENERIC_WAT= CHDOG_FLAG_TIMER_INTERRUPT_POLARITY -#define GTDT_WDTIMER_ACTIVE_HIGH 0 - -#define GTDT_WDTIMER_FLAGS (GTDT_WDTIMER_ACTIVE_HIGH | GTDT_WDT= IMER_LEVEL_TRIGGERED) - -#define EFI_ACPI_6_3_SBSA_GENERIC_WATCHDOG_STRUCTURE_INIT( \ - RefreshFramePhysicalAddress, ControlFramePhysicalAddress, \ - WatchdogTimerGSIV, WatchdogTimerFlags) \ - { \ - EFI_ACPI_6_3_GTDT_SBSA_GENERIC_WATCHDOG, \ - sizeof(EFI_ACPI_6_3_GTDT_SBSA_GENERIC_WATCHDOG_STRUCTURE), \ - EFI_ACPI_RESERVED_WORD, \ - RefreshFramePhysicalAddress, \ - ControlFramePhysicalAddress, \ - WatchdogTimerGSIV, \ - WatchdogTimerFlags \ - } - - #pragma pack (1) - - typedef struct { - EFI_ACPI_6_3_GENERIC_TIMER_DESCRIPTION_TABLE Gtdt; - EFI_ACPI_6_3_GTDT_SBSA_GENERIC_WATCHDOG_STRUCTURE Gwdt; - } GENERIC_TIMER_DESCRIPTION_TABLES; - - #pragma pack () - - GENERIC_TIMER_DESCRIPTION_TABLES Gtdt =3D { - { - SBSAQEMU_ACPI_HEADER( - EFI_ACPI_6_3_GENERIC_TIMER_DESCRIPTION_TABLE_SIGNATURE, - GENERIC_TIMER_DESCRIPTION_TABLES, - EFI_ACPI_6_3_GENERIC_TIMER_DESCRIPTION_TABLE_REVISION - ), - SYSTEM_TIMER_BASE_ADDRESS, // UINT64 PhysicalA= ddress - 0, // UINT32 Reserved - FixedPcdGet32 (PcdArmArchTimerSecIntrNum), // UINT32 SecurePL1= TimerGSIV - GTDT_GTIMER_FLAGS, // UINT32 SecurePL1= TimerFlags - FixedPcdGet32 (PcdArmArchTimerIntrNum), // UINT32 NonSecure= PL1TimerGSIV - GTDT_GTIMER_FLAGS, // UINT32 NonSecure= PL1TimerFlags - FixedPcdGet32 (PcdArmArchTimerVirtIntrNum), // UINT32 VirtualTi= merGSIV - GTDT_GTIMER_FLAGS, // UINT32 VirtualTi= merFlags - FixedPcdGet32 (PcdArmArchTimerHypIntrNum), // UINT32 NonSecure= PL2TimerGSIV - GTDT_GTIMER_FLAGS, // UINT32 NonSecure= PL2TimerFlags - 0xFFFFFFFFFFFFFFFF, // UINT64 CntReadBa= sePhysicalAddress - SBSA_PLATFORM_TIMER_COUNT, // UINT32 PlatformT= imerCount - sizeof(EFI_ACPI_6_3_GENERIC_TIMER_DESCRIPTION_TABLE), - // UINT32 PlatformT= imerOffset - 0, // UINT32 VirtualPL= 2TimerGSIV - 0 // UINT32 VirtualPL= 2TimerFlags - }, - EFI_ACPI_6_3_SBSA_GENERIC_WATCHDOG_STRUCTURE_INIT( - SBSAQEMU_WDT_REFRESH_FRAME_BASE, - SBSAQEMU_WDT_CONTROL_FRAME_BASE, - SBSAQEMU_WDT_IRQ, - GTDT_WDTIMER_FLAGS - ) - }; - -// Reference the table being generated to prevent the optimizer from rem= oving the -// data structure from the executable -VOID* CONST ReferenceAcpiTable =3D &Gtdt; --=20 2.41.0 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#108915): https://edk2.groups.io/g/devel/message/108915 Mute This Topic: https://groups.io/mt/101479615/7686176 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [rebecca@openfw.io] -=-=-=-=-=-=-=-=-=-=-=-