These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / include / drm / drmP.h
index 62c4077..0a271ca 100644 (file)
@@ -107,6 +107,9 @@ struct dma_buf_attachment;
  * ATOMIC: used in the atomic code.
  *       This is the category used by the DRM_DEBUG_ATOMIC() macro.
  *
+ * VBL: used for verbose debug message in the vblank code
+ *       This is the category used by the DRM_DEBUG_VBL() macro.
+ *
  * Enabling verbose debug messages is done through the drm.debug parameter,
  * each category being enabled by a bit.
  *
@@ -114,7 +117,7 @@ struct dma_buf_attachment;
  * drm.debug=0x2 will enable DRIVER messages
  * drm.debug=0x3 will enable CORE and DRIVER messages
  * ...
- * drm.debug=0xf will enable all messages
+ * drm.debug=0x3f will enable all messages
  *
  * An interesting feature is that it's possible to enable verbose logging at
  * run-time by echoing the debug value in its sysfs node:
@@ -125,6 +128,7 @@ struct dma_buf_attachment;
 #define DRM_UT_KMS             0x04
 #define DRM_UT_PRIME           0x08
 #define DRM_UT_ATOMIC          0x10
+#define DRM_UT_VBL             0x20
 
 extern __printf(2, 3)
 void drm_ut_debug_printk(const char *function_name,
@@ -137,17 +141,18 @@ void drm_err(const char *format, ...);
 /*@{*/
 
 /* driver capabilities and requirements mask */
-#define DRIVER_USE_AGP     0x1
-#define DRIVER_PCI_DMA     0x8
-#define DRIVER_SG          0x10
-#define DRIVER_HAVE_DMA    0x20
-#define DRIVER_HAVE_IRQ    0x40
-#define DRIVER_IRQ_SHARED  0x80
-#define DRIVER_GEM         0x1000
-#define DRIVER_MODESET     0x2000
-#define DRIVER_PRIME       0x4000
-#define DRIVER_RENDER      0x8000
-#define DRIVER_ATOMIC      0x10000
+#define DRIVER_USE_AGP                 0x1
+#define DRIVER_PCI_DMA                 0x8
+#define DRIVER_SG                      0x10
+#define DRIVER_HAVE_DMA                        0x20
+#define DRIVER_HAVE_IRQ                        0x40
+#define DRIVER_IRQ_SHARED              0x80
+#define DRIVER_GEM                     0x1000
+#define DRIVER_MODESET                 0x2000
+#define DRIVER_PRIME                   0x4000
+#define DRIVER_RENDER                  0x8000
+#define DRIVER_ATOMIC                  0x10000
+#define DRIVER_KMS_LEGACY_CONTEXT      0x20000
 
 /***********************************************************************/
 /** \name Macros to make printk easier */
@@ -216,6 +221,11 @@ void drm_err(const char *format, ...);
                if (unlikely(drm_debug & DRM_UT_ATOMIC))                \
                        drm_ut_debug_printk(__func__, fmt, ##args);     \
        } while (0)
+#define DRM_DEBUG_VBL(fmt, args...)                                    \
+       do {                                                            \
+               if (unlikely(drm_debug & DRM_UT_VBL))                   \
+                       drm_ut_debug_printk(__func__, fmt, ##args);     \
+       } while (0)
 
 /*@}*/
 
@@ -299,6 +309,11 @@ struct drm_file {
        unsigned universal_planes:1;
        /* true if client understands atomic properties */
        unsigned atomic:1;
+       /*
+        * This client is allowed to gain master privileges for @master.
+        * Protected by struct drm_device::master_mutex.
+        */
+       unsigned allowed_master:1;
 
        struct pid *pid;
        kuid_t uid;
@@ -326,6 +341,10 @@ struct drm_file {
        struct list_head fbs;
        struct mutex fbs_lock;
 
+       /** User-created blob properties; this retains a reference on the
+        *  property. */
+       struct list_head blobs;
+
        wait_queue_head_t event_wait;
        struct list_head event_list;
        int event_space;
@@ -355,8 +374,7 @@ struct drm_lock_data {
  * @minor: Link back to minor char device we are master for. Immutable.
  * @unique: Unique identifier: e.g. busid. Protected by drm_global_mutex.
  * @unique_len: Length of unique field. Protected by drm_global_mutex.
- * @magiclist: Hash of used authentication tokens. Protected by struct_mutex.
- * @magicfree: List of used authentication tokens. Protected by struct_mutex.
+ * @magic_map: Map of used authentication tokens. Protected by struct_mutex.
  * @lock: DRI lock information.
  * @driver_priv: Pointer to driver-private information.
  */
@@ -365,8 +383,7 @@ struct drm_master {
        struct drm_minor *minor;
        char *unique;
        int unique_len;
-       struct drm_open_hash magiclist;
-       struct list_head magicfree;
+       struct idr magic_map;
        struct drm_lock_data lock;
        void *driver_priv;
 };
@@ -409,7 +426,7 @@ struct drm_driver {
        /**
         * get_vblank_counter - get raw hardware vblank counter
         * @dev: DRM device
-        * @crtc: counter to fetch
+        * @pipe: counter to fetch
         *
         * Driver callback for fetching a raw hardware vblank counter for @crtc.
         * If a device doesn't have a hardware counter, the driver can simply
@@ -423,12 +440,12 @@ struct drm_driver {
         * RETURNS
         * Raw vblank counter value.
         */
-       u32 (*get_vblank_counter) (struct drm_device *dev, int crtc);
+       u32 (*get_vblank_counter) (struct drm_device *dev, unsigned int pipe);
 
        /**
         * enable_vblank - enable vblank interrupt events
         * @dev: DRM device
-        * @crtc: which irq to enable
+        * @pipe: which irq to enable
         *
         * Enable vblank interrupts for @crtc.  If the device doesn't have
         * a hardware vblank counter, this routine should be a no-op, since
@@ -438,18 +455,18 @@ struct drm_driver {
         * Zero on success, appropriate errno if the given @crtc's vblank
         * interrupt cannot be enabled.
         */
-       int (*enable_vblank) (struct drm_device *dev, int crtc);
+       int (*enable_vblank) (struct drm_device *dev, unsigned int pipe);
 
        /**
         * disable_vblank - disable vblank interrupt events
         * @dev: DRM device
-        * @crtc: which irq to enable
+        * @pipe: which irq to enable
         *
         * Disable vblank interrupts for @crtc.  If the device doesn't have
         * a hardware vblank counter, this routine should be a no-op, since
         * interrupts will have to stay on to keep the count accurate.
         */
-       void (*disable_vblank) (struct drm_device *dev, int crtc);
+       void (*disable_vblank) (struct drm_device *dev, unsigned int pipe);
 
        /**
         * Called by \c drm_device_is_agp.  Typically used to determine if a
@@ -471,7 +488,7 @@ struct drm_driver {
         * optional accurate ktime_get timestamp of when position was measured.
         *
         * \param dev  DRM device.
-        * \param crtc Id of the crtc to query.
+        * \param pipe Id of the crtc to query.
         * \param flags Flags from the caller (DRM_CALLED_FROM_VBLIRQ or 0).
         * \param *vpos Target location for current vertical scanout position.
         * \param *hpos Target location for current horizontal scanout position.
@@ -479,6 +496,7 @@ struct drm_driver {
         *               scanout position query. Can be NULL to skip timestamp.
         * \param *etime Target location for timestamp taken immediately after
         *               scanout position query. Can be NULL to skip timestamp.
+        * \param mode Current display timings.
         *
         * Returns vpos as a positive number while in active scanout area.
         * Returns vpos as a negative number inside vblank, counting the number
@@ -494,10 +512,10 @@ struct drm_driver {
         * but unknown small number of scanlines wrt. real scanout position.
         *
         */
-       int (*get_scanout_position) (struct drm_device *dev, int crtc,
-                                    unsigned int flags,
-                                    int *vpos, int *hpos, ktime_t *stime,
-                                    ktime_t *etime);
+       int (*get_scanout_position) (struct drm_device *dev, unsigned int pipe,
+                                    unsigned int flags, int *vpos, int *hpos,
+                                    ktime_t *stime, ktime_t *etime,
+                                    const struct drm_display_mode *mode);
 
        /**
         * Called by \c drm_get_last_vbltimestamp. Should return a precise
@@ -513,7 +531,7 @@ struct drm_driver {
         * to the OpenML OML_sync_control extension specification.
         *
         * \param dev dev DRM device handle.
-        * \param crtc crtc for which timestamp should be returned.
+        * \param pipe crtc for which timestamp should be returned.
         * \param *max_error Maximum allowable timestamp error in nanoseconds.
         *                   Implementation should strive to provide timestamp
         *                   with an error of at most *max_error nanoseconds.
@@ -529,7 +547,7 @@ struct drm_driver {
         * negative number on failure. A positive status code on success,
         * which describes how the vblank_time timestamp was computed.
         */
-       int (*get_vblank_timestamp) (struct drm_device *dev, int crtc,
+       int (*get_vblank_timestamp) (struct drm_device *dev, unsigned int pipe,
                                     int *max_error,
                                     struct timeval *vblank_time,
                                     unsigned flags);
@@ -673,28 +691,33 @@ struct drm_minor {
 
        /* currently active master for this node. Protected by master_mutex */
        struct drm_master *master;
-       struct drm_mode_group mode_group;
 };
 
 
 struct drm_pending_vblank_event {
        struct drm_pending_event base;
-       int pipe;
+       unsigned int pipe;
        struct drm_event_vblank event;
 };
 
 struct drm_vblank_crtc {
        struct drm_device *dev;         /* pointer to the drm_device */
        wait_queue_head_t queue;        /**< VBLANK wait queue */
-       struct timeval time[DRM_VBLANKTIME_RBSIZE];     /**< timestamp of current count */
        struct timer_list disable_timer;                /* delayed disable timer */
-       atomic_t count;                 /**< number of VBLANK interrupts */
+
+       /* vblank counter, protected by dev->vblank_time_lock for writes */
+       u32 count;
+       /* vblank timestamps, protected by dev->vblank_time_lock for writes */
+       struct timeval time[DRM_VBLANKTIME_RBSIZE];
+
        atomic_t refcount;              /* number of users of vblank interruptsper crtc */
        u32 last;                       /* protected by dev->vbl_lock, used */
                                        /* for wraparound handling */
        u32 last_wait;                  /* Last vblank seqno waited per CRTC */
        unsigned int inmodeset;         /* Display driver is setting mode */
-       int crtc;                       /* crtc index */
+       unsigned int pipe;              /* crtc index */
+       int framedur_ns;                /* frame/field duration in ns */
+       int linedur_ns;                 /* line duration in ns */
        bool enabled;                   /* so we don't call enable more than
                                           once per disable */
 };
@@ -812,10 +835,10 @@ struct drm_device {
 #endif
 
        struct platform_device *platformdev; /**< Platform device struture */
+       struct virtio_device *virtdev;
 
        struct drm_sg_mem *sg;  /**< Scatter gather memory */
        unsigned int num_crtcs;                  /**< Number of CRTCs on this device */
-       sigset_t sigmask;
 
        struct {
                int context;
@@ -880,6 +903,7 @@ static inline bool drm_is_primary_client(const struct drm_file *file_priv)
 /*@{*/
 
                                /* Driver support (drm_drv.h) */
+extern int drm_ioctl_permit(u32 flags, struct drm_file *file_priv);
 extern long drm_ioctl(struct file *filp,
                      unsigned int cmd, unsigned long arg);
 extern long drm_compat_ioctl(struct file *filp,
@@ -891,6 +915,7 @@ extern int drm_open(struct inode *inode, struct file *filp);
 extern ssize_t drm_read(struct file *filp, char __user *buffer,
                        size_t count, loff_t *offset);
 extern int drm_release(struct inode *inode, struct file *filp);
+extern int drm_new_set_master(struct drm_device *dev, struct drm_file *fpriv);
 
                                /* Mapping support (drm_vm.h) */
 extern unsigned int drm_poll(struct file *filp, struct poll_table_struct *wait);
@@ -898,6 +923,8 @@ extern unsigned int drm_poll(struct file *filp, struct poll_table_struct *wait);
 /* Misc. IOCTL support (drm_ioctl.c) */
 int drm_noop(struct drm_device *dev, void *data,
             struct drm_file *file_priv);
+int drm_invalid_op(struct drm_device *dev, void *data,
+                  struct drm_file *file_priv);
 
 /* Cache management (drm_cache.c) */
 void drm_clflush_pages(struct page *pages[], unsigned long num_pages);
@@ -913,37 +940,43 @@ void drm_clflush_virt_range(void *addr, unsigned long length);
 extern int drm_irq_install(struct drm_device *dev, int irq);
 extern int drm_irq_uninstall(struct drm_device *dev);
 
-extern int drm_vblank_init(struct drm_device *dev, int num_crtcs);
+extern int drm_vblank_init(struct drm_device *dev, unsigned int num_crtcs);
 extern int drm_wait_vblank(struct drm_device *dev, void *data,
                           struct drm_file *filp);
-extern u32 drm_vblank_count(struct drm_device *dev, int crtc);
+extern u32 drm_vblank_count(struct drm_device *dev, unsigned int pipe);
 extern u32 drm_crtc_vblank_count(struct drm_crtc *crtc);
-extern u32 drm_vblank_count_and_time(struct drm_device *dev, int crtc,
+extern u32 drm_vblank_count_and_time(struct drm_device *dev, unsigned int pipe,
                                     struct timeval *vblanktime);
-extern void drm_send_vblank_event(struct drm_device *dev, int crtc,
-                                    struct drm_pending_vblank_event *e);
+extern u32 drm_crtc_vblank_count_and_time(struct drm_crtc *crtc,
+                                         struct timeval *vblanktime);
+extern void drm_send_vblank_event(struct drm_device *dev, unsigned int pipe,
+                                 struct drm_pending_vblank_event *e);
 extern void drm_crtc_send_vblank_event(struct drm_crtc *crtc,
                                       struct drm_pending_vblank_event *e);
-extern bool drm_handle_vblank(struct drm_device *dev, int crtc);
+extern void drm_arm_vblank_event(struct drm_device *dev, unsigned int pipe,
+                                struct drm_pending_vblank_event *e);
+extern void drm_crtc_arm_vblank_event(struct drm_crtc *crtc,
+                                     struct drm_pending_vblank_event *e);
+extern bool drm_handle_vblank(struct drm_device *dev, unsigned int pipe);
 extern bool drm_crtc_handle_vblank(struct drm_crtc *crtc);
-extern int drm_vblank_get(struct drm_device *dev, int crtc);
-extern void drm_vblank_put(struct drm_device *dev, int crtc);
+extern int drm_vblank_get(struct drm_device *dev, unsigned int pipe);
+extern void drm_vblank_put(struct drm_device *dev, unsigned int pipe);
 extern int drm_crtc_vblank_get(struct drm_crtc *crtc);
 extern void drm_crtc_vblank_put(struct drm_crtc *crtc);
-extern void drm_wait_one_vblank(struct drm_device *dev, int crtc);
+extern void drm_wait_one_vblank(struct drm_device *dev, unsigned int pipe);
 extern void drm_crtc_wait_one_vblank(struct drm_crtc *crtc);
-extern void drm_vblank_off(struct drm_device *dev, int crtc);
-extern void drm_vblank_on(struct drm_device *dev, int crtc);
+extern void drm_vblank_off(struct drm_device *dev, unsigned int pipe);
+extern void drm_vblank_on(struct drm_device *dev, unsigned int pipe);
 extern void drm_crtc_vblank_off(struct drm_crtc *crtc);
 extern void drm_crtc_vblank_reset(struct drm_crtc *crtc);
 extern void drm_crtc_vblank_on(struct drm_crtc *crtc);
 extern void drm_vblank_cleanup(struct drm_device *dev);
+extern u32 drm_vblank_no_hw_counter(struct drm_device *dev, unsigned int pipe);
 
 extern int drm_calc_vbltimestamp_from_scanoutpos(struct drm_device *dev,
-                                                int crtc, int *max_error,
+                                                unsigned int pipe, int *max_error,
                                                 struct timeval *vblank_time,
                                                 unsigned flags,
-                                                const struct drm_crtc *refcrtc,
                                                 const struct drm_display_mode *mode);
 extern void drm_calc_timestamping_constants(struct drm_crtc *crtc,
                                            const struct drm_display_mode *mode);
@@ -961,8 +994,8 @@ static inline wait_queue_head_t *drm_crtc_vblank_waitqueue(struct drm_crtc *crtc
 }
 
 /* Modesetting support */
-extern void drm_vblank_pre_modeset(struct drm_device *dev, int crtc);
-extern void drm_vblank_post_modeset(struct drm_device *dev, int crtc);
+extern void drm_vblank_pre_modeset(struct drm_device *dev, unsigned int pipe);
+extern void drm_vblank_post_modeset(struct drm_device *dev, unsigned int pipe);
 
                                /* Stub support (drm_stub.h) */
 extern struct drm_master *drm_master_get(struct drm_master *master);