X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmem%2Fbridge.hh;h=16b21addf4132bb4f98228b72785fc0918f9fe9d;hb=e33b3aa6692b172f6db5957774a9e0289e81fa5b;hp=eb0b2434faa9a7d375cf28e82e792a63a669c1c5;hpb=ffb6aec603c38e16ae91ea975c16fc3e8fb337e5;p=gem5.git diff --git a/src/mem/bridge.hh b/src/mem/bridge.hh index eb0b2434f..16b21addf 100644 --- a/src/mem/bridge.hh +++ b/src/mem/bridge.hh @@ -1,5 +1,5 @@ /* - * Copyright (c) 2011-2012 ARM Limited + * Copyright (c) 2011-2013 ARM Limited * All rights reserved * * The license below extends only to copyright in the software and shall @@ -44,21 +44,22 @@ /** * @file - * Declaration of a memory-mapped bus bridge that connects a master + * Declaration of a memory-mapped bridge that connects a master * and a slave through a request and response queue. */ #ifndef __MEM_BRIDGE_HH__ #define __MEM_BRIDGE_HH__ -#include +#include #include "base/types.hh" -#include "mem/mem_object.hh" +#include "mem/port.hh" #include "params/Bridge.hh" +#include "sim/clocked_object.hh" /** - * A bridge is used to interface two different busses (or in general a + * A bridge is used to interface two different crossbars (or in general a * memory-mapped master and slave), with buffering for requests and * responses. The bridge has a fixed delay for packets passing through * it and responds to a fixed set of address ranges. @@ -70,36 +71,10 @@ * the bridge will delay accepting the packet until space becomes * available. */ -class Bridge : public MemObject +class Bridge : public ClockedObject { protected: - /** - * A bridge request state stores packets along with their sender - * state and original source. It has enough information to also - * restore the response once it comes back to the bridge. - */ - class RequestState : public Packet::SenderState - { - - public: - - Packet::SenderState *origSenderState; - PortID origSrc; - - RequestState(PacketPtr _pkt) - : origSenderState(_pkt->senderState), - origSrc(_pkt->getSrc()) - { } - - void fixResponse(PacketPtr pkt) - { - assert(pkt->senderState == this); - pkt->setDest(origSrc); - pkt->senderState = origSenderState; - } - }; - /** * A deferred packet stores a packet along with its scheduled * transmission time @@ -109,8 +84,8 @@ class Bridge : public MemObject public: - Tick tick; - PacketPtr pkt; + const Tick tick; + const PacketPtr pkt; DeferredPacket(PacketPtr _pkt, Tick _tick) : tick(_tick), pkt(_pkt) { } @@ -134,23 +109,23 @@ class Bridge : public MemObject Bridge& bridge; /** - * Master port on the other side of the bridge (connected to - * the other bus). + * Master port on the other side of the bridge. */ BridgeMasterPort& masterPort; /** Minimum request delay though this bridge. */ - Cycles delay; + const Cycles delay; /** Address ranges to pass through the bridge */ - AddrRangeList ranges; + const AddrRangeList ranges; /** * Response packet queue. Response packets are held in this * queue for a specified delay to model the processing delay - * of the bridge. + * of the bridge. We use a deque as we need to iterate over + * the items for functional accesses. */ - std::list transmitList; + std::deque transmitList; /** Counter to track the outstanding responses. */ unsigned int outstandingResponses; @@ -161,12 +136,18 @@ class Bridge : public MemObject /** Max queue size for reserved responses. */ unsigned int respQueueLimit; + /** + * Upstream caches need this packet until true is returned, so + * hold it for deletion until a subsequent call + */ + std::unique_ptr pendingDelete; + /** * Is this side blocked from accepting new response packets. * * @return true if the reserved space has reached the set limit */ - bool respQueueFull(); + bool respQueueFull() const; /** * Handle send event, scheduled when the packet at the head of @@ -176,8 +157,7 @@ class Bridge : public MemObject void trySendTiming(); /** Send event for the response queue. */ - EventWrapper sendEvent; + EventFunctionWrapper sendEvent; public: @@ -219,7 +199,7 @@ class Bridge : public MemObject /** When receiving a retry request from the peer port, pass it to the bridge. */ - void recvRetry(); + void recvRespRetry(); /** When receiving a Atomic requestfrom the peer port, pass it to the bridge. */ @@ -249,23 +229,23 @@ class Bridge : public MemObject Bridge& bridge; /** - * The slave port on the other side of the bridge (connected - * to the other bus). + * The slave port on the other side of the bridge. */ BridgeSlavePort& slavePort; /** Minimum delay though this bridge. */ - Cycles delay; + const Cycles delay; /** * Request packet queue. Request packets are held in this * queue for a specified delay to model the processing delay - * of the bridge. + * of the bridge. We use a deque as we need to iterate over + * the items for functional accesses. */ - std::list transmitList; + std::deque transmitList; /** Max queue size for request packets */ - unsigned int reqQueueLimit; + const unsigned int reqQueueLimit; /** * Handle send event, scheduled when the packet at the head of @@ -275,8 +255,7 @@ class Bridge : public MemObject void trySendTiming(); /** Send event for the request queue. */ - EventWrapper sendEvent; + EventFunctionWrapper sendEvent; public: @@ -298,7 +277,7 @@ class Bridge : public MemObject * * @return true if the occupied space has reached the set limit */ - bool reqQueueFull(); + bool reqQueueFull() const; /** * Queue a request packet to be sent out later and also schedule @@ -317,7 +296,7 @@ class Bridge : public MemObject * * @return true if we find a match */ - bool checkFunctional(PacketPtr pkt); + bool trySatisfyFunctional(PacketPtr pkt); protected: @@ -327,7 +306,7 @@ class Bridge : public MemObject /** When receiving a retry request from the peer port, pass it to the bridge. */ - void recvRetry(); + void recvReqRetry(); }; /** Slave port of the bridge. */ @@ -338,15 +317,14 @@ class Bridge : public MemObject public: - virtual MasterPort& getMasterPort(const std::string& if_name, - int idx = -1); - virtual SlavePort& getSlavePort(const std::string& if_name, int idx = -1); + Port &getPort(const std::string &if_name, + PortID idx=InvalidPortID) override; - virtual void init(); + void init() override; typedef BridgeParams Params; Bridge(Params *p); }; -#endif //__MEM_BUS_HH__ +#endif //__MEM_BRIDGE_HH__