aboutsummaryrefslogtreecommitdiff
path: root/sys/powerpc
diff options
context:
space:
mode:
Diffstat (limited to 'sys/powerpc')
-rw-r--r--sys/powerpc/booke/pmap.c23
-rw-r--r--sys/powerpc/conf/GENERIC642
-rw-r--r--sys/powerpc/conf/GENERIC64LE2
-rw-r--r--sys/powerpc/include/spr.h5
-rw-r--r--sys/powerpc/include/tlb.h26
-rw-r--r--sys/powerpc/mpc85xx/platform_mpc85xx.c24
-rw-r--r--sys/powerpc/powerpc/intr_machdep.c2
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);
}