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