| /* |
| * 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 |