aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2018-11-30 07:59:54 -0500
committerChris Wilson <chris@chris-wilson.co.uk>2018-12-03 11:08:26 -0500
commit46592892e1a60f9e9de3287719143a148fce93cf (patch)
tree9583d109a21b852df9cefbbbb1280c47879670c3
parent26af893184e58fb4898c09afbb548e0d893972bc (diff)
drm/i915/vgpu: Disallow loading on old vGPU hosts
Since commit fd8526e50902 ("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: Mika Kuoppala <mika.kuoppala@linux.intel.com> Fixes: fd8526e50902 ("drm/i915/execlists: Trust the CSB") Signed-off-by: Chris 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: Mika Kuoppala <mika.kuoppala@linux.intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20181130125954.11924-1-chris@chris-wilson.co.uk
-rw-r--r--drivers/gpu/drm/i915/i915_drv.c14
-rw-r--r--drivers/gpu/drm/i915/intel_lrc.c32
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.h16
3 files changed, 22 insertions, 40 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index e39016713464..3e5e2efce670 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -1384,6 +1384,20 @@ static int i915_driver_init_hw(struct drm_i915_private *dev_priv)
1384 } 1384 }
1385 } 1385 }
1386 1386
1387 if (HAS_EXECLISTS(dev_priv)) {
1388 /*
1389 * Older GVT emulation depends upon intercepting CSB mmio,
1390 * which we no longer use, preferring to use the HWSP cache
1391 * instead.
1392 */
1393 if (intel_vgpu_active(dev_priv) &&
1394 !intel_vgpu_has_hwsp_emulation(dev_priv)) {
1395 i915_report_error(dev_priv,
1396 "old vGPU host found, support for HWSP emulation required\n");
1397 return -ENXIO;
1398 }
1399 }
1400
1387 intel_sanitize_options(dev_priv); 1401 intel_sanitize_options(dev_priv);
1388 1402
1389 i915_perf_init(dev_priv); 1403 i915_perf_init(dev_priv);
diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
index 11f4e6148557..1f004683b777 100644
--- a/drivers/gpu/drm/i915/intel_lrc.c
+++ b/drivers/gpu/drm/i915/intel_lrc.c
@@ -767,6 +767,8 @@ execlists_cancel_port_requests(struct intel_engine_execlists * const execlists)
767 767
768static void reset_csb_pointers(struct intel_engine_execlists *execlists) 768static void reset_csb_pointers(struct intel_engine_execlists *execlists)
769{ 769{
770 const unsigned int reset_value = GEN8_CSB_ENTRIES - 1;
771
770 /* 772 /*
771 * After a reset, the HW starts writing into CSB entry [0]. We 773 * After a reset, the HW starts writing into CSB entry [0]. We
772 * therefore have to set our HEAD pointer back one entry so that 774 * 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 * inline comparison of our cached head position against the last HW 778 * inline comparison of our cached head position against the last HW
777 * write works even before the first interrupt. 779 * write works even before the first interrupt.
778 */ 780 */
779 execlists->csb_head = execlists->csb_write_reset; 781 execlists->csb_head = reset_value;
780 WRITE_ONCE(*execlists->csb_write, execlists->csb_write_reset); 782 WRITE_ONCE(*execlists->csb_write, reset_value);
781} 783}
782 784
783static void nop_submission_tasklet(unsigned long data) 785static void nop_submission_tasklet(unsigned long data)
@@ -2217,12 +2219,6 @@ logical_ring_setup(struct intel_engine_cs *engine)
2217 logical_ring_default_irqs(engine); 2219 logical_ring_default_irqs(engine);
2218} 2220}
2219 2221
2220static bool csb_force_mmio(struct drm_i915_private *i915)
2221{
2222 /* Older GVT emulation depends upon intercepting CSB mmio */
2223 return intel_vgpu_active(i915) && !intel_vgpu_has_hwsp_emulation(i915);
2224}
2225
2226static int logical_ring_init(struct intel_engine_cs *engine) 2222static int logical_ring_init(struct intel_engine_cs *engine)
2227{ 2223{
2228 struct drm_i915_private *i915 = engine->i915; 2224 struct drm_i915_private *i915 = engine->i915;
@@ -2252,24 +2248,12 @@ static int logical_ring_init(struct intel_engine_cs *engine)
2252 upper_32_bits(ce->lrc_desc); 2248 upper_32_bits(ce->lrc_desc);
2253 } 2249 }
2254 2250
2255 execlists->csb_read = 2251 execlists->csb_status =
2256 i915->regs + i915_mmio_reg_offset(RING_CONTEXT_STATUS_PTR(engine)); 2252 &engine->status_page.page_addr[I915_HWS_CSB_BUF0_INDEX];
2257 if (csb_force_mmio(i915)) {
2258 execlists->csb_status = (u32 __force *)
2259 (i915->regs + i915_mmio_reg_offset(RING_CONTEXT_STATUS_BUF_LO(engine, 0)));
2260 2253
2261 execlists->csb_write = (u32 __force *)execlists->csb_read; 2254 execlists->csb_write =
2262 execlists->csb_write_reset = 2255 &engine->status_page.page_addr[intel_hws_csb_write_index(i915)];
2263 _MASKED_FIELD(GEN8_CSB_WRITE_PTR_MASK,
2264 GEN8_CSB_ENTRIES - 1);
2265 } else {
2266 execlists->csb_status =
2267 &engine->status_page.page_addr[I915_HWS_CSB_BUF0_INDEX];
2268 2256
2269 execlists->csb_write =
2270 &engine->status_page.page_addr[intel_hws_csb_write_index(i915)];
2271 execlists->csb_write_reset = GEN8_CSB_ENTRIES - 1;
2272 }
2273 reset_csb_pointers(execlists); 2257 reset_csb_pointers(execlists);
2274 2258
2275 return 0; 2259 return 0;
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
index 8a2270b209b0..f4988f7bc756 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.h
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
@@ -313,13 +313,6 @@ struct intel_engine_execlists {
313 struct rb_root_cached queue; 313 struct rb_root_cached queue;
314 314
315 /** 315 /**
316 * @csb_read: control register for Context Switch buffer
317 *
318 * Note this register is always in mmio.
319 */
320 u32 __iomem *csb_read;
321
322 /**
323 * @csb_write: control register for Context Switch buffer 316 * @csb_write: control register for Context Switch buffer
324 * 317 *
325 * Note this register may be either mmio or HWSP shadow. 318 * Note this register may be either mmio or HWSP shadow.
@@ -339,15 +332,6 @@ struct intel_engine_execlists {
339 u32 preempt_complete_status; 332 u32 preempt_complete_status;
340 333
341 /** 334 /**
342 * @csb_write_reset: reset value for CSB write pointer
343 *
344 * As the CSB write pointer maybe either in HWSP or as a field
345 * inside an mmio register, we want to reprogram it slightly
346 * differently to avoid later confusion.
347 */
348 u32 csb_write_reset;
349
350 /**
351 * @csb_head: context status buffer head 335 * @csb_head: context status buffer head
352 */ 336 */
353 u8 csb_head; 337 u8 csb_head;