All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jani Nikula <jani.nikula@linux.intel.com>
To: Mario Limonciello <mario.limonciello@amd.com>,
	dri-devel@lists.freedesktop.org, harry.wentland@amd.com,
	Simona Vetter <simona@ffwll.ch>,
	Alex Deucher <alexander.deucher@amd.com>,
	Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
	Maxime Ripard <mripard@kernel.org>,
	Thomas Zimmermann <tzimmermann@suse.de>,
	David Airlie <airlied@gmail.com>
Cc: Xaver Hugl <xaver.hugl@gmail.com>,
	amd-gfx@lists.freedesktop.org,
	"open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS"
	<intel-gfx@lists.freedesktop.org>,
	"open list:INTEL DRM DISPLAY FOR XE AND I915 DRIVERS"
	<intel-xe@lists.freedesktop.org>,
	Hans de Goede <hansg@kernel.org>,
	Mario Limonciello <mario.limonciello@amd.com>,
	David Herrmann <dh.herrmann@gmail.com>,
	Marta Lofstedt <marta.lofstedt@intel.com>,
	Mario Limonciello <superm1@kernel.org>
Subject: Re: [PATCH v8 02/14] backlight: add kernel-internal backlight API
Date: Tue, 08 Sep 2026 18:45:44 +0300	[thread overview]
Message-ID: <dd7f11d6772b9422793cbcf1011f4f1aa98bfa3d@intel.com> (raw)
In-Reply-To: <20260908044035.62093-3-mario.limonciello@amd.com>

