Gabe Black has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/50763 )

Change subject: dev,gpu-compute: Use a TranslationGen in DmaVirtDevice.
......................................................................

dev,gpu-compute: Use a TranslationGen in DmaVirtDevice.

Use a TranslationGen to iterate over the translations for a region,
rather than using a ChunkGenerator with a fixed page size the device
needs to know.

Change-Id: I5da565232bd5282074ef279ca74e556daeffef70
---
M src/dev/dma_virt_device.cc
M src/dev/dma_virt_device.hh
M src/dev/hsa/hsa_packet_processor.cc
M src/dev/hsa/hsa_packet_processor.hh
M src/gpu-compute/gpu_command_processor.cc
M src/gpu-compute/gpu_command_processor.hh
6 files changed, 24 insertions(+), 36 deletions(-)



diff --git a/src/dev/dma_virt_device.cc b/src/dev/dma_virt_device.cc
index 2a392c24..e3e5050 100644
--- a/src/dev/dma_virt_device.cc
+++ b/src/dev/dma_virt_device.cc
@@ -36,11 +36,6 @@
 namespace gem5
 {

-DmaVirtDevice::DmaVirtDevice(const Params& p)
-    : DmaDevice(p), pageBytes(p.system->getPageBytes())
-{
-}
-
 void
 DmaVirtDevice::dmaReadVirt(Addr host_addr, unsigned size,
                                  DmaCallback *cb, void *data, Tick delay)
@@ -68,17 +63,12 @@
     // move the buffer data pointer with the chunks
     uint8_t *loc_data = (uint8_t*)data;

- for (ChunkGenerator gen(addr, size, pageBytes); !gen.done(); gen.next()) {
-        Addr phys;
-
-        // translate pages into their corresponding frames
-        translateOrDie(gen.addr(), phys);
+    for (const auto &range: *translate(addr, size)) {
+ fatal_if(range.fault, "Failed translation: vaddr 0x%x", range.vaddr);

         Event *event = cb ? cb->getChunkEvent() : nullptr;
-
-        (this->*dmaFn)(phys, gen.size(), event, loc_data, delay);
-
-        loc_data += gen.size();
+        (this->*dmaFn)(range.paddr, range.size, event, loc_data, delay);
+        loc_data += range.size;
     }
 }

diff --git a/src/dev/dma_virt_device.hh b/src/dev/dma_virt_device.hh
index 5c36d7b..0563525 100644
--- a/src/dev/dma_virt_device.hh
+++ b/src/dev/dma_virt_device.hh
@@ -35,6 +35,7 @@
 #define __DEV_DMA_VIRT_DEVICE_HH__

 #include "dev/dma_device.hh"
+#include "mem/translation_gen.hh"

 namespace gem5
 {
@@ -72,7 +73,7 @@
     };

   public:
-    DmaVirtDevice(const Params& p);
+    DmaVirtDevice(const Params& p) : DmaDevice(p) { }
     virtual ~DmaVirtDevice() { }

     /**
@@ -119,13 +120,15 @@
                  DmaCallback *cb, void *data, Tick delay = 0);

     /**
-     * Function used to translate from virtual to physical addresses. All
-     * classes inheriting from DmaVirtDevice must define this.
+     * Function used to translate a range of addresses from virtual to
+     * physical addresses. All classes inheriting from DmaVirtDevice must
+     * define this.
      *
-     * @param vaddr Input virtual address
-     * @param paddr Output physical address written by reference
+     * @param vaddr Virtual address of the start of the range
+     * @param size Size of the range in bytes
+     * @return A translation generator for this range
      */
-    virtual void translateOrDie(Addr vaddr, Addr &paddr) = 0;
+    virtual TranslationGenPtr translate(Addr vaddr, Addr size) = 0;
 };

 } // namespace gem5
