encasiccontroller.c 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799
  1. /*------------------------------------------------------------------------------
  2. -- --
  3. -- This software is confidential and proprietary and may be used --
  4. -- only as expressly authorized by a licensing agreement from --
  5. -- --
  6. -- Hantro Products Oy. --
  7. -- --
  8. -- (C) COPYRIGHT 2006 HANTRO PRODUCTS OY --
  9. -- ALL RIGHTS RESERVED --
  10. -- --
  11. -- The entire notice above must be reproduced --
  12. -- on all copies and should not be removed. --
  13. -- --
  14. --------------------------------------------------------------------------------
  15. --
  16. -- Description : ASIC low level controller
  17. --
  18. ------------------------------------------------------------------------------*/
  19. /*------------------------------------------------------------------------------
  20. Include headers
  21. ------------------------------------------------------------------------------*/
  22. #include "enccommon.h"
  23. #include "encasiccontroller.h"
  24. #include "encpreprocess.h"
  25. #include "ewl.h"
  26. #include "encswhwregisters.h"
  27. /*------------------------------------------------------------------------------
  28. External compiler flags
  29. ------------------------------------------------------------------------------*/
  30. /*------------------------------------------------------------------------------
  31. Module defines
  32. ------------------------------------------------------------------------------*/
  33. #ifdef ASIC_WAVE_TRACE_TRIGGER
  34. extern i32 trigger_point; /* picture which will be traced */
  35. #endif
  36. /* Mask fields */
  37. #define mask_2b (u32)0x00000003
  38. #define mask_3b (u32)0x00000007
  39. #define mask_4b (u32)0x0000000F
  40. #define mask_5b (u32)0x0000001F
  41. #define mask_6b (u32)0x0000003F
  42. #define mask_11b (u32)0x000007FF
  43. #define mask_14b (u32)0x00003FFF
  44. #define mask_16b (u32)0x0000FFFF
  45. #define HSWREG(n) ((n)*4)
  46. /* MPEG-4 motion estimation parameters */
  47. static const i32 mpeg4InterFavor[32] = { 0,
  48. 0, 120, 140, 160, 200, 240, 280, 340, 400, 460, 520, 600, 680,
  49. 760, 840, 920, 1000, 1080, 1160, 1240, 1320, 1400, 1480, 1560,
  50. 1640, 1720, 1800, 1880, 1960, 2040, 2120
  51. };
  52. static const u32 mpeg4DiffMvPenalty[32] = { 0,
  53. 4, 5, 6, 7, 8, 9, 10, 11, 14, 17, 20, 23, 27, 31, 35, 38, 41,
  54. 44, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59
  55. };
  56. static const u32 h264PrevModeFavor[52] = {
  57. 7, 7, 8, 8, 9, 9, 10, 10, 11, 12, 12, 13, 14, 15, 16, 17, 18,
  58. 19, 20, 21, 22, 24, 25, 27, 29, 30, 32, 34, 36, 38, 41, 43, 46,
  59. 49, 51, 55, 58, 61, 65, 69, 73, 78, 82, 87, 93, 98, 104, 110,
  60. 117, 124, 132, 140
  61. };
  62. /* JPEG QUANT table order */
  63. static const u32 qpReorderTable[64] =
  64. { 0, 8, 16, 24, 1, 9, 17, 25, 32, 40, 48, 56, 33, 41, 49, 57,
  65. 2, 10, 18, 26, 3, 11, 19, 27, 34, 42, 50, 58, 35, 43, 51, 59,
  66. 4, 12, 20, 28, 5, 13, 21, 29, 36, 44, 52, 60, 37, 45, 53, 61,
  67. 6, 14, 22, 30, 7, 15, 23, 31, 38, 46, 54, 62, 39, 47, 55, 63
  68. };
  69. /*------------------------------------------------------------------------------
  70. Local function prototypes
  71. ------------------------------------------------------------------------------*/
  72. /*------------------------------------------------------------------------------
  73. Initialize empty structure with default values.
  74. ------------------------------------------------------------------------------*/
  75. i32 EncAsicControllerInit(asicData_s * asic)
  76. {
  77. ASSERT(asic != NULL);
  78. /* Initialize default values from defined configuration */
  79. asic->regs.irqDisable = ENC8290_IRQ_DISABLE;
  80. asic->regs.asicCfgReg =
  81. ((ENC8290_AXI_WRITE_ID & (255)) << 24) |
  82. ((ENC8290_AXI_READ_ID & (255)) << 16) |
  83. ((ENC8290_OUTPUT_SWAP_16 & (1)) << 15) |
  84. ((ENC8290_BURST_LENGTH & (63)) << 8) |
  85. ((ENC8290_BURST_SCMD_DISABLE & (1)) << 7) |
  86. ((ENC8290_BURST_INCR_TYPE_ENABLED & (1)) << 6) |
  87. ((ENC8290_BURST_DATA_DISCARD_ENABLED & (1)) << 5) |
  88. ((ENC8290_ASIC_CLOCK_GATING_ENABLED & (1)) << 4) |
  89. ((ENC8290_OUTPUT_SWAP_32 & (1)) << 3) |
  90. ((ENC8290_OUTPUT_SWAP_8 & (1)) << 1);
  91. #ifdef INTERNAL_TEST
  92. /* With internal testing use random values for burst mode. */
  93. asic->regs.asicCfgReg |= (EWLReadReg(asic->ewl, 0x60) & 0xE0);
  94. #endif
  95. /* Initialize default values */
  96. asic->regs.roundingCtrl = 0;
  97. asic->regs.cpDistanceMbs = 0;
  98. asic->regs.reconImageId = 0;
  99. /* User must set these */
  100. asic->regs.inputLumBase = 0;
  101. asic->regs.inputCbBase = 0;
  102. asic->regs.inputCrBase = 0;
  103. asic->internalImageLuma[0].virtualAddress = NULL;
  104. asic->internalImageChroma[0].virtualAddress = NULL;
  105. asic->internalImageLuma[1].virtualAddress = NULL;
  106. asic->internalImageChroma[1].virtualAddress = NULL;
  107. asic->internalImageLuma[2].virtualAddress = NULL;
  108. asic->internalImageChroma[2].virtualAddress = NULL;
  109. asic->cabacCtx.virtualAddress = NULL;
  110. asic->mvOutput.virtualAddress = NULL;
  111. #ifdef ASIC_WAVE_TRACE_TRIGGER
  112. asic->regs.vop_count = 0;
  113. #endif
  114. /* get ASIC ID value */
  115. asic->regs.asicHwId = EncAsicGetId(asic->ewl);
  116. /* we do NOT reset hardware at this point because */
  117. /* of the multi-instance support */
  118. return ENCHW_OK;
  119. }
  120. /*------------------------------------------------------------------------------
  121. EncAsicSetQuantTable
  122. Set new jpeg quantization table to be used by ASIC
  123. ------------------------------------------------------------------------------*/
  124. void EncAsicSetQuantTable(asicData_s * asic,
  125. const u8 * lumTable, const u8 * chTable)
  126. {
  127. i32 i;
  128. ASSERT(lumTable);
  129. ASSERT(chTable);
  130. for(i = 0; i < 64; i++)
  131. {
  132. asic->regs.quantTable[i] = lumTable[qpReorderTable[i]];
  133. }
  134. for(i = 0; i < 64; i++)
  135. {
  136. asic->regs.quantTable[64 + i] = chTable[qpReorderTable[i]];
  137. }
  138. }
  139. /*------------------------------------------------------------------------------
  140. EncAsicSetRegisterValue
  141. Set a value into a defined register field
  142. ------------------------------------------------------------------------------*/
  143. void EncAsicSetRegisterValue(u32 *regMirror, regName name, u32 value)
  144. {
  145. const regField_s *field;
  146. u32 regVal;
  147. field = &asicRegisterDesc[name];
  148. /* Check that value fits in field */
  149. ASSERT(field->name == name);
  150. ASSERT((field->mask >> field->lsb) >= value);
  151. ASSERT(field->base < ASIC_SWREG_AMOUNT*4);
  152. /* Clear previous value of field in register */
  153. regVal = regMirror[field->base/4] & ~(field->mask);
  154. /* Put new value of field in register */
  155. regMirror[field->base/4] = regVal | ((value << field->lsb) & field->mask);
  156. }
  157. /*------------------------------------------------------------------------------
  158. EncAsicGetRegisterValue
  159. Get an unsigned value from the ASIC registers
  160. ------------------------------------------------------------------------------*/
  161. u32 EncAsicGetRegisterValue(const void *ewl, u32 *regMirror, regName name)
  162. {
  163. const regField_s *field;
  164. u32 value;
  165. field = &asicRegisterDesc[name];
  166. ASSERT(field->base < ASIC_SWREG_AMOUNT*4);
  167. value = regMirror[field->base/4] = EWLReadReg(ewl, field->base);
  168. value = (value & field->mask) >> field->lsb;
  169. return value;
  170. }
  171. /*------------------------------------------------------------------------------
  172. ------------------------------------------------------------------------------*/
  173. u32 EncAsicGetId(const void *ewl)
  174. {
  175. return EWLReadReg(ewl, 0x0);
  176. }
  177. /*------------------------------------------------------------------------------
  178. When the frame is successfully encoded the internal image is recycled
  179. so that during the next frame the current internal image is read and
  180. the new reconstructed image is written. Note that this is done for
  181. the NEXT frame.
  182. ------------------------------------------------------------------------------*/
  183. #define NEXTID(currentId, maxId) ((currentId == maxId) ? 0 : currentId+1)
  184. #define PREVID(currentId, maxId) ((currentId == 0) ? maxId : currentId-1)
  185. void EncAsicRecycleInternalImage(asicData_s *asic, u32 numViews, u32 viewId,
  186. u32 anchor, u32 numRefBuffsLum, u32 numRefBuffsChr)
  187. {
  188. u32 tmp, id;
  189. if (numViews == 1)
  190. {
  191. /* H.264 base view stream, just swap buffers */
  192. tmp = asic->regs.internalImageLumBaseW;
  193. asic->regs.internalImageLumBaseW = asic->regs.internalImageLumBaseR;
  194. asic->regs.internalImageLumBaseR = tmp;
  195. tmp = asic->regs.internalImageChrBaseW;
  196. asic->regs.internalImageChrBaseW = asic->regs.internalImageChrBaseR;
  197. asic->regs.internalImageChrBaseR = tmp;
  198. }
  199. else
  200. {
  201. /* MVC stereo stream, the buffer amount tells if the second view
  202. * is inter-view or inter coded. This affects how the buffers
  203. * should be swapped. */
  204. if ((viewId == 0) && (anchor || (numRefBuffsLum == 1)))
  205. {
  206. /* Next frame is viewId=1 with inter-view prediction */
  207. asic->regs.internalImageLumBaseR = asic->internalImageLuma[0].busAddress;
  208. asic->regs.internalImageLumBaseW = asic->internalImageLuma[1].busAddress;
  209. }
  210. else if (viewId == 0)
  211. {
  212. /* Next frame is viewId=1 with inter prediction */
  213. asic->regs.internalImageLumBaseR = asic->internalImageLuma[1].busAddress;
  214. asic->regs.internalImageLumBaseW = asic->internalImageLuma[1].busAddress;
  215. }
  216. else
  217. {
  218. /* Next frame is viewId=0 with inter prediction */
  219. asic->regs.internalImageLumBaseR = asic->internalImageLuma[0].busAddress;
  220. asic->regs.internalImageLumBaseW = asic->internalImageLuma[0].busAddress;
  221. }
  222. if (numRefBuffsChr == 2)
  223. {
  224. if (viewId == 0)
  225. {
  226. /* For inter-view prediction chroma is swapped after base view only */
  227. tmp = asic->regs.internalImageChrBaseW;
  228. asic->regs.internalImageChrBaseW = asic->regs.internalImageChrBaseR;
  229. asic->regs.internalImageChrBaseR = tmp;
  230. }
  231. }
  232. else
  233. {
  234. /* For viewId==1 the anchor frame uses inter-view prediction,
  235. * all other frames use inter-prediction. */
  236. if ((viewId == 0) && anchor)
  237. id = asic->regs.reconImageId;
  238. else
  239. id = PREVID(asic->regs.reconImageId, 2);
  240. asic->regs.internalImageChrBaseR = asic->internalImageChroma[id].busAddress;
  241. asic->regs.reconImageId = id = NEXTID(asic->regs.reconImageId, 2);
  242. asic->regs.internalImageChrBaseW = asic->internalImageChroma[id].busAddress;
  243. }
  244. }
  245. }
  246. /*------------------------------------------------------------------------------
  247. ------------------------------------------------------------------------------*/
  248. void CheckRegisterValues(regValues_s * val)
  249. {
  250. u32 i;
  251. ASSERT(val->irqDisable <= 1);
  252. ASSERT(val->rlcLimitSpace / 2 < (1 << 20));
  253. ASSERT(val->mbsInCol <= 511);
  254. ASSERT(val->mbsInRow <= 511);
  255. ASSERT(val->filterDisable <= 2);
  256. ASSERT(val->recWriteDisable <= 1);
  257. ASSERT(val->madThreshold <= 63);
  258. ASSERT(val->madQpDelta >= -8 && val->madQpDelta <= 7);
  259. ASSERT(val->qp <= 51);
  260. ASSERT(val->constrainedIntraPrediction <= 1);
  261. ASSERT(val->roundingCtrl <= 1);
  262. ASSERT(val->frameCodingType <= 3);
  263. ASSERT(val->codingType <= 3);
  264. ASSERT(val->outputStrmSize <= 0x1FFFFFF);
  265. ASSERT(val->pixelsOnRow >= 16 && val->pixelsOnRow <= 8192); /* max input for cropping */
  266. ASSERT(val->xFill <= 3);
  267. ASSERT(val->yFill <= 14 && ((val->yFill & 0x01) == 0));
  268. ASSERT(val->inputLumaBaseOffset <= 7);
  269. ASSERT(val->inputChromaBaseOffset <= 7);
  270. ASSERT(val->sliceAlphaOffset >= -6 && val->sliceAlphaOffset <= 6);
  271. ASSERT(val->sliceBetaOffset >= -6 && val->sliceBetaOffset <= 6);
  272. ASSERT(val->chromaQpIndexOffset >= -12 && val->chromaQpIndexOffset <= 12);
  273. ASSERT(val->sliceSizeMbRows <= 127);
  274. ASSERT(val->inputImageFormat <= ASIC_INPUT_YUYV422TILED);
  275. ASSERT(val->inputImageRotation <= 2);
  276. ASSERT(val->cpDistanceMbs <= 8191);
  277. ASSERT(val->roi1DeltaQp >= 0 && val->roi1DeltaQp <= 15);
  278. ASSERT(val->roi2DeltaQp >= 0 && val->roi2DeltaQp <= 15);
  279. ASSERT(val->cirStart <= 65535);
  280. ASSERT(val->cirInterval <= 65535);
  281. ASSERT(val->intraAreaTop <= 255);
  282. ASSERT(val->intraAreaLeft <= 255);
  283. ASSERT(val->intraAreaBottom <= 255);
  284. ASSERT(val->intraAreaRight <= 255);
  285. ASSERT(val->roi1Top <= 255);
  286. ASSERT(val->roi1Left <= 255);
  287. ASSERT(val->roi1Bottom <= 255);
  288. ASSERT(val->roi1Right <= 255);
  289. ASSERT(val->roi2Top <= 255);
  290. ASSERT(val->roi2Left <= 255);
  291. ASSERT(val->roi2Bottom <= 255);
  292. ASSERT(val->roi2Right <= 255);
  293. if(val->codingType != ASIC_JPEG && val->cpTarget != NULL)
  294. {
  295. ASSERT(val->cpTargetResults != NULL);
  296. for(i = 0; i < 10; i++)
  297. {
  298. ASSERT(*val->cpTarget < (1 << 16));
  299. }
  300. ASSERT(val->targetError != NULL);
  301. for(i = 0; i < 7; i++)
  302. {
  303. ASSERT((*val->targetError) >= -32768 &&
  304. (*val->targetError) < 32768);
  305. }
  306. ASSERT(val->deltaQp != NULL);
  307. for(i = 0; i < 7; i++)
  308. {
  309. ASSERT((*val->deltaQp) >= -8 && (*val->deltaQp) < 8);
  310. }
  311. }
  312. (void) val;
  313. }
  314. /*------------------------------------------------------------------------------
  315. Function name : EncAsicFrameStart
  316. Description :
  317. Return type : void
  318. Argument : const void *ewl
  319. Argument : regValues_s * val
  320. ------------------------------------------------------------------------------*/
  321. void EncAsicFrameStart(const void *ewl, regValues_s * val)
  322. {
  323. u32 interFavor = 0, diffMvPenalty = 0, prevModeFavor = 0;
  324. /* Set the interrupt interval in macroblock rows (JPEG) or
  325. * in macroblocks (video) */
  326. if(val->codingType != ASIC_JPEG)
  327. {
  328. switch (val->codingType)
  329. {
  330. case ASIC_MPEG4:
  331. case ASIC_H263:
  332. interFavor = mpeg4InterFavor[val->qp];
  333. diffMvPenalty = mpeg4DiffMvPenalty[val->qp];
  334. break;
  335. case ASIC_H264:
  336. prevModeFavor = h264PrevModeFavor[val->qp];
  337. diffMvPenalty = val->diffMvPenalty;
  338. break;
  339. default:
  340. break;
  341. }
  342. }
  343. /*{
  344. const regField_s *field;
  345. u32 mask;
  346. i32 e, i, j;
  347. for (e = 0; e <= (i32)HEncJpegQuantChroma16; e++)
  348. {
  349. for (i = 0; i < (i32)(sizeof(asicRegisterDesc)/sizeof(regField_s)); i++)
  350. {
  351. if (asicRegisterDesc[i].name == e)
  352. {
  353. field = &asicRegisterDesc[i];
  354. mask = 1;
  355. for (j = 0; j < field->msb-field->lsb; j++)
  356. mask = (mask << 1) + 1;
  357. mask <<= field->lsb;
  358. printf("[] = {0x%03x, 0x%08x, %2d, %d, \"%s\"},\n",
  359. field->base, mask, field->lsb, field->trace, field->description);
  360. }
  361. }
  362. }
  363. }*/
  364. CheckRegisterValues(val);
  365. EWLmemset(val->regMirror, 0, sizeof(val->regMirror));
  366. /* encoder interrupt */
  367. EncAsicSetRegisterValue(val->regMirror, HEncIRQDisable, val->irqDisable);
  368. /* system configuration */
  369. if (val->inputImageFormat < ASIC_INPUT_RGB565) /* YUV input */
  370. val->regMirror[2] = val->asicCfgReg |
  371. ((ENC8290_INPUT_SWAP_16_YUV & (1)) << 14) |
  372. ((ENC8290_INPUT_SWAP_32_YUV & (1)) << 2) |
  373. (ENC8290_INPUT_SWAP_8_YUV & (1));
  374. else if (val->inputImageFormat < ASIC_INPUT_RGB888) /* 16-bit RGB input */
  375. val->regMirror[2] = val->asicCfgReg |
  376. ((ENC8290_INPUT_SWAP_16_RGB16 & (1)) << 14) |
  377. ((ENC8290_INPUT_SWAP_32_RGB16 & (1)) << 2) |
  378. (ENC8290_INPUT_SWAP_8_RGB16 & (1));
  379. else /* 32-bit RGB input */
  380. val->regMirror[2] = val->asicCfgReg |
  381. ((ENC8290_INPUT_SWAP_16_RGB32 & (1)) << 14) |
  382. ((ENC8290_INPUT_SWAP_32_RGB32 & (1)) << 2) |
  383. (ENC8290_INPUT_SWAP_8_RGB32 & (1));
  384. /* output stream buffer */
  385. EncAsicSetRegisterValue(val->regMirror, HEncBaseStream, val->outputStrmBase);
  386. if(val->codingType == ASIC_H264)
  387. {
  388. if(val->sizeTblBase.nal)
  389. val->sizeTblPresent = 1;
  390. EncAsicSetRegisterValue(val->regMirror, HEncBaseControl, val->sizeTblBase.nal);
  391. EncAsicSetRegisterValue(val->regMirror, HEncNalMode, val->sizeTblPresent);
  392. EncAsicSetRegisterValue(val->regMirror, HEncMvWrite, val->mvOutputBase != 0);
  393. }
  394. /* Video encoding reference picture buffers */
  395. if(val->codingType != ASIC_JPEG)
  396. {
  397. EncAsicSetRegisterValue(val->regMirror, HEncBaseRefLum, val->internalImageLumBaseR);
  398. EncAsicSetRegisterValue(val->regMirror, HEncBaseRefChr, val->internalImageChrBaseR);
  399. EncAsicSetRegisterValue(val->regMirror, HEncBaseRecLum, val->internalImageLumBaseW);
  400. EncAsicSetRegisterValue(val->regMirror, HEncBaseRecChr, val->internalImageChrBaseW);
  401. }
  402. /* Input picture buffers */
  403. EncAsicSetRegisterValue(val->regMirror, HEncBaseInLum, val->inputLumBase);
  404. EncAsicSetRegisterValue(val->regMirror, HEncBaseInCb, val->inputCbBase);
  405. EncAsicSetRegisterValue(val->regMirror, HEncBaseInCr, val->inputCrBase);
  406. /* Common control register */
  407. EncAsicSetRegisterValue(val->regMirror, HEncIntTimeout, ENC8290_TIMEOUT_INTERRUPT&1);
  408. EncAsicSetRegisterValue(val->regMirror, HEncIntSliceReady, val->sliceReadyInterrupt);
  409. EncAsicSetRegisterValue(val->regMirror, HEncRecWriteDisable, val->recWriteDisable);
  410. EncAsicSetRegisterValue(val->regMirror, HEncWidth, val->mbsInRow);
  411. EncAsicSetRegisterValue(val->regMirror, HEncHeight, val->mbsInCol);
  412. EncAsicSetRegisterValue(val->regMirror, HEncPictureType, val->frameCodingType);
  413. EncAsicSetRegisterValue(val->regMirror, HEncEncodingMode, val->codingType);
  414. /* PreP control */
  415. EncAsicSetRegisterValue(val->regMirror, HEncChrOffset, val->inputChromaBaseOffset);
  416. EncAsicSetRegisterValue(val->regMirror, HEncLumOffset, val->inputLumaBaseOffset);
  417. EncAsicSetRegisterValue(val->regMirror, HEncRowLength, val->pixelsOnRow);
  418. EncAsicSetRegisterValue(val->regMirror, HEncXFill, val->xFill);
  419. EncAsicSetRegisterValue(val->regMirror, HEncYFill, val->yFill);
  420. EncAsicSetRegisterValue(val->regMirror, HEncInputFormat, val->inputImageFormat);
  421. EncAsicSetRegisterValue(val->regMirror, HEncInputRot, val->inputImageRotation);
  422. /* H.264 control */
  423. EncAsicSetRegisterValue(val->regMirror, HEncPicInitQp, val->picInitQp);
  424. EncAsicSetRegisterValue(val->regMirror, HEncSliceAlpha, val->sliceAlphaOffset & mask_4b);
  425. EncAsicSetRegisterValue(val->regMirror, HEncSliceBeta, val->sliceBetaOffset & mask_4b);
  426. EncAsicSetRegisterValue(val->regMirror, HEncChromaQp, val->chromaQpIndexOffset & mask_5b);
  427. EncAsicSetRegisterValue(val->regMirror, HEncDeblocking, val->filterDisable);
  428. EncAsicSetRegisterValue(val->regMirror, HEncIdrPicId, val->idrPicId);
  429. EncAsicSetRegisterValue(val->regMirror, HEncConstrIP, val->constrainedIntraPrediction);
  430. EncAsicSetRegisterValue(val->regMirror, HEncPPSID, val->ppsId);
  431. EncAsicSetRegisterValue(val->regMirror, HEncIPPrevModeFavor, prevModeFavor);
  432. EncAsicSetRegisterValue(val->regMirror, HEncIPIntra16Favor, val->intra16Favor);
  433. EncAsicSetRegisterValue(val->regMirror, HEncSliceSize, val->sliceSizeMbRows);
  434. EncAsicSetRegisterValue(val->regMirror, HEncDisableQPMV, val->disableQuarterPixelMv);
  435. EncAsicSetRegisterValue(val->regMirror, HEncTransform8x8, val->transform8x8Mode);
  436. EncAsicSetRegisterValue(val->regMirror, HEncCabacInitIdc, val->cabacInitIdc);
  437. EncAsicSetRegisterValue(val->regMirror, HEncCabacEnable, val->enableCabac);
  438. EncAsicSetRegisterValue(val->regMirror, HEncInter4Restrict, val->h264Inter4x4Disabled);
  439. EncAsicSetRegisterValue(val->regMirror, HEncStreamMode, val->h264StrmMode);
  440. EncAsicSetRegisterValue(val->regMirror, HEncFrameNum, val->frameNum);
  441. /* JPEG control */
  442. EncAsicSetRegisterValue(val->regMirror, HEncJpegMode, val->jpegMode);
  443. EncAsicSetRegisterValue(val->regMirror, HEncJpegSlice, val->jpegSliceEnable);
  444. EncAsicSetRegisterValue(val->regMirror, HEncJpegRSTInt, val->jpegRestartInterval);
  445. EncAsicSetRegisterValue(val->regMirror, HEncJpegRST, val->jpegRestartMarker);
  446. /* Motion Estimation control */
  447. EncAsicSetRegisterValue(val->regMirror, HEncSkipPenalty, val->skipPenalty);
  448. EncAsicSetRegisterValue(val->regMirror, HEncInterFavor, val->interFavor);
  449. /* stream buffer limits */
  450. EncAsicSetRegisterValue(val->regMirror, HEncStrmHdrRem1, val->strmStartMSB);
  451. EncAsicSetRegisterValue(val->regMirror, HEncStrmHdrRem2, val->strmStartLSB);
  452. EncAsicSetRegisterValue(val->regMirror, HEncStrmBufLimit, val->outputStrmSize);
  453. EncAsicSetRegisterValue(val->regMirror, HEncMadQpDelta, val->madQpDelta & mask_4b);
  454. EncAsicSetRegisterValue(val->regMirror, HEncMadThreshold, val->madThreshold);
  455. /* video encoding rate control */
  456. if(val->codingType != ASIC_JPEG)
  457. {
  458. EncAsicSetRegisterValue(val->regMirror, HEncQp, val->qp);
  459. EncAsicSetRegisterValue(val->regMirror, HEncMaxQp, val->qpMax);
  460. EncAsicSetRegisterValue(val->regMirror, HEncMinQp, val->qpMin);
  461. EncAsicSetRegisterValue(val->regMirror, HEncCPDist, val->cpDistanceMbs);
  462. if(val->cpTarget != NULL)
  463. {
  464. EncAsicSetRegisterValue(val->regMirror, HEncCP1WordTarget, val->cpTarget[0]);
  465. EncAsicSetRegisterValue(val->regMirror, HEncCP2WordTarget, val->cpTarget[1]);
  466. EncAsicSetRegisterValue(val->regMirror, HEncCP3WordTarget, val->cpTarget[2]);
  467. EncAsicSetRegisterValue(val->regMirror, HEncCP4WordTarget, val->cpTarget[3]);
  468. EncAsicSetRegisterValue(val->regMirror, HEncCP5WordTarget, val->cpTarget[4]);
  469. EncAsicSetRegisterValue(val->regMirror, HEncCP6WordTarget, val->cpTarget[5]);
  470. EncAsicSetRegisterValue(val->regMirror, HEncCP7WordTarget, val->cpTarget[6]);
  471. EncAsicSetRegisterValue(val->regMirror, HEncCP8WordTarget, val->cpTarget[7]);
  472. EncAsicSetRegisterValue(val->regMirror, HEncCP9WordTarget, val->cpTarget[8]);
  473. EncAsicSetRegisterValue(val->regMirror, HEncCP10WordTarget, val->cpTarget[9]);
  474. EncAsicSetRegisterValue(val->regMirror, HEncCPWordError1,
  475. val->targetError[0] & mask_16b);
  476. EncAsicSetRegisterValue(val->regMirror, HEncCPWordError2,
  477. val->targetError[1] & mask_16b);
  478. EncAsicSetRegisterValue(val->regMirror, HEncCPWordError3,
  479. val->targetError[2] & mask_16b);
  480. EncAsicSetRegisterValue(val->regMirror, HEncCPWordError4,
  481. val->targetError[3] & mask_16b);
  482. EncAsicSetRegisterValue(val->regMirror, HEncCPWordError5,
  483. val->targetError[4] & mask_16b);
  484. EncAsicSetRegisterValue(val->regMirror, HEncCPWordError6,
  485. val->targetError[5] & mask_16b);
  486. EncAsicSetRegisterValue(val->regMirror, HEncCPDeltaQp1, val->deltaQp[0] & mask_4b);
  487. EncAsicSetRegisterValue(val->regMirror, HEncCPDeltaQp2, val->deltaQp[1] & mask_4b);
  488. EncAsicSetRegisterValue(val->regMirror, HEncCPDeltaQp3, val->deltaQp[2] & mask_4b);
  489. EncAsicSetRegisterValue(val->regMirror, HEncCPDeltaQp4, val->deltaQp[3] & mask_4b);
  490. EncAsicSetRegisterValue(val->regMirror, HEncCPDeltaQp5, val->deltaQp[4] & mask_4b);
  491. EncAsicSetRegisterValue(val->regMirror, HEncCPDeltaQp6, val->deltaQp[5] & mask_4b);
  492. EncAsicSetRegisterValue(val->regMirror, HEncCPDeltaQp7, val->deltaQp[6] & mask_4b);
  493. }
  494. }
  495. /* Stream start offset */
  496. EncAsicSetRegisterValue(val->regMirror, HEncStartOffset, val->firstFreeBit);
  497. /* Stabilization */
  498. if(val->codingType != ASIC_JPEG)
  499. {
  500. EncAsicSetRegisterValue(val->regMirror, HEncBaseNextLum, val->vsNextLumaBase);
  501. EncAsicSetRegisterValue(val->regMirror, HEncStabMode, val->vsMode);
  502. }
  503. EncAsicSetRegisterValue(val->regMirror, HEncDMVPenalty, diffMvPenalty);
  504. EncAsicSetRegisterValue(val->regMirror, HEncDMVPenalty4p, val->diffMvPenalty4p);
  505. EncAsicSetRegisterValue(val->regMirror, HEncBaseCabacCtx, val->cabacCtxBase);
  506. EncAsicSetRegisterValue(val->regMirror, HEncBaseMvWrite, val->mvOutputBase);
  507. EncAsicSetRegisterValue(val->regMirror, HEncRGBCoeffA,
  508. val->colorConversionCoeffA & mask_16b);
  509. EncAsicSetRegisterValue(val->regMirror, HEncRGBCoeffB,
  510. val->colorConversionCoeffB & mask_16b);
  511. EncAsicSetRegisterValue(val->regMirror, HEncRGBCoeffC,
  512. val->colorConversionCoeffC & mask_16b);
  513. EncAsicSetRegisterValue(val->regMirror, HEncRGBCoeffE,
  514. val->colorConversionCoeffE & mask_16b);
  515. EncAsicSetRegisterValue(val->regMirror, HEncRGBCoeffF,
  516. val->colorConversionCoeffF & mask_16b);
  517. EncAsicSetRegisterValue(val->regMirror, HEncRMaskMSB, val->rMaskMsb & mask_5b);
  518. EncAsicSetRegisterValue(val->regMirror, HEncGMaskMSB, val->gMaskMsb & mask_5b);
  519. EncAsicSetRegisterValue(val->regMirror, HEncBMaskMSB, val->bMaskMsb & mask_5b);
  520. /* Other video coding controls */
  521. if(val->codingType != ASIC_JPEG)
  522. {
  523. EncAsicSetRegisterValue(val->regMirror, HEncCirStart, val->cirStart);
  524. EncAsicSetRegisterValue(val->regMirror, HEncCirInterval, val->cirInterval);
  525. EncAsicSetRegisterValue(val->regMirror, HEncIntraSliceMap1, val->intraSliceMap1);
  526. EncAsicSetRegisterValue(val->regMirror, HEncIntraSliceMap2, val->intraSliceMap2);
  527. EncAsicSetRegisterValue(val->regMirror, HEncIntraSliceMap3, val->intraSliceMap3);
  528. EncAsicSetRegisterValue(val->regMirror, HEncIntraAreaLeft, val->intraAreaLeft);
  529. EncAsicSetRegisterValue(val->regMirror, HEncIntraAreaRight, val->intraAreaRight);
  530. EncAsicSetRegisterValue(val->regMirror, HEncIntraAreaTop, val->intraAreaTop);
  531. EncAsicSetRegisterValue(val->regMirror, HEncIntraAreaBottom, val->intraAreaBottom);
  532. EncAsicSetRegisterValue(val->regMirror, HEncRoi1Left, val->roi1Left);
  533. EncAsicSetRegisterValue(val->regMirror, HEncRoi1Right, val->roi1Right);
  534. EncAsicSetRegisterValue(val->regMirror, HEncRoi1Top, val->roi1Top);
  535. EncAsicSetRegisterValue(val->regMirror, HEncRoi1Bottom, val->roi1Bottom);
  536. EncAsicSetRegisterValue(val->regMirror, HEncRoi2Left, val->roi2Left);
  537. EncAsicSetRegisterValue(val->regMirror, HEncRoi2Right, val->roi2Right);
  538. EncAsicSetRegisterValue(val->regMirror, HEncRoi2Top, val->roi2Top);
  539. EncAsicSetRegisterValue(val->regMirror, HEncRoi2Bottom, val->roi2Bottom);
  540. /* Limit ROI delta QPs so that ROI area QP is always >= 0.
  541. * ASIC doesn't check this. */
  542. EncAsicSetRegisterValue(val->regMirror, HEncRoi1DeltaQp, MIN(val->qp, val->roi1DeltaQp));
  543. EncAsicSetRegisterValue(val->regMirror, HEncRoi2DeltaQp, MIN(val->qp, val->roi2DeltaQp));
  544. /* MVC */
  545. EncAsicSetRegisterValue(val->regMirror, HEncMvcAnchorPicFlag, val->mvcAnchorPicFlag);
  546. EncAsicSetRegisterValue(val->regMirror, HEncMvcPriorityId, val->mvcPriorityId);
  547. EncAsicSetRegisterValue(val->regMirror, HEncMvcViewId, val->mvcViewId);
  548. EncAsicSetRegisterValue(val->regMirror, HEncMvcTemporalId, val->mvcTemporalId);
  549. EncAsicSetRegisterValue(val->regMirror, HEncMvcInterViewFlag, val->mvcInterViewFlag);
  550. }
  551. #ifdef ASIC_WAVE_TRACE_TRIGGER
  552. if(val->vop_count++ == trigger_point)
  553. {
  554. /* logic analyzer triggered by writing to the ID reg */
  555. EWLWriteReg(ewl, 0x00, ~0);
  556. }
  557. #endif
  558. /* Write regMirror to registers */
  559. {
  560. i32 i;
  561. for(i = 1; i <= 62; i++)
  562. {
  563. EWLWriteReg(ewl, HSWREG(i), val->regMirror[i]);
  564. }
  565. }
  566. /* Write JPEG quantization tables to regs if needed (JPEG) */
  567. if(val->codingType == ASIC_JPEG)
  568. {
  569. i32 i = 0;
  570. for(i = 0; i < 128; i += 4)
  571. {
  572. /* swreg[64] to swreg[95] */
  573. EWLWriteReg(ewl, HSWREG(64 + (i/4)), (val->quantTable[i] << 24) |
  574. (val->quantTable[i + 1] << 16) |
  575. (val->quantTable[i + 2] << 8) |
  576. (val->quantTable[i + 3]));
  577. }
  578. }
  579. #ifdef TRACE_REGS
  580. EncTraceRegs(ewl, 0, 0);
  581. #endif
  582. /* Register with enable bit is written last */
  583. val->regMirror[14] |= ASIC_STATUS_ENABLE;
  584. EWLEnableHW(ewl, HSWREG(14), val->regMirror[14]);
  585. }
  586. /*------------------------------------------------------------------------------
  587. ------------------------------------------------------------------------------*/
  588. void EncAsicFrameContinue(const void *ewl, regValues_s * val)
  589. {
  590. /* clear status bits, clear IRQ => HW restart */
  591. u32 status = val->regMirror[1];
  592. status &= (~ASIC_STATUS_ALL);
  593. status &= ~ASIC_IRQ_LINE;
  594. val->regMirror[1] = status;
  595. /*CheckRegisterValues(val); */
  596. /* Write only registers which may be updated mid frame */
  597. EWLWriteReg(ewl, HSWREG(24), (val->rlcLimitSpace / 2));
  598. val->regMirror[5] = val->rlcBase;
  599. EWLWriteReg(ewl, HSWREG(5), val->regMirror[5]);
  600. #ifdef TRACE_REGS
  601. EncTraceRegs(ewl, 0, EncAsicGetRegisterValue(ewl, val->regMirror, HEncMbCount));
  602. #endif
  603. /* Register with status bits is written last */
  604. EWLEnableHW(ewl, HSWREG(1), val->regMirror[1]);
  605. }
  606. /*------------------------------------------------------------------------------
  607. ------------------------------------------------------------------------------*/
  608. void EncAsicGetRegisters(const void *ewl, regValues_s * val)
  609. {
  610. /* HW output stream size, bits to bytes */
  611. val->outputStrmSize =
  612. EncAsicGetRegisterValue(ewl, val->regMirror, HEncStrmBufLimit) / 8;
  613. if(val->codingType != ASIC_JPEG && val->cpTarget != NULL)
  614. {
  615. /* video coding with MB rate control ON */
  616. u32 i;
  617. u32 cpt_prev = 0;
  618. u32 overflow = 0;
  619. for(i = 0; i < 10; i++)
  620. {
  621. u32 cpt;
  622. /* Checkpoint result div32 */
  623. cpt = EncAsicGetRegisterValue(ewl, val->regMirror,
  624. (regName)(HEncCP1WordTarget+i)) * 32;
  625. /* detect any overflow, overflow div32 is 65536 => overflow at 21 bits */
  626. if(cpt < cpt_prev)
  627. overflow += (1 << 21);
  628. cpt_prev = cpt;
  629. val->cpTargetResults[i] = cpt + overflow;
  630. }
  631. }
  632. /* QP sum div2 */
  633. val->qpSum = EncAsicGetRegisterValue(ewl, val->regMirror, HEncQpSum) * 2;
  634. /* MAD MB count*/
  635. val->madCount = EncAsicGetRegisterValue(ewl, val->regMirror, HEncMadCount);
  636. /* Non-zero coefficient count*/
  637. val->rlcCount = EncAsicGetRegisterValue(ewl, val->regMirror, HEncRlcSum) * 4;
  638. /* get stabilization results if needed */
  639. if(val->vsMode != 0)
  640. {
  641. i32 i;
  642. for(i = 40; i <= 50; i++)
  643. {
  644. val->regMirror[i] = EWLReadReg(ewl, HSWREG(i));
  645. }
  646. }
  647. #ifdef TRACE_REGS
  648. EncTraceRegs(ewl, 1, EncAsicGetRegisterValue(ewl, val->regMirror, HEncMbCount));
  649. #endif
  650. }
  651. /*------------------------------------------------------------------------------
  652. ------------------------------------------------------------------------------*/
  653. void EncAsicStop(const void *ewl)
  654. {
  655. EWLDisableHW(ewl, HSWREG(14), 0);
  656. }
  657. /*------------------------------------------------------------------------------
  658. ------------------------------------------------------------------------------*/
  659. u32 EncAsicGetStatus(const void *ewl)
  660. {
  661. return EWLReadReg(ewl, HSWREG(1));
  662. }