diff options
Diffstat (limited to 'arch/sparc64/mm/init.c')
-rw-r--r-- | arch/sparc64/mm/init.c | 24 |
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 | */ |
59 | unsigned long kpte_linear_bitmap[KPTE_BITMAP_BYTES / sizeof(unsigned long)]; | 59 | unsigned long kpte_linear_bitmap[KPTE_BITMAP_BYTES / sizeof(unsigned long)]; |
60 | 60 | ||
61 | /* A special kernel TSB for 4MB and 256MB linear mappings. */ | ||
62 | struct tsb swapper_4m_tsb[KERNEL_TSB4M_NENTRIES]; | ||
63 | |||
61 | #define MAX_BANKS 32 | 64 | #define MAX_BANKS 32 |
62 | 65 | ||
63 | static struct linux_prom64_registers pavail[MAX_BANKS] __initdata; | 66 | static 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 | ||
1125 | void __cpuinit sun4v_ktsb_register(void) | 1138 | void __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(); |