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