gem5 [DEVELOP-FOR-25.0]
Loading...
Searching...
No Matches
amdgpu_vm.hh
Go to the documentation of this file.
1/*
2 * Copyright (c) 2021 Advanced Micro Devices, Inc.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 *
11 * 2. Redistributions in binary form must reproduce the above copyright notice,
12 * this list of conditions and the following disclaimer in the documentation
13 * and/or other materials provided with the distribution.
14 *
15 * 3. Neither the name of the copyright holder nor the names of its
16 * contributors may be used to endorse or promote products derived from this
17 * software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
23 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31
32#ifndef __DEV_AMDGPU_AMDGPU_VM_HH__
33#define __DEV_AMDGPU_AMDGPU_VM_HH__
34
35#include <vector>
36
38#include "base/intmath.hh"
40#include "mem/packet.hh"
42#include "sim/serialize.hh"
43
53
54#define mmVM_INVALIDATE_ENG17_ACK 0x08c6
55#define mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32 0x08eb
56#define mmVM_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32 0x08ec
57#define mmVM_CONTEXT0_PAGE_TABLE_START_ADDR_LO32 0x090b
58#define mmVM_CONTEXT0_PAGE_TABLE_START_ADDR_HI32 0x090c
59#define mmVM_CONTEXT0_PAGE_TABLE_END_ADDR_LO32 0x092b
60#define mmVM_CONTEXT0_PAGE_TABLE_END_ADDR_HI32 0x092c
61
62#define MI300X_CONTEXT0_PAGE_TABLE_BASE_ADDR_LO32 0x08cb
63#define MI300X_CONTEXT0_PAGE_TABLE_BASE_ADDR_HI32 0x08cc
64#define MI300X_CONTEXT0_PAGE_TABLE_START_ADDR_LO32 0x08eb
65#define MI300X_CONTEXT0_PAGE_TABLE_START_ADDR_HI32 0x08ec
66#define MI300X_CONTEXT0_PAGE_TABLE_END_ADDR_LO32 0x090b
67#define MI300X_CONTEXT0_PAGE_TABLE_END_ADDR_HI32 0x090c
68
69#define mmMC_VM_FB_OFFSET 0x096b
70#define mmMC_VM_FB_LOCATION_BASE 0x0980
71#define mmMC_VM_FB_LOCATION_TOP 0x0981
72#define mmMC_VM_AGP_TOP 0x0982
73#define mmMC_VM_AGP_BOT 0x0983
74#define mmMC_VM_AGP_BASE 0x0984
75#define mmMC_VM_SYSTEM_APERTURE_LOW_ADDR 0x0985
76#define mmMC_VM_SYSTEM_APERTURE_HIGH_ADDR 0x0986
77
78#define MI300X_VM_FB_OFFSET 0x0947
79#define MI300X_VM_FB_LOCATION_BASE 0x095c
80#define MI300X_VM_FB_LOCATION_TOP 0x095d
81#define MI300X_VM_AGP_TOP 0x095e
82#define MI300X_VM_AGP_BOT 0x095f
83#define MI300X_VM_AGP_BASE 0x0960
84#define MI300X_VM_SYSTEM_APERTURE_LOW_ADDR 0x0961
85#define MI300X_VM_SYSTEM_APERTURE_HIGH_ADDR 0x0962
86
87#define mmMMHUB_VM_INVALIDATE_ENG17_SEM 0x06e2
88#define mmMMHUB_VM_INVALIDATE_ENG17_REQ 0x06f4
89#define mmMMHUB_VM_INVALIDATE_ENG17_ACK 0x0706
90#define mmMMHUB_VM_FB_LOCATION_BASE 0x082c
91#define mmMMHUB_VM_FB_LOCATION_TOP 0x082d
92
93#define VEGA10_FB_LOCATION_BASE 0x6a0b0
94#define VEGA10_FB_LOCATION_TOP 0x6a0b4
95
96#define MI100_MEM_SIZE_REG 0x0378c
97#define MI100_FB_LOCATION_BASE 0x6ac00
98#define MI100_FB_LOCATION_TOP 0x6ac04
99
100#define MI200_MEM_SIZE_REG 0x0378c
101#define MI200_FB_LOCATION_BASE 0x6b300
102#define MI200_FB_LOCATION_TOP 0x6b304
103
104#define MI300X_MEM_SIZE_REG 0x0378c
105#define MI300X_FB_LOCATION_BASE 0x63270
106#define MI300X_FB_LOCATION_TOP 0x63274
107#define MI300X_VM_INVALIDATE_ENG17_ACK 0x08a6
108
109// AMD GPUs support 16 different virtual address spaces
110static constexpr int AMDGPU_VM_COUNT = 16;
111
112// These apertures have a fixed page size
113static constexpr int AMDGPU_AGP_PAGE_SIZE = 4096;
114static constexpr int AMDGPU_GART_PAGE_SIZE = 4096;
115static constexpr int AMDGPU_MMHUB_PAGE_SIZE = 4096;
116
117// Vega page size can be any power of 2 between 4kB and 1GB.
118static constexpr int AMDGPU_USER_PAGE_SIZE = 4096;
119
120namespace gem5
121{
122
132
133class AMDGPUDevice;
134
135class AMDGPUVM : public Serializable
136{
137 private:
139
140 typedef struct GEM5_PACKED
141 {
142 // Page table addresses: from (Base + Start) to (End)
143 union
144 {
145 struct
146 {
147 uint32_t ptBaseL;
148 uint32_t ptBaseH;
149 };
151 };
152 union
153 {
154 struct
155 {
156 uint32_t ptStartL;
157 uint32_t ptStartH;
158 };
160 };
161 union
162 {
163 struct
164 {
165 uint32_t ptEndL;
166 uint32_t ptEndH;
167 };
169 };
171
183
186
187 // MMHUB aperture. These addresses mirror the framebuffer, so addresses
188 // can be calculated by subtracting the base address.
189 uint64_t mmhubBase = 0x0;
190 uint64_t mmhubTop = 0x0;
191
197
204
205 std::array<AddrRange, NUM_MMIO_RANGES> mmioRanges;
206
207 public:
208 AMDGPUVM();
209
210 void setGPUDevice(AMDGPUDevice *gpu_device) { gpuDevice = gpu_device; }
211
215 Addr gartBase();
219 Addr gartSize();
220
221 bool
223 {
224 return ((paddr >= gartBase()) && (paddr <= (gartBase() + gartSize())));
225 }
226
231 std::unordered_map<uint64_t, uint64_t> gartTable;
232
233 void readMMIO(PacketPtr pkt, Addr offset);
234 void writeMMIO(PacketPtr pkt, Addr offset);
235
239 bool
241 {
242 return ((vaddr >= vmContext0.agpBot) && (vaddr <= vmContext0.agpTop));
243 }
244
245 Addr getAGPBot() { return vmContext0.agpBot; }
246 Addr getAGPTop() { return vmContext0.agpTop; }
247 Addr getAGPBase() { return vmContext0.agpBase; }
248
249 bool
251 {
252 return ((vaddr >= getMMHUBBase()) && (vaddr <= getMMHUBTop()));
253 }
254
257
260
261 bool
263 {
264 return ((vaddr >= vmContext0.fbBase) && (vaddr <= vmContext0.fbTop));
265 }
266
267 Addr getFBBase() { return vmContext0.fbBase; }
268 Addr getFBTop() { return vmContext0.fbTop; }
269 Addr getFBOffset() { return vmContext0.fbOffset; }
270
271 bool
273 {
274 return ((vaddr >= vmContext0.sysAddrL) &&
275 (vaddr <= vmContext0.sysAddrH));
276 }
277
278 Addr getSysAddrRangeLow () { return vmContext0.sysAddrL; }
279 Addr getSysAddrRangeHigh () { return vmContext0.sysAddrH; }
280
281 void setMMIOAperture(mmio_range_t mmio_aperture, AddrRange range);
283 AddrRange getMMIORange(mmio_range_t mmio_aperture);
284
285 // Getting mapped aperture base addresses
286 Addr
288 {
289 if (addr < gartBase()) {
290 warn_once("Accessing unsupported frame apperture!\n");
291 return ~0;
292 } else if (gartBase() <= addr && addr < (gartBase() + gartSize())) {
293 return gartBase();
294 } else {
295 warn_once("Accessing unsupported frame apperture!\n");
296 return ~0;
297 }
298
299 }
300
304 void
305 setPageTableBase(uint16_t vmid, Addr ptBase)
306 {
307 vmContexts[vmid].ptBase = ptBase;
308 }
309
310 Addr
311 getPageTableBase(uint16_t vmid)
312 {
313 assert(vmid > 0 && vmid < vmContexts.size());
314 return vmContexts[vmid].ptBase;
315 }
316
317 Addr
318 getPageTableStart(uint16_t vmid)
319 {
320 assert(vmid > 0 && vmid < vmContexts.size());
321 return vmContexts[vmid].ptStart;
322 }
323
328 void invalidateTLBs();
329
330
331 void serialize(CheckpointOut &cp) const override;
332 void unserialize(CheckpointIn &cp) override;
333
342 {
343 private:
345
346 void translate(Range &range) const override;
347
348 public:
352 };
353
355 {
356 private:
358
359 void translate(Range &range) const override;
360
361 public:
365 };
366
368 {
369 private:
371
372 void translate(Range &range) const override;
373
374 public:
378 };
379
381 {
382 private:
385 int vmid;
386
387 void translate(Range &range) const override;
388
389 public:
390 UserTranslationGen(AMDGPUVM *_vm, VegaISA::Walker *_walker, int _vmid,
392 : TranslationGen(vaddr, size), vm(_vm), walker(_walker),
393 vmid(_vmid)
394 {}
395 };
396};
397
398} // namespace gem5
399
400#endif // __DEV_AMDGPU_AMDGPU_VM_HH__
static constexpr int AMDGPU_VM_COUNT
Definition amdgpu_vm.hh:110
static constexpr int AMDGPU_MMHUB_PAGE_SIZE
Definition amdgpu_vm.hh:115
static constexpr int AMDGPU_GART_PAGE_SIZE
Definition amdgpu_vm.hh:114
static constexpr int AMDGPU_USER_PAGE_SIZE
Definition amdgpu_vm.hh:118
static constexpr int AMDGPU_AGP_PAGE_SIZE
Definition amdgpu_vm.hh:113
Device model for an AMD GPU.
AGPTranslationGen(AMDGPUVM *_vm, Addr vaddr, Addr size)
Definition amdgpu_vm.hh:349
void translate(Range &range) const override
Subclasses implement this function to complete TranslationGen.
Definition amdgpu_vm.cc:391
void translate(Range &range) const override
Subclasses implement this function to complete TranslationGen.
Definition amdgpu_vm.cc:407
GARTTranslationGen(AMDGPUVM *_vm, Addr vaddr, Addr size)
Definition amdgpu_vm.hh:362
void translate(Range &range) const override
Subclasses implement this function to complete TranslationGen.
Definition amdgpu_vm.cc:443
MMHUBTranslationGen(AMDGPUVM *_vm, Addr vaddr, Addr size)
Definition amdgpu_vm.hh:375
UserTranslationGen(AMDGPUVM *_vm, VegaISA::Walker *_walker, int _vmid, Addr vaddr, Addr size)
Definition amdgpu_vm.hh:390
void translate(Range &range) const override
Subclasses implement this function to complete TranslationGen.
Definition amdgpu_vm.cc:459
uint64_t mmhubBase
Definition amdgpu_vm.hh:189
void writeMMIOGfx900(PacketPtr pkt, Addr offset)
Different MMIO implements for different GFX versions with overlapping MMIO addresses.
Definition amdgpu_vm.cc:136
Addr getSysAddrRangeHigh()
Definition amdgpu_vm.hh:279
void setMMIOAperture(mmio_range_t mmio_aperture, AddrRange range)
Definition amdgpu_vm.cc:62
std::vector< AMDGPUVMContext > vmContexts
Definition amdgpu_vm.hh:185
std::array< AddrRange, NUM_MMIO_RANGES > mmioRanges
Definition amdgpu_vm.hh:205
void setMMHUBBase(Addr base)
Definition amdgpu_vm.hh:258
AddrRange getMMIORange(mmio_range_t mmio_aperture)
Definition amdgpu_vm.cc:68
void invalidateTLBs()
Definition amdgpu_vm.cc:280
struct gem5::AMDGPUVM::GEM5_PACKED AMDGPUVMContext
Addr getSysAddrRangeLow()
Definition amdgpu_vm.hh:278
std::unordered_map< uint64_t, uint64_t > gartTable
Copy of GART table.
Definition amdgpu_vm.hh:231
bool inAGP(Addr vaddr)
Methods for resolving apertures.
Definition amdgpu_vm.hh:240
std::vector< VegaISA::GpuTLB * > gpu_tlbs
List of TLBs associated with the GPU device.
Definition amdgpu_vm.hh:196
void readMMIO(PacketPtr pkt, Addr offset)
Definition amdgpu_vm.cc:99
Addr getMMHUBTop()
Definition amdgpu_vm.hh:256
const AddrRange & getMMIOAperture(Addr addr)
Definition amdgpu_vm.cc:74
gem5::AMDGPUVM::AMDGPUSysVMContext AMDGPUSysVMContext
Addr getFBOffset()
Definition amdgpu_vm.hh:269
void setGPUDevice(AMDGPUDevice *gpu_device)
Definition amdgpu_vm.hh:210
void writeMMIO(PacketPtr pkt, Addr offset)
Definition amdgpu_vm.cc:260
uint64_t mmhubTop
Definition amdgpu_vm.hh:190
bool inFB(Addr vaddr)
Definition amdgpu_vm.hh:262
Addr getFrameAperture(Addr addr)
Definition amdgpu_vm.hh:287
AMDGPUSysVMContext vmContext0
Definition amdgpu_vm.hh:184
void setPageTableBase(uint16_t vmid, Addr ptBase)
Page table base/start accessors for user VMIDs.
Definition amdgpu_vm.hh:305
Addr getMMHUBBase()
Definition amdgpu_vm.hh:255
AMDGPUDevice * gpuDevice
Definition amdgpu_vm.hh:138
Addr getPageTableBase(uint16_t vmid)
Definition amdgpu_vm.hh:311
Addr gartBase()
Return base address of GART table in framebuffer.
Definition amdgpu_vm.cc:87
Addr getPageTableStart(uint16_t vmid)
Definition amdgpu_vm.hh:318
void writeMMIOGfx940(PacketPtr pkt, Addr offset)
Definition amdgpu_vm.cc:198
bool inGARTRange(Addr paddr)
Definition amdgpu_vm.hh:222
void unserialize(CheckpointIn &cp) override
Unserialize an object.
Definition amdgpu_vm.cc:341
bool inMMHUB(Addr vaddr)
Definition amdgpu_vm.hh:250
Addr gartSize()
Return size of GART in number of PTEs.
Definition amdgpu_vm.cc:93
void serialize(CheckpointOut &cp) const override
Serialize an object.
Definition amdgpu_vm.cc:290
Addr getAGPBase()
Definition amdgpu_vm.hh:247
void registerTLB(VegaISA::GpuTLB *tlb)
Control methods for TLBs associated with the GPU device.
Definition amdgpu_vm.cc:273
void setMMHUBTop(Addr top)
Definition amdgpu_vm.hh:259
bool inSys(Addr vaddr)
Definition amdgpu_vm.hh:272
The AddrRange class encapsulates an address range, and supports a number of tests to check if two ran...
Definition addr_range.hh:82
TranslationGen(Addr new_start, Addr new_size)
The starting virtual address and the size of the entire region being translated.
STL vector class.
Definition stl.hh:37
Definition test.h:63
#define warn_once(...)
Definition logging.hh:292
Bitfield< 23, 0 > offset
Definition types.hh:144
Bitfield< 59, 56 > tlb
Bitfield< 3 > addr
Definition types.hh:84
Copyright (c) 2024 Arm Limited All rights reserved.
Definition binary32.hh:36
std::ostream CheckpointOut
Definition serialize.hh:66
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition types.hh:147
Packet * PacketPtr
mmio_range_t
Definition amdgpu_vm.hh:124
@ GRBM_MMIO_RANGE
Definition amdgpu_vm.hh:128
@ GFX_MMIO_RANGE
Definition amdgpu_vm.hh:127
@ IH_MMIO_RANGE
Definition amdgpu_vm.hh:129
@ MMHUB_MMIO_RANGE
Definition amdgpu_vm.hh:126
@ NUM_MMIO_RANGES
Definition amdgpu_vm.hh:130
@ NBIO_MMIO_RANGE
Definition amdgpu_vm.hh:125
Declaration of the Packet class.
This structure represents a single, contiguous translation, or carries information about whatever fau...

Generated on Mon May 26 2025 09:19:09 for gem5 by doxygen 1.13.2