LCOV - code coverage report
Current view: top level - drivers/gpu/drm/display - drm_dsc_helper.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 199 0.0 %
Date: 2023-08-24 13:40:31 Functions: 0 10 0.0 %

          Line data    Source code
       1             : // SPDX-License-Identifier: MIT
       2             : /*
       3             :  * Copyright © 2018 Intel Corp
       4             :  *
       5             :  * Author:
       6             :  * Manasi Navare <manasi.d.navare@intel.com>
       7             :  */
       8             : 
       9             : #include <linux/kernel.h>
      10             : #include <linux/module.h>
      11             : #include <linux/init.h>
      12             : #include <linux/errno.h>
      13             : #include <linux/byteorder/generic.h>
      14             : 
      15             : #include <drm/display/drm_dp_helper.h>
      16             : #include <drm/display/drm_dsc_helper.h>
      17             : #include <drm/drm_print.h>
      18             : 
      19             : /**
      20             :  * DOC: dsc helpers
      21             :  *
      22             :  * VESA specification for DP 1.4 adds a new feature called Display Stream
      23             :  * Compression (DSC) used to compress the pixel bits before sending it on
      24             :  * DP/eDP/MIPI DSI interface. DSC is required to be enabled so that the existing
      25             :  * display interfaces can support high resolutions at higher frames rates uisng
      26             :  * the maximum available link capacity of these interfaces.
      27             :  *
      28             :  * These functions contain some common logic and helpers to deal with VESA
      29             :  * Display Stream Compression standard required for DSC on Display Port/eDP or
      30             :  * MIPI display interfaces.
      31             :  */
      32             : 
      33             : /**
      34             :  * drm_dsc_dp_pps_header_init() - Initializes the PPS Header
      35             :  * for DisplayPort as per the DP 1.4 spec.
      36             :  * @pps_header: Secondary data packet header for DSC Picture
      37             :  *              Parameter Set as defined in &struct dp_sdp_header
      38             :  *
      39             :  * DP 1.4 spec defines the secondary data packet for sending the
      40             :  * picture parameter infoframes from the source to the sink.
      41             :  * This function populates the SDP header defined in
      42             :  * &struct dp_sdp_header.
      43             :  */
      44           0 : void drm_dsc_dp_pps_header_init(struct dp_sdp_header *pps_header)
      45             : {
      46           0 :         memset(pps_header, 0, sizeof(*pps_header));
      47             : 
      48           0 :         pps_header->HB1 = DP_SDP_PPS;
      49           0 :         pps_header->HB2 = DP_SDP_PPS_HEADER_PAYLOAD_BYTES_MINUS_1;
      50           0 : }
      51             : EXPORT_SYMBOL(drm_dsc_dp_pps_header_init);
      52             : 
      53             : /**
      54             :  * drm_dsc_dp_rc_buffer_size - get rc buffer size in bytes
      55             :  * @rc_buffer_block_size: block size code, according to DPCD offset 62h
      56             :  * @rc_buffer_size: number of blocks - 1, according to DPCD offset 63h
      57             :  *
      58             :  * return:
      59             :  * buffer size in bytes, or 0 on invalid input
      60             :  */
      61           0 : int drm_dsc_dp_rc_buffer_size(u8 rc_buffer_block_size, u8 rc_buffer_size)
      62             : {
      63           0 :         int size = 1024 * (rc_buffer_size + 1);
      64             : 
      65           0 :         switch (rc_buffer_block_size) {
      66             :         case DP_DSC_RC_BUF_BLK_SIZE_1:
      67           0 :                 return 1 * size;
      68             :         case DP_DSC_RC_BUF_BLK_SIZE_4:
      69           0 :                 return 4 * size;
      70             :         case DP_DSC_RC_BUF_BLK_SIZE_16:
      71           0 :                 return 16 * size;
      72             :         case DP_DSC_RC_BUF_BLK_SIZE_64:
      73           0 :                 return 64 * size;
      74             :         default:
      75             :                 return 0;
      76             :         }
      77             : }
      78             : EXPORT_SYMBOL(drm_dsc_dp_rc_buffer_size);
      79             : 
      80             : /**
      81             :  * drm_dsc_pps_payload_pack() - Populates the DSC PPS
      82             :  *
      83             :  * @pps_payload:
      84             :  * Bitwise struct for DSC Picture Parameter Set. This is defined
      85             :  * by &struct drm_dsc_picture_parameter_set
      86             :  * @dsc_cfg:
      87             :  * DSC Configuration data filled by driver as defined by
      88             :  * &struct drm_dsc_config
      89             :  *
      90             :  * DSC source device sends a picture parameter set (PPS) containing the
      91             :  * information required by the sink to decode the compressed frame. Driver
      92             :  * populates the DSC PPS struct using the DSC configuration parameters in
      93             :  * the order expected by the DSC Display Sink device. For the DSC, the sink
      94             :  * device expects the PPS payload in big endian format for fields
      95             :  * that span more than 1 byte.
      96             :  */
      97           0 : void drm_dsc_pps_payload_pack(struct drm_dsc_picture_parameter_set *pps_payload,
      98             :                                 const struct drm_dsc_config *dsc_cfg)
      99             : {
     100             :         int i;
     101             : 
     102             :         /* Protect against someone accidentally changing struct size */
     103             :         BUILD_BUG_ON(sizeof(*pps_payload) !=
     104             :                      DP_SDP_PPS_HEADER_PAYLOAD_BYTES_MINUS_1 + 1);
     105             : 
     106           0 :         memset(pps_payload, 0, sizeof(*pps_payload));
     107             : 
     108             :         /* PPS 0 */
     109           0 :         pps_payload->dsc_version =
     110           0 :                 dsc_cfg->dsc_version_minor |
     111           0 :                 dsc_cfg->dsc_version_major << DSC_PPS_VERSION_MAJOR_SHIFT;
     112             : 
     113             :         /* PPS 1, 2 is 0 */
     114             : 
     115             :         /* PPS 3 */
     116           0 :         pps_payload->pps_3 =
     117           0 :                 dsc_cfg->line_buf_depth |
     118           0 :                 dsc_cfg->bits_per_component << DSC_PPS_BPC_SHIFT;
     119             : 
     120             :         /* PPS 4 */
     121           0 :         pps_payload->pps_4 =
     122           0 :                 ((dsc_cfg->bits_per_pixel & DSC_PPS_BPP_HIGH_MASK) >>
     123           0 :                  DSC_PPS_MSB_SHIFT) |
     124           0 :                 dsc_cfg->vbr_enable << DSC_PPS_VBR_EN_SHIFT |
     125           0 :                 dsc_cfg->simple_422 << DSC_PPS_SIMPLE422_SHIFT |
     126           0 :                 dsc_cfg->convert_rgb << DSC_PPS_CONVERT_RGB_SHIFT |
     127           0 :                 dsc_cfg->block_pred_enable << DSC_PPS_BLOCK_PRED_EN_SHIFT;
     128             : 
     129             :         /* PPS 5 */
     130           0 :         pps_payload->bits_per_pixel_low =
     131           0 :                 (dsc_cfg->bits_per_pixel & DSC_PPS_LSB_MASK);
     132             : 
     133             :         /*
     134             :          * The DSC panel expects the PPS packet to have big endian format
     135             :          * for data spanning 2 bytes. Use a macro cpu_to_be16() to convert
     136             :          * to big endian format. If format is little endian, it will swap
     137             :          * bytes to convert to Big endian else keep it unchanged.
     138             :          */
     139             : 
     140             :         /* PPS 6, 7 */
     141           0 :         pps_payload->pic_height = cpu_to_be16(dsc_cfg->pic_height);
     142             : 
     143             :         /* PPS 8, 9 */
     144           0 :         pps_payload->pic_width = cpu_to_be16(dsc_cfg->pic_width);
     145             : 
     146             :         /* PPS 10, 11 */
     147           0 :         pps_payload->slice_height = cpu_to_be16(dsc_cfg->slice_height);
     148             : 
     149             :         /* PPS 12, 13 */
     150           0 :         pps_payload->slice_width = cpu_to_be16(dsc_cfg->slice_width);
     151             : 
     152             :         /* PPS 14, 15 */
     153           0 :         pps_payload->chunk_size = cpu_to_be16(dsc_cfg->slice_chunk_size);
     154             : 
     155             :         /* PPS 16 */
     156           0 :         pps_payload->initial_xmit_delay_high =
     157           0 :                 ((dsc_cfg->initial_xmit_delay &
     158           0 :                   DSC_PPS_INIT_XMIT_DELAY_HIGH_MASK) >>
     159             :                  DSC_PPS_MSB_SHIFT);
     160             : 
     161             :         /* PPS 17 */
     162           0 :         pps_payload->initial_xmit_delay_low =
     163           0 :                 (dsc_cfg->initial_xmit_delay & DSC_PPS_LSB_MASK);
     164             : 
     165             :         /* PPS 18, 19 */
     166           0 :         pps_payload->initial_dec_delay =
     167           0 :                 cpu_to_be16(dsc_cfg->initial_dec_delay);
     168             : 
     169             :         /* PPS 20 is 0 */
     170             : 
     171             :         /* PPS 21 */
     172           0 :         pps_payload->initial_scale_value =
     173           0 :                 dsc_cfg->initial_scale_value;
     174             : 
     175             :         /* PPS 22, 23 */
     176           0 :         pps_payload->scale_increment_interval =
     177           0 :                 cpu_to_be16(dsc_cfg->scale_increment_interval);
     178             : 
     179             :         /* PPS 24 */
     180           0 :         pps_payload->scale_decrement_interval_high =
     181           0 :                 ((dsc_cfg->scale_decrement_interval &
     182           0 :                   DSC_PPS_SCALE_DEC_INT_HIGH_MASK) >>
     183             :                  DSC_PPS_MSB_SHIFT);
     184             : 
     185             :         /* PPS 25 */
     186           0 :         pps_payload->scale_decrement_interval_low =
     187           0 :                 (dsc_cfg->scale_decrement_interval & DSC_PPS_LSB_MASK);
     188             : 
     189             :         /* PPS 26[7:0], PPS 27[7:5] RESERVED */
     190             : 
     191             :         /* PPS 27 */
     192           0 :         pps_payload->first_line_bpg_offset =
     193           0 :                 dsc_cfg->first_line_bpg_offset;
     194             : 
     195             :         /* PPS 28, 29 */
     196           0 :         pps_payload->nfl_bpg_offset =
     197           0 :                 cpu_to_be16(dsc_cfg->nfl_bpg_offset);
     198             : 
     199             :         /* PPS 30, 31 */
     200           0 :         pps_payload->slice_bpg_offset =
     201           0 :                 cpu_to_be16(dsc_cfg->slice_bpg_offset);
     202             : 
     203             :         /* PPS 32, 33 */
     204           0 :         pps_payload->initial_offset =
     205           0 :                 cpu_to_be16(dsc_cfg->initial_offset);
     206             : 
     207             :         /* PPS 34, 35 */
     208           0 :         pps_payload->final_offset = cpu_to_be16(dsc_cfg->final_offset);
     209             : 
     210             :         /* PPS 36 */
     211           0 :         pps_payload->flatness_min_qp = dsc_cfg->flatness_min_qp;
     212             : 
     213             :         /* PPS 37 */
     214           0 :         pps_payload->flatness_max_qp = dsc_cfg->flatness_max_qp;
     215             : 
     216             :         /* PPS 38, 39 */
     217           0 :         pps_payload->rc_model_size = cpu_to_be16(dsc_cfg->rc_model_size);
     218             : 
     219             :         /* PPS 40 */
     220           0 :         pps_payload->rc_edge_factor = DSC_RC_EDGE_FACTOR_CONST;
     221             : 
     222             :         /* PPS 41 */
     223           0 :         pps_payload->rc_quant_incr_limit0 =
     224           0 :                 dsc_cfg->rc_quant_incr_limit0;
     225             : 
     226             :         /* PPS 42 */
     227           0 :         pps_payload->rc_quant_incr_limit1 =
     228           0 :                 dsc_cfg->rc_quant_incr_limit1;
     229             : 
     230             :         /* PPS 43 */
     231           0 :         pps_payload->rc_tgt_offset = DSC_RC_TGT_OFFSET_LO_CONST |
     232             :                 DSC_RC_TGT_OFFSET_HI_CONST << DSC_PPS_RC_TGT_OFFSET_HI_SHIFT;
     233             : 
     234             :         /* PPS 44 - 57 */
     235           0 :         for (i = 0; i < DSC_NUM_BUF_RANGES - 1; i++)
     236           0 :                 pps_payload->rc_buf_thresh[i] =
     237           0 :                         dsc_cfg->rc_buf_thresh[i];
     238             : 
     239             :         /* PPS 58 - 87 */
     240             :         /*
     241             :          * For DSC sink programming the RC Range parameter fields
     242             :          * are as follows: Min_qp[15:11], max_qp[10:6], offset[5:0]
     243             :          */
     244           0 :         for (i = 0; i < DSC_NUM_BUF_RANGES; i++) {
     245           0 :                 pps_payload->rc_range_parameters[i] =
     246           0 :                         cpu_to_be16((dsc_cfg->rc_range_params[i].range_min_qp <<
     247             :                                      DSC_PPS_RC_RANGE_MINQP_SHIFT) |
     248             :                                     (dsc_cfg->rc_range_params[i].range_max_qp <<
     249             :                                      DSC_PPS_RC_RANGE_MAXQP_SHIFT) |
     250             :                                     (dsc_cfg->rc_range_params[i].range_bpg_offset));
     251             :         }
     252             : 
     253             :         /* PPS 88 */
     254           0 :         pps_payload->native_422_420 = dsc_cfg->native_422 |
     255           0 :                 dsc_cfg->native_420 << DSC_PPS_NATIVE_420_SHIFT;
     256             : 
     257             :         /* PPS 89 */
     258           0 :         pps_payload->second_line_bpg_offset =
     259           0 :                 dsc_cfg->second_line_bpg_offset;
     260             : 
     261             :         /* PPS 90, 91 */
     262           0 :         pps_payload->nsl_bpg_offset =
     263           0 :                 cpu_to_be16(dsc_cfg->nsl_bpg_offset);
     264             : 
     265             :         /* PPS 92, 93 */
     266           0 :         pps_payload->second_line_offset_adj =
     267           0 :                 cpu_to_be16(dsc_cfg->second_line_offset_adj);
     268             : 
     269             :         /* PPS 94 - 127 are O */
     270           0 : }
     271             : EXPORT_SYMBOL(drm_dsc_pps_payload_pack);
     272             : 
     273             : /**
     274             :  * drm_dsc_set_const_params() - Set DSC parameters considered typically
     275             :  * constant across operation modes
     276             :  *
     277             :  * @vdsc_cfg:
     278             :  * DSC Configuration data partially filled by driver
     279             :  */
     280           0 : void drm_dsc_set_const_params(struct drm_dsc_config *vdsc_cfg)
     281             : {
     282           0 :         if (!vdsc_cfg->rc_model_size)
     283           0 :                 vdsc_cfg->rc_model_size = DSC_RC_MODEL_SIZE_CONST;
     284           0 :         vdsc_cfg->rc_edge_factor = DSC_RC_EDGE_FACTOR_CONST;
     285           0 :         vdsc_cfg->rc_tgt_offset_high = DSC_RC_TGT_OFFSET_HI_CONST;
     286           0 :         vdsc_cfg->rc_tgt_offset_low = DSC_RC_TGT_OFFSET_LO_CONST;
     287             : 
     288           0 :         if (vdsc_cfg->bits_per_component <= 10)
     289           0 :                 vdsc_cfg->mux_word_size = DSC_MUX_WORD_SIZE_8_10_BPC;
     290             :         else
     291           0 :                 vdsc_cfg->mux_word_size = DSC_MUX_WORD_SIZE_12_BPC;
     292           0 : }
     293             : EXPORT_SYMBOL(drm_dsc_set_const_params);
     294             : 
     295             : /* From DSC_v1.11 spec, rc_parameter_Set syntax element typically constant */
     296             : static const u16 drm_dsc_rc_buf_thresh[] = {
     297             :         896, 1792, 2688, 3584, 4480, 5376, 6272, 6720, 7168, 7616,
     298             :         7744, 7872, 8000, 8064
     299             : };
     300             : 
     301             : /**
     302             :  * drm_dsc_set_rc_buf_thresh() - Set thresholds for the RC model
     303             :  * in accordance with the DSC 1.2 specification.
     304             :  *
     305             :  * @vdsc_cfg: DSC Configuration data partially filled by driver
     306             :  */
     307           0 : void drm_dsc_set_rc_buf_thresh(struct drm_dsc_config *vdsc_cfg)
     308             : {
     309             :         int i;
     310             : 
     311             :         BUILD_BUG_ON(ARRAY_SIZE(drm_dsc_rc_buf_thresh) !=
     312             :                      DSC_NUM_BUF_RANGES - 1);
     313             :         BUILD_BUG_ON(ARRAY_SIZE(drm_dsc_rc_buf_thresh) !=
     314             :                      ARRAY_SIZE(vdsc_cfg->rc_buf_thresh));
     315             : 
     316           0 :         for (i = 0; i < ARRAY_SIZE(drm_dsc_rc_buf_thresh); i++)
     317           0 :                 vdsc_cfg->rc_buf_thresh[i] = drm_dsc_rc_buf_thresh[i] >> 6;
     318             : 
     319             :         /*
     320             :          * For 6bpp, RC Buffer threshold 12 and 13 need a different value
     321             :          * as per C Model
     322             :          */
     323           0 :         if (vdsc_cfg->bits_per_pixel == 6 << 4) {
     324           0 :                 vdsc_cfg->rc_buf_thresh[12] = 7936 >> 6;
     325           0 :                 vdsc_cfg->rc_buf_thresh[13] = 8000 >> 6;
     326             :         }
     327           0 : }
     328             : EXPORT_SYMBOL(drm_dsc_set_rc_buf_thresh);
     329             : 
     330             : struct rc_parameters {
     331             :         u16 initial_xmit_delay;
     332             :         u8 first_line_bpg_offset;
     333             :         u16 initial_offset;
     334             :         u8 flatness_min_qp;
     335             :         u8 flatness_max_qp;
     336             :         u8 rc_quant_incr_limit0;
     337             :         u8 rc_quant_incr_limit1;
     338             :         struct drm_dsc_rc_range_parameters rc_range_params[DSC_NUM_BUF_RANGES];
     339             : };
     340             : 
     341             : struct rc_parameters_data {
     342             :         u8 bpp;
     343             :         u8 bpc;
     344             :         struct rc_parameters params;
     345             : };
     346             : 
     347             : #define DSC_BPP(bpp)    ((bpp) << 4)
     348             : 
     349             : /*
     350             :  * Rate Control Related Parameter Recommended Values from DSC_v1.1 spec prior
     351             :  * to DSC 1.1 fractional bpp underflow SCR (DSC_v1.1_E1.pdf)
     352             :  *
     353             :  * Cross-checked against C Model releases: DSC_model_20161212 and 20210623
     354             :  */
     355             : static const struct rc_parameters_data rc_parameters_pre_scr[] = {
     356             :         {
     357             :                 .bpp = DSC_BPP(6), .bpc = 8,
     358             :                 { 683, 15, 6144, 3, 13, 11, 11, {
     359             :                         { 0, 2, 0 }, { 1, 4, -2 }, { 3, 6, -2 }, { 4, 6, -4 },
     360             :                         { 5, 7, -6 }, { 5, 7, -6 }, { 6, 7, -6 }, { 6, 8, -8 },
     361             :                         { 7, 9, -8 }, { 8, 10, -10 }, { 9, 11, -10 }, { 10, 12, -12 },
     362             :                         { 10, 13, -12 }, { 12, 14, -12 }, { 15, 15, -12 }
     363             :                         }
     364             :                 }
     365             :         },
     366             :         {
     367             :                 .bpp = DSC_BPP(8), .bpc = 8,
     368             :                 { 512, 12, 6144, 3, 12, 11, 11, {
     369             :                         { 0, 4, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 1, 6, -2 },
     370             :                         { 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
     371             :                         { 3, 9, -8 }, { 3, 10, -10 }, { 5, 11, -10 }, { 5, 12, -12 },
     372             :                         { 5, 13, -12 }, { 7, 13, -12 }, { 13, 15, -12 }
     373             :                         }
     374             :                 }
     375             :         },
     376             :         {
     377             :                 .bpp = DSC_BPP(8), .bpc = 10,
     378             :                 { 512, 12, 6144, 7, 16, 15, 15, {
     379             :                         /*
     380             :                          * DSC model/pre-SCR-cfg has 8 for range_max_qp[0], however
     381             :                          * VESA DSC 1.1 Table E-5 sets it to 4.
     382             :                          */
     383             :                         { 0, 4, 2 }, { 4, 8, 0 }, { 5, 9, 0 }, { 5, 10, -2 },
     384             :                         { 7, 11, -4 }, { 7, 11, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
     385             :                         { 7, 13, -8 }, { 7, 14, -10 }, { 9, 15, -10 }, { 9, 16, -12 },
     386             :                         { 9, 17, -12 }, { 11, 17, -12 }, { 17, 19, -12 }
     387             :                         }
     388             :                 }
     389             :         },
     390             :         {
     391             :                 .bpp = DSC_BPP(8), .bpc = 12,
     392             :                 { 512, 12, 6144, 11, 20, 19, 19, {
     393             :                         { 0, 12, 2 }, { 4, 12, 0 }, { 9, 13, 0 }, { 9, 14, -2 },
     394             :                         { 11, 15, -4 }, { 11, 15, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
     395             :                         { 11, 17, -8 }, { 11, 18, -10 }, { 13, 19, -10 },
     396             :                         { 13, 20, -12 }, { 13, 21, -12 }, { 15, 21, -12 },
     397             :                         { 21, 23, -12 }
     398             :                         }
     399             :                 }
     400             :         },
     401             :         {
     402             :                 .bpp = DSC_BPP(10), .bpc = 8,
     403             :                 { 410, 12, 5632, 3, 12, 11, 11, {
     404             :                         { 0, 3, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 2, 6, -2 },
     405             :                         { 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
     406             :                         { 3, 9, -8 }, { 3, 9, -10 }, { 5, 10, -10 }, { 5, 11, -10 },
     407             :                         { 5, 12, -12 }, { 7, 13, -12 }, { 13, 15, -12 }
     408             :                         }
     409             :                 }
     410             :         },
     411             :         {
     412             :                 .bpp = DSC_BPP(10), .bpc = 10,
     413             :                 { 410, 12, 5632, 7, 16, 15, 15, {
     414             :                         { 0, 7, 2 }, { 4, 8, 0 }, { 5, 9, 0 }, { 6, 10, -2 },
     415             :                         { 7, 11, -4 }, { 7, 11, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
     416             :                         { 7, 13, -8 }, { 7, 13, -10 }, { 9, 14, -10 }, { 9, 15, -10 },
     417             :                         { 9, 16, -12 }, { 11, 17, -12 }, { 17, 19, -12 }
     418             :                         }
     419             :                 }
     420             :         },
     421             :         {
     422             :                 .bpp = DSC_BPP(10), .bpc = 12,
     423             :                 { 410, 12, 5632, 11, 20, 19, 19, {
     424             :                         { 0, 11, 2 }, { 4, 12, 0 }, { 9, 13, 0 }, { 10, 14, -2 },
     425             :                         { 11, 15, -4 }, { 11, 15, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
     426             :                         { 11, 17, -8 }, { 11, 17, -10 }, { 13, 18, -10 },
     427             :                         { 13, 19, -10 }, { 13, 20, -12 }, { 15, 21, -12 },
     428             :                         { 21, 23, -12 }
     429             :                         }
     430             :                 }
     431             :         },
     432             :         {
     433             :                 .bpp = DSC_BPP(12), .bpc = 8,
     434             :                 { 341, 15, 2048, 3, 12, 11, 11, {
     435             :                         { 0, 2, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 1, 6, -2 },
     436             :                         { 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
     437             :                         { 3, 9, -8 }, { 3, 10, -10 }, { 5, 11, -10 },
     438             :                         { 5, 12, -12 }, { 5, 13, -12 }, { 7, 13, -12 }, { 13, 15, -12 }
     439             :                         }
     440             :                 }
     441             :         },
     442             :         {
     443             :                 .bpp = DSC_BPP(12), .bpc = 10,
     444             :                 { 341, 15, 2048, 7, 16, 15, 15, {
     445             :                         { 0, 2, 2 }, { 2, 5, 0 }, { 3, 7, 0 }, { 4, 8, -2 },
     446             :                         { 6, 9, -4 }, { 7, 10, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
     447             :                         { 7, 13, -8 }, { 7, 14, -10 }, { 9, 15, -10 }, { 9, 16, -12 },
     448             :                         { 9, 17, -12 }, { 11, 17, -12 }, { 17, 19, -12 }
     449             :                         }
     450             :                 }
     451             :         },
     452             :         {
     453             :                 .bpp = DSC_BPP(12), .bpc = 12,
     454             :                 { 341, 15, 2048, 11, 20, 19, 19, {
     455             :                         { 0, 6, 2 }, { 4, 9, 0 }, { 7, 11, 0 }, { 8, 12, -2 },
     456             :                         { 10, 13, -4 }, { 11, 14, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
     457             :                         { 11, 17, -8 }, { 11, 18, -10 }, { 13, 19, -10 },
     458             :                         { 13, 20, -12 }, { 13, 21, -12 }, { 15, 21, -12 },
     459             :                         { 21, 23, -12 }
     460             :                         }
     461             :                 }
     462             :         },
     463             :         {
     464             :                 .bpp = DSC_BPP(15), .bpc = 8,
     465             :                 { 273, 15, 2048, 3, 12, 11, 11, {
     466             :                         { 0, 0, 10 }, { 0, 1, 8 }, { 0, 1, 6 }, { 0, 2, 4 },
     467             :                         { 1, 2, 2 }, { 1, 3, 0 }, { 1, 4, -2 }, { 2, 4, -4 },
     468             :                         { 3, 4, -6 }, { 3, 5, -8 }, { 4, 6, -10 }, { 5, 7, -10 },
     469             :                         { 5, 8, -12 }, { 7, 13, -12 }, { 13, 15, -12 }
     470             :                         }
     471             :                 }
     472             :         },
     473             :         {
     474             :                 .bpp = DSC_BPP(15), .bpc = 10,
     475             :                 { 273, 15, 2048, 7, 16, 15, 15, {
     476             :                         { 0, 2, 10 }, { 2, 5, 8 }, { 3, 5, 6 }, { 4, 6, 4 },
     477             :                         { 5, 6, 2 }, { 5, 7, 0 }, { 5, 8, -2 }, { 6, 8, -4 },
     478             :                         { 7, 8, -6 }, { 7, 9, -8 }, { 8, 10, -10 }, { 9, 11, -10 },
     479             :                         { 9, 12, -12 }, { 11, 17, -12 }, { 17, 19, -12 }
     480             :                         }
     481             :                 }
     482             :         },
     483             :         {
     484             :                 .bpp = DSC_BPP(15), .bpc = 12,
     485             :                 { 273, 15, 2048, 11, 20, 19, 19, {
     486             :                         { 0, 4, 10 }, { 2, 7, 8 }, { 4, 9, 6 }, { 6, 11, 4 },
     487             :                         { 9, 11, 2 }, { 9, 11, 0 }, { 9, 12, -2 }, { 10, 12, -4 },
     488             :                         { 11, 12, -6 }, { 11, 13, -8 }, { 12, 14, -10 },
     489             :                         { 13, 15, -10 }, { 13, 16, -12 }, { 15, 21, -12 },
     490             :                         { 21, 23, -12 }
     491             :                         }
     492             :                 }
     493             :         },
     494             :         { /* sentinel */ }
     495             : };
     496             : 
     497             : /*
     498             :  * Selected Rate Control Related Parameter Recommended Values from DSC v1.2, v1.2a, v1.2b and
     499             :  * DSC_v1.1_E1 specs.
     500             :  *
     501             :  * Cross-checked against C Model releases: DSC_model_20161212 and 20210623
     502             :  */
     503             : static const struct rc_parameters_data rc_parameters_1_2_444[] = {
     504             :         {
     505             :                 .bpp = DSC_BPP(6), .bpc = 8,
     506             :                 { 768, 15, 6144, 3, 13, 11, 11, {
     507             :                         { 0, 4, 0 }, { 1, 6, -2 }, { 3, 8, -2 }, { 4, 8, -4 },
     508             :                         { 5, 9, -6 }, { 5, 9, -6 }, { 6, 9, -6 }, { 6, 10, -8 },
     509             :                         { 7, 11, -8 }, { 8, 12, -10 }, { 9, 12, -10 }, { 10, 12, -12 },
     510             :                         { 10, 12, -12 }, { 11, 12, -12 }, { 13, 14, -12 }
     511             :                         }
     512             :                 }
     513             :         },
     514             :         {
     515             :                 .bpp = DSC_BPP(6), .bpc = 10,
     516             :                 { 768, 15, 6144, 7, 17, 15, 15, {
     517             :                         { 0, 8, 0 }, { 3, 10, -2 }, { 7, 12, -2 }, { 8, 12, -4 },
     518             :                         { 9, 13, -6 }, { 9, 13, -6 }, { 10, 13, -6 }, { 10, 14, -8 },
     519             :                         { 11, 15, -8 }, { 12, 16, -10 }, { 13, 16, -10 },
     520             :                         { 14, 16, -12 }, { 14, 16, -12 }, { 15, 16, -12 },
     521             :                         { 17, 18, -12 }
     522             :                         }
     523             :                 }
     524             :         },
     525             :         {
     526             :                 .bpp = DSC_BPP(6), .bpc = 12,
     527             :                 { 768, 15, 6144, 11, 21, 19, 19, {
     528             :                         { 0, 12, 0 }, { 5, 14, -2 }, { 11, 16, -2 }, { 12, 16, -4 },
     529             :                         { 13, 17, -6 }, { 13, 17, -6 }, { 14, 17, -6 }, { 14, 18, -8 },
     530             :                         { 15, 19, -8 }, { 16, 20, -10 }, { 17, 20, -10 },
     531             :                         { 18, 20, -12 }, { 18, 20, -12 }, { 19, 20, -12 },
     532             :                         { 21, 22, -12 }
     533             :                         }
     534             :                 }
     535             :         },
     536             :         {
     537             :                 .bpp = DSC_BPP(6), .bpc = 14,
     538             :                 { 768, 15, 6144, 15, 25, 23, 23, {
     539             :                         { 0, 16, 0 }, { 7, 18, -2 }, { 15, 20, -2 }, { 16, 20, -4 },
     540             :                         { 17, 21, -6 }, { 17, 21, -6 }, { 18, 21, -6 }, { 18, 22, -8 },
     541             :                         { 19, 23, -8 }, { 20, 24, -10 }, { 21, 24, -10 },
     542             :                         { 22, 24, -12 }, { 22, 24, -12 }, { 23, 24, -12 },
     543             :                         { 25, 26, -12 }
     544             :                         }
     545             :                 }
     546             :         },
     547             :         {
     548             :                 .bpp = DSC_BPP(6), .bpc = 16,
     549             :                 { 768, 15, 6144, 19, 29, 27, 27, {
     550             :                         { 0, 20, 0 }, { 9, 22, -2 }, { 19, 24, -2 }, { 20, 24, -4 },
     551             :                         { 21, 25, -6 }, { 21, 25, -6 }, { 22, 25, -6 }, { 22, 26, -8 },
     552             :                         { 23, 27, -8 }, { 24, 28, -10 }, { 25, 28, -10 },
     553             :                         { 26, 28, -12 }, { 26, 28, -12 }, { 27, 28, -12 },
     554             :                         { 29, 30, -12 }
     555             :                         }
     556             :                 }
     557             :         },
     558             :         {
     559             :                 .bpp = DSC_BPP(8), .bpc = 8,
     560             :                 { 512, 12, 6144, 3, 12, 11, 11, {
     561             :                         { 0, 4, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 1, 6, -2 },
     562             :                         { 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
     563             :                         { 3, 9, -8 }, { 3, 10, -10 }, { 5, 10, -10 }, { 5, 11, -12 },
     564             :                         { 5, 11, -12 }, { 9, 12, -12 }, { 12, 13, -12 }
     565             :                         }
     566             :                 }
     567             :         },
     568             :         {
     569             :                 .bpp = DSC_BPP(8), .bpc = 10,
     570             :                 { 512, 12, 6144, 7, 16, 15, 15, {
     571             :                         { 0, 8, 2 }, { 4, 8, 0 }, { 5, 9, 0 }, { 5, 10, -2 },
     572             :                         { 7, 11, -4 }, { 7, 11, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
     573             :                         { 7, 13, -8 }, { 7, 14, -10 }, { 9, 14, -10 }, { 9, 15, -12 },
     574             :                         { 9, 15, -12 }, { 13, 16, -12 }, { 16, 17, -12 }
     575             :                         }
     576             :                 }
     577             :         },
     578             :         {
     579             :                 .bpp = DSC_BPP(8), .bpc = 12,
     580             :                 { 512, 12, 6144, 11, 20, 19, 19, {
     581             :                         { 0, 12, 2 }, { 4, 12, 0 }, { 9, 13, 0 }, { 9, 14, -2 },
     582             :                         { 11, 15, -4 }, { 11, 15, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
     583             :                         { 11, 17, -8 }, { 11, 18, -10 }, { 13, 18, -10 },
     584             :                         { 13, 19, -12 }, { 13, 19, -12 }, { 17, 20, -12 },
     585             :                         { 20, 21, -12 }
     586             :                         }
     587             :                 }
     588             :         },
     589             :         {
     590             :                 .bpp = DSC_BPP(8), .bpc = 14,
     591             :                 { 512, 12, 6144, 15, 24, 23, 23, {
     592             :                         { 0, 12, 2 }, { 5, 13, 0 }, { 11, 15, 0 }, { 12, 17, -2 },
     593             :                         { 15, 19, -4 }, { 15, 19, -6 }, { 15, 19, -8 }, { 15, 20, -8 },
     594             :                         { 15, 21, -8 }, { 15, 22, -10 }, { 17, 22, -10 },
     595             :                         { 17, 23, -12 }, { 17, 23, -12 }, { 21, 24, -12 },
     596             :                         { 24, 25, -12 }
     597             :                         }
     598             :                 }
     599             :         },
     600             :         {
     601             :                 .bpp = DSC_BPP(8), .bpc = 16,
     602             :                 { 512, 12, 6144, 19, 28, 27, 27, {
     603             :                         { 0, 12, 2 }, { 6, 14, 0 }, { 13, 17, 0 }, { 15, 20, -2 },
     604             :                         { 19, 23, -4 }, { 19, 23, -6 }, { 19, 23, -8 }, { 19, 24, -8 },
     605             :                         { 19, 25, -8 }, { 19, 26, -10 }, { 21, 26, -10 },
     606             :                         { 21, 27, -12 }, { 21, 27, -12 }, { 25, 28, -12 },
     607             :                         { 28, 29, -12 }
     608             :                         }
     609             :                 }
     610             :         },
     611             :         {
     612             :                 .bpp = DSC_BPP(10), .bpc = 8,
     613             :                 { 410, 15, 5632, 3, 12, 11, 11, {
     614             :                         { 0, 3, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 2, 6, -2 },
     615             :                         { 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
     616             :                         { 3, 9, -8 }, { 3, 9, -10 }, { 5, 10, -10 }, { 5, 10, -10 },
     617             :                         { 5, 11, -12 }, { 7, 11, -12 }, { 11, 12, -12 }
     618             :                         }
     619             :                 }
     620             :         },
     621             :         {
     622             :                 .bpp = DSC_BPP(10), .bpc = 10,
     623             :                 { 410, 15, 5632, 7, 16, 15, 15, {
     624             :                         { 0, 7, 2 }, { 4, 8, 0 }, { 5, 9, 0 }, { 6, 10, -2 },
     625             :                         { 7, 11, -4 }, { 7, 11, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
     626             :                         { 7, 13, -8 }, { 7, 13, -10 }, { 9, 14, -10 }, { 9, 14, -10 },
     627             :                         { 9, 15, -12 }, { 11, 15, -12 }, { 15, 16, -12 }
     628             :                         }
     629             :                 }
     630             :         },
     631             :         {
     632             :                 .bpp = DSC_BPP(10), .bpc = 12,
     633             :                 { 410, 15, 5632, 11, 20, 19, 19, {
     634             :                         { 0, 11, 2 }, { 4, 12, 0 }, { 9, 13, 0 }, { 10, 14, -2 },
     635             :                         { 11, 15, -4 }, { 11, 15, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
     636             :                         { 11, 17, -8 }, { 11, 17, -10 }, { 13, 18, -10 },
     637             :                         { 13, 18, -10 }, { 13, 19, -12 }, { 15, 19, -12 },
     638             :                         { 19, 20, -12 }
     639             :                         }
     640             :                 }
     641             :         },
     642             :         {
     643             :                 .bpp = DSC_BPP(10), .bpc = 14,
     644             :                 { 410, 15, 5632, 15, 24, 23, 23, {
     645             :                         { 0, 11, 2 }, { 5, 13, 0 }, { 11, 15, 0 }, { 13, 18, -2 },
     646             :                         { 15, 19, -4 }, { 15, 19, -6 }, { 15, 19, -8 }, { 15, 20, -8 },
     647             :                         { 15, 21, -8 }, { 15, 21, -10 }, { 17, 22, -10 },
     648             :                         { 17, 22, -10 }, { 17, 23, -12 }, { 19, 23, -12 },
     649             :                         { 23, 24, -12 }
     650             :                         }
     651             :                 }
     652             :         },
     653             :         {
     654             :                 .bpp = DSC_BPP(10), .bpc = 16,
     655             :                 { 410, 15, 5632, 19, 28, 27, 27, {
     656             :                         { 0, 11, 2 }, { 6, 14, 0 }, { 13, 17, 0 }, { 16, 20, -2 },
     657             :                         { 19, 23, -4 }, { 19, 23, -6 }, { 19, 23, -8 }, { 19, 24, -8 },
     658             :                         { 19, 25, -8 }, { 19, 25, -10 }, { 21, 26, -10 },
     659             :                         { 21, 26, -10 }, { 21, 27, -12 }, { 23, 27, -12 },
     660             :                         { 27, 28, -12 }
     661             :                         }
     662             :                 }
     663             :         },
     664             :         {
     665             :                 .bpp = DSC_BPP(12), .bpc = 8,
     666             :                 { 341, 15, 2048, 3, 12, 11, 11, {
     667             :                         { 0, 2, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 1, 6, -2 },
     668             :                         { 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
     669             :                         { 3, 8, -8 }, { 3, 9, -10 }, { 5, 9, -10 }, { 5, 9, -12 },
     670             :                         { 5, 9, -12 }, { 7, 10, -12 }, { 10, 11, -12 }
     671             :                         }
     672             :                 }
     673             :         },
     674             :         {
     675             :                 .bpp = DSC_BPP(12), .bpc = 10,
     676             :                 { 341, 15, 2048, 7, 16, 15, 15, {
     677             :                         { 0, 2, 2 }, { 2, 5, 0 }, { 3, 7, 0 }, { 4, 8, -2 },
     678             :                         { 6, 9, -4 }, { 7, 10, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
     679             :                         { 7, 12, -8 }, { 7, 13, -10 }, { 9, 13, -10 }, { 9, 13, -12 },
     680             :                         { 9, 13, -12 }, { 11, 14, -12 }, { 14, 15, -12 }
     681             :                         }
     682             :                 }
     683             :         },
     684             :         {
     685             :                 .bpp = DSC_BPP(12), .bpc = 12,
     686             :                 { 341, 15, 2048, 11, 20, 19, 19, {
     687             :                         { 0, 6, 2 }, { 4, 9, 0 }, { 7, 11, 0 }, { 8, 12, -2 },
     688             :                         { 10, 13, -4 }, { 11, 14, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
     689             :                         { 11, 16, -8 }, { 11, 17, -10 }, { 13, 17, -10 },
     690             :                         { 13, 17, -12 }, { 13, 17, -12 }, { 15, 18, -12 },
     691             :                         { 18, 19, -12 }
     692             :                         }
     693             :                 }
     694             :         },
     695             :         {
     696             :                 .bpp = DSC_BPP(12), .bpc = 14,
     697             :                 { 341, 15, 2048, 15, 24, 23, 23, {
     698             :                         { 0, 6, 2 }, { 7, 10, 0 }, { 9, 13, 0 }, { 11, 16, -2 },
     699             :                         { 14, 17, -4 }, { 15, 18, -6 }, { 15, 19, -8 }, { 15, 20, -8 },
     700             :                         { 15, 20, -8 }, { 15, 21, -10 }, { 17, 21, -10 },
     701             :                         { 17, 21, -12 }, { 17, 21, -12 }, { 19, 22, -12 },
     702             :                         { 22, 23, -12 }
     703             :                         }
     704             :                 }
     705             :         },
     706             :         {
     707             :                 .bpp = DSC_BPP(12), .bpc = 16,
     708             :                 { 341, 15, 2048, 19, 28, 27, 27, {
     709             :                         { 0, 6, 2 }, { 6, 11, 0 }, { 11, 15, 0 }, { 14, 18, -2 },
     710             :                         { 18, 21, -4 }, { 19, 22, -6 }, { 19, 23, -8 }, { 19, 24, -8 },
     711             :                         { 19, 24, -8 }, { 19, 25, -10 }, { 21, 25, -10 },
     712             :                         { 21, 25, -12 }, { 21, 25, -12 }, { 23, 26, -12 },
     713             :                         { 26, 27, -12 }
     714             :                         }
     715             :                 }
     716             :         },
     717             :         {
     718             :                 .bpp = DSC_BPP(15), .bpc = 8,
     719             :                 { 273, 15, 2048, 3, 12, 11, 11, {
     720             :                         { 0, 0, 10 }, { 0, 1, 8 }, { 0, 1, 6 }, { 0, 2, 4 },
     721             :                         { 1, 2, 2 }, { 1, 3, 0 }, { 1, 3, -2 }, { 2, 4, -4 },
     722             :                         { 2, 5, -6 }, { 3, 5, -8 }, { 4, 6, -10 }, { 4, 7, -10 },
     723             :                         { 5, 7, -12 }, { 7, 8, -12 }, { 8, 9, -12 }
     724             :                         }
     725             :                 }
     726             :         },
     727             :         {
     728             :                 .bpp = DSC_BPP(15), .bpc = 10,
     729             :                 { 273, 15, 2048, 7, 16, 15, 15, {
     730             :                         { 0, 2, 10 }, { 2, 5, 8 }, { 3, 5, 6 }, { 4, 6, 4 },
     731             :                         { 5, 6, 2 }, { 5, 7, 0 }, { 5, 7, -2 }, { 6, 8, -4 },
     732             :                         { 6, 9, -6 }, { 7, 9, -8 }, { 8, 10, -10 }, { 8, 11, -10 },
     733             :                         { 9, 11, -12 }, { 11, 12, -12 }, { 12, 13, -12 }
     734             :                         }
     735             :                 }
     736             :         },
     737             :         {
     738             :                 .bpp = DSC_BPP(15), .bpc = 12,
     739             :                 { 273, 15, 2048, 11, 20, 19, 19, {
     740             :                         { 0, 4, 10 }, { 2, 7, 8 }, { 4, 9, 6 }, { 6, 11, 4 },
     741             :                         { 9, 11, 2 }, { 9, 11, 0 }, { 9, 12, -2 }, { 10, 12, -4 },
     742             :                         { 11, 13, -6 }, { 11, 13, -8 }, { 12, 14, -10 },
     743             :                         { 13, 15, -10 }, { 13, 15, -12 }, { 15, 16, -12 },
     744             :                         { 16, 17, -12 }
     745             :                         }
     746             :                 }
     747             :         },
     748             :         {
     749             :                 .bpp = DSC_BPP(15), .bpc = 14,
     750             :                 { 273, 15, 2048, 15, 24, 23, 23, {
     751             :                         { 0, 4, 10 }, { 3, 8, 8 }, { 6, 11, 6 }, { 9, 14, 4 },
     752             :                         { 13, 15, 2 }, { 13, 15, 0 }, { 13, 16, -2 }, { 14, 16, -4 },
     753             :                         { 15, 17, -6 }, { 15, 17, -8 }, { 16, 18, -10 },
     754             :                         { 17, 19, -10 }, { 17, 19, -12 }, { 19, 20, -12 },
     755             :                         { 20, 21, -12 }
     756             :                         }
     757             :                 }
     758             :         },
     759             :         {
     760             :                 .bpp = DSC_BPP(15), .bpc = 16,
     761             :                 { 273, 15, 2048, 19, 28, 27, 27, {
     762             :                         { 0, 4, 10 }, { 4, 9, 8 }, { 8, 13, 6 }, { 12, 17, 4 },
     763             :                         { 17, 19, 2 }, { 17, 20, 0 }, { 17, 20, -2 }, { 18, 20, -4 },
     764             :                         { 19, 21, -6 }, { 19, 21, -8 }, { 20, 22, -10 },
     765             :                         { 21, 23, -10 }, { 21, 23, -12 }, { 23, 24, -12 },
     766             :                         { 24, 25, -12 }
     767             :                         }
     768             :                 }
     769             :         },
     770             :         { /* sentinel */ }
     771             : };
     772             : 
     773             : /*
     774             :  * Selected Rate Control Related Parameter Recommended Values for 4:2:2 from
     775             :  * DSC v1.2, v1.2a, v1.2b
     776             :  *
     777             :  * Cross-checked against C Model releases: DSC_model_20161212 and 20210623
     778             :  */
     779             : static const struct rc_parameters_data rc_parameters_1_2_422[] = {
     780             :         {
     781             :                 .bpp = DSC_BPP(6), .bpc = 8,
     782             :                 { 512, 15, 6144, 3, 12, 11, 11, {
     783             :                         { 0, 4, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 1, 6, -2 },
     784             :                         { 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
     785             :                         { 3, 9, -8 }, { 3, 10, -10 }, { 5, 10, -10 }, { 5, 11, -12 },
     786             :                         { 5, 11, -12 }, { 9, 12, -12 }, { 12, 13, -12 }
     787             :                         }
     788             :                 }
     789             :         },
     790             :         {
     791             :                 .bpp = DSC_BPP(6), .bpc = 10,
     792             :                 { 512, 15, 6144, 7, 16, 15, 15, {
     793             :                         { 0, 8, 2 }, { 4, 8, 0 }, { 5, 9, 0 }, { 5, 10, -2 },
     794             :                         { 7, 11, -4 }, { 7, 11, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
     795             :                         { 7, 13, -8 }, { 7, 14, -10 }, { 9, 14, -10 }, { 9, 15, -12 },
     796             :                         { 9, 15, -12 }, { 13, 16, -12 }, { 16, 17, -12 }
     797             :                         }
     798             :                 }
     799             :         },
     800             :         {
     801             :                 .bpp = DSC_BPP(6), .bpc = 12,
     802             :                 { 512, 15, 6144, 11, 20, 19, 19, {
     803             :                         { 0, 12, 2 }, { 4, 12, 0 }, { 9, 13, 0 }, { 9, 14, -2 },
     804             :                         { 11, 15, -4 }, { 11, 15, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
     805             :                         { 11, 17, -8 }, { 11, 18, -10 }, { 13, 18, -10 },
     806             :                         { 13, 19, -12 }, { 13, 19, -12 }, { 17, 20, -12 },
     807             :                         { 20, 21, -12 }
     808             :                         }
     809             :                 }
     810             :         },
     811             :         {
     812             :                 .bpp = DSC_BPP(6), .bpc = 14,
     813             :                 { 512, 15, 6144, 15, 24, 23, 23, {
     814             :                         { 0, 12, 2 }, { 5, 13, 0 }, { 11, 15, 0 }, { 12, 17, -2 },
     815             :                         { 15, 19, -4 }, { 15, 19, -6 }, { 15, 19, -8 }, { 15, 20, -8 },
     816             :                         { 15, 21, -8 }, { 15, 22, -10 }, { 17, 22, -10 },
     817             :                         { 17, 23, -12 }, { 17, 23, -12 }, { 21, 24, -12 },
     818             :                         { 24, 25, -12 }
     819             :                         }
     820             :                 }
     821             :         },
     822             :         {
     823             :                 .bpp = DSC_BPP(6), .bpc = 16,
     824             :                 { 512, 15, 6144, 19, 28, 27, 27, {
     825             :                         { 0, 12, 2 }, { 6, 14, 0 }, { 13, 17, 0 }, { 15, 20, -2 },
     826             :                         { 19, 23, -4 }, { 19, 23, -6 }, { 19, 23, -8 }, { 19, 24, -8 },
     827             :                         { 19, 25, -8 }, { 19, 26, -10 }, { 21, 26, -10 },
     828             :                         { 21, 27, -12 }, { 21, 27, -12 }, { 25, 28, -12 },
     829             :                         { 28, 29, -12 }
     830             :                         }
     831             :                 }
     832             :         },
     833             :         {
     834             :                 .bpp = DSC_BPP(7), .bpc = 8,
     835             :                 { 410, 15, 5632, 3, 12, 11, 11, {
     836             :                         { 0, 3, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 2, 6, -2 },
     837             :                         { 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
     838             :                         { 3, 9, -8 }, { 3, 9, -10 }, { 5, 10, -10 }, { 5, 10, -10 },
     839             :                         { 5, 11, -12 }, { 7, 11, -12 }, { 11, 12, -12 }
     840             :                         }
     841             :                 }
     842             :         },
     843             :         {
     844             :                 .bpp = DSC_BPP(7), .bpc = 10,
     845             :                 { 410, 15, 5632, 7, 16, 15, 15, {
     846             :                         { 0, 7, 2 }, { 4, 8, 0 }, { 5, 9, 0 }, { 6, 10, -2 },
     847             :                         { 7, 11, -4 }, { 7, 11, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
     848             :                         { 7, 13, -8 }, { 7, 13, -10 }, { 9, 14, -10 }, { 9, 14, -10 },
     849             :                         { 9, 15, -12 }, { 11, 15, -12 }, { 15, 16, -12 }
     850             :                         }
     851             :                 }
     852             :         },
     853             :         {
     854             :                 .bpp = DSC_BPP(7), .bpc = 12,
     855             :                 { 410, 15, 5632, 11, 20, 19, 19, {
     856             :                         { 0, 11, 2 }, { 4, 12, 0 }, { 9, 13, 0 }, { 10, 14, -2 },
     857             :                         { 11, 15, -4 }, { 11, 15, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
     858             :                         { 11, 17, -8 }, { 11, 17, -10 }, { 13, 18, -10 },
     859             :                         { 13, 18, -10 }, { 13, 19, -12 }, { 15, 19, -12 },
     860             :                         { 19, 20, -12 }
     861             :                         }
     862             :                 }
     863             :         },
     864             :         {
     865             :                 .bpp = DSC_BPP(7), .bpc = 14,
     866             :                 { 410, 15, 5632, 15, 24, 23, 23, {
     867             :                         { 0, 11, 2 }, { 5, 13, 0 }, { 11, 15, 0 }, { 13, 18, -2 },
     868             :                         { 15, 19, -4 }, { 15, 19, -6 }, { 15, 19, -8 }, { 15, 20, -8 },
     869             :                         { 15, 21, -8 }, { 15, 21, -10 }, { 17, 22, -10 },
     870             :                         { 17, 22, -10 }, { 17, 23, -12 }, { 19, 23, -12 },
     871             :                         { 23, 24, -12 }
     872             :                         }
     873             :                 }
     874             :         },
     875             :         {
     876             :                 .bpp = DSC_BPP(7), .bpc = 16,
     877             :                 { 410, 15, 5632, 19, 28, 27, 27, {
     878             :                         { 0, 11, 2 }, { 6, 14, 0 }, { 13, 17, 0 }, { 16, 20, -2 },
     879             :                         { 19, 23, -4 }, { 19, 23, -6 }, { 19, 23, -8 }, { 19, 24, -8 },
     880             :                         { 19, 25, -8 }, { 19, 25, -10 }, { 21, 26, -10 },
     881             :                         { 21, 26, -10 }, { 21, 27, -12 }, { 23, 27, -12 },
     882             :                         { 27, 28, -12 }
     883             :                         }
     884             :                 }
     885             :         },
     886             :         {
     887             :                 .bpp = DSC_BPP(8), .bpc = 8,
     888             :                 { 341, 15, 2048, 3, 12, 11, 11, {
     889             :                         { 0, 2, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 1, 6, -2 },
     890             :                         { 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
     891             :                         { 3, 8, -8 }, { 3, 9, -10 }, { 5, 9, -10 }, { 5, 9, -12 },
     892             :                         { 5, 9, -12 }, { 7, 10, -12 }, { 10, 11, -12 }
     893             :                         }
     894             :                 }
     895             :         },
     896             :         {
     897             :                 .bpp = DSC_BPP(8), .bpc = 10,
     898             :                 { 341, 15, 2048, 7, 16, 15, 15, {
     899             :                         { 0, 2, 2 }, { 2, 5, 0 }, { 3, 7, 0 }, { 4, 8, -2 },
     900             :                         { 6, 9, -4 }, { 7, 10, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
     901             :                         { 7, 12, -8 }, { 7, 13, -10 }, { 9, 13, -10 }, { 9, 13, -12 },
     902             :                         { 9, 13, -12 }, { 11, 14, -12 }, { 14, 15, -12 }
     903             :                         }
     904             :                 }
     905             :         },
     906             :         {
     907             :                 .bpp = DSC_BPP(8), .bpc = 12,
     908             :                 { 341, 15, 2048, 11, 20, 19, 19, {
     909             :                         { 0, 6, 2 }, { 4, 9, 0 }, { 7, 11, 0 }, { 8, 12, -2 },
     910             :                         { 10, 13, -4 }, { 11, 14, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
     911             :                         { 11, 16, -8 }, { 11, 17, -10 }, { 13, 17, -10 },
     912             :                         { 13, 17, -12 }, { 13, 17, -12 }, { 15, 18, -12 },
     913             :                         { 18, 19, -12 }
     914             :                         }
     915             :                 }
     916             :         },
     917             :         {
     918             :                 .bpp = DSC_BPP(8), .bpc = 14,
     919             :                 { 341, 15, 2048, 15, 24, 23, 23, {
     920             :                         { 0, 6, 2 }, { 7, 10, 0 }, { 9, 13, 0 }, { 11, 16, -2 },
     921             :                         { 14, 17, -4 }, { 15, 18, -6 }, { 15, 19, -8 }, { 15, 20, -8 },
     922             :                         { 15, 20, -8 }, { 15, 21, -10 }, { 17, 21, -10 },
     923             :                         { 17, 21, -12 }, { 17, 21, -12 }, { 19, 22, -12 },
     924             :                         { 22, 23, -12 }
     925             :                         }
     926             :                 }
     927             :         },
     928             :         {
     929             :                 .bpp = DSC_BPP(8), .bpc = 16,
     930             :                 { 341, 15, 2048, 19, 28, 27, 27, {
     931             :                         { 0, 6, 2 }, { 6, 11, 0 }, { 11, 15, 0 }, { 14, 18, -2 },
     932             :                         { 18, 21, -4 }, { 19, 22, -6 }, { 19, 23, -8 }, { 19, 24, -8 },
     933             :                         { 19, 24, -8 }, { 19, 25, -10 }, { 21, 25, -10 },
     934             :                         { 21, 25, -12 }, { 21, 25, -12 }, { 23, 26, -12 },
     935             :                         { 26, 27, -12 }
     936             :                         }
     937             :                 }
     938             :         },
     939             :         {
     940             :                 .bpp = DSC_BPP(10), .bpc = 8,
     941             :                 { 273, 15, 2048, 3, 12, 11, 11, {
     942             :                         { 0, 0, 10 }, { 0, 1, 8 }, { 0, 1, 6 }, { 0, 2, 4 },
     943             :                         { 1, 2, 2 }, { 1, 3, 0 }, { 1, 3, -2 }, { 2, 4, -4 },
     944             :                         { 2, 5, -6 }, { 3, 5, -8 }, { 4, 6, -10 }, { 4, 7, -10 },
     945             :                         { 5, 7, -12 }, { 7, 8, -12 }, { 8, 9, -12 }
     946             :                         }
     947             :                 }
     948             :         },
     949             :         {
     950             :                 .bpp = DSC_BPP(10), .bpc = 10,
     951             :                 { 273, 15, 2048, 7, 16, 15, 15, {
     952             :                         { 0, 2, 10 }, { 2, 5, 8 }, { 3, 5, 6 }, { 4, 6, 4 },
     953             :                         { 5, 6, 2 }, { 5, 7, 0 }, { 5, 7, -2 }, { 6, 8, -4 },
     954             :                         { 6, 9, -6 }, { 7, 9, -8 }, { 8, 10, -10 }, { 8, 11, -10 },
     955             :                         { 9, 11, -12 }, { 11, 12, -12 }, { 12, 13, -12 }
     956             :                         }
     957             :                 }
     958             :         },
     959             :         {
     960             :                 .bpp = DSC_BPP(10), .bpc = 12,
     961             :                 { 273, 15, 2048, 11, 20, 19, 19, {
     962             :                         { 0, 4, 10 }, { 2, 7, 8 }, { 4, 9, 6 }, { 6, 11, 4 },
     963             :                         { 9, 11, 2 }, { 9, 11, 0 }, { 9, 12, -2 }, { 10, 12, -4 },
     964             :                         { 11, 13, -6 }, { 11, 13, -8 }, { 12, 14, -10 },
     965             :                         { 13, 15, -10 }, { 13, 15, -12 }, { 15, 16, -12 },
     966             :                         { 16, 17, -12 }
     967             :                         }
     968             :                 }
     969             :         },
     970             :         {
     971             :                 .bpp = DSC_BPP(10), .bpc = 14,
     972             :                 { 273, 15, 2048, 15, 24, 23, 23, {
     973             :                         { 0, 4, 10 }, { 3, 8, 8 }, { 6, 11, 6 }, { 9, 14, 4 },
     974             :                         { 13, 15, 2 }, { 13, 15, 0 }, { 13, 16, -2 }, { 14, 16, -4 },
     975             :                         { 15, 17, -6 }, { 15, 17, -8 }, { 16, 18, -10 },
     976             :                         { 17, 19, -10 }, { 17, 19, -12 }, { 19, 20, -12 },
     977             :                         { 20, 21, -12 }
     978             :                         }
     979             :                 }
     980             :         },
     981             :         {
     982             :                 .bpp = DSC_BPP(10), .bpc = 16,
     983             :                 { 273, 15, 2048, 19, 28, 27, 27, {
     984             :                         { 0, 4, 10 }, { 4, 9, 8 }, { 8, 13, 6 }, { 12, 17, 4 },
     985             :                         { 17, 19, 2 }, { 17, 20, 0 }, { 17, 20, -2 }, { 18, 20, -4 },
     986             :                         { 19, 21, -6 }, { 19, 21, -8 }, { 20, 22, -10 },
     987             :                         { 21, 23, -10 }, { 21, 23, -12 }, { 23, 24, -12 },
     988             :                         { 24, 25, -12 }
     989             :                         }
     990             :                 }
     991             :         },
     992             :         { /* sentinel */ }
     993             : };
     994             : 
     995             : /*
     996             :  * Selected Rate Control Related Parameter Recommended Values for 4:2:2 from
     997             :  * DSC v1.2, v1.2a, v1.2b
     998             :  *
     999             :  * Cross-checked against C Model releases: DSC_model_20161212 and 20210623
    1000             :  */
    1001             : static const struct rc_parameters_data rc_parameters_1_2_420[] = {
    1002             :         {
    1003             :                 .bpp = DSC_BPP(4), .bpc = 8,
    1004             :                 { 512, 12, 6144, 3, 12, 11, 11, {
    1005             :                         { 0, 4, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 1, 6, -2 },
    1006             :                         { 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
    1007             :                         { 3, 9, -8 }, { 3, 10, -10 }, { 5, 10, -10 }, { 5, 11, -12 },
    1008             :                         { 5, 11, -12 }, { 9, 12, -12 }, { 12, 13, -12 }
    1009             :                         }
    1010             :                 }
    1011             :         },
    1012             :         {
    1013             :                 .bpp = DSC_BPP(4), .bpc = 10,
    1014             :                 { 512, 12, 6144, 7, 16, 15, 15, {
    1015             :                         { 0, 8, 2 }, { 4, 8, 0 }, { 5, 9, 0 }, { 5, 10, -2 },
    1016             :                         { 7, 11, -4 }, { 7, 11, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
    1017             :                         { 7, 13, -8 }, { 7, 14, -10 }, { 9, 14, -10 }, { 9, 15, -12 },
    1018             :                         { 9, 15, -12 }, { 13, 16, -12 }, { 16, 17, -12 }
    1019             :                         }
    1020             :                 }
    1021             :         },
    1022             :         {
    1023             :                 .bpp = DSC_BPP(4), .bpc = 12,
    1024             :                 { 512, 12, 6144, 11, 20, 19, 19, {
    1025             :                         { 0, 12, 2 }, { 4, 12, 0 }, { 9, 13, 0 }, { 9, 14, -2 },
    1026             :                         { 11, 15, -4 }, { 11, 15, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
    1027             :                         { 11, 17, -8 }, { 11, 18, -10 }, { 13, 18, -10 },
    1028             :                         { 13, 19, -12 }, { 13, 19, -12 }, { 17, 20, -12 },
    1029             :                         { 20, 21, -12 }
    1030             :                         }
    1031             :                 }
    1032             :         },
    1033             :         {
    1034             :                 .bpp = DSC_BPP(4), .bpc = 14,
    1035             :                 { 512, 12, 6144, 15, 24, 23, 23, {
    1036             :                         { 0, 12, 2 }, { 5, 13, 0 }, { 11, 15, 0 }, { 12, 17, -2 },
    1037             :                         { 15, 19, -4 }, { 15, 19, -6 }, { 15, 19, -8 }, { 15, 20, -8 },
    1038             :                         { 15, 21, -8 }, { 15, 22, -10 }, { 17, 22, -10 },
    1039             :                         { 17, 23, -12 }, { 17, 23, -12 }, { 21, 24, -12 },
    1040             :                         { 24, 25, -12 }
    1041             :                         }
    1042             :                 }
    1043             :         },
    1044             :         {
    1045             :                 .bpp = DSC_BPP(4), .bpc = 16,
    1046             :                 { 512, 12, 6144, 19, 28, 27, 27, {
    1047             :                         { 0, 12, 2 }, { 6, 14, 0 }, { 13, 17, 0 }, { 15, 20, -2 },
    1048             :                         { 19, 23, -4 }, { 19, 23, -6 }, { 19, 23, -8 }, { 19, 24, -8 },
    1049             :                         { 19, 25, -8 }, { 19, 26, -10 }, { 21, 26, -10 },
    1050             :                         { 21, 27, -12 }, { 21, 27, -12 }, { 25, 28, -12 },
    1051             :                         { 28, 29, -12 }
    1052             :                         }
    1053             :                 }
    1054             :         },
    1055             :         {
    1056             :                 .bpp = DSC_BPP(5), .bpc = 8,
    1057             :                 { 410, 15, 5632, 3, 12, 11, 11, {
    1058             :                         { 0, 3, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 2, 6, -2 },
    1059             :                         { 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
    1060             :                         { 3, 9, -8 }, { 3, 9, -10 }, { 5, 10, -10 }, { 5, 10, -10 },
    1061             :                         { 5, 11, -12 }, { 7, 11, -12 }, { 11, 12, -12 }
    1062             :                         }
    1063             :                 }
    1064             :         },
    1065             :         {
    1066             :                 .bpp = DSC_BPP(5), .bpc = 10,
    1067             :                 { 410, 15, 5632, 7, 16, 15, 15, {
    1068             :                         { 0, 7, 2 }, { 4, 8, 0 }, { 5, 9, 0 }, { 6, 10, -2 },
    1069             :                         { 7, 11, -4 }, { 7, 11, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
    1070             :                         { 7, 13, -8 }, { 7, 13, -10 }, { 9, 14, -10 }, { 9, 14, -10 },
    1071             :                         { 9, 15, -12 }, { 11, 15, -12 }, { 15, 16, -12 }
    1072             :                         }
    1073             :                 }
    1074             :         },
    1075             :         {
    1076             :                 .bpp = DSC_BPP(5), .bpc = 12,
    1077             :                 { 410, 15, 5632, 11, 20, 19, 19, {
    1078             :                         { 0, 11, 2 }, { 4, 12, 0 }, { 9, 13, 0 }, { 10, 14, -2 },
    1079             :                         { 11, 15, -4 }, { 11, 15, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
    1080             :                         { 11, 17, -8 }, { 11, 17, -10 }, { 13, 18, -10 },
    1081             :                         { 13, 18, -10 }, { 13, 19, -12 }, { 15, 19, -12 },
    1082             :                         { 19, 20, -12 }
    1083             :                         }
    1084             :                 }
    1085             :         },
    1086             :         {
    1087             :                 .bpp = DSC_BPP(5), .bpc = 14,
    1088             :                 { 410, 15, 5632, 15, 24, 23, 23, {
    1089             :                         { 0, 11, 2 }, { 5, 13, 0 }, { 11, 15, 0 }, { 13, 18, -2 },
    1090             :                         { 15, 19, -4 }, { 15, 19, -6 }, { 15, 19, -8 }, { 15, 20, -8 },
    1091             :                         { 15, 21, -8 }, { 15, 21, -10 }, { 17, 22, -10 },
    1092             :                         { 17, 22, -10 }, { 17, 23, -12 }, { 19, 23, -12 },
    1093             :                         { 23, 24, -12 }
    1094             :                         }
    1095             :                 }
    1096             :         },
    1097             :         {
    1098             :                 .bpp = DSC_BPP(5), .bpc = 16,
    1099             :                 { 410, 15, 5632, 19, 28, 27, 27, {
    1100             :                         { 0, 11, 2 }, { 6, 14, 0 }, { 13, 17, 0 }, { 16, 20, -2 },
    1101             :                         { 19, 23, -4 }, { 19, 23, -6 }, { 19, 23, -8 }, { 19, 24, -8 },
    1102             :                         { 19, 25, -8 }, { 19, 25, -10 }, { 21, 26, -10 },
    1103             :                         { 21, 26, -10 }, { 21, 27, -12 }, { 23, 27, -12 },
    1104             :                         { 27, 28, -12 }
    1105             :                         }
    1106             :                 }
    1107             :         },
    1108             :         {
    1109             :                 .bpp = DSC_BPP(6), .bpc = 8,
    1110             :                 { 341, 15, 2048, 3, 12, 11, 11, {
    1111             :                         { 0, 2, 2 }, { 0, 4, 0 }, { 1, 5, 0 }, { 1, 6, -2 },
    1112             :                         { 3, 7, -4 }, { 3, 7, -6 }, { 3, 7, -8 }, { 3, 8, -8 },
    1113             :                         { 3, 8, -8 }, { 3, 9, -10 }, { 5, 9, -10 }, { 5, 9, -12 },
    1114             :                         { 5, 9, -12 }, { 7, 10, -12 }, { 10, 12, -12 }
    1115             :                         }
    1116             :                 }
    1117             :         },
    1118             :         {
    1119             :                 .bpp = DSC_BPP(6), .bpc = 10,
    1120             :                 { 341, 15, 2048, 7, 16, 15, 15, {
    1121             :                         { 0, 2, 2 }, { 2, 5, 0 }, { 3, 7, 0 }, { 4, 8, -2 },
    1122             :                         { 6, 9, -4 }, { 7, 10, -6 }, { 7, 11, -8 }, { 7, 12, -8 },
    1123             :                         { 7, 12, -8 }, { 7, 13, -10 }, { 9, 13, -10 }, { 9, 13, -12 },
    1124             :                         { 9, 13, -12 }, { 11, 14, -12 }, { 14, 15, -12 }
    1125             :                         }
    1126             :                 }
    1127             :         },
    1128             :         {
    1129             :                 .bpp = DSC_BPP(6), .bpc = 12,
    1130             :                 { 341, 15, 2048, 11, 20, 19, 19, {
    1131             :                         { 0, 6, 2 }, { 4, 9, 0 }, { 7, 11, 0 }, { 8, 12, -2 },
    1132             :                         { 10, 13, -4 }, { 11, 14, -6 }, { 11, 15, -8 }, { 11, 16, -8 },
    1133             :                         { 11, 16, -8 }, { 11, 17, -10 }, { 13, 17, -10 },
    1134             :                         { 13, 17, -12 }, { 13, 17, -12 }, { 15, 18, -12 },
    1135             :                         { 18, 19, -12 }
    1136             :                         }
    1137             :                 }
    1138             :         },
    1139             :         {
    1140             :                 .bpp = DSC_BPP(6), .bpc = 14,
    1141             :                 { 341, 15, 2048, 15, 24, 23, 23, {
    1142             :                         { 0, 6, 2 }, { 7, 10, 0 }, { 9, 13, 0 }, { 11, 16, -2 },
    1143             :                         { 14, 17, -4 }, { 15, 18, -6 }, { 15, 19, -8 }, { 15, 20, -8 },
    1144             :                         { 15, 20, -8 }, { 15, 21, -10 }, { 17, 21, -10 },
    1145             :                         { 17, 21, -12 }, { 17, 21, -12 }, { 19, 22, -12 },
    1146             :                         { 22, 23, -12 }
    1147             :                         }
    1148             :                 }
    1149             :         },
    1150             :         {
    1151             :                 .bpp = DSC_BPP(6), .bpc = 16,
    1152             :                 { 341, 15, 2048, 19, 28, 27, 27, {
    1153             :                         { 0, 6, 2 }, { 6, 11, 0 }, { 11, 15, 0 }, { 14, 18, -2 },
    1154             :                         { 18, 21, -4 }, { 19, 22, -6 }, { 19, 23, -8 }, { 19, 24, -8 },
    1155             :                         { 19, 24, -8 }, { 19, 25, -10 }, { 21, 25, -10 },
    1156             :                         { 21, 25, -12 }, { 21, 25, -12 }, { 23, 26, -12 },
    1157             :                         { 26, 27, -12 }
    1158             :                         }
    1159             :                 }
    1160             :         },
    1161             :         {
    1162             :                 .bpp = DSC_BPP(8), .bpc = 8,
    1163             :                 { 256, 15, 2048, 3, 12, 11, 11, {
    1164             :                         { 0, 0, 10 }, { 0, 1, 8 }, { 0, 1, 6 }, { 0, 2, 4 },
    1165             :                         { 1, 2, 2 }, { 1, 3, 0 }, { 1, 3, -2 }, { 2, 4, -4 },
    1166             :                         { 2, 5, -6 }, { 3, 5, -8 }, { 4, 6, -10 }, { 4, 7, -10 },
    1167             :                         { 5, 7, -12 }, { 7, 8, -12 }, { 8, 9, -12 }
    1168             :                         }
    1169             :                 }
    1170             :         },
    1171             :         {
    1172             :                 .bpp = DSC_BPP(8), .bpc = 10,
    1173             :                 { 256, 15, 2048, 7, 16, 15, 15, {
    1174             :                         { 0, 2, 10 }, { 2, 5, 8 }, { 3, 5, 6 }, { 4, 6, 4 },
    1175             :                         { 5, 6, 2 }, { 5, 7, 0 }, { 5, 7, -2 }, { 6, 8, -4 },
    1176             :                         { 6, 9, -6 }, { 7, 9, -8 }, { 8, 10, -10 }, { 8, 11, -10 },
    1177             :                         { 9, 11, -12 }, { 11, 12, -12 }, { 12, 13, -12 }
    1178             :                         }
    1179             :                 }
    1180             :         },
    1181             :         {
    1182             :                 .bpp = DSC_BPP(8), .bpc = 12,
    1183             :                 { 256, 15, 2048, 11, 20, 19, 19, {
    1184             :                         { 0, 4, 10 }, { 2, 7, 8 }, { 4, 9, 6 }, { 6, 11, 4 },
    1185             :                         { 9, 11, 2 }, { 9, 11, 0 }, { 9, 12, -2 }, { 10, 12, -4 },
    1186             :                         { 11, 13, -6 }, { 11, 13, -8 }, { 12, 14, -10 },
    1187             :                         { 13, 15, -10 }, { 13, 15, -12 }, { 15, 16, -12 },
    1188             :                         { 16, 17, -12 }
    1189             :                         }
    1190             :                 }
    1191             :         },
    1192             :         {
    1193             :                 .bpp = DSC_BPP(8), .bpc = 14,
    1194             :                 { 256, 15, 2048, 15, 24, 23, 23, {
    1195             :                         { 0, 4, 10 }, { 3, 8, 8 }, { 6, 11, 6 }, { 9, 14, 4 },
    1196             :                         { 13, 15, 2 }, { 13, 15, 0 }, { 13, 16, -2 }, { 14, 16, -4 },
    1197             :                         { 15, 17, -6 }, { 15, 17, -8 }, { 16, 18, -10 },
    1198             :                         { 17, 19, -10 }, { 17, 19, -12 }, { 19, 20, -12 },
    1199             :                         { 20, 21, -12 }
    1200             :                         }
    1201             :                 }
    1202             :         },
    1203             :         {
    1204             :                 .bpp = DSC_BPP(8), .bpc = 16,
    1205             :                 { 256, 15, 2048, 19, 28, 27, 27, {
    1206             :                         { 0, 4, 10 }, { 4, 9, 8 }, { 8, 13, 6 }, { 12, 17, 4 },
    1207             :                         { 17, 19, 2 }, { 17, 20, 0 }, { 17, 20, -2 }, { 18, 20, -4 },
    1208             :                         { 19, 21, -6 }, { 19, 21, -8 }, { 20, 22, -10 },
    1209             :                         { 21, 23, -10 }, { 21, 23, -12 }, { 23, 24, -12 },
    1210             :                         { 24, 25, -12 }
    1211             :                         }
    1212             :                 }
    1213             :         },
    1214             :         { /* sentinel */ }
    1215             : };
    1216             : 
    1217             : static const struct rc_parameters *get_rc_params(const struct rc_parameters_data *rc_parameters,
    1218             :                                                  u16 dsc_bpp,
    1219             :                                                  u8 bits_per_component)
    1220             : {
    1221             :         int i;
    1222             : 
    1223           0 :         for (i = 0; rc_parameters[i].bpp; i++)
    1224           0 :                 if (rc_parameters[i].bpp == dsc_bpp &&
    1225           0 :                     rc_parameters[i].bpc == bits_per_component)
    1226           0 :                         return &rc_parameters[i].params;
    1227             : 
    1228             :         return NULL;
    1229             : }
    1230             : 
    1231             : /**
    1232             :  * drm_dsc_setup_rc_params() - Set parameters and limits for RC model in
    1233             :  * accordance with the DSC 1.1 or 1.2 specification and DSC C Model
    1234             :  * Required bits_per_pixel and bits_per_component to be set before calling this
    1235             :  * function.
    1236             :  *
    1237             :  * @vdsc_cfg: DSC Configuration data partially filled by driver
    1238             :  * @type: operating mode and standard to follow
    1239             :  *
    1240             :  * Return: 0 or -error code in case of an error
    1241             :  */
    1242           0 : int drm_dsc_setup_rc_params(struct drm_dsc_config *vdsc_cfg, enum drm_dsc_params_type type)
    1243             : {
    1244             :         const struct rc_parameters_data *data;
    1245             :         const struct rc_parameters *rc_params;
    1246             :         int i;
    1247             : 
    1248           0 :         if (WARN_ON_ONCE(!vdsc_cfg->bits_per_pixel ||
    1249             :                          !vdsc_cfg->bits_per_component))
    1250             :                 return -EINVAL;
    1251             : 
    1252           0 :         switch (type) {
    1253             :         case DRM_DSC_1_2_444:
    1254             :                 data = rc_parameters_1_2_444;
    1255             :                 break;
    1256             :         case DRM_DSC_1_1_PRE_SCR:
    1257           0 :                 data = rc_parameters_pre_scr;
    1258           0 :                 break;
    1259             :         case DRM_DSC_1_2_422:
    1260           0 :                 data = rc_parameters_1_2_422;
    1261           0 :                 break;
    1262             :         case DRM_DSC_1_2_420:
    1263           0 :                 data = rc_parameters_1_2_420;
    1264           0 :                 break;
    1265             :         default:
    1266             :                 return -EINVAL;
    1267             :         }
    1268             : 
    1269           0 :         rc_params = get_rc_params(data,
    1270           0 :                                   vdsc_cfg->bits_per_pixel,
    1271           0 :                                   vdsc_cfg->bits_per_component);
    1272           0 :         if (!rc_params)
    1273             :                 return -EINVAL;
    1274             : 
    1275           0 :         vdsc_cfg->first_line_bpg_offset = rc_params->first_line_bpg_offset;
    1276           0 :         vdsc_cfg->initial_xmit_delay = rc_params->initial_xmit_delay;
    1277           0 :         vdsc_cfg->initial_offset = rc_params->initial_offset;
    1278           0 :         vdsc_cfg->flatness_min_qp = rc_params->flatness_min_qp;
    1279           0 :         vdsc_cfg->flatness_max_qp = rc_params->flatness_max_qp;
    1280           0 :         vdsc_cfg->rc_quant_incr_limit0 = rc_params->rc_quant_incr_limit0;
    1281           0 :         vdsc_cfg->rc_quant_incr_limit1 = rc_params->rc_quant_incr_limit1;
    1282             : 
    1283           0 :         for (i = 0; i < DSC_NUM_BUF_RANGES; i++) {
    1284           0 :                 vdsc_cfg->rc_range_params[i].range_min_qp =
    1285           0 :                         rc_params->rc_range_params[i].range_min_qp;
    1286           0 :                 vdsc_cfg->rc_range_params[i].range_max_qp =
    1287           0 :                         rc_params->rc_range_params[i].range_max_qp;
    1288             :                 /*
    1289             :                  * Range BPG Offset uses 2's complement and is only a 6 bits. So
    1290             :                  * mask it to get only 6 bits.
    1291             :                  */
    1292           0 :                 vdsc_cfg->rc_range_params[i].range_bpg_offset =
    1293           0 :                         rc_params->rc_range_params[i].range_bpg_offset &
    1294             :                         DSC_RANGE_BPG_OFFSET_MASK;
    1295             :         }
    1296             : 
    1297             :         return 0;
    1298             : }
    1299             : EXPORT_SYMBOL(drm_dsc_setup_rc_params);
    1300             : 
    1301             : /**
    1302             :  * drm_dsc_compute_rc_parameters() - Write rate control
    1303             :  * parameters to the dsc configuration defined in
    1304             :  * &struct drm_dsc_config in accordance with the DSC 1.2
    1305             :  * specification. Some configuration fields must be present
    1306             :  * beforehand.
    1307             :  *
    1308             :  * @vdsc_cfg:
    1309             :  * DSC Configuration data partially filled by driver
    1310             :  */
    1311           0 : int drm_dsc_compute_rc_parameters(struct drm_dsc_config *vdsc_cfg)
    1312             : {
    1313           0 :         unsigned long groups_per_line = 0;
    1314           0 :         unsigned long groups_total = 0;
    1315           0 :         unsigned long num_extra_mux_bits = 0;
    1316           0 :         unsigned long slice_bits = 0;
    1317           0 :         unsigned long hrd_delay = 0;
    1318           0 :         unsigned long final_scale = 0;
    1319           0 :         unsigned long rbs_min = 0;
    1320             : 
    1321           0 :         if (vdsc_cfg->native_420 || vdsc_cfg->native_422) {
    1322             :                 /* Number of groups used to code each line of a slice */
    1323           0 :                 groups_per_line = DIV_ROUND_UP(vdsc_cfg->slice_width / 2,
    1324             :                                                DSC_RC_PIXELS_PER_GROUP);
    1325             : 
    1326             :                 /* chunksize in Bytes */
    1327           0 :                 vdsc_cfg->slice_chunk_size = DIV_ROUND_UP(vdsc_cfg->slice_width / 2 *
    1328             :                                                           vdsc_cfg->bits_per_pixel,
    1329             :                                                           (8 * 16));
    1330             :         } else {
    1331             :                 /* Number of groups used to code each line of a slice */
    1332           0 :                 groups_per_line = DIV_ROUND_UP(vdsc_cfg->slice_width,
    1333             :                                                DSC_RC_PIXELS_PER_GROUP);
    1334             : 
    1335             :                 /* chunksize in Bytes */
    1336           0 :                 vdsc_cfg->slice_chunk_size = DIV_ROUND_UP(vdsc_cfg->slice_width *
    1337             :                                                           vdsc_cfg->bits_per_pixel,
    1338             :                                                           (8 * 16));
    1339             :         }
    1340             : 
    1341           0 :         if (vdsc_cfg->convert_rgb)
    1342           0 :                 num_extra_mux_bits = 3 * (vdsc_cfg->mux_word_size +
    1343           0 :                                           (4 * vdsc_cfg->bits_per_component + 4)
    1344           0 :                                           - 2);
    1345           0 :         else if (vdsc_cfg->native_422)
    1346           0 :                 num_extra_mux_bits = 4 * vdsc_cfg->mux_word_size +
    1347           0 :                         (4 * vdsc_cfg->bits_per_component + 4) +
    1348           0 :                         3 * (4 * vdsc_cfg->bits_per_component) - 2;
    1349             :         else
    1350           0 :                 num_extra_mux_bits = 3 * vdsc_cfg->mux_word_size +
    1351           0 :                         (4 * vdsc_cfg->bits_per_component + 4) +
    1352           0 :                         2 * (4 * vdsc_cfg->bits_per_component) - 2;
    1353             :         /* Number of bits in one Slice */
    1354           0 :         slice_bits = 8 * vdsc_cfg->slice_chunk_size * vdsc_cfg->slice_height;
    1355             : 
    1356           0 :         while ((num_extra_mux_bits > 0) &&
    1357           0 :                ((slice_bits - num_extra_mux_bits) % vdsc_cfg->mux_word_size))
    1358           0 :                 num_extra_mux_bits--;
    1359             : 
    1360           0 :         if (groups_per_line < vdsc_cfg->initial_scale_value - 8)
    1361           0 :                 vdsc_cfg->initial_scale_value = groups_per_line + 8;
    1362             : 
    1363             :         /* scale_decrement_interval calculation according to DSC spec 1.11 */
    1364           0 :         if (vdsc_cfg->initial_scale_value > 8)
    1365           0 :                 vdsc_cfg->scale_decrement_interval = groups_per_line /
    1366           0 :                         (vdsc_cfg->initial_scale_value - 8);
    1367             :         else
    1368           0 :                 vdsc_cfg->scale_decrement_interval = DSC_SCALE_DECREMENT_INTERVAL_MAX;
    1369             : 
    1370           0 :         vdsc_cfg->final_offset = vdsc_cfg->rc_model_size -
    1371           0 :                 (vdsc_cfg->initial_xmit_delay *
    1372           0 :                  vdsc_cfg->bits_per_pixel + 8) / 16 + num_extra_mux_bits;
    1373             : 
    1374           0 :         if (vdsc_cfg->final_offset >= vdsc_cfg->rc_model_size) {
    1375           0 :                 DRM_DEBUG_KMS("FinalOfs < RcModelSze for this InitialXmitDelay\n");
    1376           0 :                 return -ERANGE;
    1377             :         }
    1378             : 
    1379           0 :         final_scale = (vdsc_cfg->rc_model_size * 8) /
    1380           0 :                 (vdsc_cfg->rc_model_size - vdsc_cfg->final_offset);
    1381           0 :         if (vdsc_cfg->slice_height > 1)
    1382             :                 /*
    1383             :                  * NflBpgOffset is 16 bit value with 11 fractional bits
    1384             :                  * hence we multiply by 2^11 for preserving the
    1385             :                  * fractional part
    1386             :                  */
    1387           0 :                 vdsc_cfg->nfl_bpg_offset = DIV_ROUND_UP((vdsc_cfg->first_line_bpg_offset << 11),
    1388             :                                                         (vdsc_cfg->slice_height - 1));
    1389             :         else
    1390           0 :                 vdsc_cfg->nfl_bpg_offset = 0;
    1391             : 
    1392             :         /* Number of groups used to code the entire slice */
    1393           0 :         groups_total = groups_per_line * vdsc_cfg->slice_height;
    1394             : 
    1395             :         /* slice_bpg_offset is 16 bit value with 11 fractional bits */
    1396           0 :         vdsc_cfg->slice_bpg_offset = DIV_ROUND_UP(((vdsc_cfg->rc_model_size -
    1397             :                                                     vdsc_cfg->initial_offset +
    1398             :                                                     num_extra_mux_bits) << 11),
    1399             :                                                   groups_total);
    1400             : 
    1401           0 :         if (final_scale > 9) {
    1402             :                 /*
    1403             :                  * ScaleIncrementInterval =
    1404             :                  * finaloffset/((NflBpgOffset + SliceBpgOffset)*8(finalscale - 1.125))
    1405             :                  * as (NflBpgOffset + SliceBpgOffset) has 11 bit fractional value,
    1406             :                  * we need divide by 2^11 from pstDscCfg values
    1407             :                  */
    1408           0 :                 vdsc_cfg->scale_increment_interval =
    1409           0 :                                 (vdsc_cfg->final_offset * (1 << 11)) /
    1410           0 :                                 ((vdsc_cfg->nfl_bpg_offset +
    1411           0 :                                 vdsc_cfg->slice_bpg_offset) *
    1412           0 :                                 (final_scale - 9));
    1413             :         } else {
    1414             :                 /*
    1415             :                  * If finalScaleValue is less than or equal to 9, a value of 0 should
    1416             :                  * be used to disable the scale increment at the end of the slice
    1417             :                  */
    1418           0 :                 vdsc_cfg->scale_increment_interval = 0;
    1419             :         }
    1420             : 
    1421             :         /*
    1422             :          * DSC spec mentions that bits_per_pixel specifies the target
    1423             :          * bits/pixel (bpp) rate that is used by the encoder,
    1424             :          * in steps of 1/16 of a bit per pixel
    1425             :          */
    1426           0 :         rbs_min = vdsc_cfg->rc_model_size - vdsc_cfg->initial_offset +
    1427           0 :                 DIV_ROUND_UP(vdsc_cfg->initial_xmit_delay *
    1428             :                              vdsc_cfg->bits_per_pixel, 16) +
    1429           0 :                 groups_per_line * vdsc_cfg->first_line_bpg_offset;
    1430             : 
    1431           0 :         hrd_delay = DIV_ROUND_UP((rbs_min * 16), vdsc_cfg->bits_per_pixel);
    1432           0 :         vdsc_cfg->rc_bits = (hrd_delay * vdsc_cfg->bits_per_pixel) / 16;
    1433           0 :         vdsc_cfg->initial_dec_delay = hrd_delay - vdsc_cfg->initial_xmit_delay;
    1434             : 
    1435           0 :         return 0;
    1436             : }
    1437             : EXPORT_SYMBOL(drm_dsc_compute_rc_parameters);
    1438             : 
    1439             : /**
    1440             :  * drm_dsc_get_bpp_int() - Get integer bits per pixel value for the given DRM DSC config
    1441             :  * @vdsc_cfg: Pointer to DRM DSC config struct
    1442             :  *
    1443             :  * Return: Integer BPP value
    1444             :  */
    1445           0 : u32 drm_dsc_get_bpp_int(const struct drm_dsc_config *vdsc_cfg)
    1446             : {
    1447           0 :         WARN_ON_ONCE(vdsc_cfg->bits_per_pixel & 0xf);
    1448           0 :         return vdsc_cfg->bits_per_pixel >> 4;
    1449             : }
    1450             : EXPORT_SYMBOL(drm_dsc_get_bpp_int);
    1451             : 
    1452             : /**
    1453             :  * drm_dsc_initial_scale_value() - Calculate the initial scale value for the given DSC config
    1454             :  * @dsc: Pointer to DRM DSC config struct
    1455             :  *
    1456             :  * Return: Calculated initial scale value
    1457             :  */
    1458           0 : u8 drm_dsc_initial_scale_value(const struct drm_dsc_config *dsc)
    1459             : {
    1460           0 :         return 8 * dsc->rc_model_size / (dsc->rc_model_size - dsc->initial_offset);
    1461             : }
    1462             : EXPORT_SYMBOL(drm_dsc_initial_scale_value);
    1463             : 
    1464             : /**
    1465             :  * drm_dsc_flatness_det_thresh() - Calculate the flatness_det_thresh for the given DSC config
    1466             :  * @dsc: Pointer to DRM DSC config struct
    1467             :  *
    1468             :  * Return: Calculated flatness det thresh value
    1469             :  */
    1470           0 : u32 drm_dsc_flatness_det_thresh(const struct drm_dsc_config *dsc)
    1471             : {
    1472           0 :         return 2 << (dsc->bits_per_component - 8);
    1473             : }
    1474             : EXPORT_SYMBOL(drm_dsc_flatness_det_thresh);

Generated by: LCOV version 1.14