Commit 0835ae0f authored by David S. Miller's avatar David S. Miller

[SPARC64]: Replace cheetah+ code patching with variables.

Instead of code patching to handle the page size fields in
the context registers, just use variables from which we get
the proper values.
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent dd7205ed
...@@ -97,8 +97,8 @@ do_fpdis: ...@@ -97,8 +97,8 @@ do_fpdis:
faddd %f0, %f2, %f4 faddd %f0, %f2, %f4
fmuld %f0, %f2, %f6 fmuld %f0, %f2, %f6
ldxa [%g3] ASI_DMMU, %g5 ldxa [%g3] ASI_DMMU, %g5
cplus_fptrap_insn_1: sethi %hi(sparc64_kern_sec_context), %g2
sethi %hi(0), %g2 ldx [%g2 + %lo(sparc64_kern_sec_context)], %g2
stxa %g2, [%g3] ASI_DMMU stxa %g2, [%g3] ASI_DMMU
membar #Sync membar #Sync
add %g6, TI_FPREGS + 0xc0, %g2 add %g6, TI_FPREGS + 0xc0, %g2
...@@ -126,8 +126,8 @@ cplus_fptrap_insn_1: ...@@ -126,8 +126,8 @@ cplus_fptrap_insn_1:
fzero %f34 fzero %f34
ldxa [%g3] ASI_DMMU, %g5 ldxa [%g3] ASI_DMMU, %g5
add %g6, TI_FPREGS, %g1 add %g6, TI_FPREGS, %g1
cplus_fptrap_insn_2: sethi %hi(sparc64_kern_sec_context), %g2
sethi %hi(0), %g2 ldx [%g2 + %lo(sparc64_kern_sec_context)], %g2
stxa %g2, [%g3] ASI_DMMU stxa %g2, [%g3] ASI_DMMU
membar #Sync membar #Sync
add %g6, TI_FPREGS + 0x40, %g2 add %g6, TI_FPREGS + 0x40, %g2
...@@ -153,8 +153,8 @@ cplus_fptrap_insn_2: ...@@ -153,8 +153,8 @@ cplus_fptrap_insn_2:
3: mov SECONDARY_CONTEXT, %g3 3: mov SECONDARY_CONTEXT, %g3
add %g6, TI_FPREGS, %g1 add %g6, TI_FPREGS, %g1
ldxa [%g3] ASI_DMMU, %g5 ldxa [%g3] ASI_DMMU, %g5
cplus_fptrap_insn_3: sethi %hi(sparc64_kern_sec_context), %g2
sethi %hi(0), %g2 ldx [%g2 + %lo(sparc64_kern_sec_context)], %g2
stxa %g2, [%g3] ASI_DMMU stxa %g2, [%g3] ASI_DMMU
membar #Sync membar #Sync
mov 0x40, %g2 mov 0x40, %g2
...@@ -319,8 +319,8 @@ do_fptrap_after_fsr: ...@@ -319,8 +319,8 @@ do_fptrap_after_fsr:
stx %g3, [%g6 + TI_GSR] stx %g3, [%g6 + TI_GSR]
mov SECONDARY_CONTEXT, %g3 mov SECONDARY_CONTEXT, %g3
ldxa [%g3] ASI_DMMU, %g5 ldxa [%g3] ASI_DMMU, %g5
cplus_fptrap_insn_4: sethi %hi(sparc64_kern_sec_context), %g2
sethi %hi(0), %g2 ldx [%g2 + %lo(sparc64_kern_sec_context)], %g2
stxa %g2, [%g3] ASI_DMMU stxa %g2, [%g3] ASI_DMMU
membar #Sync membar #Sync
add %g6, TI_FPREGS, %g2 add %g6, TI_FPREGS, %g2
...@@ -341,33 +341,6 @@ cplus_fptrap_insn_4: ...@@ -341,33 +341,6 @@ cplus_fptrap_insn_4:
ba,pt %xcc, etrap ba,pt %xcc, etrap
wr %g0, 0, %fprs wr %g0, 0, %fprs
cplus_fptrap_1:
sethi %hi(CTX_CHEETAH_PLUS_CTX0), %g2
.globl cheetah_plus_patch_fpdis
cheetah_plus_patch_fpdis:
/* We configure the dTLB512_0 for 4MB pages and the
* dTLB512_1 for 8K pages when in context zero.
*/
sethi %hi(cplus_fptrap_1), %o0
lduw [%o0 + %lo(cplus_fptrap_1)], %o1
set cplus_fptrap_insn_1, %o2
stw %o1, [%o2]
flush %o2
set cplus_fptrap_insn_2, %o2
stw %o1, [%o2]
flush %o2
set cplus_fptrap_insn_3, %o2
stw %o1, [%o2]
flush %o2
set cplus_fptrap_insn_4, %o2
stw %o1, [%o2]
flush %o2
retl
nop
/* The registers for cross calls will be: /* The registers for cross calls will be:
* *
* DATA 0: [low 32-bits] Address of function to call, jmp to this * DATA 0: [low 32-bits] Address of function to call, jmp to this
......
...@@ -68,12 +68,8 @@ etrap_irq: ...@@ -68,12 +68,8 @@ etrap_irq:
wrpr %g3, 0, %otherwin wrpr %g3, 0, %otherwin
wrpr %g2, 0, %wstate wrpr %g2, 0, %wstate
cplus_etrap_insn_1: sethi %hi(sparc64_kern_pri_context), %g2
sethi %hi(0), %g3 ldx [%g2 + %lo(sparc64_kern_pri_context)], %g3
sllx %g3, 32, %g3
cplus_etrap_insn_2:
sethi %hi(0), %g2
or %g3, %g2, %g3
stxa %g3, [%l4] ASI_DMMU stxa %g3, [%l4] ASI_DMMU
flush %l6 flush %l6
wr %g0, ASI_AIUS, %asi wr %g0, ASI_AIUS, %asi
...@@ -215,12 +211,8 @@ scetrap: rdpr %pil, %g2 ...@@ -215,12 +211,8 @@ scetrap: rdpr %pil, %g2
mov PRIMARY_CONTEXT, %l4 mov PRIMARY_CONTEXT, %l4
wrpr %g3, 0, %otherwin wrpr %g3, 0, %otherwin
wrpr %g2, 0, %wstate wrpr %g2, 0, %wstate
cplus_etrap_insn_3: sethi %hi(sparc64_kern_pri_context), %g2
sethi %hi(0), %g3 ldx [%g2 + %lo(sparc64_kern_pri_context)], %g3
sllx %g3, 32, %g3
cplus_etrap_insn_4:
sethi %hi(0), %g2
or %g3, %g2, %g3
stxa %g3, [%l4] ASI_DMMU stxa %g3, [%l4] ASI_DMMU
flush %l6 flush %l6
...@@ -264,38 +256,3 @@ cplus_etrap_insn_4: ...@@ -264,38 +256,3 @@ cplus_etrap_insn_4:
#undef TASK_REGOFF #undef TASK_REGOFF
#undef ETRAP_PSTATE1 #undef ETRAP_PSTATE1
cplus_einsn_1:
sethi %uhi(CTX_CHEETAH_PLUS_NUC), %g3
cplus_einsn_2:
sethi %hi(CTX_CHEETAH_PLUS_CTX0), %g2
.globl cheetah_plus_patch_etrap
cheetah_plus_patch_etrap:
/* We configure the dTLB512_0 for 4MB pages and the
* dTLB512_1 for 8K pages when in context zero.
*/
sethi %hi(cplus_einsn_1), %o0
sethi %hi(cplus_etrap_insn_1), %o2
lduw [%o0 + %lo(cplus_einsn_1)], %o1
or %o2, %lo(cplus_etrap_insn_1), %o2
stw %o1, [%o2]
flush %o2
sethi %hi(cplus_etrap_insn_3), %o2
or %o2, %lo(cplus_etrap_insn_3), %o2
stw %o1, [%o2]
flush %o2
sethi %hi(cplus_einsn_2), %o0
sethi %hi(cplus_etrap_insn_2), %o2
lduw [%o0 + %lo(cplus_einsn_2)], %o1
or %o2, %lo(cplus_etrap_insn_2), %o2
stw %o1, [%o2]
flush %o2
sethi %hi(cplus_etrap_insn_4), %o2
or %o2, %lo(cplus_etrap_insn_4), %o2
stw %o1, [%o2]
flush %o2
retl
nop
...@@ -325,23 +325,7 @@ cheetah_tlb_fixup: ...@@ -325,23 +325,7 @@ cheetah_tlb_fixup:
1: sethi %hi(tlb_type), %g1 1: sethi %hi(tlb_type), %g1
stw %g2, [%g1 + %lo(tlb_type)] stw %g2, [%g1 + %lo(tlb_type)]
BRANCH_IF_CHEETAH_PLUS_OR_FOLLOWON(g1,g7,1f) /* Patch copy/page operations to cheetah optimized versions. */
ba,pt %xcc, 2f
nop
1: /* Patch context register writes to support nucleus page
* size correctly.
*/
call cheetah_plus_patch_etrap
nop
call cheetah_plus_patch_rtrap
nop
call cheetah_plus_patch_fpdis
nop
call cheetah_plus_patch_winfixup
nop
2: /* Patch copy/page operations to cheetah optimized versions. */
call cheetah_patch_copyops call cheetah_patch_copyops
nop nop
call cheetah_patch_copy_page call cheetah_patch_copy_page
...@@ -484,20 +468,13 @@ spitfire_vpte_base: ...@@ -484,20 +468,13 @@ spitfire_vpte_base:
call prom_set_trap_table call prom_set_trap_table
sethi %hi(sparc64_ttable_tl0), %o0 sethi %hi(sparc64_ttable_tl0), %o0
BRANCH_IF_CHEETAH_PLUS_OR_FOLLOWON(g2,g3,1f) /* Start using proper page size encodings in ctx register. */
ba,pt %xcc, 2f sethi %hi(sparc64_kern_pri_context), %g3
nop ldx [%g3 + %lo(sparc64_kern_pri_context)], %g2
1: /* Start using proper page size encodings in ctx register. */
sethi %uhi(CTX_CHEETAH_PLUS_NUC), %g3
mov PRIMARY_CONTEXT, %g1 mov PRIMARY_CONTEXT, %g1
sllx %g3, 32, %g3 stxa %g2, [%g1] ASI_DMMU
sethi %hi(CTX_CHEETAH_PLUS_CTX0), %g2
or %g3, %g2, %g3
stxa %g3, [%g1] ASI_DMMU
membar #Sync membar #Sync
2:
rdpr %pstate, %o1 rdpr %pstate, %o1
or %o1, PSTATE_IE, %o1 or %o1, PSTATE_IE, %o1
wrpr %o1, 0, %pstate wrpr %o1, 0, %pstate
......
...@@ -256,9 +256,8 @@ rt_continue: ldx [%sp + PTREGS_OFF + PT_V9_G1], %g1 ...@@ -256,9 +256,8 @@ rt_continue: ldx [%sp + PTREGS_OFF + PT_V9_G1], %g1
brnz,pn %l3, kern_rtt brnz,pn %l3, kern_rtt
mov PRIMARY_CONTEXT, %l7 mov PRIMARY_CONTEXT, %l7
ldxa [%l7 + %l7] ASI_DMMU, %l0 ldxa [%l7 + %l7] ASI_DMMU, %l0
cplus_rtrap_insn_1: sethi %hi(sparc64_kern_pri_nuc_bits), %l1
sethi %hi(0), %l1 ldx [%l1 + %lo(sparc64_kern_pri_nuc_bits)], %l1
sllx %l1, 32, %l1
or %l0, %l1, %l0 or %l0, %l1, %l0
stxa %l0, [%l7] ASI_DMMU stxa %l0, [%l7] ASI_DMMU
flush %g6 flush %g6
...@@ -345,21 +344,3 @@ kern_fpucheck: ldub [%g6 + TI_FPDEPTH], %l5 ...@@ -345,21 +344,3 @@ kern_fpucheck: ldub [%g6 + TI_FPDEPTH], %l5
wr %g0, FPRS_DU, %fprs wr %g0, FPRS_DU, %fprs
ba,pt %xcc, rt_continue ba,pt %xcc, rt_continue
stb %l5, [%g6 + TI_FPDEPTH] stb %l5, [%g6 + TI_FPDEPTH]
cplus_rinsn_1:
sethi %uhi(CTX_CHEETAH_PLUS_NUC), %l1
.globl cheetah_plus_patch_rtrap
cheetah_plus_patch_rtrap:
/* We configure the dTLB512_0 for 4MB pages and the
* dTLB512_1 for 8K pages when in context zero.
*/
sethi %hi(cplus_rinsn_1), %o0
sethi %hi(cplus_rtrap_insn_1), %o2
lduw [%o0 + %lo(cplus_rinsn_1)], %o1
or %o2, %lo(cplus_rtrap_insn_1), %o2
stw %o1, [%o2]
flush %o2
retl
nop
...@@ -187,17 +187,13 @@ int prom_callback(long *args) ...@@ -187,17 +187,13 @@ int prom_callback(long *args)
} }
if ((va >= KERNBASE) && (va < (KERNBASE + (4 * 1024 * 1024)))) { if ((va >= KERNBASE) && (va < (KERNBASE + (4 * 1024 * 1024)))) {
unsigned long kernel_pctx = 0; extern unsigned long sparc64_kern_pri_context;
if (tlb_type == cheetah_plus)
kernel_pctx |= (CTX_CHEETAH_PLUS_NUC |
CTX_CHEETAH_PLUS_CTX0);
/* Spitfire Errata #32 workaround */ /* Spitfire Errata #32 workaround */
__asm__ __volatile__("stxa %0, [%1] %2\n\t" __asm__ __volatile__("stxa %0, [%1] %2\n\t"
"flush %%g6" "flush %%g6"
: /* No outputs */ : /* No outputs */
: "r" (kernel_pctx), : "r" (sparc64_kern_pri_context),
"r" (PRIMARY_CONTEXT), "r" (PRIMARY_CONTEXT),
"i" (ASI_DMMU)); "i" (ASI_DMMU));
......
...@@ -336,20 +336,13 @@ do_unlock: ...@@ -336,20 +336,13 @@ do_unlock:
call init_irqwork_curcpu call init_irqwork_curcpu
nop nop
BRANCH_IF_CHEETAH_PLUS_OR_FOLLOWON(g2,g3,1f) /* Start using proper page size encodings in ctx register. */
ba,pt %xcc, 2f sethi %hi(sparc64_kern_pri_context), %g3
nop ldx [%g3 + %lo(sparc64_kern_pri_context)], %g2
1: /* Start using proper page size encodings in ctx register. */
sethi %uhi(CTX_CHEETAH_PLUS_NUC), %g3
mov PRIMARY_CONTEXT, %g1 mov PRIMARY_CONTEXT, %g1
sllx %g3, 32, %g3 stxa %g2, [%g1] ASI_DMMU
sethi %hi(CTX_CHEETAH_PLUS_CTX0), %g2
or %g3, %g2, %g3
stxa %g3, [%g1] ASI_DMMU
membar #Sync membar #Sync
2:
rdpr %pstate, %o1 rdpr %pstate, %o1
or %o1, PSTATE_IE, %o1 or %o1, PSTATE_IE, %o1
wrpr %o1, 0, %pstate wrpr %o1, 0, %pstate
......
...@@ -16,23 +16,14 @@ ...@@ -16,23 +16,14 @@
.text .text
set_pcontext: set_pcontext:
cplus_winfixup_insn_1: sethi %hi(sparc64_kern_pri_context), %l1
sethi %hi(0), %l1 ldx [%l1 + %lo(sparc64_kern_pri_context)], %l1
mov PRIMARY_CONTEXT, %g1 mov PRIMARY_CONTEXT, %g1
sllx %l1, 32, %l1
cplus_winfixup_insn_2:
sethi %hi(0), %g2
or %l1, %g2, %l1
stxa %l1, [%g1] ASI_DMMU stxa %l1, [%g1] ASI_DMMU
flush %g6 flush %g6
retl retl
nop nop
cplus_wfinsn_1:
sethi %uhi(CTX_CHEETAH_PLUS_NUC), %l1
cplus_wfinsn_2:
sethi %hi(CTX_CHEETAH_PLUS_CTX0), %g2
.align 32 .align 32
/* Here are the rules, pay attention. /* Here are the rules, pay attention.
...@@ -395,23 +386,3 @@ window_dax_from_user_common: ...@@ -395,23 +386,3 @@ window_dax_from_user_common:
add %sp, PTREGS_OFF, %o0 add %sp, PTREGS_OFF, %o0
ba,pt %xcc, rtrap ba,pt %xcc, rtrap
clr %l6 clr %l6
.globl cheetah_plus_patch_winfixup
cheetah_plus_patch_winfixup:
sethi %hi(cplus_wfinsn_1), %o0
sethi %hi(cplus_winfixup_insn_1), %o2
lduw [%o0 + %lo(cplus_wfinsn_1)], %o1
or %o2, %lo(cplus_winfixup_insn_1), %o2
stw %o1, [%o2]
flush %o2
sethi %hi(cplus_wfinsn_2), %o0
sethi %hi(cplus_winfixup_insn_2), %o2
lduw [%o0 + %lo(cplus_wfinsn_2)], %o1
or %o2, %lo(cplus_winfixup_insn_2), %o2
stw %o1, [%o2]
flush %o2
retl
nop
...@@ -133,6 +133,12 @@ extern unsigned int sparc_ramdisk_size; ...@@ -133,6 +133,12 @@ extern unsigned int sparc_ramdisk_size;
struct page *mem_map_zero __read_mostly; struct page *mem_map_zero __read_mostly;
unsigned int sparc64_highest_unlocked_tlb_ent __read_mostly;
unsigned long sparc64_kern_pri_context __read_mostly;
unsigned long sparc64_kern_pri_nuc_bits __read_mostly;
unsigned long sparc64_kern_sec_context __read_mostly;
int bigkernel = 0; int bigkernel = 0;
/* XXX Tune this... */ /* XXX Tune this... */
...@@ -582,13 +588,21 @@ static void __init remap_kernel(void) ...@@ -582,13 +588,21 @@ static void __init remap_kernel(void)
prom_dtlb_load(tlb_ent, tte_data, tte_vaddr); prom_dtlb_load(tlb_ent, tte_data, tte_vaddr);
prom_itlb_load(tlb_ent, tte_data, tte_vaddr); prom_itlb_load(tlb_ent, tte_data, tte_vaddr);
if (bigkernel) { if (bigkernel) {
prom_dtlb_load(tlb_ent - 1, tlb_ent -= 1;
prom_dtlb_load(tlb_ent,
tte_data + 0x400000, tte_data + 0x400000,
tte_vaddr + 0x400000); tte_vaddr + 0x400000);
prom_itlb_load(tlb_ent - 1, prom_itlb_load(tlb_ent,
tte_data + 0x400000, tte_data + 0x400000,
tte_vaddr + 0x400000); tte_vaddr + 0x400000);
} }
sparc64_highest_unlocked_tlb_ent = tlb_ent - 1;
if (tlb_type == cheetah_plus) {
sparc64_kern_pri_context = (CTX_CHEETAH_PLUS_CTX0 |
CTX_CHEETAH_PLUS_NUC);
sparc64_kern_pri_nuc_bits = CTX_CHEETAH_PLUS_NUC;
sparc64_kern_sec_context = CTX_CHEETAH_PLUS_CTX0;
}
} }
static void __init inherit_prom_mappings(void) static void __init inherit_prom_mappings(void)
...@@ -788,8 +802,8 @@ void inherit_locked_prom_mappings(int save_p) ...@@ -788,8 +802,8 @@ void inherit_locked_prom_mappings(int save_p)
} }
} }
if (tlb_type == spitfire) { if (tlb_type == spitfire) {
int high = SPITFIRE_HIGHEST_LOCKED_TLBENT - bigkernel; int high = sparc64_highest_unlocked_tlb_ent;
for (i = 0; i < high; i++) { for (i = 0; i <= high; i++) {
unsigned long data; unsigned long data;
/* Spitfire Errata #32 workaround */ /* Spitfire Errata #32 workaround */
...@@ -877,9 +891,9 @@ void inherit_locked_prom_mappings(int save_p) ...@@ -877,9 +891,9 @@ void inherit_locked_prom_mappings(int save_p)
} }
} }
} else if (tlb_type == cheetah || tlb_type == cheetah_plus) { } else if (tlb_type == cheetah || tlb_type == cheetah_plus) {
int high = CHEETAH_HIGHEST_LOCKED_TLBENT - bigkernel; int high = sparc64_highest_unlocked_tlb_ent;
for (i = 0; i < high; i++) { for (i = 0; i <= high; i++) {
unsigned long data; unsigned long data;
data = cheetah_get_ldtlb_data(i); data = cheetah_get_ldtlb_data(i);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment