[PATCH 1/4] drm: Add an interface to reset the device

Alex Deucher alexdeucher at gmail.com
Mon Jan 24 09:08:29 PST 2011


On Mon, Jan 24, 2011 at 10:55 AM, Chris Wilson <chris at chris-wilson.co.uk> wrote:
> Iterate over the attached CRTCs, encoders and connectors and call the
> supplied reset vfunc in order to reset any cached state back to unknown.
> Useful after an invalidation event such as a GPU reset or resuming.
>

Can't you just reprogram the modes at resume?  I guess it would help
to see what you are actually doing with this hook.

Alex

> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
>  drivers/gpu/drm/drm_crtc.c |   19 +++++++++++++++++++
>  include/drm/drm_crtc.h     |    7 +++++++
>  2 files changed, 26 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
> index 2baa670..6d7323d 100644
> --- a/drivers/gpu/drm/drm_crtc.c
> +++ b/drivers/gpu/drm/drm_crtc.c
> @@ -2674,3 +2674,22 @@ out:
>        mutex_unlock(&dev->mode_config.mutex);
>        return ret;
>  }
> +
> +void drm_mode_config_reset(struct drm_device *dev)
> +{
> +       struct drm_crtc *crtc;
> +       struct drm_encoder *encoder;
> +       struct drm_connector *connector;
> +
> +       list_for_each_entry(crtc, &dev->mode_config.crtc_list, head)
> +               if (crtc->funcs->reset)
> +                       crtc->funcs->reset(crtc);
> +
> +       list_for_each_entry(encoder, &dev->mode_config.encoder_list, head)
> +               if (encoder->funcs->reset)
> +                       encoder->funcs->reset(encoder);
> +
> +       list_for_each_entry(connector, &dev->mode_config.connector_list, head)
> +               if (connector->funcs->reset)
> +                       connector->funcs->reset(connector);
> +}
> diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
> index acd7fad..801be59 100644
> --- a/include/drm/drm_crtc.h
> +++ b/include/drm/drm_crtc.h
> @@ -275,6 +275,7 @@ struct drm_pending_vblank_event;
>
>  /**
>  * drm_crtc_funcs - control CRTCs for a given device
> + * @reset: reset CRTC after state has been invalidate (e.g. resume)
>  * @dpms: control display power levels
>  * @save: save CRTC state
>  * @resore: restore CRTC state
> @@ -302,6 +303,8 @@ struct drm_crtc_funcs {
>        void (*save)(struct drm_crtc *crtc); /* suspend? */
>        /* Restore CRTC state */
>        void (*restore)(struct drm_crtc *crtc); /* resume? */
> +       /* Reset CRTC state */
> +       void (*reset)(struct drm_crtc *crtc);
>
>        /* cursor controls */
>        int (*cursor_set)(struct drm_crtc *crtc, struct drm_file *file_priv,
> @@ -379,6 +382,7 @@ struct drm_crtc {
>  * @dpms: set power state (see drm_crtc_funcs above)
>  * @save: save connector state
>  * @restore: restore connector state
> + * @reset: reset connector after state has been invalidate (e.g. resume)
>  * @mode_valid: is this mode valid on the given connector?
>  * @mode_fixup: try to fixup proposed mode for this connector
>  * @mode_set: set this mode
> @@ -396,6 +400,7 @@ struct drm_connector_funcs {
>        void (*dpms)(struct drm_connector *connector, int mode);
>        void (*save)(struct drm_connector *connector);
>        void (*restore)(struct drm_connector *connector);
> +       void (*reset)(struct drm_connector *connector);
>
>        /* Check to see if anything is attached to the connector.
>         * @force is set to false whilst polling, true when checking the
> @@ -413,6 +418,7 @@ struct drm_connector_funcs {
>  };
>
>  struct drm_encoder_funcs {
> +       void (*reset)(struct drm_encoder *encoder);
>        void (*destroy)(struct drm_encoder *encoder);
>  };
>
> @@ -656,6 +662,7 @@ extern struct drm_display_mode *drm_mode_duplicate(struct drm_device *dev,
>                                                   struct drm_display_mode *mode);
>  extern void drm_mode_debug_printmodeline(struct drm_display_mode *mode);
>  extern void drm_mode_config_init(struct drm_device *dev);
> +extern void drm_mode_config_reset(struct drm_device *dev);
>  extern void drm_mode_config_cleanup(struct drm_device *dev);
>  extern void drm_mode_set_name(struct drm_display_mode *mode);
>  extern bool drm_mode_equal(struct drm_display_mode *mode1, struct drm_display_mode *mode2);
> --
> 1.7.2.3
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel
>


More information about the dri-devel mailing list