Commit 5c3fe8b0 authored by Ben Widawsky's avatar Ben Widawsky Committed by Daniel Vetter

drm/i915: Move fbc members out of line

Signed-off-by: default avatarBen Widawsky <ben@bwidawsk.net>
[danvet: Resolve conflict with Damien's FBC_CHIP_DEFAULT no fbc
reason.]
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent b2f21b4d
...@@ -1492,7 +1492,7 @@ static int i915_fbc_status(struct seq_file *m, void *unused) ...@@ -1492,7 +1492,7 @@ static int i915_fbc_status(struct seq_file *m, void *unused)
seq_puts(m, "FBC enabled\n"); seq_puts(m, "FBC enabled\n");
} else { } else {
seq_puts(m, "FBC disabled: "); seq_puts(m, "FBC disabled: ");
switch (dev_priv->no_fbc_reason) { switch (dev_priv->fbc.no_fbc_reason) {
case FBC_NO_OUTPUT: case FBC_NO_OUTPUT:
seq_puts(m, "no outputs"); seq_puts(m, "no outputs");
break; break;
......
...@@ -528,18 +528,36 @@ struct i915_hw_context { ...@@ -528,18 +528,36 @@ struct i915_hw_context {
struct i915_ctx_hang_stats hang_stats; struct i915_ctx_hang_stats hang_stats;
}; };
enum no_fbc_reason { struct i915_fbc {
FBC_NO_OUTPUT, /* no outputs enabled to compress */ unsigned long size;
FBC_STOLEN_TOO_SMALL, /* not enough space to hold compressed buffers */ unsigned int fb_id;
FBC_UNSUPPORTED_MODE, /* interlace or doublescanned mode */ enum plane plane;
FBC_MODE_TOO_LARGE, /* mode too large for compression */ int y;
FBC_BAD_PLANE, /* fbc not supported on plane */
FBC_NOT_TILED, /* buffer not tiled */ struct drm_mm_node *compressed_fb;
FBC_MULTIPLE_PIPES, /* more than one pipe active */ struct drm_mm_node *compressed_llb;
FBC_MODULE_PARAM,
FBC_CHIP_DEFAULT, /* disabled by default on this chip */ struct intel_fbc_work {
struct delayed_work work;
struct drm_crtc *crtc;
struct drm_framebuffer *fb;
int interval;
} *fbc_work;
enum {
FBC_NO_OUTPUT, /* no outputs enabled to compress */
FBC_STOLEN_TOO_SMALL, /* not enough space for buffers */
FBC_UNSUPPORTED_MODE, /* interlace or doublescanned mode */
FBC_MODE_TOO_LARGE, /* mode too large for compression */
FBC_BAD_PLANE, /* fbc not supported on plane */
FBC_NOT_TILED, /* buffer not tiled */
FBC_MULTIPLE_PIPES, /* more than one pipe active */
FBC_MODULE_PARAM,
FBC_CHIP_DEFAULT, /* disabled by default on this chip */
} no_fbc_reason;
}; };
enum intel_pch { enum intel_pch {
PCH_NONE = 0, /* No PCH present */ PCH_NONE = 0, /* No PCH present */
PCH_IBX, /* Ibexpeak PCH */ PCH_IBX, /* Ibexpeak PCH */
...@@ -1059,12 +1077,7 @@ typedef struct drm_i915_private { ...@@ -1059,12 +1077,7 @@ typedef struct drm_i915_private {
int num_plane; int num_plane;
unsigned long cfb_size; struct i915_fbc fbc;
unsigned int cfb_fb;
enum plane cfb_plane;
int cfb_y;
struct intel_fbc_work *fbc_work;
struct intel_opregion opregion; struct intel_opregion opregion;
struct intel_vbt_data vbt; struct intel_vbt_data vbt;
...@@ -1142,11 +1155,6 @@ typedef struct drm_i915_private { ...@@ -1142,11 +1155,6 @@ typedef struct drm_i915_private {
/* Haswell power well */ /* Haswell power well */
struct i915_power_well power_well; struct i915_power_well power_well;
enum no_fbc_reason no_fbc_reason;
struct drm_mm_node *compressed_fb;
struct drm_mm_node *compressed_llb;
struct i915_gpu_error gpu_error; struct i915_gpu_error gpu_error;
struct drm_i915_gem_object *vlv_pctx; struct drm_i915_gem_object *vlv_pctx;
......
...@@ -120,7 +120,7 @@ static int i915_setup_compression(struct drm_device *dev, int size) ...@@ -120,7 +120,7 @@ static int i915_setup_compression(struct drm_device *dev, int size)
if (!compressed_llb) if (!compressed_llb)
goto err_fb; goto err_fb;
dev_priv->compressed_llb = compressed_llb; dev_priv->fbc.compressed_llb = compressed_llb;
I915_WRITE(FBC_CFB_BASE, I915_WRITE(FBC_CFB_BASE,
dev_priv->mm.stolen_base + compressed_fb->start); dev_priv->mm.stolen_base + compressed_fb->start);
...@@ -128,8 +128,8 @@ static int i915_setup_compression(struct drm_device *dev, int size) ...@@ -128,8 +128,8 @@ static int i915_setup_compression(struct drm_device *dev, int size)
dev_priv->mm.stolen_base + compressed_llb->start); dev_priv->mm.stolen_base + compressed_llb->start);
} }
dev_priv->compressed_fb = compressed_fb; dev_priv->fbc.compressed_fb = compressed_fb;
dev_priv->cfb_size = size; dev_priv->fbc.size = size;
DRM_DEBUG_KMS("reserved %d bytes of contiguous stolen space for FBC\n", DRM_DEBUG_KMS("reserved %d bytes of contiguous stolen space for FBC\n",
size); size);
...@@ -150,7 +150,7 @@ int i915_gem_stolen_setup_compression(struct drm_device *dev, int size) ...@@ -150,7 +150,7 @@ int i915_gem_stolen_setup_compression(struct drm_device *dev, int size)
if (dev_priv->mm.stolen_base == 0) if (dev_priv->mm.stolen_base == 0)
return -ENODEV; return -ENODEV;
if (size < dev_priv->cfb_size) if (size < dev_priv->fbc.size)
return 0; return 0;
/* Release any current block */ /* Release any current block */
...@@ -163,16 +163,16 @@ void i915_gem_stolen_cleanup_compression(struct drm_device *dev) ...@@ -163,16 +163,16 @@ void i915_gem_stolen_cleanup_compression(struct drm_device *dev)
{ {
struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_private *dev_priv = dev->dev_private;
if (dev_priv->cfb_size == 0) if (dev_priv->fbc.size == 0)
return; return;
if (dev_priv->compressed_fb) if (dev_priv->fbc.compressed_fb)
drm_mm_put_block(dev_priv->compressed_fb); drm_mm_put_block(dev_priv->fbc.compressed_fb);
if (dev_priv->compressed_llb) if (dev_priv->fbc.compressed_llb)
drm_mm_put_block(dev_priv->compressed_llb); drm_mm_put_block(dev_priv->fbc.compressed_llb);
dev_priv->cfb_size = 0; dev_priv->fbc.size = 0;
} }
void i915_gem_cleanup_stolen(struct drm_device *dev) void i915_gem_cleanup_stolen(struct drm_device *dev)
......
...@@ -3408,7 +3408,7 @@ static void ironlake_crtc_disable(struct drm_crtc *crtc) ...@@ -3408,7 +3408,7 @@ static void ironlake_crtc_disable(struct drm_crtc *crtc)
intel_crtc_wait_for_pending_flips(crtc); intel_crtc_wait_for_pending_flips(crtc);
drm_vblank_off(dev, pipe); drm_vblank_off(dev, pipe);
if (dev_priv->cfb_plane == plane) if (dev_priv->fbc.plane == plane)
intel_disable_fbc(dev); intel_disable_fbc(dev);
intel_crtc_update_cursor(crtc, false); intel_crtc_update_cursor(crtc, false);
...@@ -3481,7 +3481,7 @@ static void haswell_crtc_disable(struct drm_crtc *crtc) ...@@ -3481,7 +3481,7 @@ static void haswell_crtc_disable(struct drm_crtc *crtc)
drm_vblank_off(dev, pipe); drm_vblank_off(dev, pipe);
/* FBC must be disabled before disabling the plane on HSW. */ /* FBC must be disabled before disabling the plane on HSW. */
if (dev_priv->cfb_plane == plane) if (dev_priv->fbc.plane == plane)
intel_disable_fbc(dev); intel_disable_fbc(dev);
hsw_disable_ips(intel_crtc); hsw_disable_ips(intel_crtc);
...@@ -3720,7 +3720,7 @@ static void i9xx_crtc_disable(struct drm_crtc *crtc) ...@@ -3720,7 +3720,7 @@ static void i9xx_crtc_disable(struct drm_crtc *crtc)
intel_crtc_wait_for_pending_flips(crtc); intel_crtc_wait_for_pending_flips(crtc);
drm_vblank_off(dev, pipe); drm_vblank_off(dev, pipe);
if (dev_priv->cfb_plane == plane) if (dev_priv->fbc.plane == plane)
intel_disable_fbc(dev); intel_disable_fbc(dev);
intel_crtc_dpms_overlay(intel_crtc, false); intel_crtc_dpms_overlay(intel_crtc, false);
......
...@@ -549,13 +549,6 @@ struct intel_unpin_work { ...@@ -549,13 +549,6 @@ struct intel_unpin_work {
bool enable_stall_check; bool enable_stall_check;
}; };
struct intel_fbc_work {
struct delayed_work work;
struct drm_crtc *crtc;
struct drm_framebuffer *fb;
int interval;
};
int intel_pch_rawclk(struct drm_device *dev); int intel_pch_rawclk(struct drm_device *dev);
int intel_connector_update_modes(struct drm_connector *connector, int intel_connector_update_modes(struct drm_connector *connector,
......
...@@ -87,7 +87,7 @@ static void i8xx_enable_fbc(struct drm_crtc *crtc, unsigned long interval) ...@@ -87,7 +87,7 @@ static void i8xx_enable_fbc(struct drm_crtc *crtc, unsigned long interval)
int plane, i; int plane, i;
u32 fbc_ctl, fbc_ctl2; u32 fbc_ctl, fbc_ctl2;
cfb_pitch = dev_priv->cfb_size / FBC_LL_SIZE; cfb_pitch = dev_priv->fbc.size / FBC_LL_SIZE;
if (fb->pitches[0] < cfb_pitch) if (fb->pitches[0] < cfb_pitch)
cfb_pitch = fb->pitches[0]; cfb_pitch = fb->pitches[0];
...@@ -326,7 +326,7 @@ static void intel_fbc_work_fn(struct work_struct *__work) ...@@ -326,7 +326,7 @@ static void intel_fbc_work_fn(struct work_struct *__work)
struct drm_i915_private *dev_priv = dev->dev_private; struct drm_i915_private *dev_priv = dev->dev_private;
mutex_lock(&dev->struct_mutex); mutex_lock(&dev->struct_mutex);
if (work == dev_priv->fbc_work) { if (work == dev_priv->fbc.fbc_work) {
/* Double check that we haven't switched fb without cancelling /* Double check that we haven't switched fb without cancelling
* the prior work. * the prior work.
*/ */
...@@ -334,12 +334,12 @@ static void intel_fbc_work_fn(struct work_struct *__work) ...@@ -334,12 +334,12 @@ static void intel_fbc_work_fn(struct work_struct *__work)
dev_priv->display.enable_fbc(work->crtc, dev_priv->display.enable_fbc(work->crtc,
work->interval); work->interval);
dev_priv->cfb_plane = to_intel_crtc(work->crtc)->plane; dev_priv->fbc.plane = to_intel_crtc(work->crtc)->plane;
dev_priv->cfb_fb = work->crtc->fb->base.id; dev_priv->fbc.fb_id = work->crtc->fb->base.id;
dev_priv->cfb_y = work->crtc->y; dev_priv->fbc.y = work->crtc->y;
} }
dev_priv->fbc_work = NULL; dev_priv->fbc.fbc_work = NULL;
} }
mutex_unlock(&dev->struct_mutex); mutex_unlock(&dev->struct_mutex);
...@@ -348,25 +348,25 @@ static void intel_fbc_work_fn(struct work_struct *__work) ...@@ -348,25 +348,25 @@ static void intel_fbc_work_fn(struct work_struct *__work)
static void intel_cancel_fbc_work(struct drm_i915_private *dev_priv) static void intel_cancel_fbc_work(struct drm_i915_private *dev_priv)
{ {
if (dev_priv->fbc_work == NULL) if (dev_priv->fbc.fbc_work == NULL)
return; return;
DRM_DEBUG_KMS("cancelling pending FBC enable\n"); DRM_DEBUG_KMS("cancelling pending FBC enable\n");
/* Synchronisation is provided by struct_mutex and checking of /* Synchronisation is provided by struct_mutex and checking of
* dev_priv->fbc_work, so we can perform the cancellation * dev_priv->fbc.fbc_work, so we can perform the cancellation
* entirely asynchronously. * entirely asynchronously.
*/ */
if (cancel_delayed_work(&dev_priv->fbc_work->work)) if (cancel_delayed_work(&dev_priv->fbc.fbc_work->work))
/* tasklet was killed before being run, clean up */ /* tasklet was killed before being run, clean up */
kfree(dev_priv->fbc_work); kfree(dev_priv->fbc.fbc_work);
/* Mark the work as no longer wanted so that if it does /* Mark the work as no longer wanted so that if it does
* wake-up (because the work was already running and waiting * wake-up (because the work was already running and waiting
* for our mutex), it will discover that is no longer * for our mutex), it will discover that is no longer
* necessary to run. * necessary to run.
*/ */
dev_priv->fbc_work = NULL; dev_priv->fbc.fbc_work = NULL;
} }
static void intel_enable_fbc(struct drm_crtc *crtc, unsigned long interval) static void intel_enable_fbc(struct drm_crtc *crtc, unsigned long interval)
...@@ -392,7 +392,7 @@ static void intel_enable_fbc(struct drm_crtc *crtc, unsigned long interval) ...@@ -392,7 +392,7 @@ static void intel_enable_fbc(struct drm_crtc *crtc, unsigned long interval)
work->interval = interval; work->interval = interval;
INIT_DELAYED_WORK(&work->work, intel_fbc_work_fn); INIT_DELAYED_WORK(&work->work, intel_fbc_work_fn);
dev_priv->fbc_work = work; dev_priv->fbc.fbc_work = work;
/* Delay the actual enabling to let pageflipping cease and the /* Delay the actual enabling to let pageflipping cease and the
* display to settle before starting the compression. Note that * display to settle before starting the compression. Note that
...@@ -418,7 +418,7 @@ void intel_disable_fbc(struct drm_device *dev) ...@@ -418,7 +418,7 @@ void intel_disable_fbc(struct drm_device *dev)
return; return;
dev_priv->display.disable_fbc(dev); dev_priv->display.disable_fbc(dev);
dev_priv->cfb_plane = -1; dev_priv->fbc.plane = -1;
} }
/** /**
...@@ -470,7 +470,8 @@ void intel_update_fbc(struct drm_device *dev) ...@@ -470,7 +470,8 @@ void intel_update_fbc(struct drm_device *dev)
!to_intel_crtc(tmp_crtc)->primary_disabled) { !to_intel_crtc(tmp_crtc)->primary_disabled) {
if (crtc) { if (crtc) {
DRM_DEBUG_KMS("more than one pipe active, disabling compression\n"); DRM_DEBUG_KMS("more than one pipe active, disabling compression\n");
dev_priv->no_fbc_reason = FBC_MULTIPLE_PIPES; dev_priv->fbc.no_fbc_reason =
FBC_MULTIPLE_PIPES;
goto out_disable; goto out_disable;
} }
crtc = tmp_crtc; crtc = tmp_crtc;
...@@ -479,7 +480,7 @@ void intel_update_fbc(struct drm_device *dev) ...@@ -479,7 +480,7 @@ void intel_update_fbc(struct drm_device *dev)
if (!crtc || crtc->fb == NULL) { if (!crtc || crtc->fb == NULL) {
DRM_DEBUG_KMS("no output, disabling\n"); DRM_DEBUG_KMS("no output, disabling\n");
dev_priv->no_fbc_reason = FBC_NO_OUTPUT; dev_priv->fbc.no_fbc_reason = FBC_NO_OUTPUT;
goto out_disable; goto out_disable;
} }
...@@ -491,19 +492,19 @@ void intel_update_fbc(struct drm_device *dev) ...@@ -491,19 +492,19 @@ void intel_update_fbc(struct drm_device *dev)
if (i915_enable_fbc < 0 && if (i915_enable_fbc < 0 &&
INTEL_INFO(dev)->gen <= 7 && !IS_HASWELL(dev)) { INTEL_INFO(dev)->gen <= 7 && !IS_HASWELL(dev)) {
DRM_DEBUG_KMS("disabled per chip default\n"); DRM_DEBUG_KMS("disabled per chip default\n");
dev_priv->no_fbc_reason = FBC_CHIP_DEFAULT; dev_priv->fbc.no_fbc_reason = FBC_CHIP_DEFAULT;
goto out_disable; goto out_disable;
} }
if (!i915_enable_fbc) { if (!i915_enable_fbc) {
DRM_DEBUG_KMS("fbc disabled per module param\n"); DRM_DEBUG_KMS("fbc disabled per module param\n");
dev_priv->no_fbc_reason = FBC_MODULE_PARAM; dev_priv->fbc.no_fbc_reason = FBC_MODULE_PARAM;
goto out_disable; goto out_disable;
} }
if ((crtc->mode.flags & DRM_MODE_FLAG_INTERLACE) || if ((crtc->mode.flags & DRM_MODE_FLAG_INTERLACE) ||
(crtc->mode.flags & DRM_MODE_FLAG_DBLSCAN)) { (crtc->mode.flags & DRM_MODE_FLAG_DBLSCAN)) {
DRM_DEBUG_KMS("mode incompatible with compression, " DRM_DEBUG_KMS("mode incompatible with compression, "
"disabling\n"); "disabling\n");
dev_priv->no_fbc_reason = FBC_UNSUPPORTED_MODE; dev_priv->fbc.no_fbc_reason = FBC_UNSUPPORTED_MODE;
goto out_disable; goto out_disable;
} }
...@@ -517,13 +518,13 @@ void intel_update_fbc(struct drm_device *dev) ...@@ -517,13 +518,13 @@ void intel_update_fbc(struct drm_device *dev)
if ((crtc->mode.hdisplay > max_hdisplay) || if ((crtc->mode.hdisplay > max_hdisplay) ||
(crtc->mode.vdisplay > max_vdisplay)) { (crtc->mode.vdisplay > max_vdisplay)) {
DRM_DEBUG_KMS("mode too large for compression, disabling\n"); DRM_DEBUG_KMS("mode too large for compression, disabling\n");
dev_priv->no_fbc_reason = FBC_MODE_TOO_LARGE; dev_priv->fbc.no_fbc_reason = FBC_MODE_TOO_LARGE;
goto out_disable; goto out_disable;
} }
if ((IS_I915GM(dev) || IS_I945GM(dev) || IS_HASWELL(dev)) && if ((IS_I915GM(dev) || IS_I945GM(dev) || IS_HASWELL(dev)) &&
intel_crtc->plane != 0) { intel_crtc->plane != 0) {
DRM_DEBUG_KMS("plane not 0, disabling compression\n"); DRM_DEBUG_KMS("plane not 0, disabling compression\n");
dev_priv->no_fbc_reason = FBC_BAD_PLANE; dev_priv->fbc.no_fbc_reason = FBC_BAD_PLANE;
goto out_disable; goto out_disable;
} }
...@@ -533,7 +534,7 @@ void intel_update_fbc(struct drm_device *dev) ...@@ -533,7 +534,7 @@ void intel_update_fbc(struct drm_device *dev)
if (obj->tiling_mode != I915_TILING_X || if (obj->tiling_mode != I915_TILING_X ||
obj->fence_reg == I915_FENCE_REG_NONE) { obj->fence_reg == I915_FENCE_REG_NONE) {
DRM_DEBUG_KMS("framebuffer not tiled or fenced, disabling compression\n"); DRM_DEBUG_KMS("framebuffer not tiled or fenced, disabling compression\n");
dev_priv->no_fbc_reason = FBC_NOT_TILED; dev_priv->fbc.no_fbc_reason = FBC_NOT_TILED;
goto out_disable; goto out_disable;
} }
...@@ -543,7 +544,7 @@ void intel_update_fbc(struct drm_device *dev) ...@@ -543,7 +544,7 @@ void intel_update_fbc(struct drm_device *dev)
if (i915_gem_stolen_setup_compression(dev, intel_fb->obj->base.size)) { if (i915_gem_stolen_setup_compression(dev, intel_fb->obj->base.size)) {
DRM_DEBUG_KMS("framebuffer too large, disabling compression\n"); DRM_DEBUG_KMS("framebuffer too large, disabling compression\n");
dev_priv->no_fbc_reason = FBC_STOLEN_TOO_SMALL; dev_priv->fbc.no_fbc_reason = FBC_STOLEN_TOO_SMALL;
goto out_disable; goto out_disable;
} }
...@@ -552,9 +553,9 @@ void intel_update_fbc(struct drm_device *dev) ...@@ -552,9 +553,9 @@ void intel_update_fbc(struct drm_device *dev)
* cannot be unpinned (and have its GTT offset and fence revoked) * cannot be unpinned (and have its GTT offset and fence revoked)
* without first being decoupled from the scanout and FBC disabled. * without first being decoupled from the scanout and FBC disabled.
*/ */
if (dev_priv->cfb_plane == intel_crtc->plane && if (dev_priv->fbc.plane == intel_crtc->plane &&
dev_priv->cfb_fb == fb->base.id && dev_priv->fbc.fb_id == fb->base.id &&
dev_priv->cfb_y == crtc->y) dev_priv->fbc.y == crtc->y)
return; return;
if (intel_fbc_enabled(dev)) { if (intel_fbc_enabled(dev)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment