g2d_rcq.c 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. /*
  2. * g2d_rcq/g2d_rcq.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_rcq.h"
  18. #include "g2d_driver_i.h"
  19. __s32 g2d_top_mem_pool_alloc(struct g2d_rcq_mem_info *p_rcq_info)
  20. {
  21. int ret = 0;
  22. p_rcq_info->rcq_byte_used =
  23. p_rcq_info->alloc_num * sizeof(*(p_rcq_info->vir_addr));
  24. p_rcq_info->vir_addr = g2d_malloc(p_rcq_info->rcq_reg_mem_size,
  25. (__u32 *)&p_rcq_info->phy_addr);
  26. if (!p_rcq_info->vir_addr)
  27. ret = -1;
  28. return ret;
  29. }
  30. void *g2d_top_reg_memory_alloc(__u32 size, void *phy_addr,
  31. struct g2d_rcq_mem_info *p_rcq_info)
  32. {
  33. void *viraddr = NULL;
  34. if (p_rcq_info->vir_addr) {
  35. *(__u32 *)phy_addr = (unsigned long)p_rcq_info->phy_addr +
  36. p_rcq_info->rcq_byte_used;
  37. viraddr =
  38. (void *)p_rcq_info->vir_addr + p_rcq_info->rcq_byte_used;
  39. p_rcq_info->rcq_byte_used += G2D_RCQ_BYTE_ALIGN(size);
  40. if (p_rcq_info->rcq_byte_used > p_rcq_info->rcq_reg_mem_size) {
  41. G2D_ERR_MSG("Malloc %ld byte fail, out of total "
  42. "memory %ld bytes, current used byte:%ld\n",
  43. G2D_RCQ_BYTE_ALIGN(size),
  44. p_rcq_info->rcq_reg_mem_size,
  45. p_rcq_info->rcq_byte_used);
  46. viraddr = NULL;
  47. *(__u32 *)phy_addr = (unsigned long)NULL;
  48. }
  49. return viraddr;
  50. } else {
  51. G2D_ERR_MSG("Null pointer!\n");
  52. *(__u32 *)phy_addr = (unsigned long)NULL;
  53. return NULL;
  54. }
  55. }
  56. void g2d_top_mem_pool_free(struct g2d_rcq_mem_info *p_rcq_info)
  57. {
  58. if (p_rcq_info->vir_addr) {
  59. g2d_free((void *)p_rcq_info->vir_addr,
  60. (void *)p_rcq_info->phy_addr,
  61. p_rcq_info->rcq_reg_mem_size);
  62. }
  63. }