On Mon, 07 Sep 2026, Mario Limonciello <mario.limonciello@amd.com> wrote:
> So far backlights have only been controlled via sysfs. However, sysfs is
> not a proper user-space API for runtime modifications, and never was
> intended to provide such. The DRM drivers are now prepared to provide
> such a backlight link so user-space can control backlight via DRM
> connector properties. This allows us to employ the same access-management
> we use for mode-setting.
>
> This patch adds a few kernel-internal backlight helpers so we can modify
> backlights from within DRM, a brightness-changed notification, and a
> per-device takeover count so that legacy sysfs writes can be inhibited
> (-EBUSY) while a luminance-aware DRM client is in control.
>
> Signed-off-by: David Herrmann <dh.herrmann@gmail.com>
>
> V2: Marta Lofstedt <marta.lofstedt@intel.com>
> - rebase
> - minor edit for checkpatch warning
>
> Signed-off-by: Marta Lofstedt <marta.lofstedt@intel.com>
>
> V3: Mario Limonciello (AMD) <superm1@kernel.org>
>  - rebase
>  - Use guard(mutex)
>
> V4: Mario Limonciello (AMD) <superm1@kernel.org>
>  - Adjust return type for backlight_set_brightness() to return errors
>  - Stop clamping in backlight_set_brightness()
>  - Drop backlight_device_lookup()
>
> Signed-off-by: Mario Limonciello (AMD) <superm1@kernel.org>
> ---
>  drivers/video/backlight/backlight.c | 66 +++++++++++++++++++++++++++++
>  include/linux/backlight.h           | 45 ++++++++++++++++++++
>  2 files changed, 111 insertions(+)
>
> diff --git a/drivers/video/backlight/backlight.c b/drivers/video/backlight/backlight.c
> index 4401f6294ccc8..1c700c1e77c3f 100644
> --- a/drivers/video/backlight/backlight.c
> +++ b/drivers/video/backlight/backlight.c
> @@ -126,6 +126,9 @@ static void backlight_generate_event(struct backlight_device *bd,
>  	case BACKLIGHT_UPDATE_HOTKEY:
>  		envp[0] = "SOURCE=hotkey";
>  		break;
> +	case BACKLIGHT_UPDATE_DRM:
> +		envp[0] = "SOURCE=drm";
> +		break;
>  	default:
>  		envp[0] = "SOURCE=unknown";
>  		break;
> @@ -150,6 +153,13 @@ static ssize_t bl_power_store(struct device *dev, struct device_attribute *attr,
>  	struct backlight_device *bd = to_backlight_device(dev);
>  	unsigned long power, old_power;
>  
> +	/* A luminance-aware DRM client has taken over this backlight; the
> +	 * legacy sysfs interface is disabled until the last such client
> +	 * goes away.
> +	 */
> +	if (atomic_read(&bd->drm_takeover) > 0)
> +		return -EBUSY;
> +
>  	rc = kstrtoul(buf, 0, &power);
>  	if (rc)
>  		return rc;
> @@ -214,6 +224,13 @@ static ssize_t brightness_store(struct device *dev,
>  	struct backlight_device *bd = to_backlight_device(dev);
>  	unsigned long brightness;
>  
> +	/* A luminance-aware DRM client has taken over this backlight; the
> +	 * legacy sysfs interface is disabled until the last such client
> +	 * goes away.
> +	 */
> +	if (atomic_read(&bd->drm_takeover) > 0)
> +		return -EBUSY;
> +
>  	rc = kstrtoul(buf, 0, &brightness);
>  	if (rc)
>  		return rc;
> @@ -514,6 +531,41 @@ static int devm_backlight_device_match(struct device *dev, void *res,
>  	return *r == data;
>  }
>  
> +/**
> + * backlight_set_brightness - set brightness on a backlight device
> + * @bd: backlight device to operate on
> + * @value: brightness value to set on the device
> + * @reason: backlight-change reason to use for notifications
> + *
> + * This is the in-kernel API equivalent of writing into the 'brightness' sysfs
> + * file. It calls into the underlying backlight driver to change the brightness
> + * value.
> + * A uevent notification is sent with the reason set to @reason.
> + * Return: 0 if successfully notified, -EINVAL for invalid values, -ENXIO if the
> + * device has no ops (e.g. it is being unregistered)
> + */
> +int backlight_set_brightness(struct backlight_device *bd, unsigned int value,
> +			      enum backlight_update_reason reason)
> +{
> +	int rc = -ENXIO;
> +
> +	scoped_guard(mutex, &bd->ops_lock) {
> +		if (bd->ops) {
> +			if (value > bd->props.max_brightness)
> +				return -EINVAL;
> +
> +			dev_dbg(&bd->dev, "set brightness to %u\n", value);
> +			bd->props.brightness = value;
> +			rc = backlight_update_status(bd);
> +		}
> +	}
> +	if (rc == 0)
> +		backlight_generate_event(bd, reason);
> +
> +	return rc;
> +}
> +EXPORT_SYMBOL_GPL(backlight_set_brightness);
> +
>  /**
>   * backlight_register_notifier - get notified of backlight (un)registration
>   * @nb: notifier block with the notifier to call on backlight (un)registration
> @@ -548,6 +600,20 @@ int backlight_unregister_notifier(struct notifier_block *nb)
>  }
>  EXPORT_SYMBOL(backlight_unregister_notifier);
>  
> +/**
> + * backlight_notify_brightness - notify brightness change to listeners
> + * @bd: backlight device that changed
> + *
> + * Notify registered listeners that the backlight brightness has changed.
> + * This is called automatically after successful brightness updates.
> + */
> +void backlight_notify_brightness(struct backlight_device *bd)
> +{
> +	blocking_notifier_call_chain(&backlight_notifier,
> +				     BACKLIGHT_BRIGHTNESS_CHANGED, bd);
> +}
> +EXPORT_SYMBOL(backlight_notify_brightness);
> +
>  /**
>   * devm_backlight_device_register - register a new backlight device
>   * @dev: the device to register
> diff --git a/include/linux/backlight.h b/include/linux/backlight.h
> index 015183d129f96..fac1acbc698a1 100644
> --- a/include/linux/backlight.h
> +++ b/include/linux/backlight.h
> @@ -31,6 +31,12 @@ enum backlight_update_reason {
>  	 * @BACKLIGHT_UPDATE_SYSFS: The backlight was updated using sysfs.
>  	 */
>  	BACKLIGHT_UPDATE_SYSFS,
> +
> +	/**
> +	 * @BACKLIGHT_UPDATE_DRM: The backlight was updated from DRM, i.e. through
> +	 * a connector LUMINANCE property rather than the legacy sysfs interface.
> +	 */
> +	BACKLIGHT_UPDATE_DRM,
>  };
>  
>  /**
> @@ -82,6 +88,11 @@ enum backlight_notification {
>  	 * @BACKLIGHT_UNREGISTERED: The backlight revice is unregistered.
>  	 */
>  	BACKLIGHT_UNREGISTERED,
> +
> +	/**
> +	 * @BACKLIGHT_BRIGHTNESS_CHANGED: The backlight brightness has changed.
> +	 */
> +	BACKLIGHT_BRIGHTNESS_CHANGED,
>  };
>  
>  /** enum backlight_scale - the type of scale used for brightness values
> @@ -310,8 +321,23 @@ struct backlight_device {
>  	 * @use_count: The number of unblanked displays.
>  	 */
>  	int use_count;
> +
> +	/**
> +	 * @drm_takeover: Number of luminance-aware DRM clients that have
> +	 * taken over brightness control of this device. When non-zero,
> +	 * writes to the legacy sysfs ``brightness`` attribute return
> +	 * ``-EBUSY``. Managed by the DRM backlight helpers.
> +	 */
> +	atomic_t drm_takeover;
>  };
>  
> +/* Forward declaration for backlight_update_status */
> +#if IS_REACHABLE(CONFIG_BACKLIGHT_CLASS_DEVICE)

