162306a36Sopenharmony_ci// SPDX-License-Identifier: MIT
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright © 2018 Intel Corp
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Author:
662306a36Sopenharmony_ci * Manasi Navare <manasi.d.navare@intel.com>
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/kernel.h>
1062306a36Sopenharmony_ci#include <linux/module.h>
1162306a36Sopenharmony_ci#include <linux/init.h>
1262306a36Sopenharmony_ci#include <linux/errno.h>
1362306a36Sopenharmony_ci#include <linux/byteorder/generic.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#include <drm/display/drm_dp_helper.h>
1662306a36Sopenharmony_ci#include <drm/display/drm_dsc_helper.h>
1762306a36Sopenharmony_ci#include <drm/drm_print.h>
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci/**
2062306a36Sopenharmony_ci * DOC: dsc helpers
2162306a36Sopenharmony_ci *
2262306a36Sopenharmony_ci * VESA specification for DP 1.4 adds a new feature called Display Stream
2362306a36Sopenharmony_ci * Compression (DSC) used to compress the pixel bits before sending it on
2462306a36Sopenharmony_ci * DP/eDP/MIPI DSI interface. DSC is required to be enabled so that the existing
2562306a36Sopenharmony_ci * display interfaces can support high resolutions at higher frames rates uisng
2662306a36Sopenharmony_ci * the maximum available link capacity of these interfaces.
2762306a36Sopenharmony_ci *
2862306a36Sopenharmony_ci * These functions contain some common logic and helpers to deal with VESA
2962306a36Sopenharmony_ci * Display Stream Compression standard required for DSC on Display Port/eDP or
3062306a36Sopenharmony_ci * MIPI display interfaces.
3162306a36Sopenharmony_ci */
3262306a36Sopenharmony_ci
3362306a36Sopenharmony_ci/**
3462306a36Sopenharmony_ci * drm_dsc_dp_pps_header_init() - Initializes the PPS Header
3562306a36Sopenharmony_ci * for DisplayPort as per the DP 1.4 spec.
3662306a36Sopenharmony_ci * @pps_header: Secondary data packet header for DSC Picture
3762306a36Sopenharmony_ci *              Parameter Set as defined in &struct dp_sdp_header
3862306a36Sopenharmony_ci *
3962306a36Sopenharmony_ci * DP 1.4 spec defines the secondary data packet for sending the
4062306a36Sopenharmony_ci * picture parameter infoframes from the source to the sink.
4162306a36Sopenharmony_ci * This function populates the SDP header defined in
4262306a36Sopenharmony_ci * &struct dp_sdp_header.
4362306a36Sopenharmony_ci */
4462306a36Sopenharmony_civoid drm_dsc_dp_pps_header_init(struct dp_sdp_header *pps_header)
4562306a36Sopenharmony_ci{
4662306a36Sopenharmony_ci	memset(pps_header, 0, sizeof(*pps_header));
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci	pps_header->HB1 = DP_SDP_PPS;
4962306a36Sopenharmony_ci	pps_header->HB2 = DP_SDP_PPS_HEADER_PAYLOAD_BYTES_MINUS_1;
5062306a36Sopenharmony_ci}
5162306a36Sopenharmony_ciEXPORT_SYMBOL(drm_dsc_dp_pps_header_init);
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci/**
5462306a36Sopenharmony_ci * drm_dsc_dp_rc_buffer_size - get rc buffer size in bytes
5562306a36Sopenharmony_ci * @rc_buffer_block_size: block size code, according to DPCD offset 62h
5662306a36Sopenharmony_ci * @rc_buffer_size: number of blocks - 1, according to DPCD offset 63h
5762306a36Sopenharmony_ci *
5862306a36Sopenharmony_ci * return:
5962306a36Sopenharmony_ci * buffer size in bytes, or 0 on invalid input
6062306a36Sopenharmony_ci */
6162306a36Sopenharmony_ciint drm_dsc_dp_rc_buffer_size(u8 rc_buffer_block_size, u8 rc_buffer_size)
6262306a36Sopenharmony_ci{
6362306a36Sopenharmony_ci	int size = 1024 * (rc_buffer_size + 1);
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci	switch (rc_buffer_block_size) {
6662306a36Sopenharmony_ci	case DP_DSC_RC_BUF_BLK_SIZE_1:
6762306a36Sopenharmony_ci		return 1 * size;
6862306a36Sopenharmony_ci	case DP_DSC_RC_BUF_BLK_SIZE_4:
6962306a36Sopenharmony_ci		return 4 * size;
7062306a36Sopenharmony_ci	case DP_DSC_RC_BUF_BLK_SIZE_16:
7162306a36Sopenharmony_ci		return 16 * size;
7262306a36Sopenharmony_ci	case DP_DSC_RC_BUF_BLK_SIZE_64:
7362306a36Sopenharmony_ci		return 64 * size;
7462306a36Sopenharmony_ci	default:
7562306a36Sopenharmony_ci		return 0;
7662306a36Sopenharmony_ci	}
7762306a36Sopenharmony_ci}
7862306a36Sopenharmony_ciEXPORT_SYMBOL(drm_dsc_dp_rc_buffer_size);
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci/**
8162306a36Sopenharmony_ci * drm_dsc_pps_payload_pack() - Populates the DSC PPS
8262306a36Sopenharmony_ci *
8362306a36Sopenharmony_ci * @pps_payload:
8462306a36Sopenharmony_ci * Bitwise struct for DSC Picture Parameter Set. This is defined
8562306a36Sopenharmony_ci * by &struct drm_dsc_picture_parameter_set
8662306a36Sopenharmony_ci * @dsc_cfg:
8762306a36Sopenharmony_ci * DSC Configuration data filled by driver as defined by
8862306a36Sopenharmony_ci * &struct drm_dsc_config
8962306a36Sopenharmony_ci *
9062306a36Sopenharmony_ci * DSC source device sends a picture parameter set (PPS) containing the
9162306a36Sopenharmony_ci * information required by the sink to decode the compressed frame. Driver
9262306a36Sopenharmony_ci * populates the DSC PPS struct using the DSC configuration parameters in
9362306a36Sopenharmony_ci * the order expected by the DSC Display Sink device. For the DSC, the sink
9462306a36Sopenharmony_ci * device expects the PPS payload in big endian format for fields
9562306a36Sopenharmony_ci * that span more than 1 byte.
9662306a36Sopenharmony_ci */
9762306a36Sopenharmony_civoid drm_dsc_pps_payload_pack(struct drm_dsc_picture_parameter_set *pps_payload,
9862306a36Sopenharmony_ci				const struct drm_dsc_config *dsc_cfg)
9962306a36Sopenharmony_ci{
10062306a36Sopenharmony_ci	int i;
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci	/* Protect against someone accidentally changing struct size */
10362306a36Sopenharmony_ci	BUILD_BUG_ON(sizeof(*pps_payload) !=
10462306a36Sopenharmony_ci		     DP_SDP_PPS_HEADER_PAYLOAD_BYTES_MINUS_1 + 1);
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci	memset(pps_payload, 0, sizeof(*pps_payload));
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci	/* PPS 0 */
10962306a36Sopenharmony_ci	pps_payload->dsc_version =
11062306a36Sopenharmony_ci		dsc_cfg->dsc_version_minor |
11162306a36Sopenharmony_ci		dsc_cfg->dsc_version_major << DSC_PPS_VERSION_MAJOR_SHIFT;
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci	/* PPS 1, 2 is 0 */
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci	/* PPS 3 */
11662306a36Sopenharmony_ci	pps_payload->pps_3 =
11762306a36Sopenharmony_ci		dsc_cfg->line_buf_depth |
11862306a36Sopenharmony_ci		dsc_cfg->bits_per_component << DSC_PPS_BPC_SHIFT;
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci	/* PPS 4 */
12162306a36Sopenharmony_ci	pps_payload->pps_4 =
12262306a36Sopenharmony_ci		((dsc_cfg->bits_per_pixel & DSC_PPS_BPP_HIGH_MASK) >>
12362306a36Sopenharmony_ci		 DSC_PPS_MSB_SHIFT) |
12462306a36Sopenharmony_ci		dsc_cfg->vbr_enable << DSC_PPS_VBR_EN_SHIFT |
12562306a36Sopenharmony_ci		dsc_cfg->simple_422 << DSC_PPS_SIMPLE422_SHIFT |
12662306a36Sopenharmony_ci		dsc_cfg->convert_rgb << DSC_PPS_CONVERT_RGB_SHIFT |
12762306a36Sopenharmony_ci		dsc_cfg->block_pred_enable << DSC_PPS_BLOCK_PRED_EN_SHIFT;
12862306a36Sopenharmony_ci
12962306a36Sopenharmony_ci	/* PPS 5 */
13062306a36Sopenharmony_ci	pps_payload->bits_per_pixel_low =
13162306a36Sopenharmony_ci		(dsc_cfg->bits_per_pixel & DSC_PPS_LSB_MASK);
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci	/*
13462306a36Sopenharmony_ci	 * The DSC panel expects the PPS packet to have big endian format
13562306a36Sopenharmony_ci	 * for data spanning 2 bytes. Use a macro cpu_to_be16() to convert
13662306a36Sopenharmony_ci	 * to big endian format. If format is little endian, it will swap
13762306a36Sopenharmony_ci	 * bytes to convert to Big endian else keep it unchanged.
13862306a36Sopenharmony_ci	 */
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_ci	/* PPS 6, 7 */
14162306a36Sopenharmony_ci	pps_payload->pic_height = cpu_to_be16(dsc_cfg->pic_height);
14262306a36Sopenharmony_ci
14362306a36Sopenharmony_ci	/* PPS 8, 9 */
14462306a36Sopenharmony_ci	pps_payload->pic_width = cpu_to_be16(dsc_cfg->pic_width);
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_ci	/* PPS 10, 11 */
14762306a36Sopenharmony_ci	pps_payload->slice_height = cpu_to_be16(dsc_cfg->slice_height);
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci	/* PPS 12, 13 */
15062306a36Sopenharmony_ci	pps_payload->slice_width = cpu_to_be16(dsc_cfg->slice_width);
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_ci	/* PPS 14, 15 */
15362306a36Sopenharmony_ci	pps_payload->chunk_size = cpu_to_be16(dsc_cfg->slice_chunk_size);
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ci	/* PPS 16 */
15662306a36Sopenharmony_ci	pps_payload->initial_xmit_delay_high =
15762306a36Sopenharmony_ci		((dsc_cfg->initial_xmit_delay &
15862306a36Sopenharmony_ci		  DSC_PPS_INIT_XMIT_DELAY_HIGH_MASK) >>
15962306a36Sopenharmony_ci		 DSC_PPS_MSB_SHIFT);
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ci	/* PPS 17 */
16262306a36Sopenharmony_ci	pps_payload->initial_xmit_delay_low =
16362306a36Sopenharmony_ci		(dsc_cfg->initial_xmit_delay & DSC_PPS_LSB_MASK);
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ci	/* PPS 18, 19 */
16662306a36Sopenharmony_ci	pps_payload->initial_dec_delay =
16762306a36Sopenharmony_ci		cpu_to_be16(dsc_cfg->initial_dec_delay);
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_ci	/* PPS 20 is 0 */
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_ci	/* PPS 21 */
17262306a36Sopenharmony_ci	pps_payload->initial_scale_value =
17362306a36Sopenharmony_ci		dsc_cfg->initial_scale_value;
17462306a36Sopenharmony_ci
17562306a36Sopenharmony_ci	/* PPS 22, 23 */
17662306a36Sopenharmony_ci	pps_payload->scale_increment_interval =
17762306a36Sopenharmony_ci		cpu_to_be16(dsc_cfg->scale_increment_interval);
17862306a36Sopenharmony_ci
17962306a36Sopenharmony_ci	/* PPS 24 */
18062306a36Sopenharmony_ci	pps_payload->scale_decrement_interval_high =
18162306a36Sopenharmony_ci		((dsc_cfg->scale_decrement_interval &
18262306a36Sopenharmony_ci		  DSC_PPS_SCALE_DEC_INT_HIGH_MASK) >>
18362306a36Sopenharmony_ci		 DSC_PPS_MSB_SHIFT);
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_ci	/* PPS 25 */
18662306a36Sopenharmony_ci	pps_payload->scale_decrement_interval_low =
18762306a36Sopenharmony_ci		(dsc_cfg->scale_decrement_interval & DSC_PPS_LSB_MASK);
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_ci	/* PPS 26[7:0], PPS 27[7:5] RESERVED */
19062306a36Sopenharmony_ci
19162306a36Sopenharmony_ci	/* PPS 27 */
19262306a36Sopenharmony_ci	pps_payload->first_line_bpg_offset =
19362306a36Sopenharmony_ci		dsc_cfg->first_line_bpg_offset;
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_ci	/* PPS 28, 29 */
19662306a36Sopenharmony_ci	pps_payload->nfl_bpg_offset =
19762306a36Sopenharmony_ci		cpu_to_be16(dsc_cfg->nfl_bpg_offset);
19862306a36Sopenharmony_ci
19962306a36Sopenharmony_ci	/* PPS 30, 31 */
20062306a36Sopenharmony_ci	pps_payload->slice_bpg_offset =
20162306a36Sopenharmony_ci		cpu_to_be16(dsc_cfg->slice_bpg_offset);
20262306a36Sopenharmony_ci
20362306a36Sopenharmony_ci	/* PPS 32, 33 */
20462306a36Sopenharmony_ci	pps_payload->initial_offset =
20562306a36Sopenharmony_ci		cpu_to_be16(dsc_cfg->initial_offset);
20662306a36Sopenharmony_ci
20762306a36Sopenharmony_ci	/* PPS 34, 35 */
20862306a36Sopenharmony_ci	pps_payload->final_offset = cpu_to_be16(dsc_cfg->final_offset);
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_ci	/* PPS 36 */
21162306a36Sopenharmony_ci	pps_payload->flatness_min_qp = dsc_cfg->flatness_min_qp;
21262306a36Sopenharmony_ci
21362306a36Sopenharmony_ci	/* PPS 37 */
21462306a36Sopenharmony_ci	pps_payload->flatness_max_qp = dsc_cfg->flatness_max_qp;
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_ci	/* PPS 38, 39 */
21762306a36Sopenharmony_ci	pps_payload->rc_model_size = cpu_to_be16(dsc_cfg->rc_model_size);
21862306a36Sopenharmony_ci
21962306a36Sopenharmony_ci	/* PPS 40 */
22062306a36Sopenharmony_ci	pps_payload->rc_edge_factor = DSC_RC_EDGE_FACTOR_CONST;
22162306a36Sopenharmony_ci
22262306a36Sopenharmony_ci	/* PPS 41 */
22362306a36Sopenharmony_ci	pps_payload->rc_quant_incr_limit0 =
22462306a36Sopenharmony_ci		dsc_cfg->rc_quant_incr_limit0;
22562306a36Sopenharmony_ci
22662306a36Sopenharmony_ci	/* PPS 42 */
22762306a36Sopenharmony_ci	pps_payload->rc_quant_incr_limit1 =
22862306a36Sopenharmony_ci		dsc_cfg->rc_quant_incr_limit1;
22962306a36Sopenharmony_ci
23062306a36Sopenharmony_ci	/* PPS 43 */
23162306a36Sopenharmony_ci	pps_payload->rc_tgt_offset = DSC_RC_TGT_OFFSET_LO_CONST |
23262306a36Sopenharmony_ci		DSC_RC_TGT_OFFSET_HI_CONST << DSC_PPS_RC_TGT_OFFSET_HI_SHIFT;
23362306a36Sopenharmony_ci
23462306a36Sopenharmony_ci	/* PPS 44 - 57 */
23562306a36Sopenharmony_ci	for (i = 0; i < DSC_NUM_BUF_RANGES - 1; i++)
23662306a36Sopenharmony_ci		pps_payload->rc_buf_thresh[i] =
23762306a36Sopenharmony_ci			dsc_cfg->rc_buf_thresh[i];
23862306a36Sopenharmony_ci
23962306a36Sopenharmony_ci	/* PPS 58 - 87 */
24062306a36Sopenharmony_ci	/*
24162306a36Sopenharmony_ci	 * For DSC sink programming the RC Range parameter fields
24262306a36Sopenharmony_ci	 * are as follows: Min_qp[15:11], max_qp[10:6], offset[5:0]
24362306a36Sopenharmony_ci	 */
24462306a36Sopenharmony_ci	for (i = 0; i < DSC_NUM_BUF_RANGES; i++) {
24562306a36Sopenharmony_ci		pps_payload->rc_range_parameters[i] =
24662306a36Sopenharmony_ci			cpu_to_be16((dsc_cfg->rc_range_params[i].range_min_qp <<
24762306a36Sopenharmony_ci				     DSC_PPS_RC_RANGE_MINQP_SHIFT) |
24862306a36Sopenharmony_ci				    (dsc_cfg->rc_range_params[i].range_max_qp <<
24962306a36Sopenharmony_ci				     DSC_PPS_RC_RANGE_MAXQP_SHIFT) |
25062306a36Sopenharmony_ci				    (dsc_cfg->rc_range_params[i].range_bpg_offset));
25162306a36Sopenharmony_ci	}
25262306a36Sopenharmony_ci
25362306a36Sopenharmony_ci	/* PPS 88 */
25462306a36Sopenharmony_ci	pps_payload->native_422_420 = dsc_cfg->native_422 |
25562306a36Sopenharmony_ci		dsc_cfg->native_420 << DSC_PPS_NATIVE_420_SHIFT;
25662306a36Sopenharmony_ci
25762306a36Sopenharmony_ci	/* PPS 89 */
25862306a36Sopenharmony_ci	pps_payload->second_line_bpg_offset =
25962306a36Sopenharmony_ci		dsc_cfg->second_line_bpg_offset;
26062306a36Sopenharmony_ci
26162306a36Sopenharmony_ci	/* PPS 90, 91 */
26262306a36Sopenharmony_ci	pps_payload->nsl_bpg_offset =
26362306a36Sopenharmony_ci		cpu_to_be16(dsc_cfg->nsl_bpg_offset);
26462306a36Sopenharmony_ci
26562306a36Sopenharmony_ci	/* PPS 92, 93 */
26662306a36Sopenharmony_ci	pps_payload->second_line_offset_adj =
26762306a36Sopenharmony_ci		cpu_to_be16(dsc_cfg->second_line_offset_adj);
26862306a36Sopenharmony_ci
26962306a36Sopenharmony_ci	/* PPS 94 - 127 are O */
27062306a36Sopenharmony_ci}
27162306a36Sopenharmony_ciEXPORT_SYMBOL(drm_dsc_pps_payload_pack);
27262306a36Sopenharmony_ci
27362306a36Sopenharmony_ci/**
27462306a36Sopenharmony_ci * drm_dsc_set_const_params() - Set DSC parameters considered typically
27562306a36Sopenharmony_ci * constant across operation modes
27662306a36Sopenharmony_ci *
27762306a36Sopenharmony_ci * @vdsc_cfg:
27862306a36Sopenharmony_ci * DSC Configuration data partially filled by driver
27962306a36Sopenharmony_ci */
28062306a36Sopenharmony_civoid drm_dsc_set_const_params(struct drm_dsc_config *vdsc_cfg)
28162306a36Sopenharmony_ci{
28262306a36Sopenharmony_ci	if (!vdsc_cfg->rc_model_size)
28362306a36Sopenharmony_ci		vdsc_cfg->rc_model_size = DSC_RC_MODEL_SIZE_CONST;
28462306a36Sopenharmony_ci	vdsc_cfg->rc_edge_factor = DSC_RC_EDGE_FACTOR_CONST;
28562306a36Sopenharmony_ci	vdsc_cfg->rc_tgt_offset_high = DSC_RC_TGT_OFFSET_HI_CONST;
28662306a36Sopenharmony_ci	vdsc_cfg->rc_tgt_offset_low = DSC_RC_TGT_OFFSET_LO_CONST;
28762306a36Sopenharmony_ci
28862306a36Sopenharmony_ci	if (vdsc_cfg->bits_per_component <= 10)
28962306a36Sopenharmony_ci		vdsc_cfg->mux_word_size = DSC_MUX_WORD_SIZE_8_10_BPC;
29062306a36Sopenharmony_ci	else
29162306a36Sopenharmony_ci		vdsc_cfg->mux_word_size = DSC_MUX_WORD_SIZE_12_BPC;
29262306a36Sopenharmony_ci}
29362306a36Sopenharmony_ciEXPORT_SYMBOL(drm_dsc_set_const_params);
29462306a36Sopenharmony_ci
29562306a36Sopenharmony_ci/* From DSC_v1.11 spec, rc_parameter_Set syntax element typically constant */
29662306a36Sopenharmony_cistatic const u16 drm_dsc_rc_buf_thresh[] = {
29762306a36Sopenharmony_ci	896, 1792, 2688, 3584, 4480, 5376, 6272, 6720, 7168, 7616,
29862306a36Sopenharmony_ci	7744, 7872, 8000, 8064
29962306a36Sopenharmony_ci};
30062306a36Sopenharmony_ci
30162306a36Sopenharmony_ci/**
30262306a36Sopenharmony_ci * drm_dsc_set_rc_buf_thresh() - Set thresholds for the RC model
30362306a36Sopenharmony_ci * in accordance with the DSC 1.2 specification.
30462306a36Sopenharmony_ci *
30562306a36Sopenharmony_ci * @vdsc_cfg: DSC Configuration data partially filled by driver
30662306a36Sopenharmony_ci */
30762306a36Sopenharmony_civoid drm_dsc_set_rc_buf_thresh(struct drm_dsc_config *vdsc_cfg)
30862306a36Sopenharmony_ci{
30962306a36Sopenharmony_ci	int i;
31062306a36Sopenharmony_ci
31162306a36Sopenharmony_ci	BUILD_BUG_ON(ARRAY_SIZE(drm_dsc_rc_buf_thresh) !=
31262306a36Sopenharmony_ci		     DSC_NUM_BUF_RANGES - 1);
31362306a36Sopenharmony_ci	BUILD_BUG_ON(ARRAY_SIZE(drm_dsc_rc_buf_thresh) !=
31462306a36Sopenharmony_ci		     ARRAY_SIZE(vdsc_cfg->rc_buf_thresh));
31562306a36Sopenharmony_ci
31662306a36Sopenharmony_ci	for (i = 0; i < ARRAY_SIZE(drm_dsc_rc_buf_thresh); i++)
31762306a36Sopenharmony_ci		vdsc_cfg->rc_buf_thresh[i] = drm_dsc_rc_buf_thresh[i] >> 6;
31862306a36Sopenharmony_ci
31962306a36Sopenharmony_ci	/*
32062306a36Sopenharmony_ci	 * For 6bpp, RC Buffer threshold 12 and 13 need a different value
32162306a36Sopenharmony_ci	 * as per C Model
32262306a36Sopenharmony_ci	 */
32362306a36Sopenharmony_ci	if (vdsc_cfg->bits_per_pixel == 6 << 4) {
32462306a36Sopenharmony_ci		vdsc_cfg->rc_buf_thresh[12] = 7936 >> 6;
32562306a36Sopenharmony_ci		vdsc_cfg->rc_buf_thresh[13] = 8000 >> 6;
32662306a36Sopenharmony_ci	}
32762306a36Sopenharmony_ci}
32862306a36Sopenharmony_ciEXPORT_SYMBOL(drm_dsc_set_rc_buf_thresh);
32962306a36Sopenharmony_ci
33062306a36Sopenharmony_cistruct rc_parameters {
33162306a36Sopenharmony_ci	u16 initial_xmit_delay;
33262306a36Sopenharmony_ci	u8 first_line_bpg_offset;
33362306a36Sopenharmony_ci	u16 initial_offset;
33462306a36Sopenharmony_ci	u8 flatness_min_qp;
33562306a36Sopenharmony_ci	u8 flatness_max_qp;
33662306a36Sopenharmony_ci	u8 rc_quant_incr_limit0;
33762306a36Sopenharmony_ci	u8 rc_quant_incr_limit1;
33862306a36Sopenharmony_ci	struct drm_dsc_rc_range_parameters rc_range_params[DSC_NUM_BUF_RANGES];
33962306a36Sopenharmony_ci};
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_cistruct rc_parameters_data {
34262306a36Sopenharmony_ci	u8 bpp;
34362306a36Sopenharmony_ci	u8 bpc;
34462306a36Sopenharmony_ci	struct rc_parameters params;
34562306a36Sopenharmony_ci};
34662306a36Sopenharmony_ci
34762306a36Sopenharmony_ci#define DSC_BPP(bpp)	((bpp) << 4)
34862306a36Sopenharmony_ci
34962306a36Sopenharmony_ci/*
35062306a36Sopenharmony_ci * Rate Control Related Parameter Recommended Values from DSC_v1.1 spec prior
35162306a36Sopenharmony_ci * to DSC 1.1 fractional bpp underflow SCR (DSC_v1.1_E1.pdf)
35262306a36Sopenharmony_ci *
35362306a36Sopenharmony_ci * Cross-checked against C Model releases: DSC_model_20161212 and 20210623
35462306a36Sopenharmony_ci */
35562306a36Sopenharmony_cistatic const struct rc_parameters_data rc_parameters_pre_scr[] = {
35662306a36Sopenharmony_ci	{
35762306a36Sopenharmony_ci		.bpp = DSC_BPP(6), .bpc = 8,
35862306a36Sopenharmony_ci		{ 683, 15, 6144, 3, 13, 11, 11, {
35962306a36Sopenharmony_ci			{ 0, 2, 0 }, { 1, 4, -2 }, { 3, 6, -2 }, { 4, 6, -4 },
36062306a36Sopenharmony_ci			{ 5, 7, -6 }, { 5, 7, -6 }, { 6, 7, -6 }, { 6, 8, -8 },
36162306a36Sopenharmony_ci			{ 7, 9, -8 }, { 8, 10, -10 }, { 9, 11, -10 }, { 10, 12, -12 },
36262306a36Sopenharmony_ci			{ 10, 13, -12 }, { 12, 14, -12 }, { 15, 15, -12 }
36362306a36Sopenharmony_ci			}
36462306a36Sopenharmony_ci		}
36562306a36Sopenharmony_ci	},
36662306a36Sopenharmony_ci	{
36762306a36Sopenharmony_ci		.bpp = DSC_BPP(8), .bpc = 8,
36862306a36Sopenharmony_ci		{ 512, 12, 6144, 3, 12, 11, 11, {
36962306a36Sopenharmony_ci			{ 0, 4, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 1, 6, -2 },
37062306a36Sopenharmony_ci			{ 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
37162306a36Sopenharmony_ci			{ 3, 9, -8 }, { 3, 10, -10 }, { 5, 11, -10 }, { 5, 12, -12 },
37262306a36Sopenharmony_ci			{ 5, 13, -12 }, { 7, 13, -12 }, { 13, 15, -12 }
37362306a36Sopenharmony_ci			}
37462306a36Sopenharmony_ci		}
37562306a36Sopenharmony_ci	},
37662306a36Sopenharmony_ci	{
37762306a36Sopenharmony_ci		.bpp = DSC_BPP(8), .bpc = 10,
37862306a36Sopenharmony_ci		{ 512, 12, 6144, 7, 16, 15, 15, {
37962306a36Sopenharmony_ci			/*
38062306a36Sopenharmony_ci			 * DSC model/pre-SCR-cfg has 8 for range_max_qp[0], however
38162306a36Sopenharmony_ci			 * VESA DSC 1.1 Table E-5 sets it to 4.
38262306a36Sopenharmony_ci			 */
38362306a36Sopenharmony_ci			{ 0, 4, 2 }, { 4, 8, 0 }, { 5, 9, 0 }, { 5, 10, -2 },
38462306a36Sopenharmony_ci			{ 7, 11, -4 }, { 7, 11, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
38562306a36Sopenharmony_ci			{ 7, 13, -8 }, { 7, 14, -10 }, { 9, 15, -10 }, { 9, 16, -12 },
38662306a36Sopenharmony_ci			{ 9, 17, -12 }, { 11, 17, -12 }, { 17, 19, -12 }
38762306a36Sopenharmony_ci			}
38862306a36Sopenharmony_ci		}
38962306a36Sopenharmony_ci	},
39062306a36Sopenharmony_ci	{
39162306a36Sopenharmony_ci		.bpp = DSC_BPP(8), .bpc = 12,
39262306a36Sopenharmony_ci		{ 512, 12, 6144, 11, 20, 19, 19, {
39362306a36Sopenharmony_ci			{ 0, 12, 2 }, { 4, 12, 0 }, { 9, 13, 0 }, { 9, 14, -2 },
39462306a36Sopenharmony_ci			{ 11, 15, -4 }, { 11, 15, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
39562306a36Sopenharmony_ci			{ 11, 17, -8 }, { 11, 18, -10 }, { 13, 19, -10 },
39662306a36Sopenharmony_ci			{ 13, 20, -12 }, { 13, 21, -12 }, { 15, 21, -12 },
39762306a36Sopenharmony_ci			{ 21, 23, -12 }
39862306a36Sopenharmony_ci			}
39962306a36Sopenharmony_ci		}
40062306a36Sopenharmony_ci	},
40162306a36Sopenharmony_ci	{
40262306a36Sopenharmony_ci		.bpp = DSC_BPP(10), .bpc = 8,
40362306a36Sopenharmony_ci		{ 410, 12, 5632, 3, 12, 11, 11, {
40462306a36Sopenharmony_ci			{ 0, 3, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 2, 6, -2 },
40562306a36Sopenharmony_ci			{ 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
40662306a36Sopenharmony_ci			{ 3, 9, -8 }, { 3, 9, -10 }, { 5, 10, -10 }, { 5, 11, -10 },
40762306a36Sopenharmony_ci			{ 5, 12, -12 }, { 7, 13, -12 }, { 13, 15, -12 }
40862306a36Sopenharmony_ci			}
40962306a36Sopenharmony_ci		}
41062306a36Sopenharmony_ci	},
41162306a36Sopenharmony_ci	{
41262306a36Sopenharmony_ci		.bpp = DSC_BPP(10), .bpc = 10,
41362306a36Sopenharmony_ci		{ 410, 12, 5632, 7, 16, 15, 15, {
41462306a36Sopenharmony_ci			{ 0, 7, 2 }, { 4, 8, 0 }, { 5, 9, 0 }, { 6, 10, -2 },
41562306a36Sopenharmony_ci			{ 7, 11, -4 }, { 7, 11, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
41662306a36Sopenharmony_ci			{ 7, 13, -8 }, { 7, 13, -10 }, { 9, 14, -10 }, { 9, 15, -10 },
41762306a36Sopenharmony_ci			{ 9, 16, -12 }, { 11, 17, -12 }, { 17, 19, -12 }
41862306a36Sopenharmony_ci			}
41962306a36Sopenharmony_ci		}
42062306a36Sopenharmony_ci	},
42162306a36Sopenharmony_ci	{
42262306a36Sopenharmony_ci		.bpp = DSC_BPP(10), .bpc = 12,
42362306a36Sopenharmony_ci		{ 410, 12, 5632, 11, 20, 19, 19, {
42462306a36Sopenharmony_ci			{ 0, 11, 2 }, { 4, 12, 0 }, { 9, 13, 0 }, { 10, 14, -2 },
42562306a36Sopenharmony_ci			{ 11, 15, -4 }, { 11, 15, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
42662306a36Sopenharmony_ci			{ 11, 17, -8 }, { 11, 17, -10 }, { 13, 18, -10 },
42762306a36Sopenharmony_ci			{ 13, 19, -10 }, { 13, 20, -12 }, { 15, 21, -12 },
42862306a36Sopenharmony_ci			{ 21, 23, -12 }
42962306a36Sopenharmony_ci			}
43062306a36Sopenharmony_ci		}
43162306a36Sopenharmony_ci	},
43262306a36Sopenharmony_ci	{
43362306a36Sopenharmony_ci		.bpp = DSC_BPP(12), .bpc = 8,
43462306a36Sopenharmony_ci		{ 341, 15, 2048, 3, 12, 11, 11, {
43562306a36Sopenharmony_ci			{ 0, 2, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 1, 6, -2 },
43662306a36Sopenharmony_ci			{ 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
43762306a36Sopenharmony_ci			{ 3, 9, -8 }, { 3, 10, -10 }, { 5, 11, -10 },
43862306a36Sopenharmony_ci			{ 5, 12, -12 }, { 5, 13, -12 }, { 7, 13, -12 }, { 13, 15, -12 }
43962306a36Sopenharmony_ci			}
44062306a36Sopenharmony_ci		}
44162306a36Sopenharmony_ci	},
44262306a36Sopenharmony_ci	{
44362306a36Sopenharmony_ci		.bpp = DSC_BPP(12), .bpc = 10,
44462306a36Sopenharmony_ci		{ 341, 15, 2048, 7, 16, 15, 15, {
44562306a36Sopenharmony_ci			{ 0, 2, 2 }, { 2, 5, 0 }, { 3, 7, 0 }, { 4, 8, -2 },
44662306a36Sopenharmony_ci			{ 6, 9, -4 }, { 7, 10, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
44762306a36Sopenharmony_ci			{ 7, 13, -8 }, { 7, 14, -10 }, { 9, 15, -10 }, { 9, 16, -12 },
44862306a36Sopenharmony_ci			{ 9, 17, -12 }, { 11, 17, -12 }, { 17, 19, -12 }
44962306a36Sopenharmony_ci			}
45062306a36Sopenharmony_ci		}
45162306a36Sopenharmony_ci	},
45262306a36Sopenharmony_ci	{
45362306a36Sopenharmony_ci		.bpp = DSC_BPP(12), .bpc = 12,
45462306a36Sopenharmony_ci		{ 341, 15, 2048, 11, 20, 19, 19, {
45562306a36Sopenharmony_ci			{ 0, 6, 2 }, { 4, 9, 0 }, { 7, 11, 0 }, { 8, 12, -2 },
45662306a36Sopenharmony_ci			{ 10, 13, -4 }, { 11, 14, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
45762306a36Sopenharmony_ci			{ 11, 17, -8 }, { 11, 18, -10 }, { 13, 19, -10 },
45862306a36Sopenharmony_ci			{ 13, 20, -12 }, { 13, 21, -12 }, { 15, 21, -12 },
45962306a36Sopenharmony_ci			{ 21, 23, -12 }
46062306a36Sopenharmony_ci			}
46162306a36Sopenharmony_ci		}
46262306a36Sopenharmony_ci	},
46362306a36Sopenharmony_ci	{
46462306a36Sopenharmony_ci		.bpp = DSC_BPP(15), .bpc = 8,
46562306a36Sopenharmony_ci		{ 273, 15, 2048, 3, 12, 11, 11, {
46662306a36Sopenharmony_ci			{ 0, 0, 10 }, { 0, 1, 8 }, { 0, 1, 6 }, { 0, 2, 4 },
46762306a36Sopenharmony_ci			{ 1, 2, 2 }, { 1, 3, 0 }, { 1, 4, -2 }, { 2, 4, -4 },
46862306a36Sopenharmony_ci			{ 3, 4, -6 }, { 3, 5, -8 }, { 4, 6, -10 }, { 5, 7, -10 },
46962306a36Sopenharmony_ci			{ 5, 8, -12 }, { 7, 13, -12 }, { 13, 15, -12 }
47062306a36Sopenharmony_ci			}
47162306a36Sopenharmony_ci		}
47262306a36Sopenharmony_ci	},
47362306a36Sopenharmony_ci	{
47462306a36Sopenharmony_ci		.bpp = DSC_BPP(15), .bpc = 10,
47562306a36Sopenharmony_ci		{ 273, 15, 2048, 7, 16, 15, 15, {
47662306a36Sopenharmony_ci			{ 0, 2, 10 }, { 2, 5, 8 }, { 3, 5, 6 }, { 4, 6, 4 },
47762306a36Sopenharmony_ci			{ 5, 6, 2 }, { 5, 7, 0 }, { 5, 8, -2 }, { 6, 8, -4 },
47862306a36Sopenharmony_ci			{ 7, 8, -6 }, { 7, 9, -8 }, { 8, 10, -10 }, { 9, 11, -10 },
47962306a36Sopenharmony_ci			{ 9, 12, -12 }, { 11, 17, -12 }, { 17, 19, -12 }
48062306a36Sopenharmony_ci			}
48162306a36Sopenharmony_ci		}
48262306a36Sopenharmony_ci	},
48362306a36Sopenharmony_ci	{
48462306a36Sopenharmony_ci		.bpp = DSC_BPP(15), .bpc = 12,
48562306a36Sopenharmony_ci		{ 273, 15, 2048, 11, 20, 19, 19, {
48662306a36Sopenharmony_ci			{ 0, 4, 10 }, { 2, 7, 8 }, { 4, 9, 6 }, { 6, 11, 4 },
48762306a36Sopenharmony_ci			{ 9, 11, 2 }, { 9, 11, 0 }, { 9, 12, -2 }, { 10, 12, -4 },
48862306a36Sopenharmony_ci			{ 11, 12, -6 }, { 11, 13, -8 }, { 12, 14, -10 },
48962306a36Sopenharmony_ci			{ 13, 15, -10 }, { 13, 16, -12 }, { 15, 21, -12 },
49062306a36Sopenharmony_ci			{ 21, 23, -12 }
49162306a36Sopenharmony_ci			}
49262306a36Sopenharmony_ci		}
49362306a36Sopenharmony_ci	},
49462306a36Sopenharmony_ci	{ /* sentinel */ }
49562306a36Sopenharmony_ci};
49662306a36Sopenharmony_ci
49762306a36Sopenharmony_ci/*
49862306a36Sopenharmony_ci * Selected Rate Control Related Parameter Recommended Values from DSC v1.2, v1.2a, v1.2b and
49962306a36Sopenharmony_ci * DSC_v1.1_E1 specs.
50062306a36Sopenharmony_ci *
50162306a36Sopenharmony_ci * Cross-checked against C Model releases: DSC_model_20161212 and 20210623
50262306a36Sopenharmony_ci */
50362306a36Sopenharmony_cistatic const struct rc_parameters_data rc_parameters_1_2_444[] = {
50462306a36Sopenharmony_ci	{
50562306a36Sopenharmony_ci		.bpp = DSC_BPP(6), .bpc = 8,
50662306a36Sopenharmony_ci		{ 768, 15, 6144, 3, 13, 11, 11, {
50762306a36Sopenharmony_ci			{ 0, 4, 0 }, { 1, 6, -2 }, { 3, 8, -2 }, { 4, 8, -4 },
50862306a36Sopenharmony_ci			{ 5, 9, -6 }, { 5, 9, -6 }, { 6, 9, -6 }, { 6, 10, -8 },
50962306a36Sopenharmony_ci			{ 7, 11, -8 }, { 8, 12, -10 }, { 9, 12, -10 }, { 10, 12, -12 },
51062306a36Sopenharmony_ci			{ 10, 12, -12 }, { 11, 12, -12 }, { 13, 14, -12 }
51162306a36Sopenharmony_ci			}
51262306a36Sopenharmony_ci		}
51362306a36Sopenharmony_ci	},
51462306a36Sopenharmony_ci	{
51562306a36Sopenharmony_ci		.bpp = DSC_BPP(6), .bpc = 10,
51662306a36Sopenharmony_ci		{ 768, 15, 6144, 7, 17, 15, 15, {
51762306a36Sopenharmony_ci			{ 0, 8, 0 }, { 3, 10, -2 }, { 7, 12, -2 }, { 8, 12, -4 },
51862306a36Sopenharmony_ci			{ 9, 13, -6 }, { 9, 13, -6 }, { 10, 13, -6 }, { 10, 14, -8 },
51962306a36Sopenharmony_ci			{ 11, 15, -8 }, { 12, 16, -10 }, { 13, 16, -10 },
52062306a36Sopenharmony_ci			{ 14, 16, -12 }, { 14, 16, -12 }, { 15, 16, -12 },
52162306a36Sopenharmony_ci			{ 17, 18, -12 }
52262306a36Sopenharmony_ci			}
52362306a36Sopenharmony_ci		}
52462306a36Sopenharmony_ci	},
52562306a36Sopenharmony_ci	{
52662306a36Sopenharmony_ci		.bpp = DSC_BPP(6), .bpc = 12,
52762306a36Sopenharmony_ci		{ 768, 15, 6144, 11, 21, 19, 19, {
52862306a36Sopenharmony_ci			{ 0, 12, 0 }, { 5, 14, -2 }, { 11, 16, -2 }, { 12, 16, -4 },
52962306a36Sopenharmony_ci			{ 13, 17, -6 }, { 13, 17, -6 }, { 14, 17, -6 }, { 14, 18, -8 },
53062306a36Sopenharmony_ci			{ 15, 19, -8 }, { 16, 20, -10 }, { 17, 20, -10 },
53162306a36Sopenharmony_ci			{ 18, 20, -12 }, { 18, 20, -12 }, { 19, 20, -12 },
53262306a36Sopenharmony_ci			{ 21, 22, -12 }
53362306a36Sopenharmony_ci			}
53462306a36Sopenharmony_ci		}
53562306a36Sopenharmony_ci	},
53662306a36Sopenharmony_ci	{
53762306a36Sopenharmony_ci		.bpp = DSC_BPP(6), .bpc = 14,
53862306a36Sopenharmony_ci		{ 768, 15, 6144, 15, 25, 23, 23, {
53962306a36Sopenharmony_ci			{ 0, 16, 0 }, { 7, 18, -2 }, { 15, 20, -2 }, { 16, 20, -4 },
54062306a36Sopenharmony_ci			{ 17, 21, -6 }, { 17, 21, -6 }, { 18, 21, -6 }, { 18, 22, -8 },
54162306a36Sopenharmony_ci			{ 19, 23, -8 }, { 20, 24, -10 }, { 21, 24, -10 },
54262306a36Sopenharmony_ci			{ 22, 24, -12 }, { 22, 24, -12 }, { 23, 24, -12 },
54362306a36Sopenharmony_ci			{ 25, 26, -12 }
54462306a36Sopenharmony_ci			}
54562306a36Sopenharmony_ci		}
54662306a36Sopenharmony_ci	},
54762306a36Sopenharmony_ci	{
54862306a36Sopenharmony_ci		.bpp = DSC_BPP(6), .bpc = 16,
54962306a36Sopenharmony_ci		{ 768, 15, 6144, 19, 29, 27, 27, {
55062306a36Sopenharmony_ci			{ 0, 20, 0 }, { 9, 22, -2 }, { 19, 24, -2 }, { 20, 24, -4 },
55162306a36Sopenharmony_ci			{ 21, 25, -6 }, { 21, 25, -6 }, { 22, 25, -6 }, { 22, 26, -8 },
55262306a36Sopenharmony_ci			{ 23, 27, -8 }, { 24, 28, -10 }, { 25, 28, -10 },
55362306a36Sopenharmony_ci			{ 26, 28, -12 }, { 26, 28, -12 }, { 27, 28, -12 },
55462306a36Sopenharmony_ci			{ 29, 30, -12 }
55562306a36Sopenharmony_ci			}
55662306a36Sopenharmony_ci		}
55762306a36Sopenharmony_ci	},
55862306a36Sopenharmony_ci	{
55962306a36Sopenharmony_ci		.bpp = DSC_BPP(8), .bpc = 8,
56062306a36Sopenharmony_ci		{ 512, 12, 6144, 3, 12, 11, 11, {
56162306a36Sopenharmony_ci			{ 0, 4, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 1, 6, -2 },
56262306a36Sopenharmony_ci			{ 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
56362306a36Sopenharmony_ci			{ 3, 9, -8 }, { 3, 10, -10 }, { 5, 10, -10 }, { 5, 11, -12 },
56462306a36Sopenharmony_ci			{ 5, 11, -12 }, { 9, 12, -12 }, { 12, 13, -12 }
56562306a36Sopenharmony_ci			}
56662306a36Sopenharmony_ci		}
56762306a36Sopenharmony_ci	},
56862306a36Sopenharmony_ci	{
56962306a36Sopenharmony_ci		.bpp = DSC_BPP(8), .bpc = 10,
57062306a36Sopenharmony_ci		{ 512, 12, 6144, 7, 16, 15, 15, {
57162306a36Sopenharmony_ci			{ 0, 8, 2 }, { 4, 8, 0 }, { 5, 9, 0 }, { 5, 10, -2 },
57262306a36Sopenharmony_ci			{ 7, 11, -4 }, { 7, 11, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
57362306a36Sopenharmony_ci			{ 7, 13, -8 }, { 7, 14, -10 }, { 9, 14, -10 }, { 9, 15, -12 },
57462306a36Sopenharmony_ci			{ 9, 15, -12 }, { 13, 16, -12 }, { 16, 17, -12 }
57562306a36Sopenharmony_ci			}
57662306a36Sopenharmony_ci		}
57762306a36Sopenharmony_ci	},
57862306a36Sopenharmony_ci	{
57962306a36Sopenharmony_ci		.bpp = DSC_BPP(8), .bpc = 12,
58062306a36Sopenharmony_ci		{ 512, 12, 6144, 11, 20, 19, 19, {
58162306a36Sopenharmony_ci			{ 0, 12, 2 }, { 4, 12, 0 }, { 9, 13, 0 }, { 9, 14, -2 },
58262306a36Sopenharmony_ci			{ 11, 15, -4 }, { 11, 15, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
58362306a36Sopenharmony_ci			{ 11, 17, -8 }, { 11, 18, -10 }, { 13, 18, -10 },
58462306a36Sopenharmony_ci			{ 13, 19, -12 }, { 13, 19, -12 }, { 17, 20, -12 },
58562306a36Sopenharmony_ci			{ 20, 21, -12 }
58662306a36Sopenharmony_ci			}
58762306a36Sopenharmony_ci		}
58862306a36Sopenharmony_ci	},
58962306a36Sopenharmony_ci	{
59062306a36Sopenharmony_ci		.bpp = DSC_BPP(8), .bpc = 14,
59162306a36Sopenharmony_ci		{ 512, 12, 6144, 15, 24, 23, 23, {
59262306a36Sopenharmony_ci			{ 0, 12, 2 }, { 5, 13, 0 }, { 11, 15, 0 }, { 12, 17, -2 },
59362306a36Sopenharmony_ci			{ 15, 19, -4 }, { 15, 19, -6 }, { 15, 19, -8 }, { 15, 20, -8 },
59462306a36Sopenharmony_ci			{ 15, 21, -8 }, { 15, 22, -10 }, { 17, 22, -10 },
59562306a36Sopenharmony_ci			{ 17, 23, -12 }, { 17, 23, -12 }, { 21, 24, -12 },
59662306a36Sopenharmony_ci			{ 24, 25, -12 }
59762306a36Sopenharmony_ci			}
59862306a36Sopenharmony_ci		}
59962306a36Sopenharmony_ci	},
60062306a36Sopenharmony_ci	{
60162306a36Sopenharmony_ci		.bpp = DSC_BPP(8), .bpc = 16,
60262306a36Sopenharmony_ci		{ 512, 12, 6144, 19, 28, 27, 27, {
60362306a36Sopenharmony_ci			{ 0, 12, 2 }, { 6, 14, 0 }, { 13, 17, 0 }, { 15, 20, -2 },
60462306a36Sopenharmony_ci			{ 19, 23, -4 }, { 19, 23, -6 }, { 19, 23, -8 }, { 19, 24, -8 },
60562306a36Sopenharmony_ci			{ 19, 25, -8 }, { 19, 26, -10 }, { 21, 26, -10 },
60662306a36Sopenharmony_ci			{ 21, 27, -12 }, { 21, 27, -12 }, { 25, 28, -12 },
60762306a36Sopenharmony_ci			{ 28, 29, -12 }
60862306a36Sopenharmony_ci			}
60962306a36Sopenharmony_ci		}
61062306a36Sopenharmony_ci	},
61162306a36Sopenharmony_ci	{
61262306a36Sopenharmony_ci		.bpp = DSC_BPP(10), .bpc = 8,
61362306a36Sopenharmony_ci		{ 410, 15, 5632, 3, 12, 11, 11, {
61462306a36Sopenharmony_ci			{ 0, 3, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 2, 6, -2 },
61562306a36Sopenharmony_ci			{ 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
61662306a36Sopenharmony_ci			{ 3, 9, -8 }, { 3, 9, -10 }, { 5, 10, -10 }, { 5, 10, -10 },
61762306a36Sopenharmony_ci			{ 5, 11, -12 }, { 7, 11, -12 }, { 11, 12, -12 }
61862306a36Sopenharmony_ci			}
61962306a36Sopenharmony_ci		}
62062306a36Sopenharmony_ci	},
62162306a36Sopenharmony_ci	{
62262306a36Sopenharmony_ci		.bpp = DSC_BPP(10), .bpc = 10,
62362306a36Sopenharmony_ci		{ 410, 15, 5632, 7, 16, 15, 15, {
62462306a36Sopenharmony_ci			{ 0, 7, 2 }, { 4, 8, 0 }, { 5, 9, 0 }, { 6, 10, -2 },
62562306a36Sopenharmony_ci			{ 7, 11, -4 }, { 7, 11, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
62662306a36Sopenharmony_ci			{ 7, 13, -8 }, { 7, 13, -10 }, { 9, 14, -10 }, { 9, 14, -10 },
62762306a36Sopenharmony_ci			{ 9, 15, -12 }, { 11, 15, -12 }, { 15, 16, -12 }
62862306a36Sopenharmony_ci			}
62962306a36Sopenharmony_ci		}
63062306a36Sopenharmony_ci	},
63162306a36Sopenharmony_ci	{
63262306a36Sopenharmony_ci		.bpp = DSC_BPP(10), .bpc = 12,
63362306a36Sopenharmony_ci		{ 410, 15, 5632, 11, 20, 19, 19, {
63462306a36Sopenharmony_ci			{ 0, 11, 2 }, { 4, 12, 0 }, { 9, 13, 0 }, { 10, 14, -2 },
63562306a36Sopenharmony_ci			{ 11, 15, -4 }, { 11, 15, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
63662306a36Sopenharmony_ci			{ 11, 17, -8 }, { 11, 17, -10 }, { 13, 18, -10 },
63762306a36Sopenharmony_ci			{ 13, 18, -10 }, { 13, 19, -12 }, { 15, 19, -12 },
63862306a36Sopenharmony_ci			{ 19, 20, -12 }
63962306a36Sopenharmony_ci			}
64062306a36Sopenharmony_ci		}
64162306a36Sopenharmony_ci	},
64262306a36Sopenharmony_ci	{
64362306a36Sopenharmony_ci		.bpp = DSC_BPP(10), .bpc = 14,
64462306a36Sopenharmony_ci		{ 410, 15, 5632, 15, 24, 23, 23, {
64562306a36Sopenharmony_ci			{ 0, 11, 2 }, { 5, 13, 0 }, { 11, 15, 0 }, { 13, 18, -2 },
64662306a36Sopenharmony_ci			{ 15, 19, -4 }, { 15, 19, -6 }, { 15, 19, -8 }, { 15, 20, -8 },
64762306a36Sopenharmony_ci			{ 15, 21, -8 }, { 15, 21, -10 }, { 17, 22, -10 },
64862306a36Sopenharmony_ci			{ 17, 22, -10 }, { 17, 23, -12 }, { 19, 23, -12 },
64962306a36Sopenharmony_ci			{ 23, 24, -12 }
65062306a36Sopenharmony_ci			}
65162306a36Sopenharmony_ci		}
65262306a36Sopenharmony_ci	},
65362306a36Sopenharmony_ci	{
65462306a36Sopenharmony_ci		.bpp = DSC_BPP(10), .bpc = 16,
65562306a36Sopenharmony_ci		{ 410, 15, 5632, 19, 28, 27, 27, {
65662306a36Sopenharmony_ci			{ 0, 11, 2 }, { 6, 14, 0 }, { 13, 17, 0 }, { 16, 20, -2 },
65762306a36Sopenharmony_ci			{ 19, 23, -4 }, { 19, 23, -6 }, { 19, 23, -8 }, { 19, 24, -8 },
65862306a36Sopenharmony_ci			{ 19, 25, -8 }, { 19, 25, -10 }, { 21, 26, -10 },
65962306a36Sopenharmony_ci			{ 21, 26, -10 }, { 21, 27, -12 }, { 23, 27, -12 },
66062306a36Sopenharmony_ci			{ 27, 28, -12 }
66162306a36Sopenharmony_ci			}
66262306a36Sopenharmony_ci		}
66362306a36Sopenharmony_ci	},
66462306a36Sopenharmony_ci	{
66562306a36Sopenharmony_ci		.bpp = DSC_BPP(12), .bpc = 8,
66662306a36Sopenharmony_ci		{ 341, 15, 2048, 3, 12, 11, 11, {
66762306a36Sopenharmony_ci			{ 0, 2, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 1, 6, -2 },
66862306a36Sopenharmony_ci			{ 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
66962306a36Sopenharmony_ci			{ 3, 8, -8 }, { 3, 9, -10 }, { 5, 9, -10 }, { 5, 9, -12 },
67062306a36Sopenharmony_ci			{ 5, 9, -12 }, { 7, 10, -12 }, { 10, 11, -12 }
67162306a36Sopenharmony_ci			}
67262306a36Sopenharmony_ci		}
67362306a36Sopenharmony_ci	},
67462306a36Sopenharmony_ci	{
67562306a36Sopenharmony_ci		.bpp = DSC_BPP(12), .bpc = 10,
67662306a36Sopenharmony_ci		{ 341, 15, 2048, 7, 16, 15, 15, {
67762306a36Sopenharmony_ci			{ 0, 2, 2 }, { 2, 5, 0 }, { 3, 7, 0 }, { 4, 8, -2 },
67862306a36Sopenharmony_ci			{ 6, 9, -4 }, { 7, 10, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
67962306a36Sopenharmony_ci			{ 7, 12, -8 }, { 7, 13, -10 }, { 9, 13, -10 }, { 9, 13, -12 },
68062306a36Sopenharmony_ci			{ 9, 13, -12 }, { 11, 14, -12 }, { 14, 15, -12 }
68162306a36Sopenharmony_ci			}
68262306a36Sopenharmony_ci		}
68362306a36Sopenharmony_ci	},
68462306a36Sopenharmony_ci	{
68562306a36Sopenharmony_ci		.bpp = DSC_BPP(12), .bpc = 12,
68662306a36Sopenharmony_ci		{ 341, 15, 2048, 11, 20, 19, 19, {
68762306a36Sopenharmony_ci			{ 0, 6, 2 }, { 4, 9, 0 }, { 7, 11, 0 }, { 8, 12, -2 },
68862306a36Sopenharmony_ci			{ 10, 13, -4 }, { 11, 14, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
68962306a36Sopenharmony_ci			{ 11, 16, -8 }, { 11, 17, -10 }, { 13, 17, -10 },
69062306a36Sopenharmony_ci			{ 13, 17, -12 }, { 13, 17, -12 }, { 15, 18, -12 },
69162306a36Sopenharmony_ci			{ 18, 19, -12 }
69262306a36Sopenharmony_ci			}
69362306a36Sopenharmony_ci		}
69462306a36Sopenharmony_ci	},
69562306a36Sopenharmony_ci	{
69662306a36Sopenharmony_ci		.bpp = DSC_BPP(12), .bpc = 14,
69762306a36Sopenharmony_ci		{ 341, 15, 2048, 15, 24, 23, 23, {
69862306a36Sopenharmony_ci			{ 0, 6, 2 }, { 7, 10, 0 }, { 9, 13, 0 }, { 11, 16, -2 },
69962306a36Sopenharmony_ci			{ 14, 17, -4 }, { 15, 18, -6 }, { 15, 19, -8 }, { 15, 20, -8 },
70062306a36Sopenharmony_ci			{ 15, 20, -8 }, { 15, 21, -10 }, { 17, 21, -10 },
70162306a36Sopenharmony_ci			{ 17, 21, -12 }, { 17, 21, -12 }, { 19, 22, -12 },
70262306a36Sopenharmony_ci			{ 22, 23, -12 }
70362306a36Sopenharmony_ci			}
70462306a36Sopenharmony_ci		}
70562306a36Sopenharmony_ci	},
70662306a36Sopenharmony_ci	{
70762306a36Sopenharmony_ci		.bpp = DSC_BPP(12), .bpc = 16,
70862306a36Sopenharmony_ci		{ 341, 15, 2048, 19, 28, 27, 27, {
70962306a36Sopenharmony_ci			{ 0, 6, 2 }, { 6, 11, 0 }, { 11, 15, 0 }, { 14, 18, -2 },
71062306a36Sopenharmony_ci			{ 18, 21, -4 }, { 19, 22, -6 }, { 19, 23, -8 }, { 19, 24, -8 },
71162306a36Sopenharmony_ci			{ 19, 24, -8 }, { 19, 25, -10 }, { 21, 25, -10 },
71262306a36Sopenharmony_ci			{ 21, 25, -12 }, { 21, 25, -12 }, { 23, 26, -12 },
71362306a36Sopenharmony_ci			{ 26, 27, -12 }
71462306a36Sopenharmony_ci			}
71562306a36Sopenharmony_ci		}
71662306a36Sopenharmony_ci	},
71762306a36Sopenharmony_ci	{
71862306a36Sopenharmony_ci		.bpp = DSC_BPP(15), .bpc = 8,
71962306a36Sopenharmony_ci		{ 273, 15, 2048, 3, 12, 11, 11, {
72062306a36Sopenharmony_ci			{ 0, 0, 10 }, { 0, 1, 8 }, { 0, 1, 6 }, { 0, 2, 4 },
72162306a36Sopenharmony_ci			{ 1, 2, 2 }, { 1, 3, 0 }, { 1, 3, -2 }, { 2, 4, -4 },
72262306a36Sopenharmony_ci			{ 2, 5, -6 }, { 3, 5, -8 }, { 4, 6, -10 }, { 4, 7, -10 },
72362306a36Sopenharmony_ci			{ 5, 7, -12 }, { 7, 8, -12 }, { 8, 9, -12 }
72462306a36Sopenharmony_ci			}
72562306a36Sopenharmony_ci		}
72662306a36Sopenharmony_ci	},
72762306a36Sopenharmony_ci	{
72862306a36Sopenharmony_ci		.bpp = DSC_BPP(15), .bpc = 10,
72962306a36Sopenharmony_ci		{ 273, 15, 2048, 7, 16, 15, 15, {
73062306a36Sopenharmony_ci			{ 0, 2, 10 }, { 2, 5, 8 }, { 3, 5, 6 }, { 4, 6, 4 },
73162306a36Sopenharmony_ci			{ 5, 6, 2 }, { 5, 7, 0 }, { 5, 7, -2 }, { 6, 8, -4 },
73262306a36Sopenharmony_ci			{ 6, 9, -6 }, { 7, 9, -8 }, { 8, 10, -10 }, { 8, 11, -10 },
73362306a36Sopenharmony_ci			{ 9, 11, -12 }, { 11, 12, -12 }, { 12, 13, -12 }
73462306a36Sopenharmony_ci			}
73562306a36Sopenharmony_ci		}
73662306a36Sopenharmony_ci	},
73762306a36Sopenharmony_ci	{
73862306a36Sopenharmony_ci		.bpp = DSC_BPP(15), .bpc = 12,
73962306a36Sopenharmony_ci		{ 273, 15, 2048, 11, 20, 19, 19, {
74062306a36Sopenharmony_ci			{ 0, 4, 10 }, { 2, 7, 8 }, { 4, 9, 6 }, { 6, 11, 4 },
74162306a36Sopenharmony_ci			{ 9, 11, 2 }, { 9, 11, 0 }, { 9, 12, -2 }, { 10, 12, -4 },
74262306a36Sopenharmony_ci			{ 11, 13, -6 }, { 11, 13, -8 }, { 12, 14, -10 },
74362306a36Sopenharmony_ci			{ 13, 15, -10 }, { 13, 15, -12 }, { 15, 16, -12 },
74462306a36Sopenharmony_ci			{ 16, 17, -12 }
74562306a36Sopenharmony_ci			}
74662306a36Sopenharmony_ci		}
74762306a36Sopenharmony_ci	},
74862306a36Sopenharmony_ci	{
74962306a36Sopenharmony_ci		.bpp = DSC_BPP(15), .bpc = 14,
75062306a36Sopenharmony_ci		{ 273, 15, 2048, 15, 24, 23, 23, {
75162306a36Sopenharmony_ci			{ 0, 4, 10 }, { 3, 8, 8 }, { 6, 11, 6 }, { 9, 14, 4 },
75262306a36Sopenharmony_ci			{ 13, 15, 2 }, { 13, 15, 0 }, { 13, 16, -2 }, { 14, 16, -4 },
75362306a36Sopenharmony_ci			{ 15, 17, -6 }, { 15, 17, -8 }, { 16, 18, -10 },
75462306a36Sopenharmony_ci			{ 17, 19, -10 }, { 17, 19, -12 }, { 19, 20, -12 },
75562306a36Sopenharmony_ci			{ 20, 21, -12 }
75662306a36Sopenharmony_ci			}
75762306a36Sopenharmony_ci		}
75862306a36Sopenharmony_ci	},
75962306a36Sopenharmony_ci	{
76062306a36Sopenharmony_ci		.bpp = DSC_BPP(15), .bpc = 16,
76162306a36Sopenharmony_ci		{ 273, 15, 2048, 19, 28, 27, 27, {
76262306a36Sopenharmony_ci			{ 0, 4, 10 }, { 4, 9, 8 }, { 8, 13, 6 }, { 12, 17, 4 },
76362306a36Sopenharmony_ci			{ 17, 19, 2 }, { 17, 20, 0 }, { 17, 20, -2 }, { 18, 20, -4 },
76462306a36Sopenharmony_ci			{ 19, 21, -6 }, { 19, 21, -8 }, { 20, 22, -10 },
76562306a36Sopenharmony_ci			{ 21, 23, -10 }, { 21, 23, -12 }, { 23, 24, -12 },
76662306a36Sopenharmony_ci			{ 24, 25, -12 }
76762306a36Sopenharmony_ci			}
76862306a36Sopenharmony_ci		}
76962306a36Sopenharmony_ci	},
77062306a36Sopenharmony_ci	{ /* sentinel */ }
77162306a36Sopenharmony_ci};
77262306a36Sopenharmony_ci
77362306a36Sopenharmony_ci/*
77462306a36Sopenharmony_ci * Selected Rate Control Related Parameter Recommended Values for 4:2:2 from
77562306a36Sopenharmony_ci * DSC v1.2, v1.2a, v1.2b
77662306a36Sopenharmony_ci *
77762306a36Sopenharmony_ci * Cross-checked against C Model releases: DSC_model_20161212 and 20210623
77862306a36Sopenharmony_ci */
77962306a36Sopenharmony_cistatic const struct rc_parameters_data rc_parameters_1_2_422[] = {
78062306a36Sopenharmony_ci	{
78162306a36Sopenharmony_ci		.bpp = DSC_BPP(6), .bpc = 8,
78262306a36Sopenharmony_ci		{ 512, 15, 6144, 3, 12, 11, 11, {
78362306a36Sopenharmony_ci			{ 0, 4, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 1, 6, -2 },
78462306a36Sopenharmony_ci			{ 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
78562306a36Sopenharmony_ci			{ 3, 9, -8 }, { 3, 10, -10 }, { 5, 10, -10 }, { 5, 11, -12 },
78662306a36Sopenharmony_ci			{ 5, 11, -12 }, { 9, 12, -12 }, { 12, 13, -12 }
78762306a36Sopenharmony_ci			}
78862306a36Sopenharmony_ci		}
78962306a36Sopenharmony_ci	},
79062306a36Sopenharmony_ci	{
79162306a36Sopenharmony_ci		.bpp = DSC_BPP(6), .bpc = 10,
79262306a36Sopenharmony_ci		{ 512, 15, 6144, 7, 16, 15, 15, {
79362306a36Sopenharmony_ci			{ 0, 8, 2 }, { 4, 8, 0 }, { 5, 9, 0 }, { 5, 10, -2 },
79462306a36Sopenharmony_ci			{ 7, 11, -4 }, { 7, 11, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
79562306a36Sopenharmony_ci			{ 7, 13, -8 }, { 7, 14, -10 }, { 9, 14, -10 }, { 9, 15, -12 },
79662306a36Sopenharmony_ci			{ 9, 15, -12 }, { 13, 16, -12 }, { 16, 17, -12 }
79762306a36Sopenharmony_ci			}
79862306a36Sopenharmony_ci		}
79962306a36Sopenharmony_ci	},
80062306a36Sopenharmony_ci	{
80162306a36Sopenharmony_ci		.bpp = DSC_BPP(6), .bpc = 12,
80262306a36Sopenharmony_ci		{ 512, 15, 6144, 11, 20, 19, 19, {
80362306a36Sopenharmony_ci			{ 0, 12, 2 }, { 4, 12, 0 }, { 9, 13, 0 }, { 9, 14, -2 },
80462306a36Sopenharmony_ci			{ 11, 15, -4 }, { 11, 15, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
80562306a36Sopenharmony_ci			{ 11, 17, -8 }, { 11, 18, -10 }, { 13, 18, -10 },
80662306a36Sopenharmony_ci			{ 13, 19, -12 }, { 13, 19, -12 }, { 17, 20, -12 },
80762306a36Sopenharmony_ci			{ 20, 21, -12 }
80862306a36Sopenharmony_ci			}
80962306a36Sopenharmony_ci		}
81062306a36Sopenharmony_ci	},
81162306a36Sopenharmony_ci	{
81262306a36Sopenharmony_ci		.bpp = DSC_BPP(6), .bpc = 14,
81362306a36Sopenharmony_ci		{ 512, 15, 6144, 15, 24, 23, 23, {
81462306a36Sopenharmony_ci			{ 0, 12, 2 }, { 5, 13, 0 }, { 11, 15, 0 }, { 12, 17, -2 },
81562306a36Sopenharmony_ci			{ 15, 19, -4 }, { 15, 19, -6 }, { 15, 19, -8 }, { 15, 20, -8 },
81662306a36Sopenharmony_ci			{ 15, 21, -8 }, { 15, 22, -10 }, { 17, 22, -10 },
81762306a36Sopenharmony_ci			{ 17, 23, -12 }, { 17, 23, -12 }, { 21, 24, -12 },
81862306a36Sopenharmony_ci			{ 24, 25, -12 }
81962306a36Sopenharmony_ci			}
82062306a36Sopenharmony_ci		}
82162306a36Sopenharmony_ci	},
82262306a36Sopenharmony_ci	{
82362306a36Sopenharmony_ci		.bpp = DSC_BPP(6), .bpc = 16,
82462306a36Sopenharmony_ci		{ 512, 15, 6144, 19, 28, 27, 27, {
82562306a36Sopenharmony_ci			{ 0, 12, 2 }, { 6, 14, 0 }, { 13, 17, 0 }, { 15, 20, -2 },
82662306a36Sopenharmony_ci			{ 19, 23, -4 }, { 19, 23, -6 }, { 19, 23, -8 }, { 19, 24, -8 },
82762306a36Sopenharmony_ci			{ 19, 25, -8 }, { 19, 26, -10 }, { 21, 26, -10 },
82862306a36Sopenharmony_ci			{ 21, 27, -12 }, { 21, 27, -12 }, { 25, 28, -12 },
82962306a36Sopenharmony_ci			{ 28, 29, -12 }
83062306a36Sopenharmony_ci			}
83162306a36Sopenharmony_ci		}
83262306a36Sopenharmony_ci	},
83362306a36Sopenharmony_ci	{
83462306a36Sopenharmony_ci		.bpp = DSC_BPP(7), .bpc = 8,
83562306a36Sopenharmony_ci		{ 410, 15, 5632, 3, 12, 11, 11, {
83662306a36Sopenharmony_ci			{ 0, 3, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 2, 6, -2 },
83762306a36Sopenharmony_ci			{ 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
83862306a36Sopenharmony_ci			{ 3, 9, -8 }, { 3, 9, -10 }, { 5, 10, -10 }, { 5, 10, -10 },
83962306a36Sopenharmony_ci			{ 5, 11, -12 }, { 7, 11, -12 }, { 11, 12, -12 }
84062306a36Sopenharmony_ci			}
84162306a36Sopenharmony_ci		}
84262306a36Sopenharmony_ci	},
84362306a36Sopenharmony_ci	{
84462306a36Sopenharmony_ci		.bpp = DSC_BPP(7), .bpc = 10,
84562306a36Sopenharmony_ci		{ 410, 15, 5632, 7, 16, 15, 15, {
84662306a36Sopenharmony_ci			{ 0, 7, 2 }, { 4, 8, 0 }, { 5, 9, 0 }, { 6, 10, -2 },
84762306a36Sopenharmony_ci			{ 7, 11, -4 }, { 7, 11, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
84862306a36Sopenharmony_ci			{ 7, 13, -8 }, { 7, 13, -10 }, { 9, 14, -10 }, { 9, 14, -10 },
84962306a36Sopenharmony_ci			{ 9, 15, -12 }, { 11, 15, -12 }, { 15, 16, -12 }
85062306a36Sopenharmony_ci			}
85162306a36Sopenharmony_ci		}
85262306a36Sopenharmony_ci	},
85362306a36Sopenharmony_ci	{
85462306a36Sopenharmony_ci		.bpp = DSC_BPP(7), .bpc = 12,
85562306a36Sopenharmony_ci		{ 410, 15, 5632, 11, 20, 19, 19, {
85662306a36Sopenharmony_ci			{ 0, 11, 2 }, { 4, 12, 0 }, { 9, 13, 0 }, { 10, 14, -2 },
85762306a36Sopenharmony_ci			{ 11, 15, -4 }, { 11, 15, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
85862306a36Sopenharmony_ci			{ 11, 17, -8 }, { 11, 17, -10 }, { 13, 18, -10 },
85962306a36Sopenharmony_ci			{ 13, 18, -10 }, { 13, 19, -12 }, { 15, 19, -12 },
86062306a36Sopenharmony_ci			{ 19, 20, -12 }
86162306a36Sopenharmony_ci			}
86262306a36Sopenharmony_ci		}
86362306a36Sopenharmony_ci	},
86462306a36Sopenharmony_ci	{
86562306a36Sopenharmony_ci		.bpp = DSC_BPP(7), .bpc = 14,
86662306a36Sopenharmony_ci		{ 410, 15, 5632, 15, 24, 23, 23, {
86762306a36Sopenharmony_ci			{ 0, 11, 2 }, { 5, 13, 0 }, { 11, 15, 0 }, { 13, 18, -2 },
86862306a36Sopenharmony_ci			{ 15, 19, -4 }, { 15, 19, -6 }, { 15, 19, -8 }, { 15, 20, -8 },
86962306a36Sopenharmony_ci			{ 15, 21, -8 }, { 15, 21, -10 }, { 17, 22, -10 },
87062306a36Sopenharmony_ci			{ 17, 22, -10 }, { 17, 23, -12 }, { 19, 23, -12 },
87162306a36Sopenharmony_ci			{ 23, 24, -12 }
87262306a36Sopenharmony_ci			}
87362306a36Sopenharmony_ci		}
87462306a36Sopenharmony_ci	},
87562306a36Sopenharmony_ci	{
87662306a36Sopenharmony_ci		.bpp = DSC_BPP(7), .bpc = 16,
87762306a36Sopenharmony_ci		{ 410, 15, 5632, 19, 28, 27, 27, {
87862306a36Sopenharmony_ci			{ 0, 11, 2 }, { 6, 14, 0 }, { 13, 17, 0 }, { 16, 20, -2 },
87962306a36Sopenharmony_ci			{ 19, 23, -4 }, { 19, 23, -6 }, { 19, 23, -8 }, { 19, 24, -8 },
88062306a36Sopenharmony_ci			{ 19, 25, -8 }, { 19, 25, -10 }, { 21, 26, -10 },
88162306a36Sopenharmony_ci			{ 21, 26, -10 }, { 21, 27, -12 }, { 23, 27, -12 },
88262306a36Sopenharmony_ci			{ 27, 28, -12 }
88362306a36Sopenharmony_ci			}
88462306a36Sopenharmony_ci		}
88562306a36Sopenharmony_ci	},
88662306a36Sopenharmony_ci	{
88762306a36Sopenharmony_ci		.bpp = DSC_BPP(8), .bpc = 8,
88862306a36Sopenharmony_ci		{ 341, 15, 2048, 3, 12, 11, 11, {
88962306a36Sopenharmony_ci			{ 0, 2, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 1, 6, -2 },
89062306a36Sopenharmony_ci			{ 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
89162306a36Sopenharmony_ci			{ 3, 8, -8 }, { 3, 9, -10 }, { 5, 9, -10 }, { 5, 9, -12 },
89262306a36Sopenharmony_ci			{ 5, 9, -12 }, { 7, 10, -12 }, { 10, 11, -12 }
89362306a36Sopenharmony_ci			}
89462306a36Sopenharmony_ci		}
89562306a36Sopenharmony_ci	},
89662306a36Sopenharmony_ci	{
89762306a36Sopenharmony_ci		.bpp = DSC_BPP(8), .bpc = 10,
89862306a36Sopenharmony_ci		{ 341, 15, 2048, 7, 16, 15, 15, {
89962306a36Sopenharmony_ci			{ 0, 2, 2 }, { 2, 5, 0 }, { 3, 7, 0 }, { 4, 8, -2 },
90062306a36Sopenharmony_ci			{ 6, 9, -4 }, { 7, 10, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
90162306a36Sopenharmony_ci			{ 7, 12, -8 }, { 7, 13, -10 }, { 9, 13, -10 }, { 9, 13, -12 },
90262306a36Sopenharmony_ci			{ 9, 13, -12 }, { 11, 14, -12 }, { 14, 15, -12 }
90362306a36Sopenharmony_ci			}
90462306a36Sopenharmony_ci		}
90562306a36Sopenharmony_ci	},
90662306a36Sopenharmony_ci	{
90762306a36Sopenharmony_ci		.bpp = DSC_BPP(8), .bpc = 12,
90862306a36Sopenharmony_ci		{ 341, 15, 2048, 11, 20, 19, 19, {
90962306a36Sopenharmony_ci			{ 0, 6, 2 }, { 4, 9, 0 }, { 7, 11, 0 }, { 8, 12, -2 },
91062306a36Sopenharmony_ci			{ 10, 13, -4 }, { 11, 14, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
91162306a36Sopenharmony_ci			{ 11, 16, -8 }, { 11, 17, -10 }, { 13, 17, -10 },
91262306a36Sopenharmony_ci			{ 13, 17, -12 }, { 13, 17, -12 }, { 15, 18, -12 },
91362306a36Sopenharmony_ci			{ 18, 19, -12 }
91462306a36Sopenharmony_ci			}
91562306a36Sopenharmony_ci		}
91662306a36Sopenharmony_ci	},
91762306a36Sopenharmony_ci	{
91862306a36Sopenharmony_ci		.bpp = DSC_BPP(8), .bpc = 14,
91962306a36Sopenharmony_ci		{ 341, 15, 2048, 15, 24, 23, 23, {
92062306a36Sopenharmony_ci			{ 0, 6, 2 }, { 7, 10, 0 }, { 9, 13, 0 }, { 11, 16, -2 },
92162306a36Sopenharmony_ci			{ 14, 17, -4 }, { 15, 18, -6 }, { 15, 19, -8 }, { 15, 20, -8 },
92262306a36Sopenharmony_ci			{ 15, 20, -8 }, { 15, 21, -10 }, { 17, 21, -10 },
92362306a36Sopenharmony_ci			{ 17, 21, -12 }, { 17, 21, -12 }, { 19, 22, -12 },
92462306a36Sopenharmony_ci			{ 22, 23, -12 }
92562306a36Sopenharmony_ci			}
92662306a36Sopenharmony_ci		}
92762306a36Sopenharmony_ci	},
92862306a36Sopenharmony_ci	{
92962306a36Sopenharmony_ci		.bpp = DSC_BPP(8), .bpc = 16,
93062306a36Sopenharmony_ci		{ 341, 15, 2048, 19, 28, 27, 27, {
93162306a36Sopenharmony_ci			{ 0, 6, 2 }, { 6, 11, 0 }, { 11, 15, 0 }, { 14, 18, -2 },
93262306a36Sopenharmony_ci			{ 18, 21, -4 }, { 19, 22, -6 }, { 19, 23, -8 }, { 19, 24, -8 },
93362306a36Sopenharmony_ci			{ 19, 24, -8 }, { 19, 25, -10 }, { 21, 25, -10 },
93462306a36Sopenharmony_ci			{ 21, 25, -12 }, { 21, 25, -12 }, { 23, 26, -12 },
93562306a36Sopenharmony_ci			{ 26, 27, -12 }
93662306a36Sopenharmony_ci			}
93762306a36Sopenharmony_ci		}
93862306a36Sopenharmony_ci	},
93962306a36Sopenharmony_ci	{
94062306a36Sopenharmony_ci		.bpp = DSC_BPP(10), .bpc = 8,
94162306a36Sopenharmony_ci		{ 273, 15, 2048, 3, 12, 11, 11, {
94262306a36Sopenharmony_ci			{ 0, 0, 10 }, { 0, 1, 8 }, { 0, 1, 6 }, { 0, 2, 4 },
94362306a36Sopenharmony_ci			{ 1, 2, 2 }, { 1, 3, 0 }, { 1, 3, -2 }, { 2, 4, -4 },
94462306a36Sopenharmony_ci			{ 2, 5, -6 }, { 3, 5, -8 }, { 4, 6, -10 }, { 4, 7, -10 },
94562306a36Sopenharmony_ci			{ 5, 7, -12 }, { 7, 8, -12 }, { 8, 9, -12 }
94662306a36Sopenharmony_ci			}
94762306a36Sopenharmony_ci		}
94862306a36Sopenharmony_ci	},
94962306a36Sopenharmony_ci	{
95062306a36Sopenharmony_ci		.bpp = DSC_BPP(10), .bpc = 10,
95162306a36Sopenharmony_ci		{ 273, 15, 2048, 7, 16, 15, 15, {
95262306a36Sopenharmony_ci			{ 0, 2, 10 }, { 2, 5, 8 }, { 3, 5, 6 }, { 4, 6, 4 },
95362306a36Sopenharmony_ci			{ 5, 6, 2 }, { 5, 7, 0 }, { 5, 7, -2 }, { 6, 8, -4 },
95462306a36Sopenharmony_ci			{ 6, 9, -6 }, { 7, 9, -8 }, { 8, 10, -10 }, { 8, 11, -10 },
95562306a36Sopenharmony_ci			{ 9, 11, -12 }, { 11, 12, -12 }, { 12, 13, -12 }
95662306a36Sopenharmony_ci			}
95762306a36Sopenharmony_ci		}
95862306a36Sopenharmony_ci	},
95962306a36Sopenharmony_ci	{
96062306a36Sopenharmony_ci		.bpp = DSC_BPP(10), .bpc = 12,
96162306a36Sopenharmony_ci		{ 273, 15, 2048, 11, 20, 19, 19, {
96262306a36Sopenharmony_ci			{ 0, 4, 10 }, { 2, 7, 8 }, { 4, 9, 6 }, { 6, 11, 4 },
96362306a36Sopenharmony_ci			{ 9, 11, 2 }, { 9, 11, 0 }, { 9, 12, -2 }, { 10, 12, -4 },
96462306a36Sopenharmony_ci			{ 11, 13, -6 }, { 11, 13, -8 }, { 12, 14, -10 },
96562306a36Sopenharmony_ci			{ 13, 15, -10 }, { 13, 15, -12 }, { 15, 16, -12 },
96662306a36Sopenharmony_ci			{ 16, 17, -12 }
96762306a36Sopenharmony_ci			}
96862306a36Sopenharmony_ci		}
96962306a36Sopenharmony_ci	},
97062306a36Sopenharmony_ci	{
97162306a36Sopenharmony_ci		.bpp = DSC_BPP(10), .bpc = 14,
97262306a36Sopenharmony_ci		{ 273, 15, 2048, 15, 24, 23, 23, {
97362306a36Sopenharmony_ci			{ 0, 4, 10 }, { 3, 8, 8 }, { 6, 11, 6 }, { 9, 14, 4 },
97462306a36Sopenharmony_ci			{ 13, 15, 2 }, { 13, 15, 0 }, { 13, 16, -2 }, { 14, 16, -4 },
97562306a36Sopenharmony_ci			{ 15, 17, -6 }, { 15, 17, -8 }, { 16, 18, -10 },
97662306a36Sopenharmony_ci			{ 17, 19, -10 }, { 17, 19, -12 }, { 19, 20, -12 },
97762306a36Sopenharmony_ci			{ 20, 21, -12 }
97862306a36Sopenharmony_ci			}
97962306a36Sopenharmony_ci		}
98062306a36Sopenharmony_ci	},
98162306a36Sopenharmony_ci	{
98262306a36Sopenharmony_ci		.bpp = DSC_BPP(10), .bpc = 16,
98362306a36Sopenharmony_ci		{ 273, 15, 2048, 19, 28, 27, 27, {
98462306a36Sopenharmony_ci			{ 0, 4, 10 }, { 4, 9, 8 }, { 8, 13, 6 }, { 12, 17, 4 },
98562306a36Sopenharmony_ci			{ 17, 19, 2 }, { 17, 20, 0 }, { 17, 20, -2 }, { 18, 20, -4 },
98662306a36Sopenharmony_ci			{ 19, 21, -6 }, { 19, 21, -8 }, { 20, 22, -10 },
98762306a36Sopenharmony_ci			{ 21, 23, -10 }, { 21, 23, -12 }, { 23, 24, -12 },
98862306a36Sopenharmony_ci			{ 24, 25, -12 }
98962306a36Sopenharmony_ci			}
99062306a36Sopenharmony_ci		}
99162306a36Sopenharmony_ci	},
99262306a36Sopenharmony_ci	{ /* sentinel */ }
99362306a36Sopenharmony_ci};
99462306a36Sopenharmony_ci
99562306a36Sopenharmony_ci/*
99662306a36Sopenharmony_ci * Selected Rate Control Related Parameter Recommended Values for 4:2:2 from
99762306a36Sopenharmony_ci * DSC v1.2, v1.2a, v1.2b
99862306a36Sopenharmony_ci *
99962306a36Sopenharmony_ci * Cross-checked against C Model releases: DSC_model_20161212 and 20210623
100062306a36Sopenharmony_ci */
100162306a36Sopenharmony_cistatic const struct rc_parameters_data rc_parameters_1_2_420[] = {
100262306a36Sopenharmony_ci	{
100362306a36Sopenharmony_ci		.bpp = DSC_BPP(4), .bpc = 8,
100462306a36Sopenharmony_ci		{ 512, 12, 6144, 3, 12, 11, 11, {
100562306a36Sopenharmony_ci			{ 0, 4, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 1, 6, -2 },
100662306a36Sopenharmony_ci			{ 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
100762306a36Sopenharmony_ci			{ 3, 9, -8 }, { 3, 10, -10 }, { 5, 10, -10 }, { 5, 11, -12 },
100862306a36Sopenharmony_ci			{ 5, 11, -12 }, { 9, 12, -12 }, { 12, 13, -12 }
100962306a36Sopenharmony_ci			}
101062306a36Sopenharmony_ci		}
101162306a36Sopenharmony_ci	},
101262306a36Sopenharmony_ci	{
101362306a36Sopenharmony_ci		.bpp = DSC_BPP(4), .bpc = 10,
101462306a36Sopenharmony_ci		{ 512, 12, 6144, 7, 16, 15, 15, {
101562306a36Sopenharmony_ci			{ 0, 8, 2 }, { 4, 8, 0 }, { 5, 9, 0 }, { 5, 10, -2 },
101662306a36Sopenharmony_ci			{ 7, 11, -4 }, { 7, 11, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
101762306a36Sopenharmony_ci			{ 7, 13, -8 }, { 7, 14, -10 }, { 9, 14, -10 }, { 9, 15, -12 },
101862306a36Sopenharmony_ci			{ 9, 15, -12 }, { 13, 16, -12 }, { 16, 17, -12 }
101962306a36Sopenharmony_ci			}
102062306a36Sopenharmony_ci		}
102162306a36Sopenharmony_ci	},
102262306a36Sopenharmony_ci	{
102362306a36Sopenharmony_ci		.bpp = DSC_BPP(4), .bpc = 12,
102462306a36Sopenharmony_ci		{ 512, 12, 6144, 11, 20, 19, 19, {
102562306a36Sopenharmony_ci			{ 0, 12, 2 }, { 4, 12, 0 }, { 9, 13, 0 }, { 9, 14, -2 },
102662306a36Sopenharmony_ci			{ 11, 15, -4 }, { 11, 15, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
102762306a36Sopenharmony_ci			{ 11, 17, -8 }, { 11, 18, -10 }, { 13, 18, -10 },
102862306a36Sopenharmony_ci			{ 13, 19, -12 }, { 13, 19, -12 }, { 17, 20, -12 },
102962306a36Sopenharmony_ci			{ 20, 21, -12 }
103062306a36Sopenharmony_ci			}
103162306a36Sopenharmony_ci		}
103262306a36Sopenharmony_ci	},
103362306a36Sopenharmony_ci	{
103462306a36Sopenharmony_ci		.bpp = DSC_BPP(4), .bpc = 14,
103562306a36Sopenharmony_ci		{ 512, 12, 6144, 15, 24, 23, 23, {
103662306a36Sopenharmony_ci			{ 0, 12, 2 }, { 5, 13, 0 }, { 11, 15, 0 }, { 12, 17, -2 },
103762306a36Sopenharmony_ci			{ 15, 19, -4 }, { 15, 19, -6 }, { 15, 19, -8 }, { 15, 20, -8 },
103862306a36Sopenharmony_ci			{ 15, 21, -8 }, { 15, 22, -10 }, { 17, 22, -10 },
103962306a36Sopenharmony_ci			{ 17, 23, -12 }, { 17, 23, -12 }, { 21, 24, -12 },
104062306a36Sopenharmony_ci			{ 24, 25, -12 }
104162306a36Sopenharmony_ci			}
104262306a36Sopenharmony_ci		}
104362306a36Sopenharmony_ci	},
104462306a36Sopenharmony_ci	{
104562306a36Sopenharmony_ci		.bpp = DSC_BPP(4), .bpc = 16,
104662306a36Sopenharmony_ci		{ 512, 12, 6144, 19, 28, 27, 27, {
104762306a36Sopenharmony_ci			{ 0, 12, 2 }, { 6, 14, 0 }, { 13, 17, 0 }, { 15, 20, -2 },
104862306a36Sopenharmony_ci			{ 19, 23, -4 }, { 19, 23, -6 }, { 19, 23, -8 }, { 19, 24, -8 },
104962306a36Sopenharmony_ci			{ 19, 25, -8 }, { 19, 26, -10 }, { 21, 26, -10 },
105062306a36Sopenharmony_ci			{ 21, 27, -12 }, { 21, 27, -12 }, { 25, 28, -12 },
105162306a36Sopenharmony_ci			{ 28, 29, -12 }
105262306a36Sopenharmony_ci			}
105362306a36Sopenharmony_ci		}
105462306a36Sopenharmony_ci	},
105562306a36Sopenharmony_ci	{
105662306a36Sopenharmony_ci		.bpp = DSC_BPP(5), .bpc = 8,
105762306a36Sopenharmony_ci		{ 410, 15, 5632, 3, 12, 11, 11, {
105862306a36Sopenharmony_ci			{ 0, 3, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 2, 6, -2 },
105962306a36Sopenharmony_ci			{ 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
106062306a36Sopenharmony_ci			{ 3, 9, -8 }, { 3, 9, -10 }, { 5, 10, -10 }, { 5, 10, -10 },
106162306a36Sopenharmony_ci			{ 5, 11, -12 }, { 7, 11, -12 }, { 11, 12, -12 }
106262306a36Sopenharmony_ci			}
106362306a36Sopenharmony_ci		}
106462306a36Sopenharmony_ci	},
106562306a36Sopenharmony_ci	{
106662306a36Sopenharmony_ci		.bpp = DSC_BPP(5), .bpc = 10,
106762306a36Sopenharmony_ci		{ 410, 15, 5632, 7, 16, 15, 15, {
106862306a36Sopenharmony_ci			{ 0, 7, 2 }, { 4, 8, 0 }, { 5, 9, 0 }, { 6, 10, -2 },
106962306a36Sopenharmony_ci			{ 7, 11, -4 }, { 7, 11, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
107062306a36Sopenharmony_ci			{ 7, 13, -8 }, { 7, 13, -10 }, { 9, 14, -10 }, { 9, 14, -10 },
107162306a36Sopenharmony_ci			{ 9, 15, -12 }, { 11, 15, -12 }, { 15, 16, -12 }
107262306a36Sopenharmony_ci			}
107362306a36Sopenharmony_ci		}
107462306a36Sopenharmony_ci	},
107562306a36Sopenharmony_ci	{
107662306a36Sopenharmony_ci		.bpp = DSC_BPP(5), .bpc = 12,
107762306a36Sopenharmony_ci		{ 410, 15, 5632, 11, 20, 19, 19, {
107862306a36Sopenharmony_ci			{ 0, 11, 2 }, { 4, 12, 0 }, { 9, 13, 0 }, { 10, 14, -2 },
107962306a36Sopenharmony_ci			{ 11, 15, -4 }, { 11, 15, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
108062306a36Sopenharmony_ci			{ 11, 17, -8 }, { 11, 17, -10 }, { 13, 18, -10 },
108162306a36Sopenharmony_ci			{ 13, 18, -10 }, { 13, 19, -12 }, { 15, 19, -12 },
108262306a36Sopenharmony_ci			{ 19, 20, -12 }
108362306a36Sopenharmony_ci			}
108462306a36Sopenharmony_ci		}
108562306a36Sopenharmony_ci	},
108662306a36Sopenharmony_ci	{
108762306a36Sopenharmony_ci		.bpp = DSC_BPP(5), .bpc = 14,
108862306a36Sopenharmony_ci		{ 410, 15, 5632, 15, 24, 23, 23, {
108962306a36Sopenharmony_ci			{ 0, 11, 2 }, { 5, 13, 0 }, { 11, 15, 0 }, { 13, 18, -2 },
109062306a36Sopenharmony_ci			{ 15, 19, -4 }, { 15, 19, -6 }, { 15, 19, -8 }, { 15, 20, -8 },
109162306a36Sopenharmony_ci			{ 15, 21, -8 }, { 15, 21, -10 }, { 17, 22, -10 },
109262306a36Sopenharmony_ci			{ 17, 22, -10 }, { 17, 23, -12 }, { 19, 23, -12 },
109362306a36Sopenharmony_ci			{ 23, 24, -12 }
109462306a36Sopenharmony_ci			}
109562306a36Sopenharmony_ci		}
109662306a36Sopenharmony_ci	},
109762306a36Sopenharmony_ci	{
109862306a36Sopenharmony_ci		.bpp = DSC_BPP(5), .bpc = 16,
109962306a36Sopenharmony_ci		{ 410, 15, 5632, 19, 28, 27, 27, {
110062306a36Sopenharmony_ci			{ 0, 11, 2 }, { 6, 14, 0 }, { 13, 17, 0 }, { 16, 20, -2 },
110162306a36Sopenharmony_ci			{ 19, 23, -4 }, { 19, 23, -6 }, { 19, 23, -8 }, { 19, 24, -8 },
110262306a36Sopenharmony_ci			{ 19, 25, -8 }, { 19, 25, -10 }, { 21, 26, -10 },
110362306a36Sopenharmony_ci			{ 21, 26, -10 }, { 21, 27, -12 }, { 23, 27, -12 },
110462306a36Sopenharmony_ci			{ 27, 28, -12 }
110562306a36Sopenharmony_ci			}
110662306a36Sopenharmony_ci		}
110762306a36Sopenharmony_ci	},
110862306a36Sopenharmony_ci	{
110962306a36Sopenharmony_ci		.bpp = DSC_BPP(6), .bpc = 8,
111062306a36Sopenharmony_ci		{ 341, 15, 2048, 3, 12, 11, 11, {
111162306a36Sopenharmony_ci			{ 0, 2, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 1, 6, -2 },
111262306a36Sopenharmony_ci			{ 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
111362306a36Sopenharmony_ci			{ 3, 8, -8 }, { 3, 9, -10 }, { 5, 9, -10 }, { 5, 9, -12 },
111462306a36Sopenharmony_ci			{ 5, 9, -12 }, { 7, 10, -12 }, { 10, 12, -12 }
111562306a36Sopenharmony_ci			}
111662306a36Sopenharmony_ci		}
111762306a36Sopenharmony_ci	},
111862306a36Sopenharmony_ci	{
111962306a36Sopenharmony_ci		.bpp = DSC_BPP(6), .bpc = 10,
112062306a36Sopenharmony_ci		{ 341, 15, 2048, 7, 16, 15, 15, {
112162306a36Sopenharmony_ci			{ 0, 2, 2 }, { 2, 5, 0 }, { 3, 7, 0 }, { 4, 8, -2 },
112262306a36Sopenharmony_ci			{ 6, 9, -4 }, { 7, 10, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
112362306a36Sopenharmony_ci			{ 7, 12, -8 }, { 7, 13, -10 }, { 9, 13, -10 }, { 9, 13, -12 },
112462306a36Sopenharmony_ci			{ 9, 13, -12 }, { 11, 14, -12 }, { 14, 15, -12 }
112562306a36Sopenharmony_ci			}
112662306a36Sopenharmony_ci		}
112762306a36Sopenharmony_ci	},
112862306a36Sopenharmony_ci	{
112962306a36Sopenharmony_ci		.bpp = DSC_BPP(6), .bpc = 12,
113062306a36Sopenharmony_ci		{ 341, 15, 2048, 11, 20, 19, 19, {
113162306a36Sopenharmony_ci			{ 0, 6, 2 }, { 4, 9, 0 }, { 7, 11, 0 }, { 8, 12, -2 },
113262306a36Sopenharmony_ci			{ 10, 13, -4 }, { 11, 14, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
113362306a36Sopenharmony_ci			{ 11, 16, -8 }, { 11, 17, -10 }, { 13, 17, -10 },
113462306a36Sopenharmony_ci			{ 13, 17, -12 }, { 13, 17, -12 }, { 15, 18, -12 },
113562306a36Sopenharmony_ci			{ 18, 19, -12 }
113662306a36Sopenharmony_ci			}
113762306a36Sopenharmony_ci		}
113862306a36Sopenharmony_ci	},
113962306a36Sopenharmony_ci	{
114062306a36Sopenharmony_ci		.bpp = DSC_BPP(6), .bpc = 14,
114162306a36Sopenharmony_ci		{ 341, 15, 2048, 15, 24, 23, 23, {
114262306a36Sopenharmony_ci			{ 0, 6, 2 }, { 7, 10, 0 }, { 9, 13, 0 }, { 11, 16, -2 },
114362306a36Sopenharmony_ci			{ 14, 17, -4 }, { 15, 18, -6 }, { 15, 19, -8 }, { 15, 20, -8 },
114462306a36Sopenharmony_ci			{ 15, 20, -8 }, { 15, 21, -10 }, { 17, 21, -10 },
114562306a36Sopenharmony_ci			{ 17, 21, -12 }, { 17, 21, -12 }, { 19, 22, -12 },
114662306a36Sopenharmony_ci			{ 22, 23, -12 }
114762306a36Sopenharmony_ci			}
114862306a36Sopenharmony_ci		}
114962306a36Sopenharmony_ci	},
115062306a36Sopenharmony_ci	{
115162306a36Sopenharmony_ci		.bpp = DSC_BPP(6), .bpc = 16,
115262306a36Sopenharmony_ci		{ 341, 15, 2048, 19, 28, 27, 27, {
115362306a36Sopenharmony_ci			{ 0, 6, 2 }, { 6, 11, 0 }, { 11, 15, 0 }, { 14, 18, -2 },
115462306a36Sopenharmony_ci			{ 18, 21, -4 }, { 19, 22, -6 }, { 19, 23, -8 }, { 19, 24, -8 },
115562306a36Sopenharmony_ci			{ 19, 24, -8 }, { 19, 25, -10 }, { 21, 25, -10 },
115662306a36Sopenharmony_ci			{ 21, 25, -12 }, { 21, 25, -12 }, { 23, 26, -12 },
115762306a36Sopenharmony_ci			{ 26, 27, -12 }
115862306a36Sopenharmony_ci			}
115962306a36Sopenharmony_ci		}
116062306a36Sopenharmony_ci	},
116162306a36Sopenharmony_ci	{
116262306a36Sopenharmony_ci		.bpp = DSC_BPP(8), .bpc = 8,
116362306a36Sopenharmony_ci		{ 256, 15, 2048, 3, 12, 11, 11, {
116462306a36Sopenharmony_ci			{ 0, 0, 10 }, { 0, 1, 8 }, { 0, 1, 6 }, { 0, 2, 4 },
116562306a36Sopenharmony_ci			{ 1, 2, 2 }, { 1, 3, 0 }, { 1, 3, -2 }, { 2, 4, -4 },
116662306a36Sopenharmony_ci			{ 2, 5, -6 }, { 3, 5, -8 }, { 4, 6, -10 }, { 4, 7, -10 },
116762306a36Sopenharmony_ci			{ 5, 7, -12 }, { 7, 8, -12 }, { 8, 9, -12 }
116862306a36Sopenharmony_ci			}
116962306a36Sopenharmony_ci		}
117062306a36Sopenharmony_ci	},
117162306a36Sopenharmony_ci	{
117262306a36Sopenharmony_ci		.bpp = DSC_BPP(8), .bpc = 10,
117362306a36Sopenharmony_ci		{ 256, 15, 2048, 7, 16, 15, 15, {
117462306a36Sopenharmony_ci			{ 0, 2, 10 }, { 2, 5, 8 }, { 3, 5, 6 }, { 4, 6, 4 },
117562306a36Sopenharmony_ci			{ 5, 6, 2 }, { 5, 7, 0 }, { 5, 7, -2 }, { 6, 8, -4 },
117662306a36Sopenharmony_ci			{ 6, 9, -6 }, { 7, 9, -8 }, { 8, 10, -10 }, { 8, 11, -10 },
117762306a36Sopenharmony_ci			{ 9, 11, -12 }, { 11, 12, -12 }, { 12, 13, -12 }
117862306a36Sopenharmony_ci			}
117962306a36Sopenharmony_ci		}
118062306a36Sopenharmony_ci	},
118162306a36Sopenharmony_ci	{
118262306a36Sopenharmony_ci		.bpp = DSC_BPP(8), .bpc = 12,
118362306a36Sopenharmony_ci		{ 256, 15, 2048, 11, 20, 19, 19, {
118462306a36Sopenharmony_ci			{ 0, 4, 10 }, { 2, 7, 8 }, { 4, 9, 6 }, { 6, 11, 4 },
118562306a36Sopenharmony_ci			{ 9, 11, 2 }, { 9, 11, 0 }, { 9, 12, -2 }, { 10, 12, -4 },
118662306a36Sopenharmony_ci			{ 11, 13, -6 }, { 11, 13, -8 }, { 12, 14, -10 },
118762306a36Sopenharmony_ci			{ 13, 15, -10 }, { 13, 15, -12 }, { 15, 16, -12 },
118862306a36Sopenharmony_ci			{ 16, 17, -12 }
118962306a36Sopenharmony_ci			}
119062306a36Sopenharmony_ci		}
119162306a36Sopenharmony_ci	},
119262306a36Sopenharmony_ci	{
119362306a36Sopenharmony_ci		.bpp = DSC_BPP(8), .bpc = 14,
119462306a36Sopenharmony_ci		{ 256, 15, 2048, 15, 24, 23, 23, {
119562306a36Sopenharmony_ci			{ 0, 4, 10 }, { 3, 8, 8 }, { 6, 11, 6 }, { 9, 14, 4 },
119662306a36Sopenharmony_ci			{ 13, 15, 2 }, { 13, 15, 0 }, { 13, 16, -2 }, { 14, 16, -4 },
119762306a36Sopenharmony_ci			{ 15, 17, -6 }, { 15, 17, -8 }, { 16, 18, -10 },
119862306a36Sopenharmony_ci			{ 17, 19, -10 }, { 17, 19, -12 }, { 19, 20, -12 },
119962306a36Sopenharmony_ci			{ 20, 21, -12 }
120062306a36Sopenharmony_ci			}
120162306a36Sopenharmony_ci		}
120262306a36Sopenharmony_ci	},
120362306a36Sopenharmony_ci	{
120462306a36Sopenharmony_ci		.bpp = DSC_BPP(8), .bpc = 16,
120562306a36Sopenharmony_ci		{ 256, 15, 2048, 19, 28, 27, 27, {
120662306a36Sopenharmony_ci			{ 0, 4, 10 }, { 4, 9, 8 }, { 8, 13, 6 }, { 12, 17, 4 },
120762306a36Sopenharmony_ci			{ 17, 19, 2 }, { 17, 20, 0 }, { 17, 20, -2 }, { 18, 20, -4 },
120862306a36Sopenharmony_ci			{ 19, 21, -6 }, { 19, 21, -8 }, { 20, 22, -10 },
120962306a36Sopenharmony_ci			{ 21, 23, -10 }, { 21, 23, -12 }, { 23, 24, -12 },
121062306a36Sopenharmony_ci			{ 24, 25, -12 }
121162306a36Sopenharmony_ci			}
121262306a36Sopenharmony_ci		}
121362306a36Sopenharmony_ci	},
121462306a36Sopenharmony_ci	{ /* sentinel */ }
121562306a36Sopenharmony_ci};
121662306a36Sopenharmony_ci
121762306a36Sopenharmony_cistatic const struct rc_parameters *get_rc_params(const struct rc_parameters_data *rc_parameters,
121862306a36Sopenharmony_ci						 u16 dsc_bpp,
121962306a36Sopenharmony_ci						 u8 bits_per_component)
122062306a36Sopenharmony_ci{
122162306a36Sopenharmony_ci	int i;
122262306a36Sopenharmony_ci
122362306a36Sopenharmony_ci	for (i = 0; rc_parameters[i].bpp; i++)
122462306a36Sopenharmony_ci		if (rc_parameters[i].bpp == dsc_bpp &&
122562306a36Sopenharmony_ci		    rc_parameters[i].bpc == bits_per_component)
122662306a36Sopenharmony_ci			return &rc_parameters[i].params;
122762306a36Sopenharmony_ci
122862306a36Sopenharmony_ci	return NULL;
122962306a36Sopenharmony_ci}
123062306a36Sopenharmony_ci
123162306a36Sopenharmony_ci/**
123262306a36Sopenharmony_ci * drm_dsc_setup_rc_params() - Set parameters and limits for RC model in
123362306a36Sopenharmony_ci * accordance with the DSC 1.1 or 1.2 specification and DSC C Model
123462306a36Sopenharmony_ci * Required bits_per_pixel and bits_per_component to be set before calling this
123562306a36Sopenharmony_ci * function.
123662306a36Sopenharmony_ci *
123762306a36Sopenharmony_ci * @vdsc_cfg: DSC Configuration data partially filled by driver
123862306a36Sopenharmony_ci * @type: operating mode and standard to follow
123962306a36Sopenharmony_ci *
124062306a36Sopenharmony_ci * Return: 0 or -error code in case of an error
124162306a36Sopenharmony_ci */
124262306a36Sopenharmony_ciint drm_dsc_setup_rc_params(struct drm_dsc_config *vdsc_cfg, enum drm_dsc_params_type type)
124362306a36Sopenharmony_ci{
124462306a36Sopenharmony_ci	const struct rc_parameters_data *data;
124562306a36Sopenharmony_ci	const struct rc_parameters *rc_params;
124662306a36Sopenharmony_ci	int i;
124762306a36Sopenharmony_ci
124862306a36Sopenharmony_ci	if (WARN_ON_ONCE(!vdsc_cfg->bits_per_pixel ||
124962306a36Sopenharmony_ci			 !vdsc_cfg->bits_per_component))
125062306a36Sopenharmony_ci		return -EINVAL;
125162306a36Sopenharmony_ci
125262306a36Sopenharmony_ci	switch (type) {
125362306a36Sopenharmony_ci	case DRM_DSC_1_2_444:
125462306a36Sopenharmony_ci		data = rc_parameters_1_2_444;
125562306a36Sopenharmony_ci		break;
125662306a36Sopenharmony_ci	case DRM_DSC_1_1_PRE_SCR:
125762306a36Sopenharmony_ci		data = rc_parameters_pre_scr;
125862306a36Sopenharmony_ci		break;
125962306a36Sopenharmony_ci	case DRM_DSC_1_2_422:
126062306a36Sopenharmony_ci		data = rc_parameters_1_2_422;
126162306a36Sopenharmony_ci		break;
126262306a36Sopenharmony_ci	case DRM_DSC_1_2_420:
126362306a36Sopenharmony_ci		data = rc_parameters_1_2_420;
126462306a36Sopenharmony_ci		break;
126562306a36Sopenharmony_ci	default:
126662306a36Sopenharmony_ci		return -EINVAL;
126762306a36Sopenharmony_ci	}
126862306a36Sopenharmony_ci
126962306a36Sopenharmony_ci	rc_params = get_rc_params(data,
127062306a36Sopenharmony_ci				  vdsc_cfg->bits_per_pixel,
127162306a36Sopenharmony_ci				  vdsc_cfg->bits_per_component);
127262306a36Sopenharmony_ci	if (!rc_params)
127362306a36Sopenharmony_ci		return -EINVAL;
127462306a36Sopenharmony_ci
127562306a36Sopenharmony_ci	vdsc_cfg->first_line_bpg_offset = rc_params->first_line_bpg_offset;
127662306a36Sopenharmony_ci	vdsc_cfg->initial_xmit_delay = rc_params->initial_xmit_delay;
127762306a36Sopenharmony_ci	vdsc_cfg->initial_offset = rc_params->initial_offset;
127862306a36Sopenharmony_ci	vdsc_cfg->flatness_min_qp = rc_params->flatness_min_qp;
127962306a36Sopenharmony_ci	vdsc_cfg->flatness_max_qp = rc_params->flatness_max_qp;
128062306a36Sopenharmony_ci	vdsc_cfg->rc_quant_incr_limit0 = rc_params->rc_quant_incr_limit0;
128162306a36Sopenharmony_ci	vdsc_cfg->rc_quant_incr_limit1 = rc_params->rc_quant_incr_limit1;
128262306a36Sopenharmony_ci
128362306a36Sopenharmony_ci	for (i = 0; i < DSC_NUM_BUF_RANGES; i++) {
128462306a36Sopenharmony_ci		vdsc_cfg->rc_range_params[i].range_min_qp =
128562306a36Sopenharmony_ci			rc_params->rc_range_params[i].range_min_qp;
128662306a36Sopenharmony_ci		vdsc_cfg->rc_range_params[i].range_max_qp =
128762306a36Sopenharmony_ci			rc_params->rc_range_params[i].range_max_qp;
128862306a36Sopenharmony_ci		/*
128962306a36Sopenharmony_ci		 * Range BPG Offset uses 2's complement and is only a 6 bits. So
129062306a36Sopenharmony_ci		 * mask it to get only 6 bits.
129162306a36Sopenharmony_ci		 */
129262306a36Sopenharmony_ci		vdsc_cfg->rc_range_params[i].range_bpg_offset =
129362306a36Sopenharmony_ci			rc_params->rc_range_params[i].range_bpg_offset &
129462306a36Sopenharmony_ci			DSC_RANGE_BPG_OFFSET_MASK;
129562306a36Sopenharmony_ci	}
129662306a36Sopenharmony_ci
129762306a36Sopenharmony_ci	return 0;
129862306a36Sopenharmony_ci}
129962306a36Sopenharmony_ciEXPORT_SYMBOL(drm_dsc_setup_rc_params);
130062306a36Sopenharmony_ci
130162306a36Sopenharmony_ci/**
130262306a36Sopenharmony_ci * drm_dsc_compute_rc_parameters() - Write rate control
130362306a36Sopenharmony_ci * parameters to the dsc configuration defined in
130462306a36Sopenharmony_ci * &struct drm_dsc_config in accordance with the DSC 1.2
130562306a36Sopenharmony_ci * specification. Some configuration fields must be present
130662306a36Sopenharmony_ci * beforehand.
130762306a36Sopenharmony_ci *
130862306a36Sopenharmony_ci * @vdsc_cfg:
130962306a36Sopenharmony_ci * DSC Configuration data partially filled by driver
131062306a36Sopenharmony_ci */
131162306a36Sopenharmony_ciint drm_dsc_compute_rc_parameters(struct drm_dsc_config *vdsc_cfg)
131262306a36Sopenharmony_ci{
131362306a36Sopenharmony_ci	unsigned long groups_per_line = 0;
131462306a36Sopenharmony_ci	unsigned long groups_total = 0;
131562306a36Sopenharmony_ci	unsigned long num_extra_mux_bits = 0;
131662306a36Sopenharmony_ci	unsigned long slice_bits = 0;
131762306a36Sopenharmony_ci	unsigned long hrd_delay = 0;
131862306a36Sopenharmony_ci	unsigned long final_scale = 0;
131962306a36Sopenharmony_ci	unsigned long rbs_min = 0;
132062306a36Sopenharmony_ci
132162306a36Sopenharmony_ci	if (vdsc_cfg->native_420 || vdsc_cfg->native_422) {
132262306a36Sopenharmony_ci		/* Number of groups used to code each line of a slice */
132362306a36Sopenharmony_ci		groups_per_line = DIV_ROUND_UP(vdsc_cfg->slice_width / 2,
132462306a36Sopenharmony_ci					       DSC_RC_PIXELS_PER_GROUP);
132562306a36Sopenharmony_ci
132662306a36Sopenharmony_ci		/* chunksize in Bytes */
132762306a36Sopenharmony_ci		vdsc_cfg->slice_chunk_size = DIV_ROUND_UP(vdsc_cfg->slice_width / 2 *
132862306a36Sopenharmony_ci							  vdsc_cfg->bits_per_pixel,
132962306a36Sopenharmony_ci							  (8 * 16));
133062306a36Sopenharmony_ci	} else {
133162306a36Sopenharmony_ci		/* Number of groups used to code each line of a slice */
133262306a36Sopenharmony_ci		groups_per_line = DIV_ROUND_UP(vdsc_cfg->slice_width,
133362306a36Sopenharmony_ci					       DSC_RC_PIXELS_PER_GROUP);
133462306a36Sopenharmony_ci
133562306a36Sopenharmony_ci		/* chunksize in Bytes */
133662306a36Sopenharmony_ci		vdsc_cfg->slice_chunk_size = DIV_ROUND_UP(vdsc_cfg->slice_width *
133762306a36Sopenharmony_ci							  vdsc_cfg->bits_per_pixel,
133862306a36Sopenharmony_ci							  (8 * 16));
133962306a36Sopenharmony_ci	}
134062306a36Sopenharmony_ci
134162306a36Sopenharmony_ci	if (vdsc_cfg->convert_rgb)
134262306a36Sopenharmony_ci		num_extra_mux_bits = 3 * (vdsc_cfg->mux_word_size +
134362306a36Sopenharmony_ci					  (4 * vdsc_cfg->bits_per_component + 4)
134462306a36Sopenharmony_ci					  - 2);
134562306a36Sopenharmony_ci	else if (vdsc_cfg->native_422)
134662306a36Sopenharmony_ci		num_extra_mux_bits = 4 * vdsc_cfg->mux_word_size +
134762306a36Sopenharmony_ci			(4 * vdsc_cfg->bits_per_component + 4) +
134862306a36Sopenharmony_ci			3 * (4 * vdsc_cfg->bits_per_component) - 2;
134962306a36Sopenharmony_ci	else
135062306a36Sopenharmony_ci		num_extra_mux_bits = 3 * vdsc_cfg->mux_word_size +
135162306a36Sopenharmony_ci			(4 * vdsc_cfg->bits_per_component + 4) +
135262306a36Sopenharmony_ci			2 * (4 * vdsc_cfg->bits_per_component) - 2;
135362306a36Sopenharmony_ci	/* Number of bits in one Slice */
135462306a36Sopenharmony_ci	slice_bits = 8 * vdsc_cfg->slice_chunk_size * vdsc_cfg->slice_height;
135562306a36Sopenharmony_ci
135662306a36Sopenharmony_ci	while ((num_extra_mux_bits > 0) &&
135762306a36Sopenharmony_ci	       ((slice_bits - num_extra_mux_bits) % vdsc_cfg->mux_word_size))
135862306a36Sopenharmony_ci		num_extra_mux_bits--;
135962306a36Sopenharmony_ci
136062306a36Sopenharmony_ci	if (groups_per_line < vdsc_cfg->initial_scale_value - 8)
136162306a36Sopenharmony_ci		vdsc_cfg->initial_scale_value = groups_per_line + 8;
136262306a36Sopenharmony_ci
136362306a36Sopenharmony_ci	/* scale_decrement_interval calculation according to DSC spec 1.11 */
136462306a36Sopenharmony_ci	if (vdsc_cfg->initial_scale_value > 8)
136562306a36Sopenharmony_ci		vdsc_cfg->scale_decrement_interval = groups_per_line /
136662306a36Sopenharmony_ci			(vdsc_cfg->initial_scale_value - 8);
136762306a36Sopenharmony_ci	else
136862306a36Sopenharmony_ci		vdsc_cfg->scale_decrement_interval = DSC_SCALE_DECREMENT_INTERVAL_MAX;
136962306a36Sopenharmony_ci
137062306a36Sopenharmony_ci	vdsc_cfg->final_offset = vdsc_cfg->rc_model_size -
137162306a36Sopenharmony_ci		(vdsc_cfg->initial_xmit_delay *
137262306a36Sopenharmony_ci		 vdsc_cfg->bits_per_pixel + 8) / 16 + num_extra_mux_bits;
137362306a36Sopenharmony_ci
137462306a36Sopenharmony_ci	if (vdsc_cfg->final_offset >= vdsc_cfg->rc_model_size) {
137562306a36Sopenharmony_ci		DRM_DEBUG_KMS("FinalOfs < RcModelSze for this InitialXmitDelay\n");
137662306a36Sopenharmony_ci		return -ERANGE;
137762306a36Sopenharmony_ci	}
137862306a36Sopenharmony_ci
137962306a36Sopenharmony_ci	final_scale = (vdsc_cfg->rc_model_size * 8) /
138062306a36Sopenharmony_ci		(vdsc_cfg->rc_model_size - vdsc_cfg->final_offset);
138162306a36Sopenharmony_ci	if (vdsc_cfg->slice_height > 1)
138262306a36Sopenharmony_ci		/*
138362306a36Sopenharmony_ci		 * NflBpgOffset is 16 bit value with 11 fractional bits
138462306a36Sopenharmony_ci		 * hence we multiply by 2^11 for preserving the
138562306a36Sopenharmony_ci		 * fractional part
138662306a36Sopenharmony_ci		 */
138762306a36Sopenharmony_ci		vdsc_cfg->nfl_bpg_offset = DIV_ROUND_UP((vdsc_cfg->first_line_bpg_offset << 11),
138862306a36Sopenharmony_ci							(vdsc_cfg->slice_height - 1));
138962306a36Sopenharmony_ci	else
139062306a36Sopenharmony_ci		vdsc_cfg->nfl_bpg_offset = 0;
139162306a36Sopenharmony_ci
139262306a36Sopenharmony_ci	/* Number of groups used to code the entire slice */
139362306a36Sopenharmony_ci	groups_total = groups_per_line * vdsc_cfg->slice_height;
139462306a36Sopenharmony_ci
139562306a36Sopenharmony_ci	/* slice_bpg_offset is 16 bit value with 11 fractional bits */
139662306a36Sopenharmony_ci	vdsc_cfg->slice_bpg_offset = DIV_ROUND_UP(((vdsc_cfg->rc_model_size -
139762306a36Sopenharmony_ci						    vdsc_cfg->initial_offset +
139862306a36Sopenharmony_ci						    num_extra_mux_bits) << 11),
139962306a36Sopenharmony_ci						  groups_total);
140062306a36Sopenharmony_ci
140162306a36Sopenharmony_ci	if (final_scale > 9) {
140262306a36Sopenharmony_ci		/*
140362306a36Sopenharmony_ci		 * ScaleIncrementInterval =
140462306a36Sopenharmony_ci		 * finaloffset/((NflBpgOffset + SliceBpgOffset)*8(finalscale - 1.125))
140562306a36Sopenharmony_ci		 * as (NflBpgOffset + SliceBpgOffset) has 11 bit fractional value,
140662306a36Sopenharmony_ci		 * we need divide by 2^11 from pstDscCfg values
140762306a36Sopenharmony_ci		 */
140862306a36Sopenharmony_ci		vdsc_cfg->scale_increment_interval =
140962306a36Sopenharmony_ci				(vdsc_cfg->final_offset * (1 << 11)) /
141062306a36Sopenharmony_ci				((vdsc_cfg->nfl_bpg_offset +
141162306a36Sopenharmony_ci				vdsc_cfg->slice_bpg_offset) *
141262306a36Sopenharmony_ci				(final_scale - 9));
141362306a36Sopenharmony_ci	} else {
141462306a36Sopenharmony_ci		/*
141562306a36Sopenharmony_ci		 * If finalScaleValue is less than or equal to 9, a value of 0 should
141662306a36Sopenharmony_ci		 * be used to disable the scale increment at the end of the slice
141762306a36Sopenharmony_ci		 */
141862306a36Sopenharmony_ci		vdsc_cfg->scale_increment_interval = 0;
141962306a36Sopenharmony_ci	}
142062306a36Sopenharmony_ci
142162306a36Sopenharmony_ci	/*
142262306a36Sopenharmony_ci	 * DSC spec mentions that bits_per_pixel specifies the target
142362306a36Sopenharmony_ci	 * bits/pixel (bpp) rate that is used by the encoder,
142462306a36Sopenharmony_ci	 * in steps of 1/16 of a bit per pixel
142562306a36Sopenharmony_ci	 */
142662306a36Sopenharmony_ci	rbs_min = vdsc_cfg->rc_model_size - vdsc_cfg->initial_offset +
142762306a36Sopenharmony_ci		DIV_ROUND_UP(vdsc_cfg->initial_xmit_delay *
142862306a36Sopenharmony_ci			     vdsc_cfg->bits_per_pixel, 16) +
142962306a36Sopenharmony_ci		groups_per_line * vdsc_cfg->first_line_bpg_offset;
143062306a36Sopenharmony_ci
143162306a36Sopenharmony_ci	hrd_delay = DIV_ROUND_UP((rbs_min * 16), vdsc_cfg->bits_per_pixel);
143262306a36Sopenharmony_ci	vdsc_cfg->rc_bits = (hrd_delay * vdsc_cfg->bits_per_pixel) / 16;
143362306a36Sopenharmony_ci	vdsc_cfg->initial_dec_delay = hrd_delay - vdsc_cfg->initial_xmit_delay;
143462306a36Sopenharmony_ci
143562306a36Sopenharmony_ci	return 0;
143662306a36Sopenharmony_ci}
143762306a36Sopenharmony_ciEXPORT_SYMBOL(drm_dsc_compute_rc_parameters);
143862306a36Sopenharmony_ci
143962306a36Sopenharmony_ci/**
144062306a36Sopenharmony_ci * drm_dsc_get_bpp_int() - Get integer bits per pixel value for the given DRM DSC config
144162306a36Sopenharmony_ci * @vdsc_cfg: Pointer to DRM DSC config struct
144262306a36Sopenharmony_ci *
144362306a36Sopenharmony_ci * Return: Integer BPP value
144462306a36Sopenharmony_ci */
144562306a36Sopenharmony_ciu32 drm_dsc_get_bpp_int(const struct drm_dsc_config *vdsc_cfg)
144662306a36Sopenharmony_ci{
144762306a36Sopenharmony_ci	WARN_ON_ONCE(vdsc_cfg->bits_per_pixel & 0xf);
144862306a36Sopenharmony_ci	return vdsc_cfg->bits_per_pixel >> 4;
144962306a36Sopenharmony_ci}
145062306a36Sopenharmony_ciEXPORT_SYMBOL(drm_dsc_get_bpp_int);
145162306a36Sopenharmony_ci
145262306a36Sopenharmony_ci/**
145362306a36Sopenharmony_ci * drm_dsc_initial_scale_value() - Calculate the initial scale value for the given DSC config
145462306a36Sopenharmony_ci * @dsc: Pointer to DRM DSC config struct
145562306a36Sopenharmony_ci *
145662306a36Sopenharmony_ci * Return: Calculated initial scale value
145762306a36Sopenharmony_ci */
145862306a36Sopenharmony_ciu8 drm_dsc_initial_scale_value(const struct drm_dsc_config *dsc)
145962306a36Sopenharmony_ci{
146062306a36Sopenharmony_ci	return 8 * dsc->rc_model_size / (dsc->rc_model_size - dsc->initial_offset);
146162306a36Sopenharmony_ci}
146262306a36Sopenharmony_ciEXPORT_SYMBOL(drm_dsc_initial_scale_value);
146362306a36Sopenharmony_ci
146462306a36Sopenharmony_ci/**
146562306a36Sopenharmony_ci * drm_dsc_flatness_det_thresh() - Calculate the flatness_det_thresh for the given DSC config
146662306a36Sopenharmony_ci * @dsc: Pointer to DRM DSC config struct
146762306a36Sopenharmony_ci *
146862306a36Sopenharmony_ci * Return: Calculated flatness det thresh value
146962306a36Sopenharmony_ci */
147062306a36Sopenharmony_ciu32 drm_dsc_flatness_det_thresh(const struct drm_dsc_config *dsc)
147162306a36Sopenharmony_ci{
147262306a36Sopenharmony_ci	return 2 << (dsc->bits_per_component - 8);
147362306a36Sopenharmony_ci}
147462306a36Sopenharmony_ciEXPORT_SYMBOL(drm_dsc_flatness_det_thresh);
1475