[SPARC64]: arch/sparc64/kernel/trampoline.S needs asm/cpudata.h
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / arch / sparc64 / kernel / trampoline.S
index 9478551cb02026b051cc3418ff6ea9d41adf2d80..b9c9f54b0a00bd5c51e853bcf1e5a9950c30f914 100644 (file)
@@ -16,6 +16,8 @@
 #include <asm/processor.h>
 #include <asm/thread_info.h>
 #include <asm/mmu.h>
+#include <asm/hypervisor.h>
+#include <asm/cpudata.h>
 
        .data
        .align  8
@@ -34,8 +36,9 @@ dtlb_load:
 sparc64_cpu_startup:
        flushw
 
-       BRANCH_IF_CHEETAH_BASE(g1,g5,cheetah_startup)
-       BRANCH_IF_CHEETAH_PLUS_OR_FOLLOWON(g1,g5,cheetah_plus_startup)
+       BRANCH_IF_SUN4V(g1, niagara_startup)
+       BRANCH_IF_CHEETAH_BASE(g1, g5, cheetah_startup)
+       BRANCH_IF_CHEETAH_PLUS_OR_FOLLOWON(g1, g5, cheetah_plus_startup)
 
        ba,pt   %xcc, spitfire_startup
         nop
@@ -70,7 +73,9 @@ cheetah_generic_startup:
        stxa    %g0, [%g3] ASI_DMMU
        stxa    %g0, [%g3] ASI_IMMU
        membar  #Sync
+       /* fallthru */
 
+niagara_startup:
        /* Disable STICK_INT interrupts. */
        sethi           %hi(0x80000000), %g5
        sllx            %g5, 32, %g5
@@ -91,6 +96,8 @@ startup_continue:
        sllx            %g2, 32, %g2
        wr              %g2, 0, %tick_cmpr
 
+       BRANCH_IF_SUN4V(g1, niagara_lock_tlb)
+
        /* Call OBP by hand to lock KERNBASE into i/d tlbs.
         * We lock 2 consequetive entries if we are 'bigkernel'.
         */
@@ -142,8 +149,7 @@ startup_continue:
 
        sethi           %hi(bigkernel), %g2
        lduw            [%g2 + %lo(bigkernel)], %g2
-       cmp             %g2, 0
-       be,pt           %icc, do_dtlb
+       brz,pt          %g2, do_dtlb
         nop
 
        sethi           %hi(call_method), %g2
@@ -214,8 +220,7 @@ do_dtlb:
 
        sethi           %hi(bigkernel), %g2
        lduw            [%g2 + %lo(bigkernel)], %g2
-       cmp             %g2, 0
-       be,pt           %icc, do_unlock
+       brz,pt          %g2, do_unlock
         nop
 
        sethi           %hi(call_method), %g2
@@ -257,6 +262,52 @@ do_unlock:
        stb             %g0, [%g2 + %lo(prom_entry_lock)]
        membar          #StoreStore | #StoreLoad
 
+       ba,pt           %xcc, after_lock_tlb
+        nop
+
+niagara_lock_tlb:
+       mov             HV_FAST_MMU_MAP_PERM_ADDR, %o5
+       sethi           %hi(KERNBASE), %o0
+       clr             %o1
+       sethi           %hi(kern_locked_tte_data), %o2
+       ldx             [%o2 + %lo(kern_locked_tte_data)], %o2
+       mov             HV_MMU_IMMU, %o3
+       ta              HV_FAST_TRAP
+
+       mov             HV_FAST_MMU_MAP_PERM_ADDR, %o5
+       sethi           %hi(KERNBASE), %o0
+       clr             %o1
+       sethi           %hi(kern_locked_tte_data), %o2
+       ldx             [%o2 + %lo(kern_locked_tte_data)], %o2
+       mov             HV_MMU_DMMU, %o3
+       ta              HV_FAST_TRAP
+
+       sethi           %hi(bigkernel), %g2
+       lduw            [%g2 + %lo(bigkernel)], %g2
+       brz,pt          %g2, after_lock_tlb
+        nop
+
+       mov             HV_FAST_MMU_MAP_PERM_ADDR, %o5
+       sethi           %hi(KERNBASE + 0x400000), %o0
+       clr             %o1
+       sethi           %hi(kern_locked_tte_data), %o2
+       ldx             [%o2 + %lo(kern_locked_tte_data)], %o2
+       sethi           %hi(0x400000), %o3
+       add             %o2, %o3, %o2
+       mov             HV_MMU_IMMU, %o3
+       ta              HV_FAST_TRAP
+
+       mov             HV_FAST_MMU_MAP_PERM_ADDR, %o5
+       sethi           %hi(KERNBASE + 0x400000), %o0
+       clr             %o1
+       sethi           %hi(kern_locked_tte_data), %o2
+       ldx             [%o2 + %lo(kern_locked_tte_data)], %o2
+       sethi           %hi(0x400000), %o3
+       add             %o2, %o3, %o2
+       mov             HV_MMU_DMMU, %o3
+       ta              HV_FAST_TRAP
+
+after_lock_tlb:
        mov             %l1, %sp
        flushw
 
@@ -272,10 +323,22 @@ do_unlock:
        wr              %g0, ASI_P, %asi
 
        mov             PRIMARY_CONTEXT, %g7
