48#include "debug/RubyCHIGeneric.hh"
50#include "mem/ruby/protocol/MemoryMsg.hh"
75 p.ruby_system->registerAbstractController(
76 this, std::make_unique<CHIProtocolInfo>());
112 rspIn->setConsumer(
this);
113 datIn->setConsumer(
this);
114 snpIn->setConsumer(
this);
115 reqIn->setConsumer(
this);
123 assert(seq !=
nullptr);
130 out <<
"[CHIGenericController " <<
m_version <<
"]";
197 bool pending =
false;
199 DPRINTF(RubyCHIGeneric,
"wakeup: checking incoming rsp messages\n");
203 DPRINTF(RubyCHIGeneric,
"wakeup: checking incoming dat messages\n");
207 DPRINTF(RubyCHIGeneric,
"wakeup: checking incoming snp messages\n");
211 DPRINTF(RubyCHIGeneric,
"wakeup: checking incoming req messages\n");
216 DPRINTF(RubyCHIGeneric,
"wakeup: messages pending\n");
224 panic(
"CHIGenericController doesn't implement recordCacheTrace");
230 return AccessPermission_NotPresent;
237 panic(
"CHIGenericController doesn't expect functionalRead");
244 panic(
"CHIGenericController doesn't expect functionalRead");
251 int num_functional_writes = 0;
252 num_functional_writes +=
reqOut->functionalWrite(pkt);
253 num_functional_writes +=
snpOut->functionalWrite(pkt);
254 num_functional_writes +=
rspOut->functionalWrite(pkt);
255 num_functional_writes +=
datOut->functionalWrite(pkt);
256 num_functional_writes +=
reqIn->functionalWrite(pkt);
257 num_functional_writes +=
snpIn->functionalWrite(pkt);
258 num_functional_writes +=
rspIn->functionalWrite(pkt);
259 num_functional_writes +=
datIn->functionalWrite(pkt);
260 return num_functional_writes;
266 if (
reqOut->functionalRead(pkt))
return true;
267 if (
snpOut->functionalRead(pkt))
return true;
268 if (
rspOut->functionalRead(pkt))
return true;
269 if (
datOut->functionalRead(pkt))
return true;
270 if (
reqIn->functionalRead(pkt))
return true;
271 if (
snpIn->functionalRead(pkt))
return true;
272 if (
rspIn->functionalRead(pkt))
return true;
273 if (
datIn->functionalRead(pkt))
return true;
281 if (
reqOut->functionalRead(pkt,
mask)) read =
true;
282 if (
snpOut->functionalRead(pkt,
mask)) read =
true;
283 if (
rspOut->functionalRead(pkt,
mask)) read =
true;
284 if (
datOut->functionalRead(pkt,
mask)) read =
true;
285 if (
reqIn->functionalRead(pkt,
mask)) read =
true;
286 if (
snpIn->functionalRead(pkt,
mask)) read =
true;
287 if (
rspIn->functionalRead(pkt,
mask)) read =
true;
288 if (
datIn->functionalRead(pkt,
mask)) read =
true;
ClockedObjectParams Params
Parameters of ClockedObject.
Cycles is a wrapper class for representing cycle counts, i.e.
A Packet is used to encapsulate a transfer between two objects in the memory system (e....
RubySystem * m_ruby_system
virtual void regStats()
Callback to set stat parameters.
AbstractController(const Params &p)
void init()
init() is called after all C++ SimObjects have been created and all ports are connected.
virtual void resetStats()=0
Callback to reset stats.
bool functionalReadBuffers(PacketPtr &) override
These functions are used by ruby system to read/write the data blocks that exist with in the controll...
void initNetQueues() override
Initialize the message buffers.
void init() override
init() is called after all C++ SimObjects have been created and all ports are connected.
virtual bool recvResponseMsg(const CHIResponseMsg *msg)=0
GPUCoalescer * getGPUCoalescer() const override
const int dataMsgsPerLine
std::vector< RubyPort * > sequencers
virtual bool recvSnoopMsg(const CHIRequestMsg *msg)=0
MessageBuffer *const datOut
DMASequencer * getDMASequencer() const override
virtual bool recvRequestMsg(const CHIRequestMsg *msg)=0
MessageBuffer *const rspOut
int functionalWrite(const Addr ¶m_addr, Packet *param_pkt) override
void resetStats() override
Callback to reset stats.
Sequencer * getCPUSequencer() const override
MessageBuffer *const rspIn
void collateStats() override
Function for collating statistics from all the controllers of this particular type.
MessageBuffer *const snpOut
const int dataChannelSize
CHI::CHIRequestMsg CHIRequestMsg
int functionalWriteBuffers(PacketPtr &) override
The return value indicates the number of messages written with the data from the packet.
MessageBuffer *const reqOut
MessageBuffer * getMemReqQueue() const override
bool receiveAllRdyMessages(MessageBuffer *buffer, const std::function< bool(const MsgType *)> &callback)
MessageBuffer * getMandatoryQueue() const override
CHI::CHIDataMsg CHIDataMsg
CHIGenericController(const Params &p)
void regStats() override
Callback to set stat parameters.
void print(std::ostream &out) const override
CHI::CHIResponseMsg CHIResponseMsg
MessageBuffer *const snpIn
MessageBuffer *const datIn
void addSequencer(RubyPort *seq)
MessageBuffer *const reqIn
virtual bool recvDataMsg(const CHIDataMsg *msg)=0
void recordCacheTrace(int cntrl, CacheRecorder *tr) override
void functionalRead(const Addr ¶m_addr, Packet *param_pkt, WriteMask ¶m_mask) override
AccessPermission getAccessPermission(const Addr ¶m_addr) override
MessageBuffer * getMemRespQueue() const override
void scheduleEvent(Cycles timeDelta)
static constexpr std::enable_if_t< std::is_integral_v< T >, int > floorLog2(T x)
#define panic(...)
This implements a cprintf based panic() function.
Copyright (c) 2024 Arm Limited All rights reserved.
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.