|
|
@@ -334,70 +334,69 @@ static int __init htab_dt_scan_page_sizes(unsigned long node,
|
|
|
return 0;
|
|
|
|
|
|
prop = of_get_flat_dt_prop(node, "ibm,segment-page-sizes", &size);
|
|
|
- if (prop != NULL) {
|
|
|
- pr_info("Page sizes from device-tree:\n");
|
|
|
- size /= 4;
|
|
|
- cur_cpu_spec->mmu_features &= ~(MMU_FTR_16M_PAGE);
|
|
|
- while(size > 0) {
|
|
|
- unsigned int base_shift = be32_to_cpu(prop[0]);
|
|
|
- unsigned int slbenc = be32_to_cpu(prop[1]);
|
|
|
- unsigned int lpnum = be32_to_cpu(prop[2]);
|
|
|
- struct mmu_psize_def *def;
|
|
|
- int idx, base_idx;
|
|
|
-
|
|
|
- size -= 3; prop += 3;
|
|
|
- base_idx = get_idx_from_shift(base_shift);
|
|
|
- if (base_idx < 0) {
|
|
|
- /*
|
|
|
- * skip the pte encoding also
|
|
|
- */
|
|
|
- prop += lpnum * 2; size -= lpnum * 2;
|
|
|
+ if (!prop)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ pr_info("Page sizes from device-tree:\n");
|
|
|
+ size /= 4;
|
|
|
+ cur_cpu_spec->mmu_features &= ~(MMU_FTR_16M_PAGE);
|
|
|
+ while(size > 0) {
|
|
|
+ unsigned int base_shift = be32_to_cpu(prop[0]);
|
|
|
+ unsigned int slbenc = be32_to_cpu(prop[1]);
|
|
|
+ unsigned int lpnum = be32_to_cpu(prop[2]);
|
|
|
+ struct mmu_psize_def *def;
|
|
|
+ int idx, base_idx;
|
|
|
+
|
|
|
+ size -= 3; prop += 3;
|
|
|
+ base_idx = get_idx_from_shift(base_shift);
|
|
|
+ if (base_idx < 0) {
|
|
|
+ /* skip the pte encoding also */
|
|
|
+ prop += lpnum * 2; size -= lpnum * 2;
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ def = &mmu_psize_defs[base_idx];
|
|
|
+ if (base_idx == MMU_PAGE_16M)
|
|
|
+ cur_cpu_spec->mmu_features |= MMU_FTR_16M_PAGE;
|
|
|
+
|
|
|
+ def->shift = base_shift;
|
|
|
+ if (base_shift <= 23)
|
|
|
+ def->avpnm = 0;
|
|
|
+ else
|
|
|
+ def->avpnm = (1 << (base_shift - 23)) - 1;
|
|
|
+ def->sllp = slbenc;
|
|
|
+ /*
|
|
|
+ * We don't know for sure what's up with tlbiel, so
|
|
|
+ * for now we only set it for 4K and 64K pages
|
|
|
+ */
|
|
|
+ if (base_idx == MMU_PAGE_4K || base_idx == MMU_PAGE_64K)
|
|
|
+ def->tlbiel = 1;
|
|
|
+ else
|
|
|
+ def->tlbiel = 0;
|
|
|
+
|
|
|
+ while (size > 0 && lpnum) {
|
|
|
+ unsigned int shift = be32_to_cpu(prop[0]);
|
|
|
+ int penc = be32_to_cpu(prop[1]);
|
|
|
+
|
|
|
+ prop += 2; size -= 2;
|
|
|
+ lpnum--;
|
|
|
+
|
|
|
+ idx = get_idx_from_shift(shift);
|
|
|
+ if (idx < 0)
|
|
|
continue;
|
|
|
- }
|
|
|
- def = &mmu_psize_defs[base_idx];
|
|
|
- if (base_idx == MMU_PAGE_16M)
|
|
|
- cur_cpu_spec->mmu_features |= MMU_FTR_16M_PAGE;
|
|
|
-
|
|
|
- def->shift = base_shift;
|
|
|
- if (base_shift <= 23)
|
|
|
- def->avpnm = 0;
|
|
|
- else
|
|
|
- def->avpnm = (1 << (base_shift - 23)) - 1;
|
|
|
- def->sllp = slbenc;
|
|
|
- /*
|
|
|
- * We don't know for sure what's up with tlbiel, so
|
|
|
- * for now we only set it for 4K and 64K pages
|
|
|
- */
|
|
|
- if (base_idx == MMU_PAGE_4K || base_idx == MMU_PAGE_64K)
|
|
|
- def->tlbiel = 1;
|
|
|
- else
|
|
|
- def->tlbiel = 0;
|
|
|
-
|
|
|
- while (size > 0 && lpnum) {
|
|
|
- unsigned int shift = be32_to_cpu(prop[0]);
|
|
|
- int penc = be32_to_cpu(prop[1]);
|
|
|
-
|
|
|
- prop += 2; size -= 2;
|
|
|
- lpnum--;
|
|
|
-
|
|
|
- idx = get_idx_from_shift(shift);
|
|
|
- if (idx < 0)
|
|
|
- continue;
|
|
|
-
|
|
|
- if (penc == -1)
|
|
|
- pr_err("Invalid penc for base_shift=%d "
|
|
|
- "shift=%d\n", base_shift, shift);
|
|
|
-
|
|
|
- def->penc[idx] = penc;
|
|
|
- pr_info("base_shift=%d: shift=%d, sllp=0x%04lx,"
|
|
|
- " avpnm=0x%08lx, tlbiel=%d, penc=%d\n",
|
|
|
- base_shift, shift, def->sllp,
|
|
|
- def->avpnm, def->tlbiel, def->penc[idx]);
|
|
|
- }
|
|
|
+
|
|
|
+ if (penc == -1)
|
|
|
+ pr_err("Invalid penc for base_shift=%d "
|
|
|
+ "shift=%d\n", base_shift, shift);
|
|
|
+
|
|
|
+ def->penc[idx] = penc;
|
|
|
+ pr_info("base_shift=%d: shift=%d, sllp=0x%04lx,"
|
|
|
+ " avpnm=0x%08lx, tlbiel=%d, penc=%d\n",
|
|
|
+ base_shift, shift, def->sllp,
|
|
|
+ def->avpnm, def->tlbiel, def->penc[idx]);
|
|
|
}
|
|
|
- return 1;
|
|
|
}
|
|
|
- return 0;
|
|
|
+
|
|
|
+ return 1;
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_HUGETLB_PAGE
|