Re: [PATCH v4 05/11] drm: Add helpers to kick off self refresh mode in drivers
On Wed, May 08, 2019 at 12:09:10PM -0400, Sean Paul wrote: > From: Sean Paul > > This patch adds a new drm helper library to help drivers implement > self refresh. Drivers choosing to use it will register crtcs and > will receive callbacks when it's time to enter or exit self refresh > mode. > > In its current form, it has a timer which will trigger after a > driver-specified amount of inactivity. When the timer triggers, the > helpers will submit a new atomic commit to shut the refreshing pipe > off. On the next atomic commit, the drm core will revert the self > refresh state and bring everything back up to be actively driven. > > From the driver's perspective, this works like a regular disable/enable > cycle. The driver need only check the 'self_refresh_active' state in > crtc_state. It should initiate self refresh mode on the panel and enter > an off or low-power state. > > Changes in v2: > - s/psr/self_refresh/ (Daniel) > - integrated the psr exit into the commit that wakes it up (Jose/Daniel) > - made the psr state per-crtc (Jose/Daniel) > Changes in v3: > - Remove the self_refresh_(active|changed) from connector state (Daniel) > - Simplify loop in drm_self_refresh_helper_alter_state (Daniel) > - Improve self_refresh_aware comment (Daniel) > - s/self_refresh_state/self_refresh_data/ (Daniel) > Changes in v4: > - Move docbook location below panel (Daniel) > - Improve docbook with references and more detailed explanation (Daniel) > - Instead of register/unregister, use init/cleanup (Daniel) Again missed my r-b or didn't apply all my suggestions? I'm feeling a bit blue and all that today so don't want to do more than necessary with actual patch review :-) Cheers, Daniel > > Link to v1: > https://patchwork.freedesktop.org/patch/msgid/20190228210939.83386-2-s...@poorly.run > Link to v2: > https://patchwork.freedesktop.org/patch/msgid/20190326204509.96515-1-s...@poorly.run > Link to v3: > https://patchwork.freedesktop.org/patch/msgid/20190502194956.218441-6-s...@poorly.run > > Cc: Daniel Vetter > Cc: Jose Souza > Cc: Zain Wang > Cc: Tomasz Figa > Cc: Ville Syrjälä > Signed-off-by: Sean Paul > --- > Documentation/gpu/drm-kms-helpers.rst | 9 + > drivers/gpu/drm/Makefile | 2 +- > drivers/gpu/drm/drm_atomic.c | 2 + > drivers/gpu/drm/drm_atomic_helper.c | 35 +++- > drivers/gpu/drm/drm_atomic_state_helper.c | 4 + > drivers/gpu/drm/drm_atomic_uapi.c | 7 +- > drivers/gpu/drm/drm_self_refresh_helper.c | 213 ++ > include/drm/drm_atomic.h | 15 ++ > include/drm/drm_connector.h | 14 ++ > include/drm/drm_crtc.h| 19 ++ > include/drm/drm_self_refresh_helper.h | 22 +++ > 11 files changed, 337 insertions(+), 5 deletions(-) > create mode 100644 drivers/gpu/drm/drm_self_refresh_helper.c > create mode 100644 include/drm/drm_self_refresh_helper.h > > diff --git a/Documentation/gpu/drm-kms-helpers.rst > b/Documentation/gpu/drm-kms-helpers.rst > index 14102ae035dc..86dbb56aef51 100644 > --- a/Documentation/gpu/drm-kms-helpers.rst > +++ b/Documentation/gpu/drm-kms-helpers.rst > @@ -181,6 +181,15 @@ Panel Helper Reference > .. kernel-doc:: drivers/gpu/drm/drm_panel_orientation_quirks.c > :export: > > +Panel Self Refresh Helper Reference > +=== > + > +.. kernel-doc:: drivers/gpu/drm/drm_self_refresh_helper.c > + :doc: overview > + > +.. kernel-doc:: drivers/gpu/drm/drm_self_refresh_helper.c > + :export: > + > Display Port Helper Functions Reference > === > > diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile > index 3d0c75cd687c..c4852604fc1d 100644 > --- a/drivers/gpu/drm/Makefile > +++ b/drivers/gpu/drm/Makefile > @@ -39,7 +39,7 @@ drm_kms_helper-y := drm_crtc_helper.o drm_dp_helper.o > drm_dsc.o drm_probe_helper > drm_simple_kms_helper.o drm_modeset_helper.o \ > drm_scdc_helper.o drm_gem_framebuffer_helper.o \ > drm_atomic_state_helper.o drm_damage_helper.o \ > - drm_format_helper.o > + drm_format_helper.o drm_self_refresh_helper.o > > drm_kms_helper-$(CONFIG_DRM_PANEL_BRIDGE) += bridge/panel.o > drm_kms_helper-$(CONFIG_DRM_FBDEV_EMULATION) += drm_fb_helper.o > diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c > index 936002495523..2b92648ce196 100644 > --- a/drivers/gpu/drm/drm_atomic.c > +++ b/drivers/gpu/drm/drm_atomic.c > @@ -379,6 +379,7 @@ static void drm_atomic_crtc_print_state(struct > drm_printer *p, > drm_printf(p, "crtc[%u]: %s\n", crtc->base.id, crtc->name); > drm_printf(p, "\tenable=%d\n", state->enable); > drm_printf(p, "\tactive=%d\n", state->active); > + drm_printf(p, "\tself_refresh_active=%d\n", state->self_refresh_active); > drm_printf(p, "\tplanes_changed=%d\n", state->planes_changed); > drm_printf(p,
[PATCH v4 05/11] drm: Add helpers to kick off self refresh mode in drivers
From: Sean Paul This patch adds a new drm helper library to help drivers implement self refresh. Drivers choosing to use it will register crtcs and will receive callbacks when it's time to enter or exit self refresh mode. In its current form, it has a timer which will trigger after a driver-specified amount of inactivity. When the timer triggers, the helpers will submit a new atomic commit to shut the refreshing pipe off. On the next atomic commit, the drm core will revert the self refresh state and bring everything back up to be actively driven. From the driver's perspective, this works like a regular disable/enable cycle. The driver need only check the 'self_refresh_active' state in crtc_state. It should initiate self refresh mode on the panel and enter an off or low-power state. Changes in v2: - s/psr/self_refresh/ (Daniel) - integrated the psr exit into the commit that wakes it up (Jose/Daniel) - made the psr state per-crtc (Jose/Daniel) Changes in v3: - Remove the self_refresh_(active|changed) from connector state (Daniel) - Simplify loop in drm_self_refresh_helper_alter_state (Daniel) - Improve self_refresh_aware comment (Daniel) - s/self_refresh_state/self_refresh_data/ (Daniel) Changes in v4: - Move docbook location below panel (Daniel) - Improve docbook with references and more detailed explanation (Daniel) - Instead of register/unregister, use init/cleanup (Daniel) Link to v1: https://patchwork.freedesktop.org/patch/msgid/20190228210939.83386-2-s...@poorly.run Link to v2: https://patchwork.freedesktop.org/patch/msgid/20190326204509.96515-1-s...@poorly.run Link to v3: https://patchwork.freedesktop.org/patch/msgid/20190502194956.218441-6-s...@poorly.run Cc: Daniel Vetter Cc: Jose Souza Cc: Zain Wang Cc: Tomasz Figa Cc: Ville Syrjälä Signed-off-by: Sean Paul --- Documentation/gpu/drm-kms-helpers.rst | 9 + drivers/gpu/drm/Makefile | 2 +- drivers/gpu/drm/drm_atomic.c | 2 + drivers/gpu/drm/drm_atomic_helper.c | 35 +++- drivers/gpu/drm/drm_atomic_state_helper.c | 4 + drivers/gpu/drm/drm_atomic_uapi.c | 7 +- drivers/gpu/drm/drm_self_refresh_helper.c | 213 ++ include/drm/drm_atomic.h | 15 ++ include/drm/drm_connector.h | 14 ++ include/drm/drm_crtc.h| 19 ++ include/drm/drm_self_refresh_helper.h | 22 +++ 11 files changed, 337 insertions(+), 5 deletions(-) create mode 100644 drivers/gpu/drm/drm_self_refresh_helper.c create mode 100644 include/drm/drm_self_refresh_helper.h diff --git a/Documentation/gpu/drm-kms-helpers.rst b/Documentation/gpu/drm-kms-helpers.rst index 14102ae035dc..86dbb56aef51 100644 --- a/Documentation/gpu/drm-kms-helpers.rst +++ b/Documentation/gpu/drm-kms-helpers.rst @@ -181,6 +181,15 @@ Panel Helper Reference .. kernel-doc:: drivers/gpu/drm/drm_panel_orientation_quirks.c :export: +Panel Self Refresh Helper Reference +=== + +.. kernel-doc:: drivers/gpu/drm/drm_self_refresh_helper.c + :doc: overview + +.. kernel-doc:: drivers/gpu/drm/drm_self_refresh_helper.c + :export: + Display Port Helper Functions Reference === diff --git a/drivers/gpu/drm/Makefile b/drivers/gpu/drm/Makefile index 3d0c75cd687c..c4852604fc1d 100644 --- a/drivers/gpu/drm/Makefile +++ b/drivers/gpu/drm/Makefile @@ -39,7 +39,7 @@ drm_kms_helper-y := drm_crtc_helper.o drm_dp_helper.o drm_dsc.o drm_probe_helper drm_simple_kms_helper.o drm_modeset_helper.o \ drm_scdc_helper.o drm_gem_framebuffer_helper.o \ drm_atomic_state_helper.o drm_damage_helper.o \ - drm_format_helper.o + drm_format_helper.o drm_self_refresh_helper.o drm_kms_helper-$(CONFIG_DRM_PANEL_BRIDGE) += bridge/panel.o drm_kms_helper-$(CONFIG_DRM_FBDEV_EMULATION) += drm_fb_helper.o diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c index 936002495523..2b92648ce196 100644 --- a/drivers/gpu/drm/drm_atomic.c +++ b/drivers/gpu/drm/drm_atomic.c @@ -379,6 +379,7 @@ static void drm_atomic_crtc_print_state(struct drm_printer *p, drm_printf(p, "crtc[%u]: %s\n", crtc->base.id, crtc->name); drm_printf(p, "\tenable=%d\n", state->enable); drm_printf(p, "\tactive=%d\n", state->active); + drm_printf(p, "\tself_refresh_active=%d\n", state->self_refresh_active); drm_printf(p, "\tplanes_changed=%d\n", state->planes_changed); drm_printf(p, "\tmode_changed=%d\n", state->mode_changed); drm_printf(p, "\tactive_changed=%d\n", state->active_changed); @@ -951,6 +952,7 @@ static void drm_atomic_connector_print_state(struct drm_printer *p, drm_printf(p, "connector[%u]: %s\n", connector->base.id, connector->name); drm_printf(p, "\tcrtc=%s\n", state->crtc ? state->crtc->name : "(null)"); + drm_printf(p, "\tself_refresh_aware=%d\n", state->self_refresh_aware);