On Sat, Apr 1, 2017 at 2:47 PM, Rob Clark <robdclark@xxxxxxxxx> wrote: > On Tue, Dec 20, 2016 at 7:12 PM, Kristian H. Kristensen > <hoegsberg@xxxxxxxxx> wrote: >> From: "Kristian H. Kristensen" <hoegsberg@xxxxxxxxxx> >> >> This new ioctl exctends DRM_IOCTL_MODE_GETPLANE, by returning >> information about the modifiers that will work with each format. > > So, just to toss out a completely different idea.. > > What if instead of a new ioctl, we had a read-only blob property > (which encoded the info basically the same way, plus the fourcc's)? > > If we do writeback via some sort of OUT_FB_ID property on plane/crtc, > we will need the same sort of format information so userspace knows > what output formats (and modifiers) are supported. So re-using the > same blob property layout (and userspace parsing) seems useful. re-sending w/ correct email for Ben.. > BR, > -R > >> Signed-off-by: Kristian H. Kristensen <hoegsberg@xxxxxxxxxxxx> >> --- >> drivers/gpu/drm/arm/hdlcd_crtc.c | 1 + >> drivers/gpu/drm/armada/armada_crtc.c | 1 + >> drivers/gpu/drm/armada/armada_overlay.c | 1 + >> drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c | 4 ++- >> drivers/gpu/drm/drm_ioctl.c | 2 +- >> drivers/gpu/drm/drm_modeset_helper.c | 1 + >> drivers/gpu/drm/drm_plane.c | 40 +++++++++++++++++++++++-- >> drivers/gpu/drm/drm_simple_kms_helper.c | 5 ++++ >> drivers/gpu/drm/exynos/exynos_drm_plane.c | 2 +- >> drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_plane.c | 2 +- >> drivers/gpu/drm/i915/intel_display.c | 5 +++- >> drivers/gpu/drm/imx/ipuv3-plane.c | 4 +-- >> drivers/gpu/drm/mxsfb/mxsfb_drv.c | 2 +- >> drivers/gpu/drm/nouveau/nv50_display.c | 5 ++-- >> drivers/gpu/drm/omapdrm/omap_plane.c | 3 +- >> drivers/gpu/drm/rcar-du/rcar_du_plane.c | 4 +-- >> drivers/gpu/drm/rockchip/rockchip_drm_vop.c | 4 +-- >> drivers/gpu/drm/sti/sti_cursor.c | 1 + >> drivers/gpu/drm/sti/sti_gdp.c | 2 +- >> drivers/gpu/drm/sti/sti_hqvdp.c | 2 +- >> drivers/gpu/drm/tegra/dc.c | 12 ++++---- >> drivers/gpu/drm/vc4/vc4_plane.c | 2 +- >> drivers/gpu/drm/virtio/virtgpu_plane.c | 2 +- >> include/drm/drm_plane.h | 7 ++++- >> include/drm/drm_simple_kms_helper.h | 2 ++ >> include/uapi/drm/drm.h | 1 + >> include/uapi/drm/drm_mode.h | 27 +++++++++++++++++ >> 27 files changed, 116 insertions(+), 28 deletions(-) >> >> diff --git a/drivers/gpu/drm/arm/hdlcd_crtc.c b/drivers/gpu/drm/arm/hdlcd_crtc.c >> index 20ebfb4..6062578 100644 >> --- a/drivers/gpu/drm/arm/hdlcd_crtc.c >> +++ b/drivers/gpu/drm/arm/hdlcd_crtc.c >> @@ -283,6 +283,7 @@ static struct drm_plane *hdlcd_plane_init(struct drm_device *drm) >> >> ret = drm_universal_plane_init(drm, plane, 0xff, &hdlcd_plane_funcs, >> formats, ARRAY_SIZE(formats), >> + NULL, 0, >> DRM_PLANE_TYPE_PRIMARY, NULL); >> if (ret) { >> devm_kfree(drm->dev, plane); >> diff --git a/drivers/gpu/drm/armada/armada_crtc.c b/drivers/gpu/drm/armada/armada_crtc.c >> index e62ee44..e1a6170 100644 >> --- a/drivers/gpu/drm/armada/armada_crtc.c >> +++ b/drivers/gpu/drm/armada/armada_crtc.c >> @@ -1250,6 +1250,7 @@ static int armada_drm_crtc_create(struct drm_device *drm, struct device *dev, >> &armada_primary_plane_funcs, >> armada_primary_formats, >> ARRAY_SIZE(armada_primary_formats), >> + NULL, 0, >> DRM_PLANE_TYPE_PRIMARY, NULL); >> if (ret) { >> kfree(primary); >> diff --git a/drivers/gpu/drm/armada/armada_overlay.c b/drivers/gpu/drm/armada/armada_overlay.c >> index 34cb73d..32fb8f3 100644 >> --- a/drivers/gpu/drm/armada/armada_overlay.c >> +++ b/drivers/gpu/drm/armada/armada_overlay.c >> @@ -458,6 +458,7 @@ int armada_overlay_plane_create(struct drm_device *dev, unsigned long crtcs) >> &armada_ovl_plane_funcs, >> armada_ovl_formats, >> ARRAY_SIZE(armada_ovl_formats), >> + NULL, 0, >> DRM_PLANE_TYPE_OVERLAY, NULL); >> if (ret) { >> kfree(dplane); >> diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c >> index bd2791c..ac9e4db 100644 >> --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c >> +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c >> @@ -1038,7 +1038,9 @@ atmel_hlcdc_plane_create(struct drm_device *dev, >> ret = drm_universal_plane_init(dev, &plane->base, 0, >> &layer_plane_funcs, >> desc->formats->formats, >> - desc->formats->nformats, type, NULL); >> + desc->formats->nformats, >> + NULL, 0, >> + type, NULL); >> if (ret) >> return ERR_PTR(ret); >> >> diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c >> index 59b6911..9724209 100644 >> --- a/drivers/gpu/drm/drm_ioctl.c >> +++ b/drivers/gpu/drm/drm_ioctl.c >> @@ -615,7 +615,7 @@ static const struct drm_ioctl_desc drm_ioctls[] = { >> DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPLANERESOURCES, drm_mode_getplane_res, DRM_CONTROL_ALLOW|DRM_UNLOCKED), >> DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETCRTC, drm_mode_getcrtc, DRM_CONTROL_ALLOW|DRM_UNLOCKED), >> DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETCRTC, drm_mode_setcrtc, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), >> - DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPLANE, drm_mode_getplane, DRM_CONTROL_ALLOW|DRM_UNLOCKED), >> + DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETPLANE2, drm_mode_getplane, DRM_CONTROL_ALLOW|DRM_UNLOCKED), >> DRM_IOCTL_DEF(DRM_IOCTL_MODE_SETPLANE, drm_mode_setplane, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), >> DRM_IOCTL_DEF(DRM_IOCTL_MODE_CURSOR, drm_mode_cursor_ioctl, DRM_MASTER|DRM_CONTROL_ALLOW|DRM_UNLOCKED), >> DRM_IOCTL_DEF(DRM_IOCTL_MODE_GETGAMMA, drm_mode_gamma_get_ioctl, DRM_UNLOCKED), >> diff --git a/drivers/gpu/drm/drm_modeset_helper.c b/drivers/gpu/drm/drm_modeset_helper.c >> index b4f3665..94b2717 100644 >> --- a/drivers/gpu/drm/drm_modeset_helper.c >> +++ b/drivers/gpu/drm/drm_modeset_helper.c >> @@ -122,6 +122,7 @@ static struct drm_plane *create_primary_plane(struct drm_device *dev) >> &drm_primary_helper_funcs, >> safe_modeset_formats, >> ARRAY_SIZE(safe_modeset_formats), >> + NULL, 0, >> DRM_PLANE_TYPE_PRIMARY, NULL); >> if (ret) { >> kfree(primary); >> diff --git a/drivers/gpu/drm/drm_plane.c b/drivers/gpu/drm/drm_plane.c >> index 8ad20af..53a9821 100644 >> --- a/drivers/gpu/drm/drm_plane.c >> +++ b/drivers/gpu/drm/drm_plane.c >> @@ -70,6 +70,8 @@ static unsigned int drm_num_planes(struct drm_device *dev) >> * @funcs: callbacks for the new plane >> * @formats: array of supported formats (DRM_FORMAT\_\*) >> * @format_count: number of elements in @formats >> + * @format_modifiers: array of struct drm_format modifiers >> + * @format_modifier_count: number of elements in @format_modifiers >> * @type: type of plane (overlay, primary, cursor) >> * @name: printf style format string for the plane name, or NULL for default name >> * >> @@ -82,6 +84,8 @@ int drm_universal_plane_init(struct drm_device *dev, struct drm_plane *plane, >> uint32_t possible_crtcs, >> const struct drm_plane_funcs *funcs, >> const uint32_t *formats, unsigned int format_count, >> + const struct drm_format_modifier *format_modifiers, >> + unsigned int format_modifier_count, >> enum drm_plane_type type, >> const char *name, ...) >> { >> @@ -105,6 +109,16 @@ int drm_universal_plane_init(struct drm_device *dev, struct drm_plane *plane, >> return -ENOMEM; >> } >> >> + plane->format_modifiers = >> + kmalloc_array(format_modifier_count, >> + sizeof(format_modifiers[0]), GFP_KERNEL); >> + if (!plane->format_modifiers) { >> + DRM_DEBUG_KMS("out of memory when allocating plane\n"); >> + kfree(plane->format_types); >> + drm_mode_object_unregister(dev, &plane->base); >> + return -ENOMEM; >> + } >> + >> if (name) { >> va_list ap; >> >> @@ -117,12 +131,16 @@ int drm_universal_plane_init(struct drm_device *dev, struct drm_plane *plane, >> } >> if (!plane->name) { >> kfree(plane->format_types); >> + kfree(plane->format_modifiers); >> drm_mode_object_unregister(dev, &plane->base); >> return -ENOMEM; >> } >> >> memcpy(plane->format_types, formats, format_count * sizeof(uint32_t)); >> plane->format_count = format_count; >> + memcpy(plane->format_modifiers, format_modifiers, >> + format_modifier_count * sizeof(format_modifiers[0])); >> + plane->format_modifier_count = format_modifier_count; >> plane->possible_crtcs = possible_crtcs; >> plane->type = type; >> >> @@ -205,7 +223,8 @@ int drm_plane_init(struct drm_device *dev, struct drm_plane *plane, >> >> type = is_primary ? DRM_PLANE_TYPE_PRIMARY : DRM_PLANE_TYPE_OVERLAY; >> return drm_universal_plane_init(dev, plane, possible_crtcs, funcs, >> - formats, format_count, type, NULL); >> + formats, format_count, >> + NULL, 0, type, NULL); >> } >> EXPORT_SYMBOL(drm_plane_init); >> >> @@ -224,6 +243,7 @@ void drm_plane_cleanup(struct drm_plane *plane) >> drm_modeset_lock_fini(&plane->mutex); >> >> kfree(plane->format_types); >> + kfree(plane->format_modifiers); >> drm_mode_object_unregister(dev, &plane->base); >> >> BUG_ON(list_empty(&plane->head)); >> @@ -380,12 +400,15 @@ int drm_mode_getplane_res(struct drm_device *dev, void *data, >> int drm_mode_getplane(struct drm_device *dev, void *data, >> struct drm_file *file_priv) >> { >> - struct drm_mode_get_plane *plane_resp = data; >> + struct drm_mode_get_plane2 *plane_resp = data; >> struct drm_plane *plane; >> uint32_t __user *format_ptr; >> + struct drm_format_modifier __user *modifier_ptr; >> >> if (!drm_core_check_feature(dev, DRIVER_MODESET)) >> return -EINVAL; >> + if (plane_resp->flags) >> + return -EINVAL; >> >> plane = drm_plane_find(dev, plane_resp->plane_id); >> if (!plane) >> @@ -426,6 +449,19 @@ int drm_mode_getplane(struct drm_device *dev, void *data, >> } >> plane_resp->count_format_types = plane->format_count; >> >> + if (plane->format_modifier_count && >> + (plane_resp->count_format_modifiers >= plane->format_modifier_count)) { >> + modifier_ptr = (struct drm_format_modifier __user *) >> + (unsigned long)plane_resp->format_modifier_ptr; >> + if (copy_to_user(modifier_ptr, >> + plane->format_modifiers, >> + sizeof(plane->format_modifiers[0]) * >> + plane->format_modifier_count)) { >> + return -EFAULT; >> + } >> + } >> + plane_resp->count_format_modifiers = plane->format_modifier_count; >> + >> return 0; >> } >> >> diff --git a/drivers/gpu/drm/drm_simple_kms_helper.c b/drivers/gpu/drm/drm_simple_kms_helper.c >> index 7bae08c..f79f4c5 100644 >> --- a/drivers/gpu/drm/drm_simple_kms_helper.c >> +++ b/drivers/gpu/drm/drm_simple_kms_helper.c >> @@ -212,6 +212,8 @@ EXPORT_SYMBOL(drm_simple_display_pipe_detach_bridge); >> * @funcs: callbacks for the display pipe (optional) >> * @formats: array of supported formats (DRM_FORMAT\_\*) >> * @format_count: number of elements in @formats >> + * @modifiers: array of formats modifiers >> + * @modifier_count: number of elements in @modifiers >> * @connector: connector to attach and register (optional) >> * >> * Sets up a display pipeline which consist of a really simple >> @@ -232,6 +234,8 @@ int drm_simple_display_pipe_init(struct drm_device *dev, >> struct drm_simple_display_pipe *pipe, >> const struct drm_simple_display_pipe_funcs *funcs, >> const uint32_t *formats, unsigned int format_count, >> + const struct drm_format_modifier *format_modifiers, >> + unsigned int format_modifier_count, >> struct drm_connector *connector) >> { >> struct drm_encoder *encoder = &pipe->encoder; >> @@ -246,6 +250,7 @@ int drm_simple_display_pipe_init(struct drm_device *dev, >> ret = drm_universal_plane_init(dev, plane, 0, >> &drm_simple_kms_plane_funcs, >> formats, format_count, >> + format_modifiers, format_modifier_count, >> DRM_PLANE_TYPE_PRIMARY, NULL); >> if (ret) >> return ret; >> diff --git a/drivers/gpu/drm/exynos/exynos_drm_plane.c b/drivers/gpu/drm/exynos/exynos_drm_plane.c >> index c2f17f3..174bec5 100644 >> --- a/drivers/gpu/drm/exynos/exynos_drm_plane.c >> +++ b/drivers/gpu/drm/exynos/exynos_drm_plane.c >> @@ -284,7 +284,7 @@ int exynos_plane_init(struct drm_device *dev, >> &exynos_plane_funcs, >> config->pixel_formats, >> config->num_pixel_formats, >> - config->type, NULL); >> + NULL, 0, config->type, NULL); >> if (err) { >> DRM_ERROR("failed to initialize plane\n"); >> return err; >> diff --git a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_plane.c b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_plane.c >> index 0a20723..1b719e0 100644 >> --- a/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_plane.c >> +++ b/drivers/gpu/drm/fsl-dcu/fsl_dcu_drm_plane.c >> @@ -224,7 +224,7 @@ struct drm_plane *fsl_dcu_drm_primary_create_plane(struct drm_device *dev) >> &fsl_dcu_drm_plane_funcs, >> fsl_dcu_drm_plane_formats, >> ARRAY_SIZE(fsl_dcu_drm_plane_formats), >> - DRM_PLANE_TYPE_PRIMARY, NULL); >> + NULL, 0, DRM_PLANE_TYPE_PRIMARY, NULL); >> if (ret) { >> kfree(primary); >> primary = NULL; >> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c >> index 135c601..9c198fb 100644 >> --- a/drivers/gpu/drm/i915/intel_display.c >> +++ b/drivers/gpu/drm/i915/intel_display.c >> @@ -15026,18 +15026,21 @@ intel_primary_plane_create(struct drm_i915_private *dev_priv, enum pipe pipe) >> ret = drm_universal_plane_init(&dev_priv->drm, &primary->base, >> 0, &intel_plane_funcs, >> intel_primary_formats, num_formats, >> + NULL, 0, >> DRM_PLANE_TYPE_PRIMARY, >> "plane 1%c", pipe_name(pipe)); >> else if (INTEL_GEN(dev_priv) >= 5 || IS_G4X(dev_priv)) >> ret = drm_universal_plane_init(&dev_priv->drm, &primary->base, >> 0, &intel_plane_funcs, >> intel_primary_formats, num_formats, >> + NULL, 0, >> DRM_PLANE_TYPE_PRIMARY, >> "primary %c", pipe_name(pipe)); >> else >> ret = drm_universal_plane_init(&dev_priv->drm, &primary->base, >> 0, &intel_plane_funcs, >> intel_primary_formats, num_formats, >> + NULL, 0, >> DRM_PLANE_TYPE_PRIMARY, >> "plane %c", plane_name(primary->plane)); >> if (ret) >> @@ -15201,7 +15204,7 @@ intel_cursor_plane_create(struct drm_i915_private *dev_priv, enum pipe pipe) >> 0, &intel_plane_funcs, >> intel_cursor_formats, >> ARRAY_SIZE(intel_cursor_formats), >> - DRM_PLANE_TYPE_CURSOR, >> + NULL, 0, DRM_PLANE_TYPE_CURSOR, >> "cursor %c", pipe_name(pipe)); >> if (ret) >> goto fail; >> diff --git a/drivers/gpu/drm/imx/ipuv3-plane.c b/drivers/gpu/drm/imx/ipuv3-plane.c >> index 8b5294d..da2c6a7 100644 >> --- a/drivers/gpu/drm/imx/ipuv3-plane.c >> +++ b/drivers/gpu/drm/imx/ipuv3-plane.c >> @@ -496,8 +496,8 @@ struct ipu_plane *ipu_plane_init(struct drm_device *dev, struct ipu_soc *ipu, >> >> ret = drm_universal_plane_init(dev, &ipu_plane->base, possible_crtcs, >> &ipu_plane_funcs, ipu_plane_formats, >> - ARRAY_SIZE(ipu_plane_formats), type, >> - NULL); >> + ARRAY_SIZE(ipu_plane_formats), >> + NULL, 0, type, NULL); >> if (ret) { >> DRM_ERROR("failed to initialize plane\n"); >> kfree(ipu_plane); >> diff --git a/drivers/gpu/drm/mxsfb/mxsfb_drv.c b/drivers/gpu/drm/mxsfb/mxsfb_drv.c >> index 955441f..f29d463 100644 >> --- a/drivers/gpu/drm/mxsfb/mxsfb_drv.c >> +++ b/drivers/gpu/drm/mxsfb/mxsfb_drv.c >> @@ -186,7 +186,7 @@ static int mxsfb_load(struct drm_device *drm, unsigned long flags) >> } >> >> ret = drm_simple_display_pipe_init(drm, &mxsfb->pipe, &mxsfb_funcs, >> - mxsfb_formats, ARRAY_SIZE(mxsfb_formats), >> + mxsfb_formats, ARRAY_SIZE(mxsfb_formats), NULL, 0, >> &mxsfb->connector); >> if (ret < 0) { >> dev_err(drm->dev, "Cannot setup simple display pipe\n"); >> diff --git a/drivers/gpu/drm/nouveau/nv50_display.c b/drivers/gpu/drm/nouveau/nv50_display.c >> index cb85cb7..8b2a005 100644 >> --- a/drivers/gpu/drm/nouveau/nv50_display.c >> +++ b/drivers/gpu/drm/nouveau/nv50_display.c >> @@ -1079,8 +1079,9 @@ nv50_wndw_ctor(const struct nv50_wndw_func *func, struct drm_device *dev, >> wndw->func = func; >> wndw->dmac = dmac; >> >> - ret = drm_universal_plane_init(dev, &wndw->plane, 0, &nv50_wndw, format, >> - nformat, type, "%s-%d", name, index); >> + ret = drm_universal_plane_init(dev, &wndw->plane, 0, &nv50_wndw, >> + format, nformat, NULL, 0, >> + type, "%s-%d", name, index); >> if (ret) >> return ret; >> >> diff --git a/drivers/gpu/drm/omapdrm/omap_plane.c b/drivers/gpu/drm/omapdrm/omap_plane.c >> index 82b2c23..0e37777 100644 >> --- a/drivers/gpu/drm/omapdrm/omap_plane.c >> +++ b/drivers/gpu/drm/omapdrm/omap_plane.c >> @@ -383,7 +383,8 @@ struct drm_plane *omap_plane_init(struct drm_device *dev, >> >> ret = drm_universal_plane_init(dev, plane, possible_crtcs, >> &omap_plane_funcs, omap_plane->formats, >> - omap_plane->nformats, type, NULL); >> + omap_plane->nformats, >> + NULL, 0, type, NULL); >> if (ret < 0) >> goto error; >> >> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_plane.c b/drivers/gpu/drm/rcar-du/rcar_du_plane.c >> index dcde628..ad611b2 100644 >> --- a/drivers/gpu/drm/rcar-du/rcar_du_plane.c >> +++ b/drivers/gpu/drm/rcar-du/rcar_du_plane.c >> @@ -743,8 +743,8 @@ int rcar_du_planes_init(struct rcar_du_group *rgrp) >> >> ret = drm_universal_plane_init(rcdu->ddev, &plane->plane, crtcs, >> &rcar_du_plane_funcs, formats, >> - ARRAY_SIZE(formats), type, >> - NULL); >> + ARRAY_SIZE(formats), >> + NULL, 0, type, NULL); >> if (ret < 0) >> return ret; >> >> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c >> index fb5f001..a32281b 100644 >> --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop.c >> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop.c >> @@ -1221,7 +1221,7 @@ static int vop_create_crtc(struct vop *vop) >> 0, &vop_plane_funcs, >> win_data->phy->data_formats, >> win_data->phy->nformats, >> - win_data->type, NULL); >> + NULL, 0, win_data->type, NULL); >> if (ret) { >> DRM_DEV_ERROR(vop->dev, "failed to init plane %d\n", >> ret); >> @@ -1260,7 +1260,7 @@ static int vop_create_crtc(struct vop *vop) >> &vop_plane_funcs, >> win_data->phy->data_formats, >> win_data->phy->nformats, >> - win_data->type, NULL); >> + NULL, 0, win_data->type, NULL); >> if (ret) { >> DRM_DEV_ERROR(vop->dev, "failed to init overlay %d\n", >> ret); >> diff --git a/drivers/gpu/drm/sti/sti_cursor.c b/drivers/gpu/drm/sti/sti_cursor.c >> index cca75bd..5463faa 100644 >> --- a/drivers/gpu/drm/sti/sti_cursor.c >> +++ b/drivers/gpu/drm/sti/sti_cursor.c >> @@ -393,6 +393,7 @@ struct drm_plane *sti_cursor_create(struct drm_device *drm_dev, >> &sti_cursor_plane_helpers_funcs, >> cursor_supported_formats, >> ARRAY_SIZE(cursor_supported_formats), >> + NULL, 0, >> DRM_PLANE_TYPE_CURSOR, NULL); >> if (res) { >> DRM_ERROR("Failed to initialize universal plane\n"); >> diff --git a/drivers/gpu/drm/sti/sti_gdp.c b/drivers/gpu/drm/sti/sti_gdp.c >> index 877d053..8ff7e30 100644 >> --- a/drivers/gpu/drm/sti/sti_gdp.c >> +++ b/drivers/gpu/drm/sti/sti_gdp.c >> @@ -921,7 +921,7 @@ struct drm_plane *sti_gdp_create(struct drm_device *drm_dev, >> &sti_gdp_plane_helpers_funcs, >> gdp_supported_formats, >> ARRAY_SIZE(gdp_supported_formats), >> - type, NULL); >> + NULL, 0, type, NULL); >> if (res) { >> DRM_ERROR("Failed to initialize universal plane\n"); >> goto err; >> diff --git a/drivers/gpu/drm/sti/sti_hqvdp.c b/drivers/gpu/drm/sti/sti_hqvdp.c >> index becf10d..7e88092 100644 >> --- a/drivers/gpu/drm/sti/sti_hqvdp.c >> +++ b/drivers/gpu/drm/sti/sti_hqvdp.c >> @@ -1277,7 +1277,7 @@ static struct drm_plane *sti_hqvdp_create(struct drm_device *drm_dev, >> &sti_hqvdp_plane_helpers_funcs, >> hqvdp_supported_formats, >> ARRAY_SIZE(hqvdp_supported_formats), >> - DRM_PLANE_TYPE_OVERLAY, NULL); >> + NULL, 0, DRM_PLANE_TYPE_OVERLAY, NULL); >> if (res) { >> DRM_ERROR("Failed to initialize universal plane\n"); >> return NULL; >> diff --git a/drivers/gpu/drm/tegra/dc.c b/drivers/gpu/drm/tegra/dc.c >> index 7561a95..9543c8c 100644 >> --- a/drivers/gpu/drm/tegra/dc.c >> +++ b/drivers/gpu/drm/tegra/dc.c >> @@ -655,8 +655,8 @@ static struct drm_plane *tegra_dc_primary_plane_create(struct drm_device *drm, >> >> err = drm_universal_plane_init(drm, &plane->base, possible_crtcs, >> &tegra_primary_plane_funcs, formats, >> - num_formats, DRM_PLANE_TYPE_PRIMARY, >> - NULL); >> + num_formats, NULL, 0, >> + DRM_PLANE_TYPE_PRIMARY, NULL); >> if (err < 0) { >> kfree(plane); >> return ERR_PTR(err); >> @@ -821,8 +821,8 @@ static struct drm_plane *tegra_dc_cursor_plane_create(struct drm_device *drm, >> >> err = drm_universal_plane_init(drm, &plane->base, 1 << dc->pipe, >> &tegra_cursor_plane_funcs, formats, >> - num_formats, DRM_PLANE_TYPE_CURSOR, >> - NULL); >> + num_formats, NULL, 0, >> + DRM_PLANE_TYPE_CURSOR, NULL); >> if (err < 0) { >> kfree(plane); >> return ERR_PTR(err); >> @@ -883,8 +883,8 @@ static struct drm_plane *tegra_dc_overlay_plane_create(struct drm_device *drm, >> >> err = drm_universal_plane_init(drm, &plane->base, 1 << dc->pipe, >> &tegra_overlay_plane_funcs, formats, >> - num_formats, DRM_PLANE_TYPE_OVERLAY, >> - NULL); >> + num_formats, NULL, 0, >> + DRM_PLANE_TYPE_OVERLAY, NULL); >> if (err < 0) { >> kfree(plane); >> return ERR_PTR(err); >> diff --git a/drivers/gpu/drm/vc4/vc4_plane.c b/drivers/gpu/drm/vc4/vc4_plane.c >> index 110d151..d6802f1 100644 >> --- a/drivers/gpu/drm/vc4/vc4_plane.c >> +++ b/drivers/gpu/drm/vc4/vc4_plane.c >> @@ -861,7 +861,7 @@ struct drm_plane *vc4_plane_init(struct drm_device *dev, >> ret = drm_universal_plane_init(dev, plane, 0xff, >> &vc4_plane_funcs, >> formats, num_formats, >> - type, NULL); >> + NULL, 0, type, NULL); >> >> drm_plane_helper_add(plane, &vc4_plane_helper_funcs); >> >> diff --git a/drivers/gpu/drm/virtio/virtgpu_plane.c b/drivers/gpu/drm/virtio/virtgpu_plane.c >> index cb75f06..b9c9866 100644 >> --- a/drivers/gpu/drm/virtio/virtgpu_plane.c >> +++ b/drivers/gpu/drm/virtio/virtgpu_plane.c >> @@ -225,7 +225,7 @@ struct drm_plane *virtio_gpu_plane_init(struct virtio_gpu_device *vgdev, >> ret = drm_universal_plane_init(dev, plane, 1 << index, >> &virtio_gpu_plane_funcs, >> formats, nformats, >> - type, NULL); >> + NULL, 0, type, NULL); >> if (ret) >> goto err_plane_init; >> >> diff --git a/include/drm/drm_plane.h b/include/drm/drm_plane.h >> index db3bbde..7feb463 100644 >> --- a/include/drm/drm_plane.h >> +++ b/include/drm/drm_plane.h >> @@ -483,6 +483,9 @@ struct drm_plane { >> unsigned int format_count; >> bool format_default; >> >> + struct drm_format_modifier *format_modifiers; >> + unsigned int format_modifier_count; >> + >> struct drm_crtc *crtc; >> struct drm_framebuffer *fb; >> >> @@ -510,13 +513,15 @@ struct drm_plane { >> >> #define obj_to_plane(x) container_of(x, struct drm_plane, base) >> >> -extern __printf(8, 9) >> +extern __printf(10, 11) >> int drm_universal_plane_init(struct drm_device *dev, >> struct drm_plane *plane, >> uint32_t possible_crtcs, >> const struct drm_plane_funcs *funcs, >> const uint32_t *formats, >> unsigned int format_count, >> + const struct drm_format_modifier *format_modifiers, >> + unsigned int format_modifier_count, >> enum drm_plane_type type, >> const char *name, ...); >> extern int drm_plane_init(struct drm_device *dev, >> diff --git a/include/drm/drm_simple_kms_helper.h b/include/drm/drm_simple_kms_helper.h >> index 01a8436..98997e0 100644 >> --- a/include/drm/drm_simple_kms_helper.h >> +++ b/include/drm/drm_simple_kms_helper.h >> @@ -120,6 +120,8 @@ int drm_simple_display_pipe_init(struct drm_device *dev, >> struct drm_simple_display_pipe *pipe, >> const struct drm_simple_display_pipe_funcs *funcs, >> const uint32_t *formats, unsigned int format_count, >> + const struct drm_format_modifier *format_modifiers, >> + unsigned int format_modifier_count, >> struct drm_connector *connector); >> >> #endif /* __LINUX_DRM_SIMPLE_KMS_HELPER_H */ >> diff --git a/include/uapi/drm/drm.h b/include/uapi/drm/drm.h >> index b2c5284..487e0f1 100644 >> --- a/include/uapi/drm/drm.h >> +++ b/include/uapi/drm/drm.h >> @@ -805,6 +805,7 @@ extern "C" { >> #define DRM_IOCTL_MODE_DESTROY_DUMB DRM_IOWR(0xB4, struct drm_mode_destroy_dumb) >> #define DRM_IOCTL_MODE_GETPLANERESOURCES DRM_IOWR(0xB5, struct drm_mode_get_plane_res) >> #define DRM_IOCTL_MODE_GETPLANE DRM_IOWR(0xB6, struct drm_mode_get_plane) >> +#define DRM_IOCTL_MODE_GETPLANE2 DRM_IOWR(0xB6, struct drm_mode_get_plane2) >> #define DRM_IOCTL_MODE_SETPLANE DRM_IOWR(0xB7, struct drm_mode_set_plane) >> #define DRM_IOCTL_MODE_ADDFB2 DRM_IOWR(0xB8, struct drm_mode_fb_cmd2) >> #define DRM_IOCTL_MODE_OBJ_GETPROPERTIES DRM_IOWR(0xB9, struct drm_mode_obj_get_properties) >> diff --git a/include/uapi/drm/drm_mode.h b/include/uapi/drm/drm_mode.h >> index ce7efe2..cea3de3 100644 >> --- a/include/uapi/drm/drm_mode.h >> +++ b/include/uapi/drm/drm_mode.h >> @@ -209,6 +209,33 @@ struct drm_mode_get_plane { >> __u64 format_type_ptr; >> }; >> >> +struct drm_format_modifier { >> + /* Bitmask of formats in get_plane format list this info >> + * applies to. */ >> + uint64_t formats; >> + >> + /* This modifier can be used with the format for this plane. */ >> + uint64_t modifier; >> +}; >> + >> +struct drm_mode_get_plane2 { >> + __u32 plane_id; >> + >> + __u32 crtc_id; >> + __u32 fb_id; >> + >> + __u32 possible_crtcs; >> + __u32 gamma_size; >> + >> + __u32 count_format_types; >> + __u64 format_type_ptr; >> + >> + /* New in v2 */ >> + __u32 count_format_modifiers; >> + __u32 flags; >> + __u64 format_modifier_ptr; >> +}; >> + >> struct drm_mode_get_plane_res { >> __u64 plane_id_ptr; >> __u32 count_planes; >> -- >> 2.9.3 >> >> _______________________________________________ >> dri-devel mailing list >> dri-devel@xxxxxxxxxxxxxxxxxxxxx >> https://lists.freedesktop.org/mailman/listinfo/dri-devel _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel