e0ffc41d9a
Only simple ones for now. Other functions need more rework. Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/37881>
67 lines
1.7 KiB
C
67 lines
1.7 KiB
C
/*
|
|
* Copyright 2012 Advanced Micro Devices, Inc.
|
|
* Copyright 2025 Valve Corporation
|
|
*
|
|
* SPDX-License-Identifier: MIT
|
|
*/
|
|
|
|
#include "ac_cmdbuf.h"
|
|
#include "ac_cmdbuf_sdma.h"
|
|
#include "sid.h"
|
|
|
|
#include "util/u_math.h"
|
|
|
|
void
|
|
ac_emit_sdma_nop(struct ac_cmdbuf *cs)
|
|
{
|
|
/* SDMA NOP acts as a fence command and causes the SDMA engine to wait for pending copy operations. */
|
|
ac_cmdbuf_begin(cs);
|
|
ac_cmdbuf_emit(SDMA_PACKET(SDMA_OPCODE_NOP, 0, 0));
|
|
ac_cmdbuf_end();
|
|
}
|
|
|
|
void
|
|
ac_emit_sdma_write_timestamp(struct ac_cmdbuf *cs, uint64_t va)
|
|
{
|
|
ac_cmdbuf_begin(cs);
|
|
ac_cmdbuf_emit(SDMA_PACKET(SDMA_OPCODE_TIMESTAMP, SDMA_TS_SUB_OPCODE_GET_GLOBAL_TIMESTAMP, 0));
|
|
ac_cmdbuf_emit(va);
|
|
ac_cmdbuf_emit(va >> 32);
|
|
ac_cmdbuf_end();
|
|
}
|
|
|
|
void
|
|
ac_emit_sdma_fence(struct ac_cmdbuf *cs, uint64_t va, uint32_t fence)
|
|
{
|
|
ac_cmdbuf_begin(cs);
|
|
ac_cmdbuf_emit(SDMA_PACKET(SDMA_OPCODE_FENCE, 0, SDMA_FENCE_MTYPE_UC));
|
|
ac_cmdbuf_emit(va);
|
|
ac_cmdbuf_emit(va >> 32);
|
|
ac_cmdbuf_emit(fence);
|
|
ac_cmdbuf_end();
|
|
}
|
|
|
|
void
|
|
ac_emit_sdma_wait_mem(struct ac_cmdbuf *cs, uint32_t op, uint64_t va, uint32_t ref, uint32_t mask)
|
|
{
|
|
ac_cmdbuf_begin(cs);
|
|
ac_cmdbuf_emit(SDMA_PACKET(SDMA_OPCODE_POLL_REGMEM, 0, 0) | op << 28 | SDMA_POLL_MEM);
|
|
ac_cmdbuf_emit(va);
|
|
ac_cmdbuf_emit(va >> 32);
|
|
ac_cmdbuf_emit(ref);
|
|
ac_cmdbuf_emit(mask);
|
|
ac_cmdbuf_emit(SDMA_POLL_INTERVAL_160_CLK | SDMA_POLL_RETRY_INDEFINITELY << 16);
|
|
ac_cmdbuf_end();
|
|
}
|
|
|
|
void
|
|
ac_emit_sdma_write_data_head(struct ac_cmdbuf *cs, uint64_t va, uint32_t count)
|
|
{
|
|
ac_cmdbuf_begin(cs);
|
|
ac_cmdbuf_emit(SDMA_PACKET(SDMA_OPCODE_WRITE, SDMA_WRITE_SUB_OPCODE_LINEAR, 0));
|
|
ac_cmdbuf_emit(va);
|
|
ac_cmdbuf_emit(va >> 32);
|
|
ac_cmdbuf_emit(count - 1);
|
|
ac_cmdbuf_end();
|
|
}
|