63 #include "params/Gem5ToTlmBridge32.hh"
64 #include "params/Gem5ToTlmBridge64.hh"
65 #include "params/Gem5ToTlmBridge128.hh"
66 #include "params/Gem5ToTlmBridge256.hh"
67 #include "params/Gem5ToTlmBridge512.hh"
121 extraPacketToPayloadSteps.push_back(std::move(step));
134 auto *tlmSenderState =
139 if (tlmSenderState !=
nullptr) {
141 trans = &tlmSenderState->trans;
145 for (
auto &step : extraPacketToPayloadSteps) {
146 step(packet, *trans);
159 unsigned int size = packet->
getSize();
160 unsigned char *
data = packet->
getPtr<
unsigned char>();
169 }
else if (packet->
isRead()) {
171 }
else if (packet->
isWrite()) {
183 std::shared_ptr<AtomicOpFunctor>(
184 packet->
req->getAtomicOpFunctor()->clone()),
185 packet->
req->isAtomicReturn());
190 for (
auto &step : extraPacketToPayloadSteps) {
191 step(packet, *trans);
215 template <
unsigned int BITWIDTH>
225 blockingRequest =
nullptr;
228 if (needToSendRequestRetry) {
229 needToSendRequestRetry =
false;
230 bridgeResponsePort.sendRetryReq();
239 bool need_retry =
false;
249 need_retry = !bridgeResponsePort.sendTimingResp(packet);
253 blockingResponse = &trans;
259 socket->nb_transport_fw(trans, fw_phase, delay);
261 packetMap.erase(&trans);
268 template <
unsigned int BITWIDTH>
277 auto it = backdoorMap.contains(
r);
278 if (it != backdoorMap.end())
283 if (!socket->get_direct_mem_ptr(trans, dmi_data))
294 backdoorMap.insert(dmi_r, backdoor);
300 template <
unsigned int BITWIDTH>
305 "Should not see packets where cache is responding");
314 socket->b_transport(*trans, delay);
322 return delay.
value();
325 template <
unsigned int BITWIDTH>
331 "Should not see packets where cache is responding");
340 socket->b_transport(*trans, delay);
342 if (trans->is_dmi_allowed())
343 backdoor = getBackdoor(*trans);
347 backdoor = getBackdoor(*trans);
356 return delay.
value();
359 template <
unsigned int BITWIDTH>
365 "unimplemented func.: recvFunctionalSnoop");
369 template <
unsigned int BITWIDTH>
374 "Should not see packets where cache is responding");
382 if (blockingRequest) {
383 needToSendRequestRetry =
true;
431 status = socket->nb_transport_fw(*trans, phase, delay);
436 blockingRequest = trans;
437 packetMap.emplace(trans, packet);
442 blockingRequest = trans;
443 packetMap.emplace(trans, packet);
444 auto cb = [
this, trans, phase]() { pec(*trans, phase); };
457 template <
unsigned int BITWIDTH>
463 "unimplemented func.: recvTimingSnoopResp");
467 template <
unsigned int BITWIDTH>
471 panic(
"tryTiming(PacketPtr) isn't implemented.");
474 template <
unsigned int BITWIDTH>
482 blockingResponse =
nullptr;
483 PacketPtr packet = packetMap[blockingResponse];
486 bool need_retry = !bridgeResponsePort.sendTimingResp(packet);
492 socket->nb_transport_fw(*trans, phase, delay);
494 packetMap.erase(trans);
499 template <
unsigned int BITWIDTH>
507 unsigned int bytes = socket->transport_dbg(*trans);
508 if (bytes != trans->get_data_length()) {
510 "debug transport was not completed");
516 template <
unsigned int BITWIDTH>
536 backdoor = getBackdoor(*trans);
541 template <
unsigned int BITWIDTH>
546 auto cb = [
this, &trans, phase]() { pec(trans, phase); };
553 template <
unsigned int BITWIDTH>
561 auto it = backdoorMap.intersects(
r);
562 if (it == backdoorMap.end())
565 it->second->invalidate();
567 backdoorMap.erase(it);
571 template <
unsigned int BITWIDTH>
575 bridgeResponsePort(
std::string(
name()) +
".gem5", *this),
576 socket(
"tlm_socket"),
579 needToSendRequestRetry(false), blockingResponse(nullptr),
580 addrRanges(params.addr_ranges.begin(), params.addr_ranges.end())
584 template <
unsigned int BITWIDTH>
588 if (if_name ==
"gem5")
589 return bridgeResponsePort;
590 else if (if_name ==
"tlm")
596 template <
unsigned int BITWIDTH>
600 bridgeResponsePort.sendRangeChange();
603 socket.register_invalidate_direct_mem_ptr(
611 gem5::Gem5ToTlmBridge32Params::create()
const
618 gem5::Gem5ToTlmBridge64Params::create()
const
625 gem5::Gem5ToTlmBridge128Params::create()
const
632 gem5::Gem5ToTlmBridge256Params::create()
const
639 gem5::Gem5ToTlmBridge512Params::create()
const