diff options
Diffstat (limited to 'sys/powerpc')
| -rw-r--r-- | sys/powerpc/booke/pmap.c | 23 | ||||
| -rw-r--r-- | sys/powerpc/conf/GENERIC64 | 2 | ||||
| -rw-r--r-- | sys/powerpc/conf/GENERIC64LE | 2 | ||||
| -rw-r--r-- | sys/powerpc/include/spr.h | 5 | ||||
| -rw-r--r-- | sys/powerpc/include/tlb.h | 26 | ||||
| -rw-r--r-- | sys/powerpc/mpc85xx/platform_mpc85xx.c | 24 | ||||
| -rw-r--r-- | sys/powerpc/powerpc/intr_machdep.c | 2 |
7 files changed, 58 insertions, 26 deletions
diff --git a/sys/powerpc/booke/pmap.c b/sys/powerpc/booke/pmap.c index 08516b151e6b..a76ef6a089fd 100644 --- a/sys/powerpc/booke/pmap.c +++ b/sys/powerpc/booke/pmap.c @@ -177,6 +177,7 @@ static struct mtx copy_page_mutex; #endif static struct mtx tlbivax_mutex; +static bool mmuv2; /**************************************************************************/ /* PMAP */ @@ -640,6 +641,9 @@ mmu_booke_bootstrap(vm_offset_t start, vm_offset_t kernelend) debugf("mmu_booke_bootstrap: entered\n"); + if ((mfspr(SPR_MMUCFG) & MMUCFG_MAVN_M) > 0) + mmuv2 = true; + /* Set interesting system properties */ #ifdef __powerpc64__ hw_direct_map = 1; @@ -2703,7 +2707,7 @@ tsize2size(unsigned int tsize) * size = 4^tsize * 2^10 = 2^(2 * tsize - 10) */ - return ((1 << (2 * tsize)) * 1024); + return ((1UL << tsize) * 1024); } /* @@ -2713,7 +2717,7 @@ static unsigned int size2tsize(vm_size_t size) { - return (ilog2(size) / 2 - 5); + return (ilog2(size) - 10); } /* @@ -2772,23 +2776,29 @@ tlb1_mapin_region(vm_offset_t va, vm_paddr_t pa, vm_size_t size, int wimge) { vm_offset_t base; vm_size_t mapped, sz, ssize; + int shift; mapped = 0; base = va; ssize = size; + if (mmuv2) + shift = 1; + else + shift = 2; + while (size > 0) { - sz = 1UL << (ilog2(size) & ~1); + sz = 1UL << (ilog2(size) & ~(shift - 1)); /* Align size to PA */ if (pa % sz != 0) { do { - sz >>= 2; + sz >>= shift; } while (pa % sz != 0); } /* Now align from there to VA */ if (va % sz != 0) { do { - sz >>= 2; + sz >>= shift; } while (va % sz != 0); } #ifdef __powerpc64__ @@ -2805,7 +2815,8 @@ tlb1_mapin_region(vm_offset_t va, vm_paddr_t pa, vm_size_t size, int wimge) * For now, though, since we have plenty of space in TLB1, * always avoid creating entries larger than 4GB. */ - sz = MIN(sz, 1UL << 32); + if (!mmuv2) + sz = MIN(sz, 1UL << 32); #endif if (bootverbose) printf("Wiring VA=%p to PA=%jx (size=%lx)\n", diff --git a/sys/powerpc/conf/GENERIC64 b/sys/powerpc/conf/GENERIC64 index 8daf5353263a..f2c688b1c622 100644 --- a/sys/powerpc/conf/GENERIC64 +++ b/sys/powerpc/conf/GENERIC64 @@ -175,6 +175,8 @@ device glc # Sony Playstation 3 Ethernet device llan # IBM pSeries Virtual Ethernet device cxgbe # Chelsio 10/25G NIC +device mdio # MDIO bus + # PCI Ethernet NICs that use the common MII bus controller code. device miibus # MII bus support device bge # Broadcom BCM570xx Gigabit Ethernet diff --git a/sys/powerpc/conf/GENERIC64LE b/sys/powerpc/conf/GENERIC64LE index 499ee95d1905..ee5ecc271743 100644 --- a/sys/powerpc/conf/GENERIC64LE +++ b/sys/powerpc/conf/GENERIC64LE @@ -181,6 +181,8 @@ device fxp # Intel EtherExpress PRO/100B (82557, 82558) device re # Realtek 8139C+/8169/8169S/8110S device rl # Realtek 8129/8139 +device mdio # MDIO bus + # Nvidia/Mellanox Connect-X 4 and later, Ethernet only # mlx5ib requires ibcore infra and is not included by default device mlx5 # Base driver diff --git a/sys/powerpc/include/spr.h b/sys/powerpc/include/spr.h index 605b1be194d9..5c6e9d67fcb4 100644 --- a/sys/powerpc/include/spr.h +++ b/sys/powerpc/include/spr.h @@ -864,5 +864,10 @@ #define BUCSR_BPEN 0x00000001 /* Branch Prediction Enable */ #define BUCSR_BBFI 0x00000200 /* Branch Buffer Flash Invalidate */ +#define SPR_MMUCFG 0x3f7 /* ..8 MMU Configuration Register */ +#define MMUCFG_PIDSIZE_M 0x000007c0 +#define MMUCFG_PIDSIZE_S 6 +#define MMUCFG_MAVN_M 0x00000003 + #endif /* BOOKE */ #endif /* !_POWERPC_SPR_H_ */ diff --git a/sys/powerpc/include/tlb.h b/sys/powerpc/include/tlb.h index 0a4463e0b928..33d31efab604 100644 --- a/sys/powerpc/include/tlb.h +++ b/sys/powerpc/include/tlb.h @@ -50,20 +50,20 @@ #define MAS1_TID_SHIFT 16 #define MAS1_TS_MASK 0x00001000 #define MAS1_TS_SHIFT 12 -#define MAS1_TSIZE_MASK 0x00000F00 -#define MAS1_TSIZE_SHIFT 8 +#define MAS1_TSIZE_MASK 0x00000F80 +#define MAS1_TSIZE_SHIFT 7 -#define TLB_SIZE_4K 1 -#define TLB_SIZE_16K 2 -#define TLB_SIZE_64K 3 -#define TLB_SIZE_256K 4 -#define TLB_SIZE_1M 5 -#define TLB_SIZE_4M 6 -#define TLB_SIZE_16M 7 -#define TLB_SIZE_64M 8 -#define TLB_SIZE_256M 9 -#define TLB_SIZE_1G 10 -#define TLB_SIZE_4G 11 +#define TLB_SIZE_4K 2 +#define TLB_SIZE_16K 4 +#define TLB_SIZE_64K 6 +#define TLB_SIZE_256K 8 +#define TLB_SIZE_1M 10 +#define TLB_SIZE_4M 12 +#define TLB_SIZE_16M 14 +#define TLB_SIZE_64M 16 +#define TLB_SIZE_256M 18 +#define TLB_SIZE_1G 20 +#define TLB_SIZE_4G 22 #ifdef __powerpc64__ #define MAS2_EPN_MASK 0xFFFFFFFFFFFFF000UL diff --git a/sys/powerpc/mpc85xx/platform_mpc85xx.c b/sys/powerpc/mpc85xx/platform_mpc85xx.c index cc2ad829eb05..6781fdffa5a9 100644 --- a/sys/powerpc/mpc85xx/platform_mpc85xx.c +++ b/sys/powerpc/mpc85xx/platform_mpc85xx.c @@ -581,9 +581,19 @@ dummy_freeze(device_t dev, bool freeze) /* QorIQ Run control/power management timebase management. */ -#define RCPM_CTBENR 0x00000084 +#define RCPM_CTBENR_1_0 0x00000084 +#define RCPM_CTBENR_2_0 0x000001a0 + struct mpc85xx_rcpm_softc { struct resource *sc_mem; + bus_addr_t sc_ctbenr; + uint32_t sc_saved_tbenr; +}; + +struct ofw_compat_data compats[] = { + { "fsl,qoriq-rcpm-1.0", RCPM_CTBENR_1_0 }, + { "fsl,qoriq-rcpm-2.0", RCPM_CTBENR_2_0 }, + { NULL, 0 } }; static void @@ -593,16 +603,17 @@ mpc85xx_rcpm_freeze_timebase(device_t dev, bool freeze) sc = device_get_softc(dev); - if (freeze) - bus_write_4(sc->sc_mem, RCPM_CTBENR, 0); - else - bus_write_4(sc->sc_mem, RCPM_CTBENR, (1 << maxcpu) - 1); + if (freeze) { + sc->sc_saved_tbenr = bus_read_4(sc->sc_mem, sc->sc_ctbenr); + bus_write_4(sc->sc_mem, sc->sc_ctbenr, 0); + } else + bus_write_4(sc->sc_mem, sc->sc_ctbenr, sc->sc_saved_tbenr); } static int mpc85xx_rcpm_probe(device_t dev) { - if (!ofw_bus_is_compatible(dev, "fsl,qoriq-rcpm-1.0")) + if (ofw_bus_search_compatible(dev, compats)->ocd_str == NULL) return (ENXIO); device_set_desc(dev, "QorIQ Run control and power management"); @@ -622,6 +633,7 @@ mpc85xx_rcpm_attach(device_t dev) rid = 0; sc->sc_mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, RF_ACTIVE | RF_SHAREABLE); + sc->sc_ctbenr = ofw_bus_search_compatible(dev, compats)->ocd_data; return (0); } diff --git a/sys/powerpc/powerpc/intr_machdep.c b/sys/powerpc/powerpc/intr_machdep.c index daab391bb800..7e742845dbd3 100644 --- a/sys/powerpc/powerpc/intr_machdep.c +++ b/sys/powerpc/powerpc/intr_machdep.c @@ -537,7 +537,7 @@ powerpc_setup_intr_int(const char *name, u_int irq, driver_filter_t filter, if (error) return (error); i->pi_domain = domain; - if (strcmp(name, "IPI") != 0) { + if (ipi) { CPU_ZERO(&i->pi_cpuset); CPU_COPY(&cpuset_domain[domain], &i->pi_cpuset); } |
