diff options
Diffstat (limited to 'drivers/gpu/drm/i915')
| -rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 7 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 50 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gpu_error.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_engine_cs.c | 42 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_lrc.c | 17 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.c | 37 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.h | 5 |
7 files changed, 74 insertions, 86 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 23a3dc6f3907..c5f01964f0fb 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
| @@ -1983,6 +1983,8 @@ struct drm_i915_private { | |||
| 1983 | struct delayed_work idle_work; | 1983 | struct delayed_work idle_work; |
| 1984 | 1984 | ||
| 1985 | ktime_t last_init_time; | 1985 | ktime_t last_init_time; |
| 1986 | |||
| 1987 | struct i915_vma *scratch; | ||
| 1986 | } gt; | 1988 | } gt; |
| 1987 | 1989 | ||
| 1988 | /* perform PHY state sanity checks? */ | 1990 | /* perform PHY state sanity checks? */ |
| @@ -3713,4 +3715,9 @@ static inline int intel_hws_csb_write_index(struct drm_i915_private *i915) | |||
| 3713 | return I915_HWS_CSB_WRITE_INDEX; | 3715 | return I915_HWS_CSB_WRITE_INDEX; |
| 3714 | } | 3716 | } |
| 3715 | 3717 | ||
| 3718 | static inline u32 i915_scratch_offset(const struct drm_i915_private *i915) | ||
| 3719 | { | ||
| 3720 | return i915_ggtt_offset(i915->gt.scratch); | ||
| 3721 | } | ||
| 3722 | |||
| 3716 | #endif | 3723 | #endif |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 35ecfea4e903..d36a9755ad91 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -5498,6 +5498,44 @@ err_active: | |||
| 5498 | goto out_ctx; | 5498 | goto out_ctx; |
| 5499 | } | 5499 | } |
| 5500 | 5500 | ||
| 5501 | static int | ||
| 5502 | i915_gem_init_scratch(struct drm_i915_private *i915, unsigned int size) | ||
| 5503 | { | ||
| 5504 | struct drm_i915_gem_object *obj; | ||
| 5505 | struct i915_vma *vma; | ||
| 5506 | int ret; | ||
| 5507 | |||
| 5508 | obj = i915_gem_object_create_stolen(i915, size); | ||
| 5509 | if (!obj) | ||
| 5510 | obj = i915_gem_object_create_internal(i915, size); | ||
| 5511 | if (IS_ERR(obj)) { | ||
| 5512 | DRM_ERROR("Failed to allocate scratch page\n"); | ||
| 5513 | return PTR_ERR(obj); | ||
| 5514 | } | ||
| 5515 | |||
| 5516 | vma = i915_vma_instance(obj, &i915->ggtt.vm, NULL); | ||
| 5517 | if (IS_ERR(vma)) { | ||
| 5518 | ret = PTR_ERR(vma); | ||
| 5519 | goto err_unref; | ||
| 5520 | } | ||
| 5521 | |||
| 5522 | ret = i915_vma_pin(vma, 0, 0, PIN_GLOBAL | PIN_HIGH); | ||
| 5523 | if (ret) | ||
| 5524 | goto err_unref; | ||
| 5525 | |||
| 5526 | i915->gt.scratch = vma; | ||
| 5527 | return 0; | ||
| 5528 | |||
| 5529 | err_unref: | ||
| 5530 | i915_gem_object_put(obj); | ||
| 5531 | return ret; | ||
| 5532 | } | ||
| 5533 | |||
| 5534 | static void i915_gem_fini_scratch(struct drm_i915_private *i915) | ||
| 5535 | { | ||
| 5536 | i915_vma_unpin_and_release(&i915->gt.scratch, 0); | ||
| 5537 | } | ||
| 5538 | |||
| 5501 | int i915_gem_init(struct drm_i915_private *dev_priv) | 5539 | int i915_gem_init(struct drm_i915_private *dev_priv) |
| 5502 | { | 5540 | { |
| 5503 | int ret; | 5541 | int ret; |
| @@ -5544,12 +5582,19 @@ int i915_gem_init(struct drm_i915_private *dev_priv) | |||
| 5544 | goto err_unlock; | 5582 | goto err_unlock; |
| 5545 | } | 5583 | } |
| 5546 | 5584 | ||
| 5547 | ret = i915_gem_contexts_init(dev_priv); | 5585 | ret = i915_gem_init_scratch(dev_priv, |
| 5586 | IS_GEN2(dev_priv) ? SZ_256K : PAGE_SIZE); | ||
| 5548 | if (ret) { | 5587 | if (ret) { |
| 5549 | GEM_BUG_ON(ret == -EIO); | 5588 | GEM_BUG_ON(ret == -EIO); |
| 5550 | goto err_ggtt; | 5589 | goto err_ggtt; |
| 5551 | } | 5590 | } |
| 5552 | 5591 | ||
| 5592 | ret = i915_gem_contexts_init(dev_priv); | ||
| 5593 | if (ret) { | ||
| 5594 | GEM_BUG_ON(ret == -EIO); | ||
| 5595 | goto err_scratch; | ||
| 5596 | } | ||
| 5597 | |||
| 5553 | ret = intel_engines_init(dev_priv); | 5598 | ret = intel_engines_init(dev_priv); |
| 5554 | if (ret) { | 5599 | if (ret) { |
| 5555 | GEM_BUG_ON(ret == -EIO); | 5600 | GEM_BUG_ON(ret == -EIO); |
| @@ -5622,6 +5667,8 @@ err_pm: | |||
| 5622 | err_context: | 5667 | err_context: |
| 5623 | if (ret != -EIO) | 5668 | if (ret != -EIO) |
| 5624 | i915_gem_contexts_fini(dev_priv); | 5669 | i915_gem_contexts_fini(dev_priv); |
| 5670 | err_scratch: | ||
| 5671 | i915_gem_fini_scratch(dev_priv); | ||
| 5625 | err_ggtt: | 5672 | err_ggtt: |
| 5626 | err_unlock: | 5673 | err_unlock: |
| 5627 | intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL); | 5674 | intel_uncore_forcewake_put(dev_priv, FORCEWAKE_ALL); |
| @@ -5673,6 +5720,7 @@ void i915_gem_fini(struct drm_i915_private *dev_priv) | |||
| 5673 | intel_uc_fini(dev_priv); | 5720 | intel_uc_fini(dev_priv); |
| 5674 | i915_gem_cleanup_engines(dev_priv); | 5721 | i915_gem_cleanup_engines(dev_priv); |
| 5675 | i915_gem_contexts_fini(dev_priv); | 5722 | i915_gem_contexts_fini(dev_priv); |
| 5723 | i915_gem_fini_scratch(dev_priv); | ||
| 5676 | mutex_unlock(&dev_priv->drm.struct_mutex); | 5724 | mutex_unlock(&dev_priv->drm.struct_mutex); |
| 5677 | 5725 | ||
| 5678 | intel_wa_list_free(&dev_priv->gt_wa_list); | 5726 | intel_wa_list_free(&dev_priv->gt_wa_list); |
diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c index a6885a59568b..07465123c166 100644 --- a/drivers/gpu/drm/i915/i915_gpu_error.c +++ b/drivers/gpu/drm/i915/i915_gpu_error.c | |||
| @@ -1571,7 +1571,7 @@ static void gem_record_rings(struct i915_gpu_state *error) | |||
| 1571 | if (HAS_BROKEN_CS_TLB(i915)) | 1571 | if (HAS_BROKEN_CS_TLB(i915)) |
| 1572 | ee->wa_batchbuffer = | 1572 | ee->wa_batchbuffer = |
| 1573 | i915_error_object_create(i915, | 1573 | i915_error_object_create(i915, |
| 1574 | engine->scratch); | 1574 | i915->gt.scratch); |
| 1575 | request_record_user_bo(request, ee); | 1575 | request_record_user_bo(request, ee); |
| 1576 | 1576 | ||
| 1577 | ee->ctx = | 1577 | ee->ctx = |
diff --git a/drivers/gpu/drm/i915/intel_engine_cs.c b/drivers/gpu/drm/i915/intel_engine_cs.c index 6b427bc52f78..af2873403009 100644 --- a/drivers/gpu/drm/i915/intel_engine_cs.c +++ b/drivers/gpu/drm/i915/intel_engine_cs.c | |||
| @@ -493,46 +493,6 @@ void intel_engine_setup_common(struct intel_engine_cs *engine) | |||
| 493 | intel_engine_init_cmd_parser(engine); | 493 | intel_engine_init_cmd_parser(engine); |
| 494 | } | 494 | } |
| 495 | 495 | ||
| 496 | int intel_engine_create_scratch(struct intel_engine_cs *engine, | ||
| 497 | unsigned int size) | ||
| 498 | { | ||
| 499 | struct drm_i915_gem_object *obj; | ||
| 500 | struct i915_vma *vma; | ||
| 501 | int ret; | ||
| 502 | |||
| 503 | WARN_ON(engine->scratch); | ||
| 504 | |||
| 505 | obj = i915_gem_object_create_stolen(engine->i915, size); | ||
| 506 | if (!obj) | ||
| 507 | obj = i915_gem_object_create_internal(engine->i915, size); | ||
| 508 | if (IS_ERR(obj)) { | ||
| 509 | DRM_ERROR("Failed to allocate scratch page\n"); | ||
| 510 | return PTR_ERR(obj); | ||
| 511 | } | ||
| 512 | |||
| 513 | vma = i915_vma_instance(obj, &engine->i915->ggtt.vm, NULL); | ||
| 514 | if (IS_ERR(vma)) { | ||
| 515 | ret = PTR_ERR(vma); | ||
| 516 | goto err_unref; | ||
| 517 | } | ||
| 518 | |||
| 519 | ret = i915_vma_pin(vma, 0, 0, PIN_GLOBAL | PIN_HIGH); | ||
| 520 | if (ret) | ||
| 521 | goto err_unref; | ||
| 522 | |||
| 523 | engine->scratch = vma; | ||
| 524 | return 0; | ||
| 525 | |||
| 526 | err_unref: | ||
| 527 | i915_gem_object_put(obj); | ||
| 528 | return ret; | ||
| 529 | } | ||
| 530 | |||
| 531 | void intel_engine_cleanup_scratch(struct intel_engine_cs *engine) | ||
| 532 | { | ||
| 533 | i915_vma_unpin_and_release(&engine->scratch, 0); | ||
| 534 | } | ||
| 535 | |||
| 536 | static void cleanup_status_page(struct intel_engine_cs *engine) | 496 | static void cleanup_status_page(struct intel_engine_cs *engine) |
| 537 | { | 497 | { |
| 538 | if (HWS_NEEDS_PHYSICAL(engine->i915)) { | 498 | if (HWS_NEEDS_PHYSICAL(engine->i915)) { |
| @@ -707,8 +667,6 @@ void intel_engine_cleanup_common(struct intel_engine_cs *engine) | |||
| 707 | { | 667 | { |
| 708 | struct drm_i915_private *i915 = engine->i915; | 668 | struct drm_i915_private *i915 = engine->i915; |
| 709 | 669 | ||
| 710 | intel_engine_cleanup_scratch(engine); | ||
| 711 | |||
| 712 | cleanup_status_page(engine); | 670 | cleanup_status_page(engine); |
| 713 | 671 | ||
| 714 | intel_engine_fini_breadcrumbs(engine); | 672 | intel_engine_fini_breadcrumbs(engine); |
diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c index 87227fd9ae5f..d7fa301b5ec7 100644 --- a/drivers/gpu/drm/i915/intel_lrc.c +++ b/drivers/gpu/drm/i915/intel_lrc.c | |||
| @@ -1288,9 +1288,10 @@ static int execlists_request_alloc(struct i915_request *request) | |||
| 1288 | static u32 * | 1288 | static u32 * |
| 1289 | gen8_emit_flush_coherentl3_wa(struct intel_engine_cs *engine, u32 *batch) | 1289 | gen8_emit_flush_coherentl3_wa(struct intel_engine_cs *engine, u32 *batch) |
| 1290 | { | 1290 | { |
| 1291 | /* NB no one else is allowed to scribble over scratch + 256! */ | ||
| 1291 | *batch++ = MI_STORE_REGISTER_MEM_GEN8 | MI_SRM_LRM_GLOBAL_GTT; | 1292 | *batch++ = MI_STORE_REGISTER_MEM_GEN8 | MI_SRM_LRM_GLOBAL_GTT; |
| 1292 | *batch++ = i915_mmio_reg_offset(GEN8_L3SQCREG4); | 1293 | *batch++ = i915_mmio_reg_offset(GEN8_L3SQCREG4); |
| 1293 | *batch++ = i915_ggtt_offset(engine->scratch) + 256; | 1294 | *batch++ = i915_scratch_offset(engine->i915) + 256; |
| 1294 | *batch++ = 0; | 1295 | *batch++ = 0; |
| 1295 | 1296 | ||
| 1296 | *batch++ = MI_LOAD_REGISTER_IMM(1); | 1297 | *batch++ = MI_LOAD_REGISTER_IMM(1); |
| @@ -1304,7 +1305,7 @@ gen8_emit_flush_coherentl3_wa(struct intel_engine_cs *engine, u32 *batch) | |||
| 1304 | 1305 | ||
| 1305 | *batch++ = MI_LOAD_REGISTER_MEM_GEN8 | MI_SRM_LRM_GLOBAL_GTT; | 1306 | *batch++ = MI_LOAD_REGISTER_MEM_GEN8 | MI_SRM_LRM_GLOBAL_GTT; |
| 1306 | *batch++ = i915_mmio_reg_offset(GEN8_L3SQCREG4); | 1307 | *batch++ = i915_mmio_reg_offset(GEN8_L3SQCREG4); |
| 1307 | *batch++ = i915_ggtt_offset(engine->scratch) + 256; | 1308 | *batch++ = i915_scratch_offset(engine->i915) + 256; |
| 1308 | *batch++ = 0; | 1309 | *batch++ = 0; |
| 1309 | 1310 | ||
| 1310 | return batch; | 1311 | return batch; |
| @@ -1341,7 +1342,7 @@ static u32 *gen8_init_indirectctx_bb(struct intel_engine_cs *engine, u32 *batch) | |||
| 1341 | PIPE_CONTROL_GLOBAL_GTT_IVB | | 1342 | PIPE_CONTROL_GLOBAL_GTT_IVB | |
| 1342 | PIPE_CONTROL_CS_STALL | | 1343 | PIPE_CONTROL_CS_STALL | |
| 1343 | PIPE_CONTROL_QW_WRITE, | 1344 | PIPE_CONTROL_QW_WRITE, |
| 1344 | i915_ggtt_offset(engine->scratch) + | 1345 | i915_scratch_offset(engine->i915) + |
| 1345 | 2 * CACHELINE_BYTES); | 1346 | 2 * CACHELINE_BYTES); |
| 1346 | 1347 | ||
| 1347 | *batch++ = MI_ARB_ON_OFF | MI_ARB_ENABLE; | 1348 | *batch++ = MI_ARB_ON_OFF | MI_ARB_ENABLE; |
| @@ -1973,7 +1974,7 @@ static int gen8_emit_flush_render(struct i915_request *request, | |||
| 1973 | { | 1974 | { |
| 1974 | struct intel_engine_cs *engine = request->engine; | 1975 | struct intel_engine_cs *engine = request->engine; |
| 1975 | u32 scratch_addr = | 1976 | u32 scratch_addr = |
| 1976 | i915_ggtt_offset(engine->scratch) + 2 * CACHELINE_BYTES; | 1977 | i915_scratch_offset(engine->i915) + 2 * CACHELINE_BYTES; |
| 1977 | bool vf_flush_wa = false, dc_flush_wa = false; | 1978 | bool vf_flush_wa = false, dc_flush_wa = false; |
| 1978 | u32 *cs, flags = 0; | 1979 | u32 *cs, flags = 0; |
| 1979 | int len; | 1980 | int len; |
| @@ -2292,10 +2293,6 @@ int logical_render_ring_init(struct intel_engine_cs *engine) | |||
| 2292 | if (ret) | 2293 | if (ret) |
| 2293 | return ret; | 2294 | return ret; |
| 2294 | 2295 | ||
| 2295 | ret = intel_engine_create_scratch(engine, PAGE_SIZE); | ||
| 2296 | if (ret) | ||
| 2297 | goto err_cleanup_common; | ||
| 2298 | |||
| 2299 | ret = intel_init_workaround_bb(engine); | 2296 | ret = intel_init_workaround_bb(engine); |
| 2300 | if (ret) { | 2297 | if (ret) { |
| 2301 | /* | 2298 | /* |
| @@ -2311,10 +2308,6 @@ int logical_render_ring_init(struct intel_engine_cs *engine) | |||
| 2311 | intel_engine_init_workarounds(engine); | 2308 | intel_engine_init_workarounds(engine); |
| 2312 | 2309 | ||
| 2313 | return 0; | 2310 | return 0; |
| 2314 | |||
| 2315 | err_cleanup_common: | ||
| 2316 | intel_engine_cleanup_common(engine); | ||
| 2317 | return ret; | ||
| 2318 | } | 2311 | } |
| 2319 | 2312 | ||
| 2320 | int logical_xcs_ring_init(struct intel_engine_cs *engine) | 2313 | int logical_xcs_ring_init(struct intel_engine_cs *engine) |
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index 7f88df5bff09..c5eb26a7ee79 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | |||
| @@ -150,8 +150,7 @@ gen4_render_ring_flush(struct i915_request *rq, u32 mode) | |||
| 150 | */ | 150 | */ |
| 151 | if (mode & EMIT_INVALIDATE) { | 151 | if (mode & EMIT_INVALIDATE) { |
| 152 | *cs++ = GFX_OP_PIPE_CONTROL(4) | PIPE_CONTROL_QW_WRITE; | 152 | *cs++ = GFX_OP_PIPE_CONTROL(4) | PIPE_CONTROL_QW_WRITE; |
| 153 | *cs++ = i915_ggtt_offset(rq->engine->scratch) | | 153 | *cs++ = i915_scratch_offset(rq->i915) | PIPE_CONTROL_GLOBAL_GTT; |
| 154 | PIPE_CONTROL_GLOBAL_GTT; | ||
| 155 | *cs++ = 0; | 154 | *cs++ = 0; |
| 156 | *cs++ = 0; | 155 | *cs++ = 0; |
| 157 | 156 | ||
| @@ -159,8 +158,7 @@ gen4_render_ring_flush(struct i915_request *rq, u32 mode) | |||
| 159 | *cs++ = MI_FLUSH; | 158 | *cs++ = MI_FLUSH; |
| 160 | 159 | ||
| 161 | *cs++ = GFX_OP_PIPE_CONTROL(4) | PIPE_CONTROL_QW_WRITE; | 160 | *cs++ = GFX_OP_PIPE_CONTROL(4) | PIPE_CONTROL_QW_WRITE; |
| 162 | *cs++ = i915_ggtt_offset(rq->engine->scratch) | | 161 | *cs++ = i915_scratch_offset(rq->i915) | PIPE_CONTROL_GLOBAL_GTT; |
| 163 | PIPE_CONTROL_GLOBAL_GTT; | ||
| 164 | *cs++ = 0; | 162 | *cs++ = 0; |
| 165 | *cs++ = 0; | 163 | *cs++ = 0; |
| 166 | } | 164 | } |
| @@ -212,8 +210,7 @@ gen4_render_ring_flush(struct i915_request *rq, u32 mode) | |||
| 212 | static int | 210 | static int |
| 213 | intel_emit_post_sync_nonzero_flush(struct i915_request *rq) | 211 | intel_emit_post_sync_nonzero_flush(struct i915_request *rq) |
| 214 | { | 212 | { |
| 215 | u32 scratch_addr = | 213 | u32 scratch_addr = i915_scratch_offset(rq->i915) + 2 * CACHELINE_BYTES; |
| 216 | i915_ggtt_offset(rq->engine->scratch) + 2 * CACHELINE_BYTES; | ||
| 217 | u32 *cs; | 214 | u32 *cs; |
| 218 | 215 | ||
| 219 | cs = intel_ring_begin(rq, 6); | 216 | cs = intel_ring_begin(rq, 6); |
| @@ -246,8 +243,7 @@ intel_emit_post_sync_nonzero_flush(struct i915_request *rq) | |||
| 246 | static int | 243 | static int |
| 247 | gen6_render_ring_flush(struct i915_request *rq, u32 mode) | 244 | gen6_render_ring_flush(struct i915_request *rq, u32 mode) |
| 248 | { | 245 | { |
| 249 | u32 scratch_addr = | 246 | u32 scratch_addr = i915_scratch_offset(rq->i915) + 2 * CACHELINE_BYTES; |
| 250 | i915_ggtt_offset(rq->engine->scratch) + 2 * CACHELINE_BYTES; | ||
| 251 | u32 *cs, flags = 0; | 247 | u32 *cs, flags = 0; |
| 252 | int ret; | 248 | int ret; |
| 253 | 249 | ||
| @@ -316,8 +312,7 @@ gen7_render_ring_cs_stall_wa(struct i915_request *rq) | |||
| 316 | static int | 312 | static int |
| 317 | gen7_render_ring_flush(struct i915_request *rq, u32 mode) | 313 | gen7_render_ring_flush(struct i915_request *rq, u32 mode) |
| 318 | { | 314 | { |
| 319 | u32 scratch_addr = | 315 | u32 scratch_addr = i915_scratch_offset(rq->i915) + 2 * CACHELINE_BYTES; |
| 320 | i915_ggtt_offset(rq->engine->scratch) + 2 * CACHELINE_BYTES; | ||
| 321 | u32 *cs, flags = 0; | 316 | u32 *cs, flags = 0; |
| 322 | 317 | ||
| 323 | /* | 318 | /* |
| @@ -994,7 +989,7 @@ i965_emit_bb_start(struct i915_request *rq, | |||
| 994 | } | 989 | } |
| 995 | 990 | ||
| 996 | /* Just userspace ABI convention to limit the wa batch bo to a resonable size */ | 991 | /* Just userspace ABI convention to limit the wa batch bo to a resonable size */ |
| 997 | #define I830_BATCH_LIMIT (256*1024) | 992 | #define I830_BATCH_LIMIT SZ_256K |
| 998 | #define I830_TLB_ENTRIES (2) | 993 | #define I830_TLB_ENTRIES (2) |
| 999 | #define I830_WA_SIZE max(I830_TLB_ENTRIES*4096, I830_BATCH_LIMIT) | 994 | #define I830_WA_SIZE max(I830_TLB_ENTRIES*4096, I830_BATCH_LIMIT) |
| 1000 | static int | 995 | static int |
| @@ -1002,7 +997,9 @@ i830_emit_bb_start(struct i915_request *rq, | |||
| 1002 | u64 offset, u32 len, | 997 | u64 offset, u32 len, |
| 1003 | unsigned int dispatch_flags) | 998 | unsigned int dispatch_flags) |
| 1004 | { | 999 | { |
| 1005 | u32 *cs, cs_offset = i915_ggtt_offset(rq->engine->scratch); | 1000 | u32 *cs, cs_offset = i915_scratch_offset(rq->i915); |
| 1001 | |||
| 1002 | GEM_BUG_ON(rq->i915->gt.scratch->size < I830_WA_SIZE); | ||
| 1006 | 1003 | ||
| 1007 | cs = intel_ring_begin(rq, 6); | 1004 | cs = intel_ring_begin(rq, 6); |
| 1008 | if (IS_ERR(cs)) | 1005 | if (IS_ERR(cs)) |
| @@ -1459,7 +1456,6 @@ static int intel_init_ring_buffer(struct intel_engine_cs *engine) | |||
| 1459 | { | 1456 | { |
| 1460 | struct i915_timeline *timeline; | 1457 | struct i915_timeline *timeline; |
| 1461 | struct intel_ring *ring; | 1458 | struct intel_ring *ring; |
| 1462 | unsigned int size; | ||
| 1463 | int err; | 1459 | int err; |
| 1464 | 1460 | ||
| 1465 | intel_engine_setup_common(engine); | 1461 | intel_engine_setup_common(engine); |
| @@ -1484,21 +1480,12 @@ static int intel_init_ring_buffer(struct intel_engine_cs *engine) | |||
| 1484 | GEM_BUG_ON(engine->buffer); | 1480 | GEM_BUG_ON(engine->buffer); |
| 1485 | engine->buffer = ring; | 1481 | engine->buffer = ring; |
| 1486 | 1482 | ||
| 1487 | size = PAGE_SIZE; | ||
| 1488 | if (HAS_BROKEN_CS_TLB(engine->i915)) | ||
| 1489 | size = I830_WA_SIZE; | ||
| 1490 | err = intel_engine_create_scratch(engine, size); | ||
| 1491 | if (err) | ||
| 1492 | goto err_unpin; | ||
| 1493 | |||
| 1494 | err = intel_engine_init_common(engine); | 1483 | err = intel_engine_init_common(engine); |
| 1495 | if (err) | 1484 | if (err) |
| 1496 | goto err_scratch; | 1485 | goto err_unpin; |
| 1497 | 1486 | ||
| 1498 | return 0; | 1487 | return 0; |
| 1499 | 1488 | ||
| 1500 | err_scratch: | ||
| 1501 | intel_engine_cleanup_scratch(engine); | ||
| 1502 | err_unpin: | 1489 | err_unpin: |
| 1503 | intel_ring_unpin(ring); | 1490 | intel_ring_unpin(ring); |
| 1504 | err_ring: | 1491 | err_ring: |
| @@ -1572,7 +1559,7 @@ static int flush_pd_dir(struct i915_request *rq) | |||
| 1572 | /* Stall until the page table load is complete */ | 1559 | /* Stall until the page table load is complete */ |
| 1573 | *cs++ = MI_STORE_REGISTER_MEM | MI_SRM_LRM_GLOBAL_GTT; | 1560 | *cs++ = MI_STORE_REGISTER_MEM | MI_SRM_LRM_GLOBAL_GTT; |
| 1574 | *cs++ = i915_mmio_reg_offset(RING_PP_DIR_BASE(engine)); | 1561 | *cs++ = i915_mmio_reg_offset(RING_PP_DIR_BASE(engine)); |
| 1575 | *cs++ = i915_ggtt_offset(engine->scratch); | 1562 | *cs++ = i915_scratch_offset(rq->i915); |
| 1576 | *cs++ = MI_NOOP; | 1563 | *cs++ = MI_NOOP; |
| 1577 | 1564 | ||
| 1578 | intel_ring_advance(rq, cs); | 1565 | intel_ring_advance(rq, cs); |
| @@ -1681,7 +1668,7 @@ static inline int mi_set_context(struct i915_request *rq, u32 flags) | |||
| 1681 | /* Insert a delay before the next switch! */ | 1668 | /* Insert a delay before the next switch! */ |
| 1682 | *cs++ = MI_STORE_REGISTER_MEM | MI_SRM_LRM_GLOBAL_GTT; | 1669 | *cs++ = MI_STORE_REGISTER_MEM | MI_SRM_LRM_GLOBAL_GTT; |
| 1683 | *cs++ = i915_mmio_reg_offset(last_reg); | 1670 | *cs++ = i915_mmio_reg_offset(last_reg); |
| 1684 | *cs++ = i915_ggtt_offset(engine->scratch); | 1671 | *cs++ = i915_scratch_offset(rq->i915); |
| 1685 | *cs++ = MI_NOOP; | 1672 | *cs++ = MI_NOOP; |
| 1686 | } | 1673 | } |
| 1687 | *cs++ = MI_ARB_ON_OFF | MI_ARB_ENABLE; | 1674 | *cs++ = MI_ARB_ON_OFF | MI_ARB_ENABLE; |
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h index 927bb21a2b0b..72edaa7ff411 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.h +++ b/drivers/gpu/drm/i915/intel_ringbuffer.h | |||
| @@ -439,7 +439,6 @@ struct intel_engine_cs { | |||
| 439 | struct i915_wa_list ctx_wa_list; | 439 | struct i915_wa_list ctx_wa_list; |
| 440 | struct i915_wa_list wa_list; | 440 | struct i915_wa_list wa_list; |
| 441 | struct i915_wa_list whitelist; | 441 | struct i915_wa_list whitelist; |
| 442 | struct i915_vma *scratch; | ||
| 443 | 442 | ||
| 444 | u32 irq_keep_mask; /* always keep these interrupts */ | 443 | u32 irq_keep_mask; /* always keep these interrupts */ |
| 445 | u32 irq_enable_mask; /* bitmask to enable ring interrupt */ | 444 | u32 irq_enable_mask; /* bitmask to enable ring interrupt */ |
| @@ -896,10 +895,6 @@ void intel_engine_setup_common(struct intel_engine_cs *engine); | |||
| 896 | int intel_engine_init_common(struct intel_engine_cs *engine); | 895 | int intel_engine_init_common(struct intel_engine_cs *engine); |
| 897 | void intel_engine_cleanup_common(struct intel_engine_cs *engine); | 896 | void intel_engine_cleanup_common(struct intel_engine_cs *engine); |
| 898 | 897 | ||
| 899 | int intel_engine_create_scratch(struct intel_engine_cs *engine, | ||
| 900 | unsigned int size); | ||
| 901 | void intel_engine_cleanup_scratch(struct intel_engine_cs *engine); | ||
| 902 | |||
| 903 | int intel_init_render_ring_buffer(struct intel_engine_cs *engine); | 898 | int intel_init_render_ring_buffer(struct intel_engine_cs *engine); |
| 904 | int intel_init_bsd_ring_buffer(struct intel_engine_cs *engine); | 899 | int intel_init_bsd_ring_buffer(struct intel_engine_cs *engine); |
| 905 | int intel_init_blt_ring_buffer(struct intel_engine_cs *engine); | 900 | int intel_init_blt_ring_buffer(struct intel_engine_cs *engine); |
