From e945bb3649543bfbcd2e683e308acb989d50b5e8 Mon Sep 17 00:00:00 2001 From: David Rosca Date: Tue, 19 Aug 2025 14:17:06 +0200 Subject: [PATCH] radeonsi/vcn: Fix compatibility with old FW for encode The interface version can't be higher than the FW version, otherwise FW will reject all encode jobs. Cc: mesa-stable Reviewed-by: Ruijing Dong Part-of: --- src/gallium/drivers/radeonsi/radeon_vcn_enc_1_2.c | 8 +++++++- src/gallium/drivers/radeonsi/radeon_vcn_enc_2_0.c | 8 +++++++- src/gallium/drivers/radeonsi/radeon_vcn_enc_3_0.c | 8 +++++++- src/gallium/drivers/radeonsi/radeon_vcn_enc_4_0.c | 8 +++++++- src/gallium/drivers/radeonsi/radeon_vcn_enc_5_0.c | 8 +++++++- 5 files changed, 35 insertions(+), 5 deletions(-) diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_enc_1_2.c b/src/gallium/drivers/radeonsi/radeon_vcn_enc_1_2.c index 02a35790011..787fb35fcf6 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_enc_1_2.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_enc_1_2.c @@ -1260,6 +1260,9 @@ static void destroy(struct radeon_encoder *enc) void radeon_enc_1_2_init(struct radeon_encoder *enc) { + struct si_screen *sscreen = (struct si_screen *)enc->screen; + uint32_t minor_version; + enc->before_encode = radeon_enc_dummy; enc->begin = begin; enc->encode = encode; @@ -1307,7 +1310,10 @@ void radeon_enc_1_2_init(struct radeon_encoder *enc) enc->encode_params_codec_spec = radeon_enc_dummy; } + minor_version = + MIN2(sscreen->info.vcn_enc_minor_version, RENCODE_FW_INTERFACE_MINOR_VERSION); + enc->enc_pic.session_info.interface_version = ((RENCODE_FW_INTERFACE_MAJOR_VERSION << RENCODE_IF_MAJOR_VERSION_SHIFT) | - (RENCODE_FW_INTERFACE_MINOR_VERSION << RENCODE_IF_MINOR_VERSION_SHIFT)); + (minor_version << RENCODE_IF_MINOR_VERSION_SHIFT)); } diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_enc_2_0.c b/src/gallium/drivers/radeonsi/radeon_vcn_enc_2_0.c index 1414c8992c1..ba9ebde37ae 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_enc_2_0.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_enc_2_0.c @@ -190,6 +190,9 @@ static void encode(struct radeon_encoder *enc) void radeon_enc_2_0_init(struct radeon_encoder *enc) { + struct si_screen *sscreen = (struct si_screen *)enc->screen; + uint32_t minor_version; + radeon_enc_1_2_init(enc); enc->encode = encode; enc->input_format = radeon_enc_input_format; @@ -205,7 +208,10 @@ void radeon_enc_2_0_init(struct radeon_encoder *enc) enc->spec_misc = radeon_enc_spec_misc_hevc; } + minor_version = + MIN2(sscreen->info.vcn_enc_minor_version, RENCODE_FW_INTERFACE_MINOR_VERSION); + enc->enc_pic.session_info.interface_version = ((RENCODE_FW_INTERFACE_MAJOR_VERSION << RENCODE_IF_MAJOR_VERSION_SHIFT) | - (RENCODE_FW_INTERFACE_MINOR_VERSION << RENCODE_IF_MINOR_VERSION_SHIFT)); + (minor_version << RENCODE_IF_MINOR_VERSION_SHIFT)); } diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_enc_3_0.c b/src/gallium/drivers/radeonsi/radeon_vcn_enc_3_0.c index b9af7bc7538..f46822b062e 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_enc_3_0.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_enc_3_0.c @@ -182,6 +182,9 @@ static void radeon_enc_session_init(struct radeon_encoder *enc) void radeon_enc_3_0_init(struct radeon_encoder *enc) { + struct si_screen *sscreen = (struct si_screen *)enc->screen; + uint32_t minor_version; + radeon_enc_2_0_init(enc); enc->session_info = radeon_enc_session_info; @@ -200,7 +203,10 @@ void radeon_enc_3_0_init(struct radeon_encoder *enc) enc->spec_misc = radeon_enc_spec_misc_hevc; } + minor_version = + MIN2(sscreen->info.vcn_enc_minor_version, RENCODE_FW_INTERFACE_MINOR_VERSION); + enc->enc_pic.session_info.interface_version = ((RENCODE_FW_INTERFACE_MAJOR_VERSION << RENCODE_IF_MAJOR_VERSION_SHIFT) | - (RENCODE_FW_INTERFACE_MINOR_VERSION << RENCODE_IF_MINOR_VERSION_SHIFT)); + (minor_version << RENCODE_IF_MINOR_VERSION_SHIFT)); } diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_enc_4_0.c b/src/gallium/drivers/radeonsi/radeon_vcn_enc_4_0.c index f8da40c665a..58baa06bc19 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_enc_4_0.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_enc_4_0.c @@ -718,6 +718,9 @@ static void radeon_enc_header_av1(struct radeon_encoder *enc) void radeon_enc_4_0_init(struct radeon_encoder *enc) { + struct si_screen *sscreen = (struct si_screen *)enc->screen; + uint32_t minor_version; + radeon_enc_3_0_init(enc); enc->session_init = radeon_enc_session_init; @@ -743,7 +746,10 @@ void radeon_enc_4_0_init(struct radeon_encoder *enc) enc->encode_params = radeon_enc_av1_encode_params; } + minor_version = + MIN2(sscreen->info.vcn_enc_minor_version, RENCODE_FW_INTERFACE_MINOR_VERSION); + enc->enc_pic.session_info.interface_version = ((RENCODE_FW_INTERFACE_MAJOR_VERSION << RENCODE_IF_MAJOR_VERSION_SHIFT) | - (RENCODE_FW_INTERFACE_MINOR_VERSION << RENCODE_IF_MINOR_VERSION_SHIFT)); + (minor_version << RENCODE_IF_MINOR_VERSION_SHIFT)); } diff --git a/src/gallium/drivers/radeonsi/radeon_vcn_enc_5_0.c b/src/gallium/drivers/radeonsi/radeon_vcn_enc_5_0.c index 8d31a025e6d..fe760c9fb11 100644 --- a/src/gallium/drivers/radeonsi/radeon_vcn_enc_5_0.c +++ b/src/gallium/drivers/radeonsi/radeon_vcn_enc_5_0.c @@ -947,6 +947,9 @@ static void radeon_enc_session_init(struct radeon_encoder *enc) void radeon_enc_5_0_init(struct radeon_encoder *enc) { + struct si_screen *sscreen = (struct si_screen *)enc->screen; + uint32_t minor_version; + radeon_enc_4_0_init(enc); enc->session_init = radeon_enc_session_init; @@ -977,7 +980,10 @@ void radeon_enc_5_0_init(struct radeon_encoder *enc) enc->encode_params_codec_spec = radeon_enc_encode_params_av1; } + minor_version = + MIN2(sscreen->info.vcn_enc_minor_version, RENCODE_FW_INTERFACE_MINOR_VERSION); + enc->enc_pic.session_info.interface_version = ((RENCODE_FW_INTERFACE_MAJOR_VERSION << RENCODE_IF_MAJOR_VERSION_SHIFT) | - (RENCODE_FW_INTERFACE_MINOR_VERSION << RENCODE_IF_MINOR_VERSION_SHIFT)); + (minor_version << RENCODE_IF_MINOR_VERSION_SHIFT)); }