Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/davej/cpufreq
[pandora-kernel.git] / arch / arm / mm / proc-v7.S
index b3b566e..a30e785 100644 (file)
@@ -58,9 +58,16 @@ ENDPROC(cpu_v7_proc_fin)
  *     to what would be the reset vector.
  *
  *     - loc   - location to jump to for soft reset
+ *
+ *     This code must be executed using a flat identity mapping with
+ *      caches disabled.
  */
        .align  5
 ENTRY(cpu_v7_reset)
+       mrc     p15, 0, r1, c1, c0, 0           @ ctrl register
+       bic     r1, r1, #0x1                    @ ...............m
+       mcr     p15, 0, r1, c1, c0, 0           @ disable MMU
+       isb
        mov     pc, r0
 ENDPROC(cpu_v7_reset)
 
@@ -108,16 +115,18 @@ ENTRY(cpu_v7_switch_mm)
 #ifdef CONFIG_ARM_ERRATA_430973
        mcr     p15, 0, r2, c7, c5, 6           @ flush BTAC/BTB
 #endif
-       mrc     p15, 0, r2, c2, c0, 1           @ load TTB 1
-       mcr     p15, 0, r2, c2, c0, 0           @ into TTB 0
+#ifdef CONFIG_ARM_ERRATA_754322
+       dsb
+#endif
+       mcr     p15, 0, r2, c13, c0, 1          @ set reserved context ID
+       isb
+1:     mcr     p15, 0, r0, c2, c0, 0           @ set TTB 0
        isb
 #ifdef CONFIG_ARM_ERRATA_754322
        dsb
 #endif
        mcr     p15, 0, r1, c13, c0, 1          @ set context ID
        isb
-       mcr     p15, 0, r0, c2, c0, 0           @ set TTB 0
-       isb
 #endif
        mov     pc, lr
 ENDPROC(cpu_v7_switch_mm)
@@ -171,8 +180,7 @@ ENTRY(cpu_v7_set_pte_ext)
        mov     pc, lr
 ENDPROC(cpu_v7_set_pte_ext)
 
-cpu_v7_name:
-       .ascii  "ARMv7 Processor"
+       string  cpu_v7_name, "ARMv7 Processor"
        .align
 
        /*
@@ -208,19 +216,21 @@ cpu_v7_name:
 
 /* Suspend/resume support: derived from arch/arm/mach-s5pv210/sleep.S */
 .globl cpu_v7_suspend_size
-.equ   cpu_v7_suspend_size, 4 * 8
+.equ   cpu_v7_suspend_size, 4 * 9
 #ifdef CONFIG_PM_SLEEP
 ENTRY(cpu_v7_do_suspend)
        stmfd   sp!, {r4 - r11, lr}
        mrc     p15, 0, r4, c13, c0, 0  @ FCSE/PID
        mrc     p15, 0, r5, c13, c0, 1  @ Context ID
+       mrc     p15, 0, r6, c13, c0, 3  @ User r/o thread ID
+       stmia   r0!, {r4 - r6}
        mrc     p15, 0, r6, c3, c0, 0   @ Domain ID
        mrc     p15, 0, r7, c2, c0, 0   @ TTB 0
        mrc     p15, 0, r8, c2, c0, 1   @ TTB 1
        mrc     p15, 0, r9, c1, c0, 0   @ Control register
        mrc     p15, 0, r10, c1, c0, 1  @ Auxiliary control register
        mrc     p15, 0, r11, c1, c0, 2  @ Co-processor access control
-       stmia   r0, {r4 - r11}
+       stmia   r0, {r6 - r11}
        ldmfd   sp!, {r4 - r11, pc}
 ENDPROC(cpu_v7_do_suspend)
 
@@ -228,9 +238,11 @@ ENTRY(cpu_v7_do_resume)
        mov     ip, #0
        mcr     p15, 0, ip, c8, c7, 0   @ invalidate TLBs
        mcr     p15, 0, ip, c7, c5, 0   @ invalidate I cache
-       ldmia   r0, {r4 - r11}
+       ldmia   r0!, {r4 - r6}
        mcr     p15, 0, r4, c13, c0, 0  @ FCSE/PID
        mcr     p15, 0, r5, c13, c0, 1  @ Context ID
