Add a very poor implementation of dealing with retries on timing requests. It is especially slow with tracing on since

it ends up being O(N^2). But it's probably going to have to change for the real bus anyway, so it should be rewritten then
Change recvRetry() to not accept a packet. Sendtiming should be called again (and can respond with false or true)
Removed Port Blocked/Unblocked and replaced with sendRetry().
Remove possibility of packet mangling if packet is going to be refused anyway in bridge

src/cpu/simple/atomic.cc:
src/cpu/simple/atomic.hh:
src/cpu/simple/timing.cc:
src/cpu/simple/timing.hh:
    Change recvRetry() to not accept a packet. Sendtiming should be called again (and can respond with false or true)
src/dev/io_device.cc:
src/dev/io_device.hh:
    Make DMA Timing requests/responses work.
    Change recvRetry() to not accept a packet. Sendtiming should be called again (and can respond with false or true)
src/mem/bridge.cc:
src/mem/bridge.hh:
    Change recvRetry() to not accept a packet. Sendtiming should be called again (and can respond with false or true)
    Removed Port Blocked/Unblocked and replaced with sendRetry().
    Remove posibility of packet mangling if packet is going to be refused anyway.
src/mem/bus.cc:
src/mem/bus.hh:
    Add a very poor implementation of dealing with retries on timing requests. It is especially slow with tracing on since
    it ends up being O(N^2). But it's probably going to have to change for the real bus anyway, so it should be rewritten then
src/mem/port.hh:
    Change recvRetry() to not accept a packet. Sendtiming should be called again (and can respond with false or true)
    Removed Blocked/Unblocked port status, their functionality is really duplicated in the recvRetry() method

--HG--
extra : convert_revision : fab613404be54bfa7a4c67572bae7b559169e573
This commit is contained in:
Ali Saidi
2006-05-30 18:57:42 -04:00
parent e60dc5195c
commit 09d8a1e125
11 changed files with 148 additions and 118 deletions

View File

@@ -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,6 +76,7 @@ PioPort::SendEvent::process()
}
bool
PioPort::recvTiming(Packet *pkt)
{
@@ -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");
}
}
@@ -192,13 +198,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 +221,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);

View File

@@ -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;
};
/**