1cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark/* 2cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark * drivers/staging/omapdrm/omap_drv.h 3cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark * 4cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark * Copyright (C) 2011 Texas Instruments 5cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark * Author: Rob Clark <rob@ti.com> 6cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark * 7cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark * This program is free software; you can redistribute it and/or modify it 8cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark * under the terms of the GNU General Public License version 2 as published by 9cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark * the Free Software Foundation. 10cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark * 11cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark * This program is distributed in the hope that it will be useful, but WITHOUT 12cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 14cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark * more details. 15cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark * 16cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark * You should have received a copy of the GNU General Public License along with 17cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark * this program. If not, see <http://www.gnu.org/licenses/>. 18cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark */ 19cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark 20cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark#ifndef __OMAP_DRV_H__ 21cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark#define __OMAP_DRV_H__ 22cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark 23cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark#include <video/omapdss.h> 24cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark#include <linux/module.h> 25cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark#include <linux/types.h> 26cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark#include <drm/drmP.h> 27ae43d7ca4047b126adedcf7028c1ff99ed18703cRob Clark#include <drm/drm_crtc_helper.h> 28cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark#include "omap_drm.h" 29cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark#include "omap_priv.h" 30cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark 31cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark#define DBG(fmt, ...) DRM_DEBUG(fmt"\n", ##__VA_ARGS__) 32cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark#define VERB(fmt, ...) if (0) DRM_DEBUG(fmt, ##__VA_ARGS__) /* verbose debug */ 33cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark 34cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark#define MODULE_NAME "omapdrm" 35cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark 36cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark/* max # of mapper-id's that can be assigned.. todo, come up with a better 37cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark * (but still inexpensive) way to store/access per-buffer mapper private 38cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark * data.. 39cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark */ 40cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark#define MAX_MAPPERS 2 41cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark 42cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clarkstruct omap_drm_private { 43cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark unsigned int num_crtcs; 44cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark struct drm_crtc *crtcs[8]; 45f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark 46bb5c2d9aaaa26a55e684c175c431df95aa178233Rob Clark unsigned int num_planes; 47bb5c2d9aaaa26a55e684c175c431df95aa178233Rob Clark struct drm_plane *planes[8]; 48f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark 49cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark unsigned int num_encoders; 50cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark struct drm_encoder *encoders[8]; 51f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark 52cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark unsigned int num_connectors; 53cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark struct drm_connector *connectors[8]; 54cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark 55cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark struct drm_fb_helper *fbdev; 56a6a918274116d8edc25eb20f6097dedf97b108e2Rob Clark 575609f7fe306508d77e0dcf1de2c9a957b6af1e06Rob Clark struct workqueue_struct *wq; 585609f7fe306508d77e0dcf1de2c9a957b6af1e06Rob Clark 59f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark struct list_head obj_list; 60f6b6036e56ca17378dd0294b684db623abd6a901Rob Clark 61a6a918274116d8edc25eb20f6097dedf97b108e2Rob Clark bool has_dmm; 62cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark}; 63cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark 646169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross#ifdef CONFIG_DEBUG_FS 656169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Grossint omap_debugfs_init(struct drm_minor *minor); 666169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Grossvoid omap_debugfs_cleanup(struct drm_minor *minor); 67f6b6036e56ca17378dd0294b684db623abd6a901Rob Clarkvoid omap_framebuffer_describe(struct drm_framebuffer *fb, struct seq_file *m); 68f6b6036e56ca17378dd0294b684db623abd6a901Rob Clarkvoid omap_gem_describe(struct drm_gem_object *obj, struct seq_file *m); 69f6b6036e56ca17378dd0294b684db623abd6a901Rob Clarkvoid omap_gem_describe_objects(struct list_head *list, struct seq_file *m); 706169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross#endif 716169a1488fe2f76e80bd49c18e41be5bbbf29f3fAndy Gross 72cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clarkstruct drm_fb_helper *omap_fbdev_init(struct drm_device *dev); 73cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clarkvoid omap_fbdev_free(struct drm_device *dev); 74cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark 75cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clarkstruct drm_crtc *omap_crtc_init(struct drm_device *dev, 76cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark struct omap_overlay *ovl, int id); 77bb5c2d9aaaa26a55e684c175c431df95aa178233Rob Clark 78bb5c2d9aaaa26a55e684c175c431df95aa178233Rob Clarkstruct drm_plane *omap_plane_init(struct drm_device *dev, 79bb5c2d9aaaa26a55e684c175c431df95aa178233Rob Clark struct omap_overlay *ovl, unsigned int possible_crtcs, 80bb5c2d9aaaa26a55e684c175c431df95aa178233Rob Clark bool priv); 81bb5c2d9aaaa26a55e684c175c431df95aa178233Rob Clarkint omap_plane_dpms(struct drm_plane *plane, int mode); 822f53700df17bf52332056c1e85b23bcf64c77e57Rob Clarkint omap_plane_mode_set(struct drm_plane *plane, 832f53700df17bf52332056c1e85b23bcf64c77e57Rob Clark struct drm_crtc *crtc, struct drm_framebuffer *fb, 842f53700df17bf52332056c1e85b23bcf64c77e57Rob Clark int crtc_x, int crtc_y, 852f53700df17bf52332056c1e85b23bcf64c77e57Rob Clark unsigned int crtc_w, unsigned int crtc_h, 862f53700df17bf52332056c1e85b23bcf64c77e57Rob Clark uint32_t src_x, uint32_t src_y, 872f53700df17bf52332056c1e85b23bcf64c77e57Rob Clark uint32_t src_w, uint32_t src_h); 8872d0c3363e88d1816b0fef3687ff58e6553a7889Rob Clarkvoid omap_plane_on_endwin(struct drm_plane *plane, 8972d0c3363e88d1816b0fef3687ff58e6553a7889Rob Clark void (*fxn)(void *), void *arg); 90cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark 91cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clarkstruct drm_encoder *omap_encoder_init(struct drm_device *dev, 92cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark struct omap_overlay_manager *mgr); 93cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clarkstruct omap_overlay_manager *omap_encoder_get_manager( 94cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark struct drm_encoder *encoder); 95cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clarkstruct drm_encoder *omap_connector_attached_encoder( 96cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark struct drm_connector *connector); 97cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clarkenum drm_connector_status omap_connector_detect( 98cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark struct drm_connector *connector, bool force); 99cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark 100cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clarkstruct drm_connector *omap_connector_init(struct drm_device *dev, 101cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark int connector_type, struct omap_dss_device *dssdev); 102cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clarkvoid omap_connector_mode_set(struct drm_connector *connector, 103cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark struct drm_display_mode *mode); 104cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clarkvoid omap_connector_flush(struct drm_connector *connector, 105cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark int x, int y, int w, int h); 106cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark 107a890e6623ae024d28f855d672e72649fa2cb511eRob Clarkuint32_t omap_framebuffer_get_formats(uint32_t *pixel_formats, 108a890e6623ae024d28f855d672e72649fa2cb511eRob Clark uint32_t max_formats, enum omap_color_mode supported_modes); 109cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clarkstruct drm_framebuffer *omap_framebuffer_create(struct drm_device *dev, 110ae43d7ca4047b126adedcf7028c1ff99ed18703cRob Clark struct drm_file *file, struct drm_mode_fb_cmd2 *mode_cmd); 111cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clarkstruct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev, 112ae43d7ca4047b126adedcf7028c1ff99ed18703cRob Clark struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos); 1139a0774e0991c82a95ef5e5848b318bd15aba0dcdRob Clarkstruct drm_gem_object *omap_framebuffer_bo(struct drm_framebuffer *fb, int p); 114b33f34d3d10b9b00ca568740e7099da107d525b9Rob Clarkint omap_framebuffer_replace(struct drm_framebuffer *a, 115b33f34d3d10b9b00ca568740e7099da107d525b9Rob Clark struct drm_framebuffer *b, void *arg, 116b33f34d3d10b9b00ca568740e7099da107d525b9Rob Clark void (*unpin)(void *arg, struct drm_gem_object *bo)); 1179a0774e0991c82a95ef5e5848b318bd15aba0dcdRob Clarkvoid omap_framebuffer_update_scanout(struct drm_framebuffer *fb, int x, int y, 1189a0774e0991c82a95ef5e5848b318bd15aba0dcdRob Clark struct omap_overlay_info *info); 119cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clarkstruct drm_connector *omap_framebuffer_get_next_connector( 120cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark struct drm_framebuffer *fb, struct drm_connector *from); 121cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clarkvoid omap_framebuffer_flush(struct drm_framebuffer *fb, 122cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark int x, int y, int w, int h); 123cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark 124f7f9f4536a09f9f73c800663df2e600c9405e1efRob Clarkvoid omap_gem_init(struct drm_device *dev); 125f7f9f4536a09f9f73c800663df2e600c9405e1efRob Clarkvoid omap_gem_deinit(struct drm_device *dev); 126cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark 127cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clarkstruct drm_gem_object *omap_gem_new(struct drm_device *dev, 128cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark union omap_gem_size gsize, uint32_t flags); 129cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clarkint omap_gem_new_handle(struct drm_device *dev, struct drm_file *file, 130cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark union omap_gem_size gsize, uint32_t flags, uint32_t *handle); 131cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clarkvoid omap_gem_free_object(struct drm_gem_object *obj); 132cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clarkint omap_gem_init_object(struct drm_gem_object *obj); 133cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clarkvoid *omap_gem_vaddr(struct drm_gem_object *obj); 134cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clarkint omap_gem_dumb_map_offset(struct drm_file *file, struct drm_device *dev, 135cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark uint32_t handle, uint64_t *offset); 136cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clarkint omap_gem_dumb_destroy(struct drm_file *file, struct drm_device *dev, 137cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark uint32_t handle); 138cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clarkint omap_gem_dumb_create(struct drm_file *file, struct drm_device *dev, 139cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark struct drm_mode_create_dumb *args); 140cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clarkint omap_gem_mmap(struct file *filp, struct vm_area_struct *vma); 141cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clarkint omap_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf); 142cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clarkint omap_gem_op_start(struct drm_gem_object *obj, enum omap_gem_op op); 143cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clarkint omap_gem_op_finish(struct drm_gem_object *obj, enum omap_gem_op op); 144cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clarkint omap_gem_op_sync(struct drm_gem_object *obj, enum omap_gem_op op); 145cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clarkint omap_gem_op_async(struct drm_gem_object *obj, enum omap_gem_op op, 146cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark void (*fxn)(void *arg), void *arg); 147a6a918274116d8edc25eb20f6097dedf97b108e2Rob Clarkint omap_gem_roll(struct drm_gem_object *obj, uint32_t roll); 148cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clarkint omap_gem_get_paddr(struct drm_gem_object *obj, 149cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark dma_addr_t *paddr, bool remap); 150cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clarkint omap_gem_put_paddr(struct drm_gem_object *obj); 151cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clarkuint64_t omap_gem_mmap_offset(struct drm_gem_object *obj); 152f7f9f4536a09f9f73c800663df2e600c9405e1efRob Clarksize_t omap_gem_mmap_size(struct drm_gem_object *obj); 153cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark 154cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clarkstatic inline int align_pitch(int pitch, int width, int bpp) 155cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark{ 156cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark int bytespp = (bpp + 7) / 8; 157cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark /* in case someone tries to feed us a completely bogus stride: */ 158cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark pitch = max(pitch, width * bytespp); 159cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark /* PVR needs alignment to 8 pixels.. right now that is the most 160cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark * restrictive stride requirement.. 161cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark */ 162cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark return ALIGN(pitch, 8 * bytespp); 163cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark} 164cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark 165ae43d7ca4047b126adedcf7028c1ff99ed18703cRob Clark/* should these be made into common util helpers? 166ae43d7ca4047b126adedcf7028c1ff99ed18703cRob Clark */ 167ae43d7ca4047b126adedcf7028c1ff99ed18703cRob Clark 168ae43d7ca4047b126adedcf7028c1ff99ed18703cRob Clarkstatic inline int objects_lookup(struct drm_device *dev, 169ae43d7ca4047b126adedcf7028c1ff99ed18703cRob Clark struct drm_file *filp, uint32_t pixel_format, 170ae43d7ca4047b126adedcf7028c1ff99ed18703cRob Clark struct drm_gem_object **bos, uint32_t *handles) 171ae43d7ca4047b126adedcf7028c1ff99ed18703cRob Clark{ 172ae43d7ca4047b126adedcf7028c1ff99ed18703cRob Clark int i, n = drm_format_num_planes(pixel_format); 173ae43d7ca4047b126adedcf7028c1ff99ed18703cRob Clark 174ae43d7ca4047b126adedcf7028c1ff99ed18703cRob Clark for (i = 0; i < n; i++) { 175ae43d7ca4047b126adedcf7028c1ff99ed18703cRob Clark bos[i] = drm_gem_object_lookup(dev, filp, handles[i]); 176ae43d7ca4047b126adedcf7028c1ff99ed18703cRob Clark if (!bos[i]) { 177ae43d7ca4047b126adedcf7028c1ff99ed18703cRob Clark goto fail; 178ae43d7ca4047b126adedcf7028c1ff99ed18703cRob Clark } 179ae43d7ca4047b126adedcf7028c1ff99ed18703cRob Clark } 180ae43d7ca4047b126adedcf7028c1ff99ed18703cRob Clark 181ae43d7ca4047b126adedcf7028c1ff99ed18703cRob Clark return 0; 182ae43d7ca4047b126adedcf7028c1ff99ed18703cRob Clark 183ae43d7ca4047b126adedcf7028c1ff99ed18703cRob Clarkfail: 184ae43d7ca4047b126adedcf7028c1ff99ed18703cRob Clark while (--i > 0) { 185ae43d7ca4047b126adedcf7028c1ff99ed18703cRob Clark drm_gem_object_unreference_unlocked(bos[i]); 186ae43d7ca4047b126adedcf7028c1ff99ed18703cRob Clark } 187ae43d7ca4047b126adedcf7028c1ff99ed18703cRob Clark return -ENOENT; 188ae43d7ca4047b126adedcf7028c1ff99ed18703cRob Clark} 189ae43d7ca4047b126adedcf7028c1ff99ed18703cRob Clark 190cd5351f4d2b1b884d8c21a7636d5c0ea3b69d123Rob Clark#endif /* __OMAP_DRV_H__ */ 191