Changeset View
Changeset View
Standalone View
Standalone View
sys/powerpc/pseries/mmu_phyp.c
Show First 20 Lines • Show All 129 Lines • ▼ Show 20 Lines | mphyp_bootstrap(vm_offset_t kernelstart, vm_offset_t kernelend) | ||||
char buf[8]; | char buf[8]; | ||||
uint32_t prop[2]; | uint32_t prop[2]; | ||||
uint32_t nptlp, shift = 0, slb_encoding = 0; | uint32_t nptlp, shift = 0, slb_encoding = 0; | ||||
uint32_t lp_size, lp_encoding; | uint32_t lp_size, lp_encoding; | ||||
struct lpte old; | struct lpte old; | ||||
uint64_t vsid; | uint64_t vsid; | ||||
phandle_t dev, node, root; | phandle_t dev, node, root; | ||||
int idx, len, res; | int idx, len, res; | ||||
bool has_lp; | |||||
rm_init(&mphyp_eviction_lock, "pte eviction"); | rm_init(&mphyp_eviction_lock, "pte eviction"); | ||||
moea64_early_bootstrap(kernelstart, kernelend); | moea64_early_bootstrap(kernelstart, kernelend); | ||||
root = OF_peer(0); | root = OF_peer(0); | ||||
dev = OF_child(root); | dev = OF_child(root); | ||||
▲ Show 20 Lines • Show All 48 Lines • ▼ Show 20 Lines | if (len > 0) { | ||||
* We have to use a variable length array on the stack | * We have to use a variable length array on the stack | ||||
* since we have very limited stack space. | * since we have very limited stack space. | ||||
*/ | */ | ||||
pcell_t arr[len/sizeof(cell_t)]; | pcell_t arr[len/sizeof(cell_t)]; | ||||
res = OF_getencprop(node, "ibm,segment-page-sizes", arr, | res = OF_getencprop(node, "ibm,segment-page-sizes", arr, | ||||
sizeof(arr)); | sizeof(arr)); | ||||
len /= 4; | len /= 4; | ||||
idx = 0; | idx = 0; | ||||
has_lp = false; | |||||
while (len > 0) { | while (len > 0) { | ||||
shift = arr[idx]; | shift = arr[idx]; | ||||
slb_encoding = arr[idx + 1]; | slb_encoding = arr[idx + 1]; | ||||
nptlp = arr[idx + 2]; | nptlp = arr[idx + 2]; | ||||
dprintf0("Segment Page Size: " | dprintf0("Segment Page Size: " | ||||
"%uKB, slb_enc=0x%X: {size, encoding}[%u] =", | "%uKB, slb_enc=0x%X: {size, encoding}[%u] =", | ||||
shift > 10? 1 << (shift-10) : 0, | shift > 10? 1 << (shift-10) : 0, | ||||
slb_encoding, nptlp); | slb_encoding, nptlp); | ||||
idx += 3; | idx += 3; | ||||
len -= 3; | len -= 3; | ||||
while (len > 0 && nptlp) { | while (len > 0 && nptlp) { | ||||
lp_size = arr[idx]; | lp_size = arr[idx]; | ||||
lp_encoding = arr[idx+1]; | lp_encoding = arr[idx+1]; | ||||
dprintf(" {%uKB, 0x%X}", | dprintf(" {%uKB, 0x%X}", | ||||
lp_size > 10? 1 << (lp_size-10) : 0, | lp_size > 10? 1 << (lp_size-10) : 0, | ||||
lp_encoding); | lp_encoding); | ||||
if (slb_encoding == SLBV_L && lp_encoding == 0) | if (slb_encoding == SLBV_L && lp_encoding == 0) | ||||
break; | has_lp = true; | ||||
if (slb_encoding == SLB_PGSZ_4K_4K && | |||||
lp_encoding == LP_4K_16M) | |||||
moea64_has_lp_4k_16m = true; | |||||
idx += 2; | idx += 2; | ||||
len -= 2; | len -= 2; | ||||
nptlp--; | nptlp--; | ||||
} | } | ||||
dprintf("\n"); | dprintf("\n"); | ||||
if (nptlp && slb_encoding == SLBV_L && lp_encoding == 0) | if (has_lp && moea64_has_lp_4k_16m) | ||||
break; | break; | ||||
} | } | ||||
if (len > 0) { | if (has_lp) { | ||||
moea64_large_page_shift = shift; | moea64_large_page_shift = shift; | ||||
moea64_large_page_size = 1ULL << lp_size; | moea64_large_page_size = 1ULL << lp_size; | ||||
moea64_large_page_mask = moea64_large_page_size - 1; | moea64_large_page_mask = moea64_large_page_size - 1; | ||||
hw_direct_map = 1; | hw_direct_map = 1; | ||||
printf(MMU_PHYP_ID | printf(MMU_PHYP_ID | ||||
"Support for hugepages of %uKB detected\n", | "Support for hugepages of %uKB detected\n", | ||||
moea64_large_page_shift > 10? | moea64_large_page_shift > 10? | ||||
1 << (moea64_large_page_shift-10) : 0); | 1 << (moea64_large_page_shift-10) : 0); | ||||
▲ Show 20 Lines • Show All 301 Lines • Show Last 20 Lines |