Merge tag 'drm-misc-next-2018-11-21' of git://anongit.freedesktop.org/drm/drm-misc into drm-next
drm-misc-next for v4.21, part 2: UAPI Changes: - Remove syncobj timeline support from drm. Cross-subsystem Changes: - Document canvas provider node in the DT bindings. - Improve documentation for TPO TPG110 DT bindings. Core Changes: - Use explicit state in drm atomic functions. - Add panel quirk for new GPD Win2 firmware. - Add DRM_FORMAT_XYUV8888. - Set the default import/export function in prime to drm_gem_prime_import/export. - Add a separate drm_gem_object_funcs, to stop relying on dev->driver->*gem* functions. - Make sure that tinydrm sets the virtual address also on imported buffers. Driver Changes: - Support active-low data enable signal in sun4i. - Fix scaling in vc4. - Use canvas provider node in meson. - Remove unused variables in sti and qxl and cirrus. - Add overlay plane support and primary plane scaling to meson. - i2c fixes in drm/bridge/sii902x - Fix mailbox read size in rockchip. - Spelling fix in panel/s6d16d0. - Remove unnecessary null check from qxl_bo_unref. - Remove unused arguments from qxl_bo_pin. - Fix qxl cursor pinning. Signed-off-by: Dave Airlie <airlied@redhat.com> From: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/9c0409e3-a85f-d2af-b4eb-baf1eb8bbae4@linux.intel.com
This commit is contained in:
@@ -471,6 +471,8 @@ struct drm_driver {
|
||||
* @gem_prime_export:
|
||||
*
|
||||
* export GEM -> dmabuf
|
||||
*
|
||||
* This defaults to drm_gem_prime_export() if not set.
|
||||
*/
|
||||
struct dma_buf * (*gem_prime_export)(struct drm_device *dev,
|
||||
struct drm_gem_object *obj, int flags);
|
||||
@@ -478,6 +480,8 @@ struct drm_driver {
|
||||
* @gem_prime_import:
|
||||
*
|
||||
* import dmabuf -> GEM
|
||||
*
|
||||
* This defaults to drm_gem_prime_import() if not set.
|
||||
*/
|
||||
struct drm_gem_object * (*gem_prime_import)(struct drm_device *dev,
|
||||
struct dma_buf *dma_buf);
|
||||
|
@@ -38,6 +38,121 @@
|
||||
|
||||
#include <drm/drm_vma_manager.h>
|
||||
|
||||
struct drm_gem_object;
|
||||
|
||||
/**
|
||||
* struct drm_gem_object_funcs - GEM object functions
|
||||
*/
|
||||
struct drm_gem_object_funcs {
|
||||
/**
|
||||
* @free:
|
||||
*
|
||||
* Deconstructor for drm_gem_objects.
|
||||
*
|
||||
* This callback is mandatory.
|
||||
*/
|
||||
void (*free)(struct drm_gem_object *obj);
|
||||
|
||||
/**
|
||||
* @open:
|
||||
*
|
||||
* Called upon GEM handle creation.
|
||||
*
|
||||
* This callback is optional.
|
||||
*/
|
||||
int (*open)(struct drm_gem_object *obj, struct drm_file *file);
|
||||
|
||||
/**
|
||||
* @close:
|
||||
*
|
||||
* Called upon GEM handle release.
|
||||
*
|
||||
* This callback is optional.
|
||||
*/
|
||||
void (*close)(struct drm_gem_object *obj, struct drm_file *file);
|
||||
|
||||
/**
|
||||
* @print_info:
|
||||
*
|
||||
* If driver subclasses struct &drm_gem_object, it can implement this
|
||||
* optional hook for printing additional driver specific info.
|
||||
*
|
||||
* drm_printf_indent() should be used in the callback passing it the
|
||||
* indent argument.
|
||||
*
|
||||
* This callback is called from drm_gem_print_info().
|
||||
*
|
||||
* This callback is optional.
|
||||
*/
|
||||
void (*print_info)(struct drm_printer *p, unsigned int indent,
|
||||
const struct drm_gem_object *obj);
|
||||
|
||||
/**
|
||||
* @export:
|
||||
*
|
||||
* Export backing buffer as a &dma_buf.
|
||||
* If this is not set drm_gem_prime_export() is used.
|
||||
*
|
||||
* This callback is optional.
|
||||
*/
|
||||
struct dma_buf *(*export)(struct drm_gem_object *obj, int flags);
|
||||
|
||||
/**
|
||||
* @pin:
|
||||
*
|
||||
* Pin backing buffer in memory.
|
||||
*
|
||||
* This callback is optional.
|
||||
*/
|
||||
int (*pin)(struct drm_gem_object *obj);
|
||||
|
||||
/**
|
||||
* @unpin:
|
||||
*
|
||||
* Unpin backing buffer.
|
||||
*
|
||||
* This callback is optional.
|
||||
*/
|
||||
void (*unpin)(struct drm_gem_object *obj);
|
||||
|
||||
/**
|
||||
* @get_sg_table:
|
||||
*
|
||||
* Returns a Scatter-Gather table representation of the buffer.
|
||||
* Used when exporting a buffer.
|
||||
*
|
||||
* This callback is mandatory if buffer export is supported.
|
||||
*/
|
||||
struct sg_table *(*get_sg_table)(struct drm_gem_object *obj);
|
||||
|
||||
/**
|
||||
* @vmap:
|
||||
*
|
||||
* Returns a virtual address for the buffer.
|
||||
*
|
||||
* This callback is optional.
|
||||
*/
|
||||
void *(*vmap)(struct drm_gem_object *obj);
|
||||
|
||||
/**
|
||||
* @vunmap:
|
||||
*
|
||||
* Releases the the address previously returned by @vmap.
|
||||
*
|
||||
* This callback is optional.
|
||||
*/
|
||||
void (*vunmap)(struct drm_gem_object *obj, void *vaddr);
|
||||
|
||||
/**
|
||||
* @vm_ops:
|
||||
*
|
||||
* Virtual memory operations used with mmap.
|
||||
*
|
||||
* This is optional but necessary for mmap support.
|
||||
*/
|
||||
const struct vm_operations_struct *vm_ops;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct drm_gem_object - GEM buffer object
|
||||
*
|
||||
@@ -146,6 +261,17 @@ struct drm_gem_object {
|
||||
* simply leave it as NULL.
|
||||
*/
|
||||
struct dma_buf_attachment *import_attach;
|
||||
|
||||
/**
|
||||
* @funcs:
|
||||
*
|
||||
* Optional GEM object functions. If this is set, it will be used instead of the
|
||||
* corresponding &drm_driver GEM callbacks.
|
||||
*
|
||||
* New drivers should use this.
|
||||
*
|
||||
*/
|
||||
const struct drm_gem_object_funcs *funcs;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -293,4 +419,9 @@ int drm_gem_dumb_destroy(struct drm_file *file,
|
||||
struct drm_device *dev,
|
||||
uint32_t handle);
|
||||
|
||||
int drm_gem_pin(struct drm_gem_object *obj);
|
||||
void drm_gem_unpin(struct drm_gem_object *obj);
|
||||
void *drm_gem_vmap(struct drm_gem_object *obj);
|
||||
void drm_gem_vunmap(struct drm_gem_object *obj, void *vaddr);
|
||||
|
||||
#endif /* __DRM_GEM_H__ */
|
||||
|
@@ -103,4 +103,28 @@ int drm_gem_cma_prime_mmap(struct drm_gem_object *obj,
|
||||
void *drm_gem_cma_prime_vmap(struct drm_gem_object *obj);
|
||||
void drm_gem_cma_prime_vunmap(struct drm_gem_object *obj, void *vaddr);
|
||||
|
||||
struct drm_gem_object *
|
||||
drm_cma_gem_create_object_default_funcs(struct drm_device *dev, size_t size);
|
||||
|
||||
/**
|
||||
* DRM_GEM_CMA_VMAP_DRIVER_OPS - CMA GEM driver operations ensuring a virtual
|
||||
* address on the buffer
|
||||
*
|
||||
* This macro provides a shortcut for setting the default GEM operations in the
|
||||
* &drm_driver structure for drivers that need the virtual address also on
|
||||
* imported buffers.
|
||||
*/
|
||||
#define DRM_GEM_CMA_VMAP_DRIVER_OPS \
|
||||
.gem_create_object = drm_cma_gem_create_object_default_funcs, \
|
||||
.dumb_create = drm_gem_cma_dumb_create, \
|
||||
.prime_handle_to_fd = drm_gem_prime_handle_to_fd, \
|
||||
.prime_fd_to_handle = drm_gem_prime_fd_to_handle, \
|
||||
.gem_prime_import_sg_table = drm_gem_cma_prime_import_sg_table_vmap, \
|
||||
.gem_prime_mmap = drm_gem_prime_mmap
|
||||
|
||||
struct drm_gem_object *
|
||||
drm_gem_cma_prime_import_sg_table_vmap(struct drm_device *drm,
|
||||
struct dma_buf_attachment *attach,
|
||||
struct sg_table *sgt);
|
||||
|
||||
#endif /* __DRM_GEM_CMA_HELPER_H__ */
|
||||
|
@@ -70,6 +70,7 @@ struct dma_buf *drm_gem_prime_export(struct drm_device *dev,
|
||||
int drm_gem_prime_handle_to_fd(struct drm_device *dev,
|
||||
struct drm_file *file_priv, uint32_t handle, uint32_t flags,
|
||||
int *prime_fd);
|
||||
int drm_gem_prime_mmap(struct drm_gem_object *obj, struct vm_area_struct *vma);
|
||||
struct drm_gem_object *drm_gem_prime_import(struct drm_device *dev,
|
||||
struct dma_buf *dma_buf);
|
||||
|
||||
|
@@ -30,15 +30,10 @@
|
||||
|
||||
struct drm_syncobj_cb;
|
||||
|
||||
enum drm_syncobj_type {
|
||||
DRM_SYNCOBJ_TYPE_BINARY,
|
||||
DRM_SYNCOBJ_TYPE_TIMELINE
|
||||
};
|
||||
|
||||
/**
|
||||
* struct drm_syncobj - sync object.
|
||||
*
|
||||
* This structure defines a generic sync object which is timeline based.
|
||||
* This structure defines a generic sync object which wraps a &dma_fence.
|
||||
*/
|
||||
struct drm_syncobj {
|
||||
/**
|
||||
@@ -46,42 +41,21 @@ struct drm_syncobj {
|
||||
*/
|
||||
struct kref refcount;
|
||||
/**
|
||||
* @type: indicate syncobj type
|
||||
* @fence:
|
||||
* NULL or a pointer to the fence bound to this object.
|
||||
*
|
||||
* This field should not be used directly. Use drm_syncobj_fence_get()
|
||||
* and drm_syncobj_replace_fence() instead.
|
||||
*/
|
||||
enum drm_syncobj_type type;
|
||||
struct dma_fence __rcu *fence;
|
||||
/**
|
||||
* @wq: wait signal operation work queue
|
||||
* @cb_list: List of callbacks to call when the &fence gets replaced.
|
||||
*/
|
||||
wait_queue_head_t wq;
|
||||
/**
|
||||
* @timeline_context: fence context used by timeline
|
||||
*/
|
||||
u64 timeline_context;
|
||||
/**
|
||||
* @timeline: syncobj timeline value, which indicates point is signaled.
|
||||
*/
|
||||
u64 timeline;
|
||||
/**
|
||||
* @signal_point: which indicates the latest signaler point.
|
||||
*/
|
||||
u64 signal_point;
|
||||
/**
|
||||
* @signal_pt_list: signaler point list.
|
||||
*/
|
||||
struct list_head signal_pt_list;
|
||||
|
||||
/**
|
||||
* @cb_list: List of callbacks to call when the &fence gets replaced.
|
||||
*/
|
||||
struct list_head cb_list;
|
||||
/**
|
||||
* @pt_lock: Protects pt list.
|
||||
* @lock: Protects &cb_list and write-locks &fence.
|
||||
*/
|
||||
spinlock_t pt_lock;
|
||||
/**
|
||||
* @cb_mutex: Protects syncobj cb list.
|
||||
*/
|
||||
struct mutex cb_mutex;
|
||||
spinlock_t lock;
|
||||
/**
|
||||
* @file: A file backing for this syncobj.
|
||||
*/
|
||||
@@ -94,7 +68,7 @@ typedef void (*drm_syncobj_func_t)(struct drm_syncobj *syncobj,
|
||||
/**
|
||||
* struct drm_syncobj_cb - callback for drm_syncobj_add_callback
|
||||
* @node: used by drm_syncob_add_callback to append this struct to
|
||||
* &drm_syncobj.cb_list
|
||||
* &drm_syncobj.cb_list
|
||||
* @func: drm_syncobj_func_t to call
|
||||
*
|
||||
* This struct will be initialized by drm_syncobj_add_callback, additional
|
||||
@@ -132,6 +106,29 @@ drm_syncobj_put(struct drm_syncobj *obj)
|
||||
kref_put(&obj->refcount, drm_syncobj_free);
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_syncobj_fence_get - get a reference to a fence in a sync object
|
||||
* @syncobj: sync object.
|
||||
*
|
||||
* This acquires additional reference to &drm_syncobj.fence contained in @obj,
|
||||
* if not NULL. It is illegal to call this without already holding a reference.
|
||||
* No locks required.
|
||||
*
|
||||
* Returns:
|
||||
* Either the fence of @obj or NULL if there's none.
|
||||
*/
|
||||
static inline struct dma_fence *
|
||||
drm_syncobj_fence_get(struct drm_syncobj *syncobj)
|
||||
{
|
||||
struct dma_fence *fence;
|
||||
|
||||
rcu_read_lock();
|
||||
fence = dma_fence_get_rcu_safe(&syncobj->fence);
|
||||
rcu_read_unlock();
|
||||
|
||||
return fence;
|
||||
}
|
||||
|
||||
struct drm_syncobj *drm_syncobj_find(struct drm_file *file_private,
|
||||
u32 handle);
|
||||
void drm_syncobj_replace_fence(struct drm_syncobj *syncobj, u64 point,
|
||||
@@ -145,7 +142,5 @@ int drm_syncobj_create(struct drm_syncobj **out_syncobj, uint32_t flags,
|
||||
int drm_syncobj_get_handle(struct drm_file *file_private,
|
||||
struct drm_syncobj *syncobj, u32 *handle);
|
||||
int drm_syncobj_get_fd(struct drm_syncobj *syncobj, int *p_fd);
|
||||
int drm_syncobj_search_fence(struct drm_syncobj *syncobj, u64 point, u64 flags,
|
||||
struct dma_fence **fence);
|
||||
|
||||
#endif
|
||||
|
@@ -10,10 +10,15 @@
|
||||
#ifndef __LINUX_TINYDRM_H
|
||||
#define __LINUX_TINYDRM_H
|
||||
|
||||
#include <drm/drm_gem_cma_helper.h>
|
||||
#include <drm/drm_fb_cma_helper.h>
|
||||
#include <linux/mutex.h>
|
||||
#include <drm/drm_simple_kms_helper.h>
|
||||
|
||||
struct drm_clip_rect;
|
||||
struct drm_driver;
|
||||
struct drm_file;
|
||||
struct drm_framebuffer;
|
||||
struct drm_framebuffer_funcs;
|
||||
|
||||
/**
|
||||
* struct tinydrm_device - tinydrm device
|
||||
*/
|
||||
@@ -53,27 +58,6 @@ pipe_to_tinydrm(struct drm_simple_display_pipe *pipe)
|
||||
return container_of(pipe, struct tinydrm_device, pipe);
|
||||
}
|
||||
|
||||
/**
|
||||
* TINYDRM_GEM_DRIVER_OPS - default tinydrm gem operations
|
||||
*
|
||||
* This macro provides a shortcut for setting the tinydrm GEM operations in
|
||||
* the &drm_driver structure.
|
||||
*/
|
||||
#define TINYDRM_GEM_DRIVER_OPS \
|
||||
.gem_free_object_unlocked = tinydrm_gem_cma_free_object, \
|
||||
.gem_print_info = drm_gem_cma_print_info, \
|
||||
.gem_vm_ops = &drm_gem_cma_vm_ops, \
|
||||
.prime_handle_to_fd = drm_gem_prime_handle_to_fd, \
|
||||
.prime_fd_to_handle = drm_gem_prime_fd_to_handle, \
|
||||
.gem_prime_import = drm_gem_prime_import, \
|
||||
.gem_prime_export = drm_gem_prime_export, \
|
||||
.gem_prime_get_sg_table = drm_gem_cma_prime_get_sg_table, \
|
||||
.gem_prime_import_sg_table = tinydrm_gem_cma_prime_import_sg_table, \
|
||||
.gem_prime_vmap = drm_gem_cma_prime_vmap, \
|
||||
.gem_prime_vunmap = drm_gem_cma_prime_vunmap, \
|
||||
.gem_prime_mmap = drm_gem_cma_prime_mmap, \
|
||||
.dumb_create = drm_gem_cma_dumb_create
|
||||
|
||||
/**
|
||||
* TINYDRM_MODE - tinydrm display mode
|
||||
* @hd: Horizontal resolution, width
|
||||
@@ -97,11 +81,6 @@ pipe_to_tinydrm(struct drm_simple_display_pipe *pipe)
|
||||
.type = DRM_MODE_TYPE_DRIVER, \
|
||||
.clock = 1 /* pass validation */
|
||||
|
||||
void tinydrm_gem_cma_free_object(struct drm_gem_object *gem_obj);
|
||||
struct drm_gem_object *
|
||||
tinydrm_gem_cma_prime_import_sg_table(struct drm_device *drm,
|
||||
struct dma_buf_attachment *attach,
|
||||
struct sg_table *sgt);
|
||||
int devm_tinydrm_init(struct device *parent, struct tinydrm_device *tdev,
|
||||
const struct drm_framebuffer_funcs *fb_funcs,
|
||||
struct drm_driver *driver);
|
||||
|
@@ -717,7 +717,6 @@ struct drm_prime_handle {
|
||||
struct drm_syncobj_create {
|
||||
__u32 handle;
|
||||
#define DRM_SYNCOBJ_CREATE_SIGNALED (1 << 0)
|
||||
#define DRM_SYNCOBJ_CREATE_TYPE_TIMELINE (1 << 1)
|
||||
__u32 flags;
|
||||
};
|
||||
|
||||
|
@@ -151,6 +151,7 @@ extern "C" {
|
||||
#define DRM_FORMAT_VYUY fourcc_code('V', 'Y', 'U', 'Y') /* [31:0] Y1:Cb0:Y0:Cr0 8:8:8:8 little endian */
|
||||
|
||||
#define DRM_FORMAT_AYUV fourcc_code('A', 'Y', 'U', 'V') /* [31:0] A:Y:Cb:Cr 8:8:8:8 little endian */
|
||||
#define DRM_FORMAT_XYUV8888 fourcc_code('X', 'Y', 'U', 'V') /* [31:0] X:Y:Cb:Cr 8:8:8:8 little endian */
|
||||
|
||||
/*
|
||||
* packed YCbCr420 2x2 tiled formats
|
||||
|
@@ -47,6 +47,13 @@ extern "C" {
|
||||
#define DRM_VIRTGPU_WAIT 0x08
|
||||
#define DRM_VIRTGPU_GET_CAPS 0x09
|
||||
|
||||
#define VIRTGPU_EXECBUF_FENCE_FD_IN 0x01
|
||||
#define VIRTGPU_EXECBUF_FENCE_FD_OUT 0x02
|
||||
#define VIRTGPU_EXECBUF_FLAGS (\
|
||||
VIRTGPU_EXECBUF_FENCE_FD_IN |\
|
||||
VIRTGPU_EXECBUF_FENCE_FD_OUT |\
|
||||
0)
|
||||
|
||||
struct drm_virtgpu_map {
|
||||
__u64 offset; /* use for mmap system call */
|
||||
__u32 handle;
|
||||
@@ -54,12 +61,12 @@ struct drm_virtgpu_map {
|
||||
};
|
||||
|
||||
struct drm_virtgpu_execbuffer {
|
||||
__u32 flags; /* for future use */
|
||||
__u32 flags;
|
||||
__u32 size;
|
||||
__u64 command; /* void* */
|
||||
__u64 bo_handles;
|
||||
__u32 num_bo_handles;
|
||||
__u32 pad;
|
||||
__s32 fence_fd; /* in/out fence fd (see VIRTGPU_EXECBUF_FENCE_FD_IN/OUT) */
|
||||
};
|
||||
|
||||
#define VIRTGPU_PARAM_3D_FEATURES 1 /* do we have 3D features in the hw */
|
||||
@@ -137,7 +144,7 @@ struct drm_virtgpu_get_caps {
|
||||
DRM_IOWR(DRM_COMMAND_BASE + DRM_VIRTGPU_MAP, struct drm_virtgpu_map)
|
||||
|
||||
#define DRM_IOCTL_VIRTGPU_EXECBUFFER \
|
||||
DRM_IOW(DRM_COMMAND_BASE + DRM_VIRTGPU_EXECBUFFER,\
|
||||
DRM_IOWR(DRM_COMMAND_BASE + DRM_VIRTGPU_EXECBUFFER,\
|
||||
struct drm_virtgpu_execbuffer)
|
||||
|
||||
#define DRM_IOCTL_VIRTGPU_GETPARAM \
|
||||
|
Reference in New Issue
Block a user