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 <ruijing.dong@amd.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/36845>
This commit is contained in:
David Rosca 2025-08-19 14:17:06 +02:00 committed by Marge Bot
parent 51d5c0d537
commit e945bb3649
5 changed files with 35 additions and 5 deletions

View file

@ -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));
}

View file

@ -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));
}

View file

@ -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));
}

View file

@ -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));
}

View file

@ -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));
}