aboutsummaryrefslogtreecommitdiff
path: root/sys/powerpc/pseries
diff options
context:
space:
mode:
authorLeandro Lupori <luporl@FreeBSD.org>2019-06-07 17:58:59 +0000
committerLeandro Lupori <luporl@FreeBSD.org>2019-06-07 17:58:59 +0000
commitb934fc74683bd28c5c24175c2b3f4603b2d5fa1f (patch)
treeb3cbf3d659263ce01f812e942dd3a90231f97582 /sys/powerpc/pseries
parent007d50155fb6b636b62051a36ec5915ca87a4139 (diff)
Notes
Diffstat (limited to 'sys/powerpc/pseries')
-rw-r--r--sys/powerpc/pseries/mmu_phyp.c47
1 files changed, 40 insertions, 7 deletions
diff --git a/sys/powerpc/pseries/mmu_phyp.c b/sys/powerpc/pseries/mmu_phyp.c
index cabefedf1fa70..ab78df15defcc 100644
--- a/sys/powerpc/pseries/mmu_phyp.c
+++ b/sys/powerpc/pseries/mmu_phyp.c
@@ -59,6 +59,16 @@ __FBSDID("$FreeBSD$");
#include "phyp-hvcall.h"
+#define MMU_PHYP_DEBUG 0
+#define MMU_PHYP_ID "mmu_phyp: "
+#if MMU_PHYP_DEBUG
+#define dprintf(fmt, ...) printf(fmt, ## __VA_ARGS__)
+#define dprintf0(fmt, ...) dprintf(MMU_PHYP_ID fmt, ## __VA_ARGS__)
+#else
+#define dprintf(fmt, args...) do { ; } while(0)
+#define dprintf0(fmt, args...) do { ; } while(0)
+#endif
+
static struct rmlock mphyp_eviction_lock;
/*
@@ -149,6 +159,7 @@ mphyp_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend)
res = OF_getencprop(node, "ibm,slb-size", prop, sizeof(prop[0]));
if (res > 0)
n_slbs = prop[0];
+ dprintf0("slb-size=%i\n", n_slbs);
moea64_pteg_count = final_pteg_count / sizeof(struct lpteg);
@@ -185,11 +196,22 @@ mphyp_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend)
shift = arr[idx];
slb_encoding = arr[idx + 1];
nptlp = arr[idx + 2];
+
+ dprintf0("Segment Page Size: "
+ "%uKB, slb_enc=0x%X: {size, encoding}[%u] =",
+ shift > 10? 1 << (shift-10) : 0,
+ slb_encoding, nptlp);
+
idx += 3;
len -= 3;
while (len > 0 && nptlp) {
lp_size = arr[idx];
lp_encoding = arr[idx+1];
+
+ dprintf(" {%uKB, 0x%X}",
+ lp_size > 10? 1 << (lp_size-10) : 0,
+ lp_encoding);
+
if (slb_encoding == SLBV_L && lp_encoding == 0)
break;
@@ -197,17 +219,28 @@ mphyp_bootstrap(mmu_t mmup, vm_offset_t kernelstart, vm_offset_t kernelend)
len -= 2;
nptlp--;
}
+ dprintf("\n");
if (nptlp && slb_encoding == SLBV_L && lp_encoding == 0)
break;
}
- if (len == 0)
- panic("Standard large pages (SLB[L] = 1, PTE[LP] = 0) "
- "not supported by this system. Please enable huge "
- "page backing if running under PowerKVM.");
-
- moea64_large_page_shift = shift;
- moea64_large_page_size = 1ULL << lp_size;
+ if (len > 0) {
+ moea64_large_page_shift = shift;
+ moea64_large_page_size = 1ULL << lp_size;
+ moea64_large_page_mask = moea64_large_page_size - 1;
+ hw_direct_map = 1;
+ printf(MMU_PHYP_ID
+ "Support for hugepages of %uKB detected\n",
+ moea64_large_page_shift > 10?
+ 1 << (moea64_large_page_shift-10) : 0);
+ } else {
+ moea64_large_page_size = 0;
+ moea64_large_page_shift = 0;
+ moea64_large_page_mask = 0;
+ hw_direct_map = 0;
+ printf(MMU_PHYP_ID
+ "Support for hugepages not found\n");
+ }
}
moea64_mid_bootstrap(mmup, kernelstart, kernelend);