From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from bali.collaboradmins.com (bali.collaboradmins.com [148.251.105.195]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DFD6B3DFC98 for ; Mon, 4 May 2026 14:06:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=148.251.105.195 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777903614; cv=none; b=pVaot+b9kmfitAfcvQz8nxtN0cO1RUDcYl9vKPkdnG/MCpsPnRLwjEAOLfGBgOnDM2KwUFS7hLummlAx0O1DvFHefjtf0YS1eMUgz9KoOybdPEoW3ortvjAmfLlmlXAIhOcPFHksNQT6/iqaVNc/AU6MXPCD1Sb7mWVC5silnsY= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777903614; c=relaxed/simple; bh=jh3Sp6NASVasU8uZv6Mlg4VSABR1Bmq0uDojLqTI0II=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=LrAtq644jWv5ZLpy8Q+68Q4RBEZjDWhqv1hgaECH3/JlKviZP4Rlevs1O15jz1k4IKBNMhv682ElxtSkaZ1J85Ap/0HTKHl2FokHLcAB3TpOqjrUZXJPlA8NIE8L5wenj2A91PxEkNNzxPIC1qmD9CcsfiiEOul6ReIGxV6cOLc= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com; spf=pass smtp.mailfrom=collabora.com; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b=Lmm3f1Uo; arc=none smtp.client-ip=148.251.105.195 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=collabora.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=collabora.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=collabora.com header.i=@collabora.com header.b="Lmm3f1Uo" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1777903611; bh=jh3Sp6NASVasU8uZv6Mlg4VSABR1Bmq0uDojLqTI0II=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Lmm3f1UoYD6d10fcWnfZDk04TI8qiQ1ZqcrVEzVavu6wyi768znCJAusHlYksUGvk FxUlxsu4D+44ugBrcKFzvE4SdAt+CQ9OYkEbH3nppEATMDIstPxzr6UdtOwHiq53pK ixvbWum+O29RzBXIpN2KQwv0YzNMEL0n0d1oO3V48ivHkZSHCC0juiPi6bdjJpXP1O 4UUvUPK+5TLIsDvCJy7Ga+QcVoZJT0H5c6Bpdy33QHFj8PI0hOynQk33j/74RqK03H PJqknnzfZEjc3bp7OnlZGi8TL+P7sljuMHTYXtTlgVwT15mKAY3gt29MTlBvN0N+dj JvPBXCflFb0xQ== Received: from archlinux (unknown [100.64.1.80]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) (Authenticated sender: leandrohrb) by bali.collaboradmins.com (Postfix) with ESMTPSA id 9C15617E131B; Mon, 4 May 2026 16:06:47 +0200 (CEST) From: Leandro Ribeiro To: dri-devel@lists.freedesktop.org Cc: airlied@gmail.com, daniels@collabora.com, maarten.lankhorst@linux.intel.com, mripard@kernel.org, pekka.paalanen@collabora.com, simona@ffwll.ch, tzimmermann@suse.de, ville.syrjala@linux.intel.com, linux-kernel@vger.kernel.org Subject: [PATCH v2 2/2] drm: ensure blend mode supported if alpha exposed Date: Mon, 4 May 2026 11:06:30 -0300 Message-ID: <20260504140630.68707-3-leandro.ribeiro@collabora.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260504140630.68707-1-leandro.ribeiro@collabora.com> References: <20260504140630.68707-1-leandro.ribeiro@collabora.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Before "drm/drm_blend: allow blend mode property without PREMULTI", userspace would have to assume that only PREMULTI was supported by drivers that didn't expose the blend mode property. But now userspace shouldn't relly on that, as they can't count with drivers always supporting PREMULTI. Error out if a driver expose alpha property or pixel formats with alpha and does not expose the blend mode property. This way userspace don't have to guess. Drivers that hit such error must be fixed. Signed-off-by: Leandro Ribeiro --- drivers/gpu/drm/drm_crtc_internal.h | 1 + drivers/gpu/drm/drm_drv.c | 7 ++++- drivers/gpu/drm/drm_mode_config.c | 42 +++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/drm_crtc_internal.h b/drivers/gpu/drm/drm_crtc_internal.h index c09409229644..bdbb6b9b94ea 100644 --- a/drivers/gpu/drm/drm_crtc_internal.h +++ b/drivers/gpu/drm/drm_crtc_internal.h @@ -96,6 +96,7 @@ int drm_mode_setcrtc(struct drm_device *dev, int drm_modeset_register_all(struct drm_device *dev); void drm_modeset_unregister_all(struct drm_device *dev); void drm_mode_config_validate(struct drm_device *dev); +int drm_mode_config_enforce(struct drm_device *dev); /* drm_modes.c */ const char *drm_get_mode_status_name(enum drm_mode_status status); diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c index 985c283cf59f..76766a370650 100644 --- a/drivers/gpu/drm/drm_drv.c +++ b/drivers/gpu/drm/drm_drv.c @@ -1059,9 +1059,14 @@ int drm_dev_register(struct drm_device *dev, unsigned long flags) const struct drm_driver *driver = dev->driver; int ret; - if (!driver->load) + if (!driver->load) { drm_mode_config_validate(dev); + ret = drm_mode_config_enforce(dev); + if (ret) + return ret; + } + WARN_ON(!dev->managed.final_kfree); if (drm_dev_needs_global_mutex(dev)) diff --git a/drivers/gpu/drm/drm_mode_config.c b/drivers/gpu/drm/drm_mode_config.c index 66f7dc37b597..20fd26ecb957 100644 --- a/drivers/gpu/drm/drm_mode_config.c +++ b/drivers/gpu/drm/drm_mode_config.c @@ -738,3 +738,45 @@ void drm_mode_config_validate(struct drm_device *dev) "Must have as many primary planes as there are CRTCs, but have %u primary planes and %u CRTCs", num_primary, dev->mode_config.num_crtc); } + +static int plane_require_blend_mode_for_alpha(struct drm_plane *plane) +{ + struct drm_device *dev = plane->dev; + const struct drm_format_info *fmt; + u32 i; + + /* blend mode property supported, no need to check anything */ + if (plane->blend_mode_property) + return 0; + + if (plane->alpha_property) { + drm_err(dev, "[PLANE:%d:%s] alpha property exposed but blend mode not setup", + plane->base.id, plane->name); + return -EINVAL; + } + + for (i = 0; i < plane->format_count; i++) { + fmt = drm_format_info(plane->format_types[i]); + if (fmt->has_alpha) { + drm_err(dev, "[PLANE:%d:%s] pixel format with alpha exposed but blend mode not setup", + plane->base.id, plane->name); + return -EINVAL; + } + } + + return 0; +} + +int drm_mode_config_enforce(struct drm_device *dev) +{ + struct drm_plane *plane; + int ret; + + drm_for_each_plane(plane, dev) { + ret = plane_require_blend_mode_for_alpha(plane); + if (ret) + return ret; + } + + return 0; +} -- 2.54.0