* [PATCH 0/2] Introduce BACKGROUND_COLOR DRM CRTC property
@ 2025-09-02 9:27 Cristian Ciocaltea
2025-09-02 9:27 ` [PATCH 1/2] drm: Add CRTC background color property Cristian Ciocaltea
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Cristian Ciocaltea @ 2025-09-02 9:27 UTC (permalink / raw)
To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Sandy Huang, Heiko Stübner, Andy Yan
Cc: kernel, dri-devel, linux-kernel, linux-arm-kernel, linux-rockchip,
Matt Roper
Some display controllers can be hardware-configured to present non-black
colors for pixels which are not covered by any plane (or are exposed
through transparent regions of higher planes).
The first patch of the series introduces the BACKGROUND_COLOR DRM
property that can be attached to a CRTC via a dedicated helper function.
A 64-bit ARGB color value format is also defined and can be manipulated
with the help of a few utility macros.
Note this is a reworked version of the patch [1] submitted (many) years
ago by Matt Roper. The main changes are:
* Dropped drm_arg() in favor of drm_argb64() to get rid of the bpc
parameter and the related shifting for more flexibility in operation,
e.g. when user-space cannot make use of the helper and/or when it
doesn't now the actual precision supported by the HW. This also
simplifies the property verification/validation testing (see below).
It works by extracting the specified number of least-significant bits
from each color component.
* Renamed DRM_ARGB_*() to DRM_ARGB64_*_LSB() while providing convenience
wrappers to extract all 16 bits of a specific color via DRM_ARGB64_*()
* Replaced GENMASK_ULL(63, 0) with U64_MAX when calling
drm_property_create_range() to create the BACKGROUND_COLOR property
* Moved crtc_state->bgcolor initialization from
__drm_atomic_helper_crtc_reset() to
__drm_atomic_helper_crtc_state_reset()
* Replaced '*bgcolor*' occurrences to '*background_color*' for
consistency with the actual property name in both storage field and
helper functions names
The second patch adds background color support to the VOP2 display
controller used in the RK3568, RK3576, and RK3588 Rockchip SoC families.
For the moment this has been validated using a modetest wrapper script
[2], which is able to execute several tests - see an example of a
generated report at the end. Proper support in Weston is currently in
development, and I will provide a reference once it becomes available.
The tests were performed on the Radxa boards listed below. Please note
that as of next-20250901, there are a few known regressions; for each
case, I mentioned the actual problem and its related fix/workaround
accordingly:
* ROCK 3A (RK3568)
- issue: broken networking
- fix: revert commit da114122b831 ("net: ethernet: stmmac: dwmac-rk: Make
the clk_phy could be used for external phy")
* ROCK 4D (RK3576)
- issue: random freezes right after booting
- fix: add regulator_ignore_unused to kernel cmdline
* ROCK 5B (RK3588)
- issue: broken networking
- fix: apply patch [3]
[1] https://lore.kernel.org/all/20190930224707.14904-2-matthew.d.roper@intel.com/
[2] https://gitlab.collabora.com/cristicc/linux-next/-/commits/drm-vop2-bgcolor-test
[3] https://lore.kernel.org/all/20250827230943.17829-1-inochiama@gmail.com/
Validation report on ROCK 5B
============================
$ tools/testing/rk-bgcol-test.sh
---------------------------------------------------------------
Available Rockchip display connectors
---------------------------------------------------------------
id type status crtc_id plane_id
85 11 2 0 34
88 11 1 83 40
Selected connector: id=88 crtc=83 plane=40
---------------------------------------------------------------
Check initial state
---------------------------------------------------------------
Read BACKGROUND_COLOR prop (ARGB64): 0xffff000000000000
Connector: HDMI-A-2
background color (10bpc): r=0 g=0 b=0
---------------------------------------------------------------
Set/get DRM property
---------------------------------------------------------------
Changing prop value to: 0xffff00000000ffff
opened device `RockChip Soc DRM` on driver `rockchip` (version 1.0.0 at 0)
Read BACKGROUND_COLOR prop (ARGB64): 0xffff00000000ffff
Connector: HDMI-A-2
background color (10bpc): r=0 g=0 b=ffff
---------------------------------------------------------------
Plane display test 40@83:960x540+480+270
---------------------------------------------------------------
Changing prop value to 0xffffffff00000000
Press ENTER to continue..
opened device `RockChip Soc DRM` on driver `rockchip` (version 1.0.0 at 0)
testing 960x540@XR24 overlay plane 40
Read BACKGROUND_COLOR prop (ARGB64): 0xffffffff00000000
Connector: HDMI-A-2
background color (10bpc): r=ffff g=0 b=0
Changing prop value to 0xffff0000ffff0000
Press ENTER to continue..
opened device `RockChip Soc DRM` on driver `rockchip` (version 1.0.0 at 0)
testing 960x540@XR24 overlay plane 40
Read BACKGROUND_COLOR prop (ARGB64): 0xffff0000ffff0000
Connector: HDMI-A-2
background color (10bpc): r=0 g=ffff b=0
Changing prop value to 0xffff00000000ffff
Press ENTER to continue..
opened device `RockChip Soc DRM` on driver `rockchip` (version 1.0.0 at 0)
testing 960x540@XR24 overlay plane 40
Read BACKGROUND_COLOR prop (ARGB64): 0xffff00000000ffff
Connector: HDMI-A-2
background color (10bpc): r=0 g=0 b=ffff
---------------------------------------------------------------
Restoring state
---------------------------------------------------------------
Changing prop value to: 0xffff000000000000
opened device `RockChip Soc DRM` on driver `rockchip` (version 1.0.0 at 0)
Read BACKGROUND_COLOR prop (ARGB64): 0xffff000000000000
Connector: HDMI-A-2
background color (10bpc): r=0 g=0 b=0
Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
---
Cristian Ciocaltea (2):
drm: Add CRTC background color property
drm/rockchip: vop2: Support setting custom background color
drivers/gpu/drm/drm_atomic_state_helper.c | 1 +
drivers/gpu/drm/drm_atomic_uapi.c | 4 +++
drivers/gpu/drm/drm_blend.c | 37 +++++++++++++++++++++++++---
drivers/gpu/drm/drm_mode_config.c | 6 +++++
drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 13 +++++++++-
drivers/gpu/drm/rockchip/rockchip_drm_vop2.h | 4 +++
include/drm/drm_blend.h | 4 ++-
include/drm/drm_crtc.h | 12 +++++++++
include/drm/drm_mode_config.h | 5 ++++
include/uapi/drm/drm_mode.h | 30 ++++++++++++++++++++++
10 files changed, 110 insertions(+), 6 deletions(-)
---
base-commit: d0630b758e593506126e8eda6c3d56097d1847c5
change-id: 20250829-rk3588-bgcolor-c1a7b9a507bc
^ permalink raw reply [flat|nested] 7+ messages in thread
* [PATCH 1/2] drm: Add CRTC background color property
2025-09-02 9:27 [PATCH 0/2] Introduce BACKGROUND_COLOR DRM CRTC property Cristian Ciocaltea
@ 2025-09-02 9:27 ` Cristian Ciocaltea
2025-09-02 13:36 ` Ville Syrjälä
2025-09-02 9:27 ` [PATCH 2/2] drm/rockchip: vop2: Support setting custom background color Cristian Ciocaltea
2025-09-02 13:19 ` [PATCH 0/2] Introduce BACKGROUND_COLOR DRM CRTC property Raphael Gallais-Pou
2 siblings, 1 reply; 7+ messages in thread
From: Cristian Ciocaltea @ 2025-09-02 9:27 UTC (permalink / raw)
To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Sandy Huang, Heiko Stübner, Andy Yan
Cc: kernel, dri-devel, linux-kernel, linux-arm-kernel, linux-rockchip,
Matt Roper
Some display controllers can be hardware programmed to show non-black
colors for pixels that are either not covered by any plane or are
exposed through transparent regions of higher planes. This feature can
help reduce memory bandwidth usage, e.g. in compositors managing a UI
with a solid background color while using smaller planes to render the
remaining content.
To support this capability, introduce the BACKGROUND_COLOR standard DRM
mode property, which can be attached to a CRTC through the
drm_crtc_attach_background_color_property() helper function.
Additionally, define a 64-bit ARGB format value to be built with the
help of a dedicated drm_argb64() utility macro. Individual color
components can be extracted with desired precision using the
corresponding DRM_ARGB64_*() macros.
Co-developed-by: Matt Roper <matthew.d.roper@intel.com>
Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
---
drivers/gpu/drm/drm_atomic_state_helper.c | 1 +
drivers/gpu/drm/drm_atomic_uapi.c | 4 ++++
drivers/gpu/drm/drm_blend.c | 37 +++++++++++++++++++++++++++----
drivers/gpu/drm/drm_mode_config.c | 6 +++++
include/drm/drm_blend.h | 4 +++-
include/drm/drm_crtc.h | 12 ++++++++++
include/drm/drm_mode_config.h | 5 +++++
include/uapi/drm/drm_mode.h | 30 +++++++++++++++++++++++++
8 files changed, 94 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/drm_atomic_state_helper.c b/drivers/gpu/drm/drm_atomic_state_helper.c
index 7142e163e618ea0d7d9d828e1bd9ff2a6ec0dfeb..359264cf467c5270b77f0b04548073bc92cb812e 100644
--- a/drivers/gpu/drm/drm_atomic_state_helper.c
+++ b/drivers/gpu/drm/drm_atomic_state_helper.c
@@ -75,6 +75,7 @@ __drm_atomic_helper_crtc_state_reset(struct drm_crtc_state *crtc_state,
struct drm_crtc *crtc)
{
crtc_state->crtc = crtc;
+ crtc_state->background_color = drm_argb64(0xffff, 0, 0, 0);
}
EXPORT_SYMBOL(__drm_atomic_helper_crtc_state_reset);
diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c
index 85dbdaa4a2e25878c953b9b41539c8566d55c6d9..a447cb119aaa6cd11348be77b39f342a1386836d 100644
--- a/drivers/gpu/drm/drm_atomic_uapi.c
+++ b/drivers/gpu/drm/drm_atomic_uapi.c
@@ -407,6 +407,8 @@ static int drm_atomic_crtc_set_property(struct drm_crtc *crtc,
&replaced);
state->color_mgmt_changed |= replaced;
return ret;
+ } else if (property == config->background_color_property) {
+ state->background_color = val;
} else if (property == config->prop_out_fence_ptr) {
s32 __user *fence_ptr = u64_to_user_ptr(val);
@@ -452,6 +454,8 @@ drm_atomic_crtc_get_property(struct drm_crtc *crtc,
*val = (state->ctm) ? state->ctm->base.id : 0;
else if (property == config->gamma_lut_property)
*val = (state->gamma_lut) ? state->gamma_lut->base.id : 0;
+ else if (property == config->background_color_property)
+ *val = state->background_color;
else if (property == config->prop_out_fence_ptr)
*val = 0;
else if (property == crtc->scaling_filter_property)
diff --git a/drivers/gpu/drm/drm_blend.c b/drivers/gpu/drm/drm_blend.c
index 6852d73c931ce32e62062e2b8f8c5e38612d5210..5a287d12685b007a2732f510f62675f500e53727 100644
--- a/drivers/gpu/drm/drm_blend.c
+++ b/drivers/gpu/drm/drm_blend.c
@@ -191,10 +191,6 @@
* plane does not expose the "alpha" property, then this is
* assumed to be 1.0
*
- * Note that all the property extensions described here apply either to the
- * plane or the CRTC (e.g. for the background color, which currently is not
- * exposed and assumed to be black).
- *
* SCALING_FILTER:
* Indicates scaling filter to be used for plane scaler
*
@@ -207,6 +203,23 @@
*
* Drivers can set up this property for a plane by calling
* drm_plane_create_scaling_filter_property
+ *
+ * The property extensions described above all apply to the plane. Drivers
+ * may also expose the following crtc property extension:
+ *
+ * BACKGROUND_COLOR:
+ * Background color is set via drm_crtc_attach_background_color_property().
+ * It controls the ARGB color of a full-screen layer that exists below all
+ * planes. This color will be used for pixels not covered by any plane and
+ * may also be blended with plane contents as allowed by a plane's alpha
+ * values. The background color defaults to black, and is assumed to be
+ * black for drivers that do not expose this property. Although background
+ * color isn't a plane, it is assumed that the color provided here
+ * undergoes the same pipe-level degamma/CSC/gamma transformations that
+ * planes undergo. Note that the color value provided here includes an
+ * alpha channel, hence non-opaque background color values are allowed, but
+ * are generally only honored in special cases (e.g. when a memory
+ * writeback connector is in use).
*/
/**
@@ -621,3 +634,19 @@ int drm_plane_create_blend_mode_property(struct drm_plane *plane,
return 0;
}
EXPORT_SYMBOL(drm_plane_create_blend_mode_property);
+
+/**
+ * drm_crtc_attach_background_color_property - attach background color property
+ * @crtc: drm crtc
+ *
+ * Attaches the background color property to @crtc. The property defaults to
+ * solid black and will accept 64-bit ARGB values in the format generated by
+ * drm_argb64().
+ */
+void drm_crtc_attach_background_color_property(struct drm_crtc *crtc)
+{
+ drm_object_attach_property(&crtc->base,
+ crtc->dev->mode_config.background_color_property,
+ drm_argb64(0xffff, 0, 0, 0));
+}
+EXPORT_SYMBOL(drm_crtc_attach_background_color_property);
diff --git a/drivers/gpu/drm/drm_mode_config.c b/drivers/gpu/drm/drm_mode_config.c
index 25f376869b3a41d47bbe72b0df3e35cad142f3e6..6d70bfab45ca2bb81ed3ca1940fd1cd85e8cc58e 100644
--- a/drivers/gpu/drm/drm_mode_config.c
+++ b/drivers/gpu/drm/drm_mode_config.c
@@ -375,6 +375,12 @@ static int drm_mode_create_standard_properties(struct drm_device *dev)
return -ENOMEM;
dev->mode_config.gamma_lut_size_property = prop;
+ prop = drm_property_create_range(dev, 0,
+ "BACKGROUND_COLOR", 0, U64_MAX);
+ if (!prop)
+ return -ENOMEM;
+ dev->mode_config.background_color_property = prop;
+
prop = drm_property_create(dev,
DRM_MODE_PROP_IMMUTABLE | DRM_MODE_PROP_BLOB,
"IN_FORMATS", 0);
diff --git a/include/drm/drm_blend.h b/include/drm/drm_blend.h
index 88bdfec3bd8848acd1ef5742aaaa23483b332a2e..c7e888767c81c2745cd3cce88c10db4bbe305d1e 100644
--- a/include/drm/drm_blend.h
+++ b/include/drm/drm_blend.h
@@ -31,8 +31,9 @@
#define DRM_MODE_BLEND_COVERAGE 1
#define DRM_MODE_BLEND_PIXEL_NONE 2
-struct drm_device;
struct drm_atomic_state;
+struct drm_crtc;
+struct drm_device;
struct drm_plane;
static inline bool drm_rotation_90_or_270(unsigned int rotation)
@@ -58,4 +59,5 @@ int drm_atomic_normalize_zpos(struct drm_device *dev,
struct drm_atomic_state *state);
int drm_plane_create_blend_mode_property(struct drm_plane *plane,
unsigned int supported_modes);
+void drm_crtc_attach_background_color_property(struct drm_crtc *crtc);
#endif
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index caa56e039da2a748cf40ebf45b37158acda439d9..4653dacc1077b9ed8fb4cf27cc84530ba1706f6a 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -274,6 +274,18 @@ struct drm_crtc_state {
*/
struct drm_property_blob *gamma_lut;
+ /**
+ * @background_color:
+ *
+ * RGB value representing the pipe's background color. The background
+ * color (aka "canvas color") of a pipe is the color that will be used
+ * for pixels not covered by a plane, or covered by transparent pixels
+ * of a plane. The value here should be built using drm_argb64(), while
+ * the individual color components can be extracted with desired
+ * precision via the DRM_ARGB64_*() macros.
+ */
+ u64 background_color;
+
/**
* @target_vblank:
*
diff --git a/include/drm/drm_mode_config.h b/include/drm/drm_mode_config.h
index 2e848b816218584eb077ed887bf97705f012a622..ea422afec5c4108a223dc872e1b6835ffc596cc3 100644
--- a/include/drm/drm_mode_config.h
+++ b/include/drm/drm_mode_config.h
@@ -814,6 +814,11 @@ struct drm_mode_config {
* gamma LUT as supported by the driver (read-only).
*/
struct drm_property *gamma_lut_size_property;
+ /**
+ * @background_color_property: Optional CRTC property to set the
+ * background color.
+ */
+ struct drm_property *background_color_property;
/**
* @suggested_x_property: Optional connector property with a hint for
diff --git a/include/uapi/drm/drm_mode.h b/include/uapi/drm/drm_mode.h
index a122bea2559387576150236e3a88f99c24ad3138..4bd6a8ca8868109bcbe21f9f6e9864519c9d03ec 100644
--- a/include/uapi/drm/drm_mode.h
+++ b/include/uapi/drm/drm_mode.h
@@ -1363,6 +1363,36 @@ struct drm_mode_closefb {
__u32 pad;
};
+/*
+ * Put 16-bit ARGB values into a standard 64-bit representation that
+ * can be used for ioctl parameters, inter-driver communication, etc.
+ */
+static inline __u64
+drm_argb64(__u16 alpha, __u16 red, __u16 green, __u16 blue)
+{
+ return (__u64)alpha << 48 | (__u64)red << 32 | (__u64)green << 16 | blue;
+}
+
+/*
+ * Extract the specified number of least-significant bits of a specific
+ * color component from a standard 64-bit ARGB value.
+ */
+#define DRM_ARGB64_COMP(c, shift, numlsb) \
+ ((__u16)(((c) >> (shift)) & ((1UL << (numlsb) % 17) - 1)))
+#define DRM_ARGB64_ALPHA_LSB(c, numlsb) DRM_ARGB64_COMP(c, 48, numlsb)
+#define DRM_ARGB64_RED_LSB(c, numlsb) DRM_ARGB64_COMP(c, 32, numlsb)
+#define DRM_ARGB64_GREEN_LSB(c, numlsb) DRM_ARGB64_COMP(c, 16, numlsb)
+#define DRM_ARGB64_BLUE_LSB(c, numlsb) DRM_ARGB64_COMP(c, 0, numlsb)
+
+/*
+ * Convenience wrappers to extract all 16 bits of a specific color
+ * component from a standard 64-bit ARGB value.
+ */
+#define DRM_ARGB64_ALPHA(c) DRM_ARGB64_ALPHA_LSB(c, 16)
+#define DRM_ARGB64_RED(c) DRM_ARGB64_RED_LSB(c, 16)
+#define DRM_ARGB64_GREEN(c) DRM_ARGB64_GREEN_LSB(c, 16)
+#define DRM_ARGB64_BLUE(c) DRM_ARGB64_BLUE_LSB(c, 16)
+
#if defined(__cplusplus)
}
#endif
--
2.51.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [PATCH 2/2] drm/rockchip: vop2: Support setting custom background color
2025-09-02 9:27 [PATCH 0/2] Introduce BACKGROUND_COLOR DRM CRTC property Cristian Ciocaltea
2025-09-02 9:27 ` [PATCH 1/2] drm: Add CRTC background color property Cristian Ciocaltea
@ 2025-09-02 9:27 ` Cristian Ciocaltea
2025-09-02 13:19 ` [PATCH 0/2] Introduce BACKGROUND_COLOR DRM CRTC property Raphael Gallais-Pou
2 siblings, 0 replies; 7+ messages in thread
From: Cristian Ciocaltea @ 2025-09-02 9:27 UTC (permalink / raw)
To: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Sandy Huang, Heiko Stübner, Andy Yan
Cc: kernel, dri-devel, linux-kernel, linux-arm-kernel, linux-rockchip
VOP2 allows configuring the background color of each video output port.
Since a previous patch introduced the BACKGROUND_COLOR CRTC property,
which defaults to solid black, take it into account when programming the
hardware.
Note that only the 10 least significant bits of each color component are
used, as this is the maximum precision supported by the display
controller.
Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
---
drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 13 ++++++++++++-
drivers/gpu/drm/rockchip/rockchip_drm_vop2.h | 4 ++++
2 files changed, 16 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
index b50927a824b4020a7ffd57974070ed202cd8b838..7fe060e7e58297d583b1396cf606b7ba580b8e79 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.c
@@ -1548,6 +1548,7 @@ static void vop2_post_config(struct drm_crtc *crtc)
struct vop2_video_port *vp = to_vop2_video_port(crtc);
struct vop2 *vop2 = vp->vop2;
struct drm_display_mode *mode = &crtc->state->adjusted_mode;
+ u64 bgcolor = crtc->state->background_color;
u16 vtotal = mode->crtc_vtotal;
u16 hdisplay = mode->crtc_hdisplay;
u16 hact_st = mode->crtc_htotal - mode->crtc_hsync_start;
@@ -1593,7 +1594,11 @@ static void vop2_post_config(struct drm_crtc *crtc)
vop2_vp_write(vp, RK3568_VP_POST_DSP_VACT_INFO_F1, val);
}
- vop2_vp_write(vp, RK3568_VP_DSP_BG, 0);
+ /* Background color is programmed with 10 bits of precision */
+ val = FIELD_PREP(RK3568_VP_DSP_BG__DSP_BG_RED, DRM_ARGB64_RED(bgcolor));
+ val |= FIELD_PREP(RK3568_VP_DSP_BG__DSP_BG_GREEN, DRM_ARGB64_GREEN(bgcolor));
+ val |= FIELD_PREP(RK3568_VP_DSP_BG__DSP_BG_BLUE, DRM_ARGB64_BLUE(bgcolor));
+ vop2_vp_write(vp, RK3568_VP_DSP_BG, val);
}
static int us_to_vertical_line(struct drm_display_mode *mode, int us)
@@ -1972,6 +1977,10 @@ static int vop2_crtc_state_dump(struct drm_crtc *crtc, struct seq_file *s)
drm_get_bus_format_name(vcstate->bus_format));
seq_printf(s, "\toutput_mode[%x]", vcstate->output_mode);
seq_printf(s, " color_space[%d]\n", vcstate->color_space);
+ seq_printf(s, "\tbackground color (10bpc): r=%x g=%x b=%x\n",
+ DRM_ARGB64_RED(cstate->background_color),
+ DRM_ARGB64_GREEN(cstate->background_color),
+ DRM_ARGB64_BLUE(cstate->background_color));
seq_printf(s, " Display mode: %dx%d%s%d\n",
mode->hdisplay, mode->vdisplay, interlaced ? "i" : "p",
drm_mode_vrefresh(mode));
@@ -2461,6 +2470,8 @@ static int vop2_create_crtcs(struct vop2 *vop2)
return dev_err_probe(drm->dev, ret,
"crtc init for video_port%d failed\n", i);
+ drm_crtc_attach_background_color_property(&vp->crtc);
+
drm_crtc_helper_add(&vp->crtc, &vop2_crtc_helper_funcs);
if (vop2->lut_regs) {
const struct vop2_video_port_data *vp_data = &vop2_data->vp[vp->id];
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.h b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.h
index fa5c56f16047e3493e82fbedaced221459696dcc..596558adc1207e837eb8eca49b35d7a55d693f88 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_vop2.h
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_vop2.h
@@ -659,6 +659,10 @@ enum dst_factor_mode {
#define RK3588_VP_CLK_CTRL__DCLK_OUT_DIV GENMASK(3, 2)
#define RK3588_VP_CLK_CTRL__DCLK_CORE_DIV GENMASK(1, 0)
+#define RK3568_VP_DSP_BG__DSP_BG_RED GENMASK(29, 20)
+#define RK3568_VP_DSP_BG__DSP_BG_GREEN GENMASK(19, 10)
+#define RK3568_VP_DSP_BG__DSP_BG_BLUE GENMASK(9, 0)
+
#define RK3568_VP_POST_SCL_CTRL__VSCALEDOWN BIT(1)
#define RK3568_VP_POST_SCL_CTRL__HSCALEDOWN BIT(0)
--
2.51.0
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH 0/2] Introduce BACKGROUND_COLOR DRM CRTC property
2025-09-02 9:27 [PATCH 0/2] Introduce BACKGROUND_COLOR DRM CRTC property Cristian Ciocaltea
2025-09-02 9:27 ` [PATCH 1/2] drm: Add CRTC background color property Cristian Ciocaltea
2025-09-02 9:27 ` [PATCH 2/2] drm/rockchip: vop2: Support setting custom background color Cristian Ciocaltea
@ 2025-09-02 13:19 ` Raphael Gallais-Pou
2025-09-02 16:04 ` Cristian Ciocaltea
2 siblings, 1 reply; 7+ messages in thread
From: Raphael Gallais-Pou @ 2025-09-02 13:19 UTC (permalink / raw)
To: Cristian Ciocaltea, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, David Airlie, Simona Vetter, Sandy Huang,
Heiko Stübner, Andy Yan
Cc: kernel, dri-devel, linux-kernel, linux-arm-kernel, linux-rockchip,
Matt Roper
On 9/2/25 11:27, Cristian Ciocaltea wrote:
> Some display controllers can be hardware-configured to present non-black
> colors for pixels which are not covered by any plane (or are exposed
> through transparent regions of higher planes).
>
> The first patch of the series introduces the BACKGROUND_COLOR DRM
> property that can be attached to a CRTC via a dedicated helper function.
> A 64-bit ARGB color value format is also defined and can be manipulated
> with the help of a few utility macros.
Hi Cristian,
Thanks for this work ! :)
FWIW I sent a series also based on Matt's work four years ago:
https://lore.kernel.org/dri-devel/20210707084557.22443-2-raphael.gallais-pou@foss.st.com/
IIRC at the time there was some questions around the pixel format used for the
property, and non-opaque color vs alpha pre-multiplication.
Mind that on STM32MP platforms alpha channel for the background color is not
supported.
Hope the thread can bring some insights.
Best regards,
Raphaël
>
> Note this is a reworked version of the patch [1] submitted (many) years
> ago by Matt Roper. The main changes are:
>
> * Dropped drm_arg() in favor of drm_argb64() to get rid of the bpc
> parameter and the related shifting for more flexibility in operation,
> e.g. when user-space cannot make use of the helper and/or when it
> doesn't now the actual precision supported by the HW. This also
> simplifies the property verification/validation testing (see below).
> It works by extracting the specified number of least-significant bits
> from each color component.
> * Renamed DRM_ARGB_*() to DRM_ARGB64_*_LSB() while providing convenience
> wrappers to extract all 16 bits of a specific color via DRM_ARGB64_*()
> * Replaced GENMASK_ULL(63, 0) with U64_MAX when calling
> drm_property_create_range() to create the BACKGROUND_COLOR property
> * Moved crtc_state->bgcolor initialization from
> __drm_atomic_helper_crtc_reset() to
> __drm_atomic_helper_crtc_state_reset()
> * Replaced '*bgcolor*' occurrences to '*background_color*' for
> consistency with the actual property name in both storage field and
> helper functions names
>
> The second patch adds background color support to the VOP2 display
> controller used in the RK3568, RK3576, and RK3588 Rockchip SoC families.
>
> For the moment this has been validated using a modetest wrapper script
> [2], which is able to execute several tests - see an example of a
> generated report at the end. Proper support in Weston is currently in
> development, and I will provide a reference once it becomes available.
>
> The tests were performed on the Radxa boards listed below. Please note
> that as of next-20250901, there are a few known regressions; for each
> case, I mentioned the actual problem and its related fix/workaround
> accordingly:
>
> * ROCK 3A (RK3568)
> - issue: broken networking
> - fix: revert commit da114122b831 ("net: ethernet: stmmac: dwmac-rk: Make
> the clk_phy could be used for external phy")
>
> * ROCK 4D (RK3576)
> - issue: random freezes right after booting
> - fix: add regulator_ignore_unused to kernel cmdline
>
> * ROCK 5B (RK3588)
> - issue: broken networking
> - fix: apply patch [3]
>
> [1] https://lore.kernel.org/all/20190930224707.14904-2-matthew.d.roper@intel.com/
> [2] https://gitlab.collabora.com/cristicc/linux-next/-/commits/drm-vop2-bgcolor-test
> [3] https://lore.kernel.org/all/20250827230943.17829-1-inochiama@gmail.com/
>
> Validation report on ROCK 5B
> ============================
>
> $ tools/testing/rk-bgcol-test.sh
>
> ---------------------------------------------------------------
> Available Rockchip display connectors
> ---------------------------------------------------------------
> id type status crtc_id plane_id
> 85 11 2 0 34
> 88 11 1 83 40
>
> Selected connector: id=88 crtc=83 plane=40
>
> ---------------------------------------------------------------
> Check initial state
> ---------------------------------------------------------------
> Read BACKGROUND_COLOR prop (ARGB64): 0xffff000000000000
> Connector: HDMI-A-2
> background color (10bpc): r=0 g=0 b=0
>
> ---------------------------------------------------------------
> Set/get DRM property
> ---------------------------------------------------------------
> Changing prop value to: 0xffff00000000ffff
> opened device `RockChip Soc DRM` on driver `rockchip` (version 1.0.0 at 0)
> Read BACKGROUND_COLOR prop (ARGB64): 0xffff00000000ffff
> Connector: HDMI-A-2
> background color (10bpc): r=0 g=0 b=ffff
>
> ---------------------------------------------------------------
> Plane display test 40@83:960x540+480+270
> ---------------------------------------------------------------
>
> Changing prop value to 0xffffffff00000000
> Press ENTER to continue..
> opened device `RockChip Soc DRM` on driver `rockchip` (version 1.0.0 at 0)
> testing 960x540@XR24 overlay plane 40
>
> Read BACKGROUND_COLOR prop (ARGB64): 0xffffffff00000000
> Connector: HDMI-A-2
> background color (10bpc): r=ffff g=0 b=0
>
> Changing prop value to 0xffff0000ffff0000
> Press ENTER to continue..
> opened device `RockChip Soc DRM` on driver `rockchip` (version 1.0.0 at 0)
> testing 960x540@XR24 overlay plane 40
>
> Read BACKGROUND_COLOR prop (ARGB64): 0xffff0000ffff0000
> Connector: HDMI-A-2
> background color (10bpc): r=0 g=ffff b=0
>
> Changing prop value to 0xffff00000000ffff
> Press ENTER to continue..
> opened device `RockChip Soc DRM` on driver `rockchip` (version 1.0.0 at 0)
> testing 960x540@XR24 overlay plane 40
>
> Read BACKGROUND_COLOR prop (ARGB64): 0xffff00000000ffff
> Connector: HDMI-A-2
> background color (10bpc): r=0 g=0 b=ffff
>
> ---------------------------------------------------------------
> Restoring state
> ---------------------------------------------------------------
> Changing prop value to: 0xffff000000000000
> opened device `RockChip Soc DRM` on driver `rockchip` (version 1.0.0 at 0)
> Read BACKGROUND_COLOR prop (ARGB64): 0xffff000000000000
> Connector: HDMI-A-2
> background color (10bpc): r=0 g=0 b=0
>
> Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
> ---
> Cristian Ciocaltea (2):
> drm: Add CRTC background color property
> drm/rockchip: vop2: Support setting custom background color
>
> drivers/gpu/drm/drm_atomic_state_helper.c | 1 +
> drivers/gpu/drm/drm_atomic_uapi.c | 4 +++
> drivers/gpu/drm/drm_blend.c | 37 +++++++++++++++++++++++++---
> drivers/gpu/drm/drm_mode_config.c | 6 +++++
> drivers/gpu/drm/rockchip/rockchip_drm_vop2.c | 13 +++++++++-
> drivers/gpu/drm/rockchip/rockchip_drm_vop2.h | 4 +++
> include/drm/drm_blend.h | 4 ++-
> include/drm/drm_crtc.h | 12 +++++++++
> include/drm/drm_mode_config.h | 5 ++++
> include/uapi/drm/drm_mode.h | 30 ++++++++++++++++++++++
> 10 files changed, 110 insertions(+), 6 deletions(-)
> ---
> base-commit: d0630b758e593506126e8eda6c3d56097d1847c5
> change-id: 20250829-rk3588-bgcolor-c1a7b9a507bc
>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/2] drm: Add CRTC background color property
2025-09-02 9:27 ` [PATCH 1/2] drm: Add CRTC background color property Cristian Ciocaltea
@ 2025-09-02 13:36 ` Ville Syrjälä
2025-09-02 16:26 ` Cristian Ciocaltea
0 siblings, 1 reply; 7+ messages in thread
From: Ville Syrjälä @ 2025-09-02 13:36 UTC (permalink / raw)
To: Cristian Ciocaltea
Cc: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Sandy Huang, Heiko Stübner, Andy Yan, kernel,
dri-devel, linux-kernel, linux-arm-kernel, linux-rockchip,
Matt Roper
On Tue, Sep 02, 2025 at 12:27:56PM +0300, Cristian Ciocaltea wrote:
> Some display controllers can be hardware programmed to show non-black
> colors for pixels that are either not covered by any plane or are
> exposed through transparent regions of higher planes. This feature can
> help reduce memory bandwidth usage, e.g. in compositors managing a UI
> with a solid background color while using smaller planes to render the
> remaining content.
>
> To support this capability, introduce the BACKGROUND_COLOR standard DRM
> mode property, which can be attached to a CRTC through the
> drm_crtc_attach_background_color_property() helper function.
>
> Additionally, define a 64-bit ARGB format value to be built with the
> help of a dedicated drm_argb64() utility macro. Individual color
> components can be extracted with desired precision using the
> corresponding DRM_ARGB64_*() macros.
>
> Co-developed-by: Matt Roper <matthew.d.roper@intel.com>
> Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
> Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
> ---
> drivers/gpu/drm/drm_atomic_state_helper.c | 1 +
> drivers/gpu/drm/drm_atomic_uapi.c | 4 ++++
> drivers/gpu/drm/drm_blend.c | 37 +++++++++++++++++++++++++++----
> drivers/gpu/drm/drm_mode_config.c | 6 +++++
> include/drm/drm_blend.h | 4 +++-
> include/drm/drm_crtc.h | 12 ++++++++++
> include/drm/drm_mode_config.h | 5 +++++
> include/uapi/drm/drm_mode.h | 30 +++++++++++++++++++++++++
> 8 files changed, 94 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_atomic_state_helper.c b/drivers/gpu/drm/drm_atomic_state_helper.c
> index 7142e163e618ea0d7d9d828e1bd9ff2a6ec0dfeb..359264cf467c5270b77f0b04548073bc92cb812e 100644
> --- a/drivers/gpu/drm/drm_atomic_state_helper.c
> +++ b/drivers/gpu/drm/drm_atomic_state_helper.c
> @@ -75,6 +75,7 @@ __drm_atomic_helper_crtc_state_reset(struct drm_crtc_state *crtc_state,
> struct drm_crtc *crtc)
> {
> crtc_state->crtc = crtc;
> + crtc_state->background_color = drm_argb64(0xffff, 0, 0, 0);
> }
> EXPORT_SYMBOL(__drm_atomic_helper_crtc_state_reset);
>
> diff --git a/drivers/gpu/drm/drm_atomic_uapi.c b/drivers/gpu/drm/drm_atomic_uapi.c
> index 85dbdaa4a2e25878c953b9b41539c8566d55c6d9..a447cb119aaa6cd11348be77b39f342a1386836d 100644
> --- a/drivers/gpu/drm/drm_atomic_uapi.c
> +++ b/drivers/gpu/drm/drm_atomic_uapi.c
> @@ -407,6 +407,8 @@ static int drm_atomic_crtc_set_property(struct drm_crtc *crtc,
> &replaced);
> state->color_mgmt_changed |= replaced;
> return ret;
> + } else if (property == config->background_color_property) {
> + state->background_color = val;
> } else if (property == config->prop_out_fence_ptr) {
> s32 __user *fence_ptr = u64_to_user_ptr(val);
>
> @@ -452,6 +454,8 @@ drm_atomic_crtc_get_property(struct drm_crtc *crtc,
> *val = (state->ctm) ? state->ctm->base.id : 0;
> else if (property == config->gamma_lut_property)
> *val = (state->gamma_lut) ? state->gamma_lut->base.id : 0;
> + else if (property == config->background_color_property)
> + *val = state->background_color;
> else if (property == config->prop_out_fence_ptr)
> *val = 0;
> else if (property == crtc->scaling_filter_property)
> diff --git a/drivers/gpu/drm/drm_blend.c b/drivers/gpu/drm/drm_blend.c
> index 6852d73c931ce32e62062e2b8f8c5e38612d5210..5a287d12685b007a2732f510f62675f500e53727 100644
> --- a/drivers/gpu/drm/drm_blend.c
> +++ b/drivers/gpu/drm/drm_blend.c
> @@ -191,10 +191,6 @@
> * plane does not expose the "alpha" property, then this is
> * assumed to be 1.0
> *
> - * Note that all the property extensions described here apply either to the
> - * plane or the CRTC (e.g. for the background color, which currently is not
> - * exposed and assumed to be black).
> - *
> * SCALING_FILTER:
> * Indicates scaling filter to be used for plane scaler
> *
> @@ -207,6 +203,23 @@
> *
> * Drivers can set up this property for a plane by calling
> * drm_plane_create_scaling_filter_property
> + *
> + * The property extensions described above all apply to the plane. Drivers
> + * may also expose the following crtc property extension:
> + *
> + * BACKGROUND_COLOR:
> + * Background color is set via drm_crtc_attach_background_color_property().
> + * It controls the ARGB color of a full-screen layer that exists below all
> + * planes. This color will be used for pixels not covered by any plane and
> + * may also be blended with plane contents as allowed by a plane's alpha
> + * values. The background color defaults to black, and is assumed to be
> + * black for drivers that do not expose this property. Although background
> + * color isn't a plane, it is assumed that the color provided here
> + * undergoes the same pipe-level degamma/CSC/gamma transformations that
> + * planes undergo. Note that the color value provided here includes an
> + * alpha channel, hence non-opaque background color values are allowed, but
> + * are generally only honored in special cases (e.g. when a memory
> + * writeback connector is in use).
> */
>
> /**
> @@ -621,3 +634,19 @@ int drm_plane_create_blend_mode_property(struct drm_plane *plane,
> return 0;
> }
> EXPORT_SYMBOL(drm_plane_create_blend_mode_property);
> +
> +/**
> + * drm_crtc_attach_background_color_property - attach background color property
> + * @crtc: drm crtc
> + *
> + * Attaches the background color property to @crtc. The property defaults to
> + * solid black and will accept 64-bit ARGB values in the format generated by
> + * drm_argb64().
> + */
> +void drm_crtc_attach_background_color_property(struct drm_crtc *crtc)
> +{
> + drm_object_attach_property(&crtc->base,
> + crtc->dev->mode_config.background_color_property,
> + drm_argb64(0xffff, 0, 0, 0));
> +}
> +EXPORT_SYMBOL(drm_crtc_attach_background_color_property);
> diff --git a/drivers/gpu/drm/drm_mode_config.c b/drivers/gpu/drm/drm_mode_config.c
> index 25f376869b3a41d47bbe72b0df3e35cad142f3e6..6d70bfab45ca2bb81ed3ca1940fd1cd85e8cc58e 100644
> --- a/drivers/gpu/drm/drm_mode_config.c
> +++ b/drivers/gpu/drm/drm_mode_config.c
> @@ -375,6 +375,12 @@ static int drm_mode_create_standard_properties(struct drm_device *dev)
> return -ENOMEM;
> dev->mode_config.gamma_lut_size_property = prop;
>
> + prop = drm_property_create_range(dev, 0,
> + "BACKGROUND_COLOR", 0, U64_MAX);
> + if (!prop)
> + return -ENOMEM;
> + dev->mode_config.background_color_property = prop;
> +
> prop = drm_property_create(dev,
> DRM_MODE_PROP_IMMUTABLE | DRM_MODE_PROP_BLOB,
> "IN_FORMATS", 0);
> diff --git a/include/drm/drm_blend.h b/include/drm/drm_blend.h
> index 88bdfec3bd8848acd1ef5742aaaa23483b332a2e..c7e888767c81c2745cd3cce88c10db4bbe305d1e 100644
> --- a/include/drm/drm_blend.h
> +++ b/include/drm/drm_blend.h
> @@ -31,8 +31,9 @@
> #define DRM_MODE_BLEND_COVERAGE 1
> #define DRM_MODE_BLEND_PIXEL_NONE 2
>
> -struct drm_device;
> struct drm_atomic_state;
> +struct drm_crtc;
> +struct drm_device;
> struct drm_plane;
>
> static inline bool drm_rotation_90_or_270(unsigned int rotation)
> @@ -58,4 +59,5 @@ int drm_atomic_normalize_zpos(struct drm_device *dev,
> struct drm_atomic_state *state);
> int drm_plane_create_blend_mode_property(struct drm_plane *plane,
> unsigned int supported_modes);
> +void drm_crtc_attach_background_color_property(struct drm_crtc *crtc);
> #endif
> diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
> index caa56e039da2a748cf40ebf45b37158acda439d9..4653dacc1077b9ed8fb4cf27cc84530ba1706f6a 100644
> --- a/include/drm/drm_crtc.h
> +++ b/include/drm/drm_crtc.h
> @@ -274,6 +274,18 @@ struct drm_crtc_state {
> */
> struct drm_property_blob *gamma_lut;
>
> + /**
> + * @background_color:
> + *
> + * RGB value representing the pipe's background color. The background
> + * color (aka "canvas color") of a pipe is the color that will be used
> + * for pixels not covered by a plane, or covered by transparent pixels
> + * of a plane. The value here should be built using drm_argb64(), while
> + * the individual color components can be extracted with desired
> + * precision via the DRM_ARGB64_*() macros.
> + */
> + u64 background_color;
> +
> /**
> * @target_vblank:
> *
> diff --git a/include/drm/drm_mode_config.h b/include/drm/drm_mode_config.h
> index 2e848b816218584eb077ed887bf97705f012a622..ea422afec5c4108a223dc872e1b6835ffc596cc3 100644
> --- a/include/drm/drm_mode_config.h
> +++ b/include/drm/drm_mode_config.h
> @@ -814,6 +814,11 @@ struct drm_mode_config {
> * gamma LUT as supported by the driver (read-only).
> */
> struct drm_property *gamma_lut_size_property;
> + /**
> + * @background_color_property: Optional CRTC property to set the
> + * background color.
> + */
> + struct drm_property *background_color_property;
>
> /**
> * @suggested_x_property: Optional connector property with a hint for
> diff --git a/include/uapi/drm/drm_mode.h b/include/uapi/drm/drm_mode.h
> index a122bea2559387576150236e3a88f99c24ad3138..4bd6a8ca8868109bcbe21f9f6e9864519c9d03ec 100644
> --- a/include/uapi/drm/drm_mode.h
> +++ b/include/uapi/drm/drm_mode.h
> @@ -1363,6 +1363,36 @@ struct drm_mode_closefb {
> __u32 pad;
> };
>
> +/*
> + * Put 16-bit ARGB values into a standard 64-bit representation that
> + * can be used for ioctl parameters, inter-driver communication, etc.
> + */
> +static inline __u64
> +drm_argb64(__u16 alpha, __u16 red, __u16 green, __u16 blue)
> +{
> + return (__u64)alpha << 48 | (__u64)red << 32 | (__u64)green << 16 | blue;
> +}
> +
> +/*
> + * Extract the specified number of least-significant bits of a specific
> + * color component from a standard 64-bit ARGB value.
Why would you ever want the least significant bits?
> + */
> +#define DRM_ARGB64_COMP(c, shift, numlsb) \
> + ((__u16)(((c) >> (shift)) & ((1UL << (numlsb) % 17) - 1)))
> +#define DRM_ARGB64_ALPHA_LSB(c, numlsb) DRM_ARGB64_COMP(c, 48, numlsb)
> +#define DRM_ARGB64_RED_LSB(c, numlsb) DRM_ARGB64_COMP(c, 32, numlsb)
> +#define DRM_ARGB64_GREEN_LSB(c, numlsb) DRM_ARGB64_COMP(c, 16, numlsb)
> +#define DRM_ARGB64_BLUE_LSB(c, numlsb) DRM_ARGB64_COMP(c, 0, numlsb)
> +
> +/*
> + * Convenience wrappers to extract all 16 bits of a specific color
> + * component from a standard 64-bit ARGB value.
> + */
> +#define DRM_ARGB64_ALPHA(c) DRM_ARGB64_ALPHA_LSB(c, 16)
> +#define DRM_ARGB64_RED(c) DRM_ARGB64_RED_LSB(c, 16)
> +#define DRM_ARGB64_GREEN(c) DRM_ARGB64_GREEN_LSB(c, 16)
> +#define DRM_ARGB64_BLUE(c) DRM_ARGB64_BLUE_LSB(c, 16)
> +
> #if defined(__cplusplus)
> }
> #endif
>
> --
> 2.51.0
--
Ville Syrjälä
Intel
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 0/2] Introduce BACKGROUND_COLOR DRM CRTC property
2025-09-02 13:19 ` [PATCH 0/2] Introduce BACKGROUND_COLOR DRM CRTC property Raphael Gallais-Pou
@ 2025-09-02 16:04 ` Cristian Ciocaltea
0 siblings, 0 replies; 7+ messages in thread
From: Cristian Ciocaltea @ 2025-09-02 16:04 UTC (permalink / raw)
To: Raphael Gallais-Pou, Maarten Lankhorst, Maxime Ripard,
Thomas Zimmermann, David Airlie, Simona Vetter, Sandy Huang,
Heiko Stübner, Andy Yan
Cc: kernel, dri-devel, linux-kernel, linux-arm-kernel, linux-rockchip,
Matt Roper
Hi Raphael,
On 9/2/25 4:19 PM, Raphael Gallais-Pou wrote:
>
>
> On 9/2/25 11:27, Cristian Ciocaltea wrote:
>> Some display controllers can be hardware-configured to present non-black
>> colors for pixels which are not covered by any plane (or are exposed
>> through transparent regions of higher planes).
>>
>> The first patch of the series introduces the BACKGROUND_COLOR DRM
>> property that can be attached to a CRTC via a dedicated helper function.
>> A 64-bit ARGB color value format is also defined and can be manipulated
>> with the help of a few utility macros.
>
> Hi Cristian,
>
> Thanks for this work ! :)
>
> FWIW I sent a series also based on Matt's work four years ago:
> https://lore.kernel.org/dri-devel/20210707084557.22443-2-raphael.gallais-pou@foss.st.com/
>
> IIRC at the time there was some questions around the pixel format used for the
> property, and non-opaque color vs alpha pre-multiplication.
> Mind that on STM32MP platforms alpha channel for the background color is not
> supported.
>
> Hope the thread can bring some insights.
Thanks for pointing this out, I will consider it for v2.
Regards,
Cristian
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH 1/2] drm: Add CRTC background color property
2025-09-02 13:36 ` Ville Syrjälä
@ 2025-09-02 16:26 ` Cristian Ciocaltea
0 siblings, 0 replies; 7+ messages in thread
From: Cristian Ciocaltea @ 2025-09-02 16:26 UTC (permalink / raw)
To: Ville Syrjälä
Cc: Maarten Lankhorst, Maxime Ripard, Thomas Zimmermann, David Airlie,
Simona Vetter, Sandy Huang, Heiko Stübner, Andy Yan, kernel,
dri-devel, linux-kernel, linux-arm-kernel, linux-rockchip,
Matt Roper
On 9/2/25 4:36 PM, Ville Syrjälä wrote:
> On Tue, Sep 02, 2025 at 12:27:56PM +0300, Cristian Ciocaltea wrote:
>> Some display controllers can be hardware programmed to show non-black
>> colors for pixels that are either not covered by any plane or are
>> exposed through transparent regions of higher planes. This feature can
>> help reduce memory bandwidth usage, e.g. in compositors managing a UI
>> with a solid background color while using smaller planes to render the
>> remaining content.
>>
>> To support this capability, introduce the BACKGROUND_COLOR standard DRM
>> mode property, which can be attached to a CRTC through the
>> drm_crtc_attach_background_color_property() helper function.
>>
>> Additionally, define a 64-bit ARGB format value to be built with the
>> help of a dedicated drm_argb64() utility macro. Individual color
>> components can be extracted with desired precision using the
>> corresponding DRM_ARGB64_*() macros.
>>
>> Co-developed-by: Matt Roper <matthew.d.roper@intel.com>
>> Signed-off-by: Matt Roper <matthew.d.roper@intel.com>
>> Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@collabora.com>
>> ---
>> drivers/gpu/drm/drm_atomic_state_helper.c | 1 +
>> drivers/gpu/drm/drm_atomic_uapi.c | 4 ++++
>> drivers/gpu/drm/drm_blend.c | 37 +++++++++++++++++++++++++++----
>> drivers/gpu/drm/drm_mode_config.c | 6 +++++
>> include/drm/drm_blend.h | 4 +++-
>> include/drm/drm_crtc.h | 12 ++++++++++
>> include/drm/drm_mode_config.h | 5 +++++
>> include/uapi/drm/drm_mode.h | 30 +++++++++++++++++++++++++
>> 8 files changed, 94 insertions(+), 5 deletions(-)
[...]
>> +/*
>> + * Put 16-bit ARGB values into a standard 64-bit representation that
>> + * can be used for ioctl parameters, inter-driver communication, etc.
>> + */
>> +static inline __u64
>> +drm_argb64(__u16 alpha, __u16 red, __u16 green, __u16 blue)
>> +{
>> + return (__u64)alpha << 48 | (__u64)red << 32 | (__u64)green << 16 | blue;
>> +}
>> +
>> +/*
>> + * Extract the specified number of least-significant bits of a specific
>> + * color component from a standard 64-bit ARGB value.
>
> Why would you ever want the least significant bits?
Right, that's useless - will replace with proper helpers dealing with custom
precision.
Thanks,
Cristian
>> + */
>> +#define DRM_ARGB64_COMP(c, shift, numlsb) \
>> + ((__u16)(((c) >> (shift)) & ((1UL << (numlsb) % 17) - 1)))
>> +#define DRM_ARGB64_ALPHA_LSB(c, numlsb) DRM_ARGB64_COMP(c, 48, numlsb)
>> +#define DRM_ARGB64_RED_LSB(c, numlsb) DRM_ARGB64_COMP(c, 32, numlsb)
>> +#define DRM_ARGB64_GREEN_LSB(c, numlsb) DRM_ARGB64_COMP(c, 16, numlsb)
>> +#define DRM_ARGB64_BLUE_LSB(c, numlsb) DRM_ARGB64_COMP(c, 0, numlsb)
>> +
>> +/*
>> + * Convenience wrappers to extract all 16 bits of a specific color
>> + * component from a standard 64-bit ARGB value.
>> + */
>> +#define DRM_ARGB64_ALPHA(c) DRM_ARGB64_ALPHA_LSB(c, 16)
>> +#define DRM_ARGB64_RED(c) DRM_ARGB64_RED_LSB(c, 16)
>> +#define DRM_ARGB64_GREEN(c) DRM_ARGB64_GREEN_LSB(c, 16)
>> +#define DRM_ARGB64_BLUE(c) DRM_ARGB64_BLUE_LSB(c, 16)
>> +
>> #if defined(__cplusplus)
>> }
>> #endif
>>
>> --
>> 2.51.0
>
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2025-09-02 16:26 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-09-02 9:27 [PATCH 0/2] Introduce BACKGROUND_COLOR DRM CRTC property Cristian Ciocaltea
2025-09-02 9:27 ` [PATCH 1/2] drm: Add CRTC background color property Cristian Ciocaltea
2025-09-02 13:36 ` Ville Syrjälä
2025-09-02 16:26 ` Cristian Ciocaltea
2025-09-02 9:27 ` [PATCH 2/2] drm/rockchip: vop2: Support setting custom background color Cristian Ciocaltea
2025-09-02 13:19 ` [PATCH 0/2] Introduce BACKGROUND_COLOR DRM CRTC property Raphael Gallais-Pou
2025-09-02 16:04 ` Cristian Ciocaltea
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).