[PATCH v11 5/6] ARM: hi3xxx: add smp support

Haojian Zhuang haojian.zhuang at linaro.org
Sun Nov 24 23:57:43 EST 2013


On 25 November 2013 12:00, Olof Johansson <olof at lixom.net> wrote:
> On Tue, Nov 12, 2013 at 12:49 AM, Haojian Zhuang
> <haojian.zhuang at linaro.org> wrote:
>> On 7 November 2013 18:30, Dinh Nguyen <dinh.linux at gmail.com> wrote:
>>>
>>> On 11/7/13 2:41 AM, Haojian Zhuang wrote:
>>>> From: Zhangfei Gao <zhangfei.gao at linaro.org>
>>>>
>>>> Enable SMP support on hi3xxx platform
>>>>
>>>> Signed-off-by: Zhangfei Gao <zhangfei.gao at linaro.org>
>>>> Tested-by: Zhang Mingjun <zhang.mingjun at linaro.org>
>>>> Tested-by: Li Xin <li.xin at linaro.org>
>>>> Signed-off-by: Haojian Zhuang <haojian.zhuang at linaro.org>
>>>> ---
>>>>  .../bindings/arm/hisilicon/hisilicon.txt           | 30 ++++++--
>>>>  arch/arm/boot/dts/hi3620.dtsi                      | 38 ++++++++++
>>>>  arch/arm/mach-hi3xxx/Kconfig                       |  3 +
>>>>  arch/arm/mach-hi3xxx/Makefile                      |  1 +
>>>>  arch/arm/mach-hi3xxx/core.h                        | 11 +++
>>>>  arch/arm/mach-hi3xxx/hi3xxx.c                      | 34 +++++++++
>>>>  arch/arm/mach-hi3xxx/platsmp.c                     | 84 ++++++++++++++++++++++
>>>>  7 files changed, 197 insertions(+), 4 deletions(-)
>>>>  create mode 100644 arch/arm/mach-hi3xxx/core.h
>>>>  create mode 100644 arch/arm/mach-hi3xxx/platsmp.c
>>>>
>>>> diff --git a/Documentation/devicetree/bindings/arm/hisilicon/hisilicon.txt b/Documentation/devicetree/bindings/arm/hisilicon/hisilicon.txt
>>>> index 3be60c8..8c7a465 100644
>>>> --- a/Documentation/devicetree/bindings/arm/hisilicon/hisilicon.txt
>>>> +++ b/Documentation/devicetree/bindings/arm/hisilicon/hisilicon.txt
>>>> @@ -1,10 +1,32 @@
>>>>  Hisilicon Platforms Device Tree Bindings
>>>>  ----------------------------------------------------
>>>>
>>>> -Hi3716 Development Board
>>>> -Required root node properties:
>>>> -     - compatible = "hisilicon,hi3716-dkb";
>>>> -
>>>>  Hi4511 Board
>>>>  Required root node properties:
>>>>       - compatible = "hisilicon,hi3620-hi4511";
>>>> +
>>>> +Hisilicon system controller
>>>> +
>>>> +Required properties:
>>>> +- compatible : "hisilicon,sysctrl"
>>>> +- reg : Register address and size
>>>> +
>>>> +Optional properties:
>>>> +- smp-offset : offset in sysctrl for notifying slave cpu booting
>>>> +             cpu 1, reg;
>>>> +             cpu 2, reg + 0x4;
>>>> +             cpu 3, reg + 0x8;
>>>> +             If reg value is not zero, cpun exit wfi and go
>>>> +- resume-offset : offset in sysctrl for notifying cpu0 when resume
>>>> +- reboot-offset : offset in sysctrl for system reboot
>>>> +
>>>> +Example:
>>>> +
>>>> +     /* for Hi3620 */
>>>> +     sysctrl: system-controller at fc802000 {
>>>> +             compatible = "hisilicon,sysctrl";
>>>> +             reg = <0xfc802000 0x1000>;
>>>> +             smp-offset = <0x31c>;
>>>> +             resume-offset = <0x308>;
>>>> +             reboot-offset = <0x4>;
>>>> +     };
>>>> diff --git a/arch/arm/boot/dts/hi3620.dtsi b/arch/arm/boot/dts/hi3620.dtsi
>>>> index b9d8679..e311937 100644
>>>> --- a/arch/arm/boot/dts/hi3620.dtsi
>>>> +++ b/arch/arm/boot/dts/hi3620.dtsi
>>>> @@ -39,6 +39,27 @@
>>>>                       reg = <0x0>;
>>>>                       next-level-cache = <&L2>;
>>>>               };
>>>> +
>>>> +             cpu at 1 {
>>>> +                     compatible = "arm,cortex-a9";
>>>> +                     device_type = "cpu";
>>>> +                     reg = <1>;
>>>> +                     next-level-cache = <&L2>;
>>>> +             };
>>>> +
>>>> +             cpu at 2 {
>>>> +                     compatible = "arm,cortex-a9";
>>>> +                     device_type = "cpu";
>>>> +                     reg = <2>;
>>>> +                     next-level-cache = <&L2>;
>>>> +             };
>>>> +
>>>> +             cpu at 3 {
>>>> +                     compatible = "arm,cortex-a9";
>>>> +                     device_type = "cpu";
>>>> +                     reg = <3>;
>>>> +                     next-level-cache = <&L2>;
>>>> +             };
>>>>       };
>>>>
>>>>       amba {
>>>> @@ -65,6 +86,17 @@
>>>>                       reg = <0x1000 0x1000>, <0x100 0x100>;
>>>>               };
>>>>
>>>> +             sysctrl: system-controller at 802000 {
>>>> +                     compatible = "hisilicon,sysctrl";
>>>> +                     reg = <0x802000 0x1000>;
>>>> +                     #address-cells = <1>;
>>>> +                     #size-cells = <0>;
>>>> +
>>>> +                     smp-offset = <0x31c>;
>>>> +                     resume-offset = <0x308>;
>>>> +                     reboot-offset = <0x4>;
>>>> +             };
>>>> +
>>>>               dual_timer0: dual_timer at 800000 {
>>>>                       compatible = "arm,sp804", "arm,primecell";
>>>>                       reg = <0x800000 0x1000>;
>>>> @@ -115,6 +147,12 @@
>>>>                       status = "disabled";
>>>>               };
>>>>
>>>> +             timer5: timer at 600 {
>>>> +                     compatible = "arm,cortex-a9-twd-timer";
>>>> +                     reg = <0x600 0x20>;
>>>> +                     interrupts = <1 13 0xf01>;
>>>> +             };
>>> Do you have a clocks node for this timer?
>>
>> As I mentioned in the 0th patch, clock binding are totally removed
>> in this patch. And clock driver will be append in another patch set.
>>
>>>> +
>>>>               uart0: uart at b00000 {
>>>>                       compatible = "arm,pl011", "arm,primecell";
>>>>                       reg = <0xb00000 0x1000>;
>>>> diff --git a/arch/arm/mach-hi3xxx/Kconfig b/arch/arm/mach-hi3xxx/Kconfig
>>>> index 68bd26c..d0f298a 100644
>>>> --- a/arch/arm/mach-hi3xxx/Kconfig
>>>> +++ b/arch/arm/mach-hi3xxx/Kconfig
>>>> @@ -6,6 +6,9 @@ config ARCH_HI3xxx
>>>>       select CACHE_L2X0
>>>>       select CLKSRC_OF
>>>>       select GENERIC_CLOCKEVENTS
>>>> +     select HAVE_ARM_SCU
>>>> +     select HAVE_ARM_TWD
>>> Need "if SMP" to avoid a build failure for a non-smp kernel.
>>>
>>
>> ARCH_HI3xxx always need SMP configuration. HAVE_SMP is already
>> required. So it's impossible to build a non-smp kernel with this kernel
>> configuration.
>
> Then you need to have appropriate dependencies in Kconfig.
>
> Right now, someone can do:
>
> make hi3xxx_defconfig
> edit .config, disable CONFIG_SMP
> make
>
> and get errors both from Kconfig:
>
> warning: (ARCH_HI3xxx && SOC_OMAP5 && ARCH_SHMOBILE_MULTI) selects
> HAVE_ARM_TWD which has unmet direct dependencies (SMP)
>
> and from the make:
>
> arch/arm/kernel/smp_twd.c: In function 'twd_local_timer_of_register':
> arch/arm/kernel/smp_twd.c:391:20: error: 'setup_max_cpus' undeclared
> (first use in this function)
>   if (!is_smp() || !setup_max_cpus)
>
> ... etc.
>
OK. I'll update the Kconfig.

> I.e. omap and shmobile have similar issues but we'll sort them out in
> separate patches. You should still fix the hisilicon one.
>
>>>>  /*
>>>>   * This table is only for optimization. Since ioremap() could always share
>>>>   * the same mapping if it's defined as static IO mapping.
>>>> @@ -29,6 +34,7 @@
>>>>   */
>>>>  static struct map_desc hi3620_io_desc[] __initdata = {
>>>>       {
>>>> +             /* sysctrl */
>>> What's this comment for?
>>>>               .pfn            = __phys_to_pfn(0xfc802000),
>>>>               .virtual        = 0xfe802000,
>>>>               .length         = 0x1000,
>>>> @@ -48,6 +54,32 @@ static void __init hi3xxx_timer_init(void)
>>>>       clocksource_of_init();
>>>>  }
>
> I know the code was added in a different patch, but I don't like the
> lack of using constants here.
>
>
OK. I'll use macro instead.

>
>>>> +static void hi3xxx_restart(enum reboot_mode mode, const char *cmd)
>>>> +{
>>>> +     struct device_node *np;
>>>> +     void __iomem *base;
>>>> +     int offset;
>>>> +
>>>> +     np = of_find_compatible_node(NULL, NULL, "hisilicon,sysctrl");
>>>> +     if (!np) {
>>>> +             pr_err("failed to find hisilicon,sysctrl node\n");
>>>> +             return;
>>>> +     }
>>>> +     base = of_iomap(np, 0);
>
>
> You can't do this ioremap at restart time, since you can't rely on
> things being up enough for that when you're panicking, for example.
> Please set up the ioremap beforehand so you can just do the
> writel_relaxed, etc.
>
Since the sysctrl register mapping is already defined, the ioremap
will reuse the static mapping instead. It won't add the new mapping in
page table & flush cache.

>
>>>> diff --git a/arch/arm/mach-hi3xxx/platsmp.c b/arch/arm/mach-hi3xxx/platsmp.c
>>>> new file mode 100644
>>>> index 0000000..a4d04c0
>>>> --- /dev/null
>>>> +++ b/arch/arm/mach-hi3xxx/platsmp.c
>>>> @@ -0,0 +1,84 @@
>>>> +/*
>>>> + * Copyright (c) 2013 Linaro Ltd.
>>>> + * Copyright (c) 2013 Hisilicon Limited.
>>>> + * Based on platsmp.c, Copyright (C) 2002 ARM Ltd.
>
> Based on what platsmp? There are a lot of them under arch/arm. :)
>
OK. I'll add more comments.

>
> -Olof



More information about the linux-arm-kernel mailing list