diff options
author | Gabe Black <gabeblack@google.com> | 2019-08-17 01:15:39 -0700 |
---|---|---|
committer | Gabe Black <gabeblack@google.com> | 2019-08-28 02:14:29 +0000 |
commit | b4e3e2f4a4dfa3a05d068ab33eb50a749326f2c5 (patch) | |
tree | 352cb6a0d1e920cbe649f82893192e7fd96b6a3a /src/cpu/o3/lsq.hh | |
parent | c387a212d98024e42e4267ff364c2976f976d666 (diff) | |
download | gem5-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.hh | 51 |
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; |