Merge tag 'drm-misc-next-2018-04-26' of git://anongit.freedesktop.org/drm/drm-misc into drm-next
drm-misc-next for v4.18: UAPI Changes: - Add support for a generic plane alpha property to sun4i, rcar-du and atmel-hclcdc. (Maxime) Core Changes: - Stop looking at legacy plane->fb and crtc members in atomic drivers. (Ville) - mode_valid return type fixes. (Luc) - Handle zpos normalization in the core. (Peter) Driver Changes: - Implement CTM, plane alpha and generic async cursor support in vc4. (Stefan) - Various fixes for HPD and aux chan in drm_bridge/analogix_dp. (Lin, Zain, Douglas) - Add support for MIPI DSI to sun4i. (Maxime) Signed-off-by: Dave Airlie <airlied@redhat.com> # gpg: Signature made Thu 26 Apr 2018 08:21:01 PM AEST # gpg: using RSA key FE558C72A67013C3 # gpg: Can't check signature: public key not found Link: https://patchwork.freedesktop.org/patch/msgid/b33da7eb-efc9-ae6f-6f69-b7acd6df6797@mblankhorst.nl
This commit is contained in:
@@ -33,7 +33,8 @@ struct analogix_dp_plat_data {
|
||||
struct drm_connector *connector;
|
||||
bool skip_connector;
|
||||
|
||||
int (*power_on)(struct analogix_dp_plat_data *);
|
||||
int (*power_on_start)(struct analogix_dp_plat_data *);
|
||||
int (*power_on_end)(struct analogix_dp_plat_data *);
|
||||
int (*power_off)(struct analogix_dp_plat_data *);
|
||||
int (*attach)(struct analogix_dp_plat_data *, struct drm_bridge *,
|
||||
struct drm_connector *);
|
||||
|
@@ -95,14 +95,6 @@ struct dma_buf_attachment;
|
||||
struct pci_dev;
|
||||
struct pci_controller;
|
||||
|
||||
/***********************************************************************/
|
||||
/** \name DRM template customization defaults */
|
||||
/*@{*/
|
||||
|
||||
/***********************************************************************/
|
||||
/** \name Internal types and structures */
|
||||
/*@{*/
|
||||
|
||||
#define DRM_IF_VERSION(maj, min) (maj << 16 | min)
|
||||
|
||||
/**
|
||||
@@ -123,27 +115,13 @@ static inline bool drm_drv_uses_atomic_modeset(struct drm_device *dev)
|
||||
#define DRM_SWITCH_POWER_CHANGING 2
|
||||
#define DRM_SWITCH_POWER_DYNAMIC_OFF 3
|
||||
|
||||
static __inline__ int drm_core_check_feature(struct drm_device *dev,
|
||||
int feature)
|
||||
static inline bool drm_core_check_feature(struct drm_device *dev, int feature)
|
||||
{
|
||||
return ((dev->driver->driver_features & feature) ? 1 : 0);
|
||||
return dev->driver->driver_features & feature;
|
||||
}
|
||||
|
||||
/******************************************************************/
|
||||
/** \name Internal function definitions */
|
||||
/*@{*/
|
||||
|
||||
/* Driver support (drm_drv.h) */
|
||||
|
||||
/*
|
||||
* These are exported to drivers so that they can implement fencing using
|
||||
* DMA quiscent + idle. DMA quiescent usually requires the hardware lock.
|
||||
*/
|
||||
|
||||
/*@}*/
|
||||
|
||||
/* returns true if currently okay to sleep */
|
||||
static __inline__ bool drm_can_sleep(void)
|
||||
static inline bool drm_can_sleep(void)
|
||||
{
|
||||
if (in_atomic() || in_dbg_master() || irqs_disabled())
|
||||
return false;
|
||||
|
@@ -36,6 +36,9 @@ static inline bool drm_rotation_90_or_270(unsigned int rotation)
|
||||
return rotation & (DRM_MODE_ROTATE_90 | DRM_MODE_ROTATE_270);
|
||||
}
|
||||
|
||||
#define DRM_BLEND_ALPHA_OPAQUE 0xffff
|
||||
|
||||
int drm_plane_create_alpha_property(struct drm_plane *plane);
|
||||
int drm_plane_create_rotation_property(struct drm_plane *plane,
|
||||
unsigned int rotation,
|
||||
unsigned int supported_rotations);
|
||||
|
@@ -46,7 +46,14 @@ struct drm_device {
|
||||
/* currently active master for this device. Protected by master_mutex */
|
||||
struct drm_master *master;
|
||||
|
||||
atomic_t unplugged; /**< Flag whether dev is dead */
|
||||
/**
|
||||
* @unplugged:
|
||||
*
|
||||
* Flag to tell if the device has been unplugged.
|
||||
* See drm_dev_enter() and drm_dev_is_unplugged().
|
||||
*/
|
||||
bool unplugged;
|
||||
|
||||
struct inode *anon_inode; /**< inode for private address-space */
|
||||
char *unique; /**< unique name of the device */
|
||||
/*@} */
|
||||
|
@@ -624,6 +624,8 @@ void drm_dev_get(struct drm_device *dev);
|
||||
void drm_dev_put(struct drm_device *dev);
|
||||
void drm_dev_unref(struct drm_device *dev);
|
||||
void drm_put_dev(struct drm_device *dev);
|
||||
bool drm_dev_enter(struct drm_device *dev, int *idx);
|
||||
void drm_dev_exit(int idx);
|
||||
void drm_dev_unplug(struct drm_device *dev);
|
||||
|
||||
/**
|
||||
@@ -635,11 +637,16 @@ void drm_dev_unplug(struct drm_device *dev);
|
||||
* 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)
|
||||
static inline bool drm_dev_is_unplugged(struct drm_device *dev)
|
||||
{
|
||||
int ret = atomic_read(&dev->unplugged);
|
||||
smp_rmb();
|
||||
return ret;
|
||||
int idx;
|
||||
|
||||
if (drm_dev_enter(dev, &idx)) {
|
||||
drm_dev_exit(idx);
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
|
@@ -465,8 +465,6 @@ struct edid *drm_get_edid(struct drm_connector *connector,
|
||||
struct edid *drm_get_edid_switcheroo(struct drm_connector *connector,
|
||||
struct i2c_adapter *adapter);
|
||||
struct edid *drm_edid_duplicate(const struct edid *edid);
|
||||
void drm_reset_display_info(struct drm_connector *connector);
|
||||
u32 drm_add_display_info(struct drm_connector *connector, const struct edid *edid);
|
||||
int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid);
|
||||
|
||||
u8 drm_match_cea_mode(const struct drm_display_mode *to_match);
|
||||
|
@@ -10,6 +10,7 @@ struct drm_gem_object;
|
||||
struct drm_mode_fb_cmd2;
|
||||
struct drm_plane;
|
||||
struct drm_plane_state;
|
||||
struct drm_simple_display_pipe;
|
||||
|
||||
struct drm_gem_object *drm_gem_fb_get_obj(struct drm_framebuffer *fb,
|
||||
unsigned int plane);
|
||||
@@ -27,6 +28,8 @@ drm_gem_fb_create(struct drm_device *dev, struct drm_file *file,
|
||||
|
||||
int drm_gem_fb_prepare_fb(struct drm_plane *plane,
|
||||
struct drm_plane_state *state);
|
||||
int drm_gem_fb_simple_display_pipe_prepare_fb(struct drm_simple_display_pipe *pipe,
|
||||
struct drm_plane_state *plane_state);
|
||||
|
||||
struct drm_framebuffer *
|
||||
drm_gem_fbdev_fb_create(struct drm_device *dev,
|
||||
|
@@ -194,8 +194,8 @@ void drm_legacy_ioremap(struct drm_local_map *map, struct drm_device *dev);
|
||||
void drm_legacy_ioremap_wc(struct drm_local_map *map, struct drm_device *dev);
|
||||
void drm_legacy_ioremapfree(struct drm_local_map *map, struct drm_device *dev);
|
||||
|
||||
static __inline__ struct drm_local_map *drm_legacy_findmap(struct drm_device *dev,
|
||||
unsigned int token)
|
||||
static inline struct drm_local_map *drm_legacy_findmap(struct drm_device *dev,
|
||||
unsigned int token)
|
||||
{
|
||||
struct drm_map_list *_entry;
|
||||
list_for_each_entry(_entry, &dev->maplist, head)
|
||||
|
@@ -795,6 +795,14 @@ struct drm_mode_config {
|
||||
*/
|
||||
bool allow_fb_modifiers;
|
||||
|
||||
/**
|
||||
* @normalize_zpos:
|
||||
*
|
||||
* If true the drm core will call drm_atomic_normalize_zpos() as part of
|
||||
* atomic mode checking from drm_atomic_helper_check()
|
||||
*/
|
||||
bool normalize_zpos;
|
||||
|
||||
/**
|
||||
* @modifiers_property: Plane property to list support modifier/format
|
||||
* combination.
|
||||
|
@@ -1004,11 +1004,14 @@ struct drm_plane_helper_funcs {
|
||||
* This function must not block for outstanding rendering, since it is
|
||||
* called in the context of the atomic IOCTL even for async commits to
|
||||
* be able to return any errors to userspace. Instead the recommended
|
||||
* way is to fill out the fence member of the passed-in
|
||||
* way is to fill out the &drm_plane_state.fence of the passed-in
|
||||
* &drm_plane_state. If the driver doesn't support native fences then
|
||||
* equivalent functionality should be implemented through private
|
||||
* members in the plane structure.
|
||||
*
|
||||
* Drivers which always have their buffers pinned should use
|
||||
* drm_gem_fb_prepare_fb() for this hook.
|
||||
*
|
||||
* The helpers will call @cleanup_fb with matching arguments for every
|
||||
* successful call to this hook.
|
||||
*
|
||||
|
@@ -43,6 +43,7 @@ struct drm_modeset_acquire_ctx;
|
||||
* plane (in 16.16)
|
||||
* @src_w: width of visible portion of plane (in 16.16)
|
||||
* @src_h: height of visible portion of plane (in 16.16)
|
||||
* @alpha: opacity of the plane
|
||||
* @rotation: rotation of the plane
|
||||
* @zpos: priority of the given plane on crtc (optional)
|
||||
* Note that multiple active planes on the same crtc can have an identical
|
||||
@@ -51,8 +52,8 @@ struct drm_modeset_acquire_ctx;
|
||||
* plane with a lower ID.
|
||||
* @normalized_zpos: normalized value of zpos: unique, range from 0 to N-1
|
||||
* where N is the number of active planes for given crtc. Note that
|
||||
* the driver must call drm_atomic_normalize_zpos() to update this before
|
||||
* it can be trusted.
|
||||
* the driver must set drm_mode_config.normalize_zpos or call
|
||||
* drm_atomic_normalize_zpos() to update this before it can be trusted.
|
||||
* @src: clipped source coordinates of the plane (in 16.16)
|
||||
* @dst: clipped destination coordinates of the plane
|
||||
* @state: backpointer to global drm_atomic_state
|
||||
@@ -79,8 +80,15 @@ struct drm_plane_state {
|
||||
/**
|
||||
* @fence:
|
||||
*
|
||||
* Optional fence to wait for before scanning out @fb. Do not write this
|
||||
* directly, use drm_atomic_set_fence_for_plane()
|
||||
* Optional fence to wait for before scanning out @fb. The core atomic
|
||||
* code will set this when userspace is using explicit fencing. Do not
|
||||
* write this directly for a driver's implicit fence, use
|
||||
* drm_atomic_set_fence_for_plane() to ensure that an explicit fence is
|
||||
* preserved.
|
||||
*
|
||||
* Drivers should store any implicit fence in this from their
|
||||
* &drm_plane_helper.prepare_fb callback. See drm_gem_fb_prepare_fb()
|
||||
* and drm_gem_fb_simple_display_pipe_prepare_fb() for suitable helpers.
|
||||
*/
|
||||
struct dma_fence *fence;
|
||||
|
||||
@@ -106,6 +114,9 @@ struct drm_plane_state {
|
||||
uint32_t src_x, src_y;
|
||||
uint32_t src_h, src_w;
|
||||
|
||||
/* Plane opacity */
|
||||
u16 alpha;
|
||||
|
||||
/* Plane rotation */
|
||||
unsigned int rotation;
|
||||
|
||||
@@ -496,6 +507,7 @@ enum drm_plane_type {
|
||||
* @funcs: helper functions
|
||||
* @properties: property tracking for this plane
|
||||
* @type: type of plane (overlay, primary, cursor)
|
||||
* @alpha_property: alpha property for this plane
|
||||
* @zpos_property: zpos property for this plane
|
||||
* @rotation_property: rotation property for this plane
|
||||
* @helper_private: mid-layer private data
|
||||
@@ -571,6 +583,7 @@ struct drm_plane {
|
||||
*/
|
||||
struct drm_plane_state *state;
|
||||
|
||||
struct drm_property *alpha_property;
|
||||
struct drm_property *zpos_property;
|
||||
struct drm_property *rotation_property;
|
||||
|
||||
|
@@ -280,32 +280,6 @@ bool drm_property_replace_blob(struct drm_property_blob **blob,
|
||||
struct drm_property_blob *drm_property_blob_get(struct drm_property_blob *blob);
|
||||
void drm_property_blob_put(struct drm_property_blob *blob);
|
||||
|
||||
/**
|
||||
* drm_property_reference_blob - acquire a blob property reference
|
||||
* @blob: DRM blob property
|
||||
*
|
||||
* This is a compatibility alias for drm_property_blob_get() and should not be
|
||||
* used by new code.
|
||||
*/
|
||||
static inline struct drm_property_blob *
|
||||
drm_property_reference_blob(struct drm_property_blob *blob)
|
||||
{
|
||||
return drm_property_blob_get(blob);
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_property_unreference_blob - release a blob property reference
|
||||
* @blob: DRM blob property
|
||||
*
|
||||
* This is a compatibility alias for drm_property_blob_put() and should not be
|
||||
* used by new code.
|
||||
*/
|
||||
static inline void
|
||||
drm_property_unreference_blob(struct drm_property_blob *blob)
|
||||
{
|
||||
drm_property_blob_put(blob);
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_property_find - find property object
|
||||
* @dev: DRM device
|
||||
|
@@ -64,7 +64,8 @@ struct drm_simple_display_pipe_funcs {
|
||||
* This hook is optional.
|
||||
*/
|
||||
void (*enable)(struct drm_simple_display_pipe *pipe,
|
||||
struct drm_crtc_state *crtc_state);
|
||||
struct drm_crtc_state *crtc_state,
|
||||
struct drm_plane_state *plane_state);
|
||||
/**
|
||||
* @disable:
|
||||
*
|
||||
@@ -115,6 +116,9 @@ struct drm_simple_display_pipe_funcs {
|
||||
* Optional, called by &drm_plane_helper_funcs.prepare_fb. Please read
|
||||
* the documentation for the &drm_plane_helper_funcs.prepare_fb hook for
|
||||
* more details.
|
||||
*
|
||||
* Drivers which always have their buffers pinned should use
|
||||
* drm_gem_fb_simple_display_pipe_prepare_fb() for this hook.
|
||||
*/
|
||||
int (*prepare_fb)(struct drm_simple_display_pipe *pipe,
|
||||
struct drm_plane_state *plane_state);
|
||||
|
@@ -67,7 +67,9 @@ int mipi_dbi_init(struct device *dev, struct mipi_dbi *mipi,
|
||||
const struct drm_simple_display_pipe_funcs *pipe_funcs,
|
||||
struct drm_driver *driver,
|
||||
const struct drm_display_mode *mode, unsigned int rotation);
|
||||
void mipi_dbi_enable_flush(struct mipi_dbi *mipi);
|
||||
void mipi_dbi_enable_flush(struct mipi_dbi *mipi,
|
||||
struct drm_crtc_state *crtc_state,
|
||||
struct drm_plane_state *plan_state);
|
||||
void mipi_dbi_pipe_disable(struct drm_simple_display_pipe *pipe);
|
||||
void mipi_dbi_hw_reset(struct mipi_dbi *mipi);
|
||||
bool mipi_dbi_display_is_on(struct mipi_dbi *mipi);
|
||||
|
@@ -36,6 +36,11 @@ static inline bool tinydrm_machine_little_endian(void)
|
||||
bool tinydrm_merge_clips(struct drm_clip_rect *dst,
|
||||
struct drm_clip_rect *src, unsigned int num_clips,
|
||||
unsigned int flags, u32 max_width, u32 max_height);
|
||||
int tinydrm_fb_dirty(struct drm_framebuffer *fb,
|
||||
struct drm_file *file_priv,
|
||||
unsigned int flags, unsigned int color,
|
||||
struct drm_clip_rect *clips,
|
||||
unsigned int num_clips);
|
||||
void tinydrm_memcpy(void *dst, void *vaddr, struct drm_framebuffer *fb,
|
||||
struct drm_clip_rect *clip);
|
||||
void tinydrm_swab16(u16 *dst, void *vaddr, struct drm_framebuffer *fb,
|
||||
|
@@ -26,6 +26,10 @@ struct tinydrm_device {
|
||||
struct drm_simple_display_pipe pipe;
|
||||
struct mutex dirty_lock;
|
||||
const struct drm_framebuffer_funcs *fb_funcs;
|
||||
int (*fb_dirty)(struct drm_framebuffer *framebuffer,
|
||||
struct drm_file *file_priv, unsigned flags,
|
||||
unsigned color, struct drm_clip_rect *clips,
|
||||
unsigned num_clips);
|
||||
};
|
||||
|
||||
static inline struct tinydrm_device *
|
||||
@@ -41,7 +45,7 @@ pipe_to_tinydrm(struct drm_simple_display_pipe *pipe)
|
||||
* the &drm_driver structure.
|
||||
*/
|
||||
#define TINYDRM_GEM_DRIVER_OPS \
|
||||
.gem_free_object = tinydrm_gem_cma_free_object, \
|
||||
.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, \
|
||||
@@ -91,8 +95,6 @@ void tinydrm_shutdown(struct tinydrm_device *tdev);
|
||||
|
||||
void tinydrm_display_pipe_update(struct drm_simple_display_pipe *pipe,
|
||||
struct drm_plane_state *old_state);
|
||||
int tinydrm_display_pipe_prepare_fb(struct drm_simple_display_pipe *pipe,
|
||||
struct drm_plane_state *plane_state);
|
||||
int
|
||||
tinydrm_display_pipe_init(struct tinydrm_device *tdev,
|
||||
const struct drm_simple_display_pipe_funcs *funcs,
|
||||
|
Reference in New Issue
Block a user