Add DRM property for crtc background color property. Background color is shown on areas where there are no planes. Signed-off-by: Tomi Valkeinen <tomi.valkeinen@xxxxxx> --- drivers/gpu/drm/omapdrm/omap_crtc.c | 60 ++++++++++++++++++++++++++++++------- drivers/gpu/drm/omapdrm/omap_drv.c | 9 ++++++ drivers/gpu/drm/omapdrm/omap_drv.h | 5 +++- 3 files changed, 63 insertions(+), 11 deletions(-) diff --git a/drivers/gpu/drm/omapdrm/omap_crtc.c b/drivers/gpu/drm/omapdrm/omap_crtc.c index ff1570c096f8..c0e30a4cb2a9 100644 --- a/drivers/gpu/drm/omapdrm/omap_crtc.c +++ b/drivers/gpu/drm/omapdrm/omap_crtc.c @@ -48,6 +48,8 @@ struct omap_crtc { struct omap_crtc_state { struct drm_crtc_state base; + + u32 default_color; }; /* ----------------------------------------------------------------------------- @@ -196,15 +198,7 @@ static void omap_crtc_set_enabled(struct drm_crtc *crtc, bool enable) static int omap_crtc_dss_enable(enum omap_channel channel) { struct omap_crtc *omap_crtc = omap_crtcs[channel]; - struct omap_overlay_manager_info info; - - memset(&info, 0, sizeof(info)); - info.default_color = 0x00000000; - info.trans_key = 0x00000000; - info.trans_key_type = OMAP_DSS_COLOR_KEY_GFX_DST; - info.trans_enabled = false; - dispc_mgr_setup(omap_crtc->channel, &info); dispc_mgr_set_timings(omap_crtc->channel, &omap_crtc->vm); omap_crtc_set_enabled(&omap_crtc->base, true); @@ -319,6 +313,20 @@ static void omap_crtc_vblank_irq(struct omap_drm_irq *irq, uint32_t irqstatus) wake_up(&omap_crtc->pending_wait); } +static void omap_crtc_write_crtc_properties(struct drm_crtc *crtc) +{ + struct omap_crtc *omap_crtc = to_omap_crtc(crtc); + struct omap_overlay_manager_info info; + const struct omap_crtc_state *omap_state = + to_omap_crtc_state(crtc->state); + + memset(&info, 0, sizeof(info)); + info.default_color = omap_state->default_color; + info.trans_enabled = false; + + dispc_mgr_setup(omap_crtc->channel, &info); +} + /* ----------------------------------------------------------------------------- * CRTC Functions */ @@ -362,6 +370,8 @@ static void omap_crtc_reset(struct drm_crtc *crtc) if (omap_state == NULL) return; + omap_state->default_color = 0; + crtc->state = &omap_state->base; crtc->state->crtc = crtc; } @@ -462,6 +472,8 @@ static void omap_crtc_atomic_flush(struct drm_crtc *crtc, dispc_mgr_set_gamma(omap_crtc->channel, lut, length); } + omap_crtc_write_crtc_properties(crtc); + if (dispc_mgr_is_enabled(omap_crtc->channel)) { DBG("%s: GO", omap_crtc->name); @@ -491,6 +503,10 @@ static int omap_crtc_atomic_set_property(struct drm_crtc *crtc, struct drm_property *property, uint64_t val) { + struct drm_device *dev = crtc->dev; + struct omap_drm_private *priv = dev->dev_private; + struct omap_crtc_state *omap_state = to_omap_crtc_state(state); + if (omap_crtc_is_plane_prop(crtc, property)) { struct drm_plane_state *plane_state; struct drm_plane *plane = crtc->primary; @@ -508,7 +524,12 @@ static int omap_crtc_atomic_set_property(struct drm_crtc *crtc, property, val); } - return -EINVAL; + if (property == priv->background_color_prop) + omap_state->default_color = val; + else + return -EINVAL; + + return 0; } static int omap_crtc_atomic_get_property(struct drm_crtc *crtc, @@ -516,6 +537,10 @@ static int omap_crtc_atomic_get_property(struct drm_crtc *crtc, struct drm_property *property, uint64_t *val) { + struct drm_device *dev = crtc->dev; + struct omap_drm_private *priv = dev->dev_private; + struct omap_crtc_state *omap_state = to_omap_crtc_state(state); + if (omap_crtc_is_plane_prop(crtc, property)) { /* * Delegate property get to the primary plane. The @@ -527,7 +552,12 @@ static int omap_crtc_atomic_get_property(struct drm_crtc *crtc, property, val); } - return -EINVAL; + if (property == priv->background_color_prop) + *val = omap_state->default_color; + else + return -EINVAL; + + return 0; } static const struct drm_crtc_funcs omap_crtc_funcs = { @@ -573,6 +603,15 @@ void omap_crtc_pre_uninit(void) dss_uninstall_mgr_ops(); } +static void omap_crtc_install_properties(struct drm_crtc *crtc) +{ + struct drm_device *dev = crtc->dev; + struct drm_mode_object *obj = &crtc->base; + struct omap_drm_private *priv = dev->dev_private; + + drm_object_attach_property(obj, priv->background_color_prop, 0); +} + /* initialize crtc */ struct drm_crtc *omap_crtc_init(struct drm_device *dev, struct drm_plane *plane, enum omap_channel channel, int id) @@ -625,6 +664,7 @@ struct drm_crtc *omap_crtc_init(struct drm_device *dev, drm_mode_crtc_set_gamma_size(crtc, gamma_lut_size); } + omap_crtc_install_properties(crtc); omap_plane_install_properties(crtc->primary, &crtc->base); omap_crtcs[channel] = omap_crtc; diff --git a/drivers/gpu/drm/omapdrm/omap_drv.c b/drivers/gpu/drm/omapdrm/omap_drv.c index 39c5312b466c..8c58ca7db382 100644 --- a/drivers/gpu/drm/omapdrm/omap_drv.c +++ b/drivers/gpu/drm/omapdrm/omap_drv.c @@ -293,10 +293,19 @@ static int omap_modeset_init_properties(struct drm_device *dev) { struct omap_drm_private *priv = dev->dev_private; + /* plane properties */ + priv->zorder_prop = drm_property_create_range(dev, 0, "zorder", 0, 3); if (!priv->zorder_prop) return -ENOMEM; + /* crtc properties */ + + priv->background_color_prop = drm_property_create_range(dev, 0, + "background", 0, 0xffffff); + if (!priv->background_color_prop) + return -ENOMEM; + return 0; } diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h b/drivers/gpu/drm/omapdrm/omap_drv.h index 4c51135eb9a6..0d16294e8145 100644 --- a/drivers/gpu/drm/omapdrm/omap_drv.h +++ b/drivers/gpu/drm/omapdrm/omap_drv.h @@ -97,9 +97,12 @@ struct omap_drm_private { struct omap_drm_usergart *usergart; bool has_dmm; - /* properties: */ + /* plane properties */ struct drm_property *zorder_prop; + /* crtc properties */ + struct drm_property *background_color_prop; + /* irq handling: */ struct list_head irq_list; /* list of omap_drm_irq */ uint32_t vblank_mask; /* irq bits set for userspace vblank */ -- 2.7.4 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel