Index: stand/powerpc/ofw/cas.c =================================================================== --- stand/powerpc/ofw/cas.c +++ stand/powerpc/ofw/cas.c @@ -84,12 +84,15 @@ /* byte 24: MMU */ #define OV5_MMU_HPT 0 +#define OV5_MMU_RADIX 0x40 +#define OV5_MMU_EITHER 0x80 +#define OV5_MMU_DYNAMIC 0xc0 /* byte 25: HPT MMU Extensions */ -#define OV5_HPT_EXT_NONE 0 +#define OV5_HPT_GTSE 0x40 /* byte 26: Radix MMU Extensions */ -#define OV5_RPT_EXT_NONE 0 +#define OV5_RADIX_GTSE 0x40 struct pvr { @@ -163,8 +166,8 @@ 0, /* DRMEM_V2 */ OV5_INTC_XICS, OV5_MMU_HPT, - OV5_HPT_EXT_NONE, - OV5_RPT_EXT_NONE + 0, + OV5_RADIX_GTSE } }; @@ -193,16 +196,19 @@ int ppc64_cas(void) { - int rc; + int rc, radix_mmu = 0; ihandle_t ihandle; cell_t err; + const char *var; /* Perform CAS only for POWER8 and later cores */ switch (mfpvr() & PVR_CPU_MASK) { case PVR_CPU_P8: case PVR_CPU_P8E: case PVR_CPU_P8NVL: + break; case PVR_CPU_P9: + radix_mmu = 1; break; default: return (0); @@ -212,6 +218,11 @@ if (ppc64_hv()) return (0); + if (radix_mmu && (var = getenv("radix_mmu")) != NULL && var[0] != '0') + ibm_arch_vec.vec5.data[24] = OV5_MMU_RADIX; + else + radix_mmu = 0; + ihandle = OF_open("/"); if (ihandle == -1) { printf("cas: failed to open / node\n"); @@ -227,5 +238,6 @@ } OF_close(ihandle); + printf("cas: selected %s MMU\n", radix_mmu ? "radix" : "hash"); return (rc); }