[PATCH] arm64: Get rid of struct cpu_table

Ard Biesheuvel ard.biesheuvel at linaro.org
Fri Mar 13 06:33:27 PDT 2015


On 13 March 2015 at 13:02, Marc Zyngier <marc.zyngier at arm.com> wrote:
> struct cpu_table is an artifact left from the (very) early days of
> the arm64 port, and its only real use is to allow the most beautiful
> "AArch64 Processor" string to be displayed at boot time.
>

Heh, I looked at that code and assumed it was there for a reason.
Apparently not :-)

Acked-by: Ard Biesheuvel <ard.biesheuvel at linaro.org>

Some comments below.

> Really? Yes, really.
>
> Let's get rid of it. In order to avoid another BogoMips-gate, the
> aforementioned string is preserved.
>
> Acked-by: Catalin Marinas <catalin.marinas at arm.com>
> Signed-off-by: Marc Zyngier <marc.zyngier at arm.com>
> ---
>  arch/arm64/include/asm/cputable.h | 30 -------------------
>  arch/arm64/kernel/Makefile        |  2 +-
>  arch/arm64/kernel/asm-offsets.c   |  4 ---
>  arch/arm64/kernel/cputable.c      | 33 ---------------------
>  arch/arm64/kernel/head.S          | 61 ++++-----------------------------------
>  arch/arm64/kernel/setup.c         | 16 ++--------
>  6 files changed, 9 insertions(+), 137 deletions(-)
>  delete mode 100644 arch/arm64/include/asm/cputable.h
>  delete mode 100644 arch/arm64/kernel/cputable.c
>
> diff --git a/arch/arm64/include/asm/cputable.h b/arch/arm64/include/asm/cputable.h
> deleted file mode 100644
> index e3bd983..0000000
> --- a/arch/arm64/include/asm/cputable.h
> +++ /dev/null
> @@ -1,30 +0,0 @@
> -/*
> - * arch/arm64/include/asm/cputable.h
> - *
> - * Copyright (C) 2012 ARM Ltd.
> - *
> - * This program is free software: you can redistribute it and/or modify
> - * it under the terms of the GNU General Public License version 2 as
> - * published by the Free Software Foundation.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> - * GNU General Public License for more details.
> - *
> - * You should have received a copy of the GNU General Public License
> - * along with this program.  If not, see <http://www.gnu.org/licenses/>.
> - */
> -#ifndef __ASM_CPUTABLE_H
> -#define __ASM_CPUTABLE_H
> -
> -struct cpu_info {
> -       unsigned int    cpu_id_val;
> -       unsigned int    cpu_id_mask;
> -       const char      *cpu_name;
> -       unsigned long   (*cpu_setup)(void);
> -};
> -
> -extern struct cpu_info *lookup_processor_type(unsigned int);
> -
> -#endif
> diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile
> index 5ee07ee..d5e7074 100644
> --- a/arch/arm64/kernel/Makefile
> +++ b/arch/arm64/kernel/Makefile
> @@ -12,7 +12,7 @@ CFLAGS_REMOVE_insn.o = -pg
>  CFLAGS_REMOVE_return_address.o = -pg
>
>  # Object file lists.
> -arm64-obj-y            := cputable.o debug-monitors.o entry.o irq.o fpsimd.o   \
> +arm64-obj-y            := debug-monitors.o entry.o irq.o fpsimd.o              \
>                            entry-fpsimd.o process.o ptrace.o setup.o signal.o   \
>                            sys.o stacktrace.o time.o traps.o io.o vdso.o        \
>                            hyp-stub.o psci.o psci-call.o cpu_ops.o insn.o       \
> diff --git a/arch/arm64/kernel/asm-offsets.c b/arch/arm64/kernel/asm-offsets.c
> index f7fa65d..14dd3d1 100644
> --- a/arch/arm64/kernel/asm-offsets.c
> +++ b/arch/arm64/kernel/asm-offsets.c
> @@ -24,7 +24,6 @@
>  #include <linux/kvm_host.h>
>  #include <asm/thread_info.h>
>  #include <asm/memory.h>
> -#include <asm/cputable.h>
>  #include <asm/smp_plat.h>
>  #include <asm/suspend.h>
>  #include <asm/vdso_datapage.h>
> @@ -71,9 +70,6 @@ int main(void)
>    BLANK();
>    DEFINE(PAGE_SZ,              PAGE_SIZE);
>    BLANK();
> -  DEFINE(CPU_INFO_SZ,          sizeof(struct cpu_info));
> -  DEFINE(CPU_INFO_SETUP,       offsetof(struct cpu_info, cpu_setup));
> -  BLANK();
>    DEFINE(DMA_BIDIRECTIONAL,    DMA_BIDIRECTIONAL);
>    DEFINE(DMA_TO_DEVICE,                DMA_TO_DEVICE);
>    DEFINE(DMA_FROM_DEVICE,      DMA_FROM_DEVICE);
> diff --git a/arch/arm64/kernel/cputable.c b/arch/arm64/kernel/cputable.c
> deleted file mode 100644
> index fd3993c..0000000
> --- a/arch/arm64/kernel/cputable.c
> +++ /dev/null
> @@ -1,33 +0,0 @@
> -/*
> - * arch/arm64/kernel/cputable.c
> - *
> - * Copyright (C) 2012 ARM Ltd.
> - *
> - * This program is free software: you can redistribute it and/or modify
> - * it under the terms of the GNU General Public License version 2 as
> - * published by the Free Software Foundation.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> - * GNU General Public License for more details.
> - *
> - * You should have received a copy of the GNU General Public License
> - * along with this program.  If not, see <http://www.gnu.org/licenses/>.
> - */
> -
> -#include <linux/init.h>
> -
> -#include <asm/cputable.h>
> -
> -extern unsigned long __cpu_setup(void);
> -
> -struct cpu_info cpu_table[] = {
> -       {
> -               .cpu_id_val     = 0x000f0000,
> -               .cpu_id_mask    = 0x000f0000,
> -               .cpu_name       = "AArch64 Processor",
> -               .cpu_setup      = __cpu_setup,
> -       },
> -       { /* Empty */ },
> -};
> diff --git a/arch/arm64/kernel/head.S b/arch/arm64/kernel/head.S
> index 8ce88e0..3ef9cbc 100644
> --- a/arch/arm64/kernel/head.S
> +++ b/arch/arm64/kernel/head.S
> @@ -245,22 +245,12 @@ ENTRY(stext)
>         bl      __calc_phys_offset              // x24=PHYS_OFFSET, x28=PHYS_OFFSET-PAGE_OFFSET
>         bl      set_cpu_boot_mode_flag
>         mrs     x22, midr_el1                   // x22=cpuid
> -       mov     x0, x22
> -       bl      lookup_processor_type
> -       mov     x23, x0                         // x23=current cpu_table
> -       /*
> -        * __error_p may end up out of range for cbz if text areas are
> -        * aligned up to section sizes.
> -        */
> -       cbnz    x23, 1f                         // invalid processor (x23=0)?
> -       b       __error_p
> -1:
> +
>         bl      __vet_fdt
>         bl      __create_page_tables            // x25=TTBR0, x26=TTBR1
>         /*
>          * The following calls CPU specific code in a position independent
> -        * manner. See arch/arm64/mm/proc.S for details. x23 = base of
> -        * cpu_info structure selected by lookup_processor_type above.
> +        * manner. See arch/arm64/mm/proc.S for details.
>          * On return, the CPU will be ready for the MMU to be turned on and
>          * the TCR will have been set.
>          */
> @@ -268,8 +258,8 @@ ENTRY(stext)
>                                                 // MMU has been enabled
>         adrp    lr, __enable_mmu                // return (PIC) address
>         add     lr, lr, #:lo12:__enable_mmu
> -       ldr     x12, [x23, #CPU_INFO_SETUP]
> -       add     x12, x12, x28                   // __virt_to_phys
> +       adrp    x12, __cpu_setup
> +       add     x12, x12, #:lo12:__cpu_setup
>         br      x12                             // initialise processor

b __cpu_setup ?

>  ENDPROC(stext)
>
> @@ -634,14 +624,10 @@ ENTRY(secondary_startup)
>          * Common entry point for secondary CPUs.
>          */
>         mrs     x22, midr_el1                   // x22=cpuid
> -       mov     x0, x22
> -       bl      lookup_processor_type
> -       mov     x23, x0                         // x23=current cpu_table
> -       cbz     x23, __error_p                  // invalid processor (x23=0)?
>
>         pgtbl   x25, x26, x28                   // x25=TTBR0, x26=TTBR1
> -       ldr     x12, [x23, #CPU_INFO_SETUP]
> -       add     x12, x12, x28                   // __virt_to_phys
> +       adrp    x12, __cpu_setup
> +       add     x12, x12, #:lo12:__cpu_setup
>         blr     x12                             // initialise processor
>

bl __cpu_setup ?

>         ldr     x21, =secondary_data
> @@ -721,38 +707,3 @@ __error:
>  1:     nop
>         b       1b
>  ENDPROC(__error)
> -
> -/*
> - * This function gets the processor ID in w0 and searches the cpu_table[] for
> - * a match. It returns a pointer to the struct cpu_info it found. The
> - * cpu_table[] must end with an empty (all zeros) structure.
> - *
> - * This routine can be called via C code and it needs to work with the MMU
> - * both disabled and enabled (the offset is calculated automatically).
> - */
> -ENTRY(lookup_processor_type)
> -       adr     x1, __lookup_processor_type_data
> -       ldp     x2, x3, [x1]
> -       sub     x1, x1, x2                      // get offset between VA and PA
> -       add     x3, x3, x1                      // convert VA to PA
> -1:
> -       ldp     w5, w6, [x3]                    // load cpu_id_val and cpu_id_mask
> -       cbz     w5, 2f                          // end of list?
> -       and     w6, w6, w0
> -       cmp     w5, w6
> -       b.eq    3f
> -       add     x3, x3, #CPU_INFO_SZ
> -       b       1b
> -2:
> -       mov     x3, #0                          // unknown processor
> -3:
> -       mov     x0, x3
> -       ret
> -ENDPROC(lookup_processor_type)
> -
> -       .align  3
> -       .type   __lookup_processor_type_data, %object
> -__lookup_processor_type_data:
> -       .quad   .
> -       .quad   cpu_table
> -       .size   __lookup_processor_type_data, . - __lookup_processor_type_data
> diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
> index e8420f6..a19eae2 100644
> --- a/arch/arm64/kernel/setup.c
> +++ b/arch/arm64/kernel/setup.c
> @@ -50,7 +50,6 @@
>  #include <asm/cpu.h>
>  #include <asm/cputype.h>
>  #include <asm/elf.h>
> -#include <asm/cputable.h>
>  #include <asm/cpufeature.h>
>  #include <asm/cpu_ops.h>
>  #include <asm/sections.h>
> @@ -83,7 +82,6 @@ unsigned int compat_elf_hwcap2 __read_mostly;
>
>  DECLARE_BITMAP(cpu_hwcaps, ARM64_NCAPS);
>
> -static const char *cpu_name;
>  phys_addr_t __fdt_pointer __initdata;
>
>  /*
> @@ -209,22 +207,12 @@ static void __init smp_build_mpidr_hash(void)
>
>  static void __init setup_processor(void)
>  {
> -       struct cpu_info *cpu_info;
>         u64 features, block;
>         u32 cwg;
>         int cls;
>
> -       cpu_info = lookup_processor_type(read_cpuid_id());
> -       if (!cpu_info) {
> -               printk("CPU configuration botched (ID %08x), unable to continue.\n",
> -                      read_cpuid_id());
> -               while (1);
> -       }
> -
> -       cpu_name = cpu_info->cpu_name;
> -
> -       printk("CPU: %s [%08x] revision %d\n",
> -              cpu_name, read_cpuid_id(), read_cpuid_id() & 15);
> +       printk("CPU: AArch64 Processor [%08x] revision %d\n",
> +              read_cpuid_id(), read_cpuid_id() & 15);
>
>         sprintf(init_utsname()->machine, ELF_PLATFORM);
>         elf_hwcap = 0;
> --
> 2.1.4
>
>
> _______________________________________________
> linux-arm-kernel mailing list
> linux-arm-kernel at lists.infradead.org
> http://lists.infradead.org/mailman/listinfo/linux-arm-kernel



More information about the linux-arm-kernel mailing list