From nobody Mon May 25 04:33:59 2026 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 AF397388E5B for ; Mon, 18 May 2026 17:55:09 +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=1779126911; cv=none; b=YTm26CW6L7zeRQEn7iGzqPyFFffaVOX281djUKRNaBvJv5FMeYPtr5Q14oWmwSpcxdEtKbfCsuuW+7fvFiauOjQ4Sp93iIUyg+STiNPlvONvUwxN6q5fI4NolcHoQmuEVvyJT/aUQwRoFvDvW8suAeH8iHESmf+i3nF93xLz2dk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779126911; c=relaxed/simple; bh=AcqfgZxPqyMzG8mjzHgOU2rztiegbwzki9Ewrc5oGcI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ClmUUotZURSZaHjBWzPsyzNKGmsdwuU6pgPiiWbJfdNjWEMNH8otukFAcwZ2lBis1zuZdM2X3ZwHv35gk0EDEFJDbGFXB/IpBibRsmEPgi/W3XJKehZlCFUd5Rs0+fsXD+Y/GlPCEr20KkKJQlRfTGden/+QCpAN7JffFnKiVcg= 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=QBsh0uCW; 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="QBsh0uCW" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1779126908; bh=AcqfgZxPqyMzG8mjzHgOU2rztiegbwzki9Ewrc5oGcI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=QBsh0uCW3DP36MyK/G+qsrMpjO+e8xWLoH75+rf1wq9nR4wAczooeRkbVo4Y65Rte A1jk9N+49X9TAMXJlSGkRxO7lPsW2/nWUKAJkZhlMo77BSMgtOa7BymilvRQc57qkZ 0nAQ1hEFF8phiQtEUXjvaSUjUCiOJqiFYpGsU/EHTHMl/f2k0QXwsuner+hCEXUSj6 ExccSyZW7GuVmEd0AZOPQmMiBGZiHF3LORZUyTqA+hr7gILsYHxF1mtwgrqHgaIKzP FXYO3DGOLbTXplru9Q1HEuYb6RBSjZ6qc+t2oOIVrnD9kiBjDW6mlC2fpUqfQj40FU aavfqzgSn2fTg== 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 8B03517E0940; Mon, 18 May 2026 19:55:04 +0200 (CEST) From: Leandro Ribeiro To: dri-devel@lists.freedesktop.org Cc: airlied@gmail.com, daniels@collabora.com, jani.nikula@linux.intel.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 v3 1/2] drm/drm_blend: allow blend mode property without PREMULTI Date: Mon, 18 May 2026 14:54:28 -0300 Message-ID: <20260518175429.80615-2-leandro.ribeiro@collabora.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260518175429.80615-1-leandro.ribeiro@collabora.com> References: <20260518175429.80615-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: quoted-printable Content-Type: text/plain; charset="utf-8" Some hardware only supports the COVERAGE blend mode and lacks PREMULTI support entirely. DRM currently requires that PREMULTI is present when creating a blend mode property, which prevents such drivers from being properly upstreamed. Remove this restriction and allow drivers to create a blend mode property without PREMULTI, enabling support for hardware that implements only COVERAGE blend mode. This does not introduce a regression, as no existing upstream drivers expose only COVERAGE. However, userspace that wants to support such kind of hardware in the future will have to check the supported blend modes instead of assuming PREMULTI is always supported. Signed-off-by: Leandro Ribeiro --- drivers/gpu/drm/drm_blend.c | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/drm_blend.c b/drivers/gpu/drm/drm_blend.c index 1f3af27d2418..7d4033989749 100644 --- a/drivers/gpu/drm/drm_blend.c +++ b/drivers/gpu/drm/drm_blend.c @@ -563,10 +563,10 @@ EXPORT_SYMBOL(drm_atomic_normalize_zpos); /** * drm_plane_create_blend_mode_property - create a new blend mode property * @plane: drm plane - * @supported_modes: bitmask of supported modes, must include - * BIT(DRM_MODE_BLEND_PREMULTI). Current DRM assumption is - * that alpha is premultiplied, and old userspace can break if - * the property defaults to anything else. + * @supported_modes: bitmask of supported modes. When + * BIT(DRM_MODE_BLEND_PREMULTI) is included, it will be used + * as the default. Otherwise, the default will fallback to one + * of the supported modes. * * This creates a new property describing the blend mode. * @@ -599,13 +599,14 @@ int drm_plane_create_blend_mode_property(struct drm_p= lane *plane, { DRM_MODE_BLEND_PREMULTI, "Pre-multiplied" }, { DRM_MODE_BLEND_COVERAGE, "Coverage" }, }; + unsigned int default_mode; unsigned int valid_mode_mask =3D BIT(DRM_MODE_BLEND_PIXEL_NONE) | BIT(DRM_MODE_BLEND_PREMULTI) | BIT(DRM_MODE_BLEND_COVERAGE); int i; =20 if (WARN_ON((supported_modes & ~valid_mode_mask) || - ((supported_modes & BIT(DRM_MODE_BLEND_PREMULTI)) =3D=3D 0))) + (supported_modes =3D=3D 0))) return -EINVAL; =20 prop =3D drm_property_create(dev, DRM_MODE_PROP_ENUM, @@ -630,7 +631,14 @@ int drm_plane_create_blend_mode_property(struct drm_pl= ane *plane, } } =20 - drm_object_attach_property(&plane->base, prop, DRM_MODE_BLEND_PREMULTI); + if (supported_modes & BIT(DRM_MODE_BLEND_PREMULTI)) + default_mode =3D DRM_MODE_BLEND_PREMULTI; + else if (supported_modes & BIT(DRM_MODE_BLEND_COVERAGE)) + default_mode =3D DRM_MODE_BLEND_COVERAGE; + else + default_mode =3D DRM_MODE_BLEND_PIXEL_NONE; + + drm_object_attach_property(&plane->base, prop, default_mode); plane->blend_mode_property =3D prop; =20 return 0; --=20 2.54.0 From nobody Mon May 25 04:33:59 2026 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 000DC38758D for ; Mon, 18 May 2026 17:55:13 +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=1779126916; cv=none; b=OBgiI9KKFUCK3PFEtgK7qA3JA3BrUOTpRwMiGYqe/omZC7foWnrcgIEAqzo96+49Lo6MK+JKVChdiqtp8iwX/PK49lFwTLk2pW1L8a37Y4W2/JC8J2OYwF1um+Zxlv4F5+9XvCtE/eE4VePkcK20lT002QBRqhhZ15ixos3JeW0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779126916; c=relaxed/simple; bh=/1ILoxpmqZWfAumf47v8TGHhvAX8kM6JHCgLHG3kEHk=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=lk93R5VYIuD9ZcP8VV7lb25KcByvaekuChVl0UN6atjH2hPukLWhj97nkqv/C/WrEiJPpS22sdqowYyjT+Dh3258oUBLex5aKfdxIglf23g4Mj8eMYSGhjYi/jnyAb/H5rOMvq1a3OvgMGsQPDaCS5W887q/9zoE2ChwuWWhYe0= 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=mCLv/GGp; 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="mCLv/GGp" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1779126912; bh=/1ILoxpmqZWfAumf47v8TGHhvAX8kM6JHCgLHG3kEHk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=mCLv/GGpSZ22RKNf9pftuH/DsK49k2rkxzyq60wyL91LxfYmhCV9xu93YIZrjtuia 01pkBW5GA3Br666jMtgf1VI6eHgfIM7tMvi0LCdMNmh9yYQgbPBtlQTazSTfTDOolM RZ+O4JPxaYgpakfW5lXbUKrRX014aT25MQS6vXq0zknT1mXffWapgyhcoeGpc4pGff VDMLP+u6XOK1ew7qtBghkbjTPVnOKb2/Rwk3NfLz2CLFUag2lb6uQlkhlR0A5zXEbr QKKhDiFjHzuK2Mp87ZZLis9LKCh4jFr/1f4nrNix4DbrPOzOQSrvwKOAyF+I4YBQvA zPQ1yvQMrwmAQ== 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 A2A1F17E0246; Mon, 18 May 2026 19:55:08 +0200 (CEST) From: Leandro Ribeiro To: dri-devel@lists.freedesktop.org Cc: airlied@gmail.com, daniels@collabora.com, jani.nikula@linux.intel.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 v3 2/2] drm: ensure blend mode supported if alpha exposed Date: Mon, 18 May 2026 14:54:29 -0300 Message-ID: <20260518175429.80615-3-leandro.ribeiro@collabora.com> X-Mailer: git-send-email 2.54.0 In-Reply-To: <20260518175429.80615-1-leandro.ribeiro@collabora.com> References: <20260518175429.80615-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: quoted-printable Content-Type: text/plain; charset="utf-8" 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 | 2 +- drivers/gpu/drm/drm_drv.c | 7 ++++-- drivers/gpu/drm/drm_mode_config.c | 37 +++++++++++++++++++++++++++-- 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/drivers/gpu/drm/drm_crtc_internal.h b/drivers/gpu/drm/drm_crtc= _internal.h index c09409229644..2a4862202496 100644 --- a/drivers/gpu/drm/drm_crtc_internal.h +++ b/drivers/gpu/drm/drm_crtc_internal.h @@ -95,7 +95,7 @@ int drm_mode_setcrtc(struct drm_device *dev, /* drm_mode_config.c */ 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_validate(struct drm_device *dev); =20 /* 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..def78046a963 100644 --- a/drivers/gpu/drm/drm_drv.c +++ b/drivers/gpu/drm/drm_drv.c @@ -1059,8 +1059,11 @@ int drm_dev_register(struct drm_device *dev, unsigne= d long flags) const struct drm_driver *driver =3D dev->driver; int ret; =20 - if (!driver->load) - drm_mode_config_validate(dev); + if (!driver->load) { + ret =3D drm_mode_config_validate(dev); + if (ret) + return ret; + } =20 WARN_ON(!dev->managed.final_kfree); =20 diff --git a/drivers/gpu/drm/drm_mode_config.c b/drivers/gpu/drm/drm_mode_c= onfig.c index 66f7dc37b597..18c6b5707532 100644 --- a/drivers/gpu/drm/drm_mode_config.c +++ b/drivers/gpu/drm/drm_mode_config.c @@ -674,16 +674,45 @@ static void validate_encoder_possible_crtcs(struct dr= m_encoder *encoder) encoder->possible_crtcs, crtc_mask); } =20 -void drm_mode_config_validate(struct drm_device *dev) +static int plane_alpha_require_blend_mode(struct drm_plane *plane) +{ + struct drm_device *dev =3D 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 se= tup", + plane->base.id, plane->name); + return -EINVAL; + } + + for (i =3D 0; i < plane->format_count; i++) { + fmt =3D drm_format_info(plane->format_types[i]); + if (fmt->has_alpha) { + drm_err(dev, "[PLANE:%d:%s] pixel format with alpha exposed but blend m= ode not setup", + plane->base.id, plane->name); + return -EINVAL; + } + } + + return 0; +} + +int drm_mode_config_validate(struct drm_device *dev) { struct drm_encoder *encoder; struct drm_crtc *crtc; struct drm_plane *plane; u32 primary_with_crtc =3D 0, cursor_with_crtc =3D 0; unsigned int num_primary =3D 0; + int ret =3D 0; =20 if (!drm_core_check_feature(dev, DRIVER_MODESET)) - return; + return ret; =20 drm_for_each_encoder(encoder, dev) fixup_encoder_possible_clones(encoder); @@ -732,9 +761,13 @@ void drm_mode_config_validate(struct drm_device *dev) drm_for_each_plane(plane, dev) { if (plane->type =3D=3D DRM_PLANE_TYPE_PRIMARY) num_primary++; + + ret |=3D plane_alpha_require_blend_mode(plane); } =20 WARN(num_primary !=3D dev->mode_config.num_crtc, "Must have as many primary planes as there are CRTCs, but have %u pr= imary planes and %u CRTCs", num_primary, dev->mode_config.num_crtc); + + return ret; } --=20 2.54.0