gem5  v22.1.0.0
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"
38 #include "dev/dma_virt_device.hh"
39 #include "params/SDMAEngine.hh"
40 
41 namespace gem5
42 {
43 
47 class SDMAEngine : public DmaVirtDevice
48 {
49  enum SDMAType
50  {
52  SDMAPage
53  };
54 
55  class SDMAQueue
56  {
63  bool _valid;
67  public:
68  SDMAQueue() : _rptr(0), _wptr(0), _valid(false), _processing(false),
69  _parent(nullptr), _ib(nullptr) {}
70 
71  Addr base() { return _base; }
72  Addr rptr() { return _base + _rptr; }
73  Addr getRptr() { return _rptr; }
74  Addr wptr() { return _base + _wptr; }
75  Addr getWptr() { return _wptr; }
76  Addr size() { return _size; }
79  bool valid() { return _valid; }
80  bool processing() { return _processing; }
81  SDMAQueue* parent() { return _parent; }
82  SDMAQueue* ib() { return _ib; }
83 
84  void base(Addr value) { _base = value; }
85 
86  void
87  incRptr(uint32_t value)
88  {
89  _rptr = (_rptr + value) % _size;
90  _global_rptr += value;
91  }
92 
93  void
94  rptr(Addr value)
95  {
96  _rptr = value;
97  _global_rptr = value;
98  }
99 
100  void
101  setWptr(Addr value)
102  {
103  _wptr = value % _size;
104  }
105 
106  void wptr(Addr value) { _wptr = value; }
107 
108  void size(Addr value) { _size = value; }
109  void rptrWbAddr(Addr value) { _rptr_wb_addr = value; }
110  void valid(bool v) { _valid = v; }
111  void processing(bool value) { _processing = value; }
112  void parent(SDMAQueue* q) { _parent = q; }
113  void ib(SDMAQueue* ib) { _ib = ib; }
114  };
115 
116  /* SDMA Engine ID */
117  int id;
127 
128  /* Gfx ring buffer registers */
129  uint64_t gfxBase;
130  uint64_t gfxRptr;
131  uint64_t gfxDoorbell;
133  uint64_t gfxWptr;
134  /* Page ring buffer registers */
135  uint64_t pageBase;
136  uint64_t pageRptr;
137  uint64_t pageDoorbell;
139  uint64_t pageWptr;
140 
143 
144  /* processRLC will select the correct queue for the doorbell */
145  std::array<Addr, 2> rlcInfo{};
146  void processRLC0(Addr wptrOffset);
147  void processRLC1(Addr wptrOffset);
148 
149  public:
150  SDMAEngine(const SDMAEngineParams &p);
151 
152  void setGPUDevice(AMDGPUDevice *gpu_device);
153 
154  void setId(int _id) { id = _id; }
158  int getIHClientId();
159 
163  Addr getGARTAddr(Addr addr) const;
164  TranslationGenPtr translate(Addr vaddr, Addr size) override;
165 
171  Addr getDeviceAddress(Addr raw_addr);
172 
176  Tick write(PacketPtr pkt) override { return 0; }
177  Tick read(PacketPtr pkt) override { return 0; }
178  AddrRangeList getAddrRanges() const override;
179  void serialize(CheckpointOut &cp) const override;
180  void unserialize(CheckpointIn &cp) override;
181 
186  void processGfx(Addr wptrOffset);
187  void processPage(Addr wptrOffset);
188  void processRLC(Addr doorbellOffset, Addr wptrOffset);
189 
198  void decodeNext(SDMAQueue *q);
199 
205  void decodeHeader(SDMAQueue *q, uint32_t data);
206 
210  void write(SDMAQueue *q, sdmaWrite *pkt);
211  void writeReadData(SDMAQueue *q, sdmaWrite *pkt, uint32_t *dmaBuffer);
212  void writeDone(SDMAQueue *q, sdmaWrite *pkt, uint32_t *dmaBuffer);
213  void copy(SDMAQueue *q, sdmaCopy *pkt);
214  void copyReadData(SDMAQueue *q, sdmaCopy *pkt, uint8_t *dmaBuffer);
215  void copyDone(SDMAQueue *q, sdmaCopy *pkt, uint8_t *dmaBuffer);
216  void indirectBuffer(SDMAQueue *q, sdmaIndirectBuffer *pkt);
217  void fence(SDMAQueue *q, sdmaFence *pkt);
218  void fenceDone(SDMAQueue *q, sdmaFence *pkt);
219  void trap(SDMAQueue *q, sdmaTrap *pkt);
220  void srbmWrite(SDMAQueue *q, sdmaSRBMWriteHeader *header,
221  sdmaSRBMWrite *pkt);
222  void pollRegMem(SDMAQueue *q, sdmaPollRegMemHeader *header,
223  sdmaPollRegMem *pkt);
224  void pollRegMemRead(SDMAQueue *q, sdmaPollRegMemHeader *header,
225  sdmaPollRegMem *pkt, uint32_t dma_buffer, int count);
226  bool pollRegMemFunc(uint32_t value, uint32_t reference, uint32_t func);
227  void ptePde(SDMAQueue *q, sdmaPtePde *pkt);
228  void ptePdeDone(SDMAQueue *q, sdmaPtePde *pkt, uint64_t *dmaBuffer);
229  void atomic(SDMAQueue *q, sdmaAtomicHeader *header, sdmaAtomic *pkt);
230  void atomicData(SDMAQueue *q, sdmaAtomicHeader *header, sdmaAtomic *pkt,
231  uint64_t *dmaBuffer);
232  void atomicDone(SDMAQueue *q, sdmaAtomicHeader *header, sdmaAtomic *pkt,
233  uint64_t *dmaBuffer);
234 
238  uint64_t getGfxBase() { return gfxBase; }
239  uint64_t getGfxRptr() { return gfxRptr; }
240  uint64_t getGfxDoorbell() { return gfxDoorbell; }
242  uint64_t getGfxWptr() { return gfxWptr; }
243  uint64_t getPageBase() { return pageBase; }
244  uint64_t getPageRptr() { return pageRptr; }
245  uint64_t getPageDoorbell() { return pageDoorbell; }
247  uint64_t getPageWptr() { return pageWptr; }
248 
252  void writeMMIO(PacketPtr pkt, Addr mmio_offset);
253 
254  void setGfxBaseLo(uint32_t data);
255  void setGfxBaseHi(uint32_t data);
256  void setGfxRptrLo(uint32_t data);
257  void setGfxRptrHi(uint32_t data);
258  void setGfxDoorbellLo(uint32_t data);
259  void setGfxDoorbellHi(uint32_t data);
260  void setGfxDoorbellOffsetLo(uint32_t data);
261  void setGfxDoorbellOffsetHi(uint32_t data);
262  void setGfxSize(uint64_t data);
263  void setGfxWptrLo(uint32_t data);
264  void setGfxWptrHi(uint32_t data);
265  void setPageBaseLo(uint32_t data);
266  void setPageBaseHi(uint32_t data);
267  void setPageRptrLo(uint32_t data);
268  void setPageRptrHi(uint32_t data);
269  void setPageDoorbellLo(uint32_t data);
270  void setPageDoorbellHi(uint32_t data);
271  void setPageDoorbellOffsetLo(uint32_t data);
272  void setPageDoorbellOffsetHi(uint32_t data);
273  void setPageSize(uint64_t data);
274  void setPageWptrLo(uint32_t data);
275  void setPageWptrHi(uint32_t data);
276 
280  void registerRLCQueue(Addr doorbell, Addr rb_base, uint32_t size,
281  Addr rptr_wb_addr);
282  void unregisterRLCQueue(Addr doorbell);
283  void deallocateRLCQueues();
284 
285  int cur_vmid = 0;
286 };
287 
288 } // namespace gem5
289 
290 #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:294
void processing(bool value)
Definition: sdma_engine.hh:111
void ib(SDMAQueue *ib)
Definition: sdma_engine.hh:113
void rptrWbAddr(Addr value)
Definition: sdma_engine.hh:109
void incRptr(uint32_t value)
Definition: sdma_engine.hh:87
void setWptr(Addr value)
Definition: sdma_engine.hh:101
void parent(SDMAQueue *q)
Definition: sdma_engine.hh:112
System DMA Engine class for AMD dGPU.
Definition: sdma_engine.hh:48
uint64_t pageDoorbell
Definition: sdma_engine.hh:137
void setPageRptrLo(uint32_t data)
void unserialize(CheckpointIn &cp) override
Unserialize an object.
uint64_t getPageDoorbellOffset()
Definition: sdma_engine.hh:246
SDMAQueue gfx
Each SDMAEngine processes four queues: paging, gfx, rlc0, and rlc1, where RLC stands for Run List Con...
Definition: sdma_engine.hh:125
void ptePde(SDMAQueue *q, sdmaPtePde *pkt)
Definition: sdma_engine.cc:877
void setGfxRptrLo(uint32_t data)
void setGfxWptrLo(uint32_t data)
uint64_t getGfxDoorbellOffset()
Definition: sdma_engine.hh:241
void setPageDoorbellHi(uint32_t data)
VegaISA::Walker * walker
Definition: sdma_engine.hh:142
Tick read(PacketPtr pkt) override
Pure virtual function that the device must implement.
Definition: sdma_engine.hh:177
void setGfxRptrHi(uint32_t data)
void writeDone(SDMAQueue *q, sdmaWrite *pkt, uint32_t *dmaBuffer)
Definition: sdma_engine.cc:575
void setGfxSize(uint64_t data)
void processRLC(Addr doorbellOffset, Addr wptrOffset)
Definition: sdma_engine.cc:240
void registerRLCQueue(Addr doorbell, Addr rb_base, uint32_t size, Addr rptr_wb_addr)
Methods for RLC queues.
Definition: sdma_engine.cc:164
uint64_t getPageRptr()
Definition: sdma_engine.hh:244
SDMAQueue rlc0Ib
Definition: sdma_engine.hh:126
void copy(SDMAQueue *q, sdmaCopy *pkt)
Definition: sdma_engine.cc:586
Tick write(PacketPtr pkt) override
Inherited methods.
Definition: sdma_engine.hh:176
void writeMMIO(PacketPtr pkt, Addr mmio_offset)
Methods for setting the values of SDMA MMIO registers.
void fenceDone(SDMAQueue *q, sdmaFence *pkt)
Definition: sdma_engine.cc:714
void writeReadData(SDMAQueue *q, sdmaWrite *pkt, uint32_t *dmaBuffer)
Definition: sdma_engine.cc:547
void setId(int _id)
Definition: sdma_engine.hh:154
void unregisterRLCQueue(Addr doorbell)
Definition: sdma_engine.cc:194
void setGfxBaseLo(uint32_t data)
void processRLC0(Addr wptrOffset)
Definition: sdma_engine.cc:253
void processGfx(Addr wptrOffset)
Given a new write ptr offset, communicated to the GPU through a doorbell write, the SDMA engine proce...
Definition: sdma_engine.cc:218
void setGfxDoorbellOffsetHi(uint32_t data)
void atomic(SDMAQueue *q, sdmaAtomicHeader *header, sdmaAtomic *pkt)
Definition: sdma_engine.cc:921
void deallocateRLCQueues()
Definition: sdma_engine.cc:209
AMDGPUDevice * gpuDevice
Definition: sdma_engine.hh:141
Addr getGARTAddr(Addr addr) const
Methods for translation.
Definition: sdma_engine.cc:92
void setPageDoorbellOffsetHi(uint32_t data)
void processRLC1(Addr wptrOffset)
Definition: sdma_engine.cc:267
void setGfxWptrHi(uint32_t data)
void setGfxDoorbellOffsetLo(uint32_t data)
void processPage(Addr wptrOffset)
Definition: sdma_engine.cc:229
uint64_t getGfxDoorbell()
Definition: sdma_engine.hh:240
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...
Definition: sdma_engine.cc:317
uint64_t getGfxBase()
Methods for getting the values of SDMA MMIO registers.
Definition: sdma_engine.hh:238
void setPageDoorbellOffsetLo(uint32_t data)
uint64_t getPageDoorbell()
Definition: sdma_engine.hh:245
SDMAQueue pageIb
Definition: sdma_engine.hh:125
SDMAEngine(const SDMAEngineParams &p)
Definition: sdma_engine.cc:48
void setGPUDevice(AMDGPUDevice *gpu_device)
Definition: sdma_engine.cc:72
uint64_t gfxDoorbell
Definition: sdma_engine.hh:131
Addr getDeviceAddress(Addr raw_addr)
Translate an address in an SDMA packet.
Definition: sdma_engine.cc:102
uint64_t pageDoorbellOffset
Definition: sdma_engine.hh:138
uint64_t getPageWptr()
Definition: sdma_engine.hh:247
void setPageBaseHi(uint32_t data)
uint64_t gfxDoorbellOffset
Definition: sdma_engine.hh:132
uint64_t getGfxWptr()
Definition: sdma_engine.hh:242
uint64_t getPageBase()
Definition: sdma_engine.hh:243
bool pollRegMemFunc(uint32_t value, uint32_t reference, uint32_t func)
Definition: sdma_engine.cc:845
void setPageWptrHi(uint32_t data)
void setPageWptrLo(uint32_t data)
void pollRegMemRead(SDMAQueue *q, sdmaPollRegMemHeader *header, sdmaPollRegMem *pkt, uint32_t dma_buffer, int count)
Definition: sdma_engine.cc:815
void setGfxDoorbellLo(uint32_t data)
void copyReadData(SDMAQueue *q, sdmaCopy *pkt, uint8_t *dmaBuffer)
Definition: sdma_engine.cc:629
void indirectBuffer(SDMAQueue *q, sdmaIndirectBuffer *pkt)
Definition: sdma_engine.cc:686
void srbmWrite(SDMAQueue *q, sdmaSRBMWriteHeader *header, sdmaSRBMWrite *pkt)
Definition: sdma_engine.cc:746
void atomicData(SDMAQueue *q, sdmaAtomicHeader *header, sdmaAtomic *pkt, uint64_t *dmaBuffer)
Definition: sdma_engine.cc:937
void trap(SDMAQueue *q, sdmaTrap *pkt)
Definition: sdma_engine.cc:724
AddrRangeList getAddrRanges() const override
Every PIO device is obliged to provide an implementation that returns the address ranges the device r...
Definition: sdma_engine.cc:977
void setPageDoorbellLo(uint32_t data)
void setGfxDoorbellHi(uint32_t data)
void setPageBaseLo(uint32_t data)
void copyDone(SDMAQueue *q, sdmaCopy *pkt, uint8_t *dmaBuffer)
Definition: sdma_engine.cc:675
void setGfxBaseHi(uint32_t data)
void setPageSize(uint64_t data)
void ptePdeDone(SDMAQueue *q, sdmaPtePde *pkt, uint64_t *dmaBuffer)
Definition: sdma_engine.cc:910
TranslationGenPtr translate(Addr vaddr, Addr size) override
GPUController will perform DMA operations on VAs, and because page faults are not currently supported...
Definition: sdma_engine.cc:140
void setPageRptrHi(uint32_t data)
uint64_t getGfxRptr()
Definition: sdma_engine.hh:239
void decodeNext(SDMAQueue *q)
This method checks read and write pointers and starts decoding packets if the read pointer is less th...
Definition: sdma_engine.cc:281
void fence(SDMAQueue *q, sdmaFence *pkt)
Definition: sdma_engine.cc:701
void atomicDone(SDMAQueue *q, sdmaAtomicHeader *header, sdmaAtomic *pkt, uint64_t *dmaBuffer)
Definition: sdma_engine.cc:964
void serialize(CheckpointOut &cp) const override
Serialize an object.
Definition: sdma_engine.cc:984
int getIHClientId()
Returns the client id for the Interrupt Handler.
Definition: sdma_engine.cc:79
std::array< Addr, 2 > rlcInfo
Definition: sdma_engine.hh:145
void pollRegMem(SDMAQueue *q, sdmaPollRegMemHeader *header, sdmaPollRegMem *pkt)
Implements a poll reg/mem packet that polls an SRBM register or a memory location,...
Definition: sdma_engine.cc:777
SDMAQueue rlc1Ib
Definition: sdma_engine.hh:126
Bitfield< 27 > q
Definition: misc_types.hh:55
Bitfield< 0 > v
Definition: pagetable.hh:65
Bitfield< 54 > p
Definition: pagetable.hh:70
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.
Definition: pm4_defines.hh:78

Generated on Wed Dec 21 2022 10:22:32 for gem5 by doxygen 1.9.1