mirror of
https://github.com/ARM-software/arm-trusted-firmware.git
synced 2025-04-25 06:19:56 +00:00

The Arm FPGAs run in mostly one clock domain, which is used for the CPU cores, the generic timer, and also the UART baudrate base clock. This single clock can have different rates, to compensate for different IP complexity. So far most images used 10 MHz, but different rates start to appear. To avoid patching both the arch timer frequency and UART baud base fixed clock in the DTB manually, we would like to set the clock rate automatically. Fortunately the SCP firmware has the actual clock rate hard coded, and already programs the PL011 UART baud divider register with the correct value to achieve a 38400 bps baudrate. So read the two PL011 baudrate divider values and re-calculate the original base clock from there, to use as the arch timer frequency. If the arch timer DT node contains a clock-frequency property, we use that instead, to support overriding and disabling this autodetection. Change-Id: I9857fbb418deb4644aeb2816f1102796f9bfd3bb Signed-off-by: Andre Przywara <andre.przywara@arm.com>
108 lines
2.6 KiB
Text
108 lines
2.6 KiB
Text
// SPDX-License-Identifier: (GPL-2.0 or BSD-3-Clause)
|
|
/*
|
|
* Copyright (c) 2020, Arm Limited. All rights reserved.
|
|
*
|
|
* Devicetree for the Arm Ltd. FPGA platform
|
|
* Number and kind of CPU cores differs from image to image, so the
|
|
* topology is auto-detected by BL31, and the /cpus node is created and
|
|
* populated accordingly at runtime.
|
|
*/
|
|
|
|
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
|
|
|
/dts-v1/;
|
|
|
|
/ {
|
|
model = "ARM FPGA";
|
|
compatible = "arm,fpga", "arm,vexpress";
|
|
interrupt-parent = <&gic>;
|
|
#address-cells = <2>;
|
|
#size-cells = <2>;
|
|
|
|
aliases {
|
|
serial0 = &dbg_uart;
|
|
};
|
|
|
|
chosen {
|
|
stdout-path = "serial0:38400n8";
|
|
bootargs = "console=ttyAMA0,38400n8 earlycon";
|
|
/* Allow to upload a generous 100MB initrd payload. */
|
|
linux,initrd-start = <0x0 0x84000000>;
|
|
linux,initrd-end = <0x0 0x8a400000>;
|
|
};
|
|
|
|
/* /cpus node will be added by BL31 at runtime. */
|
|
|
|
psci {
|
|
compatible = "arm,psci-0.2";
|
|
method = "smc";
|
|
};
|
|
|
|
timer {
|
|
compatible = "arm,armv8-timer";
|
|
interrupts = <GIC_PPI 13 IRQ_TYPE_LEVEL_LOW>,
|
|
<GIC_PPI 14 IRQ_TYPE_LEVEL_LOW>,
|
|
<GIC_PPI 11 IRQ_TYPE_LEVEL_LOW>,
|
|
<GIC_PPI 10 IRQ_TYPE_LEVEL_LOW>;
|
|
};
|
|
|
|
pmu {
|
|
compatible = "arm,armv8-pmuv3";
|
|
interrupts = <GIC_PPI 7 IRQ_TYPE_LEVEL_HIGH>;
|
|
};
|
|
|
|
/* This node will be removed at runtime on cores without SPE. */
|
|
spe-pmu {
|
|
compatible = "arm,statistical-profiling-extension-v1";
|
|
interrupts = <GIC_PPI 5 IRQ_TYPE_LEVEL_HIGH>;
|
|
};
|
|
|
|
memory@80000000 {
|
|
device_type = "memory";
|
|
reg = <0x0 0x80000000 0x0 0x80000000>,
|
|
<0x8 0x80000000 0x1 0x80000000>;
|
|
};
|
|
|
|
|
|
bus_refclk: refclk {
|
|
compatible = "fixed-clock";
|
|
#clock-cells = <0>;
|
|
clock-frequency = <100000000>;
|
|
clock-output-names = "apb_pclk";
|
|
};
|
|
|
|
uartclk: baudclock {
|
|
compatible = "fixed-clock";
|
|
#clock-cells = <0>;
|
|
clock-frequency = <10000000>;
|
|
clock-output-names = "uartclk";
|
|
};
|
|
|
|
dbg_uart: serial@7ff80000 {
|
|
compatible = "arm,pl011", "arm,primecell";
|
|
reg = <0x0 0x7ff80000 0x0 0x00001000>;
|
|
interrupts = <GIC_SPI 115 IRQ_TYPE_LEVEL_HIGH>;
|
|
clocks = <&uartclk>, <&bus_refclk>;
|
|
clock-names = "uartclk", "apb_pclk";
|
|
};
|
|
|
|
gic: interrupt-controller@30000000 {
|
|
compatible = "arm,gic-v3";
|
|
#address-cells = <2>;
|
|
#interrupt-cells = <3>;
|
|
#size-cells = <2>;
|
|
ranges;
|
|
interrupt-controller;
|
|
reg = <0x0 0x30000000 0x0 0x00010000>, /* GICD */
|
|
/* The GICR size will be adjusted at runtime to match the cores. */
|
|
<0x0 0x30040000 0x0 0x00020000>; /* GICR for one core */
|
|
interrupts = <GIC_PPI 9 IRQ_TYPE_LEVEL_HIGH>;
|
|
|
|
its: msi-controller@30040000 {
|
|
compatible = "arm,gic-v3-its";
|
|
reg = <0x0 0x30040000 0x0 0x40000>;
|
|
#msi-cells = <1>;
|
|
msi-controller;
|
|
};
|
|
};
|
|
};
|