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