jpeg_drv_dec.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791
  1. #ifdef JPEG_DEC_DRIVER
  2. #include <linux/kernel.h>
  3. /* #include <linux/xlog.h> */
  4. #include "jpeg_drv_common.h"
  5. #include "jpeg_drv_reg.h"
  6. /* #define DUMP_REG_CMD */
  7. #define ALIGN_MASK(BIT) (((unsigned int)(BIT) >> 3) - 1)
  8. #define CHECK_ALIGN(value, align, addr) \
  9. { \
  10. if (value & (align-1)) \
  11. JPEG_WRN("WriteREG: Try to write %d to REG(%x) without %d align!!\n ", value, addr, align); \
  12. }
  13. #define TEST_JPEG_DEBUG_EN
  14. /* unsigned int _jpeg_dec_int_status = 0; */
  15. unsigned int _jpeg_dec_dump_reg_en = 0;
  16. kal_uint32 _jpeg_dec_int_status = 0;
  17. kal_uint32 _jpeg_dec_mode = 0;
  18. int jpeg_isr_dec_lisr(void)
  19. {
  20. unsigned int tmp = 0, tmp1 = 0;
  21. tmp1 = REG_JPGDEC_INTERRUPT_STATUS;
  22. tmp = tmp1 & BIT_INQST_MASK_ALLIRQ;
  23. if (tmp) {
  24. _jpeg_dec_int_status = tmp;
  25. /* error handling, since irq can't be cleared by register. we need to mask the irq out */
  26. if (((_jpeg_dec_int_status & BIT_INQST_MASK_ERROR_BS) == BIT_INQST_MASK_ERROR_BS) ||
  27. ((_jpeg_dec_int_status & BIT_INQST_MASK_OVERFLOW) == BIT_INQST_MASK_OVERFLOW)) {
  28. IMG_REG_WRITE(0x0, REG_ADDR_JPGDEC_IRQ_EN);
  29. return 0;
  30. }
  31. if (_jpeg_dec_mode == 1) {
  32. #ifndef JPEG_DEC_IRQ_ENHANCE
  33. /* always not clear, but mask jpeg interrupt temporarily when EOF irq have not rise yet */
  34. /* this is workaround for HW decoder ROW mode since clear pause irq will trigger HW to fire */
  35. /* we need to disable jpeg irq before resume to avoid jpeg irq rise too frequenct */
  36. if (((_jpeg_dec_int_status & BIT_INQST_MASK_EOF) != BIT_INQST_MASK_EOF) &&
  37. ((_jpeg_dec_int_status & BIT_INQST_MASK_PAUSE) == BIT_INQST_MASK_PAUSE))
  38. IMG_REG_WRITE(0x0, REG_ADDR_JPGDEC_IRQ_EN);
  39. /* clear jpeg decode interrupt if it is not the situiation that only pause irq was raised */
  40. else
  41. IMG_REG_WRITE(tmp, REG_ADDR_JPGDEC_INTERRUPT_STATUS);
  42. #else
  43. IMG_REG_WRITE(tmp, REG_ADDR_JPGDEC_INTERRUPT_STATUS);
  44. #endif
  45. return 0;
  46. } else {
  47. /* / clear the interrupt status register */
  48. IMG_REG_WRITE(tmp, REG_ADDR_JPGDEC_INTERRUPT_STATUS);
  49. return 0;
  50. }
  51. }
  52. return -1;
  53. }
  54. void jpeg_drv_dec_start(void)
  55. {
  56. #ifndef JPEG_DEC_IRQ_ENHANCE
  57. /*JPEG_MSG("JPGDC jpeg_drv_dec_start: unmask jpeg irq!\n");*/
  58. /* unmask jpeg irq */
  59. IMG_REG_WRITE(0x37, REG_ADDR_JPGDEC_IRQ_EN);
  60. #else
  61. unsigned int reg_value;
  62. /*JPEG_MSG("JPGDC jpeg_drv_dec_start: JPEG_DEC_IRQ_ENHANCE!\n");*/
  63. IMG_REG_READ(reg_value, REG_ADDR_JPGDEC_IRQ_EN);
  64. reg_value |= BIT_DEC_IRQ_EN_DEBUG_BRP_FLAG;
  65. IMG_REG_WRITE(reg_value, REG_ADDR_JPGDEC_IRQ_EN);
  66. #endif
  67. IMG_REG_WRITE(0, REG_ADDR_JPGDEC_TRIG); /* REG_JPGDEC_TRIG = 0; */
  68. }
  69. /**
  70. * Call this function to reset the JPEG decoder.
  71. */
  72. /* workaround for jpeg odd read operation at cg gating state */
  73. void jpeg_drv_dec_verify_state_and_reset(void)
  74. {
  75. unsigned int temp, value;
  76. IMG_REG_WRITE(0x00, REG_ADDR_JPGDEC_RESET);
  77. IMG_REG_WRITE(0x00, REG_ADDR_JPGDEC_RESET);
  78. IMG_REG_WRITE(0x10, REG_ADDR_JPGDEC_RESET);
  79. IMG_REG_WRITE(0x10, REG_ADDR_JPGDEC_RESET);
  80. IMG_REG_READ(temp, REG_ADDR_JPGDEC_ULTRA_THRES);
  81. IMG_REG_READ(value, REG_ADDR_JPGDEC_FILE_ADDR);
  82. /* issue happen, need to do 1 read at cg gating state */
  83. if (value == 0xFFFFFFFF) {
  84. JPEG_MSG("JPGDEC APB R/W issue found, start to do recovery!\n");
  85. jpeg_drv_dec_power_off();
  86. IMG_REG_READ(value, REG_ADDR_JPGDEC_ULTRA_THRES);
  87. jpeg_drv_dec_power_on();
  88. }
  89. _jpeg_dec_int_status = 0;
  90. _jpeg_dec_mode = 0;
  91. }
  92. void jpeg_drv_dec_warm_reset(void)
  93. {
  94. unsigned int int_status, i, value;
  95. int_status = REG_JPGDEC_INTERRUPT_STATUS;
  96. /* clear all interrupts except pause interrupt since clear this interrupt will cause HW to trigger */
  97. IMG_REG_WRITE(0x000000EF, REG_ADDR_JPGDEC_INTERRUPT_STATUS); /* ack decoder */
  98. /* we need to wait GMC idle only when EOF irq does not issue */
  99. if (!(int_status & BIT_INQST_MASK_EOF)) {
  100. IMG_REG_READ(value, REG_ADDR_JPGDEC_DU_CTRL);
  101. IMG_REG_WRITE((value & 0xBFFFFFFF), REG_ADDR_JPGDEC_DU_CTRL); /* dsiable GMC */
  102. /* wait GMC idle */
  103. i = 5000;
  104. while (i > 0) {
  105. /* break if GMC idle is 1 */
  106. if (((REG_JPGDEC_STATUS) & 0x08000000))
  107. break;
  108. i--;
  109. }
  110. if (i == 0) {
  111. /* dump key register */
  112. JPEG_WRN
  113. ("[JPEGDRV] jpeg_dec_reset timeout!! 0x278 = 0x%x, 0x23c = 0x%x, 0x184 = 0x%x\n",
  114. REG_JPGDEC_STATUS, REG_JPGDEC_DU_CTRL, REG_JPGDEC_DEBUG1);
  115. JPEG_WRN
  116. ("[JPEGDRV] 0x304 = 0x%x, 0x308 = 0x%x, 0x30c = 0x%x, 0x310 = 0x%x\n",
  117. REG_JPGDEC_SMI_DEBUG0, REG_JPGDEC_SMI_DEBUG1, REG_JPGDEC_SMI_DEBUG2,
  118. REG_JPGDEC_SMI_DEBUG3);
  119. }
  120. }
  121. IMG_REG_WRITE(0x00, REG_ADDR_JPGDEC_RESET);
  122. IMG_REG_WRITE(0x10, REG_ADDR_JPGDEC_RESET);
  123. /* REG_JPGDEC_RESET = 0x00; */
  124. _jpeg_dec_int_status = 0;
  125. _jpeg_dec_mode = 0;
  126. }
  127. void jpeg_drv_dec_reset(void)
  128. {
  129. IMG_REG_WRITE(0x00, REG_ADDR_JPGDEC_RESET);
  130. IMG_REG_WRITE(0x10, REG_ADDR_JPGDEC_RESET);
  131. /* REG_JPGDEC_RESET = 0x00; */
  132. _jpeg_dec_int_status = 0;
  133. _jpeg_dec_mode = 0;
  134. }
  135. void wait_pr(void)
  136. {
  137. unsigned int timeout1 = 0xF;
  138. unsigned int timeout2 = 0xFFFFF;
  139. unsigned int timeout3 = 0xFFFFFFF;
  140. while (timeout1 > 0) {
  141. while (timeout2 > 0) {
  142. while (timeout3 > 0)
  143. timeout3--;
  144. timeout2--;
  145. }
  146. timeout1--;
  147. }
  148. }
  149. void jpeg_drv_dec_set_brz_factor(unsigned char yHScale, unsigned char yVScale,
  150. unsigned char cbcrHScale, unsigned char cbcrVScale)
  151. {
  152. unsigned int u4Value;
  153. /* yHScale = yHScale; */
  154. /* yVScale = yVScale; */
  155. /* cbcrHScale = cbcrHScale; */
  156. /* cbcrVScale = cbcrVScale; */
  157. #if 0
  158. if (srcFormat == JPG_COLOR_444 ||
  159. srcFormat == JPG_COLOR_422V || srcFormat == JPG_COLOR_422Vx2) {
  160. cbcrHScale++;
  161. }
  162. #endif
  163. u4Value = (cbcrVScale << BIT_BRZ_CV_SHIFT) | (cbcrHScale << BIT_BRZ_CH_SHIFT) |
  164. (yVScale << BIT_BRZ_YV_SHIFT) | (yHScale << BIT_BRZ_YH_SHIFT);
  165. IMG_REG_WRITE(u4Value, REG_ADDR_JPGDEC_BRZ_FACTOR);
  166. }
  167. void jpeg_drv_dec_set_dst_bank0(unsigned int addr_Y, unsigned int addr_U, unsigned int addr_V)
  168. {
  169. IMG_REG_WRITE(addr_Y, REG_ADDR_JPGDEC_DEST_ADDR0_Y);
  170. IMG_REG_WRITE(addr_U, REG_ADDR_JPGDEC_DEST_ADDR0_U);
  171. IMG_REG_WRITE(addr_V, REG_ADDR_JPGDEC_DEST_ADDR0_V);
  172. }
  173. void jpeg_drv_dec_set_dst_bank1(unsigned int addr_Y, unsigned int addr_U, unsigned int addr_V)
  174. {
  175. /* unsigned int u4Value; */
  176. IMG_REG_WRITE(addr_Y, REG_ADDR_JPGDEC_DEST_ADDR1_Y);
  177. IMG_REG_WRITE(addr_U, REG_ADDR_JPGDEC_DEST_ADDR1_U);
  178. IMG_REG_WRITE(addr_V, REG_ADDR_JPGDEC_DEST_ADDR1_V);
  179. }
  180. int jpeg_drv_dec_set_memStride(unsigned int CompMemStride_Y, unsigned int CompMemStride_UV)
  181. {
  182. IMG_REG_WRITE((CompMemStride_Y & 0xFFFF), REG_ADDR_JPGDEC_STRIDE_Y);
  183. IMG_REG_WRITE((CompMemStride_UV & 0xFFFF), REG_ADDR_JPGDEC_STRIDE_UV);
  184. return (int)E_HWJPG_OK;
  185. }
  186. int jpeg_drv_dec_set_imgStride(unsigned int CompStride_Y, unsigned int CompStride_UV)
  187. {
  188. /* unsigned int u4Reg; */
  189. IMG_REG_WRITE((CompStride_Y & 0xFFFF), REG_ADDR_JPGDEC_IMG_STRIDE_Y);
  190. IMG_REG_WRITE((CompStride_UV & 0xFFFF), REG_ADDR_JPGDEC_IMG_STRIDE_UV);
  191. return (int)E_HWJPG_OK;
  192. }
  193. void jpeg_drv_dec_set_pause_mcu_idx(unsigned int McuIdx)
  194. {
  195. IMG_REG_WRITE((McuIdx & 0x0003FFFFFF), REG_ADDR_JPGDEC_PAUSE_MCU_NUM);
  196. }
  197. void jpeg_drv_dec_set_dec_mode(int i4DecMode)
  198. {
  199. unsigned int u4Value = i4DecMode;
  200. /* 0: full frame, 1: direct couple mode, 2: pause/resume mode, 3: Reserved */
  201. if (u4Value > 0x02)
  202. JPEG_WRN("Warning : try to set invalid decode mode, %d!!\n", u4Value);
  203. IMG_REG_WRITE((u4Value & 0x03), REG_ADDR_JPGDEC_OPERATION_MODE);
  204. }
  205. void jpeg_drv_dec_set_debug_mode(void)
  206. {
  207. unsigned int u4Value;
  208. u4Value = REG_JPGDEC_DEBUG_MODE;
  209. u4Value |= 0x80000000;
  210. IMG_REG_WRITE((u4Value), REG_ADDR_JPGDEC_DEBUG_MODE);
  211. }
  212. void jpeg_drv_dec_set_bs_writePtr(unsigned int writePtr)
  213. {
  214. CHECK_ALIGN(writePtr, 16, (kal_uint32) REG_ADDR_JPGDEC_FILE_BRP);
  215. IMG_REG_WRITE((writePtr), REG_ADDR_JPGDEC_FILE_BRP);
  216. }
  217. void jpeg_drv_dec_set_bs_info(unsigned int bsBase, unsigned int bsSize)
  218. {
  219. CHECK_ALIGN(bsBase, 16, (kal_uint32) REG_ADDR_JPGDEC_FILE_ADDR);
  220. CHECK_ALIGN(bsSize, 128, (kal_uint32) REG_ADDR_JPGDEC_FILE_TOTAL_SIZE);
  221. IMG_REG_WRITE((bsBase), REG_ADDR_JPGDEC_FILE_ADDR);
  222. IMG_REG_WRITE((bsSize), REG_ADDR_JPGDEC_FILE_TOTAL_SIZE);
  223. }
  224. /* void jpeg_drv_dec_set_total_bs_size_align128(unsigned int bsSize) */
  225. /* { */
  226. /* unsigned int u4tmp; */
  227. /* */
  228. /* if(bsSize & 127){ */
  229. /* u4tmp = bsSize & (~127) ; */
  230. /* }else */
  231. /* u4tmp = bsSize ; */
  232. /* REG_JPGDEC_FILE_TOTAL_SIZE = u4tmp; */
  233. /* */
  234. /* */
  235. /* } */
  236. void jpeg_drv_dec_set_comp_id(unsigned int Y_ID, unsigned int U_ID, unsigned int V_ID)
  237. {
  238. unsigned int u4Value;
  239. u4Value = ((Y_ID & 0x00FF) << 24) | ((U_ID & 0x00FF) << 16) | ((V_ID & 0x00FF) << 8);
  240. IMG_REG_WRITE((u4Value), REG_ADDR_JPGDEC_COMP_ID);
  241. }
  242. void jpeg_drv_dec_set_total_mcu(unsigned int TotalMcuNum)
  243. {
  244. unsigned int u4Value;
  245. u4Value = TotalMcuNum - 1;
  246. IMG_REG_WRITE((u4Value), REG_ADDR_JPGDEC_TOTAL_MCU_NUM);
  247. }
  248. void jpeg_drv_dec_set_comp0_du(unsigned int GrayDuNum)
  249. {
  250. unsigned int u4Value;
  251. u4Value = GrayDuNum - 1;
  252. IMG_REG_WRITE((u4Value), REG_ADDR_JPGDEC_COMP0_DATA_UNIT_NUM);
  253. }
  254. void jpeg_drv_dec_set_du_membership(unsigned int u4Membership, unsigned int GMC_en,
  255. unsigned int IsGray)
  256. {
  257. #if 0
  258. /* u4Membership = u4Membership | 0x3FFFFF24 ;//111_111_111_111_111_111_111_100_100_100 */
  259. u4Membership = u4Membership | 0x24924924; /* 100_100_100_100_100_100_100_100_100_100 */
  260. #endif
  261. if (IsGray)
  262. u4Membership = (IsGray << 31) | (GMC_en << 30) | 0x3FFFFFFC;
  263. else
  264. u4Membership = (IsGray << 31) | (GMC_en << 30) | u4Membership;
  265. IMG_REG_WRITE((u4Membership), REG_ADDR_JPGDEC_DU_CTRL); /* REG_JPGDEC_DU_CTRL = u4Membership ; */
  266. }
  267. /* set q table for each component */
  268. void jpeg_drv_dec_set_q_table(kal_uint32 id0, kal_uint32 id1, kal_uint32 id2)
  269. {
  270. unsigned int u4Value;
  271. u4Value = ((id0 & 0x0f) << 8) | ((id1 & 0x0f) << 4) | ((id2 & 0x0f) << 0);
  272. IMG_REG_WRITE((u4Value), REG_ADDR_JPGDEC_QT_ID);
  273. #ifdef DUMP_REG_CMD
  274. JPEG_WRN("WriteREG(VLD_REG_OFST , 32'h%08x);\n",
  275. ((id0 & 0x0f) << 8) | ((id1 & 0x0f) << 4) | ((id2 & 0x0f) << 0));
  276. #endif
  277. }
  278. unsigned int jpeg_drv_dec_get_irqState(void)
  279. {
  280. unsigned int u4Value;
  281. u4Value = REG_JPGDEC_INTERRUPT_STATUS;
  282. IMG_REG_WRITE((u4Value), REG_ADDR_JPGDEC_INTERRUPT_STATUS);
  283. return u4Value;
  284. }
  285. unsigned int jpeg_drv_dec_get_decState(void)
  286. {
  287. unsigned int u4Value;
  288. u4Value = REG_JPGDEC_STATUS;
  289. JPEG_MSG("JPED_DEC_DRV: STATUS %x!!\n", u4Value);
  290. return u4Value;
  291. }
  292. unsigned int jpeg_drv_dec_get_decMCU(void)
  293. {
  294. unsigned int u4Value;
  295. u4Value = REG_JPGDEC_MCU_CNT;
  296. JPEG_MSG("JPED_DEC_DRV: MCU_CNT %x!!\n", u4Value);
  297. return u4Value;
  298. }
  299. void jpeg_drv_dec_set_dma_group(unsigned int McuInGroup, unsigned int GroupNum,
  300. unsigned int LastMcuNum)
  301. {
  302. unsigned int McuInGroup_1 = McuInGroup - 1;
  303. unsigned int GroupNum_1 = GroupNum - 1;
  304. unsigned int LastMcuNum_1 = LastMcuNum - 1;
  305. unsigned int u4Value;
  306. u4Value =
  307. ((McuInGroup_1 & 0x00FF) << 16) | ((GroupNum_1 & 0x007F) << 8) | (LastMcuNum_1 &
  308. 0x00FF);
  309. IMG_REG_WRITE((u4Value), REG_ADDR_JPGDEC_WDMA_CTRL); /* */
  310. }
  311. void jpeg_drv_dec_set_sampling_factor(unsigned int compNum, unsigned int u4Y_H, unsigned int u4Y_V,
  312. unsigned int u4U_H, unsigned int u4U_V, unsigned int u4V_H,
  313. unsigned int u4V_V)
  314. {
  315. unsigned int u4Value = 0;
  316. unsigned int u4Y_HV = (DUNUM_MAPPING(u4Y_H) << 2) | DUNUM_MAPPING(u4Y_V);
  317. unsigned int u4U_HV = (DUNUM_MAPPING(u4U_H) << 2) | DUNUM_MAPPING(u4U_V);
  318. unsigned int u4V_HV = (DUNUM_MAPPING(u4V_H) << 2) | DUNUM_MAPPING(u4V_V);
  319. if (compNum == 1)
  320. u4Value = 0; /* u4Y_HV << 8; */
  321. else
  322. u4Value = (u4Y_HV << 8) | (u4U_HV << 4) | u4V_HV;
  323. IMG_REG_WRITE((u4Value), REG_ADDR_JPGDEC_DU_SAMPLE); /* REG_JPGDEC_DU_SAMPLE = u4Value; */
  324. }
  325. int jpeg_drv_dec_set_config_data(JPEG_DEC_DRV_IN *config)
  326. {
  327. jpeg_drv_dec_set_sampling_factor(config->componentNum,
  328. config->hSamplingFactor[0], config->vSamplingFactor[0],
  329. config->hSamplingFactor[1], config->vSamplingFactor[1],
  330. config->hSamplingFactor[2], config->vSamplingFactor[2]);
  331. /* set BRZ factor */
  332. jpeg_drv_dec_set_brz_factor(config->lumaHorDecimate, config->lumaVerDecimate,
  333. config->cbcrHorDecimate, config->cbcrVerDecimate);
  334. /* set group DMA */
  335. jpeg_drv_dec_set_dma_group(config->dma_McuInGroup, config->dma_GroupNum,
  336. config->dma_LastMcuNum);
  337. /* set componet ID */
  338. jpeg_drv_dec_set_comp_id(config->componentID[0], config->componentID[1],
  339. config->componentID[2]);
  340. /* set BLK membership */
  341. jpeg_drv_dec_set_du_membership(config->membershipList, config->gmcEn,
  342. (config->componentNum == 1) ? 1 : 0);
  343. /* set q table id */
  344. jpeg_drv_dec_set_q_table(config->qTableSelector[0], config->qTableSelector[1],
  345. config->qTableSelector[2]);
  346. /* set dst image stride */
  347. jpeg_drv_dec_set_imgStride(config->compImgStride[0], config->compImgStride[1]);
  348. /* set dst Memory stride */
  349. /* if( config->pauseRow_en ){ */
  350. /* jpeg_drv_dec_set_memStride(config->compTileBufStride[0], config->compTileBufStride[1]); */
  351. /* }else{ */
  352. jpeg_drv_dec_set_memStride(config->compMemStride[0], config->compMemStride[1]);
  353. /* } */
  354. /* set total MCU number */
  355. jpeg_drv_dec_set_total_mcu(config->totalMCU);
  356. /* set Gray DU number */
  357. jpeg_drv_dec_set_comp0_du(config->comp0_DU);
  358. /* set pause MCU index */
  359. jpeg_drv_dec_set_pause_mcu_idx(config->pauseMCU - 1);
  360. /* set bitstream base, size */
  361. JPEG_MSG("[JPEGDRV] mode %d, Buf Base 0x%08x, Limit 0x%08x, Size 0x%08x!!\n",
  362. config->reg_OpMode, config->srcStreamAddrBase, config->srcStreamAddrWritePtr,
  363. config->srcStreamSize);
  364. jpeg_drv_dec_set_bs_info(config->srcStreamAddrBase, config->srcStreamSize);
  365. /* set bitstream write pointer */
  366. jpeg_drv_dec_set_bs_writePtr(config->srcStreamAddrWritePtr);
  367. /* set Decode Operation Mode */
  368. jpeg_drv_dec_set_dec_mode(config->reg_OpMode); /* set full frame or pause/resume */
  369. /* output bank 0 */
  370. jpeg_drv_dec_set_dst_bank0(config->outputBuffer0[0], config->outputBuffer0[1],
  371. config->outputBuffer0[2]);
  372. /* output bank 1 */
  373. jpeg_drv_dec_set_dst_bank1(config->outputBuffer1[0], config->outputBuffer1[1],
  374. config->outputBuffer1[2]);
  375. #ifdef TEST_JPEG_DEBUG_EN
  376. jpeg_drv_dec_set_debug_mode();
  377. #endif
  378. return (int)E_HWJPG_OK;
  379. }
  380. void jpeg_drv_dec_resume(unsigned int resume)
  381. {
  382. _jpeg_dec_int_status = 0;
  383. #ifndef JPEG_DEC_IRQ_ENHANCE
  384. IMG_REG_WRITE((resume), REG_ADDR_JPGDEC_INTERRUPT_STATUS);
  385. /* unmask jpeg interrupt since we've masked it out when pause irq rise */
  386. IMG_REG_WRITE(0x37, REG_ADDR_JPGDEC_IRQ_EN);
  387. #else
  388. IMG_REG_WRITE(0, REG_ADDR_JPGDEC_TRIG);
  389. #endif
  390. }
  391. int jpeg_drv_dec_wait_one_row(JPEG_DEC_DRV_IN *config)
  392. {
  393. unsigned int timeout = 0x2FFFFF;
  394. unsigned int irq_status;
  395. unsigned int tri_cnt = ++config->pauseRowCnt; /* 1; */
  396. unsigned int MCU_cnt = 0;
  397. unsigned int base_Y = config->buffer_Y_PA; /* 0x89080000; */
  398. unsigned int base_CB = config->buffer_Cb_PA; /* 0x89040000; */
  399. unsigned int base_CR = config->buffer_Cr_PA; /* 0x89100000; */
  400. unsigned int ring_row_index = tri_cnt % config->tileBufRowNum;
  401. /* for( tri_cnt = 1 ; tri_cnt <= 60 ; tri_cnt++) */
  402. {
  403. /* wait done */
  404. if (config->decodeMode == JPEG_DEC_MODE_MCU_ROW) {
  405. while ((REG_JPGDEC_INTERRUPT_STATUS & BIT_INQST_MASK_ALLIRQ) == 0) {
  406. timeout--;
  407. if (timeout == 0)
  408. break;
  409. }
  410. } else {
  411. while ((REG_JPGDEC_INTERRUPT_STATUS & BIT_INQST_MASK_ALLIRQ) == 0) {
  412. timeout--;
  413. if (timeout == 0)
  414. break;
  415. }
  416. }
  417. irq_status = REG_JPGDEC_INTERRUPT_STATUS;
  418. MCU_cnt = config->mcuPerRow * (tri_cnt + 1);
  419. /* MCU_cnt = config->u4McuNumInRow * (tri_cnt+1) ; */
  420. JPEG_MSG
  421. ("JPEG_DEC_WAIT_DONE: tri_cnt %d, irq %x, MCUinRow %d, p_idx %d, %x %x %x!!\n",
  422. tri_cnt, irq_status, config->mcuPerRow, MCU_cnt,
  423. base_Y + ring_row_index * (config->buffer_Y_row_size),
  424. base_CB + ring_row_index * (config->buffer_C_row_size),
  425. base_CR + ring_row_index * (config->buffer_C_row_size));
  426. jpeg_drv_dec_set_dst_bank0(base_Y + ring_row_index * (config->buffer_Y_row_size),
  427. base_CB + ring_row_index * (config->buffer_C_row_size),
  428. base_CR + ring_row_index * (config->buffer_C_row_size));
  429. jpeg_drv_dec_set_pause_mcu_idx(MCU_cnt - 1);
  430. IMG_REG_WRITE((irq_status), REG_ADDR_JPGDEC_INTERRUPT_STATUS);
  431. /* Debug: jpeg_drv_dec_dump_reg(); */
  432. if (timeout == 0) {
  433. JPEG_ERR("Error! Decode Timeout.\n");
  434. jpeg_drv_dec_dump_reg();
  435. return 0;
  436. }
  437. JPEG_ERR("JPEG Decode Success, st %x!!\n", irq_status);
  438. }
  439. return 1;
  440. }
  441. int jpeg_drv_dec_wait(JPEG_DEC_DRV_IN *config)
  442. {
  443. unsigned int timeout = 0x2FFFFF;
  444. unsigned int irq_status;
  445. /* wait done */
  446. if (config->decodeMode == JPEG_DEC_MODE_MCU_ROW) {
  447. while ((REG_JPGDEC_INTERRUPT_STATUS & BIT_INQST_MASK_ALLIRQ) == 0) {
  448. timeout--;
  449. if (timeout == 0)
  450. break;
  451. }
  452. } else {
  453. while ((REG_JPGDEC_INTERRUPT_STATUS & BIT_INQST_MASK_ALLIRQ) == 0) {
  454. timeout--;
  455. if (timeout == 0)
  456. break;
  457. }
  458. }
  459. irq_status = REG_JPGDEC_INTERRUPT_STATUS;
  460. IMG_REG_WRITE((irq_status), REG_ADDR_JPGDEC_INTERRUPT_STATUS);
  461. /* Debug: jpeg_drv_dec_dump_reg(); */
  462. if (timeout == 0) {
  463. JPEG_ERR("Error! Decode Timeout.\n");
  464. jpeg_drv_dec_dump_reg();
  465. return 0;
  466. }
  467. JPEG_ERR("JPEG Decode Success, st %x!!\n", irq_status);
  468. return 1;
  469. }
  470. kal_uint32 jpeg_drv_dec_get_result(void)
  471. {
  472. /* JPEG_MSG("[JPEGDRV] get_result mode %x, irq_sts %x!!\n", _jpeg_dec_mode,
  473. _jpeg_dec_int_status); */
  474. /* if(_jpeg_dec_mode == 1){ */
  475. /* if(_jpeg_dec_int_status & BIT_INQST_MASK_END ) */
  476. /* REG_JPGDEC_INTERRUPT_STATUS = _jpeg_dec_int_status ; */
  477. /* } */
  478. if (_jpeg_dec_int_status & BIT_INQST_MASK_EOF)
  479. return 0;
  480. else if (_jpeg_dec_int_status & BIT_INQST_MASK_PAUSE)
  481. return 1;
  482. else if (_jpeg_dec_int_status & BIT_INQST_MASK_UNDERFLOW)
  483. return 2;
  484. else if (_jpeg_dec_int_status & BIT_INQST_MASK_OVERFLOW)
  485. return 3;
  486. else if (_jpeg_dec_int_status & BIT_INQST_MASK_ERROR_BS)
  487. return 4;
  488. return 5;
  489. }
  490. int jpeg_drv_dec_break(void)
  491. {
  492. unsigned int timeout = 0xFFFFF;
  493. jpeg_drv_dec_warm_reset();
  494. while (((REG_JPGDEC_STATUS & BIT_DEC_ST_STATE_MASK) == BIT_DEC_ST_STATE_IDLE)) {
  495. timeout--;
  496. if (timeout == 0)
  497. break;
  498. }
  499. if (timeout == 0)
  500. return -1;
  501. return 0;
  502. }
  503. void jpeg_drv_dec_dump_key_reg(void)
  504. {
  505. unsigned int reg_value = 0;
  506. unsigned int index = 0;
  507. JPEG_WRN("<<<<<= JPEG DEC DUMP KEY =>>>>>\n");
  508. /* bank0, bank1 address */
  509. for (index = 0x140; index <= 0x154; index += 4) {
  510. IMG_REG_READ(reg_value, JPEG_DEC_BASE + index); /* reg_value = ioread32(JPEG_DEC_BASE + index); */
  511. JPEG_WRN("@0x%x(%d) 0x%08x\n", index, index / 4, reg_value);
  512. wait_pr();
  513. }
  514. /* pause index */
  515. for (index = 0x170; index <= 0x170; index += 4) {
  516. IMG_REG_READ(reg_value, JPEG_DEC_BASE + index); /* reg_value = ioread32(JPEG_DEC_BASE + index); */
  517. JPEG_WRN("@0x%x(%d) 0x%08x\n", index, index / 4, reg_value);
  518. wait_pr();
  519. }
  520. /* decode mode (0x17C) */
  521. /* debug (0x180) */
  522. for (index = 0x17C; index <= 0x180; index += 4) {
  523. IMG_REG_READ(reg_value, JPEG_DEC_BASE + index); /* reg_value = ioread32(JPEG_DEC_BASE + index); */
  524. JPEG_WRN("@0x%x(%d) 0x%08x\n", index, index / 4, reg_value);
  525. wait_pr();
  526. }
  527. /* RDMA addr (0x200) */
  528. for (index = 0x200; index <= 0x200; index += 4) {
  529. IMG_REG_READ(reg_value, JPEG_DEC_BASE + index); /* reg_value = ioread32(JPEG_DEC_BASE + index); */
  530. JPEG_WRN("@0x%x(%d) 0x%08x\n", index, index / 4, reg_value);
  531. wait_pr();
  532. }
  533. /* total MCU (0x210) */
  534. for (index = 0x210; index <= 0x210; index += 4) {
  535. IMG_REG_READ(reg_value, JPEG_DEC_BASE + index); /* reg_value = ioread32(JPEG_DEC_BASE + index); */
  536. JPEG_WRN("@0x%x(%d) 0x%08x\n", index, index / 4, reg_value);
  537. wait_pr();
  538. }
  539. /* file BRP addr (0x248) */
  540. /* file size (0x24C) */
  541. for (index = 0x248; index <= 0x24C; index += 4) {
  542. IMG_REG_READ(reg_value, JPEG_DEC_BASE + index); /* reg_value = ioread32(JPEG_DEC_BASE + index); */
  543. JPEG_WRN("@0x%x(%d) 0x%08x\n", index, index / 4, reg_value);
  544. wait_pr();
  545. }
  546. /* IRQ (0x274) */
  547. /* IRQ FSM (0x278) */
  548. for (index = 0x274; index <= 0x278; index += 4) {
  549. IMG_REG_READ(reg_value, JPEG_DEC_BASE + index); /* reg_value = ioread32(JPEG_DEC_BASE + index); */
  550. JPEG_WRN("@0x%x(%d) 0x%08x\n", index, index / 4, reg_value);
  551. wait_pr();
  552. }
  553. /* MCU CNT (0x294) */
  554. for (index = 0x294; index <= 0x294; index += 4) {
  555. IMG_REG_READ(reg_value, JPEG_DEC_BASE + index); /* reg_value = ioread32(JPEG_DEC_BASE + index); */
  556. JPEG_WRN("@0x%x(%d) 0x%08x\n", index, index / 4, reg_value);
  557. wait_pr();
  558. }
  559. }
  560. void jpeg_drv_dec_dump_reg(void)
  561. {
  562. unsigned int reg_value = 0;
  563. unsigned int index = 0;
  564. JPEG_VEB("<<<<<= JPEG DEC DUMP =>>>>>\n");
  565. for (index = 0x8C; index <= 0x3FC; index += 4) {
  566. IMG_REG_READ(reg_value, JPEG_DEC_BASE + index); /* reg_value = ioread32(JPEG_DEC_BASE + index); */
  567. JPEG_VEB("+0x%x(%d) 0x%08x\n", index, index / 4, reg_value);
  568. wait_pr();
  569. }
  570. }
  571. void jpeg_drv_dec_rw_reg(void)
  572. {
  573. kal_uint32 i;
  574. unsigned long addr = 0;
  575. unsigned int reg_value = 0;
  576. /* kal_uint32 restore = 0; */
  577. JPEG_VEB("=======================================\n\r");
  578. JPEG_VEB(" JPEG decoder register RW test!!!!\n\r");
  579. /* for (i = 0x8C; i < 0x3FC; i+=4) */
  580. for (i = 0x090; i <= 0x294; i += 4) {
  581. addr = (unsigned long)(JPEG_DEC_BASE + i);
  582. JPEG_VEB("addr %03x(%03d) ", i, i / 4);
  583. IMG_REG_WRITE(0x00000000, addr);
  584. IMG_REG_READ(reg_value, addr);
  585. JPEG_VEB("write 0x00000000 read: 0x%08x\n", reg_value);
  586. IMG_REG_WRITE(0xffffffff, addr);
  587. IMG_REG_READ(reg_value, addr);
  588. JPEG_VEB(" write 0xffffffff read: 0x%08x\n", reg_value);
  589. wait_pr();
  590. }
  591. JPEG_VEB("=======================================\n\r\n\r");
  592. }
  593. #endif