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