83c83
< * information to a previously allocated tlm payload
---
> * information to new tlm payload.
85,86c85,86
< void
< packet2payload(PacketPtr packet, tlm::tlm_generic_payload &trans)
---
> tlm::tlm_generic_payload *
> packet2payload(PacketPtr packet)
88c88,89
< trans.set_address(packet->getAddr());
---
> tlm::tlm_generic_payload *trans = mm.allocate();
> trans->acquire();
89a91,92
> trans->set_address(packet->getAddr());
>
91c94
< sc_assert(trans.has_mm());
---
> sc_assert(trans->has_mm());
96,98c99,101
< trans.set_data_length(size);
< trans.set_streaming_width(size);
< trans.set_data_ptr(data);
---
> trans->set_data_length(size);
> trans->set_streaming_width(size);
> trans->set_data_ptr(data);
100,101c103,107
< if (packet->isRead()) {
< trans.set_command(tlm::TLM_READ_COMMAND);
---
> if ((packet->req->getFlags() & Request::NO_ACCESS) != 0) {
> /* Do nothing */
> trans->set_command(tlm::TLM_IGNORE_COMMAND);
> } else if (packet->isRead()) {
> trans->set_command(tlm::TLM_READ_COMMAND);
103a110
> trans->set_command(tlm::TLM_IGNORE_COMMAND);
105c112
< trans.set_command(tlm::TLM_WRITE_COMMAND);
---
> trans->set_command(tlm::TLM_WRITE_COMMAND);
108a116,121
>
> // Attach the packet pointer to the TLM transaction to keep track.
> auto *extension = new Gem5SystemC::Gem5Extension(packet);
> trans->set_auto_extension(extension);
>
> return trans;
168a182,212
> template <unsigned int BITWIDTH>
> MemBackdoorPtr
> Gem5ToTlmBridge<BITWIDTH>::getBackdoor(tlm::tlm_generic_payload &trans)
> {
> sc_dt::uint64 start = trans.get_address();
> sc_dt::uint64 end = start + trans.get_data_length();
>
> // Check for a back door we already know about.
> AddrRange r(start, end);
> auto it = backdoorMap.contains(r);
> if (it != backdoorMap.end())
> return it->second;
>
> // If not, ask the target for one.
> tlm::tlm_dmi dmi_data;
> if (!socket->get_direct_mem_ptr(trans, dmi_data))
> return nullptr;
>
> // If the target gave us one, translate it to a gem5 MemBackdoor and
> // store it in our cache.
> AddrRange dmi_r(dmi_data.get_start_address(), dmi_data.get_end_address());
> auto backdoor = new MemBackdoor(
> dmi_r, dmi_data.get_dmi_ptr(), MemBackdoor::NoAccess);
> backdoor->readable(dmi_data.is_read_allowed());
> backdoor->writeable(dmi_data.is_write_allowed());
>
> backdoorMap.insert(dmi_r, backdoor);
>
> return backdoor;
> }
>
177,178c221,222
< panic_if(!(packet->isRead() || packet->isWrite()),
< "Should only see read and writes at TLM memory\n");
---
> // Prepare the transaction.
> auto *trans = packet2payload(packet);
182,185c226,229
< // Prepare the transaction.
< tlm::tlm_generic_payload *trans = mm.allocate();
< trans->acquire();
< packet2payload(packet, *trans);
---
> if (trans->get_command() != tlm::TLM_IGNORE_COMMAND) {
> // Execute b_transport:
> socket->b_transport(*trans, delay);
> }
187,189c231,232
< // Attach the packet pointer to the TLM transaction to keep track.
< auto *extension = new Gem5SystemC::Gem5Extension(packet);
< trans->set_auto_extension(extension);
---
> if (packet->needsResponse())
> packet->makeResponse();
191,194c234,253
< // Execute b_transport:
< if (packet->cmd == MemCmd::SwapReq) {
< SC_REPORT_FATAL("Gem5ToTlmBridge", "SwapReq not supported");
< } else if (packet->isRead()) {
---
> trans->release();
>
> return delay.value();
> }
>
> template <unsigned int BITWIDTH>
> Tick
> Gem5ToTlmBridge<BITWIDTH>::recvAtomicBackdoor(
> PacketPtr packet, MemBackdoorPtr &backdoor)
> {
> panic_if(packet->cacheResponding(),
> "Should not see packets where cache is responding");
>
> sc_core::sc_time delay = sc_core::SC_ZERO_TIME;
>
> // Prepare the transaction.
> auto *trans = packet2payload(packet);
>
> if (trans->get_command() != tlm::TLM_IGNORE_COMMAND) {
> // Execute b_transport:
196,199c255,257
< } else if (packet->isInvalidate()) {
< // do nothing
< } else if (packet->isWrite()) {
< socket->b_transport(*trans, delay);
---
> // If the hint said we could use DMI, set that up.
> if (trans->is_dmi_allowed())
> backdoor = getBackdoor(*trans);
201c259,261
< SC_REPORT_FATAL("Gem5ToTlmBridge", "Typo of request not supported");
---
> // There's no transaction to piggy back on, so just request the
> // backdoor normally.
> backdoor = getBackdoor(*trans);
204c264
< if (packet->needsResponse()) {
---
> if (packet->needsResponse())
206d265
< }
257,259c316
< tlm::tlm_generic_payload *trans = mm.allocate();
< trans->acquire();
< packet2payload(packet, *trans);
---
> auto *trans = packet2payload(packet);
261,264d317
< // Attach the packet pointer to the TLM transaction to keep track.
< auto *extension = new Gem5SystemC::Gem5Extension(packet);
< trans->set_auto_extension(extension);
<
365,367c418
< tlm::tlm_generic_payload *trans = mm.allocate();
< trans->acquire();
< packet2payload(packet, *trans);
---
> auto *trans = packet2payload(packet);
369,372d419
< // Attach the packet pointer to the TLM transaction to keep track.
< auto *extension = new Gem5SystemC::Gem5Extension(packet);
< trans->set_auto_extension(extension);
<
396a444,461
> void
> Gem5ToTlmBridge<BITWIDTH>::invalidate_direct_mem_ptr(
> sc_dt::uint64 start_range, sc_dt::uint64 end_range)
> {
> AddrRange r(start_range, end_range);
>
> for (;;) {
> auto it = backdoorMap.intersects(r);
> if (it == backdoorMap.end())
> break;
>
> it->second->invalidate();
> delete it->second;
> backdoorMap.erase(it);
> };
> }
>
> template <unsigned int BITWIDTH>
426a492,493
> socket.register_invalidate_direct_mem_ptr(
> this, &Gem5ToTlmBridge::invalidate_direct_mem_ptr);