bridge.hh revision 9044
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 * Declaration 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#ifndef __MEM_BRIDGE_HH__ 522568SN/A#define __MEM_BRIDGE_HH__ 532568SN/A 542568SN/A#include <list> 552568SN/A#include <queue> 568229Snate@binkert.org#include <string> 572568SN/A 586215Snate@binkert.org#include "base/types.hh" 592568SN/A#include "mem/mem_object.hh" 602568SN/A#include "mem/packet.hh" 612568SN/A#include "mem/port.hh" 624762Snate@binkert.org#include "params/Bridge.hh" 632568SN/A#include "sim/eventq.hh" 642568SN/A 658713Sandreas.hansson@arm.com/** 668713Sandreas.hansson@arm.com * A bridge is used to interface two different busses (or in general a 678713Sandreas.hansson@arm.com * memory-mapped master and slave), with buffering for requests and 688713Sandreas.hansson@arm.com * responses. The bridge has a fixed delay for packets passing through 698713Sandreas.hansson@arm.com * it and responds to a fixed set of address ranges. 708713Sandreas.hansson@arm.com * 718713Sandreas.hansson@arm.com * The bridge comprises a slave port and a master port, that buffer 728713Sandreas.hansson@arm.com * outgoing responses and requests respectively. Buffer space is 738713Sandreas.hansson@arm.com * reserved when a request arrives, also reserving response space 748713Sandreas.hansson@arm.com * before forwarding the request. An incoming request is always 758713Sandreas.hansson@arm.com * accepted (recvTiming returns true), but is potentially NACKed if 768713Sandreas.hansson@arm.com * there is no request space or response space. 778713Sandreas.hansson@arm.com */ 782568SN/Aclass Bridge : public MemObject 792568SN/A{ 802568SN/A protected: 818713Sandreas.hansson@arm.com 828713Sandreas.hansson@arm.com /** 839029Sandreas.hansson@arm.com * A bridge request state stores packets along with their sender 849029Sandreas.hansson@arm.com * state and original source. It has enough information to also 859029Sandreas.hansson@arm.com * restore the response once it comes back to the bridge. 868713Sandreas.hansson@arm.com */ 879044SAli.Saidi@ARM.com class RequestState : public Packet::SenderState 889029Sandreas.hansson@arm.com { 898713Sandreas.hansson@arm.com 908713Sandreas.hansson@arm.com public: 919029Sandreas.hansson@arm.com 928713Sandreas.hansson@arm.com Packet::SenderState *origSenderState; 939031Sandreas.hansson@arm.com PortID origSrc; 948713Sandreas.hansson@arm.com 959029Sandreas.hansson@arm.com RequestState(PacketPtr _pkt) 969029Sandreas.hansson@arm.com : origSenderState(_pkt->senderState), 979029Sandreas.hansson@arm.com origSrc(_pkt->getSrc()) 989029Sandreas.hansson@arm.com { } 998713Sandreas.hansson@arm.com 1008713Sandreas.hansson@arm.com void fixResponse(PacketPtr pkt) 1018713Sandreas.hansson@arm.com { 1028713Sandreas.hansson@arm.com assert(pkt->senderState == this); 1038713Sandreas.hansson@arm.com pkt->setDest(origSrc); 1048713Sandreas.hansson@arm.com pkt->senderState = origSenderState; 1058713Sandreas.hansson@arm.com } 1068713Sandreas.hansson@arm.com }; 1078713Sandreas.hansson@arm.com 1089029Sandreas.hansson@arm.com /** 1099029Sandreas.hansson@arm.com * A deferred request stores a packet along with its scheduled 1109029Sandreas.hansson@arm.com * transmission time, and whether we can expect to see a response 1119029Sandreas.hansson@arm.com * or not. 1129029Sandreas.hansson@arm.com */ 1139029Sandreas.hansson@arm.com class DeferredRequest 1149029Sandreas.hansson@arm.com { 1159029Sandreas.hansson@arm.com 1169029Sandreas.hansson@arm.com public: 1179029Sandreas.hansson@arm.com 1189029Sandreas.hansson@arm.com Tick ready; 1199029Sandreas.hansson@arm.com PacketPtr pkt; 1209029Sandreas.hansson@arm.com bool expectResponse; 1219029Sandreas.hansson@arm.com 1229029Sandreas.hansson@arm.com DeferredRequest(PacketPtr _pkt, Tick t) 1239029Sandreas.hansson@arm.com : ready(t), pkt(_pkt), expectResponse(_pkt->needsResponse()) 1249029Sandreas.hansson@arm.com { } 1259029Sandreas.hansson@arm.com }; 1269029Sandreas.hansson@arm.com 1279029Sandreas.hansson@arm.com /** 1289029Sandreas.hansson@arm.com * A deferred response stores a packet along with its scheduled 1299029Sandreas.hansson@arm.com * transmission time. It also contains information of whether the 1309029Sandreas.hansson@arm.com * bridge NACKed the packet to be able to correctly maintain 1319029Sandreas.hansson@arm.com * counters of outstanding responses. 1329029Sandreas.hansson@arm.com */ 1339029Sandreas.hansson@arm.com class DeferredResponse { 1349029Sandreas.hansson@arm.com 1359029Sandreas.hansson@arm.com public: 1369029Sandreas.hansson@arm.com 1379029Sandreas.hansson@arm.com Tick ready; 1389029Sandreas.hansson@arm.com PacketPtr pkt; 1399029Sandreas.hansson@arm.com bool nackedHere; 1409029Sandreas.hansson@arm.com 1419029Sandreas.hansson@arm.com DeferredResponse(PacketPtr _pkt, Tick t, bool nack = false) 1429029Sandreas.hansson@arm.com : ready(t), pkt(_pkt), nackedHere(nack) 1439029Sandreas.hansson@arm.com { } 1449029Sandreas.hansson@arm.com }; 1459029Sandreas.hansson@arm.com 1468713Sandreas.hansson@arm.com // Forward declaration to allow the slave port to have a pointer 1478713Sandreas.hansson@arm.com class BridgeMasterPort; 1488713Sandreas.hansson@arm.com 1498713Sandreas.hansson@arm.com /** 1508713Sandreas.hansson@arm.com * The port on the side that receives requests and sends 1518713Sandreas.hansson@arm.com * responses. The slave port has a set of address ranges that it 1528713Sandreas.hansson@arm.com * is responsible for. The slave port also has a buffer for the 1538713Sandreas.hansson@arm.com * responses not yet sent. 1548713Sandreas.hansson@arm.com */ 1558922Swilliam.wang@arm.com class BridgeSlavePort : public SlavePort 1562568SN/A { 1578713Sandreas.hansson@arm.com 1588713Sandreas.hansson@arm.com private: 1598713Sandreas.hansson@arm.com 1602643Sstever@eecs.umich.edu /** A pointer to the bridge to which this port belongs. */ 1612568SN/A Bridge *bridge; 1622568SN/A 1632643Sstever@eecs.umich.edu /** 1648851Sandreas.hansson@arm.com * Master port on the other side of the bridge 1652643Sstever@eecs.umich.edu * (connected to the other bus). 1662643Sstever@eecs.umich.edu */ 1678851Sandreas.hansson@arm.com BridgeMasterPort& masterPort; 1688713Sandreas.hansson@arm.com 1698713Sandreas.hansson@arm.com /** Minimum request delay though this bridge. */ 1708713Sandreas.hansson@arm.com Tick delay; 1718713Sandreas.hansson@arm.com 1728713Sandreas.hansson@arm.com /** Min delay to respond with a nack. */ 1738713Sandreas.hansson@arm.com Tick nackDelay; 1748713Sandreas.hansson@arm.com 1758713Sandreas.hansson@arm.com /** Address ranges to pass through the bridge */ 1768713Sandreas.hansson@arm.com AddrRangeList ranges; 1778713Sandreas.hansson@arm.com 1788713Sandreas.hansson@arm.com /** 1798713Sandreas.hansson@arm.com * Response packet queue. Response packets are held in this 1808713Sandreas.hansson@arm.com * queue for a specified delay to model the processing delay 1818713Sandreas.hansson@arm.com * of the bridge. 1828713Sandreas.hansson@arm.com */ 1839029Sandreas.hansson@arm.com std::list<DeferredResponse> responseQueue; 1848713Sandreas.hansson@arm.com 1858713Sandreas.hansson@arm.com /** Counter to track the outstanding responses. */ 1868713Sandreas.hansson@arm.com unsigned int outstandingResponses; 1878713Sandreas.hansson@arm.com 1888713Sandreas.hansson@arm.com /** If we're waiting for a retry to happen. */ 1898713Sandreas.hansson@arm.com bool inRetry; 1908713Sandreas.hansson@arm.com 1918713Sandreas.hansson@arm.com /** Max queue size for reserved responses. */ 1928713Sandreas.hansson@arm.com unsigned int respQueueLimit; 1938713Sandreas.hansson@arm.com 1948713Sandreas.hansson@arm.com /** 1958713Sandreas.hansson@arm.com * Is this side blocked from accepting new response packets. 1968713Sandreas.hansson@arm.com * 1978713Sandreas.hansson@arm.com * @return true if the reserved space has reached the set limit 1988713Sandreas.hansson@arm.com */ 1998713Sandreas.hansson@arm.com bool respQueueFull(); 2008713Sandreas.hansson@arm.com 2018713Sandreas.hansson@arm.com /** 2028713Sandreas.hansson@arm.com * Turn the request packet into a NACK response and put it in 2038713Sandreas.hansson@arm.com * the response queue and schedule its transmission. 2048713Sandreas.hansson@arm.com * 2058713Sandreas.hansson@arm.com * @param pkt the request packet to NACK 2068713Sandreas.hansson@arm.com */ 2078713Sandreas.hansson@arm.com void nackRequest(PacketPtr pkt); 2088713Sandreas.hansson@arm.com 2098713Sandreas.hansson@arm.com /** 2108713Sandreas.hansson@arm.com * Handle send event, scheduled when the packet at the head of 2118713Sandreas.hansson@arm.com * the response queue is ready to transmit (for timing 2128713Sandreas.hansson@arm.com * accesses only). 2138713Sandreas.hansson@arm.com */ 2148713Sandreas.hansson@arm.com void trySend(); 2158713Sandreas.hansson@arm.com 2168713Sandreas.hansson@arm.com /** 2178713Sandreas.hansson@arm.com * Private class for scheduling sending of responses from the 2188713Sandreas.hansson@arm.com * response queue. 2198713Sandreas.hansson@arm.com */ 2208713Sandreas.hansson@arm.com class SendEvent : public Event 2218713Sandreas.hansson@arm.com { 2228851Sandreas.hansson@arm.com BridgeSlavePort& port; 2238713Sandreas.hansson@arm.com 2248713Sandreas.hansson@arm.com public: 2258851Sandreas.hansson@arm.com SendEvent(BridgeSlavePort& p) : port(p) {} 2268851Sandreas.hansson@arm.com virtual void process() { port.trySend(); } 2278713Sandreas.hansson@arm.com virtual const char *description() const { return "bridge send"; } 2288713Sandreas.hansson@arm.com }; 2298713Sandreas.hansson@arm.com 2308713Sandreas.hansson@arm.com /** Send event for the response queue. */ 2318713Sandreas.hansson@arm.com SendEvent sendEvent; 2328713Sandreas.hansson@arm.com 2338713Sandreas.hansson@arm.com public: 2348713Sandreas.hansson@arm.com 2358713Sandreas.hansson@arm.com /** 2368713Sandreas.hansson@arm.com * Constructor for the BridgeSlavePort. 2378713Sandreas.hansson@arm.com * 2388713Sandreas.hansson@arm.com * @param _name the port name including the owner 2398713Sandreas.hansson@arm.com * @param _bridge the structural owner 2408713Sandreas.hansson@arm.com * @param _masterPort the master port on the other side of the bridge 2418713Sandreas.hansson@arm.com * @param _delay the delay from seeing a response to sending it 2428713Sandreas.hansson@arm.com * @param _nack_delay the delay from a NACK to sending the response 2438713Sandreas.hansson@arm.com * @param _resp_limit the size of the response queue 2448713Sandreas.hansson@arm.com * @param _ranges a number of address ranges to forward 2458713Sandreas.hansson@arm.com */ 2468713Sandreas.hansson@arm.com BridgeSlavePort(const std::string &_name, Bridge *_bridge, 2478851Sandreas.hansson@arm.com BridgeMasterPort& _masterPort, int _delay, 2488713Sandreas.hansson@arm.com int _nack_delay, int _resp_limit, 2498713Sandreas.hansson@arm.com std::vector<Range<Addr> > _ranges); 2508713Sandreas.hansson@arm.com 2518713Sandreas.hansson@arm.com /** 2528713Sandreas.hansson@arm.com * Queue a response packet to be sent out later and also schedule 2538713Sandreas.hansson@arm.com * a send if necessary. 2548713Sandreas.hansson@arm.com * 2558713Sandreas.hansson@arm.com * @param pkt a response to send out after a delay 2568713Sandreas.hansson@arm.com */ 2578713Sandreas.hansson@arm.com void queueForSendTiming(PacketPtr pkt); 2588713Sandreas.hansson@arm.com 2598713Sandreas.hansson@arm.com protected: 2608713Sandreas.hansson@arm.com 2618713Sandreas.hansson@arm.com /** When receiving a timing request from the peer port, 2628713Sandreas.hansson@arm.com pass it to the bridge. */ 2638975Sandreas.hansson@arm.com virtual bool recvTimingReq(PacketPtr pkt); 2648713Sandreas.hansson@arm.com 2658713Sandreas.hansson@arm.com /** When receiving a retry request from the peer port, 2668713Sandreas.hansson@arm.com pass it to the bridge. */ 2678713Sandreas.hansson@arm.com virtual void recvRetry(); 2688713Sandreas.hansson@arm.com 2698713Sandreas.hansson@arm.com /** When receiving a Atomic requestfrom the peer port, 2708713Sandreas.hansson@arm.com pass it to the bridge. */ 2718713Sandreas.hansson@arm.com virtual Tick recvAtomic(PacketPtr pkt); 2728713Sandreas.hansson@arm.com 2738713Sandreas.hansson@arm.com /** When receiving a Functional request from the peer port, 2748713Sandreas.hansson@arm.com pass it to the bridge. */ 2758713Sandreas.hansson@arm.com virtual void recvFunctional(PacketPtr pkt); 2768713Sandreas.hansson@arm.com 2778713Sandreas.hansson@arm.com /** When receiving a address range request the peer port, 2788713Sandreas.hansson@arm.com pass it to the bridge. */ 2798713Sandreas.hansson@arm.com virtual AddrRangeList getAddrRanges(); 2808713Sandreas.hansson@arm.com }; 2818713Sandreas.hansson@arm.com 2828713Sandreas.hansson@arm.com 2838713Sandreas.hansson@arm.com /** 2848713Sandreas.hansson@arm.com * Port on the side that forwards requests and receives 2858713Sandreas.hansson@arm.com * responses. The master port has a buffer for the requests not 2868713Sandreas.hansson@arm.com * yet sent. 2878713Sandreas.hansson@arm.com */ 2888922Swilliam.wang@arm.com class BridgeMasterPort : public MasterPort 2898713Sandreas.hansson@arm.com { 2908713Sandreas.hansson@arm.com 2918713Sandreas.hansson@arm.com private: 2928713Sandreas.hansson@arm.com 2938713Sandreas.hansson@arm.com /** A pointer to the bridge to which this port belongs. */ 2948713Sandreas.hansson@arm.com Bridge* bridge; 2958713Sandreas.hansson@arm.com 2968713Sandreas.hansson@arm.com /** 2978713Sandreas.hansson@arm.com * Pointer to the slave port on the other side of the bridge 2988713Sandreas.hansson@arm.com * (connected to the other bus). 2998713Sandreas.hansson@arm.com */ 3008851Sandreas.hansson@arm.com BridgeSlavePort& slavePort; 3012643Sstever@eecs.umich.edu 3022643Sstever@eecs.umich.edu /** Minimum delay though this bridge. */ 3032643Sstever@eecs.umich.edu Tick delay; 3042643Sstever@eecs.umich.edu 3058713Sandreas.hansson@arm.com /** 3068713Sandreas.hansson@arm.com * Request packet queue. Request packets are held in this 3078713Sandreas.hansson@arm.com * queue for a specified delay to model the processing delay 3088713Sandreas.hansson@arm.com * of the bridge. 3098713Sandreas.hansson@arm.com */ 3109029Sandreas.hansson@arm.com std::list<DeferredRequest> requestQueue; 3114435Ssaidi@eecs.umich.edu 3128713Sandreas.hansson@arm.com /** If we're waiting for a retry to happen. */ 3134435Ssaidi@eecs.umich.edu bool inRetry; 3144435Ssaidi@eecs.umich.edu 3158713Sandreas.hansson@arm.com /** Max queue size for request packets */ 3168713Sandreas.hansson@arm.com unsigned int reqQueueLimit; 3174433Ssaidi@eecs.umich.edu 3182643Sstever@eecs.umich.edu /** 3192643Sstever@eecs.umich.edu * Handle send event, scheduled when the packet at the head of 3202643Sstever@eecs.umich.edu * the outbound queue is ready to transmit (for timing 3212643Sstever@eecs.umich.edu * accesses only). 3222643Sstever@eecs.umich.edu */ 3232643Sstever@eecs.umich.edu void trySend(); 3242643Sstever@eecs.umich.edu 3258713Sandreas.hansson@arm.com /** 3268713Sandreas.hansson@arm.com * Private class for scheduling sending of requests from the 3278713Sandreas.hansson@arm.com * request queue. 3288713Sandreas.hansson@arm.com */ 3292643Sstever@eecs.umich.edu class SendEvent : public Event 3302643Sstever@eecs.umich.edu { 3318851Sandreas.hansson@arm.com BridgeMasterPort& port; 3322643Sstever@eecs.umich.edu 3332643Sstever@eecs.umich.edu public: 3348851Sandreas.hansson@arm.com SendEvent(BridgeMasterPort& p) : port(p) {} 3358851Sandreas.hansson@arm.com virtual void process() { port.trySend(); } 3365336Shines@cs.fsu.edu virtual const char *description() const { return "bridge send"; } 3372643Sstever@eecs.umich.edu }; 3382643Sstever@eecs.umich.edu 3398713Sandreas.hansson@arm.com /** Send event for the request queue. */ 3402643Sstever@eecs.umich.edu SendEvent sendEvent; 3412568SN/A 3422568SN/A public: 3438713Sandreas.hansson@arm.com 3448713Sandreas.hansson@arm.com /** 3458713Sandreas.hansson@arm.com * Constructor for the BridgeMasterPort. 3468713Sandreas.hansson@arm.com * 3478713Sandreas.hansson@arm.com * @param _name the port name including the owner 3488713Sandreas.hansson@arm.com * @param _bridge the structural owner 3498713Sandreas.hansson@arm.com * @param _slavePort the slave port on the other side of the bridge 3508713Sandreas.hansson@arm.com * @param _delay the delay from seeing a request to sending it 3518713Sandreas.hansson@arm.com * @param _req_limit the size of the request queue 3528713Sandreas.hansson@arm.com */ 3538713Sandreas.hansson@arm.com BridgeMasterPort(const std::string &_name, Bridge *_bridge, 3548851Sandreas.hansson@arm.com BridgeSlavePort& _slavePort, int _delay, 3558713Sandreas.hansson@arm.com int _req_limit); 3568713Sandreas.hansson@arm.com 3578713Sandreas.hansson@arm.com /** 3588713Sandreas.hansson@arm.com * Is this side blocked from accepting new request packets. 3598713Sandreas.hansson@arm.com * 3608713Sandreas.hansson@arm.com * @return true if the occupied space has reached the set limit 3618713Sandreas.hansson@arm.com */ 3628713Sandreas.hansson@arm.com bool reqQueueFull(); 3638713Sandreas.hansson@arm.com 3648713Sandreas.hansson@arm.com /** 3658713Sandreas.hansson@arm.com * Queue a request packet to be sent out later and also schedule 3668713Sandreas.hansson@arm.com * a send if necessary. 3678713Sandreas.hansson@arm.com * 3688713Sandreas.hansson@arm.com * @param pkt a request to send out after a delay 3698713Sandreas.hansson@arm.com */ 3708713Sandreas.hansson@arm.com void queueForSendTiming(PacketPtr pkt); 3718713Sandreas.hansson@arm.com 3728713Sandreas.hansson@arm.com /** 3738713Sandreas.hansson@arm.com * Check a functional request against the packets in our 3748713Sandreas.hansson@arm.com * request queue. 3758713Sandreas.hansson@arm.com * 3768713Sandreas.hansson@arm.com * @param pkt packet to check against 3778713Sandreas.hansson@arm.com * 3788713Sandreas.hansson@arm.com * @return true if we find a match 3798713Sandreas.hansson@arm.com */ 3808713Sandreas.hansson@arm.com bool checkFunctional(PacketPtr pkt); 3812568SN/A 3822568SN/A protected: 3832568SN/A 3842643Sstever@eecs.umich.edu /** When receiving a timing request from the peer port, 3852643Sstever@eecs.umich.edu pass it to the bridge. */ 3868975Sandreas.hansson@arm.com virtual bool recvTimingResp(PacketPtr pkt); 3872568SN/A 3882643Sstever@eecs.umich.edu /** When receiving a retry request from the peer port, 3892568SN/A pass it to the bridge. */ 3902657Ssaidi@eecs.umich.edu virtual void recvRetry(); 3912568SN/A }; 3922568SN/A 3938713Sandreas.hansson@arm.com /** Slave port of the bridge. */ 3948713Sandreas.hansson@arm.com BridgeSlavePort slavePort; 3958713Sandreas.hansson@arm.com 3968713Sandreas.hansson@arm.com /** Master port of the bridge. */ 3978713Sandreas.hansson@arm.com BridgeMasterPort masterPort; 3982568SN/A 3992568SN/A /** If this bridge should acknowledge writes. */ 4002568SN/A bool ackWrites; 4012568SN/A 4022568SN/A public: 4034762Snate@binkert.org typedef BridgeParams Params; 4044435Ssaidi@eecs.umich.edu 4054435Ssaidi@eecs.umich.edu protected: 4064435Ssaidi@eecs.umich.edu Params *_params; 4074435Ssaidi@eecs.umich.edu 4084435Ssaidi@eecs.umich.edu public: 4094435Ssaidi@eecs.umich.edu const Params *params() const { return _params; } 4102568SN/A 4118922Swilliam.wang@arm.com virtual MasterPort& getMasterPort(const std::string& if_name, 4128922Swilliam.wang@arm.com int idx = -1); 4138922Swilliam.wang@arm.com virtual SlavePort& getSlavePort(const std::string& if_name, int idx = -1); 4142568SN/A 4152568SN/A virtual void init(); 4162568SN/A 4174435Ssaidi@eecs.umich.edu Bridge(Params *p); 4182568SN/A}; 4192568SN/A 4202568SN/A#endif //__MEM_BUS_HH__ 421