g2d_bld.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636
  1. /*
  2. * g2d_bld/g2d_bld.c
  3. *
  4. * Copyright (c) 2007-2019 Allwinnertech Co., Ltd.
  5. * Author: zhengxiaobin <zhengxiaobin@allwinnertech.com>
  6. *
  7. * This software is licensed under the terms of the GNU General Public
  8. * License version 2, as published by the Free Software Foundation, and
  9. * may be copied, distributed, and modified under those terms.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. */
  17. #include <stdlib.h>
  18. #include "g2d_bld.h"
  19. __s32 rgb2Ycbcr_709[12] = {
  20. 0x0bb, 0x0275, 0x03f, 0x4200, 0xFFFFFF99, 0xFFFFFEA6, 0x01c2, 0x20200,
  21. 0x01c2, 0xFFFFFE67, 0xFFFFFFD7, 0x20200, };
  22. __s32 Ycbcr2rgb_709[12] = {
  23. 0x04a8, 0x0, 0x072c, 0xFFFC1F7D, 0x04a8, 0xFFFFFF26, 0xFFFFFDDD,
  24. 0x133F8, 0x04a8, 0x0876, 0, 0xFFFB7AA0, };
  25. __s32 rgb2Ycbcr_601[12] = {
  26. 0x0107, 0x0204, 0x064, 0x4200,
  27. 0xFFFFFF68, 0xFFFFFED6, 0x01c2, 0x20200,
  28. 0x01c2, 0xFFFFFE87, 0xFFFFFFB7, 0x20200,};
  29. __s32 Ycbcr2rgb_601[12] = {
  30. 0x04a8, 0x0, 0x0662, 0xFFFC865A,
  31. 0x04a8, 0xFFFFFE70, 0xFFFFFCBF, 0x21FF4,
  32. 0x04a8, 0x0812, 0x0, 0xFFFBAE4A,};
  33. /*
  34. * sel: 0-->pipe0 1-->pipe1 other:error
  35. */
  36. __s32 bld_in_set(struct blender_submodule *p_bld, __u32 sel, g2d_rect rect,
  37. int premul)
  38. {
  39. __s32 ret = -1;
  40. struct g2d_mixer_bld_reg *p_reg = NULL;
  41. p_reg = p_bld->get_reg(p_bld);
  42. if (!p_reg)
  43. goto OUT;
  44. if (sel == 0) {
  45. p_reg->bld_en_ctrl.bits.p0_en = 1;
  46. /* we best use p0 as bottom layer */
  47. p_reg->bld_en_ctrl.bits.p0_fcen = 1;
  48. if (premul)
  49. p_reg->premulti_ctrl.bits.p0_alpha_mode = 1;
  50. } else if (sel == 1) {
  51. p_reg->bld_en_ctrl.bits.p1_en = 1;
  52. if (premul)
  53. p_reg->premulti_ctrl.bits.p1_alpha_mode = 1;
  54. } else
  55. goto OUT;
  56. p_reg->mem_size[sel].bits.width = rect.w - 1;
  57. p_reg->mem_size[sel].bits.height = rect.h - 1;
  58. p_reg->mem_coor[sel].bits.xcoor = rect.x <= 0 ? 0 : rect.x - 1;
  59. p_reg->mem_coor[sel].bits.ycoor = rect.y <= 0 ? 0 : rect.y - 1;
  60. ret = 0;
  61. p_bld->set_block_dirty(p_bld, 0, 1);
  62. OUT:
  63. return ret;
  64. }
  65. /**
  66. * set colorkey para.
  67. */
  68. __s32 bld_ck_para_set(struct blender_submodule *p_bld, g2d_ck *para, __u32 flag)
  69. {
  70. __u32 tmp = 0x0;
  71. __s32 ret = -1;
  72. struct g2d_mixer_bld_reg *p_reg = NULL;
  73. p_reg = p_bld->get_reg(p_bld);
  74. if (!p_reg || !para)
  75. goto OUT;
  76. if (para->match_rule)
  77. tmp = 0x7;
  78. p_reg->color_key_cfg.dwval = tmp;
  79. p_reg->color_key_max.dwval = para->max_color & 0x00ffffff;
  80. p_reg->color_key_min.dwval = para->min_color & 0x00ffffff;
  81. if (flag & G2D_CK_SRC) {
  82. p_reg->color_key.bits.key0_en = 1;
  83. p_reg->color_key.bits.key0_match_dir = 0;
  84. } else if (flag & G2D_CK_DST) {
  85. p_reg->color_key.bits.key0_en = 1;
  86. p_reg->color_key.bits.key0_match_dir = 1;
  87. }
  88. p_bld->set_block_dirty(p_bld, 0, 1);
  89. OUT:
  90. return ret;
  91. }
  92. /**
  93. * background color set
  94. */
  95. __s32 bld_bk_set(struct blender_submodule *p_bld, __u32 color)
  96. {
  97. __s32 ret = -1;
  98. struct g2d_mixer_bld_reg *p_reg = NULL;
  99. p_reg = p_bld->get_reg(p_bld);
  100. if (!p_reg)
  101. goto OUT;
  102. p_reg->bld_backgroud_color = color & 0xffffffff;
  103. ret = 0;
  104. p_bld->set_block_dirty(p_bld, 0, 1);
  105. OUT:
  106. return ret;
  107. }
  108. __s32 bld_out_setting(struct blender_submodule *p_bld, g2d_image_enh *p_image)
  109. {
  110. __s32 ret = -1;
  111. struct g2d_mixer_bld_reg *p_reg = NULL;
  112. p_reg = p_bld->get_reg(p_bld);
  113. if (!p_reg)
  114. goto OUT;
  115. if (p_image->bpremul)
  116. p_reg->out_color.bits.premul_en = 1;
  117. else
  118. p_reg->out_color.bits.premul_en = 0;
  119. p_reg->out_size.bits.width =
  120. p_image->clip_rect.w == 0 ? 0 : p_image->clip_rect.w - 1;
  121. p_reg->out_size.bits.height =
  122. p_image->clip_rect.h == 0 ? 0 : p_image->clip_rect.h - 1;
  123. p_bld->set_block_dirty(p_bld, 0, 1);
  124. ret = 0;
  125. OUT:
  126. return ret;
  127. }
  128. __s32 bld_set_rop_ctrl(struct blender_submodule *p_bld, __u32 value)
  129. {
  130. __s32 ret = -1;
  131. struct g2d_mixer_bld_reg *p_reg = NULL;
  132. p_reg = p_bld->get_reg(p_bld);
  133. if (!p_reg)
  134. goto OUT;
  135. p_reg->rop_ctrl.dwval = value;
  136. p_reg->ch3_index0.dwval = 0x41000;
  137. ret = 0;
  138. p_bld->set_block_dirty(p_bld, 0, 1);
  139. OUT:
  140. return ret;
  141. }
  142. /**
  143. * set the bld color space based on the format
  144. * if the format is UI, then set the bld in RGB color space
  145. * if the format is Video, then set the bld in YUV color space
  146. */
  147. __s32 bld_cs_set(struct blender_submodule *p_bld, __u32 format)
  148. {
  149. __s32 ret = -1;
  150. struct g2d_mixer_bld_reg *p_reg = NULL;
  151. p_reg = p_bld->get_reg(p_bld);
  152. if (!p_reg)
  153. goto OUT;
  154. if (format <= G2D_FORMAT_BGRA1010102) {
  155. p_reg->out_color.bits.alpha_mode = 0;
  156. } else if (format <= G2D_FORMAT_YUV411_PLANAR) {
  157. p_reg->out_color.bits.alpha_mode = 1;
  158. } else
  159. goto OUT;
  160. p_bld->set_block_dirty(p_bld, 0, 1);
  161. ret = 0;
  162. OUT:
  163. return ret;
  164. }
  165. /**
  166. * @csc_no: CSC ID, G2D support three CSC,
  167. * -1 will return to indicate inappropriate CSC number.
  168. * @csc_sel: CSC format, G2D support the ITU-R 601. ITU-R 709. standard trans-
  169. * form between RGB and YUV colorspace.
  170. */
  171. __s32 bld_csc_reg_set(struct blender_submodule *p_bld, __u32 csc_no, g2d_csc_sel csc_sel)
  172. {
  173. void *csc_base_addr;
  174. __s32 ret = -1;
  175. struct g2d_mixer_bld_reg *p_reg = NULL;
  176. p_reg = p_bld->get_reg(p_bld);
  177. if (!p_reg)
  178. goto OUT;
  179. p_reg->bld_fill_color[0] = 0x00108080;
  180. p_reg->bld_fill_color[1] = 0x00108080;
  181. switch (csc_no) {
  182. case 0:
  183. csc_base_addr = &p_reg->csc0_coeff0_reg0;
  184. p_reg->cs_ctrl.bits.cs0_en = 1;
  185. break;
  186. case 1:
  187. csc_base_addr = &p_reg->csc1_coeff0_reg0;
  188. p_reg->cs_ctrl.bits.cs1_en = 1;
  189. break;
  190. case 2:
  191. csc_base_addr = &p_reg->csc2_coeff0_reg0;
  192. p_reg->cs_ctrl.bits.cs2_en = 1;
  193. break;
  194. default:
  195. goto OUT;
  196. }
  197. switch (csc_sel) {
  198. case G2D_RGB2YUV_709:
  199. memcpy(csc_base_addr, rgb2Ycbcr_709, 12 * sizeof(unsigned int));
  200. break;
  201. case G2D_YUV2RGB_709:
  202. memcpy(csc_base_addr, Ycbcr2rgb_709, 12 * sizeof(unsigned int));
  203. break;
  204. case G2D_RGB2YUV_601:
  205. memcpy(csc_base_addr, rgb2Ycbcr_601, 12 * sizeof(unsigned int));
  206. break;
  207. case G2D_YUV2RGB_601:
  208. memcpy(csc_base_addr, Ycbcr2rgb_601, 12 * sizeof(unsigned int));
  209. break;
  210. default:
  211. G2D_ERR_MSG("No implement standard:%d!\n", csc_sel);
  212. goto OUT;
  213. }
  214. p_bld->set_block_dirty(p_bld, 0, 1);
  215. ret = 0;
  216. OUT:
  217. return ret;
  218. }
  219. __s32 bld_porter_duff(struct blender_submodule *p_bld, __u32 cmd)
  220. {
  221. struct g2d_mixer_bld_reg *p_reg = NULL;
  222. __s32 ret = -1;
  223. p_reg = p_bld->get_reg(p_bld);
  224. if (!p_reg)
  225. goto OUT;
  226. switch (cmd) {
  227. case G2D_BLD_CLEAR:
  228. p_reg->bld_ctrl.dwval = 0x00000000;
  229. break;
  230. case G2D_BLD_COPY:
  231. p_reg->bld_ctrl.dwval = 0x00010001;
  232. break;
  233. case G2D_BLD_DST:
  234. p_reg->bld_ctrl.dwval = 0x01000100;
  235. break;
  236. case G2D_BLD_SRCOVER:
  237. p_reg->bld_ctrl.dwval = 0x03010301;
  238. break;
  239. case G2D_BLD_DSTOVER:
  240. p_reg->bld_ctrl.dwval = 0x01030103;
  241. break;
  242. case G2D_BLD_SRCIN:
  243. p_reg->bld_ctrl.dwval = 0x00020002;
  244. break;
  245. case G2D_BLD_DSTIN:
  246. p_reg->bld_ctrl.dwval = 0x02000200;
  247. break;
  248. case G2D_BLD_SRCOUT:
  249. p_reg->bld_ctrl.dwval = 0x00030003;
  250. break;
  251. case G2D_BLD_DSTOUT:
  252. p_reg->bld_ctrl.dwval = 0x03000300;
  253. break;
  254. case G2D_BLD_SRCATOP:
  255. p_reg->bld_ctrl.dwval = 0x03020302;
  256. break;
  257. case G2D_BLD_DSTATOP:
  258. p_reg->bld_ctrl.dwval = 0x02030203;
  259. break;
  260. case G2D_BLD_XOR:
  261. p_reg->bld_ctrl.dwval = 0x03030303;
  262. break;
  263. default:
  264. p_reg->bld_ctrl.dwval = 0x03010301;
  265. }
  266. p_bld->set_block_dirty(p_bld, 0, 1);
  267. ret = 0;
  268. OUT:
  269. return ret;
  270. }
  271. int bld_rcq_setup(struct blender_submodule *p_bld, u8 *base,
  272. struct g2d_rcq_mem_info *p_rcq_info)
  273. {
  274. u8 *reg_base = base + G2D_BLD;
  275. int ret = -1;
  276. if (!p_bld) {
  277. G2D_ERR_MSG("Null pointer!\n");
  278. goto OUT;
  279. }
  280. p_bld->reg_info->size = sizeof(struct g2d_mixer_bld_reg);
  281. p_bld->reg_info->vir_addr = (u8 *)g2d_top_reg_memory_alloc(
  282. p_bld->reg_info->size, (void *)&(p_bld->reg_info->phy_addr),
  283. p_rcq_info);
  284. if (!p_bld->reg_info->vir_addr) {
  285. G2D_ERR_MSG("Malloc blender reg rcq memory fail!\n");
  286. goto OUT;
  287. }
  288. p_bld->reg_blks->vir_addr = p_bld->reg_info->vir_addr;
  289. p_bld->reg_blks->phy_addr = p_bld->reg_info->phy_addr;
  290. p_bld->reg_blks->size = p_bld->reg_info->size;
  291. p_bld->reg_blks->reg_addr = reg_base;
  292. ret = 0;
  293. OUT:
  294. return ret;
  295. }
  296. /**
  297. * ROP2 cmd register set
  298. * Index0 is selected
  299. * dst mapping ch0'
  300. * src mapping ch1'
  301. */
  302. __s32 bld_rop2_set(struct blender_submodule *p_bld, __u32 rop_cmd)
  303. {
  304. __s32 ret = -1;
  305. struct g2d_mixer_bld_reg *p_reg = p_bld->get_reg(p_bld);
  306. p_reg = p_bld->get_reg(p_bld);
  307. if (!p_reg)
  308. goto OUT;
  309. if (rop_cmd == G2D_BLT_BLACKNESS) {
  310. /* blackness */
  311. /* tmpue = 0x1<<18; */
  312. p_reg->ch3_index0.dwval = 0x40000;
  313. } else if (rop_cmd == G2D_BLT_NOTMERGEPEN) {
  314. /* ~(dst | src) */
  315. /* tmpue = (0x1<<6) | (0x1<<10) | (0x2<<11) | (0x1<<18); */
  316. p_reg->ch3_index0.dwval = 0x41440;
  317. } else if (rop_cmd == G2D_BLT_MASKNOTPEN) {
  318. /* ~src&dst */
  319. /* tmpue = (0x1<<4) | (0x0<<10) | (0x2<<11) | (0x1<<18); */
  320. p_reg->ch3_index0.dwval = 0x41010;
  321. } else if (rop_cmd == G2D_BLT_NOTCOPYPEN) {
  322. /* ~src */
  323. /* tmpue = (0x1<<4) | (0x2<<6) | (0x2<<11) |
  324. * (0x1<<18) | (0x1<<17);
  325. */
  326. p_reg->ch3_index0.dwval = 0x61090;
  327. } else if (rop_cmd == G2D_BLT_MASKPENNOT) {
  328. /* src&~dst */
  329. /* tmpue = (0x1<<3) | (0x0<<10) | (0x2<<11) | (0x1<<18); */
  330. p_reg->ch3_index0.dwval = 0x41008;
  331. } else if (rop_cmd == G2D_BLT_NOT) {
  332. /* ~dst */
  333. /* tmpue = (0x1<<3) | (0x2<<6) | (0x2<<11) |
  334. * (0x1<<18) | (0x1<<16);
  335. */
  336. p_reg->ch3_index0.dwval = 0x51088;
  337. } else if (rop_cmd == G2D_BLT_XORPEN) {
  338. /* src xor dst */
  339. /* tmpue = (0x2<<6) | (0x2<<11) | (0x1<<18); */
  340. p_reg->ch3_index0.dwval = 0x41080;
  341. } else if (rop_cmd == G2D_BLT_NOTMASKPEN) {
  342. /* ~(src & dst) */
  343. /* tmpue = (0x0<<6) | (0x1<<10) | (0x2<<11) | (0x1<<18); */
  344. p_reg->ch3_index0.dwval = 0x41400;
  345. } else if (rop_cmd == G2D_BLT_MASKPEN) {
  346. /* src&dst */
  347. /* tmpue = (0x0<<6) | (0x2<<11) | (0x1<<18); */
  348. p_reg->ch3_index0.dwval = 0x41000;
  349. } else if (rop_cmd == G2D_BLT_NOTXORPEN) {
  350. /* ~(src xor dst) */
  351. /* tmpue = (0x2<<6) | (0x1<<10) | (0x2<<11) | (0x1<<18); */
  352. p_reg->ch3_index0.dwval = 0x41480;
  353. } else if (rop_cmd == G2D_BLT_NOP) {
  354. /* dst */
  355. /* tmpue = (0x2<<6) | (0x2<<11) | (0x1<<18) | (0x1<<16); */
  356. p_reg->ch3_index0.dwval = 0x51080;
  357. } else if (rop_cmd == G2D_BLT_MERGENOTPEN) {
  358. /* ~dst or src */
  359. /* tmpue = (0x1<<3)| (0x1<<6) | (0x2<<11) | (0x1<<18) */
  360. /* write_wvalue(ROP_INDEX0, 0x40A20); */
  361. p_reg->ch3_index0.dwval = 0x41048;
  362. } else if (rop_cmd == G2D_BLT_COPYPEN) {
  363. /* src */
  364. /* tmpue = (0x2<<6) | (0x2<<11) | (0x1<<18) | (0x1<<17); */
  365. p_reg->ch3_index0.dwval = 0x61080;
  366. } else if (rop_cmd == G2D_BLT_MERGEPENNOT) {
  367. /* src or ~dst */
  368. /* tmpue = (0x1<<3)| (0x1<<6) | (0x2<<11) | (0x1<<18) */
  369. p_reg->ch3_index0.dwval = 0x41048;
  370. } else if (rop_cmd == G2D_BLT_MERGEPEN) {
  371. /* src or dst */
  372. /* tmpue = (0x1<<6) | (0x1<<18) | (0x2<<11); */
  373. p_reg->ch3_index0.dwval = 0x41040;
  374. } else if (rop_cmd == G2D_BLT_WHITENESS) {
  375. /* whiteness */
  376. /* tmpue = (0x1<<18) | (0x1<<15); */
  377. p_reg->ch3_index0.dwval = 0x48000;
  378. } else
  379. goto OUT;
  380. p_reg->ch3_index0.bits.index0node0 = 2; /*TODO:different with source*/
  381. p_bld->set_block_dirty(p_bld, 0, 1);
  382. ret = 0;
  383. OUT:
  384. return ret;
  385. }
  386. /**
  387. * ROP3 cmd register set
  388. * dst mapping ch0'
  389. * src mapping ch1'
  390. * ptn mapping ch2'
  391. * -1 return meaning that the operate is not supported by now
  392. */
  393. __s32 bld_rop3_set(struct blender_submodule *p_bld, __u32 sel, __u32 rop3_cmd)
  394. {
  395. __s32 ret = -1;
  396. union g2d_mixer_rop_ch3_index0 *p_addr = NULL;
  397. struct g2d_mixer_bld_reg *p_reg = p_bld->get_reg(p_bld);
  398. p_reg = p_bld->get_reg(p_bld);
  399. if (!p_reg)
  400. goto OUT;
  401. if (sel == 0)
  402. p_addr = &p_reg->ch3_index0;
  403. else if (sel == 1)
  404. p_addr = &p_reg->ch3_index1;
  405. else
  406. goto OUT;
  407. if (rop3_cmd == G2D_ROP3_BLACKNESS) {
  408. /* blackness */
  409. /* 0x1<<18; */
  410. p_addr->dwval = 0x40000;
  411. } else if (rop3_cmd == G2D_ROP3_NOTSRCERASE) {
  412. /* (~src) AND (~dst) */
  413. /* (0x1<<3) | (0x1<<4) | (0x1<<18) | (0x2<<11); */
  414. p_addr->dwval = 0x41018;
  415. } else if (rop3_cmd == G2D_ROP3_NOTSRCCOPY) {
  416. /* ~src */
  417. /* (0x1<<4) | (0x2<<6) | (0x2<<11) | (0x1<<18) | (0x1<<16); */
  418. p_addr->dwval = 0x51090;
  419. } else if (rop3_cmd == G2D_ROP3_SRCERASE) {
  420. /* src AND ~dst */
  421. /* (0x1<<3) | (0x0<<6) | (0x2<<11) | (0x1<<18); */
  422. p_addr->dwval = 0x41008;
  423. } else if (rop3_cmd == G2D_ROP3_DSTINVERT) {
  424. /* ~dst */
  425. /* (0x1<<3) | (0x2<<6) | (0x2<<11) | (0x1<<18) | (0x1<<17); */
  426. p_addr->dwval = 0x61088;
  427. } else if (rop3_cmd == G2D_ROP3_PATINVERT) {
  428. /* ptn XOR dst */
  429. /* (0x2<<6) | (0x2<<11) | (0x1<<17) */
  430. p_addr->dwval = 0x21080;
  431. } else if (rop3_cmd == G2D_ROP3_SRCINVERT) {
  432. /* src XOR dst */
  433. /* (0x2<<6) | (0x2<<11) | (0x1<<18); */
  434. p_addr->dwval = 0x41080;
  435. } else if (rop3_cmd == G2D_ROP3_SRCAND) {
  436. /* src AND dst */
  437. /* (0x0<<6) | (0x2<<11) | (0x1<<18); */
  438. p_addr->dwval = 0x41000;
  439. } else if (rop3_cmd == G2D_ROP3_MERGEPAINT) {
  440. /* ~src OR dst */
  441. /* (0x1<<4) | (0x1<<6) | (0x2<<11) | (0x1<<18); */
  442. p_addr->dwval = 0x41050;
  443. } else if (rop3_cmd == G2D_ROP3_MERGECOPY) {
  444. /* src AND pattern */
  445. /* (0x2<<6) | (0x1<<16) */
  446. p_addr->dwval = 0x10080;
  447. } else if (rop3_cmd == G2D_ROP3_SRCCOPY) {
  448. /* src */
  449. /* (0x2<<6) | (0x2<<11) | (0x1<<18) | (0x1<<16); */
  450. p_addr->dwval = 0x51080;
  451. } else if (rop3_cmd == G2D_ROP3_SRCPAINT) {
  452. /* src OR dst */
  453. /* (0x1<<6) | (0x2<<11) | (0x1<<18); */
  454. p_addr->dwval = 0x41040;
  455. } else if (rop3_cmd == G2D_ROP3_PATCOPY) {
  456. /* ptn */
  457. /* (0x1<<16) | (0x1<<17) | (0x2)<<11 */
  458. p_addr->dwval = 0x31000;
  459. } else if (rop3_cmd == G2D_ROP3_PATPAINT) {
  460. /* DPSnoo */
  461. /* (0x1<<3) | (0x1<<6) | (0x1<<11) */
  462. p_addr->dwval = 0x848;
  463. } else if (rop3_cmd == G2D_ROP3_WHITENESS) {
  464. /* whiteness */
  465. p_addr->dwval = 0x48000;
  466. } else
  467. goto OUT;
  468. p_bld->set_block_dirty(p_bld, 0, 1);
  469. ret = 0;
  470. OUT:
  471. return ret;
  472. }
  473. static __u32 bld_get_reg_block_num(struct blender_submodule *p_bld)
  474. {
  475. if (p_bld)
  476. return p_bld->reg_blk_num;
  477. return 0;
  478. }
  479. static __s32 bld_get_reg_block(struct blender_submodule *p_bld,
  480. struct g2d_reg_block **blks)
  481. {
  482. __s32 i = 0, ret = -1;
  483. if (p_bld) {
  484. for (i = 0; i < p_bld->reg_blk_num; ++i)
  485. blks[i] = p_bld->reg_blks + i;
  486. }
  487. return ret;
  488. }
  489. static struct g2d_mixer_bld_reg *bld_get_reg(struct blender_submodule *p_bld)
  490. {
  491. #if G2D_MIXER_RCQ_USED == 1
  492. return (struct g2d_mixer_bld_reg *)(p_bld->reg_blks
  493. ->vir_addr);
  494. #else
  495. return (struct g2d_mixer_bld_reg *)(p_bld->reg_blks
  496. ->reg_addr);
  497. #endif
  498. return NULL;
  499. }
  500. static void bld_set_block_dirty(struct blender_submodule *p_bld, __u32 blk_id, __u32 dirty)
  501. {
  502. #if G2D_MIXER_RCQ_USED == 1
  503. if (p_bld && p_bld->reg_blks->rcq_hd)
  504. p_bld->reg_blks->rcq_hd->dirty.bits.dirty = dirty;
  505. else
  506. G2D_ERR_MSG("Null pointer!\n");
  507. #else
  508. if (p_bld)
  509. p_bld->reg_blks->dirty = dirty;
  510. else
  511. G2D_ERR_MSG("Null pointer!\n");
  512. #endif
  513. }
  514. static __u32 bld_get_rcq_mem_size(struct blender_submodule *p_bld)
  515. {
  516. return G2D_RCQ_BYTE_ALIGN(sizeof(struct g2d_mixer_bld_reg));
  517. }
  518. static __s32 bld_destory(struct blender_submodule *p_bld)
  519. {
  520. __s32 ret = -1;
  521. if (p_bld) {
  522. free(p_bld->reg_blks);
  523. p_bld->reg_blks = NULL;
  524. free(p_bld->reg_info);
  525. p_bld->reg_info = NULL;
  526. free(p_bld);
  527. ret = 0;
  528. }
  529. return ret;
  530. }
  531. struct blender_submodule *
  532. g2d_bld_submodule_setup(struct g2d_mixer_frame *p_frame)
  533. {
  534. struct blender_submodule *p_bld = NULL;
  535. p_bld = hal_malloc(sizeof(struct blender_submodule));
  536. if (!p_bld) {
  537. G2D_ERR_MSG("malloc wb submodule fail!\n");
  538. return NULL;
  539. }
  540. memset(p_bld, 0, sizeof(struct blender_submodule));
  541. p_bld->rcq_setup = bld_rcq_setup;
  542. p_bld->reg_blk_num = 1;
  543. p_bld->get_reg_block_num = bld_get_reg_block_num;
  544. p_bld->get_reg_block = bld_get_reg_block;
  545. p_bld->get_reg = bld_get_reg;
  546. p_bld->set_block_dirty = bld_set_block_dirty;
  547. p_bld->get_rcq_mem_size = bld_get_rcq_mem_size;
  548. p_bld->destory = bld_destory;
  549. p_bld->reg_blks =
  550. hal_malloc(sizeof(struct g2d_reg_block) * p_bld->reg_blk_num);
  551. p_bld->reg_info =
  552. hal_malloc(sizeof(struct g2d_reg_mem_info));
  553. if (!p_bld->reg_blks || !p_bld->reg_info) {
  554. G2D_ERR_MSG("malloc wb reg info fail!\n");
  555. goto FREE_WB;
  556. }
  557. memset(p_bld->reg_blks, 0, sizeof(struct g2d_reg_block) * p_bld->reg_blk_num);
  558. memset(p_bld->reg_info, 0, sizeof(struct g2d_reg_mem_info));
  559. return p_bld;
  560. FREE_WB:
  561. free(p_bld->reg_blks);
  562. free(p_bld->reg_info);
  563. free(p_bld);
  564. return NULL;
  565. }