summaryrefslogtreecommitdiff
path: root/src/dev
diff options
context:
space:
mode:
Diffstat (limited to 'src/dev')
-rw-r--r--src/dev/alpha_console.cc3
-rw-r--r--src/dev/ide_ctrl.cc3
-rw-r--r--src/dev/io_device.cc68
-rw-r--r--src/dev/io_device.hh26
-rw-r--r--src/dev/isa_fake.cc3
-rw-r--r--src/dev/ns_gige.cc3
-rw-r--r--src/dev/pciconfigall.cc3
-rw-r--r--src/dev/sinic.cc3
-rw-r--r--src/dev/tsunami_cchip.cc4
-rw-r--r--src/dev/tsunami_io.cc3
-rw-r--r--src/dev/tsunami_pchip.cc4
-rw-r--r--src/dev/uart8250.cc2
12 files changed, 44 insertions, 81 deletions
diff --git a/src/dev/alpha_console.cc b/src/dev/alpha_console.cc
index 0b4bb048c..c5b105fc7 100644
--- a/src/dev/alpha_console.cc
+++ b/src/dev/alpha_console.cc
@@ -98,7 +98,6 @@ AlphaConsole::read(Packet *pkt)
assert(pkt->result == Packet::Unknown);
assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
- pkt->time += pioDelay;
Addr daddr = pkt->getAddr() - pioAddr;
pkt->allocate();
@@ -191,8 +190,6 @@ AlphaConsole::read(Packet *pkt)
Tick
AlphaConsole::write(Packet *pkt)
{
- pkt->time += pioDelay;
-
assert(pkt->result == Packet::Unknown);
assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
Addr daddr = pkt->getAddr() - pioAddr;
diff --git a/src/dev/ide_ctrl.cc b/src/dev/ide_ctrl.cc
index eb03d5db8..d8dff0870 100644
--- a/src/dev/ide_ctrl.cc
+++ b/src/dev/ide_ctrl.cc
@@ -430,7 +430,6 @@ IdeController::read(Packet *pkt)
IdeRegType reg_type;
int disk;
- pkt->time += pioDelay;
pkt->allocate();
if (pkt->getSize() != 1 && pkt->getSize() != 2 && pkt->getSize() !=4)
panic("Bad IDE read size: %d\n", pkt->getSize());
@@ -518,8 +517,6 @@ IdeController::write(Packet *pkt)
int disk;
uint8_t oldVal, newVal;
- pkt->time += pioDelay;
-
parseAddr(pkt->getAddr(), offset, channel, reg_type);
if (!io_enabled) {
diff --git a/src/dev/io_device.cc b/src/dev/io_device.cc
index 87fdbb765..c644308b6 100644
--- a/src/dev/io_device.cc
+++ b/src/dev/io_device.cc
@@ -26,6 +26,7 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+#include "base/trace.hh"
#include "dev/io_device.hh"
#include "sim/builder.hh"
@@ -55,12 +56,13 @@ PioPort::getDeviceAddressRanges(AddrRangeList &resp, AddrRangeList &snoop)
}
-Packet *
+void
PioPort::recvRetry()
{
Packet* pkt = transmitList.front();
- transmitList.pop_front();
- return pkt;
+ if (Port::sendTiming(pkt)) {
+ transmitList.pop_front();
+ }
}
@@ -74,13 +76,14 @@ PioPort::SendEvent::process()
}
+
bool
PioPort::recvTiming(Packet *pkt)
{
- device->recvAtomic(pkt);
+ Tick latency = device->recvAtomic(pkt);
// turn packet around to go back to requester
pkt->makeTimingResponse();
- sendTiming(pkt, pkt->time - pkt->req->getTime());
+ sendTiming(pkt, latency);
return true;
}
@@ -116,16 +119,20 @@ DmaPort::recvTiming(Packet *pkt)
{
if (pkt->senderState) {
DmaReqState *state;
+ DPRINTF(DMA, "Received response Packet %#x with senderState: %#x\n",
+ pkt, pkt->senderState);
state = dynamic_cast<DmaReqState*>(pkt->senderState);
- state->completionEvent->schedule(pkt->time - pkt->req->getTime());
+ assert(state);
+ state->completionEvent->process();
delete pkt->req;
delete pkt;
} else {
+ DPRINTF(DMA, "Received response Packet %#x with no senderState\n", pkt);
delete pkt->req;
delete pkt;
}
- return Packet::Success;
+ return true;
}
DmaDevice::DmaDevice(Params *p)
@@ -133,20 +140,19 @@ DmaDevice::DmaDevice(Params *p)
{ }
void
-DmaPort::SendEvent::process()
-{
- if (port->Port::sendTiming(packet))
- return;
-
- port->transmitList.push_back(packet);
-}
-
-Packet *
DmaPort::recvRetry()
{
Packet* pkt = transmitList.front();
- transmitList.pop_front();
- return pkt;
+ DPRINTF(DMA, "Retry on Packet %#x with senderState: %#x\n",
+ pkt, pkt->senderState);
+ if (sendTiming(pkt)) {
+ DPRINTF(DMA, "-- Done\n");
+ transmitList.pop_front();
+ pendingCount--;
+ assert(pendingCount >= 0);
+ } else {
+ DPRINTF(DMA, "-- Failed, queued\n");
+ }
}
@@ -160,15 +166,12 @@ DmaPort::dmaAction(Packet::Command cmd, Addr addr, int size, Event *event,
for (ChunkGenerator gen(addr, size, peerBlockSize());
!gen.done(); gen.next()) {
- Request *req = new Request(false);
- req->setPaddr(gen.addr());
- req->setSize(gen.size());
- req->setTime(curTick);
+ Request *req = new Request(gen.addr(), gen.size(), 0);
Packet *pkt = new Packet(req, cmd, Packet::Broadcast);
// Increment the data pointer on a write
if (data)
- pkt->dataStatic(data + prevSize) ;
+ pkt->dataStatic(data + prevSize);
prevSize += gen.size();
@@ -192,13 +195,22 @@ DmaPort::sendDma(Packet *pkt)
// switching actually work
/* MemState state = device->platform->system->memState;
- if (state == Timing) {
- if (!sendTiming(pkt))
- transmitList.push_back(&packet);
- } else if (state == Atomic) {*/
+ if (state == Timing) { */
+ DPRINTF(DMA, "Attempting to send Packet %#x with senderState: %#x\n",
+ pkt, pkt->senderState);
+ if (!sendTiming(pkt)) {
+ transmitList.push_back(pkt);
+ DPRINTF(DMA, "-- Failed: queued\n");
+ } else {
+ DPRINTF(DMA, "-- Done\n");
+ pendingCount--;
+ assert(pendingCount >= 0);
+ }
+ /* } else if (state == Atomic) {
sendAtomic(pkt);
if (pkt->senderState) {
DmaReqState *state = dynamic_cast<DmaReqState*>(pkt->senderState);
+ assert(state);
state->completionEvent->schedule(curTick + (pkt->time - pkt->req->getTime()) +1);
}
pendingCount--;
@@ -206,7 +218,7 @@ DmaPort::sendDma(Packet *pkt)
delete pkt->req;
delete pkt;
-/* } else if (state == Functional) {
+ } else if (state == Functional) {
sendFunctional(pkt);
// Is this correct???
completionEvent->schedule(pkt->req->responseTime - pkt->req->requestTime);
diff --git a/src/dev/io_device.hh b/src/dev/io_device.hh
index 74730ad92..5836da3c9 100644
--- a/src/dev/io_device.hh
+++ b/src/dev/io_device.hh
@@ -105,8 +105,9 @@ class PioPort : public Port
void sendTiming(Packet *pkt, Tick time)
{ new PioPort::SendEvent(this, pkt, time); }
- /** This function pops the last element off the transmit list and sends it.*/
- virtual Packet *recvRetry();
+ /** This function is notification that the device should attempt to send a
+ * packet again. */
+ virtual void recvRetry();
public:
PioPort(PioDevice *dev, Platform *p);
@@ -146,28 +147,11 @@ class DmaPort : public Port
virtual void recvStatusChange(Status status)
{ ; }
- virtual Packet *recvRetry() ;
+ virtual void recvRetry() ;
virtual void getDeviceAddressRanges(AddrRangeList &resp, AddrRangeList &snoop)
{ resp.clear(); snoop.clear(); }
- class SendEvent : public Event
- {
- DmaPort *port;
- Packet *packet;
-
- SendEvent(PioPort *p, Packet *pkt, Tick t)
- : Event(&mainEventQueue), packet(pkt)
- { schedule(curTick + t); }
-
- virtual void process();
-
- virtual const char *description()
- { return "Future scheduled sendTiming event"; }
-
- friend class DmaPort;
- };
-
void sendDma(Packet *pkt);
public:
@@ -178,8 +162,6 @@ class DmaPort : public Port
bool dmaPending() { return pendingCount > 0; }
- friend class DmaPort::SendEvent;
-
};
/**
diff --git a/src/dev/isa_fake.cc b/src/dev/isa_fake.cc
index c303ffc30..c00ee0adb 100644
--- a/src/dev/isa_fake.cc
+++ b/src/dev/isa_fake.cc
@@ -54,8 +54,6 @@ IsaFake::read(Packet *pkt)
assert(pkt->result == Packet::Unknown);
assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
- pkt->time += pioDelay;
-
DPRINTF(Tsunami, "read va=%#x size=%d\n", pkt->getAddr(), pkt->getSize());
switch (pkt->getSize()) {
@@ -80,7 +78,6 @@ IsaFake::read(Packet *pkt)
Tick
IsaFake::write(Packet *pkt)
{
- pkt->time += pioDelay;
DPRINTF(Tsunami, "write - va=%#x size=%d \n", pkt->getAddr(), pkt->getSize());
pkt->result = Packet::Success;
return pioDelay;
diff --git a/src/dev/ns_gige.cc b/src/dev/ns_gige.cc
index 963675847..719747b26 100644
--- a/src/dev/ns_gige.cc
+++ b/src/dev/ns_gige.cc
@@ -492,7 +492,6 @@ NSGigE::read(Packet *pkt)
{
assert(ioEnable);
- pkt->time += pioDelay;
pkt->allocate();
//The mask is to give you only the offset into the device register file
@@ -728,8 +727,6 @@ NSGigE::write(Packet *pkt)
DPRINTF(EthernetPIO, "write da=%#x pa=%#x size=%d\n",
daddr, pkt->getAddr(), pkt->getSize());
- pkt->time += pioDelay;
-
if (daddr > LAST && daddr <= RESERVED) {
panic("Accessing reserved register");
} else if (daddr > RESERVED && daddr <= 0x3FC) {
diff --git a/src/dev/pciconfigall.cc b/src/dev/pciconfigall.cc
index 14a28e86d..9b679ed95 100644
--- a/src/dev/pciconfigall.cc
+++ b/src/dev/pciconfigall.cc
@@ -99,7 +99,6 @@ PciConfigAll::read(Packet *pkt)
int func = (daddr >> 8) & 0x7;
int reg = daddr & 0xFF;
- pkt->time += pioDelay;
pkt->allocate();
DPRINTF(PciConfigAll, "read va=%#x da=%#x size=%d\n", pkt->getAddr(), daddr,
@@ -134,8 +133,6 @@ PciConfigAll::read(Packet *pkt)
Tick
PciConfigAll::write(Packet *pkt)
{
- pkt->time += pioDelay;
-
assert(pkt->result == Packet::Unknown);
assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
assert(pkt->getSize() == sizeof(uint8_t) || pkt->getSize() == sizeof(uint16_t) ||
diff --git a/src/dev/sinic.cc b/src/dev/sinic.cc
index 31fbc49aa..529024a90 100644
--- a/src/dev/sinic.cc
+++ b/src/dev/sinic.cc
@@ -322,7 +322,6 @@ Device::read(Packet *pkt)
Addr index = daddr >> Regs::VirtualShift;
Addr raddr = daddr & Regs::VirtualMask;
- pkt->time += pioDelay;
pkt->allocate();
if (!regValid(raddr))
@@ -410,8 +409,6 @@ Device::write(Packet *pkt)
Addr index = daddr >> Regs::VirtualShift;
Addr raddr = daddr & Regs::VirtualMask;
- pkt->time += pioDelay;
-
if (!regValid(raddr))
panic("invalid register: cpu=%d, da=%#x pa=%#x size=%d",
cpu, daddr, pkt->getAddr(), pkt->getSize());
diff --git a/src/dev/tsunami_cchip.cc b/src/dev/tsunami_cchip.cc
index 146321b9f..e5ef18448 100644
--- a/src/dev/tsunami_cchip.cc
+++ b/src/dev/tsunami_cchip.cc
@@ -76,7 +76,6 @@ TsunamiCChip::read(Packet *pkt)
assert(pkt->result == Packet::Unknown);
assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
- pkt->time += pioDelay;
Addr regnum = (pkt->getAddr() - pioAddr) >> 6;
Addr daddr = (pkt->getAddr() - pioAddr);
@@ -182,9 +181,6 @@ TsunamiCChip::read(Packet *pkt)
Tick
TsunamiCChip::write(Packet *pkt)
{
- pkt->time += pioDelay;
-
-
assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
Addr daddr = pkt->getAddr() - pioAddr;
Addr regnum = (pkt->getAddr() - pioAddr) >> 6 ;
diff --git a/src/dev/tsunami_io.cc b/src/dev/tsunami_io.cc
index 729a61cf7..8eaf7679f 100644
--- a/src/dev/tsunami_io.cc
+++ b/src/dev/tsunami_io.cc
@@ -447,7 +447,6 @@ TsunamiIO::read(Packet *pkt)
assert(pkt->result == Packet::Unknown);
assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
- pkt->time += pioDelay;
Addr daddr = pkt->getAddr() - pioAddr;
DPRINTF(Tsunami, "io read va=%#x size=%d IOPorrt=%#x\n", pkt->getAddr(),
@@ -511,8 +510,6 @@ TsunamiIO::read(Packet *pkt)
Tick
TsunamiIO::write(Packet *pkt)
{
- pkt->time += pioDelay;
-
assert(pkt->result == Packet::Unknown);
assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
Addr daddr = pkt->getAddr() - pioAddr;
diff --git a/src/dev/tsunami_pchip.cc b/src/dev/tsunami_pchip.cc
index c430ca0a0..5252ccea6 100644
--- a/src/dev/tsunami_pchip.cc
+++ b/src/dev/tsunami_pchip.cc
@@ -70,8 +70,6 @@ TsunamiPChip::read(Packet *pkt)
assert(pkt->result == Packet::Unknown);
assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
-
- pkt->time += pioDelay;
pkt->allocate();
Addr daddr = (pkt->getAddr() - pioAddr) >> 6;;
assert(pkt->getSize() == sizeof(uint64_t));
@@ -151,8 +149,6 @@ TsunamiPChip::read(Packet *pkt)
Tick
TsunamiPChip::write(Packet *pkt)
{
- pkt->time += pioDelay;
-
assert(pkt->result == Packet::Unknown);
assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
Addr daddr = (pkt->getAddr() - pioAddr) >> 6;
diff --git a/src/dev/uart8250.cc b/src/dev/uart8250.cc
index 8a5a1f1cd..9aae6a75b 100644
--- a/src/dev/uart8250.cc
+++ b/src/dev/uart8250.cc
@@ -114,7 +114,6 @@ Uart8250::read(Packet *pkt)
assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
assert(pkt->getSize() == 1);
- pkt->time += pioDelay;
Addr daddr = pkt->getAddr() - pioAddr;
pkt->allocate();
@@ -198,7 +197,6 @@ Uart8250::write(Packet *pkt)
assert(pkt->getAddr() >= pioAddr && pkt->getAddr() < pioAddr + pioSize);
assert(pkt->getSize() == 1);
- pkt->time += pioDelay;
Addr daddr = pkt->getAddr() - pioAddr;
DPRINTF(Uart, " write register %#x value %#x\n", daddr, pkt->get<uint8_t>());