diff options
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 63 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_request.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_guc_submission.c | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 30 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp_aux_backlight.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_lrc.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.c | 41 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.h | 19 |
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, | |||
120 | static void skylake_pfit_enable(struct intel_crtc *crtc); | 120 | static void skylake_pfit_enable(struct intel_crtc *crtc); |
121 | static void ironlake_pfit_disable(struct intel_crtc *crtc, bool force); | 121 | static void ironlake_pfit_disable(struct intel_crtc *crtc, bool force); |
122 | static void ironlake_pfit_enable(struct intel_crtc *crtc); | 122 | static void ironlake_pfit_enable(struct intel_crtc *crtc); |
123 | static void intel_modeset_setup_hw_state(struct drm_device *dev); | 123 | static void intel_modeset_setup_hw_state(struct drm_device *dev, |
124 | struct drm_modeset_acquire_ctx *ctx); | ||
124 | static void intel_pre_disable_primary_noatomic(struct drm_crtc *crtc); | 125 | static void intel_pre_disable_primary_noatomic(struct drm_crtc *crtc); |
125 | 126 | ||
126 | struct intel_limit { | 127 | struct 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 | ||
5828 | static void intel_crtc_disable_noatomic(struct drm_crtc *crtc) | 5829 | static 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 | ||
15070 | static void intel_enable_pipe_a(struct drm_device *dev) | 15072 | static 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 | ||
15148 | static void intel_sanitize_crtc(struct intel_crtc *crtc) | 15150 | static 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 | */ |
15507 | static void | 15510 | static void |
15508 | intel_modeset_setup_hw_state(struct drm_device *dev) | 15511 | intel_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 | ||
50 | void intel_ring_update_space(struct intel_ring *ring) | 50 | void 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 | ||
55 | static int | 55 | static 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 | ||
781 | static void i9xx_emit_breadcrumb(struct drm_i915_gem_request *req, u32 *cs) | 781 | static 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 | ||
1319 | void 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 | |||
1319 | void intel_ring_unpin(struct intel_ring *ring) | 1328 | void 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 | ||
1569 | static int ring_request_alloc(struct drm_i915_gem_request *request) | 1582 | static 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) | |||
1641 | u32 *intel_ring_begin(struct drm_i915_gem_request *req, int num_dwords) | 1654 | u32 *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) | |||
1699 | int intel_ring_cacheline_align(struct drm_i915_gem_request *req) | 1712 | int 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) | |||
488 | struct intel_ring * | 489 | struct intel_ring * |
489 | intel_engine_create_ring(struct intel_engine_cs *engine, int size); | 490 | intel_engine_create_ring(struct intel_engine_cs *engine, int size); |
490 | int intel_ring_pin(struct intel_ring *ring, unsigned int offset_bias); | 491 | int intel_ring_pin(struct intel_ring *ring, unsigned int offset_bias); |
492 | void intel_ring_reset(struct intel_ring *ring, u32 tail); | ||
493 | void intel_ring_update_space(struct intel_ring *ring); | ||
491 | void intel_ring_unpin(struct intel_ring *ring); | 494 | void intel_ring_unpin(struct intel_ring *ring); |
492 | void intel_ring_free(struct intel_ring *ring); | 495 | void 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 | ||
517 | static inline u32 | 520 | static 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 | ||
543 | void intel_ring_update_space(struct intel_ring *ring); | 546 | static inline unsigned int |
547 | intel_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 | ||
545 | void intel_engine_init_global_seqno(struct intel_engine_cs *engine, u32 seqno); | 560 | void intel_engine_init_global_seqno(struct intel_engine_cs *engine, u32 seqno); |
546 | 561 | ||