[PATCH] drm: Call sysfs_notify after changing drm_connector::dpms

Karsten Wiese fzuuzf at googlemail.com
Wed Sep 27 10:20:21 UTC 2017


2017-09-27 9:18 GMT+02:00 Jani Nikula <jani.nikula at linux.intel.com>:

> On Wed, 27 Sep 2017, Karsten Wiese <fzuuzf at googlemail.com> wrote:
> > 2017-09-25 15:48 GMT+02:00 Jani Nikula <jani.nikula at linux.intel.com>:
> >
> >> On Tue, 19 Sep 2017, Karsten Wiese <fzuuzf at googlemail.com> wrote:
> >> > This makes poll work for the
> >> > /sys/class/drm/cardX/connectorY/dpms attributes.
> >>
> >> I guess the question is, what are you trying to achieve? What is the
> >> problem that this solves?
> >>
> > ​
> > The patch enables cpu cycle less waiting for dpms flag changes.
> >
> > Here it lets a screen brightness ​setting daemon know which monitor to
> > handle.  One of the attached screens gets confused if it is set just
> > after being switched on, hence the daemon leaves it untouched until it
> > has been active for some seconds.
>
> Screen brightness settings daemon?
>
Running on a laptop lacking an ambient light sensor employing it's webcam
instead to measure ambient light and adjust monitors' brightnesses
accordingly.


What exactly do you mean by "if it is
> set"? What interface are you using to change brightness?

The external monitor's brightness is adjusted by DDC/CI via the /dev/i2c-x
the monitor is attached to.
 I there a saner interface to use?

What happens
> when the display "gets confused"?
>
The monitor wrongly toggles sharpness if it receives the brightness
adjusting​
​ DDC/CI soon after resuming from power saving state.

>
> My first instinct is that you're proposing a new kernel ABI to solve an
> issue you shouldn't be solving in userspace to begin with.

Calculating ambient light from pictures acquired via ​
​v4l​2 in kernel seamed wrong to me.

Or that
> perhaps the userspace should be doing this in cooperation with the drm
> master, not standalone.
>
Is there a way to call into the drm-master (xscreensaver/xserver​ here​
​) ​with the call only returning if a monitor's power state changed?

There is DPMSInfo, but it returns immediately rendering the daemon less
efficient.


BR,

Karsten

>
> BR,
> Jani.
>
> >
> > Without the p​atch the daemon would have to actively read the dpms flag
> > every once in a while.
> >
> >
> >>
> >> We have zero sysfs_notify in all of drm AFAICT.
> >
> >
> > Yes I noticed too and looked for some dbus signal to listen to​ but
> didn't
> > find any.
> >
> > BR,
> > Karsten
> >
> >>
> >> BR,
> >> Jani.
> >>
> >>
> >> >
> >> > Tested with i915 suspended by XScreenServer and
> >> > suspend to RAM.
> >> >
> >> > Signed-off-by: Karsten Wiese <fzuuzf at googlemail.com>
> >> > ---
> >> >  drivers/gpu/drm/drm_atomic.c        | 4 ++++
> >> >  drivers/gpu/drm/drm_atomic_helper.c | 6 +++++-
> >> >  2 files changed, 9 insertions(+), 1 deletion(-)
> >> >
> >> > diff --git a/drivers/gpu/drm/drm_atomic.c
> b/drivers/gpu/drm/drm_atomic.c
> >> > index 2fd383d..b6fa87b 100644
> >> > --- a/drivers/gpu/drm/drm_atomic.c
> >> > +++ b/drivers/gpu/drm/drm_atomic.c
> >> > @@ -1880,6 +1880,10 @@ int drm_atomic_connector_commit_dpms(struct
> >> drm_atomic_state *state,
> >> >  out:
> >> >       if (ret != 0)
> >> >               connector->dpms = old_mode;
> >> > +     else
> >> > +             if (connector->dpms != old_mode)
> >> > +                     sysfs_notify(&connector->kdev->kobj, NULL,
> >> "dpms");
> >> > +
> >> >       return ret;
> >> >  }
> >> >
> >> > diff --git a/drivers/gpu/drm/drm_atomic_helper.c
> >> b/drivers/gpu/drm/drm_atomic_helper.c
> >> > index 4e53aae..6198772 100644
> >> > --- a/drivers/gpu/drm/drm_atomic_helper.c
> >> > +++ b/drivers/gpu/drm/drm_atomic_helper.c
> >> > @@ -921,12 +921,16 @@ drm_atomic_helper_update_
> legacy_modeset_state(struct
> >> drm_device *dev,
> >> >               crtc = new_conn_state->crtc;
> >> >               if ((!crtc && old_conn_state->crtc) ||
> >> >                   (crtc && drm_atomic_crtc_needs_modeset(
> crtc->state)))
> >> {
> >> > -                     int mode = DRM_MODE_DPMS_OFF;
> >> > +                     int old_mode, mode = DRM_MODE_DPMS_OFF;
> >> >
> >> >                       if (crtc && crtc->state->active)
> >> >                               mode = DRM_MODE_DPMS_ON;
> >> >
> >> > +                     old_mode = connector->dpms;
> >> >                       connector->dpms = mode;
> >> > +                     if (old_mode != mode)
> >> > +                             sysfs_notify(&connector->kdev->kobj,
> >> > +                                             NULL, "dpms");
> >> >               }
> >> >       }
> >>
> >> --
> >> Jani Nikula, Intel Open Source Technology Center
> >>
>
> --
> Jani Nikula, Intel Open Source Technology Center
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/dri-devel/attachments/20170927/7a7127f3/attachment.html>


More information about the dri-devel mailing list