|
@@ -424,7 +424,8 @@ static u64 execlists_update_context(struct i915_request *rq)
|
|
|
|
|
|
reg_state[CTX_RING_TAIL+1] = intel_ring_set_tail(rq->ring, rq->tail);
|
|
|
|
|
|
- /* True 32b PPGTT with dynamic page allocation: update PDP
|
|
|
+ /*
|
|
|
+ * True 32b PPGTT with dynamic page allocation: update PDP
|
|
|
* registers and point the unallocated PDPs to scratch page.
|
|
|
* PML4 is allocated during ppgtt init, so this is not needed
|
|
|
* in 48-bit mode.
|
|
@@ -432,6 +433,17 @@ static u64 execlists_update_context(struct i915_request *rq)
|
|
|
if (ppgtt && !i915_vm_is_48bit(&ppgtt->vm))
|
|
|
execlists_update_context_pdps(ppgtt, reg_state);
|
|
|
|
|
|
+ /*
|
|
|
+ * Make sure the context image is complete before we submit it to HW.
|
|
|
+ *
|
|
|
+ * Ostensibly, writes (including the WCB) should be flushed prior to
|
|
|
+ * an uncached write such as our mmio register access, the empirical
|
|
|
+ * evidence (esp. on Braswell) suggests that the WC write into memory
|
|
|
+ * may not be visible to the HW prior to the completion of the UC
|
|
|
+ * register write and that we may begin execution from the context
|
|
|
+ * before its image is complete leading to invalid PD chasing.
|
|
|
+ */
|
|
|
+ wmb();
|
|
|
return ce->lrc_desc;
|
|
|
}
|
|
|
|