Tick
PioPort::recvAtomic(PacketPtr pkt)
{
+ // @todo: We need to pay for this and not just zero it out
+ pkt->busFirstWordDelay = pkt->busLastWordDelay = 0;
+
return pkt->isRead() ? device->read(pkt) : device->write(pkt);
}
{
assert(pkt->getAddr() >= configAddr &&
pkt->getAddr() < configAddr + PCI_CONFIG_SIZE);
+ // @todo someone should pay for this
+ pkt->busFirstWordDelay = pkt->busLastWordDelay = 0;
return pkt->isRead() ? device->readConfig(pkt) : device->writeConfig(pkt);
}
Tick recvMessage(PacketPtr pkt)
{
+ // @todo someone should pay for this
+ pkt->busFirstWordDelay = pkt->busLastWordDelay = 0;
return device->recvMessage(pkt);
}
};
DPRINTF(Bridge, "Request queue size: %d\n", transmitList.size());
+ // @todo: We need to pay for this and not just zero it out
+ pkt->busFirstWordDelay = pkt->busLastWordDelay = 0;
+
slavePort.schedTimingResp(pkt, bridge.clockEdge(delay));
return true;
assert(outstandingResponses != respQueueLimit);
++outstandingResponses;
retryReq = false;
+
+ // @todo: We need to pay for this and not just zero it out
+ pkt->busFirstWordDelay = pkt->busLastWordDelay = 0;
+
masterPort.schedTimingReq(pkt, bridge.clockEdge(delay));
}
}
// determine how many cycles are needed to send the data
unsigned dataCycles = pkt->hasData() ? divCeil(pkt->getSize(), width) : 0;
+ // before setting the bus delay fields of the packet, ensure that
+ // the delay from any previous bus has been accounted for
+ if (pkt->busFirstWordDelay != 0 || pkt->busLastWordDelay != 0)
+ panic("Packet %s already has bus delay (%d, %d) that should be "
+ "accounted for.\n", pkt->cmdString(), pkt->busFirstWordDelay,
+ pkt->busLastWordDelay);
+
// The first word will be delivered on the cycle after the header.
pkt->busFirstWordDelay = (headerCycles + 1) * clockPeriod() + offset;
pkt->setDest(rec->prevSrc);
delete rec;
+ // @todo someone should pay for this
+ pkt->busFirstWordDelay = pkt->busLastWordDelay = 0;
memSidePort->schedTimingSnoopResp(pkt, time);
}
// supplier had exclusive copy to begin with.
if (pkt->needsExclusive() && !pkt->isSupplyExclusive()) {
Packet *snoopPkt = new Packet(pkt, true); // clear flags
+ // also reset the bus time that the original packet has
+ // not yet paid for
+ snoopPkt->busFirstWordDelay = snoopPkt->busLastWordDelay = 0;
snoopPkt->setExpressSnoop();
snoopPkt->assertMemInhibit();
memSidePort->sendTimingReq(snoopPkt);
if (pkt->req->isUncacheable()) {
uncacheableFlush(pkt);
+ // @todo: someone should pay for this
+ pkt->busFirstWordDelay = pkt->busLastWordDelay = 0;
+
// writes go in write buffer, reads use MSHR
if (pkt->isWrite() && !pkt->isRead()) {
allocateWriteBuffer(pkt, time, true);
if (needsResponse) {
pkt->makeTimingResponse();
+ // @todo: Make someone pay for this
+ pkt->busFirstWordDelay = pkt->busLastWordDelay = 0;
cpuSidePort->schedTimingResp(pkt, clockEdge(lat));
} else {
/// @todo nominally we should just delete the packet here,
} else {
// miss
+ // @todo: Make someone pay for this
+ pkt->busFirstWordDelay = pkt->busLastWordDelay = 0;
+
Addr blk_addr = blockAlign(pkt->getAddr());
MSHR *mshr = mshrQueue.findMatch(blk_addr);
// isInvalidate() set otherwise.
target->pkt->cmd = MemCmd::ReadRespWithInvalidate;
}
+ // reset the bus additional time as it is now accounted for
+ target->pkt->busFirstWordDelay = target->pkt->busLastWordDelay = 0;
cpuSidePort->schedTimingResp(target->pkt, completion_time);
break;
assert(req_pkt->isInvalidate() || pkt->sharedAsserted());
pkt->allocate();
pkt->makeTimingResponse();
+ // @todo Make someone pay for this
+ pkt->busFirstWordDelay = pkt->busLastWordDelay = 0;
if (pkt->isRead()) {
pkt->setDataFromBlock(blk_data, blkSize);
}
Packet snoopPkt(pkt, true); // clear flags
snoopPkt.setExpressSnoop();
snoopPkt.pushSenderState(new ForwardResponseRecord(pkt->getSrc()));
+ // the snoop packet does not need to wait any additional
+ // time
+ snoopPkt.busFirstWordDelay = snoopPkt.busLastWordDelay = 0;
cpuSidePort->sendTimingSnoopReq(&snoopPkt);
if (snoopPkt.memInhibitAsserted()) {
// cache-to-cache response from some upper cache
if (add_outstanding)
outstandingReq.erase(pkt->req);
+ // undo the calculation so we can check for 0 again
+ pkt->busFirstWordDelay = pkt->busLastWordDelay = 0;
+
DPRINTF(CoherentBus, "recvTimingReq: src %s %s 0x%x RETRY\n",
src_port->name(), pkt->cmdString(), pkt->getAddr());
DPRINTF(NoncoherentBus, "recvTimingReq: src %s %s 0x%x RETRY\n",
src_port->name(), pkt->cmdString(), pkt->getAddr());
+ // undo the calculation so we can check for 0 again
+ pkt->busFirstWordDelay = pkt->busLastWordDelay = 0;
+
// occupy until the header is sent
reqLayer.failedTiming(src_port, clockEdge(Cycles(headerCycles)));
// access already turned the packet into a response
assert(pkt->isResponse());
+ // @todo someone should pay for this
+ pkt->busFirstWordDelay = pkt->busLastWordDelay = 0;
+
// queue the packet in the response queue to be sent out the
// next tick
port.schedTimingResp(pkt, curTick() + 1);
return false;
}
+ // @todo someone should pay for this
+ pkt->busFirstWordDelay = pkt->busLastWordDelay = 0;
+
// update the release time according to the bandwidth limit, and
// do so with respect to the time it takes to finish this request
// rather than long term as it is the short term data rate that is