From: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
To: Hans de Goede <hdegoede@redhat.com>
Cc: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>,
Maxime Ripard <mripard@kernel.org>,
Thomas Zimmermann <tzimmermann@suse.de>,
Rajat Jain <rajatja@google.com>,
Jani Nikula <jani.nikula@linux.intel.com>,
Lyude <lyude@redhat.com>,
Joonas Lahtinen <joonas.lahtinen@linux.intel.com>,
Rodrigo Vivi <rodrigo.vivi@intel.com>,
Mark Gross <markgross@kernel.org>,
Andy Shevchenko <andy@infradead.org>,
Daniel Vetter <daniel@ffwll.ch>, David Airlie <airlied@linux.ie>,
Pekka Paalanen <pekka.paalanen@collabora.com>,
Mario Limonciello <mario.limonciello@outlook.com>,
Mark Pearson <markpearson@lenovo.com>,
Sebastien Bacher <seb128@ubuntu.com>,
Marco Trevisan <marco.trevisan@canonical.com>,
Emil Velikov <emil.l.velikov@gmail.com>,
intel-gfx <intel-gfx@lists.freedesktop.org>,
dri-devel@lists.freedesktop.org,
platform-driver-x86@vger.kernel.org
Subject: Re: [Intel-gfx] [PATCH 05/10] drm/connector: Add a drm_connector privacy-screen helper functions (v2)
Date: Mon, 4 Oct 2021 18:22:23 +0300 [thread overview]
Message-ID: <YVscLznEbn0m07Mi@intel.com> (raw)
In-Reply-To: <20211002163618.99175-6-hdegoede@redhat.com>
On Sat, Oct 02, 2021 at 06:36:13PM +0200, Hans de Goede wrote:
> Add 2 drm_connector privacy-screen helper functions:
>
> 1. drm_connector_attach_privacy_screen_provider(), this function creates
> and attaches the standard privacy-screen properties and registers a
> generic notifier for generating sysfs-connector-status-events on external
> changes to the privacy-screen status.
>
> 2. drm_connector_update_privacy_screen(), update the privacy-screen's
> sw_state if the connector has a privacy-screen.
>
> Changes in v2:
> - Do not update connector->state->privacy_screen_sw_state on
> atomic-commits.
> - Change drm_connector_update_privacy_screen() to take drm_connector_state
> as argument instead of a full drm_atomic_state. This allows the helper
> to be called by drivers when they are enabling crtcs/encoders/connectors.
>
> Reviewed-by: Emil Velikov <emil.l.velikov@gmail.com>
> Reviewed-by: Lyude Paul <lyude@redhat.com>
> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
> ---
> drivers/gpu/drm/drm_connector.c | 102 ++++++++++++++++++++++++++++++++
> include/drm/drm_connector.h | 11 ++++
> 2 files changed, 113 insertions(+)
>
> diff --git a/drivers/gpu/drm/drm_connector.c b/drivers/gpu/drm/drm_connector.c
> index b2f1f1b1bfb4..00cf3b6135f6 100644
> --- a/drivers/gpu/drm/drm_connector.c
> +++ b/drivers/gpu/drm/drm_connector.c
> @@ -28,6 +28,7 @@
> #include <drm/drm_print.h>
> #include <drm/drm_drv.h>
> #include <drm/drm_file.h>
> +#include <drm/drm_privacy_screen_consumer.h>
> #include <drm/drm_sysfs.h>
>
> #include <linux/uaccess.h>
> @@ -462,6 +463,11 @@ void drm_connector_cleanup(struct drm_connector *connector)
> DRM_CONNECTOR_REGISTERED))
> drm_connector_unregister(connector);
>
> + if (connector->privacy_screen) {
> + drm_privacy_screen_put(connector->privacy_screen);
> + connector->privacy_screen = NULL;
> + }
> +
> if (connector->tile_group) {
> drm_mode_put_tile_group(dev, connector->tile_group);
> connector->tile_group = NULL;
> @@ -543,6 +549,10 @@ int drm_connector_register(struct drm_connector *connector)
> /* Let userspace know we have a new connector */
> drm_sysfs_hotplug_event(connector->dev);
>
> + if (connector->privacy_screen)
> + drm_privacy_screen_register_notifier(connector->privacy_screen,
> + &connector->privacy_screen_notifier);
> +
> mutex_lock(&connector_list_lock);
> list_add_tail(&connector->global_connector_list_entry, &connector_list);
> mutex_unlock(&connector_list_lock);
> @@ -578,6 +588,11 @@ void drm_connector_unregister(struct drm_connector *connector)
> list_del_init(&connector->global_connector_list_entry);
> mutex_unlock(&connector_list_lock);
>
> + if (connector->privacy_screen)
> + drm_privacy_screen_unregister_notifier(
> + connector->privacy_screen,
> + &connector->privacy_screen_notifier);
> +
> if (connector->funcs->early_unregister)
> connector->funcs->early_unregister(connector);
>
> @@ -2442,6 +2457,93 @@ drm_connector_attach_privacy_screen_properties(struct drm_connector *connector)
> }
> EXPORT_SYMBOL(drm_connector_attach_privacy_screen_properties);
>
> +static void drm_connector_update_privacy_screen_properties(
> + struct drm_connector *connector, bool set_sw_state)
> +{
> + enum drm_privacy_screen_status sw_state, hw_state;
> +
> + drm_privacy_screen_get_state(connector->privacy_screen,
> + &sw_state, &hw_state);
> +
> + if (set_sw_state)
> + connector->state->privacy_screen_sw_state = sw_state;
> + drm_object_property_set_value(&connector->base,
> + connector->privacy_screen_hw_state_property, hw_state);
> +}
> +
> +static int drm_connector_privacy_screen_notifier(
> + struct notifier_block *nb, unsigned long action, void *data)
> +{
> + struct drm_connector *connector =
> + container_of(nb, struct drm_connector, privacy_screen_notifier);
> + struct drm_device *dev = connector->dev;
> +
> + drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
> + drm_connector_update_privacy_screen_properties(connector, true);
This thing still seems pretty unatomic in essence. The standard rule
is that non-immutable properties do not change under external
influence. So if userspace is unaware of the change then it could
just flip the state back to where it was previously. Ie. seems racy
at least which could in theory lead to some funny ping pong in the
state.
To go proper atomic route here the state of the prop should be
fully cotrolled by userspace. Is that not possible for some reason?
> + drm_modeset_unlock(&dev->mode_config.connection_mutex);
> +
> + drm_sysfs_connector_status_event(connector,
> + connector->privacy_screen_sw_state_property);
> + drm_sysfs_connector_status_event(connector,
> + connector->privacy_screen_hw_state_property);
> +
> + return NOTIFY_DONE;
> +}
> +
> +/**
> + * drm_connector_attach_privacy_screen_provider - attach a privacy-screen to
> + * the connector
> + * @connector: connector to attach the privacy-screen to
> + * @priv: drm_privacy_screen to attach
> + *
> + * Create and attach the standard privacy-screen properties and register
> + * a generic notifier for generating sysfs-connector-status-events
> + * on external changes to the privacy-screen status.
> + * This function takes ownership of the passed in drm_privacy_screen and will
> + * call drm_privacy_screen_put() on it when the connector is destroyed.
> + */
> +void drm_connector_attach_privacy_screen_provider(
> + struct drm_connector *connector, struct drm_privacy_screen *priv)
> +{
> + connector->privacy_screen = priv;
> + connector->privacy_screen_notifier.notifier_call =
> + drm_connector_privacy_screen_notifier;
> +
> + drm_connector_create_privacy_screen_properties(connector);
> + drm_connector_update_privacy_screen_properties(connector, true);
> + drm_connector_attach_privacy_screen_properties(connector);
> +}
> +EXPORT_SYMBOL(drm_connector_attach_privacy_screen_provider);
> +
> +/**
> + * drm_connector_update_privacy_screen - update connector's privacy-screen sw-state
> + * @connector_state: connector-state to update the privacy-screen for
> + *
> + * This function calls drm_privacy_screen_set_sw_state() on the connector's
> + * privacy-screen.
> + *
> + * If the connector has no privacy-screen, then this is a no-op.
> + */
> +void drm_connector_update_privacy_screen(const struct drm_connector_state *connector_state)
> +{
> + struct drm_connector *connector = connector_state->connector;
> + int ret;
> +
> + if (!connector->privacy_screen)
> + return;
> +
> + ret = drm_privacy_screen_set_sw_state(connector->privacy_screen,
> + connector_state->privacy_screen_sw_state);
> + if (ret) {
> + drm_err(connector->dev, "Error updating privacy-screen sw_state\n");
> + return;
> + }
> +
> + /* The hw_state property value may have changed, update it. */
> + drm_connector_update_privacy_screen_properties(connector, false);
> +}
> +EXPORT_SYMBOL(drm_connector_update_privacy_screen);
> +
> int drm_connector_set_obj_prop(struct drm_mode_object *obj,
> struct drm_property *property,
> uint64_t value)
> diff --git a/include/drm/drm_connector.h b/include/drm/drm_connector.h
> index a79aec55ea40..b501d0badaea 100644
> --- a/include/drm/drm_connector.h
> +++ b/include/drm/drm_connector.h
> @@ -27,6 +27,7 @@
> #include <linux/llist.h>
> #include <linux/ctype.h>
> #include <linux/hdmi.h>
> +#include <linux/notifier.h>
> #include <drm/drm_mode_object.h>
> #include <drm/drm_util.h>
>
> @@ -40,6 +41,7 @@ struct drm_encoder;
> struct drm_property;
> struct drm_property_blob;
> struct drm_printer;
> +struct drm_privacy_screen;
> struct edid;
> struct i2c_adapter;
>
> @@ -1451,6 +1453,12 @@ struct drm_connector {
> */
> struct drm_property *max_bpc_property;
>
> + /** @privacy_screen: drm_privacy_screen for this connector, or NULL. */
> + struct drm_privacy_screen *privacy_screen;
> +
> + /** @privacy_screen_notifier: privacy-screen notifier_block */
> + struct notifier_block privacy_screen_notifier;
> +
> /**
> * @privacy_screen_sw_state_property: Optional atomic property for the
> * connector to control the integrated privacy screen.
> @@ -1788,6 +1796,9 @@ int drm_connector_attach_max_bpc_property(struct drm_connector *connector,
> int min, int max);
> void drm_connector_create_privacy_screen_properties(struct drm_connector *conn);
> void drm_connector_attach_privacy_screen_properties(struct drm_connector *conn);
> +void drm_connector_attach_privacy_screen_provider(
> + struct drm_connector *connector, struct drm_privacy_screen *priv);
> +void drm_connector_update_privacy_screen(const struct drm_connector_state *connector_state);
>
> /**
> * struct drm_tile_group - Tile group metadata
> --
> 2.31.1
--
Ville Syrjälä
Intel
next prev parent reply other threads:[~2021-10-04 16:05 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-02 16:36 [Intel-gfx] [PATCH 00/10] drm: Add privacy-screen class and connector properties Hans de Goede
2021-10-02 16:36 ` [Intel-gfx] [PATCH 01/10] drm/connector: Add support for privacy-screen properties (v4) Hans de Goede
2021-10-02 16:36 ` [Intel-gfx] [PATCH 02/10] drm: Add privacy-screen class (v4) Hans de Goede
2021-10-02 16:36 ` [Intel-gfx] [PATCH 03/10] drm/privacy-screen: Add X86 specific arch init code Hans de Goede
2021-10-02 16:36 ` [Intel-gfx] [PATCH 04/10] drm/privacy-screen: Add notifier support (v2) Hans de Goede
2021-10-02 16:36 ` [Intel-gfx] [PATCH 05/10] drm/connector: Add a drm_connector privacy-screen helper functions (v2) Hans de Goede
2021-10-04 15:22 ` Ville Syrjälä [this message]
2021-10-04 15:40 ` Hans de Goede
2021-10-02 16:36 ` [Intel-gfx] [PATCH 06/10] platform/x86: thinkpad_acpi: Add hotkey_notify_extended_hotkey() helper Hans de Goede
2021-10-02 16:36 ` [Intel-gfx] [PATCH 07/10] platform/x86: thinkpad_acpi: Get privacy-screen / lcdshadow ACPI handles only once Hans de Goede
2021-10-02 16:36 ` [Intel-gfx] [PATCH 08/10] platform/x86: thinkpad_acpi: Register a privacy-screen device Hans de Goede
2021-10-02 16:36 ` [Intel-gfx] [PATCH 09/10] drm/i915: Add intel_modeset_probe_defer() helper Hans de Goede
2021-10-04 15:34 ` Ville Syrjälä
2021-10-02 16:36 ` [Intel-gfx] [PATCH 10/10] drm/i915: Add privacy-screen support (v2) Hans de Goede
2021-10-04 15:37 ` Ville Syrjälä
2021-10-04 16:02 ` Hans de Goede
2021-10-04 18:48 ` Ville Syrjälä
2021-10-02 17:02 ` [Intel-gfx] ✗ Fi.CI.CHECKPATCH: warning for drm: Add privacy-screen class and connector properties (rev5) Patchwork
2021-10-02 17:05 ` [Intel-gfx] ✗ Fi.CI.SPARSE: " Patchwork
2021-10-02 17:35 ` [Intel-gfx] ✓ Fi.CI.BAT: success " Patchwork
2021-10-02 18:53 ` [Intel-gfx] ✓ Fi.CI.IGT: " Patchwork
-- strict thread matches above, loose matches on Subject: below --
2021-10-05 20:23 [Intel-gfx] [PATCH 00/10] drm: Add privacy-screen class and connector properties Hans de Goede
2021-10-05 20:23 ` [Intel-gfx] [PATCH 05/10] drm/connector: Add a drm_connector privacy-screen helper functions (v2) Hans de Goede
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=YVscLznEbn0m07Mi@intel.com \
--to=ville.syrjala@linux.intel.com \
--cc=airlied@linux.ie \
--cc=andy@infradead.org \
--cc=daniel@ffwll.ch \
--cc=dri-devel@lists.freedesktop.org \
--cc=emil.l.velikov@gmail.com \
--cc=hdegoede@redhat.com \
--cc=intel-gfx@lists.freedesktop.org \
--cc=jani.nikula@linux.intel.com \
--cc=joonas.lahtinen@linux.intel.com \
--cc=lyude@redhat.com \
--cc=maarten.lankhorst@linux.intel.com \
--cc=marco.trevisan@canonical.com \
--cc=mario.limonciello@outlook.com \
--cc=markgross@kernel.org \
--cc=markpearson@lenovo.com \
--cc=mripard@kernel.org \
--cc=pekka.paalanen@collabora.com \
--cc=platform-driver-x86@vger.kernel.org \
--cc=rajatja@google.com \
--cc=rodrigo.vivi@intel.com \
--cc=seb128@ubuntu.com \
--cc=tzimmermann@suse.de \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox