sde_hw_top.h 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (c) 2015-2021, The Linux Foundation. All rights reserved.
  4. */
  5. #ifndef _SDE_HW_TOP_H
  6. #define _SDE_HW_TOP_H
  7. #include "sde_hw_catalog.h"
  8. #include "sde_hw_mdss.h"
  9. #include "sde_hw_util.h"
  10. #include "sde_hw_blk.h"
  11. struct sde_hw_mdp;
  12. /**
  13. * struct traffic_shaper_cfg: traffic shaper configuration
  14. * @en : enable/disable traffic shaper
  15. * @rd_client : true if read client; false if write client
  16. * @client_id : client identifier
  17. * @bpc_denom : denominator of byte per clk
  18. * @bpc_numer : numerator of byte per clk
  19. */
  20. struct traffic_shaper_cfg {
  21. bool en;
  22. bool rd_client;
  23. u32 client_id;
  24. u32 bpc_denom;
  25. u64 bpc_numer;
  26. };
  27. /**
  28. * struct split_pipe_cfg - pipe configuration for dual display panels
  29. * @en : Enable/disable dual pipe confguration
  30. * @mode : Panel interface mode
  31. * @intf : Interface id for main control path
  32. * @pp_split_slave: Slave interface for ping pong split, INTF_MAX to disable
  33. * @pp_split_idx: Ping pong index for ping pong split
  34. * @split_flush_en: Allows both the paths to be flushed when master path is
  35. * flushed
  36. * @split_link_en: Check if split link is enabled
  37. */
  38. struct split_pipe_cfg {
  39. bool en;
  40. enum sde_intf_mode mode;
  41. enum sde_intf intf;
  42. enum sde_intf pp_split_slave;
  43. u32 pp_split_index;
  44. bool split_flush_en;
  45. bool split_link_en;
  46. };
  47. /**
  48. * struct cdm_output_cfg: output configuration for cdm
  49. * @wb_en : enable/disable writeback output
  50. * @intf_en : enable/disable interface output
  51. */
  52. struct cdm_output_cfg {
  53. bool wb_en;
  54. bool intf_en;
  55. };
  56. /**
  57. * struct sde_danger_safe_status: danger and safe status signals
  58. * @mdp: top level status
  59. * @sspp: source pipe status
  60. * @wb: writebck output status
  61. */
  62. struct sde_danger_safe_status {
  63. u8 mdp;
  64. u8 sspp[SSPP_MAX];
  65. u8 wb[WB_MAX];
  66. };
  67. /**
  68. * struct sde_vsync_source_cfg - configure vsync source and configure the
  69. * watchdog timers if required.
  70. * @pp_count: number of ping pongs active
  71. * @frame_rate: Display frame rate
  72. * @ppnumber: ping pong index array
  73. * @vsync_source: vsync source selection
  74. */
  75. struct sde_vsync_source_cfg {
  76. u32 pp_count;
  77. u32 frame_rate;
  78. u32 ppnumber[PINGPONG_MAX];
  79. u32 vsync_source;
  80. };
  81. /**
  82. * struct sde_hw_mdp_ops - interface to the MDP TOP Hw driver functions
  83. * Assumption is these functions will be called after clocks are enabled.
  84. * @setup_split_pipe : Programs the pipe control registers
  85. * @setup_pp_split : Programs the pp split control registers
  86. * @setup_cdm_output : programs cdm control
  87. * @setup_traffic_shaper : programs traffic shaper control
  88. */
  89. struct sde_hw_mdp_ops {
  90. /** setup_split_pipe() : Regsiters are not double buffered, thisk
  91. * function should be called before timing control enable
  92. * @mdp : mdp top context driver
  93. * @cfg : upper and lower part of pipe configuration
  94. */
  95. void (*setup_split_pipe)(struct sde_hw_mdp *mdp,
  96. struct split_pipe_cfg *p);
  97. /** setup_pp_split() : Configure pp split related registers
  98. * @mdp : mdp top context driver
  99. * @cfg : upper and lower part of pipe configuration
  100. */
  101. void (*setup_pp_split)(struct sde_hw_mdp *mdp,
  102. struct split_pipe_cfg *cfg);
  103. /**
  104. * setup_cdm_output() : Setup selection control of the cdm data path
  105. * @mdp : mdp top context driver
  106. * @cfg : cdm output configuration
  107. */
  108. void (*setup_cdm_output)(struct sde_hw_mdp *mdp,
  109. struct cdm_output_cfg *cfg);
  110. /**
  111. * setup_traffic_shaper() : Setup traffic shaper control
  112. * @mdp : mdp top context driver
  113. * @cfg : traffic shaper configuration
  114. */
  115. void (*setup_traffic_shaper)(struct sde_hw_mdp *mdp,
  116. struct traffic_shaper_cfg *cfg);
  117. /**
  118. * setup_clk_force_ctrl - set clock force control
  119. * @mdp: mdp top context driver
  120. * @clk_ctrl: clock to be controlled
  121. * @enable: force on enable
  122. * @return: if the clock is forced-on by this function
  123. */
  124. bool (*setup_clk_force_ctrl)(struct sde_hw_mdp *mdp,
  125. enum sde_clk_ctrl_type clk_ctrl, bool enable);
  126. /**
  127. * get_clk_ctrl_status - get clock control status
  128. * @mdp: mdp top context driver
  129. * @clk_ctrl: clock to be controlled
  130. * @status: returns true if clock is on
  131. * @return: 0 if success, otherwise return code
  132. */
  133. int (*get_clk_ctrl_status)(struct sde_hw_mdp *mdp,
  134. enum sde_clk_ctrl_type clk_ctrl, bool *status);
  135. /**
  136. * setup_vsync_source - setup vsync source configuration details
  137. * @mdp: mdp top context driver
  138. * @cfg: vsync source selection configuration
  139. */
  140. void (*setup_vsync_source)(struct sde_hw_mdp *mdp,
  141. struct sde_vsync_source_cfg *cfg);
  142. /**
  143. * reset_ubwc - reset top level UBWC configuration
  144. * @mdp: mdp top context driver
  145. * @m: pointer to mdss catalog data
  146. */
  147. void (*reset_ubwc)(struct sde_hw_mdp *mdp, struct sde_mdss_cfg *m);
  148. /**
  149. * intf_audio_select - select the external interface for audio
  150. * @mdp: mdp top context driver
  151. */
  152. void (*intf_audio_select)(struct sde_hw_mdp *mdp);
  153. /**
  154. * set_mdp_hw_events - enable qdss hardware events for mdp
  155. * @mdp: mdp top context driver
  156. * @enable: enable/disable hw events
  157. */
  158. void (*set_mdp_hw_events)(struct sde_hw_mdp *mdp, bool enable);
  159. /**
  160. * set_cwb_ppb_cntl - select the data point for CWB
  161. * @mdp: mdp top context driver
  162. * @dual: indicates if dual pipe line needs to be programmed
  163. * @dspp_out : true if dspp output required. LM is default tap point
  164. */
  165. void (*set_cwb_ppb_cntl)(struct sde_hw_mdp *mdp,
  166. bool dual, bool dspp_out);
  167. /**
  168. * set_hdr_plus_metadata - program the dynamic hdr metadata
  169. * @mdp: mdp top context driver
  170. * @payload: pointer to payload data
  171. * @len: size of the valid data within payload
  172. * @stream_id: stream ID for MST (0 or 1)
  173. */
  174. void (*set_hdr_plus_metadata)(struct sde_hw_mdp *mdp,
  175. u8 *payload, u32 len, u32 stream_id);
  176. /**
  177. * get_autorefresh_status - get autorefresh status
  178. * @mdp: mdp top context driver
  179. * @intf_idx: intf block index for relative information
  180. */
  181. u32 (*get_autorefresh_status)(struct sde_hw_mdp *mdp,
  182. u32 intf_idx);
  183. };
  184. struct sde_hw_mdp {
  185. struct sde_hw_blk base;
  186. struct sde_hw_blk_reg_map hw;
  187. /* top */
  188. enum sde_mdp idx;
  189. const struct sde_mdp_cfg *caps;
  190. /* ops */
  191. struct sde_hw_mdp_ops ops;
  192. };
  193. struct sde_hw_sid {
  194. /* rotator base */
  195. struct sde_hw_blk_reg_map hw;
  196. };
  197. /**
  198. * sde_hw_sid_init - initialize the sid blk reg map
  199. * @addr: Mapped register io address
  200. * @sid_len: Length of block
  201. * @m: Pointer to mdss catalog data
  202. */
  203. struct sde_hw_sid *sde_hw_sid_init(void __iomem *addr,
  204. u32 sid_len, const struct sde_mdss_cfg *m);
  205. /**
  206. * sde_hw_set_rotator_sid - set sid values for rotator
  207. * sid: sde_hw_sid passed from kms
  208. */
  209. void sde_hw_set_rotator_sid(struct sde_hw_sid *sid);
  210. /**
  211. * sde_hw_set_sspp_sid - set sid values for the pipes
  212. * sid: sde_hw_sid passed from kms
  213. * pipe: sspp id
  214. * vm: vm id to set for SIDs
  215. */
  216. void sde_hw_set_sspp_sid(struct sde_hw_sid *sid, u32 pipe, u32 vm);
  217. /**
  218. * sde_hw_set_lutdma_sid - set sid values for the pipes
  219. * sid: sde_hw_sid passed from kms
  220. * vm: vm id to set for SIDs
  221. */
  222. void sde_hw_set_lutdma_sid(struct sde_hw_sid *sid, u32 vm);
  223. /**
  224. * to_sde_hw_mdp - convert base object sde_hw_base to container
  225. * @hw: Pointer to base hardware block
  226. * return: Pointer to hardware block container
  227. */
  228. static inline struct sde_hw_mdp *to_sde_hw_mdp(struct sde_hw_blk *hw)
  229. {
  230. return container_of(hw, struct sde_hw_mdp, base);
  231. }
  232. /**
  233. * sde_hw_mdptop_init - initializes the top driver for the passed idx
  234. * @idx: Interface index for which driver object is required
  235. * @addr: Mapped register io address of MDP
  236. * @m: Pointer to mdss catalog data
  237. */
  238. struct sde_hw_mdp *sde_hw_mdptop_init(enum sde_mdp idx,
  239. void __iomem *addr,
  240. const struct sde_mdss_cfg *m);
  241. void sde_hw_mdp_destroy(struct sde_hw_mdp *mdp);
  242. #endif /*_SDE_HW_TOP_H */