1 #ifndef _LINUX_DSSCOMP_H 2 #define _LINUX_DSSCOMP_H 3 4 #ifdef __KERNEL__ 5 #include <video/omapdss.h> 6 #else 7 8 /* exporting enumerations from arch/arm/plat-omap/include/plat/display.h */ 9 enum omap_plane { 10 OMAP_DSS_GFX = 0, 11 OMAP_DSS_VIDEO1 = 1, 12 OMAP_DSS_VIDEO2 = 2, 13 OMAP_DSS_VIDEO3 = 3, 14 OMAP_DSS_WB = 4, 15 }; 16 17 enum omap_channel { 18 OMAP_DSS_CHANNEL_LCD = 0, 19 OMAP_DSS_CHANNEL_DIGIT = 1, 20 OMAP_DSS_CHANNEL_LCD2 = 2, 21 }; 22 23 enum omap_color_mode { 24 OMAP_DSS_COLOR_CLUT1 = 1 << 0, /* BITMAP 1 */ 25 OMAP_DSS_COLOR_CLUT2 = 1 << 1, /* BITMAP 2 */ 26 OMAP_DSS_COLOR_CLUT4 = 1 << 2, /* BITMAP 4 */ 27 OMAP_DSS_COLOR_CLUT8 = 1 << 3, /* BITMAP 8 */ 28 29 /* also referred to as RGB 12-BPP, 16-bit container */ 30 OMAP_DSS_COLOR_RGB12U = 1 << 4, /* xRGB12-4444 */ 31 OMAP_DSS_COLOR_ARGB16 = 1 << 5, /* ARGB16-4444 */ 32 OMAP_DSS_COLOR_RGB16 = 1 << 6, /* RGB16-565 */ 33 34 /* also referred to as RGB 24-BPP, 32-bit container */ 35 OMAP_DSS_COLOR_RGB24U = 1 << 7, /* xRGB24-8888 */ 36 OMAP_DSS_COLOR_RGB24P = 1 << 8, /* RGB24-888 */ 37 OMAP_DSS_COLOR_YUV2 = 1 << 9, /* YUV2 4:2:2 co-sited */ 38 OMAP_DSS_COLOR_UYVY = 1 << 10, /* UYVY 4:2:2 co-sited */ 39 OMAP_DSS_COLOR_ARGB32 = 1 << 11, /* ARGB32-8888 */ 40 OMAP_DSS_COLOR_RGBA32 = 1 << 12, /* RGBA32-8888 */ 41 42 /* also referred to as RGBx 32 in TRM */ 43 OMAP_DSS_COLOR_RGBX24 = 1 << 13, /* RGBx32-8888 */ 44 OMAP_DSS_COLOR_RGBX32 = 1 << 13, /* RGBx32-8888 */ 45 OMAP_DSS_COLOR_NV12 = 1 << 14, /* NV12 format: YUV 4:2:0 */ 46 47 /* also referred to as RGBA12-4444 in TRM */ 48 OMAP_DSS_COLOR_RGBA16 = 1 << 15, /* RGBA16-4444 */ 49 50 OMAP_DSS_COLOR_RGBX12 = 1 << 16, /* RGBx16-4444 */ 51 OMAP_DSS_COLOR_RGBX16 = 1 << 16, /* RGBx16-4444 */ 52 OMAP_DSS_COLOR_ARGB16_1555 = 1 << 17, /* ARGB16-1555 */ 53 54 /* also referred to as xRGB16-555 in TRM */ 55 OMAP_DSS_COLOR_XRGB15 = 1 << 18, /* xRGB16-1555 */ 56 OMAP_DSS_COLOR_XRGB16_1555 = 1 << 18, /* xRGB16-1555 */ 57 }; 58 59 enum omap_dss_trans_key_type { 60 OMAP_DSS_COLOR_KEY_GFX_DST = 0, 61 OMAP_DSS_COLOR_KEY_VID_SRC = 1, 62 }; 63 64 enum omap_dss_display_state { 65 OMAP_DSS_DISPLAY_DISABLED = 0, 66 OMAP_DSS_DISPLAY_ACTIVE, 67 OMAP_DSS_DISPLAY_SUSPENDED, 68 OMAP_DSS_DISPLAY_TRANSITION, 69 }; 70 71 struct omap_video_timings { 72 /* Unit: pixels */ 73 __u16 x_res; 74 /* Unit: pixels */ 75 __u16 y_res; 76 /* Unit: KHz */ 77 __u32 pixel_clock; 78 /* Unit: pixel clocks */ 79 __u16 hsw; /* Horizontal synchronization pulse width */ 80 /* Unit: pixel clocks */ 81 __u16 hfp; /* Horizontal front porch */ 82 /* Unit: pixel clocks */ 83 __u16 hbp; /* Horizontal back porch */ 84 /* Unit: line clocks */ 85 __u16 vsw; /* Vertical synchronization pulse width */ 86 /* Unit: line clocks */ 87 __u16 vfp; /* Vertical front porch */ 88 /* Unit: line clocks */ 89 __u16 vbp; /* Vertical back porch */ 90 }; 91 92 /* YUV to RGB color conversion info */ 93 struct omap_dss_cconv_coefs { 94 __s16 ry, rcr, rcb; 95 __s16 gy, gcr, gcb; 96 __s16 by, bcr, bcb; 97 98 /* Y is 16..235, UV is 16..240 if not fullrange. Otherwise 0..255 */ 99 __u16 full_range; 100 } __attribute__ ((aligned(4))); 101 102 struct omap_dss_cpr_coefs { 103 __s16 rr, rg, rb; 104 __s16 gr, gg, gb; 105 __s16 br, bg, bb; 106 }; 107 108 #endif 109 110 /* copy of fb_videomode */ 111 struct dsscomp_videomode { 112 const char *name; /* optional */ 113 __u32 refresh; /* optional */ 114 __u32 xres; 115 __u32 yres; 116 __u32 pixclock; 117 __u32 left_margin; 118 __u32 right_margin; 119 __u32 upper_margin; 120 __u32 lower_margin; 121 __u32 hsync_len; 122 __u32 vsync_len; 123 __u32 sync; 124 __u32 vmode; 125 __u32 flag; 126 }; 127 128 /* 129 * Stereoscopic Panel types 130 * row, column, overunder, sidebyside options 131 * are with respect to native scan order 132 */ 133 enum s3d_disp_type { 134 S3D_DISP_NONE = 0, 135 S3D_DISP_FRAME_SEQ, 136 S3D_DISP_ROW_IL, 137 S3D_DISP_COL_IL, 138 S3D_DISP_PIX_IL, 139 S3D_DISP_CHECKB, 140 S3D_DISP_OVERUNDER, 141 S3D_DISP_SIDEBYSIDE, 142 }; 143 144 /* Subsampling direction is based on native panel scan order.*/ 145 enum s3d_disp_sub_sampling { 146 S3D_DISP_SUB_SAMPLE_NONE = 0, 147 S3D_DISP_SUB_SAMPLE_V, 148 S3D_DISP_SUB_SAMPLE_H, 149 }; 150 151 /* 152 * Indicates if display expects left view first followed by right or viceversa 153 * For row interlaved displays, defines first row view 154 * For column interleaved displays, defines first column view 155 * For checkerboard, defines first pixel view 156 * For overunder, defines top view 157 * For sidebyside, defines west view 158 */ 159 enum s3d_disp_order { 160 S3D_DISP_ORDER_L = 0, 161 S3D_DISP_ORDER_R = 1, 162 }; 163 164 /* 165 * Indicates current view 166 * Used mainly for displays that need to trigger a sync signal 167 */ 168 enum s3d_disp_view { 169 S3D_DISP_VIEW_L = 0, 170 S3D_DISP_VIEW_R, 171 }; 172 173 struct s3d_disp_info { 174 enum s3d_disp_type type; 175 enum s3d_disp_sub_sampling sub_samp; 176 enum s3d_disp_order order; 177 /* 178 * Gap between left and right views 179 * For over/under units are lines 180 * For sidebyside units are pixels 181 * For other types ignored 182 */ 183 unsigned int gap; 184 }; 185 186 enum omap_dss_ilace_mode { 187 OMAP_DSS_ILACE = (1 << 0), /* interlaced vs. progressive */ 188 OMAP_DSS_ILACE_SEQ = (1 << 1), /* sequential vs interleaved */ 189 OMAP_DSS_ILACE_SWAP = (1 << 2), /* swap fields, e.g. TB=>BT */ 190 191 OMAP_DSS_ILACE_NONE = 0, 192 OMAP_DSS_ILACE_IL_TB = OMAP_DSS_ILACE, 193 OMAP_DSS_ILACE_IL_BT = OMAP_DSS_ILACE | OMAP_DSS_ILACE_SWAP, 194 OMAP_DSS_ILACE_SEQ_TB = OMAP_DSS_ILACE_IL_TB | OMAP_DSS_ILACE_SEQ, 195 OMAP_DSS_ILACE_SEQ_BT = OMAP_DSS_ILACE_IL_BT | OMAP_DSS_ILACE_SEQ, 196 }; 197 198 /* YUV VC1 range mapping info */ 199 struct dss2_vc1_range_map_info { 200 __u8 enable; /* bool */ 201 202 __u8 range_y; /* 0..7 */ 203 __u8 range_uv; /* 0..7 */ 204 } __attribute__ ((aligned(4))); 205 206 /* standard rectangle */ 207 struct dss2_rect_t { 208 __s32 x; /* left */ 209 __s32 y; /* top */ 210 __u32 w; /* width */ 211 __u32 h; /* height */ 212 } __attribute__ ((aligned(4))); 213 214 /* decimation constraints */ 215 struct dss2_decim { 216 __u8 min_x; 217 __u8 max_x; /* 0 is same as 255 */ 218 __u8 min_y; 219 __u8 max_y; /* 0 is same as 255 */ 220 } __attribute__ ((aligned(4))); 221 222 /* 223 * A somewhat more user friendly interface to the DSS2. This is a 224 * direct interface to the DSS2 overlay and overlay_manager modules. 225 * User-space APIs are provided for HW-specific control of DSS in 226 * contrast with V4L2/FB that are more generic, but in this process 227 * omit HW-specific features. 228 * 229 * For now managers are specified by display index as opposed to manager 230 * type, so that display0 is always the default display (e.g. HDMI on 231 * panda, and LCD blaze.) For now you would need to query the displays 232 * or use sysfs to find a specific display. 233 * 234 * Userspace operations are as follows: 235 * 236 * 1) check if DSS supports an overlay configuration, use DSSCIOC_CHECK_OVL 237 * ioctl with the manager, overlay, and setup-mode information filled out. 238 * All fields should be filled out as it may influence whether DSS can 239 * display/render the overlay. 240 * 241 * If proper address information is not available, it may be possible to 242 * use a type-of-address enumeration instead for luma/rgb and chroma (if 243 * applicable) frames. 244 * 245 * Do this for each overlay before attempting to configure DSS. 246 * 247 * 2) configure DSS pipelines for display/manager using DSSCOMP_SETUP_MANAGER 248 * ioctl. You can delay applying the settings until an dss2_manager_apply() 249 * is called for the internal composition object, if the APPLY bit of setup mode 250 * is not set. However the CAPTURE/DISPLAY bits of the setup mode settings will 251 * determine if at this time a capture will take place (in case of capture 252 * only mode). You may also set up additional pipelines with 253 * dss2_overlay_setup() before this. 254 * 255 * 3) On OMAP4/5 you can use the DSS WB pipeline to copy (and convert) a buffer 256 * using DSS. Use the DSSCIOC_WB_COPY ioctl for this. This is a blocking 257 * call, and it may possibly fail if an ongoing WB capture mode has been 258 * scheduled (which is outside of the current scope of the DSS2 interface.) 259 * 260 * There is also a one-shot configuration API (DSSCIOC_SETUP_DISPC). This 261 * allows you to set-up all overlays on all managers in one call. This call 262 * performs additional functionality: 263 * 264 * - it maps userspace 1D buffers into TILER 1D for the duration of the display 265 * - it disables all overlays that were specified before, but are no longer 266 * specified 267 * 268 */ 269 270 /* 271 * DSS2 overlay information. This structure contains all information 272 * needed to set up the overlay for a particular buffer to be displayed 273 * at a particular orientation. 274 * 275 * The following information is deemed to be set globally, so it is not 276 * included: 277 * - whether to enable zorder (always enabled) 278 * - whether to replicate/truncate color fields (it is decided per the 279 * whole manager/overlay settings, and is enabled unless overlay is 280 * directed to WB.) 281 * 282 * There is also no support for CLUT formats 283 * 284 * Requirements: 285 * 286 * 1) 0 <= crop.x <= crop.x + crop.w <= width 287 * 2) 0 <= crop.y <= crop.y + crop.h <= height 288 * 3) win.x <= win.x + win.w and win.w >= 0 289 * 4) win.y <= win.y + win.h and win.h >= 0 290 * 291 * 5) color_mode is supported by overlay 292 * 6) requested scaling is supported by overlay and functional clocks 293 * 294 * Notes: 295 * 296 * 1) Any portions of X:[pos_x, pos_x + out_width] and 297 * Y:[pos_y, pos_y + out_height] outside of the screen 298 * X:[0, screen.width], Y:[0, screen.height] will be cropped 299 * automatically without changing the scaling ratio. 300 * 301 * 2) Crop region will be adjusted to the pixel granularity: 302 * (2-by-1) for YUV422, (2-by-2) for YUV420. This will 303 * not modify the output region. Crop region is for the 304 * original (unrotated) buffer, so it does not change with 305 * rotation. 306 * 307 * 3) Rotation will not modify the output region, specifically 308 * its height and width. Also the coordinate system of the 309 * display is always (0,0) = top left. 310 * 311 * 4) cconv and vc1 only needs to be filled for YUV color modes. 312 * 313 * 5) vc1.range_y and vc1.range_uv only needs to be filled if 314 * vc1.enable is true. 315 */ 316 struct dss2_ovl_cfg { 317 __u16 width; /* buffer width */ 318 __u16 height; /* buffer height */ 319 __u32 stride; /* buffer stride */ 320 321 enum omap_color_mode color_mode; 322 __u8 pre_mult_alpha; /* bool */ 323 __u8 global_alpha; /* 0..255 */ 324 __u8 rotation; /* 0..3 (*90 degrees clockwise) */ 325 __u8 mirror; /* left-to-right: mirroring is applied after rotation */ 326 327 enum omap_dss_ilace_mode ilace; /* interlace mode */ 328 329 struct dss2_rect_t win; /* output window - on display */ 330 struct dss2_rect_t crop; /* crop window - in source buffer */ 331 332 struct dss2_decim decim; /* predecimation limits */ 333 334 struct omap_dss_cconv_coefs cconv; 335 struct dss2_vc1_range_map_info vc1; 336 337 __u8 ix; /* ovl index same as sysfs/overlay# */ 338 __u8 zorder; /* 0..3 */ 339 __u8 enabled; /* bool */ 340 __u8 zonly; /* only set zorder and enabled bit */ 341 __u8 mgr_ix; /* mgr index */ 342 } __attribute__ ((aligned(4))); 343 344 enum omapdss_buffer_type { 345 OMAP_DSS_BUFTYPE_SDMA, 346 OMAP_DSS_BUFTYPE_TILER_8BIT, 347 OMAP_DSS_BUFTYPE_TILER_16BIT, 348 OMAP_DSS_BUFTYPE_TILER_32BIT, 349 OMAP_DSS_BUFTYPE_TILER_PAGE, 350 }; 351 352 enum omapdss_buffer_addressing_type { 353 OMAP_DSS_BUFADDR_DIRECT, /* using direct addresses */ 354 OMAP_DSS_BUFADDR_BYTYPE, /* using buffer types */ 355 OMAP_DSS_BUFADDR_ION, /* using ion handle(s) */ 356 OMAP_DSS_BUFADDR_GRALLOC, /* using gralloc handle */ 357 OMAP_DSS_BUFADDR_OVL_IX, /* using a prior overlay */ 358 OMAP_DSS_BUFADDR_LAYER_IX, /* using a Post2 layer */ 359 OMAP_DSS_BUFADDR_FB, /* using framebuffer memory */ 360 }; 361 362 struct dss2_ovl_info { 363 struct dss2_ovl_cfg cfg; 364 365 enum omapdss_buffer_addressing_type addressing; 366 367 union { 368 /* user-space interfaces */ 369 struct { 370 void *address; /* main buffer address */ 371 void *uv_address; /* uv buffer */ 372 }; 373 374 /* 375 * For DSSCIOC_CHECK_OVL we allow specifying just the 376 * type of each buffer. This is used if we need to 377 * check whether DSS will be able to display a buffer 378 * if using a particular memory type before spending 379 * time to map/copy the buffer into that type of 380 * memory. 381 */ 382 struct { 383 enum omapdss_buffer_type ba_type; 384 enum omapdss_buffer_type uv_type; 385 }; 386 387 /* kernel-space interfaces */ 388 389 /* 390 * for fbmem, highest 4-bits of address is fb index, 391 * rest of the bits are the offset 392 */ 393 struct { 394 __u32 ba; /* base address or index */ 395 __u32 uv; /* uv address */ 396 }; 397 }; 398 }; 399 400 /* 401 * DSS2 manager information. 402 * 403 * The following information is deemed to be set globally, so it is not 404 * included: 405 * gamma correction 406 * whether to enable zorder (always enabled) 407 * whether to replicate/truncate color fields (it is decided per the 408 * whole manager/overlay settings, and is enabled unless overlay is 409 * directed to WB.) 410 * Notes: 411 * 412 * 1) trans_key_type and trans_enabled only need to be filled if 413 * trans_enabled is true, and alpha_blending is false. 414 */ 415 struct dss2_mgr_info { 416 __u32 ix; /* display index same as sysfs/display# */ 417 418 __u32 default_color; 419 420 enum omap_dss_trans_key_type trans_key_type; 421 __u32 trans_key; 422 struct omap_dss_cpr_coefs cpr_coefs; 423 424 __u8 trans_enabled; /* bool */ 425 426 __u8 interlaced; /* bool */ 427 __u8 alpha_blending; /* bool - overrides trans_enabled */ 428 __u8 cpr_enabled; /* bool */ 429 __u8 swap_rb; /* bool - swap red and blue */ 430 } __attribute__ ((aligned(4))); 431 432 /* 433 * ioctl: DSSCIOC_SETUP_MGR, struct dsscomp_setup_mgr_data 434 * 435 * 1. sets manager of each ovl in composition to the display 436 * 2. calls set_dss_ovl_info() for each ovl to set up the 437 * overlay staging structures (this is a wrapper around ovl->set_info()) 438 * 3. calls set_dss_mgr_info() for mgr to set up the manager 439 * staging structures (this is a wrapper around mgr->set_info()) 440 * 4. if update is true: 441 * calls manager->apply() 442 * calls driver->update() in a non-blocking fashion 443 * this will program the DSS synchronously 444 * 445 * Notes: 446 * 447 * 1) x, y, w, h only needs to be set if update is true. 448 * 449 * All non-specified pipelines that currently are on the same display 450 * will remain the same as on the previous frame. You may want to 451 * disable unused pipelines to avoid surprises. 452 * 453 * If get_sync_obj is false, it returns 0 on success, <0 error value 454 * on failure. 455 * 456 * If get_sync_obj is true, it returns fd on success, or a negative value 457 * on failure. You can use the fd to wait on (using DSSCIOC_WAIT ioctl()). 458 * 459 * Note: frames do not get eclipsed when the display turns off. Queue a 460 * blank frame to eclipse old frames. Blank frames get eclipsed when 461 * programmed into DSS. 462 * 463 * (A blank frame is queued to the display automatically in Android before 464 * the display is turned off.) 465 * 466 * All overlays to be used on the frame must be listed. There is no way 467 * to add another overlay to a defined frame. 468 */ 469 enum dsscomp_setup_mode { 470 DSSCOMP_SETUP_MODE_APPLY = (1 << 0), /* applies changes to cache */ 471 DSSCOMP_SETUP_MODE_DISPLAY = (1 << 1), /* calls display update */ 472 DSSCOMP_SETUP_MODE_CAPTURE = (1 << 2), /* capture to WB */ 473 474 /* just apply changes for next vsync/update */ 475 DSSCOMP_SETUP_APPLY = DSSCOMP_SETUP_MODE_APPLY, 476 /* trigger an update (wait for vsync) */ 477 DSSCOMP_SETUP_DISPLAY = 478 DSSCOMP_SETUP_MODE_APPLY | DSSCOMP_SETUP_MODE_DISPLAY, 479 /* capture to WB - WB must be configured */ 480 DSSCOMP_SETUP_CAPTURE = 481 DSSCOMP_SETUP_MODE_APPLY | DSSCOMP_SETUP_MODE_CAPTURE, 482 /* display and capture to WB - WB must be configured */ 483 DSSCOMP_SETUP_DISPLAY_CAPTURE = 484 DSSCOMP_SETUP_DISPLAY | DSSCOMP_SETUP_CAPTURE, 485 }; 486 487 struct dsscomp_setup_mgr_data { 488 __u32 sync_id; /* synchronization ID - for debugging */ 489 490 struct dss2_rect_t win; /* update region, set w/h to 0 for fullscreen */ 491 enum dsscomp_setup_mode mode; 492 __u16 num_ovls; /* # of overlays used in the composition */ 493 __u16 get_sync_obj; /* ioctl should return a sync object */ 494 495 struct dss2_mgr_info mgr; 496 struct dss2_ovl_info ovls[0]; /* up to 5 overlays to set up */ 497 }; 498 499 /* 500 * ioctl: DSSCIOC_CHECK_OVL, struct dsscomp_check_ovl_data 501 * 502 * DISPLAY and/or CAPTURE bits must be filled for the mode field 503 * correctly to be able to decide correctly if DSS can properly 504 * render the overlay. 505 * 506 * ovl.ix is ignored. 507 * 508 * Returns a positive bitmask regarding which overlay of DSS can 509 * render the overlay as it is configured for the display/display's 510 * manager. NOTE: that overlays that are assigned to other displays 511 * may be returned. If there is an invalid configuration (negative 512 * sizes, etc.), a negative error value is returned. 513 * 514 * ovl->decim's min values will be modified to the smallest decimation that 515 * DSS can use to support the overlay configuration. 516 * 517 * Assumptions: 518 * - zorder will be distinct from other pipelines on that manager 519 * - overlay will be enabled and routed to the display specified 520 */ 521 struct dsscomp_check_ovl_data { 522 enum dsscomp_setup_mode mode; 523 struct dss2_mgr_info mgr; 524 struct dss2_ovl_info ovl; 525 }; 526 527 /* 528 * This structure is used to set up the entire DISPC (all managers), 529 * and is analogous to dsscomp_setup_mgr_data. 530 * 531 * Additional features: 532 * - all overlays that were specified in a prior use of this 533 * structure, and are no longer specified, will be disabled. 534 * - 1D buffers under 4M will be mapped into TILER1D. 535 * 536 * Limitations: 537 * - only DISPLAY mode is supported (DISPLAY and APPLY bits will 538 * automatically be set) 539 * - getting a sync object is not supported. 540 */ 541 struct dsscomp_setup_dispc_data { 542 __u32 sync_id; /* synchronization ID - for debugging */ 543 544 enum dsscomp_setup_mode mode; 545 __u16 num_ovls; /* # of overlays used in the composition */ 546 __u16 num_mgrs; /* # of managers used in the composition */ 547 __u16 get_sync_obj; /* ioctl should return a sync object */ 548 549 struct dss2_mgr_info mgrs[3]; 550 struct dss2_ovl_info ovls[5]; /* up to 5 overlays to set up */ 551 }; 552 553 /* 554 * ioctl: DSSCIOC_WB_COPY, struct dsscomp_wb_copy_data 555 *, 556 * Requirements: 557 * wb.ix must be OMAP_DSS_WB. 558 * 559 * Returns 0 on success (copy is completed), non-0 on failure. 560 */ 561 struct dsscomp_wb_copy_data { 562 struct dss2_ovl_info ovl, wb; 563 }; 564 565 /* 566 * ioctl: DSSCIOC_QUERY_DISPLAY, struct dsscomp_display_info 567 * 568 * Gets informations about the display. Fill in ix and modedb_len before 569 * calling ioctl, and rest of the fields are filled in by ioctl. Up to 570 * modedb_len timings are retrieved in the order of display preference. 571 * 572 * Returns: 0 on success, non-0 error value on failure. 573 */ 574 struct dsscomp_display_info { 575 __u32 ix; /* display index (sysfs/display#) */ 576 __u32 overlays_available; /* bitmask of available overlays */ 577 __u32 overlays_owned; /* bitmask of owned overlays */ 578 enum omap_channel channel; 579 enum omap_dss_display_state state; 580 __u8 enabled; /* bool: resume-state if suspended */ 581 struct omap_video_timings timings; 582 struct s3d_disp_info s3d_info; /* any S3D specific information */ 583 struct dss2_mgr_info mgr; /* manager information */ 584 __u16 width_in_mm; /* screen dimensions */ 585 __u16 height_in_mm; 586 587 __u32 modedb_len; /* number of video timings */ 588 struct dsscomp_videomode modedb[]; /* display supported timings */ 589 }; 590 591 /* 592 * ioctl: DSSCIOC_SETUP_DISPLAY, struct dsscomp_setup_display_data 593 * 594 * Gets informations about the display. Fill in ix before calling 595 * ioctl, and rest of the fields are filled in by ioctl. 596 * 597 * Returns: 0 on success, non-0 error value on failure. 598 */ 599 struct dsscomp_setup_display_data { 600 __u32 ix; /* display index (sysfs/display#) */ 601 struct dsscomp_videomode mode; /* video timings */ 602 }; 603 604 /* 605 * ioctl: DSSCIOC_WAIT, struct dsscomp_wait_data 606 * 607 * Use this ioctl to wait for one of the following events: 608 * 609 * A) the moment a composition is programmed into DSS 610 * B) the moment a composition is first displayed (or captured) 611 * C) the moment when a composition is no longer queued or displayed on a 612 * display (it is released). (A composition is assumed to be superceded 613 * when another composition has been programmed into DSS, even if that 614 * subsequent composition does not update/specify all overlays used by 615 * the prior composition; moreover, even if it uses the same buffers.) 616 * 617 * Set timeout to desired timeout value in microseconds. 618 * 619 * This ioctl must be used on the sync object returned by the 620 * DSSCIOC_SETUP_MGR or DSSCIOC_SETUP_DISPC ioctls. 621 * 622 * Returns: >=0 on success, <0 error value on failure (e.g. -ETIME). 623 */ 624 enum dsscomp_wait_phase { 625 DSSCOMP_WAIT_PROGRAMMED = 1, 626 DSSCOMP_WAIT_DISPLAYED, 627 DSSCOMP_WAIT_RELEASED, 628 }; 629 630 struct dsscomp_wait_data { 631 __u32 timeout_us; /* timeout in microseconds */ 632 enum dsscomp_wait_phase phase; /* phase to wait for */ 633 }; 634 635 /* IOCTLS */ 636 #define DSSCIOC_SETUP_MGR _IOW('O', 128, struct dsscomp_setup_mgr_data) 637 #define DSSCIOC_CHECK_OVL _IOWR('O', 129, struct dsscomp_check_ovl_data) 638 #define DSSCIOC_WB_COPY _IOW('O', 130, struct dsscomp_wb_copy_data) 639 #define DSSCIOC_QUERY_DISPLAY _IOWR('O', 131, struct dsscomp_display_info) 640 #define DSSCIOC_WAIT _IOW('O', 132, struct dsscomp_wait_data) 641 642 #define DSSCIOC_SETUP_DISPC _IOW('O', 133, struct dsscomp_setup_dispc_data) 643 #define DSSCIOC_SETUP_DISPLAY _IOW('O', 134, struct dsscomp_setup_display_data) 644 #endif 645