From d8aa665b31e309a31b59b97d04ba8d003f4fe84e Mon Sep 17 00:00:00 2001 From: Pierre Gondois Date: Mon, 10 Jun 2024 14:00:00 +0200 Subject: [PATCH] DynamicTablesPkg: FdtHwInfoParserLib: Move IRQ map to arch folder The interrupts property in DT is arch specific. Move the current implementation and the way to decode the property to the Arm folder to prepare for other architecture support. Suggested-by: Sunil V L Signed-off-by: Pierre Gondois Reviewed-by: Sami Mujawar Reviewed-by: Sunil V L --- .../FdtHwInfoParserLib/Arm/ArmFdtInterrupt.c | 85 +++++++++++++++++++ .../FdtHwInfoParserLib/FdtHwInfoParserLib.inf | 1 + .../Library/FdtHwInfoParserLib/FdtUtility.c | 71 ---------------- 3 files changed, 86 insertions(+), 71 deletions(-) create mode 100644 DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/ArmFdtInterrupt.c diff --git a/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/ArmFdtInterrupt.c b/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/ArmFdtInterrupt.c new file mode 100644 index 0000000000..21b1306e57 --- /dev/null +++ b/DynamicTablesPkg/Library/FdtHwInfoParserLib/Arm/ArmFdtInterrupt.c @@ -0,0 +1,85 @@ +/** @file + Flattened device tree utility. + + Copyright (c) 2021, ARM Limited. All rights reserved.
+ SPDX-License-Identifier: BSD-2-Clause-Patent + + @par Reference(s): + - Device tree Specification - Release v0.3 + - linux/Documentation/devicetree/bindings/interrupt-controller/arm%2Cgic.yaml + - linux//Documentation/devicetree/bindings/interrupt-controller/arm%2Cgic.yaml +**/ + +#include +#include "FdtUtility.h" + +/** Get the interrupt Id of an interrupt described in a fdt. + + Data must describe a GIC interrupt. A GIC interrupt is on at least + 3 UINT32 cells. + This function DOES NOT SUPPORT extended SPI range and extended PPI range. + + @param [in] Data Pointer to the first cell of an "interrupts" property. + + @retval The interrupt id. +**/ +UINT32 +EFIAPI +FdtGetInterruptId ( + UINT32 CONST *Data + ) +{ + UINT32 IrqType; + UINT32 IrqId; + + ASSERT (Data != NULL); + + IrqType = fdt32_to_cpu (Data[IRQ_TYPE_OFFSET]); + IrqId = fdt32_to_cpu (Data[IRQ_NUMBER_OFFSET]); + + switch (IrqType) { + case DT_SPI_IRQ: + IrqId += SPI_OFFSET; + break; + + case DT_PPI_IRQ: + IrqId += PPI_OFFSET; + break; + + default: + ASSERT (0); + IrqId = 0; + } + + return IrqId; +} + +/** Get the ACPI interrupt flags of an interrupt described in a fdt. + + Data must describe a GIC interrupt. A GIC interrupt is on at least + 3 UINT32 cells. + + PPI interrupt cpu mask on bits [15:8] are ignored. + + @param [in] Data Pointer to the first cell of an "interrupts" property. + + @retval The interrupt flags (for ACPI). +**/ +UINT32 +EFIAPI +FdtGetInterruptFlags ( + UINT32 CONST *Data + ) +{ + UINT32 IrqFlags; + UINT32 AcpiIrqFlags; + + ASSERT (Data != NULL); + + IrqFlags = fdt32_to_cpu (Data[IRQ_FLAGS_OFFSET]); + + AcpiIrqFlags = DT_IRQ_IS_EDGE_TRIGGERED (IrqFlags) ? BIT0 : 0; + AcpiIrqFlags |= DT_IRQ_IS_ACTIVE_LOW (IrqFlags) ? BIT1 : 0; + + return AcpiIrqFlags; +} diff --git a/DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtHwInfoParserLib.inf b/DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtHwInfoParserLib.inf index d3010af527..c8511ab4dd 100644 --- a/DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtHwInfoParserLib.inf +++ b/DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtHwInfoParserLib.inf @@ -28,6 +28,7 @@ Serial/SerialPortParser.h [Sources.ARM, Sources.AARCH64] + Arm/ArmFdtInterrupt.c Arm/ArmFdtHwInfoParser.c Arm/BootArch/ArmBootArchParser.c Arm/BootArch/ArmBootArchParser.h diff --git a/DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtUtility.c b/DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtUtility.c index 5314cf3808..bab2285759 100644 --- a/DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtUtility.c +++ b/DynamicTablesPkg/Library/FdtHwInfoParserLib/FdtUtility.c @@ -13,77 +13,6 @@ #include #include "FdtUtility.h" -/** Get the interrupt Id of an interrupt described in a fdt. - - Data must describe a GIC interrupt. A GIC interrupt is on at least - 3 UINT32 cells. - This function DOES NOT SUPPORT extended SPI range and extended PPI range. - - @param [in] Data Pointer to the first cell of an "interrupts" property. - - @retval The interrupt id. -**/ -UINT32 -EFIAPI -FdtGetInterruptId ( - UINT32 CONST *Data - ) -{ - UINT32 IrqType; - UINT32 IrqId; - - ASSERT (Data != NULL); - - IrqType = fdt32_to_cpu (Data[IRQ_TYPE_OFFSET]); - IrqId = fdt32_to_cpu (Data[IRQ_NUMBER_OFFSET]); - - switch (IrqType) { - case DT_SPI_IRQ: - IrqId += SPI_OFFSET; - break; - - case DT_PPI_IRQ: - IrqId += PPI_OFFSET; - break; - - default: - ASSERT (0); - IrqId = 0; - } - - return IrqId; -} - -/** Get the ACPI interrupt flags of an interrupt described in a fdt. - - Data must describe a GIC interrupt. A GIC interrupt is on at least - 3 UINT32 cells. - - PPI interrupt cpu mask on bits [15:8] are ignored. - - @param [in] Data Pointer to the first cell of an "interrupts" property. - - @retval The interrupt flags (for ACPI). -**/ -UINT32 -EFIAPI -FdtGetInterruptFlags ( - UINT32 CONST *Data - ) -{ - UINT32 IrqFlags; - UINT32 AcpiIrqFlags; - - ASSERT (Data != NULL); - - IrqFlags = fdt32_to_cpu (Data[IRQ_FLAGS_OFFSET]); - - AcpiIrqFlags = DT_IRQ_IS_EDGE_TRIGGERED (IrqFlags) ? BIT0 : 0; - AcpiIrqFlags |= DT_IRQ_IS_ACTIVE_LOW (IrqFlags) ? BIT1 : 0; - - return AcpiIrqFlags; -} - /** Check whether a node has the input name. @param [in] Fdt Pointer to a Flattened Device Tree.