aboutsummaryrefslogtreecommitdiffstats
path: root/arch/sparc64/mm/init.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/sparc64/mm/init.c')
-rw-r--r--arch/sparc64/mm/init.c24
1 files changed, 19 insertions, 5 deletions
diff --git a/arch/sparc64/mm/init.c b/arch/sparc64/mm/init.c
index b5869f00d2d1..2a123135b042 100644
--- a/arch/sparc64/mm/init.c
+++ b/arch/sparc64/mm/init.c
@@ -58,6 +58,9 @@ unsigned long kern_linear_pte_xor[2] __read_mostly;
58 */ 58 */
59unsigned long kpte_linear_bitmap[KPTE_BITMAP_BYTES / sizeof(unsigned long)]; 59unsigned long kpte_linear_bitmap[KPTE_BITMAP_BYTES / sizeof(unsigned long)];
60 60
61/* A special kernel TSB for 4MB and 256MB linear mappings. */
62struct tsb swapper_4m_tsb[KERNEL_TSB4M_NENTRIES];
63
61#define MAX_BANKS 32 64#define MAX_BANKS 32
62 65
63static struct linux_prom64_registers pavail[MAX_BANKS] __initdata; 66static struct linux_prom64_registers pavail[MAX_BANKS] __initdata;
@@ -1086,6 +1089,7 @@ static void __init sun4v_ktsb_init(void)
1086{ 1089{
1087 unsigned long ktsb_pa; 1090 unsigned long ktsb_pa;
1088 1091
1092 /* First KTSB for PAGE_SIZE mappings. */
1089 ktsb_pa = kern_base + ((unsigned long)&swapper_tsb[0] - KERNBASE); 1093 ktsb_pa = kern_base + ((unsigned long)&swapper_tsb[0] - KERNBASE);
1090 1094
1091 switch (PAGE_SIZE) { 1095 switch (PAGE_SIZE) {
@@ -1117,9 +1121,18 @@ static void __init sun4v_ktsb_init(void)
1117 ktsb_descr[0].tsb_base = ktsb_pa; 1121 ktsb_descr[0].tsb_base = ktsb_pa;
1118 ktsb_descr[0].resv = 0; 1122 ktsb_descr[0].resv = 0;
1119 1123
1120 /* XXX When we have a kernel large page size TSB, describe 1124 /* Second KTSB for 4MB/256MB mappings. */
1121 * XXX it in ktsb_descr[1] here. 1125 ktsb_pa = (kern_base +
1122 */ 1126 ((unsigned long)&swapper_4m_tsb[0] - KERNBASE));
1127
1128 ktsb_descr[1].pgsz_idx = HV_PGSZ_IDX_4MB;
1129 ktsb_descr[1].pgsz_mask = (HV_PGSZ_MASK_4MB |
1130 HV_PGSZ_MASK_256MB);
1131 ktsb_descr[1].assoc = 1;
1132 ktsb_descr[1].num_ttes = KERNEL_TSB4M_NENTRIES;
1133 ktsb_descr[1].ctx_idx = 0;
1134 ktsb_descr[1].tsb_base = ktsb_pa;
1135 ktsb_descr[1].resv = 0;
1123} 1136}
1124 1137
1125void __cpuinit sun4v_ktsb_register(void) 1138void __cpuinit sun4v_ktsb_register(void)
@@ -1132,8 +1145,7 @@ void __cpuinit sun4v_ktsb_register(void)
1132 pa = kern_base + ((unsigned long)&ktsb_descr[0] - KERNBASE); 1145 pa = kern_base + ((unsigned long)&ktsb_descr[0] - KERNBASE);
1133 1146
1134 func = HV_FAST_MMU_TSB_CTX0; 1147 func = HV_FAST_MMU_TSB_CTX0;
1135 /* XXX set arg0 to 2 when we use ktsb_descr[1], see above XXX */ 1148 arg0 = 2;
1136 arg0 = 1;
1137 arg1 = pa; 1149 arg1 = pa;
1138 __asm__ __volatile__("ta %6" 1150 __asm__ __volatile__("ta %6"
1139 : "=&r" (func), "=&r" (arg0), "=&r" (arg1) 1151 : "=&r" (func), "=&r" (arg0), "=&r" (arg1)
@@ -1160,7 +1172,9 @@ void __init paging_init(void)
1160 kern_base = (prom_boot_mapping_phys_low >> 22UL) << 22UL; 1172 kern_base = (prom_boot_mapping_phys_low >> 22UL) << 22UL;
1161 kern_size = (unsigned long)&_end - (unsigned long)KERNBASE; 1173 kern_size = (unsigned long)&_end - (unsigned long)KERNBASE;
1162 1174
1175 /* Invalidate both kernel TSBs. */
1163 memset(swapper_tsb, 0x40, sizeof(swapper_tsb)); 1176 memset(swapper_tsb, 0x40, sizeof(swapper_tsb));
1177 memset(swapper_4m_tsb, 0x40, sizeof(swapper_4m_tsb));
1164 1178
1165 if (tlb_type == hypervisor) 1179 if (tlb_type == hypervisor)
1166 sun4v_pgprot_init(); 1180 sun4v_pgprot_init();