I think IS_REACHABLE() is almost always a mistake. It's a hack to avoid
link errors when something in a module needs something that is
built-in. It's a combo that should be handled at Kconfig level, not at
build level.

BR,
Jani.


> +void backlight_notify_brightness(struct backlight_device *bd);
> +#else
> +static inline void backlight_notify_brightness(struct backlight_device *bd) {}
> +#endif
> +
>  /**
>   * backlight_update_status - force an update of the backlight device status
>   * @bd: the backlight device
> @@ -325,6 +351,10 @@ static inline int backlight_update_status(struct backlight_device *bd)
>  		ret = bd->ops->update_status(bd);
>  	mutex_unlock(&bd->update_lock);
>  
> +	/* Notify DRM and other listeners that brightness changed */
> +	if (ret == 0)
> +		backlight_notify_brightness(bd);
> +
>  	return ret;
>  }
>  
> @@ -431,6 +461,21 @@ static inline void backlight_notify_blank_all(struct device *display_dev,
>  { }
>  #endif
>  
> +int backlight_set_brightness(struct backlight_device *bd, unsigned int value,
> +			      enum backlight_update_reason reason);
> +
> +static inline void backlight_device_ref(struct backlight_device *bd)
> +{
> +	if (bd)
> +		get_device(&bd->dev);
> +}
> +
> +static inline void backlight_device_unref(struct backlight_device *bd)
> +{
> +	if (bd)
> +		put_device(&bd->dev);
> +}
> +
>  #define to_backlight_device(obj) container_of(obj, struct backlight_device, dev)
>  
>  /**

-- 
Jani Nikula, Intel

  parent reply	other threads:[~2026-09-08 15:45 UTC|newest]

Thread overview: 36+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-08  4:40 [PATCH v8 00/14] Add support for a DRM backlight capability Mario Limonciello
2026-09-08  4:40 ` [PATCH v8 01/14] Revert "backlight: Remove notifier" Mario Limonciello
2026-09-08  4:51   ` sashiko-bot
2026-09-08  4:40 ` [PATCH v8 02/14] backlight: add kernel-internal backlight API Mario Limonciello
2026-09-08  4:52   ` sashiko-bot
2026-09-08 15:45   ` Jani Nikula [this message]
2026-09-08 16:00     ` Mario Limonciello
2026-09-08 16:33       ` Jani Nikula
2026-09-08  4:40 ` [PATCH v8 03/14] drm/property: add a per-connector luminance flag Mario Limonciello
2026-09-08  4:54   ` sashiko-bot
2026-09-08  4:40 ` [PATCH v8 04/14] drm: add connector backlight (LUMINANCE) infrastructure Mario Limonciello
2026-09-08  4:54   ` sashiko-bot
2026-09-08 15:48   ` Jani Nikula
2026-09-08  4:40 ` [PATCH v8 05/14] drm: add DRM_CLIENT_CAP_LUMINANCE Mario Limonciello
2026-09-08  4:55   ` sashiko-bot
2026-09-08  4:40 ` [PATCH v8 06/14] drm/amd/display: Pass up errors reading actual brightness Mario Limonciello
2026-09-08  4:40 ` [PATCH v8 07/14] drm/amd: Indicate driver supports luminance Mario Limonciello
2026-09-08  4:40 ` [PATCH v8 08/14] drm/amd/display: use drm backlight Mario Limonciello
2026-09-08  4:57   ` sashiko-bot
2026-09-08  4:40 ` [PATCH v8 09/14] drm/amdgpu: Check bios_scratch_reg_offset in backlight level helper Mario Limonciello
2026-09-08  4:51   ` sashiko-bot
2026-09-08  4:40 ` [PATCH v8 10/14] drm/amd/display: Update KUnit backlight tests for luminance property and fixtures Mario Limonciello
2026-09-08  4:54   ` sashiko-bot
2026-09-08  4:40 ` [PATCH v8 11/14] drm/bridge: auto-link panel backlight in bridge connector Mario Limonciello
2026-09-08  4:40 ` [PATCH v8 12/14] drm/xe: Indicate support for luminance on the connector Mario Limonciello
2026-09-08  4:57   ` sashiko-bot
2026-09-08  4:40 ` [PATCH v8 13/14] drm/i915: " Mario Limonciello
2026-09-08  4:40 ` [PATCH v8 14/14] drm/i915/display: use drm backlight Mario Limonciello
2026-09-08  5:03   ` sashiko-bot
2026-09-08  4:51 ` ✗ CI.checkpatch: warning for Add support for a DRM backlight capability (rev3) Patchwork
2026-09-08  4:53 ` ✓ CI.KUnit: success " Patchwork
2026-09-08  5:09 ` ✗ CI.checksparse: warning " Patchwork
2026-09-08  5:51 ` ✓ Xe.CI.BAT: success " Patchwork
2026-09-08  6:31 ` ✗ Xe.CI.FULL: failure " Patchwork
2026-09-08  9:32 ` ✓ i915.CI.BAT: success " Patchwork
2026-09-08 18:45 ` ✗ i915.CI.Full: failure " Patchwork

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=dd7f11d6772b9422793cbcf1011f4f1aa98bfa3d@intel.com \
    --to=jani.nikula@linux.intel.com \
    --cc=airlied@gmail.com \
    --cc=alexander.deucher@amd.com \
    --cc=amd-gfx@lists.freedesktop.org \
    --cc=dh.herrmann@gmail.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=hansg@kernel.org \
    --cc=harry.wentland@amd.com \
    --cc=intel-gfx@lists.freedesktop.org \
    --cc=intel-xe@lists.freedesktop.org \
    --cc=maarten.lankhorst@linux.intel.com \
    --cc=mario.limonciello@amd.com \
    --cc=marta.lofstedt@intel.com \
    --cc=mripard@kernel.org \
    --cc=simona@ffwll.ch \
    --cc=superm1@kernel.org \
    --cc=tzimmermann@suse.de \
    --cc=xaver.hugl@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.