prepare for atomic/nuclear modeset/pageflip (vN+1)
Subsystems (18)
cover prepare for atomic/nuclear modeset/pageflip (vN+1)
Based on top of the 'prepare for preparing for atomic (v2)' series.
Since previous version posted, reshuffled a few things to pull some changes ahead of atomic (in 'prepare for preparing..' patchset), and few little fixes.
This patchset may be a bit more controversial for merging 3.16, but I think it is worth considering. It certainly will need a few tweaks as some drivers add native atomic support. And to handle all cases when we actually expose the atomic ioctl to userspace, I think we will need at least per-plane locks.
But merging now unblocks driver work. And I think the further changes needed should not have much impact on drivers, at least no less than if we merged atomic later.
Can be found at:
http://cgit.freedesktop.org/~robclark/linux/log/?h=cold-fusion
git://people.freedesktop.org/~robclark/linux cold-fusion
Rob Clark (5):
drm: add atomic fxns
drm: split propvals out and blob property support
drm: convert plane to properties/state
drm: convert crtc to properties/state drm/msm: add atomic support
Sean Paul (1):
drm: Fix up the atomic legacy paths so they work
Ville Syrjälä (1):
drm: Refactor object property check code
drivers/gpu/drm/Makefile | 2 +- drivers/gpu/drm/armada/armada_crtc.c | 14 +- drivers/gpu/drm/armada/armada_output.c | 3 +- drivers/gpu/drm/armada/armada_overlay.c | 14 +- drivers/gpu/drm/ast/ast_drv.c | 6 + drivers/gpu/drm/ast/ast_drv.h | 1 + drivers/gpu/drm/ast/ast_mode.c | 1 + drivers/gpu/drm/cirrus/cirrus_drv.c | 6 + drivers/gpu/drm/cirrus/cirrus_drv.h | 1 + drivers/gpu/drm/cirrus/cirrus_mode.c | 1 + drivers/gpu/drm/drm_atomic.c | 724 +++++++++++++++ drivers/gpu/drm/drm_crtc.c | 1268 ++++++++++++++++++--------- drivers/gpu/drm/drm_fb_helper.c | 55 +- drivers/gpu/drm/drm_modeset_lock.c | 28 + drivers/gpu/drm/drm_plane_helper.c | 2 + drivers/gpu/drm/exynos/exynos_drm_crtc.c | 11 +- drivers/gpu/drm/exynos/exynos_drm_drv.c | 7 + drivers/gpu/drm/exynos/exynos_drm_plane.c | 11 +- drivers/gpu/drm/gma500/cdv_intel_crt.c | 4 +- drivers/gpu/drm/gma500/cdv_intel_display.c | 1 + drivers/gpu/drm/gma500/cdv_intel_dp.c | 7 +- drivers/gpu/drm/gma500/cdv_intel_hdmi.c | 7 +- drivers/gpu/drm/gma500/cdv_intel_lvds.c | 10 +- drivers/gpu/drm/gma500/mdfld_dsi_output.c | 12 +- drivers/gpu/drm/gma500/psb_drv.c | 7 + drivers/gpu/drm/gma500/psb_drv.h | 1 + drivers/gpu/drm/gma500/psb_intel_display.c | 1 + drivers/gpu/drm/gma500/psb_intel_drv.h | 4 +- drivers/gpu/drm/gma500/psb_intel_lvds.c | 10 +- drivers/gpu/drm/gma500/psb_intel_sdvo.c | 23 +- drivers/gpu/drm/i2c/ch7006_drv.c | 4 +- drivers/gpu/drm/i915/i915_drv.c | 8 + drivers/gpu/drm/i915/intel_crt.c | 4 +- drivers/gpu/drm/i915/intel_display.c | 4 +- drivers/gpu/drm/i915/intel_dp.c | 7 +- drivers/gpu/drm/i915/intel_drv.h | 1 + drivers/gpu/drm/i915/intel_hdmi.c | 7 +- drivers/gpu/drm/i915/intel_lvds.c | 4 +- drivers/gpu/drm/i915/intel_sdvo.c | 23 +- drivers/gpu/drm/i915/intel_sprite.c | 1 + drivers/gpu/drm/i915/intel_tv.c | 12 +- drivers/gpu/drm/mgag200/mgag200_drv.c | 7 + drivers/gpu/drm/mgag200/mgag200_drv.h | 1 + drivers/gpu/drm/mgag200/mgag200_mode.c | 1 + drivers/gpu/drm/msm/Makefile | 1 + drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c | 66 +- drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c | 6 + drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.h | 1 + drivers/gpu/drm/msm/mdp/mdp4/mdp4_plane.c | 14 +- drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c | 65 +- drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c | 6 + drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.h | 2 +- drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c | 14 +- drivers/gpu/drm/msm/msm_atomic.c | 141 +++ drivers/gpu/drm/msm/msm_drv.c | 26 + drivers/gpu/drm/msm/msm_drv.h | 8 + drivers/gpu/drm/msm/msm_gem.c | 24 +- drivers/gpu/drm/msm/msm_gem.h | 13 + drivers/gpu/drm/msm/msm_kms.h | 1 + drivers/gpu/drm/nouveau/dispnv04/crtc.c | 1 + drivers/gpu/drm/nouveau/dispnv04/overlay.c | 13 +- drivers/gpu/drm/nouveau/dispnv04/tvnv17.c | 3 +- drivers/gpu/drm/nouveau/nouveau_connector.c | 7 +- drivers/gpu/drm/nouveau/nouveau_drm.c | 7 + drivers/gpu/drm/nouveau/nouveau_drm.h | 1 + drivers/gpu/drm/nouveau/nv50_display.c | 1 + drivers/gpu/drm/omapdrm/omap_crtc.c | 16 +- drivers/gpu/drm/omapdrm/omap_drv.c | 12 +- drivers/gpu/drm/omapdrm/omap_drv.h | 4 +- drivers/gpu/drm/omapdrm/omap_plane.c | 10 +- drivers/gpu/drm/qxl/qxl_display.c | 6 +- drivers/gpu/drm/qxl/qxl_drv.c | 9 + drivers/gpu/drm/radeon/radeon_connectors.c | 9 +- drivers/gpu/drm/radeon/radeon_display.c | 2 + drivers/gpu/drm/radeon/radeon_drv.c | 9 + drivers/gpu/drm/rcar-du/rcar_du_crtc.c | 2 + drivers/gpu/drm/rcar-du/rcar_du_drv.c | 7 + drivers/gpu/drm/rcar-du/rcar_du_lvdscon.c | 3 +- drivers/gpu/drm/rcar-du/rcar_du_plane.c | 12 +- drivers/gpu/drm/rcar-du/rcar_du_vgacon.c | 3 +- drivers/gpu/drm/shmobile/shmob_drm_crtc.c | 6 +- drivers/gpu/drm/shmobile/shmob_drm_drv.c | 7 + drivers/gpu/drm/shmobile/shmob_drm_plane.c | 2 + drivers/gpu/drm/tilcdc/tilcdc_crtc.c | 1 + drivers/gpu/drm/tilcdc/tilcdc_drv.c | 6 + drivers/gpu/drm/tilcdc/tilcdc_drv.h | 1 + drivers/gpu/drm/tilcdc/tilcdc_slave.c | 3 +- drivers/gpu/drm/udl/udl_connector.c | 6 +- drivers/gpu/drm/udl/udl_drv.c | 8 + drivers/gpu/drm/udl/udl_modeset.c | 2 + drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | 7 + drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | 1 + drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 4 +- drivers/gpu/drm/vmwgfx/vmwgfx_kms.h | 4 +- drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c | 1 + drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c | 1 + include/drm/drmP.h | 80 ++ include/drm/drm_atomic.h | 170 ++++ include/drm/drm_crtc.h | 238 ++++- include/drm/drm_modeset_lock.h | 41 + include/uapi/drm/drm_mode.h | 3 + 101 files changed, 2815 insertions(+), 628 deletions(-) create mode 100644 drivers/gpu/drm/drm_atomic.c create mode 100644 drivers/gpu/drm/msm/msm_atomic.c create mode 100644 include/drm/drm_atomic.h
Signature · 6 lines
1.9.3 _______________________________________________ dri-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/dri-devel
PATCH 1/7 drm: add atomic fxns
The 'atomic' mechanism allows for multiple properties to be updated, checked, and commited atomically. This will be the basis of atomic- modeset and nuclear-pageflip.
The basic flow is:
state = dev->atomic_begin();
for (... one or more ...)
obj->set_property(obj, state, prop, value);
if (dev->atomic_check(state))
dev->atomic_commit(state);
dev->atomic_end(state);The split of check and commit steps is to allow for ioctls with a test-only flag (which would skip the commit step).
--- drivers/gpu/drm/Makefile | 2 +- drivers/gpu/drm/armada/armada_crtc.c | 3 +- drivers/gpu/drm/armada/armada_output.c | 3 +- drivers/gpu/drm/armada/armada_overlay.c | 3 +- drivers/gpu/drm/ast/ast_drv.c | 6 + drivers/gpu/drm/ast/ast_drv.h | 1 + drivers/gpu/drm/cirrus/cirrus_drv.c | 6 + drivers/gpu/drm/cirrus/cirrus_drv.h | 1 + drivers/gpu/drm/drm_atomic.c | 274 ++++++++++++++++++++++++++++ drivers/gpu/drm/drm_crtc.c | 149 +++++++++------ drivers/gpu/drm/drm_modeset_lock.c | 28 +++ drivers/gpu/drm/exynos/exynos_drm_crtc.c | 4 +- drivers/gpu/drm/exynos/exynos_drm_drv.c | 7 + drivers/gpu/drm/exynos/exynos_drm_plane.c | 4 +- drivers/gpu/drm/gma500/cdv_intel_crt.c | 4 +- drivers/gpu/drm/gma500/cdv_intel_dp.c | 4 +- drivers/gpu/drm/gma500/cdv_intel_hdmi.c | 4 +- drivers/gpu/drm/gma500/cdv_intel_lvds.c | 4 +- drivers/gpu/drm/gma500/mdfld_dsi_output.c | 4 +- drivers/gpu/drm/gma500/psb_drv.c | 7 + drivers/gpu/drm/gma500/psb_drv.h | 1 + drivers/gpu/drm/gma500/psb_intel_drv.h | 4 +- drivers/gpu/drm/gma500/psb_intel_lvds.c | 4 +- drivers/gpu/drm/gma500/psb_intel_sdvo.c | 4 +- drivers/gpu/drm/i915/i915_drv.c | 8 + drivers/gpu/drm/i915/intel_crt.c | 4 +- drivers/gpu/drm/i915/intel_dp.c | 4 +- drivers/gpu/drm/i915/intel_drv.h | 1 + drivers/gpu/drm/i915/intel_hdmi.c | 4 +- drivers/gpu/drm/i915/intel_lvds.c | 4 +- drivers/gpu/drm/i915/intel_sdvo.c | 4 +- drivers/gpu/drm/i915/intel_tv.c | 6 +- drivers/gpu/drm/mgag200/mgag200_drv.c | 7 + drivers/gpu/drm/mgag200/mgag200_drv.h | 1 + drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c | 3 +- drivers/gpu/drm/msm/mdp/mdp4/mdp4_plane.c | 3 +- drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c | 3 +- drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c | 3 +- drivers/gpu/drm/msm/msm_drv.c | 6 + drivers/gpu/drm/msm/msm_drv.h | 1 + drivers/gpu/drm/nouveau/dispnv04/overlay.c | 5 +- drivers/gpu/drm/nouveau/nouveau_connector.c | 3 +- drivers/gpu/drm/nouveau/nouveau_drm.c | 7 + drivers/gpu/drm/nouveau/nouveau_drm.h | 1 + drivers/gpu/drm/omapdrm/omap_crtc.c | 6 +- drivers/gpu/drm/omapdrm/omap_drv.c | 6 + drivers/gpu/drm/omapdrm/omap_drv.h | 4 +- drivers/gpu/drm/omapdrm/omap_plane.c | 3 +- drivers/gpu/drm/qxl/qxl_display.c | 4 +- drivers/gpu/drm/qxl/qxl_drv.c | 9 + drivers/gpu/drm/radeon/radeon_connectors.c | 9 +- drivers/gpu/drm/radeon/radeon_drv.c | 9 + drivers/gpu/drm/rcar-du/rcar_du_drv.c | 7 + drivers/gpu/drm/rcar-du/rcar_du_plane.c | 4 +- drivers/gpu/drm/shmobile/shmob_drm_drv.c | 7 + drivers/gpu/drm/tilcdc/tilcdc_drv.c | 6 + drivers/gpu/drm/tilcdc/tilcdc_drv.h | 1 + drivers/gpu/drm/tilcdc/tilcdc_slave.c | 3 +- drivers/gpu/drm/udl/udl_connector.c | 6 +- drivers/gpu/drm/udl/udl_drv.c | 8 + drivers/gpu/drm/vmwgfx/vmwgfx_drv.c | 7 + drivers/gpu/drm/vmwgfx/vmwgfx_drv.h | 1 + drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 4 +- drivers/gpu/drm/vmwgfx/vmwgfx_kms.h | 4 +- include/drm/drmP.h | 80 ++++++++ include/drm/drm_atomic.h | 114 ++++++++++++ include/drm/drm_crtc.h | 15 +- include/drm/drm_modeset_lock.h | 41 +++++ include/uapi/drm/drm_mode.h | 3 + 69 files changed, 867 insertions(+), 103 deletions(-) create mode 100644 drivers/gpu/drm/drm_atomic.c create mode 100644 include/drm/drm_atomic.h
drivers/gpu/drm/Makefile +1 -1
@@ -14,7 +14,7 @@ drm-y := drm_auth.o drm_buffer.o drm_bufs.o drm_cache.o \ drm_info.o drm_debugfs.o drm_encoder_slave.o \ drm_trace_points.o drm_global.o drm_prime.o \ drm_rect.o drm_vma_manager.o drm_flip_work.o \ - drm_plane_helper.o drm_modeset_lock.o + drm_plane_helper.o drm_modeset_lock.o drm_atomic.o drm-$(CONFIG_COMPAT) += drm_ioc32.o drm-$(CONFIG_DRM_GEM_CMA_HELPER) += drm_gem_cma_helper.o
drivers/gpu/drm/armada/armada_crtc.c +2 -1
@@ -961,7 +961,8 @@ static int armada_drm_crtc_page_flip(struct drm_crtc *crtc,static int armada_drm_crtc_set_property (struct drm_crtc *crtc, -struct drm_property *property,uint64_t val) +struct drm_atomic_state *state,struct drm_property *property, +uint64_t val,void *blob_data) {struct armada_private *priv = crtc->dev->dev_private;struct armada_crtc *dcrtc =drm_to_armada_crtc (crtc);
drivers/gpu/drm/armada/armada_output.c +2 -1
@@ -54,7 +54,8 @@ static void armada_drm_connector_destroy(struct drm_connector *conn) }static int armada_drm_connector_set_property (struct drm_connector *conn, -struct drm_property *property,uint64_t value) +struct drm_atomic_state *state,struct drm_property *property, +uint64_t value,void *blob_data) {struct armada_connector *dconn =drm_to_armada_conn (conn);
drivers/gpu/drm/armada/armada_overlay.c +2 -1
@@ -283,7 +283,8 @@ static void armada_plane_destroy(struct drm_plane *plane) }static int armada_plane_set_property (struct drm_plane *plane, -struct drm_property *property,uint64_t val) +struct drm_atomic_state *state,struct drm_property *property, +uint64_t val,void *blob_data) {struct armada_private *priv = plane->dev->dev_private;struct armada_plane *dplane =drm_to_armada_plane (plane);
drivers/gpu/drm/ast/ast_drv.c +6 -0
@@ -215,6 +215,12 @@ static struct drm_driver driver = { .dumb_map_offset = ast_dumb_mmap_offset, .dumb_destroy = drm_gem_dumb_destroy, + .atomic_begin = drm_atomic_begin, + .atomic_set_event = drm_atomic_set_event, + .atomic_check = drm_atomic_check, + .atomic_commit = drm_atomic_commit, + .atomic_end = drm_atomic_end, + .atomic_funcs = &drm_atomic_funcs, };static int __init ast_init (void )
drivers/gpu/drm/ast/ast_drv.h +1 -0
@@ -29,6 +29,7 @@#define __AST_DRV_H__#include <drm/drm_fb_helper.h> +#include <drm/drm_atomic.h> #include <drm/ttm/ttm_bo_api.h> #include <drm/ttm/ttm_bo_driver.h>
drivers/gpu/drm/cirrus/cirrus_drv.c +6 -0
@@ -137,6 +137,12 @@ static struct drm_driver driver = { .dumb_create = cirrus_dumb_create, .dumb_map_offset = cirrus_dumb_mmap_offset, .dumb_destroy = drm_gem_dumb_destroy, + .atomic_begin = drm_atomic_begin, + .atomic_set_event = drm_atomic_set_event, + .atomic_check = drm_atomic_check, + .atomic_commit = drm_atomic_commit, + .atomic_end = drm_atomic_end, + .atomic_funcs = &drm_atomic_funcs, };static const struct dev_pm_ops cirrus_pm_ops = {
drivers/gpu/drm/cirrus/cirrus_drv.h +1 -0
@@ -14,6 +14,7 @@#include <video/vga.h> #include <drm/drm_fb_helper.h> +#include <drm/drm_atomic.h> #include <drm/ttm/ttm_bo_api.h> #include <drm/ttm/ttm_bo_driver.h>
drivers/gpu/drm/drm_atomic.c new file +274 -0
274 lines not on this page · raw message
drivers/gpu/drm/drm_crtc.c +93 -56
215 lines not on this page · raw message
drivers/gpu/drm/drm_modeset_lock.c +28 -0
@@ -31,18 +31,29 @@ void drm_modeset_acquire_init(struct drm_modeset_acquire_ctx *ctx, {ww_acquire_init (&ctx->ww_ctx, &crtc_ww_class);INIT_LIST_HEAD (&ctx->locked); +mutex_init (&ctx->mutex); + ctx->nolock = !!(flags &DRM_MODESET_ACQUIRE_NOLOCK ); + ctx->nonblock = !!(flags &DRM_MODESET_ACQUIRE_NONBLOCK ); }EXPORT_SYMBOL (drm_modeset_acquire_init); +/* special version for atomic.. which needs to ww_acquire_fini() itself */ +void __drm_modeset_acquire_fini (struct drm_modeset_acquire_ctx *ctx) +{ +mutex_destroy (&ctx->mutex); +} +void drm_modeset_acquire_fini (struct drm_modeset_acquire_ctx *ctx) {ww_acquire_fini (&ctx->ww_ctx); +__drm_modeset_acquire_fini (ctx); }EXPORT_SYMBOL (drm_modeset_acquire_fini);void drm_modeset_drop_locks (struct drm_modeset_acquire_ctx *ctx) {WARN_ON (ctx->contended); +mutex_lock (&ctx->mutex);while (!list_empty (&ctx->locked)) {struct drm_modeset_lock *lock;
@@ -51,6 +62,7 @@ void drm_modeset_drop_locks(struct drm_modeset_acquire_ctx *ctx)drm_modeset_unlock (lock); } +mutex_unlock (&ctx->mutex); }EXPORT_SYMBOL (drm_modeset_drop_locks);
@@ -60,8 +72,13 @@ static inline int modeset_lock(struct drm_modeset_lock *lock, {int ret; +if (ctx->nolock) +return 0 ; + +WARN_ON (ctx->frozen);/* all locks should be held by now! */ WARN_ON (ctx->contended); +retry:if (interruptible && slow) { ret =ww_mutex_lock_slow_interruptible (&lock->mutex, &ctx->ww_ctx); }else if (interruptible) {
@@ -73,6 +90,15 @@ static inline int modeset_lock(struct drm_modeset_lock *lock, ret =ww_mutex_lock (&lock->mutex, &ctx->ww_ctx); }if (!ret) { +if (lock->atomic_pending) { +/* some other pending update with dropped locks */ +ww_mutex_unlock (&lock->mutex); +if (ctx->nonblock) +return -EBUSY ; +wait_event (lock->event, !lock->atomic_pending); + goto retry; + } + lock->atomic_pending = true;WARN_ON (!list_empty (&lock->head));list_add (&lock->head, &ctx->locked); }else if (ret == -EALREADY ) {
@@ -154,7 +180,9 @@ EXPORT_SYMBOL(drm_modeset_lock_interruptible);void drm_modeset_unlock (struct drm_modeset_lock *lock) {list_del_init (&lock->head); + lock->atomic_pending = false;ww_mutex_unlock (&lock->mutex); +wake_up_all (&lock->event); }EXPORT_SYMBOL (drm_modeset_unlock);
drivers/gpu/drm/exynos/exynos_drm_crtc.c +3 -1
@@ -281,8 +281,10 @@ static void exynos_drm_crtc_destroy(struct drm_crtc *crtc) }static int exynos_drm_crtc_set_property (struct drm_crtc *crtc, +struct drm_atomic_state *state,struct drm_property *property, -uint64_t val) +uint64_t val, +void *blob_data) {struct drm_device *dev = crtc->dev;struct exynos_drm_private *dev_priv = dev->dev_private;
drivers/gpu/drm/exynos/exynos_drm_drv.c +7 -0
@@ -14,6 +14,7 @@#include <linux/pm_runtime.h> #include <drm/drmP.h> #include <drm/drm_crtc_helper.h> +#include <drm/drm_atomic.h> #include <linux/anon_inodes.h>
@@ -341,6 +342,12 @@ static struct drm_driver exynos_drm_driver = { .dumb_create = exynos_drm_gem_dumb_create, .dumb_map_offset = exynos_drm_gem_dumb_map_offset, .dumb_destroy = drm_gem_dumb_destroy, + .atomic_begin = drm_atomic_begin, + .atomic_set_event = drm_atomic_set_event, + .atomic_check = drm_atomic_check, + .atomic_commit = drm_atomic_commit, + .atomic_end = drm_atomic_end, + .atomic_funcs = &drm_atomic_funcs, .prime_handle_to_fd = drm_gem_prime_handle_to_fd, .prime_fd_to_handle = drm_gem_prime_fd_to_handle, .gem_prime_export = exynos_dmabuf_prime_export,
drivers/gpu/drm/exynos/exynos_drm_plane.c +3 -1
@@ -212,8 +212,10 @@ static void exynos_plane_destroy(struct drm_plane *plane) }static int exynos_plane_set_property (struct drm_plane *plane, +struct drm_atomic_state *state,struct drm_property *property, -uint64_t val) +uint64_t val, +void *blob_data) {struct drm_device *dev = plane->dev;struct exynos_plane *exynos_plane =to_exynos_plane (plane);
drivers/gpu/drm/gma500/cdv_intel_crt.c +3 -1
@@ -205,8 +205,10 @@ static int cdv_intel_crt_get_modes(struct drm_connector *connector) }static int cdv_intel_crt_set_property (struct drm_connector *connector, +struct drm_atomic_state *state,struct drm_property *property, -uint64_t value) +uint64_t value, +void *blob_data) {return 0 ; }
drivers/gpu/drm/gma500/cdv_intel_dp.c +3 -1
@@ -1645,8 +1645,10 @@ cdv_intel_dp_detect_audio(struct drm_connector *connector)static int cdv_intel_dp_set_property (struct drm_connector *connector, +struct drm_atomic_state *state,struct drm_property *property, -uint64_t val) +uint64_t val, +void *blob_data) {struct drm_psb_private *dev_priv = connector->dev->dev_private;struct gma_encoder *encoder =gma_attached_encoder (connector);
drivers/gpu/drm/gma500/cdv_intel_hdmi.c +3 -1
@@ -150,8 +150,10 @@ static enum drm_connector_status cdv_hdmi_detect( }static int cdv_hdmi_set_property (struct drm_connector *connector, +struct drm_atomic_state *state,struct drm_property *property, -uint64_t value) +uint64_t value, +void *blob_data) {struct drm_encoder *encoder = connector->encoder;
drivers/gpu/drm/gma500/cdv_intel_lvds.c +3 -1
@@ -452,8 +452,10 @@ static void cdv_intel_lvds_destroy(struct drm_connector *connector) }static int cdv_intel_lvds_set_property (struct drm_connector *connector, +struct drm_atomic_state *state,struct drm_property *property, -uint64_t value) +uint64_t value, +void *blob_data) {struct drm_encoder *encoder = connector->encoder;
drivers/gpu/drm/gma500/mdfld_dsi_output.c +3 -1
@@ -243,8 +243,10 @@ mdfld_dsi_connector_detect(struct drm_connector *connector, bool force) }static int mdfld_dsi_connector_set_property (struct drm_connector *connector, +struct drm_atomic_state *state,struct drm_property *property, -uint64_t value) +uint64_t value, +void *blob_data) {struct drm_encoder *encoder = connector->encoder;
drivers/gpu/drm/gma500/psb_drv.c +7 -0
@@ -487,6 +487,13 @@ static struct drm_driver driver = { .disable_vblank = psb_disable_vblank, .get_vblank_counter = psb_get_vblank_counter, + .atomic_begin = drm_atomic_begin, + .atomic_set_event = drm_atomic_set_event, + .atomic_check = drm_atomic_check, + .atomic_commit = drm_atomic_commit, + .atomic_end = drm_atomic_end, + .atomic_funcs = &drm_atomic_funcs, + .gem_free_object = psb_gem_free_object, .gem_vm_ops = &psb_gem_vm_ops,
drivers/gpu/drm/gma500/psb_drv.h +1 -0
@@ -25,6 +25,7 @@#include <drm/drmP.h> #include <drm/drm_global.h> #include <drm/gma_drm.h> +#include <drm/drm_atomic.h> #include "psb_reg.h" #include "psb_intel_drv.h" #include "gma_display.h"
drivers/gpu/drm/gma500/psb_intel_drv.h +3 -1
@@ -254,8 +254,10 @@ extern bool psb_intel_lvds_mode_fixup(struct drm_encoder *encoder,extern int psb_intel_lvds_mode_valid (struct drm_connector *connector,struct drm_display_mode *mode);extern int psb_intel_lvds_set_property (struct drm_connector *connector, +struct drm_atomic_state *state,struct drm_property *property, -uint64_t value); +uint64_t value, +void *blob_data);extern void psb_intel_lvds_destroy (struct drm_connector *connector);extern const struct drm_encoder_funcs psb_intel_lvds_enc_funcs;
drivers/gpu/drm/gma500/psb_intel_lvds.c +3 -1
@@ -569,8 +569,10 @@ void psb_intel_lvds_destroy(struct drm_connector *connector) }int psb_intel_lvds_set_property (struct drm_connector *connector, +struct drm_atomic_state *state,struct drm_property *property, -uint64_t value) +uint64_t value, +void *blob_data) {struct drm_encoder *encoder = connector->encoder;
drivers/gpu/drm/gma500/psb_intel_sdvo.c +3 -1
@@ -1705,8 +1705,10 @@ static bool psb_intel_sdvo_detect_hdmi_audio(struct drm_connector *connector)static int psb_intel_sdvo_set_property (struct drm_connector *connector, +struct drm_atomic_state *state,struct drm_property *property, -uint64_t val) +uint64_t val, +void *blob_data) {struct psb_intel_sdvo *psb_intel_sdvo =intel_attached_sdvo (connector);struct psb_intel_sdvo_connector *psb_intel_sdvo_connector =to_psb_intel_sdvo_connector (connector);
drivers/gpu/drm/i915/i915_drv.c +8 -0
@@ -1119,6 +1119,14 @@ static struct drm_driver driver = { .dumb_create = i915_gem_dumb_create, .dumb_map_offset = i915_gem_mmap_gtt, .dumb_destroy = drm_gem_dumb_destroy, + + .atomic_begin = drm_atomic_begin, + .atomic_set_event = drm_atomic_set_event, + .atomic_check = drm_atomic_check, + .atomic_commit = drm_atomic_commit, + .atomic_end = drm_atomic_end, + .atomic_funcs = &drm_atomic_funcs, + .ioctls = i915_ioctls, .fops = &i915_driver_fops, .name = DRIVER_NAME,
drivers/gpu/drm/i915/intel_crt.c +3 -1
@@ -725,8 +725,10 @@ out: }static int intel_crt_set_property (struct drm_connector *connector, +struct drm_atomic_state *state,struct drm_property *property, -uint64_t value) +uint64_t value, +void *blob_data) {return 0 ; }
drivers/gpu/drm/i915/intel_dp.c +3 -1
@@ -3271,8 +3271,10 @@ intel_dp_detect_audio(struct drm_connector *connector)static int intel_dp_set_property (struct drm_connector *connector, +struct drm_atomic_state *state,struct drm_property *property, -uint64_t val) +uint64_t val, +void *blob_data) {struct drm_i915_private *dev_priv = connector->dev->dev_private;struct intel_connector *intel_connector =to_intel_connector (connector);
drivers/gpu/drm/i915/intel_drv.h +1 -0
@@ -31,6 +31,7 @@#include "i915_drv.h" #include <drm/drm_crtc.h> #include <drm/drm_crtc_helper.h> +#include <drm/drm_atomic.h> #include <drm/drm_fb_helper.h> #include <drm/drm_dp_helper.h>
drivers/gpu/drm/i915/intel_hdmi.c +3 -1
@@ -1044,8 +1044,10 @@ intel_hdmi_detect_audio(struct drm_connector *connector)static int intel_hdmi_set_property (struct drm_connector *connector, +struct drm_atomic_state *state,struct drm_property *property, -uint64_t val) +uint64_t val, +void *blob_data) {struct intel_hdmi *intel_hdmi =intel_attached_hdmi (connector); struct intel_digital_port *intel_dig_port =
drivers/gpu/drm/i915/intel_lvds.c +3 -1
@@ -486,8 +486,10 @@ static void intel_lvds_destroy(struct drm_connector *connector) }static int intel_lvds_set_property (struct drm_connector *connector, +struct drm_atomic_state *state,struct drm_property *property, -uint64_t value) +uint64_t value, +void *blob_data) {struct intel_connector *intel_connector =to_intel_connector (connector);struct drm_device *dev = connector->dev;
drivers/gpu/drm/i915/intel_sdvo.c +3 -1
@@ -2052,8 +2052,10 @@ static bool intel_sdvo_detect_hdmi_audio(struct drm_connector *connector)static int intel_sdvo_set_property (struct drm_connector *connector, +struct drm_atomic_state *state,struct drm_property *property, -uint64_t val) +uint64_t val, +void *blob_data) {struct intel_sdvo *intel_sdvo =intel_attached_sdvo (connector);struct intel_sdvo_connector *intel_sdvo_connector =to_intel_sdvo_connector (connector);
drivers/gpu/drm/i915/intel_tv.c +4 -2
@@ -1445,8 +1445,10 @@ intel_tv_destroy(struct drm_connector *connector)static int -intel_tv_set_property (struct drm_connector *connector,struct drm_property *property, -uint64_t val) +intel_tv_set_property (struct drm_connector *connector, +struct drm_atomic_state *state, +struct drm_property *property, +uint64_t val,void *blob_data) {struct drm_device *dev = connector->dev;struct intel_tv *intel_tv =intel_attached_tv (connector);
drivers/gpu/drm/mgag200/mgag200_drv.c +7 -0
@@ -103,6 +103,13 @@ static struct drm_driver driver = { .dumb_create = mgag200_dumb_create, .dumb_map_offset = mgag200_dumb_mmap_offset, .dumb_destroy = drm_gem_dumb_destroy, + + .atomic_begin = drm_atomic_begin, + .atomic_set_event = drm_atomic_set_event, + .atomic_check = drm_atomic_check, + .atomic_commit = drm_atomic_commit, + .atomic_end = drm_atomic_end, + .atomic_funcs = &drm_atomic_funcs, };static struct pci_driver mgag200_pci_driver = {
drivers/gpu/drm/mgag200/mgag200_drv.h +1 -0
@@ -16,6 +16,7 @@#include <video/vga.h> #include <drm/drm_fb_helper.h> +#include <drm/drm_atomic.h> #include <drm/ttm/ttm_bo_api.h> #include <drm/ttm/ttm_bo_driver.h> #include <drm/ttm/ttm_placement.h>
drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c +2 -1
@@ -468,7 +468,8 @@ static int mdp4_crtc_page_flip(struct drm_crtc *crtc, }static int mdp4_crtc_set_property (struct drm_crtc *crtc, -struct drm_property *property,uint64_t val) +struct drm_atomic_state *state,struct drm_property *property, +uint64_t val,void *blob_data) {// XXX return -EINVAL ;
drivers/gpu/drm/msm/mdp/mdp4/mdp4_plane.c +2 -1
@@ -85,7 +85,8 @@ void mdp4_plane_install_properties(struct drm_plane *plane, }int mdp4_plane_set_property (struct drm_plane *plane, -struct drm_property *property,uint64_t val) +struct drm_atomic_state *state,struct drm_property *property, +uint64_t val,void *blob_data) {// XXX return -EINVAL ;
drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c +2 -1
@@ -386,7 +386,8 @@ static int mdp5_crtc_page_flip(struct drm_crtc *crtc, }static int mdp5_crtc_set_property (struct drm_crtc *crtc, -struct drm_property *property,uint64_t val) +struct drm_atomic_state *state,struct drm_property *property, +uint64_t val,void *blob_data) {// XXX return -EINVAL ;
drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c +2 -1
@@ -100,7 +100,8 @@ void mdp5_plane_install_properties(struct drm_plane *plane, }int mdp5_plane_set_property (struct drm_plane *plane, -struct drm_property *property,uint64_t val) +struct drm_atomic_state *state,struct drm_property *property, +uint64_t val,void *blob_data) {// XXX return -EINVAL ;
drivers/gpu/drm/msm/msm_drv.c +6 -0
@@ -812,6 +812,12 @@ static struct drm_driver msm_driver = { .gem_prime_import_sg_table = msm_gem_prime_import_sg_table, .gem_prime_vmap = msm_gem_prime_vmap, .gem_prime_vunmap = msm_gem_prime_vunmap, + .atomic_begin = drm_atomic_begin, + .atomic_set_event = drm_atomic_set_event, + .atomic_check = drm_atomic_check, + .atomic_commit = drm_atomic_commit, + .atomic_end = drm_atomic_end, + .atomic_funcs = &drm_atomic_funcs, #ifdef CONFIG_DEBUG_FS .debugfs_init = msm_debugfs_init, .debugfs_cleanup = msm_debugfs_cleanup,
drivers/gpu/drm/msm/msm_drv.h +1 -0
@@ -50,6 +50,7 @@ static inline struct device *msm_iommu_get_ctx(const char *ctx_name)#include <drm/drmP.h> #include <drm/drm_crtc_helper.h> #include <drm/drm_fb_helper.h> +#include <drm/drm_atomic.h> #include <drm/msm_drm.h> struct msm_kms ;
drivers/gpu/drm/nouveau/dispnv04/overlay.c +3 -2
@@ -221,8 +221,9 @@ nv10_set_params(struct nouveau_plane *plane)static int nv_set_property (struct drm_plane *plane, -struct drm_property *property, -uint64_t value) +struct drm_atomic_state *state, +struct drm_property *property, +uint64_t value,void *blob_data) {struct nouveau_plane *nv_plane = (struct nouveau_plane *)plane;
drivers/gpu/drm/nouveau/nouveau_connector.c +2 -1
@@ -447,7 +447,8 @@ nouveau_connector_force(struct drm_connector *connector)static int nouveau_connector_set_property (struct drm_connector *connector, -struct drm_property *property,uint64_t value) +struct drm_atomic_state *state,struct drm_property *property, +uint64_t value,void *blob_data) {struct nouveau_display *disp =nouveau_display (connector->dev);struct nouveau_connector *nv_connector =nouveau_connector (connector);
drivers/gpu/drm/nouveau/nouveau_drm.c +7 -0
@@ -858,6 +858,13 @@ driver = { .dumb_map_offset = nouveau_display_dumb_map_offset, .dumb_destroy = drm_gem_dumb_destroy, + .atomic_begin = drm_atomic_begin, + .atomic_set_event = drm_atomic_set_event, + .atomic_check = drm_atomic_check, + .atomic_commit = drm_atomic_commit, + .atomic_end = drm_atomic_end, + .atomic_funcs = &drm_atomic_funcs, + .name = DRIVER_NAME, .desc =DRIVER_DESC , #ifdef GIT_REVISION
drivers/gpu/drm/nouveau/nouveau_drm.h +1 -0
@@ -29,6 +29,7 @@#include <subdev/vm.h> #include <drmP.h> +#include <drm/drm_atomic.h> #include <drm/nouveau_drm.h> #include <drm/ttm/ttm_bo_api.h>
drivers/gpu/drm/omapdrm/omap_crtc.c +4 -2
@@ -382,7 +382,8 @@ static int omap_crtc_page_flip_locked(struct drm_crtc *crtc, }static int omap_crtc_set_property (struct drm_crtc *crtc, -struct drm_property *property,uint64_t val) +struct drm_atomic_state *state,struct drm_property *property, +uint64_t val,void *blob_data) {struct omap_crtc *omap_crtc =to_omap_crtc (crtc);struct omap_drm_private *priv = crtc->dev->dev_private;
@@ -392,7 +393,8 @@ static int omap_crtc_set_property(struct drm_crtc *crtc, !!(val & ((1LL <<DRM_ROTATE_90 ) | (1LL <<DRM_ROTATE_270 ))); } -return omap_plane_set_property (omap_crtc->plane, property, val); +return omap_plane_set_property (omap_crtc->plane, state, + property, val, blob_data); }static const struct drm_crtc_funcs omap_crtc_funcs = {
drivers/gpu/drm/omapdrm/omap_drv.c +6 -0
@@ -649,6 +649,12 @@ static struct drm_driver omap_drm_driver = { .dumb_create = omap_gem_dumb_create, .dumb_map_offset = omap_gem_dumb_map_offset, .dumb_destroy = drm_gem_dumb_destroy, + .atomic_begin = drm_atomic_begin, + .atomic_set_event = drm_atomic_set_event, + .atomic_check = drm_atomic_check, + .atomic_commit = drm_atomic_commit, + .atomic_end = drm_atomic_end, + .atomic_funcs = &drm_atomic_funcs, .ioctls = ioctls, .num_ioctls = DRM_OMAP_NUM_IOCTLS, .fops = &omapdriver_fops,
drivers/gpu/drm/omapdrm/omap_drv.h +3 -1
@@ -25,6 +25,7 @@#include <linux/types.h> #include <drm/drmP.h> #include <drm/drm_crtc_helper.h> +#include <drm/drm_atomic.h> #include <drm/omap_drm.h> #include <linux/platform_data/omap_drm.h>
@@ -178,7 +179,8 @@ int omap_plane_mode_set(struct drm_plane *plane,void omap_plane_install_properties (struct drm_plane *plane,struct drm_mode_object *obj);int omap_plane_set_property (struct drm_plane *plane, -struct drm_property *property,uint64_t val); +struct drm_atomic_state *state,struct drm_property *property, +uint64_t val,void *blob_data);struct drm_encoder *omap_encoder_init (struct drm_device *dev,struct omap_dss_device *dssdev);
drivers/gpu/drm/omapdrm/omap_plane.c +2 -1
@@ -336,7 +336,8 @@ void omap_plane_install_properties(struct drm_plane *plane, }int omap_plane_set_property (struct drm_plane *plane, -struct drm_property *property,uint64_t val) +struct drm_atomic_state *state,struct drm_property *property, +uint64_t val,void *blob_data) {struct omap_plane *omap_plane =to_omap_plane (plane);struct omap_drm_private *priv = plane->dev->dev_private;
drivers/gpu/drm/qxl/qxl_display.c +3 -1
@@ -819,8 +819,10 @@ static enum drm_connector_status qxl_conn_detect( }static int qxl_conn_set_property (struct drm_connector *connector, +struct drm_atomic_state *state,struct drm_property *property, -uint64_t value) +uint64_t value, +void *blob_data) {DRM_DEBUG ("\n" );return 0 ;
drivers/gpu/drm/qxl/qxl_drv.c +9 -0
@@ -34,6 +34,7 @@#include "drmP.h" #include "drm/drm.h" #include "drm_crtc_helper.h" +#include "drm_atomic.h" #include "qxl_drv.h" #include "qxl_object.h"
@@ -220,6 +221,14 @@ static struct drm_driver qxl_driver = { .dumb_create = qxl_mode_dumb_create, .dumb_map_offset = qxl_mode_dumb_mmap, .dumb_destroy = drm_gem_dumb_destroy, + + .atomic_begin = drm_atomic_begin, + .atomic_set_event = drm_atomic_set_event, + .atomic_check = drm_atomic_check, + .atomic_commit = drm_atomic_commit, + .atomic_end = drm_atomic_end, + .atomic_funcs = &drm_atomic_funcs, +#if defined(CONFIG_DEBUG_FS ) .debugfs_init = qxl_debugfs_init, .debugfs_cleanup = qxl_debugfs_takedown,
drivers/gpu/drm/radeon/radeon_connectors.c +6 -3
@@ -360,8 +360,9 @@ static void radeon_add_common_modes(struct drm_encoder *encoder, struct drm_conn } } -static int radeon_connector_set_property (struct drm_connector *connector,struct drm_property *property, -uint64_t val) +static int radeon_connector_set_property (struct drm_connector *connector, +struct drm_atomic_state *state,struct drm_property *property, +uint64_t val,void *blob_data) {struct drm_device *dev = connector->dev;struct radeon_device *rdev = dev->dev_private;
@@ -683,8 +684,10 @@ static void radeon_connector_destroy(struct drm_connector *connector) }static int radeon_lvds_set_property (struct drm_connector *connector, +struct drm_atomic_state *state,struct drm_property *property, -uint64_t value) +uint64_t value, +void *blob_data) {struct drm_device *dev = connector->dev;struct radeon_encoder *radeon_encoder;
drivers/gpu/drm/radeon/radeon_drv.c +9 -0
@@ -34,6 +34,7 @@#include "radeon_drv.h" #include <drm/drm_pciids.h> +#include <drm/drm_atomic.h> #include <linux/console.h> #include <linux/module.h> #include <linux/pm_runtime.h>
@@ -545,6 +546,14 @@ static struct drm_driver kms_driver = { .dumb_create = radeon_mode_dumb_create, .dumb_map_offset = radeon_mode_dumb_mmap, .dumb_destroy = drm_gem_dumb_destroy, + + .atomic_begin = drm_atomic_begin, + .atomic_set_event = drm_atomic_set_event, + .atomic_check = drm_atomic_check, + .atomic_commit = drm_atomic_commit, + .atomic_end = drm_atomic_end, + .atomic_funcs = &drm_atomic_funcs, + .fops = &radeon_driver_kms_fops, .prime_handle_to_fd = drm_gem_prime_handle_to_fd,
drivers/gpu/drm/rcar-du/rcar_du_drv.c +7 -0
@@ -21,6 +21,7 @@#include <drm/drmP.h> #include <drm/drm_crtc_helper.h> +#include <drm/drm_atomic.h> #include <drm/drm_fb_cma_helper.h> #include <drm/drm_gem_cma_helper.h>
@@ -175,6 +176,12 @@ static struct drm_driver rcar_du_driver = { .dumb_create = rcar_du_dumb_create, .dumb_map_offset = drm_gem_cma_dumb_map_offset, .dumb_destroy = drm_gem_dumb_destroy, + .atomic_begin = drm_atomic_begin, + .atomic_set_event = drm_atomic_set_event, + .atomic_check = drm_atomic_check, + .atomic_commit = drm_atomic_commit, + .atomic_end = drm_atomic_end, + .atomic_funcs = &drm_atomic_funcs, .fops = &rcar_du_fops, .name = "rcar-du", .desc = "Renesas R-Car Display Unit",
drivers/gpu/drm/rcar-du/rcar_du_plane.c +3 -1
@@ -397,8 +397,10 @@ done: }static int rcar_du_plane_set_property (struct drm_plane *plane, +struct drm_atomic_state *state,struct drm_property *property, -uint64_t value) +uint64_t value, +void *blob_data) {struct rcar_du_plane *rplane =to_rcar_plane (plane);struct rcar_du_group *rgrp = rplane->group;
drivers/gpu/drm/shmobile/shmob_drm_drv.c +7 -0
@@ -21,6 +21,7 @@#include <drm/drmP.h> #include <drm/drm_crtc_helper.h> +#include <drm/drm_atomic.h> #include <drm/drm_gem_cma_helper.h> #include "shmob_drm_crtc.h"
@@ -285,6 +286,12 @@ static struct drm_driver shmob_drm_driver = { .dumb_create = drm_gem_cma_dumb_create, .dumb_map_offset = drm_gem_cma_dumb_map_offset, .dumb_destroy = drm_gem_dumb_destroy, + .atomic_begin = drm_atomic_begin, + .atomic_set_event = drm_atomic_set_event, + .atomic_check = drm_atomic_check, + .atomic_commit = drm_atomic_commit, + .atomic_end = drm_atomic_end, + .atomic_funcs = &drm_atomic_funcs, .fops = &shmob_drm_fops, .name = "shmob-drm", .desc = "Renesas SH Mobile DRM",
drivers/gpu/drm/tilcdc/tilcdc_drv.c +6 -0
@@ -519,6 +519,12 @@ static struct drm_driver tilcdc_driver = { .dumb_create = drm_gem_cma_dumb_create, .dumb_map_offset = drm_gem_cma_dumb_map_offset, .dumb_destroy = drm_gem_dumb_destroy, + .atomic_begin = drm_atomic_begin, + .atomic_set_event = drm_atomic_set_event, + .atomic_check = drm_atomic_check, + .atomic_commit = drm_atomic_commit, + .atomic_end = drm_atomic_end, + .atomic_funcs = &drm_atomic_funcs, #ifdef CONFIG_DEBUG_FS .debugfs_init = tilcdc_debugfs_init, .debugfs_cleanup = tilcdc_debugfs_cleanup,
drivers/gpu/drm/tilcdc/tilcdc_drv.h +1 -0
@@ -31,6 +31,7 @@#include <drm/drmP.h> #include <drm/drm_crtc_helper.h> +#include <drm/drm_atomic.h> #include <drm/drm_gem_cma_helper.h> #include <drm/drm_fb_cma_helper.h>
drivers/gpu/drm/tilcdc/tilcdc_slave.c +2 -1
@@ -206,7 +206,8 @@ static struct drm_encoder *slave_connector_best_encoder( }static int slave_connector_set_property (struct drm_connector *connector, -struct drm_property *property,uint64_t value) +struct drm_atomic_state *state,struct drm_property *property, +uint64_t value,void *blob_data) {struct drm_encoder *encoder =to_slave_connector (connector)->encoder; return get_slave_funcs(encoder)->set_property(encoder,
drivers/gpu/drm/udl/udl_connector.c +3 -3
@@ -115,9 +115,9 @@ udl_best_single_encoder(struct drm_connector *connector)return encoder; } -static int udl_connector_set_property (struct drm_connector *connector, -struct drm_property *property, -uint64_t val) +static int udl_connector_set_property (struct drm_connector *connector, +struct drm_atomic_state *state,struct drm_property *property, +uint64_t val,void *blob_data) {return 0 ; }
drivers/gpu/drm/udl/udl_drv.c +8 -0
@@ -9,6 +9,7 @@#include <linux/module.h> #include <drm/drm_usb.h> #include <drm/drm_crtc_helper.h> +#include <drm/drm_atomic.h> #include "udl_drv.h" static struct drm_driver driver;
@@ -88,6 +89,13 @@ static struct drm_driver driver = { .prime_fd_to_handle = drm_gem_prime_fd_to_handle, .gem_prime_import = udl_gem_prime_import, + .atomic_begin = drm_atomic_begin, + .atomic_set_event = drm_atomic_set_event, + .atomic_check = drm_atomic_check, + .atomic_commit = drm_atomic_commit, + .atomic_end = drm_atomic_end, + .atomic_funcs = &drm_atomic_funcs, + .name = DRIVER_NAME, .desc = DRIVER_DESC, .date = DRIVER_DATE,
drivers/gpu/drm/vmwgfx/vmwgfx_drv.c +7 -0
@@ -1433,6 +1433,13 @@ static struct drm_driver driver = { .prime_fd_to_handle = vmw_prime_fd_to_handle, .prime_handle_to_fd = vmw_prime_handle_to_fd, + .atomic_begin = drm_atomic_begin, + .atomic_set_event = drm_atomic_set_event, + .atomic_check = drm_atomic_check, + .atomic_commit = drm_atomic_commit, + .atomic_end = drm_atomic_end, + .atomic_funcs = &drm_atomic_funcs, + .fops = &vmwgfx_driver_fops, .name = VMWGFX_DRIVER_NAME, .desc = VMWGFX_DRIVER_DESC,
drivers/gpu/drm/vmwgfx/vmwgfx_drv.h +1 -0
@@ -30,6 +30,7 @@#include "vmwgfx_reg.h" #include <drm/drmP.h> +#include <drm/drm_atomic.h> #include <drm/vmwgfx_drm.h> #include <drm/drm_hashtab.h> #include <linux/suspend.h>
drivers/gpu/drm/vmwgfx/vmwgfx_kms.c +3 -1
@@ -2007,8 +2007,10 @@ int vmw_du_connector_fill_modes(struct drm_connector *connector, }int vmw_du_connector_set_property (struct drm_connector *connector, +struct drm_atomic_state *state,struct drm_property *property, -uint64_t val) +uint64_t val, +void *blob_data) {return 0 ; }
drivers/gpu/drm/vmwgfx/vmwgfx_kms.h +3 -1
@@ -141,8 +141,10 @@ vmw_du_connector_detect(struct drm_connector *connector, bool force);int vmw_du_connector_fill_modes (struct drm_connector *connector,uint32_t max_width,uint32_t max_height);int vmw_du_connector_set_property (struct drm_connector *connector, +struct drm_atomic_state *state,struct drm_property *property, -uint64_t val); +uint64_t val, +void *blob_data);/*
include/drm/drmP.h +80 -0
86 lines not on this page · raw message
include/drm/drm_atomic.h new file +114 -0
114 lines not on this page · raw message
include/drm/drm_crtc.h +11 -4
@@ -216,6 +216,8 @@ struct drm_encoder;struct drm_pending_vblank_event ;struct drm_plane ;struct drm_bridge ; +struct drm_atomic_state ; +struct drm_atomic_funcs ;/** * drm_crtc_funcs - control CRTCs for a given device
@@ -278,7 +280,9 @@ struct drm_crtc_funcs { uint32_t flags);int (*set_property)(struct drm_crtc *crtc, -struct drm_property *property,uint64_t val); +struct drm_atomic_state *state, +struct drm_property *property,uint64_t val, +void *blob_data); };/**
@@ -392,8 +396,9 @@ struct drm_connector_funcs {enum drm_connector_status (*detect)(struct drm_connector *connector,bool force);int (*fill_modes)(struct drm_connector *connector,uint32_t max_width,uint32_t max_height); -int (*set_property)(struct drm_connector *connector,struct drm_property *property, -uint64_t val); +int (*set_property)(struct drm_connector *connector, +struct drm_atomic_state *state, +struct drm_property *property,uint64_t val,void *blob_data);void (*destroy)(struct drm_connector *connector);void (*force)(struct drm_connector *connector); };
@@ -562,7 +567,9 @@ struct drm_plane_funcs {void (*destroy)(struct drm_plane *plane);int (*set_property)(struct drm_plane *plane, -struct drm_property *property,uint64_t val); +struct drm_atomic_state *state, +struct drm_property *property,uint64_t val, +void *blob_data); };enum drm_plane_type {
include/drm/drm_modeset_lock.h +41 -0
75 lines not on this page · raw message
include/uapi/drm/drm_mode.h +3 -0
@@ -511,4 +511,7 @@ struct drm_mode_destroy_dumb { uint32_t handle; }; +#define DRM_MODE_ATOMIC_NONBLOCK 0x0200 +#define DRM_MODE_ATOMIC_NOLOCK 0x8000/* only used internally */ +#endif
Signature · 1 line
1.9.3
PATCH 2/7 drm: split propvals out and blob property support
In reply to Rob ClarkSplit property values out into a different struct, so we can later move property values into state structs. This will allow the property values to stay in sync w/ the state updates which are either discarded or atomically committed.
And since we are touching all the same code, add support for mutable blob properties, which will also be needed for atomic modeset.
--- drivers/gpu/drm/drm_crtc.c | 79 +++++++++++++++++++++-------- drivers/gpu/drm/drm_fb_helper.c | 3 +- drivers/gpu/drm/gma500/cdv_intel_dp.c | 3 +- drivers/gpu/drm/gma500/cdv_intel_hdmi.c | 3 +- drivers/gpu/drm/gma500/cdv_intel_lvds.c | 6 ++- drivers/gpu/drm/gma500/mdfld_dsi_output.c | 8 +-- drivers/gpu/drm/gma500/psb_intel_lvds.c | 6 ++- drivers/gpu/drm/gma500/psb_intel_sdvo.c | 19 +++++-- drivers/gpu/drm/i2c/ch7006_drv.c | 4 +- drivers/gpu/drm/i915/intel_display.c | 3 +- drivers/gpu/drm/i915/intel_dp.c | 3 +- drivers/gpu/drm/i915/intel_hdmi.c | 3 +- drivers/gpu/drm/i915/intel_sdvo.c | 19 +++++-- drivers/gpu/drm/i915/intel_tv.c | 6 ++- drivers/gpu/drm/nouveau/dispnv04/tvnv17.c | 3 +- drivers/gpu/drm/nouveau/nouveau_connector.c | 4 +- drivers/gpu/drm/omapdrm/omap_drv.c | 6 ++- drivers/gpu/drm/rcar-du/rcar_du_lvdscon.c | 3 +- drivers/gpu/drm/rcar-du/rcar_du_vgacon.c | 3 +- drivers/gpu/drm/shmobile/shmob_drm_crtc.c | 4 +- include/drm/drm_crtc.h | 11 +++- 21 files changed, 142 insertions(+), 57 deletions(-)
drivers/gpu/drm/drm_crtc.c +58 -21
@@ -137,6 +137,14 @@ void drm_warn_on_modeset_not_all_locked(struct drm_device *dev) }EXPORT_SYMBOL (drm_warn_on_modeset_not_all_locked); +static int drm_mode_set_obj_prop (struct drm_device *dev, +struct drm_mode_object *obj,struct drm_atomic_state *state, +struct drm_property *property,uint64_t value,void *blob_data); +static struct drm_property_blob *drm_property_create_blob (struct drm_device *dev, +int length,void *data); +static void drm_property_destroy_blob (struct drm_device *dev, +struct drm_property_blob *blob); +/* Avoid boilerplate. I'm tired of typing. */ #define DRM_ENUM_NAME_FN (fnname, list) \ const char *fnname(int val) \
@@ -763,6 +771,7 @@ int drm_crtc_init_with_planes(struct drm_device *dev, struct drm_crtc *crtc, goto out; crtc->base.properties = &crtc->properties; + crtc->base.propvals = &crtc->propvals;list_add_tail (&crtc->head, &config->crtc_list); config->num_crtc++;
@@ -867,6 +876,7 @@ int drm_connector_init(struct drm_device *dev, goto out_unlock; connector->base.properties = &connector->properties; + connector->base.propvals = &connector->propvals; connector->dev = dev; connector->funcs = funcs; connector->connector_type = connector_type;
@@ -1112,6 +1122,7 @@ int drm_universal_plane_init(struct drm_device *dev, struct drm_plane *plane, goto out; plane->base.properties = &plane->properties; + plane->base.propvals = &plane->propvals; plane->dev = dev; plane->funcs = funcs; plane->format_types = kmalloc(sizeof(uint32_t) * format_count,
@@ -1930,7 +1941,7 @@ int drm_mode_getconnector(struct drm_device *dev, void *data, goto out; } -if (put_user (connector->properties.values[i], +if (put_user (connector->propvals.values[i], prop_values + copied)) { ret = -EFAULT ; goto out;
@@ -3455,7 +3466,7 @@ void drm_object_attach_property(struct drm_mode_object *obj, } obj->properties->ids[count] = property->base.id; - obj->properties->values[count] = init_val; + obj->propvals->values[count] = init_val; obj->properties->count++; }EXPORT_SYMBOL (drm_object_attach_property);
@@ -3474,13 +3485,27 @@ EXPORT_SYMBOL(drm_object_attach_property);* Zero on success, error code on failure. */ int drm_object_property_set_value (struct drm_mode_object *obj, -struct drm_property *property,uint64_t val) +struct drm_object_property_values *propvals, +struct drm_property *property,uint64_t val, +void *blob_data) {int i;for (i =0 ; i < obj->properties->count; i++) {if (obj->properties->ids[i] == property->base.id) { - obj->properties->values[i] = val; +struct drm_device *dev = property->dev; +if (property->flags &DRM_MODE_PROP_BLOB ) { +struct drm_property_blob *blob, *old_blob =NULL ; + old_blob =drm_property_blob_find (dev, propvals->values[i]); + blob =drm_property_create_blob (dev, val, blob_data); +if (!blob) +return -ENOMEM ; + propvals->values[i] = blob->base.id; +if (old_blob) +drm_property_destroy_blob (dev, old_blob); + }else { + propvals->values[i] = val; + }return 0 ; } }
@@ -3510,7 +3535,7 @@ int drm_object_property_get_value(struct drm_mode_object *obj,for (i =0 ; i < obj->properties->count; i++) {if (obj->properties->ids[i] == property->base.id) { - *val = obj->properties->values[i]; + *val = obj->propvals->values[i];return 0 ; } }
@@ -3731,27 +3756,35 @@ int drm_mode_connector_update_edid_property(struct drm_connector *connector, struct edid *edid) {struct drm_device *dev = connector->dev; -int ret, size; +struct drm_mode_object *obj = &connector->base; +struct drm_property *edid_prop = dev->mode_config.edid_property; +int i, ret, size; -if (connector->edid_blob_ptr) -drm_property_destroy_blob (dev, connector->edid_blob_ptr); +/* property_blob will be recreated by drm_object_property_set_value(): */ + connector->edid_blob_ptr =NULL ;/* Delete edid, when there is none. */ if (!edid) { - connector->edid_blob_ptr =NULL ; - ret =drm_object_property_set_value (&connector->base, dev->mode_config.edid_property,0 ); + ret =drm_object_property_set_value (obj, + &connector->propvals, edid_prop,0 ,NULL );return ret; } size =EDID_LENGTH * (1 + edid->extensions); - connector->edid_blob_ptr =drm_property_create_blob (connector->dev, - size, edid); -if (!connector->edid_blob_ptr) -return -EINVAL ; - ret =drm_object_property_set_value (&connector->base, - dev->mode_config.edid_property, - connector->edid_blob_ptr->base.id); + ret =drm_object_property_set_value (obj, + &connector->propvals, edid_prop, size, edid); +if (ret) +return ret; + +/* find the blob object created for us by drm_object_property_set_value(): */ +for (i =0 ; i < obj->properties->count; i++) { +if (obj->properties->ids[i] == edid_prop->base.id) { + connector->edid_blob_ptr =drm_property_blob_find (dev, + connector->propvals.values[i]); +break ; + } + }return ret; }
@@ -3852,7 +3885,9 @@ static int drm_mode_connector_set_obj_prop(struct drm_connector *connector,/* store the property value if successful */ if (!ret) -drm_object_property_set_value (&connector->base, property, value); +drm_object_property_set_value (&connector->base, + &connector->propvals, property, value, blob_data); +return ret; }
@@ -3866,7 +3901,8 @@ static int drm_mode_crtc_set_obj_prop(struct drm_crtc *crtc, ret = crtc->funcs->set_property (crtc, state, property, value, blob_data);if (!ret) -drm_object_property_set_value (&crtc->base, property, value); +drm_object_property_set_value (&crtc->base, &crtc->propvals, + property, value,NULL );return ret; }
@@ -3881,7 +3917,8 @@ static int drm_mode_plane_set_obj_prop(struct drm_plane *plane, ret = plane->funcs->set_property (plane, state, property, value, blob_data);if (!ret) -drm_object_property_set_value (&plane->base, property, value); +drm_object_property_set_value (&plane->base, &plane->propvals, + property, value,NULL );return ret; }
@@ -3995,7 +4032,7 @@ int drm_mode_obj_get_properties_ioctl(struct drm_device *dev, void *data, ret = -EFAULT ; goto out; } -if (put_user (obj->properties->values[i], +if (put_user (obj->propvals->values[i], prop_values_ptr + copied)) { ret = -EFAULT ; goto out;
drivers/gpu/drm/drm_fb_helper.c +2 -1
@@ -479,7 +479,8 @@ static void drm_fb_helper_dpms(struct fb_info *info, int dpms_mode) connector = fb_helper->connector_info[j]->connector; connector->funcs->dpms (connector, dpms_mode);drm_object_property_set_value (&connector->base, - dev->mode_config.dpms_property, dpms_mode); + &connector->propvals, + dev->mode_config.dpms_property, dpms_mode,NULL ); } }drm_modeset_unlock_all (dev);
drivers/gpu/drm/gma500/cdv_intel_dp.c +2 -1
@@ -1655,7 +1655,8 @@ cdv_intel_dp_set_property(struct drm_connector *connector,struct cdv_intel_dp *intel_dp = encoder->dev_priv;int ret; - ret =drm_object_property_set_value (&connector->base, property, val); + ret =drm_object_property_set_value (&connector->base, + &connector->propvals, property, val, blob_data);if (ret)return ret;
drivers/gpu/drm/gma500/cdv_intel_hdmi.c +2 -1
@@ -184,7 +184,8 @@ static int cdv_hdmi_set_property(struct drm_connector *connector,return 0 ;if (drm_object_property_set_value (&connector->base, - property, value)) + &connector->propvals, + property, value, blob_data))return -1 ; centre = (curValue == DRM_MODE_SCALE_NO_SCALE) ||
drivers/gpu/drm/gma500/cdv_intel_lvds.c +4 -2
@@ -486,8 +486,9 @@ static int cdv_intel_lvds_set_property(struct drm_connector *connector,return 0 ;if (drm_object_property_set_value (&connector->base, + &connector->propvals, property, - value)) + value, blob_data))return -1 ; if (crtc->saved_mode.hdisplay != 0 &&
@@ -501,8 +502,9 @@ static int cdv_intel_lvds_set_property(struct drm_connector *connector, } }else if (!strcmp (property->name,"backlight" ) && encoder) {if (drm_object_property_set_value (&connector->base, + &connector->propvals, property, - value)) + value, blob_data))return -1 ;else gma_backlight_set (encoder->dev, value);
drivers/gpu/drm/gma500/mdfld_dsi_output.c +5 -3
@@ -276,7 +276,8 @@ static int mdfld_dsi_connector_set_property(struct drm_connector *connector, goto set_prop_done;if (drm_object_property_set_value (&connector->base, - property, value)) + &connector->propvals, + property, value, blob_data)) goto set_prop_error; centerechange = (val == DRM_MODE_SCALE_NO_SCALE) ||
@@ -300,8 +301,9 @@ static int mdfld_dsi_connector_set_property(struct drm_connector *connector, } } }else if (!strcmp (property->name,"backlight" ) && encoder) { -if (drm_object_property_set_value (&connector->base, property, - value)) +if (drm_object_property_set_value (&connector->base, + &connector->propvals, + property, value, blob_data)) goto set_prop_error;else gma_backlight_set (encoder->dev, value);
drivers/gpu/drm/gma500/psb_intel_lvds.c +4 -2
@@ -606,8 +606,9 @@ int psb_intel_lvds_set_property(struct drm_connector *connector, goto set_prop_done;if (drm_object_property_set_value (&connector->base, + &connector->propvals, property, - value)) + value, blob_data)) goto set_prop_error; if (crtc->saved_mode.hdisplay != 0 &&
@@ -621,8 +622,9 @@ int psb_intel_lvds_set_property(struct drm_connector *connector, } }else if (!strcmp (property->name,"backlight" )) {if (drm_object_property_set_value (&connector->base, + &connector->propvals, property, - value)) + value, blob_data)) goto set_prop_error;else gma_backlight_set (encoder->dev, value);
drivers/gpu/drm/gma500/psb_intel_sdvo.c +14 -5
@@ -1717,7 +1717,8 @@ psb_intel_sdvo_set_property(struct drm_connector *connector,uint8_t cmd;int ret; - ret =drm_object_property_set_value (&connector->base, property, val); + ret =drm_object_property_set_value (&connector->base, + &connector->propvals, property, val, blob_data);if (ret)return ret;
@@ -1773,7 +1774,9 @@ psb_intel_sdvo_set_property(struct drm_connector *connector, temp_value = val;if (psb_intel_sdvo_connector->left == property) {drm_object_property_set_value (&connector->base, - psb_intel_sdvo_connector->right, val); + &connector->propvals, + psb_intel_sdvo_connector->right, + val, blob_data);if (psb_intel_sdvo_connector->left_margin == temp_value)return 0 ;
@@ -1785,7 +1788,9 @@ psb_intel_sdvo_set_property(struct drm_connector *connector, goto set_value; }else if (psb_intel_sdvo_connector->right == property) {drm_object_property_set_value (&connector->base, - psb_intel_sdvo_connector->left, val); + &connector->propvals, + psb_intel_sdvo_connector->left, + val, blob_data);if (psb_intel_sdvo_connector->right_margin == temp_value)return 0 ;
@@ -1797,7 +1802,9 @@ psb_intel_sdvo_set_property(struct drm_connector *connector, goto set_value; }else if (psb_intel_sdvo_connector->top == property) {drm_object_property_set_value (&connector->base, - psb_intel_sdvo_connector->bottom, val); + &connector->propvals, + psb_intel_sdvo_connector->bottom, + val, blob_data);if (psb_intel_sdvo_connector->top_margin == temp_value)return 0 ;
@@ -1809,7 +1816,9 @@ psb_intel_sdvo_set_property(struct drm_connector *connector, goto set_value; }else if (psb_intel_sdvo_connector->bottom == property) {drm_object_property_set_value (&connector->base, - psb_intel_sdvo_connector->top, val); + &connector->propvals, + psb_intel_sdvo_connector->top, + val, blob_data);if (psb_intel_sdvo_connector->bottom_margin == temp_value)return 0 ;
drivers/gpu/drm/i2c/ch7006_drv.c +2 -2
@@ -214,9 +214,9 @@ static enum drm_connector_status ch7006_encoder_detect(struct drm_encoder *encodelse priv->subconnector = DRM_MODE_SUBCONNECTOR_Unknown; -drm_object_property_set_value (&connector->base, +drm_object_property_set_value (&connector->base, &connector->propvals, encoder->dev->mode_config.tv_subconnector_property, - priv->subconnector); + priv->subconnector,NULL );return priv->subconnector ? connector_status_connected : connector_status_disconnected;
drivers/gpu/drm/i915/intel_display.c +2 -1
@@ -9518,8 +9518,9 @@ intel_modeset_update_state(struct drm_device *dev, unsigned prepare_pipes) connector->dpms =DRM_MODE_DPMS_ON ;drm_object_property_set_value (&connector->base, + &connector->propvals, dpms_property, -DRM_MODE_DPMS_ON ); +DRM_MODE_DPMS_ON ,NULL ); intel_encoder =to_intel_encoder (connector->encoder); intel_encoder->connectors_active = true;
drivers/gpu/drm/i915/intel_dp.c +2 -1
@@ -3282,7 +3282,8 @@ intel_dp_set_property(struct drm_connector *connector,struct intel_dp *intel_dp =enc_to_intel_dp (&intel_encoder->base);int ret; - ret =drm_object_property_set_value (&connector->base, property, val); + ret =drm_object_property_set_value (&connector->base, + &connector->propvals, property, val, blob_data);if (ret)return ret;
drivers/gpu/drm/i915/intel_hdmi.c +2 -1
@@ -1055,7 +1055,8 @@ intel_hdmi_set_property(struct drm_connector *connector,struct drm_i915_private *dev_priv = connector->dev->dev_private;int ret; - ret =drm_object_property_set_value (&connector->base, property, val); + ret =drm_object_property_set_value (&connector->base, + &connector->propvals, property, val, blob_data);if (ret)return ret;
drivers/gpu/drm/i915/intel_sdvo.c +14 -5
@@ -2064,7 +2064,8 @@ intel_sdvo_set_property(struct drm_connector *connector,uint8_t cmd;int ret; - ret =drm_object_property_set_value (&connector->base, property, val); + ret =drm_object_property_set_value (&connector->base, + &connector->propvals, property, val, blob_data);if (ret)return ret;
@@ -2141,7 +2142,9 @@ intel_sdvo_set_property(struct drm_connector *connector, temp_value = val;if (intel_sdvo_connector->left == property) {drm_object_property_set_value (&connector->base, - intel_sdvo_connector->right, val); + &connector->propvals, + intel_sdvo_connector->right, + val, blob_data);if (intel_sdvo_connector->left_margin == temp_value)return 0 ;
@@ -2153,7 +2156,9 @@ intel_sdvo_set_property(struct drm_connector *connector, goto set_value; }else if (intel_sdvo_connector->right == property) {drm_object_property_set_value (&connector->base, - intel_sdvo_connector->left, val); + &connector->propvals, + intel_sdvo_connector->left, + val, blob_data);if (intel_sdvo_connector->right_margin == temp_value)return 0 ;
@@ -2165,7 +2170,9 @@ intel_sdvo_set_property(struct drm_connector *connector, goto set_value; }else if (intel_sdvo_connector->top == property) {drm_object_property_set_value (&connector->base, - intel_sdvo_connector->bottom, val); + &connector->propvals, + intel_sdvo_connector->bottom, + val, blob_data);if (intel_sdvo_connector->top_margin == temp_value)return 0 ;
@@ -2177,7 +2184,9 @@ intel_sdvo_set_property(struct drm_connector *connector, goto set_value; }else if (intel_sdvo_connector->bottom == property) {drm_object_property_set_value (&connector->base, - intel_sdvo_connector->top, val); + &connector->propvals, + intel_sdvo_connector->top, + val, blob_data);if (intel_sdvo_connector->bottom_margin == temp_value)return 0 ;
drivers/gpu/drm/i915/intel_tv.c +4 -2
@@ -1297,7 +1297,8 @@ static void intel_tv_find_better_format(struct drm_connector *connector) intel_tv->tv_format = tv_mode->name;drm_object_property_set_value (&connector->base, - connector->dev->mode_config.tv_mode_property, i); + &connector->propvals, + connector->dev->mode_config.tv_mode_property, i,NULL ); }/**
@@ -1456,7 +1457,8 @@ intel_tv_set_property(struct drm_connector *connector,int ret =0 ;bool changed = false; - ret =drm_object_property_set_value (&connector->base, property, val); + ret =drm_object_property_set_value (&connector->base, + &connector->propvals, property, val, blob_data);if (ret <0 ) goto out;
drivers/gpu/drm/nouveau/dispnv04/tvnv17.c +2 -1
@@ -196,8 +196,9 @@ nv17_tv_detect(struct drm_encoder *encoder, struct drm_connector *connector) }drm_object_property_set_value (&connector->base, + &connector->propvals, conf->tv_subconnector_property, - tv_enc->subconnector); + tv_enc->subconnector,NULL );if (!reliable) {return connector_status_unknown;
drivers/gpu/drm/nouveau/nouveau_connector.c +3 -1
@@ -227,10 +227,12 @@ nouveau_connector_set_encoder(struct drm_connector *connector,if (nv_connector->type ==DCB_CONNECTOR_DVI_I ) {drm_object_property_set_value (&connector->base, + &connector->propvals, dev->mode_config.dvi_i_subconnector_property, nv_encoder->dcb->type ==DCB_OUTPUT_TMDS ?DRM_MODE_SUBCONNECTOR_DVID : -DRM_MODE_SUBCONNECTOR_DVIA ); +DRM_MODE_SUBCONNECTOR_DVIA , +NULL ); } }
drivers/gpu/drm/omapdrm/omap_drv.c +4 -2
@@ -579,12 +579,14 @@ static void dev_lastclose(struct drm_device *dev)*/ for (i =0 ; i < priv->num_crtcs; i++) {drm_object_property_set_value (&priv->crtcs[i]->base, - priv->rotation_prop,0 ); + &priv->crtcs[i]->propvals, + priv->rotation_prop,0 ,NULL ); }for (i =0 ; i < priv->num_planes; i++) {drm_object_property_set_value (&priv->planes[i]->base, - priv->rotation_prop,0 ); + &priv->planes[i]->propvals, + priv->rotation_prop,0 ,NULL ); } }
drivers/gpu/drm/rcar-du/rcar_du_lvdscon.c +2 -1
@@ -111,7 +111,8 @@ int rcar_du_lvds_connector_init(struct rcar_du_device *rcdu,drm_helper_connector_dpms (connector,DRM_MODE_DPMS_OFF );drm_object_property_set_value (&connector->base, - rcdu->ddev->mode_config.dpms_property,DRM_MODE_DPMS_OFF ); + &connector->propvals, + rcdu->ddev->mode_config.dpms_property,DRM_MODE_DPMS_OFF ,NULL ); ret =drm_mode_connector_attach_encoder (connector, &renc->encoder);if (ret <0 )
drivers/gpu/drm/rcar-du/rcar_du_vgacon.c +2 -1
@@ -76,7 +76,8 @@ int rcar_du_vga_connector_init(struct rcar_du_device *rcdu,drm_helper_connector_dpms (connector,DRM_MODE_DPMS_OFF );drm_object_property_set_value (&connector->base, - rcdu->ddev->mode_config.dpms_property,DRM_MODE_DPMS_OFF ); + &connector->propvals, + rcdu->ddev->mode_config.dpms_property,DRM_MODE_DPMS_OFF ,NULL ); ret =drm_mode_connector_attach_encoder (connector, &renc->encoder);if (ret <0 )
drivers/gpu/drm/shmobile/shmob_drm_crtc.c +2 -2
@@ -741,8 +741,8 @@ int shmob_drm_connector_create(struct shmob_drm_device *sdev, connector->encoder = encoder;drm_helper_connector_dpms (connector,DRM_MODE_DPMS_OFF ); -drm_object_property_set_value (&connector->base, - sdev->ddev->mode_config.dpms_property,DRM_MODE_DPMS_OFF ); +drm_object_property_set_value (&connector->base, &connector->propvals, + sdev->ddev->mode_config.dpms_property,DRM_MODE_DPMS_OFF ,NULL );return 0 ;
include/drm/drm_crtc.h +10 -1
@@ -41,6 +41,7 @@ struct drm_framebuffer;struct drm_object_properties ;struct drm_file ;struct drm_clip_rect ; +struct drm_object_property_values ;#define DRM_MODE_OBJECT_CRTC 0xcccccccc#define DRM_MODE_OBJECT_CONNECTOR 0xc0c0c0c0
@@ -57,12 +58,16 @@ struct drm_mode_object {uint32_t id;uint32_t type;struct drm_object_properties *properties; +struct drm_object_property_values *propvals; };#define DRM_OBJECT_MAX_PROPERTY 24struct drm_object_properties {int count;uint32_t ids[DRM_OBJECT_MAX_PROPERTY ]; +}; + +struct drm_object_property_values {uint64_t values[DRM_OBJECT_MAX_PROPERTY ]; };
@@ -362,6 +367,7 @@ struct drm_crtc {void *helper_private;struct drm_object_properties properties; +struct drm_object_property_values propvals; };
@@ -525,6 +531,7 @@ struct drm_connector {struct drm_property_blob *edid_blob_ptr;struct drm_object_properties properties; +struct drm_object_property_values propvals;uint8_t polled;/* DRM_CONNECTOR_POLL_* */
@@ -608,6 +615,7 @@ struct drm_plane {const struct drm_plane_funcs *funcs;struct drm_object_properties properties; +struct drm_object_property_values propvals;enum drm_plane_type type; };
@@ -971,8 +979,9 @@ static inline bool drm_property_type_valid(struct drm_property *property) }extern int drm_object_property_set_value (struct drm_mode_object *obj, +struct drm_object_property_values *propvals,struct drm_property *property, -uint64_t val); +uint64_t val,void *blob_data);extern int drm_object_property_get_value (struct drm_mode_object *obj,struct drm_property *property,uint64_t *value);
Signature · 1 line
1.9.3
PATCH 3/7 drm: Refactor object property check code
In reply to Rob ClarkFrom: Ville Syrjälä <[email protected]>
Refactor the code to check whether an object has a specific property to a new function.
v1: original
v2: rebase on atomic -- Rob Clark
v3: EINVAL->ENOENT
--- drivers/gpu/drm/drm_crtc.c | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-)
drivers/gpu/drm/drm_crtc.c +14 -11
@@ -3944,6 +3944,19 @@ static int drm_mode_set_obj_prop(struct drm_device *dev,return -EINVAL ; } +static bool object_has_prop (const struct drm_mode_object *obj,u32 prop_id) +{ +int i; + +if (!obj->properties) +return false; + +for (i =0 ; i < obj->properties->count; i++) +if (obj->properties->ids[i] == prop_id) +return true; +return false; +} +/* call with mode_config mutex held */ static int drm_mode_set_obj_prop_id(struct drm_device *dev, struct drm_atomic_state *state,
@@ -3952,20 +3965,10 @@ static int drm_mode_set_obj_prop_id(struct drm_device *dev, {struct drm_mode_object *arg_obj;struct drm_property *property; -int i; arg_obj =drm_mode_object_find (dev, obj_id, obj_type); -if (!arg_obj) +if (!(arg_obj &&object_has_prop (arg_obj, prop_id)))return -ENOENT ; -if (!arg_obj->properties) -return -EINVAL ; - -for (i =0 ; i < arg_obj->properties->count; i++) -if (arg_obj->properties->ids[i] == prop_id) -break ; - -if (i == arg_obj->properties->count) -return -EINVAL ; property =drm_property_find (dev, prop_id);if (!property)
Signature · 6 lines
1.9.3 _______________________________________________ dri-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/dri-devel
PATCH 4/7 drm: convert plane to properties/state
In reply to Rob ClarkBreak the mutable state of a plane out into a separate structure and use atomic properties mechanism to set plane attributes. This makes it easier to have some helpers for plane->set_property() and for checking for invalid params. The idea is that individual drivers can wrap the state struct in their own struct which adds driver specific parameters, for easy build-up of state across multiple set_property() calls and for easy atomic commit or roll- back.
The same should be done for CRTC, encoder, and connector, but this patch only includes the first part (plane).
--- drivers/gpu/drm/armada/armada_overlay.c | 11 +- drivers/gpu/drm/drm_atomic.c | 225 ++++++++++++++- drivers/gpu/drm/drm_crtc.c | 441 ++++++++++++++++++++--------- drivers/gpu/drm/drm_fb_helper.c | 30 +- drivers/gpu/drm/drm_plane_helper.c | 2 + drivers/gpu/drm/exynos/exynos_drm_plane.c | 7 +- drivers/gpu/drm/i915/intel_sprite.c | 1 + drivers/gpu/drm/msm/mdp/mdp4/mdp4_plane.c | 6 +- drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c | 6 +- drivers/gpu/drm/nouveau/dispnv04/overlay.c | 8 +- drivers/gpu/drm/omapdrm/omap_drv.c | 2 +- drivers/gpu/drm/omapdrm/omap_plane.c | 7 + drivers/gpu/drm/rcar-du/rcar_du_plane.c | 8 +- drivers/gpu/drm/shmobile/shmob_drm_plane.c | 2 + include/drm/drm_atomic.h | 29 +- include/drm/drm_crtc.h | 112 +++++++- 16 files changed, 736 insertions(+), 161 deletions(-)
drivers/gpu/drm/armada/armada_overlay.c +10 -1
@@ -7,6 +7,7 @@* published by the Free Software Foundation. */ #include <drm/drmP.h> +#include <drm/drm_atomic.h> #include "armada_crtc.h" #include "armada_drm.h" #include "armada_fb.h"
@@ -288,7 +289,12 @@ static int armada_plane_set_property(struct drm_plane *plane, {struct armada_private *priv = plane->dev->dev_private;struct armada_plane *dplane =drm_to_armada_plane (plane); +struct drm_plane_state *pstate =drm_atomic_get_plane_state (plane, state);bool update_attr = false; +int ret =0 ; + +if (IS_ERR (pstate)) +return PTR_ERR (pstate);if (property == priv->colorkey_prop) {#define CCC (v) ((v) << 24 | (v) << 16 | (v) << 8)
@@ -342,13 +348,16 @@ static int armada_plane_set_property(struct drm_plane *plane, }else if (property == priv->saturation_prop) { dplane->prop.saturation = val; update_attr = true; + }else { + ret =drm_plane_set_property (plane, pstate, property, + val, blob_data); }if (update_attr && dplane->base.crtc)armada_ovl_update_attr (&dplane->prop,drm_to_armada_crtc (dplane->base.crtc)); -return 0 ; +return ret; }static const struct drm_plane_funcs armada_plane_funcs = {
drivers/gpu/drm/drm_atomic.c +223 -2
273 lines not on this page · raw message
drivers/gpu/drm/drm_crtc.c +305 -136
564 lines not on this page · raw message
drivers/gpu/drm/drm_fb_helper.c +20 -10
@@ -273,18 +273,33 @@ int drm_fb_helper_debug_leave(struct fb_info *info) }EXPORT_SYMBOL (drm_fb_helper_debug_leave); -static bool restore_fbdev_mode (struct drm_fb_helper *fb_helper) +static bool restore_fbdev_mode (struct drm_fb_helper *fb_helper, +bool lockless) {struct drm_device *dev = fb_helper->dev;struct drm_plane *plane;bool error = false; +void *state;int i; -drm_warn_on_modeset_not_all_locked (dev); + state = dev->driver->atomic_begin (dev, lockless ? +DRM_MODE_ATOMIC_NOLOCK :0 ); +if (IS_ERR (state)) { +DRM_ERROR ("failed to restore fbdev mode\n" ); +return true; + }list_for_each_entry (plane, &dev->mode_config.plane_list, head)if (plane->type !=DRM_PLANE_TYPE_PRIMARY ) -drm_plane_force_disable (plane); +drm_plane_force_disable (plane, state); + +/* just disabling stuff shouldn't fail, hopefully: */ +if (dev->driver->atomic_check (dev, state)) +DRM_ERROR ("failed to restore fbdev mode\n" ); +else + dev->driver->atomic_commit (dev, state); + + dev->driver->atomic_end (dev, state);for (i =0 ; i < fb_helper->crtc_count; i++) {struct drm_mode_set *mode_set = &fb_helper->crtc_info[i].mode_set;
@@ -318,7 +333,7 @@ static bool restore_fbdev_mode(struct drm_fb_helper *fb_helper)*/ bool drm_fb_helper_restore_fbdev_mode (struct drm_fb_helper *fb_helper) { -return restore_fbdev_mode (fb_helper); +return restore_fbdev_mode (fb_helper, true); }EXPORT_SYMBOL (drm_fb_helper_restore_fbdev_mode);
@@ -332,12 +347,7 @@ EXPORT_SYMBOL(drm_fb_helper_restore_fbdev_mode);*/ bool drm_fb_helper_restore_fbdev_mode_unlocked (struct drm_fb_helper *fb_helper) { -struct drm_device *dev = fb_helper->dev; -bool ret; -drm_modeset_lock_all (dev); - ret =restore_fbdev_mode (fb_helper); -drm_modeset_unlock_all (dev); -return ret; +return restore_fbdev_mode (fb_helper, false); }EXPORT_SYMBOL (drm_fb_helper_restore_fbdev_mode_unlocked);
drivers/gpu/drm/drm_plane_helper.c +2 -0
@@ -26,6 +26,7 @@#include <linux/list.h> #include <drm/drmP.h> #include <drm/drm_rect.h> +#include <drm/drm_atomic.h> #define SUBPIXEL_MASK 0xffff
@@ -241,6 +242,7 @@ EXPORT_SYMBOL(drm_primary_helper_destroy);const struct drm_plane_funcs drm_primary_helper_funcs = { .update_plane = drm_primary_helper_update, .disable_plane = drm_primary_helper_disable, + .set_property = drm_atomic_plane_set_property, .destroy = drm_primary_helper_destroy, };EXPORT_SYMBOL (drm_primary_helper_funcs);
drivers/gpu/drm/exynos/exynos_drm_plane.c +6 -1
@@ -10,6 +10,7 @@*/ #include <drm/drmP.h> +#include <drm/drm_atomic.h> #include <drm/exynos_drm.h> #include "exynos_drm_drv.h"
@@ -220,13 +221,17 @@ static int exynos_plane_set_property(struct drm_plane *plane,struct drm_device *dev = plane->dev;struct exynos_plane *exynos_plane =to_exynos_plane (plane);struct exynos_drm_private *dev_priv = dev->dev_private; +struct drm_plane_state *pstate =drm_atomic_get_plane_state (plane, state); + +if (IS_ERR (pstate)) +return PTR_ERR (pstate);if (property == dev_priv->plane_zpos_property) { exynos_plane->overlay.zpos = val;return 0 ; } -return -EINVAL ; +return drm_plane_set_property (plane, pstate, property, val, blob_data); }static struct drm_plane_funcs exynos_plane_funcs = {
drivers/gpu/drm/i915/intel_sprite.c +1 -0
@@ -1190,6 +1190,7 @@ static const struct drm_plane_funcs intel_plane_funcs = { .update_plane = intel_update_plane, .disable_plane = intel_disable_plane, .destroy = intel_destroy_plane, + .set_property = drm_atomic_plane_set_property, };static uint32_t ilk_plane_formats[] = {
drivers/gpu/drm/msm/mdp/mdp4/mdp4_plane.c +4 -2
@@ -88,8 +88,10 @@ int mdp4_plane_set_property(struct drm_plane *plane, struct drm_atomic_state *state, struct drm_property *property, uint64_t val, void *blob_data) { - // XXX - return -EINVAL; + struct drm_plane_state *pstate = drm_atomic_get_plane_state(plane, state); +if (IS_ERR (pstate)) +return PTR_ERR (pstate); +return drm_plane_set_property (plane, pstate, property, val, blob_data); } static const struct drm_plane_funcs mdp4_plane_funcs = {
drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c +4 -2
@@ -103,8 +103,10 @@ int mdp5_plane_set_property(struct drm_plane *plane, struct drm_atomic_state *state, struct drm_property *property, uint64_t val, void *blob_data) { - // XXX - return -EINVAL; + struct drm_plane_state *pstate = drm_atomic_get_plane_state(plane, state); +if (IS_ERR (pstate)) +return PTR_ERR (pstate); +return drm_plane_set_property (plane, pstate, property, val, blob_data); } static const struct drm_plane_funcs mdp5_plane_funcs = {
drivers/gpu/drm/nouveau/dispnv04/overlay.c +7 -1
@@ -24,6 +24,7 @@*/ #include <drm/drmP.h> +#include <drm/drm_atomic.h> #include <drm/drm_crtc.h> #include <drm/drm_fourcc.h>
@@ -226,6 +227,10 @@ nv_set_property(struct drm_plane *plane, uint64_t value, void *blob_data) { struct nouveau_plane *nv_plane = (struct nouveau_plane *)plane; +struct drm_plane_state *pstate =drm_atomic_get_plane_state (plane, state); + +if (IS_ERR (pstate)) +return PTR_ERR (pstate);if (property == nv_plane->props.colorkey) nv_plane->colorkey = value;
@@ -240,7 +245,8 @@ nv_set_property(struct drm_plane *plane,else if (property == nv_plane->props.iturbt_709) nv_plane->iturbt_709 = value;else -return -EINVAL ; +return drm_plane_set_property (plane, pstate, + property, value, blob_data);if (nv_plane->set_params) nv_plane->set_params (nv_plane);
drivers/gpu/drm/omapdrm/omap_drv.c +1 -1
@@ -585,7 +585,7 @@ static void dev_lastclose(struct drm_device *dev)for (i =0 ; i < priv->num_planes; i++) {drm_object_property_set_value (&priv->planes[i]->base, - &priv->planes[i]->propvals, + &priv->planes[i]->state->propvals, priv->rotation_prop,0 ,NULL ); } }
drivers/gpu/drm/omapdrm/omap_plane.c +7 -0
@@ -341,8 +341,12 @@ int omap_plane_set_property(struct drm_plane *plane, {struct omap_plane *omap_plane =to_omap_plane (plane);struct omap_drm_private *priv = plane->dev->dev_private; +struct drm_plane_state *pstate =drm_atomic_get_plane_state (plane, state);int ret = -EINVAL ; +if (IS_ERR (pstate)) +return PTR_ERR (pstate); +if (property == priv->rotation_prop) {DBG ("%s: rotation: %02x" , omap_plane->name, (uint32_t )val); omap_plane->win.rotation = val;
@@ -351,6 +355,9 @@ int omap_plane_set_property(struct drm_plane *plane,DBG ("%s: zorder: %02x" , omap_plane->name, (uint32_t )val); omap_plane->info.zorder = val; ret =apply (plane); + }else { + ret =drm_plane_set_property (plane, pstate, property, + val, blob_data); }return ret;
drivers/gpu/drm/rcar-du/rcar_du_plane.c +7 -1
@@ -14,6 +14,7 @@#include <drm/drmP.h> #include <drm/drm_crtc.h> #include <drm/drm_crtc_helper.h> +#include <drm/drm_atomic.h> #include <drm/drm_fb_cma_helper.h> #include <drm/drm_gem_cma_helper.h>
@@ -404,6 +405,10 @@ static int rcar_du_plane_set_property(struct drm_plane *plane, {struct rcar_du_plane *rplane =to_rcar_plane (plane);struct rcar_du_group *rgrp = rplane->group; +struct drm_plane_state *pstate =drm_atomic_get_plane_state (plane, state); + +if (IS_ERR (pstate)) +return PTR_ERR (pstate);if (property == rgrp->planes.alpha)rcar_du_plane_set_alpha (rplane, value);
@@ -412,7 +417,8 @@ static int rcar_du_plane_set_property(struct drm_plane *plane,else if (property == rgrp->planes.zpos)rcar_du_plane_set_zpos (rplane, value);else -return -EINVAL ; +return drm_plane_set_property (plane, pstate, + property, value, blob_data);return 0 ; }
drivers/gpu/drm/shmobile/shmob_drm_plane.c +2 -0
@@ -14,6 +14,7 @@#include <drm/drmP.h> #include <drm/drm_crtc.h> #include <drm/drm_crtc_helper.h> +#include <drm/drm_atomic.h> #include <drm/drm_fb_cma_helper.h> #include <drm/drm_gem_cma_helper.h>
@@ -228,6 +229,7 @@ static void shmob_drm_plane_destroy(struct drm_plane *plane)static const struct drm_plane_funcs shmob_drm_plane_funcs = { .update_plane = shmob_drm_plane_update, .disable_plane = shmob_drm_plane_disable, + .set_property = drm_atomic_plane_set_property, .destroy = shmob_drm_plane_destroy, };
include/drm/drm_atomic.h +28 -1
@@ -68,7 +68,8 @@* struct drm_atomic_funcs - helper funcs used by the atomic helpers */ struct drm_atomic_funcs { -int dummy;/* for now */ +int (*check_plane_state)(struct drm_plane *plane,struct drm_plane_state *pstate); +int (*commit_plane_state)(struct drm_plane *plane,struct drm_plane_state *pstate); };const extern struct drm_atomic_funcs drm_atomic_funcs;
@@ -84,6 +85,30 @@ int drm_atomic_commit_unlocked(struct drm_device *dev, struct drm_atomic_state *state);void drm_atomic_end (struct drm_device *dev,struct drm_atomic_state *state); +int drm_atomic_plane_set_property (struct drm_plane *plane, +struct drm_atomic_state *state,struct drm_property *property, +uint64_t val,void *blob_data); +struct drm_plane_state *drm_atomic_get_plane_state (struct drm_plane *plane, +struct drm_atomic_state *state); + +static inline int +drm_atomic_check_plane_state (struct drm_plane *plane, +struct drm_plane_state *pstate) +{ +const struct drm_atomic_funcs *funcs = + plane->dev->driver->atomic_funcs; +return funcs->check_plane_state (plane, pstate); +} + +static inline int +drm_atomic_commit_plane_state (struct drm_plane *plane, +struct drm_plane_state *pstate) +{ +const struct drm_atomic_funcs *funcs = + plane->dev->driver->atomic_funcs; +return funcs->commit_plane_state (plane, pstate); +} +/** * struct drm_atomic_state - the state object used by atomic helpers */
@@ -91,6 +116,8 @@ struct drm_atomic_state {struct kref refcount;struct drm_device *dev;uint32_t flags; +struct drm_plane **planes; +struct drm_plane_state **pstates;bool committed;bool checked;/* just for debugging */
include/drm/drm_crtc.h +109 -3
168 lines not on this page · raw message
Signature · 1 line
1.9.3
PATCH 5/7 drm: convert crtc to properties/state
In reply to Rob ClarkBreak the mutable state of a crtc out into a separate structure and use atomic properties mechanism to set crtc attributes. This makes it easier to have some helpers for crtc->set_property() and for checking for invalid params. The idea is that individual drivers can wrap the state struct in their own struct which adds driver specific parameters, for easy build-up of state across multiple set_property() calls and for easy atomic commit or roll- back.
--- drivers/gpu/drm/armada/armada_crtc.c | 11 +- drivers/gpu/drm/ast/ast_mode.c | 1 + drivers/gpu/drm/cirrus/cirrus_mode.c | 1 + drivers/gpu/drm/drm_atomic.c | 231 ++++++++++- drivers/gpu/drm/drm_crtc.c | 631 +++++++++++++++++++---------- drivers/gpu/drm/drm_fb_helper.c | 24 +- drivers/gpu/drm/exynos/exynos_drm_crtc.c | 7 +- drivers/gpu/drm/gma500/cdv_intel_display.c | 1 + drivers/gpu/drm/gma500/psb_intel_display.c | 1 + drivers/gpu/drm/i915/intel_display.c | 1 + drivers/gpu/drm/mgag200/mgag200_mode.c | 1 + drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c | 6 +- drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c | 6 +- drivers/gpu/drm/nouveau/dispnv04/crtc.c | 1 + drivers/gpu/drm/nouveau/nv50_display.c | 1 + drivers/gpu/drm/omapdrm/omap_crtc.c | 12 +- drivers/gpu/drm/omapdrm/omap_drv.c | 2 +- drivers/gpu/drm/qxl/qxl_display.c | 2 + drivers/gpu/drm/radeon/radeon_display.c | 2 + drivers/gpu/drm/rcar-du/rcar_du_crtc.c | 2 + drivers/gpu/drm/shmobile/shmob_drm_crtc.c | 2 + drivers/gpu/drm/tilcdc/tilcdc_crtc.c | 1 + drivers/gpu/drm/udl/udl_modeset.c | 2 + drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c | 1 + drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c | 1 + include/drm/drm_atomic.h | 29 ++ include/drm/drm_crtc.h | 103 ++++- 27 files changed, 837 insertions(+), 246 deletions(-)
drivers/gpu/drm/armada/armada_crtc.c +10 -1
@@ -9,6 +9,7 @@#include <linux/clk.h> #include <drm/drmP.h> #include <drm/drm_crtc_helper.h> +#include <drm/drm_atomic.h> #include "armada_crtc.h" #include "armada_drm.h" #include "armada_fb.h"
@@ -966,7 +967,12 @@ armada_drm_crtc_set_property(struct drm_crtc *crtc, {struct armada_private *priv = crtc->dev->dev_private;struct armada_crtc *dcrtc =drm_to_armada_crtc (crtc); +struct drm_crtc_state *cstate =drm_atomic_get_crtc_state (crtc, state);bool update_csc = false; +int ret =0 ; + +if (IS_ERR (cstate)) +return PTR_ERR (cstate);if (property == priv->csc_yuv_prop) { dcrtc->csc_yuv_mode = val;
@@ -974,6 +980,9 @@ armada_drm_crtc_set_property(struct drm_crtc *crtc, }else if (property == priv->csc_rgb_prop) { dcrtc->csc_rgb_mode = val; update_csc = true; + }else { + ret =drm_crtc_set_property (crtc, cstate, property, + val, blob_data); }if (update_csc) {
@@ -984,7 +993,7 @@ armada_drm_crtc_set_property(struct drm_crtc *crtc,writel_relaxed (val, dcrtc->base +LCD_SPU_IOPAD_CONTROL ); } -return 0 ; +return ret; }static struct drm_crtc_funcs armada_crtc_funcs = {
drivers/gpu/drm/ast/ast_mode.c +1 -0
@@ -632,6 +632,7 @@ static const struct drm_crtc_funcs ast_crtc_funcs = { .cursor_move = ast_cursor_move, .reset = ast_crtc_reset, .set_config = drm_crtc_helper_set_config, + .set_property = drm_atomic_crtc_set_property, .gamma_set = ast_crtc_gamma_set, .destroy = ast_crtc_destroy, };
drivers/gpu/drm/cirrus/cirrus_mode.c +1 -0
@@ -366,6 +366,7 @@ static void cirrus_crtc_destroy(struct drm_crtc *crtc)static const struct drm_crtc_funcs cirrus_crtc_funcs = { .gamma_set = cirrus_crtc_gamma_set, .set_config = drm_crtc_helper_set_config, + .set_property = drm_atomic_crtc_set_property, .destroy = cirrus_crtc_destroy, };
drivers/gpu/drm/drm_atomic.c +228 -3
322 lines not on this page · raw message
drivers/gpu/drm/drm_crtc.c +415 -216
826 lines not on this page · raw message
drivers/gpu/drm/drm_fb_helper.c +22 -2
@@ -36,6 +36,7 @@#include <linux/module.h> #include <drm/drmP.h> #include <drm/drm_crtc.h> +#include <drm/drm_atomic.h> #include <drm/drm_fb_helper.h> #include <drm/drm_crtc_helper.h>
@@ -277,10 +278,11 @@ static bool restore_fbdev_mode(struct drm_fb_helper *fb_helper, bool lockless) {struct drm_device *dev = fb_helper->dev; +struct drm_mode_config *config = &dev->mode_config;struct drm_plane *plane;bool error = false; -void *state; -int i; +struct drm_atomic_state *state; +int ret, i; state = dev->driver->atomic_begin (dev, lockless ?DRM_MODE_ATOMIC_NOLOCK :0 );
@@ -289,6 +291,14 @@ static bool restore_fbdev_mode(struct drm_fb_helper *fb_helper,return true; } +retry: + ret =drm_modeset_lock (&config->connection_mutex, &state->acquire_ctx); +if (ret) + goto out; + ret =drm_modeset_lock_all_crtcs (dev, &state->acquire_ctx); +if (ret) + goto out; +list_for_each_entry (plane, &dev->mode_config.plane_list, head)if (plane->type !=DRM_PLANE_TYPE_PRIMARY )drm_plane_force_disable (plane, state);
@@ -299,8 +309,15 @@ static bool restore_fbdev_mode(struct drm_fb_helper *fb_helper,else dev->driver->atomic_commit (dev, state); +out: +if (ret == -EDEADLK ) { +drm_modeset_backoff (&state->acquire_ctx); + goto retry; + } dev->driver->atomic_end (dev, state); +drm_modeset_lock_all (dev); +for (i =0 ; i < fb_helper->crtc_count; i++) {struct drm_mode_set *mode_set = &fb_helper->crtc_info[i].mode_set;struct drm_crtc *crtc = mode_set->crtc;
@@ -316,6 +333,9 @@ static bool restore_fbdev_mode(struct drm_fb_helper *fb_helper,if (ret) error = true; } + +drm_modeset_unlock_all (dev); +return error; }/**
drivers/gpu/drm/exynos/exynos_drm_crtc.c +6 -1
@@ -14,6 +14,7 @@#include <drm/drmP.h> #include <drm/drm_crtc_helper.h> +#include <drm/drm_atomic.h> #include "exynos_drm_crtc.h" #include "exynos_drm_drv.h"
@@ -289,6 +290,10 @@ static int exynos_drm_crtc_set_property(struct drm_crtc *crtc,struct drm_device *dev = crtc->dev;struct exynos_drm_private *dev_priv = dev->dev_private;struct exynos_drm_crtc *exynos_crtc =to_exynos_crtc (crtc); +struct drm_crtc_state *cstate =drm_atomic_get_crtc_state (crtc, state); + +if (IS_ERR (cstate)) +return PTR_ERR (cstate);if (property == dev_priv->crtc_mode_property) {enum exynos_crtc_mode mode = val;
@@ -313,7 +318,7 @@ static int exynos_drm_crtc_set_property(struct drm_crtc *crtc,return 0 ; } -return -EINVAL ; +return drm_crtc_set_property (crtc, cstate, property, val, blob_data); }static struct drm_crtc_funcs exynos_crtc_funcs = {
drivers/gpu/drm/gma500/cdv_intel_display.c +1 -0
@@ -989,6 +989,7 @@ const struct drm_crtc_funcs cdv_intel_crtc_funcs = { .cursor_move = gma_crtc_cursor_move, .gamma_set = gma_crtc_gamma_set, .set_config = gma_crtc_set_config, + .set_property = drm_atomic_crtc_set_property, .destroy = gma_crtc_destroy, };
drivers/gpu/drm/gma500/psb_intel_display.c +1 -0
@@ -444,6 +444,7 @@ const struct drm_crtc_funcs psb_intel_crtc_funcs = { .cursor_move = gma_crtc_cursor_move, .gamma_set = gma_crtc_gamma_set, .set_config = gma_crtc_set_config, + .set_property = drm_atomic_crtc_set_property, .destroy = gma_crtc_destroy, };
drivers/gpu/drm/i915/intel_display.c +1 -0
@@ -10454,6 +10454,7 @@ static const struct drm_crtc_funcs intel_crtc_funcs = { .cursor_move = intel_crtc_cursor_move, .gamma_set = intel_crtc_gamma_set, .set_config = intel_crtc_set_config, + .set_property = drm_atomic_crtc_set_property, .destroy = intel_crtc_destroy, .page_flip = intel_crtc_page_flip, };
drivers/gpu/drm/mgag200/mgag200_mode.c +1 -0
@@ -1296,6 +1296,7 @@ static const struct drm_crtc_funcs mga_crtc_funcs = { .cursor_move = mga_crtc_cursor_move, .gamma_set = mga_crtc_gamma_set, .set_config = drm_crtc_helper_set_config, + .set_property = drm_atomic_crtc_set_property, .destroy = mga_crtc_destroy, };
drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c +4 -2
@@ -471,8 +471,10 @@ static int mdp4_crtc_set_property(struct drm_crtc *crtc, struct drm_atomic_state *state, struct drm_property *property, uint64_t val, void *blob_data) { - // XXX - return -EINVAL; + struct drm_crtc_state *cstate = drm_atomic_get_crtc_state(crtc, state); +if (IS_ERR (cstate)) +return PTR_ERR (cstate); +return drm_crtc_set_property (crtc, cstate, property, val, blob_data); }#define CURSOR_WIDTH 64
drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c +4 -2
@@ -389,8 +389,10 @@ static int mdp5_crtc_set_property(struct drm_crtc *crtc, struct drm_atomic_state *state, struct drm_property *property, uint64_t val, void *blob_data) { - // XXX - return -EINVAL; + struct drm_crtc_state *cstate = drm_atomic_get_crtc_state(crtc, state); +if (IS_ERR (cstate)) +return PTR_ERR (cstate); +return drm_crtc_set_property (crtc, cstate, property, val, blob_data); } static const struct drm_crtc_funcs mdp5_crtc_funcs = {
drivers/gpu/drm/nouveau/dispnv04/crtc.c +1 -0
@@ -1086,6 +1086,7 @@ static const struct drm_crtc_funcs nv04_crtc_funcs = { .cursor_move = nv04_crtc_cursor_move, .gamma_set = nv_crtc_gamma_set, .set_config = nouveau_crtc_set_config, + .set_property = drm_atomic_crtc_set_property, .page_flip = nouveau_crtc_page_flip, .destroy = nv_crtc_destroy, };
drivers/gpu/drm/nouveau/nv50_display.c +1 -0
@@ -1329,6 +1329,7 @@ static const struct drm_crtc_funcs nv50_crtc_func = { .cursor_move = nv50_crtc_cursor_move, .gamma_set = nv50_crtc_gamma_set, .set_config = nouveau_crtc_set_config, + .set_property = drm_atomic_crtc_set_property, .destroy = nv50_crtc_destroy, .page_flip = nouveau_crtc_page_flip, };
drivers/gpu/drm/omapdrm/omap_crtc.c +10 -2
@@ -387,14 +387,22 @@ static int omap_crtc_set_property(struct drm_crtc *crtc, {struct omap_crtc *omap_crtc =to_omap_crtc (crtc);struct omap_drm_private *priv = crtc->dev->dev_private; +struct drm_crtc_state *cstate =drm_atomic_get_crtc_state (crtc, state); +int ret; + +if (IS_ERR (cstate)) +return PTR_ERR (cstate);if (property == priv->rotation_prop) { - crtc->invert_dimensions = + cstate->invert_dimensions = !!(val & ((1LL <<DRM_ROTATE_90 ) | (1LL <<DRM_ROTATE_270 ))); } -return omap_plane_set_property (omap_crtc->plane, state, + ret =omap_plane_set_property (omap_crtc->plane, state, property, val, blob_data); +if (ret) + ret =drm_crtc_set_property (crtc, cstate, property, val, blob_data); +return ret; }static const struct drm_crtc_funcs omap_crtc_funcs = {
drivers/gpu/drm/omapdrm/omap_drv.c +1 -1
@@ -579,7 +579,7 @@ static void dev_lastclose(struct drm_device *dev)*/ for (i =0 ; i < priv->num_crtcs; i++) {drm_object_property_set_value (&priv->crtcs[i]->base, - &priv->crtcs[i]->propvals, + &priv->crtcs[i]->state->propvals, priv->rotation_prop,0 ,NULL ); }
drivers/gpu/drm/qxl/qxl_display.c +2 -0
@@ -29,6 +29,7 @@#include "qxl_drv.h" #include "qxl_object.h" #include "drm_crtc_helper.h" +#include "drm_atomic.h" static bool qxl_head_enabled (struct qxl_head *head) {
@@ -373,6 +374,7 @@ static const struct drm_crtc_funcs qxl_crtc_funcs = { .cursor_set2 = qxl_crtc_cursor_set2, .cursor_move = qxl_crtc_cursor_move, .set_config = drm_crtc_helper_set_config, + .set_property = drm_atomic_crtc_set_property, .destroy = qxl_crtc_destroy, };
drivers/gpu/drm/radeon/radeon_display.c +2 -0
@@ -32,6 +32,7 @@#include <linux/pm_runtime.h> #include <drm/drm_crtc_helper.h> +#include <drm/drm_atomic.h> #include <drm/drm_edid.h> #include <linux/gcd.h>
@@ -546,6 +547,7 @@ static const struct drm_crtc_funcs radeon_crtc_funcs = { .cursor_move = radeon_crtc_cursor_move, .gamma_set = radeon_crtc_gamma_set, .set_config = radeon_crtc_set_config, + .set_property = drm_atomic_crtc_set_property, .destroy = radeon_crtc_destroy, .page_flip = radeon_crtc_page_flip, };
drivers/gpu/drm/rcar-du/rcar_du_crtc.c +2 -0
@@ -17,6 +17,7 @@#include <drm/drmP.h> #include <drm/drm_crtc.h> #include <drm/drm_crtc_helper.h> +#include <drm/drm_atomic.h> #include <drm/drm_fb_cma_helper.h> #include <drm/drm_gem_cma_helper.h>
@@ -527,6 +528,7 @@ static int rcar_du_crtc_page_flip(struct drm_crtc *crtc,static const struct drm_crtc_funcs crtc_funcs = { .destroy = drm_crtc_cleanup, .set_config = drm_crtc_helper_set_config, + .set_property = drm_atomic_crtc_set_property, .page_flip = rcar_du_crtc_page_flip, };
drivers/gpu/drm/shmobile/shmob_drm_crtc.c +2 -0
@@ -17,6 +17,7 @@#include <drm/drmP.h> #include <drm/drm_crtc.h> #include <drm/drm_crtc_helper.h> +#include <drm/drm_atomic.h> #include <drm/drm_fb_cma_helper.h> #include <drm/drm_gem_cma_helper.h>
@@ -506,6 +507,7 @@ static int shmob_drm_crtc_page_flip(struct drm_crtc *crtc,static const struct drm_crtc_funcs crtc_funcs = { .destroy = drm_crtc_cleanup, .set_config = drm_crtc_helper_set_config, + .set_property = drm_atomic_crtc_set_property, .page_flip = shmob_drm_crtc_page_flip, };
drivers/gpu/drm/tilcdc/tilcdc_crtc.c +1 -0
@@ -411,6 +411,7 @@ static int tilcdc_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,static const struct drm_crtc_funcs tilcdc_crtc_funcs = { .destroy = tilcdc_crtc_destroy, .set_config = drm_crtc_helper_set_config, + .set_property = drm_atomic_crtc_set_property, .page_flip = tilcdc_crtc_page_flip, };
drivers/gpu/drm/udl/udl_modeset.c +2 -0
@@ -14,6 +14,7 @@#include <drm/drmP.h> #include <drm/drm_crtc.h> #include <drm/drm_crtc_helper.h> +#include <drm/drm_atomic.h> #include "udl_drv.h" /*
@@ -383,6 +384,7 @@ static struct drm_crtc_helper_funcs udl_helper_funcs = {static const struct drm_crtc_funcs udl_crtc_funcs = { .set_config = drm_crtc_helper_set_config, + .set_property = drm_atomic_crtc_set_property, .destroy = udl_crtc_destroy, };
drivers/gpu/drm/vmwgfx/vmwgfx_ldu.c +1 -0
@@ -300,6 +300,7 @@ static struct drm_crtc_funcs vmw_legacy_crtc_funcs = { .cursor_move = vmw_du_crtc_cursor_move, .gamma_set = vmw_du_crtc_gamma_set, .destroy = vmw_ldu_crtc_destroy, + .set_property = drm_atomic_crtc_set_property, .set_config = vmw_ldu_crtc_set_config, };
drivers/gpu/drm/vmwgfx/vmwgfx_scrn.c +1 -0
@@ -397,6 +397,7 @@ static struct drm_crtc_funcs vmw_screen_object_crtc_funcs = { .gamma_set = vmw_du_crtc_gamma_set, .destroy = vmw_sou_crtc_destroy, .set_config = vmw_sou_crtc_set_config, + .set_property = drm_atomic_crtc_set_property, .page_flip = vmw_du_page_flip, };
include/drm/drm_atomic.h +29 -0
@@ -70,6 +70,9 @@struct drm_atomic_funcs {int (*check_plane_state)(struct drm_plane *plane,struct drm_plane_state *pstate);int (*commit_plane_state)(struct drm_plane *plane,struct drm_plane_state *pstate); + +int (*check_crtc_state)(struct drm_crtc *crtc,struct drm_crtc_state *cstate); +int (*commit_crtc_state)(struct drm_crtc *crtc,struct drm_crtc_state *cstate); };const extern struct drm_atomic_funcs drm_atomic_funcs;
@@ -109,6 +112,30 @@ drm_atomic_commit_plane_state(struct drm_plane *plane,return funcs->commit_plane_state (plane, pstate); } +int drm_atomic_crtc_set_property (struct drm_crtc *crtc, +struct drm_atomic_state *state,struct drm_property *property, +uint64_t val,void *blob_data); +struct drm_crtc_state *drm_atomic_get_crtc_state (struct drm_crtc *crtc, +struct drm_atomic_state *state); + +static inline int +drm_atomic_check_crtc_state (struct drm_crtc *crtc, +struct drm_crtc_state *cstate) +{ +const struct drm_atomic_funcs *funcs = + crtc->dev->driver->atomic_funcs; +return funcs->check_crtc_state (crtc, cstate); +} + +static inline int +drm_atomic_commit_crtc_state (struct drm_crtc *crtc, +struct drm_crtc_state *cstate) +{ +const struct drm_atomic_funcs *funcs = + crtc->dev->driver->atomic_funcs; +return funcs->commit_crtc_state (crtc, cstate); +} +/** * struct drm_atomic_state - the state object used by atomic helpers */
@@ -118,6 +145,8 @@ struct drm_atomic_state {uint32_t flags;struct drm_plane **planes;struct drm_plane_state **pstates; +struct drm_crtc **crtcs; +struct drm_crtc_state **cstates;bool committed;bool checked;/* just for debugging */
include/drm/drm_crtc.h +87 -16
186 lines not on this page · raw message
Signature · 1 line
1.9.3
PATCH 6/7 drm/msm: add atomic support
In reply to Rob Clark--- drivers/gpu/drm/msm/Makefile | 1 + drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c | 57 ++++++------ drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c | 6 ++ drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.h | 1 + drivers/gpu/drm/msm/mdp/mdp4/mdp4_plane.c | 5 -- drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c | 56 ++++++------ drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c | 6 ++ drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.h | 2 +- drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c | 5 -- drivers/gpu/drm/msm/msm_atomic.c | 141 ++++++++++++++++++++++++++++++ drivers/gpu/drm/msm/msm_drv.c | 22 ++++- drivers/gpu/drm/msm/msm_drv.h | 7 ++ drivers/gpu/drm/msm/msm_gem.c | 24 +---- drivers/gpu/drm/msm/msm_gem.h | 13 +++ drivers/gpu/drm/msm/msm_kms.h | 1 + 15 files changed, 253 insertions(+), 94 deletions(-) create mode 100644 drivers/gpu/drm/msm/msm_atomic.c
drivers/gpu/drm/msm/Makefile +1 -0
@@ -27,6 +27,7 @@ msm-y := \ mdp/mdp5/mdp5_kms.o \ mdp/mdp5/mdp5_plane.o \ mdp/mdp5/mdp5_smp.o \ + msm_atomic.o \ msm_drv.o \ msm_fb.o \ msm_gem.o \
drivers/gpu/drm/msm/mdp/mdp4/mdp4_crtc.c +26 -31
140 lines not on this page · raw message
drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.c +6 -0
@@ -131,6 +131,11 @@ static long mdp4_round_pixclk(struct msm_kms *kms, unsigned long rate,return mdp4_dtv_round_pixclk (encoder, rate); } +static void mdp4_flush (struct msm_kms *kms,struct drm_crtc *crtc) +{ +mdp4_crtc_flush (crtc); +} +static void mdp4_preclose (struct msm_kms *kms,struct drm_file *file) {struct mdp4_kms *mdp4_kms =to_mdp4_kms (to_mdp_kms (kms));
@@ -162,6 +167,7 @@ static const struct mdp_kms_funcs kms_funcs = { .disable_vblank = mdp4_disable_vblank, .get_format = mdp_get_format, .round_pixclk = mdp4_round_pixclk, + .flush = mdp4_flush, .preclose = mdp4_preclose, .destroy = mdp4_destroy, },
drivers/gpu/drm/msm/mdp/mdp4/mdp4_kms.h +1 -0
@@ -184,6 +184,7 @@ enum mdp4_pipe mdp4_plane_pipe(struct drm_plane *plane);struct drm_plane *mdp4_plane_init (struct drm_device *dev,enum mdp4_pipe pipe_id,bool private_plane); +void mdp4_crtc_flush (struct drm_crtc *crtc);uint32_t mdp4_crtc_vblank (struct drm_crtc *crtc);void mdp4_crtc_cancel_pending_flip (struct drm_crtc *crtc,struct drm_file *file);void mdp4_crtc_set_config (struct drm_crtc *crtc,uint32_t config);
drivers/gpu/drm/msm/mdp/mdp4/mdp4_plane.c +0 -5
@@ -48,11 +48,6 @@ static int mdp4_plane_update(struct drm_plane *plane, mdp4_plane->enabled = true; -if (plane->fb) -drm_framebuffer_unreference (plane->fb); - -drm_framebuffer_reference (fb); -return mdp4_plane_mode_set (plane, crtc, fb, crtc_x, crtc_y, crtc_w, crtc_h, src_x, src_y, src_w, src_h);
drivers/gpu/drm/msm/mdp/mdp5/mdp5_crtc.c +25 -31
140 lines not on this page · raw message
drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.c +6 -0
@@ -91,6 +91,11 @@ static long mdp5_round_pixclk(struct msm_kms *kms, unsigned long rate,return rate; } +static void mdp5_flush (struct msm_kms *kms,struct drm_crtc *crtc) +{ +mdp5_crtc_flush (crtc); +} +static void mdp5_preclose (struct msm_kms *kms,struct drm_file *file) {struct mdp5_kms *mdp5_kms =to_mdp5_kms (to_mdp_kms (kms));
@@ -118,6 +123,7 @@ static const struct mdp_kms_funcs kms_funcs = { .disable_vblank = mdp5_disable_vblank, .get_format = mdp_get_format, .round_pixclk = mdp5_round_pixclk, + .flush = mdp5_flush, .preclose = mdp5_preclose, .destroy = mdp5_destroy, },
drivers/gpu/drm/msm/mdp/mdp5/mdp5_kms.h +1 -1
@@ -197,8 +197,8 @@ enum mdp5_pipe mdp5_plane_pipe(struct drm_plane *plane);struct drm_plane *mdp5_plane_init (struct drm_device *dev,enum mdp5_pipe pipe,bool private_plane); +void mdp5_crtc_flush (struct drm_crtc *crtc);uint32_t mdp5_crtc_vblank (struct drm_crtc *crtc); -void mdp5_crtc_cancel_pending_flip (struct drm_crtc *crtc,struct drm_file *file);void mdp5_crtc_set_intf (struct drm_crtc *crtc,int intf,enum mdp5_intf intf_id);
drivers/gpu/drm/msm/mdp/mdp5/mdp5_plane.c +0 -5
@@ -48,11 +48,6 @@ static int mdp5_plane_update(struct drm_plane *plane, mdp5_plane->enabled = true; -if (plane->fb) -drm_framebuffer_unreference (plane->fb); - -drm_framebuffer_reference (fb); -return mdp5_plane_mode_set (plane, crtc, fb, crtc_x, crtc_y, crtc_w, crtc_h, src_x, src_y, src_w, src_h);
drivers/gpu/drm/msm/msm_atomic.c new file +141 -0
141 lines not on this page · raw message
drivers/gpu/drm/msm/msm_drv.c +21 -1
@@ -600,6 +600,26 @@ int msm_wait_fence_interruptable(struct drm_device *dev, uint32_t fence,return ret; } +int msm_queue_fence_cb (struct drm_device *dev, +struct msm_fence_cb *cb,uint32_t fence) +{ +struct msm_drm_private *priv = dev->dev_private; +int ret =0 ; + +mutex_lock (&dev->struct_mutex); +if (!list_empty (&cb->work.entry)) { + ret = -EINVAL ; + }else if (fence > priv->completed_fence) { + cb->fence = fence; +list_add_tail (&cb->work.entry, &priv->fence_cbs); + }else { +queue_work (priv->wq, &cb->work); + } +mutex_unlock (&dev->struct_mutex); + +return ret; +} +/* called from workqueue */ void msm_update_fence (struct drm_device *dev,uint32_t fence) {
@@ -815,7 +835,7 @@ static struct drm_driver msm_driver = { .atomic_begin = drm_atomic_begin, .atomic_set_event = drm_atomic_set_event, .atomic_check = drm_atomic_check, - .atomic_commit = drm_atomic_commit, + .atomic_commit = msm_atomic_commit, .atomic_end = drm_atomic_end, .atomic_funcs = &drm_atomic_funcs,#ifdef CONFIG_DEBUG_FS
drivers/gpu/drm/msm/msm_drv.h +7 -0
@@ -110,6 +110,9 @@ struct msm_drm_private {unsigned int num_connectors;struct drm_connector *connectors[8 ]; +/* crtc's pending atomic update: */ +uint32_t pending_crtcs; +/* VRAM carveout, used when no IOMMU: */ struct {unsigned long size;
@@ -143,11 +146,15 @@ int msm_register_mmu(struct drm_device *dev, struct msm_mmu *mmu);int msm_wait_fence_interruptable (struct drm_device *dev,uint32_t fence,struct timespec *timeout); +int msm_queue_fence_cb (struct drm_device *dev, +struct msm_fence_cb *cb,uint32_t fence);void msm_update_fence (struct drm_device *dev,uint32_t fence);int msm_ioctl_gem_submit (struct drm_device *dev,void *data,struct drm_file *file); +int msm_atomic_commit (struct drm_device *dev,struct drm_atomic_state *state); +int msm_gem_mmap (struct file *filp,struct vm_area_struct *vma);int msm_gem_fault (struct vm_area_struct *vma,struct vm_fault *vmf);uint64_t msm_gem_mmap_offset (struct drm_gem_object *obj);
drivers/gpu/drm/msm/msm_gem.c +4 -20
@@ -392,23 +392,11 @@ void *msm_gem_vaddr(struct drm_gem_object *obj)int msm_gem_queue_inactive_cb (struct drm_gem_object *obj,struct msm_fence_cb *cb) { -struct drm_device *dev = obj->dev; -struct msm_drm_private *priv = dev->dev_private;struct msm_gem_object *msm_obj =to_msm_bo (obj); -int ret =0 ; +uint32_t fence =msm_gem_fence (msm_obj, +MSM_PREP_READ |MSM_PREP_WRITE ); -mutex_lock (&dev->struct_mutex); -if (!list_empty (&cb->work.entry)) { - ret = -EINVAL ; - }else if (is_active (msm_obj)) { - cb->fence =max (msm_obj->read_fence, msm_obj->write_fence); -list_add_tail (&cb->work.entry, &priv->fence_cbs); - }else { -queue_work (priv->wq, &cb->work); - } -mutex_unlock (&dev->struct_mutex); - -return ret; +return msm_queue_fence_cb (obj->dev, cb, fence); } void msm_gem_move_to_active(struct drm_gem_object *obj,
@@ -447,12 +435,8 @@ int msm_gem_cpu_prep(struct drm_gem_object *obj, uint32_t op,int ret =0 ;if (is_active (msm_obj)) { -uint32_t fence =0 ; +uint32_t fence =msm_gem_fence (msm_obj, op); -if (op &MSM_PREP_READ ) - fence = msm_obj->write_fence; -if (op &MSM_PREP_WRITE ) - fence =max (fence, msm_obj->read_fence);if (op &MSM_PREP_NOSYNC ) timeout =NULL ;
drivers/gpu/drm/msm/msm_gem.h +13 -0
@@ -70,6 +70,19 @@ static inline bool is_active(struct msm_gem_object *msm_obj)return msm_obj->gpu !=NULL ; } +static inline uint32_t msm_gem_fence (struct msm_gem_object *msm_obj, +uint32_t op) +{ +uint32_t fence =0 ; + +if (op &MSM_PREP_READ ) + fence = msm_obj->write_fence; +if (op &MSM_PREP_WRITE ) + fence =max (fence, msm_obj->read_fence); + +return fence; +} +#define MAX_CMDS 4/* Created per submit-ioctl, to track bo's and cmdstream bufs, etc,
drivers/gpu/drm/msm/msm_kms.h +1 -0
@@ -42,6 +42,7 @@ struct msm_kms_funcs {const struct msm_format *(*get_format)(struct msm_kms *kms,uint32_t format);long (*round_pixclk)(struct msm_kms *kms,unsigned long rate,struct drm_encoder *encoder); +void (*flush)(struct msm_kms *kms,struct drm_crtc *crtc);/* cleanup: */ void (*preclose)(struct msm_kms *kms,struct drm_file *file);void (*destroy)(struct msm_kms *kms);
Signature · 1 line
1.9.3
PATCH 7/7 drm: Fix up the atomic legacy paths so they work
In reply to Rob ClarkFrom: Sean Paul <[email protected]>
BUG=chromium:336809
TEST=Tested on snow & peppy
--- drivers/gpu/drm/drm_atomic.c | 4 ++++ drivers/gpu/drm/drm_crtc.c | 11 ++++++++--- include/drm/drm_crtc.h | 1 + 3 files changed, 13 insertions(+), 3 deletions(-)
drivers/gpu/drm/drm_atomic.c +4 -0
@@ -617,6 +617,7 @@ swap_crtc_state(struct drm_crtc *crtc, struct drm_atomic_state *a)/* clear transient state (only valid during atomic update): */ cstate->set_config = false; cstate->connectors_change = false; + cstate->commit_state = false;swap (crtc->state, a->cstates[crtc->id]); crtc->base.propvals = &crtc->state->propvals;
@@ -691,6 +692,9 @@ commit_crtc_state(struct drm_crtc *crtc,drm_atomic_get_plane_state (crtc->primary, cstate->state);int ret = -EINVAL ; +if (!cstate->commit_state) +return 0 ; +if (cstate->set_config)return set_config (crtc, cstate);
drivers/gpu/drm/drm_crtc.c +8 -3
@@ -792,7 +792,7 @@ int drm_crtc_init_with_planes(struct drm_device *dev, struct drm_crtc *crtc, crtc->base.propvals = &crtc->state->propvals;list_add_tail (&crtc->head, &config->crtc_list); - config->num_crtc++; + crtc->id = config->num_crtc++; crtc->primary = primary;if (primary)
@@ -910,7 +910,7 @@ static int check_connectors(struct drm_crtc *crtc,if (ocrtc == crtc)continue ; - ostate =drm_atomic_get_crtc_state (crtc, state); + ostate =drm_atomic_get_crtc_state (ocrtc, state);if (IS_ERR (ostate))return PTR_ERR (ostate);
@@ -939,7 +939,6 @@ retry:return -EINVAL ; } } -return 0 ; }
@@ -961,6 +960,10 @@ int drm_crtc_check_state(struct drm_crtc *crtc,if (!(fb && state->mode_valid))return 0 ; +/* We're not committing this state, ignore */ +if (!state->commit_state) +return 0 ; + hdisplay = state->mode.hdisplay; vdisplay = state->mode.vdisplay;
@@ -1034,6 +1037,7 @@ int drm_crtc_set_property(struct drm_crtc *crtc,/* grab primary plane state now, to ensure locks are held, etc. */ drm_atomic_get_plane_state (crtc->primary, state->state); + state->commit_state = true;drm_object_property_set_value (&crtc->base, &state->propvals, property, value, blob_data);
@@ -1045,6 +1049,7 @@ int drm_crtc_set_property(struct drm_crtc *crtc,/* check size: */ if (value <sizeof (struct drm_mode_modeinfo ))return -EINVAL ; + state->mode = *(struct drm_mode_modeinfo *)blob_data; state->mode_valid = true; }
include/drm/drm_crtc.h +1 -0
@@ -317,6 +317,7 @@ struct drm_crtc_state {/* transient state, only valid during atomic operation: */ bool set_config : 1; bool connectors_change : 1; + bool commit_state : 1;uint8_t num_connector_ids;uint32_t *connector_ids;
Signature · 1 line
1.9.3