hv_comm_MemParser.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536
  1. /**
  2. * @file hv_mem_Parser.c
  3. * @brief get pq table offset & size
  4. *
  5. * @verbatim
  6. * ==============================================================================
  7. * ##### How to use #####
  8. * ==============================================================================
  9. *
  10. *
  11. * @endverbatim
  12. *
  13. * @author HiView SoC Software Team
  14. * @version 1.0.0
  15. * @date 2023-05-18
  16. */
  17. #include "hv_comm_MemParser.h"
  18. #include "hv_chip_Memory.h"
  19. #include "ProjectConfig.h"
  20. #include "hv_drv_Osd.h"
  21. #include "hv_drv_Flash.h"
  22. /* pq partition has decompressed or not */
  23. static CHAR8 s_cPartDecompressed = 0;
  24. __attribute__((long_call)) extern INT32 Hv_Boot_LzssDecompress(char *pcSrc, char *pcDst, INT32 iChanegeEndian, INT32 iSize);
  25. __attribute__((long_call))unsigned char Hv_Ddr_Type(void);
  26. /**
  27. * @brief get pq table addr & size
  28. * @param[in] enType: PqTableType
  29. * @param[in] uiIndex: index
  30. * @param[out] puiAddr: table addr
  31. * @param[out] puiSize: table size
  32. */
  33. Status Hv_Pq_GetTable(PqTableType enType, UINT32 uiIndex, UINT32 *puiAddr, UINT32 *puiSize)
  34. {
  35. UINT32 uiTempAddr = 0;
  36. UINT32 uiStartAddr = 0;
  37. UINT32 uiTempType = 0;
  38. UINT32 uiTempInode = 0;
  39. UINT32 uiOffset = 0;
  40. uiTempAddr = HV_MEMORY_CONFIG_PQ_DATA_START;
  41. uiStartAddr = uiTempAddr;
  42. HV_LOGV("base addr %x find for %d %d\n", uiTempAddr, enType, uiIndex);
  43. for (;;)
  44. {
  45. HV_LOGV("header addr %x\n", uiTempAddr);
  46. if (uiTempAddr > uiStartAddr + 0x1000)
  47. {
  48. HV_LOGW("no valid head for type %d, %d", enType, uiIndex);
  49. }
  50. /* check header magic */
  51. if (*(UCHAR8 *)(uiTempAddr) != 'H')
  52. {
  53. return HV_FAILURE;
  54. }
  55. if (*(UCHAR8 *)(uiTempAddr + 1) != 'E')
  56. {
  57. return HV_FAILURE;
  58. }
  59. if (*(UCHAR8 *)(uiTempAddr + 2) != 'A')
  60. {
  61. return HV_FAILURE;
  62. }
  63. if (*(UCHAR8 *)(uiTempAddr + 3) != 'D')
  64. {
  65. return HV_FAILURE;
  66. }
  67. /* check type */
  68. uiTempType = *(UCHAR8 *)(uiTempAddr + 4) << 8;
  69. uiTempType |= *(UCHAR8 *)(uiTempAddr + 5) << 0;
  70. uiTempInode = *(UCHAR8 *)(uiTempAddr + 6) << 8;
  71. uiTempInode |= *(UCHAR8 *)(uiTempAddr + 7) << 0;
  72. HV_LOGV("header need %d, act %d \n", enType, uiTempType);
  73. if (uiTempType < enType)
  74. {
  75. /* get next header */
  76. uiTempAddr = uiTempAddr + 0x10;
  77. continue;
  78. }
  79. else if (uiTempType > enType)
  80. {
  81. break;
  82. }
  83. else
  84. {
  85. if (uiTempInode < uiIndex)
  86. {
  87. /* get next header */
  88. uiTempAddr = uiTempAddr + 0x10;
  89. continue;
  90. }
  91. else if (uiTempInode > uiIndex)
  92. {
  93. break;
  94. }
  95. else
  96. {
  97. *puiSize = *(UCHAR8 *)(uiTempAddr + 8) << 24;
  98. *puiSize |= *(UCHAR8 *)(uiTempAddr + 9) << 16;
  99. *puiSize |= *(UCHAR8 *)(uiTempAddr + 10) << 8;
  100. *puiSize |= *(UCHAR8 *)(uiTempAddr + 11) << 0;
  101. uiOffset = *(UCHAR8 *)(uiTempAddr + 12) << 24;
  102. uiOffset |= *(UCHAR8 *)(uiTempAddr + 13) << 16;
  103. uiOffset |= *(UCHAR8 *)(uiTempAddr + 14) << 8;
  104. uiOffset |= *(UCHAR8 *)(uiTempAddr + 15) << 0;
  105. *puiAddr = uiOffset + HV_MEMORY_CONFIG_PQ_DATA_START;
  106. HV_LOGV("header uiOffset %x, size %d \n", uiOffset, *puiSize);
  107. return HV_SUCCESS;
  108. }
  109. }
  110. }
  111. return HV_FAILURE;
  112. }
  113. /**
  114. * @brief show pq table addr & size
  115. */
  116. Status Hv_Pq_ShowTable(void)
  117. {
  118. UINT32 uiTempAddr = 0;
  119. UINT32 uiStartAddr = 0;
  120. UINT32 uiTempType = 0;
  121. UINT32 uiTempInode = 0;
  122. UINT32 uiOffset = 0;
  123. UINT32 uiSize = 0;
  124. uiTempAddr = HV_MEMORY_CONFIG_PQ_DATA_START;
  125. uiStartAddr = uiTempAddr;
  126. HV_LOGI("base addr %x\n", uiTempAddr);
  127. for (;;)
  128. {
  129. HV_LOGI("header addr %x\n", uiTempAddr);
  130. if (uiTempAddr > uiStartAddr + 0x1000)
  131. {
  132. break;
  133. }
  134. /* check header magic */
  135. if (*(UCHAR8 *)(uiTempAddr) != 'H')
  136. {
  137. return HV_FAILURE;
  138. }
  139. if (*(UCHAR8 *)(uiTempAddr + 1) != 'E')
  140. {
  141. return HV_FAILURE;
  142. }
  143. if (*(UCHAR8 *)(uiTempAddr + 2) != 'A')
  144. {
  145. return HV_FAILURE;
  146. }
  147. if (*(UCHAR8 *)(uiTempAddr + 3) != 'D')
  148. {
  149. return HV_FAILURE;
  150. }
  151. /* check type */
  152. uiTempType = *(UCHAR8 *)(uiTempAddr + 4) << 8;
  153. uiTempType |= *(UCHAR8 *)(uiTempAddr + 5) << 0;
  154. uiTempInode = *(UCHAR8 *)(uiTempAddr + 6) << 8;
  155. uiTempInode |= *(UCHAR8 *)(uiTempAddr + 7) << 0;
  156. uiSize = *(UCHAR8 *)(uiTempAddr + 8) << 24;
  157. uiSize |= *(UCHAR8 *)(uiTempAddr + 9) << 16;
  158. uiSize |= *(UCHAR8 *)(uiTempAddr + 10) << 8;
  159. uiSize |= *(UCHAR8 *)(uiTempAddr + 11) << 0;
  160. uiOffset = *(UCHAR8 *)(uiTempAddr + 12) << 24;
  161. uiOffset |= *(UCHAR8 *)(uiTempAddr + 13) << 16;
  162. uiOffset |= *(UCHAR8 *)(uiTempAddr + 14) << 8;
  163. uiOffset |= *(UCHAR8 *)(uiTempAddr + 15) << 0;
  164. HV_LOGI("header %d, index %d, offset %x, size %x\n", uiTempType, uiTempInode, uiOffset, uiSize);
  165. uiTempAddr = uiTempAddr + 0x10;
  166. }
  167. return HV_SUCCESS;
  168. }
  169. /**
  170. * @brief get code superblock version.
  171. */
  172. UINT32 Hv_Comm_GetCodeVersion(void)
  173. {
  174. UINT32 uiVersion = 0;
  175. UCHAR8 aucData[4] = {0};
  176. Hv_Drv_Flash_OnlyRead((HV_FLASH_CONFIG_SUPERBLOCK_START + 0x60 + 0x1c), aucData, 4);
  177. uiVersion = aucData[0]<<24 | aucData[1]<<16 | aucData[2]<<8 | aucData[3];
  178. HV_LOGV(">>> get version %x\n", uiVersion);
  179. return uiVersion;
  180. }
  181. void Hv_Comm_Copy(INT32 *iSrc, INT32 *iDst, INT32 iSize)
  182. {
  183. INT32 iLoop = 0;
  184. for (iLoop=0; iLoop<iSize/4; iLoop++)
  185. {
  186. *iDst = *iSrc;
  187. iSrc++;
  188. iDst++;
  189. }
  190. return;
  191. }
  192. void Hv_Comm_CopyLogoData(void)
  193. {
  194. Hv_Comm_Copy((INT32 *)(HV_FLASH_CONFIG_LOGO_PART_START+ HV_FLASH_CONFIG_START_XIP),(INT32 *)(HV_MEMORY_CONFIG_OSD_LOGO_DDR_START), HV_FLASH_CONFIG_LOGO_PART_SIZE);
  195. return;
  196. }
  197. UINT32 Hv_Board_Memory_CalculateOsdBlendSize(VOID)
  198. {
  199. #if (HV_PROJECT_CONFIG_OSD_DDRPATH == HV_CONFIG_ON)
  200. return (PANEL_OSD_H_ACTIVE * PANEL_OSD_V_ACTIVE * HV_OSD_CONFIG_DDR_PIXEL_BYTES * 2);
  201. #else
  202. return 0;
  203. #endif
  204. }
  205. UINT32 Hv_Board_Memory_CalculateOsdRotationSize(VOID)
  206. {
  207. #if (HV_PROJECT_CONFIG_OSD_ROTATION == HV_CONFIG_ON)
  208. return (HV_OSD_CONFIG_ROTATION_H_ACTIVE * HV_OSD_CONFIG_ROTATION_V_ACTIVE * HV_OSD_CONFIG_DDR_PIXEL_BYTES);
  209. #else
  210. return 0;
  211. #endif
  212. }
  213. UINT32 Hv_Board_Memory_CalculateOsdGraphicSize(VOID)
  214. {
  215. #if (HV_PROJECT_CONFIG_OSD_GRAPHIC == HV_CONFIG_ON)
  216. return (HV_OSD_CONFIG_GRAPHIC_H_ACTIVE * HV_OSD_CONFIG_GRAPHIC_V_ACTIVE * HV_OSD_CONFIG_GRAPHIC_PIXEL_BYTES);
  217. #else
  218. return 0;
  219. #endif
  220. }
  221. UINT32 Hv_Board_Memory_CalculateSizeForOsd(VOID)
  222. {
  223. UINT32 uiDDRSize = Hv_Board_Memory_CalculateOsdBlendSize();
  224. UINT32 uiRotationSize = Hv_Board_Memory_CalculateOsdRotationSize();
  225. UINT32 uiGraphicSize = Hv_Board_Memory_CalculateOsdGraphicSize();
  226. HV_LOGV("Osd DDR size: %u", uiDDRSize);
  227. HV_LOGV("OSD Rotation Size: %u", uiRotationSize);
  228. HV_LOGV("OSD Graphic Size: %u", uiGraphicSize);
  229. return uiDDRSize + uiRotationSize + uiGraphicSize;
  230. }
  231. FLOAT32 Hv_Board_Memory_CalculateBandForOsd(UINT32 uiVideoFrameRate)
  232. {
  233. UCHAR8 ucOsdFrameRate = 0;
  234. FLOAT32 fBandWidth = 0;
  235. UINT32 fBandDDRR = 0;
  236. UINT32 fBandDDRW = 0;
  237. UINT32 fBandGraphic = 0;
  238. UCHAR8 ucBits = 0;
  239. ucOsdFrameRate = Hv_Drv_OsdFrame_GetOsdFrameRate(uiVideoFrameRate, HV_FALSE);
  240. #if (HV_PROJECT_CONFIG_OSD_DDRPATH == HV_CONFIG_ON)
  241. ucBits = Hv_Drv_OsdCommon_GetPixelBits(HV_OSD_CONFIG_DDR_FORMAT);
  242. fBandDDRW = (ucOsdFrameRate * PANEL_OSD_H_ACTIVE * PANEL_OSD_V_TOTAL * ucBits) / 8;
  243. HV_LOGV("DDR Write Bandwidth: %u", fBandDDRW);
  244. fBandDDRW /= 1000000;
  245. fBandDDRR = (uiVideoFrameRate * PANEL_OSD_H_ACTIVE * PANEL_V_TOTAL_TYP * ucBits) / 8;
  246. HV_LOGV("DDR Read Bandwidth: %u", fBandDDRR);
  247. fBandDDRR /= 1000000;
  248. #endif /* HV_PROJECT_CONFIG_OSD_DDRPATH */
  249. #if (HV_PROJECT_CONFIG_OSD_GRAPHIC == HV_CONFIG_ON)
  250. ucBits = Hv_Drv_OsdCommon_GetPixelBits(HV_OSD_CONFIG_GRAPHIC_FORMAT);
  251. fBandGraphic = (ucOsdFrameRate * PANEL_OSD_H_ACTIVE * PANEL_OSD_V_TOTAL * ucBits) / 8;
  252. HV_LOGV("Graphic Read Bandwidth: %u", fBandGraphic);
  253. fBandGraphic /= 1000000;
  254. #endif
  255. fBandWidth = fBandDDRR + fBandDDRW + fBandGraphic;
  256. return fBandWidth;
  257. }
  258. /* 3840*2250*24/8/5.83 */
  259. UINT32 Hv_Board_Memory_CalODSize(VOID)
  260. {
  261. FLOAT32 ufOdSize = 0;
  262. UINT32 uiOdSize = 0;
  263. #ifdef CONFIG_USER_PANEL_RESOLUTION_TYPE_UHD
  264. uiOdSize = 0x413000;
  265. #endif
  266. #ifdef CONFIG_USER_PANEL_RESOLUTION_TYPE_QHD
  267. uiOdSize = 0x1D0000;
  268. #endif
  269. #ifdef CONFIG_USER_PANEL_RESOLUTION_TYPE_FHD
  270. uiOdSize = 0x110000;
  271. #endif
  272. #ifdef CONFIG_USER_PANEL_RESOLUTION_TYPE_CUSTOMIZE
  273. ufOdSize = HV_PROJECT_CONFIG_PANEL_H_ACTIVE_CUSTOMIZE * HV_PROJECT_CONFIG_PANEL_V_ACTIVE_CUSTOMIZE * 1.1 * 24 /8 /5.83;
  274. uiOdSize = ((UINT32)ufOdSize + 0xFFF) >> 12 << 12;
  275. HV_LOGI("OD size: %x\n", uiOdSize);
  276. #endif
  277. return uiOdSize;
  278. }
  279. /* 3840*2250*24/8/5.83 */
  280. FLOAT32 Hv_Board_Memory_CalODBand(VOID)
  281. {
  282. FLOAT32 ufOdBand = 0;
  283. #ifdef CONFIG_USER_PANEL_RESOLUTION_TYPE_UHD
  284. ufOdBand = 71.14;
  285. #endif
  286. #ifdef CONFIG_USER_PANEL_RESOLUTION_TYPE_QHD
  287. ufOdBand = 31.20;
  288. #endif
  289. #ifdef CONFIG_USER_PANEL_RESOLUTION_TYPE_FHD
  290. ufOdBand = 17.79;
  291. #endif
  292. #ifdef CONFIG_USER_PANEL_RESOLUTION_TYPE_CUSTOMIZE
  293. ufOdBand = HV_PROJECT_CONFIG_PANEL_H_ACTIVE_CUSTOMIZE * HV_PROJECT_CONFIG_PANEL_V_ACTIVE_CUSTOMIZE * 1.1 *24 *2 /5.83 /1000 /1000;
  294. HV_LOGI("OD band: %x\n", ufOdBand);
  295. #endif
  296. return ufOdBand;
  297. }
  298. /* 30*481*271/8 */
  299. UINT32 Hv_Board_Memory_CalDemuraSize(VOID)
  300. {
  301. FLOAT32 ufDemuraSize = 0;
  302. UINT32 uiDemuraSize = 0;
  303. #ifdef DEMURA_COLOR_MODE
  304. UCHAR8 ucColorModeMul = (DEMURA_COLOR_MODE == 0) ? 1 : 3;
  305. #else
  306. UCHAR8 ucColorModeMul = 1;
  307. #endif
  308. #ifdef CONFIG_USER_PANEL_RESOLUTION_TYPE_UHD
  309. uiDemuraSize = 0x80000;
  310. #endif
  311. #ifdef CONFIG_USER_PANEL_RESOLUTION_TYPE_QHD
  312. uiDemuraSize = 0x36000;
  313. #endif
  314. #ifdef CONFIG_USER_PANEL_RESOLUTION_TYPE_FHD
  315. uiDemuraSize = 0x1F000;
  316. #endif
  317. #ifdef CONFIG_USER_PANEL_RESOLUTION_TYPE_CUSTOMIZE
  318. uiDemuraSize = (HV_PROJECT_CONFIG_PANEL_H_ACTIVE_CUSTOMIZE+7)/8 * (HV_PROJECT_CONFIG_PANEL_V_ACTIVE_CUSTOMIZE+7)/8;
  319. ufDemuraSize = uiDemuraSize * 1.1 * 30 /8;
  320. uiDemuraSize = ((UINT32)ufDemuraSize + 0xFFF) >> 12 << 12;
  321. HV_LOGI("Demura size: %x\n", uiDemuraSize);
  322. #endif
  323. return (uiDemuraSize * ucColorModeMul);
  324. }
  325. /* 321*186*30*Freq/1000/1000 */
  326. FLOAT32 Hv_Board_Memory_CalDemuraBand(VOID)
  327. {
  328. FLOAT32 ufDemuraBand = 0;
  329. #ifdef DEMURA_COLOR_MODE
  330. UCHAR8 ucColorModeMul = (DEMURA_COLOR_MODE == 0) ? 1 : 3;
  331. #else
  332. UCHAR8 ucColorModeMul = 1;
  333. #endif
  334. #ifdef CONFIG_USER_PANEL_RESOLUTION_TYPE_UHD
  335. ufDemuraBand = 4.07;
  336. #endif
  337. #ifdef CONFIG_USER_PANEL_RESOLUTION_TYPE_QHD
  338. ufDemuraBand = 1.80;
  339. #endif
  340. #ifdef CONFIG_USER_PANEL_RESOLUTION_TYPE_FHD
  341. ufDemuraBand = 1.03;
  342. #endif
  343. #ifdef CONFIG_USER_PANEL_RESOLUTION_TYPE_CUSTOMIZE
  344. ufDemuraBand = (HV_PROJECT_CONFIG_PANEL_H_ACTIVE_CUSTOMIZE+7)/8 * (HV_PROJECT_CONFIG_PANEL_V_ACTIVE_CUSTOMIZE+7)/8 * 1.1 *30 /1000 /1000;
  345. HV_LOGI("Demura band: %x\n", ufDemuraBand);
  346. #endif
  347. return (ufDemuraBand * ucColorModeMul);
  348. }
  349. /* return address */
  350. UINT32 Hv_Board_Memory_FRCStart(void)
  351. {
  352. UINT32 uiDDRStart = 0;
  353. UINT32 uiOsdSize = 0;
  354. UINT32 uiOdSize = 0;
  355. uiDDRStart += HV_MEMORY_CONFIG_STATIC_DDR_SIZE;
  356. uiDDRStart += Hv_Board_Memory_CalDemuraSize();
  357. uiOsdSize = Hv_Board_Memory_CalculateSizeForOsd();
  358. uiOdSize = Hv_Board_Memory_CalODSize();
  359. if (uiOsdSize < uiOdSize)
  360. {
  361. uiOsdSize = uiOdSize;
  362. }
  363. uiDDRStart += uiOsdSize;
  364. return PHY_TO_VDM(uiDDRStart);
  365. }
  366. /* return bytes */
  367. UINT32 Hv_Board_Memory_RemainSizeForFRC(void)
  368. {
  369. UINT32 uiFRCSize = 0;
  370. uiFRCSize = PHY_TO_VDM(HV_MEMORY_CONFIG_DDR_SIZE) - Hv_Board_Memory_FRCStart();
  371. return uiFRCSize;
  372. }
  373. /* return xxMbit/s */
  374. UINT32 Hv_Board_Memory_RemainBandForFRC(UINT32 PanelFreq)
  375. {
  376. float fDDRBand = 0;
  377. float fOsdBand = 0;
  378. float fOdBand = 0;
  379. UINT32 uiFrcBand = 0;
  380. UINT32 uiDDRFreq = 0;
  381. float fDDRRatio = 0;
  382. UCHAR8 ucDDRType = 0;
  383. ucDDRType = Hv_Ddr_Type();
  384. if (ucDDRType)
  385. {
  386. uiDDRFreq = HV_MEMORY_CONFIG_DDR3_FREQ;
  387. fDDRRatio = HV_MEMORY_CONFIG_DDR3_UTILIZATION_RATIO;
  388. }
  389. else
  390. {
  391. uiDDRFreq = HV_MEMORY_CONFIG_DDR2_FREQ;
  392. fDDRRatio = HV_MEMORY_CONFIG_DDR2_UTILIZATION_RATIO;
  393. }
  394. fDDRBand += HV_MEMORY_CONFIG_STATIC_DDR_BANDWIDTH;
  395. fDDRBand += PanelFreq * Hv_Board_Memory_CalDemuraBand();
  396. fOsdBand = Hv_Board_Memory_CalculateBandForOsd(PanelFreq);
  397. fOdBand = Hv_Board_Memory_CalODBand() * PanelFreq;
  398. if (fOsdBand < fOdBand)
  399. {
  400. fOsdBand = fOdBand;
  401. }
  402. fDDRBand += fOsdBand;
  403. uiFrcBand = (UINT32 )(uiDDRFreq * HV_MEMORY_CONFIG_DDR_PHY * fDDRRatio - fDDRBand);
  404. return uiFrcBand;
  405. }
  406. /* magic number(32bit),main type(8bit), subtype(8bit),起始位置(8bit),终止位置(8bit),寄存器地址(32bit),值(32bit)*/
  407. #define PER_SIZE 16
  408. VOID Hv_Comm_SetHotfixRegister(UCHAR8 ucMain, UCHAR8 ucSub)
  409. {
  410. UCHAR8 ucStart = 0;
  411. UCHAR8 ucEnd = 0;
  412. INT32 iIndex = 0;
  413. INT32 iCount = 0;
  414. UINT32 uRegister = 0;
  415. UINT32 uValue = 0;
  416. UINT32 uMask = 0;
  417. UCHAR8 *pPostison = (UCHAR8 *)HV_MEMORY_CONFIG_MONITOR_HOTFIX_START;
  418. HV_LOGV("fire main: %d, sub %d\n", ucMain, ucSub);
  419. if (ucMain > PER_SIZE)
  420. {
  421. HV_LOGI("wrong main type\n", ucMain);
  422. return;
  423. }
  424. /* 16bytes per title, 16 titles per type. */
  425. pPostison += ucMain << 4 << 4;
  426. HV_LOGV("positon 0x%x\n", (UINT32)pPostison);
  427. for (iIndex=0; iIndex<PER_SIZE; iIndex++, pPostison+=PER_SIZE)
  428. {
  429. HV_LOGV("index %x\n", iIndex);
  430. /* FIRE or fire */
  431. if ((*(UINT32*)pPostison != 0x45524946)
  432. &(*(UINT32*)pPostison != 0x65726966))
  433. {
  434. HV_LOGV("no magic\n", iIndex);
  435. break;
  436. }
  437. if (pPostison[4] != ucMain)
  438. {
  439. HV_LOGV("main dismatch\n");
  440. continue;
  441. }
  442. if (pPostison[5] != ucSub)
  443. {
  444. HV_LOGV("sub dismatch\n");
  445. /* bin has sorted */
  446. break;
  447. }
  448. ucStart = pPostison[6];
  449. ucEnd = pPostison[7];
  450. if (ucStart > 31)
  451. {
  452. HV_LOGV("start err\n");
  453. continue;
  454. }
  455. if (ucEnd > 31)
  456. {
  457. HV_LOGV("end err\n");
  458. continue;
  459. }
  460. if (ucStart > ucEnd)
  461. {
  462. HV_LOGV("s > e\n");
  463. continue;
  464. }
  465. uRegister = *(UINT32*)(pPostison+8);
  466. uValue = *(UINT32*)(pPostison+12);
  467. uMask = ((1U << (ucEnd - ucStart + 1)) - 1);
  468. if (ucEnd - ucStart == 31)
  469. {
  470. uMask = 0xFFFFFFFF;
  471. }
  472. if (uValue > uMask)
  473. {
  474. HV_LOGV("value err\n");
  475. continue;
  476. }
  477. HV_LOGV("fire register: 0x%x, at bit%x, 0x%x\n", uRegister, ucStart, uValue);
  478. uMask = uMask << ucStart;
  479. uValue = uValue << ucStart;
  480. HV_W32_MASK(uRegister, uMask, uValue);
  481. }
  482. return;
  483. }