X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmem%2Fport.cc;h=3827994fb93bba839b5d4be7145204af2ed6e9d6;hb=7122b83d8f92d77bccae432b4e90ba12f1babad5;hp=ba4f2366816d1ea14adf358aa3309f022429c328;hpb=b4178269dfc87c49718c005cb7e345d004b453dd;p=gem5.git diff --git a/src/mem/port.cc b/src/mem/port.cc index ba4f23668..3827994fb 100644 --- a/src/mem/port.cc +++ b/src/mem/port.cc @@ -1,4 +1,16 @@ /* + * Copyright (c) 2012 ARM Limited + * All rights reserved + * + * The license below extends only to copyright in the software and shall + * not be construed as granting a license to any other intellectual + * property including but not limited to intellectual property relating + * to a hardware implementation of the functionality of the software + * licensed hereunder. You may use the software subject to the license + * terms below provided that you ensure that this notice is replicated + * unmodified and in its entirety in all distributions of the software, + * modified or unmodified, in source code or in binary form. + * * Copyright (c) 2002-2005 The Regents of The University of Michigan * All rights reserved. * @@ -26,69 +38,204 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Authors: Steve Reinhardt + * Andreas Hansson + * William Wang */ /** * @file * Port object definitions. */ -#include - -#include "base/chunk_generator.hh" #include "base/trace.hh" #include "mem/mem_object.hh" #include "mem/port.hh" +Port::Port(const std::string &_name, MemObject& _owner, PortID _id) + : portName(_name), id(_id), owner(_owner) +{ +} + +Port::~Port() +{ +} + +/** + * Master port + */ +MasterPort::MasterPort(const std::string& name, MemObject* owner, PortID _id) + : Port(name, *owner, _id), _slavePort(NULL) +{ +} + +MasterPort::~MasterPort() +{ +} + +SlavePort& +MasterPort::getSlavePort() const +{ + if(_slavePort == NULL) + panic("Cannot getSlavePort on master port %s that is not connected\n", + name()); + + return *_slavePort; +} + +void +MasterPort::unBind() +{ + _slavePort = NULL; +} + +void +MasterPort::bind(SlavePort& slave_port) +{ + // master port keeps track of the slave port + _slavePort = &slave_port; + + // slave port also keeps track of master port + _slavePort->bind(*this); +} + +bool +MasterPort::isConnected() const +{ + return _slavePort != NULL; +} + +unsigned +MasterPort::peerBlockSize() const +{ + return _slavePort->deviceBlockSize(); +} + +AddrRangeList +MasterPort::getAddrRanges() const +{ + return _slavePort->getAddrRanges(); +} + +Tick +MasterPort::sendAtomic(PacketPtr pkt) +{ + assert(pkt->isRequest()); + return _slavePort->recvAtomic(pkt); +} + void -Port::setPeer(Port *port) +MasterPort::sendFunctional(PacketPtr pkt) +{ + assert(pkt->isRequest()); + return _slavePort->recvFunctional(pkt); +} + +bool +MasterPort::sendTimingReq(PacketPtr pkt) { - DPRINTF(Config, "setting peer to %s\n", port->name()); - peer = port; + assert(pkt->isRequest()); + return _slavePort->recvTimingReq(pkt); +} + +bool +MasterPort::sendTimingSnoopResp(PacketPtr pkt) +{ + assert(pkt->isResponse()); + return _slavePort->recvTimingSnoopResp(pkt); } void -Port::removeConn() +MasterPort::sendRetry() { - if (peer->getOwner()) - peer->getOwner()->deletePortRefs(peer); - peer = NULL; + _slavePort->recvRetry(); } void -Port::blobHelper(Addr addr, uint8_t *p, int size, MemCmd cmd) +MasterPort::printAddr(Addr a) +{ + Request req(a, 1, 0, Request::funcMasterId); + Packet pkt(&req, MemCmd::PrintReq); + Packet::PrintReqState prs(std::cerr); + pkt.senderState = &prs; + + sendFunctional(&pkt); +} + +/** + * Slave port + */ +SlavePort::SlavePort(const std::string& name, MemObject* owner, PortID id) + : Port(name, *owner, id), _masterPort(NULL) { - Request req; +} - for (ChunkGenerator gen(addr, size, peerBlockSize()); - !gen.done(); gen.next()) { - req.setPhys(gen.addr(), gen.size(), 0); - Packet pkt(&req, cmd, Packet::Broadcast); - pkt.dataStatic(p); - sendFunctional(&pkt); - p += gen.size(); - } +SlavePort::~SlavePort() +{ } void -Port::writeBlob(Addr addr, uint8_t *p, int size) +SlavePort::unBind() { - blobHelper(addr, p, size, MemCmd::WriteReq); + _masterPort = NULL; } void -Port::readBlob(Addr addr, uint8_t *p, int size) +SlavePort::bind(MasterPort& master_port) { - blobHelper(addr, p, size, MemCmd::ReadReq); + _masterPort = &master_port; +} + +MasterPort& +SlavePort::getMasterPort() const +{ + if (_masterPort == NULL) + panic("Cannot getMasterPort on slave port %s that is not connected\n", + name()); + + return *_masterPort; +} + +unsigned +SlavePort::peerBlockSize() const +{ + return _masterPort->deviceBlockSize(); +} + +bool +SlavePort::isConnected() const +{ + return _masterPort != NULL; +} + +Tick +SlavePort::sendAtomicSnoop(PacketPtr pkt) +{ + assert(pkt->isRequest()); + return _masterPort->recvAtomicSnoop(pkt); } void -Port::memsetBlob(Addr addr, uint8_t val, int size) +SlavePort::sendFunctionalSnoop(PacketPtr pkt) { - // quick and dirty... - uint8_t *buf = new uint8_t[size]; + assert(pkt->isRequest()); + return _masterPort->recvFunctionalSnoop(pkt); +} - std::memset(buf, val, size); - blobHelper(addr, buf, size, MemCmd::WriteReq); +bool +SlavePort::sendTimingResp(PacketPtr pkt) +{ + assert(pkt->isResponse()); + return _masterPort->recvTimingResp(pkt); +} - delete [] buf; +void +SlavePort::sendTimingSnoopReq(PacketPtr pkt) +{ + assert(pkt->isRequest()); + _masterPort->recvTimingSnoopReq(pkt); +} + +void +SlavePort::sendRetry() +{ + _masterPort->recvRetry(); }