fpcie_misc.c 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. /*
  2. * Copyright : (C) 2022 Phytium Information Technology, Inc.
  3. * All Rights Reserved.
  4. *
  5. * This program is OPEN SOURCE software: you can redistribute it and/or modify it
  6. * under the terms of the Phytium Public License as published by the Phytium Technology Co.,Ltd,
  7. * either version 1.0 of the License, or (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY;
  10. * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. * See the Phytium Public License for more details.
  12. *
  13. *
  14. * FilePath: fpcie_misc.c
  15. * Date: 2022-02-10 14:55:11
  16. * LastEditTime: 2022-02-18 08:59:17
  17. * Description:  This files is for
  18. *
  19. * Modify History:
  20. * Ver   Who        Date         Changes
  21. * ----- ------     --------    --------------------------------------
  22. */
  23. #include "fpcie.h"
  24. #include "fpcie_hw.h"
  25. #include "fassert.h"
  26. #include "fdebug.h"
  27. /***************************** Include Files *********************************/
  28. /************************** Constant Definitions *****************************/
  29. /**************************** Type Definitions *******************************/
  30. /************************** Variable Definitions *****************************/
  31. /***************** Macros (Inline Functions) Definitions *********************/
  32. #define FPCIE_INTR_DEBUG_TAG "FPCIE_INTR"
  33. #define FPCIE_INTR_ERROR(format, ...) FT_DEBUG_PRINT_E(FPCIE_INTR_DEBUG_TAG, format, ##__VA_ARGS__)
  34. #define FPCIE_INTR_DEBUG_I(format, ...) FT_DEBUG_PRINT_I(FPCIE_INTR_DEBUG_TAG, format, ##__VA_ARGS__)
  35. #define FPCIE_INTR_DEBUG_W(format, ...) FT_DEBUG_PRINT_W(FPCIE_INTR_DEBUG_TAG, format, ##__VA_ARGS__)
  36. /************************** Function Prototypes ******************************/
  37. FError FPcieMiscSetHandler(FPcie *instance_p, u32 handler_type,
  38. void *func_pointer, void *call_back_ref)
  39. {
  40. FError status;
  41. FASSERT(instance_p != NULL);
  42. FASSERT(func_pointer != NULL);
  43. FASSERT(instance_p->is_ready == (u32)FT_COMPONENT_IS_READY);
  44. switch (handler_type)
  45. {
  46. case FPCIE_HANDLER_DMASEND:
  47. status = FT_SUCCESS;
  48. instance_p->fpcie_dma_tx_cb = ((FPcieIrqCallBack)(void *)func_pointer);
  49. instance_p->dma_tx_args = call_back_ref;
  50. break;
  51. case FPCIE_HANDLER_DMARECV:
  52. status = FT_SUCCESS;
  53. instance_p->fpcie_dma_rx_cb = ((FPcieIrqCallBack)(void *)func_pointer);
  54. instance_p->dma_rx_args = call_back_ref;
  55. break;
  56. case FPCIE_HANDLER_DMASEND_ERROR:
  57. status = FT_SUCCESS;
  58. instance_p->fpcie_dma_tx_error_cb = ((FPcieIrqCallBack)(void *)func_pointer);
  59. instance_p->dma_tx_error_args = call_back_ref;
  60. break;
  61. case FPCIE_HANDLER_DMARECV_ERROR:
  62. status = FT_SUCCESS;
  63. instance_p->fpcie_dma_rx_error_cb = ((FPcieIrqCallBack)(void *)func_pointer);
  64. instance_p->dma_rx_error_args = call_back_ref;
  65. break;
  66. default:
  67. status = FPCIE_ERR_INVALID_PARAM;
  68. break;
  69. }
  70. return status;
  71. }
  72. void FPcieMiscIrq(s32 vector, void *args)
  73. {
  74. FPcie *instance_p = (FPcie *)args;
  75. uintptr_t control_address;
  76. u32 reg_value;
  77. (void)vector;
  78. FASSERT(instance_p != NULL);
  79. if (FPCIE_READREG(instance_p->config.peu0_config_address, FPCIE_REG_MISC_INT_STATE_OFFSET) & FPCIE_MISC_STATE_C0_DMA_INT_MASK)
  80. {
  81. FPCIE_INTR_DEBUG_I("PEU0 C0 DMA IRQ!");
  82. control_address = instance_p->config.control_c0_address;
  83. }
  84. else if (FPCIE_READREG(instance_p->config.peu0_config_address, FPCIE_REG_MISC_INT_STATE_OFFSET) & FPCIE_MISC_STATE_C1_DMA_INT_MASK)
  85. {
  86. FPCIE_INTR_DEBUG_I("PEU0 C1 DMA IRQ!");
  87. control_address = instance_p->config.control_c1_address;
  88. }
  89. else if (FPCIE_READREG(instance_p->config.peu0_config_address, FPCIE_REG_MISC_INT_STATE_OFFSET) & FPCIE_MISC_STATE_C2_DMA_INT_MASK)
  90. {
  91. FPCIE_INTR_DEBUG_I("PEU0 C2 DMA IRQ!");
  92. control_address = instance_p->config.control_c2_address;
  93. }
  94. else if (FPCIE_READREG(instance_p->config.peu1_config_address, FPCIE_REG_MISC_INT_STATE_OFFSET) & FPCIE_MISC_STATE_C0_DMA_INT_MASK)
  95. {
  96. FPCIE_INTR_DEBUG_I("PEU0 C0 DMA IRQ!");
  97. control_address = instance_p->config.control_c3_address;
  98. }
  99. else if (FPCIE_READREG(instance_p->config.peu1_config_address, FPCIE_REG_MISC_INT_STATE_OFFSET) & FPCIE_MISC_STATE_C1_DMA_INT_MASK)
  100. {
  101. FPCIE_INTR_DEBUG_I("PEU0 C1 DMA IRQ!");
  102. control_address = instance_p->config.control_c4_address;
  103. }
  104. else if (FPCIE_READREG(instance_p->config.peu1_config_address, FPCIE_REG_MISC_INT_STATE_OFFSET) & FPCIE_MISC_STATE_C2_DMA_INT_MASK)
  105. {
  106. FPCIE_INTR_DEBUG_I("PEU0 C2 DMA IRQ!");
  107. control_address = instance_p->config.control_c5_address;
  108. }
  109. FPCIE_INTR_DEBUG_I("pcie misc irq!");
  110. FPCIE_INTR_DEBUG_I("pcie dma irq status : 0x%08lx", FPCIE_READREG(control_address, FPCIE_REG_DMA_INT_STATUS_OFFSET));
  111. reg_value = FPCIE_READREG(control_address, FPCIE_REG_DMA_INT_STATUS_OFFSET);
  112. if (reg_value & FPCIE_CTRL_DMA_INT_STATUS_CH0_DONE_MASK)
  113. {
  114. if (instance_p->fpcie_dma_rx_cb)
  115. {
  116. instance_p->fpcie_dma_rx_cb(instance_p->dma_rx_args);
  117. }
  118. }
  119. if (reg_value & FPCIE_CTRL_DMA_INT_STATUS_CH1_DONE_MASK)
  120. {
  121. if (instance_p->fpcie_dma_tx_cb)
  122. {
  123. instance_p->fpcie_dma_tx_cb(instance_p->dma_tx_args);
  124. }
  125. }
  126. if (reg_value & FPCIE_CTRL_DMA_INT_STATUS_CH0_ERR_MASK)
  127. {
  128. if (instance_p->fpcie_dma_rx_error_cb)
  129. {
  130. instance_p->fpcie_dma_rx_error_cb(instance_p->dma_rx_error_args);
  131. }
  132. }
  133. if (reg_value & FPCIE_CTRL_DMA_INT_STATUS_CH1_ERR_MASK)
  134. {
  135. if (instance_p->fpcie_dma_tx_error_cb)
  136. {
  137. instance_p->fpcie_dma_tx_error_cb(instance_p->dma_tx_error_args);
  138. }
  139. }
  140. FPCIE_WRITEREG(control_address, FPCIE_REG_DMA_INT_STATUS_OFFSET, FPCIE_CTRL_DMA_INT_STATUS_ALL_MASK);
  141. }