qport.hh revision 13564
18914Sandreas.hansson@arm.com/*
210713Sandreas.hansson@arm.com * Copyright (c) 2012,2015 ARM Limited
38914Sandreas.hansson@arm.com * All rights reserved.
48914Sandreas.hansson@arm.com *
58914Sandreas.hansson@arm.com * The license below extends only to copyright in the software and shall
68914Sandreas.hansson@arm.com * not be construed as granting a license to any other intellectual
78914Sandreas.hansson@arm.com * property including but not limited to intellectual property relating
88914Sandreas.hansson@arm.com * to a hardware implementation of the functionality of the software
98914Sandreas.hansson@arm.com * licensed hereunder.  You may use the software subject to the license
108914Sandreas.hansson@arm.com * terms below provided that you ensure that this notice is replicated
118914Sandreas.hansson@arm.com * unmodified and in its entirety in all distributions of the software,
128914Sandreas.hansson@arm.com * modified or unmodified, in source code or in binary form.
138914Sandreas.hansson@arm.com *
148914Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without
158914Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are
168914Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright
178914Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer;
188914Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright
198914Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the
208914Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution;
218914Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its
228914Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from
238914Sandreas.hansson@arm.com * this software without specific prior written permission.
248914Sandreas.hansson@arm.com *
258914Sandreas.hansson@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
268914Sandreas.hansson@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
278914Sandreas.hansson@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
288914Sandreas.hansson@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
298914Sandreas.hansson@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
308914Sandreas.hansson@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
318914Sandreas.hansson@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
328914Sandreas.hansson@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
338914Sandreas.hansson@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
348914Sandreas.hansson@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
358914Sandreas.hansson@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
368914Sandreas.hansson@arm.com *
378914Sandreas.hansson@arm.com * Authors: Andreas Hansson
388914Sandreas.hansson@arm.com */
398914Sandreas.hansson@arm.com
408914Sandreas.hansson@arm.com#ifndef __MEM_QPORT_HH__
418914Sandreas.hansson@arm.com#define __MEM_QPORT_HH__
428914Sandreas.hansson@arm.com
438914Sandreas.hansson@arm.com/**
448914Sandreas.hansson@arm.com * @file
458914Sandreas.hansson@arm.com * Declaration of the queued port.
468914Sandreas.hansson@arm.com */
478914Sandreas.hansson@arm.com
488914Sandreas.hansson@arm.com#include "mem/packet_queue.hh"
498914Sandreas.hansson@arm.com#include "mem/port.hh"
508914Sandreas.hansson@arm.com
518914Sandreas.hansson@arm.com/**
528914Sandreas.hansson@arm.com * A queued port is a port that has an infinite queue for outgoing
538914Sandreas.hansson@arm.com * packets and thus decouples the module that wants to send
548914Sandreas.hansson@arm.com * request/responses from the flow control (retry mechanism) of the
558914Sandreas.hansson@arm.com * port. A queued port can be used by both a master and a slave. The
568914Sandreas.hansson@arm.com * queue is a parameter to allow tailoring of the queue implementation
578914Sandreas.hansson@arm.com * (used in the cache).
588914Sandreas.hansson@arm.com */
598922Swilliam.wang@arm.comclass QueuedSlavePort : public SlavePort
608914Sandreas.hansson@arm.com{
618914Sandreas.hansson@arm.com
628914Sandreas.hansson@arm.com  protected:
638914Sandreas.hansson@arm.com
6410713Sandreas.hansson@arm.com    /** Packet queue used to store outgoing responses. */
6510713Sandreas.hansson@arm.com    RespPacketQueue &respQueue;
668914Sandreas.hansson@arm.com
6710713Sandreas.hansson@arm.com    void recvRespRetry() { respQueue.retry(); }
688914Sandreas.hansson@arm.com
698922Swilliam.wang@arm.com  public:
708922Swilliam.wang@arm.com
718922Swilliam.wang@arm.com    /**
728922Swilliam.wang@arm.com     * Create a QueuedPort with a given name, owner, and a supplied
738922Swilliam.wang@arm.com     * implementation of a packet queue. The external definition of
748922Swilliam.wang@arm.com     * the queue enables e.g. the cache to implement a specific queue
758922Swilliam.wang@arm.com     * behaviuor in a subclass, and provide the latter to the
768922Swilliam.wang@arm.com     * QueuePort constructor.
778922Swilliam.wang@arm.com     */
788922Swilliam.wang@arm.com    QueuedSlavePort(const std::string& name, MemObject* owner,
7910713Sandreas.hansson@arm.com                    RespPacketQueue &resp_queue, PortID id = InvalidPortID) :
8010713Sandreas.hansson@arm.com        SlavePort(name, owner, id), respQueue(resp_queue)
818922Swilliam.wang@arm.com    { }
828922Swilliam.wang@arm.com
838922Swilliam.wang@arm.com    virtual ~QueuedSlavePort() { }
848922Swilliam.wang@arm.com
859163Sandreas.hansson@arm.com    /**
869163Sandreas.hansson@arm.com     * Schedule the sending of a timing response.
879163Sandreas.hansson@arm.com     *
889163Sandreas.hansson@arm.com     * @param pkt Packet to send
899163Sandreas.hansson@arm.com     * @param when Absolute time (in ticks) to send packet
909163Sandreas.hansson@arm.com     */
9113564Snikos.nikoleris@arm.com    void schedTimingResp(PacketPtr pkt, Tick when)
9213564Snikos.nikoleris@arm.com    { respQueue.schedSendTiming(pkt, when); }
939163Sandreas.hansson@arm.com
948922Swilliam.wang@arm.com    /** Check the list of buffered packets against the supplied
958922Swilliam.wang@arm.com     * functional request. */
9612823Srmk35@cl.cam.ac.uk    bool trySatisfyFunctional(PacketPtr pkt)
9712823Srmk35@cl.cam.ac.uk    { return respQueue.trySatisfyFunctional(pkt); }
988922Swilliam.wang@arm.com};
998922Swilliam.wang@arm.com
10010713Sandreas.hansson@arm.com/**
10110713Sandreas.hansson@arm.com * The QueuedMasterPort combines two queues, a request queue and a
10210713Sandreas.hansson@arm.com * snoop response queue, that both share the same port. The flow
10310713Sandreas.hansson@arm.com * control for requests and snoop responses are completely
10410713Sandreas.hansson@arm.com * independent, and so each queue manages its own flow control
10510713Sandreas.hansson@arm.com * (retries).
10610713Sandreas.hansson@arm.com */
1078922Swilliam.wang@arm.comclass QueuedMasterPort : public MasterPort
1088922Swilliam.wang@arm.com{
1098922Swilliam.wang@arm.com
1108922Swilliam.wang@arm.com  protected:
1118922Swilliam.wang@arm.com
11210713Sandreas.hansson@arm.com    /** Packet queue used to store outgoing requests. */
11310713Sandreas.hansson@arm.com    ReqPacketQueue &reqQueue;
1148922Swilliam.wang@arm.com
11510713Sandreas.hansson@arm.com    /** Packet queue used to store outgoing snoop responses. */
11610713Sandreas.hansson@arm.com    SnoopRespPacketQueue &snoopRespQueue;
11710713Sandreas.hansson@arm.com
11810713Sandreas.hansson@arm.com    void recvReqRetry() { reqQueue.retry(); }
11910713Sandreas.hansson@arm.com
12010713Sandreas.hansson@arm.com    void recvRetrySnoopResp() { snoopRespQueue.retry(); }
1218914Sandreas.hansson@arm.com
1228914Sandreas.hansson@arm.com  public:
1238914Sandreas.hansson@arm.com
1248914Sandreas.hansson@arm.com    /**
1258914Sandreas.hansson@arm.com     * Create a QueuedPort with a given name, owner, and a supplied
12610713Sandreas.hansson@arm.com     * implementation of two packet queues. The external definition of
12710713Sandreas.hansson@arm.com     * the queues enables e.g. the cache to implement a specific queue
1288914Sandreas.hansson@arm.com     * behaviuor in a subclass, and provide the latter to the
1298914Sandreas.hansson@arm.com     * QueuePort constructor.
1308914Sandreas.hansson@arm.com     */
1318922Swilliam.wang@arm.com    QueuedMasterPort(const std::string& name, MemObject* owner,
13210713Sandreas.hansson@arm.com                     ReqPacketQueue &req_queue,
13310713Sandreas.hansson@arm.com                     SnoopRespPacketQueue &snoop_resp_queue,
13410713Sandreas.hansson@arm.com                     PortID id = InvalidPortID) :
13510713Sandreas.hansson@arm.com        MasterPort(name, owner, id), reqQueue(req_queue),
13610713Sandreas.hansson@arm.com        snoopRespQueue(snoop_resp_queue)
1378914Sandreas.hansson@arm.com    { }
1388914Sandreas.hansson@arm.com
1398922Swilliam.wang@arm.com    virtual ~QueuedMasterPort() { }
1408914Sandreas.hansson@arm.com
1419163Sandreas.hansson@arm.com    /**
1429163Sandreas.hansson@arm.com     * Schedule the sending of a timing request.
1439163Sandreas.hansson@arm.com     *
1449163Sandreas.hansson@arm.com     * @param pkt Packet to send
1459163Sandreas.hansson@arm.com     * @param when Absolute time (in ticks) to send packet
1469163Sandreas.hansson@arm.com     */
1479163Sandreas.hansson@arm.com    void schedTimingReq(PacketPtr pkt, Tick when)
14810713Sandreas.hansson@arm.com    { reqQueue.schedSendTiming(pkt, when); }
1499163Sandreas.hansson@arm.com
1509163Sandreas.hansson@arm.com    /**
1519163Sandreas.hansson@arm.com     * Schedule the sending of a timing snoop response.
1529163Sandreas.hansson@arm.com     *
1539163Sandreas.hansson@arm.com     * @param pkt Packet to send
1549163Sandreas.hansson@arm.com     * @param when Absolute time (in ticks) to send packet
1559163Sandreas.hansson@arm.com     */
15613564Snikos.nikoleris@arm.com    void schedTimingSnoopResp(PacketPtr pkt, Tick when)
15713564Snikos.nikoleris@arm.com    { snoopRespQueue.schedSendTiming(pkt, when); }
1589163Sandreas.hansson@arm.com
1598914Sandreas.hansson@arm.com    /** Check the list of buffered packets against the supplied
1608914Sandreas.hansson@arm.com     * functional request. */
16112823Srmk35@cl.cam.ac.uk    bool trySatisfyFunctional(PacketPtr pkt)
16210713Sandreas.hansson@arm.com    {
16312823Srmk35@cl.cam.ac.uk        return reqQueue.trySatisfyFunctional(pkt) ||
16412823Srmk35@cl.cam.ac.uk            snoopRespQueue.trySatisfyFunctional(pkt);
16510713Sandreas.hansson@arm.com    }
1668914Sandreas.hansson@arm.com};
1678914Sandreas.hansson@arm.com
1688914Sandreas.hansson@arm.com#endif // __MEM_QPORT_HH__
169