drm/i915: Use the disable callback for disabling planes.
This allows disabling all planes affecting a crtc without caring what type it is. Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com> Reviewed-by: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
parent
a8ad0d8e17
commit
27321ae88c
@ -238,6 +238,11 @@ enum hpd_pin {
|
|||||||
#define for_each_crtc(dev, crtc) \
|
#define for_each_crtc(dev, crtc) \
|
||||||
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head)
|
list_for_each_entry(crtc, &dev->mode_config.crtc_list, head)
|
||||||
|
|
||||||
|
#define for_each_intel_plane(dev, intel_plane) \
|
||||||
|
list_for_each_entry(intel_plane, \
|
||||||
|
&dev->mode_config.plane_list, \
|
||||||
|
base.head)
|
||||||
|
|
||||||
#define for_each_intel_crtc(dev, intel_crtc) \
|
#define for_each_intel_crtc(dev, intel_crtc) \
|
||||||
list_for_each_entry(intel_crtc, &dev->mode_config.crtc_list, base.head)
|
list_for_each_entry(intel_crtc, &dev->mode_config.crtc_list, base.head)
|
||||||
|
|
||||||
|
@ -2254,32 +2254,6 @@ static void intel_enable_primary_hw_plane(struct drm_plane *plane,
|
|||||||
intel_wait_for_vblank(dev, intel_crtc->pipe);
|
intel_wait_for_vblank(dev, intel_crtc->pipe);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* intel_disable_primary_hw_plane - disable the primary hardware plane
|
|
||||||
* @plane: plane to be disabled
|
|
||||||
* @crtc: crtc for the plane
|
|
||||||
*
|
|
||||||
* Disable @plane on @crtc, making sure that the pipe is running first.
|
|
||||||
*/
|
|
||||||
static void intel_disable_primary_hw_plane(struct drm_plane *plane,
|
|
||||||
struct drm_crtc *crtc)
|
|
||||||
{
|
|
||||||
struct drm_device *dev = plane->dev;
|
|
||||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
|
||||||
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
|
|
||||||
|
|
||||||
if (WARN_ON(!intel_crtc->active))
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (!intel_crtc->primary_enabled)
|
|
||||||
return;
|
|
||||||
|
|
||||||
intel_crtc->primary_enabled = false;
|
|
||||||
|
|
||||||
dev_priv->display.update_primary_plane(crtc, plane->fb,
|
|
||||||
crtc->x, crtc->y);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool need_vtd_wa(struct drm_device *dev)
|
static bool need_vtd_wa(struct drm_device *dev)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_INTEL_IOMMU
|
#ifdef CONFIG_INTEL_IOMMU
|
||||||
@ -4645,38 +4619,6 @@ static void intel_enable_sprite_planes(struct drm_crtc *crtc)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Disable a plane internally without actually modifying the plane's state.
|
|
||||||
* This will allow us to easily restore the plane later by just reprogramming
|
|
||||||
* its state.
|
|
||||||
*/
|
|
||||||
static void disable_plane_internal(struct drm_plane *plane)
|
|
||||||
{
|
|
||||||
struct intel_plane *intel_plane = to_intel_plane(plane);
|
|
||||||
struct drm_plane_state *state =
|
|
||||||
plane->funcs->atomic_duplicate_state(plane);
|
|
||||||
struct intel_plane_state *intel_state = to_intel_plane_state(state);
|
|
||||||
|
|
||||||
intel_state->visible = false;
|
|
||||||
intel_plane->commit_plane(plane, intel_state);
|
|
||||||
|
|
||||||
intel_plane_destroy_state(plane, state);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void intel_disable_sprite_planes(struct drm_crtc *crtc)
|
|
||||||
{
|
|
||||||
struct drm_device *dev = crtc->dev;
|
|
||||||
enum pipe pipe = to_intel_crtc(crtc)->pipe;
|
|
||||||
struct drm_plane *plane;
|
|
||||||
struct intel_plane *intel_plane;
|
|
||||||
|
|
||||||
drm_for_each_legacy_plane(plane, &dev->mode_config.plane_list) {
|
|
||||||
intel_plane = to_intel_plane(plane);
|
|
||||||
if (plane->fb && intel_plane->pipe == pipe)
|
|
||||||
disable_plane_internal(plane);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void hsw_enable_ips(struct intel_crtc *crtc)
|
void hsw_enable_ips(struct intel_crtc *crtc)
|
||||||
{
|
{
|
||||||
struct drm_device *dev = crtc->base.dev;
|
struct drm_device *dev = crtc->base.dev;
|
||||||
@ -4830,6 +4772,7 @@ static void intel_crtc_disable_planes(struct drm_crtc *crtc)
|
|||||||
struct drm_device *dev = crtc->dev;
|
struct drm_device *dev = crtc->dev;
|
||||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||||
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
|
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
|
||||||
|
struct intel_plane *intel_plane;
|
||||||
int pipe = intel_crtc->pipe;
|
int pipe = intel_crtc->pipe;
|
||||||
|
|
||||||
intel_crtc_wait_for_pending_flips(crtc);
|
intel_crtc_wait_for_pending_flips(crtc);
|
||||||
@ -4840,9 +4783,15 @@ static void intel_crtc_disable_planes(struct drm_crtc *crtc)
|
|||||||
hsw_disable_ips(intel_crtc);
|
hsw_disable_ips(intel_crtc);
|
||||||
|
|
||||||
intel_crtc_dpms_overlay(intel_crtc, false);
|
intel_crtc_dpms_overlay(intel_crtc, false);
|
||||||
intel_crtc_update_cursor(crtc, false);
|
intel_crtc->primary_enabled = false;
|
||||||
intel_disable_sprite_planes(crtc);
|
for_each_intel_plane(dev, intel_plane) {
|
||||||
intel_disable_primary_hw_plane(crtc->primary, crtc);
|
if (intel_plane->pipe == pipe) {
|
||||||
|
struct drm_crtc *from = intel_plane->base.crtc;
|
||||||
|
|
||||||
|
intel_plane->disable_plane(&intel_plane->base,
|
||||||
|
from ?: crtc, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FIXME: Once we grow proper nuclear flip support out of this we need
|
* FIXME: Once we grow proper nuclear flip support out of this we need
|
||||||
@ -13357,24 +13306,14 @@ intel_commit_primary_plane(struct drm_plane *plane,
|
|||||||
crtc->y = src->y1 >> 16;
|
crtc->y = src->y1 >> 16;
|
||||||
|
|
||||||
if (intel_crtc->active) {
|
if (intel_crtc->active) {
|
||||||
if (state->visible) {
|
intel_crtc->primary_enabled = state->visible;
|
||||||
|
|
||||||
|
if (state->visible)
|
||||||
/* FIXME: kill this fastboot hack */
|
/* FIXME: kill this fastboot hack */
|
||||||
intel_update_pipe_size(intel_crtc);
|
intel_update_pipe_size(intel_crtc);
|
||||||
|
|
||||||
intel_crtc->primary_enabled = true;
|
dev_priv->display.update_primary_plane(crtc, plane->fb,
|
||||||
|
crtc->x, crtc->y);
|
||||||
dev_priv->display.update_primary_plane(crtc, plane->fb,
|
|
||||||
crtc->x, crtc->y);
|
|
||||||
} else {
|
|
||||||
/*
|
|
||||||
* If clipping results in a non-visible primary plane,
|
|
||||||
* we'll disable the primary plane. Note that this is
|
|
||||||
* a bit different than what happens if userspace
|
|
||||||
* explicitly disables the plane by passing fb=0
|
|
||||||
* because plane->fb still gets set and pinned.
|
|
||||||
*/
|
|
||||||
intel_disable_primary_hw_plane(plane, crtc);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user