sde_vdc_helper.c 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
  4. */
  5. #include "msm_drv.h"
  6. #include "sde_vdc_helper.h"
  7. enum sde_vdc_profile_type {
  8. VDC_RGB_444_8BPC_8BPP,
  9. VDC_RGB_444_8BPC_6BPP,
  10. VDC_RGB_444_10BPC_10BPP,
  11. VDC_RGB_444_108BPC_8BPP,
  12. VDC_RGB_444_10BPC_7BPP,
  13. VDC_RGB_444_10BPC_6BPP,
  14. VDC_YUV_422_8BPC_6BPP,
  15. VDC_YUV_422_8BPC_5BPP,
  16. VDC_YUV_422_8BPC_4_75BPP,
  17. VDC_YUV_422_10BPC_8BPP,
  18. VDC_YUV_422_10BPC_6BPP,
  19. VDC_YUV_422_10BPC_5_5BPP,
  20. VDC_YUV_422_10BPC_5PP,
  21. VDC_PROFILE_MAX
  22. };
  23. static u8 sde_vdc_mppf_bpc_r_y[VDC_PROFILE_MAX] = {
  24. 2, 1, 3, 2, 2, 1, 3, 2, 2, 4, 3, 2, 2};
  25. static u8 sde_vdc_mppf_bpc_g_cb[VDC_PROFILE_MAX] = {
  26. 2, 2, 3, 2, 2, 2, 2, 2, 1, 3, 2, 2, 2};
  27. static u8 sde_vdc_mppf_bpc_b_cr[VDC_PROFILE_MAX] = {
  28. 2, 1, 3, 2, 2, 1, 2, 2, 1, 3, 2, 2, 2};
  29. static u8 sde_vdc_mppf_bpc_y[VDC_PROFILE_MAX] = {
  30. 2, 2, 3, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0};
  31. static u8 sde_vdc_mppf_bpc_co[VDC_PROFILE_MAX] = {
  32. 2, 1, 3, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0};
  33. static u8 sde_vdc_mppf_bpc_cg[VDC_PROFILE_MAX] = {
  34. 2, 1, 3, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0};
  35. static u8 sde_vdc_flat_qp_vf_fbls[VDC_PROFILE_MAX] = {
  36. 20, 24, 24, 24, 24, 24, 24, 24, 24, 8, 20, 18, 24};
  37. static u8 sde_vdc_flat_qp_vf_nfbls[VDC_PROFILE_MAX] = {
  38. 24, 28, 28, 28, 28, 28, 28, 28, 28, 16, 24, 20, 28};
  39. static u8 sde_vdc_flat_qp_sf_fbls[VDC_PROFILE_MAX] = {
  40. 24, 28, 28, 28, 28, 28, 28, 28, 28, 16, 24, 20, 28};
  41. static u8 sde_vdc_flat_qp_sf_nbls[VDC_PROFILE_MAX] = {
  42. 28, 40, 32, 28, 32, 28, 36, 36, 36, 16, 24, 24, 28};
  43. static u16 sde_vdc_flat_qp_lut[VDC_PROFILE_MAX][VDC_FLAT_QP_LUT_SIZE] = {
  44. {20, 20, 24, 24, 28, 32, 36, 40},
  45. {24, 24, 28, 32, 36, 40, 40, 40},
  46. {24, 24, 28, 32, 32, 36, 36, 36},
  47. {20, 24, 28, 28, 32, 36, 40, 44},
  48. {20, 24, 28, 32, 32, 36, 36, 40},
  49. {24, 28, 32, 32, 36, 40, 40, 40},
  50. {24, 28, 32, 34, 36, 38, 40, 40},
  51. {24, 28, 32, 36, 40, 42, 44, 44},
  52. {24, 28, 32, 36, 40, 42, 44, 44},
  53. {0, 8, 10, 12, 14, 16, 18, 20},
  54. {12, 16, 20, 20, 20, 24, 24, 28},
  55. {16, 18, 20, 22, 24, 26, 28, 28},
  56. {20, 22, 24, 26, 28, 28, 32, 32},
  57. };
  58. static u16 sde_vdc_max_qp_lut[VDC_PROFILE_MAX][VDC_MAX_QP_LUT_SIZE] = {
  59. {28, 28, 32, 32, 36, 42, 42, 48},
  60. {32, 32, 36, 40, 44, 48, 48, 52},
  61. {32, 32, 36, 36, 36, 40, 44, 48},
  62. {24, 28, 32, 32, 36, 40, 44, 48},
  63. {28, 28, 32, 32, 36, 42, 42, 48},
  64. {28, 32, 36, 40, 44, 44, 46, 52},
  65. {32, 32, 36, 40, 40, 44, 48, 48},
  66. {32, 32, 36, 40, 44, 48, 50, 52},
  67. {32, 32, 36, 40, 44, 48, 50, 52},
  68. {8, 12, 12, 16, 20, 24, 28, 28},
  69. {18, 20, 22, 24, 28, 30, 32, 40},
  70. {18, 20, 22, 24, 28, 30, 32, 40},
  71. {20, 20, 24, 24, 28, 28, 32, 36},
  72. };
  73. static u16 sde_vdc_tar_del_lut[VDC_PROFILE_MAX][VDC_TAR_DEL_LUT_SIZE] = {
  74. {128, 117, 107, 96, 85, 75, 64, 53, 43, 32, 24, 11, 0, 0, 0, 0},
  75. {96, 88, 80, 72, 64, 56, 48, 40, 32, 24, 16, 8, 0, 0, 0, 0},
  76. {160, 147, 133, 120, 107, 93, 80, 67, 53, 40, 27, 13, 0, 0, 0, 0},
  77. {128, 117, 107, 96, 85, 75, 64, 53, 43, 32, 21, 11, 0, 0, 0, 0},
  78. {112, 103, 93, 84, 75, 95, 56, 47, 37, 28, 19, 9, 0, 0, 0, 0},
  79. {96, 88, 80, 72, 64, 56, 48, 40, 32, 24, 16, 8, 0, 0, 0, 0},
  80. {96, 88, 80, 72, 64, 56, 48, 40, 32, 24, 16, 8, 0, 0, 0, 0},
  81. {80, 73, 67, 60, 53, 47, 40, 33, 27, 20, 13, 7, 0, 0, 0, 0},
  82. {76, 70, 63, 57, 51, 44, 38, 32, 25, 19, 13, 6, 0, 0, 0, 0},
  83. {128, 117, 107, 96, 85, 75, 64, 53, 43, 32, 21, 11, 0, 0, 0, 0},
  84. {96, 88, 80, 72, 64, 56, 48, 40, 32, 24, 16, 8, 0, 0, 0, 0},
  85. {88, 81, 73, 66, 59, 51, 44, 37, 29, 22, 15, 7, 0, 0, 0, 0},
  86. {80, 73, 67, 60, 53, 47, 40, 33, 27, 20, 13, 7, 0, 0, 0, 0},
  87. };
  88. static u16 sde_vdc_lbda_brate_lut[VDC_PROFILE_MAX][VDC_LBDA_BRATE_LUT_SIZE] = {
  89. {4, 6, 10, 16, 25, 40, 64, 102, 161, 256, 406, 645, 1024, 1625,
  90. 2580, 4095},
  91. {8, 12, 18, 28, 42, 64, 97, 147, 223, 338, 512, 776, 1176, 1782,
  92. 2702, 4095},
  93. {16, 23, 34, 48, 70, 102, 147, 213, 308, 446, 645, 933, 1351,
  94. 1955, 2829, 4095},
  95. {8, 12, 18, 28, 42, 64, 97, 147, 223, 338, 512, 776, 1176, 1782,
  96. 2702, 4095},
  97. {32, 44, 61, 84, 117, 161, 223, 308, 425, 588, 813, 1123, 1552, 2144,
  98. 2963, 4095},
  99. {64, 84, 111, 147, 194, 256, 338, 446, 588, 776, 1024, 1351, 1782,
  100. 2352, 3103, 4095},
  101. {1, 2, 3, 5, 9, 16, 28, 48, 84, 147, 256, 446, 776, 1351, 2352, 4095},
  102. {4, 6, 10, 16, 25, 40, 64, 102, 161, 256, 406, 645, 1024, 1625,
  103. 2580, 4095},
  104. {4, 6, 10, 16, 25, 40, 64, 102, 161, 256, 406, 645, 1024, 1625,
  105. 2580, 4095},
  106. {1, 2, 3, 5, 9, 16, 28, 48, 84, 147, 256, 446, 776, 1351, 2352, 4095},
  107. {1, 2, 3, 5, 9, 16, 28, 48, 84, 147, 256, 446, 776, 1351, 2352, 4095},
  108. {1, 2, 3, 5, 9, 16, 28, 48, 84, 147, 256, 446, 776, 1351, 2352, 4095},
  109. {1, 2, 3, 5, 9, 16, 28, 48, 84, 147, 256, 446, 776, 1351, 2352, 4095},
  110. };
  111. static u16 sde_vdc_lbda_bf_lut[VDC_PROFILE_MAX][VDC_LBDA_BF_LUT_SIZE] = {
  112. {1, 1, 2, 3, 4, 6, 9, 13, 19, 28, 40, 58, 84, 122, 176, 255},
  113. {1, 1, 2, 3, 4, 6, 9, 13, 19, 28, 40, 58, 84, 122, 176, 255},
  114. {1, 1, 2, 3, 4, 6, 9, 13, 19, 28, 40, 58, 84, 122, 176, 255},
  115. {1, 1, 2, 3, 4, 6, 9, 13, 19, 28, 40, 58, 84, 122, 176, 255},
  116. {4, 5, 7, 9, 12, 16, 21, 28, 37, 48, 64, 84, 111, 146, 193, 255},
  117. {1, 1, 1, 2, 3, 4, 6, 9, 14, 21, 32, 48, 73, 111, 168, 255},
  118. {1, 1, 1, 1, 2, 3, 4, 6, 10, 16, 25, 40, 64, 101, 161, 255},
  119. {1, 1, 1, 1, 2, 3, 4, 6, 10, 16, 25, 40, 64, 101, 161, 255},
  120. {1, 1, 1, 1, 2, 3, 4, 6, 10, 16, 25, 40, 64, 101, 161, 255},
  121. {1, 1, 1, 1, 2, 3, 4, 6, 10, 16, 25, 40, 64, 101, 161, 255},
  122. {1, 1, 1, 1, 2, 3, 4, 6, 10, 16, 25, 40, 64, 101, 161, 255},
  123. {1, 1, 1, 1, 2, 3, 4, 6, 10, 16, 25, 40, 64, 101, 161, 255},
  124. {1, 1, 1, 1, 2, 3, 4, 6, 10, 16, 25, 40, 64, 101, 161, 255},
  125. };
  126. static int _get_vdc_profile_index(struct msm_display_vdc_info *vdc_info)
  127. {
  128. int bpp, bpc;
  129. int rc = -EINVAL;
  130. bpp = VDC_BPP(vdc_info->bits_per_pixel);
  131. bpc = vdc_info->bits_per_component;
  132. if (vdc_info->chroma_format == MSM_CHROMA_444) {
  133. if ((bpc == 8) && (bpp == 8))
  134. return VDC_RGB_444_8BPC_8BPP;
  135. else if ((bpc == 8) && (bpp == 6))
  136. return VDC_RGB_444_8BPC_6BPP;
  137. else if ((bpc == 10) && (bpp == 10))
  138. return VDC_RGB_444_10BPC_10BPP;
  139. else if ((bpc == 10) && (bpp == 10))
  140. return VDC_RGB_444_10BPC_10BPP;
  141. else if ((bpc == 10) && (bpp == 8))
  142. return VDC_RGB_444_108BPC_8BPP;
  143. else if ((bpc == 10) && (bpp == 7))
  144. return VDC_RGB_444_10BPC_7BPP;
  145. else if ((bpc == 10) && (bpp == 6))
  146. return VDC_RGB_444_10BPC_6BPP;
  147. } else if (vdc_info->chroma_format == MSM_CHROMA_422) {
  148. if ((bpc == 8) && (bpp == 6))
  149. return VDC_YUV_422_8BPC_6BPP;
  150. else if ((bpc == 8) && (bpp == 5))
  151. return VDC_YUV_422_8BPC_5BPP;
  152. else if ((bpc == 10) && (bpp == 8))
  153. return VDC_YUV_422_10BPC_8BPP;
  154. else if ((bpc == 10) && (bpp == 6))
  155. return VDC_YUV_422_10BPC_6BPP;
  156. else if ((bpc == 10) && (bpp == 5))
  157. return VDC_YUV_422_10BPC_5PP;
  158. }
  159. pr_err("unsupported bpc:%d, bpp:%d\n", bpc, bpp);
  160. return rc;
  161. }
  162. static void sde_vdc_dump_lut_params(struct msm_display_vdc_info *vdc_info)
  163. {
  164. int i;
  165. pr_debug("vdc_info->mppf_bpc_r_y = %d\n", vdc_info->mppf_bpc_r_y);
  166. pr_debug("vdc_info->mppf_bpc_g_cb = %d\n", vdc_info->mppf_bpc_g_cb);
  167. pr_debug("vdc_info->mppf_bpc_b_cr = %d\n", vdc_info->mppf_bpc_b_cr);
  168. pr_debug("vdc_info->mppf_bpc_y = %d\n", vdc_info->mppf_bpc_y);
  169. pr_debug("vdc_info->mppf_bpc_co = %d\n", vdc_info->mppf_bpc_co);
  170. pr_debug("vdc_info->mppf_bpc_cg = %d\n", vdc_info->mppf_bpc_cg);
  171. pr_debug("vdc_info->flatqp_vf_fbls = %d\n", vdc_info->flatqp_vf_fbls);
  172. pr_debug("vdc_info->flatqp_vf_nbls = %d\n", vdc_info->flatqp_vf_nbls);
  173. pr_debug("vdc_info->flatqp_sw_fbls = %d\n", vdc_info->flatqp_sw_fbls);
  174. pr_debug("vdc_info->flatqp_sw_nbls = %d\n", vdc_info->flatqp_sw_nbls);
  175. for (i = 0; i < VDC_FLAT_QP_LUT_SIZE; i++)
  176. pr_debug("vdc_info->flatness_qp_lut[%d] = %d\n",
  177. i, vdc_info->flatness_qp_lut[i]);
  178. for (i = 0; i < VDC_MAX_QP_LUT_SIZE; i++)
  179. pr_debug("vdc_info->max_qp_lut[%d] = %d\n",
  180. i, vdc_info->max_qp_lut[i]);
  181. for (i = 0; i < VDC_TAR_DEL_LUT_SIZE; i++)
  182. pr_debug("vdc_info->tar_del_lut[%d] = %d\n",
  183. i, vdc_info->tar_del_lut[i]);
  184. for (i = 0; i < VDC_LBDA_BRATE_LUT_SIZE; i++)
  185. pr_debug("vdc_info->lbda_brate_lut[%d] = %d\n",
  186. i, vdc_info->lbda_brate_lut[i]);
  187. for (i = 0; i < VDC_LBDA_BF_LUT_SIZE; i++)
  188. pr_debug("vdc_info->lbda_bf_lut[%d] = %d\n",
  189. i, vdc_info->lbda_bf_lut[i]);
  190. for (i = 0; i < VDC_LBDA_BRATE_REG_SIZE; i++)
  191. pr_debug("vdc_info->lbda_brate_lut_interp[%d] = %d\n",
  192. i, vdc_info->lbda_brate_lut_interp[i]);
  193. for (i = 0; i < VDC_LBDA_BRATE_REG_SIZE; i++)
  194. pr_debug("vdc_info->lbda_bf_lut_interp[%d] = %d\n",
  195. i, vdc_info->lbda_bf_lut_interp[i]);
  196. }
  197. static void sde_vdc_dump_core_params(struct msm_display_vdc_info *vdc_info)
  198. {
  199. pr_debug("vdc_info->num_of_active_ss = %d\n",
  200. vdc_info->num_of_active_ss);
  201. pr_debug("vdc_info->chunk_size = %d\n",
  202. vdc_info->chunk_size);
  203. pr_debug("vdc_info->chunk_size_bits = %d\n",
  204. vdc_info->chunk_size_bits);
  205. pr_debug("vdc_info->slice_num_px = %d\n",
  206. vdc_info->slice_num_px);
  207. pr_debug("vdc_info->avg_block_bits = %d\n",
  208. vdc_info->avg_block_bits);
  209. pr_debug("vdc_info->per_chunk_pad_bits = %d\n",
  210. vdc_info->per_chunk_pad_bits);
  211. pr_debug("vdc_info->tot_pad_bits = %d\n",
  212. vdc_info->tot_pad_bits);
  213. pr_debug("vdc_info->rc_stuffing_bits = %d\n",
  214. vdc_info->rc_stuffing_bits);
  215. pr_debug("vdc_info->slice_num_bits = %llu\n",
  216. vdc_info->slice_num_bits);
  217. pr_debug("vdc_info->chunk_adj_bits = %d\n",
  218. vdc_info->chunk_adj_bits);
  219. pr_debug("vdc_info->rc_buf_init_size_temp = %d\n",
  220. vdc_info->rc_buf_init_size_temp);
  221. pr_debug("vdc_info->init_tx_delay_temp = %d\n",
  222. vdc_info->init_tx_delay_temp);
  223. pr_debug("vdc_info->rc_buffer_init_size = %d\n",
  224. vdc_info->rc_buffer_init_size);
  225. pr_debug("vdc_info->rc_init_tx_delay = %d\n",
  226. vdc_info->rc_init_tx_delay);
  227. pr_debug("vdc_info->rc_init_tx_delay_px_times = %d\n",
  228. vdc_info->rc_init_tx_delay_px_times);
  229. pr_debug("vdc_info->rc_buffer_max_size = %d\n",
  230. vdc_info->rc_buffer_max_size);
  231. pr_debug("vdc_info->rc_tar_rate_scale_temp_a = %d\n",
  232. vdc_info->rc_tar_rate_scale_temp_a);
  233. pr_debug("vdc_info->rc_tar_rate_scale_temp_b = %d\n",
  234. vdc_info->rc_tar_rate_scale_temp_b);
  235. pr_debug("vdc_info->rc_tar_rate_scale = %d\n",
  236. vdc_info->rc_tar_rate_scale);
  237. pr_debug("vdc_info->rc_target_rate_threshold = %d\n",
  238. vdc_info->rc_target_rate_threshold);
  239. pr_debug("vdc_info->chroma_samples = %d\n",
  240. vdc_info->chroma_samples);
  241. pr_debug("vdc_info->block_max_bits = %d\n",
  242. vdc_info->block_max_bits);
  243. pr_debug("vdc_info->rc_lambda_bitrate_scale = %d\n",
  244. vdc_info->rc_lambda_bitrate_scale);
  245. pr_debug("vdc_info->rc_buffer_fullness_scale = %d\n",
  246. vdc_info->rc_buffer_fullness_scale);
  247. pr_debug("vdc_info->rc_fullness_offset_thresh = %d\n",
  248. vdc_info->rc_fullness_offset_thresh);
  249. pr_debug("vdc_info->ramp_blocks = %d\n",
  250. vdc_info->ramp_blocks);
  251. pr_debug("vdc_info->ramp_bits = %llu\n",
  252. vdc_info->ramp_bits);
  253. pr_debug("vdc_info->rc_fullness_offset_slope = %d\n",
  254. vdc_info->rc_fullness_offset_slope);
  255. pr_debug("vdc_info->num_extra_mux_bits_init = %d\n",
  256. vdc_info->num_extra_mux_bits_init);
  257. pr_debug("vdc_info->extra_crop_bits = %d\n",
  258. vdc_info->extra_crop_bits);
  259. pr_debug("vdc_info->num_extra_mux_bits = %d\n",
  260. vdc_info->num_extra_mux_bits);
  261. pr_debug("vdc_info->mppf_bits_comp_0 = %d\n",
  262. vdc_info->mppf_bits_comp_0);
  263. pr_debug("vdc_info->mppf_bits_comp_1 = %d\n",
  264. vdc_info->mppf_bits_comp_1);
  265. pr_debug("vdc_info->mppf_bits_comp_2 = %d\n",
  266. vdc_info->mppf_bits_comp_2);
  267. pr_debug("vdc_info->min_block_bits = %d\n",
  268. vdc_info->min_block_bits);
  269. }
  270. static void sde_vdc_dump_ext_core_params(struct msm_display_vdc_info *vdc_info)
  271. {
  272. pr_debug("vdc_info->input_ssm_out_latency = %d\n",
  273. vdc_info->input_ssm_out_latency);
  274. pr_debug("vdc_info->input_ssm_out_latency_min = %d\n",
  275. vdc_info->input_ssm_out_latency_min);
  276. pr_debug("vdc_info->obuf_latency = %d\n",
  277. vdc_info->obuf_latency);
  278. pr_debug("vdc_info->base_hs_latency = %d\n",
  279. vdc_info->base_hs_latency);
  280. pr_debug("vdc_info->base_hs_latency_pixels = %d\n",
  281. vdc_info->base_hs_latency_pixels);
  282. pr_debug("vdc_info->base_hs_latency_pixels_min = %d\n",
  283. vdc_info->base_hs_latency_pixels_min);
  284. pr_debug("vdc_info->base_initial_lines = %d\n",
  285. vdc_info->base_initial_lines);
  286. pr_debug("vdc_info->base_top_up = %d\n",
  287. vdc_info->base_top_up);
  288. pr_debug("vdc_info->output_rate = %d\n",
  289. vdc_info->output_rate);
  290. pr_debug("vdc_info->output_rate_ratio_100 = %d\n",
  291. vdc_info->output_rate_ratio_100);
  292. pr_debug("vdc_info->burst_accum_pixels = %d\n",
  293. vdc_info->burst_accum_pixels);
  294. pr_debug("vdc_info->ss_initial_lines = %d\n",
  295. vdc_info->ss_initial_lines);
  296. pr_debug("vdc_info->burst_initial_lines = %d\n",
  297. vdc_info->burst_initial_lines);
  298. pr_debug("vdc_info->initial_lines = %d\n",
  299. vdc_info->initial_lines);
  300. pr_debug("vdc_info->obuf_base = %d\n",
  301. vdc_info->obuf_base);
  302. pr_debug("vdc_info->obuf_extra_ss0 = %d\n",
  303. vdc_info->obuf_extra_ss0);
  304. pr_debug("vdc_info->obuf_extra_ss1 = %d\n",
  305. vdc_info->obuf_extra_ss1);
  306. pr_debug("vdc_info->obuf_extra_burst = %d\n",
  307. vdc_info->obuf_extra_burst);
  308. pr_debug("vdc_info->obuf_ss0 = %d\n",
  309. vdc_info->obuf_ss0);
  310. pr_debug("vdc_info->obuf_ss1 = %d\n",
  311. vdc_info->obuf_ss1);
  312. pr_debug("vdc_info->obuf_margin_words = %d\n",
  313. vdc_info->obuf_margin_words);
  314. pr_debug("vdc_info->ob0_max_addr = %d\n",
  315. vdc_info->ob0_max_addr);
  316. pr_debug("vdc_info->ob1_max_addr = %d\n",
  317. vdc_info->ob1_max_addr);
  318. pr_debug("vdc_info->slice_width_orig = %d\n",
  319. vdc_info->slice_width_orig);
  320. pr_debug("vdc_info->r2b0_max_addr = %d\n",
  321. vdc_info->r2b0_max_addr);
  322. pr_debug("vdc_info->r2b1_max_addr = %d\n",
  323. vdc_info->r2b1_max_addr);
  324. }
  325. static int sde_vdc_populate_lut_params(struct msm_display_vdc_info *vdc_info)
  326. {
  327. int bpp, bpc;
  328. int i, profile_idx;
  329. int x_0, x_1, lambda, idx_mod;
  330. int x_0_idx, x_1_idx;
  331. int idx;
  332. bpp = VDC_BPP(vdc_info->bits_per_pixel);
  333. bpc = vdc_info->bits_per_component;
  334. profile_idx = _get_vdc_profile_index(vdc_info);
  335. if (profile_idx == -EINVAL) {
  336. pr_err("no matching profile found\n");
  337. return profile_idx;
  338. }
  339. vdc_info->mppf_bpc_r_y = sde_vdc_mppf_bpc_r_y[profile_idx];
  340. vdc_info->mppf_bpc_g_cb = sde_vdc_mppf_bpc_g_cb[profile_idx];
  341. vdc_info->mppf_bpc_b_cr = sde_vdc_mppf_bpc_b_cr[profile_idx];
  342. vdc_info->mppf_bpc_y = sde_vdc_mppf_bpc_y[profile_idx];
  343. vdc_info->mppf_bpc_co = sde_vdc_mppf_bpc_co[profile_idx];
  344. vdc_info->mppf_bpc_cg = sde_vdc_mppf_bpc_cg[profile_idx];
  345. vdc_info->flatqp_vf_fbls = sde_vdc_flat_qp_vf_fbls[profile_idx];
  346. vdc_info->flatqp_vf_nbls = sde_vdc_flat_qp_vf_nfbls[profile_idx];
  347. vdc_info->flatqp_sw_fbls = sde_vdc_flat_qp_sf_fbls[profile_idx];
  348. vdc_info->flatqp_sw_nbls = sde_vdc_flat_qp_sf_nbls[profile_idx];
  349. idx = profile_idx;
  350. for (i = 0; i < VDC_FLAT_QP_LUT_SIZE; i++)
  351. vdc_info->flatness_qp_lut[i] = sde_vdc_flat_qp_lut[idx][i];
  352. for (i = 0; i < VDC_MAX_QP_LUT_SIZE; i++)
  353. vdc_info->max_qp_lut[i] = sde_vdc_max_qp_lut[idx][i];
  354. for (i = 0; i < VDC_TAR_DEL_LUT_SIZE; i++)
  355. vdc_info->tar_del_lut[i] = sde_vdc_tar_del_lut[idx][i];
  356. for (i = 0; i < VDC_LBDA_BRATE_LUT_SIZE; i++)
  357. vdc_info->lbda_brate_lut[i] = sde_vdc_lbda_brate_lut[idx][i];
  358. for (i = 0; i < VDC_LBDA_BF_LUT_SIZE; i++)
  359. vdc_info->lbda_bf_lut[i] = sde_vdc_lbda_bf_lut[idx][i];
  360. for (i = 0; i < VDC_LBDA_BRATE_REG_SIZE; i++) {
  361. idx_mod = i & 0x03;
  362. x_0_idx = i >> 2;
  363. if (x_0_idx > VDC_LBDA_BRATE_LUT_SIZE - 1)
  364. x_0_idx = VDC_LBDA_BRATE_LUT_SIZE - 1;
  365. x_1_idx = (i >> 2) + 1;
  366. if (x_1_idx > VDC_LBDA_BRATE_LUT_SIZE - 1)
  367. x_1_idx = VDC_LBDA_BRATE_LUT_SIZE - 1;
  368. x_0 = vdc_info->lbda_brate_lut[x_0_idx];
  369. x_1 = vdc_info->lbda_brate_lut[x_1_idx];
  370. lambda = (((4 - idx_mod) * x_0 + idx_mod * x_1 + 2) >> 2);
  371. vdc_info->lbda_brate_lut_interp[i] = lambda;
  372. x_0 = vdc_info->lbda_bf_lut[x_0_idx];
  373. x_1 = vdc_info->lbda_bf_lut[x_1_idx];
  374. lambda = (((4 - idx_mod) * x_0 + idx_mod * x_1 + 2) >> 2);
  375. vdc_info->lbda_bf_lut_interp[i] = lambda;
  376. }
  377. sde_vdc_dump_lut_params(vdc_info);
  378. return 0;
  379. }
  380. static int sde_vdc_populate_core_params(struct msm_display_vdc_info *vdc_info,
  381. int intf_width)
  382. {
  383. u16 bpp;
  384. u16 bpc;
  385. u32 bpp_codec;
  386. u64 temp, diff;
  387. if (!vdc_info)
  388. return -EINVAL;
  389. if (!vdc_info->slice_width ||
  390. !vdc_info->slice_height ||
  391. intf_width < vdc_info->slice_width) {
  392. pr_err("invalid input, intf_width=%d slice_width=%d\n",
  393. intf_width, vdc_info->slice_width);
  394. return -EINVAL;
  395. }
  396. bpp = VDC_BPP(vdc_info->bits_per_pixel);
  397. bpp_codec = 16 * bpp;
  398. bpc = vdc_info->bits_per_component;
  399. vdc_info->num_of_active_ss = intf_width / vdc_info->slice_width;
  400. temp = vdc_info->slice_width * bpp_codec;
  401. temp += 15;
  402. temp >>= 4;
  403. temp += 7;
  404. temp >>= 3;
  405. vdc_info->chunk_size = temp;
  406. vdc_info->chunk_size_bits = temp * 8;
  407. vdc_info->slice_num_px = vdc_info->slice_width *
  408. vdc_info->slice_height;
  409. /* slice_num_px should be atleast 4096 */
  410. if (vdc_info->slice_num_px < 4096) {
  411. pr_err("insufficient slice_num_px:%d\n",
  412. vdc_info->slice_num_px);
  413. return -EINVAL;
  414. }
  415. vdc_info->avg_block_bits = bpp_codec;
  416. temp = (16 * vdc_info->chunk_size);
  417. temp -= (vdc_info->slice_width * 2 * bpp_codec) >> 4;
  418. vdc_info->per_chunk_pad_bits = temp;
  419. vdc_info->tot_pad_bits = (vdc_info->avg_block_bits +
  420. vdc_info->per_chunk_pad_bits - 8);
  421. vdc_info->rc_stuffing_bits = ((vdc_info->tot_pad_bits + 8) / 9);
  422. vdc_info->slice_num_bits = (8 * vdc_info->chunk_size *
  423. vdc_info->slice_height);
  424. temp = (16 * vdc_info->chunk_size);
  425. vdc_info->chunk_adj_bits = temp -
  426. ((2 * vdc_info->slice_width * bpp_codec) >> 4);
  427. if (vdc_info->slice_width <= 720)
  428. vdc_info->rc_buf_init_size_temp = 4096;
  429. else if (vdc_info->slice_width <= 2048)
  430. vdc_info->rc_buf_init_size_temp = 8192;
  431. else
  432. vdc_info->rc_buf_init_size_temp = 10752;
  433. vdc_info->init_tx_delay_temp = (vdc_info->rc_buf_init_size_temp /
  434. vdc_info->avg_block_bits);
  435. temp = (vdc_info->init_tx_delay_temp * 16 * bpp_codec);
  436. vdc_info->rc_buffer_init_size = temp >> 4;
  437. vdc_info->rc_init_tx_delay = vdc_info->rc_buffer_init_size /
  438. vdc_info->avg_block_bits;
  439. vdc_info->rc_init_tx_delay_px_times = vdc_info->rc_init_tx_delay * 16;
  440. temp = (2 * vdc_info->rc_buffer_init_size);
  441. temp = temp + (2 * vdc_info->slice_width *
  442. RC_TARGET_RATE_EXTRA_FTBLS);
  443. vdc_info->rc_buffer_max_size = temp;
  444. vdc_info->rc_tar_rate_scale_temp_a = ilog2(vdc_info->slice_num_px) + 1;
  445. vdc_info->rc_tar_rate_scale_temp_b = ilog2(vdc_info->slice_num_px);
  446. vdc_info->rc_tar_rate_scale = 1 + vdc_info->rc_tar_rate_scale_temp_a;
  447. vdc_info->rc_target_rate_threshold = (1 <<
  448. (vdc_info->rc_tar_rate_scale - 1));
  449. if (vdc_info->chroma_format == MSM_CHROMA_444)
  450. vdc_info->chroma_samples = 16;
  451. else if (vdc_info->chroma_format == MSM_CHROMA_422)
  452. vdc_info->chroma_samples = 8;
  453. else
  454. vdc_info->chroma_samples = 4;
  455. temp = (2 * vdc_info->chroma_samples) + 16;
  456. vdc_info->block_max_bits = (temp * bpc) + 7;
  457. temp = (1 << 12);
  458. temp += (vdc_info->block_max_bits >> 1);
  459. temp /= vdc_info->block_max_bits;
  460. vdc_info->rc_lambda_bitrate_scale = temp;
  461. temp = (1 << 20);
  462. temp /= vdc_info->rc_buffer_max_size;
  463. vdc_info->rc_buffer_fullness_scale = temp;
  464. vdc_info->rc_fullness_offset_thresh = (vdc_info->slice_height / 6);
  465. temp = (vdc_info->slice_width >> 3);
  466. temp = temp * vdc_info->rc_fullness_offset_thresh;
  467. vdc_info->ramp_blocks = temp;
  468. temp = (vdc_info->rc_buffer_max_size - vdc_info->rc_buffer_init_size);
  469. temp = temp << 16;
  470. vdc_info->ramp_bits = temp;
  471. temp = div_u64(vdc_info->ramp_bits, (vdc_info->ramp_blocks) ? vdc_info->ramp_blocks : 1);
  472. vdc_info->rc_fullness_offset_slope = temp;
  473. temp = (2 * SSM_MAX_SE_SIZE) - 2;
  474. vdc_info->num_extra_mux_bits_init = temp * 4;
  475. temp = vdc_info->slice_num_bits - vdc_info->num_extra_mux_bits_init;
  476. if ((temp % SSM_MAX_SE_SIZE) == 0) {
  477. vdc_info->extra_crop_bits = 0;
  478. } else {
  479. diff = vdc_info->slice_num_bits -
  480. vdc_info->num_extra_mux_bits_init;
  481. vdc_info->extra_crop_bits = (SSM_MAX_SE_SIZE -
  482. (diff % SSM_MAX_SE_SIZE));
  483. }
  484. vdc_info->num_extra_mux_bits = vdc_info->num_extra_mux_bits_init -
  485. vdc_info->extra_crop_bits;
  486. vdc_info->mppf_bits_comp_0 = 16 * vdc_info->mppf_bpc_r_y;
  487. vdc_info->mppf_bits_comp_1 = vdc_info->chroma_samples *
  488. vdc_info->mppf_bpc_g_cb;
  489. vdc_info->mppf_bits_comp_2 = vdc_info->chroma_samples *
  490. vdc_info->mppf_bpc_b_cr;
  491. vdc_info->min_block_bits = 8 + vdc_info->mppf_bits_comp_0 +
  492. vdc_info->mppf_bits_comp_1 + vdc_info->mppf_bits_comp_2;
  493. sde_vdc_dump_core_params(vdc_info);
  494. return 0;
  495. }
  496. void sde_vdc_intf_prog_params(struct msm_display_vdc_info *vdc_info,
  497. int intf_width)
  498. {
  499. int slice_per_pkt, slice_per_intf;
  500. int bytes_in_slice, total_bytes_per_intf;
  501. u16 bpp;
  502. slice_per_pkt = vdc_info->slice_per_pkt;
  503. // is mode->timing.h_active always intf_width?
  504. slice_per_intf = DIV_ROUND_UP(intf_width,
  505. vdc_info->slice_width);
  506. /*
  507. * If slice_per_pkt is greater than slice_per_intf then default to 1.
  508. * This can happen during partial update.
  509. */
  510. if (slice_per_pkt > slice_per_intf)
  511. slice_per_pkt = 1;
  512. bpp = VDC_BPP(vdc_info->bits_per_pixel);
  513. bytes_in_slice = DIV_ROUND_UP(vdc_info->slice_width *
  514. bpp, 8);
  515. total_bytes_per_intf = bytes_in_slice * slice_per_intf;
  516. vdc_info->eol_byte_num = total_bytes_per_intf % 3;
  517. vdc_info->pclk_per_line = DIV_ROUND_UP(total_bytes_per_intf,
  518. 3);
  519. vdc_info->bytes_in_slice = bytes_in_slice;
  520. vdc_info->bytes_per_pkt = bytes_in_slice * slice_per_pkt;
  521. vdc_info->pkt_per_line = slice_per_intf / slice_per_pkt;
  522. pr_debug("eol_byte_num = %d pclk_per_line = %d\n",
  523. vdc_info->eol_byte_num, vdc_info->pclk_per_line);
  524. pr_debug("bytes_in_slice = %d bytes_per_pkt = %d\n",
  525. vdc_info->bytes_in_slice, vdc_info->bytes_per_pkt);
  526. pr_debug("pkt_per_line = %d\n", vdc_info->pkt_per_line);
  527. }
  528. static void sde_vdc_ext_core_params(struct msm_display_vdc_info *vdc_info,
  529. int traffic_mode)
  530. {
  531. int temp;
  532. int bpp;
  533. int rc_init_tx_delay_px_times;
  534. bpp = VDC_BPP(vdc_info->bits_per_pixel);
  535. vdc_info->min_ssm_delay = SSM_MAX_SE_SIZE;
  536. vdc_info->max_ssm_delay = SSM_MAX_SE_SIZE + 1;
  537. vdc_info->input_ssm_out_latency = MAX_PIPELINE_LATENCY +
  538. (8 * vdc_info->max_ssm_delay);
  539. vdc_info->input_ssm_out_latency_min = (8 * vdc_info->min_ssm_delay);
  540. temp = (7 + OUT_BUF_UF_MARGIN);
  541. temp *= OB_DATA_WIDTH;
  542. temp += (SSM_MAX_SE_SIZE / 2);
  543. temp /= (bpp * 2);
  544. temp += 1;
  545. vdc_info->obuf_latency = temp;
  546. temp = vdc_info->input_ssm_out_latency +
  547. vdc_info->obuf_latency;
  548. rc_init_tx_delay_px_times = vdc_info->rc_init_tx_delay_px_times;
  549. rc_init_tx_delay_px_times /= 2;
  550. vdc_info->base_hs_latency = rc_init_tx_delay_px_times + temp;
  551. temp = vdc_info->rc_init_tx_delay_px_times;
  552. temp /= 2;
  553. temp += vdc_info->input_ssm_out_latency_min;
  554. vdc_info->base_hs_latency_min = temp;
  555. vdc_info->base_hs_latency_pixels = (vdc_info->base_hs_latency * 2);
  556. vdc_info->base_hs_latency_pixels_min = (2 *
  557. vdc_info->base_hs_latency_min);
  558. temp = DIV_ROUND_UP(vdc_info->base_hs_latency_pixels,
  559. vdc_info->slice_width);
  560. vdc_info->base_initial_lines = temp;
  561. temp = vdc_info->base_initial_lines * vdc_info->slice_width;
  562. temp -= vdc_info->base_hs_latency_pixels;
  563. vdc_info->base_top_up = temp;
  564. if (traffic_mode == VDC_TRAFFIC_BURST_MODE)
  565. vdc_info->output_rate = OUTPUT_DATA_WIDTH;
  566. else
  567. vdc_info->output_rate = bpp * 2;
  568. temp = (bpp * 2 * 100);
  569. temp /= vdc_info->output_rate;
  570. vdc_info->output_rate_ratio_100 = temp;
  571. if (traffic_mode == VDC_TRAFFIC_BURST_MODE) {
  572. temp = vdc_info->output_rate_ratio_100 *
  573. vdc_info->slice_width;
  574. temp *= vdc_info->num_of_active_ss;
  575. temp /= 100;
  576. vdc_info->burst_accum_pixels = temp;
  577. } else {
  578. vdc_info->burst_accum_pixels = 0;
  579. }
  580. if (vdc_info->num_of_active_ss > 1)
  581. vdc_info->ss_initial_lines = 1;
  582. else
  583. vdc_info->ss_initial_lines = 0;
  584. if (traffic_mode == VDC_TRAFFIC_BURST_MODE) {
  585. if ((vdc_info->burst_accum_pixels +
  586. vdc_info->base_top_up) < vdc_info->slice_width)
  587. vdc_info->burst_initial_lines = 1;
  588. else
  589. vdc_info->burst_initial_lines = 0;
  590. } else {
  591. vdc_info->burst_initial_lines = 0;
  592. }
  593. vdc_info->initial_lines = 1 + vdc_info->base_initial_lines +
  594. vdc_info->ss_initial_lines +
  595. vdc_info->burst_initial_lines;
  596. temp = (vdc_info->base_initial_lines * vdc_info->slice_width);
  597. temp -= vdc_info->base_hs_latency_pixels_min;
  598. temp *= bpp;
  599. vdc_info->obuf_base = temp;
  600. if (vdc_info->num_of_active_ss > 1) {
  601. vdc_info->obuf_extra_ss0 = 2 * vdc_info->chunk_size_bits;
  602. vdc_info->obuf_extra_ss1 = vdc_info->chunk_size_bits;
  603. } else {
  604. vdc_info->obuf_extra_ss0 = 0;
  605. vdc_info->obuf_extra_ss1 = 0;
  606. }
  607. vdc_info->obuf_extra_burst = vdc_info->burst_initial_lines *
  608. vdc_info->chunk_size_bits;
  609. vdc_info->obuf_ss0 = vdc_info->rc_buffer_max_size +
  610. vdc_info->obuf_base + vdc_info->obuf_extra_ss0 +
  611. vdc_info->obuf_extra_burst;
  612. vdc_info->obuf_ss1 = vdc_info->rc_buffer_max_size +
  613. vdc_info->obuf_base + vdc_info->obuf_extra_ss1 +
  614. vdc_info->obuf_extra_burst;
  615. temp = OUT_BUF_OF_MARGIN_TC_10 *
  616. vdc_info->chunk_size_bits;
  617. temp /= 10;
  618. temp /= SSM_MAX_SE_SIZE;
  619. vdc_info->obuf_margin_words = max(OUT_BUF_OF_MARGIN_OB,
  620. temp);
  621. if (vdc_info->num_of_active_ss == 2) {
  622. vdc_info->ob0_max_addr = OB0_RAM_DEPTH - 1;
  623. vdc_info->ob1_max_addr = OB1_RAM_DEPTH - 1;
  624. } else {
  625. vdc_info->ob0_max_addr = (2 * OB1_RAM_DEPTH) - 1;
  626. vdc_info->ob1_max_addr = 0;
  627. }
  628. if (vdc_info->split_panel_enable) {
  629. temp = vdc_info->frame_width / vdc_info->num_of_active_ss;
  630. temp /= NUM_ACTIVE_HS;
  631. } else {
  632. temp = vdc_info->frame_width / vdc_info->num_of_active_ss;
  633. }
  634. vdc_info->slice_width_orig = temp;
  635. vdc_info->r2b0_max_addr = (MAX_PIXELS_PER_HS_LINE / 4);
  636. vdc_info->r2b0_max_addr += 3;
  637. vdc_info->r2b1_max_addr = (MAX_PIXELS_PER_HS_LINE / 4);
  638. vdc_info->r2b1_max_addr /= 2;
  639. vdc_info->r2b1_max_addr += 3;
  640. sde_vdc_dump_ext_core_params(vdc_info);
  641. }
  642. int sde_vdc_populate_config(struct msm_display_vdc_info *vdc_info,
  643. int intf_width, int traffic_mode)
  644. {
  645. int ret = 0;
  646. ret = sde_vdc_populate_core_params(vdc_info, intf_width);
  647. if (ret) {
  648. pr_err("failed to populate vdc core params %d\n", ret);
  649. return ret;
  650. }
  651. ret = sde_vdc_populate_lut_params(vdc_info);
  652. if (ret) {
  653. pr_err("failed to populate lut params %d\n", ret);
  654. return ret;
  655. }
  656. sde_vdc_intf_prog_params(vdc_info, intf_width);
  657. sde_vdc_ext_core_params(vdc_info, traffic_mode);
  658. return ret;
  659. }
  660. int sde_vdc_create_pps_buf_cmd(struct msm_display_vdc_info *vdc_info,
  661. char *buf, int pps_id, u32 len)
  662. {
  663. char *bp = buf;
  664. u32 i;
  665. u32 slice_num_bits_ub, slice_num_bits_ldw;
  666. if (len < SDE_VDC_PPS_SIZE)
  667. return -EINVAL;
  668. memset(buf, 0, len);
  669. /* b0 */
  670. *bp++ = vdc_info->version_major;
  671. /* b1 */
  672. *bp++ = vdc_info->version_minor;
  673. /* b2 */
  674. *bp++ = vdc_info->version_release;
  675. /* b3 */
  676. *bp++ = (pps_id & 0xff); /* pps1 */
  677. /* b4-b5 */
  678. *bp++ = ((vdc_info->frame_width >> 8) & 0xff);
  679. *bp++ = (vdc_info->frame_width & 0x0ff);
  680. /* b6-b7 */
  681. *bp++ = ((vdc_info->frame_height >> 8) & 0xff);
  682. *bp++ = (vdc_info->frame_height & 0x0ff);
  683. /* b8-b9 */
  684. *bp++ = ((vdc_info->slice_width >> 8) & 0xff);
  685. *bp++ = (vdc_info->slice_width & 0x0ff);
  686. /* b10-b11 */
  687. *bp++ = ((vdc_info->slice_height >> 8) & 0xff);
  688. *bp++ = (vdc_info->slice_height & 0x0ff);
  689. /* b12-b15 */
  690. *bp++ = ((vdc_info->slice_num_px >> 24) & 0xff);
  691. *bp++ = ((vdc_info->slice_num_px >> 16) & 0xff);
  692. *bp++ = ((vdc_info->slice_num_px >> 8) & 0xff);
  693. *bp++ = (vdc_info->slice_num_px & 0x0ff);
  694. /* b16-b17 */
  695. *bp++ = ((vdc_info->bits_per_pixel >> 8) & 0x3);
  696. *bp++ = (vdc_info->bits_per_pixel & 0xff);
  697. /* b18 */
  698. bp++; /* reserved */
  699. /* b19 */
  700. *bp++ = ((((vdc_info->bits_per_component - 8) >> 1) & 0x3) << 4)|
  701. ((vdc_info->source_color_space & 0x3) << 2)|
  702. (vdc_info->chroma_format & 0x3);
  703. /* b20-b21 */
  704. bp++; /* reserved */
  705. bp++; /* reserved */
  706. /* b22-b23 */
  707. *bp++ = ((vdc_info->chunk_size >> 8) & 0xff);
  708. *bp++ = (vdc_info->chunk_size & 0x0ff);
  709. /* b24-b25 */
  710. bp++; /* reserved */
  711. bp++; /* reserved */
  712. /* b26-b27 */
  713. *bp++ = ((vdc_info->rc_buffer_init_size >> 8) & 0xff);
  714. *bp++ = (vdc_info->rc_buffer_init_size & 0x0ff);
  715. /* b28 */
  716. *bp++ = vdc_info->rc_stuffing_bits;
  717. /* b29 */
  718. *bp++ = vdc_info->rc_init_tx_delay;
  719. /* b30-b31 */
  720. *bp++ = ((vdc_info->rc_buffer_max_size >> 8) & 0xff);
  721. *bp++ = (vdc_info->rc_buffer_max_size & 0x0ff);
  722. /* b32-b35 */
  723. *bp++ = ((vdc_info->rc_target_rate_threshold >> 24) & 0xff);
  724. *bp++ = ((vdc_info->rc_target_rate_threshold >> 16) & 0xff);
  725. *bp++ = ((vdc_info->rc_target_rate_threshold >> 8) & 0xff);
  726. *bp++ = (vdc_info->rc_target_rate_threshold & 0x0ff);
  727. /* b36 */
  728. *bp++ = vdc_info->rc_tar_rate_scale;
  729. /* b37 */
  730. *bp++ = vdc_info->rc_buffer_fullness_scale;
  731. /* b38-b39 */
  732. *bp++ = ((vdc_info->rc_fullness_offset_thresh >> 8) & 0xff);
  733. *bp++ = (vdc_info->rc_fullness_offset_thresh & 0x0ff);
  734. /* b40-b42 */
  735. *bp++ = ((vdc_info->rc_fullness_offset_slope >> 16) & 0xff);
  736. *bp++ = ((vdc_info->rc_fullness_offset_slope >> 8) & 0xff);
  737. *bp++ = ((vdc_info->rc_fullness_offset_slope) & 0xff);
  738. /* b43 */
  739. *bp++ = (RC_TARGET_RATE_EXTRA_FTBLS & 0x0f);
  740. /* b44 */
  741. *bp++ = vdc_info->flatqp_vf_fbls;
  742. /* b45 */
  743. *bp++ = vdc_info->flatqp_vf_nbls;
  744. /* b46 */
  745. *bp++ = vdc_info->flatqp_sw_fbls;
  746. /* b47 */
  747. *bp++ = vdc_info->flatqp_sw_nbls;
  748. /* b48-b55 */
  749. for (i = 0; i < VDC_FLAT_QP_LUT_SIZE; i++)
  750. *bp++ = vdc_info->flatness_qp_lut[i];
  751. /* b56-b63 */
  752. for (i = 0; i < VDC_MAX_QP_LUT_SIZE; i++)
  753. *bp++ = vdc_info->max_qp_lut[i];
  754. /* b64-b79 */
  755. for (i = 0; i < VDC_TAR_DEL_LUT_SIZE; i++)
  756. *bp++ = vdc_info->tar_del_lut[i];
  757. /* b80 */
  758. bp++; /* reserved */
  759. /* b81 */
  760. *bp++ = (((vdc_info->mppf_bpc_r_y & 0xf) << 4) |
  761. (vdc_info->mppf_bpc_g_cb & 0xf));
  762. /* b82 */
  763. *bp++ = (((vdc_info->mppf_bpc_b_cr & 0xf) << 4) |
  764. (vdc_info->mppf_bpc_y & 0xf));
  765. /* b83 */
  766. *bp++ = (((vdc_info->mppf_bpc_co & 0xf) << 4) |
  767. (vdc_info->mppf_bpc_cg & 0xf));
  768. /* b84 */
  769. bp++; /* reserved */
  770. /* b85 */
  771. bp++; /* reserved */
  772. /* b86 */
  773. bp++; /* reserved */
  774. /* b87 */
  775. *bp++ = SSM_MAX_SE_SIZE;
  776. /* b88 */
  777. bp++; /* reserved */
  778. /* b89 */
  779. bp++; /* reserved */
  780. /* b90 */
  781. bp++; /* reserved */
  782. /* b91 */
  783. slice_num_bits_ub = (vdc_info->slice_num_bits >> 32);
  784. *bp++ = (slice_num_bits_ub & 0x0ff);
  785. /* b92-b95 */
  786. slice_num_bits_ldw = (u32)vdc_info->slice_num_bits;
  787. *bp++ = ((slice_num_bits_ldw >> 24) & 0xff);
  788. *bp++ = ((slice_num_bits_ldw >> 16) & 0xff);
  789. *bp++ = ((slice_num_bits_ldw >> 8) & 0xff);
  790. *bp++ = (slice_num_bits_ldw & 0x0ff);
  791. /* b96 */
  792. bp++;
  793. /* b97 */
  794. *bp++ = vdc_info->chunk_adj_bits;
  795. /* b98-b99 */
  796. *bp++ = ((vdc_info->num_extra_mux_bits >> 8) & 0xff);
  797. *bp++ = (vdc_info->num_extra_mux_bits & 0x0ff);
  798. return 0;
  799. }