Add the rt linux 4.1.3-rt3 as base
[kvmfornfv.git] / kernel / drivers / gpu / drm / exynos / exynos_drm_ipp.h
diff --git a/kernel/drivers/gpu/drm/exynos/exynos_drm_ipp.h b/kernel/drivers/gpu/drm/exynos/exynos_drm_ipp.h
new file mode 100644 (file)
index 0000000..2a61547
--- /dev/null
@@ -0,0 +1,252 @@
+/*
+ * Copyright (c) 2012 Samsung Electronics Co., Ltd.
+ *
+ * Authors:
+ *     Eunchul Kim <chulspro.kim@samsung.com>
+ *     Jinyoung Jeon <jy0.jeon@samsung.com>
+ *     Sangmin Lee <lsmin.lee@samsung.com>
+ *
+ * This program is free software; you can redistribute  it and/or modify it
+ * under  the terms of  the GNU General  Public License as published by the
+ * Free Software Foundation;  either version 2 of the  License, or (at your
+ * option) any later version.
+ */
+
+#ifndef _EXYNOS_DRM_IPP_H_
+#define _EXYNOS_DRM_IPP_H_
+
+#define for_each_ipp_ops(pos)  \
+       for (pos = 0; pos < EXYNOS_DRM_OPS_MAX; pos++)
+#define for_each_ipp_planar(pos)       \
+       for (pos = 0; pos < EXYNOS_DRM_PLANAR_MAX; pos++)
+
+#define IPP_GET_LCD_WIDTH      _IOR('F', 302, int)
+#define IPP_GET_LCD_HEIGHT     _IOR('F', 303, int)
+#define IPP_SET_WRITEBACK      _IOW('F', 304, u32)
+
+/* definition of state */
+enum drm_exynos_ipp_state {
+       IPP_STATE_IDLE,
+       IPP_STATE_START,
+       IPP_STATE_STOP,
+};
+
+/*
+ * A structure of command work information.
+ * @work: work structure.
+ * @ippdrv: current work ippdrv.
+ * @c_node: command node information.
+ * @ctrl: command control.
+ */
+struct drm_exynos_ipp_cmd_work {
+       struct work_struct      work;
+       struct exynos_drm_ippdrv        *ippdrv;
+       struct drm_exynos_ipp_cmd_node *c_node;
+       enum drm_exynos_ipp_ctrl        ctrl;
+};
+
+/*
+ * A structure of command node.
+ *
+ * @list: list head to command queue information.
+ * @event_list: list head of event.
+ * @mem_list: list head to source,destination memory queue information.
+ * @lock: lock for synchronization of access to ioctl.
+ * @mem_lock: lock for synchronization of access to memory nodes.
+ * @event_lock: lock for synchronization of access to scheduled event.
+ * @start_complete: completion of start of command.
+ * @stop_complete: completion of stop of command.
+ * @property: property information.
+ * @start_work: start command work structure.
+ * @stop_work: stop command work structure.
+ * @event_work: event work structure.
+ * @state: state of command node.
+ * @filp: associated file pointer.
+ */
+struct drm_exynos_ipp_cmd_node {
+       struct list_head        list;
+       struct list_head        event_list;
+       struct list_head        mem_list[EXYNOS_DRM_OPS_MAX];
+       struct mutex    lock;
+       struct mutex    mem_lock;
+       struct mutex    event_lock;
+       struct completion       start_complete;
+       struct completion       stop_complete;
+       struct drm_exynos_ipp_property  property;
+       struct drm_exynos_ipp_cmd_work *start_work;
+       struct drm_exynos_ipp_cmd_work *stop_work;
+       struct drm_exynos_ipp_event_work *event_work;
+       enum drm_exynos_ipp_state       state;
+       struct drm_file *filp;
+};
+
+/*
+ * A structure of buffer information.
+ *
+ * @handles: Y, Cb, Cr each gem object handle.
+ * @base: Y, Cb, Cr each planar address.
+ */
+struct drm_exynos_ipp_buf_info {
+       unsigned long   handles[EXYNOS_DRM_PLANAR_MAX];
+       dma_addr_t      base[EXYNOS_DRM_PLANAR_MAX];
+};
+
+/*
+ * A structure of wb setting information.
+ *
+ * @enable: enable flag for wb.
+ * @refresh: HZ of the refresh rate.
+ */
+struct drm_exynos_ipp_set_wb {
+       __u32   enable;
+       __u32   refresh;
+};
+
+/*
+ * A structure of event work information.
+ *
+ * @work: work structure.
+ * @ippdrv: current work ippdrv.
+ * @buf_id: id of src, dst buffer.
+ */
+struct drm_exynos_ipp_event_work {
+       struct work_struct      work;
+       struct exynos_drm_ippdrv *ippdrv;
+       u32     buf_id[EXYNOS_DRM_OPS_MAX];
+};
+
+/*
+ * A structure of source,destination operations.
+ *
+ * @set_fmt: set format of image.
+ * @set_transf: set transform(rotations, flip).
+ * @set_size: set size of region.
+ * @set_addr: set address for dma.
+ */
+struct exynos_drm_ipp_ops {
+       int (*set_fmt)(struct device *dev, u32 fmt);
+       int (*set_transf)(struct device *dev,
+               enum drm_exynos_degree degree,
+               enum drm_exynos_flip flip, bool *swap);
+       int (*set_size)(struct device *dev, int swap,
+               struct drm_exynos_pos *pos, struct drm_exynos_sz *sz);
+       int (*set_addr)(struct device *dev,
+                struct drm_exynos_ipp_buf_info *buf_info, u32 buf_id,
+               enum drm_exynos_ipp_buf_type buf_type);
+};
+
+/*
+ * A structure of ipp driver.
+ *
+ * @drv_list: list head for registed sub driver information.
+ * @parent_dev: parent device information.
+ * @dev: platform device.
+ * @drm_dev: drm device.
+ * @dedicated: dedicated ipp device.
+ * @ops: source, destination operations.
+ * @event_workq: event work queue.
+ * @c_node: current command information.
+ * @cmd_list: list head for command information.
+ * @cmd_lock: lock for synchronization of access to cmd_list.
+ * @prop_list: property informations of current ipp driver.
+ * @check_property: check property about format, size, buffer.
+ * @reset: reset ipp block.
+ * @start: ipp each device start.
+ * @stop: ipp each device stop.
+ * @sched_event: work schedule handler.
+ */
+struct exynos_drm_ippdrv {
+       struct list_head        drv_list;
+       struct device   *parent_dev;
+       struct device   *dev;
+       struct drm_device       *drm_dev;
+       bool    dedicated;
+       struct exynos_drm_ipp_ops       *ops[EXYNOS_DRM_OPS_MAX];
+       struct workqueue_struct *event_workq;
+       struct drm_exynos_ipp_cmd_node *c_node;
+       struct list_head        cmd_list;
+       struct mutex    cmd_lock;
+       struct drm_exynos_ipp_prop_list prop_list;
+
+       int (*check_property)(struct device *dev,
+               struct drm_exynos_ipp_property *property);
+       int (*reset)(struct device *dev);
+       int (*start)(struct device *dev, enum drm_exynos_ipp_cmd cmd);
+       void (*stop)(struct device *dev, enum drm_exynos_ipp_cmd cmd);
+       void (*sched_event)(struct work_struct *work);
+};
+
+#ifdef CONFIG_DRM_EXYNOS_IPP
+extern int exynos_drm_ippdrv_register(struct exynos_drm_ippdrv *ippdrv);
+extern int exynos_drm_ippdrv_unregister(struct exynos_drm_ippdrv *ippdrv);
+extern int exynos_drm_ipp_get_property(struct drm_device *drm_dev, void *data,
+                                        struct drm_file *file);
+extern int exynos_drm_ipp_set_property(struct drm_device *drm_dev, void *data,
+                                        struct drm_file *file);
+extern int exynos_drm_ipp_queue_buf(struct drm_device *drm_dev, void *data,
+                                        struct drm_file *file);
+extern int exynos_drm_ipp_cmd_ctrl(struct drm_device *drm_dev, void *data,
+                                        struct drm_file *file);
+extern int exynos_drm_ippnb_register(struct notifier_block *nb);
+extern int exynos_drm_ippnb_unregister(struct notifier_block *nb);
+extern int exynos_drm_ippnb_send_event(unsigned long val, void *v);
+extern void ipp_sched_cmd(struct work_struct *work);
+extern void ipp_sched_event(struct work_struct *work);
+
+#else
+static inline int exynos_drm_ippdrv_register(struct exynos_drm_ippdrv *ippdrv)
+{
+       return -ENODEV;
+}
+
+static inline int exynos_drm_ippdrv_unregister(struct exynos_drm_ippdrv *ippdrv)
+{
+       return -ENODEV;
+}
+
+static inline int exynos_drm_ipp_get_property(struct drm_device *drm_dev,
+                                               void *data,
+                                               struct drm_file *file_priv)
+{
+       return -ENOTTY;
+}
+
+static inline int exynos_drm_ipp_set_property(struct drm_device *drm_dev,
+                                               void *data,
+                                               struct drm_file *file_priv)
+{
+       return -ENOTTY;
+}
+
+static inline int exynos_drm_ipp_queue_buf(struct drm_device *drm_dev,
+                                               void *data,
+                                               struct drm_file *file)
+{
+       return -ENOTTY;
+}
+
+static inline int exynos_drm_ipp_cmd_ctrl(struct drm_device *drm_dev,
+                                               void *data,
+                                               struct drm_file *file)
+{
+       return -ENOTTY;
+}
+
+static inline int exynos_drm_ippnb_register(struct notifier_block *nb)
+{
+       return -ENODEV;
+}
+
+static inline int exynos_drm_ippnb_unregister(struct notifier_block *nb)
+{
+       return -ENODEV;
+}
+
+static inline int exynos_drm_ippnb_send_event(unsigned long val, void *v)
+{
+       return -ENOTTY;
+}
+#endif
+
+#endif /* _EXYNOS_DRM_IPP_H_ */
+