mdss_mdp.h 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789
  1. /*
  2. * Copyright (c) 2012-2015, The Linux Foundation. All rights reserved.
  3. *
  4. * This program is free software; you can redistribute it and/or modify
  5. * it under the terms of the GNU General Public License version 2 and
  6. * only version 2 as published by the Free Software Foundation.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. *
  13. */
  14. #ifndef MDSS_MDP_H
  15. #define MDSS_MDP_H
  16. #include <linux/io.h>
  17. #include <linux/msm_mdp.h>
  18. #include <linux/platform_device.h>
  19. #include <linux/notifier.h>
  20. #include <linux/kref.h>
  21. #include <linux/kthread.h>
  22. #include "mdss.h"
  23. #include "mdss_mdp_hwio.h"
  24. #include "mdss_fb.h"
  25. #define MDSS_MDP_DEFAULT_INTR_MASK 0
  26. #define MDSS_MDP_CURSOR_WIDTH 64
  27. #define MDSS_MDP_CURSOR_HEIGHT 64
  28. #define MDSS_MDP_CURSOR_SIZE (MDSS_MDP_CURSOR_WIDTH*MDSS_MDP_CURSOR_WIDTH*4)
  29. #define MDP_CLK_DEFAULT_RATE 200000000
  30. #define PHASE_STEP_SHIFT 21
  31. #define MAX_MIXER_WIDTH 2048
  32. #define MAX_LINE_BUFFER_WIDTH 2048
  33. #define MAX_MIXER_HEIGHT 0xFFFF
  34. #define MAX_IMG_WIDTH 0x3FFF
  35. #define MAX_IMG_HEIGHT 0x3FFF
  36. #define MAX_DST_W MAX_MIXER_WIDTH
  37. #define MAX_DST_H MAX_MIXER_HEIGHT
  38. #define MAX_DOWNSCALE_RATIO 4
  39. #define MAX_UPSCALE_RATIO 20
  40. #define MAX_DECIMATION 4
  41. #define MDP_MIN_VBP 4
  42. #define MAX_FREE_LIST_SIZE 12
  43. #define C3_ALPHA 3 /* alpha */
  44. #define C2_R_Cr 2 /* R/Cr */
  45. #define C1_B_Cb 1 /* B/Cb */
  46. #define C0_G_Y 0 /* G/luma */
  47. /* wait for at most 2 vsync for lowest refresh rate (24hz) */
  48. #define KOFF_TIMEOUT msecs_to_jiffies(84)
  49. #define OVERFETCH_DISABLE_TOP BIT(0)
  50. #define OVERFETCH_DISABLE_BOTTOM BIT(1)
  51. #define OVERFETCH_DISABLE_LEFT BIT(2)
  52. #define OVERFETCH_DISABLE_RIGHT BIT(3)
  53. #ifdef MDSS_MDP_DEBUG_REG
  54. static inline void mdss_mdp_reg_write(u32 addr, u32 val)
  55. {
  56. pr_debug("0x%05X = 0x%08X\n", addr, val);
  57. MDSS_REG_WRITE(addr, val);
  58. }
  59. #define MDSS_MDP_REG_WRITE(addr, val) mdss_mdp_reg_write((u32)addr, (u32)(val))
  60. static inline u32 mdss_mdp_reg_read(u32 addr)
  61. {
  62. u32 val;
  63. val = MDSS_REG_READ(addr);
  64. pr_debug("0x%05X = 0x%08X\n", addr, val);
  65. return val;
  66. }
  67. #define MDSS_MDP_REG_READ(addr) mdss_mdp_reg_read((u32)(addr))
  68. #else
  69. #define MDSS_MDP_REG_WRITE(addr, val) MDSS_REG_WRITE((u32)(addr), (u32)(val))
  70. #define MDSS_MDP_REG_READ(addr) MDSS_REG_READ((u32)(addr))
  71. #endif
  72. #define PERF_STATUS_DONE 0
  73. #define PERF_STATUS_BUSY 1
  74. enum mdss_mdp_perf_state_type {
  75. PERF_SW_COMMIT_STATE = 0,
  76. PERF_HW_MDP_STATE,
  77. };
  78. enum mdss_mdp_block_power_state {
  79. MDP_BLOCK_POWER_OFF = 0,
  80. MDP_BLOCK_POWER_ON = 1,
  81. };
  82. enum mdss_mdp_mixer_type {
  83. MDSS_MDP_MIXER_TYPE_UNUSED,
  84. MDSS_MDP_MIXER_TYPE_INTF,
  85. MDSS_MDP_MIXER_TYPE_WRITEBACK,
  86. };
  87. enum mdss_mdp_mixer_mux {
  88. MDSS_MDP_MIXER_MUX_DEFAULT,
  89. MDSS_MDP_MIXER_MUX_LEFT,
  90. MDSS_MDP_MIXER_MUX_RIGHT,
  91. };
  92. enum mdss_mdp_pipe_type {
  93. MDSS_MDP_PIPE_TYPE_UNUSED,
  94. MDSS_MDP_PIPE_TYPE_VIG,
  95. MDSS_MDP_PIPE_TYPE_RGB,
  96. MDSS_MDP_PIPE_TYPE_DMA,
  97. };
  98. enum mdss_mdp_block_type {
  99. MDSS_MDP_BLOCK_UNUSED,
  100. MDSS_MDP_BLOCK_SSPP,
  101. MDSS_MDP_BLOCK_MIXER,
  102. MDSS_MDP_BLOCK_DSPP,
  103. MDSS_MDP_BLOCK_WB,
  104. MDSS_MDP_BLOCK_MAX
  105. };
  106. enum mdss_mdp_csc_type {
  107. MDSS_MDP_CSC_RGB2RGB,
  108. MDSS_MDP_CSC_YUV2RGB,
  109. MDSS_MDP_CSC_RGB2YUV,
  110. MDSS_MDP_CSC_YUV2YUV,
  111. MDSS_MDP_MAX_CSC
  112. };
  113. struct splash_pipe_cfg {
  114. int width;
  115. int height;
  116. int mixer;
  117. };
  118. struct mdss_mdp_ctl;
  119. typedef void (*mdp_vsync_handler_t)(struct mdss_mdp_ctl *, ktime_t);
  120. struct mdss_mdp_img_rect {
  121. u16 x;
  122. u16 y;
  123. u16 w;
  124. u16 h;
  125. };
  126. struct mdss_mdp_vsync_handler {
  127. bool enabled;
  128. bool cmd_post_flush;
  129. mdp_vsync_handler_t vsync_handler;
  130. u32 ref_cnt;
  131. struct list_head list;
  132. };
  133. enum mdss_mdp_wb_ctl_type {
  134. MDSS_MDP_WB_CTL_TYPE_BLOCK = 1,
  135. MDSS_MDP_WB_CTL_TYPE_LINE
  136. };
  137. struct mdss_mdp_perf_params {
  138. u64 bw_overlap;
  139. u64 bw_prefill;
  140. u32 prefill_bytes;
  141. u64 bw_ctl;
  142. u32 mdp_clk_rate;
  143. };
  144. struct mdss_mdp_ctl {
  145. u32 num;
  146. char __iomem *base;
  147. char __iomem *wb_base;
  148. u32 ref_cnt;
  149. int power_on;
  150. u32 panel_ndx;
  151. u32 intf_num;
  152. u32 intf_type;
  153. u32 opmode;
  154. u32 flush_bits;
  155. bool is_video_mode;
  156. u32 play_cnt;
  157. u32 vsync_cnt;
  158. u32 underrun_cnt;
  159. u16 width;
  160. u16 height;
  161. u32 dst_format;
  162. bool is_secure;
  163. u32 clk_rate;
  164. int force_screen_state;
  165. struct mdss_mdp_perf_params cur_perf;
  166. struct mdss_mdp_perf_params new_perf;
  167. u32 perf_transaction_status;
  168. bool perf_release_ctl_bw;
  169. struct mdss_data_type *mdata;
  170. struct msm_fb_data_type *mfd;
  171. struct mdss_mdp_mixer *mixer_left;
  172. struct mdss_mdp_mixer *mixer_right;
  173. struct mutex lock;
  174. struct mutex *shared_lock;
  175. struct mutex *wb_lock;
  176. spinlock_t spin_lock;
  177. struct mdss_panel_data *panel_data;
  178. struct mdss_mdp_vsync_handler vsync_handler;
  179. struct mdss_mdp_vsync_handler recover_underrun_handler;
  180. struct work_struct recover_work;
  181. struct work_struct remove_underrun_handler;
  182. struct mdss_mdp_img_rect roi;
  183. struct mdss_mdp_img_rect roi_bkup;
  184. u8 roi_changed;
  185. int (*start_fnc) (struct mdss_mdp_ctl *ctl);
  186. int (*stop_fnc) (struct mdss_mdp_ctl *ctl);
  187. int (*prepare_fnc) (struct mdss_mdp_ctl *ctl, void *arg);
  188. int (*display_fnc) (struct mdss_mdp_ctl *ctl, void *arg);
  189. int (*wait_fnc) (struct mdss_mdp_ctl *ctl, void *arg);
  190. int (*wait_pingpong) (struct mdss_mdp_ctl *ctl, void *arg);
  191. int (*wait_video_pingpong) (struct mdss_mdp_ctl *ctl, void *arg);
  192. u32 (*read_line_cnt_fnc) (struct mdss_mdp_ctl *);
  193. int (*add_vsync_handler) (struct mdss_mdp_ctl *,
  194. struct mdss_mdp_vsync_handler *);
  195. int (*remove_vsync_handler) (struct mdss_mdp_ctl *,
  196. struct mdss_mdp_vsync_handler *);
  197. int (*config_fps_fnc) (struct mdss_mdp_ctl *ctl,
  198. struct mdss_mdp_ctl *sctl, int new_fps);
  199. struct blocking_notifier_head notifier_head;
  200. void *priv_data;
  201. u32 wb_type;
  202. u64 bw_pending;
  203. };
  204. struct mdss_mdp_mixer {
  205. u32 num;
  206. u32 ref_cnt;
  207. char __iomem *base;
  208. char __iomem *dspp_base;
  209. char __iomem *pingpong_base;
  210. u8 type;
  211. u8 params_changed;
  212. u16 width;
  213. u16 height;
  214. struct mdss_mdp_img_rect roi;
  215. u8 cursor_enabled;
  216. u8 rotator_mode;
  217. struct mdss_mdp_ctl *ctl;
  218. struct mdss_mdp_pipe *stage_pipe[MDSS_MDP_MAX_STAGE];
  219. };
  220. struct mdss_mdp_format_params {
  221. u32 format;
  222. u8 is_yuv;
  223. u8 frame_format;
  224. u8 chroma_sample;
  225. u8 solid_fill;
  226. u8 fetch_planes;
  227. u8 unpack_align_msb; /* 0 to LSB, 1 to MSB */
  228. u8 unpack_tight; /* 0 for loose, 1 for tight */
  229. u8 unpack_count; /* 0 = 1 component, 1 = 2 component ... */
  230. u8 bpp;
  231. u8 alpha_enable; /* source has alpha */
  232. u8 tile;
  233. u8 bits[MAX_PLANES];
  234. u8 element[MAX_PLANES];
  235. };
  236. struct mdss_mdp_plane_sizes {
  237. u32 num_planes;
  238. u32 plane_size[MAX_PLANES];
  239. u32 total_size;
  240. u32 ystride[MAX_PLANES];
  241. u32 rau_cnt;
  242. u32 rau_h[2];
  243. };
  244. struct mdss_mdp_img_data {
  245. u32 addr;
  246. u32 len;
  247. u32 flags;
  248. int p_need;
  249. bool mapped;
  250. struct file *srcp_file;
  251. struct ion_handle *srcp_ihdl;
  252. };
  253. struct mdss_mdp_data {
  254. u8 num_planes;
  255. u8 bwc_enabled;
  256. struct mdss_mdp_img_data p[MAX_PLANES];
  257. };
  258. struct pp_hist_col_info {
  259. u32 col_state;
  260. u32 col_en;
  261. u32 read_request;
  262. u32 hist_cnt_read;
  263. u32 hist_cnt_sent;
  264. u32 hist_cnt_time;
  265. u32 frame_cnt;
  266. struct completion comp;
  267. struct completion first_kick;
  268. u32 data[HIST_V_SIZE];
  269. struct mutex hist_mutex;
  270. spinlock_t hist_lock;
  271. };
  272. struct mdss_mdp_ad {
  273. char __iomem *base;
  274. u8 num;
  275. };
  276. struct mdss_ad_info {
  277. u8 num;
  278. u8 calc_hw_num;
  279. u32 ops;
  280. u32 sts;
  281. u32 reg_sts;
  282. u32 state;
  283. u32 ad_data;
  284. u32 ad_data_mode;
  285. struct mdss_ad_init init;
  286. struct mdss_ad_cfg cfg;
  287. struct mutex lock;
  288. struct work_struct calc_work;
  289. struct msm_fb_data_type *mfd;
  290. struct msm_fb_data_type *bl_mfd;
  291. struct mdss_mdp_vsync_handler handle;
  292. struct completion comp;
  293. u32 last_str;
  294. u32 last_bl;
  295. u32 bl_data;
  296. u32 calc_itr;
  297. uint32_t bl_lin[AD_BL_LIN_LEN];
  298. uint32_t bl_lin_inv[AD_BL_LIN_LEN];
  299. uint32_t bl_att_lut[AD_BL_ATT_LUT_LEN];
  300. };
  301. struct pp_sts_type {
  302. u32 pa_sts;
  303. u32 pcc_sts;
  304. u32 igc_sts;
  305. u32 igc_tbl_idx;
  306. u32 argc_sts;
  307. u32 enhist_sts;
  308. u32 dither_sts;
  309. u32 gamut_sts;
  310. u32 pgc_sts;
  311. u32 sharp_sts;
  312. };
  313. struct mdss_pipe_pp_res {
  314. u32 igc_c0_c1[IGC_LUT_ENTRIES];
  315. u32 igc_c2[IGC_LUT_ENTRIES];
  316. u32 hist_lut[ENHIST_LUT_ENTRIES];
  317. struct pp_hist_col_info hist;
  318. struct pp_sts_type pp_sts;
  319. };
  320. struct mdss_mdp_pipe_smp_map {
  321. DECLARE_BITMAP(reserved, MAX_DRV_SUP_MMB_BLKS);
  322. DECLARE_BITMAP(allocated, MAX_DRV_SUP_MMB_BLKS);
  323. DECLARE_BITMAP(fixed, MAX_DRV_SUP_MMB_BLKS);
  324. };
  325. struct mdss_mdp_shared_reg_ctrl {
  326. u32 reg_off;
  327. u32 bit_off;
  328. };
  329. struct mdss_mdp_pipe {
  330. u32 num;
  331. u32 type;
  332. u32 ndx;
  333. char __iomem *base;
  334. u32 ftch_id;
  335. u32 xin_id;
  336. struct mdss_mdp_shared_reg_ctrl clk_ctrl;
  337. struct mdss_mdp_shared_reg_ctrl clk_status;
  338. struct kref kref;
  339. u32 play_cnt;
  340. int pid;
  341. bool is_handed_off;
  342. u32 flags;
  343. u32 bwc_mode;
  344. u16 img_width;
  345. u16 img_height;
  346. u8 horz_deci;
  347. u8 vert_deci;
  348. struct mdss_mdp_img_rect src;
  349. struct mdss_mdp_img_rect dst;
  350. u32 phase_step_x;
  351. u32 phase_step_y;
  352. struct mdss_mdp_format_params *src_fmt;
  353. struct mdss_mdp_plane_sizes src_planes;
  354. u8 mixer_stage;
  355. u8 is_fg;
  356. u8 alpha;
  357. u8 blend_op;
  358. u8 overfetch_disable;
  359. u32 transp;
  360. u32 bg_color;
  361. struct msm_fb_data_type *mfd;
  362. struct mdss_mdp_mixer *mixer;
  363. struct mdp_overlay req_data;
  364. u32 params_changed;
  365. struct mdss_mdp_pipe_smp_map smp_map[MAX_PLANES];
  366. struct mdss_mdp_data back_buf;
  367. struct mdss_mdp_data front_buf;
  368. struct list_head list;
  369. struct mdp_overlay_pp_params pp_cfg;
  370. struct mdss_pipe_pp_res pp_res;
  371. struct mdp_scale_data scale;
  372. u8 chroma_sample_h;
  373. u8 chroma_sample_v;
  374. };
  375. struct mdss_mdp_writeback_arg {
  376. struct mdss_mdp_data *data;
  377. void *priv_data;
  378. };
  379. struct mdss_overlay_private {
  380. ktime_t vsync_time;
  381. struct sysfs_dirent *vsync_event_sd;
  382. int borderfill_enable;
  383. int overlay_play_enable;
  384. int hw_refresh;
  385. void *cpu_pm_hdl;
  386. struct mdss_data_type *mdata;
  387. struct mutex ov_lock;
  388. struct mutex dfps_lock;
  389. struct mdss_mdp_ctl *ctl;
  390. struct mdss_mdp_wb *wb;
  391. struct mutex list_lock;
  392. struct list_head overlay_list;
  393. struct list_head pipes_used;
  394. struct list_head pipes_cleanup;
  395. struct list_head rot_proc_list;
  396. bool mixer_swap;
  397. struct mdss_mdp_data free_list[MAX_FREE_LIST_SIZE];
  398. int free_list_size;
  399. int ad_state;
  400. bool handoff;
  401. u32 splash_mem_addr;
  402. u32 splash_mem_size;
  403. u32 sd_enabled;
  404. struct sw_sync_timeline *vsync_timeline;
  405. struct mdss_mdp_vsync_handler vsync_retire_handler;
  406. int retire_cnt;
  407. struct kthread_worker worker;
  408. struct kthread_work vsync_work;
  409. struct task_struct *thread;
  410. };
  411. /**
  412. * enum mdss_screen_state - Screen states that MDP can be forced into
  413. *
  414. * @MDSS_SCREEN_DEFAULT: Do not force MDP into any screen state.
  415. * @MDSS_SCREEN_FORCE_BLANK: Force MDP to generate blank color fill screen.
  416. */
  417. enum mdss_screen_state {
  418. MDSS_SCREEN_DEFAULT,
  419. MDSS_SCREEN_FORCE_BLANK,
  420. };
  421. #define is_vig_pipe(_pipe_id_) ((_pipe_id_) <= MDSS_MDP_SSPP_VIG2)
  422. static inline struct mdss_mdp_ctl *mdss_mdp_get_split_ctl(
  423. struct mdss_mdp_ctl *ctl)
  424. {
  425. if (ctl && ctl->mixer_right && (ctl->mixer_right->ctl != ctl))
  426. return ctl->mixer_right->ctl;
  427. return NULL;
  428. }
  429. static inline void mdss_mdp_ctl_write(struct mdss_mdp_ctl *ctl,
  430. u32 reg, u32 val)
  431. {
  432. writel_relaxed(val, ctl->base + reg);
  433. }
  434. static inline u32 mdss_mdp_ctl_read(struct mdss_mdp_ctl *ctl, u32 reg)
  435. {
  436. return readl_relaxed(ctl->base + reg);
  437. }
  438. static inline void mdss_mdp_pingpong_write(struct mdss_mdp_mixer *mixer,
  439. u32 reg, u32 val)
  440. {
  441. writel_relaxed(val, mixer->pingpong_base + reg);
  442. }
  443. static inline u32 mdss_mdp_pingpong_read(struct mdss_mdp_mixer *mixer, u32 reg)
  444. {
  445. return readl_relaxed(mixer->pingpong_base + reg);
  446. }
  447. static inline int mdss_mdp_iommu_dyn_attach_supported(
  448. struct mdss_data_type *mdata)
  449. {
  450. return (mdata->mdp_rev >= MDSS_MDP_HW_REV_103);
  451. }
  452. static inline int mdss_mdp_line_buffer_width(void)
  453. {
  454. return MAX_LINE_BUFFER_WIDTH;
  455. }
  456. static inline void mdss_update_sd_client(struct mdss_data_type *mdata,
  457. bool status)
  458. {
  459. if (status)
  460. atomic_inc(&mdata->sd_client_count);
  461. else
  462. atomic_add_unless(&mdss_res->sd_client_count, -1, 0);
  463. }
  464. irqreturn_t mdss_mdp_isr(int irq, void *ptr);
  465. int mdss_iommu_attach(struct mdss_data_type *mdata);
  466. int mdss_iommu_dettach(struct mdss_data_type *mdata);
  467. int mdss_mdp_scan_cont_splash(void);
  468. void mdss_mdp_irq_clear(struct mdss_data_type *mdata,
  469. u32 intr_type, u32 intf_num);
  470. int mdss_mdp_irq_enable(u32 intr_type, u32 intf_num);
  471. void mdss_mdp_irq_disable(u32 intr_type, u32 intf_num);
  472. int mdss_mdp_hist_irq_enable(u32 irq);
  473. void mdss_mdp_hist_irq_disable(u32 irq);
  474. void mdss_mdp_irq_disable_nosync(u32 intr_type, u32 intf_num);
  475. int mdss_mdp_set_intr_callback(u32 intr_type, u32 intf_num,
  476. void (*fnc_ptr)(void *), void *arg);
  477. void mdss_mdp_footswitch_ctrl_splash(int on);
  478. void mdss_mdp_batfet_ctrl(struct mdss_data_type *mdata, int enable);
  479. int mdss_mdp_bus_scale_set_quota(u64 ab_quota, u64 ib_quota);
  480. void mdss_mdp_set_clk_rate(unsigned long min_clk_rate);
  481. unsigned long mdss_mdp_get_clk_rate(u32 clk_idx);
  482. int mdss_mdp_vsync_clk_enable(int enable);
  483. void mdss_mdp_clk_ctrl(int enable, int isr);
  484. struct mdss_data_type *mdss_mdp_get_mdata(void);
  485. int mdss_mdp_secure_display_ctrl(unsigned int enable);
  486. void mdss_mdp_underrun_dump_info(struct msm_fb_data_type *);
  487. int mdss_mdp_overlay_init(struct msm_fb_data_type *mfd);
  488. int mdss_mdp_overlay_req_check(struct msm_fb_data_type *mfd,
  489. struct mdp_overlay *req,
  490. struct mdss_mdp_format_params *fmt);
  491. int mdss_mdp_overlay_vsync_ctrl(struct msm_fb_data_type *mfd, int en);
  492. int mdss_mdp_overlay_get_buf(struct msm_fb_data_type *mfd,
  493. struct mdss_mdp_data *data,
  494. struct msmfb_data *planes,
  495. int num_planes,
  496. u32 flags);
  497. int mdss_mdp_overlay_pipe_setup(struct msm_fb_data_type *mfd,
  498. struct mdp_overlay *req, struct mdss_mdp_pipe **ppipe);
  499. void mdss_mdp_handoff_cleanup_pipes(struct msm_fb_data_type *mfd,
  500. u32 type);
  501. int mdss_mdp_overlay_release(struct msm_fb_data_type *mfd, int ndx);
  502. int mdss_mdp_overlay_start(struct msm_fb_data_type *mfd);
  503. int mdss_mdp_video_addr_setup(struct mdss_data_type *mdata,
  504. u32 *offsets, u32 count);
  505. int mdss_mdp_video_start(struct mdss_mdp_ctl *ctl);
  506. int mdss_mdp_cmd_start(struct mdss_mdp_ctl *ctl);
  507. int mdss_mdp_writeback_start(struct mdss_mdp_ctl *ctl);
  508. int mdss_mdp_overlay_kickoff(struct msm_fb_data_type *mfd,
  509. struct mdp_display_commit *data);
  510. struct mdss_mdp_ctl *mdss_mdp_ctl_init(struct mdss_panel_data *pdata,
  511. struct msm_fb_data_type *mfd);
  512. int mdss_mdp_video_reconfigure_splash_done(struct mdss_mdp_ctl *ctl,
  513. bool handoff);
  514. int mdss_mdp_cmd_reconfigure_splash_done(struct mdss_mdp_ctl *ctl,
  515. bool handoff);
  516. int mdss_mdp_ctl_splash_finish(struct mdss_mdp_ctl *ctl, bool handoff);
  517. int mdss_mdp_ctl_setup(struct mdss_mdp_ctl *ctl);
  518. int mdss_mdp_ctl_split_display_setup(struct mdss_mdp_ctl *ctl,
  519. struct mdss_panel_data *pdata);
  520. int mdss_mdp_ctl_destroy(struct mdss_mdp_ctl *ctl);
  521. int mdss_mdp_ctl_start(struct mdss_mdp_ctl *ctl, bool handoff);
  522. int mdss_mdp_ctl_stop(struct mdss_mdp_ctl *ctl);
  523. int mdss_mdp_ctl_intf_event(struct mdss_mdp_ctl *ctl, int event, void *arg);
  524. int mdss_mdp_perf_bw_check(struct mdss_mdp_ctl *ctl,
  525. struct mdss_mdp_pipe **left_plist, int left_cnt,
  526. struct mdss_mdp_pipe **right_plist, int right_cnt);
  527. #if defined(CONFIG_FB_MSM_EDP_SAMSUNG)
  528. int mdss_mdp_scan_pipes(void);
  529. #endif
  530. int mdss_mdp_perf_calc_pipe(struct mdss_mdp_pipe *pipe,
  531. struct mdss_mdp_perf_params *perf, struct mdss_mdp_img_rect *roi,
  532. bool apply_fudge);
  533. int mdss_mdp_ctl_notify(struct mdss_mdp_ctl *ctl, int event);
  534. void mdss_mdp_ctl_notifier_register(struct mdss_mdp_ctl *ctl,
  535. struct notifier_block *notifier);
  536. void mdss_mdp_ctl_notifier_unregister(struct mdss_mdp_ctl *ctl,
  537. struct notifier_block *notifier);
  538. int mdss_mdp_mixer_handoff(struct mdss_mdp_ctl *ctl, u32 num,
  539. struct mdss_mdp_pipe *pipe);
  540. int mdss_mdp_scan_pipes(void);
  541. void mdss_mdp_ctl_perf_set_transaction_status(struct mdss_mdp_ctl *ctl,
  542. enum mdss_mdp_perf_state_type component, bool new_status);
  543. void mdss_mdp_ctl_perf_release_bw(struct mdss_mdp_ctl *ctl);
  544. struct mdss_mdp_mixer *mdss_mdp_wb_mixer_alloc(int rotator);
  545. int mdss_mdp_wb_mixer_destroy(struct mdss_mdp_mixer *mixer);
  546. struct mdss_mdp_mixer *mdss_mdp_mixer_get(struct mdss_mdp_ctl *ctl, int mux);
  547. struct mdss_mdp_pipe *mdss_mdp_mixer_stage_pipe(struct mdss_mdp_ctl *ctl,
  548. int mux, int stage);
  549. int mdss_mdp_mixer_pipe_update(struct mdss_mdp_pipe *pipe, int params_changed);
  550. int mdss_mdp_mixer_pipe_unstage(struct mdss_mdp_pipe *pipe);
  551. void mdss_mdp_mixer_unstage_all(struct mdss_mdp_mixer *mixer);
  552. int mdss_mdp_display_commit(struct mdss_mdp_ctl *ctl, void *arg);
  553. int mdss_mdp_display_wait4comp(struct mdss_mdp_ctl *ctl);
  554. int mdss_mdp_display_wait4pingpong(struct mdss_mdp_ctl *ctl);
  555. int mdss_mdp_display_wakeup_time(struct mdss_mdp_ctl *ctl,
  556. ktime_t *wakeup_time);
  557. int mdss_mdp_csc_setup(u32 block, u32 blk_idx, u32 tbl_idx, u32 csc_type);
  558. int mdss_mdp_csc_setup_data(u32 block, u32 blk_idx, u32 tbl_idx,
  559. struct mdp_csc_cfg *data);
  560. int mdss_mdp_pp_init(struct device *dev);
  561. void mdss_mdp_pp_term(struct device *dev);
  562. int mdss_mdp_pp_overlay_init(struct msm_fb_data_type *mfd);
  563. int mdss_mdp_pp_resume(struct mdss_mdp_ctl *ctl, u32 mixer_num);
  564. int mdss_mdp_pp_setup(struct mdss_mdp_ctl *ctl);
  565. int mdss_mdp_pp_setup_locked(struct mdss_mdp_ctl *ctl);
  566. int mdss_mdp_pipe_pp_setup(struct mdss_mdp_pipe *pipe, u32 *op);
  567. int mdss_mdp_pipe_sspp_setup(struct mdss_mdp_pipe *pipe, u32 *op);
  568. void mdss_mdp_pipe_sspp_term(struct mdss_mdp_pipe *pipe);
  569. int mdss_mdp_smp_setup(struct mdss_data_type *mdata, u32 cnt, u32 size);
  570. int mdss_hw_init(struct mdss_data_type *mdata);
  571. int mdss_mdp_pa_config(struct mdp_pa_cfg_data *config, u32 *copyback);
  572. int mdss_mdp_pa_v2_config(struct mdp_pa_v2_cfg_data *config, u32 *copyback);
  573. int mdss_mdp_pcc_config(struct mdp_pcc_cfg_data *cfg_ptr, u32 *copyback);
  574. int mdss_mdp_igc_lut_config(struct mdp_igc_lut_data *config, u32 *copyback,
  575. u32 copy_from_kernel);
  576. int mdss_mdp_argc_config(struct mdp_pgc_lut_data *config, u32 *copyback);
  577. int mdss_mdp_hist_lut_config(struct mdp_hist_lut_data *config, u32 *copyback);
  578. int mdss_mdp_dither_config(struct mdp_dither_cfg_data *config, u32 *copyback);
  579. int mdss_mdp_gamut_config(struct mdp_gamut_cfg_data *config, u32 *copyback);
  580. int mdss_mdp_hist_intr_req(struct mdss_intr *intr, u32 bits, bool en);
  581. int mdss_mdp_hist_intr_setup(struct mdss_intr *intr, int state);
  582. int mdss_mdp_hist_start(struct mdp_histogram_start_req *req);
  583. int mdss_mdp_hist_stop(u32 block);
  584. int mdss_mdp_hist_collect(struct mdp_histogram_data *hist);
  585. void mdss_mdp_hist_intr_done(u32 isr);
  586. int mdss_mdp_ad_config(struct msm_fb_data_type *mfd,
  587. struct mdss_ad_init_cfg *init_cfg);
  588. int mdss_mdp_ad_input(struct msm_fb_data_type *mfd,
  589. struct mdss_ad_input *input, int wait);
  590. int mdss_mdp_ad_addr_setup(struct mdss_data_type *mdata, u32 *ad_offsets);
  591. int mdss_mdp_calib_mode(struct msm_fb_data_type *mfd,
  592. struct mdss_calib_cfg *cfg);
  593. int mdss_mdp_pipe_handoff(struct mdss_mdp_pipe *pipe);
  594. int mdss_mdp_smp_handoff(struct mdss_data_type *mdata);
  595. struct mdss_mdp_pipe *mdss_mdp_pipe_alloc(struct mdss_mdp_mixer *mixer,
  596. u32 type);
  597. struct mdss_mdp_pipe *mdss_mdp_pipe_get(struct mdss_data_type *mdata, u32 ndx);
  598. struct mdss_mdp_pipe *mdss_mdp_pipe_search(struct mdss_data_type *mdata,
  599. u32 ndx);
  600. int mdss_mdp_pipe_map(struct mdss_mdp_pipe *pipe);
  601. void mdss_mdp_pipe_unmap(struct mdss_mdp_pipe *pipe);
  602. struct mdss_mdp_pipe *mdss_mdp_pipe_alloc_dma(struct mdss_mdp_mixer *mixer);
  603. u32 mdss_mdp_smp_get_size(struct mdss_mdp_pipe *pipe);
  604. int mdss_mdp_smp_reserve(struct mdss_mdp_pipe *pipe);
  605. void mdss_mdp_smp_unreserve(struct mdss_mdp_pipe *pipe);
  606. void mdss_mdp_smp_release(struct mdss_mdp_pipe *pipe);
  607. int mdss_mdp_pipe_addr_setup(struct mdss_data_type *mdata,
  608. struct mdss_mdp_pipe *head, u32 *offsets, u32 *ftch_y_id, u32 *xin_id,
  609. u32 type, u32 num_base, u32 len);
  610. int mdss_mdp_mixer_addr_setup(struct mdss_data_type *mdata, u32 *mixer_offsets,
  611. u32 *dspp_offsets, u32 *pingpong_offsets, u32 type, u32 len);
  612. int mdss_mdp_ctl_addr_setup(struct mdss_data_type *mdata, u32 *ctl_offsets,
  613. u32 *wb_offsets, u32 len);
  614. int mdss_mdp_pipe_fetch_halt(struct mdss_mdp_pipe *pipe);
  615. int mdss_mdp_pipe_destroy(struct mdss_mdp_pipe *pipe);
  616. int mdss_mdp_pipe_queue_data(struct mdss_mdp_pipe *pipe,
  617. struct mdss_mdp_data *src_data);
  618. int mdss_mdp_data_check(struct mdss_mdp_data *data,
  619. struct mdss_mdp_plane_sizes *ps);
  620. int mdss_mdp_get_plane_sizes(u32 format, u32 w, u32 h,
  621. struct mdss_mdp_plane_sizes *ps, u32 bwc_mode, bool rotation);
  622. int mdss_mdp_get_rau_strides(u32 w, u32 h, struct mdss_mdp_format_params *fmt,
  623. struct mdss_mdp_plane_sizes *ps);
  624. void mdss_mdp_data_calc_offset(struct mdss_mdp_data *data, u16 x, u16 y,
  625. struct mdss_mdp_plane_sizes *ps, struct mdss_mdp_format_params *fmt);
  626. struct mdss_mdp_format_params *mdss_mdp_get_format_params(u32 format);
  627. int mdss_mdp_put_img(struct mdss_mdp_img_data *data);
  628. int mdss_mdp_get_img(struct msmfb_data *img, struct mdss_mdp_img_data *data);
  629. int mdss_mdp_overlay_free_buf(struct mdss_mdp_data *data);
  630. u32 mdss_get_panel_framerate(struct msm_fb_data_type *mfd);
  631. int mdss_mdp_calc_phase_step(u32 src, u32 dst, u32 *out_phase);
  632. void mdss_mdp_intersect_rect(struct mdss_mdp_img_rect *res_rect,
  633. const struct mdss_mdp_img_rect *dst_rect,
  634. const struct mdss_mdp_img_rect *sci_rect);
  635. void mdss_mdp_crop_rect(struct mdss_mdp_img_rect *src_rect,
  636. struct mdss_mdp_img_rect *dst_rect,
  637. const struct mdss_mdp_img_rect *sci_rect);
  638. int mdss_mdp_wb_kickoff(struct msm_fb_data_type *mfd);
  639. int mdss_mdp_wb_ioctl_handler(struct msm_fb_data_type *mfd, u32 cmd, void *arg);
  640. int mdss_mdp_get_ctl_mixers(u32 fb_num, u32 *mixer_id);
  641. u32 mdss_mdp_get_mixercfg(struct mdss_mdp_mixer *mixer);
  642. u32 mdss_mdp_fb_stride(u32 fb_index, u32 xres, int bpp);
  643. void mdss_check_dsi_ctrl_status(struct work_struct *work, uint32_t interval);
  644. int mdss_panel_register_done(struct mdss_panel_data *pdata);
  645. int mdss_mdp_limited_lut_igc_config(struct mdss_mdp_ctl *ctl);
  646. int mdss_mdp_calib_config(struct mdp_calib_config_data *cfg, u32 *copyback);
  647. int mdss_mdp_calib_config_buffer(struct mdp_calib_config_buffer *cfg,
  648. u32 *copyback);
  649. int mdss_mdp_ctl_update_fps(struct mdss_mdp_ctl *ctl, int fps);
  650. int mdss_mdp_pipe_is_staged(struct mdss_mdp_pipe *pipe);
  651. int mdss_mdp_writeback_display_commit(struct mdss_mdp_ctl *ctl, void *arg);
  652. struct mdss_mdp_ctl *mdss_mdp_ctl_mixer_switch(struct mdss_mdp_ctl *ctl,
  653. u32 return_type);
  654. void mdss_mdp_set_roi(struct mdss_mdp_ctl *ctl,
  655. struct mdp_display_commit *data);
  656. int mdss_mdp_wb_set_format(struct msm_fb_data_type *mfd, u32 dst_format);
  657. int mdss_mdp_wb_get_format(struct msm_fb_data_type *mfd,
  658. struct mdp_mixer_cfg *mixer_cfg);
  659. void mdss_mdp_underrun_clk_info(void);
  660. int mdss_mdp_wb_set_secure(struct msm_fb_data_type *mfd, int enable);
  661. int mdss_mdp_wb_get_secure(struct msm_fb_data_type *mfd, uint8_t *enable);
  662. void mdss_mdp_ctl_restore(struct mdss_mdp_ctl *ctl);
  663. int mdss_mdp_footswitch_ctrl_idle_pc(int on, struct device *dev);
  664. int mdss_mdp_pipe_program_pixel_extn(struct mdss_mdp_pipe *pipe);
  665. #define mfd_to_mdp5_data(mfd) (mfd->mdp.private1)
  666. #define mfd_to_mdata(mfd) (((struct mdss_overlay_private *)\
  667. (mfd->mdp.private1))->mdata)
  668. #define mfd_to_ctl(mfd) (((struct mdss_overlay_private *)\
  669. (mfd->mdp.private1))->ctl)
  670. #define mfd_to_wb(mfd) (((struct mdss_overlay_private *)\
  671. (mfd->mdp.private1))->wb)
  672. int mdss_mdp_ctl_reset(struct mdss_mdp_ctl *ctl);
  673. #if defined(CONFIG_FB_MSM_MIPI_SAMSUNG_OCTA_CMD_FULL_HD_PT_PANEL)
  674. void mdss_dsi_debug_check_te(struct mdss_panel_data *pdata);
  675. #endif
  676. void dumpreg(void);
  677. void mdp5_dump_regs(void);
  678. #endif /* MDSS_MDP_H */