diff --git a/src/cpu/simple/timing.hh b/src/cpu/simple/timing.hh index 77057ad02..95edea0b6 100644 --- a/src/cpu/simple/timing.hh +++ b/src/cpu/simple/timing.hh @@ -170,7 +170,7 @@ class TimingSimpleCPU : public BaseSimpleCPU void schedule(PacketPtr _pkt, Tick t); }; - EventWrapper retryEvent; + EventWrapper retryEvent; }; class IcachePort : public TimingCPUPort diff --git a/src/mem/bus.cc b/src/mem/bus.cc index 8040118d2..648b66f4d 100644 --- a/src/mem/bus.cc +++ b/src/mem/bus.cc @@ -218,7 +218,10 @@ BaseBus::retryWaiting() // note that we might have blocked on the receiving port being // busy (rather than the bus itself) and now call retry before the // destination called retry on the bus - retryList.front()->sendRetry(); + if (dynamic_cast(retryList.front()) != NULL) + (dynamic_cast(retryList.front()))->sendRetry(); + else + (dynamic_cast(retryList.front()))->sendRetry(); // If inRetry is still true, sendTiming wasn't called in zero time // (e.g. the cache does this) diff --git a/src/mem/cache/base.hh b/src/mem/cache/base.hh index 55d5e85e1..79280f377 100644 --- a/src/mem/cache/base.hh +++ b/src/mem/cache/base.hh @@ -204,7 +204,7 @@ class BaseCache : public MemObject private: - EventWrapper sendRetryEvent; + EventWrapper sendRetryEvent; }; diff --git a/src/mem/port.cc b/src/mem/port.cc index 554f5bb1e..6007d303c 100644 --- a/src/mem/port.cc +++ b/src/mem/port.cc @@ -51,7 +51,7 @@ #include "mem/port.hh" Port::Port(const std::string &_name, MemObject& _owner, PortID _id) - : portName(_name), id(_id), peer(NULL), owner(_owner) + : portName(_name), id(_id), owner(_owner) { } @@ -86,7 +86,6 @@ MasterPort::bind(SlavePort& slave_port) { // master port keeps track of the slave port _slavePort = &slave_port; - peer = &slave_port; // slave port also keeps track of master port _slavePort->bind(*this); @@ -132,6 +131,12 @@ MasterPort::sendTimingSnoopResp(PacketPtr pkt) return _slavePort->recvTimingSnoopResp(pkt); } +void +MasterPort::sendRetry() +{ + _slavePort->recvRetry(); +} + void MasterPort::printAddr(Addr a) { @@ -159,7 +164,6 @@ void SlavePort::bind(MasterPort& master_port) { _masterPort = &master_port; - peer = &master_port; } MasterPort& @@ -211,3 +215,9 @@ SlavePort::sendTimingSnoopReq(PacketPtr pkt) assert(pkt->isRequest()); _masterPort->recvTimingSnoopReq(pkt); } + +void +SlavePort::sendRetry() +{ + _masterPort->recvRetry(); +} diff --git a/src/mem/port.hh b/src/mem/port.hh index c70733bf6..b93d5d444 100644 --- a/src/mem/port.hh +++ b/src/mem/port.hh @@ -70,10 +70,7 @@ class MemObject; /** * Ports are used to interface memory objects to each other. A port is * either a master or a slave and the connected peer is always of the - * opposite role. - * - * Each port has a name and an owner, and enables three basic types of - * accesses to the peer port: functional, atomic and timing. + * opposite role. Each port has a name, an owner, and an identifier. */ class Port { @@ -91,9 +88,6 @@ class Port */ const PortID id; - /** A pointer to the peer port. */ - Port* peer; - /** A reference to the MemObject that owns this port. */ MemObject& owner; @@ -119,23 +113,6 @@ class Port /** Get the port id. */ PortID getId() const { return id; } - protected: - - /** - * Called by a peer port if sendTimingReq, sendTimingResp or - * sendTimingSnoopResp was unsuccesful, and had to wait. - */ - virtual void recvRetry() = 0; - - public: - - /** - * Send a retry to a peer port that previously attempted a - * sendTimingReq, sendTimingResp or sendTimingSnoopResp which was - * unsuccessful. - */ - void sendRetry() { return peer->recvRetry(); } - }; /** Forward declaration */ @@ -210,6 +187,12 @@ class MasterPort : public Port */ bool sendTimingSnoopResp(PacketPtr pkt); + /** + * Send a retry to the slave port that previously attempted a + * sendTimingResp to this master port and failed. + */ + void sendRetry(); + /** * Determine if this master port is snooping or not. The default * implementation returns false and thus tells the neighbour we @@ -269,6 +252,14 @@ class MasterPort : public Port panic("%s was not expecting a timing snoop request\n", name()); } + /** + * Called by the slave port if sendTimingReq or + * sendTimingSnoopResp was called on this master port (causing + * recvTimingReq and recvTimingSnoopResp to be called on the + * slave port) and was unsuccesful. + */ + virtual void recvRetry() = 0; + /** * Called to receive an address range change from the peer slave * port. the default implementation ignored the change and does @@ -346,6 +337,13 @@ class SlavePort : public Port */ void sendTimingSnoopReq(PacketPtr pkt); + /** + * Send a retry to the master port that previously attempted a + * sendTimingReq or sendTimingSnoopResp to this slave port and + * failed. + */ + void sendRetry(); + /** * Called by a peer port in order to determine the block size of * the owner of this port. @@ -396,6 +394,13 @@ class SlavePort : public Port panic("%s was not expecting a timing snoop response\n", name()); } + /** + * Called by the master port if sendTimingResp was called on this + * slave port (causing recvTimingResp to be called on the master + * port) and was unsuccesful. + */ + virtual void recvRetry() = 0; + }; #endif //__MEM_PORT_HH__