Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 1 Jan 2013 17:34:37 +1300
From:      Andrew Turner <andrew@fubar.geek.nz>
To:        Oleksandr Tymoshenko <gonzo@freebsd.org>
Cc:        svn-src-head@freebsd.org, svn-src-all@freebsd.org, src-committers@freebsd.org
Subject:   Re: svn commit: r244914 - in head/sys/arm: arm include ti/omap4
Message-ID:  <20130101173437.33f43ce8@fubar.geek.nz>
In-Reply-To: <20130101165915.1f903645@fubar.geek.nz>
References:  <201212312119.qBVLJi3V009555@svn.freebsd.org> <20130101105353.14492943@fubar.geek.nz> <50E20F2B.7080704@freebsd.org> <20130101165915.1f903645@fubar.geek.nz>

next in thread | previous in thread | raw e-mail | index | archive | help
--MP_/hZkhpjxOqNpMwuDhuhq7=ut
Content-Type: text/plain; charset=US-ASCII
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

On Tue, 1 Jan 2013 16:59:15 +1300
Andrew Turner <andrew@fubar.geek.nz> wrote:
> On Mon, 31 Dec 2012 14:18:19 -0800
> Oleksandr Tymoshenko <gonzo@freebsd.org> wrote:
> > I think we can use RTL release field of Cache ID register to
> > determine actual hardware release
> > and act accordingly.
> > 
> > 
> Yes, that appears to be correct, I have committed the known values of
> the RTL release field, from the ARM documentation, in r244919. I can
> have a look at detecting which cache controller we are on and adjust
> our behaviour accordingly but won't have any hardware to test with
> until the end of the week.

I have this untested patch that should only enable the errata when we
detect it is required.

Andrew
--MP_/hZkhpjxOqNpMwuDhuhq7=ut
Content-Type: text/x-patch
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment; filename=pl310_errata.diff

Index: sys/arm/include/pl310.h
===================================================================
--- sys/arm/include/pl310.h	(revision 244919)
+++ sys/arm/include/pl310.h	(working copy)
@@ -131,6 +131,7 @@ struct pl310_softc {
 	void*		sc_irq_h;
 	int		sc_enabled;
 	struct mtx	sc_mtx;
+	u_int		sc_rtl_revision;
 };
 
 /**
Index: sys/arm/arm/pl310.c
===================================================================
--- sys/arm/arm/pl310.c	(revision 244918)
+++ sys/arm/arm/pl310.c	(working copy)
@@ -135,11 +135,12 @@ pl310_cache_sync(void)
 		return;
 
 #ifdef PL310_ERRATA_753970
-	/* Write uncached PL310 register */
-	pl310_write4(pl310_softc, 0x740, 0xffffffff);
-#else
-	pl310_write4(pl310_softc, PL310_CACHE_SYNC, 0xffffffff);
+	if (sc->sc_rtl_release == CACHE_ID_RELEASE_r3p0)
+		/* Write uncached PL310 register */
+		pl310_write4(pl310_softc, 0x740, 0xffffffff);
+	else
 #endif
+		pl310_write4(pl310_softc, PL310_CACHE_SYNC, 0xffffffff);
 }
 
 
@@ -152,13 +153,17 @@ pl310_wbinv_all(void)
 
 	PL310_LOCK(pl310_softc);
 #ifdef PL310_ERRATA_727915
-	platform_pl310_write_debug(pl310_softc, 3);
+	if (sc->sc_rtl_release == CACHE_ID_RELEASE_r2p0 ||
+	    sc->sc_rtl_release == CACHE_ID_RELEASE_r3p0)
+		platform_pl310_write_debug(pl310_softc, 3);
 #endif
 	pl310_write4(pl310_softc, PL310_CLEAN_INV_WAY, g_l2cache_way_mask);
 	pl310_wait_background_op(PL310_CLEAN_INV_WAY, g_l2cache_way_mask);
 	pl310_cache_sync();
 #ifdef PL310_ERRATA_727915
-	platform_pl310_write_debug(pl310_softc, 0);
+	if (sc->sc_rtl_release == CACHE_ID_RELEASE_r2p0 ||
+	    sc->sc_rtl_release == CACHE_ID_RELEASE_r3p0)
+		platform_pl310_write_debug(pl310_softc, 0);
 #endif
 	PL310_UNLOCK(pl310_softc);
 }
@@ -182,27 +187,32 @@ pl310_wbinv_range(vm_paddr_t start, vm_s
 
 
 #ifdef PL310_ERRATA_727915
-	platform_pl310_write_debug(pl310_softc, 3);
+	if (sc->sc_rtl_release == CACHE_ID_RELEASE_r2p0 ||
+	    sc->sc_rtl_release == CACHE_ID_RELEASE_r3p0)
+		platform_pl310_write_debug(pl310_softc, 3);
 #endif
 	while (size > 0) {
 #ifdef PL310_ERRATA_588369
-		/* 
-		 * Errata 588369 says that clean + inv may keep the 
-		 * cache line if it was clean, the recommanded workaround
-		 * is to clean then invalidate the cache line, with
-		 * write-back and cache linefill disabled
-		 */
-		   
-		pl310_write4(pl310_softc, PL310_CLEAN_LINE_PA, start);
-		pl310_write4(pl310_softc, PL310_INV_LINE_PA, start);
-#else
-		pl310_write4(pl310_softc, PL310_CLEAN_INV_LINE_PA, start);
+		if (sc->sc_rtl_release <= CACHE_ID_RELEASE_r1p0) {
+			/* 
+			 * Errata 588369 says that clean + inv may keep the 
+			 * cache line if it was clean, the recommanded
+			 * workaround is to clean then invalidate the cache
+			 * line, with write-back and cache linefill disabled.
+			 */
+			pl310_write4(pl310_softc, PL310_CLEAN_LINE_PA, start);
+			pl310_write4(pl310_softc, PL310_INV_LINE_PA, start);
+		} else
 #endif
+			pl310_write4(pl310_softc, PL310_CLEAN_INV_LINE_PA,
+			    start);
 		start += g_l2cache_line_size;
 		size -= g_l2cache_line_size;
 	}
 #ifdef PL310_ERRATA_727915
-	platform_pl310_write_debug(pl310_softc, 0);
+	if (sc->sc_rtl_release == CACHE_ID_RELEASE_r2p0 ||
+	    sc->sc_rtl_release == CACHE_ID_RELEASE_r3p0)
+		platform_pl310_write_debug(pl310_softc, 0);
 #endif
 
 	pl310_cache_sync();
@@ -307,6 +317,8 @@ pl310_attach(device_t dev)
 				pl310_filter, NULL, sc, &sc->sc_irq_h);
 
 	cache_id = pl310_read4(sc, PL310_CACHE_ID);
+	sc->sc_rtl_release = (cache_id >> CACHE_ID_RELEASE_SHIFT) &
+	    CACHE_ID_RELEASE_MASK;
 	device_printf(dev, "Part number: 0x%x, release: 0x%x\n",
 	    (cache_id >> CACHE_ID_PARTNUM_SHIFT) & CACHE_ID_PARTNUM_MASK,
 	    (cache_id >> CACHE_ID_RELEASE_SHIFT) & CACHE_ID_RELEASE_MASK);

--MP_/hZkhpjxOqNpMwuDhuhq7=ut--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20130101173437.33f43ce8>