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"
5013892Sgabeblack@google.com#include "sim/sim_object.hh"
518914Sandreas.hansson@arm.com
528914Sandreas.hansson@arm.com/**
538914Sandreas.hansson@arm.com * A queued port is a port that has an infinite queue for outgoing
548914Sandreas.hansson@arm.com * packets and thus decouples the module that wants to send
558914Sandreas.hansson@arm.com * request/responses from the flow control (retry mechanism) of the
568914Sandreas.hansson@arm.com * port. A queued port can be used by both a master and a slave. The
578914Sandreas.hansson@arm.com * queue is a parameter to allow tailoring of the queue implementation
588914Sandreas.hansson@arm.com * (used in the cache).
598914Sandreas.hansson@arm.com */
608922Swilliam.wang@arm.comclass QueuedSlavePort : public SlavePort
618914Sandreas.hansson@arm.com{
628914Sandreas.hansson@arm.com
638914Sandreas.hansson@arm.com  protected:
648914Sandreas.hansson@arm.com
6510713Sandreas.hansson@arm.com    /** Packet queue used to store outgoing responses. */
6610713Sandreas.hansson@arm.com    RespPacketQueue &respQueue;
678914Sandreas.hansson@arm.com
6810713Sandreas.hansson@arm.com    void recvRespRetry() { respQueue.retry(); }
698914Sandreas.hansson@arm.com
708922Swilliam.wang@arm.com  public:
718922Swilliam.wang@arm.com
728922Swilliam.wang@arm.com    /**
738922Swilliam.wang@arm.com     * Create a QueuedPort with a given name, owner, and a supplied
748922Swilliam.wang@arm.com     * implementation of a packet queue. The external definition of
758922Swilliam.wang@arm.com     * the queue enables e.g. the cache to implement a specific queue
768922Swilliam.wang@arm.com     * behaviuor in a subclass, and provide the latter to the
778922Swilliam.wang@arm.com     * QueuePort constructor.
788922Swilliam.wang@arm.com     */
7913892Sgabeblack@google.com    QueuedSlavePort(const std::string& name, SimObject* owner,
8010713Sandreas.hansson@arm.com                    RespPacketQueue &resp_queue, PortID id = InvalidPortID) :
8110713Sandreas.hansson@arm.com        SlavePort(name, owner, id), respQueue(resp_queue)
828922Swilliam.wang@arm.com    { }
838922Swilliam.wang@arm.com
848922Swilliam.wang@arm.com    virtual ~QueuedSlavePort() { }
858922Swilliam.wang@arm.com
869163Sandreas.hansson@arm.com    /**
879163Sandreas.hansson@arm.com     * Schedule the sending of a timing response.
889163Sandreas.hansson@arm.com     *
899163Sandreas.hansson@arm.com     * @param pkt Packet to send
909163Sandreas.hansson@arm.com     * @param when Absolute time (in ticks) to send packet
919163Sandreas.hansson@arm.com     */
9213564Snikos.nikoleris@arm.com    void schedTimingResp(PacketPtr pkt, Tick when)
9313564Snikos.nikoleris@arm.com    { respQueue.schedSendTiming(pkt, when); }
949163Sandreas.hansson@arm.com
958922Swilliam.wang@arm.com    /** Check the list of buffered packets against the supplied
968922Swilliam.wang@arm.com     * functional request. */
9712823Srmk35@cl.cam.ac.uk    bool trySatisfyFunctional(PacketPtr pkt)
9812823Srmk35@cl.cam.ac.uk    { return respQueue.trySatisfyFunctional(pkt); }
998922Swilliam.wang@arm.com};
1008922Swilliam.wang@arm.com
10110713Sandreas.hansson@arm.com/**
10210713Sandreas.hansson@arm.com * The QueuedMasterPort combines two queues, a request queue and a
10310713Sandreas.hansson@arm.com * snoop response queue, that both share the same port. The flow
10410713Sandreas.hansson@arm.com * control for requests and snoop responses are completely
10510713Sandreas.hansson@arm.com * independent, and so each queue manages its own flow control
10610713Sandreas.hansson@arm.com * (retries).
10710713Sandreas.hansson@arm.com */
1088922Swilliam.wang@arm.comclass QueuedMasterPort : public MasterPort
1098922Swilliam.wang@arm.com{
1108922Swilliam.wang@arm.com
1118922Swilliam.wang@arm.com  protected:
1128922Swilliam.wang@arm.com
11310713Sandreas.hansson@arm.com    /** Packet queue used to store outgoing requests. */
11410713Sandreas.hansson@arm.com    ReqPacketQueue &reqQueue;
1158922Swilliam.wang@arm.com
11610713Sandreas.hansson@arm.com    /** Packet queue used to store outgoing snoop responses. */
11710713Sandreas.hansson@arm.com    SnoopRespPacketQueue &snoopRespQueue;
11810713Sandreas.hansson@arm.com
11910713Sandreas.hansson@arm.com    void recvReqRetry() { reqQueue.retry(); }
12010713Sandreas.hansson@arm.com
12110713Sandreas.hansson@arm.com    void recvRetrySnoopResp() { snoopRespQueue.retry(); }
1228914Sandreas.hansson@arm.com
1238914Sandreas.hansson@arm.com  public:
1248914Sandreas.hansson@arm.com
1258914Sandreas.hansson@arm.com    /**
1268914Sandreas.hansson@arm.com     * Create a QueuedPort with a given name, owner, and a supplied
12710713Sandreas.hansson@arm.com     * implementation of two packet queues. The external definition of
12810713Sandreas.hansson@arm.com     * the queues enables e.g. the cache to implement a specific queue
1298914Sandreas.hansson@arm.com     * behaviuor in a subclass, and provide the latter to the
1308914Sandreas.hansson@arm.com     * QueuePort constructor.
1318914Sandreas.hansson@arm.com     */
13213892Sgabeblack@google.com    QueuedMasterPort(const std::string& name, SimObject* owner,
13310713Sandreas.hansson@arm.com                     ReqPacketQueue &req_queue,
13410713Sandreas.hansson@arm.com                     SnoopRespPacketQueue &snoop_resp_queue,
13510713Sandreas.hansson@arm.com                     PortID id = InvalidPortID) :
13610713Sandreas.hansson@arm.com        MasterPort(name, owner, id), reqQueue(req_queue),
13710713Sandreas.hansson@arm.com        snoopRespQueue(snoop_resp_queue)
1388914Sandreas.hansson@arm.com    { }
1398914Sandreas.hansson@arm.com
1408922Swilliam.wang@arm.com    virtual ~QueuedMasterPort() { }
1418914Sandreas.hansson@arm.com
1429163Sandreas.hansson@arm.com    /**
1439163Sandreas.hansson@arm.com     * Schedule the sending of a timing request.
1449163Sandreas.hansson@arm.com     *
1459163Sandreas.hansson@arm.com     * @param pkt Packet to send
1469163Sandreas.hansson@arm.com     * @param when Absolute time (in ticks) to send packet
1479163Sandreas.hansson@arm.com     */
1489163Sandreas.hansson@arm.com    void schedTimingReq(PacketPtr pkt, Tick when)
14910713Sandreas.hansson@arm.com    { reqQueue.schedSendTiming(pkt, when); }
1509163Sandreas.hansson@arm.com
1519163Sandreas.hansson@arm.com    /**
1529163Sandreas.hansson@arm.com     * Schedule the sending of a timing snoop response.
1539163Sandreas.hansson@arm.com     *
1549163Sandreas.hansson@arm.com     * @param pkt Packet to send
1559163Sandreas.hansson@arm.com     * @param when Absolute time (in ticks) to send packet
1569163Sandreas.hansson@arm.com     */
15713564Snikos.nikoleris@arm.com    void schedTimingSnoopResp(PacketPtr pkt, Tick when)
15813564Snikos.nikoleris@arm.com    { snoopRespQueue.schedSendTiming(pkt, when); }
1599163Sandreas.hansson@arm.com
1608914Sandreas.hansson@arm.com    /** Check the list of buffered packets against the supplied
1618914Sandreas.hansson@arm.com     * functional request. */
16212823Srmk35@cl.cam.ac.uk    bool trySatisfyFunctional(PacketPtr pkt)
16310713Sandreas.hansson@arm.com    {
16412823Srmk35@cl.cam.ac.uk        return reqQueue.trySatisfyFunctional(pkt) ||
16512823Srmk35@cl.cam.ac.uk            snoopRespQueue.trySatisfyFunctional(pkt);
16610713Sandreas.hansson@arm.com    }
1678914Sandreas.hansson@arm.com};
1688914Sandreas.hansson@arm.com
1698914Sandreas.hansson@arm.com#endif // __MEM_QPORT_HH__
170