/*
- * Copyright (c) 2012 ARM Limited
+ * Copyright (c) 2012,2015,2017 ARM Limited
* All rights reserved
*
* The license below extends only to copyright in the software and shall
* @file
* Port object definitions.
*/
-#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()
-{
-}
+#include "base/trace.hh"
+#include "sim/sim_object.hh"
/**
* Master port
*/
-MasterPort::MasterPort(const std::string& name, MemObject* owner, PortID _id)
- : Port(name, *owner, _id), _slavePort(NULL)
+MasterPort::MasterPort(const std::string& name, SimObject* _owner, PortID _id)
+ : Port(name, _id), _slavePort(NULL), owner(*_owner)
{
}
{
}
-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)
+MasterPort::bind(Port &peer)
{
+ auto *slave_port = dynamic_cast<SlavePort *>(&peer);
+ if (!slave_port) {
+ fatal("Attempt to bind port %s to non-slave port %s.",
+ name(), peer.name());
+ }
// master port keeps track of the slave port
- _slavePort = &slave_port;
-
+ _slavePort = slave_port;
+ Port::bind(peer);
// slave port also keeps track of master port
- _slavePort->bind(*this);
+ _slavePort->slaveBind(*this);
}
-bool
-MasterPort::isConnected() const
-{
- return _slavePort != NULL;
-}
-
-unsigned
-MasterPort::peerBlockSize() const
+void
+MasterPort::unbind()
{
- return _slavePort->deviceBlockSize();
+ if (_slavePort == NULL)
+ panic("Attempting to unbind master port %s that is not connected\n",
+ name());
+ _slavePort->slaveUnbind();
+ _slavePort = nullptr;
+ Port::unbind();
}
AddrRangeList
return _slavePort->getAddrRanges();
}
-Tick
-MasterPort::sendAtomic(PacketPtr pkt)
-{
- assert(pkt->isRequest());
- return _slavePort->recvAtomic(pkt);
-}
-
-void
-MasterPort::sendFunctional(PacketPtr pkt)
-{
- assert(pkt->isRequest());
- return _slavePort->recvFunctional(pkt);
-}
-
-bool
-MasterPort::sendTimingReq(PacketPtr pkt)
-{
- assert(pkt->isRequest());
- return _slavePort->recvTimingReq(pkt);
-}
-
-bool
-MasterPort::sendTimingSnoopResp(PacketPtr pkt)
-{
- assert(pkt->isResponse());
- return _slavePort->recvTimingSnoopResp(pkt);
-}
-
-void
-MasterPort::sendRetry()
-{
- _slavePort->recvRetry();
-}
-
void
MasterPort::printAddr(Addr a)
{
- Request req(a, 1, 0, Request::funcMasterId);
- Packet pkt(&req, MemCmd::PrintReq);
+ auto req = std::make_shared<Request>(
+ a, 1, 0, Request::funcMasterId);
+
+ Packet pkt(req, MemCmd::PrintReq);
Packet::PrintReqState prs(std::cerr);
pkt.senderState = &prs;
/**
* Slave port
*/
-SlavePort::SlavePort(const std::string& name, MemObject* owner, PortID id)
- : Port(name, *owner, id), _masterPort(NULL)
+SlavePort::SlavePort(const std::string& name, SimObject* _owner, PortID id)
+ : Port(name, id), _masterPort(NULL), defaultBackdoorWarned(false),
+ owner(*_owner)
{
}
}
void
-SlavePort::unBind()
+SlavePort::slaveUnbind()
{
_masterPort = NULL;
+ Port::unbind();
}
void
-SlavePort::bind(MasterPort& master_port)
+SlavePort::slaveBind(MasterPort& master_port)
{
_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;
+ Port::bind(master_port);
}
Tick
-SlavePort::sendAtomicSnoop(PacketPtr pkt)
-{
- assert(pkt->isRequest());
- return _masterPort->recvAtomicSnoop(pkt);
-}
-
-void
-SlavePort::sendFunctionalSnoop(PacketPtr pkt)
-{
- assert(pkt->isRequest());
- return _masterPort->recvFunctionalSnoop(pkt);
-}
-
-bool
-SlavePort::sendTimingResp(PacketPtr pkt)
-{
- assert(pkt->isResponse());
- return _masterPort->recvTimingResp(pkt);
-}
-
-void
-SlavePort::sendTimingSnoopReq(PacketPtr pkt)
-{
- assert(pkt->isRequest());
- _masterPort->recvTimingSnoopReq(pkt);
-}
-
-void
-SlavePort::sendRetry()
+SlavePort::recvAtomicBackdoor(PacketPtr pkt, MemBackdoorPtr &backdoor)
{
- _masterPort->recvRetry();
+ if (!defaultBackdoorWarned) {
+ warn("Port %s doesn't support requesting a back door.", name());
+ defaultBackdoorWarned = true;
+ }
+ return recvAtomic(pkt);
}