Make it a little less convoluted, and just directly check if the combination of plane + format + modifier is supported.
Signed-off-by: Daniel Stone <[email protected]> --- drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 56 ++++++++------------ 1 file changed, 22 insertions(+), 34 deletions(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c index e2a18c303357..fb3e10172942 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c @@ -366,59 +366,47 @@ static bool is_yuv_output(u32 bus_format) } } -static bool rockchip_afbc(struct drm_plane *plane, u64 modifier) -{ - int i; - - if (modifier == DRM_FORMAT_MOD_LINEAR) - return false; - - for (i = 0 ; i < plane->modifier_count; i++) - if (plane->modifiers[i] == modifier) - return true; - - return false; -} - static bool rockchip_vop2_mod_supported(struct drm_plane *plane, u32 format, u64 modifier) { struct vop2_win *win = to_vop2_win(plane); struct vop2 *vop2 = win->vop2; + int i; + /* No support for implicit modifiers */ if (modifier == DRM_FORMAT_MOD_INVALID) return false; - if (vop2->version == VOP_VERSION_RK3568) { - if (vop2_cluster_window(win)) { - if (modifier == DRM_FORMAT_MOD_LINEAR) { - drm_dbg_kms(vop2->drm, - "Cluster window only supports format with afbc\n"); - return false; - } - } + /* The cluster window on 3568 is AFBC-only */ + if (vop2->version == VOP_VERSION_RK3568 && vop2_cluster_window(win) && + !drm_is_afbc(modifier)) { + drm_dbg_kms(vop2->drm, + "Cluster window only supports format with afbc\n"); + return false; } - if (format == DRM_FORMAT_XRGB2101010 || format == DRM_FORMAT_XBGR2101010) { - if (vop2->version == VOP_VERSION_RK3588) { - if (!rockchip_afbc(plane, modifier)) { - drm_dbg_kms(vop2->drm, "Only support 32 bpp format with afbc\n"); - return false; - } - } + /* 10bpc formats on 3588 are AFBC-only */ + if (vop2->version == VOP_VERSION_RK3588 && !drm_is_afbc(modifier) && + (format == DRM_FORMAT_XRGB2101010 || format == DRM_FORMAT_XBGR2101010)) { + drm_dbg_kms(vop2->drm, "Only support 10bpc format with afbc\n"); + return false; } + /* Linear is otherwise supported everywhere */ if (modifier == DRM_FORMAT_MOD_LINEAR) return true; - if (!rockchip_afbc(plane, modifier)) { - drm_dbg_kms(vop2->drm, "Unsupported format modifier 0x%llx\n", - modifier); - + /* Not all format+modifier combinations are allowable */ + if (vop2_convert_afbc_format(format) == VOP2_AFBC_FMT_INVALID) return false; + + /* Different windows have different format/modifier support */ + for (i = 0; i < plane->modifier_count; i++) { + if (plane->modifiers[i] == modifier) + return true; } - return vop2_convert_afbc_format(format) >= 0; + return false; } /* -- 2.51.0
