// SPDX-License-Identifier: (GPL-2.0 OR MIT) #include / { compatible = "brcm,bcm2712"; #address-cells = <2>; #size-cells = <2>; interrupt-parent = <&gicv2>; clocks { /* The oscillator is the root of the clock tree. */ clk_osc: clk-osc { compatible = "fixed-clock"; #clock-cells = <0>; clock-output-names = "osc"; clock-frequency = <54000000>; }; clk_vpu: clk-vpu { compatible = "fixed-clock"; #clock-cells = <0>; clock-frequency = <750000000>; clock-output-names = "vpu-clock"; }; clk_uart: clk-uart { compatible = "fixed-clock"; #clock-cells = <0>; clock-frequency = <9216000>; clock-output-names = "uart-clock"; }; clk_emmc2: clk-emmc2 { compatible = "fixed-clock"; #clock-cells = <0>; clock-frequency = <200000000>; clock-output-names = "emmc2-clock"; }; }; cpus: cpus { #address-cells = <1>; #size-cells = <0>; /* Source for L1 d/i cache-line-size, cache-sets, cache-size * https://developer.arm.com/documentation/100798/0401/L1-memory-system/About-the-L1-memory-system?lang=en * Source for L2 cache-line-size and cache-sets: * https://developer.arm.com/documentation/100798/0401/L2-memory-system/About-the-L2-memory-system?lang=en * and for cache-size: * https://www.raspberrypi.com/documentation/computers/processors.html#bcm2712 */ cpu0: cpu@0 { device_type = "cpu"; compatible = "arm,cortex-a76"; reg = <0x000>; enable-method = "psci"; d-cache-size = <0x10000>; d-cache-line-size = <64>; d-cache-sets = <256>; // 64KiB(size)/64(line-size)=1024ways/4-way set i-cache-size = <0x10000>; i-cache-line-size = <64>; i-cache-sets = <256>; // 64KiB(size)/64(line-size)=1024ways/4-way set next-level-cache = <&l2_cache_l0>; l2_cache_l0: l2-cache-l0 { compatible = "cache"; cache-size = <0x80000>; cache-line-size = <64>; cache-sets = <1024>; //512KiB(size)/64(line-size)=8192ways/8-way set cache-level = <2>; cache-unified; next-level-cache = <&l3_cache>; }; }; cpu1: cpu@1 { device_type = "cpu"; compatible = "arm,cortex-a76"; reg = <0x100>; enable-method = "psci"; d-cache-size = <0x10000>; d-cache-line-size = <64>; d-cache-sets = <256>; // 64KiB(size)/64(line-size)=1024ways/4-way set i-cache-size = <0x10000>; i-cache-line-size = <64>; i-cache-sets = <256>; // 64KiB(size)/64(line-size)=1024ways/4-way set next-level-cache = <&l2_cache_l1>; l2_cache_l1: l2-cache-l1 { compatible = "cache"; cache-size = <0x80000>; cache-line-size = <64>; cache-sets = <1024>; //512KiB(size)/64(line-size)=8192ways/8-way set cache-level = <2>; cache-unified; next-level-cache = <&l3_cache>; }; }; cpu2: cpu@2 { device_type = "cpu"; compatible = "arm,cortex-a76"; reg = <0x200>; enable-method = "psci"; d-cache-size = <0x10000>; d-cache-line-size = <64>; d-cache-sets = <256>; // 64KiB(size)/64(line-size)=1024ways/4-way set i-cache-size = <0x10000>; i-cache-line-size = <64>; i-cache-sets = <256>; // 64KiB(size)/64(line-size)=1024ways/4-way set next-level-cache = <&l2_cache_l2>; l2_cache_l2: l2-cache-l2 { compatible = "cache"; cache-size = <0x80000>; cache-line-size = <64>; cache-sets = <1024>; //512KiB(size)/64(line-size)=8192ways/8-way set cache-level = <2>; cache-unified; next-level-cache = <&l3_cache>; }; }; cpu3: cpu@3 { device_type = "cpu"; compatible = "arm,cortex-a76"; reg = <0x300>; enable-method = "psci"; d-cache-size = <0x10000>; d-cache-line-size = <64>; d-cache-sets = <256>; // 64KiB(size)/64(line-size)=1024ways/4-way set i-cache-size = <0x10000>; i-cache-line-size = <64>; i-cache-sets = <256>; // 64KiB(size)/64(line-size)=1024ways/4-way set next-level-cache = <&l2_cache_l3>; l2_cache_l3: l2-cache-l3 { compatible = "cache"; cache-size = <0x80000>; cache-line-size = <64>; cache-sets = <1024>; //512KiB(size)/64(line-size)=8192ways/8-way set cache-level = <2>; cache-unified; next-level-cache = <&l3_cache>; }; }; /* Source for cache-line-size and cache-sets: * https://developer.arm.com/documentation/100453/0401/L3-cache?lang=en * Source for cache-size: * https://www.raspberrypi.com/documentation/computers/processors.html#bcm2712 */ l3_cache: l3-cache { compatible = "cache"; cache-size = <0x200000>; cache-line-size = <64>; cache-sets = <2048>; // 2MiB(size)/64(line-size)=32768ways/16-way set cache-level = <3>; cache-unified; }; }; psci { method = "smc"; compatible = "arm,psci-1.0", "arm,psci-0.2"; }; rmem: reserved-memory { ranges; #address-cells = <2>; #size-cells = <2>; atf@0 { reg = <0x0 0x0 0x0 0x80000>; no-map; }; cma: linux,cma { compatible = "shared-dma-pool"; size = <0x0 0x4000000>; /* 64MB */ reusable; linux,cma-default; alloc-ranges = <0x0 0x00000000 0x0 0x40000000>; }; }; soc: soc@107c000000 { compatible = "simple-bus"; ranges = <0x00000000 0x10 0x00000000 0x80000000>; #address-cells = <1>; #size-cells = <1>; sdio1: mmc@fff000 { compatible = "brcm,bcm2712-sdhci", "brcm,sdhci-brcmstb"; reg = <0x00fff000 0x260>, <0x00fff400 0x200>; reg-names = "host", "cfg"; interrupts = ; clocks = <&clk_emmc2>; clock-names = "sw_sdio"; mmc-ddr-3_3v; }; system_timer: timer@7c003000 { compatible = "brcm,bcm2835-system-timer"; reg = <0x7c003000 0x1000>; interrupts = , , , ; clock-frequency = <1000000>; }; mailbox: mailbox@7c013880 { compatible = "brcm,bcm2835-mbox"; reg = <0x7c013880 0x40>; interrupts = ; #mbox-cells = <0>; }; uart10: serial@7d001000 { compatible = "arm,pl011", "arm,primecell"; reg = <0x7d001000 0x200>; interrupts = ; clocks = <&clk_uart>, <&clk_vpu>; clock-names = "uartclk", "apb_pclk"; arm,primecell-periphid = <0x00241011>; status = "disabled"; }; interrupt-controller@7d517000 { compatible = "brcm,bcm7271-l2-intc"; reg = <0x7d517000 0x10>; interrupts = ; interrupt-controller; #interrupt-cells = <1>; }; gio_aon: gpio@7d517c00 { compatible = "brcm,bcm7445-gpio", "brcm,brcmstb-gpio"; reg = <0x7d517c00 0x40>; gpio-controller; #gpio-cells = <2>; brcm,gpio-bank-widths = <17 6>; /* The lack of 'interrupt-controller' property here is intended: * don't use GIO_AON as an interrupt controller because it will * clash with the firmware monitoring the PMIC interrupt via the VPU. */ }; gicv2: interrupt-controller@7fff9000 { compatible = "arm,gic-400"; reg = <0x7fff9000 0x1000>, <0x7fffa000 0x2000>, <0x7fffc000 0x2000>, <0x7fffe000 0x2000>; interrupt-controller; #interrupt-cells = <3>; }; aon_intr: interrupt-controller@7d510600 { compatible = "brcm,bcm2711-l2-intc", "brcm,l2-intc"; reg = <0x7d510600 0x30>; interrupts = ; interrupt-controller; #interrupt-cells = <1>; }; pixelvalve0: pixelvalve@7c410000 { compatible = "brcm,bcm2712-pixelvalve0"; reg = <0x7c410000 0x100>; interrupts = ; }; pixelvalve1: pixelvalve@7c411000 { compatible = "brcm,bcm2712-pixelvalve1"; reg = <0x7c411000 0x100>; interrupts = ; }; mop: mop@7c500000 { compatible = "brcm,bcm2712-mop"; reg = <0x7c500000 0x28>; interrupt-parent = <&disp_intr>; interrupts = <1>; }; moplet: moplet@7c501000 { compatible = "brcm,bcm2712-moplet"; reg = <0x7c501000 0x20>; interrupt-parent = <&disp_intr>; interrupts = <0>; }; disp_intr: interrupt-controller@7c502000 { compatible = "brcm,bcm2711-l2-intc", "brcm,l2-intc"; reg = <0x7c502000 0x30>; interrupts = ; interrupt-controller; #interrupt-cells = <1>; }; dvp: clock@7c700000 { compatible = "brcm,brcm2711-dvp"; reg = <0x7c700000 0x10>; clocks = <&clk_108MHz>; #clock-cells = <1>; #reset-cells = <1>; }; ddc0: i2c@7d508200 { compatible = "brcm,brcmstb-i2c"; reg = <0x7d508200 0x58>; interrupt-parent = <&bsc_irq>; interrupts = <1>; clock-frequency = <97500>; #address-cells = <1>; #size-cells = <0>; }; ddc1: i2c@7d508280 { compatible = "brcm,brcmstb-i2c"; reg = <0x7d508280 0x58>; interrupt-parent = <&bsc_irq>; interrupts = <2>; clock-frequency = <97500>; #address-cells = <1>; #size-cells = <0>; }; bsc_irq: interrupt-controller@7d508380 { compatible = "brcm,bcm7271-l2-intc"; reg = <0x7d508380 0x10>; interrupts = ; interrupt-controller; #interrupt-cells = <1>; }; main_irq: interrupt-controller@7d508400 { compatible = "brcm,bcm7271-l2-intc"; reg = <0x7d508400 0x10>; interrupts = ; interrupt-controller; #interrupt-cells = <1>; }; hdmi0: hdmi@7c701400 { compatible = "brcm,bcm2712-hdmi0"; reg = <0x7c701400 0x300>, <0x7c701000 0x200>, <0x7c701d00 0x300>, <0x7c702000 0x80>, <0x7c703800 0x200>, <0x7c704000 0x800>, <0x7c700100 0x80>, <0x7d510800 0x100>, <0x7c720000 0x100>; reg-names = "hdmi", "dvp", "phy", "rm", "packet", "metadata", "csc", "cec", "hd"; resets = <&dvp 1>; interrupt-parent = <&aon_intr>; interrupts = <1>, <2>, <3>, <7>, <8>; interrupt-names = "cec-tx", "cec-rx", "cec-low", "hpd-connected", "hpd-removed"; ddc = <&ddc0>; }; hdmi1: hdmi@7c706400 { compatible = "brcm,bcm2712-hdmi1"; reg = <0x7c706400 0x300>, <0x7c706000 0x200>, <0x7c706d00 0x300>, <0x7c707000 0x80>, <0x7c708800 0x200>, <0x7c709000 0x800>, <0x7c700180 0x80>, <0x7d511000 0x100>, <0x7c720000 0x100>; reg-names = "hdmi", "dvp", "phy", "rm", "packet", "metadata", "csc", "cec", "hd"; resets = <&dvp 2>; interrupt-parent = <&aon_intr>; interrupts = <11>, <12>, <13>, <14>, <15>; interrupt-names = "cec-tx", "cec-rx", "cec-low", "hpd-connected", "hpd-removed"; ddc = <&ddc1>; }; }; axi: axi { compatible = "simple-bus"; #address-cells = <2>; #size-cells = <2>; ranges = <0x00 0x00000000 0x00 0x00000000 0x10 0x00000000>, <0x10 0x00000000 0x10 0x00000000 0x01 0x00000000>, <0x14 0x00000000 0x14 0x00000000 0x04 0x00000000>, <0x18 0x00000000 0x18 0x00000000 0x04 0x00000000>, <0x1c 0x00000000 0x1c 0x00000000 0x04 0x00000000>; dma-ranges = <0x00 0x00000000 0x00 0x00000000 0x10 0x00000000>, <0x10 0x00000000 0x10 0x00000000 0x01 0x00000000>, <0x14 0x00000000 0x14 0x00000000 0x04 0x00000000>, <0x18 0x00000000 0x18 0x00000000 0x04 0x00000000>, <0x1c 0x00000000 0x1c 0x00000000 0x04 0x00000000>; vc4: gpu { compatible = "brcm,bcm2712-vc6"; }; }; timer { compatible = "arm,armv8-timer"; interrupts = , , , , ; }; clk_27MHz: clk-27M { #clock-cells = <0>; compatible = "fixed-clock"; clock-frequency = <27000000>; clock-output-names = "27MHz-clock"; }; clk_108MHz: clk-108M { #clock-cells = <0>; compatible = "fixed-clock"; clock-frequency = <108000000>; clock-output-names = "108MHz-clock"; }; hvs: hvs@107c580000 { compatible = "brcm,bcm2712-hvs"; reg = <0x10 0x7c580000 0x0 0x1a000>; interrupt-parent = <&disp_intr>; interrupts = <2>, <9>, <16>; interrupt-names = "ch0-eof", "ch1-eof", "ch2-eof"; }; };