bridge.cc revision 5476:758c2413765a
12810Srdreslin@umich.edu
213732Snikos.nikoleris@arm.com/*
311051Sandreas.hansson@arm.com * Copyright (c) 2006 The Regents of The University of Michigan
411051Sandreas.hansson@arm.com * All rights reserved.
511051Sandreas.hansson@arm.com *
611051Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without
711051Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are
811051Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright
911051Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer;
1011051Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright
1111051Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the
1211051Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution;
1311051Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its
1411051Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from
1511051Sandreas.hansson@arm.com * this software without specific prior written permission.
162810Srdreslin@umich.edu *
172810Srdreslin@umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
182810Srdreslin@umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
192810Srdreslin@umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
202810Srdreslin@umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
212810Srdreslin@umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
222810Srdreslin@umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
232810Srdreslin@umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
242810Srdreslin@umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
252810Srdreslin@umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
262810Srdreslin@umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
272810Srdreslin@umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
282810Srdreslin@umich.edu *
292810Srdreslin@umich.edu * Authors: Ali Saidi
302810Srdreslin@umich.edu *          Steve Reinhardt
312810Srdreslin@umich.edu */
322810Srdreslin@umich.edu
332810Srdreslin@umich.edu/**
342810Srdreslin@umich.edu * @file
352810Srdreslin@umich.edu * Definition of a simple bus bridge without buffering.
362810Srdreslin@umich.edu */
372810Srdreslin@umich.edu
382810Srdreslin@umich.edu#include <algorithm>
392810Srdreslin@umich.edu
402810Srdreslin@umich.edu#include "base/range_ops.hh"
412810Srdreslin@umich.edu#include "base/trace.hh"
4211051Sandreas.hansson@arm.com#include "mem/bridge.hh"
4311051Sandreas.hansson@arm.com#include "params/Bridge.hh"
442810Srdreslin@umich.edu
4511051Sandreas.hansson@arm.comBridge::BridgePort::BridgePort(const std::string &_name,
4611051Sandreas.hansson@arm.com                               Bridge *_bridge, BridgePort *_otherPort,
4712349Snikos.nikoleris@arm.com                               int _delay, int _nack_delay, int _req_limit,
482810Srdreslin@umich.edu                               int _resp_limit,
492810Srdreslin@umich.edu                               std::vector<Range<Addr> > filter_ranges)
502810Srdreslin@umich.edu    : Port(_name), bridge(_bridge), otherPort(_otherPort),
512810Srdreslin@umich.edu      delay(_delay), nackDelay(_nack_delay), filterRanges(filter_ranges),
5211051Sandreas.hansson@arm.com      outstandingResponses(0), queuedRequests(0), inRetry(false),
532810Srdreslin@umich.edu      reqQueueLimit(_req_limit), respQueueLimit(_resp_limit), sendEvent(this)
542810Srdreslin@umich.edu{
5511051Sandreas.hansson@arm.com}
562810Srdreslin@umich.edu
5712724Snikos.nikoleris@arm.comBridge::Bridge(Params *p)
5812724Snikos.nikoleris@arm.com    : MemObject(p),
5912724Snikos.nikoleris@arm.com      portA(p->name + "-portA", this, &portB, p->delay, p->nack_delay,
6012334Sgabeblack@google.com              p->req_size_a, p->resp_size_a, p->filter_ranges_a),
6112724Snikos.nikoleris@arm.com      portB(p->name + "-portB", this, &portA, p->delay, p->nack_delay,
6211051Sandreas.hansson@arm.com              p->req_size_b, p->resp_size_b, p->filter_ranges_b),
6311051Sandreas.hansson@arm.com      ackWrites(p->write_ack), _params(p)
6411051Sandreas.hansson@arm.com{
6511288Ssteve.reinhardt@amd.com    if (ackWrites)
6612724Snikos.nikoleris@arm.com        panic("No support for acknowledging writes\n");
6713223Sodanrc@yahoo.com.br}
6811051Sandreas.hansson@arm.com
6912724Snikos.nikoleris@arm.comPort *
7012724Snikos.nikoleris@arm.comBridge::getPort(const std::string &if_name, int idx)
7112724Snikos.nikoleris@arm.com{
7212724Snikos.nikoleris@arm.com    BridgePort *port;
7311051Sandreas.hansson@arm.com
7411053Sandreas.hansson@arm.com    if (if_name == "side_a")
7511053Sandreas.hansson@arm.com        port = &portA;
7612724Snikos.nikoleris@arm.com    else if (if_name == "side_b")
7711051Sandreas.hansson@arm.com        port = &portB;
7811051Sandreas.hansson@arm.com    else
7911051Sandreas.hansson@arm.com        return NULL;
8011051Sandreas.hansson@arm.com
8111601Sandreas.hansson@arm.com    if (port->getPeer() != NULL && !port->getPeer()->isDefaultPort())
8211601Sandreas.hansson@arm.com        panic("bridge side %s already connected to %s.",
8311051Sandreas.hansson@arm.com                if_name, port->getPeer()->name());
8412724Snikos.nikoleris@arm.com    return port;
8511051Sandreas.hansson@arm.com}
8612724Snikos.nikoleris@arm.com
8711600Sandreas.hansson@arm.com
8811600Sandreas.hansson@arm.comvoid
8911051Sandreas.hansson@arm.comBridge::init()
9011051Sandreas.hansson@arm.com{
9111051Sandreas.hansson@arm.com    // Make sure that both sides are connected to.
9211284Sandreas.hansson@arm.com    if (!portA.isConnected() || !portB.isConnected())
9311051Sandreas.hansson@arm.com        fatal("Both ports of bus bridge are not connected to a bus.\n");
9411051Sandreas.hansson@arm.com
9511051Sandreas.hansson@arm.com    if (portA.peerBlockSize() != portB.peerBlockSize())
9611602Sandreas.hansson@arm.com        fatal("Busses don't have the same block size... Not supported.\n");
9711051Sandreas.hansson@arm.com}
9811051Sandreas.hansson@arm.com
9911284Sandreas.hansson@arm.combool
10011051Sandreas.hansson@arm.comBridge::BridgePort::respQueueFull()
10111284Sandreas.hansson@arm.com{
10211602Sandreas.hansson@arm.com    assert(outstandingResponses >= 0 && outstandingResponses <= respQueueLimit);
10311051Sandreas.hansson@arm.com    return outstandingResponses >= respQueueLimit;
10411051Sandreas.hansson@arm.com}
10511284Sandreas.hansson@arm.com
10611051Sandreas.hansson@arm.combool
10711284Sandreas.hansson@arm.comBridge::BridgePort::reqQueueFull()
10811284Sandreas.hansson@arm.com{
10911284Sandreas.hansson@arm.com    assert(queuedRequests >= 0 && queuedRequests <= reqQueueLimit);
11011051Sandreas.hansson@arm.com    return queuedRequests >= reqQueueLimit;
11111051Sandreas.hansson@arm.com}
11211051Sandreas.hansson@arm.com
11311284Sandreas.hansson@arm.com/** Function called by the port when the bus is receiving a Timing
11411284Sandreas.hansson@arm.com * transaction.*/
11511284Sandreas.hansson@arm.combool
11611284Sandreas.hansson@arm.comBridge::BridgePort::recvTiming(PacketPtr pkt)
11711051Sandreas.hansson@arm.com{
11811051Sandreas.hansson@arm.com    DPRINTF(BusBridge, "recvTiming: src %d dest %d addr 0x%x\n",
11911051Sandreas.hansson@arm.com                pkt->getSrc(), pkt->getDest(), pkt->getAddr());
12011284Sandreas.hansson@arm.com
12111284Sandreas.hansson@arm.com    DPRINTF(BusBridge, "Local queue size: %d outreq: %d outresp: %d\n",
12211284Sandreas.hansson@arm.com                    sendQueue.size(), queuedRequests, outstandingResponses);
12311197Sandreas.hansson@arm.com    DPRINTF(BusBridge, "Remote queue size: %d outreq: %d outresp: %d\n",
12411601Sandreas.hansson@arm.com                    otherPort->sendQueue.size(), otherPort->queuedRequests,
12511601Sandreas.hansson@arm.com                    otherPort->outstandingResponses);
12611601Sandreas.hansson@arm.com
12711601Sandreas.hansson@arm.com    if (pkt->isRequest() && otherPort->reqQueueFull()) {
12811601Sandreas.hansson@arm.com        DPRINTF(BusBridge, "Remote queue full, nacking\n");
12911601Sandreas.hansson@arm.com        nackRequest(pkt);
13011601Sandreas.hansson@arm.com        return true;
13111601Sandreas.hansson@arm.com    }
13211197Sandreas.hansson@arm.com
13311601Sandreas.hansson@arm.com    if (pkt->needsResponse())
13411601Sandreas.hansson@arm.com        if (respQueueFull()) {
13511601Sandreas.hansson@arm.com            DPRINTF(BusBridge, "Local queue full, no space for response, nacking\n");
13611601Sandreas.hansson@arm.com            DPRINTF(BusBridge, "queue size: %d outreq: %d outstanding resp: %d\n",
13711601Sandreas.hansson@arm.com                    sendQueue.size(), queuedRequests, outstandingResponses);
13811601Sandreas.hansson@arm.com            nackRequest(pkt);
13911601Sandreas.hansson@arm.com            return true;
14011051Sandreas.hansson@arm.com        } else {
14111051Sandreas.hansson@arm.com            DPRINTF(BusBridge, "Request Needs response, reserving space\n");
14211051Sandreas.hansson@arm.com            ++outstandingResponses;
14311051Sandreas.hansson@arm.com        }
14411051Sandreas.hansson@arm.com
14511284Sandreas.hansson@arm.com    otherPort->queueForSendTiming(pkt);
14611284Sandreas.hansson@arm.com
14711051Sandreas.hansson@arm.com    return true;
14811051Sandreas.hansson@arm.com}
14911051Sandreas.hansson@arm.com
15011051Sandreas.hansson@arm.comvoid
15111284Sandreas.hansson@arm.comBridge::BridgePort::nackRequest(PacketPtr pkt)
15211051Sandreas.hansson@arm.com{
15311051Sandreas.hansson@arm.com    // Nack the packet
15411051Sandreas.hansson@arm.com    pkt->makeTimingResponse();
15511051Sandreas.hansson@arm.com    pkt->setNacked();
15611051Sandreas.hansson@arm.com
15711051Sandreas.hansson@arm.com    //put it on the list to send
15811051Sandreas.hansson@arm.com    Tick readyTime = curTick + nackDelay;
15911051Sandreas.hansson@arm.com    PacketBuffer *buf = new PacketBuffer(pkt, readyTime, true);
16011051Sandreas.hansson@arm.com
16111051Sandreas.hansson@arm.com    // nothing on the list, add it and we're done
16211051Sandreas.hansson@arm.com    if (sendQueue.empty()) {
16311051Sandreas.hansson@arm.com        assert(!sendEvent.scheduled());
16411051Sandreas.hansson@arm.com        sendEvent.schedule(readyTime);
16511051Sandreas.hansson@arm.com        sendQueue.push_back(buf);
16611051Sandreas.hansson@arm.com        return;
16711051Sandreas.hansson@arm.com    }
16811051Sandreas.hansson@arm.com
16912724Snikos.nikoleris@arm.com    assert(sendEvent.scheduled() || inRetry);
17012724Snikos.nikoleris@arm.com
17112724Snikos.nikoleris@arm.com    // does it go at the end?
17212724Snikos.nikoleris@arm.com    if (readyTime >= sendQueue.back()->ready) {
17312724Snikos.nikoleris@arm.com        sendQueue.push_back(buf);
17412724Snikos.nikoleris@arm.com        return;
17512724Snikos.nikoleris@arm.com    }
17611051Sandreas.hansson@arm.com
17711051Sandreas.hansson@arm.com    // ok, somewhere in the middle, fun
17811051Sandreas.hansson@arm.com    std::list<PacketBuffer*>::iterator i = sendQueue.begin();
17911051Sandreas.hansson@arm.com    std::list<PacketBuffer*>::iterator end = sendQueue.end();
18013358Sodanrc@yahoo.com.br    std::list<PacketBuffer*>::iterator begin = sendQueue.begin();
18111051Sandreas.hansson@arm.com    bool done = false;
18211051Sandreas.hansson@arm.com
18311484Snikos.nikoleris@arm.com    while (i != end && !done) {
18411051Sandreas.hansson@arm.com        if (readyTime < (*i)->ready) {
18511051Sandreas.hansson@arm.com            if (i == begin)
18611051Sandreas.hansson@arm.com                sendEvent.reschedule(readyTime);
18711051Sandreas.hansson@arm.com            sendQueue.insert(i,buf);
18811051Sandreas.hansson@arm.com            done = true;
18912724Snikos.nikoleris@arm.com        }
19011601Sandreas.hansson@arm.com        i++;
19111601Sandreas.hansson@arm.com    }
19211601Sandreas.hansson@arm.com    assert(done);
19311051Sandreas.hansson@arm.com}
19411051Sandreas.hansson@arm.com
19511051Sandreas.hansson@arm.com
19611051Sandreas.hansson@arm.comvoid
19711051Sandreas.hansson@arm.comBridge::BridgePort::queueForSendTiming(PacketPtr pkt)
19812345Snikos.nikoleris@arm.com{
19912345Snikos.nikoleris@arm.com    if (pkt->isResponse()) {
20012345Snikos.nikoleris@arm.com        // This is a response for a request we forwarded earlier.  The
20112345Snikos.nikoleris@arm.com        // corresponding PacketBuffer should be stored in the packet's
20211051Sandreas.hansson@arm.com        // senderState field.
20311051Sandreas.hansson@arm.com
20411051Sandreas.hansson@arm.com        PacketBuffer *buf = dynamic_cast<PacketBuffer*>(pkt->senderState);
20511051Sandreas.hansson@arm.com        assert(buf != NULL);
20611051Sandreas.hansson@arm.com        // set up new packet dest & senderState based on values saved
20711051Sandreas.hansson@arm.com        // from original request
20811051Sandreas.hansson@arm.com        buf->fixResponse(pkt);
20911199Sandreas.hansson@arm.com
21011199Sandreas.hansson@arm.com        DPRINTF(BusBridge, "response, new dest %d\n", pkt->getDest());
21111199Sandreas.hansson@arm.com        delete buf;
21211199Sandreas.hansson@arm.com    }
21311199Sandreas.hansson@arm.com
21411051Sandreas.hansson@arm.com
21512345Snikos.nikoleris@arm.com    if (pkt->isRequest()) {
21612345Snikos.nikoleris@arm.com        ++queuedRequests;
21711051Sandreas.hansson@arm.com    }
21811051Sandreas.hansson@arm.com
21911051Sandreas.hansson@arm.com
22011051Sandreas.hansson@arm.com
22111051Sandreas.hansson@arm.com    Tick readyTime = curTick + delay;
22211051Sandreas.hansson@arm.com    PacketBuffer *buf = new PacketBuffer(pkt, readyTime);
22311051Sandreas.hansson@arm.com
22411051Sandreas.hansson@arm.com    // If we're about to put this packet at the head of the queue, we
22511051Sandreas.hansson@arm.com    // need to schedule an event to do the transmit.  Otherwise there
22611051Sandreas.hansson@arm.com    // should already be an event scheduled for sending the head
22711051Sandreas.hansson@arm.com    // packet.
22811051Sandreas.hansson@arm.com    if (sendQueue.empty()) {
22911051Sandreas.hansson@arm.com        sendEvent.schedule(readyTime);
23011051Sandreas.hansson@arm.com    }
23111051Sandreas.hansson@arm.com    sendQueue.push_back(buf);
23211051Sandreas.hansson@arm.com}
23311051Sandreas.hansson@arm.com
23411130Sali.jafri@arm.comvoid
23511130Sali.jafri@arm.comBridge::BridgePort::trySend()
23611130Sali.jafri@arm.com{
23711130Sali.jafri@arm.com    assert(!sendQueue.empty());
23811130Sali.jafri@arm.com
23911130Sali.jafri@arm.com    PacketBuffer *buf = sendQueue.front();
24011130Sali.jafri@arm.com
24111130Sali.jafri@arm.com    assert(buf->ready <= curTick);
24211130Sali.jafri@arm.com
24312345Snikos.nikoleris@arm.com    PacketPtr pkt = buf->pkt;
24412345Snikos.nikoleris@arm.com
24511130Sali.jafri@arm.com    DPRINTF(BusBridge, "trySend: origSrc %d dest %d addr 0x%x\n",
24611130Sali.jafri@arm.com            buf->origSrc, pkt->getDest(), pkt->getAddr());
24711130Sali.jafri@arm.com
24811130Sali.jafri@arm.com    bool wasReq = pkt->isRequest();
24911130Sali.jafri@arm.com    bool was_nacked_here = buf->nackedHere;
25011130Sali.jafri@arm.com
25112724Snikos.nikoleris@arm.com    // If the send was successful, make sure sender state was set to NULL
25211130Sali.jafri@arm.com    // otherwise we could get a NACK back of a packet that didn't expect a
25311130Sali.jafri@arm.com    // response and we would try to use freed memory.
25411130Sali.jafri@arm.com
25511130Sali.jafri@arm.com    Packet::SenderState *old_sender_state = pkt->senderState;
25611130Sali.jafri@arm.com    if (pkt->isRequest() && !buf->expectResponse)
25711130Sali.jafri@arm.com        pkt->senderState = NULL;
25812724Snikos.nikoleris@arm.com
25911130Sali.jafri@arm.com    if (sendTiming(pkt)) {
26011130Sali.jafri@arm.com        // send successful
26111130Sali.jafri@arm.com        sendQueue.pop_front();
26211130Sali.jafri@arm.com        buf->pkt = NULL; // we no longer own packet, so it's not safe to look at it
26311130Sali.jafri@arm.com
26411130Sali.jafri@arm.com        if (buf->expectResponse) {
26511130Sali.jafri@arm.com            // Must wait for response
26611130Sali.jafri@arm.com            DPRINTF(BusBridge, "  successful: awaiting response (%d)\n",
26711130Sali.jafri@arm.com                    outstandingResponses);
26811051Sandreas.hansson@arm.com        } else {
26911051Sandreas.hansson@arm.com            // no response expected... deallocate packet buffer now.
27011051Sandreas.hansson@arm.com            DPRINTF(BusBridge, "  successful: no response expected\n");
27111051Sandreas.hansson@arm.com            delete buf;
27211744Snikos.nikoleris@arm.com        }
27311051Sandreas.hansson@arm.com
27411276Sandreas.hansson@arm.com        if (wasReq)
27511276Sandreas.hansson@arm.com            --queuedRequests;
27611276Sandreas.hansson@arm.com        else if (!was_nacked_here)
27711276Sandreas.hansson@arm.com            --outstandingResponses;
27811276Sandreas.hansson@arm.com
27911276Sandreas.hansson@arm.com        // If there are more packets to send, schedule event to try again.
28011276Sandreas.hansson@arm.com        if (!sendQueue.empty()) {
28111276Sandreas.hansson@arm.com            buf = sendQueue.front();
28211276Sandreas.hansson@arm.com            DPRINTF(BusBridge, "Scheduling next send\n");
28311051Sandreas.hansson@arm.com            sendEvent.schedule(std::max(buf->ready, curTick + 1));
28411276Sandreas.hansson@arm.com        }
28511276Sandreas.hansson@arm.com    } else {
28611276Sandreas.hansson@arm.com        DPRINTF(BusBridge, "  unsuccessful\n");
28711276Sandreas.hansson@arm.com        pkt->senderState = old_sender_state;
28811276Sandreas.hansson@arm.com        inRetry = true;
28911051Sandreas.hansson@arm.com    }
29011051Sandreas.hansson@arm.com
29111051Sandreas.hansson@arm.com    DPRINTF(BusBridge, "trySend: queue size: %d outreq: %d outstanding resp: %d\n",
29211051Sandreas.hansson@arm.com                    sendQueue.size(), queuedRequests, outstandingResponses);
29311051Sandreas.hansson@arm.com}
29411051Sandreas.hansson@arm.com
29511051Sandreas.hansson@arm.com
29611051Sandreas.hansson@arm.comvoid
29711051Sandreas.hansson@arm.comBridge::BridgePort::recvRetry()
29811051Sandreas.hansson@arm.com{
29911051Sandreas.hansson@arm.com    inRetry = false;
30012724Snikos.nikoleris@arm.com    Tick nextReady = sendQueue.front()->ready;
30111051Sandreas.hansson@arm.com    if (nextReady <= curTick)
30211051Sandreas.hansson@arm.com        trySend();
30311051Sandreas.hansson@arm.com    else
30411051Sandreas.hansson@arm.com        sendEvent.schedule(nextReady);
30511051Sandreas.hansson@arm.com}
30611051Sandreas.hansson@arm.com
30711051Sandreas.hansson@arm.com/** Function called by the port when the bus is receiving a Atomic
30811051Sandreas.hansson@arm.com * transaction.*/
30911051Sandreas.hansson@arm.comTick
31011051Sandreas.hansson@arm.comBridge::BridgePort::recvAtomic(PacketPtr pkt)
31111051Sandreas.hansson@arm.com{
31211051Sandreas.hansson@arm.com    return delay + otherPort->sendAtomic(pkt);
31311051Sandreas.hansson@arm.com}
31412630Snikos.nikoleris@arm.com
31512720Snikos.nikoleris@arm.com/** Function called by the port when the bus is receiving a Functional
31612720Snikos.nikoleris@arm.com * transaction.*/
31712720Snikos.nikoleris@arm.comvoid
31812720Snikos.nikoleris@arm.comBridge::BridgePort::recvFunctional(PacketPtr pkt)
31912720Snikos.nikoleris@arm.com{
32012720Snikos.nikoleris@arm.com    std::list<PacketBuffer*>::iterator i;
32112720Snikos.nikoleris@arm.com
32212724Snikos.nikoleris@arm.com    pkt->pushLabel(name());
32312720Snikos.nikoleris@arm.com
32412720Snikos.nikoleris@arm.com    for (i = sendQueue.begin();  i != sendQueue.end(); ++i) {
32512720Snikos.nikoleris@arm.com        if (pkt->checkFunctional((*i)->pkt))
32612720Snikos.nikoleris@arm.com            return;
32712720Snikos.nikoleris@arm.com    }
32812720Snikos.nikoleris@arm.com
32912724Snikos.nikoleris@arm.com    pkt->popLabel();
33012724Snikos.nikoleris@arm.com
33112724Snikos.nikoleris@arm.com    // fall through if pkt still not satisfied
33212724Snikos.nikoleris@arm.com    otherPort->sendFunctional(pkt);
33312724Snikos.nikoleris@arm.com}
33412724Snikos.nikoleris@arm.com
33512724Snikos.nikoleris@arm.com/** Function called by the port when the bus is receiving a status change.*/
33612724Snikos.nikoleris@arm.comvoid
33712724Snikos.nikoleris@arm.comBridge::BridgePort::recvStatusChange(Port::Status status)
33812724Snikos.nikoleris@arm.com{
33912724Snikos.nikoleris@arm.com    otherPort->sendStatusChange(status);
34012724Snikos.nikoleris@arm.com}
34112724Snikos.nikoleris@arm.com
34212724Snikos.nikoleris@arm.comvoid
34312724Snikos.nikoleris@arm.comBridge::BridgePort::getDeviceAddressRanges(AddrRangeList &resp,
34412724Snikos.nikoleris@arm.com                                           bool &snoop)
34512724Snikos.nikoleris@arm.com{
34612724Snikos.nikoleris@arm.com    otherPort->getPeerAddressRanges(resp, snoop);
34712724Snikos.nikoleris@arm.com    FilterRangeList(filterRanges, resp);
34812724Snikos.nikoleris@arm.com    // we don't allow snooping across bridges
34912724Snikos.nikoleris@arm.com    snoop = false;
35012724Snikos.nikoleris@arm.com}
35112724Snikos.nikoleris@arm.com
35212724Snikos.nikoleris@arm.comBridge *
35312724Snikos.nikoleris@arm.comBridgeParams::create()
35412720Snikos.nikoleris@arm.com{
35512720Snikos.nikoleris@arm.com    return new Bridge(this);
35612724Snikos.nikoleris@arm.com}
35712720Snikos.nikoleris@arm.com