diff options
author | Ali Saidi <saidi@eecs.umich.edu> | 2006-03-21 15:45:40 -0500 |
---|---|---|
committer | Ali Saidi <saidi@eecs.umich.edu> | 2006-03-21 15:45:40 -0500 |
commit | a70ce910f3303efe934c564817cc421369f51b36 (patch) | |
tree | 7b1dfddd980ed3e7715a65fd626456906f6d7018 /dev/io_device.cc | |
parent | b855ea6968559f1fac10b762e170ff9adabe4f9f (diff) | |
parent | 8654cfa427d7346d7164946b91ea768e1fd64310 (diff) | |
download | gem5-a70ce910f3303efe934c564817cc421369f51b36.tar.xz |
Merge zizzer:/bk/newmem
into zeep.eecs.umich.edu:/z/saidi/work/m5.newmem
--HG--
extra : convert_revision : 45dba22ecbdfc8e1bb0df1efd06a37f40d56b67f
Diffstat (limited to 'dev/io_device.cc')
-rw-r--r-- | dev/io_device.cc | 104 |
1 files changed, 79 insertions, 25 deletions
diff --git a/dev/io_device.cc b/dev/io_device.cc index b580c2805..268484e57 100644 --- a/dev/io_device.cc +++ b/dev/io_device.cc @@ -29,10 +29,44 @@ #include "dev/io_device.hh" #include "sim/builder.hh" + +PioPort::PioPort(PioDevice *dev) + : device(dev) +{ } + + +Tick +PioPort::recvAtomic(Packet &pkt) +{ + return device->recvAtomic(pkt); +} + +void +PioPort::recvFunctional(Packet &pkt) +{ + device->recvAtomic(pkt); +} + +void +PioPort::getDeviceAddressRanges(AddrRangeList &range_list, bool &owner) +{ + device->addressRanges(range_list, owner); +} + + +Packet * +PioPort::recvRetry() +{ + Packet* pkt = transmitList.front(); + transmitList.pop_front(); + return pkt; +} + + void PioPort::SendEvent::process() { - if (port->sendTiming(packet) == Success) + if (port->Port::sendTiming(packet) == Success) return; port->transmitList.push_back(&packet); @@ -46,37 +80,57 @@ PioDevice::PioDevice(const std::string &name, Platform *p) bool -PioDevice::recvTiming(Packet &pkt) +PioPort::recvTiming(Packet &pkt) { device->recvAtomic(pkt); - sendTiming(pkt, pkt.responseTime-pkt.requestTime); + sendTiming(pkt, pkt.req->responseTime-pkt.req->requestTime); return Success; } PioDevice::~PioDevice() { if (pioPort) - delete pioInterface; + delete pioPort; } -void -DmaPort::sendDma(Packet &pkt) + +DmaPort::DmaPort(DmaDevice *dev) + : device(dev) +{ } + +bool +DmaPort::recvTiming(Packet &pkt) { - device->platform->system->memoryMode() - { - case MemAtomic: - } + completionEvent->schedule(curTick+1); + completionEvent = NULL; + return Success; } DmaDevice::DmaDevice(const std::string &name, Platform *p) : PioDevice(name, p) { - dmaPort = new dmaPort(this); + dmaPort = new DmaPort(this); } void -DmaPort::dmaAction(Memory::Command cmd, DmaPort port, Addr addr, int size, - Event *event, uint8_t *data = NULL) +DmaPort::SendEvent::process() +{ + if (port->Port::sendTiming(packet) == Success) + return; + + port->transmitList.push_back(&packet); +} + +Packet * +DmaPort::recvRetry() +{ + Packet* pkt = transmitList.front(); + transmitList.pop_front(); + return pkt; +} +void +DmaPort::dmaAction(Command cmd, DmaPort port, Addr addr, int size, + Event *event, uint8_t *data) { assert(event); @@ -92,9 +146,9 @@ DmaPort::dmaAction(Memory::Command cmd, DmaPort port, Addr addr, int size, basePkt.dest = 0; basePkt.cmd = cmd; basePkt.result = Unknown; - basePkt.request = NULL; + basePkt.req = NULL; baseReq.nicReq = true; - baseReq.time = curTick; + baseReq.requestTime = curTick; completionEvent = event; @@ -109,7 +163,7 @@ DmaPort::dmaAction(Memory::Command cmd, DmaPort port, Addr addr, int size, pkt->req->size = pkt->size; // Increment the data pointer on a write pkt->data = data ? data + prevSize : NULL ; - prevSize = pkt->size; + prevSize += pkt->size; sendDma(*pkt); } @@ -122,29 +176,29 @@ DmaPort::sendDma(Packet &pkt) // some kind of selction between access methods // more work is going to have to be done to make // switching actually work - MemState state = device->platform->system->memState; + /* MemState state = device->platform->system->memState; if (state == Timing) { if (sendTiming(pkt) == Failure) transmitList.push_back(&packet); - } else if (state == Atomic) { + } else if (state == Atomic) {*/ sendAtomic(pkt); - completionEvent->schedule(pkt.responseTime - pkt.requestTime); - completionEvent == NULL; - } else if (state == Functional) { + completionEvent->schedule(pkt.req->responseTime - pkt.req->requestTime); + completionEvent = NULL; +/* } else if (state == Functional) { sendFunctional(pkt); // Is this correct??? - completionEvent->schedule(pkt.responseTime - pkt.requestTime); + completionEvent->schedule(pkt.req->responseTime - pkt.req->requestTime); completionEvent == NULL; } else panic("Unknown memory command state."); - + */ } DmaDevice::~DmaDevice() { - if (dmaInterface) - delete dmaInterface; + if (dmaPort) + delete dmaPort; } |