aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/omapdrm/omap_drv.h
diff options
context:
space:
mode:
authorRob Clark <robdclark@gmail.com>2013-02-11 12:43:09 -0500
committerRob Clark <robdclark@gmail.com>2013-02-16 17:38:06 -0500
commit8bb0daffb0b8e45188066255b4203446eae181f1 (patch)
treec1a324b863df57becdfab54c9325231bbb853b56 /drivers/gpu/drm/omapdrm/omap_drv.h
parenta4462f246c8821f625f45bce52c7ca7e0207dffe (diff)
drm/omap: move out of staging
Now that the omapdss interface has been reworked so that omapdrm can use dispc directly, we have been able to fix the remaining functional kms issues with omapdrm. And in the mean time the PM sequencing and many other of that open issues have been solved. So I think it makes sense to finally move omapdrm out of staging. Signed-off-by: Rob Clark <robdclark@gmail.com>
Diffstat (limited to 'drivers/gpu/drm/omapdrm/omap_drv.h')
-rw-r--r--drivers/gpu/drm/omapdrm/omap_drv.h333
1 files changed, 333 insertions, 0 deletions
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h b/drivers/gpu/drm/omapdrm/omap_drv.h
new file mode 100644
index 000000000000..d4f997bb4ac0
--- /dev/null
+++ b/drivers/gpu/drm/omapdrm/omap_drv.h
@@ -0,0 +1,333 @@
1/*
2 * drivers/gpu/drm/omapdrm/omap_drv.h
3 *
4 * Copyright (C) 2011 Texas Instruments
5 * Author: Rob Clark <rob@ti.com>
6 *
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License version 2 as published by
9 * the Free Software Foundation.
10 *
11 * This program is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * more details.
15 *
16 * You should have received a copy of the GNU General Public License along with
17 * this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20#ifndef __OMAP_DRV_H__
21#define __OMAP_DRV_H__
22
23#include <video/omapdss.h>
24#include <linux/module.h>
25#include <linux/types.h>
26#include <drm/drmP.h>
27#include <drm/drm_crtc_helper.h>
28#include <drm/omap_drm.h>
29#include <linux/platform_data/omap_drm.h>
30
31
32#define DBG(fmt, ...) DRM_DEBUG(fmt"\n", ##__VA_ARGS__)
33#define VERB(fmt, ...) if (0) DRM_DEBUG(fmt, ##__VA_ARGS__) /* verbose debug */
34
35#define MODULE_NAME "omapdrm"
36
37/* max # of mapper-id's that can be assigned.. todo, come up with a better
38 * (but still inexpensive) way to store/access per-buffer mapper private
39 * data..
40 */
41#define MAX_MAPPERS 2
42
43/* parameters which describe (unrotated) coordinates of scanout within a fb: */
44struct omap_drm_window {
45 uint32_t rotation;
46 int32_t crtc_x, crtc_y; /* signed because can be offscreen */
47 uint32_t crtc_w, crtc_h;
48 uint32_t src_x, src_y;
49 uint32_t src_w, src_h;
50};
51
52/* Once GO bit is set, we can't make further updates to shadowed registers
53 * until the GO bit is cleared. So various parts in the kms code that need
54 * to update shadowed registers queue up a pair of callbacks, pre_apply
55 * which is called before setting GO bit, and post_apply that is called
56 * after GO bit is cleared. The crtc manages the queuing, and everyone
57 * else goes thru omap_crtc_apply() using these callbacks so that the
58 * code which has to deal w/ GO bit state is centralized.
59 */
60struct omap_drm_apply {
61 struct list_head pending_node, queued_node;
62 bool queued;
63 void (*pre_apply)(struct omap_drm_apply *apply);
64 void (*post_apply)(struct omap_drm_apply *apply);
65};
66
67/* For transiently registering for different DSS irqs that various parts
68 * of the KMS code need during setup/configuration. We these are not
69 * necessarily the same as what drm_vblank_get/put() are requesting, and
70 * the hysteresis in drm_vblank_put() is not necessarily desirable for
71 * internal housekeeping related irq usage.
72 */
73struct omap_drm_irq {
74 struct list_head node;
75 uint32_t irqmask;
76 bool registered;
77 void (*irq)(struct omap_drm_irq *irq, uint32_t irqstatus);
78};
79
80/* For KMS code that needs to wait for a certain # of IRQs:
81 */
82struct omap_irq_wait;
83struct omap_irq_wait * omap_irq_wait_init(struct drm_device *dev,
84 uint32_t irqmask, int count);
85int omap_irq_wait(struct drm_device *dev, struct omap_irq_wait *wait,
86 unsigned long timeout);
87
88struct omap_drm_private {
89 uint32_t omaprev;
90
91 unsigned int num_crtcs;
92 struct drm_crtc *crtcs[8];
93
94 unsigned int num_planes;
95 struct drm_plane *planes[8];
96
97 unsigned int num_encoders;
98 struct drm_encoder *encoders[8];
99
100 unsigned int num_connectors;
101 struct drm_connector *connectors[8];
102
103 struct drm_fb_helper *fbdev;
104
105 struct workqueue_struct *wq;
106
107 /* list of GEM objects: */
108 struct list_head obj_list;
109
110 bool has_dmm;
111
112 /* properties: */
113 struct drm_property *rotation_prop;
114 struct drm_property *zorder_prop;
115
116 /* irq handling: */
117 struct list_head irq_list; /* list of omap_drm_irq */
118 uint32_t vblank_mask; /* irq bits set for userspace vblank */
119 struct omap_drm_irq error_handler;
120};
121
122/* this should probably be in drm-core to standardize amongst drivers */
123#define DRM_ROTATE_0 0
124#define DRM_ROTATE_90 1
125#define DRM_ROTATE_180 2
126#define DRM_ROTATE_270 3
127#define DRM_REFLECT_X 4
128#define DRM_REFLECT_Y 5
129
130#ifdef CONFIG_DEBUG_FS
131int omap_debugfs_init(struct drm_minor *minor);
132void omap_debugfs_cleanup(struct drm_minor *minor);
133void omap_framebuffer_describe(struct drm_framebuffer *fb, struct seq_file *m);
134void omap_gem_describe(struct drm_gem_object *obj, struct seq_file *m);
135void omap_gem_describe_objects(struct list_head *list, struct seq_file *m);
136#endif
137
138#ifdef CONFIG_PM
139int omap_gem_resume(struct device *dev);
140#endif
141
142int omap_irq_enable_vblank(struct drm_device *dev, int crtc);
143void omap_irq_disable_vblank(struct drm_device *dev, int crtc);
144irqreturn_t omap_irq_handler(DRM_IRQ_ARGS);
145void omap_irq_preinstall(struct drm_device *dev);
146int omap_irq_postinstall(struct drm_device *dev);
147void omap_irq_uninstall(struct drm_device *dev);
148void omap_irq_register(struct drm_device *dev, struct omap_drm_irq *irq);
149void omap_irq_unregister(struct drm_device *dev, struct omap_drm_irq *irq);
150int omap_drm_irq_uninstall(struct drm_device *dev);
151int omap_drm_irq_install(struct drm_device *dev);
152
153struct drm_fb_helper *omap_fbdev_init(struct drm_device *dev);
154void omap_fbdev_free(struct drm_device *dev);
155
156const struct omap_video_timings *omap_crtc_timings(struct drm_crtc *crtc);
157enum omap_channel omap_crtc_channel(struct drm_crtc *crtc);
158int omap_crtc_apply(struct drm_crtc *crtc,
159 struct omap_drm_apply *apply);
160struct drm_crtc *omap_crtc_init(struct drm_device *dev,
161 struct drm_plane *plane, enum omap_channel channel, int id);
162
163struct drm_plane *omap_plane_init(struct drm_device *dev,
164 int plane_id, bool private_plane);
165int omap_plane_dpms(struct drm_plane *plane, int mode);
166int omap_plane_mode_set(struct drm_plane *plane,
167 struct drm_crtc *crtc, struct drm_framebuffer *fb,
168 int crtc_x, int crtc_y,
169 unsigned int crtc_w, unsigned int crtc_h,
170 uint32_t src_x, uint32_t src_y,
171 uint32_t src_w, uint32_t src_h,
172 void (*fxn)(void *), void *arg);
173void omap_plane_install_properties(struct drm_plane *plane,
174 struct drm_mode_object *obj);
175int omap_plane_set_property(struct drm_plane *plane,
176 struct drm_property *property, uint64_t val);
177
178struct drm_encoder *omap_encoder_init(struct drm_device *dev,
179 struct omap_dss_device *dssdev);
180int omap_encoder_set_enabled(struct drm_encoder *encoder, bool enabled);
181int omap_encoder_update(struct drm_encoder *encoder,
182 struct omap_overlay_manager *mgr,
183 struct omap_video_timings *timings);
184
185struct drm_connector *omap_connector_init(struct drm_device *dev,
186 int connector_type, struct omap_dss_device *dssdev,
187 struct drm_encoder *encoder);
188struct drm_encoder *omap_connector_attached_encoder(
189 struct drm_connector *connector);
190void omap_connector_flush(struct drm_connector *connector,
191 int x, int y, int w, int h);
192
193void copy_timings_omap_to_drm(struct drm_display_mode *mode,
194 struct omap_video_timings *timings);
195void copy_timings_drm_to_omap(struct omap_video_timings *timings,
196 struct drm_display_mode *mode);
197
198uint32_t omap_framebuffer_get_formats(uint32_t *pixel_formats,
199 uint32_t max_formats, enum omap_color_mode supported_modes);
200struct drm_framebuffer *omap_framebuffer_create(struct drm_device *dev,
201 struct drm_file *file, struct drm_mode_fb_cmd2 *mode_cmd);
202struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev,
203 struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos);
204struct drm_gem_object *omap_framebuffer_bo(struct drm_framebuffer *fb, int p);
205int omap_framebuffer_replace(struct drm_framebuffer *a,
206 struct drm_framebuffer *b, void *arg,
207 void (*unpin)(void *arg, struct drm_gem_object *bo));
208void omap_framebuffer_update_scanout(struct drm_framebuffer *fb,
209 struct omap_drm_window *win, struct omap_overlay_info *info);
210struct drm_connector *omap_framebuffer_get_next_connector(
211 struct drm_framebuffer *fb, struct drm_connector *from);
212void omap_framebuffer_flush(struct drm_framebuffer *fb,
213 int x, int y, int w, int h);
214
215void omap_gem_init(struct drm_device *dev);
216void omap_gem_deinit(struct drm_device *dev);
217
218struct drm_gem_object *omap_gem_new(struct drm_device *dev,
219 union omap_gem_size gsize, uint32_t flags);
220int omap_gem_new_handle(struct drm_device *dev, struct drm_file *file,
221 union omap_gem_size gsize, uint32_t flags, uint32_t *handle);
222void omap_gem_free_object(struct drm_gem_object *obj);
223int omap_gem_init_object(struct drm_gem_object *obj);
224void *omap_gem_vaddr(struct drm_gem_object *obj);
225int omap_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev,
226 uint32_t handle, uint64_t *offset);
227int omap_gem_dumb_destroy(struct drm_file *file, struct drm_device *dev,
228 uint32_t handle);
229int omap_gem_dumb_create(struct drm_file *file, struct drm_device *dev,
230 struct drm_mode_create_dumb *args);
231int omap_gem_mmap(struct file *filp, struct vm_area_struct *vma);
232int omap_gem_mmap_obj(struct drm_gem_object *obj,
233 struct vm_area_struct *vma);
234int omap_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf);
235int omap_gem_op_start(struct drm_gem_object *obj, enum omap_gem_op op);
236int omap_gem_op_finish(struct drm_gem_object *obj, enum omap_gem_op op);
237int omap_gem_op_sync(struct drm_gem_object *obj, enum omap_gem_op op);
238int omap_gem_op_async(struct drm_gem_object *obj, enum omap_gem_op op,
239 void (*fxn)(void *arg), void *arg);
240int omap_gem_roll(struct drm_gem_object *obj, uint32_t roll);
241void omap_gem_cpu_sync(struct drm_gem_object *obj, int pgoff);
242void omap_gem_dma_sync(struct drm_gem_object *obj,
243 enum dma_data_direction dir);
244int omap_gem_get_paddr(struct drm_gem_object *obj,
245 dma_addr_t *paddr, bool remap);
246int omap_gem_put_paddr(struct drm_gem_object *obj);
247int omap_gem_get_pages(struct drm_gem_object *obj, struct page ***pages,
248 bool remap);
249int omap_gem_put_pages(struct drm_gem_object *obj);
250uint32_t omap_gem_flags(struct drm_gem_object *obj);
251int omap_gem_rotated_paddr(struct drm_gem_object *obj, uint32_t orient,
252 int x, int y, dma_addr_t *paddr);
253uint64_t omap_gem_mmap_offset(struct drm_gem_object *obj);
254size_t omap_gem_mmap_size(struct drm_gem_object *obj);
255int omap_gem_tiled_size(struct drm_gem_object *obj, uint16_t *w, uint16_t *h);
256int omap_gem_tiled_stride(struct drm_gem_object *obj, uint32_t orient);
257
258struct dma_buf *omap_gem_prime_export(struct drm_device *dev,
259 struct drm_gem_object *obj, int flags);
260struct drm_gem_object *omap_gem_prime_import(struct drm_device *dev,
261 struct dma_buf *buffer);
262
263static inline int align_pitch(int pitch, int width, int bpp)
264{
265 int bytespp = (bpp + 7) / 8;
266 /* in case someone tries to feed us a completely bogus stride: */
267 pitch = max(pitch, width * bytespp);
268 /* PVR needs alignment to 8 pixels.. right now that is the most
269 * restrictive stride requirement..
270 */
271 return ALIGN(pitch, 8 * bytespp);
272}
273
274static inline enum omap_channel pipe2chan(int pipe)
275{
276 int num_mgrs = dss_feat_get_num_mgrs();
277
278 /*
279 * We usually don't want to create a CRTC for each manager,
280 * at least not until we have a way to expose private planes
281 * to userspace. Otherwise there would not be enough video
282 * pipes left for drm planes. The higher #'d managers tend
283 * to have more features so start in reverse order.
284 */
285 return num_mgrs - pipe - 1;
286}
287
288/* map crtc to vblank mask */
289static inline uint32_t pipe2vbl(int crtc)
290{
291 enum omap_channel channel = pipe2chan(crtc);
292 return dispc_mgr_get_vsync_irq(channel);
293}
294
295static inline int crtc2pipe(struct drm_device *dev, struct drm_crtc *crtc)
296{
297 struct omap_drm_private *priv = dev->dev_private;
298 int i;
299
300 for (i = 0; i < ARRAY_SIZE(priv->crtcs); i++)
301 if (priv->crtcs[i] == crtc)
302 return i;
303
304 BUG(); /* bogus CRTC ptr */
305 return -1;
306}
307
308/* should these be made into common util helpers?
309 */
310
311static inline int objects_lookup(struct drm_device *dev,
312 struct drm_file *filp, uint32_t pixel_format,
313 struct drm_gem_object **bos, uint32_t *handles)
314{
315 int i, n = drm_format_num_planes(pixel_format);
316
317 for (i = 0; i < n; i++) {
318 bos[i] = drm_gem_object_lookup(dev, filp, handles[i]);
319 if (!bos[i])
320 goto fail;
321
322 }
323
324 return 0;
325
326fail:
327 while (--i > 0)
328 drm_gem_object_unreference_unlocked(bos[i]);
329
330 return -ENOENT;
331}
332
333#endif /* __OMAP_DRV_H__ */