Message ID | 1427943589-6254-12-git-send-email-chandra.konduru@intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Wed, Apr 01, 2015 at 07:59:40PM -0700, Chandra Konduru wrote: > This function is called from commit path of a plane or crtc. > It programs scaler registers to detach (aka. unbinds) scaler > from requested plane or crtc if it isn't in use. It also resets > scaler_id in crtc/plane state. The last sentence here is no longer true, so you should probably remove it to avoid confusion. Otherwise, Reviewed-by: Matt Roper <matthew.d.roper@intel.com> > > v2: > -improved a log message (me) > > v3: > -improved commentary (Matt) > -added a case where scaler id needs to be reset (me) > > v4: > -changes made not to modify state in commit path (Matt) > > Signed-off-by: Chandra Konduru <chandra.konduru@intel.com> > --- > drivers/gpu/drm/i915/intel_display.c | 29 +++++++++++++++++++++++++++++ > drivers/gpu/drm/i915/intel_drv.h | 1 + > 2 files changed, 30 insertions(+) > > diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c > index 603a2dc..8cf0d0e 100644 > --- a/drivers/gpu/drm/i915/intel_display.c > +++ b/drivers/gpu/drm/i915/intel_display.c > @@ -2938,6 +2938,35 @@ unsigned long intel_plane_obj_offset(struct intel_plane *intel_plane, > return i915_gem_obj_ggtt_offset_view(obj, view); > } > > +/* > + * This function detaches (aka. unbinds) unused scalers in hardware > + */ > +void skl_detach_scalers(struct intel_crtc *intel_crtc) > +{ > + struct drm_device *dev; > + struct drm_i915_private *dev_priv; > + struct intel_crtc_scaler_state *scaler_state; > + int i; > + > + if (!intel_crtc || !intel_crtc->config) > + return; > + > + dev = intel_crtc->base.dev; > + dev_priv = dev->dev_private; > + scaler_state = &intel_crtc->config->scaler_state; > + > + /* loop through and disable scalers that aren't in use */ > + for (i = 0; i < scaler_state->num_scalers; i++) { > + if (!scaler_state->scalers[i].in_use) { > + I915_WRITE(SKL_PS_CTRL(intel_crtc->pipe, i), 0); > + I915_WRITE(SKL_PS_WIN_POS(intel_crtc->pipe, i), 0); > + I915_WRITE(SKL_PS_WIN_SZ(intel_crtc->pipe, i), 0); > + DRM_DEBUG_KMS("CRTC:%d Disabled scaler id %u.%u\n", > + intel_crtc->base.base.id, intel_crtc->pipe, i); > + } > + } > +} > + > static void skylake_update_primary_plane(struct drm_crtc *crtc, > struct drm_framebuffer *fb, > int x, int y) > diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h > index 1381d11..7bb4c44 100644 > --- a/drivers/gpu/drm/i915/intel_drv.h > +++ b/drivers/gpu/drm/i915/intel_drv.h > @@ -1146,6 +1146,7 @@ void intel_modeset_preclose(struct drm_device *dev, struct drm_file *file); > int skl_update_scaler_users(struct intel_crtc *intel_crtc, > struct intel_crtc_state *crtc_state, struct intel_plane *intel_plane, > struct intel_plane_state *plane_state, int force_detach); > +void skl_detach_scalers(struct intel_crtc *intel_crtc); > > unsigned long intel_plane_obj_offset(struct intel_plane *intel_plane, > struct drm_i915_gem_object *obj); > -- > 1.7.9.5 >
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c index 603a2dc..8cf0d0e 100644 --- a/drivers/gpu/drm/i915/intel_display.c +++ b/drivers/gpu/drm/i915/intel_display.c @@ -2938,6 +2938,35 @@ unsigned long intel_plane_obj_offset(struct intel_plane *intel_plane, return i915_gem_obj_ggtt_offset_view(obj, view); } +/* + * This function detaches (aka. unbinds) unused scalers in hardware + */ +void skl_detach_scalers(struct intel_crtc *intel_crtc) +{ + struct drm_device *dev; + struct drm_i915_private *dev_priv; + struct intel_crtc_scaler_state *scaler_state; + int i; + + if (!intel_crtc || !intel_crtc->config) + return; + + dev = intel_crtc->base.dev; + dev_priv = dev->dev_private; + scaler_state = &intel_crtc->config->scaler_state; + + /* loop through and disable scalers that aren't in use */ + for (i = 0; i < scaler_state->num_scalers; i++) { + if (!scaler_state->scalers[i].in_use) { + I915_WRITE(SKL_PS_CTRL(intel_crtc->pipe, i), 0); + I915_WRITE(SKL_PS_WIN_POS(intel_crtc->pipe, i), 0); + I915_WRITE(SKL_PS_WIN_SZ(intel_crtc->pipe, i), 0); + DRM_DEBUG_KMS("CRTC:%d Disabled scaler id %u.%u\n", + intel_crtc->base.base.id, intel_crtc->pipe, i); + } + } +} + static void skylake_update_primary_plane(struct drm_crtc *crtc, struct drm_framebuffer *fb, int x, int y) diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h index 1381d11..7bb4c44 100644 --- a/drivers/gpu/drm/i915/intel_drv.h +++ b/drivers/gpu/drm/i915/intel_drv.h @@ -1146,6 +1146,7 @@ void intel_modeset_preclose(struct drm_device *dev, struct drm_file *file); int skl_update_scaler_users(struct intel_crtc *intel_crtc, struct intel_crtc_state *crtc_state, struct intel_plane *intel_plane, struct intel_plane_state *plane_state, int force_detach); +void skl_detach_scalers(struct intel_crtc *intel_crtc); unsigned long intel_plane_obj_offset(struct intel_plane *intel_plane, struct drm_i915_gem_object *obj);
This function is called from commit path of a plane or crtc. It programs scaler registers to detach (aka. unbinds) scaler from requested plane or crtc if it isn't in use. It also resets scaler_id in crtc/plane state. v2: -improved a log message (me) v3: -improved commentary (Matt) -added a case where scaler id needs to be reset (me) v4: -changes made not to modify state in commit path (Matt) Signed-off-by: Chandra Konduru <chandra.konduru@intel.com> --- drivers/gpu/drm/i915/intel_display.c | 29 +++++++++++++++++++++++++++++ drivers/gpu/drm/i915/intel_drv.h | 1 + 2 files changed, 30 insertions(+)