bridge.cc revision 9164
12568SN/A/* 28922Swilliam.wang@arm.com * Copyright (c) 2011-2012 ARM Limited 38713Sandreas.hansson@arm.com * All rights reserved 48713Sandreas.hansson@arm.com * 58713Sandreas.hansson@arm.com * The license below extends only to copyright in the software and shall 68713Sandreas.hansson@arm.com * not be construed as granting a license to any other intellectual 78713Sandreas.hansson@arm.com * property including but not limited to intellectual property relating 88713Sandreas.hansson@arm.com * to a hardware implementation of the functionality of the software 98713Sandreas.hansson@arm.com * licensed hereunder. You may use the software subject to the license 108713Sandreas.hansson@arm.com * terms below provided that you ensure that this notice is replicated 118713Sandreas.hansson@arm.com * unmodified and in its entirety in all distributions of the software, 128713Sandreas.hansson@arm.com * modified or unmodified, in source code or in binary form. 138713Sandreas.hansson@arm.com * 142568SN/A * Copyright (c) 2006 The Regents of The University of Michigan 152568SN/A * All rights reserved. 162568SN/A * 172568SN/A * Redistribution and use in source and binary forms, with or without 182568SN/A * modification, are permitted provided that the following conditions are 192568SN/A * met: redistributions of source code must retain the above copyright 202568SN/A * notice, this list of conditions and the following disclaimer; 212568SN/A * redistributions in binary form must reproduce the above copyright 222568SN/A * notice, this list of conditions and the following disclaimer in the 232568SN/A * documentation and/or other materials provided with the distribution; 242568SN/A * neither the name of the copyright holders nor the names of its 252568SN/A * contributors may be used to endorse or promote products derived from 262568SN/A * this software without specific prior written permission. 272568SN/A * 282568SN/A * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 292568SN/A * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 302568SN/A * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 312568SN/A * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 322568SN/A * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 332568SN/A * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 342568SN/A * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 352568SN/A * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 362568SN/A * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 372568SN/A * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 382568SN/A * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 392665Ssaidi@eecs.umich.edu * 402665Ssaidi@eecs.umich.edu * Authors: Ali Saidi 412665Ssaidi@eecs.umich.edu * Steve Reinhardt 428713Sandreas.hansson@arm.com * Andreas Hansson 432568SN/A */ 442568SN/A 452568SN/A/** 462982Sstever@eecs.umich.edu * @file 478713Sandreas.hansson@arm.com * Implementation of a memory-mapped bus bridge that connects a master 488713Sandreas.hansson@arm.com * and a slave through a request and response queue. 492568SN/A */ 502568SN/A 512568SN/A#include "base/trace.hh" 529164Sandreas.hansson@arm.com#include "debug/Bridge.hh" 532568SN/A#include "mem/bridge.hh" 544762Snate@binkert.org#include "params/Bridge.hh" 552568SN/A 569164Sandreas.hansson@arm.comBridge::BridgeSlavePort::BridgeSlavePort(const std::string& _name, 579164Sandreas.hansson@arm.com Bridge& _bridge, 588851Sandreas.hansson@arm.com BridgeMasterPort& _masterPort, 599164Sandreas.hansson@arm.com int _delay, int _resp_limit, 608713Sandreas.hansson@arm.com std::vector<Range<Addr> > _ranges) 619164Sandreas.hansson@arm.com : SlavePort(_name, &_bridge), bridge(_bridge), masterPort(_masterPort), 629164Sandreas.hansson@arm.com delay(_delay), ranges(_ranges.begin(), _ranges.end()), 639164Sandreas.hansson@arm.com outstandingResponses(0), retryReq(false), 648851Sandreas.hansson@arm.com respQueueLimit(_resp_limit), sendEvent(*this) 658713Sandreas.hansson@arm.com{ 668713Sandreas.hansson@arm.com} 678713Sandreas.hansson@arm.com 689164Sandreas.hansson@arm.comBridge::BridgeMasterPort::BridgeMasterPort(const std::string& _name, 699164Sandreas.hansson@arm.com Bridge& _bridge, 708851Sandreas.hansson@arm.com BridgeSlavePort& _slavePort, 718713Sandreas.hansson@arm.com int _delay, int _req_limit) 729164Sandreas.hansson@arm.com : MasterPort(_name, &_bridge), bridge(_bridge), slavePort(_slavePort), 739164Sandreas.hansson@arm.com delay(_delay), reqQueueLimit(_req_limit), sendEvent(*this) 742643Sstever@eecs.umich.edu{ 752643Sstever@eecs.umich.edu} 762643Sstever@eecs.umich.edu 774435Ssaidi@eecs.umich.eduBridge::Bridge(Params *p) 785034Smilesck@eecs.umich.edu : MemObject(p), 799164Sandreas.hansson@arm.com slavePort(p->name + ".slave", *this, masterPort, p->delay, p->resp_size, 809164Sandreas.hansson@arm.com p->ranges), 819164Sandreas.hansson@arm.com masterPort(p->name + ".master", *this, slavePort, p->delay, p->req_size) 822643Sstever@eecs.umich.edu{ 832643Sstever@eecs.umich.edu} 842643Sstever@eecs.umich.edu 858922Swilliam.wang@arm.comMasterPort& 868922Swilliam.wang@arm.comBridge::getMasterPort(const std::string &if_name, int idx) 878922Swilliam.wang@arm.com{ 888922Swilliam.wang@arm.com if (if_name == "master") 898922Swilliam.wang@arm.com return masterPort; 908922Swilliam.wang@arm.com else 918922Swilliam.wang@arm.com // pass it along to our super class 928922Swilliam.wang@arm.com return MemObject::getMasterPort(if_name, idx); 938922Swilliam.wang@arm.com} 948922Swilliam.wang@arm.com 958922Swilliam.wang@arm.comSlavePort& 968922Swilliam.wang@arm.comBridge::getSlavePort(const std::string &if_name, int idx) 972643Sstever@eecs.umich.edu{ 988713Sandreas.hansson@arm.com if (if_name == "slave") 998922Swilliam.wang@arm.com return slavePort; 1008922Swilliam.wang@arm.com else 1018922Swilliam.wang@arm.com // pass it along to our super class 1028922Swilliam.wang@arm.com return MemObject::getSlavePort(if_name, idx); 1032643Sstever@eecs.umich.edu} 1042643Sstever@eecs.umich.edu 1052568SN/Avoid 1062568SN/ABridge::init() 1072568SN/A{ 1088713Sandreas.hansson@arm.com // make sure both sides are connected and have the same block size 1098713Sandreas.hansson@arm.com if (!slavePort.isConnected() || !masterPort.isConnected()) 1104432Ssaidi@eecs.umich.edu fatal("Both ports of bus bridge are not connected to a bus.\n"); 1114432Ssaidi@eecs.umich.edu 1128713Sandreas.hansson@arm.com if (slavePort.peerBlockSize() != masterPort.peerBlockSize()) 1138713Sandreas.hansson@arm.com fatal("Slave port size %d, master port size %d \n " \ 1146764SBrad.Beckmann@amd.com "Busses don't have the same block size... Not supported.\n", 1158713Sandreas.hansson@arm.com slavePort.peerBlockSize(), masterPort.peerBlockSize()); 1168713Sandreas.hansson@arm.com 1178713Sandreas.hansson@arm.com // notify the master side of our address ranges 1188713Sandreas.hansson@arm.com slavePort.sendRangeChange(); 1192568SN/A} 1202568SN/A 1214433Ssaidi@eecs.umich.edubool 1228713Sandreas.hansson@arm.comBridge::BridgeSlavePort::respQueueFull() 1234433Ssaidi@eecs.umich.edu{ 1248713Sandreas.hansson@arm.com return outstandingResponses == respQueueLimit; 1254435Ssaidi@eecs.umich.edu} 1264435Ssaidi@eecs.umich.edu 1274435Ssaidi@eecs.umich.edubool 1288713Sandreas.hansson@arm.comBridge::BridgeMasterPort::reqQueueFull() 1294435Ssaidi@eecs.umich.edu{ 1309164Sandreas.hansson@arm.com return transmitList.size() == reqQueueLimit; 1314433Ssaidi@eecs.umich.edu} 1322568SN/A 1332568SN/Abool 1348975Sandreas.hansson@arm.comBridge::BridgeMasterPort::recvTimingResp(PacketPtr pkt) 1352568SN/A{ 1368713Sandreas.hansson@arm.com // all checks are done when the request is accepted on the slave 1378713Sandreas.hansson@arm.com // side, so we are guaranteed to have space for the response 1389164Sandreas.hansson@arm.com DPRINTF(Bridge, "recvTimingResp: %s addr 0x%x\n", 1398949Sandreas.hansson@arm.com pkt->cmdString(), pkt->getAddr()); 1402643Sstever@eecs.umich.edu 1419164Sandreas.hansson@arm.com DPRINTF(Bridge, "Request queue size: %d\n", transmitList.size()); 1424450Ssaidi@eecs.umich.edu 1439164Sandreas.hansson@arm.com slavePort.schedTimingResp(pkt, curTick() + delay); 1448713Sandreas.hansson@arm.com 1458713Sandreas.hansson@arm.com return true; 1468713Sandreas.hansson@arm.com} 1478713Sandreas.hansson@arm.com 1488713Sandreas.hansson@arm.combool 1498975Sandreas.hansson@arm.comBridge::BridgeSlavePort::recvTimingReq(PacketPtr pkt) 1508713Sandreas.hansson@arm.com{ 1519164Sandreas.hansson@arm.com DPRINTF(Bridge, "recvTimingReq: %s addr 0x%x\n", 1528949Sandreas.hansson@arm.com pkt->cmdString(), pkt->getAddr()); 1538713Sandreas.hansson@arm.com 1549164Sandreas.hansson@arm.com // ensure we do not have something waiting to retry 1559164Sandreas.hansson@arm.com if(retryReq) 1569164Sandreas.hansson@arm.com return false; 1579164Sandreas.hansson@arm.com 1589164Sandreas.hansson@arm.com DPRINTF(Bridge, "Response queue size: %d outresp: %d\n", 1599164Sandreas.hansson@arm.com transmitList.size(), outstandingResponses); 1608713Sandreas.hansson@arm.com 1618851Sandreas.hansson@arm.com if (masterPort.reqQueueFull()) { 1629164Sandreas.hansson@arm.com DPRINTF(Bridge, "Request queue full\n"); 1639164Sandreas.hansson@arm.com retryReq = true; 1649164Sandreas.hansson@arm.com } else if (pkt->needsResponse()) { 1654435Ssaidi@eecs.umich.edu if (respQueueFull()) { 1669164Sandreas.hansson@arm.com DPRINTF(Bridge, "Response queue full\n"); 1679164Sandreas.hansson@arm.com retryReq = true; 1684433Ssaidi@eecs.umich.edu } else { 1699164Sandreas.hansson@arm.com DPRINTF(Bridge, "Reserving space for response\n"); 1708713Sandreas.hansson@arm.com assert(outstandingResponses != respQueueLimit); 1714433Ssaidi@eecs.umich.edu ++outstandingResponses; 1729164Sandreas.hansson@arm.com retryReq = false; 1739164Sandreas.hansson@arm.com masterPort.schedTimingReq(pkt, curTick() + delay); 1744433Ssaidi@eecs.umich.edu } 1755562Snate@binkert.org } 1764433Ssaidi@eecs.umich.edu 1779164Sandreas.hansson@arm.com // remember that we are now stalling a packet and that we have to 1789164Sandreas.hansson@arm.com // tell the sending master to retry once space becomes available, 1799164Sandreas.hansson@arm.com // we make no distinction whether the stalling is due to the 1809164Sandreas.hansson@arm.com // request queue or response queue being full 1819164Sandreas.hansson@arm.com return !retryReq; 1822657Ssaidi@eecs.umich.edu} 1832657Ssaidi@eecs.umich.edu 1844433Ssaidi@eecs.umich.eduvoid 1859164Sandreas.hansson@arm.comBridge::BridgeSlavePort::retryStalledReq() 1864433Ssaidi@eecs.umich.edu{ 1879164Sandreas.hansson@arm.com if (retryReq) { 1889164Sandreas.hansson@arm.com DPRINTF(Bridge, "Request waiting for retry, now retrying\n"); 1899164Sandreas.hansson@arm.com retryReq = false; 1909164Sandreas.hansson@arm.com sendRetry(); 1914433Ssaidi@eecs.umich.edu } 1924433Ssaidi@eecs.umich.edu} 1934433Ssaidi@eecs.umich.edu 1944433Ssaidi@eecs.umich.eduvoid 1959164Sandreas.hansson@arm.comBridge::BridgeMasterPort::schedTimingReq(PacketPtr pkt, Tick when) 1962657Ssaidi@eecs.umich.edu{ 1979029Sandreas.hansson@arm.com // If we expect to see a response, we need to restore the source 1989029Sandreas.hansson@arm.com // and destination field that is potentially changed by a second 1999029Sandreas.hansson@arm.com // bus 2009029Sandreas.hansson@arm.com if (!pkt->memInhibitAsserted() && pkt->needsResponse()) { 2019029Sandreas.hansson@arm.com // Update the sender state so we can deal with the response 2029029Sandreas.hansson@arm.com // appropriately 2039029Sandreas.hansson@arm.com RequestState *req_state = new RequestState(pkt); 2049029Sandreas.hansson@arm.com pkt->senderState = req_state; 2059029Sandreas.hansson@arm.com } 2062643Sstever@eecs.umich.edu 2072643Sstever@eecs.umich.edu // If we're about to put this packet at the head of the queue, we 2082643Sstever@eecs.umich.edu // need to schedule an event to do the transmit. Otherwise there 2092643Sstever@eecs.umich.edu // should already be an event scheduled for sending the head 2102643Sstever@eecs.umich.edu // packet. 2119164Sandreas.hansson@arm.com if (transmitList.empty()) { 2129164Sandreas.hansson@arm.com bridge.schedule(sendEvent, when); 2132568SN/A } 2148713Sandreas.hansson@arm.com 2159164Sandreas.hansson@arm.com assert(transmitList.size() != reqQueueLimit); 2168713Sandreas.hansson@arm.com 2179164Sandreas.hansson@arm.com transmitList.push_back(DeferredPacket(pkt, when)); 2188713Sandreas.hansson@arm.com} 2198713Sandreas.hansson@arm.com 2208713Sandreas.hansson@arm.com 2218713Sandreas.hansson@arm.comvoid 2229164Sandreas.hansson@arm.comBridge::BridgeSlavePort::schedTimingResp(PacketPtr pkt, Tick when) 2238713Sandreas.hansson@arm.com{ 2248713Sandreas.hansson@arm.com // This is a response for a request we forwarded earlier. The 2259029Sandreas.hansson@arm.com // corresponding request state should be stored in the packet's 2268713Sandreas.hansson@arm.com // senderState field. 2279029Sandreas.hansson@arm.com RequestState *req_state = dynamic_cast<RequestState*>(pkt->senderState); 2289029Sandreas.hansson@arm.com assert(req_state != NULL); 2298713Sandreas.hansson@arm.com // set up new packet dest & senderState based on values saved 2308713Sandreas.hansson@arm.com // from original request 2319029Sandreas.hansson@arm.com req_state->fixResponse(pkt); 2329164Sandreas.hansson@arm.com delete req_state; 2338713Sandreas.hansson@arm.com 2348949Sandreas.hansson@arm.com // the bridge assumes that at least one bus has set the 2358949Sandreas.hansson@arm.com // destination field of the packet 2368949Sandreas.hansson@arm.com assert(pkt->isDestValid()); 2379164Sandreas.hansson@arm.com DPRINTF(Bridge, "response, new dest %d\n", pkt->getDest()); 2388713Sandreas.hansson@arm.com 2398713Sandreas.hansson@arm.com // If we're about to put this packet at the head of the queue, we 2408713Sandreas.hansson@arm.com // need to schedule an event to do the transmit. Otherwise there 2418713Sandreas.hansson@arm.com // should already be an event scheduled for sending the head 2428713Sandreas.hansson@arm.com // packet. 2439164Sandreas.hansson@arm.com if (transmitList.empty()) { 2449164Sandreas.hansson@arm.com bridge.schedule(sendEvent, when); 2458713Sandreas.hansson@arm.com } 2469164Sandreas.hansson@arm.com 2479164Sandreas.hansson@arm.com transmitList.push_back(DeferredPacket(pkt, when)); 2482568SN/A} 2492568SN/A 2502568SN/Avoid 2519164Sandreas.hansson@arm.comBridge::BridgeMasterPort::trySendTiming() 2522568SN/A{ 2539164Sandreas.hansson@arm.com assert(!transmitList.empty()); 2542568SN/A 2559164Sandreas.hansson@arm.com DeferredPacket req = transmitList.front(); 2562643Sstever@eecs.umich.edu 2579164Sandreas.hansson@arm.com assert(req.tick <= curTick()); 2582643Sstever@eecs.umich.edu 2599029Sandreas.hansson@arm.com PacketPtr pkt = req.pkt; 2602643Sstever@eecs.umich.edu 2619164Sandreas.hansson@arm.com DPRINTF(Bridge, "trySend request addr 0x%x, queue size %d\n", 2629164Sandreas.hansson@arm.com pkt->getAddr(), transmitList.size()); 2634432Ssaidi@eecs.umich.edu 2648975Sandreas.hansson@arm.com if (sendTimingReq(pkt)) { 2652643Sstever@eecs.umich.edu // send successful 2669164Sandreas.hansson@arm.com transmitList.pop_front(); 2679164Sandreas.hansson@arm.com DPRINTF(Bridge, "trySend request successful\n"); 2682657Ssaidi@eecs.umich.edu 2692657Ssaidi@eecs.umich.edu // If there are more packets to send, schedule event to try again. 2709164Sandreas.hansson@arm.com if (!transmitList.empty()) { 2719164Sandreas.hansson@arm.com req = transmitList.front(); 2729164Sandreas.hansson@arm.com DPRINTF(Bridge, "Scheduling next send\n"); 2739164Sandreas.hansson@arm.com bridge.schedule(sendEvent, std::max(req.tick, 2749164Sandreas.hansson@arm.com bridge.nextCycle())); 2752657Ssaidi@eecs.umich.edu } 2769164Sandreas.hansson@arm.com 2779164Sandreas.hansson@arm.com // if we have stalled a request due to a full request queue, 2789164Sandreas.hansson@arm.com // then send a retry at this point, also note that if the 2799164Sandreas.hansson@arm.com // request we stalled was waiting for the response queue 2809164Sandreas.hansson@arm.com // rather than the request queue we might stall it again 2819164Sandreas.hansson@arm.com slavePort.retryStalledReq(); 2822643Sstever@eecs.umich.edu } 2834986Ssaidi@eecs.umich.edu 2849164Sandreas.hansson@arm.com // if the send failed, then we try again once we receive a retry, 2859164Sandreas.hansson@arm.com // and therefore there is no need to take any action 2862568SN/A} 2872568SN/A 2888713Sandreas.hansson@arm.comvoid 2899164Sandreas.hansson@arm.comBridge::BridgeSlavePort::trySendTiming() 2908713Sandreas.hansson@arm.com{ 2919164Sandreas.hansson@arm.com assert(!transmitList.empty()); 2928713Sandreas.hansson@arm.com 2939164Sandreas.hansson@arm.com DeferredPacket resp = transmitList.front(); 2948713Sandreas.hansson@arm.com 2959164Sandreas.hansson@arm.com assert(resp.tick <= curTick()); 2968713Sandreas.hansson@arm.com 2979029Sandreas.hansson@arm.com PacketPtr pkt = resp.pkt; 2988713Sandreas.hansson@arm.com 2999164Sandreas.hansson@arm.com DPRINTF(Bridge, "trySend response addr 0x%x, outstanding %d\n", 3009164Sandreas.hansson@arm.com pkt->getAddr(), outstandingResponses); 3018713Sandreas.hansson@arm.com 3028975Sandreas.hansson@arm.com if (sendTimingResp(pkt)) { 3038713Sandreas.hansson@arm.com // send successful 3049164Sandreas.hansson@arm.com transmitList.pop_front(); 3059164Sandreas.hansson@arm.com DPRINTF(Bridge, "trySend response successful\n"); 3068713Sandreas.hansson@arm.com 3079164Sandreas.hansson@arm.com assert(outstandingResponses != 0); 3089164Sandreas.hansson@arm.com --outstandingResponses; 3099164Sandreas.hansson@arm.com 3109164Sandreas.hansson@arm.com // If there are more packets to send, schedule event to try again. 3119164Sandreas.hansson@arm.com if (!transmitList.empty()) { 3129164Sandreas.hansson@arm.com resp = transmitList.front(); 3139164Sandreas.hansson@arm.com DPRINTF(Bridge, "Scheduling next send\n"); 3149164Sandreas.hansson@arm.com bridge.schedule(sendEvent, std::max(resp.tick, 3159164Sandreas.hansson@arm.com bridge.nextCycle())); 3168713Sandreas.hansson@arm.com } 3178713Sandreas.hansson@arm.com 3189164Sandreas.hansson@arm.com // if there is space in the request queue and we were stalling 3199164Sandreas.hansson@arm.com // a request, it will definitely be possible to accept it now 3209164Sandreas.hansson@arm.com // since there is guaranteed space in the response queue 3219164Sandreas.hansson@arm.com if (!masterPort.reqQueueFull() && retryReq) { 3229164Sandreas.hansson@arm.com DPRINTF(Bridge, "Request waiting for retry, now retrying\n"); 3239164Sandreas.hansson@arm.com retryReq = false; 3249164Sandreas.hansson@arm.com sendRetry(); 3258713Sandreas.hansson@arm.com } 3268713Sandreas.hansson@arm.com } 3278713Sandreas.hansson@arm.com 3289164Sandreas.hansson@arm.com // if the send failed, then we try again once we receive a retry, 3299164Sandreas.hansson@arm.com // and therefore there is no need to take any action 3308713Sandreas.hansson@arm.com} 3312568SN/A 3322657Ssaidi@eecs.umich.eduvoid 3338713Sandreas.hansson@arm.comBridge::BridgeMasterPort::recvRetry() 3342568SN/A{ 3359164Sandreas.hansson@arm.com Tick nextReady = transmitList.front().tick; 3367823Ssteve.reinhardt@amd.com if (nextReady <= curTick()) 3379164Sandreas.hansson@arm.com trySendTiming(); 3384435Ssaidi@eecs.umich.edu else 3399164Sandreas.hansson@arm.com bridge.schedule(sendEvent, nextReady); 3402568SN/A} 3412568SN/A 3428713Sandreas.hansson@arm.comvoid 3438713Sandreas.hansson@arm.comBridge::BridgeSlavePort::recvRetry() 3442568SN/A{ 3459164Sandreas.hansson@arm.com Tick nextReady = transmitList.front().tick; 3468713Sandreas.hansson@arm.com if (nextReady <= curTick()) 3479164Sandreas.hansson@arm.com trySendTiming(); 3488713Sandreas.hansson@arm.com else 3499164Sandreas.hansson@arm.com bridge.schedule(sendEvent, nextReady); 3502568SN/A} 3512568SN/A 3528713Sandreas.hansson@arm.comTick 3538713Sandreas.hansson@arm.comBridge::BridgeSlavePort::recvAtomic(PacketPtr pkt) 3548713Sandreas.hansson@arm.com{ 3558851Sandreas.hansson@arm.com return delay + masterPort.sendAtomic(pkt); 3568713Sandreas.hansson@arm.com} 3578713Sandreas.hansson@arm.com 3582568SN/Avoid 3598713Sandreas.hansson@arm.comBridge::BridgeSlavePort::recvFunctional(PacketPtr pkt) 3602568SN/A{ 3619164Sandreas.hansson@arm.com std::list<DeferredPacket>::iterator i; 3622568SN/A 3635314Sstever@gmail.com pkt->pushLabel(name()); 3645314Sstever@gmail.com 3658713Sandreas.hansson@arm.com // check the response queue 3669164Sandreas.hansson@arm.com for (i = transmitList.begin(); i != transmitList.end(); ++i) { 3679029Sandreas.hansson@arm.com if (pkt->checkFunctional((*i).pkt)) { 3687668Ssteve.reinhardt@amd.com pkt->makeResponse(); 3694626Sstever@eecs.umich.edu return; 3707668Ssteve.reinhardt@amd.com } 3712568SN/A } 3722568SN/A 3738713Sandreas.hansson@arm.com // also check the master port's request queue 3748851Sandreas.hansson@arm.com if (masterPort.checkFunctional(pkt)) { 3758713Sandreas.hansson@arm.com return; 3768713Sandreas.hansson@arm.com } 3778713Sandreas.hansson@arm.com 3785314Sstever@gmail.com pkt->popLabel(); 3795314Sstever@gmail.com 3804626Sstever@eecs.umich.edu // fall through if pkt still not satisfied 3818851Sandreas.hansson@arm.com masterPort.sendFunctional(pkt); 3828713Sandreas.hansson@arm.com} 3838713Sandreas.hansson@arm.com 3848713Sandreas.hansson@arm.combool 3858713Sandreas.hansson@arm.comBridge::BridgeMasterPort::checkFunctional(PacketPtr pkt) 3868713Sandreas.hansson@arm.com{ 3878713Sandreas.hansson@arm.com bool found = false; 3889164Sandreas.hansson@arm.com std::list<DeferredPacket>::iterator i = transmitList.begin(); 3898713Sandreas.hansson@arm.com 3909164Sandreas.hansson@arm.com while(i != transmitList.end() && !found) { 3919029Sandreas.hansson@arm.com if (pkt->checkFunctional((*i).pkt)) { 3928713Sandreas.hansson@arm.com pkt->makeResponse(); 3938713Sandreas.hansson@arm.com found = true; 3948713Sandreas.hansson@arm.com } 3958713Sandreas.hansson@arm.com ++i; 3968713Sandreas.hansson@arm.com } 3978713Sandreas.hansson@arm.com 3988713Sandreas.hansson@arm.com return found; 3992568SN/A} 4002568SN/A 4018711Sandreas.hansson@arm.comAddrRangeList 4029090Sandreas.hansson@arm.comBridge::BridgeSlavePort::getAddrRanges() const 4032568SN/A{ 4048711Sandreas.hansson@arm.com return ranges; 4052568SN/A} 4062568SN/A 4074762Snate@binkert.orgBridge * 4084762Snate@binkert.orgBridgeParams::create() 4092568SN/A{ 4104762Snate@binkert.org return new Bridge(this); 4112568SN/A} 412