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