Add support for the linear modifier. Since the rcar-du device supports only linear modifier, this driver doesn't support other modifiers. Signed-off-by: Tomohito Esaki <etom@xxxxxxxxxx> --- drivers/gpu/drm/rcar-du/rcar_du_kms.c | 11 +++++++++++ drivers/gpu/drm/rcar-du/rcar_du_plane.c | 15 ++++++++++++++- drivers/gpu/drm/rcar-du/rcar_du_vsp.c | 15 ++++++++++++++- 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c index 3b7d50a8fb9b..9c5e15a5ab1c 100644 --- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c +++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c @@ -214,6 +214,16 @@ rcar_du_fb_create(struct drm_device *dev, struct drm_file *file_priv, return ERR_PTR(-EINVAL); } + /* + * Support only LINEAR modifier. + */ + if ((mode_cmd->flags & DRM_MODE_FB_MODIFIERS) && + mode_cmd->modifier[0] != DRM_FORMAT_MOD_LINEAR) { + dev_dbg(dev->dev, "unsupported fb modifier 0x%llx\n", + mode_cmd->modifier[0]); + return ERR_PTR(-EINVAL); + } + if (rcdu->info->gen < 3) { /* * On Gen2 the DU limits the pitch to 4095 pixels and requires @@ -529,6 +539,7 @@ int rcar_du_modeset_init(struct rcar_du_device *rcdu) dev->mode_config.min_width = 0; dev->mode_config.min_height = 0; dev->mode_config.normalize_zpos = true; + dev->mode_config.allow_fb_modifiers = true; dev->mode_config.funcs = &rcar_du_mode_config_funcs; dev->mode_config.helper_private = &rcar_du_mode_config_helper; diff --git a/drivers/gpu/drm/rcar-du/rcar_du_plane.c b/drivers/gpu/drm/rcar-du/rcar_du_plane.c index c6430027169f..32135ad387fa 100644 --- a/drivers/gpu/drm/rcar-du/rcar_du_plane.c +++ b/drivers/gpu/drm/rcar-du/rcar_du_plane.c @@ -726,6 +726,13 @@ static int rcar_du_plane_atomic_get_property(struct drm_plane *plane, return 0; } +static bool rcar_du_plane_format_mod_supported(struct drm_plane *plane, + uint32_t format, + uint64_t modifier) +{ + return modifier == DRM_FORMAT_MOD_LINEAR; +} + static const struct drm_plane_funcs rcar_du_plane_funcs = { .update_plane = drm_atomic_helper_update_plane, .disable_plane = drm_atomic_helper_disable_plane, @@ -735,6 +742,7 @@ static const struct drm_plane_funcs rcar_du_plane_funcs = { .atomic_destroy_state = rcar_du_plane_atomic_destroy_state, .atomic_set_property = rcar_du_plane_atomic_set_property, .atomic_get_property = rcar_du_plane_atomic_get_property, + .format_mod_supported = rcar_du_plane_format_mod_supported, }; static const uint32_t formats[] = { @@ -750,6 +758,11 @@ static const uint32_t formats[] = { DRM_FORMAT_NV16, }; +static const uint64_t modifiers[] = { + DRM_FORMAT_MOD_LINEAR, + DRM_FORMAT_MOD_INVALID, +}; + int rcar_du_planes_init(struct rcar_du_group *rgrp) { struct rcar_du_device *rcdu = rgrp->dev; @@ -776,7 +789,7 @@ 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), - NULL, type, NULL); + modifiers, type, NULL); if (ret < 0) return ret; diff --git a/drivers/gpu/drm/rcar-du/rcar_du_vsp.c b/drivers/gpu/drm/rcar-du/rcar_du_vsp.c index 0878accbd134..9d1382b02717 100644 --- a/drivers/gpu/drm/rcar-du/rcar_du_vsp.c +++ b/drivers/gpu/drm/rcar-du/rcar_du_vsp.c @@ -139,6 +139,11 @@ static const u32 formats_kms[] = { DRM_FORMAT_YVU444, }; +static const uint64_t modifiers_kms[] = { + DRM_FORMAT_MOD_LINEAR, + DRM_FORMAT_MOD_INVALID, +}; + static const u32 formats_v4l2[] = { V4L2_PIX_FMT_RGB332, V4L2_PIX_FMT_ARGB444, @@ -344,6 +349,13 @@ static void rcar_du_vsp_plane_reset(struct drm_plane *plane) state->state.zpos = plane->type == DRM_PLANE_TYPE_PRIMARY ? 0 : 1; } +static bool rcar_du_vsp_plane_format_mod_supported(struct drm_plane *plane, + uint32_t format, + uint64_t modifier) +{ + return modifier == DRM_FORMAT_MOD_LINEAR; +} + static const struct drm_plane_funcs rcar_du_vsp_plane_funcs = { .update_plane = drm_atomic_helper_update_plane, .disable_plane = drm_atomic_helper_disable_plane, @@ -351,6 +363,7 @@ static const struct drm_plane_funcs rcar_du_vsp_plane_funcs = { .destroy = drm_plane_cleanup, .atomic_duplicate_state = rcar_du_vsp_plane_atomic_duplicate_state, .atomic_destroy_state = rcar_du_vsp_plane_atomic_destroy_state, + .format_mod_supported = rcar_du_vsp_plane_format_mod_supported, }; int rcar_du_vsp_init(struct rcar_du_vsp *vsp, struct device_node *np, @@ -397,7 +410,7 @@ int rcar_du_vsp_init(struct rcar_du_vsp *vsp, struct device_node *np, &rcar_du_vsp_plane_funcs, formats_kms, ARRAY_SIZE(formats_kms), - NULL, type, NULL); + modifiers_kms, type, NULL); if (ret < 0) return ret; -- 2.17.1