sde_encoder.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. /*
  2. * Copyright (c) 2015-2019, The Linux Foundation. All rights reserved.
  3. * Copyright (C) 2013 Red Hat
  4. * Author: Rob Clark <[email protected]>
  5. *
  6. * This program is free software; you can redistribute it and/or modify it
  7. * under the terms of the GNU General Public License version 2 as published by
  8. * the Free Software Foundation.
  9. *
  10. * This program is distributed in the hope that it will be useful, but WITHOUT
  11. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  12. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  13. * more details.
  14. *
  15. * You should have received a copy of the GNU General Public License along with
  16. * this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. #ifndef __SDE_ENCODER_H__
  19. #define __SDE_ENCODER_H__
  20. #include <drm/drm_crtc.h>
  21. #include "msm_prop.h"
  22. #include "sde_hw_mdss.h"
  23. #include "sde_kms.h"
  24. #define MAX_CHANNELS_PER_ENC 2
  25. #define SDE_ENCODER_FRAME_EVENT_DONE BIT(0)
  26. #define SDE_ENCODER_FRAME_EVENT_ERROR BIT(1)
  27. #define SDE_ENCODER_FRAME_EVENT_PANEL_DEAD BIT(2)
  28. #define SDE_ENCODER_FRAME_EVENT_SIGNAL_RELEASE_FENCE BIT(3)
  29. #define SDE_ENCODER_FRAME_EVENT_SIGNAL_RETIRE_FENCE BIT(4)
  30. #define IDLE_POWERCOLLAPSE_DURATION (66 - 16/2)
  31. #define IDLE_POWERCOLLAPSE_IN_EARLY_WAKEUP (200 - 16/2)
  32. /**
  33. * Encoder functions and data types
  34. * @intfs: Interfaces this encoder is using, INTF_MODE_NONE if unused
  35. * @wbs: Writebacks this encoder is using, INTF_MODE_NONE if unused
  36. * @needs_cdm: Encoder requests a CDM based on pixel format conversion needs
  37. * @display_num_of_h_tiles: Number of horizontal tiles in case of split
  38. * interface
  39. * @is_primary: set to true if the display is primary display
  40. * @topology: Topology of the display
  41. */
  42. struct sde_encoder_hw_resources {
  43. enum sde_intf_mode intfs[INTF_MAX];
  44. enum sde_intf_mode wbs[WB_MAX];
  45. bool needs_cdm;
  46. u32 display_num_of_h_tiles;
  47. bool is_primary;
  48. struct msm_display_topology topology;
  49. };
  50. /**
  51. * sde_encoder_kickoff_params - info encoder requires at kickoff
  52. * @is_primary: set to true if the display is primary display
  53. * @affected_displays: bitmask, bit set means the ROI of the commit lies within
  54. * the bounds of the physical display at the bit index
  55. * @recovery_events_enabled: indicates status of client for recoovery events
  56. * @frame_trigger_mode: indicates frame trigger mode
  57. */
  58. struct sde_encoder_kickoff_params {
  59. u32 is_primary;
  60. unsigned long affected_displays;
  61. bool recovery_events_enabled;
  62. enum frame_trigger_mode_type frame_trigger_mode;
  63. };
  64. /**
  65. * sde_encoder_get_hw_resources - Populate table of required hardware resources
  66. * @encoder: encoder pointer
  67. * @hw_res: resource table to populate with encoder required resources
  68. * @conn_state: report hw reqs based on this proposed connector state
  69. */
  70. void sde_encoder_get_hw_resources(struct drm_encoder *encoder,
  71. struct sde_encoder_hw_resources *hw_res,
  72. struct drm_connector_state *conn_state);
  73. /**
  74. * sde_encoder_register_vblank_callback - provide callback to encoder that
  75. * will be called on the next vblank.
  76. * @encoder: encoder pointer
  77. * @cb: callback pointer, provide NULL to deregister and disable IRQs
  78. * @data: user data provided to callback
  79. */
  80. void sde_encoder_register_vblank_callback(struct drm_encoder *encoder,
  81. void (*cb)(void *), void *data);
  82. /**
  83. * sde_encoder_register_frame_event_callback - provide callback to encoder that
  84. * will be called after the request is complete, or other events.
  85. * @encoder: encoder pointer
  86. * @cb: callback pointer, provide NULL to deregister
  87. * @crtc: pointer to drm_crtc object interested in frame events
  88. */
  89. void sde_encoder_register_frame_event_callback(struct drm_encoder *encoder,
  90. void (*cb)(void *, u32), struct drm_crtc *crtc);
  91. /**
  92. * sde_encoder_get_rsc_client - gets the rsc client state for primary
  93. * for primary display.
  94. * @encoder: encoder pointer
  95. */
  96. struct sde_rsc_client *sde_encoder_get_rsc_client(struct drm_encoder *encoder);
  97. /**
  98. * sde_encoder_poll_line_counts - poll encoder line counts for start of frame
  99. * @encoder: encoder pointer
  100. * @Returns: zero on success
  101. */
  102. int sde_encoder_poll_line_counts(struct drm_encoder *encoder);
  103. /**
  104. * sde_encoder_prepare_for_kickoff - schedule double buffer flip of the ctl
  105. * path (i.e. ctl flush and start) at next appropriate time.
  106. * Immediately: if no previous commit is outstanding.
  107. * Delayed: Block until next trigger can be issued.
  108. * @encoder: encoder pointer
  109. * @params: kickoff time parameters
  110. * @Returns: Zero on success, last detected error otherwise
  111. */
  112. int sde_encoder_prepare_for_kickoff(struct drm_encoder *encoder,
  113. struct sde_encoder_kickoff_params *params);
  114. /**
  115. * sde_encoder_trigger_kickoff_pending - Clear the flush bits from previous
  116. * kickoff and trigger the ctl prepare progress for command mode display.
  117. * @encoder: encoder pointer
  118. */
  119. void sde_encoder_trigger_kickoff_pending(struct drm_encoder *encoder);
  120. /**
  121. * sde_encoder_kickoff - trigger a double buffer flip of the ctl path
  122. * (i.e. ctl flush and start) immediately.
  123. * @encoder: encoder pointer
  124. * @is_error: whether the current commit needs to be aborted and replaced
  125. * with a 'safe' commit
  126. */
  127. void sde_encoder_kickoff(struct drm_encoder *encoder, bool is_error);
  128. /**
  129. * sde_encoder_wait_for_event - Waits for encoder events
  130. * @encoder: encoder pointer
  131. * @event: event to wait for
  132. * MSM_ENC_COMMIT_DONE - Wait for hardware to have flushed the current pending
  133. * frames to hardware at a vblank or ctl_start
  134. * Encoders will map this differently depending on the
  135. * panel type.
  136. * vid mode -> vsync_irq
  137. * cmd mode -> ctl_start
  138. * MSM_ENC_TX_COMPLETE - Wait for the hardware to transfer all the pixels to
  139. * the panel. Encoders will map this differently
  140. * depending on the panel type.
  141. * vid mode -> vsync_irq
  142. * cmd mode -> pp_done
  143. * Returns: 0 on success, -EWOULDBLOCK if already signaled, error otherwise
  144. */
  145. int sde_encoder_wait_for_event(struct drm_encoder *drm_encoder,
  146. enum msm_event_wait event);
  147. /**
  148. * sde_encoder_idle_request - request for idle request to avoid 4 vsync cycle
  149. * to turn off the clocks.
  150. * @encoder: encoder pointer
  151. * Returns: 0 on success, errorcode otherwise
  152. */
  153. int sde_encoder_idle_request(struct drm_encoder *drm_enc);
  154. /*
  155. * sde_encoder_get_fps - get interface frame rate of the given encoder
  156. * @encoder: Pointer to drm encoder object
  157. */
  158. u32 sde_encoder_get_fps(struct drm_encoder *encoder);
  159. /*
  160. * sde_encoder_get_intf_mode - get interface mode of the given encoder
  161. * @encoder: Pointer to drm encoder object
  162. */
  163. enum sde_intf_mode sde_encoder_get_intf_mode(struct drm_encoder *encoder);
  164. /**
  165. * sde_encoder_control_te - control enabling/disabling VSYNC_IN_EN
  166. * @encoder: encoder pointer
  167. * @enable: boolean to indicate enable/disable
  168. */
  169. void sde_encoder_control_te(struct drm_encoder *encoder, bool enable);
  170. /**
  171. * sde_encoder_virt_restore - restore the encoder configs
  172. * @encoder: encoder pointer
  173. */
  174. void sde_encoder_virt_restore(struct drm_encoder *encoder);
  175. /**
  176. * sde_encoder_is_dsc_merge - check if encoder is in DSC merge mode
  177. * @drm_enc: Pointer to drm encoder object
  178. * @Return: true if encoder is in DSC merge mode
  179. */
  180. bool sde_encoder_is_dsc_merge(struct drm_encoder *drm_enc);
  181. /**
  182. * sde_encoder_check_curr_mode - check if given mode is supported or not
  183. * @drm_enc: Pointer to drm encoder object
  184. * @mode: Mode to be checked
  185. * @Return: true if it is cmd mode
  186. */
  187. bool sde_encoder_check_curr_mode(struct drm_encoder *drm_enc, u32 mode);
  188. /**
  189. * sde_encoder_init - initialize virtual encoder object
  190. * @dev: Pointer to drm device structure
  191. * @disp_info: Pointer to display information structure
  192. * Returns: Pointer to newly created drm encoder
  193. */
  194. struct drm_encoder *sde_encoder_init(
  195. struct drm_device *dev,
  196. struct msm_display_info *disp_info);
  197. /**
  198. * sde_encoder_destroy - destroy previously initialized virtual encoder
  199. * @drm_enc: Pointer to previously created drm encoder structure
  200. */
  201. void sde_encoder_destroy(struct drm_encoder *drm_enc);
  202. /**
  203. * sde_encoder_prepare_commit - prepare encoder at the very beginning of an
  204. * atomic commit, before any registers are written
  205. * @drm_enc: Pointer to previously created drm encoder structure
  206. */
  207. void sde_encoder_prepare_commit(struct drm_encoder *drm_enc);
  208. /**
  209. * sde_encoder_update_caps_for_cont_splash - update encoder settings during
  210. * device bootup when cont_splash is enabled
  211. * @drm_enc: Pointer to drm encoder structure
  212. * @splash_display: Pointer to sde_splash_display corresponding to this encoder
  213. * @enable: boolean indicates enable or displae state of splash
  214. * @Return: true if successful in updating the encoder structure
  215. */
  216. int sde_encoder_update_caps_for_cont_splash(struct drm_encoder *encoder,
  217. struct sde_splash_display *splash_display, bool enable);
  218. /**
  219. * sde_encoder_display_failure_notification - update sde encoder state for
  220. * esd timeout or other display failure notification. This event flows from
  221. * dsi, sde_connector to sde_encoder.
  222. *
  223. * This api must not be called from crtc_commit (display) thread because it
  224. * requests the flush work on same thread. It is called from esd check thread
  225. * based on current design.
  226. *
  227. * TODO: manage the event at sde_kms level for forward processing.
  228. * @drm_enc: Pointer to drm encoder structure
  229. * @Return: true if successful in updating the encoder structure
  230. */
  231. int sde_encoder_display_failure_notification(struct drm_encoder *enc);
  232. /**
  233. * sde_encoder_recovery_events_enabled - checks if client has enabled
  234. * sw recovery mechanism for this connector
  235. * @drm_enc: Pointer to drm encoder structure
  236. * @Return: true if enabled
  237. */
  238. bool sde_encoder_recovery_events_enabled(struct drm_encoder *encoder);
  239. /**
  240. * sde_encoder_recovery_events_handler - handler to enable/disable the
  241. * sw recovery for this connector
  242. * @drm_enc: Pointer to drm encoder structure
  243. */
  244. void sde_encoder_recovery_events_handler(struct drm_encoder *encoder,
  245. bool val);
  246. /**
  247. * sde_encoder_in_clone_mode - checks if underlying phys encoder is in clone
  248. * mode or independent display mode. ref@ WB in Concurrent writeback mode.
  249. * @drm_enc: Pointer to drm encoder structure
  250. * @Return: true if successful in updating the encoder structure
  251. */
  252. bool sde_encoder_in_clone_mode(struct drm_encoder *enc);
  253. /**
  254. * sde_encoder_is_primary_display - checks if underlying display is primary
  255. * display or not.
  256. * @drm_enc: Pointer to drm encoder structure
  257. * @Return: true if it is primary display. false if secondary display
  258. */
  259. bool sde_encoder_is_primary_display(struct drm_encoder *enc);
  260. /**
  261. * sde_encoder_control_idle_pc - control enable/disable of idle power collapse
  262. * @drm_enc: Pointer to drm encoder structure
  263. * @enable: enable/disable flag
  264. */
  265. void sde_encoder_control_idle_pc(struct drm_encoder *enc, bool enable);
  266. /**
  267. * sde_encoder_in_cont_splash - checks if display is in continuous splash
  268. * @drm_enc: Pointer to drm encoder structure
  269. * @Return: true if display in continuous splash
  270. */
  271. int sde_encoder_in_cont_splash(struct drm_encoder *enc);
  272. /**
  273. * sde_encoder_uidle_enable - control enable/disable of uidle
  274. * @drm_enc: Pointer to drm encoder structure
  275. * @enable: enable/disable flag
  276. */
  277. void sde_encoder_uidle_enable(struct drm_encoder *drm_enc, bool enable);
  278. #endif /* __SDE_ENCODER_H__ */