mdss.h 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. /* Copyright (c) 2012-2014, The Linux Foundation. All rights reserved.
  2. *
  3. * This program is free software; you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License version 2 and
  5. * only version 2 as published by the Free Software Foundation.
  6. *
  7. * This program is distributed in the hope that it will be useful,
  8. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  10. * GNU General Public License for more details.
  11. *
  12. */
  13. #ifndef MDSS_H
  14. #define MDSS_H
  15. #include <linux/msm_ion.h>
  16. #include <linux/earlysuspend.h>
  17. #include <linux/msm_mdp.h>
  18. #include <linux/spinlock.h>
  19. #include <linux/types.h>
  20. #include <linux/workqueue.h>
  21. #include <mach/iommu_domains.h>
  22. #include "mdss_panel.h"
  23. #define MDSS_REG_WRITE(addr, val) writel_relaxed(val, mdss_res->mdp_base + addr)
  24. #define MDSS_REG_READ(addr) readl_relaxed(mdss_res->mdp_base + addr)
  25. #define MAX_DRV_SUP_MMB_BLKS 44
  26. enum mdss_mdp_clk_type {
  27. MDSS_CLK_AHB,
  28. MDSS_CLK_AXI,
  29. MDSS_CLK_MDP_SRC,
  30. MDSS_CLK_MDP_CORE,
  31. MDSS_CLK_MDP_LUT,
  32. MDSS_CLK_MDP_VSYNC,
  33. MDSS_MAX_CLK
  34. };
  35. enum mdss_iommu_domain_type {
  36. MDSS_IOMMU_DOMAIN_SECURE,
  37. MDSS_IOMMU_DOMAIN_UNSECURE,
  38. MDSS_IOMMU_MAX_DOMAIN
  39. };
  40. struct mdss_iommu_map_type {
  41. char *client_name;
  42. char *ctx_name;
  43. struct device *ctx;
  44. struct msm_iova_partition partitions[1];
  45. int npartitions;
  46. int domain_idx;
  47. };
  48. struct mdss_hw_settings {
  49. char __iomem *reg;
  50. u32 val;
  51. };
  52. struct mdss_debug_inf {
  53. void *debug_data;
  54. int (*debug_dump_stats)(void *data, char *buf, int len);
  55. void (*debug_enable_clock)(int on);
  56. };
  57. #define MDSS_IRQ_SUSPEND -1
  58. #define MDSS_IRQ_RESUME 1
  59. #define MDSS_IRQ_REQ 0
  60. struct mdss_intr {
  61. /* requested intr */
  62. u32 req;
  63. /* currently enabled intr */
  64. u32 curr;
  65. int state;
  66. spinlock_t lock;
  67. };
  68. struct mdss_fudge_factor {
  69. u32 numer;
  70. u32 denom;
  71. };
  72. struct mdss_perf_tune {
  73. unsigned long min_mdp_clk;
  74. u64 min_bus_vote;
  75. };
  76. struct mdss_prefill_data {
  77. u32 ot_bytes;
  78. u32 y_buf_bytes;
  79. u32 y_scaler_lines_bilinear;
  80. u32 y_scaler_lines_caf;
  81. u32 post_scaler_pixels;
  82. u32 pp_pixels;
  83. u32 fbc_lines;
  84. };
  85. enum mdss_hw_index {
  86. MDSS_HW_MDP,
  87. MDSS_HW_DSI0,
  88. MDSS_HW_DSI1,
  89. MDSS_HW_HDMI,
  90. MDSS_HW_EDP,
  91. MDSS_MAX_HW_BLK
  92. };
  93. struct mdss_data_type {
  94. u32 mdp_rev;
  95. struct clk *mdp_clk[MDSS_MAX_CLK];
  96. struct regulator *fs;
  97. struct regulator *vdd_cx;
  98. bool batfet_required;
  99. struct regulator *batfet;
  100. u32 max_mdp_clk_rate;
  101. struct mdss_util_intf *mdss_util;
  102. struct platform_device *pdev;
  103. char __iomem *mdp_base;
  104. size_t mdp_reg_size;
  105. char __iomem *vbif_base;
  106. struct mutex reg_lock;
  107. u32 irq;
  108. u32 irq_mask;
  109. u32 irq_ena;
  110. u32 irq_buzy;
  111. u32 has_bwc;
  112. u32 has_decimation;
  113. u8 has_wfd_blk;
  114. u32 has_no_lut_read;
  115. atomic_t sd_client_count;
  116. u8 has_wb_ad;
  117. bool idle_pc_enabled;
  118. u32 rotator_ot_limit;
  119. u32 mdp_irq_mask;
  120. u32 mdp_hist_irq_mask;
  121. int suspend_fs_ena;
  122. u8 clk_ena;
  123. u8 fs_ena;
  124. u8 vsync_ena;
  125. u32 res_init;
  126. u32 highest_bank_bit;
  127. u32 smp_mb_cnt;
  128. u32 smp_mb_size;
  129. u32 smp_mb_per_pipe;
  130. u32 rot_block_size;
  131. u32 max_bw_low;
  132. u32 max_bw_high;
  133. u32 axi_port_cnt;
  134. u32 curr_bw_uc_idx;
  135. u32 bus_hdl;
  136. struct msm_bus_scale_pdata *bus_scale_table;
  137. struct mdss_fudge_factor ab_factor;
  138. struct mdss_fudge_factor ib_factor;
  139. struct mdss_fudge_factor ib_factor_overlap;
  140. struct mdss_fudge_factor clk_factor;
  141. u32 *clock_levels;
  142. u32 nclk_lvl;
  143. u32 enable_bw_release;
  144. u32 enable_rotator_bw_release;
  145. struct mdss_hw_settings *hw_settings;
  146. struct mdss_mdp_pipe *vig_pipes;
  147. struct mdss_mdp_pipe *rgb_pipes;
  148. struct mdss_mdp_pipe *dma_pipes;
  149. u32 nvig_pipes;
  150. u32 nrgb_pipes;
  151. u32 ndma_pipes;
  152. DECLARE_BITMAP(mmb_alloc_map, MAX_DRV_SUP_MMB_BLKS);
  153. struct mdss_mdp_mixer *mixer_intf;
  154. struct mdss_mdp_mixer *mixer_wb;
  155. u32 nmixers_intf;
  156. u32 nmixers_wb;
  157. struct mdss_mdp_ctl *ctl_off;
  158. u32 nctl;
  159. struct mdss_mdp_dp_intf *dp_off;
  160. u32 ndp;
  161. void *video_intf;
  162. u32 nintf;
  163. u32 pp_bus_hdl;
  164. struct mdss_mdp_ad *ad_off;
  165. struct mdss_ad_info *ad_cfgs;
  166. u32 nad_cfgs;
  167. u32 nmax_concurrent_ad_hw;
  168. struct workqueue_struct *ad_calc_wq;
  169. struct mdss_intr hist_intr;
  170. struct ion_client *iclient;
  171. int iommu_attached;
  172. struct mdss_iommu_map_type *iommu_map;
  173. struct early_suspend early_suspend;
  174. struct mdss_debug_inf debug_inf;
  175. bool mixer_switched;
  176. struct mdss_panel_cfg pan_cfg;
  177. int handoff_pending;
  178. struct mdss_prefill_data prefill_data;
  179. bool idle_pc;
  180. struct mdss_perf_tune perf_tune;
  181. int iommu_ref_cnt;
  182. u64 ab[MDSS_MAX_HW_BLK];
  183. u64 ib[MDSS_MAX_HW_BLK];
  184. };
  185. extern struct mdss_data_type *mdss_res;
  186. struct mdss_hw {
  187. u32 hw_ndx;
  188. void *ptr;
  189. irqreturn_t (*irq_handler)(int irq, void *ptr);
  190. };
  191. struct mdss_util_intf {
  192. void (*iommu_lock)(void);
  193. void (*iommu_unlock)(void);
  194. };
  195. struct mdss_util_intf *mdss_get_util_intf(void);
  196. int mdss_register_irq(struct mdss_hw *hw);
  197. void mdss_enable_irq(struct mdss_hw *hw);
  198. void mdss_disable_irq(struct mdss_hw *hw);
  199. void mdss_disable_irq_nosync(struct mdss_hw *hw);
  200. void mdss_bus_bandwidth_ctrl(int enable);
  201. int mdss_iommu_ctrl(int enable);
  202. int mdss_bus_scale_set_quota(int client, u64 ab_quota, u64 ib_quota);
  203. void mdss_mdp_dump_power_clk(void);
  204. #if defined (CONFIG_FB_MSM_MDSS_DSI_DBG)
  205. int mdss_mdp_debug_bus(void);
  206. void xlog(const char *name, u32 data0, u32 data1, u32 data2, u32 data3, u32 data4, u32 data5);
  207. void xlog_dump(void);
  208. #endif
  209. #if defined (CONFIG_FB_MSM_MDSS_DBG_SEQ_TICK)
  210. void mdss_dbg_tick_save(int op_name);
  211. #endif
  212. static inline struct ion_client *mdss_get_ionclient(void)
  213. {
  214. if (!mdss_res)
  215. return NULL;
  216. return mdss_res->iclient;
  217. }
  218. static inline int is_mdss_iommu_attached(void)
  219. {
  220. if (!mdss_res)
  221. return false;
  222. return mdss_res->iommu_attached;
  223. }
  224. static inline int mdss_get_iommu_domain(u32 type)
  225. {
  226. if (type >= MDSS_IOMMU_MAX_DOMAIN)
  227. return -EINVAL;
  228. if (!mdss_res)
  229. return -ENODEV;
  230. return mdss_res->iommu_map[type].domain_idx;
  231. }
  232. static inline int mdss_get_sd_client_cnt(void)
  233. {
  234. if (!mdss_res)
  235. return 0;
  236. else
  237. return atomic_read(&mdss_res->sd_client_count);
  238. }
  239. #endif /* MDSS_H */