for (apicIt = apics.begin(); apicIt != apics.end(); apicIt++) {
PacketPtr pkt = buildIntRequest(*apicIt, message);
if (timing) {
- queue.schedSendTiming(pkt, curTick() + latency);
+ schedTimingReq(pkt, curTick() + latency);
// The target handles cleaning up the packet in timing mode.
} else {
// ignore the latency involved in the atomic transaction
queue.schedSendEvent(time);
}
- /**
- * Schedule the transmissions of a response packet at a given
- * point in time.
- *
- * @param pkt response packet
- * @param when time to send the response
- */
- void respond(PacketPtr pkt, Tick time) {
- queue.schedSendTiming(pkt, time, true);
- }
-
protected:
CacheMasterPort(const std::string &_name, BaseCache *_cache,
/** Return to normal operation and accept new requests. */
void clearBlocked();
- /**
- * Schedule the transmissions of a response packet at a given
- * point in time.
- *
- * @param pkt response packet
- * @param when time to send the response
- */
- void respond(PacketPtr pkt, Tick time) {
- queue.schedSendTiming(pkt, time);
- }
-
protected:
CacheSlavePort(const std::string &_name, BaseCache *_cache,
rec->restore(pkt, this);
delete rec;
- memSidePort->respond(pkt, time);
+ memSidePort->schedTimingSnoopResp(pkt, time);
return true;
}
if (needsResponse) {
pkt->makeTimingResponse();
- cpuSidePort->respond(pkt, curTick()+lat);
+ cpuSidePort->schedTimingResp(pkt, curTick()+lat);
} else {
/// @todo nominally we should just delete the packet here,
/// however, until 4-phase stuff we can't because sending
// isInvalidate() set otherwise.
target->pkt->cmd = MemCmd::ReadRespWithInvalidate;
}
- cpuSidePort->respond(target->pkt, completion_time);
+ cpuSidePort->schedTimingResp(target->pkt, completion_time);
break;
case MSHR::Target::FromPrefetcher:
// invalidate it.
pkt->cmd = MemCmd::ReadRespWithInvalidate;
}
- memSidePort->respond(pkt, curTick() + hitLatency);
+ memSidePort->schedTimingSnoopResp(pkt, curTick() + hitLatency);
}
template<class TagStore>
// we can still send a packet before the end of this tick
assert(when >= curTick());
+ // express snoops should never be queued
+ assert(!pkt->isExpressSnoop());
+
// nothing on the list, or earlier than current front element,
// schedule an event
if (transmitList.empty() || when < transmitList.front().tick) {
virtual ~QueuedSlavePort() { }
+ /**
+ * Schedule the sending of a timing response.
+ *
+ * @param pkt Packet to send
+ * @param when Absolute time (in ticks) to send packet
+ */
+ void schedTimingResp(PacketPtr pkt, Tick when)
+ { queue.schedSendTiming(pkt, when); }
+
/** Check the list of buffered packets against the supplied
* functional request. */
bool checkFunctional(PacketPtr pkt) { return queue.checkFunctional(pkt); }
virtual ~QueuedMasterPort() { }
+ /**
+ * Schedule the sending of a timing request.
+ *
+ * @param pkt Packet to send
+ * @param when Absolute time (in ticks) to send packet
+ */
+ void schedTimingReq(PacketPtr pkt, Tick when)
+ { queue.schedSendTiming(pkt, when); }
+
+ /**
+ * Schedule the sending of a timing snoop response.
+ *
+ * @param pkt Packet to send
+ * @param when Absolute time (in ticks) to send packet
+ */
+ void schedTimingSnoopResp(PacketPtr pkt, Tick when)
+ { queue.schedSendTiming(pkt, when, true); }
+
/** Check the list of buffered packets against the supplied
* functional request. */
bool checkFunctional(PacketPtr pkt) { return queue.checkFunctional(pkt); }
"Request for address 0x%#x is assumed to be a pio request\n",
pkt->getAddr());
- return ruby_port->pio_port.sendNextCycle(pkt);
+ // send next cycle
+ ruby_port->pio_port.schedTimingReq(pkt, curTick() +
+ g_eventQueue_ptr->getClock());
+ return true;
}
assert(Address(pkt->getAddr()).getOffset() + pkt->getSize() <=
// turn packet around to go back to requester if response expected
if (needsResponse) {
DPRINTF(RubyPort, "Sending packet back over port\n");
- sendNextCycle(pkt);
+ // send next cycle
+ schedTimingResp(pkt, curTick() + g_eventQueue_ptr->getClock());
} else {
delete pkt;
}
DPRINTF(RubyPort, "Hit callback done!\n");
}
-bool
-RubyPort::M5Port::sendNextCycle(PacketPtr pkt, bool send_as_snoop)
-{
- //minimum latency, must be > 0
- queue.schedSendTiming(pkt, curTick() + (1 * g_eventQueue_ptr->getClock()),
- send_as_snoop);
- return true;
-}
-
-bool
-RubyPort::PioPort::sendNextCycle(PacketPtr pkt)
-{
- //minimum latency, must be > 0
- queue.schedSendTiming(pkt, curTick() + (1 * g_eventQueue_ptr->getClock()));
- return true;
-}
-
AddrRangeList
RubyPort::M5Port::getAddrRanges() const
{
public:
M5Port(const std::string &_name, RubyPort *_port,
RubySystem*_system, bool _access_phys_mem);
- bool sendNextCycle(PacketPtr pkt, bool send_as_snoop = false);
void hitCallback(PacketPtr pkt);
void evictionCallback(const Address& address);
unsigned deviceBlockSize() const;
public:
PioPort(const std::string &_name, RubyPort *_port);
- bool sendNextCycle(PacketPtr pkt);
protected:
virtual bool recvTimingResp(PacketPtr pkt);
// recvAtomic() should already have turned packet into
// atomic response
assert(pkt->isResponse());
- queue.schedSendTiming(pkt, curTick() + latency);
+ schedTimingResp(pkt, curTick() + latency);
} else {
/// @todo nominally we should just delete the packet here.
/// Until 4-phase stuff we can't because the sending