/* * Copyright (C) STMicroelectronics SA 2014 * Authors: Benjamin Gaignard <benjamin.gaignard@st.com> * Fabien Dessenne <fabien.dessenne@st.com> * for STMicroelectronics. * License terms: GNU General Public License (GPL), version 2 */ #ifndef _STI_LAYER_H_ #define _STI_LAYER_H_ #include <drm/drmP.h> #define to_sti_layer(x) container_of(x, struct sti_layer, plane) #define STI_LAYER_TYPE_SHIFT 8 #define STI_LAYER_TYPE_MASK (~((1<<STI_LAYER_TYPE_SHIFT)-1)) struct sti_layer; enum sti_layer_type { STI_GDP = 1 << STI_LAYER_TYPE_SHIFT, STI_VID = 2 << STI_LAYER_TYPE_SHIFT, STI_CUR = 3 << STI_LAYER_TYPE_SHIFT, STI_BCK = 4 << STI_LAYER_TYPE_SHIFT, STI_VDP = 5 << STI_LAYER_TYPE_SHIFT }; enum sti_layer_id_of_type { STI_ID_0 = 0, STI_ID_1 = 1, STI_ID_2 = 2, STI_ID_3 = 3 }; enum sti_layer_desc { STI_GDP_0 = STI_GDP | STI_ID_0, STI_GDP_1 = STI_GDP | STI_ID_1, STI_GDP_2 = STI_GDP | STI_ID_2, STI_GDP_3 = STI_GDP | STI_ID_3, STI_VID_0 = STI_VID | STI_ID_0, STI_VID_1 = STI_VID | STI_ID_1, STI_HQVDP_0 = STI_VDP | STI_ID_0, STI_CURSOR = STI_CUR, STI_BACK = STI_BCK }; /** * STI layer functions structure * * @get_formats: get layer supported formats * @get_nb_formats: get number of format supported * @init: initialize the layer * @prepare: prepare layer before rendering * @commit: set layer for rendering * @disable: disable layer */ struct sti_layer_funcs { const uint32_t* (*get_formats)(struct sti_layer *layer); unsigned int (*get_nb_formats)(struct sti_layer *layer); void (*init)(struct sti_layer *layer); int (*prepare)(struct sti_layer *layer, bool first_prepare); int (*commit)(struct sti_layer *layer); int (*disable)(struct sti_layer *layer); }; /** * STI layer structure * * @plane: drm plane it is bound to (if any) * @fb: drm fb it is bound to * @crtc: crtc it is bound to * @mode: display mode * @desc: layer type & id * @device: driver device * @regs: layer registers * @ops: layer functions * @zorder: layer z-order * @mixer_id: id of the mixer used to display the layer * @enabled: to know if the layer is active or not * @src_x src_y: coordinates of the input (fb) area * @src_w src_h: size of the input (fb) area * @dst_x dst_y: coordinates of the output (crtc) area * @dst_w dst_h: size of the output (crtc) area * @format: format * @pitches: pitch of 'planes' (eg: Y, U, V) * @offsets: offset of 'planes' * @vaddr: virtual address of the input buffer * @paddr: physical address of the input buffer */ struct sti_layer { struct drm_plane plane; struct drm_framebuffer *fb; struct drm_crtc *crtc; struct drm_display_mode *mode; enum sti_layer_desc desc; struct device *dev; void __iomem *regs; const struct sti_layer_funcs *ops; int zorder; int mixer_id; bool enabled; int src_x, src_y; int src_w, src_h; int dst_x, dst_y; int dst_w, dst_h; uint32_t format; unsigned int pitches[4]; unsigned int offsets[4]; void *vaddr; dma_addr_t paddr; }; struct sti_layer *sti_layer_create(struct device *dev, int desc, void __iomem *baseaddr); int sti_layer_prepare(struct sti_layer *layer, struct drm_crtc *crtc, struct drm_framebuffer *fb, struct drm_display_mode *mode, int mixer_id, int dest_x, int dest_y, int dest_w, int dest_h, int src_x, int src_y, int src_w, int src_h); int sti_layer_commit(struct sti_layer *layer); int sti_layer_disable(struct sti_layer *layer); const uint32_t *sti_layer_get_formats(struct sti_layer *layer); unsigned int sti_layer_get_nb_formats(struct sti_layer *layer); const char *sti_layer_to_str(struct sti_layer *layer); #endif