disp_session.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401
  1. #ifndef __DISP_SESSION_H
  2. #define __DISP_SESSION_H
  3. #define DISP_SESSION_DEVICE "mtk_disp_mgr"
  4. #define DISP_NO_ION_FD ((int)(~0U>>1))
  5. #define DISP_NO_USE_LAEYR_ID ((int)(~0U>>1))
  6. #define MAKE_DISP_FORMAT_ID(id, bpp) (((id) << 8) | (bpp))
  7. #define DISP_SESSION_MODE(id) (((id)>>24)&0xff)
  8. #define DISP_SESSION_TYPE(id) (((id)>>16)&0xff)
  9. #define DISP_SESSION_DEV(id) ((id)&0xff)
  10. #define MAKE_DISP_SESSION(type, dev) (unsigned int)((type)<<16 | (dev))
  11. /* /============================================================================= */
  12. /* structure declarations */
  13. /* /=========================== */
  14. typedef enum {
  15. DISP_IF_TYPE_DBI = 0,
  16. DISP_IF_TYPE_DPI,
  17. DISP_IF_TYPE_DSI0,
  18. DISP_IF_TYPE_DSI1,
  19. DISP_IF_TYPE_DSIDUAL,
  20. DISP_IF_HDMI = 7,
  21. DISP_IF_HDMI_SMARTBOOK,
  22. DISP_IF_MHL,
  23. DISP_IF_EPD
  24. } DISP_IF_TYPE;
  25. typedef enum {
  26. DISP_IF_FORMAT_RGB565 = 0,
  27. DISP_IF_FORMAT_RGB666,
  28. DISP_IF_FORMAT_RGB888
  29. } DISP_IF_FORMAT;
  30. typedef enum {
  31. DISP_IF_MODE_VIDEO = 0,
  32. DISP_IF_MODE_COMMAND
  33. } DISP_IF_MODE;
  34. typedef enum {
  35. DISP_ORIENTATION_0 = 0,
  36. DISP_ORIENTATION_90 = 1,
  37. DISP_ORIENTATION_180 = 2,
  38. DISP_ORIENTATION_270 = 3,
  39. } DISP_ORIENTATION;
  40. typedef enum {
  41. DISP_FORMAT_UNKNOWN = 0,
  42. DISP_FORMAT_RGB565 = MAKE_DISP_FORMAT_ID(1, 2),
  43. DISP_FORMAT_RGB888 = MAKE_DISP_FORMAT_ID(2, 3),
  44. DISP_FORMAT_BGR888 = MAKE_DISP_FORMAT_ID(3, 3),
  45. DISP_FORMAT_ARGB8888 = MAKE_DISP_FORMAT_ID(4, 4),
  46. DISP_FORMAT_ABGR8888 = MAKE_DISP_FORMAT_ID(5, 4),
  47. DISP_FORMAT_RGBA8888 = MAKE_DISP_FORMAT_ID(6, 4),
  48. DISP_FORMAT_BGRA8888 = MAKE_DISP_FORMAT_ID(7, 4),
  49. DISP_FORMAT_YUV422 = MAKE_DISP_FORMAT_ID(8, 2),
  50. DISP_FORMAT_XRGB8888 = MAKE_DISP_FORMAT_ID(9, 4),
  51. DISP_FORMAT_XBGR8888 = MAKE_DISP_FORMAT_ID(10, 4),
  52. DISP_FORMAT_RGBX8888 = MAKE_DISP_FORMAT_ID(11, 4),
  53. DISP_FORMAT_BGRX8888 = MAKE_DISP_FORMAT_ID(12, 4),
  54. DISP_FORMAT_UYVY = MAKE_DISP_FORMAT_ID(13, 2),
  55. DISP_FORMAT_YUV420_P = MAKE_DISP_FORMAT_ID(14, 2),
  56. DISP_FORMAT_YV12 = MAKE_DISP_FORMAT_ID(16, 1), /* BPP = 1.5 */
  57. DISP_FORMAT_BPP_MASK = 0xFF,
  58. } DISP_FORMAT;
  59. typedef enum {
  60. DISP_LAYER_2D = 0,
  61. DISP_LAYER_3D_SBS_0 = 0x1,
  62. DISP_LAYER_3D_SBS_90 = 0x2,
  63. DISP_LAYER_3D_SBS_180 = 0x3,
  64. DISP_LAYER_3D_SBS_270 = 0x4,
  65. DISP_LAYER_3D_TAB_0 = 0x10,
  66. DISP_LAYER_3D_TAB_90 = 0x20,
  67. DISP_LAYER_3D_TAB_180 = 0x30,
  68. DISP_LAYER_3D_TAB_270 = 0x40,
  69. } DISP_LAYER_TYPE;
  70. typedef enum {
  71. /* normal memory */
  72. DISP_NORMAL_BUFFER = 0,
  73. /* normal memory but should not be dumpped within screenshot */
  74. DISP_PROTECT_BUFFER = 1,
  75. /* secure memory */
  76. DISP_SECURE_BUFFER = 2,
  77. DISP_SECURE_BUFFER_SHIFT = 0x10002
  78. } DISP_BUFFER_TYPE;
  79. typedef enum {
  80. /* ion buffer */
  81. DISP_BUFFER_ION = 0,
  82. /* dim layer, const alpha */
  83. DISP_BUFFER_ALPHA = 1,
  84. /* mva buffer */
  85. DISP_BUFFER_MVA = 2,
  86. } DISP_BUFFER_SOURCE;
  87. typedef enum {
  88. DISP_ALPHA_ONE = 0,
  89. DISP_ALPHA_SRC = 1,
  90. DISP_ALPHA_SRC_INVERT = 2,
  91. DISP_ALPHA_INVALID = 3,
  92. } DISP_ALPHA_TYPE;
  93. typedef enum {
  94. DISP_SESSION_PRIMARY = 1,
  95. DISP_SESSION_EXTERNAL = 2,
  96. DISP_SESSION_MEMORY = 3
  97. } DISP_SESSION_TYPE;
  98. typedef enum {
  99. DISP_YUV_BT601_FULL = 0,
  100. DISP_YUV_BT601 = 1,
  101. DISP_YUV_BT709 = 2
  102. } DISP_YUV_RANGE_ENUM;
  103. typedef enum {
  104. DISP_INVALID_SESSION_MODE = 0,
  105. /* single output */
  106. DISP_SESSION_DIRECT_LINK_MODE = 1,
  107. DISP_SESSION_DECOUPLE_MODE = 2,
  108. /* two ouputs */
  109. DISP_SESSION_DIRECT_LINK_MIRROR_MODE = 3,
  110. DISP_SESSION_DECOUPLE_MIRROR_MODE = 4,
  111. DISP_SESSION_RDMA_MODE,
  112. DISP_SESSION_MODE_NUM,
  113. } DISP_MODE;
  114. typedef enum {
  115. SESSION_USER_INVALID = -1,
  116. SESSION_USER_HWC = 0,
  117. SESSION_USER_GUIEXT = 1,
  118. SESSION_USER_AEE = 2,
  119. SESSION_USER_PANDISP = 3,
  120. SESSION_USER_CNT,
  121. } DISP_SESSION_USER;
  122. typedef enum {
  123. DISP_OUTPUT_UNKNOWN = 0,
  124. DISP_OUTPUT_MEMORY = 1,
  125. DISP_OUTPUT_DECOUPLE = 2,
  126. } DISP_DC_TYPE;
  127. typedef enum {
  128. TRIGGER_NORMAL,
  129. TRIGGER_SUSPEND,
  130. TRIGGER_RESUME,
  131. TRIGGER_MODE_MAX_NUM
  132. } EXTD_TRIGGER_MODE;
  133. typedef struct disp_session_config_t {
  134. DISP_SESSION_TYPE type;
  135. unsigned int device_id;
  136. DISP_MODE mode;
  137. unsigned int session_id;
  138. DISP_SESSION_USER user;
  139. unsigned int present_fence_idx;
  140. DISP_DC_TYPE dc_type;
  141. int need_merge;
  142. EXTD_TRIGGER_MODE tigger_mode;
  143. } disp_session_config;
  144. typedef struct {
  145. unsigned int session_id;
  146. unsigned int vsync_cnt;
  147. unsigned long long vsync_ts;
  148. int lcm_fps;
  149. } disp_session_vsync_config;
  150. typedef struct disp_input_config_t {
  151. unsigned int layer_id;
  152. unsigned int layer_enable;
  153. DISP_BUFFER_SOURCE buffer_source;
  154. void *src_base_addr;
  155. void *src_phy_addr;
  156. unsigned int src_direct_link;
  157. DISP_FORMAT src_fmt;
  158. unsigned int src_use_color_key;
  159. unsigned int src_color_key;
  160. unsigned int src_pitch;
  161. unsigned int src_offset_x, src_offset_y;
  162. unsigned int src_width, src_height;
  163. unsigned int tgt_offset_x, tgt_offset_y;
  164. unsigned int tgt_width, tgt_height;
  165. DISP_ORIENTATION layer_rotation;
  166. DISP_LAYER_TYPE layer_type;
  167. DISP_ORIENTATION video_rotation;
  168. unsigned int isTdshp; /* set to 1, will go through tdshp first, then layer blending, then to color */
  169. unsigned int next_buff_idx;
  170. int identity;
  171. int connected_type;
  172. DISP_BUFFER_TYPE security;
  173. unsigned int alpha_enable;
  174. unsigned int alpha;
  175. unsigned int sur_aen;
  176. DISP_ALPHA_TYPE src_alpha;
  177. DISP_ALPHA_TYPE dst_alpha;
  178. unsigned int frm_sequence;
  179. DISP_YUV_RANGE_ENUM yuv_range;
  180. } disp_input_config;
  181. typedef struct disp_output_config_t {
  182. void *va;
  183. void *pa;
  184. DISP_FORMAT fmt;
  185. unsigned int x;
  186. unsigned int y;
  187. unsigned int width;
  188. unsigned int height;
  189. unsigned int pitch;
  190. unsigned int pitchUV;
  191. DISP_BUFFER_TYPE security;
  192. unsigned int buff_idx;
  193. unsigned int interface_idx;
  194. unsigned int frm_sequence;
  195. } disp_output_config;
  196. typedef struct disp_session_input_config_t {
  197. DISP_SESSION_USER setter;
  198. unsigned int session_id;
  199. unsigned int config_layer_num;
  200. disp_input_config config[8];
  201. } disp_session_input_config;
  202. typedef struct disp_session_output_config_t {
  203. unsigned int session_id;
  204. disp_output_config config;
  205. } disp_session_output_config;
  206. typedef struct disp_session_layer_num_config_t {
  207. unsigned int session_id;
  208. unsigned int max_layer_num;
  209. } disp_session_layer_num_config;
  210. struct disp_frame_cfg_t {
  211. DISP_SESSION_USER setter;
  212. unsigned int session_id;
  213. /* input config */
  214. unsigned int input_layer_num;
  215. disp_input_config input_cfg[8];
  216. unsigned int overlap_layer_num;
  217. /* constant layer */
  218. unsigned int const_layer_num;
  219. disp_input_config const_layer[1];
  220. /* output config */
  221. int output_en;
  222. disp_output_config output_cfg;
  223. /* trigger config */
  224. DISP_MODE mode;
  225. unsigned int present_fence_idx;
  226. EXTD_TRIGGER_MODE tigger_mode;
  227. DISP_SESSION_USER user;
  228. };
  229. typedef struct disp_session_info_t {
  230. unsigned int session_id;
  231. unsigned int maxLayerNum;
  232. unsigned int isHwVsyncAvailable;
  233. DISP_IF_TYPE displayType;
  234. unsigned int displayWidth;
  235. unsigned int displayHeight;
  236. unsigned int displayFormat;
  237. DISP_IF_MODE displayMode;
  238. unsigned int vsyncFPS;
  239. unsigned int physicalWidth;
  240. unsigned int physicalHeight;
  241. unsigned int isConnected;
  242. unsigned int isHDCPSupported;
  243. unsigned int isOVLDisabled;
  244. unsigned int is3DSupport;
  245. unsigned int const_layer_num;
  246. /* updateFPS: fps of HWC trigger display */
  247. /* notes: for better Accuracy, updateFPS = real_fps*100 */
  248. unsigned int updateFPS;
  249. unsigned int is_updateFPS_stable;
  250. } disp_session_info;
  251. typedef struct disp_buffer_info_t {
  252. /* Session */
  253. unsigned int session_id;
  254. /* Input */
  255. unsigned int layer_id;
  256. unsigned int layer_en;
  257. int ion_fd;
  258. unsigned int cache_sync;
  259. /* Output */
  260. unsigned int index;
  261. int fence_fd;
  262. unsigned int interface_index;
  263. int interface_fence_fd;
  264. } disp_buffer_info;
  265. typedef struct disp_present_fence_info_t {
  266. /* input */
  267. unsigned int session_id;
  268. /* output */
  269. unsigned int present_fence_fd;
  270. unsigned int present_fence_index;
  271. } disp_present_fence;
  272. typedef struct disp_present_fence_t {
  273. /* Session */
  274. unsigned int session_id;
  275. /* Output */
  276. unsigned int index;
  277. int fence_fd;
  278. } disp_present_fence_info;
  279. typedef enum {
  280. DISP_OUTPUT_CAP_DIRECT_LINK = 0,
  281. DISP_OUTPUT_CAP_DECOUPLE,
  282. DISP_OUTPUT_CAP_SWITCHABLE,
  283. } DISP_CAP_OUTPUT_MODE;
  284. typedef enum {
  285. DISP_OUTPUT_CAP_SINGLE_PASS = 0,
  286. DISP_OUTPUT_CAP_MULTI_PASS,
  287. } DISP_CAP_OUTPUT_PASS;
  288. typedef enum {
  289. DISP_FEATURE_TIME_SHARING = 0x00000001,
  290. } DISP_FEATURE;
  291. typedef struct disp_caps_t {
  292. DISP_CAP_OUTPUT_MODE output_mode;
  293. DISP_CAP_OUTPUT_PASS output_pass;
  294. unsigned int max_layer_num;
  295. #ifdef CONFIG_FOR_SOURCE_PQ
  296. unsigned int max_pq_num;
  297. #endif
  298. unsigned int disp_feature;
  299. int is_support_frame_cfg_ioctl;
  300. int is_output_rotated;
  301. } disp_caps_info;
  302. typedef struct disp_session_buf_t {
  303. unsigned int session_id;
  304. unsigned int buf_hnd[3];
  305. } disp_session_buf_info;
  306. /* IOCTL commands. */
  307. #define DISP_IOW(num, dtype) _IOW('O', num, dtype)
  308. #define DISP_IOR(num, dtype) _IOR('O', num, dtype)
  309. #define DISP_IOWR(num, dtype) _IOWR('O', num, dtype)
  310. #define DISP_IO(num) _IO('O', num)
  311. #define DISP_IOCTL_CREATE_SESSION DISP_IOW(201, disp_session_config)
  312. #define DISP_IOCTL_DESTROY_SESSION DISP_IOW(202, disp_session_config)
  313. #define DISP_IOCTL_TRIGGER_SESSION DISP_IOW(203, disp_session_config)
  314. #define DISP_IOCTL_PREPARE_INPUT_BUFFER DISP_IOW(204, disp_buffer_info)
  315. #define DISP_IOCTL_PREPARE_OUTPUT_BUFFER DISP_IOW(205, disp_buffer_info)
  316. #define DISP_IOCTL_SET_INPUT_BUFFER DISP_IOW(206, disp_session_input_config)
  317. #define DISP_IOCTL_SET_OUTPUT_BUFFER DISP_IOW(207, disp_session_output_config)
  318. #define DISP_IOCTL_GET_SESSION_INFO DISP_IOW(208, disp_session_info)
  319. #define DISP_IOCTL_SET_SESSION_MODE DISP_IOW(209, disp_session_config)
  320. #define DISP_IOCTL_GET_SESSION_MODE DISP_IOW(210, disp_session_config)
  321. #define DISP_IOCTL_SET_SESSION_TYPE DISP_IOW(211, disp_session_config)
  322. #define DISP_IOCTL_GET_SESSION_TYPE DISP_IOW(212, disp_session_config)
  323. #define DISP_IOCTL_WAIT_FOR_VSYNC DISP_IOW(213, disp_session_vsync_config)
  324. #define DISP_IOCTL_SET_MAX_LAYER_NUM DISP_IOW(214, disp_session_layer_num_config)
  325. #define DISP_IOCTL_SET_VSYNC_FPS DISP_IOW(215, unsigned int)
  326. #define DISP_IOCTL_GET_PRESENT_FENCE DISP_IOW(216, disp_present_fence)
  327. #define DISP_IOCTL_GET_IS_DRIVER_SUSPEND DISP_IOW(217, unsigned int)
  328. #define DISP_IOCTL_GET_DISPLAY_CAPS DISP_IOW(218, disp_caps_info)
  329. #define DISP_IOCTL_INSERT_SESSION_BUFFERS DISP_IOW(219, disp_session_buf_info)
  330. #define DISP_IOCTL_FRAME_CONFIG DISP_IOW(220, disp_session_output_config)
  331. #ifdef __KERNEL__
  332. int disp_mgr_get_session_info(disp_session_info *info);
  333. #endif
  334. #endif /* __DISP_SESSION_H */