sde_reg_dma.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2017-2019, The Linux Foundation. All rights reserved.
  4. */
  5. #define pr_fmt(fmt) "[drm:%s:%d] " fmt, __func__, __LINE__
  6. #include "sde_reg_dma.h"
  7. #include "sde_hw_reg_dma_v1.h"
  8. #include "sde_dbg.h"
  9. #define REG_DMA_VER_1_0 0x00010000
  10. #define REG_DMA_VER_1_1 0x00010001
  11. #define REG_DMA_VER_1_2 0x00010002
  12. static int default_check_support(enum sde_reg_dma_features feature,
  13. enum sde_reg_dma_blk blk,
  14. bool *is_supported)
  15. {
  16. if (!is_supported)
  17. return -EINVAL;
  18. *is_supported = false;
  19. return 0;
  20. }
  21. static int default_setup_payload(struct sde_reg_dma_setup_ops_cfg *cfg)
  22. {
  23. DRM_ERROR("not implemented\n");
  24. return -EINVAL;
  25. }
  26. static int default_kick_off(struct sde_reg_dma_kickoff_cfg *cfg)
  27. {
  28. DRM_ERROR("not implemented\n");
  29. return -EINVAL;
  30. }
  31. static int default_reset(struct sde_hw_ctl *ctl)
  32. {
  33. DRM_ERROR("not implemented\n");
  34. return -EINVAL;
  35. }
  36. struct sde_reg_dma_buffer *default_alloc_reg_dma_buf(u32 size)
  37. {
  38. DRM_ERROR("not implemented\n");
  39. return ERR_PTR(-EINVAL);
  40. }
  41. int default_dealloc_reg_dma(struct sde_reg_dma_buffer *lut_buf)
  42. {
  43. DRM_ERROR("not implemented\n");
  44. return -EINVAL;
  45. }
  46. static int default_buf_reset_reg_dma(struct sde_reg_dma_buffer *lut_buf)
  47. {
  48. DRM_ERROR("not implemented\n");
  49. return -EINVAL;
  50. }
  51. static int default_last_command(struct sde_hw_ctl *ctl,
  52. enum sde_reg_dma_queue q, enum sde_reg_dma_last_cmd_mode mode)
  53. {
  54. return 0;
  55. }
  56. static void default_dump_reg(void)
  57. {
  58. }
  59. static struct sde_hw_reg_dma reg_dma = {
  60. .ops = {default_check_support, default_setup_payload,
  61. default_kick_off, default_reset, default_alloc_reg_dma_buf,
  62. default_dealloc_reg_dma, default_buf_reset_reg_dma,
  63. default_last_command, default_dump_reg},
  64. };
  65. int sde_reg_dma_init(void __iomem *addr, struct sde_mdss_cfg *m,
  66. struct drm_device *dev)
  67. {
  68. int rc = 0;
  69. if (!addr || !m || !dev) {
  70. DRM_DEBUG("invalid addr %pK catalog %pK dev %pK\n", addr, m,
  71. dev);
  72. return 0;
  73. }
  74. reg_dma.drm_dev = dev;
  75. reg_dma.caps = &m->dma_cfg;
  76. reg_dma.addr = addr;
  77. if (!m->reg_dma_count)
  78. return 0;
  79. switch (reg_dma.caps->version) {
  80. case REG_DMA_VER_1_0:
  81. rc = init_v1(&reg_dma);
  82. if (rc)
  83. DRM_DEBUG("init v1 dma ops failed\n");
  84. break;
  85. case REG_DMA_VER_1_1:
  86. rc = init_v11(&reg_dma);
  87. if (rc)
  88. DRM_DEBUG("init v11 dma ops failed\n");
  89. break;
  90. case REG_DMA_VER_1_2:
  91. rc = init_v12(&reg_dma);
  92. if (rc)
  93. DRM_DEBUG("init v11 dma ops failed\n");
  94. break;
  95. default:
  96. break;
  97. }
  98. return 0;
  99. }
  100. struct sde_hw_reg_dma_ops *sde_reg_dma_get_ops(void)
  101. {
  102. return &reg_dma.ops;
  103. }
  104. void sde_reg_dma_deinit(void)
  105. {
  106. struct sde_hw_reg_dma op = {
  107. .ops = {default_check_support, default_setup_payload,
  108. default_kick_off, default_reset, default_alloc_reg_dma_buf,
  109. default_dealloc_reg_dma, default_buf_reset_reg_dma,
  110. default_last_command, default_dump_reg},
  111. };
  112. if (!reg_dma.drm_dev || !reg_dma.caps)
  113. return;
  114. switch (reg_dma.caps->version) {
  115. case REG_DMA_VER_1_0:
  116. deinit_v1();
  117. break;
  118. case REG_DMA_VER_1_1:
  119. case REG_DMA_VER_1_2:
  120. deinit_v1();
  121. break;
  122. default:
  123. break;
  124. }
  125. memset(&reg_dma, 0, sizeof(reg_dma));
  126. memcpy(&reg_dma.ops, &op.ops, sizeof(op.ops));
  127. }