mtkfb_fence.h 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. #ifndef __MTKFB_FENCE_H__
  2. #define __MTKFB_FENCE_H__
  3. #include <linux/mutex.h>
  4. #include <linux/list.h>
  5. #include "disp_session.h"
  6. #include "disp_drv_platform.h"
  7. #include "display_recorder.h"
  8. #ifdef __cplusplus
  9. extern "C" {
  10. #endif
  11. #define MTK_FB_INVALID_ION_FD (-1)
  12. #define MTK_FB_INVALID_FENCE_FD (-1)
  13. #define MTK_FB_KERNEL_NO_ION_FD (-99)
  14. struct fb_overlay_buffer_t {
  15. /* Input */
  16. int layer_id;
  17. unsigned int layer_en;
  18. int ion_fd;
  19. unsigned int cache_sync;
  20. /* Output */
  21. unsigned int index;
  22. int fence_fd;
  23. };
  24. typedef enum {
  25. create,
  26. insert,
  27. reg_configed,
  28. reg_updated,
  29. read_done
  30. } BUFFER_STATE;
  31. struct mtkfb_fence_buf_info {
  32. struct list_head list;
  33. unsigned int idx;
  34. int fence;
  35. struct ion_handle *hnd;
  36. unsigned long mva;
  37. unsigned long va;
  38. unsigned int size;
  39. unsigned int mva_offset;
  40. BUFFER_STATE buf_state;
  41. unsigned int cache_sync;
  42. unsigned int set_input_ticket;
  43. unsigned int trigger_ticket; /* we can't update trigger_ticket_end,
  44. because can't gurantee ticket being updated before cmdq callback
  45. */
  46. unsigned int release_ticket;
  47. unsigned int enable;
  48. unsigned long long ts_create;
  49. unsigned long long ts_period_keep;
  50. unsigned int seq;
  51. #ifdef CONFIG_MTK_HDMI_3D_SUPPORT
  52. unsigned int layer_type;
  53. #endif
  54. };
  55. struct mtkfb_fence_sync_info {
  56. unsigned int inited;
  57. struct mutex mutex_lock;
  58. unsigned int layer_id;
  59. unsigned int fence_idx;
  60. unsigned int timeline_idx;
  61. unsigned int inc;
  62. unsigned int cur_idx;
  63. struct sw_sync_timeline *timeline;
  64. struct list_head buf_list;
  65. };
  66. /* use another struct to avoid fence dependency with ddp_ovl.h */
  67. typedef struct {
  68. unsigned int layer;
  69. unsigned int layer_en;
  70. unsigned int fmt;
  71. unsigned long addr;
  72. unsigned long vaddr;
  73. unsigned int src_x;
  74. unsigned int src_y;
  75. unsigned int src_w;
  76. unsigned int src_h;
  77. unsigned int src_pitch;
  78. unsigned int dst_x;
  79. unsigned int dst_y;
  80. unsigned int dst_w;
  81. unsigned int dst_h; /* clip region */
  82. unsigned int keyEn;
  83. unsigned int key;
  84. unsigned int aen;
  85. unsigned char alpha;
  86. unsigned int isDirty;
  87. unsigned int buff_idx;
  88. unsigned int security;
  89. } FENCE_LAYER_INFO;
  90. typedef struct {
  91. unsigned int inited;
  92. struct mutex sync_lock;
  93. unsigned int layer_id;
  94. unsigned int fence_idx;
  95. unsigned int timeline_idx;
  96. unsigned int fence_fd;
  97. unsigned int inc;
  98. unsigned int cur_idx;
  99. struct sw_sync_timeline *timeline;
  100. struct list_head buf_list;
  101. FENCE_LAYER_INFO cached_config;
  102. } disp_sync_info;
  103. typedef struct {
  104. unsigned int session_id;
  105. disp_sync_info session_layer_info[DISP_SESSION_TIMELINE_COUNT];
  106. dprec_logger_event event_prepare;
  107. dprec_logger_event event_setinput;
  108. dprec_logger_event event_setoutput;
  109. dprec_logger_event event_trigger;
  110. dprec_logger_event event_findidx;
  111. dprec_logger_event event_release;
  112. dprec_logger_event event_waitvsync;
  113. dprec_logger_event event_err;
  114. } disp_session_sync_info;
  115. void mtkfb_init_fence(void);
  116. unsigned int mtkfb_query_buf_mva(unsigned int session_id, unsigned int layer_id,
  117. unsigned int idx);
  118. unsigned int mtkfb_query_buf_va(unsigned int session_id, unsigned int layer_id,
  119. unsigned int idx);
  120. unsigned int mtkfb_update_buf_ticket(unsigned int session_id, unsigned int layer_id,
  121. unsigned int idx, unsigned int ticket);
  122. unsigned int mtkfb_query_idx_by_ticket(unsigned int session_id, unsigned int layer_id,
  123. unsigned int ticket);
  124. #ifdef CONFIG_MTK_HDMI_3D_SUPPORT
  125. bool mtkfb_update_buf_info_new(unsigned int session_id, unsigned int mva_offset,
  126. disp_input_config *buf_info);
  127. unsigned int mtkfb_query_buf_info(unsigned int session_id, unsigned int layer_id,
  128. unsigned long phy_addr, int query_type);
  129. #endif
  130. unsigned int mtkfb_query_release_idx(unsigned int session_id, unsigned int layer_id,
  131. unsigned long phy_addr);
  132. unsigned int mtkfb_query_frm_seq_by_addr(unsigned int session_id, unsigned int layer_id,
  133. unsigned long phy_addr);
  134. bool mtkfb_update_buf_info(unsigned int session_id, unsigned int layer_id, unsigned int idx,
  135. unsigned int mva_offset, unsigned int seq);
  136. struct mtkfb_fence_buf_info *mtkfb_init_buf_info(struct mtkfb_fence_buf_info *buf);
  137. void mtkfb_release_fence(unsigned int session_id, unsigned int layer_id, int fence);
  138. int mtkfb_find_fence_by_ticket(unsigned int session_id, int layer_id, int ticket);
  139. void mtkfb_update_fence_set_input_ticket(unsigned int session_id, unsigned int layer_id,
  140. int fence, unsigned int ticket, int enable);
  141. void mtkfb_update_present_fence_ticket(unsigned int session_id, int fence,
  142. unsigned int ticket);
  143. void mtkfb_update_fence_trigger_ticket(unsigned int session_id, unsigned int layer_id,
  144. int fence, unsigned int ticket);
  145. void mtkfb_release_present_fence(unsigned int session_id, int fence);
  146. void mtkfb_release_layer_fence(unsigned int session_id, unsigned int layer_id);
  147. /* int mtkfb_get_present_fence(disp_present_fence_info *buf, unsigned int *fence_fd, unsigned int *idx); */
  148. int mtkfb_fence_clean_thread(void *data);
  149. int mtkfb_fence_timeline_index(void);
  150. struct mtkfb_fence_buf_info *disp_sync_prepare_buf(disp_buffer_info *buf);
  151. int disp_sync_init(void);
  152. int disp_sync_get_cached_layer_info(unsigned int session_id, unsigned int timeline_idx,
  153. unsigned int *layer_en, unsigned long *addr,
  154. unsigned int *fence_idx);
  155. int disp_sync_put_cached_layer_info(unsigned int session_id, unsigned int timeline_idx,
  156. disp_input_config *src, unsigned long mva);
  157. int disp_sync_put_cached_layer_info_v2(unsigned int session_id, unsigned int timeline_idx,
  158. unsigned int fence_id, int layer_en, unsigned long mva);
  159. int disp_sync_convert_input_to_fence_layer_info(disp_input_config *src,
  160. FENCE_LAYER_INFO *dst,
  161. unsigned long dst_mva);
  162. int disp_sync_find_fence_idx_by_addr(unsigned int session_id, unsigned int timeline_id, unsigned long phy_addr);
  163. unsigned int disp_sync_query_buf_info(unsigned int session_id, unsigned int timeline_id,
  164. unsigned int idx, unsigned long *mva,
  165. unsigned int *size);
  166. int disp_sync_get_debug_info(char *stringbuf, int buf_len);
  167. int disp_sync_get_ovl_timeline_id(int layer_id);
  168. int disp_sync_get_output_timeline_id(void);
  169. int disp_sync_get_output_interface_timeline_id(void);
  170. int disp_sync_get_present_timeline_id(void);
  171. disp_session_sync_info *disp_get_session_sync_info_for_debug(unsigned int session_id);
  172. void mtkfb_release_session_fence(unsigned int session_id);
  173. disp_sync_info *_get_sync_info(unsigned int session_id, unsigned int timeline_id);
  174. #ifdef __cplusplus
  175. } /* extern C */
  176. #endif
  177. #endif