11bb76ff1Sjsg // SPDX-License-Identifier: MIT
21bb76ff1Sjsg /*
31bb76ff1Sjsg * Copyright © 2018 Intel Corp
41bb76ff1Sjsg *
51bb76ff1Sjsg * Author:
61bb76ff1Sjsg * Manasi Navare <manasi.d.navare@intel.com>
71bb76ff1Sjsg */
81bb76ff1Sjsg
91bb76ff1Sjsg #include <linux/kernel.h>
101bb76ff1Sjsg #include <linux/module.h>
111bb76ff1Sjsg #include <linux/init.h>
121bb76ff1Sjsg #include <linux/errno.h>
131bb76ff1Sjsg #include <linux/byteorder/generic.h>
141bb76ff1Sjsg
151bb76ff1Sjsg #include <drm/display/drm_dp_helper.h>
161bb76ff1Sjsg #include <drm/display/drm_dsc_helper.h>
171bb76ff1Sjsg #include <drm/drm_print.h>
181bb76ff1Sjsg
191bb76ff1Sjsg /**
201bb76ff1Sjsg * DOC: dsc helpers
211bb76ff1Sjsg *
221bb76ff1Sjsg * VESA specification for DP 1.4 adds a new feature called Display Stream
231bb76ff1Sjsg * Compression (DSC) used to compress the pixel bits before sending it on
241bb76ff1Sjsg * DP/eDP/MIPI DSI interface. DSC is required to be enabled so that the existing
251bb76ff1Sjsg * display interfaces can support high resolutions at higher frames rates uisng
261bb76ff1Sjsg * the maximum available link capacity of these interfaces.
271bb76ff1Sjsg *
281bb76ff1Sjsg * These functions contain some common logic and helpers to deal with VESA
291bb76ff1Sjsg * Display Stream Compression standard required for DSC on Display Port/eDP or
301bb76ff1Sjsg * MIPI display interfaces.
311bb76ff1Sjsg */
321bb76ff1Sjsg
331bb76ff1Sjsg /**
341bb76ff1Sjsg * drm_dsc_dp_pps_header_init() - Initializes the PPS Header
351bb76ff1Sjsg * for DisplayPort as per the DP 1.4 spec.
361bb76ff1Sjsg * @pps_header: Secondary data packet header for DSC Picture
371bb76ff1Sjsg * Parameter Set as defined in &struct dp_sdp_header
381bb76ff1Sjsg *
391bb76ff1Sjsg * DP 1.4 spec defines the secondary data packet for sending the
401bb76ff1Sjsg * picture parameter infoframes from the source to the sink.
411bb76ff1Sjsg * This function populates the SDP header defined in
421bb76ff1Sjsg * &struct dp_sdp_header.
431bb76ff1Sjsg */
drm_dsc_dp_pps_header_init(struct dp_sdp_header * pps_header)441bb76ff1Sjsg void drm_dsc_dp_pps_header_init(struct dp_sdp_header *pps_header)
451bb76ff1Sjsg {
461bb76ff1Sjsg memset(pps_header, 0, sizeof(*pps_header));
471bb76ff1Sjsg
481bb76ff1Sjsg pps_header->HB1 = DP_SDP_PPS;
491bb76ff1Sjsg pps_header->HB2 = DP_SDP_PPS_HEADER_PAYLOAD_BYTES_MINUS_1;
501bb76ff1Sjsg }
511bb76ff1Sjsg EXPORT_SYMBOL(drm_dsc_dp_pps_header_init);
521bb76ff1Sjsg
531bb76ff1Sjsg /**
541bb76ff1Sjsg * drm_dsc_dp_rc_buffer_size - get rc buffer size in bytes
551bb76ff1Sjsg * @rc_buffer_block_size: block size code, according to DPCD offset 62h
561bb76ff1Sjsg * @rc_buffer_size: number of blocks - 1, according to DPCD offset 63h
571bb76ff1Sjsg *
581bb76ff1Sjsg * return:
591bb76ff1Sjsg * buffer size in bytes, or 0 on invalid input
601bb76ff1Sjsg */
drm_dsc_dp_rc_buffer_size(u8 rc_buffer_block_size,u8 rc_buffer_size)611bb76ff1Sjsg int drm_dsc_dp_rc_buffer_size(u8 rc_buffer_block_size, u8 rc_buffer_size)
621bb76ff1Sjsg {
631bb76ff1Sjsg int size = 1024 * (rc_buffer_size + 1);
641bb76ff1Sjsg
651bb76ff1Sjsg switch (rc_buffer_block_size) {
661bb76ff1Sjsg case DP_DSC_RC_BUF_BLK_SIZE_1:
671bb76ff1Sjsg return 1 * size;
681bb76ff1Sjsg case DP_DSC_RC_BUF_BLK_SIZE_4:
691bb76ff1Sjsg return 4 * size;
701bb76ff1Sjsg case DP_DSC_RC_BUF_BLK_SIZE_16:
711bb76ff1Sjsg return 16 * size;
721bb76ff1Sjsg case DP_DSC_RC_BUF_BLK_SIZE_64:
731bb76ff1Sjsg return 64 * size;
741bb76ff1Sjsg default:
751bb76ff1Sjsg return 0;
761bb76ff1Sjsg }
771bb76ff1Sjsg }
781bb76ff1Sjsg EXPORT_SYMBOL(drm_dsc_dp_rc_buffer_size);
791bb76ff1Sjsg
801bb76ff1Sjsg /**
811bb76ff1Sjsg * drm_dsc_pps_payload_pack() - Populates the DSC PPS
821bb76ff1Sjsg *
831bb76ff1Sjsg * @pps_payload:
841bb76ff1Sjsg * Bitwise struct for DSC Picture Parameter Set. This is defined
851bb76ff1Sjsg * by &struct drm_dsc_picture_parameter_set
861bb76ff1Sjsg * @dsc_cfg:
871bb76ff1Sjsg * DSC Configuration data filled by driver as defined by
881bb76ff1Sjsg * &struct drm_dsc_config
891bb76ff1Sjsg *
901bb76ff1Sjsg * DSC source device sends a picture parameter set (PPS) containing the
911bb76ff1Sjsg * information required by the sink to decode the compressed frame. Driver
921bb76ff1Sjsg * populates the DSC PPS struct using the DSC configuration parameters in
931bb76ff1Sjsg * the order expected by the DSC Display Sink device. For the DSC, the sink
941bb76ff1Sjsg * device expects the PPS payload in big endian format for fields
951bb76ff1Sjsg * that span more than 1 byte.
961bb76ff1Sjsg */
drm_dsc_pps_payload_pack(struct drm_dsc_picture_parameter_set * pps_payload,const struct drm_dsc_config * dsc_cfg)971bb76ff1Sjsg void drm_dsc_pps_payload_pack(struct drm_dsc_picture_parameter_set *pps_payload,
981bb76ff1Sjsg const struct drm_dsc_config *dsc_cfg)
991bb76ff1Sjsg {
1001bb76ff1Sjsg int i;
1011bb76ff1Sjsg
1021bb76ff1Sjsg /* Protect against someone accidentally changing struct size */
1031bb76ff1Sjsg BUILD_BUG_ON(sizeof(*pps_payload) !=
1041bb76ff1Sjsg DP_SDP_PPS_HEADER_PAYLOAD_BYTES_MINUS_1 + 1);
1051bb76ff1Sjsg
1061bb76ff1Sjsg memset(pps_payload, 0, sizeof(*pps_payload));
1071bb76ff1Sjsg
1081bb76ff1Sjsg /* PPS 0 */
1091bb76ff1Sjsg pps_payload->dsc_version =
1101bb76ff1Sjsg dsc_cfg->dsc_version_minor |
1111bb76ff1Sjsg dsc_cfg->dsc_version_major << DSC_PPS_VERSION_MAJOR_SHIFT;
1121bb76ff1Sjsg
1131bb76ff1Sjsg /* PPS 1, 2 is 0 */
1141bb76ff1Sjsg
1151bb76ff1Sjsg /* PPS 3 */
1161bb76ff1Sjsg pps_payload->pps_3 =
1171bb76ff1Sjsg dsc_cfg->line_buf_depth |
1181bb76ff1Sjsg dsc_cfg->bits_per_component << DSC_PPS_BPC_SHIFT;
1191bb76ff1Sjsg
1201bb76ff1Sjsg /* PPS 4 */
1211bb76ff1Sjsg pps_payload->pps_4 =
1221bb76ff1Sjsg ((dsc_cfg->bits_per_pixel & DSC_PPS_BPP_HIGH_MASK) >>
1231bb76ff1Sjsg DSC_PPS_MSB_SHIFT) |
1241bb76ff1Sjsg dsc_cfg->vbr_enable << DSC_PPS_VBR_EN_SHIFT |
1251bb76ff1Sjsg dsc_cfg->simple_422 << DSC_PPS_SIMPLE422_SHIFT |
1261bb76ff1Sjsg dsc_cfg->convert_rgb << DSC_PPS_CONVERT_RGB_SHIFT |
1271bb76ff1Sjsg dsc_cfg->block_pred_enable << DSC_PPS_BLOCK_PRED_EN_SHIFT;
1281bb76ff1Sjsg
1291bb76ff1Sjsg /* PPS 5 */
1301bb76ff1Sjsg pps_payload->bits_per_pixel_low =
1311bb76ff1Sjsg (dsc_cfg->bits_per_pixel & DSC_PPS_LSB_MASK);
1321bb76ff1Sjsg
1331bb76ff1Sjsg /*
1341bb76ff1Sjsg * The DSC panel expects the PPS packet to have big endian format
1351bb76ff1Sjsg * for data spanning 2 bytes. Use a macro cpu_to_be16() to convert
1361bb76ff1Sjsg * to big endian format. If format is little endian, it will swap
1371bb76ff1Sjsg * bytes to convert to Big endian else keep it unchanged.
1381bb76ff1Sjsg */
1391bb76ff1Sjsg
1401bb76ff1Sjsg /* PPS 6, 7 */
1411bb76ff1Sjsg pps_payload->pic_height = cpu_to_be16(dsc_cfg->pic_height);
1421bb76ff1Sjsg
1431bb76ff1Sjsg /* PPS 8, 9 */
1441bb76ff1Sjsg pps_payload->pic_width = cpu_to_be16(dsc_cfg->pic_width);
1451bb76ff1Sjsg
1461bb76ff1Sjsg /* PPS 10, 11 */
1471bb76ff1Sjsg pps_payload->slice_height = cpu_to_be16(dsc_cfg->slice_height);
1481bb76ff1Sjsg
1491bb76ff1Sjsg /* PPS 12, 13 */
1501bb76ff1Sjsg pps_payload->slice_width = cpu_to_be16(dsc_cfg->slice_width);
1511bb76ff1Sjsg
1521bb76ff1Sjsg /* PPS 14, 15 */
1531bb76ff1Sjsg pps_payload->chunk_size = cpu_to_be16(dsc_cfg->slice_chunk_size);
1541bb76ff1Sjsg
1551bb76ff1Sjsg /* PPS 16 */
1561bb76ff1Sjsg pps_payload->initial_xmit_delay_high =
1571bb76ff1Sjsg ((dsc_cfg->initial_xmit_delay &
1581bb76ff1Sjsg DSC_PPS_INIT_XMIT_DELAY_HIGH_MASK) >>
1591bb76ff1Sjsg DSC_PPS_MSB_SHIFT);
1601bb76ff1Sjsg
1611bb76ff1Sjsg /* PPS 17 */
1621bb76ff1Sjsg pps_payload->initial_xmit_delay_low =
1631bb76ff1Sjsg (dsc_cfg->initial_xmit_delay & DSC_PPS_LSB_MASK);
1641bb76ff1Sjsg
1651bb76ff1Sjsg /* PPS 18, 19 */
1661bb76ff1Sjsg pps_payload->initial_dec_delay =
1671bb76ff1Sjsg cpu_to_be16(dsc_cfg->initial_dec_delay);
1681bb76ff1Sjsg
1691bb76ff1Sjsg /* PPS 20 is 0 */
1701bb76ff1Sjsg
1711bb76ff1Sjsg /* PPS 21 */
1721bb76ff1Sjsg pps_payload->initial_scale_value =
1731bb76ff1Sjsg dsc_cfg->initial_scale_value;
1741bb76ff1Sjsg
1751bb76ff1Sjsg /* PPS 22, 23 */
1761bb76ff1Sjsg pps_payload->scale_increment_interval =
1771bb76ff1Sjsg cpu_to_be16(dsc_cfg->scale_increment_interval);
1781bb76ff1Sjsg
1791bb76ff1Sjsg /* PPS 24 */
1801bb76ff1Sjsg pps_payload->scale_decrement_interval_high =
1811bb76ff1Sjsg ((dsc_cfg->scale_decrement_interval &
1821bb76ff1Sjsg DSC_PPS_SCALE_DEC_INT_HIGH_MASK) >>
1831bb76ff1Sjsg DSC_PPS_MSB_SHIFT);
1841bb76ff1Sjsg
1851bb76ff1Sjsg /* PPS 25 */
1861bb76ff1Sjsg pps_payload->scale_decrement_interval_low =
1871bb76ff1Sjsg (dsc_cfg->scale_decrement_interval & DSC_PPS_LSB_MASK);
1881bb76ff1Sjsg
1891bb76ff1Sjsg /* PPS 26[7:0], PPS 27[7:5] RESERVED */
1901bb76ff1Sjsg
1911bb76ff1Sjsg /* PPS 27 */
1921bb76ff1Sjsg pps_payload->first_line_bpg_offset =
1931bb76ff1Sjsg dsc_cfg->first_line_bpg_offset;
1941bb76ff1Sjsg
1951bb76ff1Sjsg /* PPS 28, 29 */
1961bb76ff1Sjsg pps_payload->nfl_bpg_offset =
1971bb76ff1Sjsg cpu_to_be16(dsc_cfg->nfl_bpg_offset);
1981bb76ff1Sjsg
1991bb76ff1Sjsg /* PPS 30, 31 */
2001bb76ff1Sjsg pps_payload->slice_bpg_offset =
2011bb76ff1Sjsg cpu_to_be16(dsc_cfg->slice_bpg_offset);
2021bb76ff1Sjsg
2031bb76ff1Sjsg /* PPS 32, 33 */
2041bb76ff1Sjsg pps_payload->initial_offset =
2051bb76ff1Sjsg cpu_to_be16(dsc_cfg->initial_offset);
2061bb76ff1Sjsg
2071bb76ff1Sjsg /* PPS 34, 35 */
2081bb76ff1Sjsg pps_payload->final_offset = cpu_to_be16(dsc_cfg->final_offset);
2091bb76ff1Sjsg
2101bb76ff1Sjsg /* PPS 36 */
2111bb76ff1Sjsg pps_payload->flatness_min_qp = dsc_cfg->flatness_min_qp;
2121bb76ff1Sjsg
2131bb76ff1Sjsg /* PPS 37 */
2141bb76ff1Sjsg pps_payload->flatness_max_qp = dsc_cfg->flatness_max_qp;
2151bb76ff1Sjsg
2161bb76ff1Sjsg /* PPS 38, 39 */
2171bb76ff1Sjsg pps_payload->rc_model_size = cpu_to_be16(dsc_cfg->rc_model_size);
2181bb76ff1Sjsg
2191bb76ff1Sjsg /* PPS 40 */
2201bb76ff1Sjsg pps_payload->rc_edge_factor = DSC_RC_EDGE_FACTOR_CONST;
2211bb76ff1Sjsg
2221bb76ff1Sjsg /* PPS 41 */
2231bb76ff1Sjsg pps_payload->rc_quant_incr_limit0 =
2241bb76ff1Sjsg dsc_cfg->rc_quant_incr_limit0;
2251bb76ff1Sjsg
2261bb76ff1Sjsg /* PPS 42 */
2271bb76ff1Sjsg pps_payload->rc_quant_incr_limit1 =
2281bb76ff1Sjsg dsc_cfg->rc_quant_incr_limit1;
2291bb76ff1Sjsg
2301bb76ff1Sjsg /* PPS 43 */
2311bb76ff1Sjsg pps_payload->rc_tgt_offset = DSC_RC_TGT_OFFSET_LO_CONST |
2321bb76ff1Sjsg DSC_RC_TGT_OFFSET_HI_CONST << DSC_PPS_RC_TGT_OFFSET_HI_SHIFT;
2331bb76ff1Sjsg
2341bb76ff1Sjsg /* PPS 44 - 57 */
2351bb76ff1Sjsg for (i = 0; i < DSC_NUM_BUF_RANGES - 1; i++)
2361bb76ff1Sjsg pps_payload->rc_buf_thresh[i] =
2371bb76ff1Sjsg dsc_cfg->rc_buf_thresh[i];
2381bb76ff1Sjsg
2391bb76ff1Sjsg /* PPS 58 - 87 */
2401bb76ff1Sjsg /*
2411bb76ff1Sjsg * For DSC sink programming the RC Range parameter fields
2421bb76ff1Sjsg * are as follows: Min_qp[15:11], max_qp[10:6], offset[5:0]
2431bb76ff1Sjsg */
2441bb76ff1Sjsg for (i = 0; i < DSC_NUM_BUF_RANGES; i++) {
2451bb76ff1Sjsg pps_payload->rc_range_parameters[i] =
2461bb76ff1Sjsg cpu_to_be16((dsc_cfg->rc_range_params[i].range_min_qp <<
2471bb76ff1Sjsg DSC_PPS_RC_RANGE_MINQP_SHIFT) |
2481bb76ff1Sjsg (dsc_cfg->rc_range_params[i].range_max_qp <<
2491bb76ff1Sjsg DSC_PPS_RC_RANGE_MAXQP_SHIFT) |
2501bb76ff1Sjsg (dsc_cfg->rc_range_params[i].range_bpg_offset));
2511bb76ff1Sjsg }
2521bb76ff1Sjsg
2531bb76ff1Sjsg /* PPS 88 */
2541bb76ff1Sjsg pps_payload->native_422_420 = dsc_cfg->native_422 |
2551bb76ff1Sjsg dsc_cfg->native_420 << DSC_PPS_NATIVE_420_SHIFT;
2561bb76ff1Sjsg
2571bb76ff1Sjsg /* PPS 89 */
2581bb76ff1Sjsg pps_payload->second_line_bpg_offset =
2591bb76ff1Sjsg dsc_cfg->second_line_bpg_offset;
2601bb76ff1Sjsg
2611bb76ff1Sjsg /* PPS 90, 91 */
2621bb76ff1Sjsg pps_payload->nsl_bpg_offset =
2631bb76ff1Sjsg cpu_to_be16(dsc_cfg->nsl_bpg_offset);
2641bb76ff1Sjsg
2651bb76ff1Sjsg /* PPS 92, 93 */
2661bb76ff1Sjsg pps_payload->second_line_offset_adj =
2671bb76ff1Sjsg cpu_to_be16(dsc_cfg->second_line_offset_adj);
2681bb76ff1Sjsg
2691bb76ff1Sjsg /* PPS 94 - 127 are O */
2701bb76ff1Sjsg }
2711bb76ff1Sjsg EXPORT_SYMBOL(drm_dsc_pps_payload_pack);
2721bb76ff1Sjsg
2731bb76ff1Sjsg /**
274*f005ef32Sjsg * drm_dsc_set_const_params() - Set DSC parameters considered typically
275*f005ef32Sjsg * constant across operation modes
276*f005ef32Sjsg *
277*f005ef32Sjsg * @vdsc_cfg:
278*f005ef32Sjsg * DSC Configuration data partially filled by driver
279*f005ef32Sjsg */
drm_dsc_set_const_params(struct drm_dsc_config * vdsc_cfg)280*f005ef32Sjsg void drm_dsc_set_const_params(struct drm_dsc_config *vdsc_cfg)
281*f005ef32Sjsg {
282*f005ef32Sjsg if (!vdsc_cfg->rc_model_size)
283*f005ef32Sjsg vdsc_cfg->rc_model_size = DSC_RC_MODEL_SIZE_CONST;
284*f005ef32Sjsg vdsc_cfg->rc_edge_factor = DSC_RC_EDGE_FACTOR_CONST;
285*f005ef32Sjsg vdsc_cfg->rc_tgt_offset_high = DSC_RC_TGT_OFFSET_HI_CONST;
286*f005ef32Sjsg vdsc_cfg->rc_tgt_offset_low = DSC_RC_TGT_OFFSET_LO_CONST;
287*f005ef32Sjsg
288*f005ef32Sjsg if (vdsc_cfg->bits_per_component <= 10)
289*f005ef32Sjsg vdsc_cfg->mux_word_size = DSC_MUX_WORD_SIZE_8_10_BPC;
290*f005ef32Sjsg else
291*f005ef32Sjsg vdsc_cfg->mux_word_size = DSC_MUX_WORD_SIZE_12_BPC;
292*f005ef32Sjsg }
293*f005ef32Sjsg EXPORT_SYMBOL(drm_dsc_set_const_params);
294*f005ef32Sjsg
295*f005ef32Sjsg /* From DSC_v1.11 spec, rc_parameter_Set syntax element typically constant */
296*f005ef32Sjsg static const u16 drm_dsc_rc_buf_thresh[] = {
297*f005ef32Sjsg 896, 1792, 2688, 3584, 4480, 5376, 6272, 6720, 7168, 7616,
298*f005ef32Sjsg 7744, 7872, 8000, 8064
299*f005ef32Sjsg };
300*f005ef32Sjsg
301*f005ef32Sjsg /**
302*f005ef32Sjsg * drm_dsc_set_rc_buf_thresh() - Set thresholds for the RC model
303*f005ef32Sjsg * in accordance with the DSC 1.2 specification.
304*f005ef32Sjsg *
305*f005ef32Sjsg * @vdsc_cfg: DSC Configuration data partially filled by driver
306*f005ef32Sjsg */
drm_dsc_set_rc_buf_thresh(struct drm_dsc_config * vdsc_cfg)307*f005ef32Sjsg void drm_dsc_set_rc_buf_thresh(struct drm_dsc_config *vdsc_cfg)
308*f005ef32Sjsg {
309*f005ef32Sjsg int i;
310*f005ef32Sjsg
311*f005ef32Sjsg BUILD_BUG_ON(ARRAY_SIZE(drm_dsc_rc_buf_thresh) !=
312*f005ef32Sjsg DSC_NUM_BUF_RANGES - 1);
313*f005ef32Sjsg BUILD_BUG_ON(ARRAY_SIZE(drm_dsc_rc_buf_thresh) !=
314*f005ef32Sjsg ARRAY_SIZE(vdsc_cfg->rc_buf_thresh));
315*f005ef32Sjsg
316*f005ef32Sjsg for (i = 0; i < ARRAY_SIZE(drm_dsc_rc_buf_thresh); i++)
317*f005ef32Sjsg vdsc_cfg->rc_buf_thresh[i] = drm_dsc_rc_buf_thresh[i] >> 6;
318*f005ef32Sjsg
319*f005ef32Sjsg /*
320*f005ef32Sjsg * For 6bpp, RC Buffer threshold 12 and 13 need a different value
321*f005ef32Sjsg * as per C Model
322*f005ef32Sjsg */
323*f005ef32Sjsg if (vdsc_cfg->bits_per_pixel == 6 << 4) {
324*f005ef32Sjsg vdsc_cfg->rc_buf_thresh[12] = 7936 >> 6;
325*f005ef32Sjsg vdsc_cfg->rc_buf_thresh[13] = 8000 >> 6;
326*f005ef32Sjsg }
327*f005ef32Sjsg }
328*f005ef32Sjsg EXPORT_SYMBOL(drm_dsc_set_rc_buf_thresh);
329*f005ef32Sjsg
330*f005ef32Sjsg struct rc_parameters {
331*f005ef32Sjsg u16 initial_xmit_delay;
332*f005ef32Sjsg u8 first_line_bpg_offset;
333*f005ef32Sjsg u16 initial_offset;
334*f005ef32Sjsg u8 flatness_min_qp;
335*f005ef32Sjsg u8 flatness_max_qp;
336*f005ef32Sjsg u8 rc_quant_incr_limit0;
337*f005ef32Sjsg u8 rc_quant_incr_limit1;
338*f005ef32Sjsg struct drm_dsc_rc_range_parameters rc_range_params[DSC_NUM_BUF_RANGES];
339*f005ef32Sjsg };
340*f005ef32Sjsg
341*f005ef32Sjsg struct rc_parameters_data {
342*f005ef32Sjsg u8 bpp;
343*f005ef32Sjsg u8 bpc;
344*f005ef32Sjsg struct rc_parameters params;
345*f005ef32Sjsg };
346*f005ef32Sjsg
347*f005ef32Sjsg #define DSC_BPP(bpp) ((bpp) << 4)
348*f005ef32Sjsg
349*f005ef32Sjsg /*
350*f005ef32Sjsg * Rate Control Related Parameter Recommended Values from DSC_v1.1 spec prior
351*f005ef32Sjsg * to DSC 1.1 fractional bpp underflow SCR (DSC_v1.1_E1.pdf)
352*f005ef32Sjsg *
353*f005ef32Sjsg * Cross-checked against C Model releases: DSC_model_20161212 and 20210623
354*f005ef32Sjsg */
355*f005ef32Sjsg static const struct rc_parameters_data rc_parameters_pre_scr[] = {
356*f005ef32Sjsg {
357*f005ef32Sjsg .bpp = DSC_BPP(6), .bpc = 8,
358*f005ef32Sjsg { 683, 15, 6144, 3, 13, 11, 11, {
359*f005ef32Sjsg { 0, 2, 0 }, { 1, 4, -2 }, { 3, 6, -2 }, { 4, 6, -4 },
360*f005ef32Sjsg { 5, 7, -6 }, { 5, 7, -6 }, { 6, 7, -6 }, { 6, 8, -8 },
361*f005ef32Sjsg { 7, 9, -8 }, { 8, 10, -10 }, { 9, 11, -10 }, { 10, 12, -12 },
362*f005ef32Sjsg { 10, 13, -12 }, { 12, 14, -12 }, { 15, 15, -12 }
363*f005ef32Sjsg }
364*f005ef32Sjsg }
365*f005ef32Sjsg },
366*f005ef32Sjsg {
367*f005ef32Sjsg .bpp = DSC_BPP(8), .bpc = 8,
368*f005ef32Sjsg { 512, 12, 6144, 3, 12, 11, 11, {
369*f005ef32Sjsg { 0, 4, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 1, 6, -2 },
370*f005ef32Sjsg { 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
371*f005ef32Sjsg { 3, 9, -8 }, { 3, 10, -10 }, { 5, 11, -10 }, { 5, 12, -12 },
372*f005ef32Sjsg { 5, 13, -12 }, { 7, 13, -12 }, { 13, 15, -12 }
373*f005ef32Sjsg }
374*f005ef32Sjsg }
375*f005ef32Sjsg },
376*f005ef32Sjsg {
377*f005ef32Sjsg .bpp = DSC_BPP(8), .bpc = 10,
378*f005ef32Sjsg { 512, 12, 6144, 7, 16, 15, 15, {
379*f005ef32Sjsg /*
380*f005ef32Sjsg * DSC model/pre-SCR-cfg has 8 for range_max_qp[0], however
381*f005ef32Sjsg * VESA DSC 1.1 Table E-5 sets it to 4.
382*f005ef32Sjsg */
383*f005ef32Sjsg { 0, 4, 2 }, { 4, 8, 0 }, { 5, 9, 0 }, { 5, 10, -2 },
384*f005ef32Sjsg { 7, 11, -4 }, { 7, 11, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
385*f005ef32Sjsg { 7, 13, -8 }, { 7, 14, -10 }, { 9, 15, -10 }, { 9, 16, -12 },
386*f005ef32Sjsg { 9, 17, -12 }, { 11, 17, -12 }, { 17, 19, -12 }
387*f005ef32Sjsg }
388*f005ef32Sjsg }
389*f005ef32Sjsg },
390*f005ef32Sjsg {
391*f005ef32Sjsg .bpp = DSC_BPP(8), .bpc = 12,
392*f005ef32Sjsg { 512, 12, 6144, 11, 20, 19, 19, {
393*f005ef32Sjsg { 0, 12, 2 }, { 4, 12, 0 }, { 9, 13, 0 }, { 9, 14, -2 },
394*f005ef32Sjsg { 11, 15, -4 }, { 11, 15, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
395*f005ef32Sjsg { 11, 17, -8 }, { 11, 18, -10 }, { 13, 19, -10 },
396*f005ef32Sjsg { 13, 20, -12 }, { 13, 21, -12 }, { 15, 21, -12 },
397*f005ef32Sjsg { 21, 23, -12 }
398*f005ef32Sjsg }
399*f005ef32Sjsg }
400*f005ef32Sjsg },
401*f005ef32Sjsg {
402*f005ef32Sjsg .bpp = DSC_BPP(10), .bpc = 8,
403*f005ef32Sjsg { 410, 12, 5632, 3, 12, 11, 11, {
404*f005ef32Sjsg { 0, 3, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 2, 6, -2 },
405*f005ef32Sjsg { 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
406*f005ef32Sjsg { 3, 9, -8 }, { 3, 9, -10 }, { 5, 10, -10 }, { 5, 11, -10 },
407*f005ef32Sjsg { 5, 12, -12 }, { 7, 13, -12 }, { 13, 15, -12 }
408*f005ef32Sjsg }
409*f005ef32Sjsg }
410*f005ef32Sjsg },
411*f005ef32Sjsg {
412*f005ef32Sjsg .bpp = DSC_BPP(10), .bpc = 10,
413*f005ef32Sjsg { 410, 12, 5632, 7, 16, 15, 15, {
414*f005ef32Sjsg { 0, 7, 2 }, { 4, 8, 0 }, { 5, 9, 0 }, { 6, 10, -2 },
415*f005ef32Sjsg { 7, 11, -4 }, { 7, 11, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
416*f005ef32Sjsg { 7, 13, -8 }, { 7, 13, -10 }, { 9, 14, -10 }, { 9, 15, -10 },
417*f005ef32Sjsg { 9, 16, -12 }, { 11, 17, -12 }, { 17, 19, -12 }
418*f005ef32Sjsg }
419*f005ef32Sjsg }
420*f005ef32Sjsg },
421*f005ef32Sjsg {
422*f005ef32Sjsg .bpp = DSC_BPP(10), .bpc = 12,
423*f005ef32Sjsg { 410, 12, 5632, 11, 20, 19, 19, {
424*f005ef32Sjsg { 0, 11, 2 }, { 4, 12, 0 }, { 9, 13, 0 }, { 10, 14, -2 },
425*f005ef32Sjsg { 11, 15, -4 }, { 11, 15, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
426*f005ef32Sjsg { 11, 17, -8 }, { 11, 17, -10 }, { 13, 18, -10 },
427*f005ef32Sjsg { 13, 19, -10 }, { 13, 20, -12 }, { 15, 21, -12 },
428*f005ef32Sjsg { 21, 23, -12 }
429*f005ef32Sjsg }
430*f005ef32Sjsg }
431*f005ef32Sjsg },
432*f005ef32Sjsg {
433*f005ef32Sjsg .bpp = DSC_BPP(12), .bpc = 8,
434*f005ef32Sjsg { 341, 15, 2048, 3, 12, 11, 11, {
435*f005ef32Sjsg { 0, 2, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 1, 6, -2 },
436*f005ef32Sjsg { 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
437*f005ef32Sjsg { 3, 9, -8 }, { 3, 10, -10 }, { 5, 11, -10 },
438*f005ef32Sjsg { 5, 12, -12 }, { 5, 13, -12 }, { 7, 13, -12 }, { 13, 15, -12 }
439*f005ef32Sjsg }
440*f005ef32Sjsg }
441*f005ef32Sjsg },
442*f005ef32Sjsg {
443*f005ef32Sjsg .bpp = DSC_BPP(12), .bpc = 10,
444*f005ef32Sjsg { 341, 15, 2048, 7, 16, 15, 15, {
445*f005ef32Sjsg { 0, 2, 2 }, { 2, 5, 0 }, { 3, 7, 0 }, { 4, 8, -2 },
446*f005ef32Sjsg { 6, 9, -4 }, { 7, 10, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
447*f005ef32Sjsg { 7, 13, -8 }, { 7, 14, -10 }, { 9, 15, -10 }, { 9, 16, -12 },
448*f005ef32Sjsg { 9, 17, -12 }, { 11, 17, -12 }, { 17, 19, -12 }
449*f005ef32Sjsg }
450*f005ef32Sjsg }
451*f005ef32Sjsg },
452*f005ef32Sjsg {
453*f005ef32Sjsg .bpp = DSC_BPP(12), .bpc = 12,
454*f005ef32Sjsg { 341, 15, 2048, 11, 20, 19, 19, {
455*f005ef32Sjsg { 0, 6, 2 }, { 4, 9, 0 }, { 7, 11, 0 }, { 8, 12, -2 },
456*f005ef32Sjsg { 10, 13, -4 }, { 11, 14, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
457*f005ef32Sjsg { 11, 17, -8 }, { 11, 18, -10 }, { 13, 19, -10 },
458*f005ef32Sjsg { 13, 20, -12 }, { 13, 21, -12 }, { 15, 21, -12 },
459*f005ef32Sjsg { 21, 23, -12 }
460*f005ef32Sjsg }
461*f005ef32Sjsg }
462*f005ef32Sjsg },
463*f005ef32Sjsg {
464*f005ef32Sjsg .bpp = DSC_BPP(15), .bpc = 8,
465*f005ef32Sjsg { 273, 15, 2048, 3, 12, 11, 11, {
466*f005ef32Sjsg { 0, 0, 10 }, { 0, 1, 8 }, { 0, 1, 6 }, { 0, 2, 4 },
467*f005ef32Sjsg { 1, 2, 2 }, { 1, 3, 0 }, { 1, 4, -2 }, { 2, 4, -4 },
468*f005ef32Sjsg { 3, 4, -6 }, { 3, 5, -8 }, { 4, 6, -10 }, { 5, 7, -10 },
469*f005ef32Sjsg { 5, 8, -12 }, { 7, 13, -12 }, { 13, 15, -12 }
470*f005ef32Sjsg }
471*f005ef32Sjsg }
472*f005ef32Sjsg },
473*f005ef32Sjsg {
474*f005ef32Sjsg .bpp = DSC_BPP(15), .bpc = 10,
475*f005ef32Sjsg { 273, 15, 2048, 7, 16, 15, 15, {
476*f005ef32Sjsg { 0, 2, 10 }, { 2, 5, 8 }, { 3, 5, 6 }, { 4, 6, 4 },
477*f005ef32Sjsg { 5, 6, 2 }, { 5, 7, 0 }, { 5, 8, -2 }, { 6, 8, -4 },
478*f005ef32Sjsg { 7, 8, -6 }, { 7, 9, -8 }, { 8, 10, -10 }, { 9, 11, -10 },
479*f005ef32Sjsg { 9, 12, -12 }, { 11, 17, -12 }, { 17, 19, -12 }
480*f005ef32Sjsg }
481*f005ef32Sjsg }
482*f005ef32Sjsg },
483*f005ef32Sjsg {
484*f005ef32Sjsg .bpp = DSC_BPP(15), .bpc = 12,
485*f005ef32Sjsg { 273, 15, 2048, 11, 20, 19, 19, {
486*f005ef32Sjsg { 0, 4, 10 }, { 2, 7, 8 }, { 4, 9, 6 }, { 6, 11, 4 },
487*f005ef32Sjsg { 9, 11, 2 }, { 9, 11, 0 }, { 9, 12, -2 }, { 10, 12, -4 },
488*f005ef32Sjsg { 11, 12, -6 }, { 11, 13, -8 }, { 12, 14, -10 },
489*f005ef32Sjsg { 13, 15, -10 }, { 13, 16, -12 }, { 15, 21, -12 },
490*f005ef32Sjsg { 21, 23, -12 }
491*f005ef32Sjsg }
492*f005ef32Sjsg }
493*f005ef32Sjsg },
494*f005ef32Sjsg { /* sentinel */ }
495*f005ef32Sjsg };
496*f005ef32Sjsg
497*f005ef32Sjsg /*
498*f005ef32Sjsg * Selected Rate Control Related Parameter Recommended Values from DSC v1.2, v1.2a, v1.2b and
499*f005ef32Sjsg * DSC_v1.1_E1 specs.
500*f005ef32Sjsg *
501*f005ef32Sjsg * Cross-checked against C Model releases: DSC_model_20161212 and 20210623
502*f005ef32Sjsg */
503*f005ef32Sjsg static const struct rc_parameters_data rc_parameters_1_2_444[] = {
504*f005ef32Sjsg {
505*f005ef32Sjsg .bpp = DSC_BPP(6), .bpc = 8,
506*f005ef32Sjsg { 768, 15, 6144, 3, 13, 11, 11, {
507*f005ef32Sjsg { 0, 4, 0 }, { 1, 6, -2 }, { 3, 8, -2 }, { 4, 8, -4 },
508*f005ef32Sjsg { 5, 9, -6 }, { 5, 9, -6 }, { 6, 9, -6 }, { 6, 10, -8 },
509*f005ef32Sjsg { 7, 11, -8 }, { 8, 12, -10 }, { 9, 12, -10 }, { 10, 12, -12 },
510*f005ef32Sjsg { 10, 12, -12 }, { 11, 12, -12 }, { 13, 14, -12 }
511*f005ef32Sjsg }
512*f005ef32Sjsg }
513*f005ef32Sjsg },
514*f005ef32Sjsg {
515*f005ef32Sjsg .bpp = DSC_BPP(6), .bpc = 10,
516*f005ef32Sjsg { 768, 15, 6144, 7, 17, 15, 15, {
517*f005ef32Sjsg { 0, 8, 0 }, { 3, 10, -2 }, { 7, 12, -2 }, { 8, 12, -4 },
518*f005ef32Sjsg { 9, 13, -6 }, { 9, 13, -6 }, { 10, 13, -6 }, { 10, 14, -8 },
519*f005ef32Sjsg { 11, 15, -8 }, { 12, 16, -10 }, { 13, 16, -10 },
520*f005ef32Sjsg { 14, 16, -12 }, { 14, 16, -12 }, { 15, 16, -12 },
521*f005ef32Sjsg { 17, 18, -12 }
522*f005ef32Sjsg }
523*f005ef32Sjsg }
524*f005ef32Sjsg },
525*f005ef32Sjsg {
526*f005ef32Sjsg .bpp = DSC_BPP(6), .bpc = 12,
527*f005ef32Sjsg { 768, 15, 6144, 11, 21, 19, 19, {
528*f005ef32Sjsg { 0, 12, 0 }, { 5, 14, -2 }, { 11, 16, -2 }, { 12, 16, -4 },
529*f005ef32Sjsg { 13, 17, -6 }, { 13, 17, -6 }, { 14, 17, -6 }, { 14, 18, -8 },
530*f005ef32Sjsg { 15, 19, -8 }, { 16, 20, -10 }, { 17, 20, -10 },
531*f005ef32Sjsg { 18, 20, -12 }, { 18, 20, -12 }, { 19, 20, -12 },
532*f005ef32Sjsg { 21, 22, -12 }
533*f005ef32Sjsg }
534*f005ef32Sjsg }
535*f005ef32Sjsg },
536*f005ef32Sjsg {
537*f005ef32Sjsg .bpp = DSC_BPP(6), .bpc = 14,
538*f005ef32Sjsg { 768, 15, 6144, 15, 25, 23, 23, {
539*f005ef32Sjsg { 0, 16, 0 }, { 7, 18, -2 }, { 15, 20, -2 }, { 16, 20, -4 },
540*f005ef32Sjsg { 17, 21, -6 }, { 17, 21, -6 }, { 18, 21, -6 }, { 18, 22, -8 },
541*f005ef32Sjsg { 19, 23, -8 }, { 20, 24, -10 }, { 21, 24, -10 },
542*f005ef32Sjsg { 22, 24, -12 }, { 22, 24, -12 }, { 23, 24, -12 },
543*f005ef32Sjsg { 25, 26, -12 }
544*f005ef32Sjsg }
545*f005ef32Sjsg }
546*f005ef32Sjsg },
547*f005ef32Sjsg {
548*f005ef32Sjsg .bpp = DSC_BPP(6), .bpc = 16,
549*f005ef32Sjsg { 768, 15, 6144, 19, 29, 27, 27, {
550*f005ef32Sjsg { 0, 20, 0 }, { 9, 22, -2 }, { 19, 24, -2 }, { 20, 24, -4 },
551*f005ef32Sjsg { 21, 25, -6 }, { 21, 25, -6 }, { 22, 25, -6 }, { 22, 26, -8 },
552*f005ef32Sjsg { 23, 27, -8 }, { 24, 28, -10 }, { 25, 28, -10 },
553*f005ef32Sjsg { 26, 28, -12 }, { 26, 28, -12 }, { 27, 28, -12 },
554*f005ef32Sjsg { 29, 30, -12 }
555*f005ef32Sjsg }
556*f005ef32Sjsg }
557*f005ef32Sjsg },
558*f005ef32Sjsg {
559*f005ef32Sjsg .bpp = DSC_BPP(8), .bpc = 8,
560*f005ef32Sjsg { 512, 12, 6144, 3, 12, 11, 11, {
561*f005ef32Sjsg { 0, 4, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 1, 6, -2 },
562*f005ef32Sjsg { 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
563*f005ef32Sjsg { 3, 9, -8 }, { 3, 10, -10 }, { 5, 10, -10 }, { 5, 11, -12 },
564*f005ef32Sjsg { 5, 11, -12 }, { 9, 12, -12 }, { 12, 13, -12 }
565*f005ef32Sjsg }
566*f005ef32Sjsg }
567*f005ef32Sjsg },
568*f005ef32Sjsg {
569*f005ef32Sjsg .bpp = DSC_BPP(8), .bpc = 10,
570*f005ef32Sjsg { 512, 12, 6144, 7, 16, 15, 15, {
571*f005ef32Sjsg { 0, 8, 2 }, { 4, 8, 0 }, { 5, 9, 0 }, { 5, 10, -2 },
572*f005ef32Sjsg { 7, 11, -4 }, { 7, 11, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
573*f005ef32Sjsg { 7, 13, -8 }, { 7, 14, -10 }, { 9, 14, -10 }, { 9, 15, -12 },
574*f005ef32Sjsg { 9, 15, -12 }, { 13, 16, -12 }, { 16, 17, -12 }
575*f005ef32Sjsg }
576*f005ef32Sjsg }
577*f005ef32Sjsg },
578*f005ef32Sjsg {
579*f005ef32Sjsg .bpp = DSC_BPP(8), .bpc = 12,
580*f005ef32Sjsg { 512, 12, 6144, 11, 20, 19, 19, {
581*f005ef32Sjsg { 0, 12, 2 }, { 4, 12, 0 }, { 9, 13, 0 }, { 9, 14, -2 },
582*f005ef32Sjsg { 11, 15, -4 }, { 11, 15, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
583*f005ef32Sjsg { 11, 17, -8 }, { 11, 18, -10 }, { 13, 18, -10 },
584*f005ef32Sjsg { 13, 19, -12 }, { 13, 19, -12 }, { 17, 20, -12 },
585*f005ef32Sjsg { 20, 21, -12 }
586*f005ef32Sjsg }
587*f005ef32Sjsg }
588*f005ef32Sjsg },
589*f005ef32Sjsg {
590*f005ef32Sjsg .bpp = DSC_BPP(8), .bpc = 14,
591*f005ef32Sjsg { 512, 12, 6144, 15, 24, 23, 23, {
592*f005ef32Sjsg { 0, 12, 2 }, { 5, 13, 0 }, { 11, 15, 0 }, { 12, 17, -2 },
593*f005ef32Sjsg { 15, 19, -4 }, { 15, 19, -6 }, { 15, 19, -8 }, { 15, 20, -8 },
594*f005ef32Sjsg { 15, 21, -8 }, { 15, 22, -10 }, { 17, 22, -10 },
595*f005ef32Sjsg { 17, 23, -12 }, { 17, 23, -12 }, { 21, 24, -12 },
596*f005ef32Sjsg { 24, 25, -12 }
597*f005ef32Sjsg }
598*f005ef32Sjsg }
599*f005ef32Sjsg },
600*f005ef32Sjsg {
601*f005ef32Sjsg .bpp = DSC_BPP(8), .bpc = 16,
602*f005ef32Sjsg { 512, 12, 6144, 19, 28, 27, 27, {
603*f005ef32Sjsg { 0, 12, 2 }, { 6, 14, 0 }, { 13, 17, 0 }, { 15, 20, -2 },
604*f005ef32Sjsg { 19, 23, -4 }, { 19, 23, -6 }, { 19, 23, -8 }, { 19, 24, -8 },
605*f005ef32Sjsg { 19, 25, -8 }, { 19, 26, -10 }, { 21, 26, -10 },
606*f005ef32Sjsg { 21, 27, -12 }, { 21, 27, -12 }, { 25, 28, -12 },
607*f005ef32Sjsg { 28, 29, -12 }
608*f005ef32Sjsg }
609*f005ef32Sjsg }
610*f005ef32Sjsg },
611*f005ef32Sjsg {
612*f005ef32Sjsg .bpp = DSC_BPP(10), .bpc = 8,
613*f005ef32Sjsg { 410, 15, 5632, 3, 12, 11, 11, {
614*f005ef32Sjsg { 0, 3, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 2, 6, -2 },
615*f005ef32Sjsg { 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
616*f005ef32Sjsg { 3, 9, -8 }, { 3, 9, -10 }, { 5, 10, -10 }, { 5, 10, -10 },
617*f005ef32Sjsg { 5, 11, -12 }, { 7, 11, -12 }, { 11, 12, -12 }
618*f005ef32Sjsg }
619*f005ef32Sjsg }
620*f005ef32Sjsg },
621*f005ef32Sjsg {
622*f005ef32Sjsg .bpp = DSC_BPP(10), .bpc = 10,
623*f005ef32Sjsg { 410, 15, 5632, 7, 16, 15, 15, {
624*f005ef32Sjsg { 0, 7, 2 }, { 4, 8, 0 }, { 5, 9, 0 }, { 6, 10, -2 },
625*f005ef32Sjsg { 7, 11, -4 }, { 7, 11, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
626*f005ef32Sjsg { 7, 13, -8 }, { 7, 13, -10 }, { 9, 14, -10 }, { 9, 14, -10 },
627*f005ef32Sjsg { 9, 15, -12 }, { 11, 15, -12 }, { 15, 16, -12 }
628*f005ef32Sjsg }
629*f005ef32Sjsg }
630*f005ef32Sjsg },
631*f005ef32Sjsg {
632*f005ef32Sjsg .bpp = DSC_BPP(10), .bpc = 12,
633*f005ef32Sjsg { 410, 15, 5632, 11, 20, 19, 19, {
634*f005ef32Sjsg { 0, 11, 2 }, { 4, 12, 0 }, { 9, 13, 0 }, { 10, 14, -2 },
635*f005ef32Sjsg { 11, 15, -4 }, { 11, 15, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
636*f005ef32Sjsg { 11, 17, -8 }, { 11, 17, -10 }, { 13, 18, -10 },
637*f005ef32Sjsg { 13, 18, -10 }, { 13, 19, -12 }, { 15, 19, -12 },
638*f005ef32Sjsg { 19, 20, -12 }
639*f005ef32Sjsg }
640*f005ef32Sjsg }
641*f005ef32Sjsg },
642*f005ef32Sjsg {
643*f005ef32Sjsg .bpp = DSC_BPP(10), .bpc = 14,
644*f005ef32Sjsg { 410, 15, 5632, 15, 24, 23, 23, {
645*f005ef32Sjsg { 0, 11, 2 }, { 5, 13, 0 }, { 11, 15, 0 }, { 13, 18, -2 },
646*f005ef32Sjsg { 15, 19, -4 }, { 15, 19, -6 }, { 15, 19, -8 }, { 15, 20, -8 },
647*f005ef32Sjsg { 15, 21, -8 }, { 15, 21, -10 }, { 17, 22, -10 },
648*f005ef32Sjsg { 17, 22, -10 }, { 17, 23, -12 }, { 19, 23, -12 },
649*f005ef32Sjsg { 23, 24, -12 }
650*f005ef32Sjsg }
651*f005ef32Sjsg }
652*f005ef32Sjsg },
653*f005ef32Sjsg {
654*f005ef32Sjsg .bpp = DSC_BPP(10), .bpc = 16,
655*f005ef32Sjsg { 410, 15, 5632, 19, 28, 27, 27, {
656*f005ef32Sjsg { 0, 11, 2 }, { 6, 14, 0 }, { 13, 17, 0 }, { 16, 20, -2 },
657*f005ef32Sjsg { 19, 23, -4 }, { 19, 23, -6 }, { 19, 23, -8 }, { 19, 24, -8 },
658*f005ef32Sjsg { 19, 25, -8 }, { 19, 25, -10 }, { 21, 26, -10 },
659*f005ef32Sjsg { 21, 26, -10 }, { 21, 27, -12 }, { 23, 27, -12 },
660*f005ef32Sjsg { 27, 28, -12 }
661*f005ef32Sjsg }
662*f005ef32Sjsg }
663*f005ef32Sjsg },
664*f005ef32Sjsg {
665*f005ef32Sjsg .bpp = DSC_BPP(12), .bpc = 8,
666*f005ef32Sjsg { 341, 15, 2048, 3, 12, 11, 11, {
667*f005ef32Sjsg { 0, 2, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 1, 6, -2 },
668*f005ef32Sjsg { 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
669*f005ef32Sjsg { 3, 8, -8 }, { 3, 9, -10 }, { 5, 9, -10 }, { 5, 9, -12 },
670*f005ef32Sjsg { 5, 9, -12 }, { 7, 10, -12 }, { 10, 11, -12 }
671*f005ef32Sjsg }
672*f005ef32Sjsg }
673*f005ef32Sjsg },
674*f005ef32Sjsg {
675*f005ef32Sjsg .bpp = DSC_BPP(12), .bpc = 10,
676*f005ef32Sjsg { 341, 15, 2048, 7, 16, 15, 15, {
677*f005ef32Sjsg { 0, 2, 2 }, { 2, 5, 0 }, { 3, 7, 0 }, { 4, 8, -2 },
678*f005ef32Sjsg { 6, 9, -4 }, { 7, 10, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
679*f005ef32Sjsg { 7, 12, -8 }, { 7, 13, -10 }, { 9, 13, -10 }, { 9, 13, -12 },
680*f005ef32Sjsg { 9, 13, -12 }, { 11, 14, -12 }, { 14, 15, -12 }
681*f005ef32Sjsg }
682*f005ef32Sjsg }
683*f005ef32Sjsg },
684*f005ef32Sjsg {
685*f005ef32Sjsg .bpp = DSC_BPP(12), .bpc = 12,
686*f005ef32Sjsg { 341, 15, 2048, 11, 20, 19, 19, {
687*f005ef32Sjsg { 0, 6, 2 }, { 4, 9, 0 }, { 7, 11, 0 }, { 8, 12, -2 },
688*f005ef32Sjsg { 10, 13, -4 }, { 11, 14, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
689*f005ef32Sjsg { 11, 16, -8 }, { 11, 17, -10 }, { 13, 17, -10 },
690*f005ef32Sjsg { 13, 17, -12 }, { 13, 17, -12 }, { 15, 18, -12 },
691*f005ef32Sjsg { 18, 19, -12 }
692*f005ef32Sjsg }
693*f005ef32Sjsg }
694*f005ef32Sjsg },
695*f005ef32Sjsg {
696*f005ef32Sjsg .bpp = DSC_BPP(12), .bpc = 14,
697*f005ef32Sjsg { 341, 15, 2048, 15, 24, 23, 23, {
698*f005ef32Sjsg { 0, 6, 2 }, { 7, 10, 0 }, { 9, 13, 0 }, { 11, 16, -2 },
699*f005ef32Sjsg { 14, 17, -4 }, { 15, 18, -6 }, { 15, 19, -8 }, { 15, 20, -8 },
700*f005ef32Sjsg { 15, 20, -8 }, { 15, 21, -10 }, { 17, 21, -10 },
701*f005ef32Sjsg { 17, 21, -12 }, { 17, 21, -12 }, { 19, 22, -12 },
702*f005ef32Sjsg { 22, 23, -12 }
703*f005ef32Sjsg }
704*f005ef32Sjsg }
705*f005ef32Sjsg },
706*f005ef32Sjsg {
707*f005ef32Sjsg .bpp = DSC_BPP(12), .bpc = 16,
708*f005ef32Sjsg { 341, 15, 2048, 19, 28, 27, 27, {
709*f005ef32Sjsg { 0, 6, 2 }, { 6, 11, 0 }, { 11, 15, 0 }, { 14, 18, -2 },
710*f005ef32Sjsg { 18, 21, -4 }, { 19, 22, -6 }, { 19, 23, -8 }, { 19, 24, -8 },
711*f005ef32Sjsg { 19, 24, -8 }, { 19, 25, -10 }, { 21, 25, -10 },
712*f005ef32Sjsg { 21, 25, -12 }, { 21, 25, -12 }, { 23, 26, -12 },
713*f005ef32Sjsg { 26, 27, -12 }
714*f005ef32Sjsg }
715*f005ef32Sjsg }
716*f005ef32Sjsg },
717*f005ef32Sjsg {
718*f005ef32Sjsg .bpp = DSC_BPP(15), .bpc = 8,
719*f005ef32Sjsg { 273, 15, 2048, 3, 12, 11, 11, {
720*f005ef32Sjsg { 0, 0, 10 }, { 0, 1, 8 }, { 0, 1, 6 }, { 0, 2, 4 },
721*f005ef32Sjsg { 1, 2, 2 }, { 1, 3, 0 }, { 1, 3, -2 }, { 2, 4, -4 },
722*f005ef32Sjsg { 2, 5, -6 }, { 3, 5, -8 }, { 4, 6, -10 }, { 4, 7, -10 },
723*f005ef32Sjsg { 5, 7, -12 }, { 7, 8, -12 }, { 8, 9, -12 }
724*f005ef32Sjsg }
725*f005ef32Sjsg }
726*f005ef32Sjsg },
727*f005ef32Sjsg {
728*f005ef32Sjsg .bpp = DSC_BPP(15), .bpc = 10,
729*f005ef32Sjsg { 273, 15, 2048, 7, 16, 15, 15, {
730*f005ef32Sjsg { 0, 2, 10 }, { 2, 5, 8 }, { 3, 5, 6 }, { 4, 6, 4 },
731*f005ef32Sjsg { 5, 6, 2 }, { 5, 7, 0 }, { 5, 7, -2 }, { 6, 8, -4 },
732*f005ef32Sjsg { 6, 9, -6 }, { 7, 9, -8 }, { 8, 10, -10 }, { 8, 11, -10 },
733*f005ef32Sjsg { 9, 11, -12 }, { 11, 12, -12 }, { 12, 13, -12 }
734*f005ef32Sjsg }
735*f005ef32Sjsg }
736*f005ef32Sjsg },
737*f005ef32Sjsg {
738*f005ef32Sjsg .bpp = DSC_BPP(15), .bpc = 12,
739*f005ef32Sjsg { 273, 15, 2048, 11, 20, 19, 19, {
740*f005ef32Sjsg { 0, 4, 10 }, { 2, 7, 8 }, { 4, 9, 6 }, { 6, 11, 4 },
741*f005ef32Sjsg { 9, 11, 2 }, { 9, 11, 0 }, { 9, 12, -2 }, { 10, 12, -4 },
742*f005ef32Sjsg { 11, 13, -6 }, { 11, 13, -8 }, { 12, 14, -10 },
743*f005ef32Sjsg { 13, 15, -10 }, { 13, 15, -12 }, { 15, 16, -12 },
744*f005ef32Sjsg { 16, 17, -12 }
745*f005ef32Sjsg }
746*f005ef32Sjsg }
747*f005ef32Sjsg },
748*f005ef32Sjsg {
749*f005ef32Sjsg .bpp = DSC_BPP(15), .bpc = 14,
750*f005ef32Sjsg { 273, 15, 2048, 15, 24, 23, 23, {
751*f005ef32Sjsg { 0, 4, 10 }, { 3, 8, 8 }, { 6, 11, 6 }, { 9, 14, 4 },
752*f005ef32Sjsg { 13, 15, 2 }, { 13, 15, 0 }, { 13, 16, -2 }, { 14, 16, -4 },
753*f005ef32Sjsg { 15, 17, -6 }, { 15, 17, -8 }, { 16, 18, -10 },
754*f005ef32Sjsg { 17, 19, -10 }, { 17, 19, -12 }, { 19, 20, -12 },
755*f005ef32Sjsg { 20, 21, -12 }
756*f005ef32Sjsg }
757*f005ef32Sjsg }
758*f005ef32Sjsg },
759*f005ef32Sjsg {
760*f005ef32Sjsg .bpp = DSC_BPP(15), .bpc = 16,
761*f005ef32Sjsg { 273, 15, 2048, 19, 28, 27, 27, {
762*f005ef32Sjsg { 0, 4, 10 }, { 4, 9, 8 }, { 8, 13, 6 }, { 12, 17, 4 },
763*f005ef32Sjsg { 17, 19, 2 }, { 17, 20, 0 }, { 17, 20, -2 }, { 18, 20, -4 },
764*f005ef32Sjsg { 19, 21, -6 }, { 19, 21, -8 }, { 20, 22, -10 },
765*f005ef32Sjsg { 21, 23, -10 }, { 21, 23, -12 }, { 23, 24, -12 },
766*f005ef32Sjsg { 24, 25, -12 }
767*f005ef32Sjsg }
768*f005ef32Sjsg }
769*f005ef32Sjsg },
770*f005ef32Sjsg { /* sentinel */ }
771*f005ef32Sjsg };
772*f005ef32Sjsg
773*f005ef32Sjsg /*
774*f005ef32Sjsg * Selected Rate Control Related Parameter Recommended Values for 4:2:2 from
775*f005ef32Sjsg * DSC v1.2, v1.2a, v1.2b
776*f005ef32Sjsg *
777*f005ef32Sjsg * Cross-checked against C Model releases: DSC_model_20161212 and 20210623
778*f005ef32Sjsg */
779*f005ef32Sjsg static const struct rc_parameters_data rc_parameters_1_2_422[] = {
780*f005ef32Sjsg {
781*f005ef32Sjsg .bpp = DSC_BPP(6), .bpc = 8,
782*f005ef32Sjsg { 512, 15, 6144, 3, 12, 11, 11, {
783*f005ef32Sjsg { 0, 4, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 1, 6, -2 },
784*f005ef32Sjsg { 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
785*f005ef32Sjsg { 3, 9, -8 }, { 3, 10, -10 }, { 5, 10, -10 }, { 5, 11, -12 },
786*f005ef32Sjsg { 5, 11, -12 }, { 9, 12, -12 }, { 12, 13, -12 }
787*f005ef32Sjsg }
788*f005ef32Sjsg }
789*f005ef32Sjsg },
790*f005ef32Sjsg {
791*f005ef32Sjsg .bpp = DSC_BPP(6), .bpc = 10,
792*f005ef32Sjsg { 512, 15, 6144, 7, 16, 15, 15, {
793*f005ef32Sjsg { 0, 8, 2 }, { 4, 8, 0 }, { 5, 9, 0 }, { 5, 10, -2 },
794*f005ef32Sjsg { 7, 11, -4 }, { 7, 11, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
795*f005ef32Sjsg { 7, 13, -8 }, { 7, 14, -10 }, { 9, 14, -10 }, { 9, 15, -12 },
796*f005ef32Sjsg { 9, 15, -12 }, { 13, 16, -12 }, { 16, 17, -12 }
797*f005ef32Sjsg }
798*f005ef32Sjsg }
799*f005ef32Sjsg },
800*f005ef32Sjsg {
801*f005ef32Sjsg .bpp = DSC_BPP(6), .bpc = 12,
802*f005ef32Sjsg { 512, 15, 6144, 11, 20, 19, 19, {
803*f005ef32Sjsg { 0, 12, 2 }, { 4, 12, 0 }, { 9, 13, 0 }, { 9, 14, -2 },
804*f005ef32Sjsg { 11, 15, -4 }, { 11, 15, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
805*f005ef32Sjsg { 11, 17, -8 }, { 11, 18, -10 }, { 13, 18, -10 },
806*f005ef32Sjsg { 13, 19, -12 }, { 13, 19, -12 }, { 17, 20, -12 },
807*f005ef32Sjsg { 20, 21, -12 }
808*f005ef32Sjsg }
809*f005ef32Sjsg }
810*f005ef32Sjsg },
811*f005ef32Sjsg {
812*f005ef32Sjsg .bpp = DSC_BPP(6), .bpc = 14,
813*f005ef32Sjsg { 512, 15, 6144, 15, 24, 23, 23, {
814*f005ef32Sjsg { 0, 12, 2 }, { 5, 13, 0 }, { 11, 15, 0 }, { 12, 17, -2 },
815*f005ef32Sjsg { 15, 19, -4 }, { 15, 19, -6 }, { 15, 19, -8 }, { 15, 20, -8 },
816*f005ef32Sjsg { 15, 21, -8 }, { 15, 22, -10 }, { 17, 22, -10 },
817*f005ef32Sjsg { 17, 23, -12 }, { 17, 23, -12 }, { 21, 24, -12 },
818*f005ef32Sjsg { 24, 25, -12 }
819*f005ef32Sjsg }
820*f005ef32Sjsg }
821*f005ef32Sjsg },
822*f005ef32Sjsg {
823*f005ef32Sjsg .bpp = DSC_BPP(6), .bpc = 16,
824*f005ef32Sjsg { 512, 15, 6144, 19, 28, 27, 27, {
825*f005ef32Sjsg { 0, 12, 2 }, { 6, 14, 0 }, { 13, 17, 0 }, { 15, 20, -2 },
826*f005ef32Sjsg { 19, 23, -4 }, { 19, 23, -6 }, { 19, 23, -8 }, { 19, 24, -8 },
827*f005ef32Sjsg { 19, 25, -8 }, { 19, 26, -10 }, { 21, 26, -10 },
828*f005ef32Sjsg { 21, 27, -12 }, { 21, 27, -12 }, { 25, 28, -12 },
829*f005ef32Sjsg { 28, 29, -12 }
830*f005ef32Sjsg }
831*f005ef32Sjsg }
832*f005ef32Sjsg },
833*f005ef32Sjsg {
834*f005ef32Sjsg .bpp = DSC_BPP(7), .bpc = 8,
835*f005ef32Sjsg { 410, 15, 5632, 3, 12, 11, 11, {
836*f005ef32Sjsg { 0, 3, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 2, 6, -2 },
837*f005ef32Sjsg { 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
838*f005ef32Sjsg { 3, 9, -8 }, { 3, 9, -10 }, { 5, 10, -10 }, { 5, 10, -10 },
839*f005ef32Sjsg { 5, 11, -12 }, { 7, 11, -12 }, { 11, 12, -12 }
840*f005ef32Sjsg }
841*f005ef32Sjsg }
842*f005ef32Sjsg },
843*f005ef32Sjsg {
844*f005ef32Sjsg .bpp = DSC_BPP(7), .bpc = 10,
845*f005ef32Sjsg { 410, 15, 5632, 7, 16, 15, 15, {
846*f005ef32Sjsg { 0, 7, 2 }, { 4, 8, 0 }, { 5, 9, 0 }, { 6, 10, -2 },
847*f005ef32Sjsg { 7, 11, -4 }, { 7, 11, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
848*f005ef32Sjsg { 7, 13, -8 }, { 7, 13, -10 }, { 9, 14, -10 }, { 9, 14, -10 },
849*f005ef32Sjsg { 9, 15, -12 }, { 11, 15, -12 }, { 15, 16, -12 }
850*f005ef32Sjsg }
851*f005ef32Sjsg }
852*f005ef32Sjsg },
853*f005ef32Sjsg {
854*f005ef32Sjsg .bpp = DSC_BPP(7), .bpc = 12,
855*f005ef32Sjsg { 410, 15, 5632, 11, 20, 19, 19, {
856*f005ef32Sjsg { 0, 11, 2 }, { 4, 12, 0 }, { 9, 13, 0 }, { 10, 14, -2 },
857*f005ef32Sjsg { 11, 15, -4 }, { 11, 15, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
858*f005ef32Sjsg { 11, 17, -8 }, { 11, 17, -10 }, { 13, 18, -10 },
859*f005ef32Sjsg { 13, 18, -10 }, { 13, 19, -12 }, { 15, 19, -12 },
860*f005ef32Sjsg { 19, 20, -12 }
861*f005ef32Sjsg }
862*f005ef32Sjsg }
863*f005ef32Sjsg },
864*f005ef32Sjsg {
865*f005ef32Sjsg .bpp = DSC_BPP(7), .bpc = 14,
866*f005ef32Sjsg { 410, 15, 5632, 15, 24, 23, 23, {
867*f005ef32Sjsg { 0, 11, 2 }, { 5, 13, 0 }, { 11, 15, 0 }, { 13, 18, -2 },
868*f005ef32Sjsg { 15, 19, -4 }, { 15, 19, -6 }, { 15, 19, -8 }, { 15, 20, -8 },
869*f005ef32Sjsg { 15, 21, -8 }, { 15, 21, -10 }, { 17, 22, -10 },
870*f005ef32Sjsg { 17, 22, -10 }, { 17, 23, -12 }, { 19, 23, -12 },
871*f005ef32Sjsg { 23, 24, -12 }
872*f005ef32Sjsg }
873*f005ef32Sjsg }
874*f005ef32Sjsg },
875*f005ef32Sjsg {
876*f005ef32Sjsg .bpp = DSC_BPP(7), .bpc = 16,
877*f005ef32Sjsg { 410, 15, 5632, 19, 28, 27, 27, {
878*f005ef32Sjsg { 0, 11, 2 }, { 6, 14, 0 }, { 13, 17, 0 }, { 16, 20, -2 },
879*f005ef32Sjsg { 19, 23, -4 }, { 19, 23, -6 }, { 19, 23, -8 }, { 19, 24, -8 },
880*f005ef32Sjsg { 19, 25, -8 }, { 19, 25, -10 }, { 21, 26, -10 },
881*f005ef32Sjsg { 21, 26, -10 }, { 21, 27, -12 }, { 23, 27, -12 },
882*f005ef32Sjsg { 27, 28, -12 }
883*f005ef32Sjsg }
884*f005ef32Sjsg }
885*f005ef32Sjsg },
886*f005ef32Sjsg {
887*f005ef32Sjsg .bpp = DSC_BPP(8), .bpc = 8,
888*f005ef32Sjsg { 341, 15, 2048, 3, 12, 11, 11, {
889*f005ef32Sjsg { 0, 2, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 1, 6, -2 },
890*f005ef32Sjsg { 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
891*f005ef32Sjsg { 3, 8, -8 }, { 3, 9, -10 }, { 5, 9, -10 }, { 5, 9, -12 },
892*f005ef32Sjsg { 5, 9, -12 }, { 7, 10, -12 }, { 10, 11, -12 }
893*f005ef32Sjsg }
894*f005ef32Sjsg }
895*f005ef32Sjsg },
896*f005ef32Sjsg {
897*f005ef32Sjsg .bpp = DSC_BPP(8), .bpc = 10,
898*f005ef32Sjsg { 341, 15, 2048, 7, 16, 15, 15, {
899*f005ef32Sjsg { 0, 2, 2 }, { 2, 5, 0 }, { 3, 7, 0 }, { 4, 8, -2 },
900*f005ef32Sjsg { 6, 9, -4 }, { 7, 10, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
901*f005ef32Sjsg { 7, 12, -8 }, { 7, 13, -10 }, { 9, 13, -10 }, { 9, 13, -12 },
902*f005ef32Sjsg { 9, 13, -12 }, { 11, 14, -12 }, { 14, 15, -12 }
903*f005ef32Sjsg }
904*f005ef32Sjsg }
905*f005ef32Sjsg },
906*f005ef32Sjsg {
907*f005ef32Sjsg .bpp = DSC_BPP(8), .bpc = 12,
908*f005ef32Sjsg { 341, 15, 2048, 11, 20, 19, 19, {
909*f005ef32Sjsg { 0, 6, 2 }, { 4, 9, 0 }, { 7, 11, 0 }, { 8, 12, -2 },
910*f005ef32Sjsg { 10, 13, -4 }, { 11, 14, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
911*f005ef32Sjsg { 11, 16, -8 }, { 11, 17, -10 }, { 13, 17, -10 },
912*f005ef32Sjsg { 13, 17, -12 }, { 13, 17, -12 }, { 15, 18, -12 },
913*f005ef32Sjsg { 18, 19, -12 }
914*f005ef32Sjsg }
915*f005ef32Sjsg }
916*f005ef32Sjsg },
917*f005ef32Sjsg {
918*f005ef32Sjsg .bpp = DSC_BPP(8), .bpc = 14,
919*f005ef32Sjsg { 341, 15, 2048, 15, 24, 23, 23, {
920*f005ef32Sjsg { 0, 6, 2 }, { 7, 10, 0 }, { 9, 13, 0 }, { 11, 16, -2 },
921*f005ef32Sjsg { 14, 17, -4 }, { 15, 18, -6 }, { 15, 19, -8 }, { 15, 20, -8 },
922*f005ef32Sjsg { 15, 20, -8 }, { 15, 21, -10 }, { 17, 21, -10 },
923*f005ef32Sjsg { 17, 21, -12 }, { 17, 21, -12 }, { 19, 22, -12 },
924*f005ef32Sjsg { 22, 23, -12 }
925*f005ef32Sjsg }
926*f005ef32Sjsg }
927*f005ef32Sjsg },
928*f005ef32Sjsg {
929*f005ef32Sjsg .bpp = DSC_BPP(8), .bpc = 16,
930*f005ef32Sjsg { 341, 15, 2048, 19, 28, 27, 27, {
931*f005ef32Sjsg { 0, 6, 2 }, { 6, 11, 0 }, { 11, 15, 0 }, { 14, 18, -2 },
932*f005ef32Sjsg { 18, 21, -4 }, { 19, 22, -6 }, { 19, 23, -8 }, { 19, 24, -8 },
933*f005ef32Sjsg { 19, 24, -8 }, { 19, 25, -10 }, { 21, 25, -10 },
934*f005ef32Sjsg { 21, 25, -12 }, { 21, 25, -12 }, { 23, 26, -12 },
935*f005ef32Sjsg { 26, 27, -12 }
936*f005ef32Sjsg }
937*f005ef32Sjsg }
938*f005ef32Sjsg },
939*f005ef32Sjsg {
940*f005ef32Sjsg .bpp = DSC_BPP(10), .bpc = 8,
941*f005ef32Sjsg { 273, 15, 2048, 3, 12, 11, 11, {
942*f005ef32Sjsg { 0, 0, 10 }, { 0, 1, 8 }, { 0, 1, 6 }, { 0, 2, 4 },
943*f005ef32Sjsg { 1, 2, 2 }, { 1, 3, 0 }, { 1, 3, -2 }, { 2, 4, -4 },
944*f005ef32Sjsg { 2, 5, -6 }, { 3, 5, -8 }, { 4, 6, -10 }, { 4, 7, -10 },
945*f005ef32Sjsg { 5, 7, -12 }, { 7, 8, -12 }, { 8, 9, -12 }
946*f005ef32Sjsg }
947*f005ef32Sjsg }
948*f005ef32Sjsg },
949*f005ef32Sjsg {
950*f005ef32Sjsg .bpp = DSC_BPP(10), .bpc = 10,
951*f005ef32Sjsg { 273, 15, 2048, 7, 16, 15, 15, {
952*f005ef32Sjsg { 0, 2, 10 }, { 2, 5, 8 }, { 3, 5, 6 }, { 4, 6, 4 },
953*f005ef32Sjsg { 5, 6, 2 }, { 5, 7, 0 }, { 5, 7, -2 }, { 6, 8, -4 },
954*f005ef32Sjsg { 6, 9, -6 }, { 7, 9, -8 }, { 8, 10, -10 }, { 8, 11, -10 },
955*f005ef32Sjsg { 9, 11, -12 }, { 11, 12, -12 }, { 12, 13, -12 }
956*f005ef32Sjsg }
957*f005ef32Sjsg }
958*f005ef32Sjsg },
959*f005ef32Sjsg {
960*f005ef32Sjsg .bpp = DSC_BPP(10), .bpc = 12,
961*f005ef32Sjsg { 273, 15, 2048, 11, 20, 19, 19, {
962*f005ef32Sjsg { 0, 4, 10 }, { 2, 7, 8 }, { 4, 9, 6 }, { 6, 11, 4 },
963*f005ef32Sjsg { 9, 11, 2 }, { 9, 11, 0 }, { 9, 12, -2 }, { 10, 12, -4 },
964*f005ef32Sjsg { 11, 13, -6 }, { 11, 13, -8 }, { 12, 14, -10 },
965*f005ef32Sjsg { 13, 15, -10 }, { 13, 15, -12 }, { 15, 16, -12 },
966*f005ef32Sjsg { 16, 17, -12 }
967*f005ef32Sjsg }
968*f005ef32Sjsg }
969*f005ef32Sjsg },
970*f005ef32Sjsg {
971*f005ef32Sjsg .bpp = DSC_BPP(10), .bpc = 14,
972*f005ef32Sjsg { 273, 15, 2048, 15, 24, 23, 23, {
973*f005ef32Sjsg { 0, 4, 10 }, { 3, 8, 8 }, { 6, 11, 6 }, { 9, 14, 4 },
974*f005ef32Sjsg { 13, 15, 2 }, { 13, 15, 0 }, { 13, 16, -2 }, { 14, 16, -4 },
975*f005ef32Sjsg { 15, 17, -6 }, { 15, 17, -8 }, { 16, 18, -10 },
976*f005ef32Sjsg { 17, 19, -10 }, { 17, 19, -12 }, { 19, 20, -12 },
977*f005ef32Sjsg { 20, 21, -12 }
978*f005ef32Sjsg }
979*f005ef32Sjsg }
980*f005ef32Sjsg },
981*f005ef32Sjsg {
982*f005ef32Sjsg .bpp = DSC_BPP(10), .bpc = 16,
983*f005ef32Sjsg { 273, 15, 2048, 19, 28, 27, 27, {
984*f005ef32Sjsg { 0, 4, 10 }, { 4, 9, 8 }, { 8, 13, 6 }, { 12, 17, 4 },
985*f005ef32Sjsg { 17, 19, 2 }, { 17, 20, 0 }, { 17, 20, -2 }, { 18, 20, -4 },
986*f005ef32Sjsg { 19, 21, -6 }, { 19, 21, -8 }, { 20, 22, -10 },
987*f005ef32Sjsg { 21, 23, -10 }, { 21, 23, -12 }, { 23, 24, -12 },
988*f005ef32Sjsg { 24, 25, -12 }
989*f005ef32Sjsg }
990*f005ef32Sjsg }
991*f005ef32Sjsg },
992*f005ef32Sjsg { /* sentinel */ }
993*f005ef32Sjsg };
994*f005ef32Sjsg
995*f005ef32Sjsg /*
996*f005ef32Sjsg * Selected Rate Control Related Parameter Recommended Values for 4:2:2 from
997*f005ef32Sjsg * DSC v1.2, v1.2a, v1.2b
998*f005ef32Sjsg *
999*f005ef32Sjsg * Cross-checked against C Model releases: DSC_model_20161212 and 20210623
1000*f005ef32Sjsg */
1001*f005ef32Sjsg static const struct rc_parameters_data rc_parameters_1_2_420[] = {
1002*f005ef32Sjsg {
1003*f005ef32Sjsg .bpp = DSC_BPP(4), .bpc = 8,
1004*f005ef32Sjsg { 512, 12, 6144, 3, 12, 11, 11, {
1005*f005ef32Sjsg { 0, 4, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 1, 6, -2 },
1006*f005ef32Sjsg { 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
1007*f005ef32Sjsg { 3, 9, -8 }, { 3, 10, -10 }, { 5, 10, -10 }, { 5, 11, -12 },
1008*f005ef32Sjsg { 5, 11, -12 }, { 9, 12, -12 }, { 12, 13, -12 }
1009*f005ef32Sjsg }
1010*f005ef32Sjsg }
1011*f005ef32Sjsg },
1012*f005ef32Sjsg {
1013*f005ef32Sjsg .bpp = DSC_BPP(4), .bpc = 10,
1014*f005ef32Sjsg { 512, 12, 6144, 7, 16, 15, 15, {
1015*f005ef32Sjsg { 0, 8, 2 }, { 4, 8, 0 }, { 5, 9, 0 }, { 5, 10, -2 },
1016*f005ef32Sjsg { 7, 11, -4 }, { 7, 11, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
1017*f005ef32Sjsg { 7, 13, -8 }, { 7, 14, -10 }, { 9, 14, -10 }, { 9, 15, -12 },
1018*f005ef32Sjsg { 9, 15, -12 }, { 13, 16, -12 }, { 16, 17, -12 }
1019*f005ef32Sjsg }
1020*f005ef32Sjsg }
1021*f005ef32Sjsg },
1022*f005ef32Sjsg {
1023*f005ef32Sjsg .bpp = DSC_BPP(4), .bpc = 12,
1024*f005ef32Sjsg { 512, 12, 6144, 11, 20, 19, 19, {
1025*f005ef32Sjsg { 0, 12, 2 }, { 4, 12, 0 }, { 9, 13, 0 }, { 9, 14, -2 },
1026*f005ef32Sjsg { 11, 15, -4 }, { 11, 15, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
1027*f005ef32Sjsg { 11, 17, -8 }, { 11, 18, -10 }, { 13, 18, -10 },
1028*f005ef32Sjsg { 13, 19, -12 }, { 13, 19, -12 }, { 17, 20, -12 },
1029*f005ef32Sjsg { 20, 21, -12 }
1030*f005ef32Sjsg }
1031*f005ef32Sjsg }
1032*f005ef32Sjsg },
1033*f005ef32Sjsg {
1034*f005ef32Sjsg .bpp = DSC_BPP(4), .bpc = 14,
1035*f005ef32Sjsg { 512, 12, 6144, 15, 24, 23, 23, {
1036*f005ef32Sjsg { 0, 12, 2 }, { 5, 13, 0 }, { 11, 15, 0 }, { 12, 17, -2 },
1037*f005ef32Sjsg { 15, 19, -4 }, { 15, 19, -6 }, { 15, 19, -8 }, { 15, 20, -8 },
1038*f005ef32Sjsg { 15, 21, -8 }, { 15, 22, -10 }, { 17, 22, -10 },
1039*f005ef32Sjsg { 17, 23, -12 }, { 17, 23, -12 }, { 21, 24, -12 },
1040*f005ef32Sjsg { 24, 25, -12 }
1041*f005ef32Sjsg }
1042*f005ef32Sjsg }
1043*f005ef32Sjsg },
1044*f005ef32Sjsg {
1045*f005ef32Sjsg .bpp = DSC_BPP(4), .bpc = 16,
1046*f005ef32Sjsg { 512, 12, 6144, 19, 28, 27, 27, {
1047*f005ef32Sjsg { 0, 12, 2 }, { 6, 14, 0 }, { 13, 17, 0 }, { 15, 20, -2 },
1048*f005ef32Sjsg { 19, 23, -4 }, { 19, 23, -6 }, { 19, 23, -8 }, { 19, 24, -8 },
1049*f005ef32Sjsg { 19, 25, -8 }, { 19, 26, -10 }, { 21, 26, -10 },
1050*f005ef32Sjsg { 21, 27, -12 }, { 21, 27, -12 }, { 25, 28, -12 },
1051*f005ef32Sjsg { 28, 29, -12 }
1052*f005ef32Sjsg }
1053*f005ef32Sjsg }
1054*f005ef32Sjsg },
1055*f005ef32Sjsg {
1056*f005ef32Sjsg .bpp = DSC_BPP(5), .bpc = 8,
1057*f005ef32Sjsg { 410, 15, 5632, 3, 12, 11, 11, {
1058*f005ef32Sjsg { 0, 3, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 2, 6, -2 },
1059*f005ef32Sjsg { 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
1060*f005ef32Sjsg { 3, 9, -8 }, { 3, 9, -10 }, { 5, 10, -10 }, { 5, 10, -10 },
1061*f005ef32Sjsg { 5, 11, -12 }, { 7, 11, -12 }, { 11, 12, -12 }
1062*f005ef32Sjsg }
1063*f005ef32Sjsg }
1064*f005ef32Sjsg },
1065*f005ef32Sjsg {
1066*f005ef32Sjsg .bpp = DSC_BPP(5), .bpc = 10,
1067*f005ef32Sjsg { 410, 15, 5632, 7, 16, 15, 15, {
1068*f005ef32Sjsg { 0, 7, 2 }, { 4, 8, 0 }, { 5, 9, 0 }, { 6, 10, -2 },
1069*f005ef32Sjsg { 7, 11, -4 }, { 7, 11, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
1070*f005ef32Sjsg { 7, 13, -8 }, { 7, 13, -10 }, { 9, 14, -10 }, { 9, 14, -10 },
1071*f005ef32Sjsg { 9, 15, -12 }, { 11, 15, -12 }, { 15, 16, -12 }
1072*f005ef32Sjsg }
1073*f005ef32Sjsg }
1074*f005ef32Sjsg },
1075*f005ef32Sjsg {
1076*f005ef32Sjsg .bpp = DSC_BPP(5), .bpc = 12,
1077*f005ef32Sjsg { 410, 15, 5632, 11, 20, 19, 19, {
1078*f005ef32Sjsg { 0, 11, 2 }, { 4, 12, 0 }, { 9, 13, 0 }, { 10, 14, -2 },
1079*f005ef32Sjsg { 11, 15, -4 }, { 11, 15, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
1080*f005ef32Sjsg { 11, 17, -8 }, { 11, 17, -10 }, { 13, 18, -10 },
1081*f005ef32Sjsg { 13, 18, -10 }, { 13, 19, -12 }, { 15, 19, -12 },
1082*f005ef32Sjsg { 19, 20, -12 }
1083*f005ef32Sjsg }
1084*f005ef32Sjsg }
1085*f005ef32Sjsg },
1086*f005ef32Sjsg {
1087*f005ef32Sjsg .bpp = DSC_BPP(5), .bpc = 14,
1088*f005ef32Sjsg { 410, 15, 5632, 15, 24, 23, 23, {
1089*f005ef32Sjsg { 0, 11, 2 }, { 5, 13, 0 }, { 11, 15, 0 }, { 13, 18, -2 },
1090*f005ef32Sjsg { 15, 19, -4 }, { 15, 19, -6 }, { 15, 19, -8 }, { 15, 20, -8 },
1091*f005ef32Sjsg { 15, 21, -8 }, { 15, 21, -10 }, { 17, 22, -10 },
1092*f005ef32Sjsg { 17, 22, -10 }, { 17, 23, -12 }, { 19, 23, -12 },
1093*f005ef32Sjsg { 23, 24, -12 }
1094*f005ef32Sjsg }
1095*f005ef32Sjsg }
1096*f005ef32Sjsg },
1097*f005ef32Sjsg {
1098*f005ef32Sjsg .bpp = DSC_BPP(5), .bpc = 16,
1099*f005ef32Sjsg { 410, 15, 5632, 19, 28, 27, 27, {
1100*f005ef32Sjsg { 0, 11, 2 }, { 6, 14, 0 }, { 13, 17, 0 }, { 16, 20, -2 },
1101*f005ef32Sjsg { 19, 23, -4 }, { 19, 23, -6 }, { 19, 23, -8 }, { 19, 24, -8 },
1102*f005ef32Sjsg { 19, 25, -8 }, { 19, 25, -10 }, { 21, 26, -10 },
1103*f005ef32Sjsg { 21, 26, -10 }, { 21, 27, -12 }, { 23, 27, -12 },
1104*f005ef32Sjsg { 27, 28, -12 }
1105*f005ef32Sjsg }
1106*f005ef32Sjsg }
1107*f005ef32Sjsg },
1108*f005ef32Sjsg {
1109*f005ef32Sjsg .bpp = DSC_BPP(6), .bpc = 8,
1110*f005ef32Sjsg { 341, 15, 2048, 3, 12, 11, 11, {
1111*f005ef32Sjsg { 0, 2, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 1, 6, -2 },
1112*f005ef32Sjsg { 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
1113*f005ef32Sjsg { 3, 8, -8 }, { 3, 9, -10 }, { 5, 9, -10 }, { 5, 9, -12 },
1114*f005ef32Sjsg { 5, 9, -12 }, { 7, 10, -12 }, { 10, 12, -12 }
1115*f005ef32Sjsg }
1116*f005ef32Sjsg }
1117*f005ef32Sjsg },
1118*f005ef32Sjsg {
1119*f005ef32Sjsg .bpp = DSC_BPP(6), .bpc = 10,
1120*f005ef32Sjsg { 341, 15, 2048, 7, 16, 15, 15, {
1121*f005ef32Sjsg { 0, 2, 2 }, { 2, 5, 0 }, { 3, 7, 0 }, { 4, 8, -2 },
1122*f005ef32Sjsg { 6, 9, -4 }, { 7, 10, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
1123*f005ef32Sjsg { 7, 12, -8 }, { 7, 13, -10 }, { 9, 13, -10 }, { 9, 13, -12 },
1124*f005ef32Sjsg { 9, 13, -12 }, { 11, 14, -12 }, { 14, 15, -12 }
1125*f005ef32Sjsg }
1126*f005ef32Sjsg }
1127*f005ef32Sjsg },
1128*f005ef32Sjsg {
1129*f005ef32Sjsg .bpp = DSC_BPP(6), .bpc = 12,
1130*f005ef32Sjsg { 341, 15, 2048, 11, 20, 19, 19, {
1131*f005ef32Sjsg { 0, 6, 2 }, { 4, 9, 0 }, { 7, 11, 0 }, { 8, 12, -2 },
1132*f005ef32Sjsg { 10, 13, -4 }, { 11, 14, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
1133*f005ef32Sjsg { 11, 16, -8 }, { 11, 17, -10 }, { 13, 17, -10 },
1134*f005ef32Sjsg { 13, 17, -12 }, { 13, 17, -12 }, { 15, 18, -12 },
1135*f005ef32Sjsg { 18, 19, -12 }
1136*f005ef32Sjsg }
1137*f005ef32Sjsg }
1138*f005ef32Sjsg },
1139*f005ef32Sjsg {
1140*f005ef32Sjsg .bpp = DSC_BPP(6), .bpc = 14,
1141*f005ef32Sjsg { 341, 15, 2048, 15, 24, 23, 23, {
1142*f005ef32Sjsg { 0, 6, 2 }, { 7, 10, 0 }, { 9, 13, 0 }, { 11, 16, -2 },
1143*f005ef32Sjsg { 14, 17, -4 }, { 15, 18, -6 }, { 15, 19, -8 }, { 15, 20, -8 },
1144*f005ef32Sjsg { 15, 20, -8 }, { 15, 21, -10 }, { 17, 21, -10 },
1145*f005ef32Sjsg { 17, 21, -12 }, { 17, 21, -12 }, { 19, 22, -12 },
1146*f005ef32Sjsg { 22, 23, -12 }
1147*f005ef32Sjsg }
1148*f005ef32Sjsg }
1149*f005ef32Sjsg },
1150*f005ef32Sjsg {
1151*f005ef32Sjsg .bpp = DSC_BPP(6), .bpc = 16,
1152*f005ef32Sjsg { 341, 15, 2048, 19, 28, 27, 27, {
1153*f005ef32Sjsg { 0, 6, 2 }, { 6, 11, 0 }, { 11, 15, 0 }, { 14, 18, -2 },
1154*f005ef32Sjsg { 18, 21, -4 }, { 19, 22, -6 }, { 19, 23, -8 }, { 19, 24, -8 },
1155*f005ef32Sjsg { 19, 24, -8 }, { 19, 25, -10 }, { 21, 25, -10 },
1156*f005ef32Sjsg { 21, 25, -12 }, { 21, 25, -12 }, { 23, 26, -12 },
1157*f005ef32Sjsg { 26, 27, -12 }
1158*f005ef32Sjsg }
1159*f005ef32Sjsg }
1160*f005ef32Sjsg },
1161*f005ef32Sjsg {
1162*f005ef32Sjsg .bpp = DSC_BPP(8), .bpc = 8,
1163*f005ef32Sjsg { 256, 15, 2048, 3, 12, 11, 11, {
1164*f005ef32Sjsg { 0, 0, 10 }, { 0, 1, 8 }, { 0, 1, 6 }, { 0, 2, 4 },
1165*f005ef32Sjsg { 1, 2, 2 }, { 1, 3, 0 }, { 1, 3, -2 }, { 2, 4, -4 },
1166*f005ef32Sjsg { 2, 5, -6 }, { 3, 5, -8 }, { 4, 6, -10 }, { 4, 7, -10 },
1167*f005ef32Sjsg { 5, 7, -12 }, { 7, 8, -12 }, { 8, 9, -12 }
1168*f005ef32Sjsg }
1169*f005ef32Sjsg }
1170*f005ef32Sjsg },
1171*f005ef32Sjsg {
1172*f005ef32Sjsg .bpp = DSC_BPP(8), .bpc = 10,
1173*f005ef32Sjsg { 256, 15, 2048, 7, 16, 15, 15, {
1174*f005ef32Sjsg { 0, 2, 10 }, { 2, 5, 8 }, { 3, 5, 6 }, { 4, 6, 4 },
1175*f005ef32Sjsg { 5, 6, 2 }, { 5, 7, 0 }, { 5, 7, -2 }, { 6, 8, -4 },
1176*f005ef32Sjsg { 6, 9, -6 }, { 7, 9, -8 }, { 8, 10, -10 }, { 8, 11, -10 },
1177*f005ef32Sjsg { 9, 11, -12 }, { 11, 12, -12 }, { 12, 13, -12 }
1178*f005ef32Sjsg }
1179*f005ef32Sjsg }
1180*f005ef32Sjsg },
1181*f005ef32Sjsg {
1182*f005ef32Sjsg .bpp = DSC_BPP(8), .bpc = 12,
1183*f005ef32Sjsg { 256, 15, 2048, 11, 20, 19, 19, {
1184*f005ef32Sjsg { 0, 4, 10 }, { 2, 7, 8 }, { 4, 9, 6 }, { 6, 11, 4 },
1185*f005ef32Sjsg { 9, 11, 2 }, { 9, 11, 0 }, { 9, 12, -2 }, { 10, 12, -4 },
1186*f005ef32Sjsg { 11, 13, -6 }, { 11, 13, -8 }, { 12, 14, -10 },
1187*f005ef32Sjsg { 13, 15, -10 }, { 13, 15, -12 }, { 15, 16, -12 },
1188*f005ef32Sjsg { 16, 17, -12 }
1189*f005ef32Sjsg }
1190*f005ef32Sjsg }
1191*f005ef32Sjsg },
1192*f005ef32Sjsg {
1193*f005ef32Sjsg .bpp = DSC_BPP(8), .bpc = 14,
1194*f005ef32Sjsg { 256, 15, 2048, 15, 24, 23, 23, {
1195*f005ef32Sjsg { 0, 4, 10 }, { 3, 8, 8 }, { 6, 11, 6 }, { 9, 14, 4 },
1196*f005ef32Sjsg { 13, 15, 2 }, { 13, 15, 0 }, { 13, 16, -2 }, { 14, 16, -4 },
1197*f005ef32Sjsg { 15, 17, -6 }, { 15, 17, -8 }, { 16, 18, -10 },
1198*f005ef32Sjsg { 17, 19, -10 }, { 17, 19, -12 }, { 19, 20, -12 },
1199*f005ef32Sjsg { 20, 21, -12 }
1200*f005ef32Sjsg }
1201*f005ef32Sjsg }
1202*f005ef32Sjsg },
1203*f005ef32Sjsg {
1204*f005ef32Sjsg .bpp = DSC_BPP(8), .bpc = 16,
1205*f005ef32Sjsg { 256, 15, 2048, 19, 28, 27, 27, {
1206*f005ef32Sjsg { 0, 4, 10 }, { 4, 9, 8 }, { 8, 13, 6 }, { 12, 17, 4 },
1207*f005ef32Sjsg { 17, 19, 2 }, { 17, 20, 0 }, { 17, 20, -2 }, { 18, 20, -4 },
1208*f005ef32Sjsg { 19, 21, -6 }, { 19, 21, -8 }, { 20, 22, -10 },
1209*f005ef32Sjsg { 21, 23, -10 }, { 21, 23, -12 }, { 23, 24, -12 },
1210*f005ef32Sjsg { 24, 25, -12 }
1211*f005ef32Sjsg }
1212*f005ef32Sjsg }
1213*f005ef32Sjsg },
1214*f005ef32Sjsg { /* sentinel */ }
1215*f005ef32Sjsg };
1216*f005ef32Sjsg
get_rc_params(const struct rc_parameters_data * rc_parameters,u16 dsc_bpp,u8 bits_per_component)1217*f005ef32Sjsg static const struct rc_parameters *get_rc_params(const struct rc_parameters_data *rc_parameters,
1218*f005ef32Sjsg u16 dsc_bpp,
1219*f005ef32Sjsg u8 bits_per_component)
1220*f005ef32Sjsg {
1221*f005ef32Sjsg int i;
1222*f005ef32Sjsg
1223*f005ef32Sjsg for (i = 0; rc_parameters[i].bpp; i++)
1224*f005ef32Sjsg if (rc_parameters[i].bpp == dsc_bpp &&
1225*f005ef32Sjsg rc_parameters[i].bpc == bits_per_component)
1226*f005ef32Sjsg return &rc_parameters[i].params;
1227*f005ef32Sjsg
1228*f005ef32Sjsg return NULL;
1229*f005ef32Sjsg }
1230*f005ef32Sjsg
1231*f005ef32Sjsg /**
1232*f005ef32Sjsg * drm_dsc_setup_rc_params() - Set parameters and limits for RC model in
1233*f005ef32Sjsg * accordance with the DSC 1.1 or 1.2 specification and DSC C Model
1234*f005ef32Sjsg * Required bits_per_pixel and bits_per_component to be set before calling this
1235*f005ef32Sjsg * function.
1236*f005ef32Sjsg *
1237*f005ef32Sjsg * @vdsc_cfg: DSC Configuration data partially filled by driver
1238*f005ef32Sjsg * @type: operating mode and standard to follow
1239*f005ef32Sjsg *
1240*f005ef32Sjsg * Return: 0 or -error code in case of an error
1241*f005ef32Sjsg */
drm_dsc_setup_rc_params(struct drm_dsc_config * vdsc_cfg,enum drm_dsc_params_type type)1242*f005ef32Sjsg int drm_dsc_setup_rc_params(struct drm_dsc_config *vdsc_cfg, enum drm_dsc_params_type type)
1243*f005ef32Sjsg {
1244*f005ef32Sjsg const struct rc_parameters_data *data;
1245*f005ef32Sjsg const struct rc_parameters *rc_params;
1246*f005ef32Sjsg int i;
1247*f005ef32Sjsg
1248*f005ef32Sjsg if (WARN_ON_ONCE(!vdsc_cfg->bits_per_pixel ||
1249*f005ef32Sjsg !vdsc_cfg->bits_per_component))
1250*f005ef32Sjsg return -EINVAL;
1251*f005ef32Sjsg
1252*f005ef32Sjsg switch (type) {
1253*f005ef32Sjsg case DRM_DSC_1_2_444:
1254*f005ef32Sjsg data = rc_parameters_1_2_444;
1255*f005ef32Sjsg break;
1256*f005ef32Sjsg case DRM_DSC_1_1_PRE_SCR:
1257*f005ef32Sjsg data = rc_parameters_pre_scr;
1258*f005ef32Sjsg break;
1259*f005ef32Sjsg case DRM_DSC_1_2_422:
1260*f005ef32Sjsg data = rc_parameters_1_2_422;
1261*f005ef32Sjsg break;
1262*f005ef32Sjsg case DRM_DSC_1_2_420:
1263*f005ef32Sjsg data = rc_parameters_1_2_420;
1264*f005ef32Sjsg break;
1265*f005ef32Sjsg default:
1266*f005ef32Sjsg return -EINVAL;
1267*f005ef32Sjsg }
1268*f005ef32Sjsg
1269*f005ef32Sjsg rc_params = get_rc_params(data,
1270*f005ef32Sjsg vdsc_cfg->bits_per_pixel,
1271*f005ef32Sjsg vdsc_cfg->bits_per_component);
1272*f005ef32Sjsg if (!rc_params)
1273*f005ef32Sjsg return -EINVAL;
1274*f005ef32Sjsg
1275*f005ef32Sjsg vdsc_cfg->first_line_bpg_offset = rc_params->first_line_bpg_offset;
1276*f005ef32Sjsg vdsc_cfg->initial_xmit_delay = rc_params->initial_xmit_delay;
1277*f005ef32Sjsg vdsc_cfg->initial_offset = rc_params->initial_offset;
1278*f005ef32Sjsg vdsc_cfg->flatness_min_qp = rc_params->flatness_min_qp;
1279*f005ef32Sjsg vdsc_cfg->flatness_max_qp = rc_params->flatness_max_qp;
1280*f005ef32Sjsg vdsc_cfg->rc_quant_incr_limit0 = rc_params->rc_quant_incr_limit0;
1281*f005ef32Sjsg vdsc_cfg->rc_quant_incr_limit1 = rc_params->rc_quant_incr_limit1;
1282*f005ef32Sjsg
1283*f005ef32Sjsg for (i = 0; i < DSC_NUM_BUF_RANGES; i++) {
1284*f005ef32Sjsg vdsc_cfg->rc_range_params[i].range_min_qp =
1285*f005ef32Sjsg rc_params->rc_range_params[i].range_min_qp;
1286*f005ef32Sjsg vdsc_cfg->rc_range_params[i].range_max_qp =
1287*f005ef32Sjsg rc_params->rc_range_params[i].range_max_qp;
1288*f005ef32Sjsg /*
1289*f005ef32Sjsg * Range BPG Offset uses 2's complement and is only a 6 bits. So
1290*f005ef32Sjsg * mask it to get only 6 bits.
1291*f005ef32Sjsg */
1292*f005ef32Sjsg vdsc_cfg->rc_range_params[i].range_bpg_offset =
1293*f005ef32Sjsg rc_params->rc_range_params[i].range_bpg_offset &
1294*f005ef32Sjsg DSC_RANGE_BPG_OFFSET_MASK;
1295*f005ef32Sjsg }
1296*f005ef32Sjsg
1297*f005ef32Sjsg return 0;
1298*f005ef32Sjsg }
1299*f005ef32Sjsg EXPORT_SYMBOL(drm_dsc_setup_rc_params);
1300*f005ef32Sjsg
1301*f005ef32Sjsg /**
13021bb76ff1Sjsg * drm_dsc_compute_rc_parameters() - Write rate control
13031bb76ff1Sjsg * parameters to the dsc configuration defined in
13041bb76ff1Sjsg * &struct drm_dsc_config in accordance with the DSC 1.2
13051bb76ff1Sjsg * specification. Some configuration fields must be present
13061bb76ff1Sjsg * beforehand.
13071bb76ff1Sjsg *
13081bb76ff1Sjsg * @vdsc_cfg:
13091bb76ff1Sjsg * DSC Configuration data partially filled by driver
13101bb76ff1Sjsg */
drm_dsc_compute_rc_parameters(struct drm_dsc_config * vdsc_cfg)13111bb76ff1Sjsg int drm_dsc_compute_rc_parameters(struct drm_dsc_config *vdsc_cfg)
13121bb76ff1Sjsg {
13131bb76ff1Sjsg unsigned long groups_per_line = 0;
13141bb76ff1Sjsg unsigned long groups_total = 0;
13151bb76ff1Sjsg unsigned long num_extra_mux_bits = 0;
13161bb76ff1Sjsg unsigned long slice_bits = 0;
13171bb76ff1Sjsg unsigned long hrd_delay = 0;
13181bb76ff1Sjsg unsigned long final_scale = 0;
13191bb76ff1Sjsg unsigned long rbs_min = 0;
13201bb76ff1Sjsg
13211bb76ff1Sjsg if (vdsc_cfg->native_420 || vdsc_cfg->native_422) {
13221bb76ff1Sjsg /* Number of groups used to code each line of a slice */
13231bb76ff1Sjsg groups_per_line = DIV_ROUND_UP(vdsc_cfg->slice_width / 2,
13241bb76ff1Sjsg DSC_RC_PIXELS_PER_GROUP);
13251bb76ff1Sjsg
13261bb76ff1Sjsg /* chunksize in Bytes */
13271bb76ff1Sjsg vdsc_cfg->slice_chunk_size = DIV_ROUND_UP(vdsc_cfg->slice_width / 2 *
13281bb76ff1Sjsg vdsc_cfg->bits_per_pixel,
13291bb76ff1Sjsg (8 * 16));
13301bb76ff1Sjsg } else {
13311bb76ff1Sjsg /* Number of groups used to code each line of a slice */
13321bb76ff1Sjsg groups_per_line = DIV_ROUND_UP(vdsc_cfg->slice_width,
13331bb76ff1Sjsg DSC_RC_PIXELS_PER_GROUP);
13341bb76ff1Sjsg
13351bb76ff1Sjsg /* chunksize in Bytes */
13361bb76ff1Sjsg vdsc_cfg->slice_chunk_size = DIV_ROUND_UP(vdsc_cfg->slice_width *
13371bb76ff1Sjsg vdsc_cfg->bits_per_pixel,
13381bb76ff1Sjsg (8 * 16));
13391bb76ff1Sjsg }
13401bb76ff1Sjsg
13411bb76ff1Sjsg if (vdsc_cfg->convert_rgb)
13421bb76ff1Sjsg num_extra_mux_bits = 3 * (vdsc_cfg->mux_word_size +
13431bb76ff1Sjsg (4 * vdsc_cfg->bits_per_component + 4)
13441bb76ff1Sjsg - 2);
13451bb76ff1Sjsg else if (vdsc_cfg->native_422)
13461bb76ff1Sjsg num_extra_mux_bits = 4 * vdsc_cfg->mux_word_size +
13471bb76ff1Sjsg (4 * vdsc_cfg->bits_per_component + 4) +
13481bb76ff1Sjsg 3 * (4 * vdsc_cfg->bits_per_component) - 2;
13491bb76ff1Sjsg else
13501bb76ff1Sjsg num_extra_mux_bits = 3 * vdsc_cfg->mux_word_size +
13511bb76ff1Sjsg (4 * vdsc_cfg->bits_per_component + 4) +
13521bb76ff1Sjsg 2 * (4 * vdsc_cfg->bits_per_component) - 2;
13531bb76ff1Sjsg /* Number of bits in one Slice */
13541bb76ff1Sjsg slice_bits = 8 * vdsc_cfg->slice_chunk_size * vdsc_cfg->slice_height;
13551bb76ff1Sjsg
13561bb76ff1Sjsg while ((num_extra_mux_bits > 0) &&
13571bb76ff1Sjsg ((slice_bits - num_extra_mux_bits) % vdsc_cfg->mux_word_size))
13581bb76ff1Sjsg num_extra_mux_bits--;
13591bb76ff1Sjsg
13601bb76ff1Sjsg if (groups_per_line < vdsc_cfg->initial_scale_value - 8)
13611bb76ff1Sjsg vdsc_cfg->initial_scale_value = groups_per_line + 8;
13621bb76ff1Sjsg
13631bb76ff1Sjsg /* scale_decrement_interval calculation according to DSC spec 1.11 */
13641bb76ff1Sjsg if (vdsc_cfg->initial_scale_value > 8)
13651bb76ff1Sjsg vdsc_cfg->scale_decrement_interval = groups_per_line /
13661bb76ff1Sjsg (vdsc_cfg->initial_scale_value - 8);
13671bb76ff1Sjsg else
13681bb76ff1Sjsg vdsc_cfg->scale_decrement_interval = DSC_SCALE_DECREMENT_INTERVAL_MAX;
13691bb76ff1Sjsg
13701bb76ff1Sjsg vdsc_cfg->final_offset = vdsc_cfg->rc_model_size -
13711bb76ff1Sjsg (vdsc_cfg->initial_xmit_delay *
13721bb76ff1Sjsg vdsc_cfg->bits_per_pixel + 8) / 16 + num_extra_mux_bits;
13731bb76ff1Sjsg
13741bb76ff1Sjsg if (vdsc_cfg->final_offset >= vdsc_cfg->rc_model_size) {
13751bb76ff1Sjsg DRM_DEBUG_KMS("FinalOfs < RcModelSze for this InitialXmitDelay\n");
13761bb76ff1Sjsg return -ERANGE;
13771bb76ff1Sjsg }
13781bb76ff1Sjsg
13791bb76ff1Sjsg final_scale = (vdsc_cfg->rc_model_size * 8) /
13801bb76ff1Sjsg (vdsc_cfg->rc_model_size - vdsc_cfg->final_offset);
13811bb76ff1Sjsg if (vdsc_cfg->slice_height > 1)
13821bb76ff1Sjsg /*
13831bb76ff1Sjsg * NflBpgOffset is 16 bit value with 11 fractional bits
13841bb76ff1Sjsg * hence we multiply by 2^11 for preserving the
13851bb76ff1Sjsg * fractional part
13861bb76ff1Sjsg */
13871bb76ff1Sjsg vdsc_cfg->nfl_bpg_offset = DIV_ROUND_UP((vdsc_cfg->first_line_bpg_offset << 11),
13881bb76ff1Sjsg (vdsc_cfg->slice_height - 1));
13891bb76ff1Sjsg else
13901bb76ff1Sjsg vdsc_cfg->nfl_bpg_offset = 0;
13911bb76ff1Sjsg
13921bb76ff1Sjsg /* Number of groups used to code the entire slice */
13931bb76ff1Sjsg groups_total = groups_per_line * vdsc_cfg->slice_height;
13941bb76ff1Sjsg
13951bb76ff1Sjsg /* slice_bpg_offset is 16 bit value with 11 fractional bits */
13961bb76ff1Sjsg vdsc_cfg->slice_bpg_offset = DIV_ROUND_UP(((vdsc_cfg->rc_model_size -
13971bb76ff1Sjsg vdsc_cfg->initial_offset +
13981bb76ff1Sjsg num_extra_mux_bits) << 11),
13991bb76ff1Sjsg groups_total);
14001bb76ff1Sjsg
14011bb76ff1Sjsg if (final_scale > 9) {
14021bb76ff1Sjsg /*
14031bb76ff1Sjsg * ScaleIncrementInterval =
14041bb76ff1Sjsg * finaloffset/((NflBpgOffset + SliceBpgOffset)*8(finalscale - 1.125))
14051bb76ff1Sjsg * as (NflBpgOffset + SliceBpgOffset) has 11 bit fractional value,
14061bb76ff1Sjsg * we need divide by 2^11 from pstDscCfg values
14071bb76ff1Sjsg */
14081bb76ff1Sjsg vdsc_cfg->scale_increment_interval =
14091bb76ff1Sjsg (vdsc_cfg->final_offset * (1 << 11)) /
14101bb76ff1Sjsg ((vdsc_cfg->nfl_bpg_offset +
14111bb76ff1Sjsg vdsc_cfg->slice_bpg_offset) *
14121bb76ff1Sjsg (final_scale - 9));
14131bb76ff1Sjsg } else {
14141bb76ff1Sjsg /*
14151bb76ff1Sjsg * If finalScaleValue is less than or equal to 9, a value of 0 should
14161bb76ff1Sjsg * be used to disable the scale increment at the end of the slice
14171bb76ff1Sjsg */
14181bb76ff1Sjsg vdsc_cfg->scale_increment_interval = 0;
14191bb76ff1Sjsg }
14201bb76ff1Sjsg
14211bb76ff1Sjsg /*
14221bb76ff1Sjsg * DSC spec mentions that bits_per_pixel specifies the target
14231bb76ff1Sjsg * bits/pixel (bpp) rate that is used by the encoder,
14241bb76ff1Sjsg * in steps of 1/16 of a bit per pixel
14251bb76ff1Sjsg */
14261bb76ff1Sjsg rbs_min = vdsc_cfg->rc_model_size - vdsc_cfg->initial_offset +
14271bb76ff1Sjsg DIV_ROUND_UP(vdsc_cfg->initial_xmit_delay *
14281bb76ff1Sjsg vdsc_cfg->bits_per_pixel, 16) +
14291bb76ff1Sjsg groups_per_line * vdsc_cfg->first_line_bpg_offset;
14301bb76ff1Sjsg
14311bb76ff1Sjsg hrd_delay = DIV_ROUND_UP((rbs_min * 16), vdsc_cfg->bits_per_pixel);
14321bb76ff1Sjsg vdsc_cfg->rc_bits = (hrd_delay * vdsc_cfg->bits_per_pixel) / 16;
14331bb76ff1Sjsg vdsc_cfg->initial_dec_delay = hrd_delay - vdsc_cfg->initial_xmit_delay;
14341bb76ff1Sjsg
14351bb76ff1Sjsg return 0;
14361bb76ff1Sjsg }
14371bb76ff1Sjsg EXPORT_SYMBOL(drm_dsc_compute_rc_parameters);
1438*f005ef32Sjsg
1439*f005ef32Sjsg /**
1440*f005ef32Sjsg * drm_dsc_get_bpp_int() - Get integer bits per pixel value for the given DRM DSC config
1441*f005ef32Sjsg * @vdsc_cfg: Pointer to DRM DSC config struct
1442*f005ef32Sjsg *
1443*f005ef32Sjsg * Return: Integer BPP value
1444*f005ef32Sjsg */
drm_dsc_get_bpp_int(const struct drm_dsc_config * vdsc_cfg)1445*f005ef32Sjsg u32 drm_dsc_get_bpp_int(const struct drm_dsc_config *vdsc_cfg)
1446*f005ef32Sjsg {
1447*f005ef32Sjsg WARN_ON_ONCE(vdsc_cfg->bits_per_pixel & 0xf);
1448*f005ef32Sjsg return vdsc_cfg->bits_per_pixel >> 4;
1449*f005ef32Sjsg }
1450*f005ef32Sjsg EXPORT_SYMBOL(drm_dsc_get_bpp_int);
1451*f005ef32Sjsg
1452*f005ef32Sjsg /**
1453*f005ef32Sjsg * drm_dsc_initial_scale_value() - Calculate the initial scale value for the given DSC config
1454*f005ef32Sjsg * @dsc: Pointer to DRM DSC config struct
1455*f005ef32Sjsg *
1456*f005ef32Sjsg * Return: Calculated initial scale value
1457*f005ef32Sjsg */
drm_dsc_initial_scale_value(const struct drm_dsc_config * dsc)1458*f005ef32Sjsg u8 drm_dsc_initial_scale_value(const struct drm_dsc_config *dsc)
1459*f005ef32Sjsg {
1460*f005ef32Sjsg return 8 * dsc->rc_model_size / (dsc->rc_model_size - dsc->initial_offset);
1461*f005ef32Sjsg }
1462*f005ef32Sjsg EXPORT_SYMBOL(drm_dsc_initial_scale_value);
1463*f005ef32Sjsg
1464*f005ef32Sjsg /**
1465*f005ef32Sjsg * drm_dsc_flatness_det_thresh() - Calculate the flatness_det_thresh for the given DSC config
1466*f005ef32Sjsg * @dsc: Pointer to DRM DSC config struct
1467*f005ef32Sjsg *
1468*f005ef32Sjsg * Return: Calculated flatness det thresh value
1469*f005ef32Sjsg */
drm_dsc_flatness_det_thresh(const struct drm_dsc_config * dsc)1470*f005ef32Sjsg u32 drm_dsc_flatness_det_thresh(const struct drm_dsc_config *dsc)
1471*f005ef32Sjsg {
1472*f005ef32Sjsg return 2 << (dsc->bits_per_component - 8);
1473*f005ef32Sjsg }
1474*f005ef32Sjsg EXPORT_SYMBOL(drm_dsc_flatness_det_thresh);
1475