34a35
> #include "sim/system.hh"
37,38c38,40
< PioPort::PioPort(PioDevice *dev, Platform *p, std::string pname)
< : Port(dev->name() + pname), device(dev), platform(p)
---
> PioPort::PioPort(PioDevice *dev, System *s, std::string pname)
> : Port(dev->name() + pname), device(dev), sys(s),
> outTiming(0), drainEvent(NULL)
70a73,76
> if (transmitList.size() == 0 && drainEvent) {
> drainEvent->process();
> drainEvent = NULL;
> }
75a82,83
> port->outTiming--;
> assert(port->outTiming >= 0);
77c85,89
< return;
---
> if (port->transmitList.size() == 0 && port->drainEvent) {
> port->drainEvent->process();
> port->drainEvent = NULL;
> }
> return;
107a120,128
> unsigned int
> PioPort::drain(Event *de)
> {
> if (outTiming == 0 && transmitList.size() == 0)
> return 0;
> drainEvent = de;
> return 1;
> }
>
121a143,155
>
> unsigned int
> PioDevice::drain(Event *de)
> {
> unsigned int count;
> count = pioPort->drain(de);
> if (count)
> changeState(Draining);
> else
> changeState(Drained);
> return count;
> }
>
131,132c165,167
< DmaPort::DmaPort(DmaDevice *dev, Platform *p)
< : Port(dev->name() + "-dmaport"), device(dev), platform(p), pendingCount(0)
---
> DmaPort::DmaPort(DmaDevice *dev, System *s)
> : Port(dev->name() + "-dmaport"), device(dev), sys(s), pendingCount(0),
> actionInProgress(0), drainEvent(NULL)
161a197,201
>
> if (pendingCount == 0 && drainEvent) {
> drainEvent->process();
> drainEvent = NULL;
> }
172a213,235
>
> unsigned int
> DmaDevice::drain(Event *de)
> {
> unsigned int count;
> count = pioPort->drain(de) + dmaPort->drain(de);
> if (count)
> changeState(Draining);
> else
> changeState(Drained);
> return count;
> }
>
> unsigned int
> DmaPort::drain(Event *de)
> {
> if (pendingCount == 0)
> return 0;
> drainEvent = de;
> return 1;
> }
>
>
197a261,262
> assert(device->getState() == SimObject::Running);
>
214a280
>
221,224c287,307
< // 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;
---
> // some kind of selction between access methods
> // more work is going to have to be done to make
> // switching actually work
> System::MemoryMode state = sys->getMemoryMode();
> if (state == System::Timing) {
> DPRINTF(DMA, "Attempting to send Packet %#x with addr: %#x\n",
> pkt, pkt->getAddr());
> if (transmitList.size() || !sendTiming(pkt)) {
> if (front)
> transmitList.push_front(pkt);
> else
> transmitList.push_back(pkt);
> DPRINTF(DMA, "-- Failed: queued\n");
> } else {
> DPRINTF(DMA, "-- Done\n");
> }
> } else if (state == System::Atomic) {
> sendAtomic(pkt);
> assert(pkt->senderState);
> DmaReqState *state = dynamic_cast<DmaReqState*>(pkt->senderState);
> assert(state);
226,250c309,318
< if (state == Timing) { */
< DPRINTF(DMA, "Attempting to send Packet %#x with addr: %#x\n",
< pkt, pkt->getAddr());
< if (transmitList.size() || !sendTiming(pkt)) {
< if (front)
< transmitList.push_front(pkt);
< else
< transmitList.push_back(pkt);
< DPRINTF(DMA, "-- Failed: queued\n");
< } else {
< DPRINTF(DMA, "-- Done\n");
< }
< /* } 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);
< delete state;
< }
< pendingCount--;
< assert(pendingCount >= 0);
< delete pkt->req;
< delete pkt;
---
> state->numBytes += pkt->req->getSize();
> if (state->totBytes == state->numBytes) {
> state->completionEvent->schedule(curTick +
> (pkt->time - pkt->req->getTime()) +1);
> delete state;
> delete pkt->req;
> }
> pendingCount--;
> assert(pendingCount >= 0);
> delete pkt;
252,256c320,324
< } else if (state == Functional) {
< sendFunctional(pkt);
< // Is this correct???
< completionEvent->schedule(pkt->req->responseTime - pkt->req->requestTime);
< completionEvent == NULL;
---
> if (pendingCount == 0 && drainEvent) {
> drainEvent->process();
> drainEvent = NULL;
> }
>
259d326
< */