ARM: add Broadcom BCM63138 support
Subsystems (6)
v2 cover ARM: add Broadcom BCM63138 support
Hi all,
This patchset adds very minimal support for the BCM63138 SoC which is a xDSL SoC using a dual Cortex A9 CPU complex.
Future work will focus on:
- clock device/driver/providers
- SMP support
- enabling more existing bcm63xx drivers to be DT enabled
Florian Fainelli (5):
ARM: BCM63XX: add basic support for the Broadcom BCM63138 DSL SoC
ARM: BCM63XX: add low-level UART debug support
ARM: BCM63XX: add BCM63138 minimal Device Tree
ARM: BCM63XX: add BCM963138DVT Reference platform DTS
MAINTAINERS: add entry for the Broadcom BCM63xx ARM SoCs
.../devicetree/bindings/arm/bcm/bcm63138.txt | 9 ++ MAINTAINERS | 8 ++ arch/arm/Kconfig.debug | 18 ++- arch/arm/boot/dts/Makefile | 1 + arch/arm/boot/dts/bcm63138.dtsi | 134 +++++++++++++++++++++ arch/arm/boot/dts/bcm963138dvt.dts | 25 ++++ arch/arm/include/debug/bcm63xx.S | 33 +++++ arch/arm/mach-bcm/Kconfig | 17 +++ arch/arm/mach-bcm/Makefile | 3 + arch/arm/mach-bcm/bcm63xx.c | 41 +++++++ 10 files changed, 287 insertions(+), 2 deletions(-) create mode 100644 Documentation/devicetree/bindings/arm/bcm/bcm63138.txt create mode 100644 arch/arm/boot/dts/bcm63138.dtsi create mode 100644 arch/arm/boot/dts/bcm963138dvt.dts create mode 100644 arch/arm/include/debug/bcm63xx.S create mode 100644 arch/arm/mach-bcm/bcm63xx.c
Signature · 1 line
1.9.1
PATCH v2 1/5 ARM: BCM63XX: add basic support for the Broadcom BCM63138 DSL SoC
This patch adds basic support for the Broadcom BCM63138 DSL SoC which is using a dual-core Cortex A9 system. Add the very minimum required code boot Linux on this SoC.
---
Changes in v2:
- removed custom map_io() function since it is not necessary
- removed custom PL310 cache controller initialization, this has been submitted as part of more general patch
.../devicetree/bindings/arm/bcm/bcm63138.txt | 9 +++++ arch/arm/mach-bcm/Kconfig | 17 +++++++++ arch/arm/mach-bcm/Makefile | 3 ++ arch/arm/mach-bcm/bcm63xx.c | 41 ++++++++++++++++++++++ 4 files changed, 70 insertions(+) create mode 100644 Documentation/devicetree/bindings/arm/bcm/bcm63138.txt create mode 100644 arch/arm/mach-bcm/bcm63xx.c
Documentation/devicetree/bindings/arm/bcm/bcm63138.txt new file +9 -0
@@ -0,0 +1,9 @@ +Broadcom BCM63138 DSL System-on-a-Chip device tree bindings +----------------------------------------------------------- + +Boards compatible with the BCM63138 DSL System-on-a-Chip should have the +following properties: + +Required root node property: + +compatible: should be "brcm,bcm63138"
arch/arm/mach-bcm/Kconfig +17 -0
@@ -99,6 +99,23 @@ config ARCH_BCM_5301X different SoC or with the older BCM47XX and BCM53XX based network SoC using a MIPS CPU, they are supported by arch/mips/bcm47xx +config ARCH_BCM_63XX + bool "Broadcom BCM63xx DSL SoC" if ARCH_MULTI_V7 + depends on MMU + select ARM_ERRATA_754322 + select ARM_ERRATA_764369 if SMP + select ARM_GIC + select ARM_GLOBAL_TIMER + select CACHE_L2X0 + select HAVE_ARM_ARCH_TIMER + select HAVE_ARM_TWD if SMP + select HAVE_ARM_SCU if SMP + select HAVE_SMP + help + This enables support for systems based on Broadcom DSL SoCs. + It currently supports the 'BCM63XX' ARM-based family, which includes + the BCM63138 variant. + config ARCH_BRCMSTB bool "Broadcom BCM7XXX based boards" if ARCH_MULTI_V7 depends on MMU
arch/arm/mach-bcm/Makefile +3 -0
@@ -34,6 +34,9 @@ obj-$(CONFIG_ARCH_BCM2835) += board_bcm2835.o # BCM5301X obj-$(CONFIG_ARCH_BCM_5301X) += bcm_5301x.o +# BCM63XXx +obj-$(CONFIG_ARCH_BCM_63XX) := bcm63xx.o + ifeq ($(CONFIG_ARCH_BRCMSTB),y) obj-y += brcmstb.o obj-$(CONFIG_SMP) += headsmp-brcmstb.o platsmp-brcmstb.o
arch/arm/mach-bcm/bcm63xx.c new file +41 -0
41 lines not on this page · raw message
Signature · 1 line
1.9.1
Arnd Bergmann
maintainerPATCH v2 1/5 ARM: BCM63XX: add basic support for the Broadcom BCM63138 DSL SoC
Quoted 7 lines · On Thursday 14 August 2014 17:11:23 Florian Fainelli wrote:
arch/arm/mach-bcm/bcm63xx.c new file +6
-0+static void __init bcm63xx_init (void ) +{ +of_platform_populate (NULL , of_default_bus_match_table,NULL , + &platform_bus); +l2x0_of_init (0 , ~0 ); +}
arch/arm/mach-bcm/bcm63xx.c line 41
Quoted 10 lines
arch/arm/mach-bcm/bcm63xx.c new file +10
-0+ +static const char *const bcm63xx_dt_compat[] = { +"brcm,bcm63138" , +NULL +}; + +DT_MACHINE_START (BCM63XXX_DT ,"BCM63xx DSL SoC" ) + .init_machine = bcm63xx_init, + .dt_compat = bcm63xx_dt_compat, +MACHINE_END
You should be able to remove that bcm63xx_init() function if you add the l2c_aux_val/l2c_aux_mask settings in the machine descriptor instead.
Arnd
PATCH v2 2/5 ARM: BCM63XX: add low-level UART debug support
In reply to Florian FainelliBroadcom BCM63xx DSL SoCs have a different UART implementation for which we need specially crafted low-level debug assembly code to support. Add support for this using the standard definitions provided in include/linux/serial_bcm63xx.h (shared with their MIPS counterparts).
---
Changes in v2:
- rebased
arch/arm/Kconfig.debug | 18 ++++++++++++++++-- arch/arm/include/debug/bcm63xx.S | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 arch/arm/include/debug/bcm63xx.S
arch/arm/Kconfig.debug +16 -2
@@ -122,6 +122,11 @@ choice mobile SoCs in the Kona family of chips (e.g. bcm28155, bcm11351, etc...) + config DEBUG_BCM63XX + bool "Kernel low-level debugging on BCM63XX UART" + depends on ARCH_BCM_63XX + select DEBUG_UART_BCM63XX + config DEBUG_BERLIN_UART bool "Marvell Berlin SoC Debug UART" depends on ARCH_BERLIN
@@ -1038,6 +1043,7 @@ config DEBUG_LL_INCLUDE default "debug/vf.S" if DEBUG_VF_UART default "debug/vt8500.S" if DEBUG_VT8500_UART0 default "debug/zynq.S" if DEBUG_ZYNQ_UART0 || DEBUG_ZYNQ_UART1 + default "debug/bcm63xx.S" if DEBUG_UART_BCM63XX default "mach/debug-macro.S" # Compatibility options for PL01x
@@ -1057,6 +1063,10 @@ config DEBUG_UART_8250 ARCH_IOP33X || ARCH_IXP4XX || \ ARCH_LPC32XX || ARCH_MV78XX0 || ARCH_ORION5X || ARCH_RPC +# Compatibility options for BCM63xx +config DEBUG_UART_BCM63XX + def_bool ARCH_BCM_63XX + config DEBUG_UART_PHYS hex "Physical base address of debug UART" default 0x01c20000 if DEBUG_DAVINCI_DMx_UART0
@@ -1122,11 +1132,13 @@ config DEBUG_UART_PHYS default 0xffc02000 if DEBUG_SOCFPGA_UART default 0xffd82340 if ARCH_IOP13XX default 0xfff36000 if DEBUG_HIGHBANK_UART + default 0xfffe8600 if DEBUG_UART_BCM63XX default 0xfffff700 if ARCH_IOP33X depends on DEBUG_LL_UART_8250 || DEBUG_LL_UART_PL01X || \ DEBUG_LL_UART_EFM32 || \ DEBUG_UART_8250 || DEBUG_UART_PL01X || \ - DEBUG_MSM_UART || DEBUG_QCOM_UARTDM || DEBUG_S3C24XX_UART + DEBUG_MSM_UART || DEBUG_QCOM_UARTDM || DEBUG_S3C24XX_UART || \ + DEBUG_UART_BCM63XX config DEBUG_UART_VIRT hex "Virtual base address of debug UART"
@@ -1157,6 +1169,7 @@ config DEBUG_UART_VIRT default 0xfa71e000 if DEBUG_QCOM_UARTDM default 0xfb009000 if DEBUG_REALVIEW_STD_PORT default 0xfb10c000 if DEBUG_REALVIEW_PB1176_PORT + default 0xfcfe8600 if DEBUG_UART_BCM63XX default 0xfd000000 if ARCH_SPEAR3XX || ARCH_SPEAR6XX default 0xfd000000 if ARCH_SPEAR13XX default 0xfd012000 if ARCH_MV78XX0
@@ -1194,7 +1207,8 @@ config DEBUG_UART_VIRT default DEBUG_UART_PHYS if !MMU depends on DEBUG_LL_UART_8250 || DEBUG_LL_UART_PL01X || \ DEBUG_UART_8250 || DEBUG_UART_PL01X || \ - DEBUG_MSM_UART || DEBUG_QCOM_UARTDM || DEBUG_S3C24XX_UART + DEBUG_MSM_UART || DEBUG_QCOM_UARTDM || DEBUG_S3C24XX_UART || \ + DEBUG_UART_BCM63XX config DEBUG_UART_8250_SHIFT int "Register offset shift for the 8250 debug UART"
arch/arm/include/debug/bcm63xx.S new file +33 -0
@@ -0,0 +1,33 @@ +/* + * Broadcom BCM63xx low-level UART debug + * + * Copyright (C) 2014 Broadcom Corporation + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + */ + +#include <linux/serial_bcm63xx.h> + + .macro addruart, rp, rv, tmp + ldr \rp, =CONFIG_DEBUG_UART_PHYS + ldr \rv, =CONFIG_DEBUG_UART_VIRT + .endm + + .macro senduart, rd, rx + /* word access do not work */ + strb \rd, [\rx, #UART_FIFO_REG] + .endm + + .macro waituart, rd, rx +1001: ldr \rd, [\rx, #UART_IR_REG] + tst \rd, #(1 << UART_IR_TXEMPTY) + beq 1001b + .endm + + .macro busyuart, rd, rx +1002: ldr \rd, [\rx, #UART_IR_REG] + tst \rd, #(1 << UART_IR_TXTRESH) + beq 1002b + .endm
Signature · 1 line
1.9.1
PATCH v2 3/5 ARM: BCM63XX: add BCM63138 minimal Device Tree
In reply to Florian FainelliAdd a very minimalistic BCM63138 Device Tree include file which describes the BCM63138 SoC with only the basic set of required peripherals:
- Cortex A9 CPUs
- ARM GIC
- ARM SCU
- PL310 Level-2 cache controller
- ARM TWD & Global timers
- ARM TWD watchdog
- legacy MIPS bus (UBUS)
- BCM6345-style UARTs (disabled by default)
Since the PL310 L2 cache controller does not come out of reset with correct default values, we need to override the 'cache-sets' and 'cache-size' properties to get its geometry right.
---
Changes in v2:
- removed buses 'reg' properties since they are unused
- align buses 'ranges' properties on a nicer boundary
- moved mpcore peripherals one level higher in the axi bus
- added uart nodes since we have a driver for it (bcm63xx_uart)
arch/arm/boot/dts/bcm63138.dtsi | 134 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 arch/arm/boot/dts/bcm63138.dtsi
arch/arm/boot/dts/bcm63138.dtsi new file +134 -0
@@ -0,0 +1,134 @@ +/* + * Broadcom BCM63138 DSL SoCs Device Tree + */ + +#include <dt-bindings/interrupt-controller/arm-gic.h> +#include <dt-bindings/interrupt-controller/irq.h> + +#include "skeleton.dtsi" + +/ { + compatible = "brcm,bcm63138"; + model = "Broadcom BCM63138 DSL SoC"; + interrupt-parent = <&gic>; + + aliases { + uart0 = &serial0; + uart1 = &serial1; + }; + + cpus { + #address-cells = <1>; + #size-cells = <0>; + + cpu at 0 { + device_type = "cpu"; + compatible = "arm,cortex-a9"; + next-level-cache = <&L2>; + reg = <0>; + }; + + cpu at 1 { + device_type = "cpu"; + compatible = "arm,cortex-a9"; + next-level-cache = <&L2>; + reg = <1>; + }; + }; + + clocks { + #address-cells = <1>; + #size-cells = <0>; + + arm_timer_clk: arm_timer_clk { + #clock-cells = <0>; + compatible = "fixed-clock"; + clock-frequency = <500000000>; + }; + + periph_clk: periph_clk { + #clock-cells = <0>; + compatible = "fixed-clock"; + clock-frequency = <50000000>; + clock-output-names = "periph"; + }; + }; + + /* ARM bus */ + axi at 80000000 { + compatible = "simple-bus"; + ranges = <0 0x80000000 0x84000>; + #address-cells = <1>; + #size-cells = <1>; + + L2: cache-controller at 1d000 { + compatible = "arm,pl310-cache"; + reg = <0x1d000 0x1000>; + cache-unified; + cache-level = <2>; + cache-sets = <16>; + cache-size = <0x80000>; + interrupts = <GIC_PPI 0 IRQ_TYPE_LEVEL_HIGH>; + }; + + scu: scu at 1e000 { + compatible = "arm,cortex-a9-scu"; + reg = <0x1e000 0x100>; + }; + + gic: interrupt-controller at 1e100 { + compatible = "arm,cortex-a9-gic"; + reg = <0x1f000 0x1000 + 0x1e100 0x100>; + #interrupt-cells = <3>; + #address-cells = <0>; + interrupt-controller; + }; + + global_timer: timer at 1e200 { + compatible = "arm,cortex-a9-global-timer"; + reg = <0x1e200 0x20>; + interrupts = <GIC_PPI 11 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&arm_timer_clk>; + }; + + local_timer: local-timer at 1e600 { + compatible = "arm,cortex-a9-twd-timer"; + reg = <0x1e600 0x20>; + interrupts = <GIC_PPI 13 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&arm_timer_clk>; + }; + + twd_watchdog: watchdog at 1e620 { + compatible = "arm,cortex-a9-twd-wdt"; + reg = <0x1e620 0x20>; + interupts = <GIC_PPI 14 IRQ_TYPE_LEVEL_HIGH>; + }; + }; + + /* Legacy UBUS base */ + ubus at fffe8000 { + compatible = "simple-bus"; + #address-cells = <1>; + #size-cells = <1>; + ranges = <0 0xfffe8000 0x8100>; + + serial0: uart at 600 { + compatible = "brcm,bcm6345-uart"; + reg = <0x600 0x1b>; + interrupts = <GIC_SPI 32 0>; + clocks = <&periph_clk>; + clock-names = "periph"; + status = "disabled"; + }; + + serial1: uart at 620 { + compatible = "brcm,bcm6345-uart"; + reg = <0x620 0x1b>; + interrupts = <GIC_SPI 33 0>; + clocks = <&periph_clk>; + clock-names = "periph"; + status = "disabled"; + }; + }; +};
Signature · 1 line
1.9.1
PATCH v2 3/5 ARM: BCM63XX: add BCM63138 minimal Device Tree
2014-08-14 17:11 GMT-07:00 Florian Fainelli <[email protected]>:
Quoted 18 lines
Add a very minimalistic BCM63138 Device Tree include file which describes the BCM63138 SoC with only the basic set of required peripherals:
- Cortex A9 CPUs
- ARM GIC
- ARM SCU
- PL310 Level-2 cache controller
- ARM TWD & Global timers
- ARM TWD watchdog
- legacy MIPS bus (UBUS)
- BCM6345-style UARTs (disabled by default)Since the PL310 L2 cache controller does not come out of reset with correct default values, we need to override the 'cache-sets' and 'cache-size' properties to get its geometry right.
Signed-off-by Florian Fainelli <[email protected]>
[snip]
arch/arm/boot/dts/bcm63138.dtsi line 60
Quoted 4 lines
arch/arm/boot/dts/bcm63138.dtsi new file +4
-0+ /* ARM bus */ + axi at 80000000 { + compatible = "simple-bus"; + ranges = <0 0x80000000 0x84000>;
I made a typo here, the range declared here is narrower than it really is, I will re-submit this after getting some more feedback. Thanks! --
Florian
Arnd Bergmann
maintainerPATCH v2 3/5 ARM: BCM63XX: add BCM63138 minimal Device Tree
In reply to Florian FainelliQuoted 13 lines · On Thursday 14 August 2014 17:11:25 Florian Fainelli wrote:
Add a very minimalistic BCM63138 Device Tree include file which describes the BCM63138 SoC with only the basic set of required peripherals:
- Cortex A9 CPUs
- ARM GIC
- ARM SCU
- PL310 Level-2 cache controller
- ARM TWD & Global timers
- ARM TWD watchdog
- legacy MIPS bus (UBUS)
- BCM6345-style UARTs (disabled by default)
Quoted 5 lines
Since the PL310 L2 cache controller does not come out of reset with correct default values, we need to override the 'cache-sets' and 'cache-size' properties to get its geometry right.
Signed-off-by Florian Fainelli <[email protected]>
Looks all good to me except one tiny detail:
Quoted 5 lines
arch/arm/boot/dts/bcm63138.dtsi new file +5
-0+ /* Legacy UBUS base */ + ubus at fffe8000 { + compatible = "simple-bus"; + #address-cells = <1>; + #size-cells = <1>;
arch/arm/boot/dts/bcm63138.dtsi line 123
Quoted 10 lines
arch/arm/boot/dts/bcm63138.dtsi new file +10
-0+ ranges = <0 0xfffe8000 0x8100>; + + serial0: uart at 600 { + compatible = "brcm,bcm6345-uart"; + reg = <0x600 0x1b>; + interrupts = <GIC_SPI 32 0>; + clocks = <&periph_clk>; + clock-names = "periph"; + status = "disabled"; + };
The recommended name for a uart is serial at 600, not uart at 600. We are highly inconsistent with the existing dts files, so I'm not blaming you, I'm just trying to make new files do it the right way.
Arnd
PATCH v2 4/5 ARM: BCM63XX: add BCM963138DVT Reference platform DTS
In reply to Florian FainelliAdd a DTS file for the Broadcom BCM963138DVT reference platform board which leverages the bcm63138.dtsi SoC DTSi file.
---
Changes in v2:
- consistently use the prefix 963138 since this is a reference board
- enable UARTs for that reference board so we get to a prompt
arch/arm/boot/dts/Makefile | 1 + arch/arm/boot/dts/bcm963138dvt.dts | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 arch/arm/boot/dts/bcm963138dvt.dts
arch/arm/boot/dts/Makefile +1 -0
@@ -53,6 +53,7 @@ dtb-$(CONFIG_ARCH_ATLAS6) += atlas6-evb.dtb dtb-$(CONFIG_ARCH_AXXIA) += axm5516-amarillo.dtb dtb-$(CONFIG_ARCH_BCM2835) += bcm2835-rpi-b.dtb dtb-$(CONFIG_ARCH_BCM_5301X) += bcm4708-netgear-r6250.dtb +dtb-$(CONFIG_ARCH_BCM_63XX) += bcm963138dvt.dtb dtb-$(CONFIG_ARCH_BCM_MOBILE) += bcm28155-ap.dtb \ bcm21664-garnet.dtb dtb-$(CONFIG_ARCH_BERLIN) += \
arch/arm/boot/dts/bcm963138dvt.dts new file +25 -0
@@ -0,0 +1,25 @@ +/* + * Broadcom BCM63138 Reference Board DTS + */ + +/dts-v1/; + +#include "bcm63138.dtsi" + +/ { + compatible = "brcm,BCM963138DVT", "brcm,bcm63138"; + model = "Broadcom BCM963138DVT"; + + memory { + reg = <0x0 0x08000000>; + }; + +}; + +&serial0 { + status = "okay"; +}; + +&serial1 { + status = "okay"; +};
Signature · 1 line
1.9.1
Arnd Bergmann
maintainerPATCH v2 4/5 ARM: BCM63XX: add BCM963138DVT Reference platform DTS
Quoted 8 lines · On Thursday 14 August 2014 17:11:26 Florian Fainelli wrote:
arch/arm/boot/dts/bcm963138dvt.dts new file +7
-0+/ { + compatible = "brcm,BCM963138DVT", "brcm,bcm63138"; + model = "Broadcom BCM963138DVT"; + + memory { + reg = <0x0 0x08000000>; + };
arch/arm/boot/dts/bcm963138dvt.dts line 25
Quoted 10 lines
arch/arm/boot/dts/bcm963138dvt.dts new file +10
-0+ +}; + +&serial0 { + status = "okay"; +}; + +&serial1 { + status = "okay"; +};
You should probably add a 'stdout-path' property in the aliases node to pick the uart that is used for the console. It might require a change to the driver as well.
Arnd
PATCH v2 5/5 MAINTAINERS: add entry for the Broadcom BCM63xx ARM SoCs
In reply to Florian FainelliAdd a MAINTAINERS entry covering all the Broadcom BCM63xx ARM DSL SoCs files along with the relevant git tree and mailing-list.
---
Changes in v2:
- rebased against latest changes
MAINTAINERS | 8 ++++++++ 1 file changed, 8 insertions(+)
MAINTAINERS +8 -0
@@ -2013,6 +2013,14 @@ F: arch/arm/mach-bcm/bcm_5301x.c F: arch/arm/boot/dts/bcm5301x.dtsi F: arch/arm/boot/dts/bcm470* +BROADCOM BCM63XX ARM ARCHITECTURE +M: Florian Fainelli <[email protected]> +L: linux-arm-kernel at lists.infradead.org +T: git git://git.github.com/broadcom/arm-bcm63xx +S: Maintained +F: arch/arm/mach-bcm/bcm63xx.c +F: arch/arm/include/debug/bcm63xx.S + BROADCOM BCM7XXX ARM ARCHITECTURE M: Marc Carino <[email protected]> M: Brian Norris <[email protected]>
Signature · 1 line
1.9.1