port.cc revision 9178:6a0ff1770e6e
16019Shines@cs.fsu.edu/*
211496Sandreas.sandberg@arm.com * Copyright (c) 2012 ARM Limited
37093Sgblack@eecs.umich.edu * All rights reserved
47093Sgblack@eecs.umich.edu *
57093Sgblack@eecs.umich.edu * The license below extends only to copyright in the software and shall
67093Sgblack@eecs.umich.edu * not be construed as granting a license to any other intellectual
77093Sgblack@eecs.umich.edu * property including but not limited to intellectual property relating
87093Sgblack@eecs.umich.edu * to a hardware implementation of the functionality of the software
97093Sgblack@eecs.umich.edu * licensed hereunder.  You may use the software subject to the license
107093Sgblack@eecs.umich.edu * terms below provided that you ensure that this notice is replicated
117093Sgblack@eecs.umich.edu * unmodified and in its entirety in all distributions of the software,
127093Sgblack@eecs.umich.edu * modified or unmodified, in source code or in binary form.
137093Sgblack@eecs.umich.edu *
146019Shines@cs.fsu.edu * Copyright (c) 2002-2005 The Regents of The University of Michigan
156019Shines@cs.fsu.edu * All rights reserved.
166019Shines@cs.fsu.edu *
176019Shines@cs.fsu.edu * Redistribution and use in source and binary forms, with or without
186019Shines@cs.fsu.edu * modification, are permitted provided that the following conditions are
196019Shines@cs.fsu.edu * met: redistributions of source code must retain the above copyright
206019Shines@cs.fsu.edu * notice, this list of conditions and the following disclaimer;
216019Shines@cs.fsu.edu * redistributions in binary form must reproduce the above copyright
226019Shines@cs.fsu.edu * notice, this list of conditions and the following disclaimer in the
236019Shines@cs.fsu.edu * documentation and/or other materials provided with the distribution;
246019Shines@cs.fsu.edu * neither the name of the copyright holders nor the names of its
256019Shines@cs.fsu.edu * contributors may be used to endorse or promote products derived from
266019Shines@cs.fsu.edu * this software without specific prior written permission.
276019Shines@cs.fsu.edu *
286019Shines@cs.fsu.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
296019Shines@cs.fsu.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
306019Shines@cs.fsu.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
316019Shines@cs.fsu.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
326019Shines@cs.fsu.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
336019Shines@cs.fsu.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
346019Shines@cs.fsu.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
356019Shines@cs.fsu.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
366019Shines@cs.fsu.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
376019Shines@cs.fsu.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
386019Shines@cs.fsu.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
396019Shines@cs.fsu.edu *
406019Shines@cs.fsu.edu * Authors: Steve Reinhardt
416735Sgblack@eecs.umich.edu *          Andreas Hansson
426735Sgblack@eecs.umich.edu *          William Wang
4310037SARM gem5 Developers */
4410037SARM gem5 Developers
456019Shines@cs.fsu.edu/**
466019Shines@cs.fsu.edu * @file
476019Shines@cs.fsu.edu * Port object definitions.
4810037SARM gem5 Developers */
4910037SARM gem5 Developers#include "base/trace.hh"
5010037SARM gem5 Developers#include "mem/mem_object.hh"
5110037SARM gem5 Developers#include "mem/port.hh"
528229Snate@binkert.org
538229Snate@binkert.orgPort::Port(const std::string &_name, MemObject& _owner, PortID _id)
546019Shines@cs.fsu.edu    : portName(_name), id(_id), owner(_owner)
558232Snate@binkert.org{
568782Sgblack@eecs.umich.edu}
576019Shines@cs.fsu.edu
586019Shines@cs.fsu.eduPort::~Port()
596019Shines@cs.fsu.edu{
606019Shines@cs.fsu.edu}
6110037SARM gem5 Developers
6210037SARM gem5 Developers/**
6310037SARM gem5 Developers * Master port
6410037SARM gem5 Developers */
6510037SARM gem5 DevelopersMasterPort::MasterPort(const std::string& name, MemObject* owner, PortID _id)
6610037SARM gem5 Developers    : Port(name, *owner, _id), _slavePort(NULL)
6710037SARM gem5 Developers{
6810037SARM gem5 Developers}
6910037SARM gem5 Developers
7010037SARM gem5 DevelopersMasterPort::~MasterPort()
7110037SARM gem5 Developers{
7210037SARM gem5 Developers}
7310037SARM gem5 Developers
7410037SARM gem5 DevelopersSlavePort&
7510037SARM gem5 DevelopersMasterPort::getSlavePort() const
7610037SARM gem5 Developers{
7710037SARM gem5 Developers    if(_slavePort == NULL)
7810037SARM gem5 Developers        panic("Cannot getSlavePort on master port %s that is not connected\n",
7910037SARM gem5 Developers              name());
8010037SARM gem5 Developers
8110037SARM gem5 Developers    return *_slavePort;
8210037SARM gem5 Developers}
8310037SARM gem5 Developers
8410037SARM gem5 Developersvoid
8510037SARM gem5 DevelopersMasterPort::unbind()
8610037SARM gem5 Developers{
8710037SARM gem5 Developers    if (_slavePort == NULL)
8810037SARM gem5 Developers        panic("Attempting to unbind master port %s that is not connected\n",
8910037SARM gem5 Developers              name());
9010037SARM gem5 Developers    _slavePort->unbind();
9110037SARM gem5 Developers    _slavePort = NULL;
9210037SARM gem5 Developers}
9310037SARM gem5 Developers
9410037SARM gem5 Developersvoid
9510037SARM gem5 DevelopersMasterPort::bind(SlavePort& slave_port)
9610037SARM gem5 Developers{
9710037SARM gem5 Developers    if (_slavePort != NULL)
9810037SARM gem5 Developers        panic("Attempting to bind master port %s that is already connected\n",
9910037SARM gem5 Developers              name());
10010037SARM gem5 Developers
1016019Shines@cs.fsu.edu    // master port keeps track of the slave port
10210037SARM gem5 Developers    _slavePort = &slave_port;
10310037SARM gem5 Developers
10410037SARM gem5 Developers    // slave port also keeps track of master port
1056019Shines@cs.fsu.edu    _slavePort->bind(*this);
10610037SARM gem5 Developers}
10710037SARM gem5 Developers
10810037SARM gem5 Developersbool
10910037SARM gem5 DevelopersMasterPort::isConnected() const
11010037SARM gem5 Developers{
11110037SARM gem5 Developers    return _slavePort != NULL;
11210037SARM gem5 Developers}
11310037SARM gem5 Developers
11410037SARM gem5 Developersunsigned
11510037SARM gem5 DevelopersMasterPort::peerBlockSize() const
11610037SARM gem5 Developers{
11710037SARM gem5 Developers    return _slavePort->deviceBlockSize();
11810037SARM gem5 Developers}
11910037SARM gem5 Developers
12010037SARM gem5 DevelopersAddrRangeList
12110037SARM gem5 DevelopersMasterPort::getAddrRanges() const
12210037SARM gem5 Developers{
12310037SARM gem5 Developers    return _slavePort->getAddrRanges();
12410037SARM gem5 Developers}
12510037SARM gem5 Developers
12610037SARM gem5 DevelopersTick
12710037SARM gem5 DevelopersMasterPort::sendAtomic(PacketPtr pkt)
12810037SARM gem5 Developers{
12910037SARM gem5 Developers    assert(pkt->isRequest());
13010037SARM gem5 Developers    return _slavePort->recvAtomic(pkt);
13110037SARM gem5 Developers}
13210037SARM gem5 Developers
13310037SARM gem5 Developersvoid
13410037SARM gem5 DevelopersMasterPort::sendFunctional(PacketPtr pkt)
13510037SARM gem5 Developers{
13610037SARM gem5 Developers    assert(pkt->isRequest());
13710037SARM gem5 Developers    return _slavePort->recvFunctional(pkt);
13810037SARM gem5 Developers}
13910037SARM gem5 Developers
14010037SARM gem5 Developersbool
14110037SARM gem5 DevelopersMasterPort::sendTimingReq(PacketPtr pkt)
14210037SARM gem5 Developers{
14310037SARM gem5 Developers    assert(pkt->isRequest());
14410037SARM gem5 Developers    return _slavePort->recvTimingReq(pkt);
14510037SARM gem5 Developers}
1466019Shines@cs.fsu.edu
14710037SARM gem5 Developersbool
14810037SARM gem5 DevelopersMasterPort::sendTimingSnoopResp(PacketPtr pkt)
14910037SARM gem5 Developers{
1506019Shines@cs.fsu.edu    assert(pkt->isResponse());
15110037SARM gem5 Developers    return _slavePort->recvTimingSnoopResp(pkt);
15210037SARM gem5 Developers}
15310037SARM gem5 Developers
15410037SARM gem5 Developersvoid
15510037SARM gem5 DevelopersMasterPort::sendRetry()
15610037SARM gem5 Developers{
15710037SARM gem5 Developers    _slavePort->recvRetry();
15810037SARM gem5 Developers}
15910037SARM gem5 Developers
16010037SARM gem5 Developersvoid
16110037SARM gem5 DevelopersMasterPort::printAddr(Addr a)
16210037SARM gem5 Developers{
16310037SARM gem5 Developers    Request req(a, 1, 0, Request::funcMasterId);
16410037SARM gem5 Developers    Packet pkt(&req, MemCmd::PrintReq);
16510037SARM gem5 Developers    Packet::PrintReqState prs(std::cerr);
16610037SARM gem5 Developers    pkt.senderState = &prs;
16710037SARM gem5 Developers
16810037SARM gem5 Developers    sendFunctional(&pkt);
16910037SARM gem5 Developers}
17010037SARM gem5 Developers
17110037SARM gem5 Developers/**
17210037SARM gem5 Developers * Slave port
17310037SARM gem5 Developers */
17410037SARM gem5 DevelopersSlavePort::SlavePort(const std::string& name, MemObject* owner, PortID id)
17510037SARM gem5 Developers    : Port(name, *owner, id), _masterPort(NULL)
17610037SARM gem5 Developers{
17710037SARM gem5 Developers}
17810037SARM gem5 Developers
17910037SARM gem5 DevelopersSlavePort::~SlavePort()
18010037SARM gem5 Developers{
18110037SARM gem5 Developers}
18210037SARM gem5 Developers
18310037SARM gem5 Developersvoid
18410037SARM gem5 DevelopersSlavePort::unbind()
18510037SARM gem5 Developers{
18610037SARM gem5 Developers    _masterPort = NULL;
18710037SARM gem5 Developers}
18810037SARM gem5 Developers
18910037SARM gem5 Developersvoid
19010037SARM gem5 DevelopersSlavePort::bind(MasterPort& master_port)
19110037SARM gem5 Developers{
1926019Shines@cs.fsu.edu    _masterPort = &master_port;
19310037SARM gem5 Developers}
19410037SARM gem5 Developers
19510037SARM gem5 DevelopersMasterPort&
1966019Shines@cs.fsu.eduSlavePort::getMasterPort() const
19710037SARM gem5 Developers{
19810037SARM gem5 Developers    if (_masterPort == NULL)
19910037SARM gem5 Developers        panic("Cannot getMasterPort on slave port %s that is not connected\n",
20010037SARM gem5 Developers              name());
20110037SARM gem5 Developers
20210037SARM gem5 Developers    return *_masterPort;
20310037SARM gem5 Developers}
20410037SARM gem5 Developers
20510037SARM gem5 Developersunsigned
20610037SARM gem5 DevelopersSlavePort::peerBlockSize() const
20710037SARM gem5 Developers{
20810037SARM gem5 Developers    return _masterPort->deviceBlockSize();
20910037SARM gem5 Developers}
21010037SARM gem5 Developers
21110037SARM gem5 Developersbool
21210037SARM gem5 DevelopersSlavePort::isConnected() const
21310037SARM gem5 Developers{
21410037SARM gem5 Developers    return _masterPort != NULL;
21510037SARM gem5 Developers}
21610037SARM gem5 Developers
21710037SARM gem5 DevelopersTick
21810037SARM gem5 DevelopersSlavePort::sendAtomicSnoop(PacketPtr pkt)
21910037SARM gem5 Developers{
22010037SARM gem5 Developers    assert(pkt->isRequest());
22110037SARM gem5 Developers    return _masterPort->recvAtomicSnoop(pkt);
22210037SARM gem5 Developers}
22310037SARM gem5 Developers
22410037SARM gem5 Developersvoid
22510037SARM gem5 DevelopersSlavePort::sendFunctionalSnoop(PacketPtr pkt)
22610037SARM gem5 Developers{
22710037SARM gem5 Developers    assert(pkt->isRequest());
22810037SARM gem5 Developers    return _masterPort->recvFunctionalSnoop(pkt);
22910037SARM gem5 Developers}
23010037SARM gem5 Developers
23110037SARM gem5 Developersbool
23210037SARM gem5 DevelopersSlavePort::sendTimingResp(PacketPtr pkt)
23310037SARM gem5 Developers{
23410037SARM gem5 Developers    assert(pkt->isResponse());
23510037SARM gem5 Developers    return _masterPort->recvTimingResp(pkt);
23610037SARM gem5 Developers}
23710037SARM gem5 Developers
23810037SARM gem5 Developersvoid
23910037SARM gem5 DevelopersSlavePort::sendTimingSnoopReq(PacketPtr pkt)
24010037SARM gem5 Developers{
24110037SARM gem5 Developers    assert(pkt->isRequest());
24210037SARM gem5 Developers    _masterPort->recvTimingSnoopReq(pkt);
24310037SARM gem5 Developers}
24410037SARM gem5 Developers
24510037SARM gem5 Developersvoid
24610037SARM gem5 DevelopersSlavePort::sendRetry()
24710037SARM gem5 Developers{
24810037SARM gem5 Developers    _masterPort->recvRetry();
24910037SARM gem5 Developers}
25010037SARM gem5 Developers