-       stxa            %g0, [%g7] ASI_DMMU
+
+661:   stxa            %g0, [%g7] ASI_DMMU
+       .section        .sun4v_1insn_patch, "ax"
+       .word           661b
+       stxa            %g0, [%g7] ASI_MMU
+       .previous
+
        membar          #Sync
        mov             SECONDARY_CONTEXT, %g7
-       stxa            %g0, [%g7] ASI_DMMU
+
+661:   stxa            %g0, [%g7] ASI_DMMU
+       .section        .sun4v_1insn_patch, "ax"
+       .word           661b
+       stxa            %g0, [%g7] ASI_MMU
+       .previous
+
        membar          #Sync
 
        mov             1, %g5
@@ -287,70 +350,75 @@ do_unlock:
        wrpr            %g0, 0, %wstate
        wrpr            %g0, 0, %tl
 
-       /* Setup the trap globals, then we can resurface. */
-       rdpr            %pstate, %o1
-       mov             %g6, %o2
-       wrpr            %o1, PSTATE_AG, %pstate
+       /* Load TBA, then we can resurface. */
        sethi           %hi(sparc64_ttable_tl0), %g5
        wrpr            %g5, %tba
-       mov             %o2, %g6
-
-       wrpr            %o1, PSTATE_MG, %pstate
-#define KERN_HIGHBITS          ((_PAGE_VALID|_PAGE_SZ4MB)^0xfffff80000000000)
-#define KERN_LOWBITS           (_PAGE_CP | _PAGE_CV | _PAGE_P | _PAGE_W)
 
-       mov             TSB_REG, %g1
-       stxa            %g0, [%g1] ASI_DMMU
-       membar          #Sync
-       mov             TLB_SFSR, %g1
-       sethi           %uhi(KERN_HIGHBITS), %g2
-       or              %g2, %ulo(KERN_HIGHBITS), %g2
-       sllx            %g2, 32, %g2
-       or              %g2, KERN_LOWBITS, %g2
+       ldx             [%g6 + TI_TASK], %g4
 
-       BRANCH_IF_ANY_CHEETAH(g3,g7,9f)
+       wrpr            %g0, 0, %wstate
 
-       ba,pt           %xcc, 1f
+       call            init_irqwork_curcpu
         nop
 
-9:
-       sethi           %uhi(VPTE_BASE_CHEETAH), %g3
-       or              %g3, %ulo(VPTE_BASE_CHEETAH), %g3
-       ba,pt           %xcc, 2f
-        sllx           %g3, 32, %g3
-1:
-       sethi           %uhi(VPTE_BASE_SPITFIRE), %g3
-       or              %g3, %ulo(VPTE_BASE_SPITFIRE), %g3
-       sllx            %g3, 32, %g3
-
-2:
-       clr     %g7
-#undef KERN_HIGHBITS
-#undef KERN_LOWBITS
-
-       wrpr            %o1, 0x0, %pstate
-       ldx             [%g6 + TI_TASK], %g4
+       sethi           %hi(tlb_type), %g3
+       lduw            [%g3 + %lo(tlb_type)], %g2
+       cmp             %g2, 3
+       bne,pt          %icc, 1f
+        nop
 
-       wrpr            %g0, 0, %wstate
+       call            sun4v_init_mondo_queues
+        mov            0, %o0
 
-       call            init_irqwork_curcpu
+1:     call            init_cur_cpu_trap
         nop
 
        /* Start using proper page size encodings in ctx register.  */
-       sethi   %hi(sparc64_kern_pri_context), %g3
-       ldx     [%g3 + %lo(sparc64_kern_pri_context)], %g2
-       mov     PRIMARY_CONTEXT, %g1
-       stxa    %g2, [%g1] ASI_DMMU
-       membar  #Sync
+       sethi           %hi(sparc64_kern_pri_context), %g3
+       ldx             [%g3 + %lo(sparc64_kern_pri_context)], %g2
+       mov             PRIMARY_CONTEXT, %g1
+
+661:   stxa            %g2, [%g1] ASI_DMMU
+       .section        .sun4v_1insn_patch, "ax"
+       .word           661b
+       stxa            %g2, [%g1] ASI_MMU
+       .previous
+
+       membar          #Sync
 
        rdpr            %pstate, %o1
        or              %o1, PSTATE_IE, %o1
        wrpr            %o1, 0, %pstate
 
-       call            prom_set_trap_table
+       sethi           %hi(is_sun4v), %o0
+       lduw            [%o0 + %lo(is_sun4v)], %o0
+       brz,pt          %o0, 1f
+        nop
+
+       TRAP_LOAD_TRAP_BLOCK(%g2, %g3)
+       add             %g2, TRAP_PER_CPU_FAULT_INFO, %g2
+       stxa            %g2, [%g0] ASI_SCRATCHPAD
+
+       /* Compute physical address:
+        *
+        * paddr = kern_base + (mmfsa_vaddr - KERNBASE)
+        */
+       sethi           %hi(KERNBASE), %g3
+       sub             %g2, %g3, %g2
+       sethi           %hi(kern_base), %g3
+       ldx             [%g3 + %lo(kern_base)], %g3
+       add             %g2, %g3, %o1
+
+       call            prom_set_trap_table_sun4v
+        sethi          %hi(sparc64_ttable_tl0), %o0
+
+       ba,pt           %xcc, 2f
+        nop
+
+1:     call            prom_set_trap_table
         sethi          %hi(sparc64_ttable_tl0), %o0
 
-       call            smp_callin
+2:     call            smp_callin
         nop
        call            cpu_idle
         mov            0, %o0