+       mcr     p15, 0, r6, c13, c0, 3  @ User r/o thread ID
+       ldmia   r0, {r6 - r11}
        mcr     p15, 0, r6, c3, c0, 0   @ Domain ID
        mcr     p15, 0, r7, c2, c0, 0   @ TTB 0
        mcr     p15, 0, r8, c2, c0, 1   @ TTB 1
@@ -251,9 +263,6 @@ ENDPROC(cpu_v7_do_resume)
 cpu_resume_l1_flags:
        ALT_SMP(.long PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_FLAGS_SMP)
        ALT_UP(.long  PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_FLAGS_UP)
-#else
-#define cpu_v7_do_suspend      0
-#define cpu_v7_do_resume       0
 #endif
 
        __CPUINIT
@@ -273,13 +282,20 @@ cpu_resume_l1_flags:
  *     It is assumed that:
  *     - cache type register is implemented
  */
+__v7_ca5mp_setup:
 __v7_ca9mp_setup:
+       mov     r10, #(1 << 0)                  @ TLB ops broadcasting
+       b       1f
+__v7_ca15mp_setup:
+       mov     r10, #0
+1:
 #ifdef CONFIG_SMP
        ALT_SMP(mrc     p15, 0, r0, c1, c0, 1)
        ALT_UP(mov      r0, #(1 << 6))          @ fake it for UP
        tst     r0, #(1 << 6)                   @ SMP/nAMP mode enabled?
-       orreq   r0, r0, #(1 << 6) | (1 << 0)    @ Enable SMP/nAMP mode and
-       mcreq   p15, 0, r0, c1, c0, 1           @ TLB ops broadcasting
+       orreq   r0, r0, #(1 << 6)               @ Enable SMP/nAMP mode
+       orreq   r0, r0, r10                     @ Enable CPU-specific SMP bits
+       mcreq   p15, 0, r0, c1, c0, 1
 #endif
 __v7_setup:
        adr     r12, __v7_setup_stack           @ the local stack
@@ -405,66 +421,69 @@ __v7_setup_stack:
 
        __INITDATA
 
-       .type   v7_processor_functions, #object
-ENTRY(v7_processor_functions)
-       .word   v7_early_abort
-       .word   v7_pabort
-       .word   cpu_v7_proc_init
-       .word   cpu_v7_proc_fin
-       .word   cpu_v7_reset
-       .word   cpu_v7_do_idle
-       .word   cpu_v7_dcache_clean_area
-       .word   cpu_v7_switch_mm
-       .word   cpu_v7_set_pte_ext
-       .word   0
-       .word   0
-       .word   0
-       .size   v7_processor_functions, . - v7_processor_functions
+       @ define struct processor (see <asm/proc-fns.h> and proc-macros.S)
+       define_processor_functions v7, dabort=v7_early_abort, pabort=v7_pabort, suspend=1
 
        .section ".rodata"
 
-       .type   cpu_arch_name, #object
-cpu_arch_name:
-       .asciz  "armv7"
-       .size   cpu_arch_name, . - cpu_arch_name
-
-       .type   cpu_elf_name, #object
-cpu_elf_name:
-       .asciz  "v7"
-       .size   cpu_elf_name, . - cpu_elf_name
+       string  cpu_arch_name, "armv7"
+       string  cpu_elf_name, "v7"
        .align
 
        .section ".proc.info.init", #alloc, #execinstr
 
-       .type   __v7_ca9mp_proc_info, #object
-__v7_ca9mp_proc_info:
-       .long   0x410fc090              @ Required ID value
-       .long   0xff0ffff0              @ Mask for ID
-       ALT_SMP(.long \
-               PMD_TYPE_SECT | \
-               PMD_SECT_AP_WRITE | \
-               PMD_SECT_AP_READ | \
-               PMD_FLAGS_SMP)
-       ALT_UP(.long \
-               PMD_TYPE_SECT | \
-               PMD_SECT_AP_WRITE | \
-               PMD_SECT_AP_READ | \
-               PMD_FLAGS_UP)
-       .long   PMD_TYPE_SECT | \
-               PMD_SECT_XN | \
-               PMD_SECT_AP_WRITE | \
-               PMD_SECT_AP_READ
-       W(b)    __v7_ca9mp_setup
+       /*
+        * Standard v7 proc info content
+        */
+.macro __v7_proc initfunc, mm_mmuflags = 0, io_mmuflags = 0, hwcaps = 0
+       ALT_SMP(.long   PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | \
+                       PMD_FLAGS_SMP | \mm_mmuflags)
+       ALT_UP(.long    PMD_TYPE_SECT | PMD_SECT_AP_WRITE | PMD_SECT_AP_READ | \
+                       PMD_FLAGS_UP | \mm_mmuflags)
+       .long   PMD_TYPE_SECT | PMD_SECT_XN | PMD_SECT_AP_WRITE | \
+               PMD_SECT_AP_READ | \io_mmuflags
+       W(b)    \initfunc
        .long   cpu_arch_name
        .long   cpu_elf_name
-       .long   HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP|HWCAP_TLS
+       .long   HWCAP_SWP | HWCAP_HALF | HWCAP_THUMB | HWCAP_FAST_MULT | \
+               HWCAP_EDSP | HWCAP_TLS | \hwcaps
        .long   cpu_v7_name
        .long   v7_processor_functions
        .long   v7wbi_tlb_fns
        .long   v6_user_fns
        .long   v7_cache_fns
+.endm
+
+       /*
+        * ARM Ltd. Cortex A5 processor.
+        */
+       .type   __v7_ca5mp_proc_info, #object
+__v7_ca5mp_proc_info:
+       .long   0x410fc050
+       .long   0xff0ffff0
+       __v7_proc __v7_ca5mp_setup
+       .size   __v7_ca5mp_proc_info, . - __v7_ca5mp_proc_info
+
+       /*
+        * ARM Ltd. Cortex A9 processor.
+        */
+       .type   __v7_ca9mp_proc_info, #object
+__v7_ca9mp_proc_info:
+       .long   0x410fc090
+       .long   0xff0ffff0
+       __v7_proc __v7_ca9mp_setup
        .size   __v7_ca9mp_proc_info, . - __v7_ca9mp_proc_info
 
+       /*
+        * ARM Ltd. Cortex A15 processor.
+        */
+       .type   __v7_ca15mp_proc_info, #object
+__v7_ca15mp_proc_info:
+       .long   0x410fc0f0
+       .long   0xff0ffff0
+       __v7_proc __v7_ca15mp_setup, hwcaps = HWCAP_IDIV
+       .size   __v7_ca15mp_proc_info, . - __v7_ca15mp_proc_info
+
        /*
         * Match any ARMv7 processor core.
         */
@@ -472,27 +491,5 @@ __v7_ca9mp_proc_info:
 __v7_proc_info:
        .long   0x000f0000              @ Required ID value
        .long   0x000f0000              @ Mask for ID
-       ALT_SMP(.long \
-               PMD_TYPE_SECT | \
-               PMD_SECT_AP_WRITE | \
-               PMD_SECT_AP_READ | \
-               PMD_FLAGS_SMP)
-       ALT_UP(.long \
-               PMD_TYPE_SECT | \
-               PMD_SECT_AP_WRITE | \
-               PMD_SECT_AP_READ | \
-               PMD_FLAGS_UP)
-       .long   PMD_TYPE_SECT | \
-               PMD_SECT_XN | \
-               PMD_SECT_AP_WRITE | \
-               PMD_SECT_AP_READ
-       W(b)    __v7_setup
-       .long   cpu_arch_name
-       .long   cpu_elf_name
-       .long   HWCAP_SWP|HWCAP_HALF|HWCAP_THUMB|HWCAP_FAST_MULT|HWCAP_EDSP|HWCAP_TLS
-       .long   cpu_v7_name
-       .long   v7_processor_functions
-       .long   v7wbi_tlb_fns
-       .long   v6_user_fns
-       .long   v7_cache_fns
+       __v7_proc __v7_setup
        .size   __v7_proc_info, . - __v7_proc_info