gem5 v23.0.0.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
sdma_engine.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_SDMA_ENGINE_HH__
33#define __DEV_AMDGPU_SDMA_ENGINE_HH__
34
35#include "base/bitunion.hh"
40#include "params/SDMAEngine.hh"
41
42namespace gem5
43{
44
49{
51 {
54 };
55
57 {
64 bool _valid;
71 public:
72 SDMAQueue() : _rptr(0), _wptr(0), _valid(false), _processing(false),
73 _parent(nullptr), _ib(nullptr), _type(SDMAGfx), _mqd(nullptr) {}
74
75 Addr base() { return _base; }
76 Addr rptr() { return _base + _rptr; }
77 Addr getRptr() { return _rptr; }
78 Addr wptr() { return _base + _wptr; }
79 Addr getWptr() { return _wptr; }
80 Addr size() { return _size; }
83 bool valid() { return _valid; }
84 bool processing() { return _processing; }
85 SDMAQueue* parent() { return _parent; }
86 SDMAQueue* ib() { return _ib; }
87 SDMAType queueType() { return _type; }
88 SDMAQueueDesc* getMQD() { return _mqd; }
90
91 void base(Addr value) { _base = value; }
92
93 void
94 incRptr(uint32_t value)
95 {
96 _rptr = (_rptr + value) % _size;
97 _global_rptr += value;
98 }
99
100 void
101 rptr(Addr value)
102 {
103 _rptr = value;
104 _global_rptr = value;
105 }
106
107 void
109 {
110 _wptr = value % _size;
111 }
112
113 void wptr(Addr value) { _wptr = value; }
114
115 void size(Addr value) { _size = value; }
116 void rptrWbAddr(Addr value) { _rptr_wb_addr = value; }
117 void valid(bool v) { _valid = v; }
118 void processing(bool value) { _processing = value; }
119 void parent(SDMAQueue* q) { _parent = q; }
120 void ib(SDMAQueue* ib) { _ib = ib; }
122 void setMQD(SDMAQueueDesc *mqd) { _mqd = mqd; }
123 void setMQDAddr(Addr mqdAddr) { _mqd_addr = mqdAddr; }
124 };
125
126 /* SDMA Engine ID */
127 int id;
137
138 /* Gfx ring buffer registers */
139 uint64_t gfxBase;
140 uint64_t gfxRptr;
141 uint64_t gfxDoorbell;
143 uint64_t gfxWptr;
144 /* Page ring buffer registers */
145 uint64_t pageBase;
146 uint64_t pageRptr;
147 uint64_t pageDoorbell;
149 uint64_t pageWptr;
150
153
154 /* processRLC will select the correct queue for the doorbell */
155 std::array<Addr, 2> rlcInfo{};
156 void processRLC0(Addr wptrOffset);
157 void processRLC1(Addr wptrOffset);
158
161
162 public:
163 SDMAEngine(const SDMAEngineParams &p);
164
165 void setGPUDevice(AMDGPUDevice *gpu_device);
166
167 void setId(int _id) { id = _id; }
168 int getId() const { return id; }
172 int getIHClientId();
173
177 Addr getGARTAddr(Addr addr) const;
178 TranslationGenPtr translate(Addr vaddr, Addr size) override;
179
185 Addr getDeviceAddress(Addr raw_addr);
186
190 Tick write(PacketPtr pkt) override { return 0; }
191 Tick read(PacketPtr pkt) override { return 0; }
192 AddrRangeList getAddrRanges() const override;
193 void serialize(CheckpointOut &cp) const override;
194 void unserialize(CheckpointIn &cp) override;
195
200 void processGfx(Addr wptrOffset);
201 void processPage(Addr wptrOffset);
202 void processRLC(Addr doorbellOffset, Addr wptrOffset);
203
212 void decodeNext(SDMAQueue *q);
213
219 void decodeHeader(SDMAQueue *q, uint32_t data);
220
224 void write(SDMAQueue *q, sdmaWrite *pkt);
225 void writeReadData(SDMAQueue *q, sdmaWrite *pkt, uint32_t *dmaBuffer);
226 void writeDone(SDMAQueue *q, sdmaWrite *pkt, uint32_t *dmaBuffer);
227 void copy(SDMAQueue *q, sdmaCopy *pkt);
228 void copyReadData(SDMAQueue *q, sdmaCopy *pkt, uint8_t *dmaBuffer);
229 void copyDone(SDMAQueue *q, sdmaCopy *pkt, uint8_t *dmaBuffer);
230 void indirectBuffer(SDMAQueue *q, sdmaIndirectBuffer *pkt);
231 void fence(SDMAQueue *q, sdmaFence *pkt);
232 void fenceDone(SDMAQueue *q, sdmaFence *pkt);
233 void trap(SDMAQueue *q, sdmaTrap *pkt);
234 void srbmWrite(SDMAQueue *q, sdmaSRBMWriteHeader *header,
235 sdmaSRBMWrite *pkt);
236 void pollRegMem(SDMAQueue *q, sdmaPollRegMemHeader *header,
237 sdmaPollRegMem *pkt);
239 sdmaPollRegMem *pkt, uint32_t dma_buffer, int count);
240 bool pollRegMemFunc(uint32_t value, uint32_t reference, uint32_t func);
241 void ptePde(SDMAQueue *q, sdmaPtePde *pkt);
242 void ptePdeDone(SDMAQueue *q, sdmaPtePde *pkt, uint64_t *dmaBuffer);
243 void atomic(SDMAQueue *q, sdmaAtomicHeader *header, sdmaAtomic *pkt);
244 void atomicData(SDMAQueue *q, sdmaAtomicHeader *header, sdmaAtomic *pkt,
245 uint64_t *dmaBuffer);
246 void atomicDone(SDMAQueue *q, sdmaAtomicHeader *header, sdmaAtomic *pkt,
247 uint64_t *dmaBuffer);
248
256
260 uint64_t getGfxBase() { return gfxBase; }
261 uint64_t getGfxRptr() { return gfxRptr; }
262 uint64_t getGfxDoorbell() { return gfxDoorbell; }
264 uint64_t getGfxWptr() { return gfxWptr; }
265 uint64_t getPageBase() { return pageBase; }
266 uint64_t getPageRptr() { return pageRptr; }
267 uint64_t getPageDoorbell() { return pageDoorbell; }
269 uint64_t getPageWptr() { return pageWptr; }
270
274 void writeMMIO(PacketPtr pkt, Addr mmio_offset);
275
276 void setGfxBaseLo(uint32_t data);
277 void setGfxBaseHi(uint32_t data);
278 void setGfxRptrLo(uint32_t data);
279 void setGfxRptrHi(uint32_t data);
280 void setGfxDoorbellLo(uint32_t data);
281 void setGfxDoorbellHi(uint32_t data);
282 void setGfxDoorbellOffsetLo(uint32_t data);
283 void setGfxDoorbellOffsetHi(uint32_t data);
284 void setGfxSize(uint32_t data);
285 void setGfxWptrLo(uint32_t data);
286 void setGfxWptrHi(uint32_t data);
287 void setPageBaseLo(uint32_t data);
288 void setPageBaseHi(uint32_t data);
289 void setPageRptrLo(uint32_t data);
290 void setPageRptrHi(uint32_t data);
291 void setPageDoorbellLo(uint32_t data);
292 void setPageDoorbellHi(uint32_t data);
293 void setPageDoorbellOffsetLo(uint32_t data);
294 void setPageDoorbellOffsetHi(uint32_t data);
295 void setPageSize(uint32_t data);
296 void setPageWptrLo(uint32_t data);
297 void setPageWptrHi(uint32_t data);
298
302 void registerRLCQueue(Addr doorbell, Addr mqdAddr, SDMAQueueDesc *mqd);
303 void unregisterRLCQueue(Addr doorbell);
304 void deallocateRLCQueues();
305
306 int cur_vmid = 0;
307};
308
309} // namespace gem5
310
311#endif // __DEV_AMDGPU_SDMA_ENGINE_HH__
const char data[]
Device model for an AMD GPU.
A Packet is used to encapsulate a transfer between two objects in the memory system (e....
Definition packet.hh:295
void setMQD(SDMAQueueDesc *mqd)
void setMQDAddr(Addr mqdAddr)
void processing(bool value)
SDMAQueueDesc * getMQD()
void ib(SDMAQueue *ib)
void rptrWbAddr(Addr value)
void incRptr(uint32_t value)
void parent(SDMAQueue *q)
void queueType(SDMAType type)
System DMA Engine class for AMD dGPU.
uint64_t pageDoorbell
void setPageRptrLo(uint32_t data)
void unserialize(CheckpointIn &cp) override
Unserialize an object.
uint64_t getPageDoorbellOffset()
SDMAQueue gfx
Each SDMAEngine processes four queues: paging, gfx, rlc0, and rlc1, where RLC stands for Run List Con...
void ptePde(SDMAQueue *q, sdmaPtePde *pkt)
void setGfxRptrLo(uint32_t data)
void setGfxWptrLo(uint32_t data)
uint64_t getGfxDoorbellOffset()
void setPageDoorbellHi(uint32_t data)
VegaISA::Walker * walker
Tick read(PacketPtr pkt) override
Pure virtual function that the device must implement.
void setGfxRptrHi(uint32_t data)
void writeDone(SDMAQueue *q, sdmaWrite *pkt, uint32_t *dmaBuffer)
Addr getMmioBase()
Methods for getting SDMA MMIO base address and size.
void processRLC(Addr doorbellOffset, Addr wptrOffset)
uint64_t getPageRptr()
void copy(SDMAQueue *q, sdmaCopy *pkt)
Tick write(PacketPtr pkt) override
Inherited methods.
void writeMMIO(PacketPtr pkt, Addr mmio_offset)
Methods for setting the values of SDMA MMIO registers.
void setGfxSize(uint32_t data)
void fenceDone(SDMAQueue *q, sdmaFence *pkt)
void writeReadData(SDMAQueue *q, sdmaWrite *pkt, uint32_t *dmaBuffer)
void setId(int _id)
void unregisterRLCQueue(Addr doorbell)
void setGfxBaseLo(uint32_t data)
void processRLC0(Addr wptrOffset)
void processGfx(Addr wptrOffset)
Given a new write ptr offset, communicated to the GPU through a doorbell write, the SDMA engine proce...
void setGfxDoorbellOffsetHi(uint32_t data)
void deallocateRLCQueues()
AMDGPUDevice * gpuDevice
Addr getGARTAddr(Addr addr) const
Methods for translation.
void setPageDoorbellOffsetHi(uint32_t data)
void processRLC1(Addr wptrOffset)
void setGfxWptrHi(uint32_t data)
void setGfxDoorbellOffsetLo(uint32_t data)
void processPage(Addr wptrOffset)
uint64_t getGfxDoorbell()
void decodeHeader(SDMAQueue *q, uint32_t data)
Reads the first DW (32 bits) (i.e., header) of an SDMA packet, which encodes the opcode and sub-opcod...
uint64_t getGfxBase()
Methods for getting the values of SDMA MMIO registers.
void setPageDoorbellOffsetLo(uint32_t data)
uint64_t getPageDoorbell()
void setGPUDevice(AMDGPUDevice *gpu_device)
Addr getDeviceAddress(Addr raw_addr)
Translate an address in an SDMA packet.
uint64_t pageDoorbellOffset
uint64_t getPageWptr()
void setPageBaseHi(uint32_t data)
uint64_t gfxDoorbellOffset
void registerRLCQueue(Addr doorbell, Addr mqdAddr, SDMAQueueDesc *mqd)
Methods for RLC queues.
uint64_t getGfxWptr()
uint64_t getPageBase()
bool pollRegMemFunc(uint32_t value, uint32_t reference, uint32_t func)
void setPageWptrHi(uint32_t data)
void setPageWptrLo(uint32_t data)
void pollRegMemRead(SDMAQueue *q, sdmaPollRegMemHeader *header, sdmaPollRegMem *pkt, uint32_t dma_buffer, int count)
void setGfxDoorbellLo(uint32_t data)
void copyReadData(SDMAQueue *q, sdmaCopy *pkt, uint8_t *dmaBuffer)
void indirectBuffer(SDMAQueue *q, sdmaIndirectBuffer *pkt)
void srbmWrite(SDMAQueue *q, sdmaSRBMWriteHeader *header, sdmaSRBMWrite *pkt)
void atomicData(SDMAQueue *q, sdmaAtomicHeader *header, sdmaAtomic *pkt, uint64_t *dmaBuffer)
void trap(SDMAQueue *q, sdmaTrap *pkt)
AddrRangeList getAddrRanges() const override
Every PIO device is obliged to provide an implementation that returns the address ranges the device r...
void setPageDoorbellLo(uint32_t data)
void setGfxDoorbellHi(uint32_t data)
void setPageSize(uint32_t data)
void setPageBaseLo(uint32_t data)
void copyDone(SDMAQueue *q, sdmaCopy *pkt, uint8_t *dmaBuffer)
void setGfxBaseHi(uint32_t data)
void ptePdeDone(SDMAQueue *q, sdmaPtePde *pkt, uint64_t *dmaBuffer)
TranslationGenPtr translate(Addr vaddr, Addr size) override
GPUController will perform DMA operations on VAs, and because page faults are not currently supported...
void setPageRptrHi(uint32_t data)
int getId() const
uint64_t getGfxRptr()
void decodeNext(SDMAQueue *q)
This method checks read and write pointers and starts decoding packets if the read pointer is less th...
void fence(SDMAQueue *q, sdmaFence *pkt)
void atomicDone(SDMAQueue *q, sdmaAtomicHeader *header, sdmaAtomic *pkt, uint64_t *dmaBuffer)
void serialize(CheckpointOut &cp) const override
Serialize an object.
int getIHClientId()
Returns the client id for the Interrupt Handler.
std::array< Addr, 2 > rlcInfo
void pollRegMem(SDMAQueue *q, sdmaPollRegMemHeader *header, sdmaPollRegMem *pkt)
Implements a poll reg/mem packet that polls an SRBM register or a memory location,...
Bitfield< 23, 20 > atomic
Bitfield< 28 > v
Definition misc_types.hh:54
Bitfield< 27 > q
Definition misc_types.hh:55
Bitfield< 0 > p
Bitfield< 3 > addr
Definition types.hh:84
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
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
uint64_t Tick
Tick count type.
Definition types.hh:58
std::unique_ptr< TranslationGen > TranslationGenPtr
output header
Definition nop.cc:36
PM4 packets.

Generated on Mon Jul 10 2023 14:24:30 for gem5 by doxygen 1.9.7