Merge tag 'drm-misc-next-2017-08-16' of git://anongit.freedesktop.org/git/drm-misc into drm-next
UAPI Changes:
- vc4: Allow userspace to dictate rendering order in submit_cl ioctl (Eric)
Cross-subsystem Changes:
- vboxvideo: One of Cihangir's patches applies to vboxvideo which is maintained
in staging
Core Changes:
- atomic_legacy_backoff is officially killed (Daniel)
- Extract drm_device.h (Daniel)
- Unregister drm device on unplug (Daniel)
- Rename deprecated drm_*_(un)?reference functions to drm_*_{get|put} (Cihangir)
Driver Changes:
- vc4: Error/destroy path cleanups, log level demotion, edid leak (Eric)
- various: Make various drm_*_funcs structs const (Bhumika)
- tinydrm: add support for LEGO MINDSTORMS EV3 LCD (David)
- various: Second half of .dumb_{map_offset|destroy} defaults set (Noralf)
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Eric Anholt <eric@anholt.net>
Cc: Bhumika Goyal <bhumirks@gmail.com>
Cc: Cihangir Akturk <cakturk@gmail.com>
Cc: David Lechner <david@lechnology.com>
Cc: Noralf Trønnes <noralf@tronnes.org>
* tag 'drm-misc-next-2017-08-16' of git://anongit.freedesktop.org/git/drm-misc: (50 commits)
drm/gem-cma-helper: Remove drm_gem_cma_dumb_map_offset()
drm/virtio: Use the drm_driver.dumb_destroy default
drm/bochs: Use the drm_driver.dumb_destroy default
drm/mgag200: Use the drm_driver.dumb_destroy default
drm/exynos: Use .dumb_map_offset and .dumb_destroy defaults
drm/msm: Use the drm_driver.dumb_destroy default
drm/ast: Use the drm_driver.dumb_destroy default
drm/qxl: Use the drm_driver.dumb_destroy default
drm/udl: Use the drm_driver.dumb_destroy default
drm/cirrus: Use the drm_driver.dumb_destroy default
drm/tegra: Use .dumb_map_offset and .dumb_destroy defaults
drm/gma500: Use .dumb_map_offset and .dumb_destroy defaults
drm/mxsfb: Use .dumb_map_offset and .dumb_destroy defaults
drm/meson: Use .dumb_map_offset and .dumb_destroy defaults
drm/kirin: Use .dumb_map_offset and .dumb_destroy defaults
drm/vc4: Continue the switch to drm_*_put() helpers
drm/vc4: Fix leak of HDMI EDID
dma-buf: fix reservation_object_wait_timeout_rcu to wait correctly v2
dma-buf: add reservation_object_copy_fences (v2)
drm/tinydrm: add support for LEGO MINDSTORMS EV3 LCD
...
This commit is contained in:
@@ -82,19 +82,10 @@
|
||||
#include <drm/drm_sysfs.h>
|
||||
#include <drm/drm_vblank.h>
|
||||
#include <drm/drm_irq.h>
|
||||
|
||||
#include <drm/drm_device.h>
|
||||
|
||||
struct module;
|
||||
|
||||
struct drm_device;
|
||||
struct drm_agp_head;
|
||||
struct drm_local_map;
|
||||
struct drm_device_dma;
|
||||
struct drm_gem_object;
|
||||
struct drm_master;
|
||||
struct drm_vblank_crtc;
|
||||
struct drm_vma_offset_manager;
|
||||
|
||||
struct device_node;
|
||||
struct videomode;
|
||||
struct reservation_object;
|
||||
@@ -305,170 +296,6 @@ struct pci_controller;
|
||||
#define DRM_IF_VERSION(maj, min) (maj << 16 | min)
|
||||
|
||||
|
||||
/**
|
||||
* DRM device structure. This structure represent a complete card that
|
||||
* may contain multiple heads.
|
||||
*/
|
||||
struct drm_device {
|
||||
struct list_head legacy_dev_list;/**< list of devices per driver for stealth attach cleanup */
|
||||
int if_version; /**< Highest interface version set */
|
||||
|
||||
/** \name Lifetime Management */
|
||||
/*@{ */
|
||||
struct kref ref; /**< Object ref-count */
|
||||
struct device *dev; /**< Device structure of bus-device */
|
||||
struct drm_driver *driver; /**< DRM driver managing the device */
|
||||
void *dev_private; /**< DRM driver private data */
|
||||
struct drm_minor *control; /**< Control node */
|
||||
struct drm_minor *primary; /**< Primary node */
|
||||
struct drm_minor *render; /**< Render node */
|
||||
bool registered;
|
||||
|
||||
/* currently active master for this device. Protected by master_mutex */
|
||||
struct drm_master *master;
|
||||
|
||||
atomic_t unplugged; /**< Flag whether dev is dead */
|
||||
struct inode *anon_inode; /**< inode for private address-space */
|
||||
char *unique; /**< unique name of the device */
|
||||
/*@} */
|
||||
|
||||
/** \name Locks */
|
||||
/*@{ */
|
||||
struct mutex struct_mutex; /**< For others */
|
||||
struct mutex master_mutex; /**< For drm_minor::master and drm_file::is_master */
|
||||
/*@} */
|
||||
|
||||
/** \name Usage Counters */
|
||||
/*@{ */
|
||||
int open_count; /**< Outstanding files open, protected by drm_global_mutex. */
|
||||
spinlock_t buf_lock; /**< For drm_device::buf_use and a few other things. */
|
||||
int buf_use; /**< Buffers in use -- cannot alloc */
|
||||
atomic_t buf_alloc; /**< Buffer allocation in progress */
|
||||
/*@} */
|
||||
|
||||
struct mutex filelist_mutex;
|
||||
struct list_head filelist;
|
||||
|
||||
/** \name Memory management */
|
||||
/*@{ */
|
||||
struct list_head maplist; /**< Linked list of regions */
|
||||
struct drm_open_hash map_hash; /**< User token hash table for maps */
|
||||
|
||||
/** \name Context handle management */
|
||||
/*@{ */
|
||||
struct list_head ctxlist; /**< Linked list of context handles */
|
||||
struct mutex ctxlist_mutex; /**< For ctxlist */
|
||||
|
||||
struct idr ctx_idr;
|
||||
|
||||
struct list_head vmalist; /**< List of vmas (for debugging) */
|
||||
|
||||
/*@} */
|
||||
|
||||
/** \name DMA support */
|
||||
/*@{ */
|
||||
struct drm_device_dma *dma; /**< Optional pointer for DMA support */
|
||||
/*@} */
|
||||
|
||||
/** \name Context support */
|
||||
/*@{ */
|
||||
|
||||
__volatile__ long context_flag; /**< Context swapping flag */
|
||||
int last_context; /**< Last current context */
|
||||
/*@} */
|
||||
|
||||
/**
|
||||
* @irq_enabled:
|
||||
*
|
||||
* Indicates that interrupt handling is enabled, specifically vblank
|
||||
* handling. Drivers which don't use drm_irq_install() need to set this
|
||||
* to true manually.
|
||||
*/
|
||||
bool irq_enabled;
|
||||
int irq;
|
||||
|
||||
/**
|
||||
* @vblank_disable_immediate:
|
||||
*
|
||||
* If true, vblank interrupt will be disabled immediately when the
|
||||
* refcount drops to zero, as opposed to via the vblank disable
|
||||
* timer.
|
||||
*
|
||||
* This can be set to true it the hardware has a working vblank counter
|
||||
* with high-precision timestamping (otherwise there are races) and the
|
||||
* driver uses drm_crtc_vblank_on() and drm_crtc_vblank_off()
|
||||
* appropriately. See also @max_vblank_count and
|
||||
* &drm_crtc_funcs.get_vblank_counter.
|
||||
*/
|
||||
bool vblank_disable_immediate;
|
||||
|
||||
/**
|
||||
* @vblank:
|
||||
*
|
||||
* Array of vblank tracking structures, one per &struct drm_crtc. For
|
||||
* historical reasons (vblank support predates kernel modesetting) this
|
||||
* is free-standing and not part of &struct drm_crtc itself. It must be
|
||||
* initialized explicitly by calling drm_vblank_init().
|
||||
*/
|
||||
struct drm_vblank_crtc *vblank;
|
||||
|
||||
spinlock_t vblank_time_lock; /**< Protects vblank count and time updates during vblank enable/disable */
|
||||
spinlock_t vbl_lock;
|
||||
|
||||
/**
|
||||
* @max_vblank_count:
|
||||
*
|
||||
* Maximum value of the vblank registers. This value +1 will result in a
|
||||
* wrap-around of the vblank register. It is used by the vblank core to
|
||||
* handle wrap-arounds.
|
||||
*
|
||||
* If set to zero the vblank core will try to guess the elapsed vblanks
|
||||
* between times when the vblank interrupt is disabled through
|
||||
* high-precision timestamps. That approach is suffering from small
|
||||
* races and imprecision over longer time periods, hence exposing a
|
||||
* hardware vblank counter is always recommended.
|
||||
*
|
||||
* If non-zeor, &drm_crtc_funcs.get_vblank_counter must be set.
|
||||
*/
|
||||
u32 max_vblank_count; /**< size of vblank counter register */
|
||||
|
||||
/**
|
||||
* List of events
|
||||
*/
|
||||
struct list_head vblank_event_list;
|
||||
spinlock_t event_lock;
|
||||
|
||||
/*@} */
|
||||
|
||||
struct drm_agp_head *agp; /**< AGP data */
|
||||
|
||||
struct pci_dev *pdev; /**< PCI device structure */
|
||||
#ifdef __alpha__
|
||||
struct pci_controller *hose;
|
||||
#endif
|
||||
|
||||
struct drm_sg_mem *sg; /**< Scatter gather memory */
|
||||
unsigned int num_crtcs; /**< Number of CRTCs on this device */
|
||||
|
||||
struct {
|
||||
int context;
|
||||
struct drm_hw_lock *lock;
|
||||
} sigdata;
|
||||
|
||||
struct drm_local_map *agp_buffer_map;
|
||||
unsigned int agp_buffer_token;
|
||||
|
||||
struct drm_mode_config mode_config; /**< Current mode config */
|
||||
|
||||
/** \name GEM information */
|
||||
/*@{ */
|
||||
struct mutex object_name_lock;
|
||||
struct idr object_name_idr;
|
||||
struct drm_vma_offset_manager *vma_offset_manager;
|
||||
/*@} */
|
||||
int switch_power_state;
|
||||
};
|
||||
|
||||
/**
|
||||
* drm_drv_uses_atomic_modeset - check if the driver implements
|
||||
* atomic_commit()
|
||||
@@ -493,19 +320,6 @@ static __inline__ int drm_core_check_feature(struct drm_device *dev,
|
||||
return ((dev->driver->driver_features & feature) ? 1 : 0);
|
||||
}
|
||||
|
||||
static inline void drm_device_set_unplugged(struct drm_device *dev)
|
||||
{
|
||||
smp_wmb();
|
||||
atomic_set(&dev->unplugged, 1);
|
||||
}
|
||||
|
||||
static inline int drm_device_is_unplugged(struct drm_device *dev)
|
||||
{
|
||||
int ret = atomic_read(&dev->unplugged);
|
||||
smp_rmb();
|
||||
return ret;
|
||||
}
|
||||
|
||||
/******************************************************************/
|
||||
/** \name Internal function definitions */
|
||||
/*@{*/
|
||||
|
||||
190
include/drm/drm_device.h
Normal file
190
include/drm/drm_device.h
Normal file
@@ -0,0 +1,190 @@
|
||||
#ifndef _DRM_DEVICE_H_
|
||||
#define _DRM_DEVICE_H_
|
||||
|
||||
#include <linux/list.h>
|
||||
#include <linux/kref.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <linux/idr.h>
|
||||
|
||||
#include <drm/drm_hashtab.h>
|
||||
#include <drm/drm_mode_config.h>
|
||||
|
||||
struct drm_driver;
|
||||
struct drm_minor;
|
||||
struct drm_master;
|
||||
struct drm_device_dma;
|
||||
struct drm_vblank_crtc;
|
||||
struct drm_sg_mem;
|
||||
struct drm_local_map;
|
||||
struct drm_vma_offset_manager;
|
||||
|
||||
struct inode;
|
||||
|
||||
struct pci_dev;
|
||||
struct pci_controller;
|
||||
|
||||
/**
|
||||
* DRM device structure. This structure represent a complete card that
|
||||
* may contain multiple heads.
|
||||
*/
|
||||
struct drm_device {
|
||||
struct list_head legacy_dev_list;/**< list of devices per driver for stealth attach cleanup */
|
||||
int if_version; /**< Highest interface version set */
|
||||
|
||||
/** \name Lifetime Management */
|
||||
/*@{ */
|
||||
struct kref ref; /**< Object ref-count */
|
||||
struct device *dev; /**< Device structure of bus-device */
|
||||
struct drm_driver *driver; /**< DRM driver managing the device */
|
||||
void *dev_private; /**< DRM driver private data */
|
||||
struct drm_minor *control; /**< Control node */
|
||||
struct drm_minor *primary; /**< Primary node */
|
||||
struct drm_minor *render; /**< Render node */
|
||||
bool registered;
|
||||
|
||||
/* currently active master for this device. Protected by master_mutex */
|
||||
struct drm_master *master;
|
||||
|
||||
atomic_t unplugged; /**< Flag whether dev is dead */
|
||||
struct inode *anon_inode; /**< inode for private address-space */
|
||||
char *unique; /**< unique name of the device */
|
||||
/*@} */
|
||||
|
||||
/** \name Locks */
|
||||
/*@{ */
|
||||
struct mutex struct_mutex; /**< For others */
|
||||
struct mutex master_mutex; /**< For drm_minor::master and drm_file::is_master */
|
||||
/*@} */
|
||||
|
||||
/** \name Usage Counters */
|
||||
/*@{ */
|
||||
int open_count; /**< Outstanding files open, protected by drm_global_mutex. */
|
||||
spinlock_t buf_lock; /**< For drm_device::buf_use and a few other things. */
|
||||
int buf_use; /**< Buffers in use -- cannot alloc */
|
||||
atomic_t buf_alloc; /**< Buffer allocation in progress */
|
||||
/*@} */
|
||||
|
||||
struct mutex filelist_mutex;
|
||||
struct list_head filelist;
|
||||
|
||||
/** \name Memory management */
|
||||
/*@{ */
|
||||
struct list_head maplist; /**< Linked list of regions */
|
||||
struct drm_open_hash map_hash; /**< User token hash table for maps */
|
||||
|
||||
/** \name Context handle management */
|
||||
/*@{ */
|
||||
struct list_head ctxlist; /**< Linked list of context handles */
|
||||
struct mutex ctxlist_mutex; /**< For ctxlist */
|
||||
|
||||
struct idr ctx_idr;
|
||||
|
||||
struct list_head vmalist; /**< List of vmas (for debugging) */
|
||||
|
||||
/*@} */
|
||||
|
||||
/** \name DMA support */
|
||||
/*@{ */
|
||||
struct drm_device_dma *dma; /**< Optional pointer for DMA support */
|
||||
/*@} */
|
||||
|
||||
/** \name Context support */
|
||||
/*@{ */
|
||||
|
||||
__volatile__ long context_flag; /**< Context swapping flag */
|
||||
int last_context; /**< Last current context */
|
||||
/*@} */
|
||||
|
||||
/**
|
||||
* @irq_enabled:
|
||||
*
|
||||
* Indicates that interrupt handling is enabled, specifically vblank
|
||||
* handling. Drivers which don't use drm_irq_install() need to set this
|
||||
* to true manually.
|
||||
*/
|
||||
bool irq_enabled;
|
||||
int irq;
|
||||
|
||||
/**
|
||||
* @vblank_disable_immediate:
|
||||
*
|
||||
* If true, vblank interrupt will be disabled immediately when the
|
||||
* refcount drops to zero, as opposed to via the vblank disable
|
||||
* timer.
|
||||
*
|
||||
* This can be set to true it the hardware has a working vblank counter
|
||||
* with high-precision timestamping (otherwise there are races) and the
|
||||
* driver uses drm_crtc_vblank_on() and drm_crtc_vblank_off()
|
||||
* appropriately. See also @max_vblank_count and
|
||||
* &drm_crtc_funcs.get_vblank_counter.
|
||||
*/
|
||||
bool vblank_disable_immediate;
|
||||
|
||||
/**
|
||||
* @vblank:
|
||||
*
|
||||
* Array of vblank tracking structures, one per &struct drm_crtc. For
|
||||
* historical reasons (vblank support predates kernel modesetting) this
|
||||
* is free-standing and not part of &struct drm_crtc itself. It must be
|
||||
* initialized explicitly by calling drm_vblank_init().
|
||||
*/
|
||||
struct drm_vblank_crtc *vblank;
|
||||
|
||||
spinlock_t vblank_time_lock; /**< Protects vblank count and time updates during vblank enable/disable */
|
||||
spinlock_t vbl_lock;
|
||||
|
||||
/**
|
||||
* @max_vblank_count:
|
||||
*
|
||||
* Maximum value of the vblank registers. This value +1 will result in a
|
||||
* wrap-around of the vblank register. It is used by the vblank core to
|
||||
* handle wrap-arounds.
|
||||
*
|
||||
* If set to zero the vblank core will try to guess the elapsed vblanks
|
||||
* between times when the vblank interrupt is disabled through
|
||||
* high-precision timestamps. That approach is suffering from small
|
||||
* races and imprecision over longer time periods, hence exposing a
|
||||
* hardware vblank counter is always recommended.
|
||||
*
|
||||
* If non-zeor, &drm_crtc_funcs.get_vblank_counter must be set.
|
||||
*/
|
||||
u32 max_vblank_count; /**< size of vblank counter register */
|
||||
|
||||
/**
|
||||
* List of events
|
||||
*/
|
||||
struct list_head vblank_event_list;
|
||||
spinlock_t event_lock;
|
||||
|
||||
/*@} */
|
||||
|
||||
struct drm_agp_head *agp; /**< AGP data */
|
||||
|
||||
struct pci_dev *pdev; /**< PCI device structure */
|
||||
#ifdef __alpha__
|
||||
struct pci_controller *hose;
|
||||
#endif
|
||||
|
||||
struct drm_sg_mem *sg; /**< Scatter gather memory */
|
||||
unsigned int num_crtcs; /**< Number of CRTCs on this device */
|
||||
|
||||
struct {
|
||||
int context;
|
||||
struct drm_hw_lock *lock;
|
||||
} sigdata;
|
||||
|
||||
struct drm_local_map *agp_buffer_map;
|
||||
unsigned int agp_buffer_token;
|
||||
|
||||
struct drm_mode_config mode_config; /**< Current mode config */
|
||||
|
||||
/** \name GEM information */
|
||||
/*@{ */
|
||||
struct mutex object_name_lock;
|
||||
struct idr object_name_idr;
|
||||
struct drm_vma_offset_manager *vma_offset_manager;
|
||||
/*@} */
|
||||
int switch_power_state;
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -30,7 +30,8 @@
|
||||
#include <linux/list.h>
|
||||
#include <linux/irqreturn.h>
|
||||
|
||||
struct drm_device;
|
||||
#include <drm/drm_device.h>
|
||||
|
||||
struct drm_file;
|
||||
struct drm_gem_object;
|
||||
struct drm_master;
|
||||
@@ -613,7 +614,24 @@ void drm_dev_unregister(struct drm_device *dev);
|
||||
void drm_dev_ref(struct drm_device *dev);
|
||||
void drm_dev_unref(struct drm_device *dev);
|
||||
void drm_put_dev(struct drm_device *dev);
|
||||
void drm_unplug_dev(struct drm_device *dev);
|
||||
void drm_dev_unplug(struct drm_device *dev);
|
||||
|
||||
/**
|
||||
* drm_dev_is_unplugged - is a DRM device unplugged
|
||||
* @dev: DRM device
|
||||
*
|
||||
* This function can be called to check whether a hotpluggable is unplugged.
|
||||
* Unplugging itself is singalled through drm_dev_unplug(). If a device is
|
||||
* unplugged, these two functions guarantee that any store before calling
|
||||
* drm_dev_unplug() is visible to callers of this function after it completes
|
||||
*/
|
||||
static inline int drm_dev_is_unplugged(struct drm_device *dev)
|
||||
{
|
||||
int ret = atomic_read(&dev->unplugged);
|
||||
smp_rmb();
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
int drm_dev_set_unique(struct drm_device *dev, const char *name);
|
||||
|
||||
|
||||
@@ -73,11 +73,6 @@ int drm_gem_cma_dumb_create(struct drm_file *file_priv,
|
||||
struct drm_device *drm,
|
||||
struct drm_mode_create_dumb *args);
|
||||
|
||||
/* map memory region for DRM framebuffer to user space */
|
||||
int drm_gem_cma_dumb_map_offset(struct drm_file *file_priv,
|
||||
struct drm_device *drm, u32 handle,
|
||||
u64 *offset);
|
||||
|
||||
/* set vm_flags and we can change the VM attribute to other one at here */
|
||||
int drm_gem_cma_mmap(struct file *filp, struct vm_area_struct *vma);
|
||||
|
||||
|
||||
@@ -43,7 +43,8 @@ void tinydrm_swab16(u16 *dst, void *vaddr, struct drm_framebuffer *fb,
|
||||
void tinydrm_xrgb8888_to_rgb565(u16 *dst, void *vaddr,
|
||||
struct drm_framebuffer *fb,
|
||||
struct drm_clip_rect *clip, bool swap);
|
||||
int tinydrm_xrgb8888_to_gray8(u8 *dst, struct drm_framebuffer *fb);
|
||||
void tinydrm_xrgb8888_to_gray8(u8 *dst, void *vaddr, struct drm_framebuffer *fb,
|
||||
struct drm_clip_rect *clip);
|
||||
|
||||
struct backlight_device *tinydrm_of_find_backlight(struct device *dev);
|
||||
int tinydrm_enable_backlight(struct backlight_device *backlight);
|
||||
|
||||
Reference in New Issue
Block a user