mtk_vpu.h 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. /*
  2. * Copyright (c) 2016 MediaTek Inc.
  3. * Author: Andrew-CT Chen <andrew-ct.chen@mediatek.com>
  4. *
  5. * This program is free software; you can redistribute it and/or modify
  6. * it under the terms of the GNU General Public License version 2 as
  7. * published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. */
  14. #ifndef _MTK_VPU_H
  15. #define _MTK_VPU_H
  16. #include <linux/platform_device.h>
  17. /**
  18. * VPU (video processor unit) is a tiny processor controlling video hardware
  19. * related to video codec, scaling and color format converting.
  20. * VPU interfaces with other blocks by share memory and interrupt.
  21. **/
  22. typedef void (*ipi_handler_t) (void *data,
  23. unsigned int len,
  24. void *priv);
  25. /**
  26. * enum ipi_id - the id of inter-processor interrupt
  27. *
  28. * @IPI_VPU_INIT: The interrupt from vpu is to notfiy kernel
  29. * VPU initialization completed.
  30. * IPI_VPU_INIT is sent from VPU when firmware is
  31. * loaded. AP doesn't need to send IPI_VPU_INIT
  32. * command to VPU.
  33. * For other IPI below, AP should send the request
  34. * to VPU to trigger the interrupt.
  35. * @IPI_VDEC_H264: The interrupt from vpu is to notify kernel to
  36. * handle H264 vidoe decoder job, and vice versa.
  37. * Decode output format is always MT21 no matter what
  38. * the input format is.
  39. * @IPI_VDEC_VP8: The interrupt from is to notify kernel to
  40. * handle VP8 video decoder job, and vice versa.
  41. * Decode output format is always MT21 no matter what
  42. * the input format is.
  43. * @IPI_VDEC_VP9: The interrupt from vpu is to notify kernel to
  44. * handle VP9 video decoder job, and vice versa.
  45. * Decode output format is always MT21 no matter what
  46. * the input format is.
  47. * @IPI_VENC_H264: The interrupt from vpu is to notify kernel to
  48. * handle H264 video encoder job, and vice versa.
  49. * @IPI_VENC_VP8: The interrupt fro vpu is to notify kernel to
  50. * handle VP8 video encoder job,, and vice versa.
  51. * @IPI_MDP: The interrupt from vpu is to notify kernel to
  52. * handle MDP (Media Data Path) job, and vice versa.
  53. * @IPI_MAX: The maximum IPI number
  54. */
  55. enum ipi_id {
  56. IPI_VPU_INIT = 0,
  57. IPI_VDEC_H264,
  58. IPI_VDEC_VP8,
  59. IPI_VDEC_VP9,
  60. IPI_VENC_H264,
  61. IPI_VENC_VP8,
  62. IPI_MDP,
  63. IPI_MAX,
  64. };
  65. /**
  66. * enum rst_id - reset id to register reset function for VPU watchdog timeout
  67. *
  68. * @VPU_RST_ENC: encoder reset id
  69. * @VPU_RST_DEC: decoder reset id
  70. * @VPU_RST_MDP: MDP (Media Data Path) reset id
  71. * @VPU_RST_MAX: maximum reset id
  72. */
  73. enum rst_id {
  74. VPU_RST_ENC,
  75. VPU_RST_DEC,
  76. VPU_RST_MDP,
  77. VPU_RST_MAX,
  78. };
  79. /**
  80. * vpu_ipi_register - register an ipi function
  81. *
  82. * @pdev: VPU platform device
  83. * @id: IPI ID
  84. * @handler: IPI handler
  85. * @name: IPI name
  86. * @priv: private data for IPI handler
  87. *
  88. * Register an ipi function to receive ipi interrupt from VPU.
  89. *
  90. * Return: Return 0 if ipi registers successfully, otherwise it is failed.
  91. */
  92. int vpu_ipi_register(struct platform_device *pdev, enum ipi_id id,
  93. ipi_handler_t handler, const char *name, void *priv);
  94. /**
  95. * vpu_ipi_send - send data from AP to vpu.
  96. *
  97. * @pdev: VPU platform device
  98. * @id: IPI ID
  99. * @buf: the data buffer
  100. * @len: the data buffer length
  101. *
  102. * This function is thread-safe. When this function returns,
  103. * VPU has received the data and starts the processing.
  104. * When the processing completes, IPI handler registered
  105. * by vpu_ipi_register will be called in interrupt context.
  106. *
  107. * Return: Return 0 if sending data successfully, otherwise it is failed.
  108. **/
  109. int vpu_ipi_send(struct platform_device *pdev,
  110. enum ipi_id id, void *buf,
  111. unsigned int len);
  112. /**
  113. * vpu_get_plat_device - get VPU's platform device
  114. *
  115. * @pdev: the platform device of the module requesting VPU platform
  116. * device for using VPU API.
  117. *
  118. * Return: Return NULL if it is failed.
  119. * otherwise it is VPU's platform device
  120. **/
  121. struct platform_device *vpu_get_plat_device(struct platform_device *pdev);
  122. /**
  123. * vpu_wdt_reg_handler - register a VPU watchdog handler
  124. *
  125. * @pdev: VPU platform device
  126. * @vpu_wdt_reset_func: the callback reset function
  127. * @private_data: the private data for reset function
  128. * @rst_id: reset id
  129. *
  130. * Register a handler performing own tasks when vpu reset by watchdog
  131. *
  132. * Return: Return 0 if the handler is added successfully,
  133. * otherwise it is failed.
  134. *
  135. **/
  136. int vpu_wdt_reg_handler(struct platform_device *pdev,
  137. void vpu_wdt_reset_func(void *),
  138. void *priv, enum rst_id id);
  139. /**
  140. * vpu_get_vdec_hw_capa - get video decoder hardware capability
  141. *
  142. * @pdev: VPU platform device
  143. *
  144. * Return: video decoder hardware capability
  145. **/
  146. unsigned int vpu_get_vdec_hw_capa(struct platform_device *pdev);
  147. /**
  148. * vpu_get_venc_hw_capa - get video encoder hardware capability
  149. *
  150. * @pdev: VPU platform device
  151. *
  152. * Return: video encoder hardware capability
  153. **/
  154. unsigned int vpu_get_venc_hw_capa(struct platform_device *pdev);
  155. /**
  156. * vpu_load_firmware - download VPU firmware and boot it
  157. *
  158. * @pdev: VPU platform device
  159. *
  160. * Return: Return 0 if downloading firmware successfully,
  161. * otherwise it is failed
  162. **/
  163. int vpu_load_firmware(struct platform_device *pdev);
  164. /**
  165. * vpu_mapping_dm_addr - Mapping DTCM/DMEM to kernel virtual address
  166. *
  167. * @pdev: VPU platform device
  168. * @dmem_addr: VPU's data memory address
  169. *
  170. * Mapping the VPU's DTCM (Data Tightly-Coupled Memory) /
  171. * DMEM (Data Extended Memory) memory address to
  172. * kernel virtual address.
  173. *
  174. * Return: Return ERR_PTR(-EINVAL) if mapping failed,
  175. * otherwise the mapped kernel virtual address
  176. **/
  177. void *vpu_mapping_dm_addr(struct platform_device *pdev,
  178. u32 dtcm_dmem_addr);
  179. #endif /* _MTK_VPU_H */