On Thu, Apr 09, 2015 at 06:37:09PM +0100, Kumar Gala wrote: > From: Abhimanyu Kapur <abhimany@xxxxxxxxxxxxxx> > > Add support to arm64 to provide a dt-based method to allow soc-vendors to > supply cpu_ops. Also move psci and smp_spin_table ops to use CPU_OF_TABLES. On arm64 there are two enable methods: PSCI and spin-table. Update your firmware accordingly and drop this patch, thanks. Lorenzo > Signed-off-by: Abhimanyu Kapur <abhimany@xxxxxxxxxxxxxx> > Signed-off-by: Kumar Gala <galak@xxxxxxxxxxxxxx> > --- > arch/arm64/include/asm/cpu_ops.h | 5 +++++ > arch/arm64/kernel/cpu_ops.c | 27 +++++++++------------------ > arch/arm64/kernel/psci.c | 1 + > arch/arm64/kernel/smp_spin_table.c | 3 ++- > 4 files changed, 17 insertions(+), 19 deletions(-) > > diff --git a/arch/arm64/include/asm/cpu_ops.h b/arch/arm64/include/asm/cpu_ops.h > index da301ee..a7efab8 100644 > --- a/arch/arm64/include/asm/cpu_ops.h > +++ b/arch/arm64/include/asm/cpu_ops.h > @@ -67,4 +67,9 @@ extern const struct cpu_operations *cpu_ops[NR_CPUS]; > int __init cpu_read_ops(struct device_node *dn, int cpu); > void __init cpu_read_bootcpu_ops(void); > > +#define CPU_METHOD_OF_DECLARE(name, __ops) \ > + static const struct cpu_operations *__cpu_method_table_##name \ > + __used __section(__cpu_method_of_table) \ > + = __ops; > + > #endif /* ifndef __ASM_CPU_OPS_H */ > diff --git a/arch/arm64/kernel/cpu_ops.c b/arch/arm64/kernel/cpu_ops.c > index cce9524..ad33f98 100644 > --- a/arch/arm64/kernel/cpu_ops.c > +++ b/arch/arm64/kernel/cpu_ops.c > @@ -22,29 +22,20 @@ > #include <linux/of.h> > #include <linux/string.h> > > -extern const struct cpu_operations smp_spin_table_ops; > -extern const struct cpu_operations cpu_psci_ops; > - > const struct cpu_operations *cpu_ops[NR_CPUS]; > > -static const struct cpu_operations *supported_cpu_ops[] __initconst = { > -#ifdef CONFIG_SMP > - &smp_spin_table_ops, > -#endif > - &cpu_psci_ops, > - NULL, > -}; > +extern struct cpu_operations __cpu_method_of_table[]; > +static const struct cpu_operations *__cpu_method_of_table_sentinel > + __used __section(__cpu_method_of_table_end); > > -static const struct cpu_operations * __init cpu_get_ops(const char *name) > +const struct cpu_operations * __init cpu_get_ops(const char *name) > { > - const struct cpu_operations **ops = supported_cpu_ops; > - > - while (*ops) { > - if (!strcmp(name, (*ops)->name)) > - return *ops; > + const struct cpu_operations **start = (void *)__cpu_method_of_table; > > - ops++; > - } > + for (; *start; start++) { > + if (!strcmp((*start)->name, name)) > + return *start; > + }; > > return NULL; > } > diff --git a/arch/arm64/kernel/psci.c b/arch/arm64/kernel/psci.c > index 9b8a70a..2f255c7 100644 > --- a/arch/arm64/kernel/psci.c > +++ b/arch/arm64/kernel/psci.c > @@ -523,3 +523,4 @@ const struct cpu_operations cpu_psci_ops = { > #endif > }; > > +CPU_METHOD_OF_DECLARE(psci, &cpu_psci_ops); > diff --git a/arch/arm64/kernel/smp_spin_table.c b/arch/arm64/kernel/smp_spin_table.c > index 14944e5..b41a8b4 100644 > --- a/arch/arm64/kernel/smp_spin_table.c > +++ b/arch/arm64/kernel/smp_spin_table.c > @@ -119,9 +119,10 @@ static int smp_spin_table_cpu_boot(unsigned int cpu) > return 0; > } > > -const struct cpu_operations smp_spin_table_ops = { > +static const struct cpu_operations smp_spin_table_ops = { > .name = "spin-table", > .cpu_init = smp_spin_table_cpu_init, > .cpu_prepare = smp_spin_table_cpu_prepare, > .cpu_boot = smp_spin_table_cpu_boot, > }; > +CPU_METHOD_OF_DECLARE(spin_table, &smp_spin_table_ops); > -- > Qualcomm Innovation Center, Inc. > The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum, > a Linux Foundation Collaborative Project > > -- > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html > Please read the FAQ at http://www.tux.org/lkml/ > -- To unsubscribe from this list: send the line "unsubscribe devicetree" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html