diff options
Diffstat (limited to 'drivers/gpu/drm/i915/intel_sprite.c')
| -rw-r--r-- | drivers/gpu/drm/i915/intel_sprite.c | 83 | 
1 files changed, 83 insertions, 0 deletions
diff --git a/drivers/gpu/drm/i915/intel_sprite.c b/drivers/gpu/drm/i915/intel_sprite.c index 4fcf80ca91dd..4a8a5d918a83 100644 --- a/drivers/gpu/drm/i915/intel_sprite.c +++ b/drivers/gpu/drm/i915/intel_sprite.c @@ -329,6 +329,26 @@ skl_disable_plane(struct intel_plane *plane, struct intel_crtc *crtc)  	spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);  } +bool +skl_plane_get_hw_state(struct intel_plane *plane) +{ +	struct drm_i915_private *dev_priv = to_i915(plane->base.dev); +	enum intel_display_power_domain power_domain; +	enum plane_id plane_id = plane->id; +	enum pipe pipe = plane->pipe; +	bool ret; + +	power_domain = POWER_DOMAIN_PIPE(pipe); +	if (!intel_display_power_get_if_enabled(dev_priv, power_domain)) +		return false; + +	ret = I915_READ(PLANE_CTL(pipe, plane_id)) & PLANE_CTL_ENABLE; + +	intel_display_power_put(dev_priv, power_domain); + +	return ret; +} +  static void  chv_update_csc(struct intel_plane *plane, uint32_t format)  { @@ -506,6 +526,26 @@ vlv_disable_plane(struct intel_plane *plane, struct intel_crtc *crtc)  	spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);  } +static bool +vlv_plane_get_hw_state(struct intel_plane *plane) +{ +	struct drm_i915_private *dev_priv = to_i915(plane->base.dev); +	enum intel_display_power_domain power_domain; +	enum plane_id plane_id = plane->id; +	enum pipe pipe = plane->pipe; +	bool ret; + +	power_domain = POWER_DOMAIN_PIPE(pipe); +	if (!intel_display_power_get_if_enabled(dev_priv, power_domain)) +		return false; + +	ret = I915_READ(SPCNTR(pipe, plane_id)) & SP_ENABLE; + +	intel_display_power_put(dev_priv, power_domain); + +	return ret; +} +  static u32 ivb_sprite_ctl(const struct intel_crtc_state *crtc_state,  			  const struct intel_plane_state *plane_state)  { @@ -646,6 +686,25 @@ ivb_disable_plane(struct intel_plane *plane, struct intel_crtc *crtc)  	spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);  } +static bool +ivb_plane_get_hw_state(struct intel_plane *plane) +{ +	struct drm_i915_private *dev_priv = to_i915(plane->base.dev); +	enum intel_display_power_domain power_domain; +	enum pipe pipe = plane->pipe; +	bool ret; + +	power_domain = POWER_DOMAIN_PIPE(pipe); +	if (!intel_display_power_get_if_enabled(dev_priv, power_domain)) +		return false; + +	ret =  I915_READ(SPRCTL(pipe)) & SPRITE_ENABLE; + +	intel_display_power_put(dev_priv, power_domain); + +	return ret; +} +  static u32 g4x_sprite_ctl(const struct intel_crtc_state *crtc_state,  			  const struct intel_plane_state *plane_state)  { @@ -777,6 +836,25 @@ g4x_disable_plane(struct intel_plane *plane, struct intel_crtc *crtc)  	spin_unlock_irqrestore(&dev_priv->uncore.lock, irqflags);  } +static bool +g4x_plane_get_hw_state(struct intel_plane *plane) +{ +	struct drm_i915_private *dev_priv = to_i915(plane->base.dev); +	enum intel_display_power_domain power_domain; +	enum pipe pipe = plane->pipe; +	bool ret; + +	power_domain = POWER_DOMAIN_PIPE(pipe); +	if (!intel_display_power_get_if_enabled(dev_priv, power_domain)) +		return false; + +	ret = I915_READ(DVSCNTR(pipe)) & DVS_ENABLE; + +	intel_display_power_put(dev_priv, power_domain); + +	return ret; +} +  static int  intel_check_sprite_plane(struct intel_plane *plane,  			 struct intel_crtc_state *crtc_state, @@ -1232,6 +1310,7 @@ intel_sprite_plane_create(struct drm_i915_private *dev_priv,  		intel_plane->update_plane = skl_update_plane;  		intel_plane->disable_plane = skl_disable_plane; +		intel_plane->get_hw_state = skl_plane_get_hw_state;  		plane_formats = skl_plane_formats;  		num_plane_formats = ARRAY_SIZE(skl_plane_formats); @@ -1242,6 +1321,7 @@ intel_sprite_plane_create(struct drm_i915_private *dev_priv,  		intel_plane->update_plane = skl_update_plane;  		intel_plane->disable_plane = skl_disable_plane; +		intel_plane->get_hw_state = skl_plane_get_hw_state;  		plane_formats = skl_plane_formats;  		num_plane_formats = ARRAY_SIZE(skl_plane_formats); @@ -1252,6 +1332,7 @@ intel_sprite_plane_create(struct drm_i915_private *dev_priv,  		intel_plane->update_plane = vlv_update_plane;  		intel_plane->disable_plane = vlv_disable_plane; +		intel_plane->get_hw_state = vlv_plane_get_hw_state;  		plane_formats = vlv_plane_formats;  		num_plane_formats = ARRAY_SIZE(vlv_plane_formats); @@ -1267,6 +1348,7 @@ intel_sprite_plane_create(struct drm_i915_private *dev_priv,  		intel_plane->update_plane = ivb_update_plane;  		intel_plane->disable_plane = ivb_disable_plane; +		intel_plane->get_hw_state = ivb_plane_get_hw_state;  		plane_formats = snb_plane_formats;  		num_plane_formats = ARRAY_SIZE(snb_plane_formats); @@ -1277,6 +1359,7 @@ intel_sprite_plane_create(struct drm_i915_private *dev_priv,  		intel_plane->update_plane = g4x_update_plane;  		intel_plane->disable_plane = g4x_disable_plane; +		intel_plane->get_hw_state = g4x_plane_get_hw_state;  		modifiers = i9xx_plane_format_modifiers;  		if (IS_GEN6(dev_priv)) {  |