msm_vidc_control.c 64 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
  4. */
  5. #include "msm_vidc_control.h"
  6. #include "msm_vidc_debug.h"
  7. #include "hfi_packet.h"
  8. #include "hfi_property.h"
  9. #include "venus_hfi.h"
  10. #include "msm_vidc_internal.h"
  11. #include "msm_vidc_driver.h"
  12. #define CAP_TO_8BIT_QP(a) { \
  13. if ((a) < 0) \
  14. (a) = 0; \
  15. }
  16. static bool is_priv_ctrl(u32 id)
  17. {
  18. bool private = false;
  19. if (IS_PRIV_CTRL(id))
  20. return true;
  21. /*
  22. * Treat below standard controls as private because
  23. * we have added custom values to the controls
  24. */
  25. switch (id) {
  26. /*
  27. * TODO: V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_TYPE is
  28. * std ctrl. But needs some fixes in v4l2-ctrls.c. Hence,
  29. * make this as private ctrl for time being
  30. */
  31. case V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_TYPE:
  32. private = true;
  33. break;
  34. default:
  35. private = false;
  36. break;
  37. }
  38. return private;
  39. }
  40. static bool is_meta_ctrl(u32 id)
  41. {
  42. return (id == V4L2_CID_MPEG_VIDC_METADATA_LTR_MARK_USE_DETAILS ||
  43. id == V4L2_CID_MPEG_VIDC_METADATA_SEQ_HEADER_NAL ||
  44. id == V4L2_CID_MPEG_VIDC_METADATA_DPB_LUMA_CHROMA_MISR ||
  45. id == V4L2_CID_MPEG_VIDC_METADATA_OPB_LUMA_CHROMA_MISR ||
  46. id == V4L2_CID_MPEG_VIDC_METADATA_INTERLACE ||
  47. id == V4L2_CID_MPEG_VIDC_METADATA_CONCEALED_MB_COUNT ||
  48. id == V4L2_CID_MPEG_VIDC_METADATA_HISTOGRAM_INFO ||
  49. id == V4L2_CID_MPEG_VIDC_METADATA_SEI_MASTERING_DISPLAY_COLOUR ||
  50. id == V4L2_CID_MPEG_VIDC_METADATA_SEI_CONTENT_LIGHT_LEVEL ||
  51. id == V4L2_CID_MPEG_VIDC_METADATA_HDR10PLUS ||
  52. id == V4L2_CID_MPEG_VIDC_METADATA_EVA_STATS ||
  53. id == V4L2_CID_MPEG_VIDC_METADATA_BUFFER_TAG ||
  54. id == V4L2_CID_MPEG_VIDC_METADATA_DPB_TAG_LIST ||
  55. id == V4L2_CID_MPEG_VIDC_METADATA_SUBFRAME_OUTPUT ||
  56. id == V4L2_CID_MPEG_VIDC_METADATA_ROI_INFO ||
  57. id == V4L2_CID_MPEG_VIDC_METADATA_TIMESTAMP ||
  58. id == V4L2_CID_MPEG_VIDC_METADATA_ENC_QP_METADATA);
  59. }
  60. static const char *const mpeg_video_rate_control[] = {
  61. "VBR",
  62. "CBR",
  63. "CBR VFR",
  64. "MBR",
  65. "MBR VFR",
  66. "CQ",
  67. NULL,
  68. };
  69. static const char *const mpeg_video_stream_format[] = {
  70. "NAL Format Start Codes",
  71. "NAL Format One NAL Per Buffer",
  72. "NAL Format One Byte Length",
  73. "NAL Format Two Byte Length",
  74. "NAL Format Four Byte Length",
  75. NULL,
  76. };
  77. static const char *const mpeg_video_blur_types[] = {
  78. "Blur None",
  79. "Blur External",
  80. "Blur Adaptive",
  81. NULL,
  82. };
  83. static const char *const mpeg_video_avc_coding_layer[] = {
  84. "B",
  85. "P",
  86. NULL,
  87. };
  88. static const char *const roi_map_type[] = {
  89. "None",
  90. "2-bit",
  91. "2-bit",
  92. NULL,
  93. };
  94. static u32 msm_vidc_get_port_info(struct msm_vidc_inst *inst,
  95. enum msm_vidc_inst_capability_type cap_id)
  96. {
  97. struct msm_vidc_inst_capability *capability = inst->capabilities;
  98. if (capability->cap[cap_id].flags & CAP_FLAG_INPUT_PORT &&
  99. capability->cap[cap_id].flags & CAP_FLAG_OUTPUT_PORT) {
  100. if (inst->vb2q[OUTPUT_PORT].streaming)
  101. return get_hfi_port(inst, INPUT_PORT);
  102. else
  103. return get_hfi_port(inst, OUTPUT_PORT);
  104. }
  105. if (capability->cap[cap_id].flags & CAP_FLAG_INPUT_PORT)
  106. return get_hfi_port(inst, INPUT_PORT);
  107. else if (capability->cap[cap_id].flags & CAP_FLAG_OUTPUT_PORT)
  108. return get_hfi_port(inst, OUTPUT_PORT);
  109. else
  110. return HFI_PORT_NONE;
  111. }
  112. static const char * const * msm_vidc_get_qmenu_type(
  113. struct msm_vidc_inst *inst, u32 control_id)
  114. {
  115. switch (control_id) {
  116. case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
  117. return mpeg_video_rate_control;
  118. case V4L2_CID_MPEG_VIDEO_HEVC_SIZE_OF_LENGTH_FIELD:
  119. return mpeg_video_stream_format;
  120. case V4L2_CID_MPEG_VIDC_VIDEO_BLUR_TYPES:
  121. return mpeg_video_blur_types;
  122. case V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_TYPE:
  123. return mpeg_video_avc_coding_layer;
  124. default:
  125. i_vpr_e(inst, "%s: No available qmenu for ctrl %#x\n",
  126. __func__, control_id);
  127. return NULL;
  128. }
  129. }
  130. static int msm_vidc_packetize_control(struct msm_vidc_inst *inst,
  131. enum msm_vidc_inst_capability_type cap_id, u32 payload_type,
  132. void *hfi_val, u32 payload_size, const char *func)
  133. {
  134. int rc = 0;
  135. i_vpr_h(inst,
  136. "set cap: name: %24s, cap value: %#10x, hfi: %#10x\n",
  137. cap_name(cap_id), inst->capabilities->cap[cap_id].value,
  138. *(s64 *)hfi_val);
  139. rc = venus_hfi_session_property(inst,
  140. inst->capabilities->cap[cap_id].hfi_id,
  141. HFI_HOST_FLAGS_NONE,
  142. msm_vidc_get_port_info(inst, cap_id),
  143. payload_type,
  144. hfi_val,
  145. sizeof(payload_size));
  146. if (rc)
  147. i_vpr_e(inst,
  148. "%s: failed to set cap[%d] %s to fw\n",
  149. __func__, cap_id, cap_name(cap_id));
  150. return rc;
  151. }
  152. static enum msm_vidc_inst_capability_type msm_vidc_get_cap_id(
  153. struct msm_vidc_inst *inst, u32 id)
  154. {
  155. enum msm_vidc_inst_capability_type i = INST_CAP_NONE + 1;
  156. struct msm_vidc_inst_capability *capability;
  157. enum msm_vidc_inst_capability_type cap_id = INST_CAP_NONE;
  158. capability = inst->capabilities;
  159. do {
  160. if (capability->cap[i].v4l2_id == id) {
  161. cap_id = capability->cap[i].cap;
  162. break;
  163. }
  164. i++;
  165. } while (i < INST_CAP_MAX);
  166. return cap_id;
  167. }
  168. static int msm_vidc_add_capid_to_list(struct msm_vidc_inst *inst,
  169. enum msm_vidc_inst_capability_type cap_id,
  170. enum msm_vidc_ctrl_list_type type)
  171. {
  172. struct msm_vidc_inst_cap_entry *entry = NULL, *curr_node = NULL;
  173. /* skip adding if cap_id already present in list */
  174. if (type & FW_LIST) {
  175. list_for_each_entry(curr_node, &inst->firmware.list, list) {
  176. if (curr_node->cap_id == cap_id) {
  177. i_vpr_l(inst,
  178. "%s: cap[%d] %s already present in FW_LIST\n",
  179. __func__, cap_id, cap_name(cap_id));
  180. return 0;
  181. }
  182. }
  183. }
  184. entry = kzalloc(sizeof(*entry), GFP_ATOMIC);
  185. if (!entry) {
  186. i_vpr_e(inst, "%s: alloc failed\n", __func__);
  187. return -ENOMEM;
  188. }
  189. entry->cap_id = cap_id;
  190. if (type & CHILD_LIST)
  191. list_add_tail(&entry->list, &inst->children.list);
  192. if (type & FW_LIST)
  193. list_add_tail(&entry->list, &inst->firmware.list);
  194. return 0;
  195. }
  196. static int msm_vidc_add_children(struct msm_vidc_inst *inst,
  197. enum msm_vidc_inst_capability_type cap_id)
  198. {
  199. int rc = 0;
  200. int i = 0;
  201. struct msm_vidc_inst_capability *capability = inst->capabilities;
  202. while (i < MAX_CAP_CHILDREN &&
  203. capability->cap[cap_id].children[i]) {
  204. rc = msm_vidc_add_capid_to_list(inst,
  205. capability->cap[cap_id].children[i],
  206. CHILD_LIST);
  207. if (rc)
  208. return rc;
  209. i++;
  210. }
  211. return rc;
  212. }
  213. static bool is_parent_available(struct msm_vidc_inst* inst,
  214. u32 cap, u32 check_parent)
  215. {
  216. int i = 0;
  217. u32 cap_parent;
  218. while (i < MAX_CAP_PARENTS &&
  219. inst->capabilities->cap[cap].parents[i]) {
  220. cap_parent = inst->capabilities->cap[cap].parents[i];
  221. if (cap_parent == check_parent) {
  222. return true;
  223. }
  224. i++;
  225. }
  226. return false;
  227. }
  228. int msm_vidc_update_cap_value(struct msm_vidc_inst *inst, u32 cap,
  229. s32 adjusted_val, const char *func)
  230. {
  231. if (!inst || !inst->capabilities) {
  232. d_vpr_e("%s: invalid params\n", __func__);
  233. return -EINVAL;
  234. }
  235. if (inst->capabilities->cap[cap].value != adjusted_val)
  236. i_vpr_h(inst,
  237. "%s: updated database: name: %s, value: %#x -> %#x\n",
  238. func, cap_name(cap),
  239. inst->capabilities->cap[cap].value, adjusted_val);
  240. inst->capabilities->cap[cap].value = adjusted_val;
  241. return 0;
  242. }
  243. static int msm_vidc_get_parent_value(struct msm_vidc_inst* inst,
  244. u32 cap, u32 parent, s32 *value, const char *func)
  245. {
  246. int rc = 0;
  247. if (is_parent_available(inst, cap, parent)) {
  248. switch (parent) {
  249. case BITRATE_MODE:
  250. *value = inst->hfi_rc_type;
  251. break;
  252. case LAYER_TYPE:
  253. *value = inst->hfi_layer_type;
  254. break;
  255. default:
  256. *value = inst->capabilities->cap[parent].value;
  257. break;
  258. }
  259. } else {
  260. i_vpr_e(inst,
  261. "%s: missing parent %d for cap[%d] %s, fix database\n",
  262. func, parent, cap, cap_name(cap));
  263. rc = -EINVAL;
  264. }
  265. return rc;
  266. }
  267. static int msm_vidc_adjust_hevc_qp(struct msm_vidc_inst *inst,
  268. enum msm_vidc_inst_capability_type cap_id)
  269. {
  270. struct msm_vidc_inst_capability *capability;
  271. s32 pix_fmt = -1;
  272. capability = inst->capabilities;
  273. if (!(inst->codec == MSM_VIDC_HEVC || inst->codec == MSM_VIDC_HEIC)) {
  274. i_vpr_e(inst,
  275. "%s: incorrect cap[%d] %s entry in database, fix database\n",
  276. __func__, cap_id, cap_name(cap_id));
  277. return -EINVAL;
  278. }
  279. if (msm_vidc_get_parent_value(inst, cap_id,
  280. PIX_FMTS, &pix_fmt, __func__))
  281. return -EINVAL;
  282. if (pix_fmt == MSM_VIDC_FMT_P010 || pix_fmt == MSM_VIDC_FMT_TP10C)
  283. goto exit;
  284. CAP_TO_8BIT_QP(capability->cap[cap_id].value);
  285. if (cap_id == MIN_FRAME_QP) {
  286. CAP_TO_8BIT_QP(capability->cap[I_FRAME_MIN_QP].value);
  287. CAP_TO_8BIT_QP(capability->cap[P_FRAME_MIN_QP].value);
  288. CAP_TO_8BIT_QP(capability->cap[B_FRAME_MIN_QP].value);
  289. } else if (cap_id == MAX_FRAME_QP) {
  290. CAP_TO_8BIT_QP(capability->cap[I_FRAME_MAX_QP].value);
  291. CAP_TO_8BIT_QP(capability->cap[P_FRAME_MAX_QP].value);
  292. CAP_TO_8BIT_QP(capability->cap[B_FRAME_MAX_QP].value);
  293. } else if (cap_id == I_FRAME_QP) {
  294. CAP_TO_8BIT_QP(capability->cap[P_FRAME_QP].value);
  295. CAP_TO_8BIT_QP(capability->cap[B_FRAME_QP].value);
  296. }
  297. exit:
  298. return 0;
  299. }
  300. static int msm_vidc_adjust_property(struct msm_vidc_inst *inst,
  301. enum msm_vidc_inst_capability_type cap_id)
  302. {
  303. int rc = 0;
  304. struct msm_vidc_inst_capability *capability;
  305. capability = inst->capabilities;
  306. /*
  307. * skip for uninitialized cap properties.
  308. * Eg: Skip Tramform 8x8 cap that is uninitialized for HEVC codec
  309. */
  310. if (!capability->cap[cap_id].cap)
  311. return 0;
  312. if (capability->cap[cap_id].adjust) {
  313. rc = capability->cap[cap_id].adjust(inst, NULL);
  314. if (rc)
  315. goto exit;
  316. }
  317. /* add children cap_id's to chidren list */
  318. rc = msm_vidc_add_children(inst, cap_id);
  319. if (rc)
  320. goto exit;
  321. /* add cap_id to firmware list */
  322. rc = msm_vidc_add_capid_to_list(inst, cap_id, FW_LIST);
  323. if (rc)
  324. goto exit;
  325. return 0;
  326. exit:
  327. return rc;
  328. }
  329. static int msm_vidc_adjust_dynamic_property(struct msm_vidc_inst *inst,
  330. enum msm_vidc_inst_capability_type cap_id, struct v4l2_ctrl *ctrl)
  331. {
  332. int rc = 0;
  333. struct msm_vidc_inst_capability *capability;
  334. s32 prev_value;
  335. capability = inst->capabilities;
  336. /*
  337. * ctrl is NULL for children adjustment calls
  338. * When a dynamic control having children is adjusted, check if dynamic
  339. * adjustment is allowed for its children.
  340. */
  341. if (!(capability->cap[cap_id].flags & CAP_FLAG_DYNAMIC_ALLOWED)) {
  342. i_vpr_e(inst,
  343. "%s: dynamic setting of cap[%d] %s is not allowed\n",
  344. __func__, cap_id, cap_name(cap_id));
  345. msm_vidc_change_inst_state(inst, MSM_VIDC_ERROR, __func__);
  346. return -EINVAL;
  347. }
  348. /*
  349. * if ctrl is NULL, it is children of some parent, and hence,
  350. * must have an adjust function defined
  351. */
  352. if (!ctrl && !capability->cap[cap_id].adjust) {
  353. i_vpr_e(inst,
  354. "%s: child cap[%d] %s must have ajdust function\n",
  355. __func__, capability->cap[cap_id].cap,
  356. cap_name(capability->cap[cap_id].cap));
  357. return -EINVAL;
  358. }
  359. prev_value = capability->cap[cap_id].value;
  360. if (capability->cap[cap_id].adjust) {
  361. rc = capability->cap[cap_id].adjust(inst, ctrl);
  362. if (rc)
  363. goto exit;
  364. } else if (ctrl) {
  365. msm_vidc_update_cap_value(inst, cap_id, ctrl->val, __func__);
  366. }
  367. /* add children if cap value modified */
  368. if (capability->cap[cap_id].value != prev_value) {
  369. rc = msm_vidc_add_children(inst, cap_id);
  370. if (rc)
  371. goto exit;
  372. }
  373. /* add cap_id to firmware list always */
  374. rc = msm_vidc_add_capid_to_list(inst, cap_id, FW_LIST);
  375. if (rc)
  376. goto exit;
  377. return 0;
  378. exit:
  379. return rc;
  380. }
  381. int msm_vidc_ctrl_deinit(struct msm_vidc_inst *inst)
  382. {
  383. if (!inst) {
  384. d_vpr_e("%s: invalid parameters\n", __func__);
  385. return -EINVAL;
  386. }
  387. i_vpr_h(inst, "%s(): num ctrls %d\n", __func__, inst->num_ctrls);
  388. v4l2_ctrl_handler_free(&inst->ctrl_handler);
  389. memset(&inst->ctrl_handler, 0, sizeof(struct v4l2_ctrl_handler));
  390. kfree(inst->ctrls);
  391. inst->ctrls = NULL;
  392. return 0;
  393. }
  394. int msm_vidc_ctrl_init(struct msm_vidc_inst *inst)
  395. {
  396. int rc = 0;
  397. struct msm_vidc_inst_capability *capability;
  398. struct msm_vidc_core *core;
  399. int idx = 0;
  400. struct v4l2_ctrl_config ctrl_cfg = {0};
  401. int num_ctrls = 0, ctrl_idx = 0;
  402. if (!inst || !inst->core || !inst->capabilities) {
  403. d_vpr_e("%s: invalid params\n", __func__);
  404. return -EINVAL;
  405. }
  406. core = inst->core;
  407. capability = inst->capabilities;
  408. if (!core->v4l2_ctrl_ops) {
  409. i_vpr_e(inst, "%s: no control ops\n", __func__);
  410. return -EINVAL;
  411. }
  412. for (idx = 0; idx < INST_CAP_MAX; idx++) {
  413. if (capability->cap[idx].v4l2_id)
  414. num_ctrls++;
  415. }
  416. if (!num_ctrls) {
  417. i_vpr_e(inst, "%s: no ctrls available in cap database\n",
  418. __func__);
  419. return -EINVAL;
  420. }
  421. inst->ctrls = kcalloc(num_ctrls,
  422. sizeof(struct v4l2_ctrl *), GFP_KERNEL);
  423. if (!inst->ctrls) {
  424. i_vpr_e(inst, "%s: failed to allocate ctrl\n", __func__);
  425. return -ENOMEM;
  426. }
  427. rc = v4l2_ctrl_handler_init(&inst->ctrl_handler, num_ctrls);
  428. if (rc) {
  429. i_vpr_e(inst, "control handler init failed, %d\n",
  430. inst->ctrl_handler.error);
  431. goto error;
  432. }
  433. for (idx = 0; idx < INST_CAP_MAX; idx++) {
  434. struct v4l2_ctrl *ctrl;
  435. if (!capability->cap[idx].v4l2_id)
  436. continue;
  437. if (ctrl_idx >= num_ctrls) {
  438. i_vpr_e(inst,
  439. "%s: invalid ctrl %#x, max allowed %d\n",
  440. __func__, capability->cap[idx].v4l2_id,
  441. num_ctrls);
  442. rc = -EINVAL;
  443. goto error;
  444. }
  445. i_vpr_h(inst,
  446. "%s: cap[%d] %24s, value %d min %d max %d step_or_mask %#x flags %#x v4l2_id %#x hfi_id %#x\n",
  447. __func__, idx, cap_name(idx),
  448. capability->cap[idx].value,
  449. capability->cap[idx].min,
  450. capability->cap[idx].max,
  451. capability->cap[idx].step_or_mask,
  452. capability->cap[idx].flags,
  453. capability->cap[idx].v4l2_id,
  454. capability->cap[idx].hfi_id);
  455. memset(&ctrl_cfg, 0, sizeof(struct v4l2_ctrl_config));
  456. if (is_priv_ctrl(capability->cap[idx].v4l2_id)) {
  457. /* add private control */
  458. ctrl_cfg.def = capability->cap[idx].value;
  459. ctrl_cfg.flags = 0;
  460. ctrl_cfg.id = capability->cap[idx].v4l2_id;
  461. ctrl_cfg.max = capability->cap[idx].max;
  462. ctrl_cfg.min = capability->cap[idx].min;
  463. ctrl_cfg.ops = core->v4l2_ctrl_ops;
  464. ctrl_cfg.type = (capability->cap[idx].flags &
  465. CAP_FLAG_MENU) ?
  466. V4L2_CTRL_TYPE_MENU :
  467. V4L2_CTRL_TYPE_INTEGER;
  468. if (ctrl_cfg.type == V4L2_CTRL_TYPE_MENU) {
  469. ctrl_cfg.menu_skip_mask =
  470. ~(capability->cap[idx].step_or_mask);
  471. ctrl_cfg.qmenu = msm_vidc_get_qmenu_type(inst,
  472. capability->cap[idx].v4l2_id);
  473. } else {
  474. ctrl_cfg.step =
  475. capability->cap[idx].step_or_mask;
  476. }
  477. ctrl_cfg.name = cap_name(capability->cap[idx].cap);
  478. if (!ctrl_cfg.name) {
  479. i_vpr_e(inst, "%s: %#x ctrl name is null\n",
  480. __func__, ctrl_cfg.id);
  481. rc = -EINVAL;
  482. goto error;
  483. }
  484. ctrl = v4l2_ctrl_new_custom(&inst->ctrl_handler,
  485. &ctrl_cfg, NULL);
  486. } else {
  487. if (capability->cap[idx].flags & CAP_FLAG_MENU) {
  488. ctrl = v4l2_ctrl_new_std_menu(
  489. &inst->ctrl_handler,
  490. core->v4l2_ctrl_ops,
  491. capability->cap[idx].v4l2_id,
  492. capability->cap[idx].max,
  493. ~(capability->cap[idx].step_or_mask),
  494. capability->cap[idx].value);
  495. } else {
  496. ctrl = v4l2_ctrl_new_std(&inst->ctrl_handler,
  497. core->v4l2_ctrl_ops,
  498. capability->cap[idx].v4l2_id,
  499. capability->cap[idx].min,
  500. capability->cap[idx].max,
  501. capability->cap[idx].step_or_mask,
  502. capability->cap[idx].value);
  503. }
  504. }
  505. if (!ctrl) {
  506. i_vpr_e(inst, "%s: invalid ctrl %#x\n", __func__,
  507. capability->cap[idx].v4l2_id);
  508. rc = -EINVAL;
  509. goto error;
  510. }
  511. rc = inst->ctrl_handler.error;
  512. if (rc) {
  513. i_vpr_e(inst,
  514. "error adding ctrl (%#x) to ctrl handle, %d\n",
  515. capability->cap[idx].v4l2_id,
  516. inst->ctrl_handler.error);
  517. goto error;
  518. }
  519. /*
  520. * TODO(AS)
  521. * ctrl->flags |= capability->cap[idx].flags;
  522. */
  523. ctrl->flags |= V4L2_CTRL_FLAG_EXECUTE_ON_WRITE;
  524. inst->ctrls[ctrl_idx] = ctrl;
  525. ctrl_idx++;
  526. }
  527. inst->num_ctrls = num_ctrls;
  528. i_vpr_h(inst, "%s(): num ctrls %d\n", __func__, inst->num_ctrls);
  529. return 0;
  530. error:
  531. msm_vidc_ctrl_deinit(inst);
  532. return rc;
  533. }
  534. int msm_v4l2_op_s_ctrl(struct v4l2_ctrl *ctrl)
  535. {
  536. int rc = 0;
  537. struct msm_vidc_inst *inst;
  538. enum msm_vidc_inst_capability_type cap_id;
  539. struct msm_vidc_inst_cap_entry *curr_node = NULL, *tmp_node = NULL;
  540. struct msm_vidc_inst_capability *capability;
  541. if (!ctrl) {
  542. d_vpr_e("%s: invalid ctrl parameter\n", __func__);
  543. return -EINVAL;
  544. }
  545. inst = container_of(ctrl->handler,
  546. struct msm_vidc_inst, ctrl_handler);
  547. if (!inst || !inst->capabilities) {
  548. d_vpr_e("%s: invalid parameters for inst\n", __func__);
  549. return -EINVAL;
  550. }
  551. if (inst->state == MSM_VIDC_ERROR) {
  552. i_vpr_e(inst, "%s: set ctrl not allowed in error state\n");
  553. /* (error name TBD); */
  554. return -EINVAL;
  555. }
  556. capability = inst->capabilities;
  557. i_vpr_h(inst, "%s: state %d, name %s, id 0x%x value %d\n",
  558. __func__, inst->state, ctrl->name, ctrl->id, ctrl->val);
  559. cap_id = msm_vidc_get_cap_id(inst, ctrl->id);
  560. if (cap_id == INST_CAP_NONE) {
  561. i_vpr_e(inst, "%s: could not find cap_id for ctrl %s\n",
  562. __func__, ctrl->name);
  563. return -EINVAL;
  564. }
  565. capability->cap[cap_id].flags |= CAP_FLAG_CLIENT_SET;
  566. /* Static setting */
  567. if (!inst->vb2q[OUTPUT_PORT].streaming) {
  568. msm_vidc_update_cap_value(inst, cap_id, ctrl->val, __func__);
  569. if (ctrl->id == V4L2_CID_MPEG_VIDC_MIN_BITSTREAM_SIZE_OVERWRITE) {
  570. rc = msm_vidc_update_bitstream_buffer_size(inst);
  571. if (rc)
  572. return rc;
  573. }
  574. if (ctrl->id == V4L2_CID_MPEG_VIDC_PRIORITY) {
  575. rc = msm_vidc_adjust_session_priority(inst, ctrl);
  576. if (rc)
  577. return rc;
  578. }
  579. if (ctrl->id == V4L2_CID_MPEG_VIDC_THUMBNAIL_MODE) {
  580. rc = msm_vidc_update_buffer_count(inst, INPUT_PORT);
  581. if (rc)
  582. return rc;
  583. }
  584. if (is_meta_ctrl(ctrl->id)) {
  585. if (cap_id == META_DPB_TAG_LIST) {
  586. /*
  587. * To subscribe HFI_PROP_DPB_TAG_LIST
  588. * data in FBD, HFI_PROP_BUFFER_TAG data
  589. * must be delivered via FTB. Hence, update
  590. * META_OUTPUT_BUF_TAG when META_DPB_TAG_LIST
  591. * is updated.
  592. */
  593. msm_vidc_update_cap_value(inst, META_OUTPUT_BUF_TAG,
  594. ctrl->val, __func__);
  595. }
  596. rc = msm_vidc_update_meta_port_settings(inst);
  597. if (rc)
  598. return rc;
  599. }
  600. return 0;
  601. }
  602. /* check if dynamic adjustment is allowed */
  603. if (inst->vb2q[OUTPUT_PORT].streaming &&
  604. !(capability->cap[cap_id].flags & CAP_FLAG_DYNAMIC_ALLOWED)) {
  605. i_vpr_e(inst,
  606. "%s: dynamic setting of cap[%d] %s is not allowed\n",
  607. __func__, cap_id, cap_name(cap_id));
  608. return -EBUSY;
  609. }
  610. rc = msm_vidc_adjust_dynamic_property(inst, cap_id, ctrl);
  611. if (rc)
  612. goto exit;
  613. /* adjust all children if any */
  614. list_for_each_entry_safe(curr_node, tmp_node,
  615. &inst->children.list, list) {
  616. rc = msm_vidc_adjust_dynamic_property(
  617. inst, curr_node->cap_id, NULL);
  618. if (rc)
  619. goto exit;
  620. list_del(&curr_node->list);
  621. kfree(curr_node);
  622. }
  623. /* dynamic controls with request will be set along with qbuf */
  624. if (inst->request)
  625. return 0;
  626. /* Dynamic set control ASAP */
  627. rc = msm_vidc_set_v4l2_properties(inst);
  628. if (rc) {
  629. i_vpr_e(inst, "%s: setting %s failed\n",
  630. __func__, ctrl->name);
  631. goto exit;
  632. }
  633. exit:
  634. return rc;
  635. }
  636. int msm_vidc_adjust_entropy_mode(void *instance, struct v4l2_ctrl *ctrl)
  637. {
  638. struct msm_vidc_inst_capability *capability;
  639. s32 adjusted_value;
  640. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  641. s32 profile = -1;
  642. if (!inst || !inst->capabilities) {
  643. d_vpr_e("%s: invalid params\n", __func__);
  644. return -EINVAL;
  645. }
  646. capability = inst->capabilities;
  647. /* ctrl is always NULL in streamon case */
  648. adjusted_value = ctrl ? ctrl->val :
  649. capability->cap[ENTROPY_MODE].value;
  650. if (inst->codec != MSM_VIDC_H264) {
  651. i_vpr_e(inst,
  652. "%s: incorrect entry in database. fix the database\n",
  653. __func__);
  654. return 0;
  655. }
  656. if (msm_vidc_get_parent_value(inst, ENTROPY_MODE,
  657. PROFILE, &profile, __func__))
  658. return -EINVAL;
  659. if (profile == V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE ||
  660. profile == V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE)
  661. adjusted_value = V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC;
  662. msm_vidc_update_cap_value(inst, ENTROPY_MODE,
  663. adjusted_value, __func__);
  664. return 0;
  665. }
  666. int msm_vidc_adjust_bitrate_mode(void *instance, struct v4l2_ctrl *ctrl)
  667. {
  668. struct msm_vidc_inst_capability *capability;
  669. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  670. int lossless, frame_rc, bitrate_mode, frame_skip;
  671. u32 hfi_value = 0;
  672. if (!inst || !inst->capabilities) {
  673. d_vpr_e("%s: invalid params\n", __func__);
  674. return -EINVAL;
  675. }
  676. capability = inst->capabilities;
  677. bitrate_mode = capability->cap[BITRATE_MODE].value;
  678. lossless = capability->cap[LOSSLESS].value;
  679. frame_rc = capability->cap[FRAME_RC_ENABLE].value;
  680. frame_skip = capability->cap[FRAME_SKIP_MODE].value;
  681. if (lossless) {
  682. hfi_value = HFI_RC_LOSSLESS;
  683. goto update;
  684. }
  685. if (!frame_rc && !is_image_session(inst)) {
  686. hfi_value = HFI_RC_OFF;
  687. goto update;
  688. }
  689. if (bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_VBR) {
  690. hfi_value = HFI_RC_VBR_CFR;
  691. } else if (bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_CBR) {
  692. if (frame_skip)
  693. hfi_value = HFI_RC_CBR_VFR;
  694. else
  695. hfi_value = HFI_RC_CBR_CFR;
  696. } else if (bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_CQ) {
  697. hfi_value = HFI_RC_CQ;
  698. }
  699. update:
  700. inst->hfi_rc_type = hfi_value;
  701. i_vpr_h(inst, "%s: hfi rc type: %#x\n",
  702. __func__, inst->hfi_rc_type);
  703. return 0;
  704. }
  705. int msm_vidc_adjust_profile(void *instance, struct v4l2_ctrl *ctrl)
  706. {
  707. struct msm_vidc_inst_capability *capability;
  708. s32 adjusted_value;
  709. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  710. s32 pix_fmt = -1;
  711. if (!inst || !inst->capabilities) {
  712. d_vpr_e("%s: invalid params\n", __func__);
  713. return -EINVAL;
  714. }
  715. capability = inst->capabilities;
  716. adjusted_value = ctrl ? ctrl->val : capability->cap[PROFILE].value;
  717. /* PIX_FMTS dependency is common across all chipsets.
  718. * Hence, PIX_FMTS must be specified as Parent for HEVC profile.
  719. * Otherwise it would be a database error that should be fixed.
  720. */
  721. if (msm_vidc_get_parent_value(inst, PROFILE, PIX_FMTS,
  722. &pix_fmt, __func__))
  723. return -EINVAL;
  724. /* 10 bit profile for 10 bit color format */
  725. if (pix_fmt == MSM_VIDC_FMT_TP10C ||
  726. pix_fmt == MSM_VIDC_FMT_P010) {
  727. adjusted_value = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_10;
  728. } else {
  729. /* 8 bit profile for 8 bit color format */
  730. if (adjusted_value == V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_10) {
  731. if (is_image_session(inst))
  732. adjusted_value = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_STILL_PICTURE;
  733. else
  734. adjusted_value = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN;
  735. }
  736. }
  737. msm_vidc_update_cap_value(inst, PROFILE,
  738. adjusted_value, __func__);
  739. return 0;
  740. }
  741. int msm_vidc_adjust_ltr_count(void *instance, struct v4l2_ctrl *ctrl)
  742. {
  743. struct msm_vidc_inst_capability *capability;
  744. s32 adjusted_value;
  745. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  746. s32 rc_type = -1;
  747. if (!inst || !inst->capabilities) {
  748. d_vpr_e("%s: invalid params\n", __func__);
  749. return -EINVAL;
  750. }
  751. capability = inst->capabilities;
  752. adjusted_value = ctrl ? ctrl->val : capability->cap[LTR_COUNT].value;
  753. if (msm_vidc_get_parent_value(inst, LTR_COUNT, BITRATE_MODE,
  754. &rc_type, __func__))
  755. return -EINVAL;
  756. if (rc_type != HFI_RC_OFF &&
  757. rc_type != HFI_RC_CBR_CFR &&
  758. rc_type != HFI_RC_CBR_VFR)
  759. adjusted_value = 0;
  760. msm_vidc_update_cap_value(inst, LTR_COUNT,
  761. adjusted_value, __func__);
  762. return 0;
  763. }
  764. int msm_vidc_adjust_use_ltr(void *instance, struct v4l2_ctrl *ctrl)
  765. {
  766. struct msm_vidc_inst_capability *capability;
  767. s32 adjusted_value;
  768. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  769. s32 ltr_count = -1;
  770. if (!inst || !inst->capabilities) {
  771. d_vpr_e("%s: invalid params\n", __func__);
  772. return -EINVAL;
  773. }
  774. capability = inst->capabilities;
  775. adjusted_value = ctrl ? ctrl->val : capability->cap[USE_LTR].value;
  776. if (msm_vidc_get_parent_value(inst, USE_LTR, LTR_COUNT,
  777. &ltr_count, __func__))
  778. return -EINVAL;
  779. if (!ltr_count) {
  780. adjusted_value = 0;
  781. } else if (adjusted_value <= 0 ||
  782. adjusted_value >= (1 << ltr_count)) {
  783. /* USE_LTR value should be > 0 and < (2 ^ LTR_COUNT) */
  784. i_vpr_e(inst, "%s: invalid value %d\n",
  785. __func__, adjusted_value);
  786. return -EINVAL;
  787. }
  788. /* USE_LTR value is a bitmask value */
  789. msm_vidc_update_cap_value(inst, USE_LTR,
  790. adjusted_value, __func__);
  791. return 0;
  792. }
  793. int msm_vidc_adjust_mark_ltr(void *instance, struct v4l2_ctrl *ctrl)
  794. {
  795. struct msm_vidc_inst_capability *capability;
  796. s32 adjusted_value;
  797. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  798. s32 ltr_count = -1;
  799. if (!inst || !inst->capabilities) {
  800. d_vpr_e("%s: invalid params\n", __func__);
  801. return -EINVAL;
  802. }
  803. capability = inst->capabilities;
  804. adjusted_value = ctrl ? ctrl->val : capability->cap[MARK_LTR].value;
  805. if (msm_vidc_get_parent_value(inst, MARK_LTR, LTR_COUNT,
  806. &ltr_count, __func__))
  807. return -EINVAL;
  808. if (!ltr_count) {
  809. adjusted_value = 0;
  810. } else if (adjusted_value < 0 ||
  811. adjusted_value > (ltr_count - 1)) {
  812. /* MARK_LTR value should be > 0 and <= (LTR_COUNT - 1) */
  813. i_vpr_e(inst, "%s: invalid value %d\n",
  814. __func__, adjusted_value);
  815. return -EINVAL;
  816. }
  817. msm_vidc_update_cap_value(inst, MARK_LTR,
  818. adjusted_value, __func__);
  819. return 0;
  820. }
  821. int msm_vidc_adjust_ir_random(void *instance, struct v4l2_ctrl *ctrl)
  822. {
  823. struct msm_vidc_inst_capability *capability;
  824. s32 adjusted_value;
  825. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  826. if (!inst || !inst->capabilities) {
  827. d_vpr_e("%s: invalid params\n", __func__);
  828. return -EINVAL;
  829. }
  830. capability = inst->capabilities;
  831. adjusted_value = ctrl ? ctrl->val : capability->cap[IR_RANDOM].value;
  832. /*
  833. * BITRATE_MODE dependency is NOT common across all chipsets.
  834. * Hence, do not return error if not specified as one of the parent.
  835. */
  836. if (is_parent_available(inst, IR_RANDOM, BITRATE_MODE) &&
  837. inst->hfi_rc_type != HFI_RC_CBR_CFR &&
  838. inst->hfi_rc_type != HFI_RC_CBR_VFR)
  839. adjusted_value = 0;
  840. msm_vidc_update_cap_value(inst, IR_RANDOM,
  841. adjusted_value, __func__);
  842. return 0;
  843. }
  844. int msm_vidc_adjust_delta_based_rc(void *instance, struct v4l2_ctrl *ctrl)
  845. {
  846. struct msm_vidc_inst_capability *capability;
  847. s32 adjusted_value;
  848. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  849. s32 rc_type = -1;
  850. if (!inst || !inst->capabilities) {
  851. d_vpr_e("%s: invalid params\n", __func__);
  852. return -EINVAL;
  853. }
  854. capability = inst->capabilities;
  855. adjusted_value = ctrl ? ctrl->val :
  856. capability->cap[TIME_DELTA_BASED_RC].value;
  857. if (msm_vidc_get_parent_value(inst, TIME_DELTA_BASED_RC,
  858. BITRATE_MODE, &rc_type, __func__))
  859. return -EINVAL;
  860. if (rc_type == HFI_RC_OFF ||
  861. rc_type == HFI_RC_CQ)
  862. adjusted_value = 0;
  863. msm_vidc_update_cap_value(inst, TIME_DELTA_BASED_RC,
  864. adjusted_value, __func__);
  865. return 0;
  866. }
  867. int msm_vidc_adjust_transform_8x8(void *instance, struct v4l2_ctrl *ctrl)
  868. {
  869. struct msm_vidc_inst_capability *capability;
  870. s32 adjusted_value;
  871. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  872. s32 profile = -1;
  873. if (!inst || !inst->capabilities) {
  874. d_vpr_e("%s: invalid params\n", __func__);
  875. return -EINVAL;
  876. }
  877. capability = inst->capabilities;
  878. adjusted_value = ctrl ? ctrl->val :
  879. capability->cap[TRANSFORM_8X8].value;
  880. if (inst->codec != MSM_VIDC_H264) {
  881. i_vpr_e(inst,
  882. "%s: incorrect entry in database. fix the database\n",
  883. __func__);
  884. return 0;
  885. }
  886. if (msm_vidc_get_parent_value(inst, TRANSFORM_8X8,
  887. PROFILE, &profile, __func__))
  888. return -EINVAL;
  889. if (profile != V4L2_MPEG_VIDEO_H264_PROFILE_HIGH &&
  890. profile != V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_HIGH)
  891. adjusted_value = V4L2_MPEG_MSM_VIDC_DISABLE;
  892. msm_vidc_update_cap_value(inst, TRANSFORM_8X8,
  893. adjusted_value, __func__);
  894. return 0;
  895. }
  896. static int msm_vidc_adjust_static_layer_count_and_type(struct msm_vidc_inst *inst,
  897. s32 layer_count)
  898. {
  899. bool hb_requested = false;
  900. if (!inst || !inst->capabilities) {
  901. d_vpr_e("%s: invalid params\n", __func__);
  902. return -EINVAL;
  903. }
  904. if (!layer_count) {
  905. i_vpr_h(inst, "client not enabled layer encoding\n");
  906. goto exit;
  907. }
  908. if (inst->hfi_rc_type == HFI_RC_CQ) {
  909. i_vpr_h(inst, "rc type is CQ, disabling layer encoding\n");
  910. layer_count = 0;
  911. goto exit;
  912. }
  913. if (inst->codec == MSM_VIDC_H264) {
  914. if (!inst->capabilities->cap[LAYER_ENABLE].value) {
  915. layer_count = 0;
  916. goto exit;
  917. }
  918. hb_requested = (inst->capabilities->cap[LAYER_TYPE].value ==
  919. V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_B) ?
  920. true : false;
  921. } else if (inst->codec == MSM_VIDC_HEVC) {
  922. hb_requested = (inst->capabilities->cap[LAYER_TYPE].value ==
  923. V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_B) ?
  924. true : false;
  925. }
  926. if (hb_requested && inst->hfi_rc_type != HFI_RC_VBR_CFR) {
  927. i_vpr_h(inst,
  928. "%s: HB layer encoding is supported for VBR rc only\n",
  929. __func__);
  930. layer_count = 0;
  931. goto exit;
  932. }
  933. /* decide hfi layer type */
  934. if (hb_requested) {
  935. inst->hfi_layer_type = HFI_HIER_B;
  936. } else {
  937. /* HP requested */
  938. inst->hfi_layer_type = HFI_HIER_P_SLIDING_WINDOW;
  939. if (inst->codec == MSM_VIDC_H264 &&
  940. inst->hfi_rc_type == HFI_RC_VBR_CFR)
  941. inst->hfi_layer_type = HFI_HIER_P_HYBRID_LTR;
  942. }
  943. /* sanitize layer count based on layer type and codec */
  944. if (inst->hfi_layer_type == HFI_HIER_B) {
  945. if (layer_count > MAX_ENH_LAYER_HB)
  946. layer_count = MAX_ENH_LAYER_HB;
  947. } else if (inst->hfi_layer_type == HFI_HIER_P_HYBRID_LTR) {
  948. if (layer_count > MAX_AVC_ENH_LAYER_HYBRID_HP)
  949. layer_count = MAX_AVC_ENH_LAYER_HYBRID_HP;
  950. } else if (inst->hfi_layer_type == HFI_HIER_P_SLIDING_WINDOW) {
  951. if (inst->codec == MSM_VIDC_H264) {
  952. if (layer_count > MAX_AVC_ENH_LAYER_SLIDING_WINDOW)
  953. layer_count = MAX_AVC_ENH_LAYER_SLIDING_WINDOW;
  954. } else {
  955. if (layer_count > MAX_HEVC_ENH_LAYER_SLIDING_WINDOW)
  956. layer_count = MAX_HEVC_ENH_LAYER_SLIDING_WINDOW;
  957. }
  958. }
  959. exit:
  960. msm_vidc_update_cap_value(inst, ENH_LAYER_COUNT,
  961. layer_count, __func__);
  962. inst->capabilities->cap[ENH_LAYER_COUNT].max = layer_count;
  963. return 0;
  964. }
  965. int msm_vidc_adjust_layer_count(void *instance, struct v4l2_ctrl *ctrl)
  966. {
  967. int rc = 0;
  968. struct msm_vidc_inst_capability *capability;
  969. s32 client_layer_count;
  970. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  971. if (!inst || !inst->capabilities) {
  972. d_vpr_e("%s: invalid params\n", __func__);
  973. return -EINVAL;
  974. }
  975. capability = inst->capabilities;
  976. client_layer_count = ctrl ? ctrl->val :
  977. capability->cap[ENH_LAYER_COUNT].value;
  978. if (!is_parent_available(inst, ENH_LAYER_COUNT, BITRATE_MODE)) {
  979. i_vpr_e(inst, "%s: missing parent %d in database",
  980. __func__, BITRATE_MODE);
  981. return -EINVAL;
  982. }
  983. if (!inst->vb2q[OUTPUT_PORT].streaming) {
  984. rc = msm_vidc_adjust_static_layer_count_and_type(inst,
  985. client_layer_count);
  986. if (rc)
  987. goto exit;
  988. } else {
  989. if (inst->hfi_layer_type == HFI_HIER_P_HYBRID_LTR ||
  990. inst->hfi_layer_type == HFI_HIER_P_SLIDING_WINDOW) {
  991. /* dynamic layer count change is only supported for HP */
  992. if (client_layer_count >
  993. inst->capabilities->cap[ENH_LAYER_COUNT].max)
  994. client_layer_count =
  995. inst->capabilities->cap[ENH_LAYER_COUNT].max;
  996. msm_vidc_update_cap_value(inst, ENH_LAYER_COUNT,
  997. client_layer_count, __func__);
  998. }
  999. }
  1000. exit:
  1001. return rc;
  1002. }
  1003. /*
  1004. * 1. GOP calibration is only done for HP layer encoding type.
  1005. * 2. Dynamic GOP size should not exceed static GOP size
  1006. * 3. For HB case, or when layer encoding is not enabled,
  1007. * client set GOP size is directly set to FW.
  1008. */
  1009. int msm_vidc_adjust_gop_size(void *instance, struct v4l2_ctrl *ctrl)
  1010. {
  1011. struct msm_vidc_inst_capability *capability;
  1012. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  1013. s32 adjusted_value, enh_layer_count = -1;
  1014. if (!inst || !inst->capabilities) {
  1015. d_vpr_e("%s: invalid params\n", __func__);
  1016. return -EINVAL;
  1017. }
  1018. capability = inst->capabilities;
  1019. adjusted_value = ctrl ? ctrl->val : capability->cap[GOP_SIZE].value;
  1020. if (msm_vidc_get_parent_value(inst, GOP_SIZE,
  1021. ENH_LAYER_COUNT, &enh_layer_count, __func__))
  1022. return -EINVAL;
  1023. if (!enh_layer_count)
  1024. goto exit;
  1025. /* calibrate GOP size */
  1026. if (inst->hfi_layer_type == HFI_HIER_P_SLIDING_WINDOW ||
  1027. inst->hfi_layer_type == HFI_HIER_P_HYBRID_LTR) {
  1028. /*
  1029. * Layer encoding needs GOP size to be multiple of subgop size
  1030. * And subgop size is 2 ^ number of enhancement layers.
  1031. */
  1032. u32 min_gop_size;
  1033. u32 num_subgops;
  1034. /* v4l2 layer count is the number of enhancement layers */
  1035. min_gop_size = 1 << enh_layer_count;
  1036. num_subgops = (adjusted_value + (min_gop_size >> 1)) /
  1037. min_gop_size;
  1038. if (num_subgops)
  1039. adjusted_value = num_subgops * min_gop_size;
  1040. else
  1041. adjusted_value = min_gop_size;
  1042. }
  1043. exit:
  1044. msm_vidc_update_cap_value(inst, GOP_SIZE, adjusted_value, __func__);
  1045. return 0;
  1046. }
  1047. int msm_vidc_adjust_b_frame(void *instance, struct v4l2_ctrl *ctrl)
  1048. {
  1049. struct msm_vidc_inst_capability *capability;
  1050. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  1051. s32 adjusted_value, enh_layer_count = -1;
  1052. const u32 max_bframe_size = 7;
  1053. if (!inst || !inst->capabilities) {
  1054. d_vpr_e("%s: invalid params\n", __func__);
  1055. return -EINVAL;
  1056. }
  1057. capability = inst->capabilities;
  1058. if (inst->vb2q[OUTPUT_PORT].streaming)
  1059. return 0;
  1060. adjusted_value = ctrl ? ctrl->val : capability->cap[B_FRAME].value;
  1061. if (msm_vidc_get_parent_value(inst, B_FRAME,
  1062. ENH_LAYER_COUNT, &enh_layer_count, __func__))
  1063. return -EINVAL;
  1064. if (!enh_layer_count || inst->hfi_layer_type != HFI_HIER_B) {
  1065. adjusted_value = 0;
  1066. goto exit;
  1067. }
  1068. adjusted_value = (2 << enh_layer_count) - 1;
  1069. /* Allowed Bframe values are 0, 1, 3, 7 */
  1070. if (adjusted_value > max_bframe_size)
  1071. adjusted_value = max_bframe_size;
  1072. exit:
  1073. msm_vidc_update_cap_value(inst, B_FRAME, adjusted_value, __func__);
  1074. return 0;
  1075. }
  1076. int msm_vidc_adjust_bitrate(void *instance, struct v4l2_ctrl *ctrl)
  1077. {
  1078. int i;
  1079. struct msm_vidc_inst_capability *capability;
  1080. s32 adjusted_value;
  1081. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  1082. s32 rc_type = -1, enh_layer_count = -1;
  1083. u32 cap_id = 0, cumulative_bitrate = 0;
  1084. bool layer_bitrate_set = false;
  1085. u32 layer_br_caps[6] = {L0_BR, L1_BR, L2_BR, L3_BR, L4_BR, L5_BR};
  1086. if (!inst || !inst->capabilities) {
  1087. d_vpr_e("%s: invalid params\n", __func__);
  1088. return -EINVAL;
  1089. }
  1090. capability = inst->capabilities;
  1091. adjusted_value = ctrl ? ctrl->val :
  1092. capability->cap[BIT_RATE].value;
  1093. /* ignore layer bitrate when total bitrate is set */
  1094. if (capability->cap[BIT_RATE].flags & CAP_FLAG_CLIENT_SET)
  1095. goto exit;
  1096. if (msm_vidc_get_parent_value(inst, BIT_RATE,
  1097. ENH_LAYER_COUNT, &enh_layer_count, __func__))
  1098. return -EINVAL;
  1099. if (msm_vidc_get_parent_value(inst, BIT_RATE,
  1100. BITRATE_MODE, &rc_type, __func__))
  1101. return -EINVAL;
  1102. /*
  1103. * ENH_LAYER_COUNT cap max is positive only if
  1104. * layer encoding is enabled for static setting
  1105. */
  1106. if (capability->cap[ENH_LAYER_COUNT].max) {
  1107. layer_bitrate_set = true;
  1108. for (i = 0; i <= enh_layer_count; i++) {
  1109. if (i >= ARRAY_SIZE(layer_br_caps))
  1110. break;
  1111. cap_id = layer_br_caps[i];
  1112. if (!(capability->cap[cap_id].flags & CAP_FLAG_CLIENT_SET)) {
  1113. layer_bitrate_set = false;
  1114. break;
  1115. }
  1116. cumulative_bitrate += capability->cap[cap_id].value;
  1117. }
  1118. /* layer bitrate supported only for CBR rc */
  1119. if (layer_bitrate_set &&
  1120. (rc_type == HFI_RC_CBR_CFR || rc_type == HFI_RC_CBR_VFR)) {
  1121. if (cumulative_bitrate > capability->cap[BIT_RATE].max)
  1122. cumulative_bitrate =
  1123. capability->cap[BIT_RATE].max;
  1124. adjusted_value = cumulative_bitrate;
  1125. i_vpr_h(inst,
  1126. "%s: update BIT_RATE with cumulative bitrate\n",
  1127. __func__);
  1128. }
  1129. } else {
  1130. for (i = 0; i < sizeof(layer_br_caps) / sizeof(u32); i++) {
  1131. if (i >= ARRAY_SIZE(layer_br_caps))
  1132. break;
  1133. cap_id = layer_br_caps[i];
  1134. /*
  1135. * layer bitrate cannot be set
  1136. * when layer encoding is disabled
  1137. */
  1138. if (capability->cap[cap_id].flags &
  1139. CAP_FLAG_CLIENT_SET) {
  1140. i_vpr_e(inst,
  1141. "%s: invalid layer bitrate set\n",
  1142. __func__);
  1143. return -EINVAL;
  1144. }
  1145. }
  1146. }
  1147. exit:
  1148. msm_vidc_update_cap_value(inst, BIT_RATE,
  1149. adjusted_value, __func__);
  1150. return 0;
  1151. }
  1152. int msm_vidc_adjust_peak_bitrate(void *instance, struct v4l2_ctrl *ctrl)
  1153. {
  1154. struct msm_vidc_inst_capability *capability;
  1155. s32 adjusted_value;
  1156. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  1157. s32 rc_type = -1, bitrate = -1;
  1158. if (!inst || !inst->capabilities) {
  1159. d_vpr_e("%s: invalid params\n", __func__);
  1160. return -EINVAL;
  1161. }
  1162. capability = inst->capabilities;
  1163. adjusted_value = ctrl ? ctrl->val :
  1164. capability->cap[PEAK_BITRATE].value;
  1165. if (msm_vidc_get_parent_value(inst, PEAK_BITRATE,
  1166. BITRATE_MODE, &rc_type, __func__))
  1167. return -EINVAL;
  1168. if (rc_type != HFI_RC_CBR_CFR &&
  1169. rc_type != HFI_RC_CBR_VFR)
  1170. return 0;
  1171. if (msm_vidc_get_parent_value(inst, PEAK_BITRATE,
  1172. BIT_RATE, &bitrate, __func__))
  1173. return -EINVAL;
  1174. /* Peak Bitrate should be larger than or equal to avg bitrate */
  1175. if (capability->cap[PEAK_BITRATE].flags & CAP_FLAG_CLIENT_SET) {
  1176. if (adjusted_value < bitrate)
  1177. adjusted_value = bitrate;
  1178. } else {
  1179. adjusted_value = capability->cap[BIT_RATE].value +
  1180. (capability->cap[BIT_RATE].value /
  1181. PERCENT_PEAK_BITRATE_INCREASED);
  1182. }
  1183. msm_vidc_update_cap_value(inst, PEAK_BITRATE,
  1184. adjusted_value, __func__);
  1185. return 0;
  1186. }
  1187. int msm_vidc_adjust_hevc_min_qp(void *instance, struct v4l2_ctrl *ctrl)
  1188. {
  1189. int rc = 0;
  1190. struct msm_vidc_inst_capability *capability;
  1191. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  1192. if (!inst || !inst->capabilities) {
  1193. d_vpr_e("%s: invalid params\n", __func__);
  1194. return -EINVAL;
  1195. }
  1196. capability = inst->capabilities;
  1197. if (ctrl)
  1198. msm_vidc_update_cap_value(inst, MIN_FRAME_QP,
  1199. ctrl->val, __func__);
  1200. rc = msm_vidc_adjust_hevc_qp(inst, MIN_FRAME_QP);
  1201. return rc;
  1202. }
  1203. int msm_vidc_adjust_hevc_max_qp(void *instance, struct v4l2_ctrl *ctrl)
  1204. {
  1205. int rc = 0;
  1206. struct msm_vidc_inst_capability *capability;
  1207. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  1208. if (!inst || !inst->capabilities) {
  1209. d_vpr_e("%s: invalid params\n", __func__);
  1210. return -EINVAL;
  1211. }
  1212. capability = inst->capabilities;
  1213. if (ctrl)
  1214. msm_vidc_update_cap_value(inst, MAX_FRAME_QP,
  1215. ctrl->val, __func__);
  1216. rc = msm_vidc_adjust_hevc_qp(inst, MAX_FRAME_QP);
  1217. return rc;
  1218. }
  1219. int msm_vidc_adjust_hevc_frame_qp(void *instance, struct v4l2_ctrl *ctrl)
  1220. {
  1221. int rc = 0;
  1222. struct msm_vidc_inst_capability *capability;
  1223. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  1224. if (!inst || !inst->capabilities) {
  1225. d_vpr_e("%s: invalid params\n", __func__);
  1226. return -EINVAL;
  1227. }
  1228. capability = inst->capabilities;
  1229. if (ctrl)
  1230. msm_vidc_update_cap_value(inst, I_FRAME_QP,
  1231. ctrl->val, __func__);
  1232. rc = msm_vidc_adjust_hevc_qp(inst, I_FRAME_QP);
  1233. return rc;
  1234. }
  1235. int msm_vidc_adjust_session_priority(void *instance, struct v4l2_ctrl *ctrl)
  1236. {
  1237. int rc = 0;
  1238. int adjusted_value;
  1239. bool rate_by_client = false;
  1240. struct msm_vidc_inst_capability *capability;
  1241. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  1242. if (!inst || !inst->capabilities) {
  1243. d_vpr_e("%s: invalid params\n", __func__);
  1244. return -EINVAL;
  1245. }
  1246. capability = inst->capabilities;
  1247. adjusted_value = ctrl ? ctrl->val :
  1248. capability->cap[PRIORITY].value;
  1249. if (capability->cap[FRAME_RATE].flags & CAP_FLAG_CLIENT_SET ||
  1250. capability->cap[OPERATING_RATE].flags & CAP_FLAG_CLIENT_SET)
  1251. rate_by_client = true;
  1252. /*
  1253. * For RT, check for resource feasability if rate is set by client.
  1254. * For RT, move to NRT, if rate is not set by client.
  1255. * For NRT, sessions with rate set by client takes higher order
  1256. * among NRT sessions. They are constraint RT or low priority RT.
  1257. */
  1258. if (adjusted_value == 0 && rate_by_client) {
  1259. rc = msm_vidc_check_mbps_supported(inst);
  1260. if (rc) {
  1261. d_vpr_e("%s: priority 0 not feasible due to resource\n", __func__);
  1262. return rc;
  1263. }
  1264. }
  1265. if (adjusted_value == 0 && !rate_by_client) {
  1266. adjusted_value = 1;
  1267. inst->priority_level = MSM_VIDC_PRIORITY_LOW;
  1268. }
  1269. if (adjusted_value > 0 && rate_by_client)
  1270. inst->priority_level = MSM_VIDC_PRIORITY_HIGH;
  1271. msm_vidc_update_cap_value(inst, PRIORITY, adjusted_value, __func__);
  1272. return rc;
  1273. }
  1274. /*
  1275. * Loop over instance capabilities with CAP_FLAG_ROOT
  1276. * and call adjust function, where
  1277. * - adjust current capability value
  1278. * - update tail of instance children list with capability children
  1279. * - update instance firmware list with current capability id
  1280. * Now, loop over child list and call its adjust function
  1281. */
  1282. int msm_vidc_adjust_v4l2_properties(struct msm_vidc_inst *inst)
  1283. {
  1284. int rc = 0;
  1285. int i;
  1286. struct msm_vidc_inst_cap_entry *curr_node = NULL, *tmp_node = NULL;
  1287. struct msm_vidc_inst_capability *capability;
  1288. if (!inst || !inst->capabilities) {
  1289. d_vpr_e("%s: invalid params\n", __func__);
  1290. return -EINVAL;
  1291. }
  1292. capability = inst->capabilities;
  1293. i_vpr_h(inst, "%s()\n", __func__);
  1294. for (i = 0; i < INST_CAP_MAX; i++) {
  1295. if (capability->cap[i].flags & CAP_FLAG_ROOT) {
  1296. rc = msm_vidc_adjust_property(inst,
  1297. capability->cap[i].cap);
  1298. if (rc)
  1299. goto exit;
  1300. }
  1301. }
  1302. /*
  1303. * children of all root controls are already
  1304. * added to inst->children list at this point
  1305. */
  1306. list_for_each_entry_safe(curr_node, tmp_node,
  1307. &inst->children.list, list) {
  1308. /*
  1309. * call adjust for each child. Each child adjust
  1310. * will also update child list at the tail with
  1311. * its own children list.
  1312. * Also, if current control id value is updated,
  1313. * its entry should be added to fw list.
  1314. */
  1315. rc = msm_vidc_adjust_property(inst, curr_node->cap_id);
  1316. if (rc)
  1317. goto exit;
  1318. list_del(&curr_node->list);
  1319. kfree(curr_node);
  1320. }
  1321. exit:
  1322. return rc;
  1323. }
  1324. int msm_vidc_set_header_mode(void *instance,
  1325. enum msm_vidc_inst_capability_type cap_id)
  1326. {
  1327. int rc = 0;
  1328. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  1329. int header_mode, prepend_sps_pps, hdr_metadata;
  1330. u32 hfi_value = 0;
  1331. struct msm_vidc_inst_capability *capability;
  1332. if (!inst || !inst->capabilities) {
  1333. d_vpr_e("%s: invalid params\n", __func__);
  1334. return -EINVAL;
  1335. }
  1336. capability = inst->capabilities;
  1337. header_mode = capability->cap[cap_id].value;
  1338. prepend_sps_pps = capability->cap[PREPEND_SPSPPS_TO_IDR].value;
  1339. hdr_metadata = capability->cap[META_SEQ_HDR_NAL].value;
  1340. /* prioritize PREPEND_SPSPPS_TO_IDR mode over other header modes */
  1341. if (prepend_sps_pps)
  1342. hfi_value = HFI_SEQ_HEADER_PREFIX_WITH_SYNC_FRAME;
  1343. else if (header_mode == V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME)
  1344. hfi_value = HFI_SEQ_HEADER_JOINED_WITH_1ST_FRAME;
  1345. else
  1346. hfi_value = HFI_SEQ_HEADER_SEPERATE_FRAME;
  1347. if (hdr_metadata)
  1348. hfi_value |= HFI_SEQ_HEADER_METADATA;
  1349. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32_ENUM,
  1350. &hfi_value, sizeof(u32), __func__);
  1351. if (rc)
  1352. return rc;
  1353. return rc;
  1354. }
  1355. int msm_vidc_set_deblock_mode(void *instance,
  1356. enum msm_vidc_inst_capability_type cap_id)
  1357. {
  1358. int rc = 0;
  1359. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  1360. s32 alpha = 0, beta = 0;
  1361. u32 lf_mode, hfi_value = 0, lf_offset = 6;
  1362. struct msm_vidc_inst_capability *capability;
  1363. if (!inst || !inst->capabilities) {
  1364. d_vpr_e("%s: invalid params\n", __func__);
  1365. return -EINVAL;
  1366. }
  1367. capability = inst->capabilities;
  1368. rc = msm_vidc_v4l2_to_hfi_enum(inst, LF_MODE, &lf_mode);
  1369. if (rc)
  1370. return -EINVAL;
  1371. beta = inst->capabilities->cap[LF_BETA].value + lf_offset;
  1372. alpha = inst->capabilities->cap[LF_ALPHA].value + lf_offset;
  1373. hfi_value = (alpha << 16) | (beta << 8) | lf_mode;
  1374. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_32_PACKED,
  1375. &hfi_value, sizeof(u32), __func__);
  1376. if (rc)
  1377. return rc;
  1378. return rc;
  1379. }
  1380. int msm_vidc_set_constant_quality(void *instance,
  1381. enum msm_vidc_inst_capability_type cap_id)
  1382. {
  1383. int rc = 0;
  1384. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  1385. u32 hfi_value = 0;
  1386. s32 rc_type = -1;
  1387. if (!inst || !inst->capabilities) {
  1388. d_vpr_e("%s: invalid params\n", __func__);
  1389. return -EINVAL;
  1390. }
  1391. if (msm_vidc_get_parent_value(inst, cap_id,
  1392. BITRATE_MODE, &rc_type, __func__))
  1393. return -EINVAL;
  1394. if (rc_type != HFI_RC_CQ)
  1395. return 0;
  1396. hfi_value = inst->capabilities->cap[cap_id].value;
  1397. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32,
  1398. &hfi_value, sizeof(u32), __func__);
  1399. if (rc)
  1400. return rc;
  1401. return rc;
  1402. }
  1403. int msm_vidc_set_vbr_related_properties(void *instance,
  1404. enum msm_vidc_inst_capability_type cap_id)
  1405. {
  1406. int rc = 0;
  1407. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  1408. u32 hfi_value = 0;
  1409. s32 rc_type = -1;
  1410. if (!inst || !inst->capabilities) {
  1411. d_vpr_e("%s: invalid params\n", __func__);
  1412. return -EINVAL;
  1413. }
  1414. if (msm_vidc_get_parent_value(inst, cap_id,
  1415. BITRATE_MODE, &rc_type, __func__))
  1416. return -EINVAL;
  1417. if (rc_type != HFI_RC_VBR_CFR)
  1418. return 0;
  1419. hfi_value = inst->capabilities->cap[cap_id].value;
  1420. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32,
  1421. &hfi_value, sizeof(u32), __func__);
  1422. if (rc)
  1423. return rc;
  1424. return rc;
  1425. }
  1426. int msm_vidc_set_cbr_related_properties(void *instance,
  1427. enum msm_vidc_inst_capability_type cap_id)
  1428. {
  1429. int rc = 0;
  1430. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  1431. u32 hfi_value = 0;
  1432. s32 rc_type = -1;
  1433. if (!inst || !inst->capabilities) {
  1434. d_vpr_e("%s: invalid params\n", __func__);
  1435. return -EINVAL;
  1436. }
  1437. if (msm_vidc_get_parent_value(inst, cap_id,
  1438. BITRATE_MODE, &rc_type, __func__))
  1439. return -EINVAL;
  1440. if (rc_type != HFI_RC_CBR_VFR &&
  1441. rc_type != HFI_RC_CBR_CFR)
  1442. return 0;
  1443. hfi_value = inst->capabilities->cap[cap_id].value;
  1444. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32,
  1445. &hfi_value, sizeof(u32), __func__);
  1446. if (rc)
  1447. return rc;
  1448. return rc;
  1449. }
  1450. int msm_vidc_set_use_and_mark_ltr(void *instance,
  1451. enum msm_vidc_inst_capability_type cap_id)
  1452. {
  1453. int rc = 0;
  1454. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  1455. u32 hfi_value = 0;
  1456. if (!inst || !inst->capabilities) {
  1457. d_vpr_e("%s: invalid params\n", __func__);
  1458. return -EINVAL;
  1459. }
  1460. if (!inst->capabilities->cap[LTR_COUNT].value) {
  1461. i_vpr_h(inst, "%s: ltr count is 0, cap %s is not set\n",
  1462. __func__, cap_name(cap_id));
  1463. return 0;
  1464. }
  1465. hfi_value = inst->capabilities->cap[cap_id].value;
  1466. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32,
  1467. &hfi_value, sizeof(u32), __func__);
  1468. if (rc)
  1469. return rc;
  1470. return rc;
  1471. }
  1472. int msm_vidc_set_min_qp(void *instance,
  1473. enum msm_vidc_inst_capability_type cap_id)
  1474. {
  1475. int rc = 0;
  1476. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  1477. struct msm_vidc_inst_capability *capability;
  1478. s32 i_frame_qp = 0, p_frame_qp = 0, b_frame_qp = 0, min_qp_enable = 0;
  1479. u32 i_qp_enable = 0, p_qp_enable = 0, b_qp_enable = 0;
  1480. u32 client_qp_enable = 0, hfi_value = 0, offset = 0;
  1481. if (!inst || !inst->capabilities) {
  1482. d_vpr_e("%s: invalid params\n", __func__);
  1483. return -EINVAL;
  1484. }
  1485. capability = inst->capabilities;
  1486. min_qp_enable =
  1487. capability->cap[MIN_FRAME_QP].flags & CAP_FLAG_CLIENT_SET;
  1488. i_qp_enable = min_qp_enable ||
  1489. capability->cap[I_FRAME_MIN_QP].flags & CAP_FLAG_CLIENT_SET;
  1490. p_qp_enable = min_qp_enable ||
  1491. capability->cap[P_FRAME_MIN_QP].flags & CAP_FLAG_CLIENT_SET;
  1492. b_qp_enable = min_qp_enable ||
  1493. capability->cap[B_FRAME_MIN_QP].flags & CAP_FLAG_CLIENT_SET;
  1494. client_qp_enable = i_qp_enable | p_qp_enable << 1 | b_qp_enable << 2;
  1495. if (!client_qp_enable) {
  1496. i_vpr_h(inst,
  1497. "%s: client did not set min qp, cap %s is not set\n",
  1498. __func__, cap_name(cap_id));
  1499. return 0;
  1500. }
  1501. if (is_10bit_colorformat(capability->cap[PIX_FMTS].value))
  1502. offset = 12;
  1503. /*
  1504. * I_FRAME_MIN_QP, P_FRAME_MIN_QP, B_FRAME_MIN_QP,
  1505. * MIN_FRAME_QP caps have default value as MIN_QP_10BIT values.
  1506. * Hence, if client sets either one among MIN_FRAME_QP
  1507. * and (I_FRAME_MIN_QP or P_FRAME_MIN_QP or B_FRAME_MIN_QP),
  1508. * max of both caps will result into client set value.
  1509. */
  1510. i_frame_qp = max(capability->cap[I_FRAME_MIN_QP].value,
  1511. capability->cap[MIN_FRAME_QP].value) + offset;
  1512. p_frame_qp = max(capability->cap[P_FRAME_MIN_QP].value,
  1513. capability->cap[MIN_FRAME_QP].value) + offset;
  1514. b_frame_qp = max(capability->cap[B_FRAME_MIN_QP].value,
  1515. capability->cap[MIN_FRAME_QP].value) + offset;
  1516. hfi_value = i_frame_qp | p_frame_qp << 8 | b_frame_qp << 16 |
  1517. client_qp_enable << 24;
  1518. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_32_PACKED,
  1519. &hfi_value, sizeof(u32), __func__);
  1520. if (rc)
  1521. return rc;
  1522. return rc;
  1523. }
  1524. int msm_vidc_set_max_qp(void *instance,
  1525. enum msm_vidc_inst_capability_type cap_id)
  1526. {
  1527. int rc = 0;
  1528. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  1529. struct msm_vidc_inst_capability *capability;
  1530. s32 i_frame_qp = 0, p_frame_qp = 0, b_frame_qp = 0, max_qp_enable = 0;
  1531. u32 i_qp_enable = 0, p_qp_enable = 0, b_qp_enable = 0;
  1532. u32 client_qp_enable = 0, hfi_value = 0, offset = 0;
  1533. if (!inst || !inst->capabilities) {
  1534. d_vpr_e("%s: invalid params\n", __func__);
  1535. return -EINVAL;
  1536. }
  1537. capability = inst->capabilities;
  1538. max_qp_enable =
  1539. capability->cap[MAX_FRAME_QP].flags & CAP_FLAG_CLIENT_SET;
  1540. i_qp_enable = max_qp_enable ||
  1541. capability->cap[I_FRAME_MAX_QP].flags & CAP_FLAG_CLIENT_SET;
  1542. p_qp_enable = max_qp_enable ||
  1543. capability->cap[P_FRAME_MAX_QP].flags & CAP_FLAG_CLIENT_SET;
  1544. b_qp_enable = max_qp_enable ||
  1545. capability->cap[B_FRAME_MAX_QP].flags & CAP_FLAG_CLIENT_SET;
  1546. client_qp_enable = i_qp_enable | p_qp_enable << 1 | b_qp_enable << 2;
  1547. if (!client_qp_enable) {
  1548. i_vpr_h(inst,
  1549. "%s: client did not set max qp, cap %s is not set\n",
  1550. __func__, cap_name(cap_id));
  1551. return 0;
  1552. }
  1553. if (is_10bit_colorformat(capability->cap[PIX_FMTS].value))
  1554. offset = 12;
  1555. /*
  1556. * I_FRAME_MAX_QP, P_FRAME_MAX_QP, B_FRAME_MAX_QP,
  1557. * MAX_FRAME_QP caps have default value as MAX_QP values.
  1558. * Hence, if client sets either one among MAX_FRAME_QP
  1559. * and (I_FRAME_MAX_QP or P_FRAME_MAX_QP or B_FRAME_MAX_QP),
  1560. * min of both caps will result into client set value.
  1561. */
  1562. i_frame_qp = min(capability->cap[I_FRAME_MAX_QP].value,
  1563. capability->cap[MAX_FRAME_QP].value) + offset;
  1564. p_frame_qp = min(capability->cap[P_FRAME_MAX_QP].value,
  1565. capability->cap[MAX_FRAME_QP].value) + offset;
  1566. b_frame_qp = min(capability->cap[B_FRAME_MAX_QP].value,
  1567. capability->cap[MAX_FRAME_QP].value) + offset;
  1568. hfi_value = i_frame_qp | p_frame_qp << 8 | b_frame_qp << 16 |
  1569. client_qp_enable << 24;
  1570. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_32_PACKED,
  1571. &hfi_value, sizeof(u32), __func__);
  1572. if (rc)
  1573. return rc;
  1574. return rc;
  1575. }
  1576. int msm_vidc_set_frame_qp(void *instance,
  1577. enum msm_vidc_inst_capability_type cap_id)
  1578. {
  1579. int rc = 0;
  1580. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  1581. struct msm_vidc_inst_capability *capab;
  1582. s32 i_frame_qp = 0, p_frame_qp = 0, b_frame_qp = 0;
  1583. u32 i_qp_enable = 0, p_qp_enable = 0, b_qp_enable = 0;
  1584. u32 client_qp_enable = 0, hfi_value = 0, offset = 0;
  1585. s32 rc_type = -1;
  1586. if (!inst || !inst->capabilities) {
  1587. d_vpr_e("%s: invalid params\n", __func__);
  1588. return -EINVAL;
  1589. }
  1590. capab = inst->capabilities;
  1591. if (msm_vidc_get_parent_value(inst, I_FRAME_QP,
  1592. BITRATE_MODE, &rc_type, __func__))
  1593. return -EINVAL;
  1594. if (rc_type == HFI_RC_OFF) {
  1595. /* Mandatorily set for rc off case */
  1596. i_qp_enable = p_qp_enable = b_qp_enable = 1;
  1597. } else {
  1598. /* Set only if client has set for NON rc off case */
  1599. i_qp_enable =
  1600. capab->cap[I_FRAME_QP].flags & CAP_FLAG_CLIENT_SET;
  1601. p_qp_enable =
  1602. capab->cap[P_FRAME_QP].flags & CAP_FLAG_CLIENT_SET;
  1603. b_qp_enable =
  1604. capab->cap[B_FRAME_QP].flags & CAP_FLAG_CLIENT_SET;
  1605. }
  1606. client_qp_enable = i_qp_enable | p_qp_enable << 1 | b_qp_enable << 2;
  1607. if (!client_qp_enable) {
  1608. i_vpr_h(inst,
  1609. "%s: client did not set frame qp, cap %s is not set\n",
  1610. __func__, cap_name(cap_id));
  1611. return 0;
  1612. }
  1613. if (is_10bit_colorformat(capab->cap[PIX_FMTS].value))
  1614. offset = 12;
  1615. i_frame_qp = capab->cap[I_FRAME_QP].value + offset;
  1616. p_frame_qp = capab->cap[P_FRAME_QP].value + offset;
  1617. b_frame_qp = capab->cap[B_FRAME_QP].value + offset;
  1618. hfi_value = i_frame_qp | p_frame_qp << 8 | b_frame_qp << 16 |
  1619. client_qp_enable << 24;
  1620. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_32_PACKED,
  1621. &hfi_value, sizeof(u32), __func__);
  1622. if (rc)
  1623. return rc;
  1624. return rc;
  1625. }
  1626. int msm_vidc_set_req_sync_frame(void *instance,
  1627. enum msm_vidc_inst_capability_type cap_id)
  1628. {
  1629. int rc = 0;
  1630. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  1631. s32 prepend_spspps;
  1632. u32 hfi_value = 0;
  1633. if (!inst || !inst->capabilities) {
  1634. d_vpr_e("%s: invalid params\n", __func__);
  1635. return -EINVAL;
  1636. }
  1637. prepend_spspps = inst->capabilities->cap[PREPEND_SPSPPS_TO_IDR].value;
  1638. if (prepend_spspps)
  1639. hfi_value = HFI_SYNC_FRAME_REQUEST_WITH_PREFIX_SEQ_HDR;
  1640. else
  1641. hfi_value = HFI_SYNC_FRAME_REQUEST_WITHOUT_SEQ_HDR;
  1642. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32_ENUM,
  1643. &hfi_value, sizeof(u32), __func__);
  1644. if (rc)
  1645. return rc;
  1646. return rc;
  1647. }
  1648. int msm_vidc_set_chroma_qp_index_offset(void *instance,
  1649. enum msm_vidc_inst_capability_type cap_id)
  1650. {
  1651. int rc = 0;
  1652. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  1653. u32 hfi_value = 0, chroma_qp_offset_mode = 0, chroma_qp = 0;
  1654. u32 offset = 12;
  1655. if (!inst || !inst->capabilities) {
  1656. d_vpr_e("%s: invalid params\n", __func__);
  1657. return -EINVAL;
  1658. }
  1659. if (inst->capabilities->cap[cap_id].flags & CAP_FLAG_CLIENT_SET)
  1660. chroma_qp_offset_mode = HFI_FIXED_CHROMAQP_OFFSET;
  1661. else
  1662. chroma_qp_offset_mode = HFI_ADAPTIVE_CHROMAQP_OFFSET;
  1663. chroma_qp = inst->capabilities->cap[cap_id].value + offset;
  1664. hfi_value = chroma_qp_offset_mode | chroma_qp << 8 | chroma_qp << 16 ;
  1665. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_32_PACKED,
  1666. &hfi_value, sizeof(u32), __func__);
  1667. if (rc)
  1668. return rc;
  1669. return rc;
  1670. }
  1671. int msm_vidc_set_slice_count(void* instance,
  1672. enum msm_vidc_inst_capability_type cap_id)
  1673. {
  1674. int rc = 0;
  1675. struct msm_vidc_inst* inst = (struct msm_vidc_inst*)instance;
  1676. s32 slice_mode = -1;
  1677. u32 hfi_value = 0, set_cap_id = 0;
  1678. if (!inst || !inst->capabilities) {
  1679. d_vpr_e("%s: invalid params\n", __func__);
  1680. return -EINVAL;
  1681. }
  1682. slice_mode = inst->capabilities->cap[SLICE_MODE].value;
  1683. if (slice_mode == V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE) {
  1684. i_vpr_h(inst, "%s: slice mode is: %u, ignore setting to fw\n",
  1685. __func__, slice_mode);
  1686. return 0;
  1687. }
  1688. if (slice_mode == V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_MB) {
  1689. hfi_value = inst->capabilities->cap[SLICE_MAX_MB].value;
  1690. set_cap_id = SLICE_MAX_MB;
  1691. } else if (slice_mode == V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_BYTES) {
  1692. hfi_value = inst->capabilities->cap[SLICE_MAX_BYTES].value;
  1693. set_cap_id = SLICE_MAX_BYTES;
  1694. }
  1695. rc = msm_vidc_packetize_control(inst, set_cap_id, HFI_PAYLOAD_U32,
  1696. &hfi_value, sizeof(u32), __func__);
  1697. if (rc)
  1698. return rc;
  1699. return rc;
  1700. }
  1701. int msm_vidc_set_nal_length(void* instance,
  1702. enum msm_vidc_inst_capability_type cap_id)
  1703. {
  1704. int rc = 0;
  1705. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  1706. u32 hfi_value = HFI_NAL_LENGTH_STARTCODES;
  1707. if (!inst || !inst->capabilities) {
  1708. d_vpr_e("%s: invalid params\n", __func__);
  1709. return -EINVAL;
  1710. }
  1711. if (!inst->capabilities->cap[WITHOUT_STARTCODE].value) {
  1712. hfi_value = HFI_NAL_LENGTH_STARTCODES;
  1713. } else {
  1714. rc = msm_vidc_v4l2_to_hfi_enum(inst, NAL_LENGTH_FIELD, &hfi_value);
  1715. if (rc)
  1716. return -EINVAL;
  1717. }
  1718. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32_ENUM,
  1719. &hfi_value, sizeof(u32), __func__);
  1720. if (rc)
  1721. return rc;
  1722. return rc;
  1723. }
  1724. int msm_vidc_set_layer_count_and_type(void *instance,
  1725. enum msm_vidc_inst_capability_type cap_id)
  1726. {
  1727. int rc = 0;
  1728. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  1729. u32 hfi_layer_count, hfi_layer_type = 0;
  1730. if (!inst || !inst->capabilities) {
  1731. d_vpr_e("%s: invalid params\n", __func__);
  1732. return -EINVAL;
  1733. }
  1734. if (!inst->vb2q[OUTPUT_PORT].streaming) {
  1735. /* set layer type */
  1736. hfi_layer_type = inst->hfi_layer_type;
  1737. cap_id = LAYER_TYPE;
  1738. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32_ENUM,
  1739. &hfi_layer_type, sizeof(u32), __func__);
  1740. if (rc)
  1741. goto exit;
  1742. } else {
  1743. if (inst->hfi_layer_type == HFI_HIER_B) {
  1744. i_vpr_l(inst,
  1745. "%s: HB dyn layers change is not supported\n",
  1746. __func__);
  1747. return 0;
  1748. }
  1749. }
  1750. /* set layer count */
  1751. cap_id = ENH_LAYER_COUNT;
  1752. /* hfi baselayer starts from 1 */
  1753. hfi_layer_count = inst->capabilities->cap[ENH_LAYER_COUNT].value + 1;
  1754. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32,
  1755. &hfi_layer_count, sizeof(u32), __func__);
  1756. if (rc)
  1757. goto exit;
  1758. exit:
  1759. return rc;
  1760. }
  1761. int msm_vidc_set_gop_size(void *instance,
  1762. enum msm_vidc_inst_capability_type cap_id)
  1763. {
  1764. int rc = 0;
  1765. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  1766. u32 hfi_value;
  1767. if (!inst || !inst->capabilities) {
  1768. d_vpr_e("%s: invalid params\n", __func__);
  1769. return -EINVAL;
  1770. }
  1771. if (inst->vb2q[OUTPUT_PORT].streaming) {
  1772. if (inst->hfi_layer_type == HFI_HIER_B) {
  1773. i_vpr_l(inst,
  1774. "%s: HB dyn GOP setting is not supported\n",
  1775. __func__);
  1776. return 0;
  1777. }
  1778. }
  1779. hfi_value = inst->capabilities->cap[GOP_SIZE].value;
  1780. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32,
  1781. &hfi_value, sizeof(u32), __func__);
  1782. if (rc)
  1783. return rc;
  1784. return rc;
  1785. }
  1786. int msm_vidc_set_bitrate(void *instance,
  1787. enum msm_vidc_inst_capability_type cap_id)
  1788. {
  1789. int rc = 0, i;
  1790. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  1791. u32 hfi_value = 0;
  1792. s32 rc_type = -1, enh_layer_count = -1;
  1793. u32 layer_br_caps[6] = {L0_BR, L1_BR, L2_BR, L3_BR, L4_BR, L5_BR};
  1794. bool layer_bitrate_set = false;
  1795. if (!inst || !inst->capabilities) {
  1796. d_vpr_e("%s: invalid params\n", __func__);
  1797. return -EINVAL;
  1798. }
  1799. /* set Total Bitrate */
  1800. if (inst->capabilities->cap[BIT_RATE].flags & CAP_FLAG_CLIENT_SET)
  1801. goto set_total_bitrate;
  1802. if (msm_vidc_get_parent_value(inst, BIT_RATE,
  1803. ENH_LAYER_COUNT, &enh_layer_count, __func__))
  1804. return -EINVAL;
  1805. if (msm_vidc_get_parent_value(inst, BIT_RATE,
  1806. BITRATE_MODE, &rc_type, __func__))
  1807. return -EINVAL;
  1808. if (inst->capabilities->cap[ENH_LAYER_COUNT].max &&
  1809. (rc_type == HFI_RC_CBR_CFR ||
  1810. rc_type == HFI_RC_CBR_VFR)) {
  1811. layer_bitrate_set = true;
  1812. for (i = 0; i <= enh_layer_count; i++) {
  1813. if (i >= ARRAY_SIZE(layer_br_caps))
  1814. break;
  1815. cap_id = layer_br_caps[i];
  1816. if (!(inst->capabilities->cap[cap_id].flags &
  1817. CAP_FLAG_CLIENT_SET)) {
  1818. layer_bitrate_set = false;
  1819. break;
  1820. }
  1821. }
  1822. if (layer_bitrate_set) {
  1823. /* set Layer Bitrate */
  1824. for (i = 0; i <= enh_layer_count; i++) {
  1825. if (i >= ARRAY_SIZE(layer_br_caps))
  1826. break;
  1827. cap_id = layer_br_caps[i];
  1828. hfi_value = inst->capabilities->cap[cap_id].value;
  1829. rc = msm_vidc_packetize_control(inst, cap_id,
  1830. HFI_PAYLOAD_U32, &hfi_value,
  1831. sizeof(u32), __func__);
  1832. if (rc)
  1833. return rc;
  1834. }
  1835. goto exit;
  1836. }
  1837. }
  1838. set_total_bitrate:
  1839. hfi_value = inst->capabilities->cap[BIT_RATE].value;
  1840. rc = msm_vidc_packetize_control(inst, BIT_RATE, HFI_PAYLOAD_U32,
  1841. &hfi_value, sizeof(u32), __func__);
  1842. if (rc)
  1843. return rc;
  1844. exit:
  1845. return rc;
  1846. }
  1847. int msm_vidc_set_session_priority(void *instance,
  1848. enum msm_vidc_inst_capability_type cap_id)
  1849. {
  1850. int rc = 0;
  1851. u32 hfi_value = 0;
  1852. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  1853. if (!inst || !inst->capabilities) {
  1854. d_vpr_e("%s: invalid params\n", __func__);
  1855. return -EINVAL;
  1856. }
  1857. hfi_value = (inst->capabilities->cap[cap_id].value * 2) + inst->priority_level;
  1858. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32,
  1859. &hfi_value, sizeof(u32), __func__);
  1860. if (rc)
  1861. return rc;
  1862. return rc;
  1863. }
  1864. /* TODO
  1865. int msm_vidc_set_flip(void *instance,
  1866. enum msm_vidc_inst_capability_type cap_id)
  1867. {
  1868. int rc = 0;
  1869. u32 hflip, vflip, hfi_value = HFI_DISABLE_FLIP;
  1870. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  1871. if (!inst || !inst->capabilities) {
  1872. d_vpr_e("%s: invalid params\n", __func__);
  1873. return -EINVAL;
  1874. }
  1875. hflip = inst->capabilities->cap[HFLIP].value;
  1876. vflip = inst->capabilities->cap[VFLIP].value;
  1877. if (hflip)
  1878. hfi_value |= HFI_HORIZONTAL_FLIP;
  1879. if (vflip)
  1880. hfi_value |= HFI_VERTICAL_FLIP;
  1881. i_vpr_h(inst, "set cap: name: %24s, value: %#10x, hfi: %#10x\n", cap_name(cap_id),
  1882. inst->capabilities->cap[cap_id].value, hfi_value);
  1883. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32_ENUM,
  1884. &hfi_value, sizeof(u32), __func__);
  1885. return rc;
  1886. }
  1887. */
  1888. int msm_vidc_set_q16(void *instance,
  1889. enum msm_vidc_inst_capability_type cap_id)
  1890. {
  1891. int rc = 0;
  1892. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  1893. u32 hfi_value = 0;
  1894. if (!inst || !inst->capabilities) {
  1895. d_vpr_e("%s: invalid params\n", __func__);
  1896. return -EINVAL;
  1897. }
  1898. hfi_value = inst->capabilities->cap[cap_id].value;
  1899. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_Q16,
  1900. &hfi_value, sizeof(u32), __func__);
  1901. if (rc)
  1902. return rc;
  1903. return rc;
  1904. }
  1905. int msm_vidc_set_u32(void *instance,
  1906. enum msm_vidc_inst_capability_type cap_id)
  1907. {
  1908. int rc = 0;
  1909. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  1910. u32 hfi_value;
  1911. if (!inst || !inst->capabilities) {
  1912. d_vpr_e("%s: invalid params\n", __func__);
  1913. return -EINVAL;
  1914. }
  1915. if (inst->capabilities->cap[cap_id].flags & CAP_FLAG_MENU) {
  1916. rc = msm_vidc_v4l2_menu_to_hfi(inst, cap_id, &hfi_value);
  1917. if (rc)
  1918. return -EINVAL;
  1919. } else {
  1920. hfi_value = inst->capabilities->cap[cap_id].value;
  1921. }
  1922. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32,
  1923. &hfi_value, sizeof(u32), __func__);
  1924. if (rc)
  1925. return rc;
  1926. return rc;
  1927. }
  1928. int msm_vidc_set_u32_enum(void *instance,
  1929. enum msm_vidc_inst_capability_type cap_id)
  1930. {
  1931. int rc = 0;
  1932. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  1933. u32 hfi_value;
  1934. if (!inst || !inst->capabilities) {
  1935. d_vpr_e("%s: invalid params\n", __func__);
  1936. return -EINVAL;
  1937. }
  1938. rc = msm_vidc_v4l2_to_hfi_enum(inst, cap_id, &hfi_value);
  1939. if (rc)
  1940. return -EINVAL;
  1941. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32_ENUM,
  1942. &hfi_value, sizeof(u32), __func__);
  1943. if (rc)
  1944. return rc;
  1945. return rc;
  1946. }
  1947. int msm_vidc_set_s32(void *instance,
  1948. enum msm_vidc_inst_capability_type cap_id)
  1949. {
  1950. int rc = 0;
  1951. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  1952. s32 hfi_value = 0;
  1953. if (!inst || !inst->capabilities) {
  1954. d_vpr_e("%s: invalid params\n", __func__);
  1955. return -EINVAL;
  1956. }
  1957. hfi_value = inst->capabilities->cap[cap_id].value;
  1958. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_S32,
  1959. &hfi_value, sizeof(s32), __func__);
  1960. if (rc)
  1961. return rc;
  1962. return rc;
  1963. }
  1964. int msm_vidc_set_v4l2_properties(struct msm_vidc_inst *inst)
  1965. {
  1966. int rc = 0;
  1967. struct msm_vidc_inst_capability *capability;
  1968. struct msm_vidc_inst_cap_entry *curr_node = NULL, *tmp_node = NULL;
  1969. if (!inst || !inst->capabilities) {
  1970. d_vpr_e("%s: invalid params\n", __func__);
  1971. return -EINVAL;
  1972. }
  1973. i_vpr_h(inst, "%s()\n", __func__);
  1974. capability = inst->capabilities;
  1975. list_for_each_entry_safe(curr_node, tmp_node,
  1976. &inst->firmware.list, list) {
  1977. /* cap_id's like PIX_FMT etc may not have set functions */
  1978. if (!capability->cap[curr_node->cap_id].set)
  1979. continue;
  1980. rc = capability->cap[curr_node->cap_id].set(inst,
  1981. curr_node->cap_id);
  1982. if (rc)
  1983. goto exit;
  1984. list_del(&curr_node->list);
  1985. kfree(curr_node);
  1986. }
  1987. exit:
  1988. return rc;
  1989. }
  1990. int msm_vidc_v4l2_menu_to_hfi(struct msm_vidc_inst *inst,
  1991. enum msm_vidc_inst_capability_type cap_id, u32 *value)
  1992. {
  1993. struct msm_vidc_inst_capability *capability = inst->capabilities;
  1994. switch (capability->cap[cap_id].v4l2_id) {
  1995. case V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE:
  1996. switch (capability->cap[cap_id].value) {
  1997. case V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC:
  1998. *value = 1;
  1999. break;
  2000. case V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC:
  2001. *value = 0;
  2002. break;
  2003. default:
  2004. *value = 1;
  2005. goto set_default;
  2006. }
  2007. return 0;
  2008. default:
  2009. i_vpr_e(inst,
  2010. "%s: mapping not specified for ctrl_id: %#x\n",
  2011. __func__, capability->cap[cap_id].v4l2_id);
  2012. return -EINVAL;
  2013. }
  2014. set_default:
  2015. i_vpr_e(inst,
  2016. "%s: invalid value %d for ctrl id: %#x. Set default: %u\n",
  2017. __func__, capability->cap[cap_id].value,
  2018. capability->cap[cap_id].v4l2_id, *value);
  2019. return 0;
  2020. }
  2021. int msm_vidc_v4l2_to_hfi_enum(struct msm_vidc_inst *inst,
  2022. enum msm_vidc_inst_capability_type cap_id, u32 *value)
  2023. {
  2024. struct msm_vidc_inst_capability *capability = inst->capabilities;
  2025. switch (capability->cap[cap_id].v4l2_id) {
  2026. case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
  2027. *value = inst->hfi_rc_type;
  2028. return 0;
  2029. case V4L2_CID_MPEG_VIDEO_HEVC_PROFILE:
  2030. case V4L2_CID_MPEG_VIDEO_H264_PROFILE:
  2031. case V4L2_CID_MPEG_VIDEO_VP9_PROFILE:
  2032. case V4L2_CID_MPEG_VIDEO_HEVC_LEVEL:
  2033. case V4L2_CID_MPEG_VIDEO_H264_LEVEL:
  2034. case V4L2_CID_MPEG_VIDEO_HEVC_TIER:
  2035. case V4L2_CID_MPEG_VIDC_VIDEO_BLUR_TYPES:
  2036. *value = capability->cap[cap_id].value;
  2037. return 0;
  2038. case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_TYPE:
  2039. switch (capability->cap[cap_id].value) {
  2040. case V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_B:
  2041. *value = HFI_HIER_B;
  2042. break;
  2043. case V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_P:
  2044. //TODO (AS): check if this is right mapping
  2045. *value = HFI_HIER_P_SLIDING_WINDOW;
  2046. break;
  2047. default:
  2048. *value = HFI_HIER_P_SLIDING_WINDOW;
  2049. goto set_default;
  2050. }
  2051. return 0;
  2052. case V4L2_CID_ROTATE:
  2053. switch (capability->cap[cap_id].value) {
  2054. case 0:
  2055. *value = HFI_ROTATION_NONE;
  2056. break;
  2057. case 90:
  2058. *value = HFI_ROTATION_90;
  2059. break;
  2060. case 180:
  2061. *value = HFI_ROTATION_180;
  2062. break;
  2063. case 270:
  2064. *value = HFI_ROTATION_270;
  2065. break;
  2066. default:
  2067. *value = HFI_ROTATION_NONE;
  2068. goto set_default;
  2069. }
  2070. return 0;
  2071. case V4L2_CID_MPEG_VIDEO_HEVC_LOOP_FILTER_MODE:
  2072. switch (capability->cap[cap_id].value) {
  2073. case V4L2_MPEG_VIDEO_HEVC_LOOP_FILTER_MODE_ENABLED:
  2074. *value = HFI_DEBLOCK_ALL_BOUNDARY;
  2075. break;
  2076. case V4L2_MPEG_VIDEO_HEVC_LOOP_FILTER_MODE_DISABLED:
  2077. *value = HFI_DEBLOCK_DISABLE;
  2078. break;
  2079. case DB_HEVC_DISABLE_SLICE_BOUNDARY:
  2080. *value = HFI_DEBLOCK_DISABLE_AT_SLICE_BOUNDARY;
  2081. break;
  2082. default:
  2083. *value = HFI_DEBLOCK_ALL_BOUNDARY;
  2084. goto set_default;
  2085. }
  2086. return 0;
  2087. case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE:
  2088. switch (capability->cap[cap_id].value) {
  2089. case V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_ENABLED:
  2090. *value = HFI_DEBLOCK_ALL_BOUNDARY;
  2091. break;
  2092. case V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED:
  2093. *value = HFI_DEBLOCK_DISABLE;
  2094. break;
  2095. case DB_H264_DISABLE_SLICE_BOUNDARY:
  2096. *value = HFI_DEBLOCK_DISABLE_AT_SLICE_BOUNDARY;
  2097. break;
  2098. default:
  2099. *value = HFI_DEBLOCK_ALL_BOUNDARY;
  2100. goto set_default;
  2101. }
  2102. return 0;
  2103. case V4L2_CID_MPEG_VIDEO_HEVC_SIZE_OF_LENGTH_FIELD:
  2104. switch (capability->cap[cap_id].value) {
  2105. case V4L2_MPEG_VIDEO_HEVC_SIZE_4:
  2106. *value = HFI_NAL_LENGTH_SIZE_4;
  2107. break;
  2108. default:
  2109. *value = HFI_NAL_LENGTH_STARTCODES;
  2110. goto set_default;
  2111. }
  2112. return 0;
  2113. default:
  2114. i_vpr_e(inst,
  2115. "%s: mapping not specified for ctrl_id: %#x\n",
  2116. __func__, capability->cap[cap_id].v4l2_id);
  2117. return -EINVAL;
  2118. }
  2119. set_default:
  2120. i_vpr_e(inst,
  2121. "%s: invalid value %d for ctrl id: %#x. Set default: %u\n",
  2122. __func__, capability->cap[cap_id].value,
  2123. capability->cap[cap_id].v4l2_id, *value);
  2124. return 0;
  2125. }