bridge.hh revision 8713
12568SN/A/*
28713Sandreas.hansson@arm.com * Copyright (c) 2011 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
585386Sstever@gmail.com#include "base/fast_alloc.hh"
596215Snate@binkert.org#include "base/types.hh"
602568SN/A#include "mem/mem_object.hh"
612568SN/A#include "mem/packet.hh"
622568SN/A#include "mem/port.hh"
634762Snate@binkert.org#include "params/Bridge.hh"
642568SN/A#include "sim/eventq.hh"
652568SN/A
668713Sandreas.hansson@arm.com/**
678713Sandreas.hansson@arm.com * A bridge is used to interface two different busses (or in general a
688713Sandreas.hansson@arm.com * memory-mapped master and slave), with buffering for requests and
698713Sandreas.hansson@arm.com * responses. The bridge has a fixed delay for packets passing through
708713Sandreas.hansson@arm.com * it and responds to a fixed set of address ranges.
718713Sandreas.hansson@arm.com *
728713Sandreas.hansson@arm.com * The bridge comprises a slave port and a master port, that buffer
738713Sandreas.hansson@arm.com * outgoing responses and requests respectively. Buffer space is
748713Sandreas.hansson@arm.com * reserved when a request arrives, also reserving response space
758713Sandreas.hansson@arm.com * before forwarding the request. An incoming request is always
768713Sandreas.hansson@arm.com * accepted (recvTiming returns true), but is potentially NACKed if
778713Sandreas.hansson@arm.com * there is no request space or response space.
788713Sandreas.hansson@arm.com */
792568SN/Aclass Bridge : public MemObject
802568SN/A{
812568SN/A  protected:
828713Sandreas.hansson@arm.com
838713Sandreas.hansson@arm.com    /**
848713Sandreas.hansson@arm.com     * A packet buffer stores packets along with their sender state
858713Sandreas.hansson@arm.com     * and scheduled time for transmission.
868713Sandreas.hansson@arm.com     */
878713Sandreas.hansson@arm.com    class PacketBuffer : public Packet::SenderState, public FastAlloc {
888713Sandreas.hansson@arm.com
898713Sandreas.hansson@arm.com      public:
908713Sandreas.hansson@arm.com        Tick ready;
918713Sandreas.hansson@arm.com        PacketPtr pkt;
928713Sandreas.hansson@arm.com        bool nackedHere;
938713Sandreas.hansson@arm.com        Packet::SenderState *origSenderState;
948713Sandreas.hansson@arm.com        short origSrc;
958713Sandreas.hansson@arm.com        bool expectResponse;
968713Sandreas.hansson@arm.com
978713Sandreas.hansson@arm.com        PacketBuffer(PacketPtr _pkt, Tick t, bool nack = false)
988713Sandreas.hansson@arm.com            : ready(t), pkt(_pkt), nackedHere(nack),
998713Sandreas.hansson@arm.com              origSenderState(_pkt->senderState),
1008713Sandreas.hansson@arm.com              origSrc(nack ? _pkt->getDest() : _pkt->getSrc() ),
1018713Sandreas.hansson@arm.com              expectResponse(_pkt->needsResponse() && !nack)
1028713Sandreas.hansson@arm.com
1038713Sandreas.hansson@arm.com        {
1048713Sandreas.hansson@arm.com            if (!pkt->isResponse() && !nack)
1058713Sandreas.hansson@arm.com                pkt->senderState = this;
1068713Sandreas.hansson@arm.com        }
1078713Sandreas.hansson@arm.com
1088713Sandreas.hansson@arm.com        void fixResponse(PacketPtr pkt)
1098713Sandreas.hansson@arm.com        {
1108713Sandreas.hansson@arm.com            assert(pkt->senderState == this);
1118713Sandreas.hansson@arm.com            pkt->setDest(origSrc);
1128713Sandreas.hansson@arm.com            pkt->senderState = origSenderState;
1138713Sandreas.hansson@arm.com        }
1148713Sandreas.hansson@arm.com    };
1158713Sandreas.hansson@arm.com
1168713Sandreas.hansson@arm.com    // Forward declaration to allow the slave port to have a pointer
1178713Sandreas.hansson@arm.com    class BridgeMasterPort;
1188713Sandreas.hansson@arm.com
1198713Sandreas.hansson@arm.com    /**
1208713Sandreas.hansson@arm.com     * The port on the side that receives requests and sends
1218713Sandreas.hansson@arm.com     * responses. The slave port has a set of address ranges that it
1228713Sandreas.hansson@arm.com     * is responsible for. The slave port also has a buffer for the
1238713Sandreas.hansson@arm.com     * responses not yet sent.
1248713Sandreas.hansson@arm.com     */
1258713Sandreas.hansson@arm.com    class BridgeSlavePort : public Port
1262568SN/A    {
1278713Sandreas.hansson@arm.com
1288713Sandreas.hansson@arm.com      private:
1298713Sandreas.hansson@arm.com
1302643Sstever@eecs.umich.edu        /** A pointer to the bridge to which this port belongs. */
1312568SN/A        Bridge *bridge;
1322568SN/A
1332643Sstever@eecs.umich.edu        /**
1348713Sandreas.hansson@arm.com         * Pointer to the master port on the other side of the bridge
1352643Sstever@eecs.umich.edu         * (connected to the other bus).
1362643Sstever@eecs.umich.edu         */
1378713Sandreas.hansson@arm.com        BridgeMasterPort* masterPort;
1388713Sandreas.hansson@arm.com
1398713Sandreas.hansson@arm.com        /** Minimum request delay though this bridge. */
1408713Sandreas.hansson@arm.com        Tick delay;
1418713Sandreas.hansson@arm.com
1428713Sandreas.hansson@arm.com        /** Min delay to respond with a nack. */
1438713Sandreas.hansson@arm.com        Tick nackDelay;
1448713Sandreas.hansson@arm.com
1458713Sandreas.hansson@arm.com        /** Address ranges to pass through the bridge */
1468713Sandreas.hansson@arm.com        AddrRangeList ranges;
1478713Sandreas.hansson@arm.com
1488713Sandreas.hansson@arm.com        /**
1498713Sandreas.hansson@arm.com         * Response packet queue. Response packets are held in this
1508713Sandreas.hansson@arm.com         * queue for a specified delay to model the processing delay
1518713Sandreas.hansson@arm.com         * of the bridge.
1528713Sandreas.hansson@arm.com         */
1538713Sandreas.hansson@arm.com        std::list<PacketBuffer*> responseQueue;
1548713Sandreas.hansson@arm.com
1558713Sandreas.hansson@arm.com        /** Counter to track the outstanding responses. */
1568713Sandreas.hansson@arm.com        unsigned int outstandingResponses;
1578713Sandreas.hansson@arm.com
1588713Sandreas.hansson@arm.com        /** If we're waiting for a retry to happen. */
1598713Sandreas.hansson@arm.com        bool inRetry;
1608713Sandreas.hansson@arm.com
1618713Sandreas.hansson@arm.com        /** Max queue size for reserved responses. */
1628713Sandreas.hansson@arm.com        unsigned int respQueueLimit;
1638713Sandreas.hansson@arm.com
1648713Sandreas.hansson@arm.com        /**
1658713Sandreas.hansson@arm.com         * Is this side blocked from accepting new response packets.
1668713Sandreas.hansson@arm.com         *
1678713Sandreas.hansson@arm.com         * @return true if the reserved space has reached the set limit
1688713Sandreas.hansson@arm.com         */
1698713Sandreas.hansson@arm.com        bool respQueueFull();
1708713Sandreas.hansson@arm.com
1718713Sandreas.hansson@arm.com        /**
1728713Sandreas.hansson@arm.com         * Turn the request packet into a NACK response and put it in
1738713Sandreas.hansson@arm.com         * the response queue and schedule its transmission.
1748713Sandreas.hansson@arm.com         *
1758713Sandreas.hansson@arm.com         * @param pkt the request packet to NACK
1768713Sandreas.hansson@arm.com         */
1778713Sandreas.hansson@arm.com        void nackRequest(PacketPtr pkt);
1788713Sandreas.hansson@arm.com
1798713Sandreas.hansson@arm.com        /**
1808713Sandreas.hansson@arm.com         * Handle send event, scheduled when the packet at the head of
1818713Sandreas.hansson@arm.com         * the response queue is ready to transmit (for timing
1828713Sandreas.hansson@arm.com         * accesses only).
1838713Sandreas.hansson@arm.com         */
1848713Sandreas.hansson@arm.com        void trySend();
1858713Sandreas.hansson@arm.com
1868713Sandreas.hansson@arm.com        /**
1878713Sandreas.hansson@arm.com         * Private class for scheduling sending of responses from the
1888713Sandreas.hansson@arm.com         * response queue.
1898713Sandreas.hansson@arm.com         */
1908713Sandreas.hansson@arm.com        class SendEvent : public Event
1918713Sandreas.hansson@arm.com        {
1928713Sandreas.hansson@arm.com            BridgeSlavePort *port;
1938713Sandreas.hansson@arm.com
1948713Sandreas.hansson@arm.com          public:
1958713Sandreas.hansson@arm.com            SendEvent(BridgeSlavePort *p) : port(p) {}
1968713Sandreas.hansson@arm.com            virtual void process() { port->trySend(); }
1978713Sandreas.hansson@arm.com            virtual const char *description() const { return "bridge send"; }
1988713Sandreas.hansson@arm.com        };
1998713Sandreas.hansson@arm.com
2008713Sandreas.hansson@arm.com        /** Send event for the response queue. */
2018713Sandreas.hansson@arm.com        SendEvent sendEvent;
2028713Sandreas.hansson@arm.com
2038713Sandreas.hansson@arm.com      public:
2048713Sandreas.hansson@arm.com
2058713Sandreas.hansson@arm.com        /**
2068713Sandreas.hansson@arm.com         * Constructor for the BridgeSlavePort.
2078713Sandreas.hansson@arm.com         *
2088713Sandreas.hansson@arm.com         * @param _name the port name including the owner
2098713Sandreas.hansson@arm.com         * @param _bridge the structural owner
2108713Sandreas.hansson@arm.com         * @param _masterPort the master port on the other side of the bridge
2118713Sandreas.hansson@arm.com         * @param _delay the delay from seeing a response to sending it
2128713Sandreas.hansson@arm.com         * @param _nack_delay the delay from a NACK to sending the response
2138713Sandreas.hansson@arm.com         * @param _resp_limit the size of the response queue
2148713Sandreas.hansson@arm.com         * @param _ranges a number of address ranges to forward
2158713Sandreas.hansson@arm.com         */
2168713Sandreas.hansson@arm.com        BridgeSlavePort(const std::string &_name, Bridge *_bridge,
2178713Sandreas.hansson@arm.com                        BridgeMasterPort* _masterPort, int _delay,
2188713Sandreas.hansson@arm.com                        int _nack_delay, int _resp_limit,
2198713Sandreas.hansson@arm.com                        std::vector<Range<Addr> > _ranges);
2208713Sandreas.hansson@arm.com
2218713Sandreas.hansson@arm.com        /**
2228713Sandreas.hansson@arm.com         * Queue a response packet to be sent out later and also schedule
2238713Sandreas.hansson@arm.com         * a send if necessary.
2248713Sandreas.hansson@arm.com         *
2258713Sandreas.hansson@arm.com         * @param pkt a response to send out after a delay
2268713Sandreas.hansson@arm.com         */
2278713Sandreas.hansson@arm.com        void queueForSendTiming(PacketPtr pkt);
2288713Sandreas.hansson@arm.com
2298713Sandreas.hansson@arm.com      protected:
2308713Sandreas.hansson@arm.com
2318713Sandreas.hansson@arm.com        /** When receiving a timing request from the peer port,
2328713Sandreas.hansson@arm.com            pass it to the bridge. */
2338713Sandreas.hansson@arm.com        virtual bool recvTiming(PacketPtr pkt);
2348713Sandreas.hansson@arm.com
2358713Sandreas.hansson@arm.com        /** When receiving a retry request from the peer port,
2368713Sandreas.hansson@arm.com            pass it to the bridge. */
2378713Sandreas.hansson@arm.com        virtual void recvRetry();
2388713Sandreas.hansson@arm.com
2398713Sandreas.hansson@arm.com        /** When receiving a Atomic requestfrom the peer port,
2408713Sandreas.hansson@arm.com            pass it to the bridge. */
2418713Sandreas.hansson@arm.com        virtual Tick recvAtomic(PacketPtr pkt);
2428713Sandreas.hansson@arm.com
2438713Sandreas.hansson@arm.com        /** When receiving a Functional request from the peer port,
2448713Sandreas.hansson@arm.com            pass it to the bridge. */
2458713Sandreas.hansson@arm.com        virtual void recvFunctional(PacketPtr pkt);
2468713Sandreas.hansson@arm.com
2478713Sandreas.hansson@arm.com        /**
2488713Sandreas.hansson@arm.com         * When receiving a range change on the slave side do nothing.
2498713Sandreas.hansson@arm.com         */
2508713Sandreas.hansson@arm.com        virtual void recvRangeChange();
2518713Sandreas.hansson@arm.com
2528713Sandreas.hansson@arm.com        /** When receiving a address range request the peer port,
2538713Sandreas.hansson@arm.com            pass it to the bridge. */
2548713Sandreas.hansson@arm.com        virtual AddrRangeList getAddrRanges();
2558713Sandreas.hansson@arm.com    };
2568713Sandreas.hansson@arm.com
2578713Sandreas.hansson@arm.com
2588713Sandreas.hansson@arm.com    /**
2598713Sandreas.hansson@arm.com     * Port on the side that forwards requests and receives
2608713Sandreas.hansson@arm.com     * responses. The master port has a buffer for the requests not
2618713Sandreas.hansson@arm.com     * yet sent.
2628713Sandreas.hansson@arm.com     */
2638713Sandreas.hansson@arm.com    class BridgeMasterPort : public Port
2648713Sandreas.hansson@arm.com    {
2658713Sandreas.hansson@arm.com
2668713Sandreas.hansson@arm.com      private:
2678713Sandreas.hansson@arm.com
2688713Sandreas.hansson@arm.com        /** A pointer to the bridge to which this port belongs. */
2698713Sandreas.hansson@arm.com        Bridge* bridge;
2708713Sandreas.hansson@arm.com
2718713Sandreas.hansson@arm.com        /**
2728713Sandreas.hansson@arm.com         * Pointer to the slave port on the other side of the bridge
2738713Sandreas.hansson@arm.com         * (connected to the other bus).
2748713Sandreas.hansson@arm.com         */
2758713Sandreas.hansson@arm.com        BridgeSlavePort* slavePort;
2762643Sstever@eecs.umich.edu
2772643Sstever@eecs.umich.edu        /** Minimum delay though this bridge. */
2782643Sstever@eecs.umich.edu        Tick delay;
2792643Sstever@eecs.umich.edu
2808713Sandreas.hansson@arm.com        /**
2818713Sandreas.hansson@arm.com         * Request packet queue. Request packets are held in this
2828713Sandreas.hansson@arm.com         * queue for a specified delay to model the processing delay
2838713Sandreas.hansson@arm.com         * of the bridge.
2848713Sandreas.hansson@arm.com         */
2858713Sandreas.hansson@arm.com        std::list<PacketBuffer*> requestQueue;
2864435Ssaidi@eecs.umich.edu
2878713Sandreas.hansson@arm.com        /** If we're waiting for a retry to happen. */
2884435Ssaidi@eecs.umich.edu        bool inRetry;
2894435Ssaidi@eecs.umich.edu
2908713Sandreas.hansson@arm.com        /** Max queue size for request packets */
2918713Sandreas.hansson@arm.com        unsigned int reqQueueLimit;
2924433Ssaidi@eecs.umich.edu
2932643Sstever@eecs.umich.edu        /**
2942643Sstever@eecs.umich.edu         * Handle send event, scheduled when the packet at the head of
2952643Sstever@eecs.umich.edu         * the outbound queue is ready to transmit (for timing
2962643Sstever@eecs.umich.edu         * accesses only).
2972643Sstever@eecs.umich.edu         */
2982643Sstever@eecs.umich.edu        void trySend();
2992643Sstever@eecs.umich.edu
3008713Sandreas.hansson@arm.com        /**
3018713Sandreas.hansson@arm.com         * Private class for scheduling sending of requests from the
3028713Sandreas.hansson@arm.com         * request queue.
3038713Sandreas.hansson@arm.com         */
3042643Sstever@eecs.umich.edu        class SendEvent : public Event
3052643Sstever@eecs.umich.edu        {
3068713Sandreas.hansson@arm.com            BridgeMasterPort *port;
3072643Sstever@eecs.umich.edu
3082643Sstever@eecs.umich.edu          public:
3098713Sandreas.hansson@arm.com            SendEvent(BridgeMasterPort *p) : port(p) {}
3102643Sstever@eecs.umich.edu            virtual void process() { port->trySend(); }
3115336Shines@cs.fsu.edu            virtual const char *description() const { return "bridge send"; }
3122643Sstever@eecs.umich.edu        };
3132643Sstever@eecs.umich.edu
3148713Sandreas.hansson@arm.com        /** Send event for the request queue. */
3152643Sstever@eecs.umich.edu        SendEvent sendEvent;
3162568SN/A
3172568SN/A      public:
3188713Sandreas.hansson@arm.com
3198713Sandreas.hansson@arm.com        /**
3208713Sandreas.hansson@arm.com         * Constructor for the BridgeMasterPort.
3218713Sandreas.hansson@arm.com         *
3228713Sandreas.hansson@arm.com         * @param _name the port name including the owner
3238713Sandreas.hansson@arm.com         * @param _bridge the structural owner
3248713Sandreas.hansson@arm.com         * @param _slavePort the slave port on the other side of the bridge
3258713Sandreas.hansson@arm.com         * @param _delay the delay from seeing a request to sending it
3268713Sandreas.hansson@arm.com         * @param _req_limit the size of the request queue
3278713Sandreas.hansson@arm.com         */
3288713Sandreas.hansson@arm.com        BridgeMasterPort(const std::string &_name, Bridge *_bridge,
3298713Sandreas.hansson@arm.com                         BridgeSlavePort* _slavePort, int _delay,
3308713Sandreas.hansson@arm.com                         int _req_limit);
3318713Sandreas.hansson@arm.com
3328713Sandreas.hansson@arm.com        /**
3338713Sandreas.hansson@arm.com         * Is this side blocked from accepting new request packets.
3348713Sandreas.hansson@arm.com         *
3358713Sandreas.hansson@arm.com         * @return true if the occupied space has reached the set limit
3368713Sandreas.hansson@arm.com         */
3378713Sandreas.hansson@arm.com        bool reqQueueFull();
3388713Sandreas.hansson@arm.com
3398713Sandreas.hansson@arm.com        /**
3408713Sandreas.hansson@arm.com         * Queue a request packet to be sent out later and also schedule
3418713Sandreas.hansson@arm.com         * a send if necessary.
3428713Sandreas.hansson@arm.com         *
3438713Sandreas.hansson@arm.com         * @param pkt a request to send out after a delay
3448713Sandreas.hansson@arm.com         */
3458713Sandreas.hansson@arm.com        void queueForSendTiming(PacketPtr pkt);
3468713Sandreas.hansson@arm.com
3478713Sandreas.hansson@arm.com        /**
3488713Sandreas.hansson@arm.com         * Check a functional request against the packets in our
3498713Sandreas.hansson@arm.com         * request queue.
3508713Sandreas.hansson@arm.com         *
3518713Sandreas.hansson@arm.com         * @param pkt packet to check against
3528713Sandreas.hansson@arm.com         *
3538713Sandreas.hansson@arm.com         * @return true if we find a match
3548713Sandreas.hansson@arm.com         */
3558713Sandreas.hansson@arm.com        bool checkFunctional(PacketPtr pkt);
3562568SN/A
3572568SN/A      protected:
3582568SN/A
3592643Sstever@eecs.umich.edu        /** When receiving a timing request from the peer port,
3602643Sstever@eecs.umich.edu            pass it to the bridge. */
3613349Sbinkertn@umich.edu        virtual bool recvTiming(PacketPtr pkt);
3622568SN/A
3632643Sstever@eecs.umich.edu        /** When receiving a retry request from the peer port,
3642568SN/A            pass it to the bridge. */
3652657Ssaidi@eecs.umich.edu        virtual void recvRetry();
3662568SN/A
3672643Sstever@eecs.umich.edu        /** When receiving a Atomic requestfrom the peer port,
3682568SN/A            pass it to the bridge. */
3693349Sbinkertn@umich.edu        virtual Tick recvAtomic(PacketPtr pkt);
3702568SN/A
3712643Sstever@eecs.umich.edu        /** When receiving a Functional request from the peer port,
3722568SN/A            pass it to the bridge. */
3733349Sbinkertn@umich.edu        virtual void recvFunctional(PacketPtr pkt);
3742568SN/A
3758711Sandreas.hansson@arm.com        /**
3768711Sandreas.hansson@arm.com         * When receiving a range change, pass it through the bridge.
3778711Sandreas.hansson@arm.com         */
3788711Sandreas.hansson@arm.com        virtual void recvRangeChange();
3792568SN/A    };
3802568SN/A
3818713Sandreas.hansson@arm.com    /** Slave port of the bridge. */
3828713Sandreas.hansson@arm.com    BridgeSlavePort slavePort;
3838713Sandreas.hansson@arm.com
3848713Sandreas.hansson@arm.com    /** Master port of the bridge. */
3858713Sandreas.hansson@arm.com    BridgeMasterPort masterPort;
3862568SN/A
3872568SN/A    /** If this bridge should acknowledge writes. */
3882568SN/A    bool ackWrites;
3892568SN/A
3902568SN/A  public:
3914762Snate@binkert.org    typedef BridgeParams Params;
3924435Ssaidi@eecs.umich.edu
3934435Ssaidi@eecs.umich.edu  protected:
3944435Ssaidi@eecs.umich.edu    Params *_params;
3954435Ssaidi@eecs.umich.edu
3964435Ssaidi@eecs.umich.edu  public:
3974435Ssaidi@eecs.umich.edu    const Params *params() const { return _params; }
3982568SN/A
3992568SN/A    /** A function used to return the port associated with this bus object. */
4002738Sstever@eecs.umich.edu    virtual Port *getPort(const std::string &if_name, int idx = -1);
4012568SN/A
4022568SN/A    virtual void init();
4032568SN/A
4044435Ssaidi@eecs.umich.edu    Bridge(Params *p);
4052568SN/A};
4062568SN/A
4072568SN/A#endif //__MEM_BUS_HH__
408