msm_vidc_control.c 98 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864
  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. #include "msm_venc.h"
  13. #include "msm_vidc_platform.h"
  14. #define CAP_TO_8BIT_QP(a) { \
  15. if ((a) < 0) \
  16. (a) = 0; \
  17. }
  18. static bool is_priv_ctrl(u32 id)
  19. {
  20. bool private = false;
  21. if (IS_PRIV_CTRL(id))
  22. return true;
  23. /*
  24. * Treat below standard controls as private because
  25. * we have added custom values to the controls
  26. */
  27. switch (id) {
  28. /*
  29. * TODO: V4L2_CID_MPEG_VIDEO_HEVC_PROFILE is std ctrl. But
  30. * V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_10_STILL_PICTURE support is not
  31. * available yet. Hence, make this as private ctrl for time being
  32. */
  33. case V4L2_CID_MPEG_VIDEO_HEVC_PROFILE:
  34. /*
  35. * TODO: V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_TYPE is
  36. * std ctrl. But needs some fixes in v4l2-ctrls.c. Hence,
  37. * make this as private ctrl for time being
  38. */
  39. case V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_TYPE:
  40. /*
  41. * TODO: treat below std ctrls as private ctrls until
  42. * all below ctrls are available in upstream
  43. */
  44. case V4L2_CID_MPEG_VIDEO_AU_DELIMITER:
  45. case V4L2_CID_MPEG_VIDEO_LTR_COUNT:
  46. case V4L2_CID_MPEG_VIDEO_FRAME_LTR_INDEX:
  47. case V4L2_CID_MPEG_VIDEO_USE_LTR_FRAMES:
  48. case V4L2_CID_MPEG_VIDEO_DEC_DISPLAY_DELAY:
  49. case V4L2_CID_MPEG_VIDEO_DEC_DISPLAY_DELAY_ENABLE:
  50. private = true;
  51. break;
  52. default:
  53. private = false;
  54. break;
  55. }
  56. return private;
  57. }
  58. static bool is_meta_ctrl(u32 id)
  59. {
  60. return (id == V4L2_CID_MPEG_VIDC_METADATA_LTR_MARK_USE_DETAILS ||
  61. id == V4L2_CID_MPEG_VIDC_METADATA_SEQ_HEADER_NAL ||
  62. id == V4L2_CID_MPEG_VIDC_METADATA_DPB_LUMA_CHROMA_MISR ||
  63. id == V4L2_CID_MPEG_VIDC_METADATA_OPB_LUMA_CHROMA_MISR ||
  64. id == V4L2_CID_MPEG_VIDC_METADATA_INTERLACE ||
  65. id == V4L2_CID_MPEG_VIDC_METADATA_CONCEALED_MB_COUNT ||
  66. id == V4L2_CID_MPEG_VIDC_METADATA_HISTOGRAM_INFO ||
  67. id == V4L2_CID_MPEG_VIDC_METADATA_SEI_MASTERING_DISPLAY_COLOUR ||
  68. id == V4L2_CID_MPEG_VIDC_METADATA_SEI_CONTENT_LIGHT_LEVEL ||
  69. id == V4L2_CID_MPEG_VIDC_METADATA_HDR10PLUS ||
  70. id == V4L2_CID_MPEG_VIDC_METADATA_EVA_STATS ||
  71. id == V4L2_CID_MPEG_VIDC_METADATA_BUFFER_TAG ||
  72. id == V4L2_CID_MPEG_VIDC_METADATA_DPB_TAG_LIST ||
  73. id == V4L2_CID_MPEG_VIDC_METADATA_SUBFRAME_OUTPUT ||
  74. id == V4L2_CID_MPEG_VIDC_METADATA_ROI_INFO ||
  75. id == V4L2_CID_MPEG_VIDC_METADATA_TIMESTAMP ||
  76. id == V4L2_CID_MPEG_VIDC_METADATA_ENC_QP_METADATA);
  77. }
  78. static const char *const mpeg_video_rate_control[] = {
  79. "VBR",
  80. "CBR",
  81. "CBR VFR",
  82. "MBR",
  83. "MBR VFR",
  84. "CQ",
  85. NULL,
  86. };
  87. static const char *const mpeg_video_stream_format[] = {
  88. "NAL Format Start Codes",
  89. "NAL Format One NAL Per Buffer",
  90. "NAL Format One Byte Length",
  91. "NAL Format Two Byte Length",
  92. "NAL Format Four Byte Length",
  93. NULL,
  94. };
  95. static const char *const mpeg_video_blur_types[] = {
  96. "Blur None",
  97. "Blur External",
  98. "Blur Adaptive",
  99. NULL,
  100. };
  101. static const char *const mpeg_video_avc_coding_layer[] = {
  102. "B",
  103. "P",
  104. NULL,
  105. };
  106. static const char *const mpeg_video_hevc_profile[] = {
  107. "Main",
  108. "Main Still Picture",
  109. "Main 10",
  110. "Main 10 Still Picture",
  111. NULL,
  112. };
  113. static const char *const roi_map_type[] = {
  114. "None",
  115. "2-bit",
  116. "2-bit",
  117. NULL,
  118. };
  119. static const char * const av1_profile[] = {
  120. "Main",
  121. "High",
  122. "Professional",
  123. NULL,
  124. };
  125. static const char * const av1_level[] = {
  126. "2.0",
  127. "2.1",
  128. "2.2",
  129. "2.3",
  130. "3.0",
  131. "3.1",
  132. "3.2",
  133. "3.3",
  134. "4.0",
  135. "4.1",
  136. "4.2",
  137. "4.3",
  138. "5.0",
  139. "5.1",
  140. "5.2",
  141. "5.3",
  142. "6.0",
  143. "6.1",
  144. "6.2",
  145. "6.3",
  146. "7.0",
  147. "7.1",
  148. "7.2",
  149. "7.3",
  150. NULL,
  151. };
  152. static const char * const av1_tier[] = {
  153. "Main",
  154. "High",
  155. NULL,
  156. };
  157. static u32 msm_vidc_get_port_info(struct msm_vidc_inst *inst,
  158. enum msm_vidc_inst_capability_type cap_id)
  159. {
  160. struct msm_vidc_inst_capability *capability = inst->capabilities;
  161. if (capability->cap[cap_id].flags & CAP_FLAG_INPUT_PORT &&
  162. capability->cap[cap_id].flags & CAP_FLAG_OUTPUT_PORT) {
  163. if (inst->vb2q[OUTPUT_PORT].streaming)
  164. return get_hfi_port(inst, INPUT_PORT);
  165. else
  166. return get_hfi_port(inst, OUTPUT_PORT);
  167. }
  168. if (capability->cap[cap_id].flags & CAP_FLAG_INPUT_PORT)
  169. return get_hfi_port(inst, INPUT_PORT);
  170. else if (capability->cap[cap_id].flags & CAP_FLAG_OUTPUT_PORT)
  171. return get_hfi_port(inst, OUTPUT_PORT);
  172. else
  173. return HFI_PORT_NONE;
  174. }
  175. static const char * const * msm_vidc_get_qmenu_type(
  176. struct msm_vidc_inst *inst, u32 control_id)
  177. {
  178. switch (control_id) {
  179. case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
  180. return mpeg_video_rate_control;
  181. case V4L2_CID_MPEG_VIDEO_HEVC_SIZE_OF_LENGTH_FIELD:
  182. return mpeg_video_stream_format;
  183. case V4L2_CID_MPEG_VIDC_VIDEO_BLUR_TYPES:
  184. return mpeg_video_blur_types;
  185. case V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_TYPE:
  186. return mpeg_video_avc_coding_layer;
  187. case V4L2_CID_MPEG_VIDEO_HEVC_PROFILE:
  188. return mpeg_video_hevc_profile;
  189. case V4L2_CID_MPEG_VIDEO_AV1_PROFILE:
  190. return av1_profile;
  191. case V4L2_CID_MPEG_VIDEO_AV1_LEVEL:
  192. return av1_level;
  193. case V4L2_CID_MPEG_VIDEO_AV1_TIER:
  194. return av1_tier;
  195. default:
  196. i_vpr_e(inst, "%s: No available qmenu for ctrl %#x\n",
  197. __func__, control_id);
  198. return NULL;
  199. }
  200. }
  201. static int msm_vidc_packetize_control(struct msm_vidc_inst *inst,
  202. enum msm_vidc_inst_capability_type cap_id, u32 payload_type,
  203. void *hfi_val, u32 payload_size, const char *func)
  204. {
  205. int rc = 0;
  206. u64 payload = 0;
  207. if (payload_size == sizeof(u32))
  208. payload = *(u32 *)hfi_val;
  209. else if (payload_size == sizeof(u64))
  210. payload = *(u64 *)hfi_val;
  211. else if (payload_size == sizeof(u8))
  212. payload = *(u8 *)hfi_val;
  213. else if (payload_size == sizeof(u16))
  214. payload = *(u16 *)hfi_val;
  215. if (payload_size <= sizeof(u64))
  216. i_vpr_h(inst,
  217. "set cap: name: %24s, cap value: %#10x, hfi: %#10x\n",
  218. cap_name(cap_id), inst->capabilities->cap[cap_id].value, payload);
  219. else
  220. i_vpr_h(inst,
  221. "set cap: name: %24s, hfi payload size %d\n",
  222. cap_name(cap_id), payload_size);
  223. rc = venus_hfi_session_property(inst,
  224. inst->capabilities->cap[cap_id].hfi_id,
  225. HFI_HOST_FLAGS_NONE,
  226. msm_vidc_get_port_info(inst, cap_id),
  227. payload_type,
  228. hfi_val,
  229. payload_size);
  230. if (rc) {
  231. i_vpr_e(inst, "%s: failed to set cap[%d] %s to fw\n",
  232. __func__, cap_id, cap_name(cap_id));
  233. return rc;
  234. }
  235. return 0;
  236. }
  237. static enum msm_vidc_inst_capability_type msm_vidc_get_cap_id(
  238. struct msm_vidc_inst *inst, u32 id)
  239. {
  240. enum msm_vidc_inst_capability_type i = INST_CAP_NONE + 1;
  241. struct msm_vidc_inst_capability *capability;
  242. enum msm_vidc_inst_capability_type cap_id = INST_CAP_NONE;
  243. capability = inst->capabilities;
  244. do {
  245. if (capability->cap[i].v4l2_id == id) {
  246. cap_id = capability->cap[i].cap;
  247. break;
  248. }
  249. i++;
  250. } while (i < INST_CAP_MAX);
  251. return cap_id;
  252. }
  253. static int msm_vidc_add_capid_to_list(struct msm_vidc_inst *inst,
  254. enum msm_vidc_inst_capability_type cap_id,
  255. enum msm_vidc_ctrl_list_type type)
  256. {
  257. struct msm_vidc_inst_cap_entry *entry = NULL, *curr_node = NULL;
  258. /* skip adding if cap_id already present in list */
  259. if (type & FW_LIST) {
  260. list_for_each_entry(curr_node, &inst->firmware.list, list) {
  261. if (curr_node->cap_id == cap_id) {
  262. i_vpr_l(inst,
  263. "%s: cap[%d] %s already present in FW_LIST\n",
  264. __func__, cap_id, cap_name(cap_id));
  265. return 0;
  266. }
  267. }
  268. }
  269. entry = kzalloc(sizeof(*entry), GFP_ATOMIC);
  270. if (!entry) {
  271. i_vpr_e(inst, "%s: alloc failed\n", __func__);
  272. return -ENOMEM;
  273. }
  274. entry->cap_id = cap_id;
  275. if (type & CHILD_LIST)
  276. list_add_tail(&entry->list, &inst->children.list);
  277. if (type & FW_LIST)
  278. list_add_tail(&entry->list, &inst->firmware.list);
  279. return 0;
  280. }
  281. static int msm_vidc_add_children(struct msm_vidc_inst *inst,
  282. enum msm_vidc_inst_capability_type cap_id)
  283. {
  284. int rc = 0;
  285. int i = 0;
  286. struct msm_vidc_inst_capability *capability = inst->capabilities;
  287. while (i < MAX_CAP_CHILDREN &&
  288. capability->cap[cap_id].children[i]) {
  289. rc = msm_vidc_add_capid_to_list(inst,
  290. capability->cap[cap_id].children[i],
  291. CHILD_LIST);
  292. if (rc)
  293. return rc;
  294. i++;
  295. }
  296. return rc;
  297. }
  298. static bool is_parent_available(struct msm_vidc_inst* inst,
  299. u32 cap, u32 check_parent, const char* func)
  300. {
  301. int i = 0;
  302. u32 cap_parent;
  303. while (i < MAX_CAP_PARENTS &&
  304. inst->capabilities->cap[cap].parents[i]) {
  305. cap_parent = inst->capabilities->cap[cap].parents[i];
  306. if (cap_parent == check_parent) {
  307. return true;
  308. }
  309. i++;
  310. }
  311. i_vpr_e(inst,
  312. "%s: missing parent %s for %s\n",
  313. func, cap_name(check_parent), cap_name(cap));
  314. return false;
  315. }
  316. int msm_vidc_update_cap_value(struct msm_vidc_inst *inst, u32 cap,
  317. s32 adjusted_val, const char *func)
  318. {
  319. if (!inst || !inst->capabilities) {
  320. d_vpr_e("%s: invalid params\n", __func__);
  321. return -EINVAL;
  322. }
  323. if (inst->capabilities->cap[cap].value != adjusted_val)
  324. i_vpr_h(inst,
  325. "%s: updated database: name: %s, value: %#x -> %#x\n",
  326. func, cap_name(cap),
  327. inst->capabilities->cap[cap].value, adjusted_val);
  328. inst->capabilities->cap[cap].value = adjusted_val;
  329. return 0;
  330. }
  331. static int msm_vidc_get_parent_value(struct msm_vidc_inst* inst,
  332. u32 cap, u32 parent, s32 *value, const char *func)
  333. {
  334. int rc = 0;
  335. if (is_parent_available(inst, cap, parent, __func__)) {
  336. switch (parent) {
  337. case BITRATE_MODE:
  338. *value = inst->hfi_rc_type;
  339. break;
  340. case LAYER_TYPE:
  341. *value = inst->hfi_layer_type;
  342. break;
  343. default:
  344. *value = inst->capabilities->cap[parent].value;
  345. break;
  346. }
  347. } else {
  348. rc = -EINVAL;
  349. }
  350. return rc;
  351. }
  352. static int msm_vidc_adjust_hevc_qp(struct msm_vidc_inst *inst,
  353. enum msm_vidc_inst_capability_type cap_id)
  354. {
  355. struct msm_vidc_inst_capability *capability;
  356. s32 pix_fmt = -1;
  357. capability = inst->capabilities;
  358. if (!(inst->codec == MSM_VIDC_HEVC || inst->codec == MSM_VIDC_HEIC)) {
  359. i_vpr_e(inst,
  360. "%s: incorrect cap[%d] %s entry in database, fix database\n",
  361. __func__, cap_id, cap_name(cap_id));
  362. return -EINVAL;
  363. }
  364. if (msm_vidc_get_parent_value(inst, cap_id,
  365. PIX_FMTS, &pix_fmt, __func__))
  366. return -EINVAL;
  367. if (pix_fmt == MSM_VIDC_FMT_P010 || pix_fmt == MSM_VIDC_FMT_TP10C)
  368. goto exit;
  369. CAP_TO_8BIT_QP(capability->cap[cap_id].value);
  370. if (cap_id == MIN_FRAME_QP) {
  371. CAP_TO_8BIT_QP(capability->cap[I_FRAME_MIN_QP].value);
  372. CAP_TO_8BIT_QP(capability->cap[P_FRAME_MIN_QP].value);
  373. CAP_TO_8BIT_QP(capability->cap[B_FRAME_MIN_QP].value);
  374. } else if (cap_id == MAX_FRAME_QP) {
  375. CAP_TO_8BIT_QP(capability->cap[I_FRAME_MAX_QP].value);
  376. CAP_TO_8BIT_QP(capability->cap[P_FRAME_MAX_QP].value);
  377. CAP_TO_8BIT_QP(capability->cap[B_FRAME_MAX_QP].value);
  378. }
  379. exit:
  380. return 0;
  381. }
  382. static int msm_vidc_adjust_property(struct msm_vidc_inst *inst,
  383. enum msm_vidc_inst_capability_type cap_id)
  384. {
  385. int rc = 0;
  386. struct msm_vidc_inst_capability *capability;
  387. capability = inst->capabilities;
  388. /*
  389. * skip for uninitialized cap properties.
  390. * Eg: Skip Tramform 8x8 cap that is uninitialized for HEVC codec
  391. */
  392. if (!capability->cap[cap_id].cap)
  393. return 0;
  394. if (capability->cap[cap_id].adjust) {
  395. rc = capability->cap[cap_id].adjust(inst, NULL);
  396. if (rc)
  397. goto exit;
  398. }
  399. /* add children cap_id's to chidren list */
  400. rc = msm_vidc_add_children(inst, cap_id);
  401. if (rc)
  402. goto exit;
  403. /* add cap_id to firmware list */
  404. rc = msm_vidc_add_capid_to_list(inst, cap_id, FW_LIST);
  405. if (rc)
  406. goto exit;
  407. return 0;
  408. exit:
  409. return rc;
  410. }
  411. static int msm_vidc_adjust_dynamic_property(struct msm_vidc_inst *inst,
  412. enum msm_vidc_inst_capability_type cap_id, struct v4l2_ctrl *ctrl)
  413. {
  414. int rc = 0;
  415. struct msm_vidc_inst_capability *capability;
  416. s32 prev_value;
  417. capability = inst->capabilities;
  418. /*
  419. * ctrl is NULL for children adjustment calls
  420. * When a dynamic control having children is adjusted, check if dynamic
  421. * adjustment is allowed for its children.
  422. */
  423. if (!(capability->cap[cap_id].flags & CAP_FLAG_DYNAMIC_ALLOWED)) {
  424. i_vpr_h(inst,
  425. "%s: dynamic setting of cap[%d] %s is not allowed\n",
  426. __func__, cap_id, cap_name(cap_id));
  427. return 0;
  428. }
  429. /*
  430. * if ctrl is NULL, it is children of some parent, and hence,
  431. * must have an adjust function defined
  432. */
  433. if (!ctrl && !capability->cap[cap_id].adjust) {
  434. i_vpr_e(inst,
  435. "%s: child cap[%d] %s must have ajdust function\n",
  436. __func__, capability->cap[cap_id].cap,
  437. cap_name(capability->cap[cap_id].cap));
  438. return -EINVAL;
  439. }
  440. prev_value = capability->cap[cap_id].value;
  441. if (capability->cap[cap_id].adjust) {
  442. rc = capability->cap[cap_id].adjust(inst, ctrl);
  443. if (rc)
  444. goto exit;
  445. } else if (ctrl) {
  446. msm_vidc_update_cap_value(inst, cap_id, ctrl->val, __func__);
  447. }
  448. /* add children if cap value modified */
  449. if (capability->cap[cap_id].value != prev_value) {
  450. rc = msm_vidc_add_children(inst, cap_id);
  451. if (rc)
  452. goto exit;
  453. }
  454. if (capability->cap[cap_id].value == prev_value && cap_id == GOP_SIZE) {
  455. /*
  456. * Ignore setting same GOP size value to firmware to avoid
  457. * unnecessary generation of IDR frame.
  458. */
  459. goto exit;
  460. }
  461. /* add cap_id to firmware list always */
  462. rc = msm_vidc_add_capid_to_list(inst, cap_id, FW_LIST);
  463. if (rc)
  464. goto exit;
  465. return 0;
  466. exit:
  467. return rc;
  468. }
  469. int msm_vidc_ctrl_deinit(struct msm_vidc_inst *inst)
  470. {
  471. if (!inst) {
  472. d_vpr_e("%s: invalid parameters\n", __func__);
  473. return -EINVAL;
  474. }
  475. i_vpr_h(inst, "%s(): num ctrls %d\n", __func__, inst->num_ctrls);
  476. v4l2_ctrl_handler_free(&inst->ctrl_handler);
  477. memset(&inst->ctrl_handler, 0, sizeof(struct v4l2_ctrl_handler));
  478. kfree(inst->ctrls);
  479. inst->ctrls = NULL;
  480. return 0;
  481. }
  482. int msm_vidc_ctrl_init(struct msm_vidc_inst *inst)
  483. {
  484. int rc = 0;
  485. struct msm_vidc_inst_capability *capability;
  486. struct msm_vidc_core *core;
  487. int idx = 0;
  488. struct v4l2_ctrl_config ctrl_cfg = {0};
  489. int num_ctrls = 0, ctrl_idx = 0;
  490. if (!inst || !inst->core || !inst->capabilities) {
  491. d_vpr_e("%s: invalid params\n", __func__);
  492. return -EINVAL;
  493. }
  494. core = inst->core;
  495. capability = inst->capabilities;
  496. if (!core->v4l2_ctrl_ops) {
  497. i_vpr_e(inst, "%s: no control ops\n", __func__);
  498. return -EINVAL;
  499. }
  500. for (idx = 0; idx < INST_CAP_MAX; idx++) {
  501. if (capability->cap[idx].v4l2_id)
  502. num_ctrls++;
  503. }
  504. if (!num_ctrls) {
  505. i_vpr_e(inst, "%s: no ctrls available in cap database\n",
  506. __func__);
  507. return -EINVAL;
  508. }
  509. inst->ctrls = kcalloc(num_ctrls,
  510. sizeof(struct v4l2_ctrl *), GFP_KERNEL);
  511. if (!inst->ctrls) {
  512. i_vpr_e(inst, "%s: failed to allocate ctrl\n", __func__);
  513. return -ENOMEM;
  514. }
  515. rc = v4l2_ctrl_handler_init(&inst->ctrl_handler, num_ctrls);
  516. if (rc) {
  517. i_vpr_e(inst, "control handler init failed, %d\n",
  518. inst->ctrl_handler.error);
  519. goto error;
  520. }
  521. for (idx = 0; idx < INST_CAP_MAX; idx++) {
  522. struct v4l2_ctrl *ctrl;
  523. if (!capability->cap[idx].v4l2_id)
  524. continue;
  525. if (ctrl_idx >= num_ctrls) {
  526. i_vpr_e(inst,
  527. "%s: invalid ctrl %#x, max allowed %d\n",
  528. __func__, capability->cap[idx].v4l2_id,
  529. num_ctrls);
  530. rc = -EINVAL;
  531. goto error;
  532. }
  533. i_vpr_l(inst,
  534. "%s: cap[%d] %24s, value %d min %d max %d step_or_mask %#x flags %#x v4l2_id %#x hfi_id %#x\n",
  535. __func__, idx, cap_name(idx),
  536. capability->cap[idx].value,
  537. capability->cap[idx].min,
  538. capability->cap[idx].max,
  539. capability->cap[idx].step_or_mask,
  540. capability->cap[idx].flags,
  541. capability->cap[idx].v4l2_id,
  542. capability->cap[idx].hfi_id);
  543. memset(&ctrl_cfg, 0, sizeof(struct v4l2_ctrl_config));
  544. if (is_priv_ctrl(capability->cap[idx].v4l2_id)) {
  545. /* add private control */
  546. ctrl_cfg.def = capability->cap[idx].value;
  547. ctrl_cfg.flags = 0;
  548. ctrl_cfg.id = capability->cap[idx].v4l2_id;
  549. ctrl_cfg.max = capability->cap[idx].max;
  550. ctrl_cfg.min = capability->cap[idx].min;
  551. ctrl_cfg.ops = core->v4l2_ctrl_ops;
  552. ctrl_cfg.type = (capability->cap[idx].flags &
  553. CAP_FLAG_MENU) ?
  554. V4L2_CTRL_TYPE_MENU :
  555. V4L2_CTRL_TYPE_INTEGER;
  556. if (ctrl_cfg.type == V4L2_CTRL_TYPE_MENU) {
  557. ctrl_cfg.menu_skip_mask =
  558. ~(capability->cap[idx].step_or_mask);
  559. ctrl_cfg.qmenu = msm_vidc_get_qmenu_type(inst,
  560. capability->cap[idx].v4l2_id);
  561. } else {
  562. ctrl_cfg.step =
  563. capability->cap[idx].step_or_mask;
  564. }
  565. ctrl_cfg.name = cap_name(capability->cap[idx].cap);
  566. if (!ctrl_cfg.name) {
  567. i_vpr_e(inst, "%s: %#x ctrl name is null\n",
  568. __func__, ctrl_cfg.id);
  569. rc = -EINVAL;
  570. goto error;
  571. }
  572. ctrl = v4l2_ctrl_new_custom(&inst->ctrl_handler,
  573. &ctrl_cfg, NULL);
  574. } else {
  575. if (capability->cap[idx].flags & CAP_FLAG_MENU) {
  576. ctrl = v4l2_ctrl_new_std_menu(
  577. &inst->ctrl_handler,
  578. core->v4l2_ctrl_ops,
  579. capability->cap[idx].v4l2_id,
  580. capability->cap[idx].max,
  581. ~(capability->cap[idx].step_or_mask),
  582. capability->cap[idx].value);
  583. } else {
  584. ctrl = v4l2_ctrl_new_std(&inst->ctrl_handler,
  585. core->v4l2_ctrl_ops,
  586. capability->cap[idx].v4l2_id,
  587. capability->cap[idx].min,
  588. capability->cap[idx].max,
  589. capability->cap[idx].step_or_mask,
  590. capability->cap[idx].value);
  591. }
  592. }
  593. if (!ctrl) {
  594. i_vpr_e(inst, "%s: invalid ctrl %#x\n", __func__,
  595. capability->cap[idx].v4l2_id);
  596. rc = -EINVAL;
  597. goto error;
  598. }
  599. rc = inst->ctrl_handler.error;
  600. if (rc) {
  601. i_vpr_e(inst,
  602. "error adding ctrl (%#x) to ctrl handle, %d\n",
  603. capability->cap[idx].v4l2_id,
  604. inst->ctrl_handler.error);
  605. goto error;
  606. }
  607. /*
  608. * TODO(AS)
  609. * ctrl->flags |= capability->cap[idx].flags;
  610. */
  611. ctrl->flags |= V4L2_CTRL_FLAG_EXECUTE_ON_WRITE;
  612. inst->ctrls[ctrl_idx] = ctrl;
  613. ctrl_idx++;
  614. }
  615. inst->num_ctrls = num_ctrls;
  616. i_vpr_h(inst, "%s(): num ctrls %d\n", __func__, inst->num_ctrls);
  617. return 0;
  618. error:
  619. msm_vidc_ctrl_deinit(inst);
  620. return rc;
  621. }
  622. static int msm_vidc_update_buffer_count_if_needed(struct msm_vidc_inst* inst,
  623. struct v4l2_ctrl *ctrl)
  624. {
  625. int rc = 0;
  626. bool update_input_port = false, update_output_port = false;
  627. if (!inst || !ctrl) {
  628. d_vpr_e("%s: invalid parameters\n", __func__);
  629. return -EINVAL;
  630. }
  631. switch (ctrl->id) {
  632. case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_TYPE:
  633. case V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_TYPE:
  634. case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_LAYER:
  635. case V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING:
  636. case V4L2_CID_MPEG_VIDEO_H264_HIERARCHICAL_CODING_LAYER:
  637. update_input_port = true;
  638. break;
  639. case V4L2_CID_MPEG_VIDC_THUMBNAIL_MODE:
  640. case V4L2_CID_MPEG_VIDC_PRIORITY:
  641. update_input_port = true;
  642. update_output_port = true;
  643. break;
  644. default:
  645. update_input_port = false;
  646. update_output_port = false;
  647. break;
  648. }
  649. if (update_input_port) {
  650. rc = msm_vidc_update_buffer_count(inst, INPUT_PORT);
  651. if (rc)
  652. return rc;
  653. }
  654. if (update_output_port) {
  655. rc = msm_vidc_update_buffer_count(inst, OUTPUT_PORT);
  656. if (rc)
  657. return rc;
  658. }
  659. return rc;
  660. }
  661. static int msm_vidc_allow_secure_session(struct msm_vidc_inst *inst)
  662. {
  663. int rc = 0;
  664. struct msm_vidc_inst *i;
  665. struct msm_vidc_core *core;
  666. u32 count = 0;
  667. if (!inst || !inst->core) {
  668. d_vpr_e("%s: invalid params\n", __func__);
  669. return -EINVAL;
  670. }
  671. core = inst->core;
  672. if (!core->capabilities) {
  673. i_vpr_e(inst, "%s: invalid params\n", __func__);
  674. return -EINVAL;
  675. }
  676. core_lock(core, __func__);
  677. list_for_each_entry(i, &core->instances, list) {
  678. if (i->capabilities) {
  679. if (i->capabilities->cap[SECURE_MODE].value)
  680. count++;
  681. }
  682. }
  683. if (count > core->capabilities[MAX_SECURE_SESSION_COUNT].value) {
  684. i_vpr_e(inst,
  685. "%s: total secure sessions %d exceeded max limit %d\n",
  686. __func__, count,
  687. core->capabilities[MAX_SECURE_SESSION_COUNT].value);
  688. rc = -EINVAL;
  689. }
  690. core_unlock(core, __func__);
  691. return rc;
  692. }
  693. int msm_v4l2_op_s_ctrl(struct v4l2_ctrl *ctrl)
  694. {
  695. int rc = 0;
  696. struct msm_vidc_inst *inst;
  697. enum msm_vidc_inst_capability_type cap_id;
  698. struct msm_vidc_inst_cap_entry *curr_node = NULL, *tmp_node = NULL;
  699. struct msm_vidc_inst_capability *capability;
  700. if (!ctrl) {
  701. d_vpr_e("%s: invalid ctrl parameter\n", __func__);
  702. return -EINVAL;
  703. }
  704. inst = container_of(ctrl->handler,
  705. struct msm_vidc_inst, ctrl_handler);
  706. if (!inst || !inst->capabilities) {
  707. d_vpr_e("%s: invalid parameters for inst\n", __func__);
  708. return -EINVAL;
  709. }
  710. capability = inst->capabilities;
  711. i_vpr_h(inst, "%s: state %d, name %s, id 0x%x value %d\n",
  712. __func__, inst->state, ctrl->name, ctrl->id, ctrl->val);
  713. cap_id = msm_vidc_get_cap_id(inst, ctrl->id);
  714. if (cap_id == INST_CAP_NONE) {
  715. i_vpr_e(inst, "%s: could not find cap_id for ctrl %s\n",
  716. __func__, ctrl->name);
  717. return -EINVAL;
  718. }
  719. capability->cap[cap_id].flags |= CAP_FLAG_CLIENT_SET;
  720. /* Static setting */
  721. if (!inst->vb2q[OUTPUT_PORT].streaming) {
  722. msm_vidc_update_cap_value(inst, cap_id, ctrl->val, __func__);
  723. if (ctrl->id == V4L2_CID_MPEG_VIDC_SECURE) {
  724. if (ctrl->val) {
  725. rc = msm_vidc_allow_secure_session(inst);
  726. if (rc)
  727. return rc;
  728. }
  729. }
  730. if (ctrl->id == V4L2_CID_ROTATE) {
  731. if (ctrl->val == 90 || ctrl->val == 270) {
  732. struct v4l2_format *output_fmt;
  733. output_fmt = &inst->fmts[OUTPUT_PORT];
  734. rc = msm_venc_s_fmt_output(inst, output_fmt);
  735. if (rc)
  736. return rc;
  737. }
  738. }
  739. if (ctrl->id == V4L2_CID_MPEG_VIDC_MIN_BITSTREAM_SIZE_OVERWRITE) {
  740. rc = msm_vidc_update_bitstream_buffer_size(inst);
  741. if (rc)
  742. return rc;
  743. }
  744. if (ctrl->id == V4L2_CID_MPEG_VIDC_PRIORITY) {
  745. rc = msm_vidc_adjust_session_priority(inst, ctrl);
  746. if (rc)
  747. return rc;
  748. /**
  749. * This is the last static s_ctrl from client(commit point). So update
  750. * input & output counts to reflect final buffer counts based on dcvs
  751. * & decoder_batching enable/disable. So client is expected to query
  752. * for final counts after setting priority control.
  753. */
  754. if (is_decode_session(inst))
  755. inst->decode_batch.enable = msm_vidc_allow_decode_batch(inst);
  756. msm_vidc_allow_dcvs(inst);
  757. }
  758. if (is_meta_ctrl(ctrl->id)) {
  759. if (cap_id == META_DPB_TAG_LIST) {
  760. /*
  761. * To subscribe HFI_PROP_DPB_TAG_LIST
  762. * data in FBD, HFI_PROP_BUFFER_TAG data
  763. * must be delivered via FTB. Hence, update
  764. * META_OUTPUT_BUF_TAG when META_DPB_TAG_LIST
  765. * is updated.
  766. */
  767. msm_vidc_update_cap_value(inst, META_OUTPUT_BUF_TAG,
  768. ctrl->val, __func__);
  769. }
  770. rc = msm_vidc_update_meta_port_settings(inst);
  771. if (rc)
  772. return rc;
  773. }
  774. rc = msm_vidc_update_buffer_count_if_needed(inst, ctrl);
  775. if (rc)
  776. return rc;
  777. return 0;
  778. }
  779. /* check if dynamic adjustment is allowed */
  780. if (inst->vb2q[OUTPUT_PORT].streaming &&
  781. !(capability->cap[cap_id].flags & CAP_FLAG_DYNAMIC_ALLOWED)) {
  782. i_vpr_e(inst,
  783. "%s: dynamic setting of cap[%d] %s is not allowed\n",
  784. __func__, cap_id, cap_name(cap_id));
  785. return -EBUSY;
  786. }
  787. rc = msm_vidc_adjust_dynamic_property(inst, cap_id, ctrl);
  788. if (rc)
  789. goto exit;
  790. /* adjust all children if any */
  791. list_for_each_entry_safe(curr_node, tmp_node,
  792. &inst->children.list, list) {
  793. rc = msm_vidc_adjust_dynamic_property(
  794. inst, curr_node->cap_id, NULL);
  795. if (rc)
  796. goto exit;
  797. list_del(&curr_node->list);
  798. kfree(curr_node);
  799. }
  800. /* dynamic controls with request will be set along with qbuf */
  801. if (inst->request)
  802. return 0;
  803. /* Dynamic set control ASAP */
  804. rc = msm_vidc_set_v4l2_properties(inst);
  805. if (rc) {
  806. i_vpr_e(inst, "%s: setting %s failed\n",
  807. __func__, ctrl->name);
  808. goto exit;
  809. }
  810. if (ctrl->id == V4L2_CID_MPEG_VIDC_LOWLATENCY_REQUEST) {
  811. if (ctrl->val == V4L2_MPEG_MSM_VIDC_ENABLE) {
  812. rc = msm_vidc_set_seq_change_at_sync_frame(inst);
  813. if (rc)
  814. return rc;
  815. }
  816. }
  817. exit:
  818. if (rc)
  819. msm_vidc_free_capabililty_list(inst, CHILD_LIST | FW_LIST);
  820. return rc;
  821. }
  822. int msm_vidc_adjust_entropy_mode(void *instance, struct v4l2_ctrl *ctrl)
  823. {
  824. struct msm_vidc_inst_capability *capability;
  825. s32 adjusted_value;
  826. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  827. s32 profile = -1;
  828. if (!inst || !inst->capabilities) {
  829. d_vpr_e("%s: invalid params\n", __func__);
  830. return -EINVAL;
  831. }
  832. capability = inst->capabilities;
  833. /* ctrl is always NULL in streamon case */
  834. adjusted_value = ctrl ? ctrl->val :
  835. capability->cap[ENTROPY_MODE].value;
  836. if (inst->codec != MSM_VIDC_H264) {
  837. i_vpr_e(inst,
  838. "%s: incorrect entry in database. fix the database\n",
  839. __func__);
  840. return 0;
  841. }
  842. if (msm_vidc_get_parent_value(inst, ENTROPY_MODE,
  843. PROFILE, &profile, __func__))
  844. return -EINVAL;
  845. if (profile == V4L2_MPEG_VIDEO_H264_PROFILE_BASELINE ||
  846. profile == V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_BASELINE)
  847. adjusted_value = V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC;
  848. msm_vidc_update_cap_value(inst, ENTROPY_MODE,
  849. adjusted_value, __func__);
  850. return 0;
  851. }
  852. int msm_vidc_adjust_bitrate_mode(void *instance, struct v4l2_ctrl *ctrl)
  853. {
  854. struct msm_vidc_inst_capability *capability;
  855. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  856. int lossless, frame_rc, bitrate_mode, frame_skip;
  857. u32 hfi_value = 0;
  858. if (!inst || !inst->capabilities) {
  859. d_vpr_e("%s: invalid params\n", __func__);
  860. return -EINVAL;
  861. }
  862. capability = inst->capabilities;
  863. bitrate_mode = capability->cap[BITRATE_MODE].value;
  864. lossless = capability->cap[LOSSLESS].value;
  865. frame_rc = capability->cap[FRAME_RC_ENABLE].value;
  866. frame_skip = capability->cap[FRAME_SKIP_MODE].value;
  867. if (lossless || (msm_vidc_lossless_encode &&
  868. inst->codec == MSM_VIDC_HEVC)) {
  869. hfi_value = HFI_RC_LOSSLESS;
  870. goto update;
  871. }
  872. if (!frame_rc && !is_image_session(inst)) {
  873. hfi_value = HFI_RC_OFF;
  874. goto update;
  875. }
  876. if (bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_VBR) {
  877. hfi_value = HFI_RC_VBR_CFR;
  878. } else if (bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_CBR) {
  879. if (frame_skip)
  880. hfi_value = HFI_RC_CBR_VFR;
  881. else
  882. hfi_value = HFI_RC_CBR_CFR;
  883. } else if (bitrate_mode == V4L2_MPEG_VIDEO_BITRATE_MODE_CQ) {
  884. hfi_value = HFI_RC_CQ;
  885. }
  886. update:
  887. inst->hfi_rc_type = hfi_value;
  888. i_vpr_h(inst, "%s: hfi rc type: %#x\n",
  889. __func__, inst->hfi_rc_type);
  890. return 0;
  891. }
  892. int msm_vidc_adjust_profile(void *instance, struct v4l2_ctrl *ctrl)
  893. {
  894. struct msm_vidc_inst_capability *capability;
  895. s32 adjusted_value;
  896. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  897. s32 pix_fmt = -1;
  898. if (!inst || !inst->capabilities) {
  899. d_vpr_e("%s: invalid params\n", __func__);
  900. return -EINVAL;
  901. }
  902. capability = inst->capabilities;
  903. adjusted_value = ctrl ? ctrl->val : capability->cap[PROFILE].value;
  904. /* PIX_FMTS dependency is common across all chipsets.
  905. * Hence, PIX_FMTS must be specified as Parent for HEVC profile.
  906. * Otherwise it would be a database error that should be fixed.
  907. */
  908. if (msm_vidc_get_parent_value(inst, PROFILE, PIX_FMTS,
  909. &pix_fmt, __func__))
  910. return -EINVAL;
  911. /* 10 bit profile for 10 bit color format */
  912. if (pix_fmt == MSM_VIDC_FMT_TP10C || pix_fmt == MSM_VIDC_FMT_P010) {
  913. if (is_image_session(inst))
  914. adjusted_value = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_10_STILL_PICTURE;
  915. else
  916. adjusted_value = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_10;
  917. } else {
  918. /* 8 bit profile for 8 bit color format */
  919. if (is_image_session(inst))
  920. adjusted_value = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN_STILL_PICTURE;
  921. else
  922. adjusted_value = V4L2_MPEG_VIDEO_HEVC_PROFILE_MAIN;
  923. }
  924. msm_vidc_update_cap_value(inst, PROFILE,
  925. adjusted_value, __func__);
  926. return 0;
  927. }
  928. int msm_vidc_adjust_ltr_count(void *instance, struct v4l2_ctrl *ctrl)
  929. {
  930. struct msm_vidc_inst_capability *capability;
  931. s32 adjusted_value;
  932. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  933. s32 rc_type = -1, all_intra = 0;
  934. if (!inst || !inst->capabilities) {
  935. d_vpr_e("%s: invalid params\n", __func__);
  936. return -EINVAL;
  937. }
  938. capability = inst->capabilities;
  939. adjusted_value = ctrl ? ctrl->val : capability->cap[LTR_COUNT].value;
  940. if (msm_vidc_get_parent_value(inst, LTR_COUNT, BITRATE_MODE,
  941. &rc_type, __func__) ||
  942. msm_vidc_get_parent_value(inst, LTR_COUNT, ALL_INTRA,
  943. &all_intra, __func__))
  944. return -EINVAL;
  945. if ((rc_type != HFI_RC_OFF &&
  946. rc_type != HFI_RC_CBR_CFR &&
  947. rc_type != HFI_RC_CBR_VFR) ||
  948. all_intra) {
  949. adjusted_value = 0;
  950. i_vpr_h(inst,
  951. "%s: ltr count unsupported, rc_type: %#x, all_intra %d\n",
  952. __func__,rc_type, all_intra);
  953. }
  954. msm_vidc_update_cap_value(inst, LTR_COUNT,
  955. adjusted_value, __func__);
  956. return 0;
  957. }
  958. int msm_vidc_adjust_use_ltr(void *instance, struct v4l2_ctrl *ctrl)
  959. {
  960. struct msm_vidc_inst_capability *capability;
  961. s32 adjusted_value, ltr_count;
  962. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  963. if (!inst || !inst->capabilities) {
  964. d_vpr_e("%s: invalid params\n", __func__);
  965. return -EINVAL;
  966. }
  967. capability = inst->capabilities;
  968. adjusted_value = ctrl ? ctrl->val : capability->cap[USE_LTR].value;
  969. /*
  970. * Since USE_LTR is only set dynamically, and LTR_COUNT is static
  971. * control, no need to make LTR_COUNT as parent for USE_LTR as
  972. * LTR_COUNT value will always be updated when dynamically USE_LTR
  973. * is set
  974. */
  975. ltr_count = capability->cap[LTR_COUNT].value;
  976. if (!ltr_count)
  977. return 0;
  978. if (adjusted_value <= 0 ||
  979. adjusted_value > ((1 << ltr_count) - 1)) {
  980. /*
  981. * USE_LTR is bitmask value, hence should be
  982. * > 0 and <= (2 ^ LTR_COUNT) - 1
  983. */
  984. i_vpr_e(inst, "%s: invalid value %d\n",
  985. __func__, adjusted_value);
  986. return 0;
  987. }
  988. /* USE_LTR value is a bitmask value */
  989. msm_vidc_update_cap_value(inst, USE_LTR,
  990. adjusted_value, __func__);
  991. return 0;
  992. }
  993. int msm_vidc_adjust_mark_ltr(void *instance, struct v4l2_ctrl *ctrl)
  994. {
  995. struct msm_vidc_inst_capability *capability;
  996. s32 adjusted_value, ltr_count;
  997. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  998. if (!inst || !inst->capabilities) {
  999. d_vpr_e("%s: invalid params\n", __func__);
  1000. return -EINVAL;
  1001. }
  1002. capability = inst->capabilities;
  1003. adjusted_value = ctrl ? ctrl->val : capability->cap[MARK_LTR].value;
  1004. /*
  1005. * Since MARK_LTR is only set dynamically, and LTR_COUNT is static
  1006. * control, no need to make LTR_COUNT as parent for MARK_LTR as
  1007. * LTR_COUNT value will always be updated when dynamically MARK_LTR
  1008. * is set
  1009. */
  1010. ltr_count = capability->cap[LTR_COUNT].value;
  1011. if (!ltr_count)
  1012. return 0;
  1013. if (adjusted_value < 0 ||
  1014. adjusted_value > (ltr_count - 1)) {
  1015. /* MARK_LTR value should be >= 0 and <= (LTR_COUNT - 1) */
  1016. i_vpr_e(inst, "%s: invalid value %d\n",
  1017. __func__, adjusted_value);
  1018. return 0;
  1019. }
  1020. msm_vidc_update_cap_value(inst, MARK_LTR,
  1021. adjusted_value, __func__);
  1022. return 0;
  1023. }
  1024. int msm_vidc_adjust_ir_random(void *instance, struct v4l2_ctrl *ctrl)
  1025. {
  1026. struct msm_vidc_inst_capability *capability;
  1027. s32 adjusted_value, all_intra = 0;
  1028. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  1029. if (!inst || !inst->capabilities) {
  1030. d_vpr_e("%s: invalid params\n", __func__);
  1031. return -EINVAL;
  1032. }
  1033. capability = inst->capabilities;
  1034. adjusted_value = ctrl ? ctrl->val : capability->cap[IR_RANDOM].value;
  1035. if (msm_vidc_get_parent_value(inst, IR_RANDOM, ALL_INTRA,
  1036. &all_intra, __func__))
  1037. return -EINVAL;
  1038. if (all_intra) {
  1039. adjusted_value = 0;
  1040. i_vpr_h(inst, "%s: IR unsupported, all intra: %d\n",
  1041. __func__, all_intra);
  1042. goto exit;
  1043. }
  1044. /*
  1045. * BITRATE_MODE dependency is NOT common across all chipsets.
  1046. * Hence, do not return error if not specified as one of the parent.
  1047. */
  1048. if (is_parent_available(inst, IR_RANDOM, BITRATE_MODE, __func__) &&
  1049. inst->hfi_rc_type != HFI_RC_CBR_CFR &&
  1050. inst->hfi_rc_type != HFI_RC_CBR_VFR)
  1051. adjusted_value = 0;
  1052. exit:
  1053. msm_vidc_update_cap_value(inst, IR_RANDOM,
  1054. adjusted_value, __func__);
  1055. return 0;
  1056. }
  1057. int msm_vidc_adjust_delta_based_rc(void *instance, struct v4l2_ctrl *ctrl)
  1058. {
  1059. struct msm_vidc_inst_capability *capability;
  1060. s32 adjusted_value;
  1061. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  1062. s32 rc_type = -1;
  1063. if (!inst || !inst->capabilities) {
  1064. d_vpr_e("%s: invalid params\n", __func__);
  1065. return -EINVAL;
  1066. }
  1067. capability = inst->capabilities;
  1068. adjusted_value = ctrl ? ctrl->val :
  1069. capability->cap[TIME_DELTA_BASED_RC].value;
  1070. if (msm_vidc_get_parent_value(inst, TIME_DELTA_BASED_RC,
  1071. BITRATE_MODE, &rc_type, __func__))
  1072. return -EINVAL;
  1073. if (rc_type == HFI_RC_OFF ||
  1074. rc_type == HFI_RC_CQ)
  1075. adjusted_value = 0;
  1076. msm_vidc_update_cap_value(inst, TIME_DELTA_BASED_RC,
  1077. adjusted_value, __func__);
  1078. return 0;
  1079. }
  1080. int msm_vidc_adjust_transform_8x8(void *instance, struct v4l2_ctrl *ctrl)
  1081. {
  1082. struct msm_vidc_inst_capability *capability;
  1083. s32 adjusted_value;
  1084. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  1085. s32 profile = -1;
  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[TRANSFORM_8X8].value;
  1093. if (inst->codec != MSM_VIDC_H264) {
  1094. i_vpr_e(inst,
  1095. "%s: incorrect entry in database. fix the database\n",
  1096. __func__);
  1097. return 0;
  1098. }
  1099. if (msm_vidc_get_parent_value(inst, TRANSFORM_8X8,
  1100. PROFILE, &profile, __func__))
  1101. return -EINVAL;
  1102. if (profile != V4L2_MPEG_VIDEO_H264_PROFILE_HIGH &&
  1103. profile != V4L2_MPEG_VIDEO_H264_PROFILE_CONSTRAINED_HIGH)
  1104. adjusted_value = V4L2_MPEG_MSM_VIDC_DISABLE;
  1105. msm_vidc_update_cap_value(inst, TRANSFORM_8X8,
  1106. adjusted_value, __func__);
  1107. return 0;
  1108. }
  1109. int msm_vidc_adjust_chroma_qp_index_offset(void *instance,
  1110. struct v4l2_ctrl *ctrl)
  1111. {
  1112. struct msm_vidc_inst_capability *capability;
  1113. s32 adjusted_value;
  1114. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  1115. if (!inst || !inst->capabilities) {
  1116. d_vpr_e("%s: invalid params\n", __func__);
  1117. return -EINVAL;
  1118. }
  1119. capability = inst->capabilities;
  1120. adjusted_value = ctrl ? ctrl->val :
  1121. capability->cap[CHROMA_QP_INDEX_OFFSET].value;
  1122. if (adjusted_value != MIN_CHROMA_QP_OFFSET)
  1123. adjusted_value = MAX_CHROMA_QP_OFFSET;
  1124. msm_vidc_update_cap_value(inst, CHROMA_QP_INDEX_OFFSET,
  1125. adjusted_value, __func__);
  1126. return 0;
  1127. }
  1128. int msm_vidc_adjust_slice_count(void *instance, struct v4l2_ctrl *ctrl)
  1129. {
  1130. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  1131. struct msm_vidc_inst_capability *capability;
  1132. struct v4l2_format *output_fmt;
  1133. s32 adjusted_value, rc_type = -1, slice_mode, all_intra = 0;
  1134. u32 slice_val, mbpf = 0, mbps = 0, max_mbpf = 0, max_mbps = 0;
  1135. u32 update_cap, max_avg_slicesize, output_width, output_height;
  1136. u32 min_width, min_height, max_width, max_height, fps;
  1137. if (!inst || !inst->capabilities) {
  1138. d_vpr_e("%s: invalid params\n", __func__);
  1139. return -EINVAL;
  1140. }
  1141. capability = inst->capabilities;
  1142. slice_mode = ctrl ? ctrl->val :
  1143. capability->cap[SLICE_MODE].value;
  1144. if (msm_vidc_get_parent_value(inst, SLICE_MODE,
  1145. BITRATE_MODE, &rc_type, __func__) ||
  1146. msm_vidc_get_parent_value(inst, SLICE_MODE,
  1147. ALL_INTRA, &all_intra, __func__))
  1148. return -EINVAL;
  1149. if (slice_mode == V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE)
  1150. return 0;
  1151. fps = capability->cap[FRAME_RATE].value >> 16;
  1152. if (fps > MAX_SLICES_FRAME_RATE ||
  1153. (rc_type != HFI_RC_OFF &&
  1154. rc_type != HFI_RC_CBR_CFR &&
  1155. rc_type != HFI_RC_CBR_VFR) ||
  1156. all_intra) {
  1157. adjusted_value = V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE;
  1158. update_cap = SLICE_MODE;
  1159. i_vpr_h(inst,
  1160. "%s: slice unsupported, fps: %u, rc_type: %#x, all_intra %d\n",
  1161. __func__, fps, rc_type, all_intra);
  1162. goto exit;
  1163. }
  1164. output_fmt = &inst->fmts[OUTPUT_PORT];
  1165. output_width = output_fmt->fmt.pix_mp.width;
  1166. output_height = output_fmt->fmt.pix_mp.height;
  1167. max_width = (slice_mode == V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_MB) ?
  1168. MAX_MB_SLICE_WIDTH : MAX_BYTES_SLICE_WIDTH;
  1169. max_height = (slice_mode == V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_MB) ?
  1170. MAX_MB_SLICE_HEIGHT : MAX_BYTES_SLICE_HEIGHT;
  1171. min_width = (inst->codec == MSM_VIDC_HEVC) ?
  1172. MIN_HEVC_SLICE_WIDTH : MIN_AVC_SLICE_WIDTH;
  1173. min_height = MIN_SLICE_HEIGHT;
  1174. /*
  1175. * For V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_MB:
  1176. * - width >= 384 and height >= 128
  1177. * - width and height <= 4096
  1178. * For V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_BYTES:
  1179. * - width >= 192 and height >= 128
  1180. * - width and height <= 1920
  1181. */
  1182. if (output_width < min_width || output_height < min_height ||
  1183. output_width > max_width || output_height > max_width) {
  1184. adjusted_value = V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE;
  1185. update_cap = SLICE_MODE;
  1186. i_vpr_h(inst,
  1187. "%s: slice unsupported, codec: %#x wxh: [%dx%d]\n",
  1188. __func__, inst->codec, output_width, output_height);
  1189. goto exit;
  1190. }
  1191. mbpf = NUM_MBS_PER_FRAME(output_height, output_width);
  1192. mbps = NUM_MBS_PER_SEC(output_height, output_width, fps);
  1193. max_mbpf = NUM_MBS_PER_FRAME(max_height, max_width);
  1194. max_mbps = NUM_MBS_PER_SEC(max_height, max_width, MAX_SLICES_FRAME_RATE);
  1195. if (mbpf > max_mbpf || mbps > max_mbps) {
  1196. adjusted_value = V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE;
  1197. update_cap = SLICE_MODE;
  1198. i_vpr_h(inst,
  1199. "%s: Unsupported, mbpf[%u] > max[%u], mbps[%u] > max[%u]\n",
  1200. __func__, mbpf, max_mbpf, mbps, max_mbps);
  1201. goto exit;
  1202. }
  1203. if (slice_mode == V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_MB) {
  1204. update_cap = SLICE_MAX_MB;
  1205. slice_val = capability->cap[SLICE_MAX_MB].value;
  1206. slice_val = max(slice_val, mbpf / MAX_SLICES_PER_FRAME);
  1207. } else {
  1208. slice_val = capability->cap[SLICE_MAX_BYTES].value;
  1209. update_cap = SLICE_MAX_BYTES;
  1210. if (rc_type != HFI_RC_OFF) {
  1211. max_avg_slicesize = ((capability->cap[BIT_RATE].value /
  1212. fps) / 8) /
  1213. MAX_SLICES_PER_FRAME;
  1214. slice_val = max(slice_val, max_avg_slicesize);
  1215. }
  1216. }
  1217. adjusted_value = slice_val;
  1218. exit:
  1219. msm_vidc_update_cap_value(inst, update_cap,
  1220. adjusted_value, __func__);
  1221. return 0;
  1222. }
  1223. static int msm_vidc_adjust_static_layer_count_and_type(struct msm_vidc_inst *inst,
  1224. s32 layer_count)
  1225. {
  1226. bool hb_requested = false;
  1227. if (!inst || !inst->capabilities) {
  1228. d_vpr_e("%s: invalid params\n", __func__);
  1229. return -EINVAL;
  1230. }
  1231. if (!layer_count) {
  1232. i_vpr_h(inst, "client not enabled layer encoding\n");
  1233. goto exit;
  1234. }
  1235. if (inst->hfi_rc_type == HFI_RC_CQ) {
  1236. i_vpr_h(inst, "rc type is CQ, disabling layer encoding\n");
  1237. layer_count = 0;
  1238. goto exit;
  1239. }
  1240. if (inst->codec == MSM_VIDC_H264) {
  1241. if (!inst->capabilities->cap[LAYER_ENABLE].value) {
  1242. layer_count = 0;
  1243. goto exit;
  1244. }
  1245. hb_requested = (inst->capabilities->cap[LAYER_TYPE].value ==
  1246. V4L2_MPEG_VIDEO_H264_HIERARCHICAL_CODING_B) ?
  1247. true : false;
  1248. } else if (inst->codec == MSM_VIDC_HEVC) {
  1249. hb_requested = (inst->capabilities->cap[LAYER_TYPE].value ==
  1250. V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_B) ?
  1251. true : false;
  1252. }
  1253. if (hb_requested && inst->hfi_rc_type != HFI_RC_VBR_CFR) {
  1254. i_vpr_h(inst,
  1255. "%s: HB layer encoding is supported for VBR rc only\n",
  1256. __func__);
  1257. layer_count = 0;
  1258. goto exit;
  1259. }
  1260. if (!inst->capabilities->cap[META_EVA_STATS].value &&
  1261. hb_requested && (layer_count > 1)) {
  1262. layer_count = 1;
  1263. i_vpr_h(inst,
  1264. "%s: cvp disable supports only one enh layer HB\n",
  1265. __func__);
  1266. }
  1267. /* decide hfi layer type */
  1268. if (hb_requested) {
  1269. inst->hfi_layer_type = HFI_HIER_B;
  1270. } else {
  1271. /* HP requested */
  1272. inst->hfi_layer_type = HFI_HIER_P_SLIDING_WINDOW;
  1273. if (inst->codec == MSM_VIDC_H264 &&
  1274. inst->hfi_rc_type == HFI_RC_VBR_CFR)
  1275. inst->hfi_layer_type = HFI_HIER_P_HYBRID_LTR;
  1276. }
  1277. /* sanitize layer count based on layer type and codec */
  1278. if (inst->hfi_layer_type == HFI_HIER_B) {
  1279. if (layer_count > MAX_ENH_LAYER_HB)
  1280. layer_count = MAX_ENH_LAYER_HB;
  1281. } else if (inst->hfi_layer_type == HFI_HIER_P_HYBRID_LTR) {
  1282. if (layer_count > MAX_AVC_ENH_LAYER_HYBRID_HP)
  1283. layer_count = MAX_AVC_ENH_LAYER_HYBRID_HP;
  1284. } else if (inst->hfi_layer_type == HFI_HIER_P_SLIDING_WINDOW) {
  1285. if (inst->codec == MSM_VIDC_H264) {
  1286. if (layer_count > MAX_AVC_ENH_LAYER_SLIDING_WINDOW)
  1287. layer_count = MAX_AVC_ENH_LAYER_SLIDING_WINDOW;
  1288. } else {
  1289. if (layer_count > MAX_HEVC_ENH_LAYER_SLIDING_WINDOW)
  1290. layer_count = MAX_HEVC_ENH_LAYER_SLIDING_WINDOW;
  1291. }
  1292. }
  1293. exit:
  1294. msm_vidc_update_cap_value(inst, ENH_LAYER_COUNT,
  1295. layer_count, __func__);
  1296. inst->capabilities->cap[ENH_LAYER_COUNT].max = layer_count;
  1297. return 0;
  1298. }
  1299. int msm_vidc_adjust_layer_count(void *instance, struct v4l2_ctrl *ctrl)
  1300. {
  1301. int rc = 0;
  1302. struct msm_vidc_inst_capability *capability;
  1303. s32 client_layer_count;
  1304. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  1305. if (!inst || !inst->capabilities) {
  1306. d_vpr_e("%s: invalid params\n", __func__);
  1307. return -EINVAL;
  1308. }
  1309. capability = inst->capabilities;
  1310. client_layer_count = ctrl ? ctrl->val :
  1311. capability->cap[ENH_LAYER_COUNT].value;
  1312. if (!is_parent_available(inst, ENH_LAYER_COUNT,
  1313. BITRATE_MODE, __func__) ||
  1314. !is_parent_available(inst, ENH_LAYER_COUNT,
  1315. META_EVA_STATS, __func__))
  1316. return -EINVAL;
  1317. if (!inst->vb2q[OUTPUT_PORT].streaming) {
  1318. rc = msm_vidc_adjust_static_layer_count_and_type(inst,
  1319. client_layer_count);
  1320. if (rc)
  1321. goto exit;
  1322. } else {
  1323. if (inst->hfi_layer_type == HFI_HIER_P_HYBRID_LTR ||
  1324. inst->hfi_layer_type == HFI_HIER_P_SLIDING_WINDOW) {
  1325. /* dynamic layer count change is only supported for HP */
  1326. if (client_layer_count >
  1327. inst->capabilities->cap[ENH_LAYER_COUNT].max)
  1328. client_layer_count =
  1329. inst->capabilities->cap[ENH_LAYER_COUNT].max;
  1330. msm_vidc_update_cap_value(inst, ENH_LAYER_COUNT,
  1331. client_layer_count, __func__);
  1332. }
  1333. }
  1334. exit:
  1335. return rc;
  1336. }
  1337. int msm_vidc_adjust_gop_size(void *instance, struct v4l2_ctrl *ctrl)
  1338. {
  1339. struct msm_vidc_inst_capability *capability;
  1340. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  1341. s32 adjusted_value, enh_layer_count = -1;
  1342. u32 min_gop_size, num_subgops;
  1343. if (!inst || !inst->capabilities) {
  1344. d_vpr_e("%s: invalid params\n", __func__);
  1345. return -EINVAL;
  1346. }
  1347. capability = inst->capabilities;
  1348. adjusted_value = ctrl ? ctrl->val : capability->cap[GOP_SIZE].value;
  1349. if (msm_vidc_get_parent_value(inst, GOP_SIZE,
  1350. ENH_LAYER_COUNT, &enh_layer_count, __func__))
  1351. return -EINVAL;
  1352. if (!enh_layer_count)
  1353. goto exit;
  1354. /*
  1355. * Layer encoding needs GOP size to be multiple of subgop size
  1356. * And subgop size is 2 ^ number of enhancement layers.
  1357. */
  1358. /* v4l2 layer count is the number of enhancement layers */
  1359. min_gop_size = 1 << enh_layer_count;
  1360. num_subgops = (adjusted_value + (min_gop_size >> 1)) /
  1361. min_gop_size;
  1362. if (num_subgops)
  1363. adjusted_value = num_subgops * min_gop_size;
  1364. else
  1365. adjusted_value = min_gop_size;
  1366. exit:
  1367. msm_vidc_update_cap_value(inst, GOP_SIZE, adjusted_value, __func__);
  1368. return 0;
  1369. }
  1370. int msm_vidc_adjust_b_frame(void *instance, struct v4l2_ctrl *ctrl)
  1371. {
  1372. struct msm_vidc_inst_capability *capability;
  1373. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  1374. s32 adjusted_value, enh_layer_count = -1;
  1375. const u32 max_bframe_size = 7;
  1376. if (!inst || !inst->capabilities) {
  1377. d_vpr_e("%s: invalid params\n", __func__);
  1378. return -EINVAL;
  1379. }
  1380. capability = inst->capabilities;
  1381. adjusted_value = ctrl ? ctrl->val : capability->cap[B_FRAME].value;
  1382. if (msm_vidc_get_parent_value(inst, B_FRAME,
  1383. ENH_LAYER_COUNT, &enh_layer_count, __func__))
  1384. return -EINVAL;
  1385. if (!enh_layer_count || inst->hfi_layer_type != HFI_HIER_B) {
  1386. adjusted_value = 0;
  1387. goto exit;
  1388. }
  1389. adjusted_value = (1 << enh_layer_count) - 1;
  1390. /* Allowed Bframe values are 0, 1, 3, 7 */
  1391. if (adjusted_value > max_bframe_size)
  1392. adjusted_value = max_bframe_size;
  1393. exit:
  1394. msm_vidc_update_cap_value(inst, B_FRAME, adjusted_value, __func__);
  1395. return 0;
  1396. }
  1397. static bool msm_vidc_check_all_layer_bitrate_set(struct msm_vidc_inst *inst)
  1398. {
  1399. bool layer_bitrate_set = true;
  1400. u32 cap_id = 0, i, enh_layer_count;
  1401. u32 layer_br_caps[6] = {L0_BR, L1_BR, L2_BR, L3_BR, L4_BR, L5_BR};
  1402. enh_layer_count = inst->capabilities->cap[ENH_LAYER_COUNT].value;
  1403. for (i = 0; i <= enh_layer_count; i++) {
  1404. if (i >= ARRAY_SIZE(layer_br_caps))
  1405. break;
  1406. cap_id = layer_br_caps[i];
  1407. if (!(inst->capabilities->cap[cap_id].flags & CAP_FLAG_CLIENT_SET)) {
  1408. layer_bitrate_set = false;
  1409. break;
  1410. }
  1411. }
  1412. return layer_bitrate_set;
  1413. }
  1414. static u32 msm_vidc_get_cumulative_bitrate(struct msm_vidc_inst *inst)
  1415. {
  1416. int i;
  1417. u32 cap_id = 0;
  1418. u32 cumulative_br = 0;
  1419. s32 enh_layer_count;
  1420. u32 layer_br_caps[6] = {L0_BR, L1_BR, L2_BR, L3_BR, L4_BR, L5_BR};
  1421. enh_layer_count = inst->capabilities->cap[ENH_LAYER_COUNT].value;
  1422. for (i = 0; i <= enh_layer_count; i++) {
  1423. if (i >= ARRAY_SIZE(layer_br_caps))
  1424. break;
  1425. cap_id = layer_br_caps[i];
  1426. cumulative_br += inst->capabilities->cap[cap_id].value;
  1427. }
  1428. return cumulative_br;
  1429. }
  1430. int msm_vidc_adjust_bitrate(void *instance, struct v4l2_ctrl *ctrl)
  1431. {
  1432. int i, rc = 0;
  1433. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  1434. struct msm_vidc_inst_capability *capability;
  1435. s32 adjusted_value, max_bitrate, enh_layer_count;
  1436. u32 cumulative_bitrate = 0, cap_id = 0, cap_value = 0;
  1437. u32 layer_br_caps[6] = {L0_BR, L1_BR, L2_BR, L3_BR, L4_BR, L5_BR};
  1438. if (!inst || !inst->capabilities) {
  1439. d_vpr_e("%s: invalid params\n", __func__);
  1440. return -EINVAL;
  1441. }
  1442. capability = inst->capabilities;
  1443. /* ignore layer bitrate when total bitrate is set */
  1444. if (capability->cap[BIT_RATE].flags & CAP_FLAG_CLIENT_SET) {
  1445. /*
  1446. * For static case, ctrl is null.
  1447. * For dynamic case, only BIT_RATE cap uses this adjust function.
  1448. * Hence, no need to check for ctrl id to be BIT_RATE control, and not
  1449. * any of layer bitrate controls.
  1450. */
  1451. adjusted_value = ctrl ? ctrl->val : capability->cap[BIT_RATE].value;
  1452. msm_vidc_update_cap_value(inst, BIT_RATE, adjusted_value, __func__);
  1453. return 0;
  1454. }
  1455. if (inst->vb2q[OUTPUT_PORT].streaming)
  1456. return 0;
  1457. if (msm_vidc_get_parent_value(inst, BIT_RATE,
  1458. ENH_LAYER_COUNT, &enh_layer_count, __func__))
  1459. return -EINVAL;
  1460. max_bitrate = inst->capabilities->cap[BIT_RATE].max;
  1461. /*
  1462. * ENH_LAYER_COUNT cap max is positive only if
  1463. * layer encoding is enabled during streamon.
  1464. */
  1465. if (capability->cap[ENH_LAYER_COUNT].max) {
  1466. if (!msm_vidc_check_all_layer_bitrate_set(inst)) {
  1467. i_vpr_h(inst,
  1468. "%s: client did not set all layer bitrates\n",
  1469. __func__);
  1470. return 0;
  1471. }
  1472. cumulative_bitrate = msm_vidc_get_cumulative_bitrate(inst);
  1473. /* cap layer bitrates to max supported bitrate */
  1474. if (cumulative_bitrate > max_bitrate) {
  1475. u32 decrement_in_value = 0;
  1476. u32 decrement_in_percent = ((cumulative_bitrate - max_bitrate) * 100) /
  1477. max_bitrate;
  1478. cumulative_bitrate = 0;
  1479. for (i = 0; i <= enh_layer_count; i++) {
  1480. if (i >= ARRAY_SIZE(layer_br_caps))
  1481. break;
  1482. cap_id = layer_br_caps[i];
  1483. cap_value = inst->capabilities->cap[cap_id].value;
  1484. decrement_in_value = (cap_value *
  1485. decrement_in_percent) / 100;
  1486. cumulative_bitrate += (cap_value - decrement_in_value);
  1487. /*
  1488. * cap value for the L*_BR is changed. Hence, update cap,
  1489. * and add to FW_LIST to set new values to firmware.
  1490. */
  1491. msm_vidc_update_cap_value(inst, cap_id,
  1492. (cap_value - decrement_in_value), __func__);
  1493. }
  1494. }
  1495. i_vpr_h(inst,
  1496. "%s: update BIT_RATE with cumulative bitrate\n",
  1497. __func__);
  1498. msm_vidc_update_cap_value(inst, BIT_RATE,
  1499. cumulative_bitrate, __func__);
  1500. }
  1501. return rc;
  1502. }
  1503. int msm_vidc_adjust_dynamic_layer_bitrate(void *instance, struct v4l2_ctrl *ctrl)
  1504. {
  1505. int rc = 0;
  1506. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  1507. struct msm_vidc_inst_capability *capability;
  1508. u32 cumulative_bitrate = 0;
  1509. u32 client_set_cap_id = INST_CAP_NONE;
  1510. u32 old_br = 0, new_br = 0, exceeded_br = 0;
  1511. s32 max_bitrate;
  1512. if (!inst || !inst->capabilities || !ctrl) {
  1513. d_vpr_e("%s: invalid params\n", __func__);
  1514. return -EINVAL;
  1515. }
  1516. capability = inst->capabilities;
  1517. /* ignore layer bitrate when total bitrate is set */
  1518. if (capability->cap[BIT_RATE].flags & CAP_FLAG_CLIENT_SET)
  1519. return 0;
  1520. if (!inst->vb2q[OUTPUT_PORT].streaming)
  1521. return 0;
  1522. /*
  1523. * ENH_LAYER_COUNT cap max is positive only if
  1524. * layer encoding is enabled during streamon.
  1525. */
  1526. if (!capability->cap[ENH_LAYER_COUNT].max) {
  1527. i_vpr_e(inst, "%s: layers not enabled\n", __func__);
  1528. return -EINVAL;
  1529. }
  1530. if (!msm_vidc_check_all_layer_bitrate_set(inst)) {
  1531. i_vpr_h(inst,
  1532. "%s: client did not set all layer bitrates\n",
  1533. __func__);
  1534. return 0;
  1535. }
  1536. client_set_cap_id = msm_vidc_get_cap_id(inst, ctrl->id);
  1537. if (client_set_cap_id == INST_CAP_NONE) {
  1538. i_vpr_e(inst, "%s: could not find cap_id for ctrl %s\n",
  1539. __func__, ctrl->name);
  1540. return -EINVAL;
  1541. }
  1542. cumulative_bitrate = msm_vidc_get_cumulative_bitrate(inst);
  1543. max_bitrate = inst->capabilities->cap[BIT_RATE].max;
  1544. old_br = capability->cap[client_set_cap_id].value;
  1545. new_br = ctrl->val;
  1546. /*
  1547. * new bitrate is not supposed to cause cumulative bitrate to
  1548. * exceed max supported bitrate
  1549. */
  1550. if ((cumulative_bitrate - old_br + new_br) > max_bitrate) {
  1551. /* adjust new bitrate */
  1552. exceeded_br = (cumulative_bitrate - old_br + new_br) - max_bitrate;
  1553. new_br = ctrl->val - exceeded_br;
  1554. }
  1555. msm_vidc_update_cap_value(inst, client_set_cap_id, new_br, __func__);
  1556. /* adjust totol bitrate cap */
  1557. i_vpr_h(inst,
  1558. "%s: update BIT_RATE with cumulative bitrate\n",
  1559. __func__);
  1560. msm_vidc_update_cap_value(inst, BIT_RATE,
  1561. msm_vidc_get_cumulative_bitrate(inst), __func__);
  1562. return rc;
  1563. }
  1564. int msm_vidc_adjust_peak_bitrate(void *instance, struct v4l2_ctrl *ctrl)
  1565. {
  1566. struct msm_vidc_inst_capability *capability;
  1567. s32 adjusted_value;
  1568. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  1569. s32 rc_type = -1, bitrate = -1;
  1570. if (!inst || !inst->capabilities) {
  1571. d_vpr_e("%s: invalid params\n", __func__);
  1572. return -EINVAL;
  1573. }
  1574. capability = inst->capabilities;
  1575. adjusted_value = ctrl ? ctrl->val :
  1576. capability->cap[PEAK_BITRATE].value;
  1577. if (msm_vidc_get_parent_value(inst, PEAK_BITRATE,
  1578. BITRATE_MODE, &rc_type, __func__))
  1579. return -EINVAL;
  1580. if (rc_type != HFI_RC_CBR_CFR &&
  1581. rc_type != HFI_RC_CBR_VFR)
  1582. return 0;
  1583. if (msm_vidc_get_parent_value(inst, PEAK_BITRATE,
  1584. BIT_RATE, &bitrate, __func__))
  1585. return -EINVAL;
  1586. /* Peak Bitrate should be larger than or equal to avg bitrate */
  1587. if (capability->cap[PEAK_BITRATE].flags & CAP_FLAG_CLIENT_SET) {
  1588. if (adjusted_value < bitrate)
  1589. adjusted_value = bitrate;
  1590. } else {
  1591. adjusted_value = capability->cap[BIT_RATE].value;
  1592. }
  1593. msm_vidc_update_cap_value(inst, PEAK_BITRATE,
  1594. adjusted_value, __func__);
  1595. return 0;
  1596. }
  1597. int msm_vidc_adjust_hevc_min_qp(void *instance, struct v4l2_ctrl *ctrl)
  1598. {
  1599. int rc = 0;
  1600. struct msm_vidc_inst_capability *capability;
  1601. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  1602. if (!inst || !inst->capabilities) {
  1603. d_vpr_e("%s: invalid params\n", __func__);
  1604. return -EINVAL;
  1605. }
  1606. capability = inst->capabilities;
  1607. if (ctrl)
  1608. msm_vidc_update_cap_value(inst, MIN_FRAME_QP,
  1609. ctrl->val, __func__);
  1610. rc = msm_vidc_adjust_hevc_qp(inst, MIN_FRAME_QP);
  1611. return rc;
  1612. }
  1613. int msm_vidc_adjust_hevc_max_qp(void *instance, struct v4l2_ctrl *ctrl)
  1614. {
  1615. int rc = 0;
  1616. struct msm_vidc_inst_capability *capability;
  1617. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  1618. if (!inst || !inst->capabilities) {
  1619. d_vpr_e("%s: invalid params\n", __func__);
  1620. return -EINVAL;
  1621. }
  1622. capability = inst->capabilities;
  1623. if (ctrl)
  1624. msm_vidc_update_cap_value(inst, MAX_FRAME_QP,
  1625. ctrl->val, __func__);
  1626. rc = msm_vidc_adjust_hevc_qp(inst, MAX_FRAME_QP);
  1627. return rc;
  1628. }
  1629. int msm_vidc_adjust_hevc_i_frame_qp(void *instance, struct v4l2_ctrl *ctrl)
  1630. {
  1631. int rc = 0;
  1632. struct msm_vidc_inst_capability *capability;
  1633. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  1634. if (!inst || !inst->capabilities) {
  1635. d_vpr_e("%s: invalid params\n", __func__);
  1636. return -EINVAL;
  1637. }
  1638. capability = inst->capabilities;
  1639. if (ctrl)
  1640. msm_vidc_update_cap_value(inst, I_FRAME_QP,
  1641. ctrl->val, __func__);
  1642. rc = msm_vidc_adjust_hevc_qp(inst, I_FRAME_QP);
  1643. if (rc)
  1644. return rc;
  1645. return rc;
  1646. }
  1647. int msm_vidc_adjust_hevc_p_frame_qp(void *instance, struct v4l2_ctrl *ctrl)
  1648. {
  1649. int rc = 0;
  1650. struct msm_vidc_inst_capability *capability;
  1651. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  1652. if (!inst || !inst->capabilities) {
  1653. d_vpr_e("%s: invalid params\n", __func__);
  1654. return -EINVAL;
  1655. }
  1656. capability = inst->capabilities;
  1657. if (ctrl)
  1658. msm_vidc_update_cap_value(inst, P_FRAME_QP,
  1659. ctrl->val, __func__);
  1660. rc = msm_vidc_adjust_hevc_qp(inst, P_FRAME_QP);
  1661. if (rc)
  1662. return rc;
  1663. return rc;
  1664. }
  1665. int msm_vidc_adjust_hevc_b_frame_qp(void *instance, struct v4l2_ctrl *ctrl)
  1666. {
  1667. int rc = 0;
  1668. struct msm_vidc_inst_capability *capability;
  1669. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  1670. if (!inst || !inst->capabilities) {
  1671. d_vpr_e("%s: invalid params\n", __func__);
  1672. return -EINVAL;
  1673. }
  1674. capability = inst->capabilities;
  1675. if (ctrl)
  1676. msm_vidc_update_cap_value(inst, B_FRAME_QP,
  1677. ctrl->val, __func__);
  1678. rc = msm_vidc_adjust_hevc_qp(inst, B_FRAME_QP);
  1679. if (rc)
  1680. return rc;
  1681. return rc;
  1682. }
  1683. int msm_vidc_adjust_blur_type(void *instance, struct v4l2_ctrl *ctrl)
  1684. {
  1685. struct msm_vidc_inst_capability *capability;
  1686. s32 adjusted_value;
  1687. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  1688. s32 rc_type = -1, cac = -1;
  1689. s32 pix_fmts = -1, min_quality = -1;
  1690. if (!inst || !inst->capabilities) {
  1691. d_vpr_e("%s: invalid params\n", __func__);
  1692. return -EINVAL;
  1693. }
  1694. capability = inst->capabilities;
  1695. adjusted_value = ctrl ? ctrl->val :
  1696. capability->cap[BLUR_TYPES].value;
  1697. if (adjusted_value == VIDC_BLUR_NONE)
  1698. return 0;
  1699. if (msm_vidc_get_parent_value(inst, BLUR_TYPES, BITRATE_MODE,
  1700. &rc_type, __func__) ||
  1701. msm_vidc_get_parent_value(inst, BLUR_TYPES,
  1702. CONTENT_ADAPTIVE_CODING, &cac, __func__) ||
  1703. msm_vidc_get_parent_value(inst, BLUR_TYPES, PIX_FMTS,
  1704. &pix_fmts, __func__) ||
  1705. msm_vidc_get_parent_value(inst, BLUR_TYPES, MIN_QUALITY,
  1706. &min_quality, __func__))
  1707. return -EINVAL;
  1708. if (adjusted_value == VIDC_BLUR_EXTERNAL) {
  1709. if (is_scaling_enabled(inst) || min_quality) {
  1710. adjusted_value = VIDC_BLUR_NONE;
  1711. }
  1712. } else if (adjusted_value == VIDC_BLUR_ADAPTIVE) {
  1713. if (is_scaling_enabled(inst) || min_quality ||
  1714. (rc_type != HFI_RC_VBR_CFR) ||
  1715. !cac || is_10bit_colorformat(pix_fmts)) {
  1716. adjusted_value = VIDC_BLUR_NONE;
  1717. }
  1718. }
  1719. msm_vidc_update_cap_value(inst, BLUR_TYPES,
  1720. adjusted_value, __func__);
  1721. return 0;
  1722. }
  1723. int msm_vidc_adjust_all_intra(void *instance, struct v4l2_ctrl *ctrl)
  1724. {
  1725. struct msm_vidc_inst_capability *capability;
  1726. s32 adjusted_value;
  1727. struct msm_vidc_core *core;
  1728. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  1729. s32 gop_size = -1, bframe = -1;
  1730. u32 width, height, fps, mbps, max_mbps;
  1731. if (!inst || !inst->capabilities || !inst->core) {
  1732. d_vpr_e("%s: invalid params\n", __func__);
  1733. return -EINVAL;
  1734. }
  1735. capability = inst->capabilities;
  1736. adjusted_value = capability->cap[ALL_INTRA].value;
  1737. if (msm_vidc_get_parent_value(inst, ALL_INTRA, GOP_SIZE,
  1738. &gop_size, __func__) ||
  1739. msm_vidc_get_parent_value(inst, ALL_INTRA, B_FRAME,
  1740. &bframe, __func__))
  1741. return -EINVAL;
  1742. width = inst->crop.width;
  1743. height = inst->crop.height;
  1744. fps = msm_vidc_get_fps(inst);
  1745. mbps = NUM_MBS_PER_SEC(height, width, fps);
  1746. core = inst->core;
  1747. max_mbps = core->capabilities[MAX_MBPS_ALL_INTRA].value;
  1748. if (mbps > max_mbps) {
  1749. adjusted_value = 0;
  1750. i_vpr_h(inst, "%s: mbps %d exceeds max supported mbps %d\n",
  1751. __func__, mbps, max_mbps);
  1752. goto exit;
  1753. }
  1754. if (!gop_size && !bframe)
  1755. adjusted_value = 1;
  1756. exit:
  1757. msm_vidc_update_cap_value(inst, ALL_INTRA,
  1758. adjusted_value, __func__);
  1759. return 0;
  1760. }
  1761. int msm_vidc_adjust_blur_resolution(void *instance, struct v4l2_ctrl *ctrl)
  1762. {
  1763. struct msm_vidc_inst_capability *capability;
  1764. s32 adjusted_value;
  1765. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  1766. s32 blur_type = -1;
  1767. if (!inst || !inst->capabilities) {
  1768. d_vpr_e("%s: invalid params\n", __func__);
  1769. return -EINVAL;
  1770. }
  1771. capability = inst->capabilities;
  1772. adjusted_value = ctrl ? ctrl->val :
  1773. capability->cap[BLUR_RESOLUTION].value;
  1774. if (msm_vidc_get_parent_value(inst, BLUR_RESOLUTION, BLUR_TYPES,
  1775. &blur_type, __func__))
  1776. return -EINVAL;
  1777. if (blur_type != VIDC_BLUR_EXTERNAL)
  1778. return 0;
  1779. msm_vidc_update_cap_value(inst, BLUR_RESOLUTION,
  1780. adjusted_value, __func__);
  1781. return 0;
  1782. }
  1783. int msm_vidc_adjust_cac(void *instance, struct v4l2_ctrl *ctrl)
  1784. {
  1785. struct msm_vidc_inst_capability *capability;
  1786. s32 adjusted_value;
  1787. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  1788. s32 min_quality = -1, rc_type = -1;
  1789. if (!inst || !inst->capabilities) {
  1790. d_vpr_e("%s: invalid params\n", __func__);
  1791. return -EINVAL;
  1792. }
  1793. capability = inst->capabilities;
  1794. adjusted_value = ctrl ? ctrl->val :
  1795. capability->cap[CONTENT_ADAPTIVE_CODING].value;
  1796. if (inst->vb2q[OUTPUT_PORT].streaming)
  1797. return 0;
  1798. if (msm_vidc_get_parent_value(inst, CONTENT_ADAPTIVE_CODING,
  1799. MIN_QUALITY, &min_quality, __func__) ||
  1800. msm_vidc_get_parent_value(inst, CONTENT_ADAPTIVE_CODING,
  1801. BITRATE_MODE, &rc_type, __func__))
  1802. return -EINVAL;
  1803. /*
  1804. * CAC is supported only for VBR rc type.
  1805. * Hence, do not adjust or set to firmware for non VBR rc's
  1806. */
  1807. if (rc_type != HFI_RC_VBR_CFR) {
  1808. adjusted_value = 0;
  1809. goto adjust;
  1810. }
  1811. if (min_quality) {
  1812. adjusted_value = 1;
  1813. goto adjust;
  1814. }
  1815. adjust:
  1816. msm_vidc_update_cap_value(inst, CONTENT_ADAPTIVE_CODING,
  1817. adjusted_value, __func__);
  1818. return 0;
  1819. }
  1820. int msm_vidc_adjust_bitrate_boost(void *instance, struct v4l2_ctrl *ctrl)
  1821. {
  1822. struct msm_vidc_inst_capability *capability;
  1823. s32 adjusted_value;
  1824. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  1825. s32 min_quality = -1, rc_type = -1;
  1826. if (!inst || !inst->capabilities) {
  1827. d_vpr_e("%s: invalid params\n", __func__);
  1828. return -EINVAL;
  1829. }
  1830. capability = inst->capabilities;
  1831. adjusted_value = ctrl ? ctrl->val :
  1832. capability->cap[BITRATE_BOOST].value;
  1833. if (inst->vb2q[OUTPUT_PORT].streaming)
  1834. return 0;
  1835. if (msm_vidc_get_parent_value(inst, BITRATE_BOOST,
  1836. MIN_QUALITY, &min_quality, __func__) ||
  1837. msm_vidc_get_parent_value(inst, BITRATE_BOOST,
  1838. BITRATE_MODE, &rc_type, __func__))
  1839. return -EINVAL;
  1840. /*
  1841. * Bitrate Boost are supported only for VBR rc type.
  1842. * Hence, do not adjust or set to firmware for non VBR rc's
  1843. */
  1844. if (rc_type != HFI_RC_VBR_CFR) {
  1845. adjusted_value = 0;
  1846. goto adjust;
  1847. }
  1848. if (min_quality) {
  1849. adjusted_value = MAX_BITRATE_BOOST;
  1850. goto adjust;
  1851. }
  1852. adjust:
  1853. msm_vidc_update_cap_value(inst, BITRATE_BOOST,
  1854. adjusted_value, __func__);
  1855. return 0;
  1856. }
  1857. int msm_vidc_adjust_min_quality(void *instance, struct v4l2_ctrl *ctrl)
  1858. {
  1859. struct msm_vidc_inst_capability *capability;
  1860. s32 adjusted_value;
  1861. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  1862. s32 roi_enable = -1, rc_type = -1, enh_layer_count = -1, pix_fmts = -1;
  1863. u32 width, height, frame_rate;
  1864. struct v4l2_format *f;
  1865. if (!inst || !inst->capabilities) {
  1866. d_vpr_e("%s: invalid params\n", __func__);
  1867. return -EINVAL;
  1868. }
  1869. capability = inst->capabilities;
  1870. adjusted_value = ctrl ? ctrl->val : capability->cap[MIN_QUALITY].value;
  1871. /*
  1872. * Although MIN_QUALITY is static, one of its parents,
  1873. * ENH_LAYER_COUNT is dynamic cap. Hence, dynamic call
  1874. * may be made for MIN_QUALITY via ENH_LAYER_COUNT.
  1875. * Therefore, below streaming check is required to avoid
  1876. * runtime modification of MIN_QUALITY.
  1877. */
  1878. if (inst->vb2q[OUTPUT_PORT].streaming)
  1879. return 0;
  1880. if (msm_vidc_get_parent_value(inst, MIN_QUALITY,
  1881. BITRATE_MODE, &rc_type, __func__) ||
  1882. msm_vidc_get_parent_value(inst, MIN_QUALITY,
  1883. META_ROI_INFO, &roi_enable, __func__) ||
  1884. msm_vidc_get_parent_value(inst, MIN_QUALITY,
  1885. ENH_LAYER_COUNT, &enh_layer_count, __func__))
  1886. return -EINVAL;
  1887. /*
  1888. * Min Quality is supported only for VBR rc type.
  1889. * Hence, do not adjust or set to firmware for non VBR rc's
  1890. */
  1891. if (rc_type != HFI_RC_VBR_CFR) {
  1892. adjusted_value = 0;
  1893. goto update_and_exit;
  1894. }
  1895. frame_rate = inst->capabilities->cap[FRAME_RATE].value >> 16;
  1896. f = &inst->fmts[OUTPUT_PORT];
  1897. width = f->fmt.pix_mp.width;
  1898. height = f->fmt.pix_mp.height;
  1899. /*
  1900. * VBR Min Quality not supported for:
  1901. * - HEVC 10bit
  1902. * - ROI support
  1903. * - HP encoding
  1904. * - External Blur
  1905. * - Resolution beyond 1080P
  1906. * (It will fall back to CQCAC 25% or 0% (CAC) or CQCAC-OFF)
  1907. */
  1908. if (inst->codec == MSM_VIDC_HEVC) {
  1909. if (msm_vidc_get_parent_value(inst, MIN_QUALITY,
  1910. PIX_FMTS, &pix_fmts, __func__))
  1911. return -EINVAL;
  1912. if (is_10bit_colorformat(pix_fmts)) {
  1913. i_vpr_h(inst,
  1914. "%s: min quality is supported only for 8 bit\n",
  1915. __func__);
  1916. adjusted_value = 0;
  1917. goto update_and_exit;
  1918. }
  1919. }
  1920. if (res_is_greater_than(width, height, 1920, 1080)) {
  1921. i_vpr_h(inst, "%s: unsupported res, wxh %ux%u\n",
  1922. __func__, width, height);
  1923. adjusted_value = 0;
  1924. goto update_and_exit;
  1925. }
  1926. if (frame_rate > 60) {
  1927. i_vpr_h(inst, "%s: unsupported fps %u\n",
  1928. __func__, frame_rate);
  1929. adjusted_value = 0;
  1930. goto update_and_exit;
  1931. }
  1932. if (roi_enable) {
  1933. i_vpr_h(inst,
  1934. "%s: min quality not supported with roi metadata\n",
  1935. __func__);
  1936. adjusted_value = 0;
  1937. goto update_and_exit;
  1938. }
  1939. if (enh_layer_count && inst->hfi_layer_type != HFI_HIER_B) {
  1940. i_vpr_h(inst,
  1941. "%s: min quality not supported for HP encoding\n",
  1942. __func__);
  1943. adjusted_value = 0;
  1944. goto update_and_exit;
  1945. }
  1946. /* Above conditions are met. Hence enable min quality */
  1947. adjusted_value = MAX_SUPPORTED_MIN_QUALITY;
  1948. update_and_exit:
  1949. msm_vidc_update_cap_value(inst, MIN_QUALITY,
  1950. adjusted_value, __func__);
  1951. return 0;
  1952. }
  1953. int msm_vidc_adjust_lowlatency_mode(void *instance, struct v4l2_ctrl *ctrl)
  1954. {
  1955. struct msm_vidc_inst_capability *capability;
  1956. s32 adjusted_value;
  1957. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  1958. s32 rc_type = -1;
  1959. if (!inst || !inst->capabilities) {
  1960. d_vpr_e("%s: invalid params\n", __func__);
  1961. return -EINVAL;
  1962. }
  1963. capability = inst->capabilities;
  1964. adjusted_value = ctrl ? ctrl->val :
  1965. capability->cap[LOWLATENCY_MODE].value;
  1966. if (msm_vidc_get_parent_value(inst, LOWLATENCY_MODE, BITRATE_MODE,
  1967. &rc_type, __func__))
  1968. return -EINVAL;
  1969. if (rc_type == HFI_RC_CBR_CFR ||
  1970. rc_type == HFI_RC_CBR_VFR)
  1971. adjusted_value = 1;
  1972. msm_vidc_update_cap_value(inst, LOWLATENCY_MODE,
  1973. adjusted_value, __func__);
  1974. return 0;
  1975. }
  1976. int msm_vidc_adjust_session_priority(void *instance, struct v4l2_ctrl *ctrl)
  1977. {
  1978. int rc = 0;
  1979. int adjusted_value;
  1980. bool rate_by_client;
  1981. struct msm_vidc_inst_capability *capability;
  1982. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  1983. if (!inst || !inst->capabilities) {
  1984. d_vpr_e("%s: invalid params\n", __func__);
  1985. return -EINVAL;
  1986. }
  1987. capability = inst->capabilities;
  1988. adjusted_value = ctrl ? ctrl->val :
  1989. capability->cap[PRIORITY].value;
  1990. if (capability->cap[FRAME_RATE].flags & CAP_FLAG_CLIENT_SET ||
  1991. capability->cap[OPERATING_RATE].flags & CAP_FLAG_CLIENT_SET) {
  1992. rate_by_client = true;
  1993. inst->priority_level = MSM_VIDC_PRIORITY_HIGH;
  1994. } else {
  1995. rate_by_client = false;
  1996. inst->priority_level = MSM_VIDC_PRIORITY_LOW;
  1997. }
  1998. /*
  1999. * For RT, check for resource feasability.
  2000. * For NRT, sessions with rate set by client takes higher order
  2001. * among NRT sessions. They are constraint RT or low priority RT.
  2002. */
  2003. if (adjusted_value == 0) {
  2004. rc = msm_vidc_check_core_mbps(inst);
  2005. if (rc) {
  2006. i_vpr_e(inst, "%s: unsupported load\n", __func__);
  2007. goto exit;
  2008. }
  2009. rc = capability->cap[FRAME_RATE].value > capability->cap[FRAME_RATE].max;
  2010. if (rc) {
  2011. i_vpr_e(inst, "%s: unsupported FRAME_RATE %u, max %u\n", __func__,
  2012. capability->cap[FRAME_RATE].value >> 16,
  2013. capability->cap[FRAME_RATE].max >> 16);
  2014. rc = -ENOMEM;
  2015. goto exit;
  2016. }
  2017. rc = capability->cap[OPERATING_RATE].value > capability->cap[OPERATING_RATE].max;
  2018. if (rc) {
  2019. i_vpr_e(inst, "%s: unsupported OPERATING_RATE %u, max %u\n", __func__,
  2020. capability->cap[OPERATING_RATE].value >> 16,
  2021. capability->cap[OPERATING_RATE].max >> 16);
  2022. rc = -ENOMEM;
  2023. goto exit;
  2024. }
  2025. rc = msm_vidc_check_core_mbpf(inst);
  2026. if (rc) {
  2027. i_vpr_e(inst, "%s: unsupported load\n", __func__);
  2028. goto exit;
  2029. }
  2030. }
  2031. msm_vidc_update_cap_value(inst, PRIORITY, adjusted_value, __func__);
  2032. exit:
  2033. return rc;
  2034. }
  2035. int msm_vidc_adjust_roi_info(void *instance, struct v4l2_ctrl *ctrl)
  2036. {
  2037. struct msm_vidc_inst_capability *capability;
  2038. s32 adjusted_value;
  2039. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  2040. s32 rc_type = -1, pix_fmt = -1;
  2041. if (!inst || !inst->capabilities) {
  2042. d_vpr_e("%s: invalid params\n", __func__);
  2043. return -EINVAL;
  2044. }
  2045. capability = inst->capabilities;
  2046. adjusted_value = ctrl ? ctrl->val : capability->cap[META_ROI_INFO].value;
  2047. if (msm_vidc_get_parent_value(inst, META_ROI_INFO, BITRATE_MODE,
  2048. &rc_type, __func__))
  2049. return -EINVAL;
  2050. if (msm_vidc_get_parent_value(inst, META_ROI_INFO, PIX_FMTS,
  2051. &pix_fmt, __func__))
  2052. return -EINVAL;
  2053. if (rc_type != HFI_RC_VBR_CFR || !is_8bit_colorformat(pix_fmt))
  2054. adjusted_value = 0;
  2055. msm_vidc_update_cap_value(inst, META_ROI_INFO,
  2056. adjusted_value, __func__);
  2057. return 0;
  2058. }
  2059. /*
  2060. * Loop over instance capabilities with CAP_FLAG_ROOT
  2061. * and call adjust function, where
  2062. * - adjust current capability value
  2063. * - update tail of instance children list with capability children
  2064. * - update instance firmware list with current capability id
  2065. * Now, loop over child list and call its adjust function
  2066. */
  2067. int msm_vidc_adjust_v4l2_properties(struct msm_vidc_inst *inst)
  2068. {
  2069. int rc = 0;
  2070. int i;
  2071. struct msm_vidc_inst_cap_entry *curr_node = NULL, *tmp_node = NULL;
  2072. struct msm_vidc_inst_capability *capability;
  2073. if (!inst || !inst->capabilities) {
  2074. d_vpr_e("%s: invalid params\n", __func__);
  2075. return -EINVAL;
  2076. }
  2077. capability = inst->capabilities;
  2078. i_vpr_h(inst, "%s()\n", __func__);
  2079. for (i = 0; i < INST_CAP_MAX; i++) {
  2080. if (capability->cap[i].flags & CAP_FLAG_ROOT) {
  2081. rc = msm_vidc_adjust_property(inst,
  2082. capability->cap[i].cap);
  2083. if (rc)
  2084. goto exit;
  2085. }
  2086. }
  2087. /*
  2088. * children of all root controls are already
  2089. * added to inst->children list at this point
  2090. */
  2091. list_for_each_entry_safe(curr_node, tmp_node,
  2092. &inst->children.list, list) {
  2093. /*
  2094. * call adjust for each child. Each child adjust
  2095. * will also update child list at the tail with
  2096. * its own children list.
  2097. * Also, if current control id value is updated,
  2098. * its entry should be added to fw list.
  2099. */
  2100. rc = msm_vidc_adjust_property(inst, curr_node->cap_id);
  2101. if (rc)
  2102. goto exit;
  2103. list_del(&curr_node->list);
  2104. kfree(curr_node);
  2105. }
  2106. exit:
  2107. if (rc)
  2108. msm_vidc_free_capabililty_list(inst, CHILD_LIST | FW_LIST);
  2109. return rc;
  2110. }
  2111. int msm_vidc_set_header_mode(void *instance,
  2112. enum msm_vidc_inst_capability_type cap_id)
  2113. {
  2114. int rc = 0;
  2115. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  2116. int header_mode, prepend_sps_pps, hdr_metadata;
  2117. u32 hfi_value = 0;
  2118. struct msm_vidc_inst_capability *capability;
  2119. if (!inst || !inst->capabilities) {
  2120. d_vpr_e("%s: invalid params\n", __func__);
  2121. return -EINVAL;
  2122. }
  2123. capability = inst->capabilities;
  2124. header_mode = capability->cap[cap_id].value;
  2125. prepend_sps_pps = capability->cap[PREPEND_SPSPPS_TO_IDR].value;
  2126. hdr_metadata = capability->cap[META_SEQ_HDR_NAL].value;
  2127. /* prioritize PREPEND_SPSPPS_TO_IDR mode over other header modes */
  2128. if (prepend_sps_pps)
  2129. hfi_value = HFI_SEQ_HEADER_PREFIX_WITH_SYNC_FRAME;
  2130. else if (header_mode == V4L2_MPEG_VIDEO_HEADER_MODE_JOINED_WITH_1ST_FRAME)
  2131. hfi_value = HFI_SEQ_HEADER_JOINED_WITH_1ST_FRAME;
  2132. else
  2133. hfi_value = HFI_SEQ_HEADER_SEPERATE_FRAME;
  2134. if (hdr_metadata)
  2135. hfi_value |= HFI_SEQ_HEADER_METADATA;
  2136. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32_ENUM,
  2137. &hfi_value, sizeof(u32), __func__);
  2138. if (rc)
  2139. return rc;
  2140. return rc;
  2141. }
  2142. int msm_vidc_set_deblock_mode(void *instance,
  2143. enum msm_vidc_inst_capability_type cap_id)
  2144. {
  2145. int rc = 0;
  2146. struct msm_vidc_inst *inst = (struct msm_vidc_inst *) instance;
  2147. s32 alpha = 0, beta = 0;
  2148. u32 lf_mode, hfi_value = 0, lf_offset = 6;
  2149. struct msm_vidc_inst_capability *capability;
  2150. if (!inst || !inst->capabilities) {
  2151. d_vpr_e("%s: invalid params\n", __func__);
  2152. return -EINVAL;
  2153. }
  2154. capability = inst->capabilities;
  2155. rc = msm_vidc_v4l2_to_hfi_enum(inst, LF_MODE, &lf_mode);
  2156. if (rc)
  2157. return -EINVAL;
  2158. beta = inst->capabilities->cap[LF_BETA].value + lf_offset;
  2159. alpha = inst->capabilities->cap[LF_ALPHA].value + lf_offset;
  2160. hfi_value = (alpha << 16) | (beta << 8) | lf_mode;
  2161. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_32_PACKED,
  2162. &hfi_value, sizeof(u32), __func__);
  2163. if (rc)
  2164. return rc;
  2165. return rc;
  2166. }
  2167. int msm_vidc_set_constant_quality(void *instance,
  2168. enum msm_vidc_inst_capability_type cap_id)
  2169. {
  2170. int rc = 0;
  2171. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  2172. u32 hfi_value = 0;
  2173. s32 rc_type = -1;
  2174. if (!inst || !inst->capabilities) {
  2175. d_vpr_e("%s: invalid params\n", __func__);
  2176. return -EINVAL;
  2177. }
  2178. if (msm_vidc_get_parent_value(inst, cap_id,
  2179. BITRATE_MODE, &rc_type, __func__))
  2180. return -EINVAL;
  2181. if (rc_type != HFI_RC_CQ)
  2182. return 0;
  2183. hfi_value = inst->capabilities->cap[cap_id].value;
  2184. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32,
  2185. &hfi_value, sizeof(u32), __func__);
  2186. if (rc)
  2187. return rc;
  2188. return rc;
  2189. }
  2190. int msm_vidc_set_vbr_related_properties(void *instance,
  2191. enum msm_vidc_inst_capability_type cap_id)
  2192. {
  2193. int rc = 0;
  2194. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  2195. u32 hfi_value = 0;
  2196. s32 rc_type = -1;
  2197. if (!inst || !inst->capabilities) {
  2198. d_vpr_e("%s: invalid params\n", __func__);
  2199. return -EINVAL;
  2200. }
  2201. if (msm_vidc_get_parent_value(inst, cap_id,
  2202. BITRATE_MODE, &rc_type, __func__))
  2203. return -EINVAL;
  2204. if (rc_type != HFI_RC_VBR_CFR)
  2205. return 0;
  2206. hfi_value = inst->capabilities->cap[cap_id].value;
  2207. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32,
  2208. &hfi_value, sizeof(u32), __func__);
  2209. if (rc)
  2210. return rc;
  2211. return rc;
  2212. }
  2213. int msm_vidc_set_cbr_related_properties(void *instance,
  2214. enum msm_vidc_inst_capability_type cap_id)
  2215. {
  2216. int rc = 0;
  2217. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  2218. u32 hfi_value = 0;
  2219. s32 rc_type = -1;
  2220. if (!inst || !inst->capabilities) {
  2221. d_vpr_e("%s: invalid params\n", __func__);
  2222. return -EINVAL;
  2223. }
  2224. if (msm_vidc_get_parent_value(inst, cap_id,
  2225. BITRATE_MODE, &rc_type, __func__))
  2226. return -EINVAL;
  2227. if (rc_type != HFI_RC_CBR_VFR &&
  2228. rc_type != HFI_RC_CBR_CFR)
  2229. return 0;
  2230. hfi_value = inst->capabilities->cap[cap_id].value;
  2231. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32,
  2232. &hfi_value, sizeof(u32), __func__);
  2233. if (rc)
  2234. return rc;
  2235. return rc;
  2236. }
  2237. int msm_vidc_set_use_and_mark_ltr(void *instance,
  2238. enum msm_vidc_inst_capability_type cap_id)
  2239. {
  2240. int rc = 0;
  2241. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  2242. u32 hfi_value = 0;
  2243. if (!inst || !inst->capabilities) {
  2244. d_vpr_e("%s: invalid params\n", __func__);
  2245. return -EINVAL;
  2246. }
  2247. if (!inst->capabilities->cap[LTR_COUNT].value ||
  2248. (inst->capabilities->cap[cap_id].value ==
  2249. INVALID_DEFAULT_MARK_OR_USE_LTR)) {
  2250. i_vpr_h(inst,
  2251. "%s: LTR_COUNT: %d %s: %d, cap %s is not set\n",
  2252. __func__, inst->capabilities->cap[LTR_COUNT].value,
  2253. cap_name(cap_id),
  2254. inst->capabilities->cap[cap_id].value,
  2255. cap_name(cap_id));
  2256. return 0;
  2257. }
  2258. hfi_value = inst->capabilities->cap[cap_id].value;
  2259. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32,
  2260. &hfi_value, sizeof(u32), __func__);
  2261. if (rc)
  2262. return rc;
  2263. return rc;
  2264. }
  2265. int msm_vidc_set_min_qp(void *instance,
  2266. enum msm_vidc_inst_capability_type cap_id)
  2267. {
  2268. int rc = 0;
  2269. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  2270. struct msm_vidc_inst_capability *capability;
  2271. s32 i_frame_qp = 0, p_frame_qp = 0, b_frame_qp = 0, min_qp_enable = 0;
  2272. u32 i_qp_enable = 0, p_qp_enable = 0, b_qp_enable = 0;
  2273. u32 client_qp_enable = 0, hfi_value = 0, offset = 0;
  2274. if (!inst || !inst->capabilities) {
  2275. d_vpr_e("%s: invalid params\n", __func__);
  2276. return -EINVAL;
  2277. }
  2278. capability = inst->capabilities;
  2279. if (capability->cap[MIN_FRAME_QP].flags & CAP_FLAG_CLIENT_SET)
  2280. min_qp_enable = 1;
  2281. if (min_qp_enable ||
  2282. (capability->cap[I_FRAME_MIN_QP].flags & CAP_FLAG_CLIENT_SET))
  2283. i_qp_enable = 1;
  2284. if (min_qp_enable ||
  2285. (capability->cap[P_FRAME_MIN_QP].flags & CAP_FLAG_CLIENT_SET))
  2286. p_qp_enable = 1;
  2287. if (min_qp_enable ||
  2288. (capability->cap[B_FRAME_MIN_QP].flags & CAP_FLAG_CLIENT_SET))
  2289. b_qp_enable = 1;
  2290. client_qp_enable = i_qp_enable | p_qp_enable << 1 | b_qp_enable << 2;
  2291. if (!client_qp_enable) {
  2292. i_vpr_h(inst,
  2293. "%s: client did not set min qp, cap %s is not set\n",
  2294. __func__, cap_name(cap_id));
  2295. return 0;
  2296. }
  2297. if (is_10bit_colorformat(capability->cap[PIX_FMTS].value))
  2298. offset = 12;
  2299. /*
  2300. * I_FRAME_MIN_QP, P_FRAME_MIN_QP, B_FRAME_MIN_QP,
  2301. * MIN_FRAME_QP caps have default value as MIN_QP_10BIT values.
  2302. * Hence, if client sets either one among MIN_FRAME_QP
  2303. * and (I_FRAME_MIN_QP or P_FRAME_MIN_QP or B_FRAME_MIN_QP),
  2304. * max of both caps will result into client set value.
  2305. */
  2306. i_frame_qp = max(capability->cap[I_FRAME_MIN_QP].value,
  2307. capability->cap[MIN_FRAME_QP].value) + offset;
  2308. p_frame_qp = max(capability->cap[P_FRAME_MIN_QP].value,
  2309. capability->cap[MIN_FRAME_QP].value) + offset;
  2310. b_frame_qp = max(capability->cap[B_FRAME_MIN_QP].value,
  2311. capability->cap[MIN_FRAME_QP].value) + offset;
  2312. hfi_value = i_frame_qp | p_frame_qp << 8 | b_frame_qp << 16 |
  2313. client_qp_enable << 24;
  2314. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_32_PACKED,
  2315. &hfi_value, sizeof(u32), __func__);
  2316. if (rc)
  2317. return rc;
  2318. return rc;
  2319. }
  2320. int msm_vidc_set_max_qp(void *instance,
  2321. enum msm_vidc_inst_capability_type cap_id)
  2322. {
  2323. int rc = 0;
  2324. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  2325. struct msm_vidc_inst_capability *capability;
  2326. s32 i_frame_qp = 0, p_frame_qp = 0, b_frame_qp = 0, max_qp_enable = 0;
  2327. u32 i_qp_enable = 0, p_qp_enable = 0, b_qp_enable = 0;
  2328. u32 client_qp_enable = 0, hfi_value = 0, offset = 0;
  2329. if (!inst || !inst->capabilities) {
  2330. d_vpr_e("%s: invalid params\n", __func__);
  2331. return -EINVAL;
  2332. }
  2333. capability = inst->capabilities;
  2334. if (capability->cap[MAX_FRAME_QP].flags & CAP_FLAG_CLIENT_SET)
  2335. max_qp_enable = 1;
  2336. if (max_qp_enable ||
  2337. (capability->cap[I_FRAME_MAX_QP].flags & CAP_FLAG_CLIENT_SET))
  2338. i_qp_enable = 1;
  2339. if (max_qp_enable ||
  2340. (capability->cap[P_FRAME_MAX_QP].flags & CAP_FLAG_CLIENT_SET))
  2341. p_qp_enable = 1;
  2342. if (max_qp_enable ||
  2343. (capability->cap[B_FRAME_MAX_QP].flags & CAP_FLAG_CLIENT_SET))
  2344. b_qp_enable = 1;
  2345. client_qp_enable = i_qp_enable | p_qp_enable << 1 | b_qp_enable << 2;
  2346. if (!client_qp_enable) {
  2347. i_vpr_h(inst,
  2348. "%s: client did not set max qp, cap %s is not set\n",
  2349. __func__, cap_name(cap_id));
  2350. return 0;
  2351. }
  2352. if (is_10bit_colorformat(capability->cap[PIX_FMTS].value))
  2353. offset = 12;
  2354. /*
  2355. * I_FRAME_MAX_QP, P_FRAME_MAX_QP, B_FRAME_MAX_QP,
  2356. * MAX_FRAME_QP caps have default value as MAX_QP values.
  2357. * Hence, if client sets either one among MAX_FRAME_QP
  2358. * and (I_FRAME_MAX_QP or P_FRAME_MAX_QP or B_FRAME_MAX_QP),
  2359. * min of both caps will result into client set value.
  2360. */
  2361. i_frame_qp = min(capability->cap[I_FRAME_MAX_QP].value,
  2362. capability->cap[MAX_FRAME_QP].value) + offset;
  2363. p_frame_qp = min(capability->cap[P_FRAME_MAX_QP].value,
  2364. capability->cap[MAX_FRAME_QP].value) + offset;
  2365. b_frame_qp = min(capability->cap[B_FRAME_MAX_QP].value,
  2366. capability->cap[MAX_FRAME_QP].value) + offset;
  2367. hfi_value = i_frame_qp | p_frame_qp << 8 | b_frame_qp << 16 |
  2368. client_qp_enable << 24;
  2369. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_32_PACKED,
  2370. &hfi_value, sizeof(u32), __func__);
  2371. if (rc)
  2372. return rc;
  2373. return rc;
  2374. }
  2375. int msm_vidc_set_frame_qp(void *instance,
  2376. enum msm_vidc_inst_capability_type cap_id)
  2377. {
  2378. int rc = 0;
  2379. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  2380. struct msm_vidc_inst_capability *capab;
  2381. s32 i_frame_qp = 0, p_frame_qp = 0, b_frame_qp = 0;
  2382. u32 i_qp_enable = 0, p_qp_enable = 0, b_qp_enable = 0;
  2383. u32 client_qp_enable = 0, hfi_value = 0, offset = 0;
  2384. s32 rc_type = -1;
  2385. if (!inst || !inst->capabilities) {
  2386. d_vpr_e("%s: invalid params\n", __func__);
  2387. return -EINVAL;
  2388. }
  2389. capab = inst->capabilities;
  2390. if (msm_vidc_get_parent_value(inst, cap_id,
  2391. BITRATE_MODE, &rc_type, __func__))
  2392. return -EINVAL;
  2393. if (inst->vb2q[OUTPUT_PORT].streaming) {
  2394. if (rc_type != HFI_RC_OFF) {
  2395. i_vpr_h(inst,
  2396. "%s: dynamic qp not allowed for rc type %d\n",
  2397. __func__, rc_type);
  2398. return 0;
  2399. }
  2400. }
  2401. if (rc_type == HFI_RC_OFF) {
  2402. /* Mandatorily set for rc off case */
  2403. i_qp_enable = p_qp_enable = b_qp_enable = 1;
  2404. } else {
  2405. /* Set only if client has set for NON rc off case */
  2406. if (capab->cap[I_FRAME_QP].flags & CAP_FLAG_CLIENT_SET)
  2407. i_qp_enable = 1;
  2408. if (capab->cap[P_FRAME_QP].flags & CAP_FLAG_CLIENT_SET)
  2409. p_qp_enable = 1;
  2410. if (capab->cap[B_FRAME_QP].flags & CAP_FLAG_CLIENT_SET)
  2411. b_qp_enable = 1;
  2412. }
  2413. client_qp_enable = i_qp_enable | p_qp_enable << 1 | b_qp_enable << 2;
  2414. if (!client_qp_enable) {
  2415. i_vpr_h(inst,
  2416. "%s: client did not set frame qp, cap %s is not set\n",
  2417. __func__, cap_name(cap_id));
  2418. return 0;
  2419. }
  2420. if (is_10bit_colorformat(capab->cap[PIX_FMTS].value))
  2421. offset = 12;
  2422. i_frame_qp = capab->cap[I_FRAME_QP].value + offset;
  2423. p_frame_qp = capab->cap[P_FRAME_QP].value + offset;
  2424. b_frame_qp = capab->cap[B_FRAME_QP].value + offset;
  2425. hfi_value = i_frame_qp | p_frame_qp << 8 | b_frame_qp << 16 |
  2426. client_qp_enable << 24;
  2427. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_32_PACKED,
  2428. &hfi_value, sizeof(u32), __func__);
  2429. if (rc)
  2430. return rc;
  2431. return rc;
  2432. }
  2433. int msm_vidc_set_req_sync_frame(void *instance,
  2434. enum msm_vidc_inst_capability_type cap_id)
  2435. {
  2436. int rc = 0;
  2437. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  2438. s32 prepend_spspps;
  2439. u32 hfi_value = 0;
  2440. if (!inst || !inst->capabilities) {
  2441. d_vpr_e("%s: invalid params\n", __func__);
  2442. return -EINVAL;
  2443. }
  2444. prepend_spspps = inst->capabilities->cap[PREPEND_SPSPPS_TO_IDR].value;
  2445. if (prepend_spspps)
  2446. hfi_value = HFI_SYNC_FRAME_REQUEST_WITH_PREFIX_SEQ_HDR;
  2447. else
  2448. hfi_value = HFI_SYNC_FRAME_REQUEST_WITHOUT_SEQ_HDR;
  2449. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32_ENUM,
  2450. &hfi_value, sizeof(u32), __func__);
  2451. if (rc)
  2452. return rc;
  2453. return rc;
  2454. }
  2455. int msm_vidc_set_chroma_qp_index_offset(void *instance,
  2456. enum msm_vidc_inst_capability_type cap_id)
  2457. {
  2458. int rc = 0;
  2459. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  2460. u32 hfi_value = 0, chroma_qp_offset_mode = 0, chroma_qp = 0;
  2461. u32 offset = 12;
  2462. if (!inst || !inst->capabilities) {
  2463. d_vpr_e("%s: invalid params\n", __func__);
  2464. return -EINVAL;
  2465. }
  2466. if (inst->capabilities->cap[cap_id].flags & CAP_FLAG_CLIENT_SET)
  2467. chroma_qp_offset_mode = HFI_FIXED_CHROMAQP_OFFSET;
  2468. else
  2469. chroma_qp_offset_mode = HFI_ADAPTIVE_CHROMAQP_OFFSET;
  2470. chroma_qp = inst->capabilities->cap[cap_id].value + offset;
  2471. hfi_value = chroma_qp_offset_mode | chroma_qp << 8 | chroma_qp << 16 ;
  2472. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_32_PACKED,
  2473. &hfi_value, sizeof(u32), __func__);
  2474. if (rc)
  2475. return rc;
  2476. return rc;
  2477. }
  2478. int msm_vidc_set_slice_count(void* instance,
  2479. enum msm_vidc_inst_capability_type cap_id)
  2480. {
  2481. int rc = 0;
  2482. struct msm_vidc_inst* inst = (struct msm_vidc_inst*)instance;
  2483. s32 slice_mode = -1;
  2484. u32 hfi_value = 0, set_cap_id = 0;
  2485. if (!inst || !inst->capabilities) {
  2486. d_vpr_e("%s: invalid params\n", __func__);
  2487. return -EINVAL;
  2488. }
  2489. slice_mode = inst->capabilities->cap[SLICE_MODE].value;
  2490. if (slice_mode == V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_SINGLE) {
  2491. i_vpr_h(inst, "%s: slice mode is: %u, ignore setting to fw\n",
  2492. __func__, slice_mode);
  2493. return 0;
  2494. }
  2495. if (slice_mode == V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_MB) {
  2496. hfi_value = (inst->codec == MSM_VIDC_HEVC) ?
  2497. ((inst->capabilities->cap[SLICE_MAX_MB].value + 3) / 4) :
  2498. inst->capabilities->cap[SLICE_MAX_MB].value;
  2499. set_cap_id = SLICE_MAX_MB;
  2500. } else if (slice_mode == V4L2_MPEG_VIDEO_MULTI_SLICE_MODE_MAX_BYTES) {
  2501. hfi_value = inst->capabilities->cap[SLICE_MAX_BYTES].value;
  2502. set_cap_id = SLICE_MAX_BYTES;
  2503. }
  2504. rc = msm_vidc_packetize_control(inst, set_cap_id, HFI_PAYLOAD_U32,
  2505. &hfi_value, sizeof(u32), __func__);
  2506. if (rc)
  2507. return rc;
  2508. return rc;
  2509. }
  2510. int msm_vidc_set_nal_length(void* instance,
  2511. enum msm_vidc_inst_capability_type cap_id)
  2512. {
  2513. int rc = 0;
  2514. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  2515. u32 hfi_value = HFI_NAL_LENGTH_STARTCODES;
  2516. if (!inst || !inst->capabilities) {
  2517. d_vpr_e("%s: invalid params\n", __func__);
  2518. return -EINVAL;
  2519. }
  2520. if (!inst->capabilities->cap[WITHOUT_STARTCODE].value) {
  2521. hfi_value = HFI_NAL_LENGTH_STARTCODES;
  2522. } else {
  2523. rc = msm_vidc_v4l2_to_hfi_enum(inst, NAL_LENGTH_FIELD, &hfi_value);
  2524. if (rc)
  2525. return -EINVAL;
  2526. }
  2527. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32_ENUM,
  2528. &hfi_value, sizeof(u32), __func__);
  2529. if (rc)
  2530. return rc;
  2531. return rc;
  2532. }
  2533. int msm_vidc_set_layer_count_and_type(void *instance,
  2534. enum msm_vidc_inst_capability_type cap_id)
  2535. {
  2536. int rc = 0;
  2537. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  2538. u32 hfi_layer_count, hfi_layer_type = 0;
  2539. if (!inst || !inst->capabilities) {
  2540. d_vpr_e("%s: invalid params\n", __func__);
  2541. return -EINVAL;
  2542. }
  2543. if (!inst->vb2q[OUTPUT_PORT].streaming) {
  2544. /* set layer type */
  2545. hfi_layer_type = inst->hfi_layer_type;
  2546. cap_id = LAYER_TYPE;
  2547. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32_ENUM,
  2548. &hfi_layer_type, sizeof(u32), __func__);
  2549. if (rc)
  2550. goto exit;
  2551. } else {
  2552. if (inst->hfi_layer_type == HFI_HIER_B) {
  2553. i_vpr_l(inst,
  2554. "%s: HB dyn layers change is not supported\n",
  2555. __func__);
  2556. return 0;
  2557. }
  2558. }
  2559. /* set layer count */
  2560. cap_id = ENH_LAYER_COUNT;
  2561. /* hfi baselayer starts from 1 */
  2562. hfi_layer_count = inst->capabilities->cap[ENH_LAYER_COUNT].value + 1;
  2563. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32,
  2564. &hfi_layer_count, sizeof(u32), __func__);
  2565. if (rc)
  2566. goto exit;
  2567. exit:
  2568. return rc;
  2569. }
  2570. int msm_vidc_set_gop_size(void *instance,
  2571. enum msm_vidc_inst_capability_type cap_id)
  2572. {
  2573. int rc = 0;
  2574. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  2575. u32 hfi_value;
  2576. if (!inst || !inst->capabilities) {
  2577. d_vpr_e("%s: invalid params\n", __func__);
  2578. return -EINVAL;
  2579. }
  2580. if (inst->vb2q[OUTPUT_PORT].streaming) {
  2581. if (inst->hfi_layer_type == HFI_HIER_B) {
  2582. i_vpr_l(inst,
  2583. "%s: HB dyn GOP setting is not supported\n",
  2584. __func__);
  2585. return 0;
  2586. }
  2587. }
  2588. hfi_value = inst->capabilities->cap[GOP_SIZE].value;
  2589. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32,
  2590. &hfi_value, sizeof(u32), __func__);
  2591. if (rc)
  2592. return rc;
  2593. return rc;
  2594. }
  2595. int msm_vidc_set_bitrate(void *instance,
  2596. enum msm_vidc_inst_capability_type cap_id)
  2597. {
  2598. int rc = 0, i;
  2599. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  2600. u32 hfi_value = 0;
  2601. s32 rc_type = -1, enh_layer_count = -1;
  2602. u32 layer_br_caps[6] = {L0_BR, L1_BR, L2_BR, L3_BR, L4_BR, L5_BR};
  2603. if (!inst || !inst->capabilities) {
  2604. d_vpr_e("%s: invalid params\n", __func__);
  2605. return -EINVAL;
  2606. }
  2607. /* set Total Bitrate */
  2608. if (inst->capabilities->cap[BIT_RATE].flags & CAP_FLAG_CLIENT_SET)
  2609. goto set_total_bitrate;
  2610. /*
  2611. * During runtime, if BIT_RATE cap CLIENT_SET flag is not set,
  2612. * then this function will be called due to change in ENH_LAYER_COUNT.
  2613. * In this case, client did not change bitrate, hence, no need to set
  2614. * to fw.
  2615. */
  2616. if (inst->vb2q[OUTPUT_PORT].streaming)
  2617. return 0;
  2618. if (msm_vidc_get_parent_value(inst, BIT_RATE,
  2619. BITRATE_MODE, &rc_type, __func__))
  2620. return -EINVAL;
  2621. if (rc_type != HFI_RC_CBR_CFR && rc_type != HFI_RC_CBR_VFR) {
  2622. i_vpr_h(inst, "%s: set total bitrate for non CBR rc type\n",
  2623. __func__);
  2624. goto set_total_bitrate;
  2625. }
  2626. if (msm_vidc_get_parent_value(inst, BIT_RATE,
  2627. ENH_LAYER_COUNT, &enh_layer_count, __func__))
  2628. return -EINVAL;
  2629. /*
  2630. * ENH_LAYER_COUNT cap max is positive only if
  2631. * layer encoding is enabled during streamon.
  2632. */
  2633. if (inst->capabilities->cap[ENH_LAYER_COUNT].max) {
  2634. if (!msm_vidc_check_all_layer_bitrate_set(inst))
  2635. goto set_total_bitrate;
  2636. /* set Layer Bitrate */
  2637. for (i = 0; i <= enh_layer_count; i++) {
  2638. if (i >= ARRAY_SIZE(layer_br_caps))
  2639. break;
  2640. cap_id = layer_br_caps[i];
  2641. hfi_value = inst->capabilities->cap[cap_id].value;
  2642. rc = msm_vidc_packetize_control(inst, cap_id,
  2643. HFI_PAYLOAD_U32, &hfi_value,
  2644. sizeof(u32), __func__);
  2645. if (rc)
  2646. return rc;
  2647. }
  2648. goto exit;
  2649. }
  2650. set_total_bitrate:
  2651. hfi_value = inst->capabilities->cap[BIT_RATE].value;
  2652. rc = msm_vidc_packetize_control(inst, BIT_RATE, HFI_PAYLOAD_U32,
  2653. &hfi_value, sizeof(u32), __func__);
  2654. if (rc)
  2655. return rc;
  2656. exit:
  2657. return rc;
  2658. }
  2659. int msm_vidc_set_dynamic_layer_bitrate(void *instance,
  2660. enum msm_vidc_inst_capability_type cap_id)
  2661. {
  2662. int rc = 0;
  2663. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  2664. u32 hfi_value = 0;
  2665. s32 rc_type = -1;
  2666. if (!inst || !inst->capabilities) {
  2667. d_vpr_e("%s: invalid params\n", __func__);
  2668. return -EINVAL;
  2669. }
  2670. if (!inst->vb2q[OUTPUT_PORT].streaming)
  2671. return 0;
  2672. /* set Total Bitrate */
  2673. if (inst->capabilities->cap[BIT_RATE].flags & CAP_FLAG_CLIENT_SET) {
  2674. i_vpr_h(inst,
  2675. "%s: Total bitrate is set, ignore layer bitrate\n",
  2676. __func__);
  2677. return 0;
  2678. }
  2679. /*
  2680. * ENH_LAYER_COUNT cap max is positive only if
  2681. * layer encoding is enabled during streamon.
  2682. */
  2683. if (!inst->capabilities->cap[ENH_LAYER_COUNT].max ||
  2684. !msm_vidc_check_all_layer_bitrate_set(inst)) {
  2685. i_vpr_h(inst,
  2686. "%s: invalid layer bitrate, ignore setting to fw\n",
  2687. __func__);
  2688. return 0;
  2689. }
  2690. if (inst->hfi_rc_type == HFI_RC_CBR_CFR ||
  2691. rc_type == HFI_RC_CBR_VFR) {
  2692. /* set layer bitrate for the client set layer */
  2693. hfi_value = inst->capabilities->cap[cap_id].value;
  2694. rc = msm_vidc_packetize_control(inst, cap_id,
  2695. HFI_PAYLOAD_U32, &hfi_value,
  2696. sizeof(u32), __func__);
  2697. if (rc)
  2698. return rc;
  2699. } else {
  2700. /*
  2701. * All layer bitartes set for unsupported rc type.
  2702. * Hence accept layer bitrates, but set total bitrate prop
  2703. * with cumulative bitrate.
  2704. */
  2705. hfi_value = inst->capabilities->cap[BIT_RATE].value;
  2706. rc = msm_vidc_packetize_control(inst, BIT_RATE, HFI_PAYLOAD_U32,
  2707. &hfi_value, sizeof(u32), __func__);
  2708. if (rc)
  2709. return rc;
  2710. }
  2711. return rc;
  2712. }
  2713. int msm_vidc_set_session_priority(void *instance,
  2714. enum msm_vidc_inst_capability_type cap_id)
  2715. {
  2716. int rc = 0;
  2717. u32 hfi_value = 0;
  2718. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  2719. if (!inst || !inst->capabilities) {
  2720. d_vpr_e("%s: invalid params\n", __func__);
  2721. return -EINVAL;
  2722. }
  2723. hfi_value = (inst->capabilities->cap[cap_id].value * 2) + inst->priority_level;
  2724. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32,
  2725. &hfi_value, sizeof(u32), __func__);
  2726. if (rc)
  2727. return rc;
  2728. inst->firmware_priority = hfi_value;
  2729. return rc;
  2730. }
  2731. int msm_vidc_set_flip(void *instance,
  2732. enum msm_vidc_inst_capability_type cap_id)
  2733. {
  2734. int rc = 0;
  2735. u32 hflip, vflip, hfi_value = HFI_DISABLE_FLIP;
  2736. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  2737. if (!inst || !inst->capabilities) {
  2738. d_vpr_e("%s: invalid params\n", __func__);
  2739. return -EINVAL;
  2740. }
  2741. hflip = inst->capabilities->cap[HFLIP].value;
  2742. vflip = inst->capabilities->cap[VFLIP].value;
  2743. if (hflip)
  2744. hfi_value |= HFI_HORIZONTAL_FLIP;
  2745. if (vflip)
  2746. hfi_value |= HFI_VERTICAL_FLIP;
  2747. if (inst->vb2q[OUTPUT_PORT].streaming) {
  2748. if (hfi_value != HFI_DISABLE_FLIP) {
  2749. rc = msm_vidc_set_req_sync_frame(inst,
  2750. REQUEST_I_FRAME);
  2751. if (rc)
  2752. return rc;
  2753. }
  2754. }
  2755. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32_ENUM,
  2756. &hfi_value, sizeof(u32), __func__);
  2757. if (rc)
  2758. return rc;
  2759. return rc;
  2760. }
  2761. int msm_vidc_set_rotation(void *instance,
  2762. enum msm_vidc_inst_capability_type cap_id)
  2763. {
  2764. int rc = 0;
  2765. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  2766. u32 hfi_value;
  2767. if (!inst || !inst->capabilities) {
  2768. d_vpr_e("%s: invalid params\n", __func__);
  2769. return -EINVAL;
  2770. }
  2771. rc = msm_vidc_v4l2_to_hfi_enum(inst, cap_id, &hfi_value);
  2772. if (rc)
  2773. return -EINVAL;
  2774. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32,
  2775. &hfi_value, sizeof(u32), __func__);
  2776. if (rc)
  2777. return rc;
  2778. return rc;
  2779. }
  2780. int msm_vidc_set_blur_resolution(void *instance,
  2781. enum msm_vidc_inst_capability_type cap_id)
  2782. {
  2783. int rc = 0;
  2784. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  2785. s32 blur_type = -1;
  2786. u32 hfi_value, blur_width, blur_height;
  2787. if (!inst || !inst->capabilities) {
  2788. d_vpr_e("%s: invalid params\n", __func__);
  2789. return -EINVAL;
  2790. }
  2791. if (msm_vidc_get_parent_value(inst, cap_id,
  2792. BLUR_TYPES, &blur_type, __func__))
  2793. return -EINVAL;
  2794. if (blur_type != VIDC_BLUR_EXTERNAL)
  2795. return 0;
  2796. hfi_value = inst->capabilities->cap[cap_id].value;
  2797. blur_width = (hfi_value & 0xFFFF0000) >> 16;
  2798. blur_height = hfi_value & 0xFFFF;
  2799. if (blur_width > inst->crop.width ||
  2800. blur_height > inst->crop.height) {
  2801. i_vpr_e(inst,
  2802. "%s: blur wxh: %dx%d exceeds crop wxh: %dx%d\n",
  2803. __func__, blur_width, blur_height,
  2804. inst->crop.width, inst->crop.height);
  2805. hfi_value = 0;
  2806. }
  2807. if (blur_width == inst->crop.width &&
  2808. blur_height == inst->crop.height) {
  2809. i_vpr_e(inst,
  2810. "%s: blur wxh: %dx%d is equal to crop wxh: %dx%d\n",
  2811. __func__, blur_width, blur_height,
  2812. inst->crop.width, inst->crop.height);
  2813. hfi_value = 0;
  2814. }
  2815. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_32_PACKED,
  2816. &hfi_value, sizeof(u32), __func__);
  2817. if (rc)
  2818. return rc;
  2819. return rc;
  2820. }
  2821. static msm_venc_set_csc_coeff(struct msm_vidc_inst *inst,
  2822. const char *prop_name, u32 hfi_id, void *payload,
  2823. u32 payload_size, u32 row_count, u32 column_count)
  2824. {
  2825. int rc = 0;
  2826. i_vpr_h(inst,
  2827. "set cap: name: %24s, hard coded %dx%d matrix array\n",
  2828. prop_name, row_count, column_count);
  2829. rc = venus_hfi_session_property(inst,
  2830. hfi_id,
  2831. HFI_HOST_FLAGS_NONE,
  2832. HFI_PORT_BITSTREAM,
  2833. HFI_PAYLOAD_S32_ARRAY,
  2834. payload,
  2835. payload_size);
  2836. if (rc) {
  2837. i_vpr_e(inst,
  2838. "%s: failed to set %s to fw\n",
  2839. __func__, prop_name);
  2840. }
  2841. return rc;
  2842. }
  2843. int msm_vidc_set_csc_custom_matrix(void *instance,
  2844. enum msm_vidc_inst_capability_type cap_id)
  2845. {
  2846. int rc = 0;
  2847. int i;
  2848. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  2849. struct msm_vidc_core *core;
  2850. struct msm_vidc_csc_coeff *csc_coeff;
  2851. s32 matrix_payload[MAX_MATRIX_COEFFS + 2];
  2852. s32 csc_bias_payload[MAX_BIAS_COEFFS + 2];
  2853. s32 csc_limit_payload[MAX_LIMIT_COEFFS + 2];
  2854. if (!inst || !inst->capabilities || !inst->core) {
  2855. d_vpr_e("%s: invalid params\n", __func__);
  2856. return -EINVAL;
  2857. }
  2858. core = inst->core;
  2859. if (!core->platform) {
  2860. d_vpr_e("%s: invalid core platform\n", __func__);
  2861. return -EINVAL;
  2862. }
  2863. csc_coeff = &core->platform->data.csc_data;
  2864. if (!inst->capabilities->cap[cap_id].value ||
  2865. !inst->capabilities->cap[CSC].value) {
  2866. i_vpr_h(inst,
  2867. "%s: ignored as custom martix %u, csc %u\n",
  2868. __func__, inst->capabilities->cap[cap_id].value,
  2869. inst->capabilities->cap[CSC].value);
  2870. return 0;
  2871. }
  2872. /*
  2873. * first 2 u32's of payload in each case are for
  2874. * row and column count, next remaining u32's are
  2875. * for the actual payload values.
  2876. */
  2877. /* set custom matrix */
  2878. matrix_payload[0] = 3;
  2879. matrix_payload[1] = 3;
  2880. for(i = 0; i < MAX_MATRIX_COEFFS; i++) {
  2881. if ((i + 2) >= ARRAY_SIZE(matrix_payload))
  2882. break;
  2883. matrix_payload[i + 2] =
  2884. csc_coeff->vpe_csc_custom_matrix_coeff[i];
  2885. }
  2886. rc = msm_venc_set_csc_coeff(inst, "CSC_CUSTOM_MATRIX",
  2887. HFI_PROP_CSC_MATRIX, &matrix_payload[0],
  2888. ARRAY_SIZE(matrix_payload) * sizeof(s32),
  2889. matrix_payload[0], matrix_payload[1]);
  2890. if (rc)
  2891. return rc;
  2892. /* set csc bias */
  2893. csc_bias_payload[0] = 1;
  2894. csc_bias_payload[1] = 3;
  2895. for(i = 0; i < MAX_BIAS_COEFFS; i++) {
  2896. if ((i + 2) >= ARRAY_SIZE(csc_bias_payload))
  2897. break;
  2898. csc_bias_payload[i + 2] =
  2899. csc_coeff->vpe_csc_custom_bias_coeff[i];
  2900. }
  2901. rc = msm_venc_set_csc_coeff(inst, "CSC_BIAS",
  2902. HFI_PROP_CSC_BIAS, &csc_bias_payload[0],
  2903. ARRAY_SIZE(csc_bias_payload) * sizeof(s32),
  2904. csc_bias_payload[0], csc_bias_payload[1]);
  2905. if (rc)
  2906. return rc;
  2907. /* set csc limit */
  2908. csc_limit_payload[0] = 1;
  2909. csc_limit_payload[1] = 6;
  2910. for(i = 0; i < MAX_LIMIT_COEFFS; i++) {
  2911. if ((i + 2) >= ARRAY_SIZE(csc_limit_payload))
  2912. break;
  2913. csc_limit_payload[i + 2] =
  2914. csc_coeff->vpe_csc_custom_limit_coeff[i];
  2915. }
  2916. rc = msm_venc_set_csc_coeff(inst, "CSC_LIMIT",
  2917. HFI_PROP_CSC_LIMIT, &csc_limit_payload[0],
  2918. ARRAY_SIZE(csc_limit_payload) * sizeof(s32),
  2919. csc_limit_payload[0], csc_limit_payload[1]);
  2920. if (rc)
  2921. return rc;
  2922. return rc;
  2923. }
  2924. int msm_vidc_set_level(void *instance,
  2925. enum msm_vidc_inst_capability_type cap_id)
  2926. {
  2927. int rc = 0;
  2928. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  2929. u32 hfi_value = 0;
  2930. if (!inst || !inst->capabilities) {
  2931. d_vpr_e("%s: invalid params\n", __func__);
  2932. return -EINVAL;
  2933. }
  2934. hfi_value = inst->capabilities->cap[cap_id].value;
  2935. if (!(inst->capabilities->cap[cap_id].flags & CAP_FLAG_CLIENT_SET))
  2936. hfi_value = HFI_LEVEL_NONE;
  2937. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32_ENUM,
  2938. &hfi_value, sizeof(u32), __func__);
  2939. if (rc)
  2940. return rc;
  2941. return rc;
  2942. }
  2943. int msm_vidc_set_q16(void *instance,
  2944. enum msm_vidc_inst_capability_type cap_id)
  2945. {
  2946. int rc = 0;
  2947. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  2948. u32 hfi_value = 0;
  2949. if (!inst || !inst->capabilities) {
  2950. d_vpr_e("%s: invalid params\n", __func__);
  2951. return -EINVAL;
  2952. }
  2953. hfi_value = inst->capabilities->cap[cap_id].value;
  2954. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_Q16,
  2955. &hfi_value, sizeof(u32), __func__);
  2956. if (rc)
  2957. return rc;
  2958. return rc;
  2959. }
  2960. int msm_vidc_set_u32(void *instance,
  2961. enum msm_vidc_inst_capability_type cap_id)
  2962. {
  2963. int rc = 0;
  2964. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  2965. u32 hfi_value;
  2966. if (!inst || !inst->capabilities) {
  2967. d_vpr_e("%s: invalid params\n", __func__);
  2968. return -EINVAL;
  2969. }
  2970. if (inst->capabilities->cap[cap_id].flags & CAP_FLAG_MENU) {
  2971. rc = msm_vidc_v4l2_menu_to_hfi(inst, cap_id, &hfi_value);
  2972. if (rc)
  2973. return -EINVAL;
  2974. } else {
  2975. hfi_value = inst->capabilities->cap[cap_id].value;
  2976. }
  2977. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32,
  2978. &hfi_value, sizeof(u32), __func__);
  2979. if (rc)
  2980. return rc;
  2981. return rc;
  2982. }
  2983. int msm_vidc_set_u32_enum(void *instance,
  2984. enum msm_vidc_inst_capability_type cap_id)
  2985. {
  2986. int rc = 0;
  2987. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  2988. u32 hfi_value;
  2989. if (!inst || !inst->capabilities) {
  2990. d_vpr_e("%s: invalid params\n", __func__);
  2991. return -EINVAL;
  2992. }
  2993. rc = msm_vidc_v4l2_to_hfi_enum(inst, cap_id, &hfi_value);
  2994. if (rc)
  2995. return -EINVAL;
  2996. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32_ENUM,
  2997. &hfi_value, sizeof(u32), __func__);
  2998. if (rc)
  2999. return rc;
  3000. return rc;
  3001. }
  3002. int msm_vidc_set_s32(void *instance,
  3003. enum msm_vidc_inst_capability_type cap_id)
  3004. {
  3005. int rc = 0;
  3006. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  3007. s32 hfi_value = 0;
  3008. if (!inst || !inst->capabilities) {
  3009. d_vpr_e("%s: invalid params\n", __func__);
  3010. return -EINVAL;
  3011. }
  3012. hfi_value = inst->capabilities->cap[cap_id].value;
  3013. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_S32,
  3014. &hfi_value, sizeof(s32), __func__);
  3015. if (rc)
  3016. return rc;
  3017. return rc;
  3018. }
  3019. int msm_vidc_set_v4l2_properties(struct msm_vidc_inst *inst)
  3020. {
  3021. int rc = 0;
  3022. struct msm_vidc_inst_capability *capability;
  3023. struct msm_vidc_inst_cap_entry *curr_node = NULL, *tmp_node = NULL;
  3024. if (!inst || !inst->capabilities) {
  3025. d_vpr_e("%s: invalid params\n", __func__);
  3026. return -EINVAL;
  3027. }
  3028. i_vpr_h(inst, "%s()\n", __func__);
  3029. capability = inst->capabilities;
  3030. list_for_each_entry_safe(curr_node, tmp_node,
  3031. &inst->firmware.list, list) {
  3032. /* cap_id's like PIX_FMT etc may not have set functions */
  3033. if (!capability->cap[curr_node->cap_id].set)
  3034. continue;
  3035. rc = capability->cap[curr_node->cap_id].set(inst,
  3036. curr_node->cap_id);
  3037. if (rc)
  3038. goto exit;
  3039. list_del(&curr_node->list);
  3040. kfree(curr_node);
  3041. }
  3042. exit:
  3043. msm_vidc_free_capabililty_list(inst, FW_LIST);
  3044. return rc;
  3045. }
  3046. int msm_vidc_v4l2_menu_to_hfi(struct msm_vidc_inst *inst,
  3047. enum msm_vidc_inst_capability_type cap_id, u32 *value)
  3048. {
  3049. struct msm_vidc_inst_capability *capability = inst->capabilities;
  3050. switch (capability->cap[cap_id].v4l2_id) {
  3051. case V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE:
  3052. switch (capability->cap[cap_id].value) {
  3053. case V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CABAC:
  3054. *value = 1;
  3055. break;
  3056. case V4L2_MPEG_VIDEO_H264_ENTROPY_MODE_CAVLC:
  3057. *value = 0;
  3058. break;
  3059. default:
  3060. *value = 1;
  3061. goto set_default;
  3062. }
  3063. return 0;
  3064. default:
  3065. i_vpr_e(inst,
  3066. "%s: mapping not specified for ctrl_id: %#x\n",
  3067. __func__, capability->cap[cap_id].v4l2_id);
  3068. return -EINVAL;
  3069. }
  3070. set_default:
  3071. i_vpr_e(inst,
  3072. "%s: invalid value %d for ctrl id: %#x. Set default: %u\n",
  3073. __func__, capability->cap[cap_id].value,
  3074. capability->cap[cap_id].v4l2_id, *value);
  3075. return 0;
  3076. }
  3077. int msm_vidc_v4l2_to_hfi_enum(struct msm_vidc_inst *inst,
  3078. enum msm_vidc_inst_capability_type cap_id, u32 *value)
  3079. {
  3080. struct msm_vidc_inst_capability *capability = inst->capabilities;
  3081. switch (capability->cap[cap_id].v4l2_id) {
  3082. case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
  3083. *value = inst->hfi_rc_type;
  3084. return 0;
  3085. case V4L2_CID_MPEG_VIDEO_HEVC_PROFILE:
  3086. case V4L2_CID_MPEG_VIDEO_H264_PROFILE:
  3087. case V4L2_CID_MPEG_VIDEO_VP9_PROFILE:
  3088. case V4L2_CID_MPEG_VIDEO_AV1_PROFILE:
  3089. case V4L2_CID_MPEG_VIDEO_HEVC_LEVEL:
  3090. case V4L2_CID_MPEG_VIDEO_H264_LEVEL:
  3091. case V4L2_CID_MPEG_VIDEO_AV1_LEVEL:
  3092. case V4L2_CID_MPEG_VIDEO_HEVC_TIER:
  3093. case V4L2_CID_MPEG_VIDEO_AV1_TIER:
  3094. case V4L2_CID_MPEG_VIDC_VIDEO_BLUR_TYPES:
  3095. *value = capability->cap[cap_id].value;
  3096. return 0;
  3097. case V4L2_CID_MPEG_VIDEO_HEVC_HIER_CODING_TYPE:
  3098. switch (capability->cap[cap_id].value) {
  3099. case V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_B:
  3100. *value = HFI_HIER_B;
  3101. break;
  3102. case V4L2_MPEG_VIDEO_HEVC_HIERARCHICAL_CODING_P:
  3103. //TODO (AS): check if this is right mapping
  3104. *value = HFI_HIER_P_SLIDING_WINDOW;
  3105. break;
  3106. default:
  3107. *value = HFI_HIER_P_SLIDING_WINDOW;
  3108. goto set_default;
  3109. }
  3110. return 0;
  3111. case V4L2_CID_ROTATE:
  3112. switch (capability->cap[cap_id].value) {
  3113. case 0:
  3114. *value = HFI_ROTATION_NONE;
  3115. break;
  3116. case 90:
  3117. *value = HFI_ROTATION_90;
  3118. break;
  3119. case 180:
  3120. *value = HFI_ROTATION_180;
  3121. break;
  3122. case 270:
  3123. *value = HFI_ROTATION_270;
  3124. break;
  3125. default:
  3126. *value = HFI_ROTATION_NONE;
  3127. goto set_default;
  3128. }
  3129. return 0;
  3130. case V4L2_CID_MPEG_VIDEO_HEVC_LOOP_FILTER_MODE:
  3131. switch (capability->cap[cap_id].value) {
  3132. case V4L2_MPEG_VIDEO_HEVC_LOOP_FILTER_MODE_ENABLED:
  3133. *value = HFI_DEBLOCK_ALL_BOUNDARY;
  3134. break;
  3135. case V4L2_MPEG_VIDEO_HEVC_LOOP_FILTER_MODE_DISABLED:
  3136. *value = HFI_DEBLOCK_DISABLE;
  3137. break;
  3138. case DB_HEVC_DISABLE_SLICE_BOUNDARY:
  3139. *value = HFI_DEBLOCK_DISABLE_AT_SLICE_BOUNDARY;
  3140. break;
  3141. default:
  3142. *value = HFI_DEBLOCK_ALL_BOUNDARY;
  3143. goto set_default;
  3144. }
  3145. return 0;
  3146. case V4L2_CID_MPEG_VIDEO_H264_LOOP_FILTER_MODE:
  3147. switch (capability->cap[cap_id].value) {
  3148. case V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_ENABLED:
  3149. *value = HFI_DEBLOCK_ALL_BOUNDARY;
  3150. break;
  3151. case V4L2_MPEG_VIDEO_H264_LOOP_FILTER_MODE_DISABLED:
  3152. *value = HFI_DEBLOCK_DISABLE;
  3153. break;
  3154. case DB_H264_DISABLE_SLICE_BOUNDARY:
  3155. *value = HFI_DEBLOCK_DISABLE_AT_SLICE_BOUNDARY;
  3156. break;
  3157. default:
  3158. *value = HFI_DEBLOCK_ALL_BOUNDARY;
  3159. goto set_default;
  3160. }
  3161. return 0;
  3162. case V4L2_CID_MPEG_VIDEO_HEVC_SIZE_OF_LENGTH_FIELD:
  3163. switch (capability->cap[cap_id].value) {
  3164. case V4L2_MPEG_VIDEO_HEVC_SIZE_4:
  3165. *value = HFI_NAL_LENGTH_SIZE_4;
  3166. break;
  3167. default:
  3168. *value = HFI_NAL_LENGTH_STARTCODES;
  3169. goto set_default;
  3170. }
  3171. return 0;
  3172. default:
  3173. i_vpr_e(inst,
  3174. "%s: mapping not specified for ctrl_id: %#x\n",
  3175. __func__, capability->cap[cap_id].v4l2_id);
  3176. return -EINVAL;
  3177. }
  3178. set_default:
  3179. i_vpr_e(inst,
  3180. "%s: invalid value %d for ctrl id: %#x. Set default: %u\n",
  3181. __func__, capability->cap[cap_id].value,
  3182. capability->cap[cap_id].v4l2_id, *value);
  3183. return 0;
  3184. }
  3185. int msm_vidc_set_stage(void *instance,
  3186. enum msm_vidc_inst_capability_type cap_id)
  3187. {
  3188. int rc = 0;
  3189. u32 stage = 0;
  3190. struct msm_vidc_core *core;
  3191. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  3192. if (!inst || !inst->capabilities || !inst->core) {
  3193. d_vpr_e("%s: invalid params\n", __func__);
  3194. return -EINVAL;
  3195. }
  3196. core = inst->core;
  3197. rc = call_session_op(core, decide_work_mode, inst);
  3198. if (rc) {
  3199. i_vpr_e(inst, "%s: decide_work_mode failed\n", __func__);
  3200. return -EINVAL;
  3201. }
  3202. stage = inst->capabilities->cap[STAGE].value;
  3203. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32,
  3204. &stage, sizeof(u32), __func__);
  3205. if (rc)
  3206. return rc;
  3207. return rc;
  3208. }
  3209. int msm_vidc_set_pipe(void *instance,
  3210. enum msm_vidc_inst_capability_type cap_id)
  3211. {
  3212. int rc = 0;
  3213. u32 pipe;
  3214. struct msm_vidc_core *core;
  3215. struct msm_vidc_inst *inst = (struct msm_vidc_inst *)instance;
  3216. if (!inst || !inst->capabilities || !inst->core) {
  3217. d_vpr_e("%s: invalid params\n", __func__);
  3218. return -EINVAL;
  3219. }
  3220. core = inst->core;
  3221. rc = call_session_op(core, decide_work_route, inst);
  3222. if (rc) {
  3223. i_vpr_e(inst, "%s: decide_work_route failed\n",
  3224. __func__);
  3225. return -EINVAL;
  3226. }
  3227. pipe = inst->capabilities->cap[PIPE].value;
  3228. rc = msm_vidc_packetize_control(inst, cap_id, HFI_PAYLOAD_U32,
  3229. &pipe, sizeof(u32), __func__);
  3230. if (rc)
  3231. return rc;
  3232. return rc;
  3233. }
  3234. int msm_vidc_set_seq_change_at_sync_frame(void *instance)
  3235. {
  3236. int rc = 0;
  3237. u32 payload;
  3238. struct msm_vidc_inst* inst = (struct msm_vidc_inst*)instance;
  3239. if (!inst || !inst->capabilities) {
  3240. d_vpr_e("%s: invalid params\n", __func__);
  3241. return -EINVAL;
  3242. }
  3243. payload = inst->capabilities->cap[LOWLATENCY_MODE].value;
  3244. rc = msm_vidc_packetize_control(inst, LOWLATENCY_MODE, HFI_PAYLOAD_U32,
  3245. &payload, sizeof(u32), __func__);
  3246. if (rc)
  3247. return rc;
  3248. return rc;
  3249. }