Message ID | 1383661723-17956-10-git-send-email-sebastian.hesselbarth@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Dear Sebastian, On Tue, 5 Nov 2013 06:28:43 -0800 Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> wrote: > This adds initial support for the Marvell Berlin SoC family with > Armada 1500 (88DE3100) and Armada 1500-mini (88DE3005) SoCs. > > Signed-off-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> > Reviewed-by: Jason Cooper <jason@lakedaemon.net> > Reviewed-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> > Reviewed-by: Arnd Bergmann <arnd@arndb.de> > --- > Changelog: > v2->v3: > - add Armada 1500-mini (BG2CD) Kconfig > v1->v2: > - replace 88DE3xxx numbering with SoC variant name > (Requested by Jisheng Zhang) > - remove LOCAL_TIMERS dependency (Suggested by Dinh Nguyen) > RFCv2->v1: > - remove custom .init_time, adds dependency for arch-wide of_clk_init call > RFCv1->RFCv2: > - nuke .map_io (Reported by Arnd Bergmann) > - add copyright reference > - switch to mach-berlin instead of mach-mvebu > > Cc: Russell King <linux@arm.linux.org.uk> > Cc: Arnd Bergmann <arnd@arndb.de> > Cc: Olof Johansson <olof@lixom.net> > Cc: Kevin Hilman <khilman@kernel.org> > Cc: linux-arm-kernel@lists.infradead.org > Cc: linux-kernel@vger.kernel.org > --- > arch/arm/Kconfig | 2 ++ > arch/arm/Makefile | 1 + > arch/arm/mach-berlin/Kconfig | 30 ++++++++++++++++++++++++++++++ > arch/arm/mach-berlin/Makefile | 1 + > arch/arm/mach-berlin/berlin.c | 39 > +++++++++++++++++++++++++++++++++++++++ 5 files changed, 73 insertions(+) > create mode 100644 arch/arm/mach-berlin/Kconfig > create mode 100644 arch/arm/mach-berlin/Makefile > create mode 100644 arch/arm/mach-berlin/berlin.c > > diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig > index 1ad6fb6..5692426 100644 > --- a/arch/arm/Kconfig > +++ b/arch/arm/Kconfig > @@ -932,6 +932,8 @@ source "arch/arm/mach-bcm/Kconfig" > > source "arch/arm/mach-bcm2835/Kconfig" > > +source "arch/arm/mach-berlin/Kconfig" > + > source "arch/arm/mach-clps711x/Kconfig" > > source "arch/arm/mach-cns3xxx/Kconfig" > diff --git a/arch/arm/Makefile b/arch/arm/Makefile > index db50b62..07258c7 100644 > --- a/arch/arm/Makefile > +++ b/arch/arm/Makefile > @@ -147,6 +147,7 @@ textofs-$(CONFIG_ARCH_MSM8960) := 0x00208000 > machine-$(CONFIG_ARCH_AT91) += at91 > machine-$(CONFIG_ARCH_BCM) += bcm > machine-$(CONFIG_ARCH_BCM2835) += bcm2835 > +machine-$(CONFIG_ARCH_BERLIN) += berlin > machine-$(CONFIG_ARCH_CLPS711X) += clps711x > machine-$(CONFIG_ARCH_CNS3XXX) += cns3xxx > machine-$(CONFIG_ARCH_DAVINCI) += davinci > diff --git a/arch/arm/mach-berlin/Kconfig b/arch/arm/mach-berlin/Kconfig > new file mode 100644 > index 0000000..c5b39b1 > --- /dev/null > +++ b/arch/arm/mach-berlin/Kconfig > @@ -0,0 +1,30 @@ > +config ARCH_BERLIN > + bool "Marvell Berlin SoCs" if ARCH_MULTI_V7 > + select GENERIC_CLOCKEVENTS > + select GENERIC_IRQ_CHIP > + select COMMON_CLK > + select DW_APB_ICTL > + select DW_APB_TIMER_OF > + > +if ARCH_BERLIN > + > +menu "Marvell Berlin SoC variants" > + > +config MACH_BERLIN_BG2 > + bool "Marvell Armada 1500 (BG2)" > + select ARM_GIC ARM_GIC is common on berlin SoCs. we can put it below ARCH_BERLIN? > + select CACHE_L2X0 ditto > + select CPU_PJ4B > + select HAVE_ARM_TWD > + select HAVE_SMP > + > +config MACH_BERLIN_BG2CD > + bool "Marvell Armada 1500-mini (BG2CD)" > + select ARM_GIC > + select CACHE_L2X0 > + select CPU_V7 > + select HAVE_ARM_TWD BG2CD is single core, I'm not sure it have twd. I will check with SoC people. But can twd be really used in single CA9 system? > + > +endmenu > + > +endif > diff --git a/arch/arm/mach-berlin/Makefile b/arch/arm/mach-berlin/Makefile > new file mode 100644 > index 0000000..ab69fe9 > --- /dev/null > +++ b/arch/arm/mach-berlin/Makefile > @@ -0,0 +1 @@ > +obj-y += berlin.o > diff --git a/arch/arm/mach-berlin/berlin.c b/arch/arm/mach-berlin/berlin.c > new file mode 100644 > index 0000000..16c2942 > --- /dev/null > +++ b/arch/arm/mach-berlin/berlin.c > @@ -0,0 +1,39 @@ > +/* > + * Device Tree support for Marvell Berlin SoCs. > + * > + * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> > + * > + * based on GPL'ed 2.6 kernel sources > + * (c) Marvell International Ltd. > + * > + * This file is licensed under the terms of the GNU General Public > + * License version 2. This program is licensed "as is" without any > + * warranty of any kind, whether express or implied. > + */ > + > +#include <linux/init.h> > +#include <linux/io.h> > +#include <linux/kernel.h> > +#include <linux/of_platform.h> > +#include <asm/hardware/cache-l2x0.h> > +#include <asm/mach/arch.h> > + > +static void __init berlin_init_machine(void) > +{ > + /* > + * with DT probing for L2CCs, berlin_init_machine can be removed. > + * Note: 88DE3005 (Armada 1500-mini) uses pl310 l2cc > + */ > + l2x0_of_init(0x70c00000, 0xfeffffff); Per my experience, put l2x0 initialization in init_machine is too late. It did cause some boot stability problems during our product massive bootup test. In our internal 3.10.y tree, we put it in init_early, I also suggest we do this too in mainline. > + of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); If l2 initialization is put in init_early, this is not needed any more. > +} > + > +static const char * const berlin_dt_compat[] = { > + "marvell,berlin", > + NULL, > +}; > + > +DT_MACHINE_START(BERLIN_DT, "Marvell Berlin") > + .dt_compat = berlin_dt_compat, > + .init_machine = berlin_init_machine, > +MACHINE_END
On Wed, 6 Nov 2013 21:40:33 -0800 Jisheng Zhang <jszhang@marvell.com> wrote: ... > > + select ARM_GIC > ARM_GIC is common on berlin SoCs. we can put it below ARCH_BERLIN? > > + select CACHE_L2X0 > ditto Sorry. After some consideration, CACHE_L2X0 is not common (BG3). So please ignore this line Thanks
On 11/07/13 06:40, Jisheng Zhang wrote: > On Tue, 5 Nov 2013 06:28:43 -0800 > Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> wrote: > >> This adds initial support for the Marvell Berlin SoC family with >> Armada 1500 (88DE3100) and Armada 1500-mini (88DE3005) SoCs. >> >> Signed-off-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> >> Reviewed-by: Jason Cooper <jason@lakedaemon.net> >> Reviewed-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com> >> Reviewed-by: Arnd Bergmann <arnd@arndb.de> >> --- [...] >> diff --git a/arch/arm/mach-berlin/Kconfig b/arch/arm/mach-berlin/Kconfig >> new file mode 100644 >> index 0000000..c5b39b1 >> --- /dev/null >> +++ b/arch/arm/mach-berlin/Kconfig >> @@ -0,0 +1,30 @@ >> +config ARCH_BERLIN >> + bool "Marvell Berlin SoCs" if ARCH_MULTI_V7 >> + select GENERIC_CLOCKEVENTS >> + select GENERIC_IRQ_CHIP >> + select COMMON_CLK >> + select DW_APB_ICTL >> + select DW_APB_TIMER_OF >> + >> +if ARCH_BERLIN >> + >> +menu "Marvell Berlin SoC variants" >> + >> +config MACH_BERLIN_BG2 >> + bool "Marvell Armada 1500 (BG2)" >> + select ARM_GIC > ARM_GIC is common on berlin SoCs. we can put it below ARCH_BERLIN? Sure, I guess BG3 is also using GIC? >> + select CACHE_L2X0 > ditto You already re-replied to that. I leave L2X0 here, BG3 will be different, as you stated. >> + select CPU_PJ4B >> + select HAVE_ARM_TWD >> + select HAVE_SMP >> + >> +config MACH_BERLIN_BG2CD >> + bool "Marvell Armada 1500-mini (BG2CD)" >> + select ARM_GIC >> + select CACHE_L2X0 >> + select CPU_V7 >> + select HAVE_ARM_TWD > BG2CD is single core, I'm not sure it have twd. I will check with SoC people. > But can twd be really used in single CA9 system? From a quick view into Cortex-A9 MPCore TRM, I cannot see why it shouldn't be there even for single-core. If you can get more info, that would be great. Actually, IIRC smp_twd does not compile without SMP set, so the above should at least be 'HAVE_ARM_TWD if SMP'. If you shrink MULTI_V7 down to non-SMP cores, you can disable it and it will fail to compile. >> + >> +endmenu >> + >> +endif >> diff --git a/arch/arm/mach-berlin/Makefile b/arch/arm/mach-berlin/Makefile >> new file mode 100644 >> index 0000000..ab69fe9 >> --- /dev/null >> +++ b/arch/arm/mach-berlin/Makefile >> @@ -0,0 +1 @@ >> +obj-y += berlin.o >> diff --git a/arch/arm/mach-berlin/berlin.c b/arch/arm/mach-berlin/berlin.c >> new file mode 100644 >> index 0000000..16c2942 >> --- /dev/null >> +++ b/arch/arm/mach-berlin/berlin.c >> @@ -0,0 +1,39 @@ >> +/* >> + * Device Tree support for Marvell Berlin SoCs. >> + * >> + * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> >> + * >> + * based on GPL'ed 2.6 kernel sources >> + * (c) Marvell International Ltd. >> + * >> + * This file is licensed under the terms of the GNU General Public >> + * License version 2. This program is licensed "as is" without any >> + * warranty of any kind, whether express or implied. >> + */ >> + >> +#include <linux/init.h> >> +#include <linux/io.h> >> +#include <linux/kernel.h> >> +#include <linux/of_platform.h> >> +#include <asm/hardware/cache-l2x0.h> >> +#include <asm/mach/arch.h> >> + >> +static void __init berlin_init_machine(void) >> +{ >> + /* >> + * with DT probing for L2CCs, berlin_init_machine can be removed. >> + * Note: 88DE3005 (Armada 1500-mini) uses pl310 l2cc >> + */ >> + l2x0_of_init(0x70c00000, 0xfeffffff); > Per my experience, put l2x0 initialization in init_machine is too late. It > did cause some boot stability problems during our product massive bootup test. > In our internal 3.10.y tree, we put it in init_early, I also suggest we do > this too in mainline. Ok. >> + of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); > If l2 initialization is put in init_early, this is not needed any more. Right, that's already in the comment right above l2x0_of_init ;) >> +} >> + >> +static const char * const berlin_dt_compat[] = { >> + "marvell,berlin", >> + NULL, >> +}; >> + >> +DT_MACHINE_START(BERLIN_DT, "Marvell Berlin") >> + .dt_compat = berlin_dt_compat, >> + .init_machine = berlin_init_machine, >> +MACHINE_END >
On Thursday 07 November 2013, Sebastian Hesselbarth wrote: > Actually, IIRC smp_twd does not compile without SMP set, so the above > should at least be 'HAVE_ARM_TWD if SMP'. If you shrink MULTI_V7 down > to non-SMP cores, you can disable it and it will fail to compile. > If there are UP-systems for which TWD is the best clocksource, we should probably fix the code to allow that configuration. IIRC there were already patches recently in this area, maybe it's already solved. Arnd
On 11/07/2013 05:20 PM, Arnd Bergmann wrote: > On Thursday 07 November 2013, Sebastian Hesselbarth wrote: >> Actually, IIRC smp_twd does not compile without SMP set, so the above >> should at least be 'HAVE_ARM_TWD if SMP'. If you shrink MULTI_V7 down >> to non-SMP cores, you can disable it and it will fail to compile. > > If there are UP-systems for which TWD is the best clocksource, we should > probably fix the code to allow that configuration. IIRC there were already > patches recently in this area, maybe it's already solved. I just tried barebox bootloader to use TWD as timer on berlin2cd and it perfectly works, i.e. with time related commands I can see the timer register decreasing. So the timer is available on this UP SoC. As said before, compiling linux without CONFIG_SMP but with CONFIG_HAVE_ARM_TWD gives: warning: (SOC_OMAP5 && ARCH_ROCKCHIP && ARCH_SHMOBILE_MULTI && MACH_BERLIN_BG2 && MACH_BERLIN_BG2CD) selects HAVE_ARM_TWD which has unmet direct dependencies (SMP) and arch/arm/kernel/smp_twd.c: In function 'twd_local_timer_of_register': arch/arm/kernel/smp_twd.c:391: error: 'setup_max_cpus' undeclared (first use in this function) arch/arm/kernel/smp_twd.c:391: error: (Each undeclared identifier is reported only once arch/arm/kernel/smp_twd.c:391: error: for each function it appears in.) make[1]: *** [arch/arm/kernel/smp_twd.o] Error 1 I haven't looked deeper into this, but I guess it will not be hard to make ARM_TWD independent of SMP. Sebastian
On Thursday 07 November 2013, Sebastian Hesselbarth wrote: > I haven't looked deeper into this, but I guess it will not be hard > to make ARM_TWD independent of SMP. Yes, I agree. Just make sure to look at the list archives to see if someone already did that work. Arnd
Dear Sebastian, On Thu, 7 Nov 2013 13:22:35 -0800 Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> wrote: > On 11/07/2013 05:20 PM, Arnd Bergmann wrote: > > On Thursday 07 November 2013, Sebastian Hesselbarth wrote: > >> Actually, IIRC smp_twd does not compile without SMP set, so the above > >> should at least be 'HAVE_ARM_TWD if SMP'. If you shrink MULTI_V7 down > >> to non-SMP cores, you can disable it and it will fail to compile. > > > > If there are UP-systems for which TWD is the best clocksource, we should > > probably fix the code to allow that configuration. IIRC there were already > > patches recently in this area, maybe it's already solved. The problems is twd is not mandatory in CA9 UP system, so it may not exist. However, I got answers from soc people, the BG2CD does configured and enabled TWD. so we are lucky and can add HAVE_TWD for BG2CD. > > I just tried barebox bootloader to use TWD as timer on berlin2cd and it > perfectly works, i.e. with time related commands I can see the timer > register decreasing. So the timer is available on this UP SoC. Yep. It is available. > > As said before, compiling linux without CONFIG_SMP but with > CONFIG_HAVE_ARM_TWD gives: > > warning: (SOC_OMAP5 && ARCH_ROCKCHIP && ARCH_SHMOBILE_MULTI && > MACH_BERLIN_BG2 && MACH_BERLIN_BG2CD) selects HAVE_ARM_TWD which has > unmet direct dependencies (SMP) > > and > > arch/arm/kernel/smp_twd.c: In function 'twd_local_timer_of_register': > arch/arm/kernel/smp_twd.c:391: error: 'setup_max_cpus' undeclared (first > use in this function) > arch/arm/kernel/smp_twd.c:391: error: (Each undeclared identifier is > reported only once > arch/arm/kernel/smp_twd.c:391: error: for each function it appears in.) > make[1]: *** [arch/arm/kernel/smp_twd.o] Error 1 > > I haven't looked deeper into this, but I guess it will not be hard > to make ARM_TWD independent of SMP. > > Sebastian >
On 11/08/2013 01:58 AM, Jisheng Zhang wrote: > On Thu, 7 Nov 2013 13:22:35 -0800 > Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> wrote: >> On 11/07/2013 05:20 PM, Arnd Bergmann wrote: >>> On Thursday 07 November 2013, Sebastian Hesselbarth wrote: >>>> Actually, IIRC smp_twd does not compile without SMP set, so the above >>>> should at least be 'HAVE_ARM_TWD if SMP'. If you shrink MULTI_V7 down >>>> to non-SMP cores, you can disable it and it will fail to compile. >>> >>> If there are UP-systems for which TWD is the best clocksource, we should >>> probably fix the code to allow that configuration. IIRC there were already >>> patches recently in this area, maybe it's already solved. > > The problems is twd is not mandatory in CA9 UP system, so it may not exist. > However, I got answers from soc people, the BG2CD does configured and enabled > TWD. so we are lucky and can add HAVE_TWD for BG2CD. Jisheng, thanks for backing this up. As I said, I tried it with barebox and TWD is sufficient for a timer there. Currently, Linux requires SMP for TWD - but as you confirmed, there are non-SMP systems with TWD. The build errors below are just from a check for SMP systems, so if we remove that, TWD should be ready for non-SMP. I'll see, if I can prepare a patch next week and put it on list. Sebastian >> I just tried barebox bootloader to use TWD as timer on berlin2cd and it >> perfectly works, i.e. with time related commands I can see the timer >> register decreasing. So the timer is available on this UP SoC. > > Yep. It is available. > >> >> As said before, compiling linux without CONFIG_SMP but with >> CONFIG_HAVE_ARM_TWD gives: >> >> warning: (SOC_OMAP5 && ARCH_ROCKCHIP && ARCH_SHMOBILE_MULTI && >> MACH_BERLIN_BG2 && MACH_BERLIN_BG2CD) selects HAVE_ARM_TWD which has >> unmet direct dependencies (SMP) >> >> and >> >> arch/arm/kernel/smp_twd.c: In function 'twd_local_timer_of_register': >> arch/arm/kernel/smp_twd.c:391: error: 'setup_max_cpus' undeclared (first >> use in this function) >> arch/arm/kernel/smp_twd.c:391: error: (Each undeclared identifier is >> reported only once >> arch/arm/kernel/smp_twd.c:391: error: for each function it appears in.) >> make[1]: *** [arch/arm/kernel/smp_twd.o] Error 1 >> >> I haven't looked deeper into this, but I guess it will not be hard >> to make ARM_TWD independent of SMP.
diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index 1ad6fb6..5692426 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -932,6 +932,8 @@ source "arch/arm/mach-bcm/Kconfig" source "arch/arm/mach-bcm2835/Kconfig" +source "arch/arm/mach-berlin/Kconfig" + source "arch/arm/mach-clps711x/Kconfig" source "arch/arm/mach-cns3xxx/Kconfig" diff --git a/arch/arm/Makefile b/arch/arm/Makefile index db50b62..07258c7 100644 --- a/arch/arm/Makefile +++ b/arch/arm/Makefile @@ -147,6 +147,7 @@ textofs-$(CONFIG_ARCH_MSM8960) := 0x00208000 machine-$(CONFIG_ARCH_AT91) += at91 machine-$(CONFIG_ARCH_BCM) += bcm machine-$(CONFIG_ARCH_BCM2835) += bcm2835 +machine-$(CONFIG_ARCH_BERLIN) += berlin machine-$(CONFIG_ARCH_CLPS711X) += clps711x machine-$(CONFIG_ARCH_CNS3XXX) += cns3xxx machine-$(CONFIG_ARCH_DAVINCI) += davinci diff --git a/arch/arm/mach-berlin/Kconfig b/arch/arm/mach-berlin/Kconfig new file mode 100644 index 0000000..c5b39b1 --- /dev/null +++ b/arch/arm/mach-berlin/Kconfig @@ -0,0 +1,30 @@ +config ARCH_BERLIN + bool "Marvell Berlin SoCs" if ARCH_MULTI_V7 + select GENERIC_CLOCKEVENTS + select GENERIC_IRQ_CHIP + select COMMON_CLK + select DW_APB_ICTL + select DW_APB_TIMER_OF + +if ARCH_BERLIN + +menu "Marvell Berlin SoC variants" + +config MACH_BERLIN_BG2 + bool "Marvell Armada 1500 (BG2)" + select ARM_GIC + select CACHE_L2X0 + select CPU_PJ4B + select HAVE_ARM_TWD + select HAVE_SMP + +config MACH_BERLIN_BG2CD + bool "Marvell Armada 1500-mini (BG2CD)" + select ARM_GIC + select CACHE_L2X0 + select CPU_V7 + select HAVE_ARM_TWD + +endmenu + +endif diff --git a/arch/arm/mach-berlin/Makefile b/arch/arm/mach-berlin/Makefile new file mode 100644 index 0000000..ab69fe9 --- /dev/null +++ b/arch/arm/mach-berlin/Makefile @@ -0,0 +1 @@ +obj-y += berlin.o diff --git a/arch/arm/mach-berlin/berlin.c b/arch/arm/mach-berlin/berlin.c new file mode 100644 index 0000000..16c2942 --- /dev/null +++ b/arch/arm/mach-berlin/berlin.c @@ -0,0 +1,39 @@ +/* + * Device Tree support for Marvell Berlin SoCs. + * + * Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com> + * + * based on GPL'ed 2.6 kernel sources + * (c) Marvell International Ltd. + * + * This file is licensed under the terms of the GNU General Public + * License version 2. This program is licensed "as is" without any + * warranty of any kind, whether express or implied. + */ + +#include <linux/init.h> +#include <linux/io.h> +#include <linux/kernel.h> +#include <linux/of_platform.h> +#include <asm/hardware/cache-l2x0.h> +#include <asm/mach/arch.h> + +static void __init berlin_init_machine(void) +{ + /* + * with DT probing for L2CCs, berlin_init_machine can be removed. + * Note: 88DE3005 (Armada 1500-mini) uses pl310 l2cc + */ + l2x0_of_init(0x70c00000, 0xfeffffff); + of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL); +} + +static const char * const berlin_dt_compat[] = { + "marvell,berlin", + NULL, +}; + +DT_MACHINE_START(BERLIN_DT, "Marvell Berlin") + .dt_compat = berlin_dt_compat, + .init_machine = berlin_init_machine, +MACHINE_END