Commit 71fb5539 authored by Dave Airlie's avatar Dave Airlie

Merge tag 'drm-intel-fixes-2018-12-07' of...

Merge tag 'drm-intel-fixes-2018-12-07' of git://anongit.freedesktop.org/drm/drm-intel into drm-fixes

- Fix for system crash after GPU hang (Bugzilla #107945)
- GVT fix for guest graphics corruption (https://github.com/intel/gvt-linux/issues/61)
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
From: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20181207104352.GA18214@jlahtine-desk.ger.corp.intel.com
parents 40e020c1 d76b21eb
...@@ -235,7 +235,7 @@ int intel_vgpu_decode_primary_plane(struct intel_vgpu *vgpu, ...@@ -235,7 +235,7 @@ int intel_vgpu_decode_primary_plane(struct intel_vgpu *vgpu,
plane->bpp = skl_pixel_formats[fmt].bpp; plane->bpp = skl_pixel_formats[fmt].bpp;
plane->drm_format = skl_pixel_formats[fmt].drm_format; plane->drm_format = skl_pixel_formats[fmt].drm_format;
} else { } else {
plane->tiled = !!(val & DISPPLANE_TILED); plane->tiled = val & DISPPLANE_TILED;
fmt = bdw_format_to_drm(val & DISPPLANE_PIXFORMAT_MASK); fmt = bdw_format_to_drm(val & DISPPLANE_PIXFORMAT_MASK);
plane->bpp = bdw_pixel_formats[fmt].bpp; plane->bpp = bdw_pixel_formats[fmt].bpp;
plane->drm_format = bdw_pixel_formats[fmt].drm_format; plane->drm_format = bdw_pixel_formats[fmt].drm_format;
......
...@@ -1444,6 +1444,7 @@ static int i915_driver_init_hw(struct drm_i915_private *dev_priv) ...@@ -1444,6 +1444,7 @@ static int i915_driver_init_hw(struct drm_i915_private *dev_priv)
intel_uncore_sanitize(dev_priv); intel_uncore_sanitize(dev_priv);
intel_gt_init_workarounds(dev_priv);
i915_gem_load_init_fences(dev_priv); i915_gem_load_init_fences(dev_priv);
/* On the 945G/GM, the chipset reports the MSI capability on the /* On the 945G/GM, the chipset reports the MSI capability on the
......
...@@ -67,6 +67,7 @@ ...@@ -67,6 +67,7 @@
#include "intel_ringbuffer.h" #include "intel_ringbuffer.h"
#include "intel_uncore.h" #include "intel_uncore.h"
#include "intel_wopcm.h" #include "intel_wopcm.h"
#include "intel_workarounds.h"
#include "intel_uc.h" #include "intel_uc.h"
#include "i915_gem.h" #include "i915_gem.h"
...@@ -1805,6 +1806,7 @@ struct drm_i915_private { ...@@ -1805,6 +1806,7 @@ struct drm_i915_private {
int dpio_phy_iosf_port[I915_NUM_PHYS_VLV]; int dpio_phy_iosf_port[I915_NUM_PHYS_VLV];
struct i915_workarounds workarounds; struct i915_workarounds workarounds;
struct i915_wa_list gt_wa_list;
struct i915_frontbuffer_tracking fb_tracking; struct i915_frontbuffer_tracking fb_tracking;
......
...@@ -5305,7 +5305,7 @@ int i915_gem_init_hw(struct drm_i915_private *dev_priv) ...@@ -5305,7 +5305,7 @@ int i915_gem_init_hw(struct drm_i915_private *dev_priv)
} }
} }
intel_gt_workarounds_apply(dev_priv); intel_gt_apply_workarounds(dev_priv);
i915_gem_init_swizzling(dev_priv); i915_gem_init_swizzling(dev_priv);
...@@ -5677,6 +5677,8 @@ void i915_gem_fini(struct drm_i915_private *dev_priv) ...@@ -5677,6 +5677,8 @@ void i915_gem_fini(struct drm_i915_private *dev_priv)
i915_gem_contexts_fini(dev_priv); i915_gem_contexts_fini(dev_priv);
mutex_unlock(&dev_priv->drm.struct_mutex); mutex_unlock(&dev_priv->drm.struct_mutex);
intel_wa_list_free(&dev_priv->gt_wa_list);
intel_cleanup_gt_powersave(dev_priv); intel_cleanup_gt_powersave(dev_priv);
intel_uc_fini_misc(dev_priv); intel_uc_fini_misc(dev_priv);
......
...@@ -720,6 +720,8 @@ void intel_engine_cleanup_common(struct intel_engine_cs *engine) ...@@ -720,6 +720,8 @@ void intel_engine_cleanup_common(struct intel_engine_cs *engine)
__intel_context_unpin(i915->kernel_context, engine); __intel_context_unpin(i915->kernel_context, engine);
i915_timeline_fini(&engine->timeline); i915_timeline_fini(&engine->timeline);
intel_wa_list_free(&engine->wa_list);
} }
u64 intel_engine_get_active_head(const struct intel_engine_cs *engine) u64 intel_engine_get_active_head(const struct intel_engine_cs *engine)
......
...@@ -1793,6 +1793,8 @@ static bool unexpected_starting_state(struct intel_engine_cs *engine) ...@@ -1793,6 +1793,8 @@ static bool unexpected_starting_state(struct intel_engine_cs *engine)
static int gen8_init_common_ring(struct intel_engine_cs *engine) static int gen8_init_common_ring(struct intel_engine_cs *engine)
{ {
intel_engine_apply_workarounds(engine);
intel_mocs_init_engine(engine); intel_mocs_init_engine(engine);
intel_engine_reset_breadcrumbs(engine); intel_engine_reset_breadcrumbs(engine);
...@@ -2491,6 +2493,8 @@ int logical_render_ring_init(struct intel_engine_cs *engine) ...@@ -2491,6 +2493,8 @@ int logical_render_ring_init(struct intel_engine_cs *engine)
ret); ret);
} }
intel_engine_init_workarounds(engine);
return 0; return 0;
err_cleanup_common: err_cleanup_common:
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include "i915_selftest.h" #include "i915_selftest.h"
#include "i915_timeline.h" #include "i915_timeline.h"
#include "intel_gpu_commands.h" #include "intel_gpu_commands.h"
#include "intel_workarounds.h"
struct drm_printer; struct drm_printer;
struct i915_sched_attr; struct i915_sched_attr;
...@@ -440,6 +441,7 @@ struct intel_engine_cs { ...@@ -440,6 +441,7 @@ struct intel_engine_cs {
struct intel_hw_status_page status_page; struct intel_hw_status_page status_page;
struct i915_ctx_workarounds wa_ctx; struct i915_ctx_workarounds wa_ctx;
struct i915_wa_list wa_list;
struct i915_vma *scratch; struct i915_vma *scratch;
u32 irq_keep_mask; /* always keep these interrupts */ u32 irq_keep_mask; /* always keep these interrupts */
......
This diff is collapsed.
...@@ -7,11 +7,35 @@ ...@@ -7,11 +7,35 @@
#ifndef _I915_WORKAROUNDS_H_ #ifndef _I915_WORKAROUNDS_H_
#define _I915_WORKAROUNDS_H_ #define _I915_WORKAROUNDS_H_
#include <linux/slab.h>
struct i915_wa {
i915_reg_t reg;
u32 mask;
u32 val;
};
struct i915_wa_list {
const char *name;
struct i915_wa *list;
unsigned int count;
};
static inline void intel_wa_list_free(struct i915_wa_list *wal)
{
kfree(wal->list);
memset(wal, 0, sizeof(*wal));
}
int intel_ctx_workarounds_init(struct drm_i915_private *dev_priv); int intel_ctx_workarounds_init(struct drm_i915_private *dev_priv);
int intel_ctx_workarounds_emit(struct i915_request *rq); int intel_ctx_workarounds_emit(struct i915_request *rq);
void intel_gt_workarounds_apply(struct drm_i915_private *dev_priv); void intel_gt_init_workarounds(struct drm_i915_private *dev_priv);
void intel_gt_apply_workarounds(struct drm_i915_private *dev_priv);
void intel_whitelist_workarounds_apply(struct intel_engine_cs *engine); void intel_whitelist_workarounds_apply(struct intel_engine_cs *engine);
void intel_engine_init_workarounds(struct intel_engine_cs *engine);
void intel_engine_apply_workarounds(struct intel_engine_cs *engine);
#endif #endif
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