[ARM] Move read of processor ID out of lookup_processor_type()
authorRussell King <rmk@dyn-67.arm.linux.org.uk>
Fri, 24 Feb 2006 21:04:56 +0000 (21:04 +0000)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Tue, 21 Mar 2006 22:03:22 +0000 (22:03 +0000)
Read the processor ID at boot, and save it in "processor_id" as we
did before.  Later, when we re-parse the CPU type in the setup.c code,
re-use the value stored in "processor_id".

This allows a cleaner work-around for noMMU devices without CP#15.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/kernel/head.S
arch/arm/kernel/setup.c

index 1aca1775b28f188ac6682e5dfd15cd54e05b414e..571d6d58491922e93f071ce31cd1b327272b231c 100644 (file)
@@ -82,6 +82,7 @@
 ENTRY(stext)
        msr     cpsr_c, #PSR_F_BIT | PSR_I_BIT | MODE_SVC @ ensure svc mode
                                                @ and irqs disabled
+       mrc     p15, 0, r9, c0, c0              @ get processor id
        bl      __lookup_processor_type         @ r5=procinfo r9=cpuid
        movs    r10, r5                         @ invalid processor (r5=0)?
        beq     __error_p                       @ yes, error 'p'
@@ -156,6 +157,7 @@ ENTRY(secondary_startup)
         * as it has already been validated by the primary processor.
         */
        msr     cpsr_c, #PSR_F_BIT | PSR_I_BIT | MODE_SVC
+       mrc     p15, 0, r9, c0, c0              @ get processor id
        bl      __lookup_processor_type
        movs    r10, r5                         @ invalid processor?
        moveq   r0, #'p'                        @ yes, error 'p'
@@ -450,19 +452,19 @@ __error:
  * (and therefore, we are not in the correct address space).  We have to
  * calculate the offset.
  *
+ *     r9 = cpuid
  * Returns:
  *     r3, r4, r6 corrupted
  *     r5 = proc_info pointer in physical address space
- *     r9 = cpuid
+ *     r9 = cpuid (preserved)
  */
        .type   __lookup_processor_type, %function
 __lookup_processor_type:
        adr     r3, 3f
-       ldmda   r3, {r5, r6, r9}
-       sub     r3, r3, r9                      @ get offset between virt&phys
+       ldmda   r3, {r5 - r7}
+       sub     r3, r3, r7                      @ get offset between virt&phys
        add     r5, r5, r3                      @ convert virt addresses to
        add     r6, r6, r3                      @ physical address space
-       mrc     p15, 0, r9, c0, c0              @ get processor id
 1:     ldmia   r5, {r3, r4}                    @ value, mask
        and     r4, r4, r9                      @ mask wanted bits
        teq     r3, r4
@@ -477,10 +479,11 @@ __lookup_processor_type:
  * This provides a C-API version of the above function.
  */
 ENTRY(lookup_processor_type)
-       stmfd   sp!, {r4 - r6, r9, lr}
+       stmfd   sp!, {r4 - r7, r9, lr}
+       mov     r9, r0
        bl      __lookup_processor_type
        mov     r0, r5
-       ldmfd   sp!, {r4 - r6, r9, pc}
+       ldmfd   sp!, {r4 - r7, r9, pc}
 
 /*
  * Look in include/asm-arm/procinfo.h and arch/arm/kernel/arch.[ch] for
index 08974cbe9824d86f6d228f23f00be2291c6134d8..b7cd280bfd638585f6caec72c30d829774546d75 100644 (file)
@@ -278,7 +278,7 @@ int cpu_architecture(void)
  * These functions re-use the assembly code in head.S, which
  * already provide the required functionality.
  */
-extern struct proc_info_list *lookup_processor_type(void);
+extern struct proc_info_list *lookup_processor_type(unsigned int);
 extern struct machine_desc *lookup_machine_type(unsigned int);
 
 static void __init setup_processor(void)
@@ -290,7 +290,7 @@ static void __init setup_processor(void)
         * types.  The linker builds this table for us from the
         * entries in arch/arm/mm/proc-*.S
         */
-       list = lookup_processor_type();
+       list = lookup_processor_type(processor_id);
        if (!list) {
                printk("CPU configuration botched (ID %08x), unable "
                       "to continue.\n", processor_id);