bridge.cc revision 12823
12568SN/A/* 211192Sandreas.hansson@arm.com * Copyright (c) 2011-2013, 2015 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 4710405Sandreas.hansson@arm.com * Implementation of a memory-mapped bridge that connects a master 488713Sandreas.hansson@arm.com * and a slave through a request and response queue. 492568SN/A */ 502568SN/A 5111793Sbrandon.potter@amd.com#include "mem/bridge.hh" 5211793Sbrandon.potter@amd.com 532568SN/A#include "base/trace.hh" 549164Sandreas.hansson@arm.com#include "debug/Bridge.hh" 554762Snate@binkert.org#include "params/Bridge.hh" 562568SN/A 579164Sandreas.hansson@arm.comBridge::BridgeSlavePort::BridgeSlavePort(const std::string& _name, 589164Sandreas.hansson@arm.com Bridge& _bridge, 598851Sandreas.hansson@arm.com BridgeMasterPort& _masterPort, 609180Sandreas.hansson@arm.com Cycles _delay, int _resp_limit, 619235Sandreas.hansson@arm.com std::vector<AddrRange> _ranges) 629164Sandreas.hansson@arm.com : SlavePort(_name, &_bridge), bridge(_bridge), masterPort(_masterPort), 639164Sandreas.hansson@arm.com delay(_delay), ranges(_ranges.begin(), _ranges.end()), 6412084Sspwilson2@wisc.edu outstandingResponses(0), retryReq(false), respQueueLimit(_resp_limit), 6512084Sspwilson2@wisc.edu sendEvent([this]{ trySendTiming(); }, _name) 668713Sandreas.hansson@arm.com{ 678713Sandreas.hansson@arm.com} 688713Sandreas.hansson@arm.com 699164Sandreas.hansson@arm.comBridge::BridgeMasterPort::BridgeMasterPort(const std::string& _name, 709164Sandreas.hansson@arm.com Bridge& _bridge, 718851Sandreas.hansson@arm.com BridgeSlavePort& _slavePort, 729180Sandreas.hansson@arm.com Cycles _delay, int _req_limit) 739164Sandreas.hansson@arm.com : MasterPort(_name, &_bridge), bridge(_bridge), slavePort(_slavePort), 7412084Sspwilson2@wisc.edu delay(_delay), reqQueueLimit(_req_limit), 7512084Sspwilson2@wisc.edu sendEvent([this]{ trySendTiming(); }, _name) 762643Sstever@eecs.umich.edu{ 772643Sstever@eecs.umich.edu} 782643Sstever@eecs.umich.edu 794435Ssaidi@eecs.umich.eduBridge::Bridge(Params *p) 805034Smilesck@eecs.umich.edu : MemObject(p), 819180Sandreas.hansson@arm.com slavePort(p->name + ".slave", *this, masterPort, 829180Sandreas.hansson@arm.com ticksToCycles(p->delay), p->resp_size, p->ranges), 839180Sandreas.hansson@arm.com masterPort(p->name + ".master", *this, slavePort, 849180Sandreas.hansson@arm.com ticksToCycles(p->delay), p->req_size) 852643Sstever@eecs.umich.edu{ 862643Sstever@eecs.umich.edu} 872643Sstever@eecs.umich.edu 889294Sandreas.hansson@arm.comBaseMasterPort& 899294Sandreas.hansson@arm.comBridge::getMasterPort(const std::string &if_name, PortID idx) 908922Swilliam.wang@arm.com{ 918922Swilliam.wang@arm.com if (if_name == "master") 928922Swilliam.wang@arm.com return masterPort; 938922Swilliam.wang@arm.com else 948922Swilliam.wang@arm.com // pass it along to our super class 958922Swilliam.wang@arm.com return MemObject::getMasterPort(if_name, idx); 968922Swilliam.wang@arm.com} 978922Swilliam.wang@arm.com 989294Sandreas.hansson@arm.comBaseSlavePort& 999294Sandreas.hansson@arm.comBridge::getSlavePort(const std::string &if_name, PortID idx) 1002643Sstever@eecs.umich.edu{ 1018713Sandreas.hansson@arm.com if (if_name == "slave") 1028922Swilliam.wang@arm.com return slavePort; 1038922Swilliam.wang@arm.com else 1048922Swilliam.wang@arm.com // pass it along to our super class 1058922Swilliam.wang@arm.com return MemObject::getSlavePort(if_name, idx); 1062643Sstever@eecs.umich.edu} 1072643Sstever@eecs.umich.edu 1082568SN/Avoid 1092568SN/ABridge::init() 1102568SN/A{ 1118713Sandreas.hansson@arm.com // make sure both sides are connected and have the same block size 1128713Sandreas.hansson@arm.com if (!slavePort.isConnected() || !masterPort.isConnected()) 11310405Sandreas.hansson@arm.com fatal("Both ports of a bridge must be connected.\n"); 1144432Ssaidi@eecs.umich.edu 1158713Sandreas.hansson@arm.com // notify the master side of our address ranges 1168713Sandreas.hansson@arm.com slavePort.sendRangeChange(); 1172568SN/A} 1182568SN/A 1194433Ssaidi@eecs.umich.edubool 1209786Sandreas.hansson@arm.comBridge::BridgeSlavePort::respQueueFull() const 1214433Ssaidi@eecs.umich.edu{ 1228713Sandreas.hansson@arm.com return outstandingResponses == respQueueLimit; 1234435Ssaidi@eecs.umich.edu} 1244435Ssaidi@eecs.umich.edu 1254435Ssaidi@eecs.umich.edubool 1269786Sandreas.hansson@arm.comBridge::BridgeMasterPort::reqQueueFull() const 1274435Ssaidi@eecs.umich.edu{ 1289164Sandreas.hansson@arm.com return transmitList.size() == reqQueueLimit; 1294433Ssaidi@eecs.umich.edu} 1302568SN/A 1312568SN/Abool 1328975Sandreas.hansson@arm.comBridge::BridgeMasterPort::recvTimingResp(PacketPtr pkt) 1332568SN/A{ 1348713Sandreas.hansson@arm.com // all checks are done when the request is accepted on the slave 1358713Sandreas.hansson@arm.com // side, so we are guaranteed to have space for the response 1369164Sandreas.hansson@arm.com DPRINTF(Bridge, "recvTimingResp: %s addr 0x%x\n", 1378949Sandreas.hansson@arm.com pkt->cmdString(), pkt->getAddr()); 1382643Sstever@eecs.umich.edu 1399164Sandreas.hansson@arm.com DPRINTF(Bridge, "Request queue size: %d\n", transmitList.size()); 1404450Ssaidi@eecs.umich.edu 14111193Sandreas.hansson@arm.com // technically the packet only reaches us after the header delay, 14211193Sandreas.hansson@arm.com // and typically we also need to deserialise any payload (unless 14311193Sandreas.hansson@arm.com // the two sides of the bridge are synchronous) 14411193Sandreas.hansson@arm.com Tick receive_delay = pkt->headerDelay + pkt->payloadDelay; 14510694SMarco.Balboni@ARM.com pkt->headerDelay = pkt->payloadDelay = 0; 1469549Sandreas.hansson@arm.com 14711193Sandreas.hansson@arm.com slavePort.schedTimingResp(pkt, bridge.clockEdge(delay) + 14811193Sandreas.hansson@arm.com receive_delay); 1498713Sandreas.hansson@arm.com 1508713Sandreas.hansson@arm.com return true; 1518713Sandreas.hansson@arm.com} 1528713Sandreas.hansson@arm.com 1538713Sandreas.hansson@arm.combool 1548975Sandreas.hansson@arm.comBridge::BridgeSlavePort::recvTimingReq(PacketPtr pkt) 1558713Sandreas.hansson@arm.com{ 1569164Sandreas.hansson@arm.com DPRINTF(Bridge, "recvTimingReq: %s addr 0x%x\n", 1578949Sandreas.hansson@arm.com pkt->cmdString(), pkt->getAddr()); 1588713Sandreas.hansson@arm.com 15911334Sandreas.hansson@arm.com panic_if(pkt->cacheResponding(), "Should not see packets where cache " 16011334Sandreas.hansson@arm.com "is responding"); 16111192Sandreas.hansson@arm.com 16211192Sandreas.hansson@arm.com // we should not get a new request after committing to retry the 16311192Sandreas.hansson@arm.com // current one, but unfortunately the CPU violates this rule, so 16411192Sandreas.hansson@arm.com // simply ignore it for now 16511192Sandreas.hansson@arm.com if (retryReq) 16611192Sandreas.hansson@arm.com return false; 1679164Sandreas.hansson@arm.com 1689164Sandreas.hansson@arm.com DPRINTF(Bridge, "Response queue size: %d outresp: %d\n", 1699164Sandreas.hansson@arm.com transmitList.size(), outstandingResponses); 1708713Sandreas.hansson@arm.com 1719786Sandreas.hansson@arm.com // if the request queue is full then there is no hope 1728851Sandreas.hansson@arm.com if (masterPort.reqQueueFull()) { 1739164Sandreas.hansson@arm.com DPRINTF(Bridge, "Request queue full\n"); 1749164Sandreas.hansson@arm.com retryReq = true; 1759786Sandreas.hansson@arm.com } else { 1769786Sandreas.hansson@arm.com // look at the response queue if we expect to see a response 17711192Sandreas.hansson@arm.com bool expects_response = pkt->needsResponse(); 1789786Sandreas.hansson@arm.com if (expects_response) { 1799786Sandreas.hansson@arm.com if (respQueueFull()) { 1809786Sandreas.hansson@arm.com DPRINTF(Bridge, "Response queue full\n"); 1819786Sandreas.hansson@arm.com retryReq = true; 1829786Sandreas.hansson@arm.com } else { 1839786Sandreas.hansson@arm.com // ok to send the request with space for the response 1849786Sandreas.hansson@arm.com DPRINTF(Bridge, "Reserving space for response\n"); 1859786Sandreas.hansson@arm.com assert(outstandingResponses != respQueueLimit); 1869786Sandreas.hansson@arm.com ++outstandingResponses; 1879549Sandreas.hansson@arm.com 1889786Sandreas.hansson@arm.com // no need to set retryReq to false as this is already the 1899786Sandreas.hansson@arm.com // case 1909786Sandreas.hansson@arm.com } 1919786Sandreas.hansson@arm.com } 1929786Sandreas.hansson@arm.com 1939786Sandreas.hansson@arm.com if (!retryReq) { 19411193Sandreas.hansson@arm.com // technically the packet only reaches us after the header 19511193Sandreas.hansson@arm.com // delay, and typically we also need to deserialise any 19611193Sandreas.hansson@arm.com // payload (unless the two sides of the bridge are 19711193Sandreas.hansson@arm.com // synchronous) 19811193Sandreas.hansson@arm.com Tick receive_delay = pkt->headerDelay + pkt->payloadDelay; 19910694SMarco.Balboni@ARM.com pkt->headerDelay = pkt->payloadDelay = 0; 2009549Sandreas.hansson@arm.com 20111193Sandreas.hansson@arm.com masterPort.schedTimingReq(pkt, bridge.clockEdge(delay) + 20211193Sandreas.hansson@arm.com receive_delay); 2034433Ssaidi@eecs.umich.edu } 2045562Snate@binkert.org } 2054433Ssaidi@eecs.umich.edu 2069164Sandreas.hansson@arm.com // remember that we are now stalling a packet and that we have to 2079164Sandreas.hansson@arm.com // tell the sending master to retry once space becomes available, 2089164Sandreas.hansson@arm.com // we make no distinction whether the stalling is due to the 2099164Sandreas.hansson@arm.com // request queue or response queue being full 2109164Sandreas.hansson@arm.com return !retryReq; 2112657Ssaidi@eecs.umich.edu} 2122657Ssaidi@eecs.umich.edu 2134433Ssaidi@eecs.umich.eduvoid 2149164Sandreas.hansson@arm.comBridge::BridgeSlavePort::retryStalledReq() 2154433Ssaidi@eecs.umich.edu{ 2169164Sandreas.hansson@arm.com if (retryReq) { 2179164Sandreas.hansson@arm.com DPRINTF(Bridge, "Request waiting for retry, now retrying\n"); 2189164Sandreas.hansson@arm.com retryReq = false; 21910713Sandreas.hansson@arm.com sendRetryReq(); 2204433Ssaidi@eecs.umich.edu } 2214433Ssaidi@eecs.umich.edu} 2224433Ssaidi@eecs.umich.edu 2234433Ssaidi@eecs.umich.eduvoid 2249164Sandreas.hansson@arm.comBridge::BridgeMasterPort::schedTimingReq(PacketPtr pkt, Tick when) 2252657Ssaidi@eecs.umich.edu{ 2262643Sstever@eecs.umich.edu // If we're about to put this packet at the head of the queue, we 2272643Sstever@eecs.umich.edu // need to schedule an event to do the transmit. Otherwise there 2282643Sstever@eecs.umich.edu // should already be an event scheduled for sending the head 2292643Sstever@eecs.umich.edu // packet. 2309164Sandreas.hansson@arm.com if (transmitList.empty()) { 2319164Sandreas.hansson@arm.com bridge.schedule(sendEvent, when); 2322568SN/A } 2338713Sandreas.hansson@arm.com 2349164Sandreas.hansson@arm.com assert(transmitList.size() != reqQueueLimit); 2358713Sandreas.hansson@arm.com 23610922Sandreas.hansson@arm.com transmitList.emplace_back(pkt, when); 2378713Sandreas.hansson@arm.com} 2388713Sandreas.hansson@arm.com 2398713Sandreas.hansson@arm.com 2408713Sandreas.hansson@arm.comvoid 2419164Sandreas.hansson@arm.comBridge::BridgeSlavePort::schedTimingResp(PacketPtr pkt, Tick when) 2428713Sandreas.hansson@arm.com{ 2438713Sandreas.hansson@arm.com // If we're about to put this packet at the head of the queue, we 2448713Sandreas.hansson@arm.com // need to schedule an event to do the transmit. Otherwise there 2458713Sandreas.hansson@arm.com // should already be an event scheduled for sending the head 2468713Sandreas.hansson@arm.com // packet. 2479164Sandreas.hansson@arm.com if (transmitList.empty()) { 2489164Sandreas.hansson@arm.com bridge.schedule(sendEvent, when); 2498713Sandreas.hansson@arm.com } 2509164Sandreas.hansson@arm.com 25110922Sandreas.hansson@arm.com transmitList.emplace_back(pkt, when); 2522568SN/A} 2532568SN/A 2542568SN/Avoid 2559164Sandreas.hansson@arm.comBridge::BridgeMasterPort::trySendTiming() 2562568SN/A{ 2579164Sandreas.hansson@arm.com assert(!transmitList.empty()); 2582568SN/A 2599164Sandreas.hansson@arm.com DeferredPacket req = transmitList.front(); 2602643Sstever@eecs.umich.edu 2619164Sandreas.hansson@arm.com assert(req.tick <= curTick()); 2622643Sstever@eecs.umich.edu 2639029Sandreas.hansson@arm.com PacketPtr pkt = req.pkt; 2642643Sstever@eecs.umich.edu 2659164Sandreas.hansson@arm.com DPRINTF(Bridge, "trySend request addr 0x%x, queue size %d\n", 2669164Sandreas.hansson@arm.com pkt->getAddr(), transmitList.size()); 2674432Ssaidi@eecs.umich.edu 2688975Sandreas.hansson@arm.com if (sendTimingReq(pkt)) { 2692643Sstever@eecs.umich.edu // send successful 2709164Sandreas.hansson@arm.com transmitList.pop_front(); 2719164Sandreas.hansson@arm.com DPRINTF(Bridge, "trySend request successful\n"); 2722657Ssaidi@eecs.umich.edu 2732657Ssaidi@eecs.umich.edu // If there are more packets to send, schedule event to try again. 2749164Sandreas.hansson@arm.com if (!transmitList.empty()) { 2759786Sandreas.hansson@arm.com DeferredPacket next_req = transmitList.front(); 2769164Sandreas.hansson@arm.com DPRINTF(Bridge, "Scheduling next send\n"); 2779786Sandreas.hansson@arm.com bridge.schedule(sendEvent, std::max(next_req.tick, 2789648Sdam.sunwoo@arm.com bridge.clockEdge())); 2792657Ssaidi@eecs.umich.edu } 2809164Sandreas.hansson@arm.com 2819164Sandreas.hansson@arm.com // if we have stalled a request due to a full request queue, 2829164Sandreas.hansson@arm.com // then send a retry at this point, also note that if the 2839164Sandreas.hansson@arm.com // request we stalled was waiting for the response queue 2849164Sandreas.hansson@arm.com // rather than the request queue we might stall it again 2859164Sandreas.hansson@arm.com slavePort.retryStalledReq(); 2862643Sstever@eecs.umich.edu } 2874986Ssaidi@eecs.umich.edu 2889164Sandreas.hansson@arm.com // if the send failed, then we try again once we receive a retry, 2899164Sandreas.hansson@arm.com // and therefore there is no need to take any action 2902568SN/A} 2912568SN/A 2928713Sandreas.hansson@arm.comvoid 2939164Sandreas.hansson@arm.comBridge::BridgeSlavePort::trySendTiming() 2948713Sandreas.hansson@arm.com{ 2959164Sandreas.hansson@arm.com assert(!transmitList.empty()); 2968713Sandreas.hansson@arm.com 2979164Sandreas.hansson@arm.com DeferredPacket resp = transmitList.front(); 2988713Sandreas.hansson@arm.com 2999164Sandreas.hansson@arm.com assert(resp.tick <= curTick()); 3008713Sandreas.hansson@arm.com 3019029Sandreas.hansson@arm.com PacketPtr pkt = resp.pkt; 3028713Sandreas.hansson@arm.com 3039164Sandreas.hansson@arm.com DPRINTF(Bridge, "trySend response addr 0x%x, outstanding %d\n", 3049164Sandreas.hansson@arm.com pkt->getAddr(), outstandingResponses); 3058713Sandreas.hansson@arm.com 3068975Sandreas.hansson@arm.com if (sendTimingResp(pkt)) { 3078713Sandreas.hansson@arm.com // send successful 3089164Sandreas.hansson@arm.com transmitList.pop_front(); 3099164Sandreas.hansson@arm.com DPRINTF(Bridge, "trySend response successful\n"); 3108713Sandreas.hansson@arm.com 3119164Sandreas.hansson@arm.com assert(outstandingResponses != 0); 3129164Sandreas.hansson@arm.com --outstandingResponses; 3139164Sandreas.hansson@arm.com 3149164Sandreas.hansson@arm.com // If there are more packets to send, schedule event to try again. 3159164Sandreas.hansson@arm.com if (!transmitList.empty()) { 3169786Sandreas.hansson@arm.com DeferredPacket next_resp = transmitList.front(); 3179164Sandreas.hansson@arm.com DPRINTF(Bridge, "Scheduling next send\n"); 3189786Sandreas.hansson@arm.com bridge.schedule(sendEvent, std::max(next_resp.tick, 3199648Sdam.sunwoo@arm.com bridge.clockEdge())); 3208713Sandreas.hansson@arm.com } 3218713Sandreas.hansson@arm.com 3229164Sandreas.hansson@arm.com // if there is space in the request queue and we were stalling 3239164Sandreas.hansson@arm.com // a request, it will definitely be possible to accept it now 3249164Sandreas.hansson@arm.com // since there is guaranteed space in the response queue 3259164Sandreas.hansson@arm.com if (!masterPort.reqQueueFull() && retryReq) { 3269164Sandreas.hansson@arm.com DPRINTF(Bridge, "Request waiting for retry, now retrying\n"); 3279164Sandreas.hansson@arm.com retryReq = false; 32810713Sandreas.hansson@arm.com sendRetryReq(); 3298713Sandreas.hansson@arm.com } 3308713Sandreas.hansson@arm.com } 3318713Sandreas.hansson@arm.com 3329164Sandreas.hansson@arm.com // if the send failed, then we try again once we receive a retry, 3339164Sandreas.hansson@arm.com // and therefore there is no need to take any action 3348713Sandreas.hansson@arm.com} 3352568SN/A 3362657Ssaidi@eecs.umich.eduvoid 33710713Sandreas.hansson@arm.comBridge::BridgeMasterPort::recvReqRetry() 3382568SN/A{ 3399786Sandreas.hansson@arm.com trySendTiming(); 3402568SN/A} 3412568SN/A 3428713Sandreas.hansson@arm.comvoid 34310713Sandreas.hansson@arm.comBridge::BridgeSlavePort::recvRespRetry() 3442568SN/A{ 3459786Sandreas.hansson@arm.com trySendTiming(); 3462568SN/A} 3472568SN/A 3488713Sandreas.hansson@arm.comTick 3498713Sandreas.hansson@arm.comBridge::BridgeSlavePort::recvAtomic(PacketPtr pkt) 3508713Sandreas.hansson@arm.com{ 35111334Sandreas.hansson@arm.com panic_if(pkt->cacheResponding(), "Should not see packets where cache " 35211334Sandreas.hansson@arm.com "is responding"); 35311334Sandreas.hansson@arm.com 3549180Sandreas.hansson@arm.com return delay * bridge.clockPeriod() + masterPort.sendAtomic(pkt); 3558713Sandreas.hansson@arm.com} 3568713Sandreas.hansson@arm.com 3572568SN/Avoid 3588713Sandreas.hansson@arm.comBridge::BridgeSlavePort::recvFunctional(PacketPtr pkt) 3592568SN/A{ 3605314Sstever@gmail.com pkt->pushLabel(name()); 3615314Sstever@gmail.com 3628713Sandreas.hansson@arm.com // check the response queue 3639786Sandreas.hansson@arm.com for (auto i = transmitList.begin(); i != transmitList.end(); ++i) { 36412823Srmk35@cl.cam.ac.uk if (pkt->trySatisfyFunctional((*i).pkt)) { 3657668Ssteve.reinhardt@amd.com pkt->makeResponse(); 3664626Sstever@eecs.umich.edu return; 3677668Ssteve.reinhardt@amd.com } 3682568SN/A } 3692568SN/A 3708713Sandreas.hansson@arm.com // also check the master port's request queue 37112823Srmk35@cl.cam.ac.uk if (masterPort.trySatisfyFunctional(pkt)) { 3728713Sandreas.hansson@arm.com return; 3738713Sandreas.hansson@arm.com } 3748713Sandreas.hansson@arm.com 3755314Sstever@gmail.com pkt->popLabel(); 3765314Sstever@gmail.com 3774626Sstever@eecs.umich.edu // fall through if pkt still not satisfied 3788851Sandreas.hansson@arm.com masterPort.sendFunctional(pkt); 3798713Sandreas.hansson@arm.com} 3808713Sandreas.hansson@arm.com 3818713Sandreas.hansson@arm.combool 38212823Srmk35@cl.cam.ac.ukBridge::BridgeMasterPort::trySatisfyFunctional(PacketPtr pkt) 3838713Sandreas.hansson@arm.com{ 3848713Sandreas.hansson@arm.com bool found = false; 3859786Sandreas.hansson@arm.com auto i = transmitList.begin(); 3868713Sandreas.hansson@arm.com 38711321Ssteve.reinhardt@amd.com while (i != transmitList.end() && !found) { 38812823Srmk35@cl.cam.ac.uk if (pkt->trySatisfyFunctional((*i).pkt)) { 3898713Sandreas.hansson@arm.com pkt->makeResponse(); 3908713Sandreas.hansson@arm.com found = true; 3918713Sandreas.hansson@arm.com } 3928713Sandreas.hansson@arm.com ++i; 3938713Sandreas.hansson@arm.com } 3948713Sandreas.hansson@arm.com 3958713Sandreas.hansson@arm.com return found; 3962568SN/A} 3972568SN/A 3988711Sandreas.hansson@arm.comAddrRangeList 3999090Sandreas.hansson@arm.comBridge::BridgeSlavePort::getAddrRanges() const 4002568SN/A{ 4018711Sandreas.hansson@arm.com return ranges; 4022568SN/A} 4032568SN/A 4044762Snate@binkert.orgBridge * 4054762Snate@binkert.orgBridgeParams::create() 4062568SN/A{ 4074762Snate@binkert.org return new Bridge(this); 4082568SN/A} 409