g2d_top.c 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. /*
  2. * g2d_top/g2d_top.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 "g2d_driver_i.h"
  18. #include "g2d_top.h"
  19. #include "g2d_top_type.h"
  20. static volatile struct g2d_top_reg *g2d_top;
  21. static volatile struct g2d_mixer_glb_reg *mixer_glb;
  22. void g2d_top_set_base(unsigned long base)
  23. {
  24. g2d_top = (struct g2d_top_reg *)(base);
  25. mixer_glb = (struct g2d_mixer_glb_reg *)(base + 0x0100);
  26. }
  27. void g2d_mixer_scan_order_fun(__u32 scan_order)
  28. {
  29. mixer_glb->mixer_ctrl.bits.scan_order = scan_order;
  30. }
  31. void g2d_mixer_start(__u32 start)
  32. {
  33. mixer_glb->mixer_ctrl.bits.start = start;
  34. }
  35. void g2d_mixer_irq_en(__u32 en)
  36. {
  37. mixer_glb->mixer_interrupt.bits.finish_irq_en = en;
  38. }
  39. __s32 g2d_mixer_irq_query(void)
  40. {
  41. if (mixer_glb->mixer_interrupt.bits.mixer_irq & 0x1) {
  42. mixer_glb->mixer_interrupt.bits.mixer_irq = 1;
  43. return 1;
  44. }
  45. return 0;
  46. }
  47. __s32 g2d_bsp_open(void)
  48. {
  49. g2d_top->sclk_gate.bits.mixer_sclk_gate = 1;
  50. g2d_top->sclk_gate.bits.rot_sclk_gate = 1;
  51. g2d_top->hclk_gate.bits.mixer_hclk_gate = 1;
  52. g2d_top->hclk_gate.bits.rot_hclk_gate = 1;
  53. g2d_top->ahb_rst.bits.mixer_ahb_rst = 1;
  54. g2d_top->ahb_rst.bits.rot_ahb_rst = 1;
  55. return 0;
  56. }
  57. __s32 g2d_bsp_close(void)
  58. {
  59. g2d_top->sclk_gate.bits.mixer_sclk_gate = 0;
  60. g2d_top->sclk_gate.bits.rot_sclk_gate = 0;
  61. g2d_top->hclk_gate.bits.mixer_hclk_gate = 0;
  62. g2d_top->hclk_gate.bits.rot_hclk_gate = 0;
  63. g2d_top->ahb_rst.bits.mixer_ahb_rst = 0;
  64. g2d_top->ahb_rst.bits.rot_ahb_rst = 0;
  65. return 0;
  66. }
  67. __s32 g2d_bsp_reset(void)
  68. {
  69. g2d_top->ahb_rst.bits.mixer_ahb_rst = 0;
  70. g2d_top->ahb_rst.bits.rot_ahb_rst = 0;
  71. g2d_top->ahb_rst.bits.mixer_ahb_rst = 1;
  72. g2d_top->ahb_rst.bits.rot_ahb_rst = 1;
  73. return 0;
  74. }
  75. __s32 g2d_top_mixer_reset(void)
  76. {
  77. g2d_top->ahb_rst.bits.mixer_ahb_rst = 0;
  78. g2d_top->ahb_rst.bits.mixer_ahb_rst = 1;
  79. return 0;
  80. }
  81. __s32 g2d_top_rot_reset(void)
  82. {
  83. g2d_top->ahb_rst.bits.rot_ahb_rst = 0;
  84. g2d_top->ahb_rst.bits.rot_ahb_rst = 1;
  85. return 0;
  86. }
  87. __s32 g2d_top_mixer_sclk_div(__u32 div)
  88. {
  89. g2d_top->sclk_div.bits.mixer_sclk_div = div;
  90. return 0;
  91. }
  92. __s32 g2d_top_rot_sclk_div(__u32 div)
  93. {
  94. g2d_top->sclk_div.bits.rot_sclk_div = div;
  95. return 0;
  96. }
  97. void g2d_top_rcq_irq_en(__u32 en)
  98. {
  99. g2d_top->rcq_irq_ctl.bits.task_end_irq_en = en;
  100. /*g2d_top->rcq_irq_ctl.bits.rcq_cfg_finish_irq_en = en;*/
  101. }
  102. void g2d_top_rcq_update_en(__u32 en)
  103. {
  104. g2d_top->rcq_ctrl.bits.update = en;
  105. }
  106. __s32 g2d_top_rcq_task_irq_query(void)
  107. {
  108. if (g2d_top->rcq_status.bits.task_end_irq & 0x1) {
  109. g2d_top->rcq_status.bits.task_end_irq = 1;
  110. return 1;
  111. }
  112. return 0;
  113. }
  114. __s32 g2d_top_rcq_cfg_irq_query(void)
  115. {
  116. if (g2d_top->rcq_status.bits.cfg_finish_irq & 0x1) {
  117. g2d_top->rcq_status.bits.cfg_finish_irq = 1;
  118. return 1;
  119. }
  120. return 0;
  121. }
  122. __u32 g2d_top_get_rcq_frame_cnt(void)
  123. {
  124. return g2d_top->rcq_status.bits.frame_cnt;
  125. }
  126. void g2d_top_set_rcq_head(u64 addr, __u32 len)
  127. {
  128. __u32 haddr = (__u32)(addr >> 32);
  129. g2d_top->rcq_header_low_addr = addr;
  130. g2d_top->rcq_header_high_addr = haddr;
  131. g2d_top->rcq_header_len.bits.rcq_header_len = len;
  132. }