vpuapifunc.c 194 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121
  1. /*
  2. * Copyright (c) 2019, Chips&Media
  3. * All rights reserved.
  4. *
  5. * Redistribution and use in source and binary forms, with or without
  6. * modification, are permitted provided that the following conditions are met:
  7. *
  8. * 1. Redistributions of source code must retain the above copyright notice, this
  9. * list of conditions and the following disclaimer.
  10. * 2. Redistributions in binary form must reproduce the above copyright notice,
  11. * this list of conditions and the following disclaimer in the documentation
  12. * and/or other materials provided with the distribution.
  13. *
  14. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  15. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  16. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  17. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
  18. * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  19. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  20. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  21. * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  22. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  23. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  24. */
  25. #include "vpuapifunc.h"
  26. #include "product.h"
  27. #include "coda9/coda9.h"
  28. #include "coda9/coda9_regdefine.h"
  29. #include "coda9/coda9_vpuconfig.h"
  30. #include "wave/wave5_regdefine.h"
  31. #include "misc/debug.h"
  32. #ifndef MIN
  33. #define MIN(a, b) (((a) < (b)) ? (a) : (b))
  34. #endif
  35. #ifndef MAX
  36. #define MAX(a, b) (((a) > (b)) ? (a) : (b))
  37. #endif
  38. #define MAX_LAVEL_IDX 16
  39. static const int g_anLevel[MAX_LAVEL_IDX] =
  40. {
  41. 10, 11, 11, 12, 13,
  42. //10, 16, 11, 12, 13,
  43. 20, 21, 22,
  44. 30, 31, 32,
  45. 40, 41, 42,
  46. 50, 51
  47. };
  48. static const int g_anLevelMaxMBPS[MAX_LAVEL_IDX] =
  49. {
  50. 1485, 1485, 3000, 6000, 11880,
  51. 11880, 19800, 20250,
  52. 40500, 108000, 216000,
  53. 245760, 245760, 522240,
  54. 589824, 983040
  55. };
  56. static const int g_anLevelMaxFS[MAX_LAVEL_IDX] =
  57. {
  58. 99, 99, 396, 396, 396,
  59. 396, 792, 1620,
  60. 1620, 3600, 5120,
  61. 8192, 8192, 8704,
  62. 22080, 36864
  63. };
  64. static const int g_anLevelMaxBR[MAX_LAVEL_IDX] =
  65. {
  66. 64, 64, 192, 384, 768,
  67. 2000, 4000, 4000,
  68. 10000, 14000, 20000,
  69. 20000, 50000, 50000,
  70. 135000, 240000
  71. };
  72. static const int g_anLevelSliceRate[MAX_LAVEL_IDX] =
  73. {
  74. 0, 0, 0, 0, 0,
  75. 0, 0, 0,
  76. 22, 60, 60,
  77. 60, 24, 24,
  78. 24, 24
  79. };
  80. static const int g_anLevelMaxMbs[MAX_LAVEL_IDX] =
  81. {
  82. 28, 28, 56, 56, 56,
  83. 56, 79, 113,
  84. 113, 169, 202,
  85. 256, 256, 263,
  86. 420, 543
  87. };
  88. /******************************************************************************
  89. define value
  90. ******************************************************************************/
  91. /******************************************************************************
  92. Codec Instance Slot Management
  93. ******************************************************************************/
  94. RetCode InitCodecInstancePool(Uint32 coreIdx)
  95. {
  96. int i;
  97. CodecInst * pCodecInst;
  98. vpu_instance_pool_t *vip;
  99. vip = (vpu_instance_pool_t *)vdi_get_instance_pool(coreIdx);
  100. if (!vip)
  101. return RETCODE_INSUFFICIENT_RESOURCE;
  102. if (vip->instance_pool_inited==0)
  103. {
  104. for( i = 0; i < MAX_NUM_INSTANCE; i++)
  105. {
  106. pCodecInst = (CodecInst *)vip->codecInstPool[i];
  107. pCodecInst->instIndex = i;
  108. pCodecInst->inUse = 0;
  109. }
  110. vip->instance_pool_inited = 1;
  111. }
  112. return RETCODE_SUCCESS;
  113. }
  114. /*
  115. * GetCodecInstance() obtains a instance.
  116. * It stores a pointer to the allocated instance in *ppInst
  117. * and returns RETCODE_SUCCESS on success.
  118. * Failure results in 0(null pointer) in *ppInst and RETCODE_FAILURE.
  119. */
  120. RetCode GetCodecInstance(Uint32 coreIdx, CodecInst ** ppInst)
  121. {
  122. int i;
  123. CodecInst* pCodecInst = 0;
  124. vpu_instance_pool_t* vip;
  125. Uint32 handleSize;
  126. vip = (vpu_instance_pool_t *)vdi_get_instance_pool(coreIdx);
  127. if (!vip)
  128. return RETCODE_INSUFFICIENT_RESOURCE;
  129. for (i = 0; i < MAX_NUM_INSTANCE; i++) {
  130. pCodecInst = (CodecInst *)vip->codecInstPool[i];
  131. if (!pCodecInst) {
  132. return RETCODE_FAILURE;
  133. }
  134. if (!pCodecInst->inUse) {
  135. break;
  136. }
  137. }
  138. if (i == MAX_NUM_INSTANCE) {
  139. *ppInst = 0;
  140. return RETCODE_FAILURE;
  141. }
  142. pCodecInst->inUse = 1;
  143. pCodecInst->coreIdx = coreIdx;
  144. pCodecInst->codecMode = -1;
  145. pCodecInst->codecModeAux = -1;
  146. pCodecInst->loggingEnable = 0;
  147. pCodecInst->isDecoder = TRUE;
  148. pCodecInst->productId = ProductVpuGetId(coreIdx);
  149. osal_memset((void*)&pCodecInst->CodecInfo, 0x00, sizeof(pCodecInst->CodecInfo));
  150. handleSize = sizeof(DecInfo);
  151. if (handleSize < sizeof(EncInfo)) {
  152. handleSize = sizeof(EncInfo);
  153. }
  154. if ((pCodecInst->CodecInfo=(void*)osal_malloc(handleSize)) == NULL) {
  155. return RETCODE_INSUFFICIENT_RESOURCE;
  156. }
  157. osal_memset(pCodecInst->CodecInfo, 0x00, sizeof(handleSize));
  158. *ppInst = pCodecInst;
  159. if (vdi_open_instance(pCodecInst->coreIdx, pCodecInst->instIndex) < 0) {
  160. return RETCODE_FAILURE;
  161. }
  162. return RETCODE_SUCCESS;
  163. }
  164. void FreeCodecInstance(CodecInst * pCodecInst)
  165. {
  166. pCodecInst->codecMode = -1;
  167. pCodecInst->codecModeAux = -1;
  168. vdi_close_instance(pCodecInst->coreIdx, pCodecInst->instIndex);
  169. osal_free(pCodecInst->CodecInfo);
  170. pCodecInst->CodecInfo = NULL;
  171. pCodecInst->inUse = 0;
  172. }
  173. RetCode CheckInstanceValidity(CodecInst * pCodecInst)
  174. {
  175. int i;
  176. vpu_instance_pool_t *vip;
  177. vip = (vpu_instance_pool_t *)vdi_get_instance_pool(pCodecInst->coreIdx);
  178. if (!vip)
  179. return RETCODE_INSUFFICIENT_RESOURCE;
  180. for (i = 0; i < MAX_NUM_INSTANCE; i++) {
  181. if ((CodecInst *)vip->codecInstPool[i] == pCodecInst)
  182. return RETCODE_SUCCESS;
  183. }
  184. return RETCODE_INVALID_HANDLE;
  185. }
  186. /******************************************************************************
  187. API Subroutines
  188. ******************************************************************************/
  189. RetCode CheckDecOpenParam(DecOpenParam * pop)
  190. {
  191. if (pop == 0) {
  192. return RETCODE_INVALID_PARAM;
  193. }
  194. if (pop->bitstreamBuffer % 8) {
  195. return RETCODE_INVALID_PARAM;
  196. }
  197. if (pop->bitstreamBufferSize % 1024 ||
  198. pop->bitstreamBufferSize < 1024 ||
  199. pop->bitstreamBufferSize > (256*1024*1024-1) ) {
  200. return RETCODE_INVALID_PARAM;
  201. }
  202. if (pop->bitstreamFormat != STD_AVC
  203. && pop->bitstreamFormat != STD_VC1
  204. && pop->bitstreamFormat != STD_MPEG2
  205. && pop->bitstreamFormat != STD_H263
  206. && pop->bitstreamFormat != STD_MPEG4
  207. && pop->bitstreamFormat != STD_DIV3
  208. && pop->bitstreamFormat != STD_RV
  209. && pop->bitstreamFormat != STD_AVS
  210. && pop->bitstreamFormat != STD_THO
  211. && pop->bitstreamFormat != STD_VP3
  212. && pop->bitstreamFormat != STD_VP8
  213. && pop->bitstreamFormat != STD_HEVC
  214. && pop->bitstreamFormat != STD_VP9
  215. && pop->bitstreamFormat != STD_AVS2
  216. && pop->bitstreamFormat != STD_AV1)
  217. {
  218. return RETCODE_INVALID_PARAM;
  219. }
  220. if( pop->mp4DeblkEnable == 1 && !(pop->bitstreamFormat == STD_MPEG4 || pop->bitstreamFormat == STD_MPEG2 || pop->bitstreamFormat == STD_DIV3)) {
  221. return RETCODE_INVALID_PARAM;
  222. }
  223. if (pop->wtlEnable && pop->tiled2LinearEnable) {
  224. return RETCODE_INVALID_PARAM;
  225. }
  226. if (pop->wtlEnable) {
  227. if (pop->wtlMode != FF_FRAME && pop->wtlMode != FF_FIELD ) {
  228. return RETCODE_INVALID_PARAM;
  229. }
  230. }
  231. if (pop->coreIdx > MAX_NUM_VPU_CORE) {
  232. return RETCODE_INVALID_PARAM;
  233. }
  234. return RETCODE_SUCCESS;
  235. }
  236. Uint64 GetTimestamp(
  237. EncHandle handle
  238. )
  239. {
  240. CodecInst* pCodecInst = (CodecInst*)handle;
  241. EncInfo* pEncInfo = NULL;
  242. Uint64 pts;
  243. Uint32 fps;
  244. if (pCodecInst == NULL) {
  245. return 0;
  246. }
  247. pEncInfo = &pCodecInst->CodecInfo->encInfo;
  248. fps = pEncInfo->openParam.frameRateInfo;
  249. if (fps == 0) {
  250. fps = 30; /* 30 fps */
  251. }
  252. pts = pEncInfo->curPTS;
  253. pEncInfo->curPTS += 90000/fps; /* 90KHz/fps */
  254. return pts;
  255. }
  256. RetCode CalcEncCropInfo(CodecInst* instance, EncWaveParam* param, int rotMode, int srcWidth, int srcHeight)
  257. {
  258. int alignedWidth, alignedHeight, pad_right, pad_bot;
  259. int crop_right, crop_left, crop_top, crop_bot;
  260. int prp_mode = rotMode>>1; // remove prp_enable bit
  261. if (instance->codecMode == W_AVC_ENC) {
  262. alignedWidth = (srcWidth + 15)&~15;
  263. alignedHeight= (srcHeight+ 15)&~15;
  264. }
  265. else {
  266. alignedWidth = (srcWidth + 31)&~31;
  267. alignedHeight= (srcHeight+ 31)&~31;
  268. }
  269. pad_right = alignedWidth - srcWidth;
  270. pad_bot = alignedHeight - srcHeight;
  271. if (param->confWinRight > 0)
  272. crop_right = param->confWinRight + pad_right;
  273. else
  274. crop_right = pad_right;
  275. if (param->confWinBot > 0)
  276. crop_bot = param->confWinBot + pad_bot;
  277. else
  278. crop_bot = pad_bot;
  279. crop_top = param->confWinTop;
  280. crop_left = param->confWinLeft;
  281. param->confWinTop = crop_top;
  282. param->confWinLeft = crop_left;
  283. param->confWinBot = crop_bot;
  284. param->confWinRight = crop_right;
  285. /* prp_mode :
  286. * | hor_mir | ver_mir | rot_angle
  287. * [3] [2] [1:0] = {0= NONE, 1:90, 2:180, 3:270}
  288. */
  289. if(prp_mode == 1 || prp_mode ==15)
  290. {
  291. param->confWinTop = crop_right;
  292. param->confWinLeft = crop_top;
  293. param->confWinBot = crop_left;
  294. param->confWinRight = crop_bot;
  295. }
  296. else if(prp_mode == 2 || prp_mode ==12)
  297. {
  298. param->confWinTop = crop_bot;
  299. param->confWinLeft = crop_right;
  300. param->confWinBot = crop_top;
  301. param->confWinRight = crop_left;
  302. }
  303. else if(prp_mode == 3 || prp_mode ==13)
  304. {
  305. param->confWinTop = crop_left;
  306. param->confWinLeft = crop_bot;
  307. param->confWinBot = crop_right;
  308. param->confWinRight = crop_top;
  309. }
  310. else if(prp_mode == 4 || prp_mode ==10)
  311. {
  312. param->confWinTop = crop_bot;
  313. param->confWinBot = crop_top;
  314. }
  315. else if(prp_mode == 8 || prp_mode ==6)
  316. {
  317. param->confWinLeft = crop_right;
  318. param->confWinRight = crop_left;
  319. }
  320. else if(prp_mode == 5 || prp_mode ==11)
  321. {
  322. param->confWinTop = crop_left;
  323. param->confWinLeft = crop_top;
  324. param->confWinBot = crop_right;
  325. param->confWinRight = crop_bot;
  326. }
  327. else if(prp_mode == 7 || prp_mode ==9)
  328. {
  329. param->confWinTop = crop_right;
  330. param->confWinLeft = crop_bot;
  331. param->confWinBot = crop_left;
  332. param->confWinRight = crop_top;
  333. }
  334. return RETCODE_SUCCESS;
  335. }
  336. int DecBitstreamBufEmpty(DecInfo * pDecInfo)
  337. {
  338. return (pDecInfo->streamRdPtr == pDecInfo->streamWrPtr);
  339. }
  340. RetCode SetParaSet(DecHandle handle, int paraSetType, DecParamSet * para)
  341. {
  342. CodecInst * pCodecInst;
  343. PhysicalAddress paraBuffer;
  344. int i;
  345. Uint32 * src;
  346. pCodecInst = handle;
  347. src = para->paraSet;
  348. EnterLock(pCodecInst->coreIdx);
  349. paraBuffer = VpuReadReg(pCodecInst->coreIdx, BIT_PARA_BUF_ADDR);
  350. for (i = 0; i < para->size; i += 4) {
  351. VpuWriteReg(pCodecInst->coreIdx, paraBuffer + i, *src++);
  352. }
  353. VpuWriteReg(pCodecInst->coreIdx, CMD_DEC_PARA_SET_TYPE, paraSetType); // 0: SPS, 1: PPS
  354. VpuWriteReg(pCodecInst->coreIdx, CMD_DEC_PARA_SET_SIZE, para->size);
  355. Coda9BitIssueCommand(pCodecInst->coreIdx, pCodecInst, DEC_PARA_SET);
  356. if (vdi_wait_vpu_busy(pCodecInst->coreIdx, __VPU_BUSY_TIMEOUT, BIT_BUSY_FLAG) == -1) {
  357. if (pCodecInst->loggingEnable)
  358. vdi_log(pCodecInst->coreIdx, DEC_PARA_SET, 0);
  359. LeaveLock(pCodecInst->coreIdx);
  360. return RETCODE_VPU_RESPONSE_TIMEOUT;
  361. }
  362. if (pCodecInst->loggingEnable)
  363. vdi_log(pCodecInst->coreIdx, DEC_PARA_SET, 0);
  364. LeaveLock(pCodecInst->coreIdx);
  365. return RETCODE_SUCCESS;
  366. }
  367. void DecSetHostParaAddr(Uint32 coreIdx, PhysicalAddress baseAddr, PhysicalAddress paraBuffer)
  368. {
  369. BYTE tempBuf[8]={0,}; // 64bit bus & endian
  370. Uint32 val;
  371. val = paraBuffer;
  372. tempBuf[0] = 0;
  373. tempBuf[1] = 0;
  374. tempBuf[2] = 0;
  375. tempBuf[3] = 0;
  376. tempBuf[4] = (val >> 24) & 0xff;
  377. tempBuf[5] = (val >> 16) & 0xff;
  378. tempBuf[6] = (val >> 8) & 0xff;
  379. tempBuf[7] = (val >> 0) & 0xff;
  380. VpuWriteMem(coreIdx, baseAddr, (BYTE *)tempBuf, 8, VDI_BIG_ENDIAN);
  381. }
  382. RetCode CheckEncInstanceValidity(EncHandle handle)
  383. {
  384. CodecInst * pCodecInst;
  385. RetCode ret;
  386. if (handle == NULL)
  387. return RETCODE_INVALID_HANDLE;
  388. pCodecInst = handle;
  389. ret = CheckInstanceValidity(pCodecInst);
  390. if (ret != RETCODE_SUCCESS) {
  391. return RETCODE_INVALID_HANDLE;
  392. }
  393. if (!pCodecInst->inUse) {
  394. return RETCODE_INVALID_HANDLE;
  395. }
  396. if (pCodecInst->codecMode != MP4_ENC &&
  397. pCodecInst->codecMode != W_HEVC_ENC &&
  398. pCodecInst->codecMode != W_SVAC_ENC &&
  399. pCodecInst->codecMode != W_AVC_ENC &&
  400. pCodecInst->codecMode != AVC_ENC) {
  401. return RETCODE_INVALID_HANDLE;
  402. }
  403. return RETCODE_SUCCESS;
  404. }
  405. RetCode CheckEncParam(EncHandle handle, EncParam * param)
  406. {
  407. CodecInst *pCodecInst;
  408. EncInfo *pEncInfo;
  409. pCodecInst = handle;
  410. pEncInfo = &pCodecInst->CodecInfo->encInfo;
  411. if (param == 0) {
  412. return RETCODE_INVALID_PARAM;
  413. }
  414. if (param->skipPicture != 0 && param->skipPicture != 1) {
  415. return RETCODE_INVALID_PARAM;
  416. }
  417. if (param->skipPicture == 0) {
  418. if (param->sourceFrame == 0) {
  419. return RETCODE_INVALID_FRAME_BUFFER;
  420. }
  421. if (param->forceIPicture != 0 && param->forceIPicture != 1) {
  422. return RETCODE_INVALID_PARAM;
  423. }
  424. }
  425. if (pEncInfo->openParam.bitRate == 0) { // no rate control
  426. if (pCodecInst->codecMode == MP4_ENC) {
  427. if (param->quantParam < 1 || param->quantParam > 31) {
  428. return RETCODE_INVALID_PARAM;
  429. }
  430. }
  431. else if (pCodecInst->codecMode == W_HEVC_ENC || pCodecInst->codecMode == W_SVAC_ENC) {
  432. if (param->forcePicQpEnable == 1) {
  433. if (param->forcePicQpI < 0 || param->forcePicQpI > 63)
  434. return RETCODE_INVALID_PARAM;
  435. if (param->forcePicQpP < 0 || param->forcePicQpP > 63)
  436. return RETCODE_INVALID_PARAM;
  437. if (param->forcePicQpB < 0 || param->forcePicQpB > 63)
  438. return RETCODE_INVALID_PARAM;
  439. }
  440. if (pEncInfo->ringBufferEnable == 0) {
  441. if (param->picStreamBufferAddr % 16 || param->picStreamBufferSize == 0)
  442. return RETCODE_INVALID_PARAM;
  443. }
  444. }
  445. else { // AVC_ENC
  446. if (param->quantParam < 0 || param->quantParam > 51) {
  447. return RETCODE_INVALID_PARAM;
  448. }
  449. }
  450. }
  451. if (pEncInfo->ringBufferEnable == 0) {
  452. if (param->picStreamBufferAddr % 8 || param->picStreamBufferSize == 0) {
  453. return RETCODE_INVALID_PARAM;
  454. }
  455. }
  456. return RETCODE_SUCCESS;
  457. }
  458. /**
  459. * GetEncHeader()
  460. * 1. Generate encoder header bitstream
  461. * @param handle : encoder handle
  462. * @param encHeaderParam : encoder header parameter (buffer, size, type)
  463. * @return none
  464. */
  465. RetCode GetEncHeader(EncHandle handle, EncHeaderParam * encHeaderParam)
  466. {
  467. CodecInst * pCodecInst;
  468. EncInfo * pEncInfo;
  469. EncOpenParam *encOP;
  470. PhysicalAddress rdPtr;
  471. PhysicalAddress wrPtr;
  472. int flag=0;
  473. Uint32 val = 0;
  474. pCodecInst = handle;
  475. pEncInfo = &pCodecInst->CodecInfo->encInfo;
  476. encOP = &(pEncInfo->openParam);
  477. EnterLock(pCodecInst->coreIdx);
  478. SetPendingInst(pCodecInst->coreIdx, pCodecInst);
  479. if (pEncInfo->ringBufferEnable == 0) {
  480. if (pEncInfo->lineBufIntEn)
  481. val |= (0x1<<6);
  482. val |= (0x1<<5);
  483. val |= (0x1<<4);
  484. }
  485. else {
  486. val |= (0x1<<3);
  487. }
  488. val |= pEncInfo->openParam.streamEndian;
  489. VpuWriteReg(pCodecInst->coreIdx, BIT_BIT_STREAM_CTRL, val);
  490. if (pEncInfo->ringBufferEnable == 0) {
  491. VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_HEADER_BB_START, encHeaderParam->buf);
  492. VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_HEADER_BB_SIZE, encHeaderParam->size/1024);
  493. }
  494. if ((encHeaderParam->headerType == SPS_RBSP || encHeaderParam->headerType == SPS_RBSP_MVC) &&
  495. pEncInfo->openParam.bitstreamFormat == STD_AVC) {
  496. Uint32 CropV, CropH;
  497. if (encOP->EncStdParam.avcParam.frameCroppingFlag == 1) {
  498. flag = 1;
  499. CropH = encOP->EncStdParam.avcParam.frameCropLeft << 16;
  500. CropH |= encOP->EncStdParam.avcParam.frameCropRight;
  501. CropV = encOP->EncStdParam.avcParam.frameCropTop << 16;
  502. CropV |= encOP->EncStdParam.avcParam.frameCropBottom;
  503. VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_HEADER_FRAME_CROP_H, CropH);
  504. VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_HEADER_FRAME_CROP_V, CropV);
  505. }
  506. }
  507. VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_HEADER_CODE, encHeaderParam->headerType | (flag << 3)); // 0: SPS, 1: PPS
  508. VpuWriteReg(pCodecInst->coreIdx, pEncInfo->streamRdPtrRegAddr, pEncInfo->streamRdPtr);
  509. VpuWriteReg(pCodecInst->coreIdx, pEncInfo->streamWrPtrRegAddr, pEncInfo->streamWrPtr);
  510. Coda9BitIssueCommand(pCodecInst->coreIdx, pCodecInst, ENCODE_HEADER);
  511. if (vdi_wait_vpu_busy(pCodecInst->coreIdx, __VPU_BUSY_TIMEOUT, BIT_BUSY_FLAG) == -1) {
  512. if (pCodecInst->loggingEnable)
  513. vdi_log(pCodecInst->coreIdx, ENCODE_HEADER, 2);
  514. SetPendingInst(pCodecInst->coreIdx, 0);
  515. LeaveLock(pCodecInst->coreIdx);
  516. return RETCODE_VPU_RESPONSE_TIMEOUT;
  517. }
  518. if (pCodecInst->loggingEnable)
  519. vdi_log(pCodecInst->coreIdx, ENCODE_HEADER, 0);
  520. if (pEncInfo->ringBufferEnable == 0) {
  521. rdPtr = encHeaderParam->buf;
  522. wrPtr = VpuReadReg(pCodecInst->coreIdx, pEncInfo->streamWrPtrRegAddr);
  523. {
  524. encHeaderParam->size = wrPtr - rdPtr;
  525. }
  526. }
  527. else {
  528. rdPtr = VpuReadReg(pCodecInst->coreIdx, pEncInfo->streamRdPtrRegAddr);
  529. wrPtr = VpuReadReg(pCodecInst->coreIdx, pEncInfo->streamWrPtrRegAddr);
  530. encHeaderParam->buf = rdPtr;
  531. encHeaderParam->size = wrPtr - rdPtr;
  532. }
  533. pEncInfo->streamWrPtr = wrPtr;
  534. pEncInfo->streamRdPtr = rdPtr;
  535. SetPendingInst(pCodecInst->coreIdx, 0);
  536. LeaveLock(pCodecInst->coreIdx);
  537. return RETCODE_SUCCESS;
  538. }
  539. /**
  540. * EncParaSet()
  541. * 1. Setting encoder header option
  542. * 2. Get RBSP format header in PARA_BUF
  543. * @param handle : encoder handle
  544. * @param paraSetType : encoder header type >> SPS: 0, PPS: 1, VOS: 1, VO: 2, VOL: 0
  545. * @return none
  546. */
  547. RetCode EncParaSet(EncHandle handle, int paraSetType)
  548. {
  549. CodecInst * pCodecInst;
  550. EncInfo * pEncInfo;
  551. int flag = 0;
  552. int encHeaderCode = paraSetType;
  553. EncOpenParam *encOP;
  554. pCodecInst = handle;
  555. pEncInfo = &pCodecInst->CodecInfo->encInfo;
  556. encOP = &(pEncInfo->openParam);
  557. EnterLock(pCodecInst->coreIdx);
  558. if( (paraSetType == SPS_RBSP_MVC || paraSetType == SPS_RBSP) && pEncInfo->openParam.bitstreamFormat == STD_AVC) {
  559. Uint32 CropV, CropH;
  560. if (encOP->EncStdParam.avcParam.frameCroppingFlag == 1) {
  561. flag = 1;
  562. CropH = encOP->EncStdParam.avcParam.frameCropLeft << 16;
  563. CropH |= encOP->EncStdParam.avcParam.frameCropRight;
  564. CropV = encOP->EncStdParam.avcParam.frameCropTop << 16;
  565. CropV |= encOP->EncStdParam.avcParam.frameCropBottom;
  566. VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_HEADER_FRAME_CROP_H, CropH );
  567. VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_HEADER_FRAME_CROP_V, CropV );
  568. }
  569. }
  570. encHeaderCode |= paraSetType| (flag<<2); //paraSetType>> SPS: 0, PPS: 1, VOS: 1, VO: 2, VOL: 0
  571. VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARA_SET_TYPE, encHeaderCode);
  572. Coda9BitIssueCommand(pCodecInst->coreIdx, pCodecInst, ENC_PARA_SET);
  573. if (vdi_wait_vpu_busy(pCodecInst->coreIdx, __VPU_BUSY_TIMEOUT, BIT_BUSY_FLAG) == -1) {
  574. if (pCodecInst->loggingEnable)
  575. vdi_log(pCodecInst->coreIdx, ENC_PARA_SET, 2);
  576. LeaveLock(pCodecInst->coreIdx);
  577. return RETCODE_VPU_RESPONSE_TIMEOUT;
  578. }
  579. if (pCodecInst->loggingEnable)
  580. vdi_log(pCodecInst->coreIdx, ENC_PARA_SET, 0);
  581. LeaveLock(pCodecInst->coreIdx);
  582. return RETCODE_SUCCESS;
  583. }
  584. RetCode SetGopNumber(EncHandle handle, Uint32 *pGopNumber)
  585. {
  586. CodecInst * pCodecInst;
  587. int data =0;
  588. Uint32 gopNumber = *pGopNumber;
  589. pCodecInst = handle;
  590. data = 1;
  591. EnterLock(pCodecInst->coreIdx);
  592. VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_CHANGE_ENABLE, data);
  593. VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_CHANGE_GOP_NUM, gopNumber);
  594. Coda9BitIssueCommand(pCodecInst->coreIdx, pCodecInst, RC_CHANGE_PARAMETER);
  595. if (vdi_wait_vpu_busy(pCodecInst->coreIdx, __VPU_BUSY_TIMEOUT, BIT_BUSY_FLAG) == -1) {
  596. if (pCodecInst->loggingEnable)
  597. vdi_log(pCodecInst->coreIdx, RC_CHANGE_PARAMETER, 2);
  598. LeaveLock(pCodecInst->coreIdx);
  599. return RETCODE_VPU_RESPONSE_TIMEOUT;
  600. }
  601. if (pCodecInst->loggingEnable)
  602. vdi_log(pCodecInst->coreIdx, RC_CHANGE_PARAMETER, 0);
  603. LeaveLock(pCodecInst->coreIdx);
  604. return RETCODE_SUCCESS;
  605. }
  606. RetCode SetIntraQp(EncHandle handle, Uint32 *pIntraQp)
  607. {
  608. CodecInst * pCodecInst;
  609. int data =0;
  610. Uint32 intraQp = *pIntraQp;
  611. pCodecInst = handle;
  612. data = 1<<1;
  613. EnterLock(pCodecInst->coreIdx);
  614. VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_CHANGE_ENABLE, data);
  615. VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_CHANGE_INTRA_QP, intraQp);
  616. Coda9BitIssueCommand(pCodecInst->coreIdx, pCodecInst, RC_CHANGE_PARAMETER);
  617. if (vdi_wait_vpu_busy(pCodecInst->coreIdx, __VPU_BUSY_TIMEOUT, BIT_BUSY_FLAG) == -1) {
  618. if (pCodecInst->loggingEnable)
  619. vdi_log(pCodecInst->coreIdx, RC_CHANGE_PARAMETER, 2);
  620. LeaveLock(pCodecInst->coreIdx);
  621. return RETCODE_VPU_RESPONSE_TIMEOUT;
  622. }
  623. if (pCodecInst->loggingEnable)
  624. vdi_log(pCodecInst->coreIdx, RC_CHANGE_PARAMETER, 0);
  625. LeaveLock(pCodecInst->coreIdx);
  626. return RETCODE_SUCCESS;
  627. }
  628. RetCode SetBitrate(EncHandle handle, Uint32 *pBitrate)
  629. {
  630. CodecInst * pCodecInst;
  631. int data =0;
  632. Uint32 bitrate = *pBitrate;
  633. pCodecInst = handle;
  634. data = 1<<2;
  635. EnterLock(pCodecInst->coreIdx);
  636. VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_CHANGE_ENABLE, data);
  637. VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_CHANGE_BITRATE, bitrate);
  638. Coda9BitIssueCommand(pCodecInst->coreIdx, pCodecInst, RC_CHANGE_PARAMETER);
  639. if (vdi_wait_vpu_busy(pCodecInst->coreIdx, __VPU_BUSY_TIMEOUT, BIT_BUSY_FLAG) == -1) {
  640. if (pCodecInst->loggingEnable)
  641. vdi_log(pCodecInst->coreIdx, RC_CHANGE_PARAMETER, 2);
  642. LeaveLock(pCodecInst->coreIdx);
  643. return RETCODE_VPU_RESPONSE_TIMEOUT;
  644. }
  645. if (pCodecInst->loggingEnable)
  646. vdi_log(pCodecInst->coreIdx, RC_CHANGE_PARAMETER, 0);
  647. LeaveLock(pCodecInst->coreIdx);
  648. return RETCODE_SUCCESS;
  649. }
  650. RetCode SetFramerate(EncHandle handle, Uint32 *pFramerate)
  651. {
  652. CodecInst * pCodecInst;
  653. int data =0;
  654. Uint32 frameRate = *pFramerate;
  655. pCodecInst = handle;
  656. data = 1<<3;
  657. EnterLock(pCodecInst->coreIdx);
  658. VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_CHANGE_ENABLE, data);
  659. VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_CHANGE_F_RATE, frameRate);
  660. Coda9BitIssueCommand(pCodecInst->coreIdx, pCodecInst, RC_CHANGE_PARAMETER);
  661. if (vdi_wait_vpu_busy(pCodecInst->coreIdx, __VPU_BUSY_TIMEOUT, BIT_BUSY_FLAG) == -1) {
  662. if (pCodecInst->loggingEnable)
  663. vdi_log(pCodecInst->coreIdx, RC_CHANGE_PARAMETER, 2);
  664. LeaveLock(pCodecInst->coreIdx);
  665. return RETCODE_VPU_RESPONSE_TIMEOUT;
  666. }
  667. if (pCodecInst->loggingEnable)
  668. vdi_log(pCodecInst->coreIdx, RC_CHANGE_PARAMETER, 0);
  669. LeaveLock(pCodecInst->coreIdx);
  670. return RETCODE_SUCCESS;
  671. }
  672. RetCode SetIntraRefreshNum(EncHandle handle, Uint32 *pIntraRefreshNum)
  673. {
  674. CodecInst * pCodecInst;
  675. Uint32 intraRefreshNum = *pIntraRefreshNum;
  676. int data = 0;
  677. pCodecInst = handle;
  678. data = 1<<4;
  679. EnterLock(pCodecInst->coreIdx);
  680. VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_CHANGE_ENABLE, data);
  681. VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_CHANGE_INTRA_REFRESH, intraRefreshNum);
  682. Coda9BitIssueCommand(pCodecInst->coreIdx, pCodecInst, RC_CHANGE_PARAMETER);
  683. if (vdi_wait_vpu_busy(pCodecInst->coreIdx, __VPU_BUSY_TIMEOUT, BIT_BUSY_FLAG) == -1) {
  684. if (pCodecInst->loggingEnable)
  685. vdi_log(pCodecInst->coreIdx, RC_CHANGE_PARAMETER, 2);
  686. LeaveLock(pCodecInst->coreIdx);
  687. return RETCODE_VPU_RESPONSE_TIMEOUT;
  688. }
  689. if (pCodecInst->loggingEnable)
  690. vdi_log(pCodecInst->coreIdx, RC_CHANGE_PARAMETER, 0);
  691. LeaveLock(pCodecInst->coreIdx);
  692. return RETCODE_SUCCESS;
  693. }
  694. RetCode SetSliceMode(EncHandle handle, EncSliceMode *pSliceMode)
  695. {
  696. CodecInst * pCodecInst;
  697. Uint32 data = 0;
  698. int data2 = 0;
  699. pCodecInst = handle;
  700. EnterLock(pCodecInst->coreIdx);
  701. data = pSliceMode->sliceSize<<2 | pSliceMode->sliceSizeMode<<1 | pSliceMode->sliceMode;
  702. data2 = 1<<5;
  703. VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_CHANGE_ENABLE, data2);
  704. VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_CHANGE_SLICE_MODE, data);
  705. Coda9BitIssueCommand(pCodecInst->coreIdx, pCodecInst, RC_CHANGE_PARAMETER);
  706. if (vdi_wait_vpu_busy(pCodecInst->coreIdx, __VPU_BUSY_TIMEOUT, BIT_BUSY_FLAG) == -1) {
  707. if (pCodecInst->loggingEnable)
  708. vdi_log(pCodecInst->coreIdx, RC_CHANGE_PARAMETER, 2);
  709. LeaveLock(pCodecInst->coreIdx);
  710. return RETCODE_VPU_RESPONSE_TIMEOUT;
  711. }
  712. if (pCodecInst->loggingEnable)
  713. vdi_log(pCodecInst->coreIdx, RC_CHANGE_PARAMETER, 0);
  714. LeaveLock(pCodecInst->coreIdx);
  715. return RETCODE_SUCCESS;
  716. }
  717. RetCode SetHecMode(EncHandle handle, int mode)
  718. {
  719. CodecInst * pCodecInst;
  720. Uint32 HecMode = mode;
  721. int data = 0;
  722. pCodecInst = handle;
  723. data = 1 << 6;
  724. EnterLock(pCodecInst->coreIdx);
  725. VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_CHANGE_ENABLE, data);
  726. VpuWriteReg(pCodecInst->coreIdx, CMD_ENC_PARAM_CHANGE_HEC_MODE, HecMode);
  727. Coda9BitIssueCommand(pCodecInst->coreIdx, pCodecInst, RC_CHANGE_PARAMETER);
  728. if (vdi_wait_vpu_busy(pCodecInst->coreIdx, __VPU_BUSY_TIMEOUT, BIT_BUSY_FLAG) == -1) {
  729. if (pCodecInst->loggingEnable)
  730. vdi_log(pCodecInst->coreIdx, RC_CHANGE_PARAMETER, 2);
  731. LeaveLock(pCodecInst->coreIdx);
  732. return RETCODE_VPU_RESPONSE_TIMEOUT;
  733. }
  734. if (pCodecInst->loggingEnable)
  735. vdi_log(pCodecInst->coreIdx, RC_CHANGE_PARAMETER, 0);
  736. LeaveLock(pCodecInst->coreIdx);
  737. return RETCODE_SUCCESS;
  738. }
  739. void EncSetHostParaAddr(Uint32 coreIdx, PhysicalAddress baseAddr, PhysicalAddress paraAddr)
  740. {
  741. BYTE tempBuf[8]={0,}; // 64bit bus & endian
  742. Uint32 val;
  743. val = paraAddr;
  744. tempBuf[0] = 0;
  745. tempBuf[1] = 0;
  746. tempBuf[2] = 0;
  747. tempBuf[3] = 0;
  748. tempBuf[4] = (val >> 24) & 0xff;
  749. tempBuf[5] = (val >> 16) & 0xff;
  750. tempBuf[6] = (val >> 8) & 0xff;
  751. tempBuf[7] = (val >> 0) & 0xff;
  752. VpuWriteMem(coreIdx, baseAddr, (BYTE *)tempBuf, 8, VDI_BIG_ENDIAN);
  753. }
  754. RetCode EnterDispFlagLock(Uint32 coreIdx)
  755. {
  756. if (vdi_disp_lock(coreIdx) != 0)
  757. return RETCODE_FAILURE;
  758. return RETCODE_SUCCESS;
  759. }
  760. RetCode LeaveDispFlagLock(Uint32 coreIdx)
  761. {
  762. vdi_disp_unlock(coreIdx);
  763. return RETCODE_SUCCESS;
  764. }
  765. RetCode EnterLock(Uint32 coreIdx)
  766. {
  767. if (vdi_lock(coreIdx) != 0)
  768. return RETCODE_FAILURE;
  769. SetClockGate(coreIdx, 1);
  770. return RETCODE_SUCCESS;
  771. }
  772. RetCode LeaveLock(Uint32 coreIdx)
  773. {
  774. SetClockGate(coreIdx, 0);
  775. vdi_unlock(coreIdx);
  776. return RETCODE_SUCCESS;
  777. }
  778. RetCode SetClockGate(Uint32 coreIdx, Uint32 on)
  779. {
  780. vpu_instance_pool_t *vip;
  781. vip = (vpu_instance_pool_t *)vdi_get_instance_pool(coreIdx);
  782. if (!vip) {
  783. VLOG(ERR, "SetClockGate: RETCODE_INSUFFICIENT_RESOURCE\n");
  784. return RETCODE_INSUFFICIENT_RESOURCE;
  785. }
  786. vdi_set_clock_gate(coreIdx, on);
  787. return RETCODE_SUCCESS;
  788. }
  789. void SetPendingInst(Uint32 coreIdx, CodecInst *inst)
  790. {
  791. vpu_instance_pool_t *vip;
  792. vip = (vpu_instance_pool_t *)vdi_get_instance_pool(coreIdx);
  793. if (!vip)
  794. return;
  795. vip->pendingInst = inst;
  796. if (inst)
  797. vip->pendingInstIdxPlus1 = (inst->instIndex+1);
  798. else
  799. vip->pendingInstIdxPlus1 = 0;
  800. }
  801. void ClearPendingInst(Uint32 coreIdx)
  802. {
  803. vpu_instance_pool_t *vip;
  804. vip = (vpu_instance_pool_t *)vdi_get_instance_pool(coreIdx);
  805. if (!vip)
  806. return;
  807. if(vip->pendingInst) {
  808. vip->pendingInst = 0;
  809. vip->pendingInstIdxPlus1 = 0;
  810. }
  811. }
  812. CodecInst *GetPendingInst(Uint32 coreIdx)
  813. {
  814. vpu_instance_pool_t *vip;
  815. int pendingInstIdx;
  816. vip = (vpu_instance_pool_t *)vdi_get_instance_pool(coreIdx);
  817. if (!vip)
  818. return NULL;
  819. if (!vip->pendingInst)
  820. return NULL;
  821. pendingInstIdx = vip->pendingInstIdxPlus1-1;
  822. if (pendingInstIdx < 0 || pendingInstIdx >= MAX_NUM_INSTANCE)
  823. return NULL;
  824. return (CodecInst *)vip->codecInstPool[pendingInstIdx];
  825. }
  826. int GetPendingInstIdx(Uint32 coreIdx)
  827. {
  828. vpu_instance_pool_t *vip;
  829. vip = (vpu_instance_pool_t *)vdi_get_instance_pool(coreIdx);
  830. if (!vip)
  831. return -1;
  832. return (vip->pendingInstIdxPlus1-1);
  833. }
  834. Int32 MaverickCache2Config(
  835. MaverickCacheConfig* pCache,
  836. BOOL decoder ,
  837. BOOL interleave,
  838. Uint32 bypass,
  839. Uint32 burst,
  840. Uint32 merge,
  841. TiledMapType mapType,
  842. Uint32 wayshape
  843. )
  844. {
  845. unsigned int cacheConfig = 0;
  846. if(decoder == TRUE) {
  847. if (mapType == 0) {// LINEAR_FRAME_MAP
  848. //VC1 opposite field padding is not allowable in UV separated, burst 8 and linear map
  849. if(!interleave)
  850. burst = 0;
  851. wayshape = 15;
  852. if (merge == 1)
  853. merge = 3;
  854. //GDI constraint. Width should not be over 64
  855. if (( merge== 1) && (burst))
  856. burst = 0;
  857. }
  858. else {
  859. //horizontal merge constraint in tiled map
  860. if (merge == 1)
  861. merge = 3;
  862. }
  863. }
  864. else { // encoder
  865. if (mapType == LINEAR_FRAME_MAP) {
  866. wayshape = 15;
  867. //GDI constraint. Width should not be over 64
  868. if ((merge == 1) && (burst))
  869. burst= 0;
  870. }
  871. else {
  872. //horizontal merge constraint in tiled map
  873. if (merge == 1)
  874. merge = 3;
  875. }
  876. }
  877. cacheConfig = (merge & 0x3) << 9;
  878. cacheConfig = cacheConfig | ((wayshape & 0xf) << 5);
  879. cacheConfig = cacheConfig | ((burst & 0x1) << 3);
  880. cacheConfig = cacheConfig | (bypass & 0x3);
  881. if(mapType != 0)//LINEAR_FRAME_MAP
  882. cacheConfig = cacheConfig | 0x00000004;
  883. ///{16'b0, 5'b0, merge[1:0], wayshape[3:0], 1'b0, burst[0], map[0], bypass[1:0]};
  884. pCache->type2.CacheMode = cacheConfig;
  885. return 1;
  886. }
  887. int GetLowDelayOutput(CodecInst *pCodecInst, DecOutputInfo *info)
  888. {
  889. Uint32 val = 0;
  890. Uint32 val2 = 0;
  891. Int32 endIndex;
  892. VpuRect rectInfo;
  893. DecInfo* pDecInfo;
  894. pDecInfo = &pCodecInst->CodecInfo->decInfo;
  895. info->indexFrameDisplay = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_DISPLAY_IDX);
  896. info->indexFrameDecoded = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_DECODED_IDX);
  897. val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_SIZE); // decoding picture size
  898. info->decPicWidth = (val>>16) & 0xFFFF;
  899. info->decPicHeight = (val) & 0xFFFF;
  900. if (info->indexFrameDecoded >= 0 && info->indexFrameDecoded < MAX_GDI_IDX)
  901. {
  902. //default value
  903. rectInfo.left = 0;
  904. rectInfo.right = info->decPicWidth;
  905. rectInfo.top = 0;
  906. rectInfo.bottom = info->decPicHeight;
  907. if (pCodecInst->codecMode == AVC_DEC || pCodecInst->codecMode == MP2_DEC)
  908. {
  909. val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_CROP_LEFT_RIGHT); // frame crop information(left, right)
  910. val2 = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_CROP_TOP_BOTTOM); // frame crop information(top, bottom)
  911. if (val == (Uint32)-1 || val == 0)
  912. {
  913. rectInfo.left = 0;
  914. rectInfo.right = info->decPicWidth;
  915. }
  916. else
  917. {
  918. rectInfo.left = ((val>>16) & 0xFFFF);
  919. rectInfo.right = info->decPicWidth - (val&0xFFFF);
  920. }
  921. if (val2 == (Uint32)-1 || val2 == 0)
  922. {
  923. rectInfo.top = 0;
  924. rectInfo.bottom = info->decPicHeight;
  925. }
  926. else
  927. {
  928. rectInfo.top = ((val2>>16) & 0xFFFF);
  929. rectInfo.bottom = info->decPicHeight - (val2&0xFFFF);
  930. }
  931. }
  932. info->rcDecoded.left = pDecInfo->decOutInfo[info->indexFrameDecoded].rcDecoded.left = rectInfo.left;
  933. info->rcDecoded.right = pDecInfo->decOutInfo[info->indexFrameDecoded].rcDecoded.right = rectInfo.right;
  934. info->rcDecoded.top = pDecInfo->decOutInfo[info->indexFrameDecoded].rcDecoded.top = rectInfo.top;
  935. info->rcDecoded.bottom = pDecInfo->decOutInfo[info->indexFrameDecoded].rcDecoded.bottom = rectInfo.bottom;
  936. }
  937. else
  938. {
  939. info->rcDecoded.left = 0;
  940. info->rcDecoded.right = info->decPicWidth;
  941. info->rcDecoded.top = 0;
  942. info->rcDecoded.bottom = info->decPicHeight;
  943. }
  944. if (info->indexFrameDisplay >= 0 && info->indexFrameDisplay < MAX_GDI_IDX)
  945. {
  946. if (pCodecInst->codecMode == VC1_DEC) // vc1 rotates decoded frame buffer region. the other std rotated whole frame buffer region.
  947. {
  948. if (pDecInfo->rotationEnable && (pDecInfo->rotationAngle==90 || pDecInfo->rotationAngle==270))
  949. {
  950. info->rcDisplay.left = pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.top;
  951. info->rcDisplay.right = pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.bottom;
  952. info->rcDisplay.top = pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.left;
  953. info->rcDisplay.bottom = pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.right;
  954. }
  955. else
  956. {
  957. info->rcDisplay.left = pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.left;
  958. info->rcDisplay.right = pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.right;
  959. info->rcDisplay.top = pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.top;
  960. info->rcDisplay.bottom = pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.bottom;
  961. }
  962. }
  963. else
  964. {
  965. if (pDecInfo->rotationEnable)
  966. {
  967. switch(pDecInfo->rotationAngle)
  968. {
  969. case 90:
  970. case 270:
  971. info->rcDisplay.left = pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.top;
  972. info->rcDisplay.right = pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.bottom;
  973. info->rcDisplay.top = pDecInfo->rotatorOutput.height - pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.right;
  974. info->rcDisplay.bottom = pDecInfo->rotatorOutput.height - pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.left;
  975. break;
  976. default:
  977. info->rcDisplay.left = pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.left;
  978. info->rcDisplay.right = pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.right;
  979. info->rcDisplay.top = pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.top;
  980. info->rcDisplay.bottom = pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.bottom;
  981. break;
  982. }
  983. if (pDecInfo->mirrorEnable) {
  984. Uint32 temp;
  985. if (pDecInfo->mirrorDirection & MIRDIR_VER) {
  986. temp = info->rcDisplay.top;
  987. info->rcDisplay.top = info->decPicHeight - info->rcDisplay.bottom;
  988. info->rcDisplay.bottom = info->decPicHeight - temp;
  989. }
  990. if (pDecInfo->mirrorDirection & MIRDIR_HOR) {
  991. temp = info->rcDisplay.left;
  992. info->rcDisplay.left = info->decPicWidth - info->rcDisplay.right;
  993. info->rcDisplay.right = info->decPicWidth - temp;
  994. }
  995. }
  996. }
  997. else
  998. {
  999. info->rcDisplay.left = pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.left;
  1000. info->rcDisplay.right = pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.right;
  1001. info->rcDisplay.top = pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.top;
  1002. info->rcDisplay.bottom = pDecInfo->decOutInfo[info->indexFrameDisplay].rcDecoded.bottom;
  1003. }
  1004. }
  1005. if (info->indexFrameDisplay == info->indexFrameDecoded)
  1006. {
  1007. info->dispPicWidth = info->decPicWidth;
  1008. info->dispPicHeight = info->decPicHeight;
  1009. }
  1010. else
  1011. {
  1012. info->dispPicWidth = pDecInfo->decOutInfo[info->indexFrameDisplay].decPicWidth;
  1013. info->dispPicHeight = pDecInfo->decOutInfo[info->indexFrameDisplay].decPicHeight;
  1014. }
  1015. }
  1016. else
  1017. {
  1018. info->rcDisplay.left = 0;
  1019. info->rcDisplay.right = 0;
  1020. info->rcDisplay.top = 0;
  1021. info->rcDisplay.bottom = 0;
  1022. info->dispPicWidth = 0;
  1023. info->dispPicHeight = 0;
  1024. }
  1025. val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_TYPE);
  1026. info->interlacedFrame = (val >> 18) & 0x1;
  1027. info->topFieldFirst = (val >> 21) & 0x0001; // TopFieldFirst[21]
  1028. if (info->interlacedFrame) {
  1029. info->picTypeFirst = (val & 0x38) >> 3; // pic_type of 1st field
  1030. info->picType = val & 7; // pic_type of 2nd field
  1031. }
  1032. else {
  1033. info->picTypeFirst = PIC_TYPE_MAX; // no meaning
  1034. info->picType = val & 7;
  1035. }
  1036. info->pictureStructure = (val >> 19) & 0x0003; // MbAffFlag[17], FieldPicFlag[16]
  1037. info->repeatFirstField = (val >> 22) & 0x0001;
  1038. info->progressiveFrame = (val >> 23) & 0x0003;
  1039. if( pCodecInst->codecMode == AVC_DEC)
  1040. {
  1041. info->nalRefIdc = (val >> 7) & 0x03;
  1042. info->decFrameInfo = (val >> 15) & 0x0001;
  1043. info->picStrPresent = (val >> 27) & 0x0001;
  1044. info->picTimingStruct = (val >> 28) & 0x000f;
  1045. //update picture type when IDR frame
  1046. if (val & 0x40) { // 6th bit
  1047. if (info->interlacedFrame)
  1048. info->picTypeFirst = PIC_TYPE_IDR;
  1049. else
  1050. info->picType = PIC_TYPE_IDR;
  1051. }
  1052. info->decFrameInfo = (val >> 16) & 0x0003;
  1053. if (info->indexFrameDisplay>=0) {
  1054. if (info->indexFrameDisplay == info->indexFrameDecoded)
  1055. info->avcNpfFieldInfo = info->decFrameInfo;
  1056. else
  1057. info->avcNpfFieldInfo = pDecInfo->decOutInfo[info->indexFrameDisplay].decFrameInfo;
  1058. }
  1059. val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_HRD_INFO);
  1060. info->avcHrdInfo.cpbMinus1 = val>>2;
  1061. info->avcHrdInfo.vclHrdParamFlag = (val>>1)&1;
  1062. info->avcHrdInfo.nalHrdParamFlag = val&1;
  1063. val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_VUI_INFO);
  1064. info->avcVuiInfo.fixedFrameRateFlag = val &1;
  1065. info->avcVuiInfo.timingInfoPresent = (val>>1) & 0x01;
  1066. info->avcVuiInfo.chromaLocBotField = (val>>2) & 0x07;
  1067. info->avcVuiInfo.chromaLocTopField = (val>>5) & 0x07;
  1068. info->avcVuiInfo.chromaLocInfoPresent = (val>>8) & 0x01;
  1069. info->avcVuiInfo.colorPrimaries = (val>>16) & 0xff;
  1070. info->avcVuiInfo.colorDescPresent = (val>>24) & 0x01;
  1071. info->avcVuiInfo.isExtSAR = (val>>25) & 0x01;
  1072. info->avcVuiInfo.vidFullRange = (val>>26) & 0x01;
  1073. info->avcVuiInfo.vidFormat = (val>>27) & 0x07;
  1074. info->avcVuiInfo.vidSigTypePresent = (val>>30) & 0x01;
  1075. info->avcVuiInfo.vuiParamPresent = (val>>31) & 0x01;
  1076. val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_VUI_PIC_STRUCT);
  1077. info->avcVuiInfo.vuiPicStructPresent = (val & 0x1);
  1078. info->avcVuiInfo.vuiPicStruct = (val>>1);
  1079. }
  1080. info->fRateNumerator = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_FRATE_NR); //Frame rate, Aspect ratio can be changed frame by frame.
  1081. info->fRateDenominator = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_FRATE_DR);
  1082. if (pCodecInst->codecMode == AVC_DEC && info->fRateDenominator > 0)
  1083. info->fRateDenominator *= 2;
  1084. info->aspectRateInfo = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_ASPECT);
  1085. // User Data
  1086. if (pDecInfo->userDataEnable) {
  1087. int userDataNum;
  1088. int userDataSize;
  1089. BYTE tempBuf[8] = {0,};
  1090. VpuReadMem(pCodecInst->coreIdx, pDecInfo->userDataBufAddr + 0, tempBuf, 8, VPU_USER_DATA_ENDIAN);
  1091. val = ((tempBuf[0]<<24) & 0xFF000000) |
  1092. ((tempBuf[1]<<16) & 0x00FF0000) |
  1093. ((tempBuf[2]<< 8) & 0x0000FF00) |
  1094. ((tempBuf[3]<< 0) & 0x000000FF);
  1095. userDataNum = (val >> 16) & 0xFFFF;
  1096. userDataSize = (val >> 0) & 0xFFFF;
  1097. if (userDataNum == 0)
  1098. userDataSize = 0;
  1099. info->decOutputExtData.userDataNum = userDataNum;
  1100. info->decOutputExtData.userDataSize = userDataSize;
  1101. val = ((tempBuf[4]<<24) & 0xFF000000) |
  1102. ((tempBuf[5]<<16) & 0x00FF0000) |
  1103. ((tempBuf[6]<< 8) & 0x0000FF00) |
  1104. ((tempBuf[7]<< 0) & 0x000000FF);
  1105. if (userDataNum == 0)
  1106. info->decOutputExtData.userDataBufFull = 0;
  1107. else
  1108. info->decOutputExtData.userDataBufFull = (val >> 16) & 0xFFFF;
  1109. info->decOutputExtData.activeFormat = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_ATSC_USER_DATA_INFO)&0xf;
  1110. }
  1111. info->numOfErrMBs = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_ERR_MB);
  1112. val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_SUCCESS);
  1113. info->decodingSuccess = val;
  1114. info->sequenceChanged = ((val>>20) & 0x1);
  1115. info->streamEndFlag = ((pDecInfo->streamEndflag>>2) & 0x01);
  1116. endIndex = (pDecInfo->openParam.wtlEnable == TRUE) ? pDecInfo->numFbsForWTL : pDecInfo->numFbsForDecoding;
  1117. if (0 <= info->indexFrameDisplay && info->indexFrameDisplay < endIndex) {
  1118. info->dispFrame = pDecInfo->frameBufPool[info->indexFrameDisplay];
  1119. if (pDecInfo->openParam.wtlEnable) { // coda980 only
  1120. info->dispFrame = pDecInfo->frameBufPool[info->indexFrameDisplay+pDecInfo->numFbsForDecoding];
  1121. }
  1122. }
  1123. if (pDecInfo->deringEnable || pDecInfo->mirrorEnable || pDecInfo->rotationEnable || pDecInfo->tiled2LinearEnable) {
  1124. info->dispFrame = pDecInfo->rotatorOutput;
  1125. }
  1126. if (pCodecInst->codecMode == AVC_DEC && pCodecInst->codecModeAux == AVC_AUX_MVC)
  1127. {
  1128. val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_MVC_REPORT);
  1129. info->mvcPicInfo.viewIdxDisplay = (val>>0) & 1;
  1130. info->mvcPicInfo.viewIdxDecoded = (val>>1) & 1;
  1131. }
  1132. if (pCodecInst->codecMode == AVC_DEC)
  1133. {
  1134. val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_AVC_FPA_SEI0);
  1135. if (val == (Uint32)-1) {
  1136. info->avcFpaSei.exist = 0;
  1137. }
  1138. else {
  1139. info->avcFpaSei.exist = 1;
  1140. info->avcFpaSei.framePackingArrangementId = val;
  1141. val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_AVC_FPA_SEI1);
  1142. info->avcFpaSei.contentInterpretationType = val&0x3F; // [5:0]
  1143. info->avcFpaSei.framePackingArrangementType = (val >> 6)&0x7F; // [12:6]
  1144. info->avcFpaSei.framePackingArrangementExtensionFlag = (val >> 13)&0x01; // [13]
  1145. info->avcFpaSei.frame1SelfContainedFlag = (val >> 14)&0x01; // [14]
  1146. info->avcFpaSei.frame0SelfContainedFlag = (val >> 15)&0x01; // [15]
  1147. info->avcFpaSei.currentFrameIsFrame0Flag = (val >> 16)&0x01; // [16]
  1148. info->avcFpaSei.fieldViewsFlag = (val >> 17)&0x01; // [17]
  1149. info->avcFpaSei.frame0FlippedFlag = (val >> 18)&0x01; // [18]
  1150. info->avcFpaSei.spatialFlippingFlag = (val >> 19)&0x01; // [19]
  1151. info->avcFpaSei.quincunxSamplingFlag = (val >> 20)&0x01; // [20]
  1152. info->avcFpaSei.framePackingArrangementCancelFlag = (val >> 21)&0x01; // [21]
  1153. val = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_AVC_FPA_SEI2);
  1154. info->avcFpaSei.framePackingArrangementRepetitionPeriod = val&0x7FFF; // [14:0]
  1155. info->avcFpaSei.frame1GridPositionY = (val >> 16)&0x0F; // [19:16]
  1156. info->avcFpaSei.frame1GridPositionX = (val >> 20)&0x0F; // [23:20]
  1157. info->avcFpaSei.frame0GridPositionY = (val >> 24)&0x0F; // [27:24]
  1158. info->avcFpaSei.frame0GridPositionX = (val >> 28)&0x0F; // [31:28]
  1159. }
  1160. info->avcPocTop = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_POC_TOP);
  1161. info->avcPocBot = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_POC_BOT);
  1162. if (info->interlacedFrame)
  1163. {
  1164. if (info->avcPocTop > info->avcPocBot) {
  1165. info->avcPocPic = info->avcPocBot;
  1166. } else {
  1167. info->avcPocPic = info->avcPocTop;
  1168. }
  1169. }
  1170. else
  1171. info->avcPocPic = VpuReadReg(pCodecInst->coreIdx, RET_DEC_PIC_POC);
  1172. }
  1173. //pDecInfo->streamRdPtr //NA
  1174. pDecInfo->frameDisplayFlag = VpuReadReg(pCodecInst->coreIdx, pDecInfo->frameDisplayFlagRegAddr);
  1175. //info->consumedByte //NA
  1176. //info->notSufficientSliceBuffer; // NA
  1177. //info->notSufficientPsBuffer; // NA
  1178. //info->bytePosFrameStart //NA
  1179. //info->bytePosFrameEnd //NA
  1180. //info->rdPtr //NA
  1181. //info->wrPtr //NA
  1182. //info->frameCycle //NA
  1183. //Vp8ScaleInfo vp8ScaleInfo; //NA
  1184. //Vp8PicInfo vp8PicInfo; //NA
  1185. //MvcPicInfo mvcPicInfo; ////NA
  1186. //info->wprotErrReason; avcVuiInfo
  1187. //PhysicalAddress wprotErrAddress; avcVuiInfo
  1188. // Report Information
  1189. //info->frameDct; //NA
  1190. //info->progressiveSequence; //NA
  1191. //info->mp4TimeIncrement; //NA
  1192. //info->mp4ModuloTimeBase; //NA
  1193. return 1;
  1194. }
  1195. RetCode UpdateFrameBufferAddr(
  1196. TiledMapType mapType,
  1197. FrameBuffer* fbArr,
  1198. Uint32 numOfFrameBuffers,
  1199. Uint32 sizeLuma,
  1200. Uint32 sizeChroma
  1201. )
  1202. {
  1203. Uint32 i;
  1204. BOOL yuv422Interleave = FALSE;
  1205. BOOL fieldFrame = (BOOL)(mapType == LINEAR_FIELD_MAP);
  1206. BOOL cbcrInterleave = (BOOL)(mapType >= COMPRESSED_FRAME_MAP || fbArr[0].cbcrInterleave == TRUE);
  1207. BOOL reuseFb = FALSE;
  1208. if (mapType < COMPRESSED_FRAME_MAP) {
  1209. switch (fbArr[0].format) {
  1210. case FORMAT_YUYV:
  1211. case FORMAT_YUYV_P10_16BIT_MSB:
  1212. case FORMAT_YUYV_P10_16BIT_LSB:
  1213. case FORMAT_YUYV_P10_32BIT_MSB:
  1214. case FORMAT_YUYV_P10_32BIT_LSB:
  1215. case FORMAT_YVYU:
  1216. case FORMAT_YVYU_P10_16BIT_MSB:
  1217. case FORMAT_YVYU_P10_16BIT_LSB:
  1218. case FORMAT_YVYU_P10_32BIT_MSB:
  1219. case FORMAT_YVYU_P10_32BIT_LSB:
  1220. case FORMAT_UYVY:
  1221. case FORMAT_UYVY_P10_16BIT_MSB:
  1222. case FORMAT_UYVY_P10_16BIT_LSB:
  1223. case FORMAT_UYVY_P10_32BIT_MSB:
  1224. case FORMAT_UYVY_P10_32BIT_LSB:
  1225. case FORMAT_VYUY:
  1226. case FORMAT_VYUY_P10_16BIT_MSB:
  1227. case FORMAT_VYUY_P10_16BIT_LSB:
  1228. case FORMAT_VYUY_P10_32BIT_MSB:
  1229. case FORMAT_VYUY_P10_32BIT_LSB:
  1230. yuv422Interleave = TRUE;
  1231. break;
  1232. default:
  1233. yuv422Interleave = FALSE;
  1234. break;
  1235. }
  1236. }
  1237. for (i=0; i<numOfFrameBuffers; i++) {
  1238. reuseFb = (fbArr[i].bufY != (PhysicalAddress)-1 && fbArr[i].bufCb != (PhysicalAddress)-1 && fbArr[i].bufCr != (PhysicalAddress)-1);
  1239. if (reuseFb == FALSE) {
  1240. if (yuv422Interleave == TRUE) {
  1241. fbArr[i].bufCb = (PhysicalAddress)-1;
  1242. fbArr[i].bufCr = (PhysicalAddress)-1;
  1243. }
  1244. else {
  1245. if (fbArr[i].bufCb == (PhysicalAddress)-1) {
  1246. fbArr[i].bufCb = fbArr[i].bufY + (sizeLuma >> fieldFrame);
  1247. }
  1248. if (fbArr[i].bufCr == (PhysicalAddress)-1) {
  1249. if (cbcrInterleave == TRUE) {
  1250. fbArr[i].bufCr = (PhysicalAddress)-1;
  1251. }
  1252. else {
  1253. fbArr[i].bufCr = fbArr[i].bufCb + (sizeChroma >> fieldFrame);
  1254. }
  1255. }
  1256. }
  1257. }
  1258. }
  1259. return RETCODE_SUCCESS;
  1260. }
  1261. /* \brief Allocate tiled framebuffer on GDI version 1.0 H/W.
  1262. */
  1263. RetCode AllocateTiledFrameBufferGdiV1(
  1264. TiledMapType mapType,
  1265. PhysicalAddress tiledBaseAddr,
  1266. FrameBuffer* fbArr,
  1267. Uint32 numOfFrameBuffers,
  1268. Uint32 sizeLuma,
  1269. Uint32 sizeChroma,
  1270. DRAMConfig* pDramCfg
  1271. )
  1272. {
  1273. Uint32 rasLowBitsForHor;
  1274. Uint32 i;
  1275. Uint32 cas, ras, bank, bus;
  1276. Uint32 lumRasTop, lumRasBot, chrRasTop, chrRasBot;
  1277. Uint32 lumFrameRasSize, lumFieldRasSize, chrFieldRasSize;
  1278. PhysicalAddress addrY, addrYRas;
  1279. if (mapType == TILED_FRAME_MB_RASTER_MAP || mapType == TILED_FIELD_MB_RASTER_MAP) {
  1280. for (i=0; i<numOfFrameBuffers; i++) {
  1281. int lum_top_base;
  1282. int lum_bot_base;
  1283. int chr_top_base;
  1284. int chr_bot_base;
  1285. addrY = ((fbArr[i].bufY+(16384-1))&~(16384-1));
  1286. lum_top_base = addrY;
  1287. lum_bot_base = addrY + sizeLuma/2;
  1288. chr_top_base = addrY + sizeLuma;
  1289. chr_bot_base = addrY + sizeLuma + sizeChroma; // cbcr is interleaved
  1290. lum_top_base = (lum_top_base>>12) & 0xfffff;
  1291. lum_bot_base = (lum_bot_base>>12) & 0xfffff;
  1292. chr_top_base = (chr_top_base>>12) & 0xfffff;
  1293. chr_bot_base = (chr_bot_base>>12) & 0xfffff;
  1294. fbArr[i].bufY = ( lum_top_base << 12) | (chr_top_base >> 8);
  1295. fbArr[i].bufCb = ((chr_top_base & 0xff ) << 24) | (lum_bot_base << 4) | (chr_bot_base >> 16);
  1296. fbArr[i].bufCr = ((chr_bot_base & 0xffff) << 16) ;
  1297. fbArr[i].bufYBot = (PhysicalAddress)-1;
  1298. fbArr[i].bufCbBot = (PhysicalAddress)-1;
  1299. fbArr[i].bufCrBot = (PhysicalAddress)-1;
  1300. }
  1301. }
  1302. else {
  1303. cas = pDramCfg->casBit;
  1304. ras = pDramCfg->rasBit;
  1305. bank = pDramCfg->bankBit;
  1306. bus = pDramCfg->busBit;
  1307. if (cas == 9 && bank == 2 && ras == 13) {
  1308. rasLowBitsForHor = 3;
  1309. }
  1310. else if(cas == 10 && bank == 3 && ras == 13) {
  1311. rasLowBitsForHor = 2;
  1312. }
  1313. else if (cas == 10 && bank == 3 && ras == 16) { // DDR3 3BA setting
  1314. rasLowBitsForHor = 1;
  1315. }
  1316. else if (cas == 10 && bank == 4 && ras == 15) { // DDR3 4BA, DDR4 2BA+2BG
  1317. rasLowBitsForHor = 1;
  1318. }
  1319. else {
  1320. return RETCODE_INVALID_PARAM;
  1321. }
  1322. for (i=0; i<numOfFrameBuffers; i++) {
  1323. addrY = fbArr[i].bufY - tiledBaseAddr;
  1324. // align base_addr to RAS boundary
  1325. addrYRas = (addrY + ((1<<(bank+cas+bus))-1)) >> (bank+cas+bus);
  1326. // round up RAS lower 3(or 4) bits
  1327. addrYRas = ((addrYRas + ((1<<(rasLowBitsForHor))-1)) >> rasLowBitsForHor) << rasLowBitsForHor;
  1328. chrFieldRasSize = sizeChroma>>(pDramCfg->bankBit+pDramCfg->casBit+pDramCfg->busBit);
  1329. lumFieldRasSize = (sizeLuma>>1)>>(pDramCfg->bankBit+pDramCfg->casBit+pDramCfg->busBit);
  1330. lumFrameRasSize = lumFieldRasSize * 2;
  1331. lumRasTop = addrYRas;
  1332. lumRasBot = lumRasTop + lumFieldRasSize;
  1333. chrRasTop = lumRasTop + lumFrameRasSize;
  1334. chrRasBot = chrRasTop + chrFieldRasSize;
  1335. fbArr[i].bufY = (lumRasBot << 16) + lumRasTop;
  1336. fbArr[i].bufCb = (chrRasBot << 16) + chrRasTop;
  1337. if (rasLowBitsForHor == 4) {
  1338. fbArr[i].bufCr = ((((chrRasBot>>4)<<4) + 8) << 16) + (((chrRasTop>>4)<<4) + 8);
  1339. }
  1340. else if (rasLowBitsForHor == 3) {
  1341. fbArr[i].bufCr = ((((chrRasBot>>3)<<3) + 4) << 16) + (((chrRasTop>>3)<<3) + 4);
  1342. }
  1343. else if (rasLowBitsForHor == 2) {
  1344. fbArr[i].bufCr = ((((chrRasBot>>2)<<2) + 2) << 16) + (((chrRasTop>>2)<<2) + 2);
  1345. }
  1346. else if (rasLowBitsForHor == 1) {
  1347. fbArr[i].bufCr = ((((chrRasBot>>1)<<1) + 1) << 16) + (((chrRasTop>>1)<<1) + 1);
  1348. }
  1349. else {
  1350. return RETCODE_INSUFFICIENT_RESOURCE; // Invalid RasLowBit value
  1351. }
  1352. }
  1353. }
  1354. return RETCODE_SUCCESS;
  1355. }
  1356. /* \brief Allocate tiled framebuffer on GDI version 2.0 H/W
  1357. */
  1358. RetCode AllocateTiledFrameBufferGdiV2(
  1359. TiledMapType mapType,
  1360. FrameBuffer* fbArr,
  1361. Uint32 numOfFrameBuffers,
  1362. Uint32 sizeLuma,
  1363. Uint32 sizeChroma
  1364. )
  1365. {
  1366. Uint32 i;
  1367. Uint32 fieldFrame;
  1368. Uint32 sizeFb;
  1369. BOOL cbcrInterleave;
  1370. sizeFb = sizeLuma + sizeChroma * 2;
  1371. fieldFrame = (mapType == TILED_FIELD_V_MAP ||
  1372. mapType == TILED_FIELD_NO_BANK_MAP ||
  1373. mapType == LINEAR_FIELD_MAP);
  1374. for (i=0; i<numOfFrameBuffers; i++) {
  1375. cbcrInterleave = fbArr[0].cbcrInterleave;
  1376. fbArr[i].bufCb = fbArr[i].bufY + (sizeLuma >> fieldFrame);
  1377. fbArr[i].bufCr = fbArr[i].bufCb + (sizeChroma >> fieldFrame);
  1378. switch (mapType) {
  1379. case TILED_FIELD_V_MAP:
  1380. case TILED_FIELD_NO_BANK_MAP:
  1381. fbArr[i].bufYBot = fbArr[i].bufY + (sizeFb>>fieldFrame);
  1382. fbArr[i].bufCbBot = fbArr[i].bufYBot + (sizeLuma>>fieldFrame);
  1383. if (cbcrInterleave == FALSE) {
  1384. fbArr[i].bufCrBot = fbArr[i].bufCbBot + (sizeChroma>>fieldFrame);
  1385. }
  1386. break;
  1387. case TILED_FRAME_V_MAP:
  1388. case TILED_FRAME_H_MAP:
  1389. case TILED_MIXED_V_MAP:
  1390. case TILED_FRAME_NO_BANK_MAP:
  1391. fbArr[i].bufYBot = fbArr[i].bufY;
  1392. fbArr[i].bufCbBot = fbArr[i].bufCb;
  1393. if (cbcrInterleave == FALSE) {
  1394. fbArr[i].bufCrBot = fbArr[i].bufCr;
  1395. }
  1396. break;
  1397. case TILED_FIELD_MB_RASTER_MAP:
  1398. fbArr[i].bufYBot = fbArr[i].bufY + (sizeLuma>>1);
  1399. fbArr[i].bufCbBot = fbArr[i].bufCb + sizeChroma;
  1400. break;
  1401. default:
  1402. fbArr[i].bufYBot = 0;
  1403. fbArr[i].bufCbBot = 0;
  1404. fbArr[i].bufCrBot = 0;
  1405. break;
  1406. }
  1407. }
  1408. return RETCODE_SUCCESS;
  1409. }
  1410. Int32 ConfigSecAXICoda9(Uint32 coreIdx, Int32 codecMode, SecAxiInfo *sa, Uint32 width, Uint32 height, Uint32 profile)
  1411. {
  1412. vpu_buffer_t vb;
  1413. int offset;
  1414. Uint32 MbNumX = ((width & 0xFFFF) + 15) / 16;
  1415. Uint32 MbNumY = ((height & 0xFFFF) + 15) / 16;
  1416. Uint32 productId;
  1417. if (vdi_get_sram_memory(coreIdx, &vb) < 0) {
  1418. return 0;
  1419. }
  1420. productId = ProductVpuGetId(coreIdx);
  1421. if (!vb.size) {
  1422. sa->bufSize = 0;
  1423. sa->u.coda9.useBitEnable = 0;
  1424. sa->u.coda9.useIpEnable = 0;
  1425. sa->u.coda9.useDbkYEnable = 0;
  1426. sa->u.coda9.useDbkCEnable = 0;
  1427. sa->u.coda9.useOvlEnable = 0;
  1428. sa->u.coda9.useBtpEnable = 0;
  1429. return 0;
  1430. }
  1431. sa->bufBase = vb.phys_addr;
  1432. offset = 0;
  1433. //BIT
  1434. if (sa->u.coda9.useBitEnable) {
  1435. sa->u.coda9.useBitEnable = 1;
  1436. sa->u.coda9.bufBitUse = vb.phys_addr + offset;
  1437. switch (codecMode)
  1438. {
  1439. case AVC_DEC:
  1440. offset = offset + MbNumX * 144;
  1441. break; // AVC
  1442. case RV_DEC:
  1443. offset = offset + MbNumX * 128;
  1444. break;
  1445. case VC1_DEC:
  1446. offset = offset + MbNumX * 64;
  1447. break;
  1448. case AVS_DEC:
  1449. offset = offset + ((MbNumX + 3)&~3) * 32;
  1450. break;
  1451. case MP2_DEC:
  1452. offset = offset + MbNumX * 0;
  1453. break;
  1454. case VPX_DEC:
  1455. offset = offset + MbNumX * 0;
  1456. break;
  1457. case AVC_ENC:
  1458. {
  1459. if (productId == PRODUCT_ID_960) {
  1460. offset = offset + MbNumX * 128;
  1461. }
  1462. else {
  1463. if (MbNumX > 128) offset = offset + MbNumX * 16;
  1464. }
  1465. }
  1466. break;
  1467. case MP4_ENC:
  1468. offset = offset + MbNumX * 16;
  1469. break;
  1470. default:
  1471. offset = offset + MbNumX * 16;
  1472. break; // MPEG-4, Divx3
  1473. }
  1474. if (offset > vb.size)
  1475. {
  1476. sa->bufSize = 0;
  1477. return 0;
  1478. }
  1479. }
  1480. //Intra Prediction, ACDC
  1481. if (sa->u.coda9.useIpEnable)
  1482. {
  1483. sa->u.coda9.bufIpAcDcUse = vb.phys_addr + offset;
  1484. sa->u.coda9.useIpEnable = 1;
  1485. switch (codecMode)
  1486. {
  1487. case AVC_DEC:
  1488. offset = offset + MbNumX * 64;
  1489. break; // AVC
  1490. case RV_DEC:
  1491. offset = offset + MbNumX * 64;
  1492. break;
  1493. case VC1_DEC:
  1494. offset = offset + MbNumX * 128;
  1495. break;
  1496. case AVS_DEC:
  1497. offset = offset + MbNumX * 64;
  1498. break;
  1499. case MP2_DEC:
  1500. offset = offset + MbNumX * 0;
  1501. break;
  1502. case VPX_DEC:
  1503. offset = offset + MbNumX * 64;
  1504. break;
  1505. case AVC_ENC:
  1506. offset = offset + MbNumX * 64;
  1507. break;
  1508. case MP4_ENC:
  1509. offset = offset + MbNumX * 128;
  1510. break;
  1511. default:
  1512. offset = offset + MbNumX * 128;
  1513. break; // MPEG-4, Divx3
  1514. }
  1515. if (offset > vb.size)
  1516. {
  1517. sa->bufSize = 0;
  1518. return 0;
  1519. }
  1520. }
  1521. //Deblock Chroma
  1522. if (sa->u.coda9.useDbkCEnable)
  1523. {
  1524. sa->u.coda9.bufDbkCUse = vb.phys_addr + offset;
  1525. sa->u.coda9.useDbkCEnable = 1;
  1526. switch (codecMode)
  1527. {
  1528. case AVC_DEC:
  1529. offset = (profile==66/*AVC BP decoder*/) ? offset + (MbNumX * 64) : offset + (MbNumX * 128);
  1530. break; // AVC
  1531. case RV_DEC:
  1532. offset = offset + MbNumX * 128;
  1533. break;
  1534. case VC1_DEC:
  1535. offset = profile==2 ? offset + MbNumX * 256 : offset + MbNumX * 128;
  1536. break;
  1537. case AVS_DEC:
  1538. offset = offset + MbNumX * 64;
  1539. break;
  1540. case MP2_DEC:
  1541. offset = offset + MbNumX * 64;
  1542. break;
  1543. case VPX_DEC:
  1544. offset = offset + MbNumX * 128;
  1545. break;
  1546. case MP4_DEC:
  1547. offset = offset + MbNumX * 64;
  1548. break;
  1549. case AVC_ENC:
  1550. offset = offset + MbNumX * 64;
  1551. break;
  1552. case MP4_ENC:
  1553. offset = offset + MbNumX * 64;
  1554. break;
  1555. default:
  1556. offset = offset + MbNumX * 64;
  1557. break;
  1558. }
  1559. if (offset > vb.size)
  1560. {
  1561. sa->bufSize = 0;
  1562. return 0;
  1563. }
  1564. }
  1565. //Deblock Luma
  1566. if (sa->u.coda9.useDbkYEnable)
  1567. {
  1568. sa->u.coda9.bufDbkYUse = vb.phys_addr + offset;
  1569. sa->u.coda9.useDbkYEnable = 1;
  1570. switch (codecMode)
  1571. {
  1572. case AVC_DEC:
  1573. offset = (profile==66/*AVC BP decoder*/)? offset + (MbNumX * 64) : offset + (MbNumX * 128);
  1574. break; // AVC
  1575. case RV_DEC:
  1576. offset = offset + MbNumX * 128;
  1577. break;
  1578. case VC1_DEC:
  1579. offset = profile==2 ? offset + MbNumX * 256 : offset + MbNumX * 128;
  1580. break;
  1581. case AVS_DEC:
  1582. offset = offset + MbNumX * 64;
  1583. break;
  1584. case MP2_DEC:
  1585. offset = offset + MbNumX * 128;
  1586. break;
  1587. case VPX_DEC:
  1588. offset = offset + MbNumX * 128;
  1589. break;
  1590. case MP4_DEC:
  1591. offset = offset + MbNumX * 64;
  1592. break;
  1593. case AVC_ENC:
  1594. offset = offset + MbNumX * 64;
  1595. break;
  1596. case MP4_ENC:
  1597. offset = offset + MbNumX * 64;
  1598. break;
  1599. default:
  1600. offset = offset + MbNumX * 128;
  1601. break;
  1602. }
  1603. if (offset > vb.size)
  1604. {
  1605. sa->bufSize = 0;
  1606. return 0;
  1607. }
  1608. }
  1609. // check the buffer address which is 256 byte is available.
  1610. if (((offset + 255) & (~255)) > vb.size) {
  1611. VLOG(ERR, "%s:%d NOT ENOUGH SRAM: required(%d), sram(%d)\n", __FUNCTION__, __LINE__, offset, vb.size);
  1612. sa->bufSize = 0;
  1613. return 0;
  1614. }
  1615. //VC1 Bit-plane
  1616. if (sa->u.coda9.useBtpEnable)
  1617. {
  1618. if (codecMode != VC1_DEC)
  1619. {
  1620. sa->u.coda9.useBtpEnable = 0;
  1621. }
  1622. else
  1623. {
  1624. int oneBTP;
  1625. offset = ((offset+255)&~255);
  1626. sa->u.coda9.bufBtpUse = vb.phys_addr + offset;
  1627. sa->u.coda9.useBtpEnable = 1;
  1628. oneBTP = (((MbNumX+15)/16) * MbNumY + 1) * 2;
  1629. oneBTP = (oneBTP%256) ? ((oneBTP/256)+1)*256 : oneBTP;
  1630. offset = offset + oneBTP * 3;
  1631. if (offset > vb.size)
  1632. {
  1633. sa->bufSize = 0;
  1634. return 0;
  1635. }
  1636. }
  1637. }
  1638. //VC1 Overlap
  1639. if (sa->u.coda9.useOvlEnable)
  1640. {
  1641. if (codecMode != VC1_DEC)
  1642. {
  1643. sa->u.coda9.useOvlEnable = 0;
  1644. }
  1645. else
  1646. {
  1647. sa->u.coda9.bufOvlUse = vb.phys_addr + offset;
  1648. sa->u.coda9.useOvlEnable = 1;
  1649. offset = offset + MbNumX * 80;
  1650. if (offset > vb.size)
  1651. {
  1652. sa->bufSize = 0;
  1653. return 0;
  1654. }
  1655. }
  1656. }
  1657. sa->bufSize = offset;
  1658. return 1;
  1659. }
  1660. Int32 ConfigSecAXIWave(Uint32 coreIdx, Int32 codecMode, SecAxiInfo *sa, Uint32 width, Uint32 height, Uint32 profile, Uint32 levelIdc)
  1661. {
  1662. vpu_buffer_t vb;
  1663. int offset;
  1664. Uint32 size = 0;
  1665. Uint32 lumaSize = 0;
  1666. Uint32 chromaSize = 0;
  1667. Uint32 productId;
  1668. UNREFERENCED_PARAMETER(codecMode);
  1669. UNREFERENCED_PARAMETER(height);
  1670. if (vdi_get_sram_memory(coreIdx, &vb) < 0)
  1671. return 0;
  1672. productId = ProductVpuGetId(coreIdx);
  1673. if (!vb.size) {
  1674. sa->bufSize = 0;
  1675. sa->u.wave.useIpEnable = 0;
  1676. sa->u.wave.useLfRowEnable = 0;
  1677. sa->u.wave.useBitEnable = 0;
  1678. sa->u.wave.useSclEnable = 0;
  1679. sa->u.wave.useEncImdEnable = 0;
  1680. sa->u.wave.useEncLfEnable = 0;
  1681. sa->u.wave.useEncRdoEnable = 0;
  1682. return 0;
  1683. }
  1684. sa->bufBase = vb.phys_addr;
  1685. offset = 0;
  1686. /* Intra Prediction */
  1687. if (sa->u.wave.useIpEnable == TRUE) {
  1688. sa->u.wave.bufIp = sa->bufBase + offset;
  1689. switch (productId) {
  1690. case PRODUCT_ID_512:
  1691. case PRODUCT_ID_515:
  1692. case PRODUCT_ID_517:
  1693. if ( codecMode == W_VP9_DEC ) {
  1694. lumaSize = VPU_ALIGN128(width) * 10/8;
  1695. chromaSize = VPU_ALIGN128(width) * 10/8;
  1696. }
  1697. else if (codecMode == W_HEVC_DEC) {
  1698. if (profile == HEVC_PROFILE_MAIN) {
  1699. lumaSize = VPU_ALIGN32(width);
  1700. chromaSize = VPU_ALIGN32(width);
  1701. }
  1702. else {
  1703. lumaSize = VPU_ALIGN128(VPU_ALIGN16(width)*10)/8;
  1704. chromaSize = VPU_ALIGN128(VPU_ALIGN16(width)*10)/8;
  1705. }
  1706. }
  1707. else if (codecMode == W_AVS2_DEC) {
  1708. if (profile == AVS2_PROFILE_MAIN10) {
  1709. lumaSize = VPU_ALIGN128(VPU_ALIGN16(width)*10)/8;
  1710. chromaSize = VPU_ALIGN128(VPU_ALIGN16(width)*10)/8;
  1711. }
  1712. else {
  1713. lumaSize = VPU_ALIGN16(width);
  1714. chromaSize = VPU_ALIGN16(width);
  1715. }
  1716. }
  1717. else if (codecMode == W_SVAC_DEC) {
  1718. int bitDepth = (profile == SVAC_PROFILE_BASE ? 8 : 10);
  1719. lumaSize = VPU_ALIGN128(width)*bitDepth/8;
  1720. chromaSize = VPU_ALIGN128(width/2)*2*bitDepth/8;
  1721. }
  1722. else if (codecMode == W_AVC_DEC) {
  1723. if (profile == 110) { // High 10
  1724. lumaSize = VPU_ALIGN128(VPU_ALIGN16(width)*10)/8;
  1725. chromaSize = VPU_ALIGN128(VPU_ALIGN16(width)*10)/8;
  1726. }
  1727. else {
  1728. lumaSize = VPU_ALIGN32(width);
  1729. chromaSize = VPU_ALIGN32(width);
  1730. }
  1731. }
  1732. break;
  1733. case PRODUCT_ID_521:
  1734. case PRODUCT_ID_511:
  1735. if (profile == HEVC_PROFILE_MAIN10) {
  1736. lumaSize = VPU_ALIGN128(VPU_ALIGN16(width)*10)/8*2;
  1737. chromaSize = 0;
  1738. }
  1739. else {
  1740. lumaSize = VPU_ALIGN16(width)*2;
  1741. chromaSize = 0;
  1742. }
  1743. break;
  1744. default:
  1745. return 0;
  1746. }
  1747. offset = lumaSize + chromaSize;
  1748. if (offset > vb.size) {
  1749. sa->bufSize = 0;
  1750. return 0;
  1751. }
  1752. }
  1753. /* Loopfilter row */
  1754. if (sa->u.wave.useLfRowEnable == TRUE) {
  1755. sa->u.wave.bufLfRow = sa->bufBase + offset;
  1756. if ( codecMode == W_VP9_DEC ) {
  1757. if ( profile == VP9_PROFILE_2)
  1758. {
  1759. lumaSize = VPU_ALIGN64(width) * 8 * 10/8; /* lumaLIne : 8 */
  1760. chromaSize = VPU_ALIGN64(width) * 8 * 10/8; /* chromaLine : 8 */
  1761. lumaSize *= 2;
  1762. }
  1763. else
  1764. {
  1765. lumaSize = VPU_ALIGN64(width) * 8; /* lumaLIne : 8 */
  1766. chromaSize = VPU_ALIGN64(width) * 8; /* chromaLine : 8 */
  1767. lumaSize *= 2;
  1768. }
  1769. }
  1770. else if (codecMode == W_HEVC_DEC) {
  1771. if (profile == HEVC_PROFILE_MAIN) {
  1772. size = VPU_ALIGN32(width)*8;
  1773. }
  1774. else {
  1775. Uint32 level = levelIdc/30;
  1776. if (level >= 5) {
  1777. size = VPU_ALIGN32(width)/2 * 13 + VPU_ALIGN64(width)*4;
  1778. }
  1779. else {
  1780. size = VPU_ALIGN64(width)*13;
  1781. }
  1782. }
  1783. lumaSize = size;
  1784. chromaSize = 0;
  1785. }
  1786. else if (codecMode == W_AVC_DEC) {
  1787. if (profile == 110) {
  1788. Uint32 level = levelIdc/30;
  1789. if (level >= 5) {
  1790. size = VPU_ALIGN32(width)/2 * 13 + VPU_ALIGN64(width)*4;
  1791. }
  1792. else {
  1793. size = VPU_ALIGN64(width)*13;
  1794. }
  1795. }
  1796. else {
  1797. size = VPU_ALIGN32(width)*8;
  1798. }
  1799. lumaSize = size;
  1800. chromaSize = 0;
  1801. }
  1802. else if (codecMode == W_AVS2_DEC) {
  1803. // AVS2
  1804. if (profile == AVS2_PROFILE_MAIN10) {
  1805. lumaSize = VPU_ALIGN16(width)*5*2;
  1806. chromaSize = VPU_ALIGN16(width)*5*2;
  1807. }
  1808. else {
  1809. lumaSize = VPU_ALIGN16(width)*5;
  1810. chromaSize = VPU_ALIGN16(width)*5;
  1811. }
  1812. }
  1813. else if (codecMode == W_SVAC_DEC) {
  1814. int bitDepth = (profile == SVAC_PROFILE_BASE ? 8 : 10);
  1815. lumaSize = VPU_ALIGN128(width)*bitDepth/8*5;
  1816. chromaSize = VPU_ALIGN128(width/2)*2*bitDepth/8*5;
  1817. }
  1818. if (productId == PRODUCT_ID_511 || productId == PRODUCT_ID_521) {
  1819. Uint32 luma = 0, chroma = 0;
  1820. if (codecMode == W_HEVC_DEC) {
  1821. luma = (profile == HEVC_PROFILE_MAIN10) ? 7 : 5;
  1822. chroma = (profile == HEVC_PROFILE_MAIN10) ? 4 : 3;
  1823. }
  1824. else if (codecMode == W_AVC_DEC) {
  1825. luma = (profile == HEVC_PROFILE_MAIN10) ? 5 : 4;
  1826. chroma = (profile == HEVC_PROFILE_MAIN10) ? 3 : 3;
  1827. }
  1828. lumaSize = VPU_ALIGN32(width)*luma;
  1829. chromaSize = VPU_ALIGN32(width)*chroma;
  1830. }
  1831. offset += (lumaSize + chromaSize);
  1832. if (offset > vb.size) {
  1833. sa->bufSize = 0;
  1834. return 0;
  1835. }
  1836. }
  1837. if (sa->u.wave.useBitEnable == TRUE) {
  1838. sa->u.wave.bufBit = sa->bufBase + offset;
  1839. if (codecMode == W_VP9_DEC) {
  1840. size = VPU_ALIGN64(width)/64 * (70*8);
  1841. }
  1842. else if (codecMode == W_HEVC_DEC) {
  1843. size = VPU_ALIGN128(VPU_ALIGN32(width)/32*9*8);
  1844. }
  1845. else if (codecMode == W_AVS2_DEC) {
  1846. size = VPU_ALIGN16(width/16)*40;
  1847. }
  1848. else if (codecMode == W_SVAC_DEC) {
  1849. size = 0;
  1850. }
  1851. if (productId == PRODUCT_ID_511 || productId == PRODUCT_ID_521)
  1852. size = VPU_ALIGN64(width)*4;
  1853. offset += size;
  1854. if (offset > vb.size) {
  1855. sa->bufSize = 0;
  1856. return 0;
  1857. }
  1858. }
  1859. if (sa->u.wave.useSclEnable == TRUE) {
  1860. sa->u.wave.bufScaler = sa->bufBase + offset;
  1861. if (codecMode == W_VP9_DEC) {
  1862. /* Scaler Line buffer - luma 3 line, chroma 1 line */
  1863. size = VPU_ALIGN16(VPU_ALIGN32(width) * 10/8) * (3+1);
  1864. }
  1865. else if (codecMode == W_SVAC_DEC) {
  1866. size = 0;
  1867. }
  1868. else {
  1869. size = VPU_ALIGN128(width*10)/8 * 4;
  1870. }
  1871. offset += size;
  1872. if (offset > vb.size) {
  1873. sa->bufSize = 0;
  1874. return 0;
  1875. }
  1876. }
  1877. if (sa->u.wave.useEncImdEnable == TRUE) {
  1878. /* Main profile(8bit) : Align32(picWidth)
  1879. * Main10 profile(10bit): Align32(picWidth)
  1880. */
  1881. sa->u.wave.bufImd = sa->bufBase + offset;
  1882. offset += VPU_ALIGN32(width);
  1883. if (offset > vb.size) {
  1884. sa->bufSize = 0;
  1885. return 0;
  1886. }
  1887. }
  1888. if (sa->u.wave.useEncLfEnable == TRUE) {
  1889. Uint32 luma, chroma;
  1890. sa->u.wave.bufLf = sa->bufBase + offset;
  1891. if (codecMode == W_AVC_ENC) {
  1892. luma = (profile == HEVC_PROFILE_MAIN10 ? 5 : 4);
  1893. chroma = 3;
  1894. lumaSize = VPU_ALIGN16(width) * luma;
  1895. chromaSize = VPU_ALIGN16(width) * chroma;
  1896. }
  1897. else {
  1898. luma = (profile == HEVC_PROFILE_MAIN10 ? 7 : 5);
  1899. if (productId == PRODUCT_ID_521)
  1900. chroma = (profile == HEVC_PROFILE_MAIN10 ? 4 : 3);
  1901. else
  1902. chroma = (profile == HEVC_PROFILE_MAIN10 ? 5 : 3);
  1903. lumaSize = VPU_ALIGN64(width) * luma;
  1904. chromaSize = VPU_ALIGN64(width) * chroma;
  1905. }
  1906. offset += lumaSize + chromaSize;
  1907. if (offset > vb.size) {
  1908. sa->bufSize = 0;
  1909. return 0;
  1910. }
  1911. }
  1912. if (sa->u.wave.useEncRdoEnable == TRUE) {
  1913. switch (productId) {
  1914. case PRODUCT_ID_521:
  1915. sa->u.wave.bufRdo = sa->bufBase + offset;
  1916. if (codecMode == W_AVC_ENC) {
  1917. offset += (VPU_ALIGN64(width)>>6)*384;
  1918. }
  1919. else { // HEVC ENC
  1920. offset += (VPU_ALIGN64(width)>>6)*288;
  1921. }
  1922. break;
  1923. default:
  1924. /* Main profile(8bit) : (Align64(picWidth)/64) * 336
  1925. * Main10 profile(10bit): (Align64(picWidth)/64) * 336
  1926. */
  1927. sa->u.wave.bufRdo = sa->bufBase + offset;
  1928. offset += (VPU_ALIGN64(width)/64) * 336;
  1929. break;
  1930. }
  1931. if (offset > vb.size) {
  1932. sa->bufSize = 0;
  1933. return 0;
  1934. }
  1935. }
  1936. sa->bufSize = offset;
  1937. return 1;
  1938. }
  1939. static int SetTiledMapTypeV20(Uint32 coreIdx, TiledMapConfig *pMapCfg, int mapType, int width, int interleave)
  1940. {
  1941. #define GEN_XY2AXI(INV,ZER,TBX,XY,BIT) ((INV)<<7 | (ZER)<<6 | (TBX)<<5 | (XY)<<4 | (BIT))
  1942. #define GEN_CONFIG(A,B,C,D,E,F,G,H,I) ((A)<<20 | (B)<<19 | (C)<<18 | (D)<<17 | (E)<<16 | (F)<<12 | (G)<<8 | (H)<<4 | (I))
  1943. #define X_SEL 0
  1944. #define Y_SEL 1
  1945. const int luma_map = 0x40; // zero, inv = 1'b0, zero = 1'b1 , tbxor = 1'b0, xy = 1'b0, bit = 4'd0
  1946. const int chro_map = 0x40; // zero, inv = 1'b0, zero = 1'b1 , tbxor = 1'b0, xy = 1'b0, bit = 4'd0
  1947. int width_chr;
  1948. int i;
  1949. pMapCfg->mapType = mapType;
  1950. for (i=0; i<32 ; i=i+1)
  1951. {
  1952. pMapCfg->xy2axiLumMap[i] = luma_map;
  1953. pMapCfg->xy2axiChrMap[i] = chro_map;
  1954. }
  1955. pMapCfg->xy2axiConfig = 0;
  1956. width_chr = (interleave) ? width : width/2;
  1957. switch(mapType)
  1958. {
  1959. case LINEAR_FRAME_MAP:
  1960. case LINEAR_FIELD_MAP:
  1961. pMapCfg->xy2axiConfig = 0;
  1962. return 1;
  1963. case TILED_FRAME_V_MAP:
  1964. {
  1965. // luma
  1966. pMapCfg->xy2axiLumMap[ 3] = GEN_XY2AXI(0,0,0,Y_SEL,0);
  1967. pMapCfg->xy2axiLumMap[ 4] = GEN_XY2AXI(0,0,0,Y_SEL,1);
  1968. pMapCfg->xy2axiLumMap[ 5] = GEN_XY2AXI(0,0,0,Y_SEL,2);
  1969. pMapCfg->xy2axiLumMap[ 6] = GEN_XY2AXI(0,0,0,Y_SEL,3);
  1970. pMapCfg->xy2axiLumMap[ 7] = GEN_XY2AXI(0,0,0,X_SEL,3);
  1971. pMapCfg->xy2axiLumMap[ 8] = GEN_XY2AXI(0,0,0,X_SEL,4);
  1972. pMapCfg->xy2axiLumMap[ 9] = GEN_XY2AXI(0,0,0,X_SEL,5);
  1973. pMapCfg->xy2axiLumMap[10] = GEN_XY2AXI(0,0,0,X_SEL,6);
  1974. pMapCfg->xy2axiLumMap[11] = GEN_XY2AXI(0,0,0,Y_SEL,4);
  1975. pMapCfg->xy2axiLumMap[12] = GEN_XY2AXI(0,0,0,X_SEL,7);
  1976. pMapCfg->xy2axiLumMap[13] = GEN_XY2AXI(0,0,0,Y_SEL,5);
  1977. if (width <= 512)
  1978. {
  1979. pMapCfg->xy2axiLumMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8);
  1980. pMapCfg->xy2axiLumMap[15] = GEN_XY2AXI(0,0,0,Y_SEL, 6);
  1981. pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  1982. pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  1983. pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  1984. pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  1985. pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  1986. }
  1987. else if (width <= 1024)
  1988. {
  1989. pMapCfg->xy2axiLumMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8);
  1990. pMapCfg->xy2axiLumMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9);
  1991. pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,Y_SEL, 6);
  1992. pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  1993. pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  1994. pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  1995. pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  1996. pMapCfg->xy2axiLumMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  1997. }
  1998. else if (width <= 2048)
  1999. {
  2000. pMapCfg->xy2axiLumMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8);
  2001. pMapCfg->xy2axiLumMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9);
  2002. pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,X_SEL,10);
  2003. pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 6);
  2004. pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2005. pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2006. pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2007. pMapCfg->xy2axiLumMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2008. pMapCfg->xy2axiLumMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2009. }
  2010. else
  2011. { // 4K size
  2012. pMapCfg->xy2axiLumMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8);
  2013. pMapCfg->xy2axiLumMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9);
  2014. pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,X_SEL,10);
  2015. pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,X_SEL,11);
  2016. pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 6);
  2017. pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2018. pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2019. pMapCfg->xy2axiLumMap[21] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2020. pMapCfg->xy2axiLumMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2021. pMapCfg->xy2axiLumMap[23] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2022. }
  2023. // chroma
  2024. pMapCfg->xy2axiChrMap[ 3] = GEN_XY2AXI(0,0,0,Y_SEL, 0);
  2025. pMapCfg->xy2axiChrMap[ 4] = GEN_XY2AXI(0,0,0,Y_SEL, 1);
  2026. pMapCfg->xy2axiChrMap[ 5] = GEN_XY2AXI(0,0,0,Y_SEL, 2);
  2027. pMapCfg->xy2axiChrMap[ 6] = GEN_XY2AXI(0,0,0,Y_SEL, 3);
  2028. pMapCfg->xy2axiChrMap[ 7] = GEN_XY2AXI(0,0,0,X_SEL, 3);
  2029. pMapCfg->xy2axiChrMap[ 8] = GEN_XY2AXI(0,0,0,X_SEL, 4);
  2030. pMapCfg->xy2axiChrMap[ 9] = GEN_XY2AXI(0,0,0,X_SEL, 5);
  2031. pMapCfg->xy2axiChrMap[10] = GEN_XY2AXI(0,0,0,X_SEL, 6);
  2032. pMapCfg->xy2axiChrMap[11] = GEN_XY2AXI(0,0,0,Y_SEL, 5);
  2033. pMapCfg->xy2axiChrMap[12] = GEN_XY2AXI(1,0,0,X_SEL, 7);
  2034. pMapCfg->xy2axiChrMap[13] = GEN_XY2AXI(1,0,0,Y_SEL, 4);
  2035. if (width_chr <= 512)
  2036. {
  2037. pMapCfg->xy2axiChrMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8);
  2038. pMapCfg->xy2axiChrMap[15] = GEN_XY2AXI(0,0,0,Y_SEL, 6);
  2039. pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2040. pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2041. pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2042. pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2043. pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2044. }
  2045. else if (width_chr <= 1024)
  2046. {
  2047. pMapCfg->xy2axiChrMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8);
  2048. pMapCfg->xy2axiChrMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9);
  2049. pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,Y_SEL, 6);
  2050. pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2051. pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2052. pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2053. pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2054. pMapCfg->xy2axiChrMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2055. }
  2056. else if (width_chr <= 2048)
  2057. {
  2058. pMapCfg->xy2axiChrMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8);
  2059. pMapCfg->xy2axiChrMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9);
  2060. pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,X_SEL,10);
  2061. pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 6);
  2062. pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2063. pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2064. pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2065. pMapCfg->xy2axiChrMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2066. pMapCfg->xy2axiChrMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2067. }
  2068. else
  2069. { // 4K size
  2070. pMapCfg->xy2axiChrMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8);
  2071. pMapCfg->xy2axiChrMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9);
  2072. pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,X_SEL,10);
  2073. pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,X_SEL,11);
  2074. pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 6);
  2075. pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2076. pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2077. pMapCfg->xy2axiChrMap[21] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2078. pMapCfg->xy2axiChrMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2079. pMapCfg->xy2axiChrMap[23] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2080. }
  2081. // xy2axiConfig
  2082. pMapCfg->xy2axiConfig = GEN_CONFIG(0,0,0,1,1,15, 0,15, 0);
  2083. break;
  2084. } // case TILED_FRAME_V_MAP
  2085. case TILED_FRAME_H_MAP:
  2086. {
  2087. pMapCfg->xy2axiLumMap[ 3] = GEN_XY2AXI(0,0,0,X_SEL, 3);
  2088. pMapCfg->xy2axiLumMap[ 4] = GEN_XY2AXI(0,0,0,X_SEL, 4);
  2089. pMapCfg->xy2axiLumMap[ 5] = GEN_XY2AXI(0,0,0,X_SEL, 5);
  2090. pMapCfg->xy2axiLumMap[ 6] = GEN_XY2AXI(0,0,0,X_SEL, 6);
  2091. pMapCfg->xy2axiLumMap[ 7] = GEN_XY2AXI(0,0,0,Y_SEL, 0);
  2092. pMapCfg->xy2axiLumMap[ 8] = GEN_XY2AXI(0,0,0,Y_SEL, 1);
  2093. pMapCfg->xy2axiLumMap[ 9] = GEN_XY2AXI(0,0,0,Y_SEL, 2);
  2094. pMapCfg->xy2axiLumMap[10] = GEN_XY2AXI(0,0,0,Y_SEL, 3);
  2095. pMapCfg->xy2axiLumMap[11] = GEN_XY2AXI(0,0,0,Y_SEL, 4);
  2096. pMapCfg->xy2axiLumMap[12] = GEN_XY2AXI(0,0,0,X_SEL, 7);
  2097. pMapCfg->xy2axiLumMap[13] = GEN_XY2AXI(0,0,0,Y_SEL, 5);
  2098. if (width <= 512)
  2099. {
  2100. pMapCfg->xy2axiLumMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8);
  2101. pMapCfg->xy2axiLumMap[15] = GEN_XY2AXI(0,0,0,Y_SEL, 6);
  2102. pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2103. pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2104. pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2105. pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2106. pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2107. }
  2108. else if (width <= 1024)
  2109. {
  2110. pMapCfg->xy2axiLumMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8);
  2111. pMapCfg->xy2axiLumMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9);
  2112. pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,Y_SEL, 6);
  2113. pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2114. pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2115. pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2116. pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2117. pMapCfg->xy2axiLumMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2118. }
  2119. else if (width <= 2048)
  2120. {
  2121. pMapCfg->xy2axiLumMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8);
  2122. pMapCfg->xy2axiLumMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9);
  2123. pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,X_SEL,10);
  2124. pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 6);
  2125. pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2126. pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2127. pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2128. pMapCfg->xy2axiLumMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2129. pMapCfg->xy2axiLumMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2130. }
  2131. else
  2132. { // 4K size
  2133. pMapCfg->xy2axiLumMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8);
  2134. pMapCfg->xy2axiLumMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9);
  2135. pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,X_SEL,10);
  2136. pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,X_SEL,11);
  2137. pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 6);
  2138. pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2139. pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2140. pMapCfg->xy2axiLumMap[21] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2141. pMapCfg->xy2axiLumMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2142. pMapCfg->xy2axiLumMap[23] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2143. }
  2144. pMapCfg->xy2axiChrMap[ 3] = GEN_XY2AXI(0,0,0,X_SEL, 3);
  2145. pMapCfg->xy2axiChrMap[ 4] = GEN_XY2AXI(0,0,0,X_SEL, 4);
  2146. pMapCfg->xy2axiChrMap[ 5] = GEN_XY2AXI(0,0,0,X_SEL, 5);
  2147. pMapCfg->xy2axiChrMap[ 6] = GEN_XY2AXI(0,0,0,X_SEL, 6);
  2148. pMapCfg->xy2axiChrMap[ 7] = GEN_XY2AXI(0,0,0,Y_SEL, 0);
  2149. pMapCfg->xy2axiChrMap[ 8] = GEN_XY2AXI(0,0,0,Y_SEL, 1);
  2150. pMapCfg->xy2axiChrMap[ 9] = GEN_XY2AXI(0,0,0,Y_SEL, 2);
  2151. pMapCfg->xy2axiChrMap[10] = GEN_XY2AXI(0,0,0,Y_SEL, 3);
  2152. pMapCfg->xy2axiChrMap[11] = GEN_XY2AXI(0,0,0,Y_SEL, 5);
  2153. pMapCfg->xy2axiChrMap[12] = GEN_XY2AXI(1,0,0,X_SEL, 7);
  2154. pMapCfg->xy2axiChrMap[13] = GEN_XY2AXI(1,0,0,Y_SEL, 4);
  2155. if (width_chr <= 512)
  2156. {
  2157. pMapCfg->xy2axiChrMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8);
  2158. pMapCfg->xy2axiChrMap[15] = GEN_XY2AXI(0,0,0,Y_SEL, 6);
  2159. pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2160. pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2161. pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2162. pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2163. pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2164. }
  2165. else if (width_chr <= 1024)
  2166. {
  2167. pMapCfg->xy2axiChrMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8);
  2168. pMapCfg->xy2axiChrMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9);
  2169. pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,Y_SEL, 6);
  2170. pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2171. pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2172. pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2173. pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2174. pMapCfg->xy2axiChrMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2175. }
  2176. else if (width_chr <= 2048)
  2177. {
  2178. pMapCfg->xy2axiChrMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8);
  2179. pMapCfg->xy2axiChrMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9);
  2180. pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,X_SEL,10);
  2181. pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 6);
  2182. pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2183. pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2184. pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2185. pMapCfg->xy2axiChrMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2186. pMapCfg->xy2axiChrMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2187. }
  2188. else
  2189. { // 4K size
  2190. pMapCfg->xy2axiChrMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8);
  2191. pMapCfg->xy2axiChrMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9);
  2192. pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,X_SEL,10);
  2193. pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,X_SEL,11);
  2194. pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 6);
  2195. pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2196. pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2197. pMapCfg->xy2axiChrMap[21] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2198. pMapCfg->xy2axiChrMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2199. pMapCfg->xy2axiChrMap[23] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2200. }
  2201. // xy2axiConfig
  2202. pMapCfg->xy2axiConfig = GEN_CONFIG(0,0,0,1,0,15,15,15,15);
  2203. break;
  2204. } //case TILED_FRAME_H_MAP:
  2205. case TILED_FIELD_V_MAP:
  2206. {
  2207. pMapCfg->xy2axiLumMap[ 3] = GEN_XY2AXI(0,0,0,Y_SEL, 0);
  2208. pMapCfg->xy2axiLumMap[ 4] = GEN_XY2AXI(0,0,0,Y_SEL, 1);
  2209. pMapCfg->xy2axiLumMap[ 5] = GEN_XY2AXI(0,0,0,Y_SEL, 2);
  2210. pMapCfg->xy2axiLumMap[ 6] = GEN_XY2AXI(0,0,0,Y_SEL, 3);
  2211. pMapCfg->xy2axiLumMap[ 7] = GEN_XY2AXI(0,0,0,X_SEL, 3);
  2212. pMapCfg->xy2axiLumMap[ 8] = GEN_XY2AXI(0,0,0,X_SEL, 4);
  2213. pMapCfg->xy2axiLumMap[ 9] = GEN_XY2AXI(0,0,0,X_SEL, 5);
  2214. pMapCfg->xy2axiLumMap[10] = GEN_XY2AXI(0,0,0,X_SEL, 6);
  2215. pMapCfg->xy2axiLumMap[11] = GEN_XY2AXI(0,0,0,Y_SEL, 4);
  2216. pMapCfg->xy2axiLumMap[12] = GEN_XY2AXI(0,0,0,X_SEL, 7);
  2217. pMapCfg->xy2axiLumMap[13] = GEN_XY2AXI(0,0,1,Y_SEL, 5);
  2218. if (width <= 512)
  2219. {
  2220. pMapCfg->xy2axiLumMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8);
  2221. pMapCfg->xy2axiLumMap[15] = GEN_XY2AXI(0,0,0,Y_SEL, 6);
  2222. pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2223. pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2224. pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2225. pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2226. pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2227. }
  2228. else if (width <= 1024)
  2229. {
  2230. pMapCfg->xy2axiLumMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8);
  2231. pMapCfg->xy2axiLumMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9);
  2232. pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,Y_SEL, 6);
  2233. pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2234. pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2235. pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2236. pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2237. pMapCfg->xy2axiLumMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2238. }
  2239. else if (width <= 2048)
  2240. {
  2241. pMapCfg->xy2axiLumMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8);
  2242. pMapCfg->xy2axiLumMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9);
  2243. pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,X_SEL,10);
  2244. pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 6);
  2245. pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2246. pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2247. pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2248. pMapCfg->xy2axiLumMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2249. pMapCfg->xy2axiLumMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2250. }
  2251. else
  2252. { // 4K size
  2253. pMapCfg->xy2axiLumMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8);
  2254. pMapCfg->xy2axiLumMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9);
  2255. pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,X_SEL,10);
  2256. pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,X_SEL,11);
  2257. pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 6);
  2258. pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2259. pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2260. pMapCfg->xy2axiLumMap[21] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2261. pMapCfg->xy2axiLumMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2262. pMapCfg->xy2axiLumMap[23] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2263. }
  2264. pMapCfg->xy2axiChrMap[ 3] = GEN_XY2AXI(0,0,0,Y_SEL, 0);
  2265. pMapCfg->xy2axiChrMap[ 4] = GEN_XY2AXI(0,0,0,Y_SEL, 1);
  2266. pMapCfg->xy2axiChrMap[ 5] = GEN_XY2AXI(0,0,0,Y_SEL, 2);
  2267. pMapCfg->xy2axiChrMap[ 6] = GEN_XY2AXI(0,0,0,Y_SEL, 3);
  2268. pMapCfg->xy2axiChrMap[ 7] = GEN_XY2AXI(0,0,0,X_SEL, 3);
  2269. pMapCfg->xy2axiChrMap[ 8] = GEN_XY2AXI(0,0,0,X_SEL, 4);
  2270. pMapCfg->xy2axiChrMap[ 9] = GEN_XY2AXI(0,0,0,X_SEL, 5);
  2271. pMapCfg->xy2axiChrMap[10] = GEN_XY2AXI(0,0,0,X_SEL, 6);
  2272. pMapCfg->xy2axiChrMap[11] = GEN_XY2AXI(0,0,0,Y_SEL, 5);
  2273. pMapCfg->xy2axiChrMap[12] = GEN_XY2AXI(1,0,0,X_SEL, 7);
  2274. pMapCfg->xy2axiChrMap[13] = GEN_XY2AXI(1,0,1,Y_SEL, 4);
  2275. if (width_chr <= 512)
  2276. {
  2277. pMapCfg->xy2axiChrMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8);
  2278. pMapCfg->xy2axiChrMap[15] = GEN_XY2AXI(0,0,0,Y_SEL, 6);
  2279. pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2280. pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2281. pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2282. pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2283. pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2284. }
  2285. else if (width_chr <= 1024)
  2286. {
  2287. pMapCfg->xy2axiChrMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8);
  2288. pMapCfg->xy2axiChrMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9);
  2289. pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,Y_SEL, 6);
  2290. pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2291. pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2292. pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2293. pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2294. pMapCfg->xy2axiChrMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2295. }
  2296. else if (width_chr <= 2048)
  2297. {
  2298. pMapCfg->xy2axiChrMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8);
  2299. pMapCfg->xy2axiChrMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9);
  2300. pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,X_SEL,10);
  2301. pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 6);
  2302. pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2303. pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2304. pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2305. pMapCfg->xy2axiChrMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2306. pMapCfg->xy2axiChrMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2307. }
  2308. else
  2309. { // 4K size
  2310. pMapCfg->xy2axiChrMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8);
  2311. pMapCfg->xy2axiChrMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9);
  2312. pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,X_SEL,10);
  2313. pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,X_SEL,11);
  2314. pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 6);
  2315. pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2316. pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2317. pMapCfg->xy2axiChrMap[21] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2318. pMapCfg->xy2axiChrMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2319. pMapCfg->xy2axiChrMap[23] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2320. }
  2321. //xy2axiConfig
  2322. pMapCfg->xy2axiConfig = GEN_CONFIG(0,1,1,1,1,15,15,15,15);
  2323. break;
  2324. }
  2325. case TILED_MIXED_V_MAP:
  2326. {
  2327. pMapCfg->xy2axiLumMap[ 3] = GEN_XY2AXI(0,0,0,Y_SEL, 1);
  2328. pMapCfg->xy2axiLumMap[ 4] = GEN_XY2AXI(0,0,0,Y_SEL, 2);
  2329. pMapCfg->xy2axiLumMap[ 5] = GEN_XY2AXI(0,0,0,Y_SEL, 3);
  2330. pMapCfg->xy2axiLumMap[ 6] = GEN_XY2AXI(0,0,0,Y_SEL, 0);
  2331. pMapCfg->xy2axiLumMap[ 7] = GEN_XY2AXI(0,0,0,X_SEL, 3);
  2332. pMapCfg->xy2axiLumMap[ 8] = GEN_XY2AXI(0,0,0,X_SEL, 4);
  2333. pMapCfg->xy2axiLumMap[ 9] = GEN_XY2AXI(0,0,0,X_SEL, 5);
  2334. pMapCfg->xy2axiLumMap[10] = GEN_XY2AXI(0,0,0,X_SEL, 6);
  2335. pMapCfg->xy2axiLumMap[11] = GEN_XY2AXI(0,0,0,Y_SEL, 4);
  2336. pMapCfg->xy2axiLumMap[12] = GEN_XY2AXI(0,0,0,X_SEL, 7);
  2337. pMapCfg->xy2axiLumMap[13] = GEN_XY2AXI(0,0,0,Y_SEL, 5);
  2338. if (width <= 512)
  2339. {
  2340. pMapCfg->xy2axiLumMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8);
  2341. pMapCfg->xy2axiLumMap[15] = GEN_XY2AXI(0,0,0,Y_SEL, 6);
  2342. pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2343. pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2344. pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2345. pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2346. pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2347. }
  2348. else if (width <= 1024)
  2349. {
  2350. pMapCfg->xy2axiLumMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8);
  2351. pMapCfg->xy2axiLumMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9);
  2352. pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,Y_SEL, 6);
  2353. pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2354. pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2355. pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2356. pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2357. pMapCfg->xy2axiLumMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2358. }
  2359. else if (width <= 2048)
  2360. {
  2361. pMapCfg->xy2axiLumMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8);
  2362. pMapCfg->xy2axiLumMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9);
  2363. pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,X_SEL,10);
  2364. pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 6);
  2365. pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2366. pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2367. pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2368. pMapCfg->xy2axiLumMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2369. pMapCfg->xy2axiLumMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2370. }
  2371. else
  2372. { // 4K size
  2373. pMapCfg->xy2axiLumMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8);
  2374. pMapCfg->xy2axiLumMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9);
  2375. pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,X_SEL,10);
  2376. pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,X_SEL,11);
  2377. pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 6);
  2378. pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2379. pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2380. pMapCfg->xy2axiLumMap[21] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2381. pMapCfg->xy2axiLumMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2382. pMapCfg->xy2axiLumMap[23] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2383. }
  2384. pMapCfg->xy2axiChrMap[ 3] = GEN_XY2AXI(0,0,0,Y_SEL, 1);
  2385. pMapCfg->xy2axiChrMap[ 4] = GEN_XY2AXI(0,0,0,Y_SEL, 2);
  2386. pMapCfg->xy2axiChrMap[ 5] = GEN_XY2AXI(0,0,0,Y_SEL, 3);
  2387. pMapCfg->xy2axiChrMap[ 6] = GEN_XY2AXI(0,0,0,Y_SEL, 0);
  2388. pMapCfg->xy2axiChrMap[ 7] = GEN_XY2AXI(0,0,0,X_SEL, 3);
  2389. pMapCfg->xy2axiChrMap[ 8] = GEN_XY2AXI(0,0,0,X_SEL, 4);
  2390. pMapCfg->xy2axiChrMap[ 9] = GEN_XY2AXI(0,0,0,X_SEL, 5);
  2391. pMapCfg->xy2axiChrMap[10] = GEN_XY2AXI(0,0,0,X_SEL, 6);
  2392. pMapCfg->xy2axiChrMap[11] = GEN_XY2AXI(0,0,0,Y_SEL, 5);
  2393. pMapCfg->xy2axiChrMap[12] = GEN_XY2AXI(1,0,0,X_SEL, 7);
  2394. pMapCfg->xy2axiChrMap[13] = GEN_XY2AXI(1,0,0,Y_SEL, 4);
  2395. if (width_chr <= 512)
  2396. {
  2397. pMapCfg->xy2axiChrMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8);
  2398. pMapCfg->xy2axiChrMap[15] = GEN_XY2AXI(0,0,0,Y_SEL, 6);
  2399. pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2400. pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2401. pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2402. pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2403. pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2404. }
  2405. else if (width_chr <= 1024)
  2406. {
  2407. pMapCfg->xy2axiChrMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8);
  2408. pMapCfg->xy2axiChrMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9);
  2409. pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,Y_SEL, 6);
  2410. pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2411. pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2412. pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2413. pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2414. pMapCfg->xy2axiChrMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2415. }
  2416. else if (width_chr <= 2048)
  2417. {
  2418. pMapCfg->xy2axiChrMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8);
  2419. pMapCfg->xy2axiChrMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9);
  2420. pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,X_SEL,10);
  2421. pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 6);
  2422. pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2423. pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2424. pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2425. pMapCfg->xy2axiChrMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2426. pMapCfg->xy2axiChrMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2427. }
  2428. else
  2429. {
  2430. pMapCfg->xy2axiChrMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 8);
  2431. pMapCfg->xy2axiChrMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 9);
  2432. pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,X_SEL,10);
  2433. pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,X_SEL,11);
  2434. pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 6);
  2435. pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2436. pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2437. pMapCfg->xy2axiChrMap[21] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2438. pMapCfg->xy2axiChrMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2439. pMapCfg->xy2axiChrMap[23] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2440. }
  2441. //xy2axiConfig
  2442. pMapCfg->xy2axiConfig = GEN_CONFIG(0,0,1,1,1,7,7,7,7);
  2443. break;
  2444. }
  2445. case TILED_FRAME_MB_RASTER_MAP:
  2446. {
  2447. pMapCfg->xy2axiLumMap[ 3] = GEN_XY2AXI(0,0,0,Y_SEL, 0);
  2448. pMapCfg->xy2axiLumMap[ 4] = GEN_XY2AXI(0,0,0,Y_SEL, 1);
  2449. pMapCfg->xy2axiLumMap[ 5] = GEN_XY2AXI(0,0,0,Y_SEL, 2);
  2450. pMapCfg->xy2axiLumMap[ 6] = GEN_XY2AXI(0,0,0,Y_SEL, 3);
  2451. pMapCfg->xy2axiLumMap[ 7] = GEN_XY2AXI(0,0,0,X_SEL, 3);
  2452. pMapCfg->xy2axiChrMap[ 3] = GEN_XY2AXI(0,0,0,Y_SEL, 0);
  2453. pMapCfg->xy2axiChrMap[ 4] = GEN_XY2AXI(0,0,0,Y_SEL, 1);
  2454. pMapCfg->xy2axiChrMap[ 5] = GEN_XY2AXI(0,0,0,Y_SEL, 2);
  2455. pMapCfg->xy2axiChrMap[ 6] = GEN_XY2AXI(0,0,0,X_SEL, 3);
  2456. //-----------------------------------------------------------
  2457. // mb_addr = mby*stride + mbx
  2458. // mb_addr mapping:
  2459. // luma : axi_addr[~:8] => axi_addr = {mb_addr[23:0],map_addr[7:0]}
  2460. // chroma : axi_addr[~:7] => axi_addr = {mb_addr[23:0],map_addr[6:0]}
  2461. //-----------------------------------------------------------
  2462. //xy2axiConfig
  2463. pMapCfg->xy2axiConfig = GEN_CONFIG(0,0,0,1,1,15,0,7,0);
  2464. break;
  2465. }
  2466. case TILED_FIELD_MB_RASTER_MAP:
  2467. {
  2468. pMapCfg->xy2axiLumMap[ 3] = GEN_XY2AXI(0,0,0,Y_SEL, 0);
  2469. pMapCfg->xy2axiLumMap[ 4] = GEN_XY2AXI(0,0,0,Y_SEL, 1);
  2470. pMapCfg->xy2axiLumMap[ 5] = GEN_XY2AXI(0,0,0,Y_SEL, 2);
  2471. pMapCfg->xy2axiLumMap[ 6] = GEN_XY2AXI(0,0,0,X_SEL, 3);
  2472. pMapCfg->xy2axiChrMap[ 3] = GEN_XY2AXI(0,0,0,Y_SEL, 0);
  2473. pMapCfg->xy2axiChrMap[ 4] = GEN_XY2AXI(0,0,0,Y_SEL, 1);
  2474. pMapCfg->xy2axiChrMap[ 5] = GEN_XY2AXI(0,0,0,X_SEL, 3);
  2475. //-----------------------------------------------------------
  2476. // mb_addr = mby*stride + mbx
  2477. // mb_addr mapping:
  2478. // luma : axi_addr[~:7] => axi_addr = {mb_addr[23:0],map_addr[6:0]}
  2479. // chroma : axi_addr[~:6] => axi_addr = {mb_addr[23:0],map_addr[5:0]}
  2480. //-----------------------------------------------------------
  2481. //xy2axiConfig
  2482. pMapCfg->xy2axiConfig = GEN_CONFIG(0,1,1,1,1,7,7,3,3);
  2483. break;
  2484. }
  2485. case TILED_FRAME_NO_BANK_MAP:
  2486. case TILED_FIELD_NO_BANK_MAP:
  2487. {
  2488. // luma
  2489. pMapCfg->xy2axiLumMap[ 3] = GEN_XY2AXI(0,0,0,Y_SEL, 0);
  2490. pMapCfg->xy2axiLumMap[ 4] = GEN_XY2AXI(0,0,0,Y_SEL, 1);
  2491. pMapCfg->xy2axiLumMap[ 5] = GEN_XY2AXI(0,0,0,Y_SEL, 2);
  2492. pMapCfg->xy2axiLumMap[ 6] = GEN_XY2AXI(0,0,0,Y_SEL, 3);
  2493. pMapCfg->xy2axiLumMap[ 7] = GEN_XY2AXI(0,0,0,X_SEL, 3);
  2494. pMapCfg->xy2axiLumMap[ 8] = GEN_XY2AXI(0,0,0,Y_SEL, 4);
  2495. pMapCfg->xy2axiLumMap[ 9] = GEN_XY2AXI(0,0,0,Y_SEL, 5);
  2496. pMapCfg->xy2axiLumMap[10] = GEN_XY2AXI(0,0,0,Y_SEL, 6);
  2497. pMapCfg->xy2axiLumMap[11] = GEN_XY2AXI(0,0,0,X_SEL, 4);
  2498. pMapCfg->xy2axiLumMap[12] = GEN_XY2AXI(0,0,0,X_SEL, 5);
  2499. pMapCfg->xy2axiLumMap[13] = GEN_XY2AXI(0,0,0,X_SEL, 6);
  2500. pMapCfg->xy2axiLumMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 7);
  2501. pMapCfg->xy2axiLumMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 8);
  2502. if (width <= 512)
  2503. {
  2504. pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2505. pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2506. pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2507. pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2508. pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2509. }
  2510. else if (width <= 1024)
  2511. {
  2512. pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,X_SEL, 9);
  2513. pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2514. pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2515. pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2516. pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2517. pMapCfg->xy2axiLumMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2518. }
  2519. else if (width <= 2048)
  2520. {
  2521. pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,X_SEL, 9);
  2522. pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,X_SEL,10);
  2523. pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2524. pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2525. pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2526. pMapCfg->xy2axiLumMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2527. pMapCfg->xy2axiLumMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2528. }
  2529. else
  2530. {
  2531. pMapCfg->xy2axiLumMap[16] = GEN_XY2AXI(0,0,0,X_SEL, 9);
  2532. pMapCfg->xy2axiLumMap[17] = GEN_XY2AXI(0,0,0,X_SEL,10);
  2533. pMapCfg->xy2axiLumMap[18] = GEN_XY2AXI(0,0,0,X_SEL,11);
  2534. pMapCfg->xy2axiLumMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2535. pMapCfg->xy2axiLumMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2536. pMapCfg->xy2axiLumMap[21] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2537. pMapCfg->xy2axiLumMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2538. pMapCfg->xy2axiLumMap[23] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2539. }
  2540. // chroma
  2541. pMapCfg->xy2axiChrMap[ 3] = GEN_XY2AXI(0,0,0,Y_SEL, 0);
  2542. pMapCfg->xy2axiChrMap[ 4] = GEN_XY2AXI(0,0,0,Y_SEL, 1);
  2543. pMapCfg->xy2axiChrMap[ 5] = GEN_XY2AXI(0,0,0,Y_SEL, 2);
  2544. pMapCfg->xy2axiChrMap[ 6] = GEN_XY2AXI(0,0,0,Y_SEL, 3);
  2545. pMapCfg->xy2axiChrMap[ 7] = GEN_XY2AXI(0,0,0,X_SEL, 3);
  2546. pMapCfg->xy2axiChrMap[ 8] = GEN_XY2AXI(0,0,0,Y_SEL, 4);
  2547. pMapCfg->xy2axiChrMap[ 9] = GEN_XY2AXI(0,0,0,Y_SEL, 5);
  2548. pMapCfg->xy2axiChrMap[10] = GEN_XY2AXI(0,0,0,Y_SEL, 6);
  2549. pMapCfg->xy2axiChrMap[11] = GEN_XY2AXI(0,0,0,X_SEL, 4);
  2550. pMapCfg->xy2axiChrMap[12] = GEN_XY2AXI(0,0,0,X_SEL, 5);
  2551. pMapCfg->xy2axiChrMap[13] = GEN_XY2AXI(0,0,0,X_SEL, 6);
  2552. pMapCfg->xy2axiChrMap[14] = GEN_XY2AXI(0,0,0,X_SEL, 7);
  2553. pMapCfg->xy2axiChrMap[15] = GEN_XY2AXI(0,0,0,X_SEL, 8);
  2554. if (width_chr <= 512)
  2555. {
  2556. pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2557. pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2558. pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2559. pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2560. pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2561. }
  2562. else if (width_chr <= 1024)
  2563. {
  2564. pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,X_SEL, 9);
  2565. pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2566. pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2567. pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2568. pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2569. pMapCfg->xy2axiChrMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2570. }
  2571. else if (width_chr <= 2048)
  2572. {
  2573. pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,X_SEL, 9);
  2574. pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,X_SEL,10);
  2575. pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2576. pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2577. pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2578. pMapCfg->xy2axiChrMap[21] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2579. pMapCfg->xy2axiChrMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2580. }
  2581. else
  2582. {
  2583. pMapCfg->xy2axiChrMap[16] = GEN_XY2AXI(0,0,0,X_SEL, 9);
  2584. pMapCfg->xy2axiChrMap[17] = GEN_XY2AXI(0,0,0,X_SEL,10);
  2585. pMapCfg->xy2axiChrMap[18] = GEN_XY2AXI(0,0,0,X_SEL,11);
  2586. pMapCfg->xy2axiChrMap[19] = GEN_XY2AXI(0,0,0,Y_SEL, 7);
  2587. pMapCfg->xy2axiChrMap[20] = GEN_XY2AXI(0,0,0,Y_SEL, 8);
  2588. pMapCfg->xy2axiChrMap[21] = GEN_XY2AXI(0,0,0,Y_SEL, 9);
  2589. pMapCfg->xy2axiChrMap[22] = GEN_XY2AXI(0,0,0,Y_SEL,10);
  2590. pMapCfg->xy2axiChrMap[23] = GEN_XY2AXI(0,0,0,Y_SEL,11);
  2591. }
  2592. //xy2axiConfig
  2593. if (mapType == TILED_FRAME_NO_BANK_MAP)
  2594. pMapCfg->xy2axiConfig = GEN_CONFIG(0,0,0,1,1,15,0,15,0);
  2595. else
  2596. pMapCfg->xy2axiConfig = GEN_CONFIG(0,1,1,1,1,15,15,15,15);
  2597. break;
  2598. }
  2599. default:
  2600. return 0;
  2601. }
  2602. for (i=0; i<32; i++) { //xy2axiLumMap
  2603. VpuWriteReg(coreIdx, GDI_XY2AXI_LUM_BIT00 + 4*i, pMapCfg->xy2axiLumMap[i]);
  2604. }
  2605. for (i=0; i<32; i++) { //xy2axiChrMap
  2606. VpuWriteReg(coreIdx, GDI_XY2AXI_CHR_BIT00 + 4*i, pMapCfg->xy2axiChrMap[i]);
  2607. }
  2608. //xy2axiConfig
  2609. VpuWriteReg(coreIdx, GDI_XY2AXI_CONFIG, pMapCfg->xy2axiConfig);
  2610. // fast access for reading
  2611. pMapCfg->tbSeparateMap = (pMapCfg->xy2axiConfig >> 19) & 0x1;
  2612. pMapCfg->topBotSplit = (pMapCfg->xy2axiConfig >> 18) & 0x1;
  2613. pMapCfg->tiledMap = (pMapCfg->xy2axiConfig >> 17) & 0x1;
  2614. return 1;
  2615. }
  2616. static int GetXY2AXILogic(int map_val , int xpos, int ypos, int tb)
  2617. {
  2618. int invert;
  2619. int assign_zero;
  2620. int tbxor;
  2621. int xysel;
  2622. int bitsel;
  2623. int xypos,xybit,xybit_st1,xybit_st2,xybit_st3;
  2624. invert = map_val >> 7;
  2625. assign_zero = (map_val & 0x78) >> 6;
  2626. tbxor = (map_val & 0x3C) >> 5;
  2627. xysel = (map_val & 0x1E) >> 4;
  2628. bitsel = map_val & 0x0f;
  2629. xypos = (xysel) ? ypos : xpos;
  2630. xybit = (xypos >> bitsel) & 0x01;
  2631. xybit_st1 = (tbxor) ? xybit^tb : xybit;
  2632. xybit_st2 = (assign_zero) ? 0 : xybit_st1;
  2633. xybit_st3 = (invert) ? !xybit_st2 : xybit_st2;
  2634. return xybit_st3;
  2635. }
  2636. static int GetXY2AXIAddr20(TiledMapConfig *pMapCfg, int ycbcr, int posY, int posX, int stride, FrameBuffer *fb)
  2637. {
  2638. int tbSeparateMap;
  2639. int use_linear_field;
  2640. int ypos_field;
  2641. int tb;
  2642. int chr_flag;
  2643. int ypos_mod;
  2644. int i;
  2645. int mbx, mby;
  2646. int mbx_num;
  2647. int mb_addr;
  2648. int xy2axiLumMap;
  2649. int xy2axiChrMap;
  2650. int xy2axi_map_sel;
  2651. int temp_bit;
  2652. int tmp_addr;
  2653. int axi_conv;
  2654. int y_top_base;
  2655. int cb_top_base;
  2656. int cr_top_base;
  2657. int y_bot_base;
  2658. int cb_bot_base;
  2659. int cr_bot_base;
  2660. int top_base_addr;
  2661. int bot_base_addr;
  2662. int base_addr;
  2663. int pix_addr;
  2664. int mapType;
  2665. mapType = fb->mapType;
  2666. if (!pMapCfg)
  2667. return -1;
  2668. tbSeparateMap = pMapCfg->tbSeparateMap;
  2669. use_linear_field = (mapType == 9);
  2670. ypos_field = posY/2;
  2671. tb = posY & 1;
  2672. ypos_mod = (tbSeparateMap | use_linear_field) ? ypos_field : posY;
  2673. chr_flag = (ycbcr >> 1) & 0x1;
  2674. mbx_num = stride/16;
  2675. y_top_base = fb->bufY;
  2676. cb_top_base = fb->bufCb;
  2677. cr_top_base = fb->bufCr;
  2678. y_bot_base = fb->bufYBot;
  2679. cb_bot_base = fb->bufCbBot;
  2680. cr_bot_base = fb->bufCrBot;
  2681. if (mapType == LINEAR_FRAME_MAP)
  2682. {
  2683. base_addr = (ycbcr==0) ? y_top_base : (ycbcr==2) ? cb_top_base : cr_top_base;
  2684. pix_addr = ((posY * stride) + posX) + base_addr;
  2685. }
  2686. else if (mapType == LINEAR_FIELD_MAP)
  2687. {
  2688. top_base_addr = (ycbcr==0) ? y_top_base : (ycbcr==2) ? cb_top_base : cr_top_base;
  2689. bot_base_addr = (ycbcr==0) ? y_bot_base : (ycbcr==2) ? cb_bot_base : cr_bot_base;
  2690. base_addr = tb ? bot_base_addr : top_base_addr;
  2691. pix_addr = ((ypos_mod * stride) + posX) + base_addr;
  2692. }
  2693. else if (mapType == TILED_FRAME_MB_RASTER_MAP || mapType == TILED_FIELD_MB_RASTER_MAP)
  2694. {
  2695. top_base_addr = (ycbcr==0) ? y_top_base : (ycbcr==2) ? cb_top_base : cr_top_base;
  2696. bot_base_addr = (ycbcr==0) ? y_bot_base : (ycbcr==2) ? cb_bot_base : cr_bot_base;
  2697. if (tbSeparateMap & tb)
  2698. base_addr = bot_base_addr;
  2699. else
  2700. base_addr = top_base_addr;
  2701. if (ycbcr == 0)
  2702. {
  2703. mbx = posX/16;
  2704. mby = posY/16;
  2705. }
  2706. else
  2707. { //always interleave
  2708. mbx = posX/16;
  2709. mby = posY/8;
  2710. }
  2711. mb_addr = mbx_num * mby + mbx;
  2712. // axi_conv[7:0]
  2713. axi_conv = 0;
  2714. for (i=0 ; i<8; i++)
  2715. {
  2716. xy2axiLumMap = pMapCfg->xy2axiLumMap[i];
  2717. xy2axiChrMap = pMapCfg->xy2axiChrMap[i];
  2718. xy2axi_map_sel = (chr_flag) ? xy2axiChrMap : xy2axiLumMap;
  2719. temp_bit = GetXY2AXILogic(xy2axi_map_sel,posX,ypos_mod,tb);
  2720. axi_conv = axi_conv + (temp_bit << i);
  2721. }
  2722. if (mapType==TILED_FRAME_MB_RASTER_MAP)
  2723. {
  2724. if (chr_flag==0)
  2725. tmp_addr = (mb_addr << 8) + axi_conv;
  2726. else // chroma, interleaved only
  2727. tmp_addr = (mb_addr << 7) + axi_conv;
  2728. }
  2729. else
  2730. { // TILED_FIELD_MB_RASTER_MAP
  2731. if (chr_flag==0)
  2732. tmp_addr = (mb_addr << 7) + axi_conv;
  2733. else // chroma, interleaved only
  2734. tmp_addr = (mb_addr << 6) + axi_conv;
  2735. }
  2736. pix_addr = tmp_addr + base_addr;
  2737. }
  2738. else
  2739. {
  2740. top_base_addr = (ycbcr==0) ? y_top_base : (ycbcr==2) ? cb_top_base : cr_top_base;
  2741. bot_base_addr = (ycbcr==0) ? y_bot_base : (ycbcr==2) ? cb_bot_base : cr_bot_base;
  2742. if (tbSeparateMap & tb)
  2743. base_addr = bot_base_addr;
  2744. else
  2745. base_addr = top_base_addr;
  2746. // axi_conv[31:0]
  2747. axi_conv = 0;
  2748. for (i=0 ; i<32; i++)
  2749. {
  2750. xy2axiLumMap = pMapCfg->xy2axiLumMap[i];
  2751. xy2axiChrMap = pMapCfg->xy2axiChrMap[i];
  2752. xy2axi_map_sel = (chr_flag) ? xy2axiChrMap : xy2axiLumMap;
  2753. temp_bit = GetXY2AXILogic(xy2axi_map_sel,posX,ypos_mod,tb);
  2754. axi_conv = axi_conv + (temp_bit << i);
  2755. }
  2756. pix_addr = axi_conv + base_addr;
  2757. }
  2758. return pix_addr;
  2759. }
  2760. // GDI related functios for GDI 1.0
  2761. PhysicalAddress GetTiledFrameBase(Uint32 coreIdx, FrameBuffer *frame, int num)
  2762. {
  2763. PhysicalAddress baseAddr;
  2764. int i;
  2765. UNREFERENCED_PARAMETER(coreIdx);
  2766. baseAddr = frame[0].bufY;
  2767. for (i=0; i<num; i++)
  2768. {
  2769. if (frame[i].bufY < baseAddr)
  2770. baseAddr = frame[i].bufY;
  2771. }
  2772. return baseAddr;
  2773. }
  2774. void SetTiledFrameBase(Uint32 coreIdx, PhysicalAddress baseAddr)
  2775. {
  2776. VpuWriteReg(coreIdx, GDI_TILEDBUF_BASE, baseAddr);
  2777. }
  2778. static int SetTiledMapTypeV10(Uint32 coreIdx, TiledMapConfig *pMapCfg, DRAMConfig *dramCfg, int stride, int mapType)
  2779. {
  2780. #define XY2CONFIG(A,B,C,D,E,F,G,H,I) ((A)<<20 | (B)<<19 | (C)<<18 | (D)<<17 | (E)<<16 | (F)<<12 | (G)<<8 | (H)<<4 | (I))
  2781. #define XY2(A,B,C,D) ((A)<<12 | (B)<<8 | (C)<<4 | (D))
  2782. #define XY2BANK(A,B,C,D,E,F) ((A)<<13 | (B)<<12 | (C)<<8 | (D)<<5 | (E)<<4 | (F))
  2783. #define RBC(A,B,C,D) ((A)<<10 | (B)<< 6 | (C)<<4 | (D))
  2784. #define RBC_SAME(A,B) ((A)<<10 | (B)<< 6 | (A)<<4 | (B))
  2785. #define X_SEL 0
  2786. #define Y_SEL 1
  2787. #define CA_SEL 0
  2788. #define BA_SEL 1
  2789. #define RA_SEL 2
  2790. #define Z_SEL 3
  2791. int ret;
  2792. int luma_map;
  2793. int chro_map;
  2794. int i;
  2795. UNREFERENCED_PARAMETER(stride);
  2796. pMapCfg->mapType = mapType;
  2797. // inv = 1'b0, zero = 1'b1 , tbxor = 1'b0, xy = 1'b0, bit = 4'd0
  2798. luma_map = 64;
  2799. chro_map = 64;
  2800. for (i=0; i<16 ; i=i+1) {
  2801. pMapCfg->xy2caMap[i] = luma_map << 8 | chro_map;
  2802. }
  2803. for (i=0; i<4; i=i+1) {
  2804. pMapCfg->xy2baMap[i] = luma_map << 8 | chro_map;
  2805. }
  2806. for (i=0; i<16; i=i+1) {
  2807. pMapCfg->xy2raMap[i] = luma_map << 8 | chro_map;
  2808. }
  2809. ret = stride; // this will be removed after map size optimizing.
  2810. ret = 0;
  2811. switch(mapType)
  2812. {
  2813. case LINEAR_FRAME_MAP:
  2814. pMapCfg->xy2rbcConfig = 0;
  2815. ret = 1;
  2816. break;
  2817. case TILED_FRAME_V_MAP:
  2818. if (dramCfg->casBit == 9 && dramCfg->bankBit == 2 && dramCfg->rasBit == 13) // CNN setting
  2819. {
  2820. //cas
  2821. pMapCfg->xy2caMap[0] = XY2(Y_SEL, 0, Y_SEL, 0);
  2822. pMapCfg->xy2caMap[1] = XY2(Y_SEL, 1, Y_SEL, 1);
  2823. pMapCfg->xy2caMap[2] = XY2(Y_SEL, 2, Y_SEL, 2);
  2824. pMapCfg->xy2caMap[3] = XY2(Y_SEL, 3, Y_SEL, 3);
  2825. pMapCfg->xy2caMap[4] = XY2(X_SEL, 3, X_SEL, 3);
  2826. pMapCfg->xy2caMap[5] = XY2(X_SEL, 4, X_SEL, 4);
  2827. pMapCfg->xy2caMap[6] = XY2(X_SEL, 5, X_SEL, 5);
  2828. pMapCfg->xy2caMap[7] = XY2(X_SEL, 6, X_SEL, 6);
  2829. pMapCfg->xy2caMap[8] = XY2(Y_SEL, 4, Y_SEL, 5);
  2830. //bank
  2831. pMapCfg->xy2baMap[0] = XY2BANK(0,X_SEL, 7, 4, X_SEL, 7);
  2832. pMapCfg->xy2baMap[1] = XY2BANK(0,Y_SEL, 5, 4, Y_SEL, 4);
  2833. //ras
  2834. pMapCfg->xy2raMap[ 0] = XY2(X_SEL, 8, X_SEL, 8);
  2835. pMapCfg->xy2raMap[ 1] = XY2(X_SEL, 9, X_SEL, 9);
  2836. pMapCfg->xy2raMap[ 2] = XY2(X_SEL,10, X_SEL,10);
  2837. pMapCfg->xy2raMap[ 3] = XY2(Y_SEL, 6, Y_SEL, 6);
  2838. pMapCfg->xy2raMap[ 4] = XY2(Y_SEL, 7, Y_SEL, 7);
  2839. pMapCfg->xy2raMap[ 5] = XY2(Y_SEL, 8, Y_SEL, 8);
  2840. pMapCfg->xy2raMap[ 6] = XY2(Y_SEL, 9, Y_SEL, 9);
  2841. pMapCfg->xy2raMap[ 7] = XY2(Y_SEL,10, Y_SEL,10);
  2842. pMapCfg->xy2raMap[ 8] = XY2(Y_SEL,11, Y_SEL,11);
  2843. pMapCfg->xy2raMap[ 9] = XY2(Y_SEL,12, Y_SEL,12);
  2844. pMapCfg->xy2raMap[10] = XY2(Y_SEL,13, Y_SEL,13);
  2845. pMapCfg->xy2raMap[11] = XY2(Y_SEL,14, Y_SEL,14);
  2846. pMapCfg->xy2raMap[12] = XY2(Y_SEL,15, Y_SEL,15);
  2847. }
  2848. else if(dramCfg->casBit == 10 && dramCfg->bankBit == 3 && dramCfg->rasBit == 13)
  2849. {
  2850. //cas
  2851. pMapCfg->xy2caMap[0] = XY2(Z_SEL, 0, Z_SEL, 0);
  2852. pMapCfg->xy2caMap[1] = XY2(Y_SEL, 0, Y_SEL, 0);
  2853. pMapCfg->xy2caMap[2] = XY2(Y_SEL, 1, Y_SEL, 1);
  2854. pMapCfg->xy2caMap[3] = XY2(Y_SEL, 2, Y_SEL, 2);
  2855. pMapCfg->xy2caMap[4] = XY2(Y_SEL, 3, Y_SEL, 3);
  2856. pMapCfg->xy2caMap[5] = XY2(X_SEL, 3, X_SEL, 3);
  2857. pMapCfg->xy2caMap[6] = XY2(X_SEL, 4, X_SEL, 4);
  2858. pMapCfg->xy2caMap[7] = XY2(X_SEL, 5, X_SEL, 5);
  2859. pMapCfg->xy2caMap[8] = XY2(X_SEL, 6, X_SEL, 6);
  2860. pMapCfg->xy2caMap[9] = XY2(Y_SEL, 4, Y_SEL, 4);
  2861. //bank
  2862. pMapCfg->xy2baMap[0] = XY2BANK(0,X_SEL, 7, 4, X_SEL, 7);
  2863. pMapCfg->xy2baMap[1] = XY2BANK(0,X_SEL, 8, 4, X_SEL, 8);
  2864. pMapCfg->xy2baMap[2] = XY2BANK(0,Y_SEL, 5, 4, Y_SEL, 5);
  2865. //ras
  2866. pMapCfg->xy2raMap[ 0] = XY2(X_SEL, 9, X_SEL, 9);
  2867. pMapCfg->xy2raMap[ 1] = XY2(X_SEL,10, X_SEL,10);
  2868. pMapCfg->xy2raMap[ 2] = XY2(Y_SEL, 6, Y_SEL, 6);
  2869. pMapCfg->xy2raMap[ 3] = XY2(Y_SEL, 7, Y_SEL, 7);
  2870. pMapCfg->xy2raMap[ 4] = XY2(Y_SEL, 8, Y_SEL, 8);
  2871. pMapCfg->xy2raMap[ 5] = XY2(Y_SEL, 9, Y_SEL, 9);
  2872. pMapCfg->xy2raMap[ 6] = XY2(Y_SEL,10, Y_SEL,10);
  2873. pMapCfg->xy2raMap[ 7] = XY2(Y_SEL,11, Y_SEL,11);
  2874. pMapCfg->xy2raMap[ 8] = XY2(Y_SEL,12, Y_SEL,12);
  2875. pMapCfg->xy2raMap[ 9] = XY2(Y_SEL,13, Y_SEL,13);
  2876. pMapCfg->xy2raMap[10] = XY2(Y_SEL,14, Y_SEL,14);
  2877. pMapCfg->xy2raMap[11] = XY2(Y_SEL,15, Y_SEL,15);
  2878. }
  2879. else if (dramCfg->casBit == 10 && dramCfg->bankBit == 3 && dramCfg->rasBit == 16) // DDR3 3BA, DDR4 1BG+2BA
  2880. {
  2881. pMapCfg->xy2caMap[0] = XY2(Y_SEL, 0, Y_SEL, 0);
  2882. pMapCfg->xy2caMap[1] = XY2(Y_SEL, 1, Y_SEL, 1);
  2883. pMapCfg->xy2caMap[2] = XY2(Y_SEL, 2, Y_SEL, 2);
  2884. pMapCfg->xy2caMap[3] = XY2(Y_SEL, 3, Y_SEL, 3);
  2885. pMapCfg->xy2caMap[4] = XY2(X_SEL, 3, X_SEL, 3);
  2886. pMapCfg->xy2caMap[5] = XY2(X_SEL, 4, X_SEL, 4);
  2887. pMapCfg->xy2caMap[6] = XY2(X_SEL, 5, X_SEL, 5);
  2888. pMapCfg->xy2caMap[7] = XY2(X_SEL, 6, X_SEL, 6);
  2889. pMapCfg->xy2caMap[8] = XY2(X_SEL, 7, X_SEL, 7);
  2890. pMapCfg->xy2caMap[9] = XY2(Y_SEL, 4, Y_SEL, 5);
  2891. //bank
  2892. pMapCfg->xy2baMap[0] = XY2BANK(0,X_SEL, 8, 4, X_SEL, 8);
  2893. pMapCfg->xy2baMap[1] = XY2BANK(0,X_SEL, 9, 4, X_SEL, 9);
  2894. pMapCfg->xy2baMap[2] = XY2BANK(0,Y_SEL, 5, 4, Y_SEL, 4);
  2895. //ras
  2896. pMapCfg->xy2raMap[ 0] = XY2(X_SEL, 10, X_SEL, 10);
  2897. pMapCfg->xy2raMap[ 1] = XY2(Y_SEL, 6, Y_SEL, 6);
  2898. pMapCfg->xy2raMap[ 2] = XY2(Y_SEL, 7, Y_SEL, 7);
  2899. pMapCfg->xy2raMap[ 3] = XY2(Y_SEL, 8, Y_SEL, 8);
  2900. pMapCfg->xy2raMap[ 4] = XY2(Y_SEL, 9, Y_SEL, 9);
  2901. pMapCfg->xy2raMap[ 5] = XY2(Y_SEL, 10, Y_SEL,10);
  2902. pMapCfg->xy2raMap[ 6] = XY2(Y_SEL,11, Y_SEL,11);
  2903. pMapCfg->xy2raMap[ 7] = XY2(Y_SEL,12, Y_SEL,12);
  2904. pMapCfg->xy2raMap[ 8] = XY2(Y_SEL,13, Y_SEL,13);
  2905. pMapCfg->xy2raMap[ 9] = XY2(Y_SEL,14, Y_SEL,14);
  2906. pMapCfg->xy2raMap[10] = XY2(Y_SEL,15, Y_SEL,15);
  2907. }
  2908. else if (dramCfg->casBit == 10 && dramCfg->bankBit == 4 && dramCfg->rasBit == 15) // DDR3 4BA, DDR4 2BG+2BA
  2909. {
  2910. //cas
  2911. pMapCfg->xy2caMap[0] = XY2(Y_SEL, 0, Y_SEL, 0);
  2912. pMapCfg->xy2caMap[1] = XY2(Y_SEL, 1, Y_SEL, 1);
  2913. pMapCfg->xy2caMap[2] = XY2(Y_SEL, 2, Y_SEL, 2);
  2914. pMapCfg->xy2caMap[3] = XY2(Y_SEL, 3, Y_SEL, 3);
  2915. pMapCfg->xy2caMap[4] = XY2(X_SEL, 3, X_SEL, 3);
  2916. pMapCfg->xy2caMap[5] = XY2(X_SEL, 4, X_SEL, 4);
  2917. pMapCfg->xy2caMap[6] = XY2(X_SEL, 5, X_SEL, 5);
  2918. pMapCfg->xy2caMap[7] = XY2(X_SEL, 6, X_SEL, 6);
  2919. pMapCfg->xy2caMap[8] = XY2(Y_SEL, 4, Y_SEL, 4);
  2920. pMapCfg->xy2caMap[9] = XY2(Y_SEL, 5, Y_SEL, 6);
  2921. //bank
  2922. pMapCfg->xy2baMap[0] = XY2BANK(0,X_SEL, 7, 4, X_SEL, 7);
  2923. pMapCfg->xy2baMap[1] = XY2BANK(0,X_SEL, 8, 4, X_SEL, 8);
  2924. pMapCfg->xy2baMap[2] = XY2BANK(0,X_SEL, 9, 4, X_SEL, 9);
  2925. pMapCfg->xy2baMap[3] = XY2BANK(0,Y_SEL, 6, 4, Y_SEL, 5);
  2926. //ras
  2927. pMapCfg->xy2raMap[ 0] = XY2(X_SEL, 10, X_SEL, 10);
  2928. pMapCfg->xy2raMap[ 1] = XY2(Y_SEL, 7, Y_SEL, 7);
  2929. pMapCfg->xy2raMap[ 2] = XY2(Y_SEL, 8, Y_SEL, 8);
  2930. pMapCfg->xy2raMap[ 3] = XY2(Y_SEL, 9, Y_SEL, 9);
  2931. pMapCfg->xy2raMap[ 4] = XY2(Y_SEL,10, Y_SEL,10);
  2932. pMapCfg->xy2raMap[ 5] = XY2(Y_SEL,11, Y_SEL,11);
  2933. pMapCfg->xy2raMap[ 6] = XY2(Y_SEL,12, Y_SEL,12);
  2934. pMapCfg->xy2raMap[ 7] = XY2(Y_SEL,13, Y_SEL,13);
  2935. pMapCfg->xy2raMap[ 8] = XY2(Y_SEL,14, Y_SEL,14);
  2936. pMapCfg->xy2raMap[ 9] = XY2(Y_SEL,15, Y_SEL,15);
  2937. }
  2938. //xy2rbcConfig
  2939. pMapCfg->xy2rbcConfig = XY2CONFIG(0,0,0,1,1,15,0,15,0);
  2940. break;
  2941. case TILED_FRAME_H_MAP:
  2942. if (dramCfg->casBit == 9 && dramCfg->bankBit == 2 && dramCfg->rasBit == 13) // CNN setting
  2943. {
  2944. //cas
  2945. pMapCfg->xy2caMap[0] = XY2(X_SEL, 3, X_SEL, 3);
  2946. pMapCfg->xy2caMap[1] = XY2(X_SEL, 4, X_SEL, 4);
  2947. pMapCfg->xy2caMap[2] = XY2(X_SEL, 5, X_SEL, 5);
  2948. pMapCfg->xy2caMap[3] = XY2(X_SEL, 6, X_SEL, 6);
  2949. pMapCfg->xy2caMap[4] = XY2(Y_SEL, 0, Y_SEL, 0);
  2950. pMapCfg->xy2caMap[5] = XY2(Y_SEL, 1, Y_SEL, 1);
  2951. pMapCfg->xy2caMap[6] = XY2(Y_SEL, 2, Y_SEL, 2);
  2952. pMapCfg->xy2caMap[7] = XY2(Y_SEL, 3, Y_SEL, 3);
  2953. pMapCfg->xy2caMap[8] = XY2(Y_SEL, 4, Y_SEL, 5);
  2954. //bank
  2955. pMapCfg->xy2baMap[0] = XY2BANK(0,X_SEL, 7, 4,X_SEL, 7);
  2956. pMapCfg->xy2baMap[1] = XY2BANK(0,Y_SEL, 5, 4,Y_SEL, 4);
  2957. //ras
  2958. pMapCfg->xy2raMap[ 0] = XY2(X_SEL, 8, X_SEL, 8);
  2959. pMapCfg->xy2raMap[ 1] = XY2(X_SEL, 9, X_SEL, 9);
  2960. pMapCfg->xy2raMap[ 2] = XY2(X_SEL,10, X_SEL,10);
  2961. pMapCfg->xy2raMap[ 3] = XY2(Y_SEL, 6, Y_SEL, 6);
  2962. pMapCfg->xy2raMap[ 4] = XY2(Y_SEL, 7, Y_SEL, 7);
  2963. pMapCfg->xy2raMap[ 5] = XY2(Y_SEL, 8, Y_SEL, 8);
  2964. pMapCfg->xy2raMap[ 6] = XY2(Y_SEL, 9, Y_SEL, 9);
  2965. pMapCfg->xy2raMap[ 7] = XY2(Y_SEL,10, Y_SEL,10);
  2966. pMapCfg->xy2raMap[ 8] = XY2(Y_SEL,11, Y_SEL,11);
  2967. pMapCfg->xy2raMap[ 9] = XY2(Y_SEL,12, Y_SEL,12);
  2968. pMapCfg->xy2raMap[10] = XY2(Y_SEL,13, Y_SEL,13);
  2969. pMapCfg->xy2raMap[11] = XY2(Y_SEL,14, Y_SEL,14);
  2970. pMapCfg->xy2raMap[12] = XY2(Y_SEL,15, Y_SEL,15);
  2971. }
  2972. else if(dramCfg->casBit == 10 && dramCfg->bankBit == 3 && dramCfg->rasBit == 13)
  2973. {
  2974. //cas
  2975. pMapCfg->xy2caMap[0] = XY2(Z_SEL, 0, Z_SEL, 0);
  2976. pMapCfg->xy2caMap[1] = XY2(X_SEL, 3, X_SEL, 3);
  2977. pMapCfg->xy2caMap[2] = XY2(X_SEL, 4, X_SEL, 4);
  2978. pMapCfg->xy2caMap[3] = XY2(X_SEL, 5, X_SEL, 5);
  2979. pMapCfg->xy2caMap[4] = XY2(X_SEL, 6, X_SEL, 6);
  2980. pMapCfg->xy2caMap[5] = XY2(Y_SEL, 0, Y_SEL, 0);
  2981. pMapCfg->xy2caMap[6] = XY2(Y_SEL, 1, Y_SEL, 1);
  2982. pMapCfg->xy2caMap[7] = XY2(Y_SEL, 2, Y_SEL, 2);
  2983. pMapCfg->xy2caMap[8] = XY2(Y_SEL, 3, Y_SEL, 3);
  2984. pMapCfg->xy2caMap[9] = XY2(Y_SEL, 4, Y_SEL, 4);
  2985. //bank
  2986. pMapCfg->xy2baMap[0] = XY2BANK(0,X_SEL, 7, 4, X_SEL, 7);
  2987. pMapCfg->xy2baMap[1] = XY2BANK(0,X_SEL, 8, 4, X_SEL, 8);
  2988. pMapCfg->xy2baMap[2] = XY2BANK(0,Y_SEL, 5, 4, Y_SEL, 5);
  2989. pMapCfg->xy2raMap[ 0] = XY2(X_SEL, 9, X_SEL, 9);
  2990. pMapCfg->xy2raMap[ 1] = XY2(X_SEL,10, X_SEL,10);
  2991. pMapCfg->xy2raMap[ 2] = XY2(Y_SEL, 6, Y_SEL, 6);
  2992. pMapCfg->xy2raMap[ 3] = XY2(Y_SEL, 7, Y_SEL, 7);
  2993. pMapCfg->xy2raMap[ 4] = XY2(Y_SEL, 8, Y_SEL, 8);
  2994. pMapCfg->xy2raMap[ 5] = XY2(Y_SEL, 9, Y_SEL, 9);
  2995. pMapCfg->xy2raMap[ 6] = XY2(Y_SEL,10, Y_SEL,10);
  2996. pMapCfg->xy2raMap[ 7] = XY2(Y_SEL,11, Y_SEL,11);
  2997. pMapCfg->xy2raMap[ 8] = XY2(Y_SEL,12, Y_SEL,12);
  2998. pMapCfg->xy2raMap[ 9] = XY2(Y_SEL,13, Y_SEL,13);
  2999. pMapCfg->xy2raMap[10] = XY2(Y_SEL,14, Y_SEL,14);
  3000. pMapCfg->xy2raMap[11] = XY2(Y_SEL,15, Y_SEL,15);
  3001. }
  3002. //xy2rbcConfig
  3003. pMapCfg->xy2rbcConfig = XY2CONFIG(0,0,0,1,0,15,15,15,15);
  3004. break;
  3005. case TILED_FIELD_V_MAP:
  3006. if (dramCfg->casBit == 9 && dramCfg->bankBit == 2 && dramCfg->rasBit == 13) // CNN setting
  3007. {
  3008. //cas
  3009. pMapCfg->xy2caMap[0] = XY2(Y_SEL, 0, Y_SEL, 0);
  3010. pMapCfg->xy2caMap[1] = XY2(Y_SEL, 1, Y_SEL, 1);
  3011. pMapCfg->xy2caMap[2] = XY2(Y_SEL, 2, Y_SEL, 2);
  3012. pMapCfg->xy2caMap[3] = XY2(Y_SEL, 3, Y_SEL, 3);
  3013. pMapCfg->xy2caMap[4] = XY2(X_SEL, 3, X_SEL, 3);
  3014. pMapCfg->xy2caMap[5] = XY2(X_SEL, 4, X_SEL, 4);
  3015. pMapCfg->xy2caMap[6] = XY2(X_SEL, 5, X_SEL, 5);
  3016. pMapCfg->xy2caMap[7] = XY2(X_SEL, 6, X_SEL, 6);
  3017. pMapCfg->xy2caMap[8] = XY2(Y_SEL, 4, Y_SEL, 5);
  3018. //bank
  3019. pMapCfg->xy2baMap[0] = XY2BANK(0,X_SEL, 7, 4,X_SEL, 7);
  3020. pMapCfg->xy2baMap[1] = XY2BANK(1,Y_SEL, 5, 5,Y_SEL, 4);
  3021. //ras
  3022. pMapCfg->xy2raMap[ 0] = XY2(X_SEL, 8, X_SEL, 8);
  3023. pMapCfg->xy2raMap[ 1] = XY2(X_SEL, 9, X_SEL, 9);
  3024. pMapCfg->xy2raMap[ 2] = XY2(X_SEL,10, X_SEL,10);
  3025. pMapCfg->xy2raMap[ 3] = XY2(Y_SEL, 6, Y_SEL, 6);
  3026. pMapCfg->xy2raMap[ 4] = XY2(Y_SEL, 7, Y_SEL, 7);
  3027. pMapCfg->xy2raMap[ 5] = XY2(Y_SEL, 8, Y_SEL, 8);
  3028. pMapCfg->xy2raMap[ 6] = XY2(Y_SEL, 9, Y_SEL, 9);
  3029. pMapCfg->xy2raMap[ 7] = XY2(Y_SEL,10, Y_SEL,10);
  3030. pMapCfg->xy2raMap[ 8] = XY2(Y_SEL,11, Y_SEL,11);
  3031. pMapCfg->xy2raMap[ 9] = XY2(Y_SEL,12, Y_SEL,12);
  3032. pMapCfg->xy2raMap[10] = XY2(Y_SEL,13, Y_SEL,13);
  3033. pMapCfg->xy2raMap[11] = XY2(Y_SEL,14, Y_SEL,14);
  3034. pMapCfg->xy2raMap[12] = XY2(Y_SEL,15, Y_SEL,15);
  3035. }
  3036. else if(dramCfg->casBit == 10 && dramCfg->bankBit == 3 && dramCfg->rasBit == 13)
  3037. {
  3038. //cas
  3039. pMapCfg->xy2caMap[0] = XY2(Z_SEL, 0, Z_SEL, 0);
  3040. pMapCfg->xy2caMap[1] = XY2(Y_SEL, 0, Y_SEL, 0);
  3041. pMapCfg->xy2caMap[2] = XY2(Y_SEL, 1, Y_SEL, 1);
  3042. pMapCfg->xy2caMap[3] = XY2(Y_SEL, 2, Y_SEL, 2);
  3043. pMapCfg->xy2caMap[4] = XY2(Y_SEL, 3, Y_SEL, 3);
  3044. pMapCfg->xy2caMap[5] = XY2(X_SEL, 3, X_SEL, 3);
  3045. pMapCfg->xy2caMap[6] = XY2(X_SEL, 4, X_SEL, 4);
  3046. pMapCfg->xy2caMap[7] = XY2(X_SEL, 5, X_SEL, 5);
  3047. pMapCfg->xy2caMap[8] = XY2(X_SEL, 6, X_SEL, 6);
  3048. pMapCfg->xy2caMap[9] = XY2(Y_SEL, 4, Y_SEL, 4);
  3049. //bank
  3050. pMapCfg->xy2baMap[0] = XY2BANK(0,X_SEL, 7, 4, X_SEL, 7);
  3051. pMapCfg->xy2baMap[1] = XY2BANK(0,X_SEL, 8, 4, X_SEL, 8);
  3052. pMapCfg->xy2baMap[2] = XY2BANK(0,Y_SEL, 5, 4, Y_SEL, 5);
  3053. pMapCfg->xy2raMap[ 0] = XY2(X_SEL, 9, X_SEL, 9);
  3054. pMapCfg->xy2raMap[ 1] = XY2(X_SEL,10, X_SEL,10);
  3055. pMapCfg->xy2raMap[ 2] = XY2(Y_SEL, 6, Y_SEL, 6);
  3056. pMapCfg->xy2raMap[ 3] = XY2(Y_SEL, 7, Y_SEL, 7);
  3057. pMapCfg->xy2raMap[ 4] = XY2(Y_SEL, 8, Y_SEL, 8);
  3058. pMapCfg->xy2raMap[ 5] = XY2(Y_SEL, 9, Y_SEL, 9);
  3059. pMapCfg->xy2raMap[ 6] = XY2(Y_SEL,10, Y_SEL,10);
  3060. pMapCfg->xy2raMap[ 7] = XY2(Y_SEL,11, Y_SEL,11);
  3061. pMapCfg->xy2raMap[ 8] = XY2(Y_SEL,12, Y_SEL,12);
  3062. pMapCfg->xy2raMap[ 9] = XY2(Y_SEL,13, Y_SEL,13);
  3063. pMapCfg->xy2raMap[10] = XY2(Y_SEL,14, Y_SEL,14);
  3064. pMapCfg->xy2raMap[11] = XY2(Y_SEL,15, Y_SEL,15);
  3065. }
  3066. else if (dramCfg->casBit == 10 && dramCfg->bankBit == 3 && dramCfg->rasBit == 16) // // DDR3 3BA, DDR4 1BG+2BA
  3067. {
  3068. pMapCfg->xy2caMap[0] = XY2(Y_SEL, 0, Y_SEL, 0);
  3069. pMapCfg->xy2caMap[1] = XY2(Y_SEL, 1, Y_SEL, 1);
  3070. pMapCfg->xy2caMap[2] = XY2(Y_SEL, 2, Y_SEL, 2);
  3071. pMapCfg->xy2caMap[3] = XY2(Y_SEL, 3, Y_SEL, 3);
  3072. pMapCfg->xy2caMap[4] = XY2(X_SEL, 3, X_SEL, 3);
  3073. pMapCfg->xy2caMap[5] = XY2(X_SEL, 4, X_SEL, 4);
  3074. pMapCfg->xy2caMap[6] = XY2(X_SEL, 5, X_SEL, 5);
  3075. pMapCfg->xy2caMap[7] = XY2(X_SEL, 6, X_SEL, 6);
  3076. pMapCfg->xy2caMap[8] = XY2(X_SEL, 7, X_SEL, 7);
  3077. pMapCfg->xy2caMap[9] = XY2(Y_SEL, 4, Y_SEL, 5);
  3078. //bank
  3079. pMapCfg->xy2baMap[0] = XY2BANK(0,X_SEL, 8, 4, X_SEL, 8);
  3080. pMapCfg->xy2baMap[1] = XY2BANK(0,X_SEL, 9, 4, X_SEL, 9);
  3081. pMapCfg->xy2baMap[2] = XY2BANK(1,Y_SEL, 5, 5, Y_SEL, 4);
  3082. //ras
  3083. pMapCfg->xy2raMap[ 0] = XY2(X_SEL, 10, X_SEL, 10);
  3084. pMapCfg->xy2raMap[ 1] = XY2(Y_SEL, 6, Y_SEL, 6);
  3085. pMapCfg->xy2raMap[ 2] = XY2(Y_SEL, 7, Y_SEL, 7);
  3086. pMapCfg->xy2raMap[ 3] = XY2(Y_SEL, 8, Y_SEL, 8);
  3087. pMapCfg->xy2raMap[ 4] = XY2(Y_SEL, 9, Y_SEL, 9);
  3088. pMapCfg->xy2raMap[ 5] = XY2(Y_SEL, 10, Y_SEL,10);
  3089. pMapCfg->xy2raMap[ 6] = XY2(Y_SEL,11, Y_SEL,11);
  3090. pMapCfg->xy2raMap[ 7] = XY2(Y_SEL,12, Y_SEL,12);
  3091. pMapCfg->xy2raMap[ 8] = XY2(Y_SEL,13, Y_SEL,13);
  3092. pMapCfg->xy2raMap[ 9] = XY2(Y_SEL,14, Y_SEL,14);
  3093. pMapCfg->xy2raMap[10] = XY2(Y_SEL,15, Y_SEL,15);
  3094. }
  3095. else if (dramCfg->casBit == 10 && dramCfg->bankBit == 4 && dramCfg->rasBit == 15) // // DDR3 4BA, DDR4 2BG+2BA
  3096. {
  3097. //cas
  3098. pMapCfg->xy2caMap[0] = XY2(Y_SEL, 0, Y_SEL, 0);
  3099. pMapCfg->xy2caMap[1] = XY2(Y_SEL, 1, Y_SEL, 1);
  3100. pMapCfg->xy2caMap[2] = XY2(Y_SEL, 2, Y_SEL, 2);
  3101. pMapCfg->xy2caMap[3] = XY2(Y_SEL, 3, Y_SEL, 3);
  3102. pMapCfg->xy2caMap[4] = XY2(X_SEL, 3, X_SEL, 3);
  3103. pMapCfg->xy2caMap[5] = XY2(X_SEL, 4, X_SEL, 4);
  3104. pMapCfg->xy2caMap[6] = XY2(X_SEL, 5, X_SEL, 5);
  3105. pMapCfg->xy2caMap[7] = XY2(X_SEL, 6, X_SEL, 6);
  3106. pMapCfg->xy2caMap[8] = XY2(Y_SEL, 4, Y_SEL, 4);
  3107. pMapCfg->xy2caMap[9] = XY2(Y_SEL, 5, Y_SEL, 6);
  3108. //bank
  3109. pMapCfg->xy2baMap[0] = XY2BANK(0,X_SEL, 7, 4, X_SEL, 7);
  3110. pMapCfg->xy2baMap[1] = XY2BANK(0,X_SEL, 8, 4, X_SEL, 8);
  3111. pMapCfg->xy2baMap[2] = XY2BANK(0,X_SEL, 9, 4, X_SEL, 9);
  3112. pMapCfg->xy2baMap[3] = XY2BANK(1,Y_SEL, 6, 5, Y_SEL, 5);
  3113. //ras
  3114. pMapCfg->xy2raMap[ 0] = XY2(X_SEL, 10, X_SEL, 10);
  3115. pMapCfg->xy2raMap[ 1] = XY2(Y_SEL, 7, Y_SEL, 7);
  3116. pMapCfg->xy2raMap[ 2] = XY2(Y_SEL, 8, Y_SEL, 8);
  3117. pMapCfg->xy2raMap[ 3] = XY2(Y_SEL, 9, Y_SEL, 9);
  3118. pMapCfg->xy2raMap[ 4] = XY2(Y_SEL,10, Y_SEL,10);
  3119. pMapCfg->xy2raMap[ 5] = XY2(Y_SEL,11, Y_SEL,11);
  3120. pMapCfg->xy2raMap[ 6] = XY2(Y_SEL,12, Y_SEL,12);
  3121. pMapCfg->xy2raMap[ 7] = XY2(Y_SEL,13, Y_SEL,13);
  3122. pMapCfg->xy2raMap[ 8] = XY2(Y_SEL,14, Y_SEL,14);
  3123. pMapCfg->xy2raMap[ 9] = XY2(Y_SEL,15, Y_SEL,15);
  3124. }
  3125. //xy2rbcConfig
  3126. pMapCfg->xy2rbcConfig = XY2CONFIG(0,1,1,1,1,15,15,15,15);
  3127. break;
  3128. case TILED_MIXED_V_MAP:
  3129. //cas
  3130. if (dramCfg->casBit == 9 && dramCfg->bankBit == 2 && dramCfg->rasBit == 13) // CNN setting
  3131. {
  3132. pMapCfg->xy2caMap[0] = XY2(Y_SEL, 1, Y_SEL, 1);
  3133. pMapCfg->xy2caMap[1] = XY2(Y_SEL, 2, Y_SEL, 2);
  3134. pMapCfg->xy2caMap[2] = XY2(Y_SEL, 3, Y_SEL, 3);
  3135. pMapCfg->xy2caMap[3] = XY2(Y_SEL, 0, Y_SEL, 0);
  3136. pMapCfg->xy2caMap[4] = XY2(X_SEL, 3, X_SEL, 3);
  3137. pMapCfg->xy2caMap[5] = XY2(X_SEL, 4, X_SEL, 4);
  3138. pMapCfg->xy2caMap[6] = XY2(X_SEL, 5, X_SEL, 5);
  3139. pMapCfg->xy2caMap[7] = XY2(X_SEL, 6, X_SEL, 6);
  3140. pMapCfg->xy2caMap[8] = XY2(Y_SEL, 4, Y_SEL, 5);
  3141. pMapCfg->xy2baMap[0] = XY2BANK(0,X_SEL, 7, 4,X_SEL, 7);
  3142. pMapCfg->xy2baMap[1] = XY2BANK(0,Y_SEL, 5, 4,Y_SEL, 4);
  3143. pMapCfg->xy2raMap[ 0] = XY2(X_SEL, 8, X_SEL, 8);
  3144. pMapCfg->xy2raMap[ 1] = XY2(X_SEL, 9, X_SEL, 9);
  3145. pMapCfg->xy2raMap[ 2] = XY2(X_SEL,10, X_SEL,10);
  3146. pMapCfg->xy2raMap[ 3] = XY2(Y_SEL, 6, Y_SEL, 6);
  3147. pMapCfg->xy2raMap[ 4] = XY2(Y_SEL, 7, Y_SEL, 7);
  3148. pMapCfg->xy2raMap[ 5] = XY2(Y_SEL, 8, Y_SEL, 8);
  3149. pMapCfg->xy2raMap[ 6] = XY2(Y_SEL, 9, Y_SEL, 9);
  3150. pMapCfg->xy2raMap[ 7] = XY2(Y_SEL,10, Y_SEL,10);
  3151. pMapCfg->xy2raMap[ 8] = XY2(Y_SEL,11, Y_SEL,11);
  3152. pMapCfg->xy2raMap[ 9] = XY2(Y_SEL,12, Y_SEL,12);
  3153. pMapCfg->xy2raMap[10] = XY2(Y_SEL,13, Y_SEL,13);
  3154. pMapCfg->xy2raMap[11] = XY2(Y_SEL,14, Y_SEL,14);
  3155. pMapCfg->xy2raMap[12] = XY2(Y_SEL,15, Y_SEL,15);
  3156. }
  3157. else if(dramCfg->casBit == 10 && dramCfg->bankBit == 3 && dramCfg->rasBit == 13)
  3158. {
  3159. //cas
  3160. pMapCfg->xy2caMap[0] = XY2(Z_SEL, 0, Z_SEL, 0);
  3161. pMapCfg->xy2caMap[1] = XY2(Y_SEL, 1, Y_SEL, 1);
  3162. pMapCfg->xy2caMap[2] = XY2(Y_SEL, 2, Y_SEL, 2);
  3163. pMapCfg->xy2caMap[3] = XY2(Y_SEL, 3, Y_SEL, 3);
  3164. pMapCfg->xy2caMap[4] = XY2(Y_SEL, 0, Y_SEL, 0);
  3165. pMapCfg->xy2caMap[5] = XY2(X_SEL, 3, X_SEL, 3);
  3166. pMapCfg->xy2caMap[6] = XY2(X_SEL, 4, X_SEL, 4);
  3167. pMapCfg->xy2caMap[7] = XY2(X_SEL, 5, X_SEL, 5);
  3168. pMapCfg->xy2caMap[8] = XY2(X_SEL, 6, X_SEL, 6);
  3169. pMapCfg->xy2caMap[9] = XY2(Y_SEL, 4, Y_SEL, 4);
  3170. //bank
  3171. pMapCfg->xy2baMap[0] = XY2BANK(0,X_SEL, 7, 4, X_SEL, 7);
  3172. pMapCfg->xy2baMap[1] = XY2BANK(0,X_SEL, 8, 4, X_SEL, 8);
  3173. pMapCfg->xy2baMap[2] = XY2BANK(0,Y_SEL, 5, 4, Y_SEL, 5);
  3174. pMapCfg->xy2raMap[ 0] = XY2(X_SEL, 9, X_SEL, 9);
  3175. pMapCfg->xy2raMap[ 1] = XY2(X_SEL,10, X_SEL,10);
  3176. pMapCfg->xy2raMap[ 2] = XY2(Y_SEL, 6, Y_SEL, 6);
  3177. pMapCfg->xy2raMap[ 3] = XY2(Y_SEL, 7, Y_SEL, 7);
  3178. pMapCfg->xy2raMap[ 4] = XY2(Y_SEL, 8, Y_SEL, 8);
  3179. pMapCfg->xy2raMap[ 5] = XY2(Y_SEL, 9, Y_SEL, 9);
  3180. pMapCfg->xy2raMap[ 6] = XY2(Y_SEL,10, Y_SEL,10);
  3181. pMapCfg->xy2raMap[ 7] = XY2(Y_SEL,11, Y_SEL,11);
  3182. pMapCfg->xy2raMap[ 8] = XY2(Y_SEL,12, Y_SEL,12);
  3183. pMapCfg->xy2raMap[ 9] = XY2(Y_SEL,13, Y_SEL,13);
  3184. pMapCfg->xy2raMap[10] = XY2(Y_SEL,14, Y_SEL,14);
  3185. pMapCfg->xy2raMap[11] = XY2(Y_SEL,15, Y_SEL,15);
  3186. }
  3187. //xy2rbcConfig
  3188. pMapCfg->xy2rbcConfig = XY2CONFIG(0,0,1,1,1,7,7,7,7);
  3189. break;
  3190. case TILED_FRAME_MB_RASTER_MAP:
  3191. //cas
  3192. pMapCfg->xy2caMap[0] = XY2(Y_SEL, 0, Y_SEL, 0);
  3193. pMapCfg->xy2caMap[1] = XY2(Y_SEL, 1, Y_SEL, 1);
  3194. pMapCfg->xy2caMap[2] = XY2(Y_SEL, 2, Y_SEL, 2);
  3195. pMapCfg->xy2caMap[3] = XY2(Y_SEL, 3, X_SEL, 3);
  3196. pMapCfg->xy2caMap[4] = XY2(X_SEL, 3, 4 , 0);
  3197. //xy2rbcConfig
  3198. pMapCfg->xy2rbcConfig = XY2CONFIG(0,0,0,1,1,15,0,7,0);
  3199. break;
  3200. case TILED_FIELD_MB_RASTER_MAP:
  3201. //cas
  3202. pMapCfg->xy2caMap[0] = XY2(Y_SEL, 0, Y_SEL, 0);
  3203. pMapCfg->xy2caMap[1] = XY2(Y_SEL, 1, Y_SEL, 1);
  3204. pMapCfg->xy2caMap[2] = XY2(Y_SEL, 2, X_SEL, 3);
  3205. pMapCfg->xy2caMap[3] = XY2(X_SEL, 3, 4 , 0);
  3206. //xy2rbcConfig
  3207. pMapCfg->xy2rbcConfig = XY2CONFIG(0,1,1,1,1,7,7,3,3);
  3208. break;
  3209. default:
  3210. return 0;
  3211. }
  3212. if (mapType == TILED_FRAME_MB_RASTER_MAP)
  3213. {
  3214. pMapCfg->rbc2axiMap[ 0] = RBC( Z_SEL, 0, Z_SEL, 0);
  3215. pMapCfg->rbc2axiMap[ 1] = RBC( Z_SEL, 0, Z_SEL, 0);
  3216. pMapCfg->rbc2axiMap[ 2] = RBC( Z_SEL, 0, Z_SEL, 0);
  3217. pMapCfg->rbc2axiMap[ 3] = RBC(CA_SEL, 0, CA_SEL, 0);
  3218. pMapCfg->rbc2axiMap[ 4] = RBC(CA_SEL, 1, CA_SEL, 1);
  3219. pMapCfg->rbc2axiMap[ 5] = RBC(CA_SEL, 2, CA_SEL, 2);
  3220. pMapCfg->rbc2axiMap[ 6] = RBC(CA_SEL, 3, CA_SEL, 3);
  3221. pMapCfg->rbc2axiMap[ 7] = RBC(CA_SEL, 4, CA_SEL, 8);
  3222. pMapCfg->rbc2axiMap[ 8] = RBC(CA_SEL, 8, CA_SEL, 9);
  3223. pMapCfg->rbc2axiMap[ 9] = RBC(CA_SEL, 9, CA_SEL,10);
  3224. pMapCfg->rbc2axiMap[10] = RBC(CA_SEL,10, CA_SEL,11);
  3225. pMapCfg->rbc2axiMap[11] = RBC(CA_SEL,11, CA_SEL,12);
  3226. pMapCfg->rbc2axiMap[12] = RBC(CA_SEL,12, CA_SEL,13);
  3227. pMapCfg->rbc2axiMap[13] = RBC(CA_SEL,13, CA_SEL,14);
  3228. pMapCfg->rbc2axiMap[14] = RBC(CA_SEL,14, CA_SEL,15);
  3229. pMapCfg->rbc2axiMap[15] = RBC(CA_SEL,15, RA_SEL, 0);
  3230. pMapCfg->rbc2axiMap[16] = RBC(RA_SEL, 0, RA_SEL, 1);
  3231. pMapCfg->rbc2axiMap[17] = RBC(RA_SEL, 1, RA_SEL, 2);
  3232. pMapCfg->rbc2axiMap[18] = RBC(RA_SEL, 2, RA_SEL, 3);
  3233. pMapCfg->rbc2axiMap[19] = RBC(RA_SEL, 3, RA_SEL, 4);
  3234. pMapCfg->rbc2axiMap[20] = RBC(RA_SEL, 4, RA_SEL, 5);
  3235. pMapCfg->rbc2axiMap[21] = RBC(RA_SEL, 5, RA_SEL, 6);
  3236. pMapCfg->rbc2axiMap[22] = RBC(RA_SEL, 6, RA_SEL, 7);
  3237. pMapCfg->rbc2axiMap[23] = RBC(RA_SEL, 7, RA_SEL, 8);
  3238. pMapCfg->rbc2axiMap[24] = RBC(RA_SEL, 8, RA_SEL, 9);
  3239. pMapCfg->rbc2axiMap[25] = RBC(RA_SEL, 9, RA_SEL,10);
  3240. pMapCfg->rbc2axiMap[26] = RBC(RA_SEL,10, RA_SEL,11);
  3241. pMapCfg->rbc2axiMap[27] = RBC(RA_SEL,11, RA_SEL,12);
  3242. pMapCfg->rbc2axiMap[28] = RBC(RA_SEL,12, RA_SEL,13);
  3243. pMapCfg->rbc2axiMap[29] = RBC(RA_SEL,13, RA_SEL,14);
  3244. pMapCfg->rbc2axiMap[30] = RBC(RA_SEL,14, RA_SEL,15);
  3245. pMapCfg->rbc2axiMap[31] = RBC(RA_SEL,15, Z_SEL, 0);
  3246. ret = 1;
  3247. }
  3248. else if (mapType == TILED_FIELD_MB_RASTER_MAP)
  3249. {
  3250. pMapCfg->rbc2axiMap[ 0] = RBC(Z_SEL ,0 ,Z_SEL , 0);
  3251. pMapCfg->rbc2axiMap[ 1] = RBC(Z_SEL ,0 ,Z_SEL , 0);
  3252. pMapCfg->rbc2axiMap[ 2] = RBC(Z_SEL ,0 ,Z_SEL , 0);
  3253. pMapCfg->rbc2axiMap[ 3] = RBC(CA_SEL,0 ,CA_SEL, 0);
  3254. pMapCfg->rbc2axiMap[ 4] = RBC(CA_SEL,1 ,CA_SEL, 1);
  3255. pMapCfg->rbc2axiMap[ 5] = RBC(CA_SEL,2 ,CA_SEL, 2);
  3256. pMapCfg->rbc2axiMap[ 6] = RBC(CA_SEL,3 ,CA_SEL, 8);
  3257. pMapCfg->rbc2axiMap[ 7] = RBC(CA_SEL,8, CA_SEL, 9);
  3258. pMapCfg->rbc2axiMap[ 8] = RBC(CA_SEL,9, CA_SEL,10);
  3259. pMapCfg->rbc2axiMap[ 9] = RBC(CA_SEL,10 ,CA_SEL,11);
  3260. pMapCfg->rbc2axiMap[10] = RBC(CA_SEL,11 ,CA_SEL,12);
  3261. pMapCfg->rbc2axiMap[11] = RBC(CA_SEL,12 ,CA_SEL,13);
  3262. pMapCfg->rbc2axiMap[12] = RBC(CA_SEL,13 ,CA_SEL,14);
  3263. pMapCfg->rbc2axiMap[13] = RBC(CA_SEL,14 ,CA_SEL,15);
  3264. pMapCfg->rbc2axiMap[14] = RBC(CA_SEL,15 ,RA_SEL, 0);
  3265. pMapCfg->rbc2axiMap[15] = RBC(RA_SEL,0 ,RA_SEL, 1);
  3266. pMapCfg->rbc2axiMap[16] = RBC(RA_SEL,1 ,RA_SEL, 2);
  3267. pMapCfg->rbc2axiMap[17] = RBC(RA_SEL,2 ,RA_SEL, 3);
  3268. pMapCfg->rbc2axiMap[18] = RBC(RA_SEL,3 ,RA_SEL, 4);
  3269. pMapCfg->rbc2axiMap[19] = RBC(RA_SEL,4 ,RA_SEL, 5);
  3270. pMapCfg->rbc2axiMap[20] = RBC(RA_SEL,5 ,RA_SEL, 6);
  3271. pMapCfg->rbc2axiMap[21] = RBC(RA_SEL,6 ,RA_SEL, 7);
  3272. pMapCfg->rbc2axiMap[22] = RBC(RA_SEL,7 ,RA_SEL, 8);
  3273. pMapCfg->rbc2axiMap[23] = RBC(RA_SEL,8 ,RA_SEL, 9);
  3274. pMapCfg->rbc2axiMap[24] = RBC(RA_SEL,9 ,RA_SEL,10);
  3275. pMapCfg->rbc2axiMap[25] = RBC(RA_SEL,10 ,RA_SEL,11);
  3276. pMapCfg->rbc2axiMap[26] = RBC(RA_SEL,11 ,RA_SEL,12);
  3277. pMapCfg->rbc2axiMap[27] = RBC(RA_SEL,12 ,RA_SEL,13);
  3278. pMapCfg->rbc2axiMap[28] = RBC(RA_SEL,13 ,RA_SEL,14);
  3279. pMapCfg->rbc2axiMap[29] = RBC(RA_SEL,14 ,RA_SEL,15);
  3280. pMapCfg->rbc2axiMap[30] = RBC(RA_SEL,15 , Z_SEL, 0);
  3281. pMapCfg->rbc2axiMap[31] = RBC(Z_SEL , 0 , Z_SEL, 0);
  3282. ret = 1;
  3283. }
  3284. else
  3285. {
  3286. if (dramCfg->casBit == 9 && dramCfg->bankBit == 2 && dramCfg->rasBit == 13)
  3287. {
  3288. pMapCfg->rbc2axiMap[ 0] = RBC(Z_SEL,0, Z_SEL,0);
  3289. pMapCfg->rbc2axiMap[ 1] = RBC(Z_SEL,0, Z_SEL,0);
  3290. pMapCfg->rbc2axiMap[ 2] = RBC(Z_SEL,0, Z_SEL,0);
  3291. pMapCfg->rbc2axiMap[ 3] = RBC(CA_SEL,0,CA_SEL,0);
  3292. pMapCfg->rbc2axiMap[ 4] = RBC(CA_SEL,1,CA_SEL,1);
  3293. pMapCfg->rbc2axiMap[ 5] = RBC(CA_SEL,2,CA_SEL,2);
  3294. pMapCfg->rbc2axiMap[ 6] = RBC(CA_SEL,3,CA_SEL,3);
  3295. pMapCfg->rbc2axiMap[ 7] = RBC(CA_SEL,4,CA_SEL,4);
  3296. pMapCfg->rbc2axiMap[ 8] = RBC(CA_SEL,5,CA_SEL,5);
  3297. pMapCfg->rbc2axiMap[ 9] = RBC(CA_SEL,6,CA_SEL,6);
  3298. pMapCfg->rbc2axiMap[10] = RBC(CA_SEL,7,CA_SEL,7);
  3299. pMapCfg->rbc2axiMap[11] = RBC(CA_SEL,8,CA_SEL,8);
  3300. pMapCfg->rbc2axiMap[12] = RBC(BA_SEL,0, BA_SEL,0);
  3301. pMapCfg->rbc2axiMap[13] = RBC(BA_SEL,1, BA_SEL,1);
  3302. pMapCfg->rbc2axiMap[14] = RBC(RA_SEL,0, RA_SEL, 0);
  3303. pMapCfg->rbc2axiMap[15] = RBC(RA_SEL,1, RA_SEL, 1);
  3304. pMapCfg->rbc2axiMap[16] = RBC(RA_SEL,2 ,RA_SEL, 2);
  3305. pMapCfg->rbc2axiMap[17] = RBC(RA_SEL,3 ,RA_SEL, 3);
  3306. pMapCfg->rbc2axiMap[18] = RBC(RA_SEL,4 ,RA_SEL, 4);
  3307. pMapCfg->rbc2axiMap[19] = RBC(RA_SEL,5 ,RA_SEL, 5);
  3308. pMapCfg->rbc2axiMap[20] = RBC(RA_SEL,6 ,RA_SEL, 6);
  3309. pMapCfg->rbc2axiMap[21] = RBC(RA_SEL,7 ,RA_SEL, 7);
  3310. pMapCfg->rbc2axiMap[22] = RBC(RA_SEL,8 ,RA_SEL, 8);
  3311. pMapCfg->rbc2axiMap[23] = RBC(RA_SEL,9 ,RA_SEL, 9);
  3312. pMapCfg->rbc2axiMap[24] = RBC(RA_SEL,10,RA_SEL,10);
  3313. pMapCfg->rbc2axiMap[25] = RBC(RA_SEL,11,RA_SEL,11);
  3314. pMapCfg->rbc2axiMap[26] = RBC(RA_SEL,12,RA_SEL,12);
  3315. pMapCfg->rbc2axiMap[27] = RBC(RA_SEL,13,RA_SEL,13);
  3316. pMapCfg->rbc2axiMap[28] = RBC(RA_SEL,14,RA_SEL,14);
  3317. pMapCfg->rbc2axiMap[29] = RBC(RA_SEL,15,RA_SEL,15);
  3318. pMapCfg->rbc2axiMap[30] = RBC(Z_SEL , 0, Z_SEL, 0);
  3319. pMapCfg->rbc2axiMap[31] = RBC(Z_SEL , 0, Z_SEL, 0);
  3320. ret = 1;
  3321. }
  3322. else if(dramCfg->casBit == 10 && dramCfg->bankBit == 3 && dramCfg->rasBit == 13)
  3323. {
  3324. pMapCfg->rbc2axiMap[ 0] = RBC(Z_SEL, 0, Z_SEL,0);
  3325. pMapCfg->rbc2axiMap[ 1] = RBC(Z_SEL, 0, Z_SEL,0);
  3326. pMapCfg->rbc2axiMap[ 2] = RBC(CA_SEL,0,CA_SEL,0);
  3327. pMapCfg->rbc2axiMap[ 3] = RBC(CA_SEL,1,CA_SEL,1);
  3328. pMapCfg->rbc2axiMap[ 4] = RBC(CA_SEL,2,CA_SEL,2);
  3329. pMapCfg->rbc2axiMap[ 5] = RBC(CA_SEL,3,CA_SEL,3);
  3330. pMapCfg->rbc2axiMap[ 6] = RBC(CA_SEL,4,CA_SEL,4);
  3331. pMapCfg->rbc2axiMap[ 7] = RBC(CA_SEL,5,CA_SEL,5);
  3332. pMapCfg->rbc2axiMap[ 8] = RBC(CA_SEL,6,CA_SEL,6);
  3333. pMapCfg->rbc2axiMap[ 9] = RBC(CA_SEL,7,CA_SEL,7);
  3334. pMapCfg->rbc2axiMap[10] = RBC(CA_SEL,8,CA_SEL,8);
  3335. pMapCfg->rbc2axiMap[11] = RBC(CA_SEL,9,CA_SEL,9);
  3336. pMapCfg->rbc2axiMap[12] = RBC(BA_SEL,0, BA_SEL,0);
  3337. pMapCfg->rbc2axiMap[13] = RBC(BA_SEL,1, BA_SEL,1);
  3338. pMapCfg->rbc2axiMap[14] = RBC(BA_SEL,2, BA_SEL,2);
  3339. pMapCfg->rbc2axiMap[15] = RBC(RA_SEL, 0, RA_SEL, 0);
  3340. pMapCfg->rbc2axiMap[16] = RBC(RA_SEL, 1 ,RA_SEL, 1);
  3341. pMapCfg->rbc2axiMap[17] = RBC(RA_SEL, 2 ,RA_SEL, 2);
  3342. pMapCfg->rbc2axiMap[18] = RBC(RA_SEL, 3 ,RA_SEL, 3);
  3343. pMapCfg->rbc2axiMap[19] = RBC(RA_SEL, 4 ,RA_SEL, 4);
  3344. pMapCfg->rbc2axiMap[20] = RBC(RA_SEL, 5 ,RA_SEL, 5);
  3345. pMapCfg->rbc2axiMap[21] = RBC(RA_SEL, 6 ,RA_SEL, 6);
  3346. pMapCfg->rbc2axiMap[22] = RBC(RA_SEL, 7 ,RA_SEL, 7);
  3347. pMapCfg->rbc2axiMap[23] = RBC(RA_SEL, 8 ,RA_SEL, 8);
  3348. pMapCfg->rbc2axiMap[24] = RBC(RA_SEL, 9, RA_SEL, 9);
  3349. pMapCfg->rbc2axiMap[25] = RBC(RA_SEL,10, RA_SEL,10);
  3350. pMapCfg->rbc2axiMap[26] = RBC(RA_SEL,11, RA_SEL,11);
  3351. pMapCfg->rbc2axiMap[27] = RBC(RA_SEL,12, RA_SEL,12);
  3352. pMapCfg->rbc2axiMap[28] = RBC(Z_SEL , 0, Z_SEL , 0);
  3353. pMapCfg->rbc2axiMap[29] = RBC(Z_SEL , 0, Z_SEL , 0);
  3354. pMapCfg->rbc2axiMap[30] = RBC(Z_SEL , 0, Z_SEL , 0);
  3355. pMapCfg->rbc2axiMap[31] = RBC(Z_SEL , 0, Z_SEL , 0);
  3356. ret = 1;
  3357. }
  3358. else if (dramCfg->casBit == 10 && dramCfg->bankBit == 3 && dramCfg->rasBit == 16) // DDR3 3BA, DDR4 1BG+2BA
  3359. {
  3360. pMapCfg->rbc2axiMap[ 0] = RBC(Z_SEL,0, Z_SEL,0);
  3361. pMapCfg->rbc2axiMap[ 1] = RBC(Z_SEL,0, Z_SEL,0);
  3362. pMapCfg->rbc2axiMap[ 2] = RBC(Z_SEL,0, Z_SEL,0);
  3363. pMapCfg->rbc2axiMap[ 3] = RBC(CA_SEL,0,CA_SEL,0);
  3364. pMapCfg->rbc2axiMap[ 4] = RBC(CA_SEL,1,CA_SEL,1);
  3365. pMapCfg->rbc2axiMap[ 5] = RBC(CA_SEL,2,CA_SEL,2);
  3366. pMapCfg->rbc2axiMap[ 6] = RBC(CA_SEL,3,CA_SEL,3);
  3367. pMapCfg->rbc2axiMap[ 7] = RBC(CA_SEL,4,CA_SEL,4);
  3368. pMapCfg->rbc2axiMap[ 8] = RBC(CA_SEL,5,CA_SEL,5);
  3369. pMapCfg->rbc2axiMap[ 9] = RBC(CA_SEL,6,CA_SEL,6);
  3370. pMapCfg->rbc2axiMap[10] = RBC(CA_SEL,7,CA_SEL,7);
  3371. pMapCfg->rbc2axiMap[11] = RBC(CA_SEL,8,CA_SEL,8);
  3372. pMapCfg->rbc2axiMap[12] = RBC(CA_SEL,9,CA_SEL,9);
  3373. pMapCfg->rbc2axiMap[13] = RBC(BA_SEL,0, BA_SEL,0);
  3374. pMapCfg->rbc2axiMap[14] = RBC(BA_SEL,1, BA_SEL,1);
  3375. pMapCfg->rbc2axiMap[15] = RBC(BA_SEL,2, BA_SEL,2);
  3376. pMapCfg->rbc2axiMap[16] = RBC(RA_SEL,0, RA_SEL, 0);
  3377. pMapCfg->rbc2axiMap[17] = RBC(RA_SEL,1, RA_SEL, 1);
  3378. pMapCfg->rbc2axiMap[18] = RBC(RA_SEL,2 ,RA_SEL, 2);
  3379. pMapCfg->rbc2axiMap[19] = RBC(RA_SEL,3 ,RA_SEL, 3);
  3380. pMapCfg->rbc2axiMap[20] = RBC(RA_SEL,4 ,RA_SEL, 4);
  3381. pMapCfg->rbc2axiMap[21] = RBC(RA_SEL,5 ,RA_SEL, 5);
  3382. pMapCfg->rbc2axiMap[22] = RBC(RA_SEL,6 ,RA_SEL, 6);
  3383. pMapCfg->rbc2axiMap[23] = RBC(RA_SEL,7 ,RA_SEL, 7);
  3384. pMapCfg->rbc2axiMap[24] = RBC(RA_SEL,8 ,RA_SEL, 8);
  3385. pMapCfg->rbc2axiMap[25] = RBC(RA_SEL,9 ,RA_SEL, 9);
  3386. pMapCfg->rbc2axiMap[26] = RBC(RA_SEL,10,RA_SEL,10);
  3387. pMapCfg->rbc2axiMap[27] = RBC(RA_SEL,11,RA_SEL,11);
  3388. pMapCfg->rbc2axiMap[28] = RBC(RA_SEL,12,RA_SEL,12);
  3389. pMapCfg->rbc2axiMap[29] = RBC(RA_SEL,13,RA_SEL,13);
  3390. pMapCfg->rbc2axiMap[30] = RBC(RA_SEL,14,RA_SEL,14);
  3391. pMapCfg->rbc2axiMap[31] = RBC(RA_SEL,15,RA_SEL,15);
  3392. ret = 1;
  3393. }
  3394. else if (dramCfg->casBit == 10 && dramCfg->bankBit == 4 && dramCfg->rasBit == 15) // DDR3 4BA, DDR4 2BG+2BA
  3395. {
  3396. pMapCfg->rbc2axiMap[ 0] = RBC(Z_SEL,0, Z_SEL,0);
  3397. pMapCfg->rbc2axiMap[ 1] = RBC(Z_SEL,0, Z_SEL,0);
  3398. pMapCfg->rbc2axiMap[ 2] = RBC(Z_SEL,0, Z_SEL,0);
  3399. pMapCfg->rbc2axiMap[ 3] = RBC(CA_SEL,0,CA_SEL,0);
  3400. pMapCfg->rbc2axiMap[ 4] = RBC(CA_SEL,1,CA_SEL,1);
  3401. pMapCfg->rbc2axiMap[ 5] = RBC(CA_SEL,2,CA_SEL,2);
  3402. pMapCfg->rbc2axiMap[ 6] = RBC(CA_SEL,3,CA_SEL,3);
  3403. pMapCfg->rbc2axiMap[ 7] = RBC(CA_SEL,4,CA_SEL,4);
  3404. pMapCfg->rbc2axiMap[ 8] = RBC(CA_SEL,5,CA_SEL,5);
  3405. pMapCfg->rbc2axiMap[ 9] = RBC(CA_SEL,6,CA_SEL,6);
  3406. pMapCfg->rbc2axiMap[10] = RBC(CA_SEL,7,CA_SEL,7);
  3407. pMapCfg->rbc2axiMap[11] = RBC(CA_SEL,8,CA_SEL,8);
  3408. pMapCfg->rbc2axiMap[12] = RBC(CA_SEL,9,CA_SEL,9);
  3409. pMapCfg->rbc2axiMap[13] = RBC(BA_SEL,2, BA_SEL,2);
  3410. pMapCfg->rbc2axiMap[14] = RBC(BA_SEL,3, BA_SEL,3);
  3411. pMapCfg->rbc2axiMap[15] = RBC(BA_SEL,0, BA_SEL,0);
  3412. pMapCfg->rbc2axiMap[16] = RBC(BA_SEL,1, BA_SEL,1);
  3413. pMapCfg->rbc2axiMap[17] = RBC(RA_SEL,0, RA_SEL, 0);
  3414. pMapCfg->rbc2axiMap[18] = RBC(RA_SEL,1, RA_SEL, 1);
  3415. pMapCfg->rbc2axiMap[19] = RBC(RA_SEL,2 ,RA_SEL, 2);
  3416. pMapCfg->rbc2axiMap[20] = RBC(RA_SEL,3 ,RA_SEL, 3);
  3417. pMapCfg->rbc2axiMap[21] = RBC(RA_SEL,4 ,RA_SEL, 4);
  3418. pMapCfg->rbc2axiMap[22] = RBC(RA_SEL,5 ,RA_SEL, 5);
  3419. pMapCfg->rbc2axiMap[23] = RBC(RA_SEL,6 ,RA_SEL, 6);
  3420. pMapCfg->rbc2axiMap[24] = RBC(RA_SEL,7 ,RA_SEL, 7);
  3421. pMapCfg->rbc2axiMap[25] = RBC(RA_SEL,8 ,RA_SEL, 8);
  3422. pMapCfg->rbc2axiMap[26] = RBC(RA_SEL,9 ,RA_SEL, 9);
  3423. pMapCfg->rbc2axiMap[27] = RBC(RA_SEL,10,RA_SEL,10);
  3424. pMapCfg->rbc2axiMap[28] = RBC(RA_SEL,11,RA_SEL,11);
  3425. pMapCfg->rbc2axiMap[29] = RBC(RA_SEL,12,RA_SEL,12);
  3426. pMapCfg->rbc2axiMap[30] = RBC(RA_SEL,13,RA_SEL,13);
  3427. pMapCfg->rbc2axiMap[31] = RBC(RA_SEL,14,RA_SEL,14);
  3428. ret = 1;
  3429. }
  3430. }
  3431. for (i=0; i<16; i++) { //xy2ca_map
  3432. VpuWriteReg(coreIdx, GDI_XY2_CAS_0 + 4*i, pMapCfg->xy2caMap[i]);
  3433. }
  3434. for (i=0; i<4; i++) { //xy2baMap
  3435. VpuWriteReg(coreIdx, GDI_XY2_BA_0 + 4*i, pMapCfg->xy2baMap[i]);
  3436. }
  3437. for (i=0; i<16; i++) { //xy2raMap
  3438. VpuWriteReg(coreIdx, GDI_XY2_RAS_0 + 4*i, pMapCfg->xy2raMap[i]);
  3439. }
  3440. //xy2rbcConfig
  3441. VpuWriteReg(coreIdx, GDI_XY2_RBC_CONFIG,pMapCfg->xy2rbcConfig);
  3442. //// fast access for reading
  3443. pMapCfg->tbSeparateMap = (pMapCfg->xy2rbcConfig >> 19) & 0x1;
  3444. pMapCfg->topBotSplit = (pMapCfg->xy2rbcConfig >> 18) & 0x1;
  3445. pMapCfg->tiledMap = (pMapCfg->xy2rbcConfig >> 17) & 0x1;
  3446. // RAS, BA, CAS -> Axi Addr
  3447. for (i=0; i<32; i++) {
  3448. VpuWriteReg(coreIdx, GDI_RBC2_AXI_0 + 4*i ,pMapCfg->rbc2axiMap[i]);
  3449. }
  3450. return ret;
  3451. }
  3452. static int GetXY2RBCLogic(int map_val,int xpos,int ypos, int tb)
  3453. {
  3454. int invert;
  3455. int assign_zero;
  3456. int tbxor;
  3457. int xysel;
  3458. int bitsel;
  3459. int xypos,xybit,xybit_st1,xybit_st2,xybit_st3;
  3460. invert = map_val >> 7;
  3461. assign_zero = (map_val & 0x78) >> 6;
  3462. tbxor = (map_val & 0x3C) >> 5;
  3463. xysel = (map_val & 0x1E) >> 4;
  3464. bitsel = map_val & 0x0f;
  3465. xypos = (xysel) ? ypos : xpos;
  3466. xybit = (xypos >> bitsel) & 0x01;
  3467. xybit_st1 = (tbxor) ? xybit^tb : xybit;
  3468. xybit_st2 = (assign_zero) ? 0 : xybit_st1;
  3469. xybit_st3 = (invert) ? !xybit_st2 : xybit_st2;
  3470. return xybit_st3;
  3471. }
  3472. static int GetRBC2AXILogic(int map_val , int ra_in, int ba_in, int ca_in)
  3473. {
  3474. int rbc;
  3475. int rst_bit ;
  3476. int rbc_sel = map_val >> 4;
  3477. int bit_sel = map_val & 0x0f;
  3478. if (rbc_sel == 0)
  3479. rbc = ca_in;
  3480. else if (rbc_sel == 1)
  3481. rbc = ba_in;
  3482. else if (rbc_sel == 2)
  3483. rbc = ra_in;
  3484. else
  3485. rbc = 0;
  3486. rst_bit = ((rbc >> bit_sel) & 1);
  3487. return rst_bit;
  3488. }
  3489. static int GetXY2AXIAddrV10(TiledMapConfig *pMapCfg, int ycbcr, int posY, int posX, int stride, FrameBuffer *fb)
  3490. {
  3491. int ypos_mod;
  3492. int temp;
  3493. int temp_bit;
  3494. int i;
  3495. int tb;
  3496. int ra_base;
  3497. int ras_base;
  3498. int ra_conv,ba_conv,ca_conv;
  3499. int pix_addr;
  3500. int lum_top_base,chr_top_base;
  3501. int lum_bot_base,chr_bot_base;
  3502. int mbx,mby,mb_addr;
  3503. int temp_val12bit, temp_val6bit;
  3504. int Addr;
  3505. int mb_raster_base;
  3506. if (!pMapCfg)
  3507. return -1;
  3508. pix_addr = 0;
  3509. mb_raster_base = 0;
  3510. ra_conv = 0;
  3511. ba_conv = 0;
  3512. ca_conv = 0;
  3513. tb = posY & 0x1;
  3514. ypos_mod = pMapCfg->tbSeparateMap ? posY >> 1 : posY;
  3515. Addr = ycbcr == 0 ? fb->bufY :
  3516. ycbcr == 2 ? fb->bufCb : fb->bufCr;
  3517. if (fb->mapType == LINEAR_FRAME_MAP)
  3518. return ((posY * stride) + posX) + Addr;
  3519. // 20bit = AddrY [31:12]
  3520. lum_top_base = fb->bufY >> 12;
  3521. // 20bit = AddrY [11: 0], AddrCb[31:24]
  3522. chr_top_base = ((fb->bufY & 0xfff) << 8) | ((fb->bufCb >> 24) & 0xff); //12bit + (32-24) bit
  3523. // 20bit = AddrCb[23: 4]
  3524. lum_bot_base = (fb->bufCb >> 4) & 0xfffff;
  3525. // 20bit = AddrCb[ 3: 0], AddrCr[31:16]
  3526. chr_bot_base = ((fb->bufCb & 0xf) << 16) | ((fb->bufCr >> 16) & 0xffff);
  3527. if (fb->mapType == TILED_FRAME_MB_RASTER_MAP || fb->mapType == TILED_FIELD_MB_RASTER_MAP)
  3528. {
  3529. if (ycbcr == 0)
  3530. {
  3531. mbx = posX/16;
  3532. mby = posY/16;
  3533. }
  3534. else //always interleave
  3535. {
  3536. mbx = posX/16;
  3537. mby = posY/8;
  3538. }
  3539. mb_addr = (stride/16) * mby + mbx;
  3540. // ca[7:0]
  3541. for (i=0 ; i<8; i++)
  3542. {
  3543. if (ycbcr==2 || ycbcr == 3)
  3544. temp = pMapCfg->xy2caMap[i] & 0xff;
  3545. else
  3546. temp = pMapCfg->xy2caMap[i] >> 8;
  3547. temp_bit = GetXY2RBCLogic(temp,posX,ypos_mod,tb);
  3548. ca_conv = ca_conv + (temp_bit << i);
  3549. }
  3550. // ca[15:8]
  3551. ca_conv = ca_conv + ((mb_addr & 0xff) << 8);
  3552. // ra[15:0]
  3553. ra_conv = mb_addr >> 8;
  3554. // ra,ba,ca -> axi
  3555. for (i=0; i<32; i++) {
  3556. temp_val12bit = pMapCfg->rbc2axiMap[i];
  3557. temp_val6bit = (ycbcr == 0 ) ? (temp_val12bit >> 6) : (temp_val12bit & 0x3f);
  3558. temp_bit = GetRBC2AXILogic(temp_val6bit,ra_conv,ba_conv,ca_conv);
  3559. pix_addr = pix_addr + (temp_bit<<i);
  3560. }
  3561. if (pMapCfg->tbSeparateMap ==1 && tb ==1)
  3562. mb_raster_base = ycbcr == 0 ? lum_bot_base : chr_bot_base;
  3563. else
  3564. mb_raster_base = ycbcr == 0 ? lum_top_base : chr_top_base;
  3565. pix_addr = pix_addr + (mb_raster_base << 12);
  3566. }
  3567. else
  3568. {
  3569. // ca
  3570. for (i=0 ; i<16; i++)
  3571. {
  3572. if (ycbcr==0 || ycbcr==1) // clair : there are no case ycbcr = 1
  3573. temp = pMapCfg->xy2caMap[i] >> 8;
  3574. else
  3575. temp = pMapCfg->xy2caMap[i] & 0xff;
  3576. temp_bit = GetXY2RBCLogic(temp,posX,ypos_mod,tb);
  3577. ca_conv = ca_conv + (temp_bit << i);
  3578. }
  3579. // ba
  3580. for (i=0 ; i<4; i++)
  3581. {
  3582. if (ycbcr==2 || ycbcr == 3)
  3583. temp = pMapCfg->xy2baMap[i] & 0xff;
  3584. else
  3585. temp = pMapCfg->xy2baMap[i] >> 8;
  3586. temp_bit = GetXY2RBCLogic(temp,posX,ypos_mod,tb);
  3587. ba_conv = ba_conv + (temp_bit << i);
  3588. }
  3589. // ras
  3590. for (i=0 ; i<16; i++)
  3591. {
  3592. if (ycbcr==2 || ycbcr == 3)
  3593. temp = pMapCfg->xy2raMap[i] & 0xff;
  3594. else
  3595. temp = pMapCfg->xy2raMap[i] >> 8;
  3596. temp_bit = GetXY2RBCLogic(temp,posX,ypos_mod,tb);
  3597. ra_conv = ra_conv + (temp_bit << i);
  3598. }
  3599. if (pMapCfg->tbSeparateMap == 1 && tb == 1)
  3600. ras_base = Addr >> 16;
  3601. else
  3602. ras_base = Addr & 0xffff;
  3603. ra_base = ra_conv + ras_base;
  3604. pix_addr = 0;
  3605. // ra,ba,ca -> axi
  3606. for (i=0; i<32; i++) {
  3607. temp_val12bit = pMapCfg->rbc2axiMap[i];
  3608. temp_val6bit = (ycbcr == 0 ) ? (temp_val12bit >> 6) : (temp_val12bit & 0x3f);
  3609. temp_bit = GetRBC2AXILogic(temp_val6bit,ra_base,ba_conv,ca_conv);
  3610. pix_addr = pix_addr + (temp_bit<<i);
  3611. }
  3612. pix_addr += pMapCfg->tiledBaseAddr;
  3613. }
  3614. return pix_addr;
  3615. }
  3616. int GetXY2AXIAddr(TiledMapConfig *pMapCfg, int ycbcr, int posY, int posX, int stride, FrameBuffer *fb)
  3617. {
  3618. if (pMapCfg->productId == PRODUCT_ID_980 || PRODUCT_ID_W_SERIES(pMapCfg->productId))
  3619. return GetXY2AXIAddr20(pMapCfg, ycbcr, posY, posX, stride, fb);
  3620. else if(pMapCfg->productId == PRODUCT_ID_960)
  3621. return GetXY2AXIAddrV10(pMapCfg, ycbcr, posY, posX, stride, fb);
  3622. return 0;
  3623. }
  3624. int SetTiledMapType(Uint32 coreIdx, TiledMapConfig *pMapCfg, int mapType, int stride, int interleave, DRAMConfig *pDramCfg)
  3625. {
  3626. int ret;
  3627. switch(pMapCfg->productId)
  3628. {
  3629. case PRODUCT_ID_980:
  3630. ret = SetTiledMapTypeV20(coreIdx, pMapCfg, mapType, stride, interleave);
  3631. break;
  3632. case PRODUCT_ID_960:
  3633. ret = SetTiledMapTypeV10(coreIdx, pMapCfg, pDramCfg, stride, mapType);
  3634. break;
  3635. case PRODUCT_ID_512:
  3636. case PRODUCT_ID_515:
  3637. case PRODUCT_ID_521:
  3638. case PRODUCT_ID_511:
  3639. case PRODUCT_ID_517:
  3640. ret = 1;
  3641. break;
  3642. default:
  3643. ret = 0;
  3644. break;
  3645. }
  3646. return ret;
  3647. }
  3648. Int32 CalcStride(
  3649. Uint32 width,
  3650. Uint32 height,
  3651. FrameBufferFormat format,
  3652. BOOL cbcrInterleave,
  3653. TiledMapType mapType,
  3654. BOOL isVP9
  3655. )
  3656. {
  3657. Uint32 lumaStride = 0;
  3658. Uint32 chromaStride = 0;
  3659. lumaStride = VPU_ALIGN32(width);
  3660. if (height > width) {
  3661. if ((mapType >= TILED_FRAME_V_MAP && mapType <= TILED_MIXED_V_MAP) ||
  3662. mapType == TILED_FRAME_NO_BANK_MAP ||
  3663. mapType == TILED_FIELD_NO_BANK_MAP)
  3664. width = VPU_ALIGN16(height); // TiledMap constraints
  3665. }
  3666. if (mapType == LINEAR_FRAME_MAP || mapType == LINEAR_FIELD_MAP) {
  3667. Uint32 twice = 0;
  3668. twice = cbcrInterleave == TRUE ? 2 : 1;
  3669. switch (format) {
  3670. case FORMAT_420:
  3671. /* nothing to do */
  3672. break;
  3673. case FORMAT_420_P10_16BIT_LSB:
  3674. case FORMAT_420_P10_16BIT_MSB:
  3675. case FORMAT_422_P10_16BIT_MSB:
  3676. case FORMAT_422_P10_16BIT_LSB:
  3677. lumaStride = VPU_ALIGN32(width)*2;
  3678. break;
  3679. case FORMAT_420_P10_32BIT_LSB:
  3680. case FORMAT_420_P10_32BIT_MSB:
  3681. case FORMAT_422_P10_32BIT_MSB:
  3682. case FORMAT_422_P10_32BIT_LSB:
  3683. if ( isVP9 == TRUE ) {
  3684. lumaStride = VPU_ALIGN32(((width+11)/12)*16);
  3685. chromaStride = (((width/2)+11)*twice/12)*16;
  3686. }
  3687. else {
  3688. width = VPU_ALIGN32(width);
  3689. lumaStride = ((VPU_ALIGN16(width)+11)/12)*16;
  3690. chromaStride = ((VPU_ALIGN16(width/2)+11)*twice/12)*16;
  3691. if ( (chromaStride*2) > lumaStride)
  3692. {
  3693. lumaStride = chromaStride * 2;
  3694. VLOG(INFO, "double chromaStride size is bigger than lumaStride\n");
  3695. }
  3696. }
  3697. if (cbcrInterleave == TRUE) {
  3698. lumaStride = MAX(lumaStride, chromaStride);
  3699. }
  3700. break;
  3701. case FORMAT_422:
  3702. /* nothing to do */
  3703. break;
  3704. case FORMAT_YUYV: // 4:2:2 8bit packed
  3705. case FORMAT_YVYU:
  3706. case FORMAT_UYVY:
  3707. case FORMAT_VYUY:
  3708. lumaStride = VPU_ALIGN32(width) * 2;
  3709. break;
  3710. case FORMAT_YUYV_P10_16BIT_MSB: // 4:2:2 10bit packed
  3711. case FORMAT_YUYV_P10_16BIT_LSB:
  3712. case FORMAT_YVYU_P10_16BIT_MSB:
  3713. case FORMAT_YVYU_P10_16BIT_LSB:
  3714. case FORMAT_UYVY_P10_16BIT_MSB:
  3715. case FORMAT_UYVY_P10_16BIT_LSB:
  3716. case FORMAT_VYUY_P10_16BIT_MSB:
  3717. case FORMAT_VYUY_P10_16BIT_LSB:
  3718. lumaStride = VPU_ALIGN32(width) * 4;
  3719. break;
  3720. case FORMAT_YUYV_P10_32BIT_MSB:
  3721. case FORMAT_YUYV_P10_32BIT_LSB:
  3722. case FORMAT_YVYU_P10_32BIT_MSB:
  3723. case FORMAT_YVYU_P10_32BIT_LSB:
  3724. case FORMAT_UYVY_P10_32BIT_MSB:
  3725. case FORMAT_UYVY_P10_32BIT_LSB:
  3726. case FORMAT_VYUY_P10_32BIT_MSB:
  3727. case FORMAT_VYUY_P10_32BIT_LSB:
  3728. lumaStride = VPU_ALIGN32(width*2)*2;
  3729. break;
  3730. default:
  3731. break;
  3732. }
  3733. }
  3734. else if (mapType == COMPRESSED_FRAME_MAP) {
  3735. switch (format) {
  3736. case FORMAT_420:
  3737. case FORMAT_422:
  3738. case FORMAT_YUYV:
  3739. case FORMAT_YVYU:
  3740. case FORMAT_UYVY:
  3741. case FORMAT_VYUY:
  3742. break;
  3743. case FORMAT_420_P10_16BIT_LSB:
  3744. case FORMAT_420_P10_16BIT_MSB:
  3745. case FORMAT_420_P10_32BIT_LSB:
  3746. case FORMAT_420_P10_32BIT_MSB:
  3747. case FORMAT_422_P10_16BIT_MSB:
  3748. case FORMAT_422_P10_16BIT_LSB:
  3749. case FORMAT_422_P10_32BIT_MSB:
  3750. case FORMAT_422_P10_32BIT_LSB:
  3751. case FORMAT_YUYV_P10_16BIT_MSB:
  3752. case FORMAT_YUYV_P10_16BIT_LSB:
  3753. case FORMAT_YVYU_P10_16BIT_MSB:
  3754. case FORMAT_YVYU_P10_16BIT_LSB:
  3755. case FORMAT_YVYU_P10_32BIT_MSB:
  3756. case FORMAT_YVYU_P10_32BIT_LSB:
  3757. case FORMAT_UYVY_P10_16BIT_MSB:
  3758. case FORMAT_UYVY_P10_16BIT_LSB:
  3759. case FORMAT_VYUY_P10_16BIT_MSB:
  3760. case FORMAT_VYUY_P10_16BIT_LSB:
  3761. case FORMAT_YUYV_P10_32BIT_MSB:
  3762. case FORMAT_YUYV_P10_32BIT_LSB:
  3763. case FORMAT_UYVY_P10_32BIT_MSB:
  3764. case FORMAT_UYVY_P10_32BIT_LSB:
  3765. case FORMAT_VYUY_P10_32BIT_MSB:
  3766. case FORMAT_VYUY_P10_32BIT_LSB:
  3767. lumaStride = VPU_ALIGN32(VPU_ALIGN16(width)*5)/4;
  3768. lumaStride = VPU_ALIGN32(lumaStride);
  3769. break;
  3770. default:
  3771. return -1;
  3772. }
  3773. }
  3774. else if (mapType == COMPRESSED_FRAME_MAP_V50_LOSSLESS_8BIT || mapType == COMPRESSED_FRAME_MAP_V50_LOSSLESS_10BIT || mapType == COMPRESSED_FRAME_MAP_V50_LOSSY) {
  3775. lumaStride = VPU_ALIGN32(width);
  3776. }
  3777. else if (mapType == COMPRESSED_FRAME_MAP_DUAL_CORE_8BIT || mapType == COMPRESSED_FRAME_MAP_DUAL_CORE_10BIT) {
  3778. Uint32 pad_x = 16;
  3779. Uint32 valid_width = VPU_CEIL(width, 16); // 16 align = BLK_WIDTH
  3780. lumaStride = VPU_CEIL(valid_width+pad_x, 16); // 16 align = BLK_WIDTH
  3781. }
  3782. else if (mapType == TILED_FRAME_NO_BANK_MAP || mapType == TILED_FIELD_NO_BANK_MAP) {
  3783. lumaStride = (width > 4096) ? 8192 :
  3784. (width > 2048) ? 4096 :
  3785. (width > 1024) ? 2048 :
  3786. (width > 512) ? 1024 : 512;
  3787. }
  3788. else if (mapType == TILED_FRAME_MB_RASTER_MAP || mapType == TILED_FIELD_MB_RASTER_MAP) {
  3789. lumaStride = VPU_ALIGN32(width);
  3790. }
  3791. else {
  3792. width = (width < height) ? height : width;
  3793. lumaStride = (width > 4096) ? 8192 :
  3794. (width > 2048) ? 4096 :
  3795. (width > 1024) ? 2048 :
  3796. (width > 512) ? 1024 : 512;
  3797. }
  3798. return lumaStride;
  3799. }
  3800. // 32 bit / 16 bit ==> 32-n bit remainder, n bit quotient
  3801. static int fixDivRq(int a, int b, int n)
  3802. {
  3803. Int64 c;
  3804. Int64 a_36bit;
  3805. Int64 mask, signBit, signExt;
  3806. int i;
  3807. // DIVS emulation for BPU accumulator size
  3808. // For SunOS build
  3809. mask = 0x0F; mask <<= 32; mask |= 0x00FFFFFFFF; // mask = 0x0FFFFFFFFF;
  3810. signBit = 0x08; signBit <<= 32; // signBit = 0x0800000000;
  3811. signExt = 0xFFFFFFF0; signExt <<= 32; // signExt = 0xFFFFFFF000000000;
  3812. a_36bit = (Int64) a;
  3813. for (i=0; i<n; i++) {
  3814. c = a_36bit - (b << 15);
  3815. if (c >= 0)
  3816. a_36bit = (c << 1) + 1;
  3817. else
  3818. a_36bit = a_36bit << 1;
  3819. a_36bit = a_36bit & mask;
  3820. if (a_36bit & signBit)
  3821. a_36bit |= signExt;
  3822. }
  3823. a = (int) a_36bit;
  3824. return a; // R = [31:n], Q = [n-1:0]
  3825. }
  3826. static int math_div(int number, int denom)
  3827. {
  3828. int c;
  3829. c = fixDivRq(number, denom, 17); // R = [31:17], Q = [16:0]
  3830. c = c & 0xFFFF;
  3831. c = (c + 1) >> 1; // round
  3832. return (c & 0xFFFF);
  3833. }
  3834. int LevelCalculation(int MbNumX, int MbNumY, int frameRateInfo, int interlaceFlag, int BitRate, int SliceNum)
  3835. {
  3836. int mbps;
  3837. int frameRateDiv, frameRateRes, frameRate;
  3838. int mbPicNum = (MbNumX*MbNumY);
  3839. int mbFrmNum;
  3840. int MaxSliceNum;
  3841. int LevelIdc = 0;
  3842. int i, maxMbs;
  3843. if (interlaceFlag) {
  3844. mbFrmNum = mbPicNum*2;
  3845. MbNumY *=2;
  3846. }
  3847. else mbFrmNum = mbPicNum;
  3848. frameRateDiv = (frameRateInfo >> 16) + 1;
  3849. frameRateRes = frameRateInfo & 0xFFFF;
  3850. frameRate = math_div(frameRateRes, frameRateDiv);
  3851. mbps = mbFrmNum*frameRate;
  3852. for(i=0; i<MAX_LAVEL_IDX; i++)
  3853. {
  3854. maxMbs = g_anLevelMaxMbs[i];
  3855. if ( mbps <= g_anLevelMaxMBPS[i]
  3856. && mbFrmNum <= g_anLevelMaxFS[i]
  3857. && MbNumX <= maxMbs
  3858. && MbNumY <= maxMbs
  3859. && BitRate <= g_anLevelMaxBR[i] )
  3860. {
  3861. LevelIdc = g_anLevel[i];
  3862. break;
  3863. }
  3864. }
  3865. if (i==MAX_LAVEL_IDX)
  3866. i = MAX_LAVEL_IDX-1;
  3867. if (SliceNum)
  3868. {
  3869. SliceNum = math_div(mbPicNum, SliceNum);
  3870. if (g_anLevelSliceRate[i])
  3871. {
  3872. MaxSliceNum = math_div( MAX( mbPicNum, g_anLevelMaxMBPS[i]/( 172/( 1+interlaceFlag ) )), g_anLevelSliceRate[i] );
  3873. if ( SliceNum> MaxSliceNum)
  3874. return -1;
  3875. }
  3876. }
  3877. return LevelIdc;
  3878. }
  3879. Int32 CalcLumaSize(
  3880. CodecInst* inst,
  3881. Int32 productId,
  3882. Int32 stride,
  3883. Int32 height,
  3884. FrameBufferFormat format,
  3885. BOOL cbcrIntl,
  3886. TiledMapType mapType,
  3887. DRAMConfig *pDramCfg
  3888. )
  3889. {
  3890. Int32 unit_size_hor_lum, unit_size_ver_lum, size_dpb_lum, field_map, size_dpb_lum_4k;
  3891. UNREFERENCED_PARAMETER(cbcrIntl);
  3892. if (mapType == TILED_FIELD_V_MAP || mapType == TILED_FIELD_NO_BANK_MAP || mapType == LINEAR_FIELD_MAP) {
  3893. field_map = 1;
  3894. }
  3895. else {
  3896. field_map = 0;
  3897. }
  3898. if (mapType == LINEAR_FRAME_MAP || mapType == LINEAR_FIELD_MAP) {
  3899. size_dpb_lum = stride * height;
  3900. }
  3901. else if (mapType == COMPRESSED_FRAME_MAP) {
  3902. size_dpb_lum = stride * height;
  3903. }
  3904. else if (mapType == COMPRESSED_FRAME_MAP_V50_LOSSLESS_10BIT || mapType == COMPRESSED_FRAME_MAP_V50_LOSSLESS_422_10BIT) {
  3905. size_dpb_lum = WAVE5_ENC_FBC50_LOSSLESS_LUMA_10BIT_FRAME_SIZE(stride, height);
  3906. }
  3907. else if (mapType == COMPRESSED_FRAME_MAP_V50_LOSSLESS_8BIT || mapType == COMPRESSED_FRAME_MAP_V50_LOSSLESS_422_8BIT) {
  3908. size_dpb_lum = WAVE5_ENC_FBC50_LOSSLESS_LUMA_8BIT_FRAME_SIZE(stride, height);
  3909. }
  3910. else if (mapType == COMPRESSED_FRAME_MAP_V50_LOSSY || mapType == COMPRESSED_FRAME_MAP_V50_LOSSY_422) {
  3911. if (pDramCfg == NULL)
  3912. return 0;
  3913. size_dpb_lum = WAVE5_ENC_FBC50_LOSSY_LUMA_FRAME_SIZE(stride, height, pDramCfg->tx16y);
  3914. }
  3915. else if (mapType == COMPRESSED_FRAME_MAP_DUAL_CORE_8BIT) {
  3916. Uint32 pad_y = 4;
  3917. Uint32 bgs_width;
  3918. Uint32 bgs_height, valid_height, comp_frm_height, bgs_row_bytes, bgs_num_y;
  3919. Uint32 size_dpb_lum_1024 = 0;
  3920. //=====================================================================
  3921. // BGS WIDTH calc for 8bit
  3922. // if(h.264) bgs_width = 1024
  3923. // else if (hevc_encoder) bgs_width = 512.
  3924. // else if (hevc_decoder} MAX(comp_size for bgs_width=512, comp_size for bgs_width=1024)
  3925. //=====================================================================
  3926. if (inst->codecMode == W_AVC_DEC || inst->codecMode == W_AVC_ENC) {
  3927. bgs_width = 1024;
  3928. }
  3929. else if (inst->codecMode == W_HEVC_ENC || inst->codecMode == W_HEVC_DEC) {
  3930. bgs_width = 512;
  3931. }
  3932. else {
  3933. VLOG(ERR, "Not support CodecMode for COMPRESSED_FRAME_MAP_DUAL_CORE\n");
  3934. return 0;
  3935. }
  3936. bgs_height = (1<<14) / bgs_width ;
  3937. valid_height = VPU_CEIL(height, 4); // 4 = BLK_HEIGHT
  3938. comp_frm_height = VPU_CEIL(valid_height + pad_y, bgs_height);
  3939. bgs_row_bytes = VPU_CEIL(stride*bgs_height*8/8, 512); // 512 = BURST_SIZE
  3940. bgs_num_y = comp_frm_height / bgs_height;
  3941. size_dpb_lum = bgs_row_bytes * bgs_num_y;
  3942. if (inst->codecMode == W_HEVC_DEC) {
  3943. // In case of HEVC decoder, max comp_frame_size between bsg_width=512 and 1024 should be used.
  3944. bgs_width = 1024;
  3945. bgs_height = (1<<14) / bgs_width ;
  3946. valid_height = VPU_CEIL(height, 4); // 4 = BLK_HEIGHT
  3947. comp_frm_height = VPU_CEIL(valid_height + pad_y, bgs_height);
  3948. bgs_row_bytes = VPU_CEIL(stride*bgs_height*8/8, 512); // 512 = BURST_SIZE
  3949. bgs_num_y = comp_frm_height / bgs_height;
  3950. size_dpb_lum_1024 = bgs_row_bytes * bgs_num_y;
  3951. size_dpb_lum = MAX(size_dpb_lum, size_dpb_lum_1024);
  3952. }
  3953. }
  3954. else if (mapType == COMPRESSED_FRAME_MAP_DUAL_CORE_10BIT) {
  3955. Uint32 pad_y = 4;
  3956. Uint32 bgs_width;
  3957. Uint32 bgs_height, valid_height, comp_frm_height, bgs_row_bytes, bgs_num_y;
  3958. Uint32 size_dpb_lum_512 = 0;
  3959. //=====================================================================
  3960. // BGS WIDTH calc for 10bit
  3961. // if(h.264) bgs_width = 512
  3962. // else if (hevc_encoder) bgs_width = 256.
  3963. // else if (hevc_decoder} MAX(comp_size for bgs_width=256, comp_size for bgs_width=512)
  3964. //=====================================================================
  3965. if (inst->codecMode == W_AVC_DEC || inst->codecMode == W_AVC_ENC) {
  3966. bgs_width = 512;
  3967. }
  3968. else if (inst->codecMode == W_HEVC_ENC || inst->codecMode == W_HEVC_DEC) {
  3969. bgs_width = 256;
  3970. }
  3971. else {
  3972. VLOG(ERR, "Not support CodecMode for COMPRESSED_FRAME_MAP_DUAL_CORE\n");
  3973. return 0;
  3974. }
  3975. bgs_height = (1<<14) / bgs_width / 2 ;
  3976. valid_height = VPU_CEIL(height, 4); // 4 = BLK_HEIGHT
  3977. comp_frm_height = VPU_CEIL(valid_height + pad_y, bgs_height);
  3978. bgs_row_bytes = VPU_CEIL(stride*bgs_height*10/8, 512); // 512 = BURST_SIZE
  3979. bgs_num_y = comp_frm_height / bgs_height;
  3980. size_dpb_lum = bgs_row_bytes * bgs_num_y;
  3981. if (inst->codecMode == W_HEVC_DEC) {
  3982. bgs_width = 512;
  3983. bgs_height = (1<<14) / bgs_width / 2 ;
  3984. valid_height = VPU_CEIL(height, 4); // 4 = BLK_HEIGHT
  3985. comp_frm_height = VPU_CEIL(valid_height + pad_y, bgs_height);
  3986. bgs_row_bytes = VPU_CEIL(stride*bgs_height*10/8, 512); // 512 = BURST_SIZE
  3987. bgs_num_y = comp_frm_height / bgs_height;
  3988. size_dpb_lum_512 = bgs_row_bytes * bgs_num_y;
  3989. size_dpb_lum = MAX(size_dpb_lum, size_dpb_lum_512);
  3990. }
  3991. }
  3992. else if (mapType == TILED_FRAME_NO_BANK_MAP || mapType == TILED_FIELD_NO_BANK_MAP) {
  3993. unit_size_hor_lum = stride;
  3994. unit_size_ver_lum = (((height>>field_map)+127)/128) * 128; // unit vertical size is 128 pixel (8MB)
  3995. size_dpb_lum = unit_size_hor_lum * (unit_size_ver_lum<<field_map);
  3996. }
  3997. else if (mapType == TILED_FRAME_MB_RASTER_MAP || mapType == TILED_FIELD_MB_RASTER_MAP) {
  3998. if (productId == PRODUCT_ID_960) {
  3999. size_dpb_lum = stride * height;
  4000. // aligned to 8192*2 (0x4000) for top/bot field
  4001. // use upper 20bit address only
  4002. size_dpb_lum_4k = ((size_dpb_lum + 16383)/16384)*16384;
  4003. if (mapType == TILED_FIELD_MB_RASTER_MAP) {
  4004. size_dpb_lum_4k = ((size_dpb_lum_4k+(0x8000-1))&~(0x8000-1));
  4005. }
  4006. size_dpb_lum = size_dpb_lum_4k;
  4007. }
  4008. else {
  4009. size_dpb_lum = stride * (height>>field_map);
  4010. size_dpb_lum_4k = ((size_dpb_lum+(16384-1))/16384)*16384;
  4011. size_dpb_lum = size_dpb_lum_4k<<field_map;
  4012. }
  4013. }
  4014. else {
  4015. if (productId == PRODUCT_ID_960) {
  4016. Int32 VerSizePerRas,Ras1DBit;
  4017. Int32 ChrSizeYField;
  4018. Int32 ChrFieldRasSize,ChrFrameRasSize,LumFieldRasSize,LumFrameRasSize;
  4019. ChrSizeYField = ((height/2)+1)>>1;
  4020. if (pDramCfg == NULL)
  4021. return 0;
  4022. if (mapType == TILED_FRAME_V_MAP) {
  4023. if (pDramCfg->casBit == 9 && pDramCfg->bankBit == 2 && pDramCfg->rasBit == 13) { // CNN setting
  4024. VerSizePerRas = 64;
  4025. Ras1DBit = 3;
  4026. }
  4027. else if(pDramCfg->casBit == 10 && pDramCfg->bankBit == 3 && pDramCfg->rasBit == 13) {
  4028. VerSizePerRas = 64;
  4029. Ras1DBit = 2;
  4030. }
  4031. else if (pDramCfg->casBit == 10 && pDramCfg->bankBit == 3 && pDramCfg->rasBit == 16) { // BITMAIN setting
  4032. VerSizePerRas = 64; // Tile (16x2)*(4*2)
  4033. Ras1DBit = 1;
  4034. }
  4035. else if (pDramCfg->casBit == 10 && pDramCfg->bankBit == 4 && pDramCfg->rasBit == 15) { // BITMAIN setting
  4036. VerSizePerRas = 128; // Tile (8x4)*(8x2)
  4037. Ras1DBit = 1;
  4038. }
  4039. else
  4040. return 0;
  4041. }
  4042. else if (mapType == TILED_FRAME_H_MAP) {
  4043. if (pDramCfg->casBit == 9 && pDramCfg->bankBit == 2 && pDramCfg->rasBit == 13) { // CNN setting
  4044. VerSizePerRas = 64;
  4045. Ras1DBit = 3;
  4046. }
  4047. else if(pDramCfg->casBit == 10 && pDramCfg->bankBit == 3 && pDramCfg->rasBit == 13) {
  4048. VerSizePerRas = 64;
  4049. Ras1DBit = 2;
  4050. }
  4051. else
  4052. return 0;
  4053. }
  4054. else if (mapType == TILED_FIELD_V_MAP) {
  4055. if (pDramCfg->casBit == 9 && pDramCfg->bankBit == 2 && pDramCfg->rasBit == 13) { // CNN setting
  4056. VerSizePerRas = 64;
  4057. Ras1DBit = 3;
  4058. }
  4059. else if(pDramCfg->casBit == 10 && pDramCfg->bankBit == 3 && pDramCfg->rasBit == 13) {
  4060. VerSizePerRas = 64;
  4061. Ras1DBit = 2;
  4062. }
  4063. else if (pDramCfg->casBit == 10 && pDramCfg->bankBit == 3 && pDramCfg->rasBit == 16) { // BITMAIN setting
  4064. VerSizePerRas = 64; // Tile (16x2)*(4*2)
  4065. Ras1DBit = 1;
  4066. }
  4067. else if (pDramCfg->casBit == 10 && pDramCfg->bankBit == 4 && pDramCfg->rasBit == 15) { // BITMAIN setting
  4068. VerSizePerRas = 128; // Tile (8x4)*(8x2)
  4069. Ras1DBit = 1;
  4070. }
  4071. else
  4072. return 0;
  4073. }
  4074. else { // TILED_FIELD_H_MAP
  4075. if (pDramCfg->casBit == 9 && pDramCfg->bankBit == 2 && pDramCfg->rasBit == 13) { // CNN setting
  4076. VerSizePerRas = 64;
  4077. Ras1DBit = 3;
  4078. }
  4079. else if(pDramCfg->casBit == 10 && pDramCfg->bankBit == 3 && pDramCfg->rasBit == 13) {
  4080. VerSizePerRas = 64;
  4081. Ras1DBit = 2;
  4082. }
  4083. else
  4084. return 0;
  4085. }
  4086. ChrFieldRasSize = ((ChrSizeYField + (VerSizePerRas-1))/VerSizePerRas) << Ras1DBit;
  4087. ChrFrameRasSize = ChrFieldRasSize *2;
  4088. LumFieldRasSize = ChrFrameRasSize;
  4089. LumFrameRasSize = LumFieldRasSize *2;
  4090. size_dpb_lum = LumFrameRasSize << (pDramCfg->bankBit+pDramCfg->casBit+pDramCfg->busBit);
  4091. }
  4092. else { // productId != 960
  4093. unit_size_hor_lum = stride;
  4094. unit_size_ver_lum = (((height>>field_map)+63)/64) * 64; // unit vertical size is 64 pixel (4MB)
  4095. size_dpb_lum = unit_size_hor_lum * (unit_size_ver_lum<<field_map);
  4096. }
  4097. }
  4098. return size_dpb_lum;
  4099. }
  4100. Int32 CalcChromaSize(
  4101. CodecInst* inst,
  4102. Int32 productId,
  4103. Int32 stride,
  4104. Int32 height,
  4105. FrameBufferFormat format,
  4106. BOOL cbcrIntl,
  4107. TiledMapType mapType,
  4108. DRAMConfig* pDramCfg
  4109. )
  4110. {
  4111. Int32 chr_size_y, chr_size_x;
  4112. Int32 chr_vscale, chr_hscale;
  4113. Int32 unit_size_hor_chr, unit_size_ver_chr;
  4114. Int32 size_dpb_chr, size_dpb_chr_4k;
  4115. Int32 field_map;
  4116. unit_size_hor_chr = 0;
  4117. unit_size_ver_chr = 0;
  4118. chr_hscale = 1;
  4119. chr_vscale = 1;
  4120. switch (format) {
  4121. case FORMAT_420_P10_16BIT_LSB:
  4122. case FORMAT_420_P10_16BIT_MSB:
  4123. case FORMAT_420_P10_32BIT_LSB:
  4124. case FORMAT_420_P10_32BIT_MSB:
  4125. case FORMAT_420:
  4126. chr_hscale = 2;
  4127. chr_vscale = 2;
  4128. break;
  4129. case FORMAT_224:
  4130. chr_vscale = 2;
  4131. break;
  4132. case FORMAT_422:
  4133. case FORMAT_422_P10_16BIT_LSB:
  4134. case FORMAT_422_P10_16BIT_MSB:
  4135. case FORMAT_422_P10_32BIT_LSB:
  4136. case FORMAT_422_P10_32BIT_MSB:
  4137. chr_hscale = 2;
  4138. break;
  4139. case FORMAT_444:
  4140. case FORMAT_400:
  4141. case FORMAT_YUYV:
  4142. case FORMAT_YVYU:
  4143. case FORMAT_UYVY:
  4144. case FORMAT_VYUY:
  4145. case FORMAT_YUYV_P10_16BIT_MSB: // 4:2:2 10bit packed
  4146. case FORMAT_YUYV_P10_16BIT_LSB:
  4147. case FORMAT_YVYU_P10_16BIT_MSB:
  4148. case FORMAT_YVYU_P10_16BIT_LSB:
  4149. case FORMAT_UYVY_P10_16BIT_MSB:
  4150. case FORMAT_UYVY_P10_16BIT_LSB:
  4151. case FORMAT_VYUY_P10_16BIT_MSB:
  4152. case FORMAT_VYUY_P10_16BIT_LSB:
  4153. case FORMAT_YUYV_P10_32BIT_MSB:
  4154. case FORMAT_YUYV_P10_32BIT_LSB:
  4155. case FORMAT_YVYU_P10_32BIT_MSB:
  4156. case FORMAT_YVYU_P10_32BIT_LSB:
  4157. case FORMAT_UYVY_P10_32BIT_MSB:
  4158. case FORMAT_UYVY_P10_32BIT_LSB:
  4159. case FORMAT_VYUY_P10_32BIT_MSB:
  4160. case FORMAT_VYUY_P10_32BIT_LSB:
  4161. break;
  4162. default:
  4163. return 0;
  4164. }
  4165. if (mapType == TILED_FIELD_V_MAP || mapType == TILED_FIELD_NO_BANK_MAP || mapType == LINEAR_FIELD_MAP) {
  4166. field_map = 1;
  4167. }
  4168. else {
  4169. field_map = 0;
  4170. }
  4171. if (mapType == LINEAR_FRAME_MAP || mapType == LINEAR_FIELD_MAP) {
  4172. switch (format) {
  4173. case FORMAT_420:
  4174. unit_size_hor_chr = stride/2;
  4175. unit_size_ver_chr = height/2;
  4176. break;
  4177. case FORMAT_420_P10_16BIT_LSB:
  4178. case FORMAT_420_P10_16BIT_MSB:
  4179. // 1p2b stride = align32(W)*2;
  4180. unit_size_hor_chr = stride/2;
  4181. unit_size_ver_chr = height/2;
  4182. break;
  4183. case FORMAT_420_P10_32BIT_LSB:
  4184. case FORMAT_420_P10_32BIT_MSB:
  4185. unit_size_hor_chr = VPU_ALIGN16(stride/2);
  4186. unit_size_ver_chr = height/2;
  4187. break;
  4188. case FORMAT_422:
  4189. case FORMAT_422_P10_16BIT_LSB:
  4190. case FORMAT_422_P10_16BIT_MSB:
  4191. case FORMAT_422_P10_32BIT_LSB:
  4192. case FORMAT_422_P10_32BIT_MSB:
  4193. unit_size_hor_chr = VPU_ALIGN32(stride/2);
  4194. unit_size_ver_chr = height;
  4195. break;
  4196. case FORMAT_YUYV:
  4197. case FORMAT_YVYU:
  4198. case FORMAT_UYVY:
  4199. case FORMAT_VYUY:
  4200. case FORMAT_YUYV_P10_16BIT_MSB: // 4:2:2 10bit packed
  4201. case FORMAT_YUYV_P10_16BIT_LSB:
  4202. case FORMAT_YVYU_P10_16BIT_MSB:
  4203. case FORMAT_YVYU_P10_16BIT_LSB:
  4204. case FORMAT_UYVY_P10_16BIT_MSB:
  4205. case FORMAT_UYVY_P10_16BIT_LSB:
  4206. case FORMAT_VYUY_P10_16BIT_MSB:
  4207. case FORMAT_VYUY_P10_16BIT_LSB:
  4208. case FORMAT_YUYV_P10_32BIT_MSB:
  4209. case FORMAT_YUYV_P10_32BIT_LSB:
  4210. case FORMAT_YVYU_P10_32BIT_MSB:
  4211. case FORMAT_YVYU_P10_32BIT_LSB:
  4212. case FORMAT_UYVY_P10_32BIT_MSB:
  4213. case FORMAT_UYVY_P10_32BIT_LSB:
  4214. case FORMAT_VYUY_P10_32BIT_MSB:
  4215. case FORMAT_VYUY_P10_32BIT_LSB:
  4216. unit_size_hor_chr = 0;
  4217. unit_size_ver_chr = 0;
  4218. break;
  4219. default:
  4220. break;
  4221. }
  4222. size_dpb_chr = (format == FORMAT_400) ? 0 : unit_size_ver_chr * unit_size_hor_chr;
  4223. }
  4224. else if (mapType == COMPRESSED_FRAME_MAP) {
  4225. switch (format) {
  4226. case FORMAT_420:
  4227. case FORMAT_YUYV: // 4:2:2 8bit packed
  4228. case FORMAT_YVYU:
  4229. case FORMAT_UYVY:
  4230. case FORMAT_VYUY:
  4231. size_dpb_chr = VPU_ALIGN16(stride/2)*height;
  4232. break;
  4233. default:
  4234. /* 10bit */
  4235. stride = VPU_ALIGN64(stride/2)+12; /* FIXME: need width information */
  4236. size_dpb_chr = VPU_ALIGN32(stride)*VPU_ALIGN4(height);
  4237. break;
  4238. }
  4239. }
  4240. else if (mapType == COMPRESSED_FRAME_MAP_V50_LOSSLESS_10BIT) {
  4241. size_dpb_chr = WAVE5_ENC_FBC50_LOSSLESS_CHROMA_10BIT_FRAME_SIZE(stride, height);
  4242. }
  4243. else if (mapType == COMPRESSED_FRAME_MAP_V50_LOSSLESS_8BIT) {
  4244. size_dpb_chr = WAVE5_ENC_FBC50_LOSSLESS_CHROMA_8BIT_FRAME_SIZE(stride, height);
  4245. }
  4246. else if (mapType == COMPRESSED_FRAME_MAP_V50_LOSSY) {
  4247. if (pDramCfg == NULL)
  4248. return 0;
  4249. size_dpb_chr = WAVE5_ENC_FBC50_LOSSY_CHROMA_FRAME_SIZE(stride, height, pDramCfg->tx16c);
  4250. }
  4251. else if (mapType == COMPRESSED_FRAME_MAP_V50_LOSSLESS_422_10BIT) {
  4252. size_dpb_chr = WAVE5_ENC_FBC50_LOSSLESS_422_CHROMA_10BIT_FRAME_SIZE(stride, height);
  4253. }
  4254. else if (mapType == COMPRESSED_FRAME_MAP_V50_LOSSLESS_422_8BIT) {
  4255. size_dpb_chr = WAVE5_ENC_FBC50_LOSSLESS_422_CHROMA_8BIT_FRAME_SIZE(stride, height);
  4256. }
  4257. else if (mapType == COMPRESSED_FRAME_MAP_V50_LOSSY_422) {
  4258. if (pDramCfg == NULL)
  4259. return 0;
  4260. size_dpb_chr = WAVE5_ENC_FBC50_LOSSY_422_CHROMA_FRAME_SIZE(stride, height, pDramCfg->tx16c);
  4261. }
  4262. else if (mapType == COMPRESSED_FRAME_MAP_DUAL_CORE_8BIT) {
  4263. Uint32 pad_y = 4;
  4264. Uint32 pad_x = 16;
  4265. Uint32 bgs_width;
  4266. Uint32 bgs_height, valid_width, comp_frm_width, valid_height, comp_frm_height, bgs_row_bytes, bgs_num_y;
  4267. Uint32 size_dpb_chr_1024 = 0;
  4268. Uint32 width = stride;;
  4269. //=====================================================================
  4270. // BGS WIDTH calc for 8bit
  4271. // if(h.264) bgs_width = 1024
  4272. // else if (hevc_encoder) bgs_width = 512.
  4273. // else if (hevc_decoder} MAX(comp_size for bgs_width=512, comp_size for bgs_width=1024)
  4274. //=====================================================================
  4275. if (inst->codecMode == W_AVC_DEC || inst->codecMode == W_AVC_ENC) {
  4276. bgs_width = 1024;
  4277. }
  4278. else if (inst->codecMode == W_HEVC_ENC || inst->codecMode == W_HEVC_DEC) {
  4279. bgs_width = 512;
  4280. }
  4281. else {
  4282. VLOG(ERR, "Not support CodecMode for COMPRESSED_FRAME_MAP_DUAL_CORE\n");
  4283. return 0;
  4284. }
  4285. if (IS_WAVE_DECODER_HANDLE(inst) == TRUE)
  4286. width = inst->CodecInfo->decInfo.initialInfo.picWidth;
  4287. else
  4288. width = inst->CodecInfo->encInfo.openParam.picWidth;
  4289. bgs_height = (1<<14) / bgs_width ;
  4290. valid_width = VPU_CEIL(width/2, 16); // 16 align = BLK_WIDTH
  4291. comp_frm_width = VPU_CEIL(valid_width+pad_x, 16); // 16 align = BLK_WIDTH
  4292. valid_height = VPU_CEIL(height, 4); // 4 = BLK_HEIGHT
  4293. comp_frm_height = VPU_CEIL(valid_height + pad_y, bgs_height);
  4294. bgs_row_bytes = VPU_CEIL(comp_frm_width*bgs_height*8/8, 512); // 512 = BURST_SIZE
  4295. bgs_num_y = comp_frm_height / bgs_height;
  4296. size_dpb_chr = bgs_row_bytes * bgs_num_y;
  4297. if (inst->codecMode == W_HEVC_DEC) {
  4298. bgs_width = 1024;
  4299. bgs_height = (1<<14) / bgs_width ;
  4300. valid_width = VPU_CEIL(width/2, 16); // 16 align = BLK_WIDTH
  4301. comp_frm_width = VPU_CEIL(valid_width+pad_x, 16); // 16 align = BLK_WIDTH
  4302. valid_height = VPU_CEIL(height, 4); // 4 = BLK_HEIGHT
  4303. comp_frm_height = VPU_CEIL(valid_height + pad_y, bgs_height);
  4304. bgs_row_bytes = VPU_CEIL(comp_frm_width*bgs_height*8/8, 512); // 512 = BURST_SIZE
  4305. bgs_num_y = comp_frm_height / bgs_height;
  4306. size_dpb_chr_1024 = bgs_row_bytes * bgs_num_y;
  4307. size_dpb_chr = MAX(size_dpb_chr, size_dpb_chr_1024);
  4308. }
  4309. }
  4310. else if (mapType == COMPRESSED_FRAME_MAP_DUAL_CORE_10BIT) {
  4311. Uint32 pad_x = 16;
  4312. Uint32 pad_y = 4;
  4313. Uint32 bgs_width;
  4314. Uint32 bgs_height, valid_width, comp_frm_width, valid_height, comp_frm_height, bgs_row_bytes, bgs_num_y;
  4315. Uint32 size_dpb_chr_512 = 0;
  4316. Uint32 width = stride;
  4317. //=====================================================================
  4318. // BGS WIDTH calc for 10bit
  4319. // if(h.264) bgs_width = 512
  4320. // else if (hevc_encoder) bgs_width = 256.
  4321. // else if (hevc_decoder} MAX(comp_size for bgs_width=256, comp_size for bgs_width=512)
  4322. //=====================================================================
  4323. if (inst->codecMode == W_AVC_DEC || inst->codecMode == W_AVC_ENC) {
  4324. bgs_width = 512;
  4325. }
  4326. else if (inst->codecMode == W_HEVC_ENC || inst->codecMode == W_HEVC_DEC) {
  4327. bgs_width = 256;
  4328. }
  4329. else {
  4330. VLOG(ERR, "Not support CodecMode for COMPRESSED_FRAME_MAP_DUAL_CORE\n");
  4331. return 0;
  4332. }
  4333. if (IS_WAVE_DECODER_HANDLE(inst) == TRUE)
  4334. width = inst->CodecInfo->decInfo.initialInfo.picWidth;
  4335. else
  4336. width = inst->CodecInfo->encInfo.openParam.picWidth;
  4337. bgs_height = (1<<14) / bgs_width / 2 ;
  4338. valid_width = VPU_CEIL(width/2, 16); // 16 align = BLK_WIDTH
  4339. comp_frm_width = VPU_CEIL(valid_width+pad_x, 16); // 16 align = BLK_WIDTH
  4340. valid_height = VPU_CEIL(height, 4); // 4 = BLK_HEIGHT
  4341. comp_frm_height = VPU_CEIL(valid_height + pad_y, bgs_height);
  4342. bgs_row_bytes = VPU_CEIL(comp_frm_width*bgs_height*10/8, 512); // 512 = BURST_SIZE
  4343. bgs_num_y = comp_frm_height / bgs_height;
  4344. size_dpb_chr = bgs_row_bytes * bgs_num_y;
  4345. if (inst->codecMode == W_HEVC_DEC) {
  4346. bgs_width = 512;
  4347. bgs_height = (1<<14) / bgs_width / 2 ;
  4348. valid_width = VPU_CEIL(width/2, 16); // 16 align = BLK_WIDTH
  4349. comp_frm_width = VPU_CEIL(valid_width+pad_x, 16); // 16 align = BLK_WIDTH
  4350. valid_height = VPU_CEIL(height, 4); // 4 = BLK_HEIGHT
  4351. comp_frm_height = VPU_CEIL(valid_height + pad_y, bgs_height);
  4352. bgs_row_bytes = VPU_CEIL(comp_frm_width*bgs_height*10/8, 512); // 512 = BURST_SIZE
  4353. bgs_num_y = comp_frm_height / bgs_height;
  4354. size_dpb_chr_512 = bgs_row_bytes * bgs_num_y;
  4355. size_dpb_chr = MAX(size_dpb_chr, size_dpb_chr_512);
  4356. }
  4357. }
  4358. else if (mapType == TILED_FRAME_NO_BANK_MAP || mapType == TILED_FIELD_NO_BANK_MAP) {
  4359. chr_size_y = (height>>field_map)/chr_hscale;
  4360. chr_size_x = stride/chr_vscale;
  4361. unit_size_hor_chr = (chr_size_x > 4096) ? 8192:
  4362. (chr_size_x > 2048) ? 4096 :
  4363. (chr_size_x > 1024) ? 2048 :
  4364. (chr_size_x > 512) ? 1024 : 512;
  4365. unit_size_ver_chr = ((chr_size_y+127)/128) * 128; // unit vertical size is 128 pixel (8MB)
  4366. size_dpb_chr = (format==FORMAT_400) ? 0 : (unit_size_hor_chr * (unit_size_ver_chr<<field_map));
  4367. }
  4368. else if (mapType == TILED_FRAME_MB_RASTER_MAP || mapType == TILED_FIELD_MB_RASTER_MAP) {
  4369. if (productId == PRODUCT_ID_960) {
  4370. chr_size_x = stride/chr_hscale;
  4371. chr_size_y = height/chr_hscale;
  4372. size_dpb_chr = chr_size_y * chr_size_x;
  4373. // aligned to 8192*2 (0x4000) for top/bot field
  4374. // use upper 20bit address only
  4375. size_dpb_chr_4k = ((size_dpb_chr + 16383)/16384)*16384;
  4376. if (mapType == TILED_FIELD_MB_RASTER_MAP) {
  4377. size_dpb_chr_4k = ((size_dpb_chr_4k+(0x8000-1))&~(0x8000-1));
  4378. }
  4379. size_dpb_chr = size_dpb_chr_4k;
  4380. }
  4381. else {
  4382. size_dpb_chr = (format==FORMAT_400) ? 0 : ((stride * (height>>field_map))/(chr_hscale*chr_vscale));
  4383. size_dpb_chr_4k = ((size_dpb_chr+(16384-1))/16384)*16384;
  4384. size_dpb_chr = size_dpb_chr_4k<<field_map;
  4385. }
  4386. }
  4387. else {
  4388. if (productId == PRODUCT_ID_960) {
  4389. int VerSizePerRas,Ras1DBit;
  4390. int ChrSizeYField;
  4391. int divY;
  4392. int ChrFieldRasSize,ChrFrameRasSize;
  4393. divY = format == FORMAT_420 || format == FORMAT_224 ? 2 : 1;
  4394. ChrSizeYField = ((height/divY)+1)>>1;
  4395. if (pDramCfg == NULL)
  4396. return 0;
  4397. if (mapType == TILED_FRAME_V_MAP) {
  4398. if (pDramCfg->casBit == 9 && pDramCfg->bankBit == 2 && pDramCfg->rasBit == 13) { // CNN setting
  4399. VerSizePerRas = 64;
  4400. Ras1DBit = 3;
  4401. }
  4402. else if(pDramCfg->casBit == 10 && pDramCfg->bankBit == 3 && pDramCfg->rasBit == 13) {
  4403. VerSizePerRas = 64;
  4404. Ras1DBit = 2;
  4405. }
  4406. else if (pDramCfg->casBit == 10 && pDramCfg->bankBit == 3 && pDramCfg->rasBit == 16) { // BITMAIN setting
  4407. VerSizePerRas = 64; // Tile (16x2)*(4*2)
  4408. Ras1DBit = 1;
  4409. }
  4410. else if (pDramCfg->casBit == 10 && pDramCfg->bankBit == 4 && pDramCfg->rasBit == 15) { // BITMAIN setting
  4411. VerSizePerRas = 128; // Tile (8x4)*(8x2)
  4412. Ras1DBit = 1;
  4413. }
  4414. else
  4415. return 0;
  4416. }
  4417. else if (mapType == TILED_FRAME_H_MAP) {
  4418. if (pDramCfg->casBit == 9 && pDramCfg->bankBit == 2 && pDramCfg->rasBit == 13) { // CNN setting
  4419. VerSizePerRas = 64;
  4420. Ras1DBit = 3;
  4421. }
  4422. else if(pDramCfg->casBit == 10 && pDramCfg->bankBit == 3 && pDramCfg->rasBit == 13) {
  4423. VerSizePerRas = 64;
  4424. Ras1DBit = 2;
  4425. }
  4426. else
  4427. return 0;
  4428. }
  4429. else if (mapType == TILED_FIELD_V_MAP) {
  4430. if (pDramCfg->casBit == 9 && pDramCfg->bankBit == 2 && pDramCfg->rasBit == 13) { // CNN setting
  4431. VerSizePerRas = 64;
  4432. Ras1DBit = 3;
  4433. }
  4434. else if(pDramCfg->casBit == 10 && pDramCfg->bankBit == 3 && pDramCfg->rasBit == 13) {
  4435. VerSizePerRas = 64;
  4436. Ras1DBit = 2;
  4437. }
  4438. else if (pDramCfg->casBit == 10 && pDramCfg->bankBit == 3 && pDramCfg->rasBit == 16) { // BITMAIN setting
  4439. VerSizePerRas = 64; // Tile (16x2)*(4*2)
  4440. Ras1DBit = 1;
  4441. }
  4442. else if (pDramCfg->casBit == 10 && pDramCfg->bankBit == 4 && pDramCfg->rasBit == 15) { // BITMAIN setting
  4443. VerSizePerRas = 128; // Tile (8x4)*(8x2)
  4444. Ras1DBit = 1;
  4445. }
  4446. else
  4447. return 0;
  4448. } else { // TILED_FIELD_H_MAP
  4449. if (pDramCfg->casBit == 9 && pDramCfg->bankBit == 2 && pDramCfg->rasBit == 13) { // CNN setting
  4450. VerSizePerRas = 64;
  4451. Ras1DBit = 3;
  4452. }
  4453. else if(pDramCfg->casBit == 10 && pDramCfg->bankBit == 3 && pDramCfg->rasBit == 13) {
  4454. VerSizePerRas = 64;
  4455. Ras1DBit = 2;
  4456. }
  4457. else
  4458. return 0;
  4459. }
  4460. ChrFieldRasSize = ((ChrSizeYField + (VerSizePerRas-1))/VerSizePerRas) << Ras1DBit;
  4461. ChrFrameRasSize = ChrFieldRasSize *2;
  4462. size_dpb_chr = (ChrFrameRasSize << (pDramCfg->bankBit+pDramCfg->casBit+pDramCfg->busBit)) / 2; // divide 2 = to calucate one Cb(or Cr) size;
  4463. }
  4464. else { // productId != 960
  4465. chr_size_y = (height>>field_map)/chr_hscale;
  4466. chr_size_x = cbcrIntl == TRUE ? stride : stride/chr_vscale;
  4467. unit_size_hor_chr = (chr_size_x> 4096) ? 8192:
  4468. (chr_size_x> 2048) ? 4096 :
  4469. (chr_size_x > 1024) ? 2048 :
  4470. (chr_size_x > 512) ? 1024 : 512;
  4471. unit_size_ver_chr = ((chr_size_y+63)/64) * 64; // unit vertical size is 64 pixel (4MB)
  4472. size_dpb_chr = (format==FORMAT_400) ? 0 : unit_size_hor_chr * (unit_size_ver_chr<<field_map);
  4473. size_dpb_chr /= (cbcrIntl == TRUE ? 2 : 1);
  4474. }
  4475. }
  4476. return size_dpb_chr;
  4477. }
  4478. #if defined(SUPPORT_SW_UART) || defined(SUPPORT_SW_UART_V2)
  4479. #include <string.h>
  4480. #include <pthread.h>
  4481. typedef struct {
  4482. int core_idx;
  4483. pthread_t thread_id;
  4484. int sw_uart_thread_run;
  4485. } SwUartContext;
  4486. static SwUartContext s_SwUartContext;
  4487. void SwUartHandler(void *context)
  4488. {
  4489. unsigned int regSwUartStatus;
  4490. unsigned int regSwUartTxData;
  4491. unsigned char *strRegSwUartTxData;
  4492. int i = 0;
  4493. char uartTx[1024];
  4494. osal_memset(uartTx, 0, sizeof(char)*1024);
  4495. while(s_SwUartContext.sw_uart_thread_run == 1)
  4496. {
  4497. regSwUartStatus = vdi_read_register(s_SwUartContext.core_idx, W5_SW_UART_STATUS);
  4498. if (regSwUartStatus == (unsigned int)-1)
  4499. {
  4500. continue;
  4501. }
  4502. if ((regSwUartStatus & (1<<1)))
  4503. {
  4504. regSwUartTxData = vdi_read_register(s_SwUartContext.core_idx, W5_SW_UART_TX_DATA);
  4505. if (regSwUartTxData == (unsigned int)-1)
  4506. {
  4507. continue;
  4508. }
  4509. regSwUartStatus &= ~(1<<1);
  4510. vdi_write_register(s_SwUartContext.core_idx, W5_SW_UART_STATUS, regSwUartStatus);
  4511. strRegSwUartTxData = (unsigned char *)&regSwUartTxData;
  4512. for (i=0; i < 4; i++)
  4513. {
  4514. if (strRegSwUartTxData[i] == '\n')
  4515. {
  4516. VLOG(TRACE, "%s \n", uartTx);
  4517. osal_memset(uartTx, 0, sizeof(unsigned char)*1024);
  4518. }
  4519. else
  4520. {
  4521. strncat((char *)uartTx, (const char *)(strRegSwUartTxData + i), 1);
  4522. }
  4523. }
  4524. }
  4525. }
  4526. VLOG(1, "exit SwUartHandler\n");
  4527. }
  4528. int create_sw_uart_thread(unsigned long coreIdx)
  4529. {
  4530. int ret;
  4531. if (s_SwUartContext.sw_uart_thread_run == 1)
  4532. return 1;
  4533. vdi_write_register(coreIdx, W5_SW_UART_STATUS, (1<<0)); // enable SW UART. this will be checked by firmware to know SW UART enabled
  4534. s_SwUartContext.core_idx = coreIdx;
  4535. s_SwUartContext.sw_uart_thread_run = 1;
  4536. ret = pthread_create(&s_SwUartContext.thread_id, NULL, (void*)SwUartHandler, &s_SwUartContext);
  4537. if (ret != 0)
  4538. {
  4539. destory_sw_uart_thread();
  4540. return 0;
  4541. }
  4542. return 1;
  4543. }
  4544. void destory_sw_uart_thread(unsigned long coreIdx)
  4545. {
  4546. int inst_num;
  4547. int task_num;
  4548. int i;
  4549. inst_num = 0;
  4550. for (i=0; i < MAX_NUM_VPU_CORE; i++)
  4551. {
  4552. inst_num = inst_num + vdi_get_instance_num(i);
  4553. }
  4554. if (inst_num > 0)
  4555. return;
  4556. task_num = 0;
  4557. for (i=0; i < MAX_NUM_VPU_CORE; i++)
  4558. {
  4559. task_num = task_num + vdi_get_task_num(i);
  4560. }
  4561. if (task_num > 1)
  4562. return;
  4563. if (s_SwUartContext.sw_uart_thread_run == 1)
  4564. {
  4565. s_SwUartContext.sw_uart_thread_run = 0;
  4566. vdi_write_register(coreIdx, W5_SW_UART_STATUS, 0); // disable SW UART. this will be checked by firmware to know SW UART enabled
  4567. if (s_SwUartContext.thread_id)
  4568. {
  4569. pthread_join(s_SwUartContext.thread_id, NULL);
  4570. s_SwUartContext.thread_id = 0;
  4571. }
  4572. }
  4573. return ;
  4574. }
  4575. #endif