Commit 46592892 authored by Chris Wilson's avatar Chris Wilson

drm/i915/vgpu: Disallow loading on old vGPU hosts

Since commit fd8526e5 ("drm/i915/execlists: Trust the CSB") we
actually broke the force-mmio mode for our execlists implementation. No
one noticed, so ergo no one is actually using an old vGPU host (where we
required the older method) and so can simply remove the broken support.

v2: csb_read can go as well (Mika)
Reported-by: default avatarMika Kuoppala <mika.kuoppala@linux.intel.com>
Fixes: fd8526e5 ("drm/i915/execlists: Trust the CSB")
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Cc: Daniele Ceraolo Spurio <daniele.ceraolospurio@intel.com>
Reviewed-by: default avatarMika Kuoppala <mika.kuoppala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20181130125954.11924-1-chris@chris-wilson.co.uk
parent 26af8931
...@@ -1384,6 +1384,20 @@ static int i915_driver_init_hw(struct drm_i915_private *dev_priv) ...@@ -1384,6 +1384,20 @@ static int i915_driver_init_hw(struct drm_i915_private *dev_priv)
} }
} }
if (HAS_EXECLISTS(dev_priv)) {
/*
* Older GVT emulation depends upon intercepting CSB mmio,
* which we no longer use, preferring to use the HWSP cache
* instead.
*/
if (intel_vgpu_active(dev_priv) &&
!intel_vgpu_has_hwsp_emulation(dev_priv)) {
i915_report_error(dev_priv,
"old vGPU host found, support for HWSP emulation required\n");
return -ENXIO;
}
}
intel_sanitize_options(dev_priv); intel_sanitize_options(dev_priv);
i915_perf_init(dev_priv); i915_perf_init(dev_priv);
......
...@@ -767,6 +767,8 @@ execlists_cancel_port_requests(struct intel_engine_execlists * const execlists) ...@@ -767,6 +767,8 @@ execlists_cancel_port_requests(struct intel_engine_execlists * const execlists)
static void reset_csb_pointers(struct intel_engine_execlists *execlists) static void reset_csb_pointers(struct intel_engine_execlists *execlists)
{ {
const unsigned int reset_value = GEN8_CSB_ENTRIES - 1;
/* /*
* After a reset, the HW starts writing into CSB entry [0]. We * After a reset, the HW starts writing into CSB entry [0]. We
* therefore have to set our HEAD pointer back one entry so that * therefore have to set our HEAD pointer back one entry so that
...@@ -776,8 +778,8 @@ static void reset_csb_pointers(struct intel_engine_execlists *execlists) ...@@ -776,8 +778,8 @@ static void reset_csb_pointers(struct intel_engine_execlists *execlists)
* inline comparison of our cached head position against the last HW * inline comparison of our cached head position against the last HW
* write works even before the first interrupt. * write works even before the first interrupt.
*/ */
execlists->csb_head = execlists->csb_write_reset; execlists->csb_head = reset_value;
WRITE_ONCE(*execlists->csb_write, execlists->csb_write_reset); WRITE_ONCE(*execlists->csb_write, reset_value);
} }
static void nop_submission_tasklet(unsigned long data) static void nop_submission_tasklet(unsigned long data)
...@@ -2217,12 +2219,6 @@ logical_ring_setup(struct intel_engine_cs *engine) ...@@ -2217,12 +2219,6 @@ logical_ring_setup(struct intel_engine_cs *engine)
logical_ring_default_irqs(engine); logical_ring_default_irqs(engine);
} }
static bool csb_force_mmio(struct drm_i915_private *i915)
{
/* Older GVT emulation depends upon intercepting CSB mmio */
return intel_vgpu_active(i915) && !intel_vgpu_has_hwsp_emulation(i915);
}
static int logical_ring_init(struct intel_engine_cs *engine) static int logical_ring_init(struct intel_engine_cs *engine)
{ {
struct drm_i915_private *i915 = engine->i915; struct drm_i915_private *i915 = engine->i915;
...@@ -2252,24 +2248,12 @@ static int logical_ring_init(struct intel_engine_cs *engine) ...@@ -2252,24 +2248,12 @@ static int logical_ring_init(struct intel_engine_cs *engine)
upper_32_bits(ce->lrc_desc); upper_32_bits(ce->lrc_desc);
} }
execlists->csb_read =
i915->regs + i915_mmio_reg_offset(RING_CONTEXT_STATUS_PTR(engine));
if (csb_force_mmio(i915)) {
execlists->csb_status = (u32 __force *)
(i915->regs + i915_mmio_reg_offset(RING_CONTEXT_STATUS_BUF_LO(engine, 0)));
execlists->csb_write = (u32 __force *)execlists->csb_read;
execlists->csb_write_reset =
_MASKED_FIELD(GEN8_CSB_WRITE_PTR_MASK,
GEN8_CSB_ENTRIES - 1);
} else {
execlists->csb_status = execlists->csb_status =
&engine->status_page.page_addr[I915_HWS_CSB_BUF0_INDEX]; &engine->status_page.page_addr[I915_HWS_CSB_BUF0_INDEX];
execlists->csb_write = execlists->csb_write =
&engine->status_page.page_addr[intel_hws_csb_write_index(i915)]; &engine->status_page.page_addr[intel_hws_csb_write_index(i915)];
execlists->csb_write_reset = GEN8_CSB_ENTRIES - 1;
}
reset_csb_pointers(execlists); reset_csb_pointers(execlists);
return 0; return 0;
......
...@@ -312,13 +312,6 @@ struct intel_engine_execlists { ...@@ -312,13 +312,6 @@ struct intel_engine_execlists {
*/ */
struct rb_root_cached queue; struct rb_root_cached queue;
/**
* @csb_read: control register for Context Switch buffer
*
* Note this register is always in mmio.
*/
u32 __iomem *csb_read;
/** /**
* @csb_write: control register for Context Switch buffer * @csb_write: control register for Context Switch buffer
* *
...@@ -338,15 +331,6 @@ struct intel_engine_execlists { ...@@ -338,15 +331,6 @@ struct intel_engine_execlists {
*/ */
u32 preempt_complete_status; u32 preempt_complete_status;
/**
* @csb_write_reset: reset value for CSB write pointer
*
* As the CSB write pointer maybe either in HWSP or as a field
* inside an mmio register, we want to reprogram it slightly
* differently to avoid later confusion.
*/
u32 csb_write_reset;
/** /**
* @csb_head: context status buffer head * @csb_head: context status buffer head
*/ */
......
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