diff --git a/src/dev/hsa/hsa_packet_processor.cc b/src/dev/hsa/hsa_packet_processor.cc
index 0427def..f15b691 100644
--- a/src/dev/hsa/hsa_packet_processor.cc
+++ b/src/dev/hsa/hsa_packet_processor.cc
@@ -159,16 +159,15 @@
     return pioDelay;
 }

-void
-HSAPacketProcessor::translateOrDie(Addr vaddr, Addr &paddr)
+TranslationGenPtr
+HSAPacketProcessor::translate(Addr vaddr, Addr size)
 {
// Grab the process and try to translate the virtual address with it; with // new extensions, it will likely be wrong to just arbitrarily grab context
     // zero.
     auto process = sys->threads[0]->getProcessPtr();

-    if (!process->pTable->translate(vaddr, paddr))
-        fatal("failed translation: vaddr 0x%x\n", vaddr);
+    return process->pTable->translateRange(vaddr, size);
 }

 /**
diff --git a/src/dev/hsa/hsa_packet_processor.hh b/src/dev/hsa/hsa_packet_processor.hh
index 9545006..8191e32 100644
--- a/src/dev/hsa/hsa_packet_processor.hh
+++ b/src/dev/hsa/hsa_packet_processor.hh
@@ -321,7 +321,7 @@
     typedef HSAPacketProcessorParams Params;
     HSAPacketProcessor(const Params &p);
     ~HSAPacketProcessor();
-    void translateOrDie(Addr vaddr, Addr &paddr) override;
+    TranslationGenPtr translate(Addr vaddr, Addr size) override;
     void setDeviceQueueDesc(uint64_t hostReadIndexPointer,
                             uint64_t basePointer,
                             uint64_t queue_id,
diff --git a/src/gpu-compute/gpu_command_processor.cc b/src/gpu-compute/gpu_command_processor.cc
index 88d7703..a444c9d 100644
--- a/src/gpu-compute/gpu_command_processor.cc
+++ b/src/gpu-compute/gpu_command_processor.cc
@@ -65,19 +65,15 @@
     return *hsaPP;
 }

-void
-GPUCommandProcessor::translateOrDie(Addr vaddr, Addr &paddr)
+TranslationGenPtr
+GPUCommandProcessor::translate(Addr vaddr, Addr size)
 {
-    /**
-     * Grab the process and try to translate the virtual address with it;
-     * with new extensions, it will likely be wrong to just arbitrarily
-     * grab context zero.
-     */
+ // Grab the process and try to translate the virtual address with it; with + // new extensions, it will likely be wrong to just arbitrarily grab context
+    // zero.
     auto process = sys->threads[0]->getProcessPtr();

-    if (!process->pTable->translate(vaddr, paddr)) {
-        fatal("failed translation: vaddr 0x%x\n", vaddr);
-    }
+    return process->pTable->translateRange(vaddr, size);
 }

 /**
diff --git a/src/gpu-compute/gpu_command_processor.hh b/src/gpu-compute/gpu_command_processor.hh
index 1c36c2b..c9084d1 100644
--- a/src/gpu-compute/gpu_command_processor.hh
+++ b/src/gpu-compute/gpu_command_processor.hh
@@ -135,7 +135,7 @@
     typedef void (DmaDevice::*DmaFnPtr)(Addr, int, Event*, uint8_t*, Tick);
     void initABI(HSAQueueEntry *task);
     HSAPacketProcessor *hsaPP;
-    void translateOrDie(Addr vaddr, Addr &paddr) override;
+    TranslationGenPtr translate(Addr vaddr, Addr size) override;

     /**
      * Perform a DMA read of the read_dispatch_id_field_base_byte_offset

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/50763
To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I5da565232bd5282074ef279ca74e556daeffef70
Gerrit-Change-Number: 50763
Gerrit-PatchSet: 1
Gerrit-Owner: Gabe Black <[email protected]>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- [email protected]
To unsubscribe send an email to [email protected]
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s

Reply via email to