FAILED: patch "[PATCH] drm/amd/display: fix BT.2020 YCbCr limited output CSC matrix" failed to apply to 6.6-stable tree
[email protected]
maintainerThe patch below does not apply to the 6.6-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-6.6.y
git checkout FETCH_HEAD
git cherry-pick -x 2f9a5c0f018d4a1586ee892f81f1383219676415
# <resolve conflicts, build, test, etc.>
git commit -s
git send-email --to '<[email protected]>' --in-reply-to '2026082006-fable-army-ffc8@gregkh' --subject-prefix 'PATCH 6.6.y' 'HEAD^..'
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 2f9a5c0f018d4a1586ee892f81f1383219676415 Mon Sep 17 00:00:00 2001
From: Nathan Lucas <[email protected]>
Date: Sun, 2 Aug 2026 08:35:23 -0600
Subject: [PATCH] drm/amd/display: fix BT.2020 YCbCr limited output CSC matrix
COLOR_SPACE_YCBCR2020_TYPE, which is selected for COLOR_SPACE_2020_YCBCR_LIMITED color_space, has coefficients that are incorrect for limited-range output. Its luma and chroma scaling is full-range so output is too bright and colors are incorrect.
COLOR_SPACE_YCBCR2020_TYPE is closer to a full-range conversion matrix with incorrect luma offset, so correct the luma offset for full-range and rename it to COLOR_SPACE_YCBCR2020_FULL_TYPE.
Add COLOR_SPACE_YCBCR2020_LIMITED_TYPE with correct scaling and range for limited-range output.
Fix related functions so COLOR_SPACE_YCBCR2020_LIMITED_TYPE and COLOR_SPACE_YCBCR2020_FULL_TYPE are correctly selected based on dc_color_space.
Derivation of both matrices follows ITU-T H.273:
Table 4, MatrixCoefficients 9, BT.2020-NCL weights:
KR = 0.2627, KB = 0.0593, KG = 1 - KR - KB = 0.6780.
Equations 45-47 in matrix form:
[ KR KG KB 0 ]
M2020_NCL = [ -KR/(2(1-KB)) -KG/(2(1-KB)) 1/2 0 ]
[ 1/2 -KG/(2(1-KR)) -KB/(2(1-KR)) 0 ]
[ 0 0 0 1 ]Limited and Full transforms based on equations 30-32 and 36-38 with bit depth 10, normalized by 1023:
[ 876/1023 0 0 64/1023 ]
MLimited = [ 0 896/1023 0 512/1023 ]
[ 0 0 896/1023 512/1023 ]
[ 0 0 0 1 ] [ 1023/1023 0 0 0 ]
MFull = [ 0 1023/1023 0 512/1023 ]
[ 0 0 1023/1023 512/1023 ]
[ 0 0 0 1 ]M2020_NCL_Limited = MLimited x M2020_NCLM2020_NCL_Full = MFull x M2020_NCL
The upper three rows of M2020_NCL_* are stored in CR, Y, CB order. Each M2020_NCL_* value is stored as Round(value * 8192) in its 16-bit two's-complement representation.
drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c +20 -11
@@ -58,7 +58,8 @@ enum dc_color_space_type {COLOR_SPACE_RGB_LIMITED_TYPE ,COLOR_SPACE_YCBCR601_TYPE ,COLOR_SPACE_YCBCR709_TYPE , -COLOR_SPACE_YCBCR2020_TYPE , +COLOR_SPACE_YCBCR2020_LIMITED_TYPE , +COLOR_SPACE_YCBCR2020_FULL_TYPE ,COLOR_SPACE_YCBCR601_LIMITED_TYPE ,COLOR_SPACE_YCBCR709_LIMITED_TYPE , COLOR_SPACE_YCBCR709_BLACK_TYPE,
@@ -110,9 +111,15 @@ static const struct out_csc_color_matrix_type output_csc_matrix[] = { {0xE00 ,0xF349 ,0xFEB7 ,0x1000 ,0x6CE ,0x16E3 ,0x24F ,0x200 , 0xFCCB, 0xF535, 0xE00, 0x1000} }, - { COLOR_SPACE_YCBCR2020_TYPE, +/* Corrected. Not included in the TODO above. */ + { COLOR_SPACE_YCBCR2020_LIMITED_TYPE, + { 0x0E04, 0xF31D, 0xFEDF, 0x1004, +0x0733 ,0x1294 ,0x01A0 ,0x0201 , + 0xFC16, 0xF5E6, 0x0E04, 0x1004} }, +/* Corrected. Not included in the TODO above. */ + { COLOR_SPACE_YCBCR2020_FULL_TYPE, { 0x1000, 0xF149, 0xFEB7, 0x1004, -0x0868 ,0x15B2 ,0x01E6 ,0x201 , +0x0868 ,0x15B2 ,0x01E6 ,0 , 0xFB88, 0xF478, 0x1000, 0x1004} }, { COLOR_SPACE_YCBCR709_BLACK_TYPE, { 0x0000, 0x0000, 0x0000, 0x1000,
@@ -179,14 +186,14 @@ static bool is_ycbcr709_type(return ret; } -static bool is_ycbcr2020_type ( -enum dc_color_space color_space) +static bool is_ycbcr2020_limited_type (enum dc_color_space color_space) { -bool ret = false; +return color_space ==COLOR_SPACE_2020_YCBCR_LIMITED ; +} -if (color_space ==COLOR_SPACE_2020_YCBCR_LIMITED || color_space ==COLOR_SPACE_2020_YCBCR_FULL ) - ret = true; -return ret; +static bool is_ycbcr2020_full_type (enum dc_color_space color_space) +{ +return color_space ==COLOR_SPACE_2020_YCBCR_FULL ; } static bool is_ycbcr709_limited_type(
@@ -215,8 +222,10 @@ static enum dc_color_space_type get_color_space_type(enum dc_color_space color_s type =COLOR_SPACE_YCBCR601_LIMITED_TYPE ; else if (is_ycbcr709_limited_type(color_space)) type =COLOR_SPACE_YCBCR709_LIMITED_TYPE ; - else if (is_ycbcr2020_type(color_space)) - type =COLOR_SPACE_YCBCR2020_TYPE ; + else if (is_ycbcr2020_limited_type(color_space)) + type =COLOR_SPACE_YCBCR2020_LIMITED_TYPE ; + else if (is_ycbcr2020_full_type(color_space)) + type =COLOR_SPACE_YCBCR2020_FULL_TYPE ; else if (color_space == COLOR_SPACE_YCBCR709) type =COLOR_SPACE_YCBCR709_BLACK_TYPE ; else if (color_space == COLOR_SPACE_YCBCR709_BLACK)
Sasha Levin
maintainerPATCH 1/2 drm/amd/display: Fix BT2020 YCbCr limited/full range input
From: Ilya Bakoulin <[email protected]>
[ Upstream commit 07bc2dcbcf403d47d6f305ef7f0d3d489491c5fb ]
[Why]
BT2020 YCbCr input is not handled properly when full range quantization is used and limited range is not supported at all.
[How]
- Add enums for BT2020 YCbCr limited/full range
- Add limited range CSC matrix
Stable-dep-of: 2f9a5c0f018d ("drm/amd/display: fix BT.2020 YCbCr limited output CSC matrix")
--- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 6 +++--- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c | 2 +- drivers/gpu/drm/amd/display/dc/basics/dc_common.c | 3 ++- drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c | 5 +++-- drivers/gpu/drm/amd/display/dc/core/dc_resource.c | 4 ++-- drivers/gpu/drm/amd/display/dc/dc_hw_types.h | 4 +++- drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c | 3 ++- drivers/gpu/drm/amd/display/dc/dcn10/dcn10_stream_encoder.c | 3 ++- .../drm/amd/display/dc/dcn31/dcn31_hpo_dp_stream_encoder.c | 3 ++- drivers/gpu/drm/amd/display/dc/inc/hw/dpp.h | 6 +++++- .../gpu/drm/amd/display/modules/info_packet/info_packet.c | 4 ++-- 11 files changed, 27 insertions(+), 16 deletions(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +3 -3
@@ -4937,9 +4937,9 @@ fill_plane_color_attributes(const struct drm_plane_state *plane_state,case DRM_COLOR_YCBCR_BT2020 :if (full_range) - *color_space =COLOR_SPACE_2020_YCBCR ; + *color_space =COLOR_SPACE_2020_YCBCR_FULL ;else -return -EINVAL ; + *color_space =COLOR_SPACE_2020_YCBCR_LIMITED ;break ;default :
@@ -5430,7 +5430,7 @@ get_output_color_space(const struct dc_crtc_timing *dc_crtc_timing,if (dc_crtc_timing->pixel_encoding ==PIXEL_ENCODING_RGB ) color_space =COLOR_SPACE_2020_RGB_FULLRANGE ;else - color_space =COLOR_SPACE_2020_YCBCR ; + color_space =COLOR_SPACE_2020_YCBCR_LIMITED ;break ;case DRM_MODE_COLORIMETRY_DEFAULT :// ITU601 default :
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c +1 -1
@@ -1091,7 +1091,7 @@ static int amdgpu_current_colorspace_show(struct seq_file *m, void *data)case COLOR_SPACE_2020_RGB_FULLRANGE :seq_puts (m,"BT2020_RGB" );break ; -case COLOR_SPACE_2020_YCBCR : +case COLOR_SPACE_2020_YCBCR_LIMITED :seq_puts (m,"BT2020_YCC" );break ;default :
drivers/gpu/drm/amd/display/dc/basics/dc_common.c +2 -1
@@ -40,7 +40,8 @@ bool is_rgb_cspace(enum dc_color_space output_color_space)case COLOR_SPACE_YCBCR709 :case COLOR_SPACE_YCBCR601_LIMITED :case COLOR_SPACE_YCBCR709_LIMITED : -case COLOR_SPACE_2020_YCBCR : +case COLOR_SPACE_2020_YCBCR_LIMITED : +case COLOR_SPACE_2020_YCBCR_FULL :return false;default :/* Add a case to switch */
drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c +3 -2
@@ -173,7 +173,7 @@ static bool is_ycbcr2020_type( {bool ret = false; -if (color_space ==COLOR_SPACE_2020_YCBCR ) +if (color_space ==COLOR_SPACE_2020_YCBCR_LIMITED || color_space ==COLOR_SPACE_2020_YCBCR_FULL ) ret = true;return ret; }
@@ -244,7 +244,8 @@ void color_space_to_black_color(case COLOR_SPACE_YCBCR709_BLACK :case COLOR_SPACE_YCBCR601_LIMITED :case COLOR_SPACE_YCBCR709_LIMITED : -case COLOR_SPACE_2020_YCBCR : +case COLOR_SPACE_2020_YCBCR_LIMITED : +case COLOR_SPACE_2020_YCBCR_FULL : *black_color = black_color_format[BLACK_COLOR_FORMAT_YUV_CV ];break ;
drivers/gpu/drm/amd/display/dc/core/dc_resource.c +2 -2
@@ -3296,7 +3296,7 @@ static void set_avi_info_frame(break ;case COLOR_SPACE_2020_RGB_FULLRANGE :case COLOR_SPACE_2020_RGB_LIMITEDRANGE : -case COLOR_SPACE_2020_YCBCR : +case COLOR_SPACE_2020_YCBCR_LIMITED : hdmi_info.bits.EC0_EC2 =COLORIMETRYEX_BT2020RGBYCBCR ; hdmi_info.bits.C0_C1 =COLORIMETRY_EXTENDED ;break ;
@@ -3310,7 +3310,7 @@ static void set_avi_info_frame(break ; } -if (pixel_encoding && color_space ==COLOR_SPACE_2020_YCBCR && +if (pixel_encoding && color_space ==COLOR_SPACE_2020_YCBCR_LIMITED && stream->out_transfer_func->tf ==TRANSFER_FUNCTION_GAMMA22 ) { hdmi_info.bits.EC0_EC2 =0 ; hdmi_info.bits.C0_C1 =COLORIMETRY_ITU709 ;
drivers/gpu/drm/amd/display/dc/dc_hw_types.h +3 -1
@@ -616,7 +616,8 @@ enum dc_color_space {COLOR_SPACE_YCBCR709_LIMITED ,COLOR_SPACE_2020_RGB_FULLRANGE ,COLOR_SPACE_2020_RGB_LIMITEDRANGE , -COLOR_SPACE_2020_YCBCR , +COLOR_SPACE_2020_YCBCR_LIMITED , +COLOR_SPACE_2020_YCBCR_FULL ,COLOR_SPACE_ADOBERGB ,COLOR_SPACE_DCIP3 , COLOR_SPACE_DISPLAYNATIVE,
@@ -624,6 +625,7 @@ enum dc_color_space {COLOR_SPACE_APPCTRL ,COLOR_SPACE_CUSTOMPOINTS ,COLOR_SPACE_YCBCR709_BLACK , + COLOR_SPACE_2020_YCBCR = COLOR_SPACE_2020_YCBCR_LIMITED, }; enum dc_dither_option {
drivers/gpu/drm/amd/display/dc/dce/dce_stream_encoder.c +2 -1
@@ -420,7 +420,7 @@ static void dce110_stream_encoder_dp_set_stream_attribute( dynamic_range_rgb =1 ;/*limited range*/ break ;case COLOR_SPACE_2020_RGB_FULLRANGE : -case COLOR_SPACE_2020_YCBCR : +case COLOR_SPACE_2020_YCBCR_LIMITED :case COLOR_SPACE_XR_RGB :case COLOR_SPACE_MSREF_SCRGB :case COLOR_SPACE_ADOBERGB :
@@ -432,6 +432,7 @@ static void dce110_stream_encoder_dp_set_stream_attribute(case COLOR_SPACE_APPCTRL :case COLOR_SPACE_CUSTOMPOINTS :case COLOR_SPACE_UNKNOWN : +default :/* do nothing */ break ; }
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_stream_encoder.c +2 -1
@@ -393,7 +393,7 @@ void enc1_stream_encoder_dp_set_stream_attribute(break ;case COLOR_SPACE_2020_RGB_LIMITEDRANGE :case COLOR_SPACE_2020_RGB_FULLRANGE : -case COLOR_SPACE_2020_YCBCR : +case COLOR_SPACE_2020_YCBCR_LIMITED :case COLOR_SPACE_XR_RGB :case COLOR_SPACE_MSREF_SCRGB :case COLOR_SPACE_ADOBERGB :
@@ -406,6 +406,7 @@ void enc1_stream_encoder_dp_set_stream_attribute(case COLOR_SPACE_CUSTOMPOINTS :case COLOR_SPACE_UNKNOWN :case COLOR_SPACE_YCBCR709_BLACK : +default :/* do nothing */ break ; }
drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hpo_dp_stream_encoder.c +2 -1
@@ -323,7 +323,7 @@ static void dcn31_hpo_dp_stream_enc_set_stream_attribute(break ;case COLOR_SPACE_2020_RGB_LIMITEDRANGE :case COLOR_SPACE_2020_RGB_FULLRANGE : -case COLOR_SPACE_2020_YCBCR : +case COLOR_SPACE_2020_YCBCR_LIMITED :case COLOR_SPACE_XR_RGB :case COLOR_SPACE_MSREF_SCRGB :case COLOR_SPACE_ADOBERGB :
@@ -336,6 +336,7 @@ static void dcn31_hpo_dp_stream_enc_set_stream_attribute(case COLOR_SPACE_CUSTOMPOINTS :case COLOR_SPACE_UNKNOWN :case COLOR_SPACE_YCBCR709_BLACK : +default :/* do nothing */ break ; }
drivers/gpu/drm/amd/display/dc/inc/hw/dpp.h +5 -1
@@ -94,10 +94,14 @@ static const struct dpp_input_csc_matrix __maybe_unused dpp_input_csc_matrix[] = {0x39a6 ,0x2568 ,0 ,0xe0d6 ,0xeedd ,0x2568 ,0xf925 ,0x9a8 , 0, 0x2568, 0x43ee, 0xdbb2 } }, - { COLOR_SPACE_2020_YCBCR, + { COLOR_SPACE_2020_YCBCR_FULL, { 0x2F30, 0x2000, 0, 0xE869,0xEDB7 ,0x2000 ,0xFABC ,0xBC6 , 0, 0x2000, 0x3C34, 0xE1E6 } }, + { COLOR_SPACE_2020_YCBCR_LIMITED, + { 0x35B9, 0x2543, 0, 0xE2B2, +0xEB2F ,0x2543 ,0xFA01 ,0x0B1F , + 0, 0x2543, 0x4489, 0xDB42 } }, { COLOR_SPACE_2020_RGB_LIMITEDRANGE, { 0x35E0, 0x255F, 0, 0xE2B3, 0xEB20, 0x255F, 0xF9FD, 0xB1E,
drivers/gpu/drm/amd/display/modules/info_packet/info_packet.c +2 -2
@@ -383,10 +383,10 @@ void mod_build_vsc_infopacket(const struct dc_stream_state *stream, colorimetryFormat = ColorimetryYCC_DP_ITU709; else if (cs == COLOR_SPACE_ADOBERGB) colorimetryFormat = ColorimetryYCC_DP_AdobeYCC; - else if (cs == COLOR_SPACE_2020_YCBCR) + else if (cs == COLOR_SPACE_2020_YCBCR_LIMITED) colorimetryFormat = ColorimetryYCC_DP_ITU2020YCbCr; -if (cs ==COLOR_SPACE_2020_YCBCR && tf ==TRANSFER_FUNC_GAMMA_22 ) +if (cs ==COLOR_SPACE_2020_YCBCR_LIMITED && tf ==TRANSFER_FUNC_GAMMA_22 ) colorimetryFormat = ColorimetryYCC_DP_ITU709;break ;
Signature · 1 line
2.53.0
Sasha Levin
maintainerPATCH 2/2 drm/amd/display: fix BT.2020 YCbCr limited output CSC matrix
From: Nathan Lucas <[email protected]>
[ Upstream commit 2f9a5c0f018d4a1586ee892f81f1383219676415 ]
COLOR_SPACE_YCBCR2020_TYPE, which is selected for COLOR_SPACE_2020_YCBCR_LIMITED color_space, has coefficients that are incorrect for limited-range output. Its luma and chroma scaling is full-range so output is too bright and colors are incorrect.
COLOR_SPACE_YCBCR2020_TYPE is closer to a full-range conversion matrix with incorrect luma offset, so correct the luma offset for full-range and rename it to COLOR_SPACE_YCBCR2020_FULL_TYPE.
Add COLOR_SPACE_YCBCR2020_LIMITED_TYPE with correct scaling and range for limited-range output.
Fix related functions so COLOR_SPACE_YCBCR2020_LIMITED_TYPE and COLOR_SPACE_YCBCR2020_FULL_TYPE are correctly selected based on dc_color_space.
Derivation of both matrices follows ITU-T H.273:
Table 4, MatrixCoefficients 9, BT.2020-NCL weights:
KR = 0.2627, KB = 0.0593, KG = 1 - KR - KB = 0.6780.
Equations 45-47 in matrix form:
[ KR KG KB 0 ]
M2020_NCL = [ -KR/(2(1-KB)) -KG/(2(1-KB)) 1/2 0 ]
[ 1/2 -KG/(2(1-KR)) -KB/(2(1-KR)) 0 ]
[ 0 0 0 1 ]Limited and Full transforms based on equations 30-32 and 36-38 with bit depth 10, normalized by 1023:
[ 876/1023 0 0 64/1023 ]
MLimited = [ 0 896/1023 0 512/1023 ]
[ 0 0 896/1023 512/1023 ]
[ 0 0 0 1 ] [ 1023/1023 0 0 0 ]
MFull = [ 0 1023/1023 0 512/1023 ]
[ 0 0 1023/1023 512/1023 ]
[ 0 0 0 1 ]M2020_NCL_Limited = MLimited x M2020_NCLM2020_NCL_Full = MFull x M2020_NCL
The upper three rows of M2020_NCL_* are stored in CR, Y, CB order. Each M2020_NCL_* value is stored as Round(value * 8192) in its 16-bit two's-complement representation.
--- .../drm/amd/display/dc/core/dc_hw_sequencer.c | 31 ++++++++++++------- 1 file changed, 20 insertions(+), 11 deletions(-)
drivers/gpu/drm/amd/display/dc/core/dc_hw_sequencer.c +20 -11
@@ -47,7 +47,8 @@ enum dc_color_space_type {COLOR_SPACE_RGB_LIMITED_TYPE ,COLOR_SPACE_YCBCR601_TYPE ,COLOR_SPACE_YCBCR709_TYPE , -COLOR_SPACE_YCBCR2020_TYPE , +COLOR_SPACE_YCBCR2020_LIMITED_TYPE , +COLOR_SPACE_YCBCR2020_FULL_TYPE ,COLOR_SPACE_YCBCR601_LIMITED_TYPE ,COLOR_SPACE_YCBCR709_LIMITED_TYPE , COLOR_SPACE_YCBCR709_BLACK_TYPE,
@@ -99,9 +100,15 @@ static const struct out_csc_color_matrix_type output_csc_matrix[] = { {0xE00 ,0xF349 ,0xFEB7 ,0x1000 ,0x6CE ,0x16E3 ,0x24F ,0x200 , 0xFCCB, 0xF535, 0xE00, 0x1000} }, - { COLOR_SPACE_YCBCR2020_TYPE, +/* Corrected. Not included in the TODO above. */ + { COLOR_SPACE_YCBCR2020_LIMITED_TYPE, + { 0x0E04, 0xF31D, 0xFEDF, 0x1004, +0x0733 ,0x1294 ,0x01A0 ,0x0201 , + 0xFC16, 0xF5E6, 0x0E04, 0x1004} }, +/* Corrected. Not included in the TODO above. */ + { COLOR_SPACE_YCBCR2020_FULL_TYPE, { 0x1000, 0xF149, 0xFEB7, 0x1004, -0x0868 ,0x15B2 ,0x01E6 ,0x201 , +0x0868 ,0x15B2 ,0x01E6 ,0 , 0xFB88, 0xF478, 0x1000, 0x1004} }, { COLOR_SPACE_YCBCR709_BLACK_TYPE, { 0x0000, 0x0000, 0x0000, 0x1000,
@@ -168,14 +175,14 @@ static bool is_ycbcr709_type(return ret; } -static bool is_ycbcr2020_type ( -enum dc_color_space color_space) +static bool is_ycbcr2020_limited_type (enum dc_color_space color_space) { -bool ret = false; +return color_space ==COLOR_SPACE_2020_YCBCR_LIMITED ; +} -if (color_space ==COLOR_SPACE_2020_YCBCR_LIMITED || color_space ==COLOR_SPACE_2020_YCBCR_FULL ) - ret = true; -return ret; +static bool is_ycbcr2020_full_type (enum dc_color_space color_space) +{ +return color_space ==COLOR_SPACE_2020_YCBCR_FULL ; } static bool is_ycbcr709_limited_type(
@@ -204,8 +211,10 @@ static enum dc_color_space_type get_color_space_type(enum dc_color_space color_s type =COLOR_SPACE_YCBCR601_LIMITED_TYPE ; else if (is_ycbcr709_limited_type(color_space)) type =COLOR_SPACE_YCBCR709_LIMITED_TYPE ; - else if (is_ycbcr2020_type(color_space)) - type =COLOR_SPACE_YCBCR2020_TYPE ; + else if (is_ycbcr2020_limited_type(color_space)) + type =COLOR_SPACE_YCBCR2020_LIMITED_TYPE ; + else if (is_ycbcr2020_full_type(color_space)) + type =COLOR_SPACE_YCBCR2020_FULL_TYPE ; else if (color_space == COLOR_SPACE_YCBCR709) type =COLOR_SPACE_YCBCR709_BLACK_TYPE ; else if (color_space == COLOR_SPACE_YCBCR709_BLACK)
Signature · 1 line
2.53.0