<div dir="rtl"><div style="text-align:left" dir="ltr"><br></div><div style="text-align:left" dir="ltr"><br></div><div style="text-align:left" dir="ltr">2017-09-06 11:07 GMT+03:00 Brendan Higgins <<a href="mailto:brendanhiggins@google.com">brendanhiggins@google.com</a>>:</div><div style="text-align:left" dir="ltr">></div><div style="text-align:left" dir="ltr">> Adds basic support for the Nuvoton NPCM750 BMC.</div><div style="text-align:left" dir="ltr">></div><div style="text-align:left" dir="ltr">> Signed-off-by: Brendan Higgins <<a href="mailto:brendanhiggins@google.com">brendanhiggins@google.com</a>></div><div style="text-align:left" dir="ltr">> ---</div><div style="text-align:left" dir="ltr">>  arch/arm/Kconfig             |  2 +</div><div style="text-align:left" dir="ltr">>  arch/arm/Makefile            |  1 +</div><div style="text-align:left" dir="ltr">>  arch/arm/mach-npcm/Kconfig   | 50 +++++++++++++++++++++++++</div><div style="text-align:left" dir="ltr">>  arch/arm/mach-npcm/Makefile  |  3 ++</div><div style="text-align:left" dir="ltr">>  arch/arm/mach-npcm/headsmp.S | 17 +++++++++</div><div style="text-align:left" dir="ltr">>  arch/arm/mach-npcm/npcm7xx.c | 34 +++++++++++++++++</div><div style="text-align:left" dir="ltr">>  arch/arm/mach-npcm/platsmp.c | 89 ++++++++++++++++++++++++++++++++++++++++++++</div><div style="text-align:left" dir="ltr">>  7 files changed, 196 insertions(+)</div><div style="text-align:left" dir="ltr">>  create mode 100644 arch/arm/mach-npcm/Kconfig</div><div style="text-align:left" dir="ltr">>  create mode 100644 arch/arm/mach-npcm/Makefile</div><div style="text-align:left" dir="ltr">>  create mode 100644 arch/arm/mach-npcm/headsmp.S</div><div style="text-align:left" dir="ltr">>  create mode 100644 arch/arm/mach-npcm/npcm7xx.c</div><div style="text-align:left" dir="ltr">>  create mode 100644 arch/arm/mach-npcm/platsmp.c</div><div style="text-align:left" dir="ltr">></div><div style="text-align:left" dir="ltr">> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig</div><div style="text-align:left" dir="ltr">> index 61a0cb15067e..05543f1cfbde 100644</div><div style="text-align:left" dir="ltr">> --- a/arch/arm/Kconfig</div><div style="text-align:left" dir="ltr">> +++ b/arch/arm/Kconfig</div><div style="text-align:left" dir="ltr">> @@ -782,6 +782,8 @@ source "arch/arm/mach-netx/Kconfig"</div><div style="text-align:left" dir="ltr">></div><div style="text-align:left" dir="ltr">>  source "arch/arm/mach-nomadik/Kconfig"</div><div style="text-align:left" dir="ltr">></div><div style="text-align:left" dir="ltr">> +source "arch/arm/mach-npcm/Kconfig"</div><div style="text-align:left" dir="ltr">> +</div><div style="text-align:left" dir="ltr">>  source "arch/arm/mach-nspire/Kconfig"</div><div style="text-align:left" dir="ltr">></div><div style="text-align:left" dir="ltr">>  source "arch/arm/plat-omap/Kconfig"</div><div style="text-align:left" dir="ltr">> diff --git a/arch/arm/Makefile b/arch/arm/Makefile</div><div style="text-align:left" dir="ltr">> index 47d3a1ab08d2..60ca50c7d762 100644</div><div style="text-align:left" dir="ltr">> --- a/arch/arm/Makefile</div><div style="text-align:left" dir="ltr">> +++ b/arch/arm/Makefile</div><div style="text-align:left" dir="ltr">> @@ -191,6 +191,7 @@ machine-$(CONFIG_ARCH_MEDIATEK)             += mediatek</div><div style="text-align:left" dir="ltr">>  machine-$(CONFIG_ARCH_MXS)             += mxs</div><div style="text-align:left" dir="ltr">>  machine-$(CONFIG_ARCH_NETX)            += netx</div><div style="text-align:left" dir="ltr">>  machine-$(CONFIG_ARCH_NOMADIK)         += nomadik</div><div style="text-align:left" dir="ltr">> +machine-$(CONFIG_ARCH_NPCM)            += npcm</div><div style="text-align:left" dir="ltr">>  machine-$(CONFIG_ARCH_NSPIRE)          += nspire</div><div style="text-align:left" dir="ltr">>  machine-$(CONFIG_ARCH_OXNAS)           += oxnas</div><div style="text-align:left" dir="ltr">>  machine-$(CONFIG_ARCH_OMAP1)           += omap1</div><div style="text-align:left" dir="ltr">> diff --git a/arch/arm/mach-npcm/Kconfig b/arch/arm/mach-npcm/Kconfig</div><div style="text-align:left" dir="ltr">> new file mode 100644</div><div style="text-align:left" dir="ltr">> index 000000000000..d47061855439</div><div style="text-align:left" dir="ltr">> --- /dev/null</div><div style="text-align:left" dir="ltr">> +++ b/arch/arm/mach-npcm/Kconfig</div><div style="text-align:left" dir="ltr">> @@ -0,0 +1,50 @@</div><div style="text-align:left" dir="ltr">> +menuconfig ARCH_NPCM</div><div style="text-align:left" dir="ltr">> +       bool "Nuvoton NPCM Architecture"</div><div style="text-align:left" dir="ltr">> +       select ARCH_REQUIRE_GPIOLIB</div><div style="text-align:left" dir="ltr">> +       select USE_OF</div><div style="text-align:left" dir="ltr">> +       select PINCTRL</div><div style="text-align:left" dir="ltr">> +       select PINCTRL_NPCM7XX</div><div style="text-align:left" dir="ltr">> +</div><div style="text-align:left" dir="ltr">> +if ARCH_NPCM</div><div style="text-align:left" dir="ltr">> +</div><div style="text-align:left" dir="ltr">> +comment "NPCMX50 CPU type"</div><div style="text-align:left" dir="ltr">> +</div><div style="text-align:left" dir="ltr">> +config CPU_NPCM750</div><div style="text-align:left" dir="ltr">> +       depends on ARCH_NPCM && ARCH_MULTI_V7</div><div style="text-align:left" dir="ltr">> +       bool "Support for NPCM750 BMC CPU (Poleg)"</div><div style="text-align:left" dir="ltr">> +       select CACHE_L2X0</div><div style="text-align:left" dir="ltr">> +       select CPU_V7</div><div style="text-align:left" dir="ltr">> +       select ARM_GIC</div><div style="text-align:left" dir="ltr">> +       select HAVE_SMP</div><div style="text-align:left" dir="ltr">> +       select SMP</div><div style="text-align:left" dir="ltr">> +       select SMP_ON_UP</div><div style="text-align:left" dir="ltr">> +       select HAVE_ARM_SCU</div><div style="text-align:left" dir="ltr">> +       select HAVE_ARM_TWD if SMP</div><div style="text-align:left" dir="ltr">> +       select ARM_ERRATA_458693</div><div style="text-align:left" dir="ltr">> +       select ARM_ERRATA_720789</div><div style="text-align:left" dir="ltr">> +       select ARM_ERRATA_742231</div><div style="text-align:left" dir="ltr">> +       select ARM_ERRATA_754322</div><div style="text-align:left" dir="ltr">> +       select ARM_ERRATA_764369</div><div style="text-align:left" dir="ltr">> +       select ARM_ERRATA_794072</div><div style="text-align:left" dir="ltr">> +       select PL310_ERRATA_588369</div><div style="text-align:left" dir="ltr">> +       select PL310_ERRATA_727915</div><div style="text-align:left" dir="ltr">> +       select USB_EHCI_ROOT_HUB_TT</div><div style="text-align:left" dir="ltr">> +       select USB_ARCH_HAS_HCD</div><div style="text-align:left" dir="ltr">> +       select USB_ARCH_HAS_EHCI</div><div style="text-align:left" dir="ltr">> +       select USB_EHCI_HCD</div><div style="text-align:left" dir="ltr">> +       select USB_ARCH_HAS_OHCI</div><div style="text-align:left" dir="ltr">> +       select USB_OHCI_HCD</div><div style="text-align:left" dir="ltr">> +       select USB</div><div style="text-align:left" dir="ltr">> +       select FIQ</div><div style="text-align:left" dir="ltr">> +       select CPU_USE_DOMAINS</div><div style="text-align:left" dir="ltr">> +       select GENERIC_CLOCKEVENTS</div><div style="text-align:left" dir="ltr">> +       select CLKDEV_LOOKUP</div><div style="text-align:left" dir="ltr">> +       select COMMON_CLK if OF</div><div style="text-align:left" dir="ltr">> +       select NPCM750_TIMER</div><div style="text-align:left" dir="ltr">> +       select MFD_SYSCON</div><div style="text-align:left" dir="ltr">> +       help</div><div style="text-align:left" dir="ltr">> +         Support for NPCM750 BMC CPU (Poleg).</div><div style="text-align:left" dir="ltr">> +</div><div style="text-align:left" dir="ltr">> +         Nuvoton NPCM750 BMC based on the Cortex A9.</div><div style="text-align:left" dir="ltr">> +</div><div style="text-align:left" dir="ltr">> +endif</div><div style="text-align:left" dir="ltr">> diff --git a/arch/arm/mach-npcm/Makefile b/arch/arm/mach-npcm/Makefile</div><div style="text-align:left" dir="ltr">> new file mode 100644</div><div style="text-align:left" dir="ltr">> index 000000000000..78416055b854</div><div style="text-align:left" dir="ltr">> --- /dev/null</div><div style="text-align:left" dir="ltr">> +++ b/arch/arm/mach-npcm/Makefile</div><div style="text-align:left" dir="ltr">> @@ -0,0 +1,3 @@</div><div style="text-align:left" dir="ltr">> +AFLAGS_headsmp.o               += -march=armv7-a</div><div style="text-align:left" dir="ltr">> +</div><div style="text-align:left" dir="ltr">> +obj-$(CONFIG_CPU_NPCM750)      += npcm7xx.o platsmp.o headsmp.o</div><div style="text-align:left" dir="ltr">> diff --git a/arch/arm/mach-npcm/headsmp.S b/arch/arm/mach-npcm/headsmp.S</div><div style="text-align:left" dir="ltr">> new file mode 100644</div><div style="text-align:left" dir="ltr">> index 000000000000..9fccbbd49ed4</div><div style="text-align:left" dir="ltr">> --- /dev/null</div><div style="text-align:left" dir="ltr">> +++ b/arch/arm/mach-npcm/headsmp.S</div><div style="text-align:left" dir="ltr">> @@ -0,0 +1,17 @@</div><div style="text-align:left" dir="ltr">> +/*</div><div style="text-align:left" dir="ltr">> + * Copyright 2017 Google, Inc.</div><div style="text-align:left" dir="ltr">> + *</div><div style="text-align:left" dir="ltr">> + * This program is free software; you can redistribute it and/or modify</div><div style="text-align:left" dir="ltr">> + * it under the terms of the GNU General Public License version 2 as</div><div style="text-align:left" dir="ltr">> + * published by the Free Software Foundation.</div><div style="text-align:left" dir="ltr">> + */</div><div style="text-align:left" dir="ltr">> +</div><div style="text-align:left" dir="ltr">> +#include <linux/linkage.h></div><div style="text-align:left" dir="ltr">> +#include <linux/init.h></div><div style="text-align:left" dir="ltr">> +#include <asm/assembler.h></div><div style="text-align:left" dir="ltr">> +</div><div style="text-align:left" dir="ltr">> +ENTRY(npcm7xx_secondary_startup)</div><div style="text-align:left" dir="ltr">> +       safe_svcmode_maskall r0</div><div style="text-align:left" dir="ltr"><br></div><div style="text-align:left" dir="ltr"><div style="font-size:12.8px">I saw you  answered to Florian Fainelli that the BootRom is not starting the secondary CPU in SVC mode. Are you sure? In our engineering npcm7xx revision, Z1, the BootRom indeed started to run it in IRQ mode but we fixed it in the production version, A1, (quite long time ago), I hope you didn't get an EB with Z1 you can check that in BootBlock console print:</div><div style="font-size:12.8px"><div>> ADC CLK is set to 25000000</div><div>>Last reset was CORST</div><div>>vgaioen=1 and mux gspi.</div><div>>A1 <<====== this is what you should see, if you see Z1 we need to replace your EB</div><div><br></div></div></div><div style="text-align:left" dir="ltr">> +</div><div style="text-align:left" dir="ltr">> +       b       secondary_startup</div><div style="text-align:left" dir="ltr">> +ENDPROC(npcm7xx_secondary_startup)</div><div style="text-align:left" dir="ltr">> diff --git a/arch/arm/mach-npcm/npcm7xx.c b/arch/arm/mach-npcm/npcm7xx.c</div><div style="text-align:left" dir="ltr">> new file mode 100644</div><div style="text-align:left" dir="ltr">> index 000000000000..132e9d587857</div><div style="text-align:left" dir="ltr">> --- /dev/null</div><div style="text-align:left" dir="ltr">> +++ b/arch/arm/mach-npcm/npcm7xx.c</div><div style="text-align:left" dir="ltr">> @@ -0,0 +1,34 @@</div><div style="text-align:left" dir="ltr">> +/*</div><div style="text-align:left" dir="ltr">> + * Copyright (c) 2017 Nuvoton Technology corporation.</div><div style="text-align:left" dir="ltr">> + * Copyright 2017 Google, Inc.</div><div style="text-align:left" dir="ltr">> + *</div><div style="text-align:left" dir="ltr">> + * This program is free software; you can redistribute it and/or modify</div><div style="text-align:left" dir="ltr">> + * it under the terms of the GNU General Public License version 2 as</div><div style="text-align:left" dir="ltr">> + * published by the Free Software Foundation.</div><div style="text-align:left" dir="ltr">> + */</div><div style="text-align:left" dir="ltr">> +</div><div style="text-align:left" dir="ltr">> +#include <linux/kernel.h></div><div style="text-align:left" dir="ltr">> +#include <linux/types.h></div><div style="text-align:left" dir="ltr">> +#include <asm/mach/arch.h></div><div style="text-align:left" dir="ltr">> +#include <asm/mach-types.h></div><div style="text-align:left" dir="ltr">> +#include <asm/mach/map.h></div><div style="text-align:left" dir="ltr">> +#include <asm/hardware/cache-l2x0.h></div><div style="text-align:left" dir="ltr">> +</div><div style="text-align:left" dir="ltr">> +#define NPCM7XX_AUX_VAL (L310_AUX_CTRL_INSTR_PREFETCH |                               \</div><div style="text-align:left" dir="ltr">> +                        L310_AUX_CTRL_DATA_PREFETCH |                         \</div><div style="text-align:left" dir="ltr">> +                        L310_AUX_CTRL_NS_LOCKDOWN |                           \</div><div style="text-align:left" dir="ltr">> +                        L310_AUX_CTRL_CACHE_REPLACE_RR |                      \</div><div style="text-align:left" dir="ltr">> +                        L2C_AUX_CTRL_SHARED_OVERRIDE |                        \</div><div style="text-align:left" dir="ltr">> +                        L310_AUX_CTRL_FULL_LINE_ZERO)</div><div style="text-align:left" dir="ltr">> +</div><div style="text-align:left" dir="ltr">> +static const char *const npcm7xx_dt_match[] = {</div><div style="text-align:left" dir="ltr">> +       "nuvoton,npcm750",</div><div style="text-align:left" dir="ltr">> +       NULL</div><div style="text-align:left" dir="ltr">> +};</div><div style="text-align:left" dir="ltr">> +</div><div style="text-align:left" dir="ltr">> +DT_MACHINE_START(NPCM7XX_DT, "NPCMX50 Chip family")</div><div style="text-align:left" dir="ltr">> +       .atag_offset    = 0x100,</div><div style="text-align:left" dir="ltr">> +       .dt_compat      = npcm7xx_dt_match,</div><div style="text-align:left" dir="ltr">> +       .l2c_aux_val    = NPCM7XX_AUX_VAL,</div><div style="text-align:left" dir="ltr">> +       .l2c_aux_mask   = ~NPCM7XX_AUX_VAL,</div><div style="text-align:left" dir="ltr">> +MACHINE_END</div><div style="text-align:left" dir="ltr">> diff --git a/arch/arm/mach-npcm/platsmp.c b/arch/arm/mach-npcm/platsmp.c</div><div style="text-align:left" dir="ltr">> new file mode 100644</div><div style="text-align:left" dir="ltr">> index 000000000000..144e3e7ec7e6</div><div style="text-align:left" dir="ltr">> --- /dev/null</div><div style="text-align:left" dir="ltr">> +++ b/arch/arm/mach-npcm/platsmp.c</div><div style="text-align:left" dir="ltr">> @@ -0,0 +1,89 @@</div><div style="text-align:left" dir="ltr">> +/*</div><div style="text-align:left" dir="ltr">> + * Copyright 2017 Google, Inc.</div><div style="text-align:left" dir="ltr">> + *</div><div style="text-align:left" dir="ltr">> + * This program is free software; you can redistribute it and/or modify</div><div style="text-align:left" dir="ltr">> + * it under the terms of the GNU General Public License version 2 as</div><div style="text-align:left" dir="ltr">> + * published by the Free Software Foundation.</div><div style="text-align:left" dir="ltr">> + */</div><div style="text-align:left" dir="ltr">> +</div><div style="text-align:left" dir="ltr">> +#define pr_fmt(fmt) "PLATSMP: " fmt</div><div style="text-align:left" dir="ltr">> +</div><div style="text-align:left" dir="ltr">> +#include <linux/delay.h></div><div style="text-align:left" dir="ltr">> +#include <linux/device.h></div><div style="text-align:left" dir="ltr">> +#include <linux/smp.h></div><div style="text-align:left" dir="ltr">> +#include <linux/io.h></div><div style="text-align:left" dir="ltr">> +#include <linux/of.h></div><div style="text-align:left" dir="ltr">> +#include <linux/of_device.h></div><div style="text-align:left" dir="ltr">> +#include <linux/of_platform.h></div><div style="text-align:left" dir="ltr">> +#include <linux/of_address.h></div><div style="text-align:left" dir="ltr">> +#include <asm/cacheflush.h></div><div style="text-align:left" dir="ltr">> +#include <asm/smp.h></div><div style="text-align:left" dir="ltr">> +#include <asm/smp_plat.h></div><div style="text-align:left" dir="ltr">> +#include <asm/smp_scu.h></div><div style="text-align:left" dir="ltr">> +</div><div style="text-align:left" dir="ltr">> +#define NPCM7XX_SCRPAD_REG 0x13c</div><div style="text-align:left" dir="ltr">> +</div><div style="text-align:left" dir="ltr">> +extern void npcm7xx_secondary_startup(void);</div><div style="text-align:left" dir="ltr">> +</div><div style="text-align:left" dir="ltr">> +static int npcm7xx_smp_boot_secondary(unsigned int cpu,</div><div style="text-align:left" dir="ltr">> +                                     struct task_struct *idle)</div><div style="text-align:left" dir="ltr">> +{</div><div style="text-align:left" dir="ltr">> +       struct device_node *gcr_np;</div><div style="text-align:left" dir="ltr">> +       void __iomem *gcr_base;</div><div style="text-align:left" dir="ltr">> +       int ret = 0;</div><div style="text-align:left" dir="ltr">> +</div><div style="text-align:left" dir="ltr">> +       gcr_np = of_find_compatible_node(NULL, NULL, "nuvoton,npcm750-gcr");</div><div style="text-align:left" dir="ltr">> +       if (!gcr_np) {</div><div style="text-align:left" dir="ltr">> +               pr_err("no gcr device node\n");</div><div style="text-align:left" dir="ltr">> +               ret = -EFAULT;</div><div style="text-align:left" dir="ltr">> +               goto out;</div><div style="text-align:left" dir="ltr">> +       }</div><div style="text-align:left" dir="ltr">> +       gcr_base = of_iomap(gcr_np, 0);</div><div style="text-align:left" dir="ltr">> +       if (!gcr_base) {</div><div style="text-align:left" dir="ltr">> +               pr_err("could not iomap gcr at: 0x%llx\n", gcr_base);</div><div style="text-align:left" dir="ltr">> +               ret = -EFAULT;</div><div style="text-align:left" dir="ltr">> +               goto out;</div><div style="text-align:left" dir="ltr">> +       }</div><div style="text-align:left" dir="ltr">> +</div><div style="text-align:left" dir="ltr">> +       /* give boot ROM kernel start address. */</div><div style="text-align:left" dir="ltr">> +       iowrite32(__pa_symbol(npcm7xx_secondary_startup), gcr_base +</div><div style="text-align:left" dir="ltr">> +                 NPCM7XX_SCRPAD_REG);</div><div style="text-align:left" dir="ltr">> +       /* make sure npcm7xx_secondary_startup is seen by all observers. */</div><div style="text-align:left" dir="ltr">> +       smp_wmb();</div><div style="text-align:left" dir="ltr">> +       dsb_sev();</div><div style="text-align:left" dir="ltr">> +       /* make sure write buffer is drained */</div><div style="text-align:left" dir="ltr">> +       mb();</div><div style="text-align:left" dir="ltr">> +</div><div style="text-align:left" dir="ltr">> +out:</div><div style="text-align:left" dir="ltr">> +       iounmap(gcr_base);</div><div style="text-align:left" dir="ltr">> +       return ret;</div><div style="text-align:left" dir="ltr">> +}</div><div style="text-align:left" dir="ltr">> +</div><div style="text-align:left" dir="ltr">> +static void __init npcm7xx_smp_prepare_cpus(unsigned int max_cpus)</div><div style="text-align:left" dir="ltr">> +{</div><div style="text-align:left" dir="ltr">> +       struct device_node *scu_np;</div><div style="text-align:left" dir="ltr">> +       void __iomem *scu_base;</div><div style="text-align:left" dir="ltr">> +</div><div style="text-align:left" dir="ltr">> +       scu_np = of_find_compatible_node(NULL, NULL, "arm,cortex-a9-scu");</div><div style="text-align:left" dir="ltr">> +       if (!scu_np) {</div><div style="text-align:left" dir="ltr">> +               pr_err("no scu device node\n");</div><div style="text-align:left" dir="ltr">> +               return;</div><div style="text-align:left" dir="ltr">> +       }</div><div style="text-align:left" dir="ltr">> +       scu_base = of_iomap(scu_np, 0);</div><div style="text-align:left" dir="ltr">> +       if (!scu_base) {</div><div style="text-align:left" dir="ltr">> +               pr_err("could not iomap scu at: 0x%llx\n", scu_base);</div><div style="text-align:left" dir="ltr">> +               return;</div><div style="text-align:left" dir="ltr">> +       }</div><div style="text-align:left" dir="ltr">> +</div><div style="text-align:left" dir="ltr">> +       scu_enable(scu_base);</div><div style="text-align:left" dir="ltr">> +</div><div style="text-align:left" dir="ltr">> +out:</div><div style="text-align:left" dir="ltr">> +       iounmap(scu_base);</div><div style="text-align:left" dir="ltr">> +}</div><div style="text-align:left" dir="ltr">> +</div><div style="text-align:left" dir="ltr">> +static struct smp_operations npcm7xx_smp_ops __initdata = {</div><div style="text-align:left" dir="ltr">> +       .smp_prepare_cpus = npcm7xx_smp_prepare_cpus,</div><div style="text-align:left" dir="ltr">> +       .smp_boot_secondary = npcm7xx_smp_boot_secondary,</div><div style="text-align:left" dir="ltr">> +};</div><div style="text-align:left" dir="ltr">> +</div><div style="text-align:left" dir="ltr">> +CPU_METHOD_OF_DECLARE(npcm7xx_smp, "nuvoton,npcm7xx-smp", &npcm7xx_smp_ops);</div><div style="text-align:left" dir="ltr">> --</div><div style="text-align:left" dir="ltr">> 2.14.1.581.gf28d330327-goog</div><div style="text-align:left" dir="ltr">></div></div>