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