drm/i915: Move fbc members out of line
Signed-off-by: Ben Widawsky <ben@bwidawsk.net> [danvet: Resolve conflict with Damien's FBC_CHIP_DEFAULT no fbc reason.] Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
Родитель
b2f21b4dfd
Коммит
5c3fe8b03e
|
@ -1492,7 +1492,7 @@ static int i915_fbc_status(struct seq_file *m, void *unused)
|
|||
seq_puts(m, "FBC enabled\n");
|
||||
} else {
|
||||
seq_puts(m, "FBC disabled: ");
|
||||
switch (dev_priv->no_fbc_reason) {
|
||||
switch (dev_priv->fbc.no_fbc_reason) {
|
||||
case FBC_NO_OUTPUT:
|
||||
seq_puts(m, "no outputs");
|
||||
break;
|
||||
|
|
|
@ -528,18 +528,36 @@ struct i915_hw_context {
|
|||
struct i915_ctx_hang_stats hang_stats;
|
||||
};
|
||||
|
||||
enum no_fbc_reason {
|
||||
FBC_NO_OUTPUT, /* no outputs enabled to compress */
|
||||
FBC_STOLEN_TOO_SMALL, /* not enough space to hold compressed 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 */
|
||||
struct i915_fbc {
|
||||
unsigned long size;
|
||||
unsigned int fb_id;
|
||||
enum plane plane;
|
||||
int y;
|
||||
|
||||
struct drm_mm_node *compressed_fb;
|
||||
struct drm_mm_node *compressed_llb;
|
||||
|
||||
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 {
|
||||
PCH_NONE = 0, /* No PCH present */
|
||||
PCH_IBX, /* Ibexpeak PCH */
|
||||
|
@ -1059,12 +1077,7 @@ typedef struct drm_i915_private {
|
|||
|
||||
int num_plane;
|
||||
|
||||
unsigned long cfb_size;
|
||||
unsigned int cfb_fb;
|
||||
enum plane cfb_plane;
|
||||
int cfb_y;
|
||||
struct intel_fbc_work *fbc_work;
|
||||
|
||||
struct i915_fbc fbc;
|
||||
struct intel_opregion opregion;
|
||||
struct intel_vbt_data vbt;
|
||||
|
||||
|
@ -1142,11 +1155,6 @@ typedef struct drm_i915_private {
|
|||
/* Haswell 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 drm_i915_gem_object *vlv_pctx;
|
||||
|
|
|
@ -120,7 +120,7 @@ static int i915_setup_compression(struct drm_device *dev, int size)
|
|||
if (!compressed_llb)
|
||||
goto err_fb;
|
||||
|
||||
dev_priv->compressed_llb = compressed_llb;
|
||||
dev_priv->fbc.compressed_llb = compressed_llb;
|
||||
|
||||
I915_WRITE(FBC_CFB_BASE,
|
||||
dev_priv->mm.stolen_base + compressed_fb->start);
|
||||
|
@ -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->compressed_fb = compressed_fb;
|
||||
dev_priv->cfb_size = size;
|
||||
dev_priv->fbc.compressed_fb = compressed_fb;
|
||||
dev_priv->fbc.size = size;
|
||||
|
||||
DRM_DEBUG_KMS("reserved %d bytes of contiguous stolen space for FBC\n",
|
||||
size);
|
||||
|
@ -150,7 +150,7 @@ int i915_gem_stolen_setup_compression(struct drm_device *dev, int size)
|
|||
if (dev_priv->mm.stolen_base == 0)
|
||||
return -ENODEV;
|
||||
|
||||
if (size < dev_priv->cfb_size)
|
||||
if (size < dev_priv->fbc.size)
|
||||
return 0;
|
||||
|
||||
/* Release any current block */
|
||||
|
@ -163,16 +163,16 @@ void i915_gem_stolen_cleanup_compression(struct drm_device *dev)
|
|||
{
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
|
||||
if (dev_priv->cfb_size == 0)
|
||||
if (dev_priv->fbc.size == 0)
|
||||
return;
|
||||
|
||||
if (dev_priv->compressed_fb)
|
||||
drm_mm_put_block(dev_priv->compressed_fb);
|
||||
if (dev_priv->fbc.compressed_fb)
|
||||
drm_mm_put_block(dev_priv->fbc.compressed_fb);
|
||||
|
||||
if (dev_priv->compressed_llb)
|
||||
drm_mm_put_block(dev_priv->compressed_llb);
|
||||
if (dev_priv->fbc.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)
|
||||
|
|
|
@ -3408,7 +3408,7 @@ static void ironlake_crtc_disable(struct drm_crtc *crtc)
|
|||
intel_crtc_wait_for_pending_flips(crtc);
|
||||
drm_vblank_off(dev, pipe);
|
||||
|
||||
if (dev_priv->cfb_plane == plane)
|
||||
if (dev_priv->fbc.plane == plane)
|
||||
intel_disable_fbc(dev);
|
||||
|
||||
intel_crtc_update_cursor(crtc, false);
|
||||
|
@ -3481,7 +3481,7 @@ static void haswell_crtc_disable(struct drm_crtc *crtc)
|
|||
drm_vblank_off(dev, pipe);
|
||||
|
||||
/* 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);
|
||||
|
||||
hsw_disable_ips(intel_crtc);
|
||||
|
@ -3720,7 +3720,7 @@ static void i9xx_crtc_disable(struct drm_crtc *crtc)
|
|||
intel_crtc_wait_for_pending_flips(crtc);
|
||||
drm_vblank_off(dev, pipe);
|
||||
|
||||
if (dev_priv->cfb_plane == plane)
|
||||
if (dev_priv->fbc.plane == plane)
|
||||
intel_disable_fbc(dev);
|
||||
|
||||
intel_crtc_dpms_overlay(intel_crtc, false);
|
||||
|
|
|
@ -549,13 +549,6 @@ struct intel_unpin_work {
|
|||
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_connector_update_modes(struct drm_connector *connector,
|
||||
|
|
|
@ -87,7 +87,7 @@ static void i8xx_enable_fbc(struct drm_crtc *crtc, unsigned long interval)
|
|||
int plane, i;
|
||||
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)
|
||||
cfb_pitch = fb->pitches[0];
|
||||
|
||||
|
@ -326,7 +326,7 @@ static void intel_fbc_work_fn(struct work_struct *__work)
|
|||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
|
||||
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
|
||||
* the prior work.
|
||||
*/
|
||||
|
@ -334,12 +334,12 @@ static void intel_fbc_work_fn(struct work_struct *__work)
|
|||
dev_priv->display.enable_fbc(work->crtc,
|
||||
work->interval);
|
||||
|
||||
dev_priv->cfb_plane = to_intel_crtc(work->crtc)->plane;
|
||||
dev_priv->cfb_fb = work->crtc->fb->base.id;
|
||||
dev_priv->cfb_y = work->crtc->y;
|
||||
dev_priv->fbc.plane = to_intel_crtc(work->crtc)->plane;
|
||||
dev_priv->fbc.fb_id = work->crtc->fb->base.id;
|
||||
dev_priv->fbc.y = work->crtc->y;
|
||||
}
|
||||
|
||||
dev_priv->fbc_work = NULL;
|
||||
dev_priv->fbc.fbc_work = NULL;
|
||||
}
|
||||
mutex_unlock(&dev->struct_mutex);
|
||||
|
||||
|
@ -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)
|
||||
{
|
||||
if (dev_priv->fbc_work == NULL)
|
||||
if (dev_priv->fbc.fbc_work == NULL)
|
||||
return;
|
||||
|
||||
DRM_DEBUG_KMS("cancelling pending FBC enable\n");
|
||||
|
||||
/* 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.
|
||||
*/
|
||||
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 */
|
||||
kfree(dev_priv->fbc_work);
|
||||
kfree(dev_priv->fbc.fbc_work);
|
||||
|
||||
/* Mark the work as no longer wanted so that if it does
|
||||
* wake-up (because the work was already running and waiting
|
||||
* for our mutex), it will discover that is no longer
|
||||
* 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)
|
||||
|
@ -392,7 +392,7 @@ static void intel_enable_fbc(struct drm_crtc *crtc, unsigned long interval)
|
|||
work->interval = interval;
|
||||
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
|
||||
* display to settle before starting the compression. Note that
|
||||
|
@ -418,7 +418,7 @@ void intel_disable_fbc(struct drm_device *dev)
|
|||
return;
|
||||
|
||||
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)
|
|||
!to_intel_crtc(tmp_crtc)->primary_disabled) {
|
||||
if (crtc) {
|
||||
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;
|
||||
}
|
||||
crtc = tmp_crtc;
|
||||
|
@ -479,7 +480,7 @@ void intel_update_fbc(struct drm_device *dev)
|
|||
|
||||
if (!crtc || crtc->fb == NULL) {
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -491,19 +492,19 @@ void intel_update_fbc(struct drm_device *dev)
|
|||
if (i915_enable_fbc < 0 &&
|
||||
INTEL_INFO(dev)->gen <= 7 && !IS_HASWELL(dev)) {
|
||||
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;
|
||||
}
|
||||
if (!i915_enable_fbc) {
|
||||
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;
|
||||
}
|
||||
if ((crtc->mode.flags & DRM_MODE_FLAG_INTERLACE) ||
|
||||
(crtc->mode.flags & DRM_MODE_FLAG_DBLSCAN)) {
|
||||
DRM_DEBUG_KMS("mode incompatible with compression, "
|
||||
"disabling\n");
|
||||
dev_priv->no_fbc_reason = FBC_UNSUPPORTED_MODE;
|
||||
dev_priv->fbc.no_fbc_reason = FBC_UNSUPPORTED_MODE;
|
||||
goto out_disable;
|
||||
}
|
||||
|
||||
|
@ -517,13 +518,13 @@ void intel_update_fbc(struct drm_device *dev)
|
|||
if ((crtc->mode.hdisplay > max_hdisplay) ||
|
||||
(crtc->mode.vdisplay > max_vdisplay)) {
|
||||
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;
|
||||
}
|
||||
if ((IS_I915GM(dev) || IS_I945GM(dev) || IS_HASWELL(dev)) &&
|
||||
intel_crtc->plane != 0) {
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -533,7 +534,7 @@ void intel_update_fbc(struct drm_device *dev)
|
|||
if (obj->tiling_mode != I915_TILING_X ||
|
||||
obj->fence_reg == I915_FENCE_REG_NONE) {
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -543,7 +544,7 @@ void intel_update_fbc(struct drm_device *dev)
|
|||
|
||||
if (i915_gem_stolen_setup_compression(dev, intel_fb->obj->base.size)) {
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -552,9 +553,9 @@ void intel_update_fbc(struct drm_device *dev)
|
|||
* cannot be unpinned (and have its GTT offset and fence revoked)
|
||||
* without first being decoupled from the scanout and FBC disabled.
|
||||
*/
|
||||
if (dev_priv->cfb_plane == intel_crtc->plane &&
|
||||
dev_priv->cfb_fb == fb->base.id &&
|
||||
dev_priv->cfb_y == crtc->y)
|
||||
if (dev_priv->fbc.plane == intel_crtc->plane &&
|
||||
dev_priv->fbc.fb_id == fb->base.id &&
|
||||
dev_priv->fbc.y == crtc->y)
|
||||
return;
|
||||
|
||||
if (intel_fbc_enabled(dev)) {
|
||||
|
|
Загрузка…
Ссылка в новой задаче