38#include "debug/AMDGPUDevice.hh"
101 uint32_t value = pkt->
getLE<uint32_t>();
107 pkt->
setLE<uint32_t>(1);
113 pkt->
setLE<uint32_t>(1);
127 pkt->
setLE<uint32_t>(1);
161 uint32_t
val = pkt->
getLE<uint32_t>();
165 uint32_t
val = pkt->
getLE<uint32_t>();
169 uint32_t
val = pkt->
getLE<uint32_t>();
173 uint32_t
val = pkt->
getLE<uint32_t>();
177 uint32_t
val = pkt->
getLE<uint32_t>();
181 uint32_t
val = pkt->
getLE<uint32_t>();
185 uint32_t
val = pkt->
getLE<uint32_t>();
189 uint32_t
val = pkt->
getLE<uint32_t>();
223 uint32_t
val = pkt->
getLE<uint32_t>();
227 uint32_t
val = pkt->
getLE<uint32_t>();
231 uint32_t
val = pkt->
getLE<uint32_t>();
235 uint32_t
val = pkt->
getLE<uint32_t>();
239 uint32_t
val = pkt->
getLE<uint32_t>();
243 uint32_t
val = pkt->
getLE<uint32_t>();
247 uint32_t
val = pkt->
getLE<uint32_t>();
251 uint32_t
val = pkt->
getLE<uint32_t>();
265 if (
gpuDevice->getGfxVersion() == GfxVersion::gfx942) {
284 tlb->invalidateAll();
295 uint64_t gartTableSize;
325 uint64_t* gartTableKey =
new uint64_t[gartTableSize];
326 uint64_t* gartTableValue =
new uint64_t[gartTableSize];
330 gartTableKey[
i] = it->first;
331 gartTableValue[
i] = it->second;
336 delete[] gartTableKey;
337 delete[] gartTableValue;
347 uint64_t gartTableSize, *gartTableKey, *gartTableValue;
379 gartTableKey =
new uint64_t[gartTableSize];
380 gartTableValue =
new uint64_t[gartTableSize];
383 for (uint64_t
i = 0;
i < gartTableSize;
i++) {
386 delete[] gartTableKey;
387 delete[] gartTableValue;
393 assert(
vm->inAGP(range.
vaddr));
396 if (next == range.
vaddr)
410 if (next == range.
vaddr)
419 gart_addr += lsb * 7;
423 auto result =
vm->gartTable.find(gart_addr);
424 if (result ==
vm->gartTable.end()) {
427 warn(
"GART translation for %p not found", range.
vaddr);
433 Addr pte = result->second;
435 range.
paddr = (
bits(pte, 47, 12) << 12) | lower_bits;
445 assert(
vm->inMMHUB(range.
vaddr));
448 if (next == range.
vaddr)
473 fatal(
"User translation fault");
477 const Addr page_size = 1 << logBytes;
479 if (next == range.
vaddr) {
487 paddr +=
vm->getMMHUBBase();
488 assert(
vm->inMMHUB(paddr));
#define mmVM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32
#define mmMMHUB_VM_FB_LOCATION_BASE
#define MI300X_VM_SYSTEM_APERTURE_LOW_ADDR
#define mmMMHUB_VM_FB_LOCATION_TOP
#define mmVM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32
#define MI300X_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32
#define MI300X_VM_FB_LOCATION_TOP
#define MI300X_VM_FB_OFFSET
#define mmMC_VM_SYSTEM_APERTURE_LOW_ADDR
#define mmMC_VM_FB_LOCATION_BASE
#define MI300X_VM_SYSTEM_APERTURE_HIGH_ADDR
#define MI300X_VM_INVALIDATE_ENG17_ACK
#define MI300X_VM_AGP_TOP
#define MI300X_CONTEXT0_PAGE_TABLE_START_ADDR_LO32
#define MI300X_CONTEXT0_PAGE_TABLE_END_ADDR_LO32
static constexpr int AMDGPU_MMHUB_PAGE_SIZE
#define MI300X_VM_FB_LOCATION_BASE
#define mmMMHUB_VM_INVALIDATE_ENG17_SEM
#define MI300X_CONTEXT0_PAGE_TABLE_END_ADDR_HI32
#define MI300X_CONTEXT0_PAGE_TABLE_START_ADDR_HI32
#define mmMC_VM_SYSTEM_APERTURE_HIGH_ADDR
#define mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32
#define mmVM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32
#define mmMC_VM_FB_OFFSET
#define mmMC_VM_FB_LOCATION_TOP
#define MI300X_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32
static constexpr int AMDGPU_GART_PAGE_SIZE
static constexpr int AMDGPU_USER_PAGE_SIZE
#define mmVM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32
#define mmVM_INVALIDATE_ENG17_ACK
MMIO offsets for graphics register bus manager (GRBM).
#define MI300X_VM_AGP_BOT
#define MI300X_VM_AGP_BASE
#define mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32
static constexpr int AMDGPU_AGP_PAGE_SIZE
#define mmMMHUB_VM_INVALIDATE_ENG17_ACK
Device model for an AMD GPU.
void translate(Range &range) const override
Subclasses implement this function to complete TranslationGen.
void translate(Range &range) const override
Subclasses implement this function to complete TranslationGen.
void translate(Range &range) const override
Subclasses implement this function to complete TranslationGen.
void translate(Range &range) const override
Subclasses implement this function to complete TranslationGen.
void writeMMIOGfx900(PacketPtr pkt, Addr offset)
Different MMIO implements for different GFX versions with overlapping MMIO addresses.
void setMMIOAperture(mmio_range_t mmio_aperture, AddrRange range)
std::vector< AMDGPUVMContext > vmContexts
std::array< AddrRange, NUM_MMIO_RANGES > mmioRanges
AddrRange getMMIORange(mmio_range_t mmio_aperture)
struct gem5::AMDGPUVM::GEM5_PACKED AMDGPUVMContext
std::unordered_map< uint64_t, uint64_t > gartTable
Copy of GART table.
std::vector< VegaISA::GpuTLB * > gpu_tlbs
List of TLBs associated with the GPU device.
void readMMIO(PacketPtr pkt, Addr offset)
const AddrRange & getMMIOAperture(Addr addr)
void writeMMIO(PacketPtr pkt, Addr offset)
AMDGPUSysVMContext vmContext0
Addr gartBase()
Return base address of GART table in framebuffer.
void writeMMIOGfx940(PacketPtr pkt, Addr offset)
void unserialize(CheckpointIn &cp) override
Unserialize an object.
Addr gartSize()
Return size of GART in number of PTEs.
void serialize(CheckpointOut &cp) const override
Serialize an object.
void registerTLB(VegaISA::GpuTLB *tlb)
Control methods for TLBs associated with the GPU device.
The AddrRange class encapsulates an address range, and supports a number of tests to check if two ran...
void setLE(T v)
Set the value in the data pointer to v as little endian.
T getLE() const
Get the data in the packet byte swapped from little endian to host endian.
static constexpr T roundUp(const T &val, const U &align)
This function is used to align addresses in memory.
constexpr T bits(T val, unsigned first, unsigned last)
Extract the bitfield from position 'first' to 'last' (inclusive) from 'val' and right justify it.
constexpr T insertBits(T val, unsigned first, unsigned last, B bit_val)
Returns val with bits first to last set to the LSBs of bit_val.
#define fatal(...)
This implements a cprintf based fatal() function.
#define UNSERIALIZE_ARRAY(member, size)
#define SERIALIZE_ARRAY(member, size)
Copyright (c) 2024 Arm Limited All rights reserved.
std::shared_ptr< FaultBase > Fault
std::ostream CheckpointOut
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
static constexpr int AMDGPU_VM_COUNT
constexpr decltype(nullptr) NoFault
#define UNSERIALIZE_SCALAR(scalar)
#define SERIALIZE_SCALAR(scalar)
This structure represents a single, contiguous translation, or carries information about whatever fau...