1*a8f8b1d9SDaniel Vetter /* 2*a8f8b1d9SDaniel Vetter * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas. 3*a8f8b1d9SDaniel Vetter * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California. 4*a8f8b1d9SDaniel Vetter * Copyright (c) 2009-2010, Code Aurora Forum. 5*a8f8b1d9SDaniel Vetter * All rights reserved. 6*a8f8b1d9SDaniel Vetter * 7*a8f8b1d9SDaniel Vetter * Author: Rickard E. (Rik) Faith <faith@valinux.com> 8*a8f8b1d9SDaniel Vetter * Author: Gareth Hughes <gareth@valinux.com> 9*a8f8b1d9SDaniel Vetter * 10*a8f8b1d9SDaniel Vetter * Permission is hereby granted, free of charge, to any person obtaining a 11*a8f8b1d9SDaniel Vetter * copy of this software and associated documentation files (the "Software"), 12*a8f8b1d9SDaniel Vetter * to deal in the Software without restriction, including without limitation 13*a8f8b1d9SDaniel Vetter * the rights to use, copy, modify, merge, publish, distribute, sublicense, 14*a8f8b1d9SDaniel Vetter * and/or sell copies of the Software, and to permit persons to whom the 15*a8f8b1d9SDaniel Vetter * Software is furnished to do so, subject to the following conditions: 16*a8f8b1d9SDaniel Vetter * 17*a8f8b1d9SDaniel Vetter * The above copyright notice and this permission notice (including the next 18*a8f8b1d9SDaniel Vetter * paragraph) shall be included in all copies or substantial portions of the 19*a8f8b1d9SDaniel Vetter * Software. 20*a8f8b1d9SDaniel Vetter * 21*a8f8b1d9SDaniel Vetter * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 22*a8f8b1d9SDaniel Vetter * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 23*a8f8b1d9SDaniel Vetter * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 24*a8f8b1d9SDaniel Vetter * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 25*a8f8b1d9SDaniel Vetter * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 26*a8f8b1d9SDaniel Vetter * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 27*a8f8b1d9SDaniel Vetter * OTHER DEALINGS IN THE SOFTWARE. 28*a8f8b1d9SDaniel Vetter */ 29*a8f8b1d9SDaniel Vetter 30*a8f8b1d9SDaniel Vetter #ifndef _DRM_FILE_H_ 31*a8f8b1d9SDaniel Vetter #define _DRM_FILE_H_ 32*a8f8b1d9SDaniel Vetter 33*a8f8b1d9SDaniel Vetter #include <linux/types.h> 34*a8f8b1d9SDaniel Vetter #include <linux/completion.h> 35*a8f8b1d9SDaniel Vetter 36*a8f8b1d9SDaniel Vetter #include <uapi/drm/drm.h> 37*a8f8b1d9SDaniel Vetter 38*a8f8b1d9SDaniel Vetter #include <drm/drm_prime.h> 39*a8f8b1d9SDaniel Vetter 40*a8f8b1d9SDaniel Vetter struct dma_fence; 41*a8f8b1d9SDaniel Vetter struct drm_file; 42*a8f8b1d9SDaniel Vetter struct drm_device; 43*a8f8b1d9SDaniel Vetter 44*a8f8b1d9SDaniel Vetter /* 45*a8f8b1d9SDaniel Vetter * FIXME: Not sure we want to have drm_minor here in the end, but to avoid 46*a8f8b1d9SDaniel Vetter * header include loops we need it here for now. 47*a8f8b1d9SDaniel Vetter */ 48*a8f8b1d9SDaniel Vetter enum drm_minor_type { 49*a8f8b1d9SDaniel Vetter DRM_MINOR_PRIMARY, 50*a8f8b1d9SDaniel Vetter DRM_MINOR_CONTROL, 51*a8f8b1d9SDaniel Vetter DRM_MINOR_RENDER, 52*a8f8b1d9SDaniel Vetter }; 53*a8f8b1d9SDaniel Vetter 54*a8f8b1d9SDaniel Vetter /** 55*a8f8b1d9SDaniel Vetter * DRM minor structure. This structure represents a drm minor number. 56*a8f8b1d9SDaniel Vetter */ 57*a8f8b1d9SDaniel Vetter struct drm_minor { 58*a8f8b1d9SDaniel Vetter int index; /**< Minor device number */ 59*a8f8b1d9SDaniel Vetter int type; /**< Control or render */ 60*a8f8b1d9SDaniel Vetter struct device *kdev; /**< Linux device */ 61*a8f8b1d9SDaniel Vetter struct drm_device *dev; 62*a8f8b1d9SDaniel Vetter 63*a8f8b1d9SDaniel Vetter struct dentry *debugfs_root; 64*a8f8b1d9SDaniel Vetter 65*a8f8b1d9SDaniel Vetter struct list_head debugfs_list; 66*a8f8b1d9SDaniel Vetter struct mutex debugfs_lock; /* Protects debugfs_list. */ 67*a8f8b1d9SDaniel Vetter }; 68*a8f8b1d9SDaniel Vetter 69*a8f8b1d9SDaniel Vetter /* Event queued up for userspace to read */ 70*a8f8b1d9SDaniel Vetter struct drm_pending_event { 71*a8f8b1d9SDaniel Vetter struct completion *completion; 72*a8f8b1d9SDaniel Vetter void (*completion_release)(struct completion *completion); 73*a8f8b1d9SDaniel Vetter struct drm_event *event; 74*a8f8b1d9SDaniel Vetter struct dma_fence *fence; 75*a8f8b1d9SDaniel Vetter struct list_head link; 76*a8f8b1d9SDaniel Vetter struct list_head pending_link; 77*a8f8b1d9SDaniel Vetter struct drm_file *file_priv; 78*a8f8b1d9SDaniel Vetter pid_t pid; /* pid of requester, no guarantee it's valid by the time 79*a8f8b1d9SDaniel Vetter we deliver the event, for tracing only */ 80*a8f8b1d9SDaniel Vetter }; 81*a8f8b1d9SDaniel Vetter 82*a8f8b1d9SDaniel Vetter /** File private data */ 83*a8f8b1d9SDaniel Vetter struct drm_file { 84*a8f8b1d9SDaniel Vetter unsigned authenticated :1; 85*a8f8b1d9SDaniel Vetter /* true when the client has asked us to expose stereo 3D mode flags */ 86*a8f8b1d9SDaniel Vetter unsigned stereo_allowed :1; 87*a8f8b1d9SDaniel Vetter /* 88*a8f8b1d9SDaniel Vetter * true if client understands CRTC primary planes and cursor planes 89*a8f8b1d9SDaniel Vetter * in the plane list 90*a8f8b1d9SDaniel Vetter */ 91*a8f8b1d9SDaniel Vetter unsigned universal_planes:1; 92*a8f8b1d9SDaniel Vetter /* true if client understands atomic properties */ 93*a8f8b1d9SDaniel Vetter unsigned atomic:1; 94*a8f8b1d9SDaniel Vetter /* 95*a8f8b1d9SDaniel Vetter * This client is the creator of @master. 96*a8f8b1d9SDaniel Vetter * Protected by struct drm_device::master_mutex. 97*a8f8b1d9SDaniel Vetter */ 98*a8f8b1d9SDaniel Vetter unsigned is_master:1; 99*a8f8b1d9SDaniel Vetter 100*a8f8b1d9SDaniel Vetter struct pid *pid; 101*a8f8b1d9SDaniel Vetter drm_magic_t magic; 102*a8f8b1d9SDaniel Vetter struct list_head lhead; 103*a8f8b1d9SDaniel Vetter struct drm_minor *minor; 104*a8f8b1d9SDaniel Vetter unsigned long lock_count; 105*a8f8b1d9SDaniel Vetter 106*a8f8b1d9SDaniel Vetter /** Mapping of mm object handles to object pointers. */ 107*a8f8b1d9SDaniel Vetter struct idr object_idr; 108*a8f8b1d9SDaniel Vetter /** Lock for synchronization of access to object_idr. */ 109*a8f8b1d9SDaniel Vetter spinlock_t table_lock; 110*a8f8b1d9SDaniel Vetter 111*a8f8b1d9SDaniel Vetter struct file *filp; 112*a8f8b1d9SDaniel Vetter void *driver_priv; 113*a8f8b1d9SDaniel Vetter 114*a8f8b1d9SDaniel Vetter struct drm_master *master; /* master this node is currently associated with 115*a8f8b1d9SDaniel Vetter N.B. not always dev->master */ 116*a8f8b1d9SDaniel Vetter /** 117*a8f8b1d9SDaniel Vetter * fbs - List of framebuffers associated with this file. 118*a8f8b1d9SDaniel Vetter * 119*a8f8b1d9SDaniel Vetter * Protected by fbs_lock. Note that the fbs list holds a reference on 120*a8f8b1d9SDaniel Vetter * the fb object to prevent it from untimely disappearing. 121*a8f8b1d9SDaniel Vetter */ 122*a8f8b1d9SDaniel Vetter struct list_head fbs; 123*a8f8b1d9SDaniel Vetter struct mutex fbs_lock; 124*a8f8b1d9SDaniel Vetter 125*a8f8b1d9SDaniel Vetter /** User-created blob properties; this retains a reference on the 126*a8f8b1d9SDaniel Vetter * property. */ 127*a8f8b1d9SDaniel Vetter struct list_head blobs; 128*a8f8b1d9SDaniel Vetter 129*a8f8b1d9SDaniel Vetter wait_queue_head_t event_wait; 130*a8f8b1d9SDaniel Vetter struct list_head pending_event_list; 131*a8f8b1d9SDaniel Vetter struct list_head event_list; 132*a8f8b1d9SDaniel Vetter int event_space; 133*a8f8b1d9SDaniel Vetter 134*a8f8b1d9SDaniel Vetter struct mutex event_read_lock; 135*a8f8b1d9SDaniel Vetter 136*a8f8b1d9SDaniel Vetter struct drm_prime_file_private prime; 137*a8f8b1d9SDaniel Vetter }; 138*a8f8b1d9SDaniel Vetter 139*a8f8b1d9SDaniel Vetter static inline bool drm_is_render_client(const struct drm_file *file_priv) 140*a8f8b1d9SDaniel Vetter { 141*a8f8b1d9SDaniel Vetter return file_priv->minor->type == DRM_MINOR_RENDER; 142*a8f8b1d9SDaniel Vetter } 143*a8f8b1d9SDaniel Vetter 144*a8f8b1d9SDaniel Vetter static inline bool drm_is_control_client(const struct drm_file *file_priv) 145*a8f8b1d9SDaniel Vetter { 146*a8f8b1d9SDaniel Vetter return file_priv->minor->type == DRM_MINOR_CONTROL; 147*a8f8b1d9SDaniel Vetter } 148*a8f8b1d9SDaniel Vetter 149*a8f8b1d9SDaniel Vetter static inline bool drm_is_primary_client(const struct drm_file *file_priv) 150*a8f8b1d9SDaniel Vetter { 151*a8f8b1d9SDaniel Vetter return file_priv->minor->type == DRM_MINOR_PRIMARY; 152*a8f8b1d9SDaniel Vetter } 153*a8f8b1d9SDaniel Vetter 154*a8f8b1d9SDaniel Vetter int drm_open(struct inode *inode, struct file *filp); 155*a8f8b1d9SDaniel Vetter ssize_t drm_read(struct file *filp, char __user *buffer, 156*a8f8b1d9SDaniel Vetter size_t count, loff_t *offset); 157*a8f8b1d9SDaniel Vetter int drm_release(struct inode *inode, struct file *filp); 158*a8f8b1d9SDaniel Vetter unsigned int drm_poll(struct file *filp, struct poll_table_struct *wait); 159*a8f8b1d9SDaniel Vetter int drm_event_reserve_init_locked(struct drm_device *dev, 160*a8f8b1d9SDaniel Vetter struct drm_file *file_priv, 161*a8f8b1d9SDaniel Vetter struct drm_pending_event *p, 162*a8f8b1d9SDaniel Vetter struct drm_event *e); 163*a8f8b1d9SDaniel Vetter int drm_event_reserve_init(struct drm_device *dev, 164*a8f8b1d9SDaniel Vetter struct drm_file *file_priv, 165*a8f8b1d9SDaniel Vetter struct drm_pending_event *p, 166*a8f8b1d9SDaniel Vetter struct drm_event *e); 167*a8f8b1d9SDaniel Vetter void drm_event_cancel_free(struct drm_device *dev, 168*a8f8b1d9SDaniel Vetter struct drm_pending_event *p); 169*a8f8b1d9SDaniel Vetter void drm_send_event_locked(struct drm_device *dev, struct drm_pending_event *e); 170*a8f8b1d9SDaniel Vetter void drm_send_event(struct drm_device *dev, struct drm_pending_event *e); 171*a8f8b1d9SDaniel Vetter 172*a8f8b1d9SDaniel Vetter #endif /* _DRM_FILE_H_ */ 173