Enabling socfpga on hardware
Subsystems (8)
v4 cover Enabling socfpga on hardware
From: Dinh Nguyen <[email protected]>
V4:
- Check for cpu1start_addr is valid in socfpga_boot_secondary()
- Add Reviewed-by: Reviewed-by: Santosh Shilimkar <[email protected]> for 3/4
V3:
- Addressed comments from Olof Johansson and Russell King
- Received Acked-by and Tested-by Stephen Warren
- Received Signed-off-by Pavel Machek
V2:
- Remove patch that adds clock entries in the socfpga.dtsi as this should accompany a rework in drivers/clk and will done in a different patch series.
- Removed I-cache invalidate from v7_invalidate_l1
- Defined cpu1-start-addr as a device tree entry
- Removed the need to use CONFIG_VMSPLIT_2G
Dinh Nguyen (4):
arm: socfpga: Add new device tree source for actual socfpga HW
arm: socfpga: Add entries to enable make dtbs socfpga
arm: Add v7_invalidate_l1 to cache-v7.S
arm: socfpga: Add SMP support for actual socfpga harware
.../bindings/arm/altera/socfpga-system.txt | 2 + arch/arm/boot/dts/Makefile | 2 + arch/arm/boot/dts/socfpga.dtsi | 22 +++---- arch/arm/boot/dts/socfpga_cyclone5.dts | 34 ++++++++++- arch/arm/boot/dts/socfpga_vt.dts | 64 ++++++++++++++++++++ arch/arm/mach-imx/headsmp.S | 47 -------------- arch/arm/mach-shmobile/headsmp.S | 48 --------------- arch/arm/mach-socfpga/core.h | 4 +- arch/arm/mach-socfpga/headsmp.S | 16 +++-- arch/arm/mach-socfpga/platsmp.c | 19 +++--- arch/arm/mach-socfpga/socfpga.c | 7 ++- arch/arm/mach-tegra/headsmp.S | 43 ------------- arch/arm/mm/cache-v7.S | 46 ++++++++++++++ 13 files changed, 188 insertions(+), 166 deletions(-) create mode 100644 arch/arm/boot/dts/socfpga_vt.dts
Signature · 1 line
1.7.9.5
PATCH v4 1/4 arm: socfpga: Add new device tree source for actual socfpga HW
From: Dinh Nguyen <[email protected]>
Up to this point, support for socfpga has only been on a virtual platform. Now that actual hardware is available, we add the appropriate device tree source files.
--- arch/arm/boot/dts/socfpga.dtsi | 22 ++++++------ arch/arm/boot/dts/socfpga_cyclone5.dts | 30 ++++++++++++++-- arch/arm/boot/dts/socfpga_vt.dts | 60 ++++++++++++++++++++++++++++++++ arch/arm/mach-socfpga/socfpga.c | 1 - 4 files changed, 98 insertions(+), 15 deletions(-) create mode 100644 arch/arm/boot/dts/socfpga_vt.dts
arch/arm/boot/dts/socfpga.dtsi +10 -12
@@ -25,6 +25,10 @@ ethernet0 = &gmac0; serial0 = &uart0; serial1 = &uart1; + timer0 = &timer0; + timer1 = &timer1; + timer2 = &timer2; + timer3 = &timer3; }; cpus {
@@ -98,47 +102,41 @@ interrupts = <1 13 0xf04>; }; - timer0: timer at ffc08000 { + timer0: timer0 at ffc08000 { compatible = "snps,dw-apb-timer-sp"; interrupts = <0 167 4>; - clock-frequency = <200000000>; reg = <0xffc08000 0x1000>; }; - timer1: timer at ffc09000 { + timer1: timer1 at ffc09000 { compatible = "snps,dw-apb-timer-sp"; interrupts = <0 168 4>; - clock-frequency = <200000000>; reg = <0xffc09000 0x1000>; }; - timer2: timer at ffd00000 { + timer2: timer2 at ffd00000 { compatible = "snps,dw-apb-timer-osc"; interrupts = <0 169 4>; - clock-frequency = <200000000>; reg = <0xffd00000 0x1000>; }; - timer3: timer at ffd01000 { + timer3: timer3 at ffd01000 { compatible = "snps,dw-apb-timer-osc"; interrupts = <0 170 4>; - clock-frequency = <200000000>; reg = <0xffd01000 0x1000>; }; - uart0: uart at ffc02000 { + uart0: serial0 at ffc02000 { compatible = "snps,dw-apb-uart"; reg = <0xffc02000 0x1000>; - clock-frequency = <7372800>; interrupts = <0 162 4>; reg-shift = <2>; reg-io-width = <4>; }; - uart1: uart at ffc03000 { + uart1: serial1 at ffc03000 { compatible = "snps,dw-apb-uart"; reg = <0xffc03000 0x1000>; - clock-frequency = <7372800>; interrupts = <0 163 4>; reg-shift = <2>; reg-io-width = <4>;
arch/arm/boot/dts/socfpga_cyclone5.dts +28 -2
@@ -20,7 +20,7 @@ / { model = "Altera SOCFPGA Cyclone V"; - compatible = "altr,socfpga-cyclone5"; + compatible = "altr,socfpga-cyclone5", "altr,socfpga"; chosen { bootargs = "console=ttyS0,57600";
@@ -29,6 +29,32 @@ memory { name = "memory"; device_type = "memory"; - reg = <0x0 0x10000000>; /* 256MB */ + reg = <0x0 0x40000000>; /* 1GB */ + }; + + soc { + timer0 at ffc08000 { + clock-frequency = <100000000>; + }; + + timer1 at ffc09000 { + clock-frequency = <100000000>; + }; + + timer2 at ffd00000 { + clock-frequency = <25000000>; + }; + + timer3 at ffd01000 { + clock-frequency = <25000000>; + }; + + serial0 at ffc02000 { + clock-frequency = <100000000>; + }; + + serial1 at ffc03000 { + clock-frequency = <100000000>; + }; }; };
arch/arm/boot/dts/socfpga_vt.dts new file +60 -0
60 lines not on this page · raw message
arch/arm/mach-socfpga/socfpga.c +0 -1
@@ -98,7 +98,6 @@ static void __init socfpga_cyclone5_init(void)static const char *altera_dt_match[] = {"altr,socfpga" , -"altr,socfpga-cyclone5" ,NULL };
Signature · 1 line
1.7.9.5
PATCH v4 2/4 arm: socfpga: Add entries to enable make dtbs socfpga
In reply to dinguyen at altera.comFrom: Dinh Nguyen <[email protected]>
--- arch/arm/boot/dts/Makefile | 2 ++ 1 file changed, 2 insertions(+)
arch/arm/boot/dts/Makefile +2 -0
@@ -124,6 +124,8 @@ dtb-$(CONFIG_ARCH_SHMOBILE) += emev2-kzm9d.dtb \ r8a7740-armadillo800eva.dtb \ sh73a0-kzm9g.dtb \ sh7372-mackerel.dtb +dtb-$(CONFIG_ARCH_SOCFPGA) += socfpga_cyclone5.dtb \ + socfpga_vt.dtb dtb-$(CONFIG_ARCH_SPEAR13XX) += spear1310-evb.dtb \ spear1340-evb.dtb dtb-$(CONFIG_ARCH_SPEAR3XX)+= spear300-evb.dtb \
Signature · 1 line
1.7.9.5
PATCH v4 3/4 arm: Add v7_invalidate_l1 to cache-v7.S
In reply to dinguyen at altera.comFrom: Dinh Nguyen <[email protected]>
mach-socfpga is another platform that needs to use v7_invalidate_l1 to bringup additional cores. There was a comment that the ideal place for v7_invalidate_l1 should be in arm/mm/cache-v7.S
--- arch/arm/mach-imx/headsmp.S | 47 ------------------------------------- arch/arm/mach-shmobile/headsmp.S | 48 -------------------------------------- arch/arm/mach-tegra/headsmp.S | 43 ---------------------------------- arch/arm/mm/cache-v7.S | 46 ++++++++++++++++++++++++++++++++++++ 4 files changed, 46 insertions(+), 138 deletions(-)
arch/arm/mach-imx/headsmp.S +0 -47
@@ -17,53 +17,6 @@ .section ".text.head", "ax" -/* - * The secondary kernel init calls v7_flush_dcache_all before it enables - * the L1; however, the L1 comes out of reset in an undefined state, so - * the clean + invalidate performed by v7_flush_dcache_all causes a bunch - * of cache lines with uninitialized data and uninitialized tags to get - * written out to memory, which does really unpleasant things to the main - * processor. We fix this by performing an invalidate, rather than a - * clean + invalidate, before jumping into the kernel. - * - * This funciton is cloned from arch/arm/mach-tegra/headsmp.S, and needs - * to be called for both secondary cores startup and primary core resume - * procedures. Ideally, it should be moved into arch/arm/mm/cache-v7.S. - */ -ENTRY(v7_invalidate_l1) - mov r0, #0 - mcr p15, 0, r0, c7, c5, 0 @ invalidate I cache - mcr p15, 2, r0, c0, c0, 0 - mrc p15, 1, r0, c0, c0, 0 - - ldr r1, =0x7fff - and r2, r1, r0, lsr #13 - - ldr r1, =0x3ff - - and r3, r1, r0, lsr #3 @ NumWays - 1 - add r2, r2, #1 @ NumSets - - and r0, r0, #0x7 - add r0, r0, #4 @ SetShift - - clz r1, r3 @ WayShift - add r4, r3, #1 @ NumWays -1: sub r2, r2, #1 @ NumSets-- - mov r3, r4 @ Temp = NumWays -2: subs r3, r3, #1 @ Temp-- - mov r5, r3, lsl r1 - mov r6, r2, lsl r0 - orr r5, r5, r6 @ Reg = (Temp<<WayShift)|(NumSets<<SetShift) - mcr p15, 0, r5, c7, c6, 2 - bgt 2b - cmp r2, #0 - bgt 1b - dsb - isb - mov pc, lr -ENDPROC(v7_invalidate_l1) - #ifdef CONFIG_SMP ENTRY(v7_secondary_startup) bl v7_invalidate_l1
arch/arm/mach-shmobile/headsmp.S +0 -48
54 lines not on this page · raw message
arch/arm/mach-tegra/headsmp.S +0 -43
49 lines not on this page · raw message
arch/arm/mm/cache-v7.S +46 -0
52 lines not on this page · raw message
Signature · 1 line
1.7.9.5
PATCH v4 4/4 arm: socfpga: Add SMP support for actual socfpga harware
In reply to dinguyen at altera.comFrom: Dinh Nguyen <[email protected]>
Because the CPU1 start address is different for socfpga-vt and socfpga-cyclone5, we add code to use the correct CPU1 start addr.
--- .../bindings/arm/altera/socfpga-system.txt | 2 ++ arch/arm/boot/dts/socfpga_cyclone5.dts | 4 ++++ arch/arm/boot/dts/socfpga_vt.dts | 4 ++++ arch/arm/mach-socfpga/core.h | 4 +++- arch/arm/mach-socfpga/headsmp.S | 16 ++++++++++++---- arch/arm/mach-socfpga/platsmp.c | 17 ++++++++++------- arch/arm/mach-socfpga/socfpga.c | 6 ++++++ 7 files changed, 41 insertions(+), 12 deletions(-)
Documentation/devicetree/bindings/arm/altera/socfpga-system.txt +2 -0
@@ -3,9 +3,11 @@ Altera SOCFPGA System Manager Required properties: - compatible : "altr,sys-mgr" - reg : Should contain 1 register ranges(address and length) +- cpu1-start-addr : CPU1 start address in hex. Example: sysmgr at ffd08000 { compatible = "altr,sys-mgr"; reg = <0xffd08000 0x1000>; + cpu1-start-addr = <0xffd080c4>; };
arch/arm/boot/dts/socfpga_cyclone5.dts +4 -0
@@ -56,5 +56,9 @@ serial1 at ffc03000 { clock-frequency = <100000000>; }; + + sysmgr at ffd08000 { + cpu1-start-addr = <0xffd080c4>; + }; }; };
arch/arm/boot/dts/socfpga_vt.dts +4 -0
@@ -56,5 +56,9 @@ serial1 at ffc03000 { clock-frequency = <7372800>; }; + + sysmgr at ffd08000 { + cpu1-start-addr = <0xffd08010>; + }; }; };
arch/arm/mach-socfpga/core.h +3 -1
@@ -20,7 +20,7 @@#ifndef __MACH_CORE_H#define __MACH_CORE_H -extern void secondary_startup (void ); +extern void v7_secondary_startup (void );extern void __iomem *socfpga_scu_base_addr;extern void socfpga_init_clocks (void );
@@ -29,6 +29,8 @@ extern void socfpga_sysmgr_init(void);extern struct smp_operations socfpga_smp_ops;extern char secondary_trampoline, secondary_trampoline_end; +extern unsigned long cpu1start_addr; +#define SOCFPGA_SCU_VIRT_BASE 0xfffec000#endif
arch/arm/mach-socfpga/headsmp.S +12 -4
@@ -13,13 +13,21 @@ __CPUINIT .arch armv7-a -#define CPU1_START_ADDR 0xffd08010 - ENTRY(secondary_trampoline) - movw r0, #:lower16:CPU1_START_ADDR - movt r0, #:upper16:CPU1_START_ADDR + movw r2, #:lower16:cpu1start_addr + movt r2, #:upper16:cpu1start_addr + + /* The socfpga VT cannot handle a 0xC0000000 page offset when loading + the cpu1start_addr, we bit clear it. Tested on HW and VT. */ + bic r2, r2, #0x40000000 + ldr r0, [r2] ldr r1, [r0] bx r1 ENTRY(secondary_trampoline_end) + +ENTRY(v7_secondary_startup) + bl v7_invalidate_l1 + b secondary_startup +ENDPROC(v7_secondary_startup)
arch/arm/mach-socfpga/platsmp.c +10 -7
@@ -47,16 +47,19 @@ static int __cpuinit socfpga_boot_secondary(unsigned int cpu, struct task_struct {int trampoline_size = &secondary_trampoline_end - &secondary_trampoline; -memcpy (phys_to_virt (0 ), &secondary_trampoline, trampoline_size); +if (cpu1start_addr) { +memcpy (phys_to_virt (0 ), &secondary_trampoline, trampoline_size); -__raw_writel (virt_to_phys (secondary_startup), (sys_manager_base_addr+0x10 )); +__raw_writel (virt_to_phys (v7_secondary_startup), + (sys_manager_base_addr + (cpu1start_addr &0x000000ff ))); -flush_cache_all (); -smp_wmb (); -outer_clean_range (0 , trampoline_size); +flush_cache_all (); +smp_wmb (); +outer_clean_range (0 , trampoline_size); -/* This will release CPU #1 out of reset.*/ -__raw_writel (0 , rst_manager_base_addr +0x10 ); +/* This will release CPU #1 out of reset.*/ +__raw_writel (0 , rst_manager_base_addr +0x10 ); + }return 0 ; }
arch/arm/mach-socfpga/socfpga.c +6 -0
@@ -29,6 +29,7 @@void __iomem *socfpga_scu_base_addr = ((void __iomem *)(SOCFPGA_SCU_VIRT_BASE ));void __iomem *sys_manager_base_addr;void __iomem *rst_manager_base_addr; +unsigned long cpu1start_addr;static struct map_desc scu_io_desc__initdata = { .virtual =SOCFPGA_SCU_VIRT_BASE ,
@@ -72,6 +73,11 @@ void __init socfpga_sysmgr_init(void)struct device_node *np; np =of_find_compatible_node (NULL ,NULL ,"altr,sys-mgr" ); + +if (of_property_read_u32 (np,"cpu1-start-addr" , + (u32 *) &cpu1start_addr)) +pr_err ("SMP: Need cpu1-start-addr in device tree.\n" ); + sys_manager_base_addr =of_iomap (np,0 ); np =of_find_compatible_node (NULL ,NULL ,"altr,rst-mgr" );
Signature · 1 line
1.7.9.5
PATCH v4 4/4 arm: socfpga: Add SMP support for actual socfpga harware
Hi,
Quoted 20 lines · dinguyen at altera.com
arch/arm/mach-socfpga/headsmp.S +6
-4@@ -13,13 +13,21 @@ __CPUINIT .arch armv7-a -#define CPU1_START_ADDR 0xffd08010 - ENTRY(secondary_trampoline) - movw r0, #:lower16:CPU1_START_ADDR - movt r0, #:upper16:CPU1_START_ADDR + movw r2, #:lower16:cpu1start_addr + movt r2, #:upper16:cpu1start_addr + + /* The socfpga VT cannot handle a 0xC0000000 page offset when loading + the cpu1start_addr, we bit clear it. Tested on HW and VT. */ + bic r2, r2, #0x40000000
arch/arm/mach-socfpga/headsmp.S line 33
Quoted 10 lines
arch/arm/mach-socfpga/headsmp.S +6
-0+ ldr r0, [r2] ldr r1, [r0] bx r1 ENTRY(secondary_trampoline_end) + +ENTRY(v7_secondary_startup) + bl v7_invalidate_l1 + b secondary_startup +ENDPROC(v7_secondary_startup)
This breaks multiplatform where you build i.MX and socfpga together, since both implement and export a v7_secondary_startup:
arch/arm/mach-socfpga/built-in.o: In function `v7_secondary_startup':
platsmp.c:(.cpuinit.text+0x18): multiple definition of `v7_secondary_startup' arch/arm/mach-imx/built-in.o:platform-imx-dma.c:(.text.head+0x0): first defined here
It makes sense to rename this to socfpga_secondary_startup instead, or move to a common location.
-Olof
v4 cover Enabling socfpga on hardware
In reply to dinguyen at altera.comHi Olof,
I was wondering if you or Arnd can apply this series to the arm-soc branch?
Quoted 25 lines · Dinh Nguyen
From: Dinh Nguyen <[email protected]>
V4:
- Check forcpu1start_addris valid insocfpga_boot_secondary()
- Add Reviewed-by: Reviewed-by: Santosh Shilimkar <[email protected]> for 3/4V3:
- Addressed comments from Olof Johansson and Russell King
- Received Acked-by and Tested-by Stephen Warren
- Received Signed-off-by Pavel MachekV2:
- Remove patch that adds clock entries in thesocfpga.dtsias this should accompany a rework indrivers/clkand will done in a different patch series.
- Removed I-cache invalidate fromv7_invalidate_l1
- Defined cpu1-start-addr as a device tree entry
- Removed the need to useCONFIG_VMSPLIT_2GDinh Nguyen (4):
arm: socfpga: Add new device tree source for actual socfpga HW
arm: socfpga: Add entries to enable make dtbs socfpga
arm: Addv7_invalidate_l1tocache-v7.S
arm: socfpga: Add SMP support for actual socfpga harware
Quoted 16 lines
.../bindings/arm/altera/socfpga-system.txt | 2 + arch/arm/boot/dts/Makefile | 2 + arch/arm/boot/dts/socfpga.dtsi | 22 +++---- arch/arm/boot/dts/socfpga_cyclone5.dts | 34 ++++++++++- arch/arm/boot/dts/socfpga_vt.dts | 64 ++++++++++++++++++++ arch/arm/mach-imx/headsmp.S | 47 -------------- arch/arm/mach-shmobile/headsmp.S | 48 --------------- arch/arm/mach-socfpga/core.h | 4 +- arch/arm/mach-socfpga/headsmp.S | 16 +++-- arch/arm/mach-socfpga/platsmp.c | 19 +++--- arch/arm/mach-socfpga/socfpga.c | 7 ++- arch/arm/mach-tegra/headsmp.S | 43 ------------- arch/arm/mm/cache-v7.S | 46 ++++++++++++++ 13 files changed, 188 insertions(+), 166 deletions(-) create mode 100644 arch/arm/boot/dts/socfpga_vt.dts
Thanks,
Dinh
v4 cover Enabling socfpga on hardware
Quoted 4 lines · Dinh Nguyen
Hi Olof,
I was wondering if you or Arnd can apply this series to the arm-soc branch?
Hi,
See new comment on one of the patches, I applied them and enabled in a multi_v7_defconfig build but hit a symbol name conflict. Please fix, I'll be happy to apply the patches after.
-Olof