port.cc revision 9031:32ecc0217c5e
17191Sgblack@eecs.umich.edu/*
27191Sgblack@eecs.umich.edu * Copyright (c) 2012 ARM Limited
37191Sgblack@eecs.umich.edu * All rights reserved
47191Sgblack@eecs.umich.edu *
57191Sgblack@eecs.umich.edu * The license below extends only to copyright in the software and shall
67191Sgblack@eecs.umich.edu * not be construed as granting a license to any other intellectual
77191Sgblack@eecs.umich.edu * property including but not limited to intellectual property relating
87191Sgblack@eecs.umich.edu * to a hardware implementation of the functionality of the software
97191Sgblack@eecs.umich.edu * licensed hereunder.  You may use the software subject to the license
107191Sgblack@eecs.umich.edu * terms below provided that you ensure that this notice is replicated
117191Sgblack@eecs.umich.edu * unmodified and in its entirety in all distributions of the software,
127191Sgblack@eecs.umich.edu * modified or unmodified, in source code or in binary form.
137191Sgblack@eecs.umich.edu *
147191Sgblack@eecs.umich.edu * Copyright (c) 2002-2005 The Regents of The University of Michigan
157191Sgblack@eecs.umich.edu * All rights reserved.
167191Sgblack@eecs.umich.edu *
177191Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
187191Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
197191Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
207191Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
217191Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
227191Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
237191Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
247191Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
257191Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
267191Sgblack@eecs.umich.edu * this software without specific prior written permission.
277191Sgblack@eecs.umich.edu *
287191Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
297191Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
307191Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
317191Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
327191Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
337191Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
347191Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
357191Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
367191Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
377191Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
387191Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
397191Sgblack@eecs.umich.edu *
407191Sgblack@eecs.umich.edu * Authors: Steve Reinhardt
417191Sgblack@eecs.umich.edu *          Andreas Hansson
427191Sgblack@eecs.umich.edu *          William Wang
437191Sgblack@eecs.umich.edu */
447191Sgblack@eecs.umich.edu
457191Sgblack@eecs.umich.edu/**
467191Sgblack@eecs.umich.edu * @file
477308Sgblack@eecs.umich.edu * Port object definitions.
487191Sgblack@eecs.umich.edu */
497316Sgblack@eecs.umich.edu#include "base/trace.hh"
507316Sgblack@eecs.umich.edu#include "mem/mem_object.hh"
517316Sgblack@eecs.umich.edu#include "mem/port.hh"
527316Sgblack@eecs.umich.edu
537316Sgblack@eecs.umich.eduPort::Port(const std::string &_name, MemObject& _owner, PortID _id)
547316Sgblack@eecs.umich.edu    : portName(_name), id(_id), peer(NULL), owner(_owner)
557191Sgblack@eecs.umich.edu{
567191Sgblack@eecs.umich.edu}
577435Sgblack@eecs.umich.edu
587191Sgblack@eecs.umich.eduPort::~Port()
597191Sgblack@eecs.umich.edu{
607435Sgblack@eecs.umich.edu}
617191Sgblack@eecs.umich.edu
627191Sgblack@eecs.umich.edu/**
637248Sgblack@eecs.umich.edu * Master port
647191Sgblack@eecs.umich.edu */
657192Sgblack@eecs.umich.eduMasterPort::MasterPort(const std::string& name, MemObject* owner, PortID _id)
667192Sgblack@eecs.umich.edu    : Port(name, *owner, _id), _slavePort(NULL)
677192Sgblack@eecs.umich.edu{
687192Sgblack@eecs.umich.edu}
697192Sgblack@eecs.umich.edu
707192Sgblack@eecs.umich.eduMasterPort::~MasterPort()
717192Sgblack@eecs.umich.edu{
727192Sgblack@eecs.umich.edu}
737192Sgblack@eecs.umich.edu
747191Sgblack@eecs.umich.eduSlavePort&
757191Sgblack@eecs.umich.eduMasterPort::getSlavePort() const
767191Sgblack@eecs.umich.edu{
777192Sgblack@eecs.umich.edu    if(_slavePort == NULL)
787192Sgblack@eecs.umich.edu        panic("Cannot getSlavePort on master port %s that is not connected\n",
797192Sgblack@eecs.umich.edu              name());
807192Sgblack@eecs.umich.edu
817192Sgblack@eecs.umich.edu    return *_slavePort;
827192Sgblack@eecs.umich.edu}
837192Sgblack@eecs.umich.edu
847192Sgblack@eecs.umich.eduvoid
857192Sgblack@eecs.umich.eduMasterPort::bind(SlavePort& slave_port)
867192Sgblack@eecs.umich.edu{
877192Sgblack@eecs.umich.edu    // master port keeps track of the slave port
887192Sgblack@eecs.umich.edu    _slavePort = &slave_port;
897192Sgblack@eecs.umich.edu    peer = &slave_port;
907192Sgblack@eecs.umich.edu
917192Sgblack@eecs.umich.edu    // slave port also keeps track of master port
927192Sgblack@eecs.umich.edu    _slavePort->bind(*this);
937192Sgblack@eecs.umich.edu}
947192Sgblack@eecs.umich.edu
957192Sgblack@eecs.umich.edubool
967192Sgblack@eecs.umich.eduMasterPort::isConnected() const
977191Sgblack@eecs.umich.edu{
987191Sgblack@eecs.umich.edu    return _slavePort != NULL;
997191Sgblack@eecs.umich.edu}
1007191Sgblack@eecs.umich.edu
1017191Sgblack@eecs.umich.eduunsigned
1027191Sgblack@eecs.umich.eduMasterPort::peerBlockSize() const
1037191Sgblack@eecs.umich.edu{
1047191Sgblack@eecs.umich.edu    return _slavePort->deviceBlockSize();
1057191Sgblack@eecs.umich.edu}
1067191Sgblack@eecs.umich.edu
1077191Sgblack@eecs.umich.eduTick
1087191Sgblack@eecs.umich.eduMasterPort::sendAtomic(PacketPtr pkt)
1097191Sgblack@eecs.umich.edu{
1107191Sgblack@eecs.umich.edu    assert(pkt->isRequest());
1117191Sgblack@eecs.umich.edu    return _slavePort->recvAtomic(pkt);
1127191Sgblack@eecs.umich.edu}
1137248Sgblack@eecs.umich.edu
1147191Sgblack@eecs.umich.eduvoid
1157192Sgblack@eecs.umich.eduMasterPort::sendFunctional(PacketPtr pkt)
1167192Sgblack@eecs.umich.edu{
1177192Sgblack@eecs.umich.edu    assert(pkt->isRequest());
1187192Sgblack@eecs.umich.edu    return _slavePort->recvFunctional(pkt);
1197192Sgblack@eecs.umich.edu}
1207192Sgblack@eecs.umich.edu
1217192Sgblack@eecs.umich.edubool
1227192Sgblack@eecs.umich.eduMasterPort::sendTimingReq(PacketPtr pkt)
1237192Sgblack@eecs.umich.edu{
1247192Sgblack@eecs.umich.edu    assert(pkt->isRequest());
1257192Sgblack@eecs.umich.edu    return _slavePort->recvTimingReq(pkt);
1267192Sgblack@eecs.umich.edu}
1277192Sgblack@eecs.umich.edu
1287192Sgblack@eecs.umich.edubool
1297191Sgblack@eecs.umich.eduMasterPort::sendTimingSnoopResp(PacketPtr pkt)
1307192Sgblack@eecs.umich.edu{
1317192Sgblack@eecs.umich.edu    assert(pkt->isResponse());
1327192Sgblack@eecs.umich.edu    return _slavePort->recvTimingSnoopResp(pkt);
1337192Sgblack@eecs.umich.edu}
1347192Sgblack@eecs.umich.edu
1357192Sgblack@eecs.umich.eduvoid
1367192Sgblack@eecs.umich.eduMasterPort::printAddr(Addr a)
1377192Sgblack@eecs.umich.edu{
1387192Sgblack@eecs.umich.edu    Request req(a, 1, 0, Request::funcMasterId);
1397192Sgblack@eecs.umich.edu    Packet pkt(&req, MemCmd::PrintReq);
1407192Sgblack@eecs.umich.edu    Packet::PrintReqState prs(std::cerr);
1417192Sgblack@eecs.umich.edu    pkt.senderState = &prs;
1427192Sgblack@eecs.umich.edu
1437192Sgblack@eecs.umich.edu    sendFunctional(&pkt);
1447192Sgblack@eecs.umich.edu}
1457192Sgblack@eecs.umich.edu
1467192Sgblack@eecs.umich.edu/**
1477192Sgblack@eecs.umich.edu * Slave port
1487192Sgblack@eecs.umich.edu */
1497192Sgblack@eecs.umich.eduSlavePort::SlavePort(const std::string& name, MemObject* owner, PortID id)
1507192Sgblack@eecs.umich.edu    : Port(name, *owner, id), _masterPort(NULL)
1517192Sgblack@eecs.umich.edu{
1527192Sgblack@eecs.umich.edu}
1537192Sgblack@eecs.umich.edu
1547192Sgblack@eecs.umich.eduSlavePort::~SlavePort()
1557192Sgblack@eecs.umich.edu{
1567192Sgblack@eecs.umich.edu}
1577192Sgblack@eecs.umich.edu
1587192Sgblack@eecs.umich.eduvoid
1597192Sgblack@eecs.umich.eduSlavePort::bind(MasterPort& master_port)
1607191Sgblack@eecs.umich.edu{
1617191Sgblack@eecs.umich.edu    _masterPort = &master_port;
1627191Sgblack@eecs.umich.edu    peer = &master_port;
1637191Sgblack@eecs.umich.edu}
1647191Sgblack@eecs.umich.edu
1657191Sgblack@eecs.umich.eduMasterPort&
1667191Sgblack@eecs.umich.eduSlavePort::getMasterPort() const
1677191Sgblack@eecs.umich.edu{
1687314Sgblack@eecs.umich.edu    if (_masterPort == NULL)
1697314Sgblack@eecs.umich.edu        panic("Cannot getMasterPort on slave port %s that is not connected\n",
1707314Sgblack@eecs.umich.edu              name());
1717314Sgblack@eecs.umich.edu
1727314Sgblack@eecs.umich.edu    return *_masterPort;
1737314Sgblack@eecs.umich.edu}
1747314Sgblack@eecs.umich.edu
1757314Sgblack@eecs.umich.eduunsigned
1767314Sgblack@eecs.umich.eduSlavePort::peerBlockSize() const
1777314Sgblack@eecs.umich.edu{
1787314Sgblack@eecs.umich.edu    return _masterPort->deviceBlockSize();
1797314Sgblack@eecs.umich.edu}
1807314Sgblack@eecs.umich.edu
1817314Sgblack@eecs.umich.edubool
1827314Sgblack@eecs.umich.eduSlavePort::isConnected() const
1837314Sgblack@eecs.umich.edu{
1847314Sgblack@eecs.umich.edu    return _masterPort != NULL;
1857314Sgblack@eecs.umich.edu}
1867314Sgblack@eecs.umich.edu
1877314Sgblack@eecs.umich.eduTick
1887314Sgblack@eecs.umich.eduSlavePort::sendAtomicSnoop(PacketPtr pkt)
1897314Sgblack@eecs.umich.edu{
1907314Sgblack@eecs.umich.edu    assert(pkt->isRequest());
1917314Sgblack@eecs.umich.edu    return _masterPort->recvAtomicSnoop(pkt);
1927314Sgblack@eecs.umich.edu}
1937314Sgblack@eecs.umich.edu
1947314Sgblack@eecs.umich.eduvoid
1957314Sgblack@eecs.umich.eduSlavePort::sendFunctionalSnoop(PacketPtr pkt)
1967191Sgblack@eecs.umich.edu{
1977293Sgblack@eecs.umich.edu    assert(pkt->isRequest());
1987293Sgblack@eecs.umich.edu    return _masterPort->recvFunctionalSnoop(pkt);
1997293Sgblack@eecs.umich.edu}
2007293Sgblack@eecs.umich.edu
2017293Sgblack@eecs.umich.edubool
2027293Sgblack@eecs.umich.eduSlavePort::sendTimingResp(PacketPtr pkt)
2037293Sgblack@eecs.umich.edu{
2047293Sgblack@eecs.umich.edu    assert(pkt->isResponse());
2057293Sgblack@eecs.umich.edu    return _masterPort->recvTimingResp(pkt);
2067293Sgblack@eecs.umich.edu}
2077293Sgblack@eecs.umich.edu
2087293Sgblack@eecs.umich.eduvoid
2097293Sgblack@eecs.umich.eduSlavePort::sendTimingSnoopReq(PacketPtr pkt)
2107293Sgblack@eecs.umich.edu{
2117293Sgblack@eecs.umich.edu    assert(pkt->isRequest());
2127293Sgblack@eecs.umich.edu    _masterPort->recvTimingSnoopReq(pkt);
2137293Sgblack@eecs.umich.edu}
2147293Sgblack@eecs.umich.edu