mdp3_dma.h 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. /* Copyright (c) 2013-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 MDP3_DMA_H
  14. #define MDP3_DMA_H
  15. #include <linux/notifier.h>
  16. #include <linux/sched.h>
  17. #define MDP_HISTOGRAM_BL_SCALE_MAX 1024
  18. #define MDP_HISTOGRAM_BL_LEVEL_MAX 255
  19. #define MDP_HISTOGRAM_FRAME_COUNT_MAX 0x20
  20. #define MDP_HISTOGRAM_BIT_MASK_MAX 0x4
  21. #define MDP_HISTOGRAM_CSC_MATRIX_MAX 0x2000
  22. #define MDP_HISTOGRAM_CSC_VECTOR_MAX 0x200
  23. #define MDP_HISTOGRAM_BIN_NUM 32
  24. #define MDP_LUT_SIZE 256
  25. enum {
  26. MDP3_DMA_P,
  27. MDP3_DMA_S,
  28. MDP3_DMA_E,
  29. MDP3_DMA_MAX
  30. };
  31. enum {
  32. MDP3_DMA_CAP_CURSOR = 0x1,
  33. MDP3_DMA_CAP_COLOR_CORRECTION = 0x2,
  34. MDP3_DMA_CAP_HISTOGRAM = 0x4,
  35. MDP3_DMA_CAP_GAMMA_CORRECTION = 0x8,
  36. MDP3_DMA_CAP_DITHER = 0x10,
  37. MDP3_DMA_CAP_ALL = 0x1F
  38. };
  39. enum {
  40. MDP3_DMA_OUTPUT_SEL_AHB,
  41. MDP3_DMA_OUTPUT_SEL_DSI_CMD,
  42. MDP3_DMA_OUTPUT_SEL_LCDC,
  43. MDP3_DMA_OUTPUT_SEL_DSI_VIDEO,
  44. MDP3_DMA_OUTPUT_SEL_MAX
  45. };
  46. enum {
  47. MDP3_DMA_IBUF_FORMAT_RGB888,
  48. MDP3_DMA_IBUF_FORMAT_RGB565,
  49. MDP3_DMA_IBUF_FORMAT_XRGB8888,
  50. MDP3_DMA_IBUF_FORMAT_UNDEFINED
  51. };
  52. enum {
  53. MDP3_DMA_OUTPUT_PACK_PATTERN_RGB = 0x21,
  54. MDP3_DMA_OUTPUT_PACK_PATTERN_RBG = 0x24,
  55. MDP3_DMA_OUTPUT_PACK_PATTERN_BGR = 0x12,
  56. MDP3_DMA_OUTPUT_PACK_PATTERN_BRG = 0x18,
  57. MDP3_DMA_OUTPUT_PACK_PATTERN_GBR = 0x06,
  58. MDP3_DMA_OUTPUT_PACK_PATTERN_GRB = 0x09,
  59. };
  60. enum {
  61. MDP3_DMA_OUTPUT_PACK_ALIGN_LSB,
  62. MDP3_DMA_OUTPUT_PACK_ALIGN_MSB
  63. };
  64. enum {
  65. MDP3_DMA_OUTPUT_COMP_BITS_4, /*4 bits per color component*/
  66. MDP3_DMA_OUTPUT_COMP_BITS_5,
  67. MDP3_DMA_OUTPUT_COMP_BITS_6,
  68. MDP3_DMA_OUTPUT_COMP_BITS_8,
  69. };
  70. enum {
  71. MDP3_DMA_CURSOR_FORMAT_ARGB888,
  72. };
  73. enum {
  74. MDP3_DMA_COLOR_CORRECT_SET_1,
  75. MDP3_DMA_COLOR_CORRECT_SET_2
  76. };
  77. enum {
  78. MDP3_DMA_LUT_POSITION_PRE,
  79. MDP3_DMA_LUT_POSITION_POST
  80. };
  81. enum {
  82. MDP3_DMA_LUT_DISABLE = 0x0,
  83. MDP3_DMA_LUT_ENABLE_C0 = 0x01,
  84. MDP3_DMA_LUT_ENABLE_C1 = 0x02,
  85. MDP3_DMA_LUT_ENABLE_C2 = 0x04,
  86. MDP3_DMA_LUT_ENABLE_ALL = 0x07,
  87. };
  88. enum {
  89. MDP3_DMA_HISTOGRAM_BIT_MASK_NONE = 0X0,
  90. MDP3_DMA_HISTOGRAM_BIT_MASK_ONE_MSB = 0x1,
  91. MDP3_DMA_HISTOGRAM_BIT_MASK_TWO_MSB = 0x2,
  92. MDP3_DMA_HISTOGRAM_BIT_MASK_THREE_MSB = 0x3
  93. };
  94. enum {
  95. MDP3_DMA_COLOR_FLIP_NONE,
  96. MDP3_DMA_COLOR_FLIP_COMP1 = 0x1,
  97. MDP3_DMA_COLOR_FLIP_COMP2 = 0x2,
  98. MDP3_DMA_COLOR_FLIP_COMP3 = 0x4,
  99. };
  100. enum {
  101. MDP3_DMA_CURSOR_BLEND_NONE = 0x0,
  102. MDP3_DMA_CURSOR_BLEND_PER_PIXEL_ALPHA = 0x3,
  103. MDP3_DMA_CURSOR_BLEND_CONSTANT_ALPHA = 0x5,
  104. MDP3_DMA_CURSOR_BLEND_COLOR_KEYING = 0x9
  105. };
  106. enum {
  107. MDP3_DMA_HISTO_OP_START,
  108. MDP3_DMA_HISTO_OP_STOP,
  109. MDP3_DMA_HISTO_OP_CANCEL,
  110. MDP3_DMA_HISTO_OP_RESET
  111. };
  112. enum {
  113. MDP3_DMA_HISTO_STATE_UNKNOWN,
  114. MDP3_DMA_HISTO_STATE_IDLE,
  115. MDP3_DMA_HISTO_STATE_RESET,
  116. MDP3_DMA_HISTO_STATE_START,
  117. MDP3_DMA_HISTO_STATE_READY,
  118. };
  119. enum {
  120. MDP3_DMA_CALLBACK_TYPE_VSYNC = 0x01,
  121. MDP3_DMA_CALLBACK_TYPE_DMA_DONE = 0x02,
  122. MDP3_DMA_CALLBACK_TYPE_HIST_RESET_DONE = 0x04,
  123. MDP3_DMA_CALLBACK_TYPE_HIST_DONE = 0x08,
  124. };
  125. struct mdp3_dma_source {
  126. u32 format;
  127. int width;
  128. int height;
  129. int x;
  130. int y;
  131. void *buf;
  132. int stride;
  133. int vsync_count;
  134. int vporch;
  135. };
  136. struct mdp3_dma_output_config {
  137. int dither_en;
  138. u32 out_sel;
  139. u32 bit_mask_polarity;
  140. u32 color_components_flip;
  141. u32 pack_pattern;
  142. u32 pack_align;
  143. u32 color_comp_out_bits;
  144. };
  145. struct mdp3_dma_cursor_blend_config {
  146. u32 mode;
  147. u32 transparent_color; /*color keying*/
  148. u32 transparency_mask;
  149. u32 constant_alpha;
  150. };
  151. struct mdp3_dma_cursor {
  152. int enable; /* enable cursor or not*/
  153. u32 format;
  154. int width;
  155. int height;
  156. int x;
  157. int y;
  158. void *buf;
  159. struct mdp3_dma_cursor_blend_config blend_config;
  160. };
  161. struct mdp3_dma_ccs {
  162. u32 *mv; /*set1 matrix vector, 3x3 */
  163. u32 *pre_bv; /*pre-bias vector for set1, 1x3*/
  164. u32 *post_bv; /*post-bias vecotr for set1, */
  165. u32 *pre_lv; /*pre-limit vector for set 1, 1x6*/
  166. u32 *post_lv;
  167. };
  168. struct mdp3_dma_lut {
  169. u16 *color0_lut;
  170. u16 *color1_lut;
  171. u16 *color2_lut;
  172. };
  173. struct mdp3_dma_lut_config {
  174. int lut_enable;
  175. u32 lut_sel;
  176. u32 lut_position;
  177. bool lut_dirty;
  178. };
  179. struct mdp3_dma_color_correct_config {
  180. int ccs_enable;
  181. u32 post_limit_sel;
  182. u32 pre_limit_sel;
  183. u32 post_bias_sel;
  184. u32 pre_bias_sel;
  185. u32 ccs_sel;
  186. bool ccs_dirty;
  187. };
  188. struct mdp3_dma_histogram_config {
  189. int frame_count;
  190. u32 bit_mask_polarity;
  191. u32 bit_mask;
  192. int auto_clear_en;
  193. };
  194. struct mdp3_dma_histogram_data {
  195. u32 r_data[MDP_HISTOGRAM_BIN_NUM];
  196. u32 g_data[MDP_HISTOGRAM_BIN_NUM];
  197. u32 b_data[MDP_HISTOGRAM_BIN_NUM];
  198. u32 extra[2];
  199. };
  200. struct mdp3_notification {
  201. void (*handler)(void *arg);
  202. void *arg;
  203. };
  204. struct mdp3_tear_check {
  205. int frame_rate;
  206. bool hw_vsync_mode;
  207. u32 tear_check_en;
  208. u32 sync_cfg_height;
  209. u32 vsync_init_val;
  210. u32 sync_threshold_start;
  211. u32 sync_threshold_continue;
  212. u32 start_pos;
  213. u32 rd_ptr_irq;
  214. u32 refx100;
  215. };
  216. struct mdp3_intf;
  217. struct mdp3_dma {
  218. u32 dma_sel;
  219. u32 capability;
  220. int in_use;
  221. int available;
  222. spinlock_t dma_lock;
  223. spinlock_t histo_lock;
  224. struct completion vsync_comp;
  225. struct completion dma_comp;
  226. struct completion histo_comp;
  227. struct mdp3_notification vsync_client;
  228. struct mdp3_notification dma_notifier_client;
  229. struct mdp3_dma_output_config output_config;
  230. struct mdp3_dma_source source_config;
  231. struct mdp3_dma_cursor cursor;
  232. struct mdp3_dma_color_correct_config ccs_config;
  233. struct mdp3_dma_lut_config lut_config;
  234. struct mdp3_dma_histogram_config histogram_config;
  235. int histo_state;
  236. struct mdp3_dma_histogram_data histo_data;
  237. unsigned int vsync_status;
  238. bool update_src_cfg;
  239. int (*dma_config)(struct mdp3_dma *dma,
  240. struct mdp3_dma_source *source_config,
  241. struct mdp3_dma_output_config *output_config);
  242. int (*dma_sync_config)(struct mdp3_dma *dma, struct mdp3_dma_source
  243. *source_config, struct mdp3_tear_check *te);
  244. void (*dma_config_source)(struct mdp3_dma *dma);
  245. int (*start)(struct mdp3_dma *dma, struct mdp3_intf *intf);
  246. int (*stop)(struct mdp3_dma *dma, struct mdp3_intf *intf);
  247. int (*config_cursor)(struct mdp3_dma *dma,
  248. struct mdp3_dma_cursor *cursor);
  249. int (*config_ccs)(struct mdp3_dma *dma,
  250. struct mdp3_dma_color_correct_config *config,
  251. struct mdp3_dma_ccs *ccs);
  252. int (*config_lut)(struct mdp3_dma *dma,
  253. struct mdp3_dma_lut_config *config,
  254. struct mdp3_dma_lut *lut);
  255. int (*update)(struct mdp3_dma *dma, void *buf, struct mdp3_intf *intf);
  256. int (*update_cursor)(struct mdp3_dma *dma, int x, int y);
  257. int (*get_histo)(struct mdp3_dma *dma);
  258. int (*config_histo)(struct mdp3_dma *dma,
  259. struct mdp3_dma_histogram_config *histo_config);
  260. int (*histo_op)(struct mdp3_dma *dma, u32 op);
  261. void (*vsync_enable)(struct mdp3_dma *dma,
  262. struct mdp3_notification *vsync_client);
  263. void (*dma_done_notifier)(struct mdp3_dma *dma,
  264. struct mdp3_notification *dma_client);
  265. };
  266. struct mdp3_video_intf_cfg {
  267. int hsync_period;
  268. int hsync_pulse_width;
  269. int vsync_period;
  270. int vsync_pulse_width;
  271. int display_start_x;
  272. int display_end_x;
  273. int display_start_y;
  274. int display_end_y;
  275. int active_start_x;
  276. int active_end_x;
  277. int active_h_enable;
  278. int active_start_y;
  279. int active_end_y;
  280. int active_v_enable;
  281. int hsync_skew;
  282. int hsync_polarity;
  283. int vsync_polarity;
  284. int de_polarity;
  285. int underflow_color;
  286. };
  287. struct mdp3_dsi_cmd_intf_cfg {
  288. int primary_dsi_cmd_id;
  289. int secondary_dsi_cmd_id;
  290. int dsi_cmd_tg_intf_sel;
  291. };
  292. struct mdp3_intf_cfg {
  293. u32 type;
  294. struct mdp3_video_intf_cfg video;
  295. struct mdp3_dsi_cmd_intf_cfg dsi_cmd;
  296. };
  297. struct mdp3_intf {
  298. struct mdp3_intf_cfg cfg;
  299. int active;
  300. int available;
  301. int in_use;
  302. int (*config)(struct mdp3_intf *intf, struct mdp3_intf_cfg *cfg);
  303. int (*start)(struct mdp3_intf *intf);
  304. int (*stop)(struct mdp3_intf *intf);
  305. };
  306. int mdp3_dma_init(struct mdp3_dma *dma);
  307. int mdp3_intf_init(struct mdp3_intf *intf);
  308. void mdp3_dma_callback_enable(struct mdp3_dma *dma, int type);
  309. void mdp3_dma_callback_disable(struct mdp3_dma *dma, int type);
  310. #endif /* MDP3_DMA_H */