linux/include/drm/drm_file.h
<<
>>
Prefs
   1/*
   2 * Copyright 1999 Precision Insight, Inc., Cedar Park, Texas.
   3 * Copyright 2000 VA Linux Systems, Inc., Sunnyvale, California.
   4 * Copyright (c) 2009-2010, Code Aurora Forum.
   5 * All rights reserved.
   6 *
   7 * Author: Rickard E. (Rik) Faith <faith@valinux.com>
   8 * Author: Gareth Hughes <gareth@valinux.com>
   9 *
  10 * Permission is hereby granted, free of charge, to any person obtaining a
  11 * copy of this software and associated documentation files (the "Software"),
  12 * to deal in the Software without restriction, including without limitation
  13 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  14 * and/or sell copies of the Software, and to permit persons to whom the
  15 * Software is furnished to do so, subject to the following conditions:
  16 *
  17 * The above copyright notice and this permission notice (including the next
  18 * paragraph) shall be included in all copies or substantial portions of the
  19 * Software.
  20 *
  21 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  22 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  23 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  24 * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  25 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  26 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  27 * OTHER DEALINGS IN THE SOFTWARE.
  28 */
  29
  30#ifndef _DRM_FILE_H_
  31#define _DRM_FILE_H_
  32
  33#include <linux/types.h>
  34#include <linux/completion.h>
  35
  36#include <uapi/drm/drm.h>
  37
  38#include <drm/drm_prime.h>
  39
  40struct dma_fence;
  41struct drm_file;
  42struct drm_device;
  43struct device;
  44
  45/*
  46 * FIXME: Not sure we want to have drm_minor here in the end, but to avoid
  47 * header include loops we need it here for now.
  48 */
  49
  50enum drm_minor_type {
  51        DRM_MINOR_PRIMARY,
  52        DRM_MINOR_CONTROL,
  53        DRM_MINOR_RENDER,
  54};
  55
  56/**
  57 * struct drm_minor - DRM device minor structure
  58 *
  59 * This structure represents a DRM minor number for device nodes in /dev.
  60 * Entirely opaque to drivers and should never be inspected directly by drivers.
  61 * Drivers instead should only interact with &struct drm_file and of course
  62 * &struct drm_device, which is also where driver-private data and resources can
  63 * be attached to.
  64 */
  65struct drm_minor {
  66        /* private: */
  67        int index;                      /* Minor device number */
  68        int type;                       /* Control or render */
  69        struct device *kdev;            /* Linux device */
  70        struct drm_device *dev;
  71
  72        struct dentry *debugfs_root;
  73
  74        struct list_head debugfs_list;
  75        struct mutex debugfs_lock; /* Protects debugfs_list. */
  76};
  77
  78/**
  79 * struct drm_pending_event - Event queued up for userspace to read
  80 *
  81 * This represents a DRM event. Drivers can use this as a generic completion
  82 * mechanism, which supports kernel-internal &struct completion, &struct dma_fence
  83 * and also the DRM-specific &struct drm_event delivery mechanism.
  84 */
  85struct drm_pending_event {
  86        /**
  87         * @completion:
  88         *
  89         * Optional pointer to a kernel internal completion signalled when
  90         * drm_send_event() is called, useful to internally synchronize with
  91         * nonblocking operations.
  92         */
  93        struct completion *completion;
  94
  95        /**
  96         * @completion_release:
  97         *
  98         * Optional callback currently only used by the atomic modeset helpers
  99         * to clean up the reference count for the structure @completion is
 100         * stored in.
 101         */
 102        void (*completion_release)(struct completion *completion);
 103
 104        /**
 105         * @event:
 106         *
 107         * Pointer to the actual event that should be sent to userspace to be
 108         * read using drm_read(). Can be optional, since nowadays events are
 109         * also used to signal kernel internal threads with @completion or DMA
 110         * transactions using @fence.
 111         */
 112        struct drm_event *event;
 113
 114        /**
 115         * @fence:
 116         *
 117         * Optional DMA fence to unblock other hardware transactions which
 118         * depend upon the nonblocking DRM operation this event represents.
 119         */
 120        struct dma_fence *fence;
 121
 122        /**
 123         * @file_priv:
 124         *
 125         * &struct drm_file where @event should be delivered to. Only set when
 126         * @event is set.
 127         */
 128        struct drm_file *file_priv;
 129
 130        /**
 131         * @link:
 132         *
 133         * Double-linked list to keep track of this event. Can be used by the
 134         * driver up to the point when it calls drm_send_event(), after that
 135         * this list entry is owned by the core for its own book-keeping.
 136         */
 137        struct list_head link;
 138
 139        /**
 140         * @pending_link:
 141         *
 142         * Entry on &drm_file.pending_event_list, to keep track of all pending
 143         * events for @file_priv, to allow correct unwinding of them when
 144         * userspace closes the file before the event is delivered.
 145         */
 146        struct list_head pending_link;
 147};
 148
 149/**
 150 * struct drm_file - DRM file private data
 151 *
 152 * This structure tracks DRM state per open file descriptor.
 153 */
 154struct drm_file {
 155        /**
 156         * @authenticated:
 157         *
 158         * Whether the client is allowed to submit rendering, which for legacy
 159         * nodes means it must be authenticated.
 160         *
 161         * See also the :ref:`section on primary nodes and authentication
 162         * <drm_primary_node>`.
 163         */
 164        unsigned authenticated :1;
 165
 166        /**
 167         * @stereo_allowed:
 168         *
 169         * True when the client has asked us to expose stereo 3D mode flags.
 170         */
 171        unsigned stereo_allowed :1;
 172
 173        /**
 174         * @universal_planes:
 175         *
 176         * True if client understands CRTC primary planes and cursor planes
 177         * in the plane list. Automatically set when @atomic is set.
 178         */
 179        unsigned universal_planes:1;
 180
 181        /** @atomic: True if client understands atomic properties. */
 182        unsigned atomic:1;
 183
 184        /**
 185         * @is_master:
 186         *
 187         * This client is the creator of @master. Protected by struct
 188         * &drm_device.master_mutex.
 189         *
 190         * See also the :ref:`section on primary nodes and authentication
 191         * <drm_primary_node>`.
 192         */
 193        unsigned is_master:1;
 194
 195        /**
 196         * @master:
 197         *
 198         * Master this node is currently associated with. Only relevant if
 199         * drm_is_primary_client() returns true. Note that this only
 200         * matches &drm_device.master if the master is the currently active one.
 201         *
 202         * See also @authentication and @is_master and the :ref:`section on
 203         * primary nodes and authentication <drm_primary_node>`.
 204         */
 205        struct drm_master *master;
 206
 207        /** @pid: Process that opened this file. */
 208        struct pid *pid;
 209
 210        /** @magic: Authentication magic, see @authenticated. */
 211        drm_magic_t magic;
 212
 213        /**
 214         * @lhead:
 215         *
 216         * List of all open files of a DRM device, linked into
 217         * &drm_device.filelist. Protected by &drm_device.filelist_mutex.
 218         */
 219        struct list_head lhead;
 220
 221        /** @minor: &struct drm_minor for this file. */
 222        struct drm_minor *minor;
 223
 224        /**
 225         * @object_idr:
 226         *
 227         * Mapping of mm object handles to object pointers. Used by the GEM
 228         * subsystem. Protected by @table_lock.
 229         */
 230        struct idr object_idr;
 231
 232        /** @table_lock: Protects @object_idr. */
 233        spinlock_t table_lock;
 234
 235        /** @syncobj_idr: Mapping of sync object handles to object pointers. */
 236        struct idr syncobj_idr;
 237        /** @syncobj_table_lock: Protects @syncobj_idr. */
 238        spinlock_t syncobj_table_lock;
 239
 240        /** @filp: Pointer to the core file structure. */
 241        struct file *filp;
 242
 243        /**
 244         * @driver_priv:
 245         *
 246         * Optional pointer for driver private data. Can be allocated in
 247         * &drm_driver.open and should be freed in &drm_driver.postclose.
 248         */
 249        void *driver_priv;
 250
 251        /**
 252         * @fbs:
 253         *
 254         * List of &struct drm_framebuffer associated with this file, using the
 255         * &drm_framebuffer.filp_head entry.
 256         *
 257         * Protected by @fbs_lock. Note that the @fbs list holds a reference on
 258         * the framebuffer object to prevent it from untimely disappearing.
 259         */
 260        struct list_head fbs;
 261
 262        /** @fbs_lock: Protects @fbs. */
 263        struct mutex fbs_lock;
 264
 265        /**
 266         * @blobs:
 267         *
 268         * User-created blob properties; this retains a reference on the
 269         * property.
 270         *
 271         * Protected by @drm_mode_config.blob_lock;
 272         */
 273        struct list_head blobs;
 274
 275        /** @event_wait: Waitqueue for new events added to @event_list. */
 276        wait_queue_head_t event_wait;
 277
 278        /**
 279         * @pending_event_list:
 280         *
 281         * List of pending &struct drm_pending_event, used to clean up pending
 282         * events in case this file gets closed before the event is signalled.
 283         * Uses the &drm_pending_event.pending_link entry.
 284         *
 285         * Protect by &drm_device.event_lock.
 286         */
 287        struct list_head pending_event_list;
 288
 289        /**
 290         * @event_list:
 291         *
 292         * List of &struct drm_pending_event, ready for delivery to userspace
 293         * through drm_read(). Uses the &drm_pending_event.link entry.
 294         *
 295         * Protect by &drm_device.event_lock.
 296         */
 297        struct list_head event_list;
 298
 299        /**
 300         * @event_space:
 301         *
 302         * Available event space to prevent userspace from
 303         * exhausting kernel memory. Currently limited to the fairly arbitrary
 304         * value of 4KB.
 305         */
 306        int event_space;
 307
 308        /** @event_read_lock: Serializes drm_read(). */
 309        struct mutex event_read_lock;
 310
 311        /**
 312         * @prime:
 313         *
 314         * Per-file buffer caches used by the PRIME buffer sharing code.
 315         */
 316        struct drm_prime_file_private prime;
 317
 318        /* private: */
 319        unsigned long lock_count; /* DRI1 legacy lock count */
 320};
 321
 322/**
 323 * drm_is_primary_client - is this an open file of the primary node
 324 * @file_priv: DRM file
 325 *
 326 * Returns true if this is an open file of the primary node, i.e.
 327 * &drm_file.minor of @file_priv is a primary minor.
 328 *
 329 * See also the :ref:`section on primary nodes and authentication
 330 * <drm_primary_node>`.
 331 */
 332static inline bool drm_is_primary_client(const struct drm_file *file_priv)
 333{
 334        return file_priv->minor->type == DRM_MINOR_PRIMARY;
 335}
 336
 337/**
 338 * drm_is_render_client - is this an open file of the render node
 339 * @file_priv: DRM file
 340 *
 341 * Returns true if this is an open file of the render node, i.e.
 342 * &drm_file.minor of @file_priv is a render minor.
 343 *
 344 * See also the :ref:`section on render nodes <drm_render_node>`.
 345 */
 346static inline bool drm_is_render_client(const struct drm_file *file_priv)
 347{
 348        return file_priv->minor->type == DRM_MINOR_RENDER;
 349}
 350
 351/**
 352 * drm_is_control_client - is this an open file of the control node
 353 * @file_priv: DRM file
 354 *
 355 * Control nodes are deprecated and in the process of getting removed from the
 356 * DRM userspace API. Do not ever use!
 357 */
 358static inline bool drm_is_control_client(const struct drm_file *file_priv)
 359{
 360        return file_priv->minor->type == DRM_MINOR_CONTROL;
 361}
 362
 363int drm_open(struct inode *inode, struct file *filp);
 364ssize_t drm_read(struct file *filp, char __user *buffer,
 365                 size_t count, loff_t *offset);
 366int drm_release(struct inode *inode, struct file *filp);
 367unsigned int drm_poll(struct file *filp, struct poll_table_struct *wait);
 368int drm_event_reserve_init_locked(struct drm_device *dev,
 369                                  struct drm_file *file_priv,
 370                                  struct drm_pending_event *p,
 371                                  struct drm_event *e);
 372int drm_event_reserve_init(struct drm_device *dev,
 373                           struct drm_file *file_priv,
 374                           struct drm_pending_event *p,
 375                           struct drm_event *e);
 376void drm_event_cancel_free(struct drm_device *dev,
 377                           struct drm_pending_event *p);
 378void drm_send_event_locked(struct drm_device *dev, struct drm_pending_event *e);
 379void drm_send_event(struct drm_device *dev, struct drm_pending_event *e);
 380
 381#endif /* _DRM_FILE_H_ */
 382