From 651da73d89fb5caca984bec73afdfa0e71b9202b Mon Sep 17 00:00:00 2001 From: "Wesley W. Terpstra" Date: Thu, 27 Jul 2017 00:25:07 -0700 Subject: [PATCH] tilelink: it is now legal to support Acquire for UNCACHED regions These cases exist: GET_EFFECTS, PUT_EFFECTS, UNCACHEABLE && !supportsAcquire: MMIO UNCACHED && !supportsAcquire: speculation ok and may be cached UNCACHED && supportsAcquire: LLC/CacheCork applied (slave never probes) CACHED, TRACKED && supportsAcquire: slave might probe --- src/main/scala/tilelink/CacheCork.scala | 6 +++--- src/main/scala/tilelink/Parameters.scala | 5 +++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/scala/tilelink/CacheCork.scala b/src/main/scala/tilelink/CacheCork.scala index 53a54e24..69964e7e 100644 --- a/src/main/scala/tilelink/CacheCork.scala +++ b/src/main/scala/tilelink/CacheCork.scala @@ -20,9 +20,8 @@ class TLCacheCork(unsafe: Boolean = false)(implicit p: Parameters) extends LazyM mp.copy( endSinkId = 1, managers = mp.managers.map { m => m.copy( - regionType = if (m.regionType == RegionType.UNCACHED) RegionType.TRACKED else m.regionType, - supportsAcquireB = m.supportsGet, - supportsAcquireT = m.supportsPutFull)})}) + supportsAcquireB = if (m.regionType == RegionType.UNCACHED) m.supportsGet else m.supportsAcquireB, + supportsAcquireT = if (m.regionType == RegionType.UNCACHED) m.supportsPutFull else m.supportsAcquireT)})}) lazy val module = new LazyModuleImp(this) { val io = new Bundle { @@ -37,6 +36,7 @@ class TLCacheCork(unsafe: Boolean = false)(implicit p: Parameters) extends LazyM require (caches.size <= 1 || unsafe, "Only one caching client allowed") edgeOut.manager.managers.foreach { case m => require (!m.supportsAcquireB || unsafe, "Cannot support caches beyond the Cork") + require (m.regionType <= RegionType.UNCACHED) } // The Cork turns [Acquire=>Get] => [AccessAckData=>GrantData] diff --git a/src/main/scala/tilelink/Parameters.scala b/src/main/scala/tilelink/Parameters.scala index 716b5284..d36c9229 100644 --- a/src/main/scala/tilelink/Parameters.scala +++ b/src/main/scala/tilelink/Parameters.scala @@ -38,8 +38,9 @@ case class TLManagerParameters( require (supportsAcquireB.contains(supportsAcquireT)) // Make sure that the regionType agrees with the capabilities - require ((regionType == RegionType.CACHED || regionType == RegionType.TRACKED) != supportsAcquireB.none) - require (regionType != RegionType.UNCACHED || supportsGet) + require (!supportsAcquireB || regionType >= RegionType.UNCACHED) // acquire -> uncached, tracked, cached + require (regionType <= RegionType.UNCACHED || supportsAcquireB) // tracked, cached -> acquire + require (regionType != RegionType.UNCACHED || supportsGet) // uncached -> supportsGet val name = nodePath.lastOption.map(_.lazyModule.name).getOrElse("disconnected") val maxTransfer = List( // Largest supported transfer of all types