aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c63
-rw-r--r--drivers/gpu/drm/i915/i915_gem_request.c2
-rw-r--r--drivers/gpu/drm/i915/i915_guc_submission.c4
-rw-r--r--drivers/gpu/drm/i915/intel_display.c30
-rw-r--r--drivers/gpu/drm/i915/intel_dp_aux_backlight.c2
-rw-r--r--drivers/gpu/drm/i915/intel_lrc.c6
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.c41
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.h19
8 files changed, 107 insertions, 60 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 462031cbd77f..615f0a855222 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -2285,8 +2285,8 @@ i915_gem_object_get_pages_gtt(struct drm_i915_gem_object *obj)
2285 struct page *page; 2285 struct page *page;
2286 unsigned long last_pfn = 0; /* suppress gcc warning */ 2286 unsigned long last_pfn = 0; /* suppress gcc warning */
2287 unsigned int max_segment; 2287 unsigned int max_segment;
2288 gfp_t noreclaim;
2288 int ret; 2289 int ret;
2289 gfp_t gfp;
2290 2290
2291 /* Assert that the object is not currently in any GPU domain. As it 2291 /* Assert that the object is not currently in any GPU domain. As it
2292 * wasn't in the GTT, there shouldn't be any way it could have been in 2292 * wasn't in the GTT, there shouldn't be any way it could have been in
@@ -2315,22 +2315,31 @@ rebuild_st:
2315 * Fail silently without starting the shrinker 2315 * Fail silently without starting the shrinker
2316 */ 2316 */
2317 mapping = obj->base.filp->f_mapping; 2317 mapping = obj->base.filp->f_mapping;
2318 gfp = mapping_gfp_constraint(mapping, ~(__GFP_IO | __GFP_RECLAIM)); 2318 noreclaim = mapping_gfp_constraint(mapping,
2319 gfp |= __GFP_NORETRY | __GFP_NOWARN; 2319 ~(__GFP_IO | __GFP_RECLAIM));
2320 noreclaim |= __GFP_NORETRY | __GFP_NOWARN;
2321
2320 sg = st->sgl; 2322 sg = st->sgl;
2321 st->nents = 0; 2323 st->nents = 0;
2322 for (i = 0; i < page_count; i++) { 2324 for (i = 0; i < page_count; i++) {
2323 page = shmem_read_mapping_page_gfp(mapping, i, gfp); 2325 const unsigned int shrink[] = {
2324 if (unlikely(IS_ERR(page))) { 2326 I915_SHRINK_BOUND | I915_SHRINK_UNBOUND | I915_SHRINK_PURGEABLE,
2325 i915_gem_shrink(dev_priv, 2327 0,
2326 page_count, 2328 }, *s = shrink;
2327 I915_SHRINK_BOUND | 2329 gfp_t gfp = noreclaim;
2328 I915_SHRINK_UNBOUND | 2330
2329 I915_SHRINK_PURGEABLE); 2331 do {
2330 page = shmem_read_mapping_page_gfp(mapping, i, gfp); 2332 page = shmem_read_mapping_page_gfp(mapping, i, gfp);
2331 } 2333 if (likely(!IS_ERR(page)))
2332 if (unlikely(IS_ERR(page))) { 2334 break;
2333 gfp_t reclaim; 2335
2336 if (!*s) {
2337 ret = PTR_ERR(page);
2338 goto err_sg;
2339 }
2340
2341 i915_gem_shrink(dev_priv, 2 * page_count, *s++);
2342 cond_resched();
2334 2343
2335 /* We've tried hard to allocate the memory by reaping 2344 /* We've tried hard to allocate the memory by reaping
2336 * our own buffer, now let the real VM do its job and 2345 * our own buffer, now let the real VM do its job and
@@ -2340,15 +2349,26 @@ rebuild_st:
2340 * defer the oom here by reporting the ENOMEM back 2349 * defer the oom here by reporting the ENOMEM back
2341 * to userspace. 2350 * to userspace.
2342 */ 2351 */
2343 reclaim = mapping_gfp_mask(mapping); 2352 if (!*s) {
2344 reclaim |= __GFP_NORETRY; /* reclaim, but no oom */ 2353 /* reclaim and warn, but no oom */
2345 2354 gfp = mapping_gfp_mask(mapping);
2346 page = shmem_read_mapping_page_gfp(mapping, i, reclaim); 2355
2347 if (IS_ERR(page)) { 2356 /* Our bo are always dirty and so we require
2348 ret = PTR_ERR(page); 2357 * kswapd to reclaim our pages (direct reclaim
2349 goto err_sg; 2358 * does not effectively begin pageout of our
2359 * buffers on its own). However, direct reclaim
2360 * only waits for kswapd when under allocation
2361 * congestion. So as a result __GFP_RECLAIM is
2362 * unreliable and fails to actually reclaim our
2363 * dirty pages -- unless you try over and over
2364 * again with !__GFP_NORETRY. However, we still
2365 * want to fail this allocation rather than
2366 * trigger the out-of-memory killer and for
2367 * this we want the future __GFP_MAYFAIL.
2368 */
2350 } 2369 }
2351 } 2370 } while (1);
2371
2352 if (!i || 2372 if (!i ||
2353 sg->length >= max_segment || 2373 sg->length >= max_segment ||
2354 page_to_pfn(page) != last_pfn + 1) { 2374 page_to_pfn(page) != last_pfn + 1) {
@@ -4222,6 +4242,7 @@ i915_gem_object_create(struct drm_i915_private *dev_priv, u64 size)
4222 4242
4223 mapping = obj->base.filp->f_mapping; 4243 mapping = obj->base.filp->f_mapping;
4224 mapping_set_gfp_mask(mapping, mask); 4244 mapping_set_gfp_mask(mapping, mask);
4245 GEM_BUG_ON(!(mapping_gfp_mask(mapping) & __GFP_RECLAIM));
4225 4246
4226 i915_gem_object_init(obj, &i915_gem_object_ops); 4247 i915_gem_object_init(obj, &i915_gem_object_ops);
4227 4248
diff --git a/drivers/gpu/drm/i915/i915_gem_request.c b/drivers/gpu/drm/i915/i915_gem_request.c
index 5ddbc9499775..a74d0ac737cb 100644
--- a/drivers/gpu/drm/i915/i915_gem_request.c
+++ b/drivers/gpu/drm/i915/i915_gem_request.c
@@ -623,7 +623,7 @@ i915_gem_request_alloc(struct intel_engine_cs *engine,
623 * GPU processing the request, we never over-estimate the 623 * GPU processing the request, we never over-estimate the
624 * position of the head. 624 * position of the head.
625 */ 625 */
626 req->head = req->ring->tail; 626 req->head = req->ring->emit;
627 627
628 /* Check that we didn't interrupt ourselves with a new request */ 628 /* Check that we didn't interrupt ourselves with a new request */
629 GEM_BUG_ON(req->timeline->seqno != req->fence.seqno); 629 GEM_BUG_ON(req->timeline->seqno != req->fence.seqno);
diff --git a/drivers/gpu/drm/i915/i915_guc_submission.c b/drivers/gpu/drm/i915/i915_guc_submission.c
index 1642fff9cf13..ab5140ba108d 100644
--- a/drivers/gpu/drm/i915/i915_guc_submission.c
+++ b/drivers/gpu/drm/i915/i915_guc_submission.c
@@ -480,9 +480,7 @@ static void guc_wq_item_append(struct i915_guc_client *client,
480 GEM_BUG_ON(freespace < wqi_size); 480 GEM_BUG_ON(freespace < wqi_size);
481 481
482 /* The GuC firmware wants the tail index in QWords, not bytes */ 482 /* The GuC firmware wants the tail index in QWords, not bytes */
483 tail = rq->tail; 483 tail = intel_ring_set_tail(rq->ring, rq->tail) >> 3;
484 assert_ring_tail_valid(rq->ring, rq->tail);
485 tail >>= 3;
486 GEM_BUG_ON(tail > WQ_RING_TAIL_MAX); 484 GEM_BUG_ON(tail > WQ_RING_TAIL_MAX);
487 485
488 /* For now workqueue item is 4 DWs; workqueue buffer is 2 pages. So we 486 /* For now workqueue item is 4 DWs; workqueue buffer is 2 pages. So we
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 96b0b01677e2..9106ea32b048 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -120,7 +120,8 @@ static void intel_crtc_init_scalers(struct intel_crtc *crtc,
120static void skylake_pfit_enable(struct intel_crtc *crtc); 120static void skylake_pfit_enable(struct intel_crtc *crtc);
121static void ironlake_pfit_disable(struct intel_crtc *crtc, bool force); 121static void ironlake_pfit_disable(struct intel_crtc *crtc, bool force);
122static void ironlake_pfit_enable(struct intel_crtc *crtc); 122static void ironlake_pfit_enable(struct intel_crtc *crtc);
123static void intel_modeset_setup_hw_state(struct drm_device *dev); 123static void intel_modeset_setup_hw_state(struct drm_device *dev,
124 struct drm_modeset_acquire_ctx *ctx);
124static void intel_pre_disable_primary_noatomic(struct drm_crtc *crtc); 125static void intel_pre_disable_primary_noatomic(struct drm_crtc *crtc);
125 126
126struct intel_limit { 127struct intel_limit {
@@ -3449,7 +3450,7 @@ __intel_display_resume(struct drm_device *dev,
3449 struct drm_crtc *crtc; 3450 struct drm_crtc *crtc;
3450 int i, ret; 3451 int i, ret;
3451 3452
3452 intel_modeset_setup_hw_state(dev); 3453 intel_modeset_setup_hw_state(dev, ctx);
3453 i915_redisable_vga(to_i915(dev)); 3454 i915_redisable_vga(to_i915(dev));
3454 3455
3455 if (!state) 3456 if (!state)
@@ -5825,7 +5826,8 @@ static void i9xx_crtc_disable(struct intel_crtc_state *old_crtc_state,
5825 intel_update_watermarks(intel_crtc); 5826 intel_update_watermarks(intel_crtc);
5826} 5827}
5827 5828
5828static void intel_crtc_disable_noatomic(struct drm_crtc *crtc) 5829static void intel_crtc_disable_noatomic(struct drm_crtc *crtc,
5830 struct drm_modeset_acquire_ctx *ctx)
5829{ 5831{
5830 struct intel_encoder *encoder; 5832 struct intel_encoder *encoder;
5831 struct intel_crtc *intel_crtc = to_intel_crtc(crtc); 5833 struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
@@ -5855,7 +5857,7 @@ static void intel_crtc_disable_noatomic(struct drm_crtc *crtc)
5855 return; 5857 return;
5856 } 5858 }
5857 5859
5858 state->acquire_ctx = crtc->dev->mode_config.acquire_ctx; 5860 state->acquire_ctx = ctx;
5859 5861
5860 /* Everything's already locked, -EDEADLK can't happen. */ 5862 /* Everything's already locked, -EDEADLK can't happen. */
5861 crtc_state = intel_atomic_get_crtc_state(state, intel_crtc); 5863 crtc_state = intel_atomic_get_crtc_state(state, intel_crtc);
@@ -15030,7 +15032,7 @@ int intel_modeset_init(struct drm_device *dev)
15030 intel_setup_outputs(dev_priv); 15032 intel_setup_outputs(dev_priv);
15031 15033
15032 drm_modeset_lock_all(dev); 15034 drm_modeset_lock_all(dev);
15033 intel_modeset_setup_hw_state(dev); 15035 intel_modeset_setup_hw_state(dev, dev->mode_config.acquire_ctx);
15034 drm_modeset_unlock_all(dev); 15036 drm_modeset_unlock_all(dev);
15035 15037
15036 for_each_intel_crtc(dev, crtc) { 15038 for_each_intel_crtc(dev, crtc) {
@@ -15067,13 +15069,13 @@ int intel_modeset_init(struct drm_device *dev)
15067 return 0; 15069 return 0;
15068} 15070}
15069 15071
15070static void intel_enable_pipe_a(struct drm_device *dev) 15072static void intel_enable_pipe_a(struct drm_device *dev,
15073 struct drm_modeset_acquire_ctx *ctx)
15071{ 15074{
15072 struct intel_connector *connector; 15075 struct intel_connector *connector;
15073 struct drm_connector_list_iter conn_iter; 15076 struct drm_connector_list_iter conn_iter;
15074 struct drm_connector *crt = NULL; 15077 struct drm_connector *crt = NULL;
15075 struct intel_load_detect_pipe load_detect_temp; 15078 struct intel_load_detect_pipe load_detect_temp;
15076 struct drm_modeset_acquire_ctx *ctx = dev->mode_config.acquire_ctx;
15077 int ret; 15079 int ret;
15078 15080
15079 /* We can't just switch on the pipe A, we need to set things up with a 15081 /* We can't just switch on the pipe A, we need to set things up with a
@@ -15145,7 +15147,8 @@ static bool has_pch_trancoder(struct drm_i915_private *dev_priv,
15145 (HAS_PCH_LPT_H(dev_priv) && pch_transcoder == TRANSCODER_A); 15147 (HAS_PCH_LPT_H(dev_priv) && pch_transcoder == TRANSCODER_A);
15146} 15148}
15147 15149
15148static void intel_sanitize_crtc(struct intel_crtc *crtc) 15150static void intel_sanitize_crtc(struct intel_crtc *crtc,
15151 struct drm_modeset_acquire_ctx *ctx)
15149{ 15152{
15150 struct drm_device *dev = crtc->base.dev; 15153 struct drm_device *dev = crtc->base.dev;
15151 struct drm_i915_private *dev_priv = to_i915(dev); 15154 struct drm_i915_private *dev_priv = to_i915(dev);
@@ -15191,7 +15194,7 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc)
15191 plane = crtc->plane; 15194 plane = crtc->plane;
15192 crtc->base.primary->state->visible = true; 15195 crtc->base.primary->state->visible = true;
15193 crtc->plane = !plane; 15196 crtc->plane = !plane;
15194 intel_crtc_disable_noatomic(&crtc->base); 15197 intel_crtc_disable_noatomic(&crtc->base, ctx);
15195 crtc->plane = plane; 15198 crtc->plane = plane;
15196 } 15199 }
15197 15200
@@ -15201,13 +15204,13 @@ static void intel_sanitize_crtc(struct intel_crtc *crtc)
15201 * resume. Force-enable the pipe to fix this, the update_dpms 15204 * resume. Force-enable the pipe to fix this, the update_dpms
15202 * call below we restore the pipe to the right state, but leave 15205 * call below we restore the pipe to the right state, but leave
15203 * the required bits on. */ 15206 * the required bits on. */
15204 intel_enable_pipe_a(dev); 15207 intel_enable_pipe_a(dev, ctx);
15205 } 15208 }
15206 15209
15207 /* Adjust the state of the output pipe according to whether we 15210 /* Adjust the state of the output pipe according to whether we
15208 * have active connectors/encoders. */ 15211 * have active connectors/encoders. */
15209 if (crtc->active && !intel_crtc_has_encoders(crtc)) 15212 if (crtc->active && !intel_crtc_has_encoders(crtc))
15210 intel_crtc_disable_noatomic(&crtc->base); 15213 intel_crtc_disable_noatomic(&crtc->base, ctx);
15211 15214
15212 if (crtc->active || HAS_GMCH_DISPLAY(dev_priv)) { 15215 if (crtc->active || HAS_GMCH_DISPLAY(dev_priv)) {
15213 /* 15216 /*
@@ -15505,7 +15508,8 @@ get_encoder_power_domains(struct drm_i915_private *dev_priv)
15505 * and sanitizes it to the current state 15508 * and sanitizes it to the current state
15506 */ 15509 */
15507static void 15510static void
15508intel_modeset_setup_hw_state(struct drm_device *dev) 15511intel_modeset_setup_hw_state(struct drm_device *dev,
15512 struct drm_modeset_acquire_ctx *ctx)
15509{ 15513{
15510 struct drm_i915_private *dev_priv = to_i915(dev); 15514 struct drm_i915_private *dev_priv = to_i915(dev);
15511 enum pipe pipe; 15515 enum pipe pipe;
@@ -15525,7 +15529,7 @@ intel_modeset_setup_hw_state(struct drm_device *dev)
15525 for_each_pipe(dev_priv, pipe) { 15529 for_each_pipe(dev_priv, pipe) {
15526 crtc = intel_get_crtc_for_pipe(dev_priv, pipe); 15530 crtc = intel_get_crtc_for_pipe(dev_priv, pipe);
15527 15531
15528 intel_sanitize_crtc(crtc); 15532 intel_sanitize_crtc(crtc, ctx);
15529 intel_dump_pipe_config(crtc, crtc->config, 15533 intel_dump_pipe_config(crtc, crtc->config,
15530 "[setup_hw_state]"); 15534 "[setup_hw_state]");
15531 } 15535 }
diff --git a/drivers/gpu/drm/i915/intel_dp_aux_backlight.c b/drivers/gpu/drm/i915/intel_dp_aux_backlight.c
index 6532e226db29..40ba3134545e 100644
--- a/drivers/gpu/drm/i915/intel_dp_aux_backlight.c
+++ b/drivers/gpu/drm/i915/intel_dp_aux_backlight.c
@@ -119,8 +119,6 @@ static int intel_dp_aux_setup_backlight(struct intel_connector *connector,
119 struct intel_dp *intel_dp = enc_to_intel_dp(&connector->encoder->base); 119 struct intel_dp *intel_dp = enc_to_intel_dp(&connector->encoder->base);
120 struct intel_panel *panel = &connector->panel; 120 struct intel_panel *panel = &connector->panel;
121 121
122 intel_dp_aux_enable_backlight(connector);
123
124 if (intel_dp->edp_dpcd[2] & DP_EDP_BACKLIGHT_BRIGHTNESS_BYTE_COUNT) 122 if (intel_dp->edp_dpcd[2] & DP_EDP_BACKLIGHT_BRIGHTNESS_BYTE_COUNT)
125 panel->backlight.max = 0xFFFF; 123 panel->backlight.max = 0xFFFF;
126 else 124 else
diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
index dac4e003c1f3..62f44d3e7c43 100644
--- a/drivers/gpu/drm/i915/intel_lrc.c
+++ b/drivers/gpu/drm/i915/intel_lrc.c
@@ -326,8 +326,7 @@ static u64 execlists_update_context(struct drm_i915_gem_request *rq)
326 rq->ctx->ppgtt ?: rq->i915->mm.aliasing_ppgtt; 326 rq->ctx->ppgtt ?: rq->i915->mm.aliasing_ppgtt;
327 u32 *reg_state = ce->lrc_reg_state; 327 u32 *reg_state = ce->lrc_reg_state;
328 328
329 assert_ring_tail_valid(rq->ring, rq->tail); 329 reg_state[CTX_RING_TAIL+1] = intel_ring_set_tail(rq->ring, rq->tail);
330 reg_state[CTX_RING_TAIL+1] = rq->tail;
331 330
332 /* True 32b PPGTT with dynamic page allocation: update PDP 331 /* True 32b PPGTT with dynamic page allocation: update PDP
333 * registers and point the unallocated PDPs to scratch page. 332 * registers and point the unallocated PDPs to scratch page.
@@ -2036,8 +2035,7 @@ void intel_lr_context_resume(struct drm_i915_private *dev_priv)
2036 ce->state->obj->mm.dirty = true; 2035 ce->state->obj->mm.dirty = true;
2037 i915_gem_object_unpin_map(ce->state->obj); 2036 i915_gem_object_unpin_map(ce->state->obj);
2038 2037
2039 ce->ring->head = ce->ring->tail = 0; 2038 intel_ring_reset(ce->ring, 0);
2040 intel_ring_update_space(ce->ring);
2041 } 2039 }
2042 } 2040 }
2043} 2041}
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
index 66a2b8b83972..513a0f4b469b 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
@@ -49,7 +49,7 @@ static int __intel_ring_space(int head, int tail, int size)
49 49
50void intel_ring_update_space(struct intel_ring *ring) 50void intel_ring_update_space(struct intel_ring *ring)
51{ 51{
52 ring->space = __intel_ring_space(ring->head, ring->tail, ring->size); 52 ring->space = __intel_ring_space(ring->head, ring->emit, ring->size);
53} 53}
54 54
55static int 55static int
@@ -774,8 +774,8 @@ static void i9xx_submit_request(struct drm_i915_gem_request *request)
774 774
775 i915_gem_request_submit(request); 775 i915_gem_request_submit(request);
776 776
777 assert_ring_tail_valid(request->ring, request->tail); 777 I915_WRITE_TAIL(request->engine,
778 I915_WRITE_TAIL(request->engine, request->tail); 778 intel_ring_set_tail(request->ring, request->tail));
779} 779}
780 780
781static void i9xx_emit_breadcrumb(struct drm_i915_gem_request *req, u32 *cs) 781static void i9xx_emit_breadcrumb(struct drm_i915_gem_request *req, u32 *cs)
@@ -1316,11 +1316,23 @@ err:
1316 return PTR_ERR(addr); 1316 return PTR_ERR(addr);
1317} 1317}
1318 1318
1319void intel_ring_reset(struct intel_ring *ring, u32 tail)
1320{
1321 GEM_BUG_ON(!list_empty(&ring->request_list));
1322 ring->tail = tail;
1323 ring->head = tail;
1324 ring->emit = tail;
1325 intel_ring_update_space(ring);
1326}
1327
1319void intel_ring_unpin(struct intel_ring *ring) 1328void intel_ring_unpin(struct intel_ring *ring)
1320{ 1329{
1321 GEM_BUG_ON(!ring->vma); 1330 GEM_BUG_ON(!ring->vma);
1322 GEM_BUG_ON(!ring->vaddr); 1331 GEM_BUG_ON(!ring->vaddr);
1323 1332
1333 /* Discard any unused bytes beyond that submitted to hw. */
1334 intel_ring_reset(ring, ring->tail);
1335
1324 if (i915_vma_is_map_and_fenceable(ring->vma)) 1336 if (i915_vma_is_map_and_fenceable(ring->vma))
1325 i915_vma_unpin_iomap(ring->vma); 1337 i915_vma_unpin_iomap(ring->vma);
1326 else 1338 else
@@ -1562,8 +1574,9 @@ void intel_legacy_submission_resume(struct drm_i915_private *dev_priv)
1562 struct intel_engine_cs *engine; 1574 struct intel_engine_cs *engine;
1563 enum intel_engine_id id; 1575 enum intel_engine_id id;
1564 1576
1577 /* Restart from the beginning of the rings for convenience */
1565 for_each_engine(engine, dev_priv, id) 1578 for_each_engine(engine, dev_priv, id)
1566 engine->buffer->head = engine->buffer->tail; 1579 intel_ring_reset(engine->buffer, 0);
1567} 1580}
1568 1581
1569static int ring_request_alloc(struct drm_i915_gem_request *request) 1582static int ring_request_alloc(struct drm_i915_gem_request *request)
@@ -1616,7 +1629,7 @@ static int wait_for_space(struct drm_i915_gem_request *req, int bytes)
1616 unsigned space; 1629 unsigned space;
1617 1630
1618 /* Would completion of this request free enough space? */ 1631 /* Would completion of this request free enough space? */
1619 space = __intel_ring_space(target->postfix, ring->tail, 1632 space = __intel_ring_space(target->postfix, ring->emit,
1620 ring->size); 1633 ring->size);
1621 if (space >= bytes) 1634 if (space >= bytes)
1622 break; 1635 break;
@@ -1641,8 +1654,8 @@ static int wait_for_space(struct drm_i915_gem_request *req, int bytes)
1641u32 *intel_ring_begin(struct drm_i915_gem_request *req, int num_dwords) 1654u32 *intel_ring_begin(struct drm_i915_gem_request *req, int num_dwords)
1642{ 1655{
1643 struct intel_ring *ring = req->ring; 1656 struct intel_ring *ring = req->ring;
1644 int remain_actual = ring->size - ring->tail; 1657 int remain_actual = ring->size - ring->emit;
1645 int remain_usable = ring->effective_size - ring->tail; 1658 int remain_usable = ring->effective_size - ring->emit;
1646 int bytes = num_dwords * sizeof(u32); 1659 int bytes = num_dwords * sizeof(u32);
1647 int total_bytes, wait_bytes; 1660 int total_bytes, wait_bytes;
1648 bool need_wrap = false; 1661 bool need_wrap = false;
@@ -1678,17 +1691,17 @@ u32 *intel_ring_begin(struct drm_i915_gem_request *req, int num_dwords)
1678 1691
1679 if (unlikely(need_wrap)) { 1692 if (unlikely(need_wrap)) {
1680 GEM_BUG_ON(remain_actual > ring->space); 1693 GEM_BUG_ON(remain_actual > ring->space);
1681 GEM_BUG_ON(ring->tail + remain_actual > ring->size); 1694 GEM_BUG_ON(ring->emit + remain_actual > ring->size);
1682 1695
1683 /* Fill the tail with MI_NOOP */ 1696 /* Fill the tail with MI_NOOP */
1684 memset(ring->vaddr + ring->tail, 0, remain_actual); 1697 memset(ring->vaddr + ring->emit, 0, remain_actual);
1685 ring->tail = 0; 1698 ring->emit = 0;
1686 ring->space -= remain_actual; 1699 ring->space -= remain_actual;
1687 } 1700 }
1688 1701
1689 GEM_BUG_ON(ring->tail > ring->size - bytes); 1702 GEM_BUG_ON(ring->emit > ring->size - bytes);
1690 cs = ring->vaddr + ring->tail; 1703 cs = ring->vaddr + ring->emit;
1691 ring->tail += bytes; 1704 ring->emit += bytes;
1692 ring->space -= bytes; 1705 ring->space -= bytes;
1693 GEM_BUG_ON(ring->space < 0); 1706 GEM_BUG_ON(ring->space < 0);
1694 1707
@@ -1699,7 +1712,7 @@ u32 *intel_ring_begin(struct drm_i915_gem_request *req, int num_dwords)
1699int intel_ring_cacheline_align(struct drm_i915_gem_request *req) 1712int intel_ring_cacheline_align(struct drm_i915_gem_request *req)
1700{ 1713{
1701 int num_dwords = 1714 int num_dwords =
1702 (req->ring->tail & (CACHELINE_BYTES - 1)) / sizeof(uint32_t); 1715 (req->ring->emit & (CACHELINE_BYTES - 1)) / sizeof(uint32_t);
1703 u32 *cs; 1716 u32 *cs;
1704 1717
1705 if (num_dwords == 0) 1718 if (num_dwords == 0)
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
index a82a0807f64d..f7144fe09613 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.h
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
@@ -145,6 +145,7 @@ struct intel_ring {
145 145
146 u32 head; 146 u32 head;
147 u32 tail; 147 u32 tail;
148 u32 emit;
148 149
149 int space; 150 int space;
150 int size; 151 int size;
@@ -488,6 +489,8 @@ intel_write_status_page(struct intel_engine_cs *engine, int reg, u32 value)
488struct intel_ring * 489struct intel_ring *
489intel_engine_create_ring(struct intel_engine_cs *engine, int size); 490intel_engine_create_ring(struct intel_engine_cs *engine, int size);
490int intel_ring_pin(struct intel_ring *ring, unsigned int offset_bias); 491int intel_ring_pin(struct intel_ring *ring, unsigned int offset_bias);
492void intel_ring_reset(struct intel_ring *ring, u32 tail);
493void intel_ring_update_space(struct intel_ring *ring);
491void intel_ring_unpin(struct intel_ring *ring); 494void intel_ring_unpin(struct intel_ring *ring);
492void intel_ring_free(struct intel_ring *ring); 495void intel_ring_free(struct intel_ring *ring);
493 496
@@ -511,7 +514,7 @@ intel_ring_advance(struct drm_i915_gem_request *req, u32 *cs)
511 * reserved for the command packet (i.e. the value passed to 514 * reserved for the command packet (i.e. the value passed to
512 * intel_ring_begin()). 515 * intel_ring_begin()).
513 */ 516 */
514 GEM_BUG_ON((req->ring->vaddr + req->ring->tail) != cs); 517 GEM_BUG_ON((req->ring->vaddr + req->ring->emit) != cs);
515} 518}
516 519
517static inline u32 520static inline u32
@@ -540,7 +543,19 @@ assert_ring_tail_valid(const struct intel_ring *ring, unsigned int tail)
540 GEM_BUG_ON(tail >= ring->size); 543 GEM_BUG_ON(tail >= ring->size);
541} 544}
542 545
543void intel_ring_update_space(struct intel_ring *ring); 546static inline unsigned int
547intel_ring_set_tail(struct intel_ring *ring, unsigned int tail)
548{
549 /* Whilst writes to the tail are strictly order, there is no
550 * serialisation between readers and the writers. The tail may be
551 * read by i915_gem_request_retire() just as it is being updated
552 * by execlists, as although the breadcrumb is complete, the context
553 * switch hasn't been seen.
554 */
555 assert_ring_tail_valid(ring, tail);
556 ring->tail = tail;
557 return tail;
558}
544 559
545void intel_engine_init_global_seqno(struct intel_engine_cs *engine, u32 seqno); 560void intel_engine_init_global_seqno(struct intel_engine_cs *engine, u32 seqno);
546 561