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"
120 extraPacketToPayloadSteps.push_back(std::move(step));
138 unsigned int size = packet->
getSize();
139 unsigned char *
data = packet->
getPtr<
unsigned char>();
148 }
else if (packet->
isRead()) {
150 }
else if (packet->
isWrite()) {
162 std::shared_ptr<AtomicOpFunctor>(
163 packet->
req->getAtomicOpFunctor()->clone()),
164 packet->
req->isAtomicReturn());
169 for (
auto &step : extraPacketToPayloadSteps) {
170 step(packet, *trans);
176 template <
unsigned int BITWIDTH>
186 blockingRequest =
nullptr;
189 if (needToSendRequestRetry) {
190 needToSendRequestRetry =
false;
191 bridgeResponsePort.sendRetryReq();
196 auto packet = extension.getPacket();
200 bool need_retry =
false;
206 if (packet->needsResponse()) {
207 packet->makeResponse();
209 if (packet->isResponse()) {
210 need_retry = !bridgeResponsePort.sendTimingResp(packet);
214 blockingResponse = &trans;
220 socket->nb_transport_fw(trans, fw_phase, delay);
228 template <
unsigned int BITWIDTH>
237 auto it = backdoorMap.contains(
r);
238 if (it != backdoorMap.end())
243 if (!socket->get_direct_mem_ptr(trans, dmi_data))
254 backdoorMap.insert(dmi_r, backdoor);
260 template <
unsigned int BITWIDTH>
265 "Should not see packets where cache is responding");
274 socket->b_transport(*trans, delay);
282 return delay.
value();
285 template <
unsigned int BITWIDTH>
291 "Should not see packets where cache is responding");
300 socket->b_transport(*trans, delay);
302 if (trans->is_dmi_allowed())
303 backdoor = getBackdoor(*trans);
307 backdoor = getBackdoor(*trans);
315 return delay.
value();
318 template <
unsigned int BITWIDTH>
324 "unimplemented func.: recvFunctionalSnoop");
328 template <
unsigned int BITWIDTH>
333 "Should not see packets where cache is responding");
341 if (blockingRequest) {
342 needToSendRequestRetry =
true;
390 status = socket->nb_transport_fw(*trans, phase, delay);
395 blockingRequest = trans;
400 blockingRequest = trans;
401 auto cb = [
this, trans, phase]() { pec(*trans, phase); };
414 template <
unsigned int BITWIDTH>
420 "unimplemented func.: recvTimingSnoopResp");
424 template <
unsigned int BITWIDTH>
428 panic(
"tryTiming(PacketPtr) isn't implemented.");
431 template <
unsigned int BITWIDTH>
439 blockingResponse =
nullptr;
443 bool need_retry = !bridgeResponsePort.sendTimingResp(packet);
449 socket->nb_transport_fw(*trans, phase, delay);
455 template <
unsigned int BITWIDTH>
463 unsigned int bytes = socket->transport_dbg(*trans);
464 if (bytes != trans->get_data_length()) {
466 "debug transport was not completed");
472 template <
unsigned int BITWIDTH>
477 auto cb = [
this, &trans, phase]() { pec(trans, phase); };
484 template <
unsigned int BITWIDTH>
492 auto it = backdoorMap.intersects(
r);
493 if (it == backdoorMap.end())
496 it->second->invalidate();
498 backdoorMap.erase(it);
502 template <
unsigned int BITWIDTH>
506 bridgeResponsePort(
std::string(
name()) +
".gem5", *this),
507 socket(
"tlm_socket"),
510 needToSendRequestRetry(false), blockingResponse(nullptr),
511 addrRanges(params.addr_ranges.begin(), params.addr_ranges.end())
515 template <
unsigned int BITWIDTH>
519 if (if_name ==
"gem5")
520 return bridgeResponsePort;
521 else if (if_name ==
"tlm")
527 template <
unsigned int BITWIDTH>
531 bridgeResponsePort.sendRangeChange();
534 socket.register_invalidate_direct_mem_ptr(
542 gem5::Gem5ToTlmBridge32Params::create()
const
549 gem5::Gem5ToTlmBridge64Params::create()
const
556 gem5::Gem5ToTlmBridge128Params::create()
const
563 gem5::Gem5ToTlmBridge256Params::create()
const
570 gem5::Gem5ToTlmBridge512Params::create()
const