25 #include <linux/errno.h>
26 #include <linux/sched.h>
28 #include <linux/stat.h>
29 #include <linux/sysctl.h>
30 #include <linux/export.h>
31 #include <linux/ctype.h>
34 #include <linux/signal.h>
37 #include <asm/processor.h>
38 #include <asm/pgtable.h>
40 #include <asm/mmu_context.h>
42 #include <asm/types.h>
43 #include <asm/uaccess.h>
44 #include <asm/machdep.h>
46 #include <asm/tlbflush.h>
50 #include <asm/cacheflush.h>
51 #include <asm/cputable.h>
52 #include <asm/sections.h>
60 #define DBG(fmt...) udbg_printf(fmt)
66 #define DBG_LOW(fmt...) udbg_printf(fmt)
68 #define DBG_LOW(fmt...)
91 static unsigned long _SDR1;
101 #ifdef CONFIG_SPARSEMEM_VMEMMAP
109 #ifdef CONFIG_PPC_64K_PAGES
112 #ifdef CONFIG_DEBUG_PAGEALLOC
113 static u8 *linear_map_hash_slots;
114 static unsigned long linear_map_hash_count;
155 static unsigned long htab_convert_pte_flags(
unsigned long pteflags)
157 unsigned long rflags = pteflags & 0x1fa;
175 unsigned long pstart,
unsigned long prot,
176 int psize,
int ssize)
185 prot = htab_convert_pte_flags(prot);
187 DBG(
"htab_bolt_mapping(%lx..%lx -> %lx (%lx,%d,%d)\n",
188 vstart, vend, pstart, prot, psize, ssize);
190 for (vaddr = vstart, paddr = pstart; vaddr <
vend;
192 unsigned long hash, hpteg;
193 unsigned long vsid = get_kernel_vsid(vaddr, ssize);
194 unsigned long vpn = hpt_vpn(vaddr, vsid, ssize);
195 unsigned long tprot = prot;
198 if (overlaps_kernel_text(vaddr, vaddr + step))
201 hash = hpt_hash(vpn, shift, ssize);
205 ret =
ppc_md.hpte_insert(hpteg, vpn, paddr, tprot,
210 #ifdef CONFIG_DEBUG_PAGEALLOC
211 if ((paddr >>
PAGE_SHIFT) < linear_map_hash_count)
212 linear_map_hash_slots[paddr >>
PAGE_SHIFT] = ret | 0x80;
215 return ret < 0 ? ret : 0;
218 #ifdef CONFIG_MEMORY_HOTPLUG
219 static int htab_remove_mapping(
unsigned long vstart,
unsigned long vend,
220 int psize,
int ssize)
228 if (!
ppc_md.hpte_removebolted) {
230 "hpte_removebolted\n");
234 for (vaddr = vstart; vaddr <
vend; vaddr +=
step)
235 ppc_md.hpte_removebolted(vaddr, psize, ssize);
241 static int __init htab_dt_scan_seg_sizes(
unsigned long node,
242 const char *uname,
int depth,
245 char *
type = of_get_flat_dt_prop(node,
"device_type",
NULL);
247 unsigned long size = 0;
253 prop = (
u32 *)of_get_flat_dt_prop(node,
"ibm,processor-segment-sizes",
257 for (; size >= 4; size -= 4, ++prop) {
259 DBG(
"1T segment support detected\n");
268 static void __init htab_init_seg_sizes(
void)
270 of_scan_flat_dt(htab_dt_scan_seg_sizes,
NULL);
273 static int __init htab_dt_scan_page_sizes(
unsigned long node,
274 const char *uname,
int depth,
277 char *type = of_get_flat_dt_prop(node,
"device_type",
NULL);
279 unsigned long size = 0;
285 prop = (
u32 *)of_get_flat_dt_prop(node,
286 "ibm,segment-page-sizes", &size);
288 DBG(
"Page sizes from device-tree:\n");
292 unsigned int shift = prop[0];
293 unsigned int slbenc = prop[1];
294 unsigned int lpnum = prop[2];
295 unsigned int lpenc = 0;
299 size -= 3; prop += 3;
300 while(size > 0 && lpnum) {
301 if (prop[0] == shift)
303 prop += 2; size -= 2;
331 def->
avpnm = (1 << (shift - 23)) - 1;
337 if (idx == MMU_PAGE_4K || idx == MMU_PAGE_64K)
342 DBG(
" %d: shift=%02x, sllp=%04lx, avpnm=%08lx, "
343 "tlbiel=%d, penc=%d\n",
352 #ifdef CONFIG_HUGETLB_PAGE
356 static int __init htab_dt_scan_hugepage_blocks(
unsigned long node,
357 const char *uname,
int depth,
359 char *type = of_get_flat_dt_prop(node,
"device_type",
NULL);
360 unsigned long *addr_prop;
361 u32 *page_count_prop;
362 unsigned int expected_pages;
367 if (type ==
NULL ||
strcmp(type,
"memory") != 0)
372 page_count_prop = of_get_flat_dt_prop(node,
"ibm,expected#pages",
NULL);
373 if (page_count_prop ==
NULL)
375 expected_pages = (1 << page_count_prop[0]);
376 addr_prop = of_get_flat_dt_prop(node,
"reg",
NULL);
377 if (addr_prop ==
NULL)
379 phys_addr = addr_prop[0];
380 block_size = addr_prop[1];
381 if (block_size != (16 *
GB))
384 "addr = 0x%lX size = 0x%lX pages = %d\n",
385 phys_addr, block_size, expected_pages);
388 add_gpage(phys_addr, block_size, expected_pages);
394 static void __init htab_init_page_sizes(
void)
400 sizeof(mmu_psize_defaults_old));
405 rc = of_scan_flat_dt(htab_dt_scan_page_sizes,
NULL);
413 if (mmu_has_feature(MMU_FTR_16M_PAGE))
415 sizeof(mmu_psize_defaults_gp));
417 #ifndef CONFIG_DEBUG_PAGEALLOC
428 #ifdef CONFIG_PPC_64K_PAGES
443 if (mmu_has_feature(MMU_FTR_CI_LARGE_PAGE)) {
448 if (!machine_is(pseries))
455 #ifdef CONFIG_SPARSEMEM_VMEMMAP
469 "virtual = %d, io = %d"
470 #ifdef CONFIG_SPARSEMEM_VMEMMAP
477 #ifdef CONFIG_SPARSEMEM_VMEMMAP
482 #ifdef CONFIG_HUGETLB_PAGE
484 of_scan_flat_dt(htab_dt_scan_hugepage_blocks,
NULL);
488 static int __init htab_dt_scan_pftsize(
unsigned long node,
489 const char *uname,
int depth,
492 char *type = of_get_flat_dt_prop(node,
"device_type",
NULL);
499 prop = (
u32 *)of_get_flat_dt_prop(node,
"ibm,pft-size",
NULL);
508 static unsigned long __init htab_get_table_size(
void)
510 unsigned long mem_size, rnd_mem_size, pteg_count, psize;
517 of_scan_flat_dt(htab_dt_scan_pftsize,
NULL);
523 rnd_mem_size = 1
UL << __ilog2(mem_size);
524 if (rnd_mem_size < mem_size)
529 pteg_count =
max(rnd_mem_size >> (psize + 1), 1
UL << 11);
531 return pteg_count << 7;
534 #ifdef CONFIG_MEMORY_HOTPLUG
535 int create_section_mapping(
unsigned long start,
unsigned long end)
542 int remove_section_mapping(
unsigned long start,
unsigned long end)
549 #define FUNCTION_TEXT(A) ((*(unsigned long *)(A)))
551 static void __init htab_finish_init(
void)
553 extern unsigned int *htab_call_hpte_insert1;
554 extern unsigned int *htab_call_hpte_insert2;
555 extern unsigned int *htab_call_hpte_remove;
556 extern unsigned int *htab_call_hpte_updatepp;
558 #ifdef CONFIG_PPC_HAS_HASH_64K
559 extern unsigned int *ht64_call_hpte_insert1;
560 extern unsigned int *ht64_call_hpte_insert2;
561 extern unsigned int *ht64_call_hpte_remove;
562 extern unsigned int *ht64_call_hpte_updatepp;
593 static void __init htab_initialize(
void)
596 unsigned long pteg_count;
599 struct memblock_region *
reg;
601 DBG(
" -> htab_initialize()\n");
604 htab_init_seg_sizes();
607 htab_init_page_sizes();
609 if (mmu_has_feature(MMU_FTR_1T_SEGMENT)) {
624 if (firmware_has_feature(FW_FEATURE_LPAR)) {
628 #ifdef CONFIG_FA_DUMP
643 if (machine_is(cell))
646 limit = MEMBLOCK_ALLOC_ANYWHERE;
650 DBG(
"Hash table allocated at %lx, size: %lx\n", table,
653 htab_address =
__va(table);
656 _SDR1 = table + __ilog2(pteg_count) - 11;
667 #ifdef CONFIG_DEBUG_PAGEALLOC
671 memset(linear_map_hash_slots, 0, linear_map_hash_count);
680 for_each_memblock(
memory, reg) {
681 base = (
unsigned long)
__va(reg->base);
684 DBG(
"creating mapping for region: %lx..%lx (prot: %lx)\n",
687 #ifdef CONFIG_U3_DART
705 if ((base + size) > dart_table_end)
708 __pa(dart_table_end),
727 if (tce_alloc_start) {
731 if (base + size >= tce_alloc_start)
735 __pa(tce_alloc_start), prot,
741 DBG(
" <- htab_initialize()\n");
750 get_paca()->stab_addr = (
u64)&initial_stab;
759 if (mmu_has_feature(MMU_FTR_SLB))
764 void __cpuinit early_init_mmu_secondary(
void)
767 if (!firmware_has_feature(FW_FEATURE_LPAR))
773 if (mmu_has_feature(MMU_FTR_SLB))
803 #ifdef CONFIG_PPC_MM_SLICES
807 unsigned char *hpsizes;
808 unsigned long index, mask_index;
810 if (addr < SLICE_LOW_TOP) {
811 lpsizes = get_paca()->context.low_slices_psize;
812 index = GET_LOW_SLICE_INDEX(addr);
813 return (lpsizes >> (index * 4)) & 0xF;
815 hpsizes = get_paca()->context.high_slices_psize;
816 index = GET_HIGH_SLICE_INDEX(addr);
817 mask_index = index & 0x1;
818 return (hpsizes[index >> 1] >> (mask_index * 4)) & 0xF;
824 return get_paca()->context.user_psize;
832 #ifdef CONFIG_PPC_64K_PAGES
838 #ifdef CONFIG_SPU_BASE
842 get_paca()->context = mm->
context;
848 #ifdef CONFIG_PPC_SUBPAGE_PROT
856 static int subpage_protection(
struct mm_struct *mm,
unsigned long ea)
858 struct subpage_prot_table *spt = &mm->
context.spt;
862 if (ea >= spt->maxaddr)
864 if (ea < 0x100000000) {
866 sbpm = spt->low_prot;
868 sbpm = spt->protptrs[ea >> SBP_L3_SHIFT];
872 sbpp = sbpm[(ea >> SBP_L2_SHIFT) & (SBP_L2_COUNT - 1)];
875 spp = sbpp[(ea >>
PAGE_SHIFT) & (SBP_L1_COUNT - 1)];
878 spp >>= 30 - 2 * ((ea >> 12) & 0xf);
881 spp = ((spp & 2) ? _PAGE_USER : 0) | ((spp & 1) ? _PAGE_RW : 0);
886 static inline int subpage_protection(
struct mm_struct *mm,
unsigned long ea)
893 unsigned long vsid,
unsigned long trap,
894 int ssize,
int psize,
unsigned long pte)
896 if (!printk_ratelimit())
898 pr_info(
"mm: Hashing failure ! EA=0x%lx access=0x%lx current=%s\n",
900 pr_info(
" trap=0x%lx vsid=0x%lx ssize=%d psize=%d pte=0x%lx\n",
901 trap, vsid, ssize, psize, pte);
918 int rc, user_region = 0, local = 0;
921 DBG_LOW(
"hash_page(ea=%016lx, access=%lx, trap=%lx\n",
925 DBG_LOW(
" out of pgtable range !\n");
935 DBG_LOW(
" user region with no mm !\n");
939 ssize = user_segment_size(ea);
940 vsid = get_vsid(mm->
context.
id, ea, ssize);
957 DBG_LOW(
" mm=%p, mm->pgdir=%p, vsid=%016lx\n", mm, mm->
pgd, vsid);
966 if (user_region && cpumask_equal(mm_cpumask(mm), tmp))
969 #ifndef CONFIG_PPC_64K_PAGES
977 if (psize != MMU_PAGE_4K)
994 if (access & ~
pte_val(*ptep)) {
999 #ifdef CONFIG_HUGETLB_PAGE
1002 ssize, hugeshift, psize);
1005 #ifndef CONFIG_PPC_64K_PAGES
1012 #ifdef CONFIG_PPC_64K_PAGES
1016 psize = MMU_PAGE_4K;
1026 psize = MMU_PAGE_4K;
1034 "to 4kB pages because of "
1035 "non-cacheable mapping\n");
1037 #ifdef CONFIG_SPU_BASE
1044 get_paca()->context = mm->
context;
1047 }
else if (get_paca()->vmalloc_sllp !=
1049 get_paca()->vmalloc_sllp =
1055 #ifdef CONFIG_PPC_HAS_HASH_64K
1056 if (psize == MMU_PAGE_64K)
1061 int spp = subpage_protection(mm, ea);
1075 #ifndef CONFIG_PPC_64K_PAGES
1092 unsigned long flags;
1093 int rc, ssize, local = 0;
1097 #ifdef CONFIG_PPC_MM_SLICES
1103 DBG_LOW(
"hash_preload(mm=%p, mm->pgdir=%p, ea=%016lx, access=%lx,"
1104 " trap=%lx\n", mm, mm->
pgd, ea, access, trap);
1110 ptep = find_linux_pte(pgdir, ea);
1114 #ifdef CONFIG_PPC_64K_PAGES
1126 ssize = user_segment_size(ea);
1127 vsid = get_vsid(mm->
context.
id, ea, ssize);
1137 #ifdef CONFIG_PPC_HAS_HASH_64K
1143 subpage_protection(mm, ea));
1163 DBG_LOW(
"flush_hash_page(vpn=%016lx)\n", vpn);
1165 hash = hpt_hash(vpn, shift, ssize);
1167 if (hidx & _PTEIDX_SECONDARY)
1170 slot += hidx & _PTEIDX_GROUP_IX;
1171 DBG_LOW(
" sub %ld: hash=%lx, hidx=%lx\n", index, slot, hidx);
1172 ppc_md.hpte_invalidate(slot, vpn, psize, ssize, local);
1178 if (
ppc_md.flush_hash_range)
1179 ppc_md.flush_hash_range(number, local);
1182 struct ppc64_tlb_batch *batch =
1185 for (i = 0; i < number; i++)
1187 batch->psize, batch->ssize, local);
1198 #ifdef CONFIG_PPC_SUBPAGE_PROT
1208 #ifdef CONFIG_DEBUG_PAGEALLOC
1209 static void kernel_map_linear_page(
unsigned long vaddr,
unsigned long lmi)
1211 unsigned long hash, hpteg;
1214 unsigned long mode = htab_convert_pte_flags(PAGE_KERNEL);
1220 ret =
ppc_md.hpte_insert(hpteg, vpn,
__pa(vaddr),
1224 spin_lock(&linear_map_hash_lock);
1225 BUG_ON(linear_map_hash_slots[lmi] & 0x80);
1226 linear_map_hash_slots[lmi] = ret | 0x80;
1227 spin_unlock(&linear_map_hash_lock);
1230 static void kernel_unmap_linear_page(
unsigned long vaddr,
unsigned long lmi)
1237 spin_lock(&linear_map_hash_lock);
1238 BUG_ON(!(linear_map_hash_slots[lmi] & 0x80));
1239 hidx = linear_map_hash_slots[lmi] & 0x7f;
1240 linear_map_hash_slots[lmi] = 0;
1241 spin_unlock(&linear_map_hash_lock);
1242 if (hidx & _PTEIDX_SECONDARY)
1245 slot += hidx & _PTEIDX_GROUP_IX;
1255 for (i = 0; i < numpages; i++, page++) {
1258 if (lmi >= linear_map_hash_count)
1261 kernel_map_linear_page(vaddr, lmi);
1263 kernel_unmap_linear_page(vaddr, lmi);
1275 BUG_ON(first_memblock_base != 0);
1283 ppc64_rma_size =
min_t(
u64, first_memblock_size, 0x40000000);