A Modern GPGPU API & wip linux RDNA2+ Driver
rdna driver linux gpu
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

amdgpu: command processor encoder

+79
+53
drivers/amdgpu/cp_encoder.cpp
··· 1 + #include "cp_encoder.h" 2 + #include "cmdstream.h" 3 + #include "gpuinfo.h" 4 + 5 + CPEncoder::CPEncoder(GpuInfo &info, uint8_t ip_type, CommandStream &cs) : info(info), ip_type(ip_type), cs(cs) {} 6 + 7 + void CPEncoder::wait_mem(WaitMemOp op, uint64_t va, uint32_t ref, uint32_t mask) { 8 + cs.emit(PKT3(PKT3_WAIT_REG_MEM, 5, 0)); 9 + cs.emit(WAIT_REG_MEM_MEM_SPACE(1) | (uint32_t)op); 10 + cs.emit(va); 11 + cs.emit(va >> 32); 12 + cs.emit(ref); 13 + cs.emit(mask); 14 + cs.emit(4); 15 + } 16 + 17 + void CPEncoder::release_mem(uint32_t event, 18 + uint32_t event_flags, uint32_t dst_sel, 19 + uint32_t int_sel, uint32_t data_sel, uint64_t va, 20 + uint32_t new_fence) { 21 + 22 + assert(info.gfx_level >= GfxLevel::GFX12 || !event_flags || (event != V_028A90_PS_DONE && 23 + event != V_028A90_CS_DONE), "release_mem: only gfx12+ support gcr ops with PS_DONE & CS_DONE."); 24 + 25 + const uint32_t op = EVENT_TYPE(event) | 26 + EVENT_INDEX(event == V_028A90_CS_DONE || event == V_028A90_PS_DONE ? 6 : 5) | 27 + event_flags; 28 + const uint32_t sel = EOP_DST_SEL(dst_sel) | 29 + EOP_INT_SEL(int_sel) | 30 + EOP_DATA_SEL(data_sel); 31 + 32 + cs.emit(PKT3(PKT3_RELEASE_MEM, 6, false)); 33 + cs.emit(op); 34 + cs.emit(sel); 35 + cs.emit(va); 36 + cs.emit(va >> 32); 37 + cs.emit(new_fence); /* immediate data lo */ 38 + cs.emit(0); /* immediate data hi */ 39 + cs.emit(0); 40 + } 41 + 42 + void CPEncoder::atomic_mem(AtomicOp op, uint32_t atomic_cmd, uint64_t va, uint64_t data, uint64_t compare_data) { 43 + cs.emit(PKT3(PKT3_ATOMIC_MEM, 7, 0)); 44 + cs.emit(ATOMIC_OP((uint32_t)op) | 45 + ATOMIC_COMMAND(atomic_cmd)); 46 + cs.emit(va); 47 + cs.emit(va >> 32); 48 + cs.emit(data); 49 + cs.emit(data >> 32); 50 + cs.emit(compare_data); 51 + cs.emit(compare_data >> 32); 52 + cs.emit(10); /* loop interval */ 53 + }
+26
drivers/amdgpu/cp_encoder.h
··· 1 + #pragma once 2 + 3 + #include "cmdstream.h" 4 + #include "gpuinfo.h" 5 + #include "impl.h" 6 + 7 + /** 8 + * Command Processor command encoder 9 + */ 10 + class CPEncoder { 11 + public: 12 + CPEncoder(GpuInfo &info, uint8_t ip_type, CommandStream &cs); 13 + 14 + void wait_mem(WaitMemOp op, uint64_t va, uint32_t ref, uint32_t mask); 15 + 16 + void release_mem(uint32_t event, 17 + uint32_t event_flags, uint32_t dst_sel, 18 + uint32_t int_sel, uint32_t data_sel, uint64_t va, 19 + uint32_t new_fence); 20 + 21 + void atomic_mem(AtomicOp op, uint32_t atomic_cmd, uint64_t va, uint64_t data, uint64_t compare_data); 22 + private: 23 + GpuInfo &info; 24 + uint8_t ip_type; 25 + CommandStream &cs; 26 + };