diff --git a/repos/os/src/drivers/gpu/intel/main.cc b/repos/os/src/drivers/gpu/intel/main.cc index 1b1d63a6c0..320f41ae48 100644 --- a/repos/os/src/drivers/gpu/intel/main.cc +++ b/repos/os/src/drivers/gpu/intel/main.cc @@ -564,7 +564,8 @@ struct Igd::Device Ring_buffer::Index advance = 0; - size_t const need = 4 /* batchbuffer cmd */ + 6 /* prolog */ + 16 /* epilog + w/a */; + size_t const need = 4 /* batchbuffer cmd */ + 6 /* prolog */ + 16 /* epilog + w/a */ + + (_device.generation().value == 9) ? 6 : 0; if (!el.ring_avail(need)) { el.ring_reset_and_fill_zero(); } /* save old tail */ @@ -576,6 +577,21 @@ struct Igd::Device * Pipeline synchronization */ + /* + * on GEN9: emit empty pipe control before VF_CACHE_INVALIDATE + * - Linux 5.13 gen8_emit_flush_rcs() + */ + if (_device.generation().value == 9) { + enum { CMD_NUM = 6 }; + Genode::uint32_t cmd[CMD_NUM] = {}; + Igd::Pipe_control pc(CMD_NUM); + cmd[0] = pc.value; + + for (size_t i = 0; i < CMD_NUM; i++) { + advance += el.ring_append(cmd[i]); + } + } + /* prolog */ if (1) {