#ifndef _LINUX_OMAP_HWC_H #define _LINUX_OMAP_HWC_H /* * Client of the omap_hwc_data API * ------------------------------- * This is really a kernel to kernel API (not an ioctl interface) but most of * the values are populated in user space by a single client, specifically the * Android hardware composer HAL (HWC) which is a library loaded by the * SurfaceFlinger composition process. * * Implementation details * ---------------------- * The SGX display driver (called OMAPLFB) will obtain this data structure * from the GPU driver (aka PVR kernel services) as well as an array of * memory descriptors managed by PVR services. OMAPLFB is responsible * for fixing up the buffer data within the omap_hwc_data data structure * before calling the DSSCOMP module and (optionally) the Bltsville kernel * API/implementation. * * Buffer referencing * ------------------ * When calling from the HWC (via PVR services) the actual address of buffers * involved in composition are typically unknown. It is a convention to store * an index in the appropriate field of the sub-structures in omap_hwc_data. * PVR services also passes an array of memory data structures that these * indexes (commonly) refer to. * * The dsscomp API fully describes how it manages buffering when called * from a kernel client context. The simplest scenario is that individual * overlays carry the buffer index in the overlay structure base address. * * For Bltsville kernel mode support, buffers are identified by storing the * buffer index in the virtaddr of the various bvbuffdesc entries. Some * exceptions are described below. * * Blitting * -------- * Blit source buffers are managed in the same way as Post2 layers in the * dsscomp API. The Android HWC constructs the blits using the Bltsville * API but the actual blits are issued to Bltsville kernel mode implementation * from OMAPLFB. Destination buffers are allocated and managed by OMAPLFB. * * When blitting it is expected that HWC will construct the overlay information * appropriately in "dsscomp_data" */ /* * Alternate blit descriptor information. * * As mentioned above buffers are refers to by index, alternate buffers * can be refered to by the following */ #define HWC_BLT_DESC_FLAG 0x80000000 /* * With this value the descriptor refers to an available framebuffer. It * is up to the client and OMAPLFB to track and manage the state of these * buffers. The caller can also specify an overlay index that OMAPLFB will * use when programming dsscomp with the result of the blit. */ #define HWC_BLT_DESC_FB 0x40000000 #define HWC_BLT_DESC_FB_FN(ovlno) \ (HWC_BLT_DESC_FLAG | HWC_BLT_DESC_FB | (ovlno)) /* * This flag hints OMAPLFB the HWC has configured a DSS pipe for a blit FB */ #define HWC_BLT_FLAG_USE_FB (1 << 0) /*****************************************************************************/ /* WARNING - These structs must keep in sync with user space code */ /*****************************************************************************/ struct rgz_blt_entry { struct bvbltparams bp; struct bvsurfgeom dstgeom; struct bvsurfgeom src1geom; struct bvbuffdesc src1desc; struct bvsurfgeom src2geom; struct bvbuffdesc src2desc; }; struct omap_hwc_blit_data { __u16 rgz_flags; /* if rgz_items is 0 there is nothing to blit */ __u16 rgz_items; struct rgz_blt_entry rgz_blts[0]; }; /* * This structure is passed down from the Android HWC HAL */ struct omap_hwc_data { struct dsscomp_setup_dispc_data dsscomp_data; struct omap_hwc_blit_data blit_data; }; #endif