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