summaryrefslogtreecommitdiff
path: root/src/cpu/o3/lsq.hh
diff options
context:
space:
mode:
authorGabe Black <gabeblack@google.com>2019-08-17 01:15:39 -0700
committerGabe Black <gabeblack@google.com>2019-08-28 02:14:29 +0000
commitb4e3e2f4a4dfa3a05d068ab33eb50a749326f2c5 (patch)
tree352cb6a0d1e920cbe649f82893192e7fd96b6a3a /src/cpu/o3/lsq.hh
parentc387a212d98024e42e4267ff364c2976f976d666 (diff)
downloadgem5-b4e3e2f4a4dfa3a05d068ab33eb50a749326f2c5.tar.xz
cpu: Move O3's data port into the LSQ.
That's where it's used, and putting it there avoids having to pass around the port using the top level getDataPort function. Change-Id: I0dea25d0c5f4bb3f58a6574a8f2b2d242784caf2 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/20238 Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Jason Lowe-Power <jason@lowepower.com> Reviewed-by: Andreas Sandberg <andreas.sandberg@arm.com> Maintainer: Gabe Black <gabeblack@google.com>
Diffstat (limited to 'src/cpu/o3/lsq.hh')
-rw-r--r--src/cpu/o3/lsq.hh51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/cpu/o3/lsq.hh b/src/cpu/o3/lsq.hh
index 29c76f7b6..cc14ae423 100644
--- a/src/cpu/o3/lsq.hh
+++ b/src/cpu/o3/lsq.hh
@@ -58,6 +58,9 @@
struct DerivO3CPUParams;
template <class Impl>
+class FullO3CPU;
+
+template <class Impl>
class LSQ
{
@@ -115,6 +118,49 @@ class LSQ
void writebackDone() { _request->writebackDone(); }
};
+ /**
+ * DcachePort class for the load/store queue.
+ */
+ class DcachePort : public MasterPort
+ {
+ protected:
+
+ /** Pointer to LSQ. */
+ LSQ<Impl> *lsq;
+ FullO3CPU<Impl> *cpu;
+
+ public:
+ /** Default constructor. */
+ DcachePort(LSQ<Impl> *_lsq, FullO3CPU<Impl>* _cpu)
+ : MasterPort(_cpu->name() + ".dcache_port", _cpu), lsq(_lsq),
+ cpu(_cpu)
+ { }
+
+ protected:
+
+ /** Timing version of receive. Handles writing back and
+ * completing the load or store that has returned from
+ * memory. */
+ virtual bool recvTimingResp(PacketPtr pkt);
+ virtual void recvTimingSnoopReq(PacketPtr pkt);
+
+ virtual void recvFunctionalSnoop(PacketPtr pkt)
+ {
+ // @todo: Is there a need for potential invalidation here?
+ }
+
+ /** Handles doing a retry of the previous send. */
+ virtual void recvReqRetry();
+
+ /**
+ * As this CPU requires snooping to maintain the load store queue
+ * change the behaviour from the base CPU port.
+ *
+ * @return true since we have to snoop
+ */
+ virtual bool isSnooping() const { return true; }
+ };
+
/** Memory operation metadata.
* This class holds the information about a memory operation. It lives
* from initiateAcc to resource deallocation at commit or squash.
@@ -1004,6 +1050,8 @@ class LSQ
/** Another store port is in use */
void cachePortBusy(bool is_load);
+ MasterPort &getDataPort() { return dcachePort; }
+
protected:
/** D-cache is blocked */
bool _cacheBlocked;
@@ -1057,6 +1105,9 @@ class LSQ
/** Max SQ Size - Used to Enforce Sharing Policies. */
unsigned maxSQEntries;
+ /** Data port. */
+ DcachePort dcachePort;
+
/** The LSQ units for individual threads. */
std::vector<LSQUnit> thread;