diff --git a/src/amd/common/ac_vcn.c b/src/amd/common/ac_vcn.c new file mode 100644 index 00000000000..07ea9bef002 --- /dev/null +++ b/src/amd/common/ac_vcn.c @@ -0,0 +1,31 @@ +/* + * Copyright 2026 Advanced Micro Devices, Inc. + * + * SPDX-License-Identifier: MIT + */ + +#include "ac_vcn.h" +#include "ac_cmdbuf.h" + +void +ac_vcn_sq_header(struct ac_cmdbuf *cs, struct rvcn_sq_var *sq, unsigned type) +{ + ac_cmdbuf_begin(cs); + ac_cmdbuf_emit(RADEON_VCN_ENGINE_INFO_SIZE); + ac_cmdbuf_emit(RADEON_VCN_ENGINE_INFO); + ac_cmdbuf_emit(type); + ac_cmdbuf_emit(0); + ac_cmdbuf_end(); + + sq->engine_ib_size_of_packages = &cs->buf[cs->cdw - 1]; +} + +void +ac_vcn_sq_tail(struct ac_cmdbuf *cs, struct rvcn_sq_var *sq) +{ + uint32_t *end = &cs->buf[cs->cdw]; + uint32_t size_in_dw = end - sq->engine_ib_size_of_packages + 3; + + assert(cs->cdw <= cs->max_dw); + *sq->engine_ib_size_of_packages = size_in_dw * sizeof(uint32_t); +} diff --git a/src/amd/common/ac_vcn.h b/src/amd/common/ac_vcn.h index 3b35d6ffd35..a5ba4d812a1 100644 --- a/src/amd/common/ac_vcn.h +++ b/src/amd/common/ac_vcn.h @@ -41,6 +41,8 @@ #define RADEON_VCN_RESOLVE_INPUT_PARAM_LAYOUT_TYPE_QPMAP_INT8 1 #define RADEON_VCN_RESOLVE_INPUT_PARAM_LAYOUT_TYPE_QPMAP_INT16 2 +struct ac_cmdbuf; + struct rvcn_sq_var { unsigned int *engine_ib_size_of_packages; }; @@ -68,4 +70,7 @@ struct rvcn_cmn_engine_op_resolveinputparamlayout { unsigned int output_buffer_address_hi; /* High address of output buffer */ }; +void ac_vcn_sq_header(struct ac_cmdbuf *cs, struct rvcn_sq_var *sq, unsigned type); +void ac_vcn_sq_tail(struct ac_cmdbuf *cs, struct rvcn_sq_var *sq); + #endif diff --git a/src/amd/common/ac_vcn_dec.c b/src/amd/common/ac_vcn_dec.c index 13daba412b0..50dd3bd6b04 100644 --- a/src/amd/common/ac_vcn_dec.c +++ b/src/amd/common/ac_vcn_dec.c @@ -929,29 +929,6 @@ stream_type(enum ac_video_codec codec) } } -static void -sq_header(struct ac_cmdbuf *cs, struct rvcn_sq_var *sq) -{ - ac_cmdbuf_begin(cs); - ac_cmdbuf_emit(RADEON_VCN_ENGINE_INFO_SIZE); - ac_cmdbuf_emit(RADEON_VCN_ENGINE_INFO); - ac_cmdbuf_emit(RADEON_VCN_ENGINE_TYPE_DECODE); - ac_cmdbuf_emit(0); - ac_cmdbuf_end(); - - sq->engine_ib_size_of_packages = &cs->buf[cs->cdw - 1]; -} - -static void -sq_tail(struct ac_cmdbuf *cs, struct rvcn_sq_var *sq) -{ - uint32_t *end = &cs->buf[cs->cdw]; - uint32_t size_in_dw = end - sq->engine_ib_size_of_packages + 3; - - assert(cs->cdw <= cs->max_dw); - *sq->engine_ib_size_of_packages = size_in_dw * sizeof(uint32_t); -} - static void send_cmd(struct cmd_buffer *cmd_buf, uint32_t cmd, uint64_t va) { @@ -1086,7 +1063,7 @@ vcn_build_create_cmd(struct ac_video_dec *decoder, struct ac_video_dec_create_cm }; if (decoder->ip_type == AMD_IP_VCN_UNIFIED) { - sq_header(&cmd_buf.cs, &cmd_buf.sq); + ac_vcn_sq_header(&cmd_buf.cs, &cmd_buf.sq, RADEON_VCN_ENGINE_TYPE_DECODE); cmd_buf.decode_buffer = add_ib_decode_buffer(&cmd_buf.cs); } @@ -1095,7 +1072,7 @@ vcn_build_create_cmd(struct ac_video_dec *decoder, struct ac_video_dec_create_cm if (decoder->ip_type == AMD_IP_VCN_UNIFIED) { cmd_buf.decode_buffer->valid_buf_flag = cmd_buf.decode_buffer_flags; - sq_tail(&cmd_buf.cs, &cmd_buf.sq); + ac_vcn_sq_tail(&cmd_buf.cs, &cmd_buf.sq); } cmd->out.cmd_dw = cmd_buf.cs.cdw; @@ -1951,7 +1928,7 @@ vcn_build_decode_cmd(struct ac_video_dec *decoder, struct ac_video_dec_decode_cm }; if (decoder->ip_type == AMD_IP_VCN_UNIFIED) { - sq_header(&cmd_buf.cs, &cmd_buf.sq); + ac_vcn_sq_header(&cmd_buf.cs, &cmd_buf.sq, RADEON_VCN_ENGINE_TYPE_DECODE); cmd_buf.decode_buffer = add_ib_decode_buffer(&cmd_buf.cs); } @@ -2183,7 +2160,7 @@ vcn_build_decode_cmd(struct ac_video_dec *decoder, struct ac_video_dec_decode_cm if (decoder->ip_type == AMD_IP_VCN_UNIFIED) { cmd_buf.decode_buffer->valid_buf_flag = cmd_buf.decode_buffer_flags; - sq_tail(&cmd_buf.cs, &cmd_buf.sq); + ac_vcn_sq_tail(&cmd_buf.cs, &cmd_buf.sq); } else { ac_cmdbuf_begin(&cmd_buf.cs); ac_cmdbuf_emit(RDECODE_PKT0(dec->reg.cntl >> 2, 0)); diff --git a/src/amd/common/meson.build b/src/amd/common/meson.build index 220a159c3d8..369705e88d0 100644 --- a/src/amd/common/meson.build +++ b/src/amd/common/meson.build @@ -141,6 +141,8 @@ amd_common_files = files( 'ac_perfcounter.h', 'ac_pm4.c', 'ac_pm4.h', + 'ac_vcn.c', + 'ac_vcn.h', 'ac_vcn_av1_default.h', 'ac_vcn_vp9_default.h', 'ac_vcn_dec.c',