Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
  1/* SPDX-License-Identifier: GPL-2.0-or-later */
  2/*
  3 * Copyright (c) 2017 Samsung Electronics Co., Ltd.
  4 */
  5
  6#ifndef _EXYNOS_DRM_IPP_H_
  7#define _EXYNOS_DRM_IPP_H_
  8
  9struct exynos_drm_ipp;
 10struct exynos_drm_ipp_task;
 11
 12/**
 13 * struct exynos_drm_ipp_funcs - exynos_drm_ipp control functions
 14 */
 15struct exynos_drm_ipp_funcs {
 16	/**
 17	 * @commit:
 18	 *
 19	 * This is the main entry point to start framebuffer processing
 20	 * in the hardware. The exynos_drm_ipp_task has been already validated.
 21	 * This function must not wait until the device finishes processing.
 22	 * When the driver finishes processing, it has to call
 23	 * exynos_exynos_drm_ipp_task_done() function.
 24	 *
 25	 * RETURNS:
 26	 *
 27	 * 0 on success or negative error codes in case of failure.
 28	 */
 29	int (*commit)(struct exynos_drm_ipp *ipp,
 30		      struct exynos_drm_ipp_task *task);
 31
 32	/**
 33	 * @abort:
 34	 *
 35	 * Informs the driver that it has to abort the currently running
 36	 * task as soon as possible (i.e. as soon as it can stop the device
 37	 * safely), even if the task would not have been finished by then.
 38	 * After the driver performs the necessary steps, it has to call
 39	 * exynos_drm_ipp_task_done() (as if the task ended normally).
 40	 * This function does not have to (and will usually not) wait
 41	 * until the device enters a state when it can be stopped.
 42	 */
 43	void (*abort)(struct exynos_drm_ipp *ipp,
 44		      struct exynos_drm_ipp_task *task);
 45};
 46
 47/**
 48 * struct exynos_drm_ipp - central picture processor module structure
 49 */
 50struct exynos_drm_ipp {
 51	struct drm_device *drm_dev;
 52	struct device *dev;
 53	struct list_head head;
 54	unsigned int id;
 55
 56	const char *name;
 57	const struct exynos_drm_ipp_funcs *funcs;
 58	unsigned int capabilities;
 59	const struct exynos_drm_ipp_formats *formats;
 60	unsigned int num_formats;
 61	atomic_t sequence;
 62
 63	spinlock_t lock;
 64	struct exynos_drm_ipp_task *task;
 65	struct list_head todo_list;
 66	wait_queue_head_t done_wq;
 67};
 68
 69struct exynos_drm_ipp_buffer {
 70	struct drm_exynos_ipp_task_buffer buf;
 71	struct drm_exynos_ipp_task_rect rect;
 72
 73	struct exynos_drm_gem *exynos_gem[MAX_FB_BUFFER];
 74	const struct drm_format_info *format;
 75	dma_addr_t dma_addr[MAX_FB_BUFFER];
 76};
 77
 78/**
 79 * struct exynos_drm_ipp_task - a structure describing transformation that
 80 * has to be performed by the picture processor hardware module
 81 */
 82struct exynos_drm_ipp_task {
 83	struct device *dev;
 84	struct exynos_drm_ipp *ipp;
 85	struct list_head head;
 86
 87	struct exynos_drm_ipp_buffer src;
 88	struct exynos_drm_ipp_buffer dst;
 89
 90	struct drm_exynos_ipp_task_transform transform;
 91	struct drm_exynos_ipp_task_alpha alpha;
 92
 93	struct work_struct cleanup_work;
 94	unsigned int flags;
 95	int ret;
 96
 97	struct drm_pending_exynos_ipp_event *event;
 98};
 99
100#define DRM_EXYNOS_IPP_TASK_DONE	(1 << 0)
101#define DRM_EXYNOS_IPP_TASK_ASYNC	(1 << 1)
102
103struct exynos_drm_ipp_formats {
104	uint32_t fourcc;
105	uint32_t type;
106	uint64_t modifier;
107	const struct drm_exynos_ipp_limit *limits;
108	unsigned int num_limits;
109};
110
111/* helper macros to set exynos_drm_ipp_formats structure and limits*/
112#define IPP_SRCDST_MFORMAT(f, m, l) \
113	.fourcc = DRM_FORMAT_##f, .modifier = m, .limits = l, \
114	.num_limits = ARRAY_SIZE(l), \
115	.type = (DRM_EXYNOS_IPP_FORMAT_SOURCE | \
116		 DRM_EXYNOS_IPP_FORMAT_DESTINATION)
117
118#define IPP_SRCDST_FORMAT(f, l) IPP_SRCDST_MFORMAT(f, 0, l)
119
120#define IPP_SIZE_LIMIT(l, val...)	\
121	.type = (DRM_EXYNOS_IPP_LIMIT_TYPE_SIZE | \
122		 DRM_EXYNOS_IPP_LIMIT_SIZE_##l), val
123
124#define IPP_SCALE_LIMIT(val...)		\
125	.type = (DRM_EXYNOS_IPP_LIMIT_TYPE_SCALE), val
126
127int exynos_drm_ipp_register(struct device *dev, struct exynos_drm_ipp *ipp,
128		const struct exynos_drm_ipp_funcs *funcs, unsigned int caps,
129		const struct exynos_drm_ipp_formats *formats,
130		unsigned int num_formats, const char *name);
131void exynos_drm_ipp_unregister(struct device *dev,
132			       struct exynos_drm_ipp *ipp);
133
134void exynos_drm_ipp_task_done(struct exynos_drm_ipp_task *task, int ret);
135
136#ifdef CONFIG_DRM_EXYNOS_IPP
137int exynos_drm_ipp_get_res_ioctl(struct drm_device *dev, void *data,
138				 struct drm_file *file_priv);
139int exynos_drm_ipp_get_caps_ioctl(struct drm_device *dev, void *data,
140				  struct drm_file *file_priv);
141int exynos_drm_ipp_get_limits_ioctl(struct drm_device *dev, void *data,
142				    struct drm_file *file_priv);
143int exynos_drm_ipp_commit_ioctl(struct drm_device *dev,
144				void *data, struct drm_file *file_priv);
145#else
146static inline int exynos_drm_ipp_get_res_ioctl(struct drm_device *dev,
147	 void *data, struct drm_file *file_priv)
148{
149	struct drm_exynos_ioctl_ipp_get_res *resp = data;
150
151	resp->count_ipps = 0;
152	return 0;
153}
154static inline int exynos_drm_ipp_get_caps_ioctl(struct drm_device *dev,
155	 void *data, struct drm_file *file_priv)
156{
157	return -ENODEV;
158}
159static inline int exynos_drm_ipp_get_limits_ioctl(struct drm_device *dev,
160	 void *data, struct drm_file *file_priv)
161{
162	return -ENODEV;
163}
164static inline int exynos_drm_ipp_commit_ioctl(struct drm_device *dev,
165	 void *data, struct drm_file *file_priv)
166{
167	return -ENODEV;
168}
169#endif
170#endif