Hi 2012/10/26 Daniel Vetter <daniel.vetter at ffwll.ch>: > After all relevant pipes are disabled and after we've updated all the > state with the staged state, but before we call the per-crtc > ->mode_set functions there's a very natural point to set up any > shared/global resources like > - shared plls (obviously only the setup, the enabling needs to be > separately handling with a separate refcount) > - global watermark state like the DSPARB on gmch platforms > - workaround bits that depend upon the exact global output > configuration > - enabling the right set of refclocks > - enabling/disabling manual power wells. > > Now for a lot of these things we can't move them into this function > yet, most often because we only compute the required information in > the per-crtc ->mode_set callback. Which is too late. But due to a > bunch of reasons (check-only atomic modeset, fastboot&hw state checks, > ...) we need to separate the computation of that state from the actual > hw frobbery anyway. So we can move things into this new callback step- > by-step. > > Others can't be moved here (or implemented at all) because our code > lacks the smarts to properly update them. E.g. the DSPARB can only be > updated when all pipes are disabled, so if we decide to change it's > value, we need to disable _all_ pipes. The infrastructure for that is > already in place (with the various pipe masks that driver the modeset > logic). But again we need to move a few things out of ->mode_set > first before we can even implement the correct decision making. > > In any case, we need to start somewhere, so let's start with the > callback: Some small follow-up patches will make immediate good use of > it. > > Signed-off-by: Daniel Vetter <daniel.vetter at ffwll.ch> Yes, I can see cases where this is needed and even thought about doing something similar for a specific task. In the future we might want a global function that runs on all gens before calling the gen-specific functions, but for now let's keep it this way. Reviewed-by: Paulo Zanoni <paulo.r.zanoni at intel.com> > --- > drivers/gpu/drm/i915/i915_drv.h | 1 + > drivers/gpu/drm/i915/intel_display.c | 3 +++ > 2 files changed, 4 insertions(+) > > diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h > index b0ca786..6531d3e 100644 > --- a/drivers/gpu/drm/i915/i915_drv.h > +++ b/drivers/gpu/drm/i915/i915_drv.h > @@ -249,6 +249,7 @@ struct drm_i915_display_funcs { > uint32_t sprite_width, int pixel_size); > void (*update_linetime_wm)(struct drm_device *dev, int pipe, > struct drm_display_mode *mode); > + void (*modeset_global_resources)(struct drm_device *dev); > int (*crtc_mode_set)(struct drm_crtc *crtc, > struct drm_display_mode *mode, > struct drm_display_mode *adjusted_mode, > diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c > index 7a9cfc2..7009c0f 100644 > --- a/drivers/gpu/drm/i915/intel_display.c > +++ b/drivers/gpu/drm/i915/intel_display.c > @@ -7403,6 +7403,9 @@ bool intel_set_mode(struct drm_crtc *crtc, > * update the the output configuration. */ > intel_modeset_update_state(dev, prepare_pipes); > > + if (dev_priv->display.modeset_global_resources) > + dev_priv->display.modeset_global_resources(dev); > + > /* Set up the DPLL and any encoders state that needs to adjust or depend > * on the DPLL. > */ > -- > 1.7.11.4 > > _______________________________________________ > Intel-gfx mailing list > Intel-gfx at lists.freedesktop.org > http://lists.freedesktop.org/mailman/listinfo/intel-gfx -- Paulo Zanoni