/** @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; } /** For relevant architectures, get the "#address-cells" and/or "#size-cells" property of the node. According to the Device Tree specification, s2.3.5 "#address-cells and #size-cells": "If missing, a client program should assume a default value of 2 for #address-cells, and a value of 1 for #size-cells." @param [in] Fdt Pointer to a Flattened Device Tree. @param [in] Node Offset of the node having to get the "#address-cells" and "#size-cells" properties from. @param [out] AddressCells If success, number of address-cells. If the property is not available, default value is 2. @param [out] SizeCells If success, number of size-cells. If the property is not available, default value is 1. @retval EFI_INVALID_PARAMETER Invalid parameter. **/ EFI_STATUS EFIAPI FdtGetIntcAddressCells ( IN CONST VOID *Fdt, IN INT32 Node, OUT INT32 *AddressCells, OPTIONAL OUT INT32 *SizeCells OPTIONAL ) { return FdtGetAddressInfo (Fdt, Node, AddressCells, SizeCells); }