From b6cfb5a8fefe141f0d630fbc44b54da992d5dd97 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Josef=20S=C3=B6ntgen?= Date: Mon, 20 Jun 2022 17:48:55 +0200 Subject: [PATCH] gpu_session: add PPGTT address query function Using the 'query_buffer_ppgtt()' function allows for retrieving the virtual address of the buffer in the PPGTT. This is for components that manage the GPU virtual addresses rather than the client as is the case with the lima driver. Issue #4559. --- repos/os/include/gpu_session/client.h | 3 +++ repos/os/include/gpu_session/gpu_session.h | 12 ++++++++++-- repos/os/src/drivers/gpu/intel/main.cc | 17 +++++++++++++++++ repos/os/src/server/black_hole/gpu.h | 5 +++++ 4 files changed, 35 insertions(+), 2 deletions(-) diff --git a/repos/os/include/gpu_session/client.h b/repos/os/include/gpu_session/client.h index f98d6bda2b..24491bdefa 100644 --- a/repos/os/include/gpu_session/client.h +++ b/repos/os/include/gpu_session/client.h @@ -76,6 +76,9 @@ class Gpu::Session_client : public Genode::Rpc_client void unmap_buffer_ppgtt(Buffer_id id, Gpu::addr_t va) override { call(id, va); } + Gpu::addr_t query_buffer_ppgtt(Gpu::Buffer_id id) override { + return call(id); } + bool set_tiling(Buffer_id id, unsigned mode) override { return call(id, mode); } }; diff --git a/repos/os/include/gpu_session/gpu_session.h b/repos/os/include/gpu_session/gpu_session.h index bb2547a828..6fcc1f9b9d 100644 --- a/repos/os/include/gpu_session/gpu_session.h +++ b/repos/os/include/gpu_session/gpu_session.h @@ -197,7 +197,14 @@ struct Gpu::Session : public Genode::Session * * \param id buffer id */ - virtual void unmap_buffer_ppgtt(Buffer_id id, Gpu::addr_t) = 0; + virtual void unmap_buffer_ppgtt(Buffer_id id, Gpu::addr_t va) = 0; + + /** + * Get virtual address of buffer in the PPGTT + * + * \param id buffer id to be associated with the buffer + */ + virtual Gpu::addr_t query_buffer_ppgtt(Buffer_id) = 0; /** * Set tiling for buffer @@ -237,6 +244,7 @@ struct Gpu::Session : public Genode::Session Gpu::Buffer_id, Gpu::addr_t); GENODE_RPC(Rpc_unmap_buffer_ppgtt, void, unmap_buffer_ppgtt, Gpu::Buffer_id, Gpu::addr_t); + GENODE_RPC(Rpc_query_buffer_ppgtt, Gpu::addr_t, query_buffer_ppgtt, Gpu::Buffer_id); GENODE_RPC(Rpc_set_tiling, bool, set_tiling, Gpu::Buffer_id, unsigned); @@ -244,7 +252,7 @@ struct Gpu::Session : public Genode::Session Rpc_complete, Rpc_completion_sigh, Rpc_alloc_buffer, Rpc_free_buffer, Rpc_export_buffer, Rpc_import_buffer, Rpc_map_buffer, Rpc_unmap_buffer, - Rpc_map_buffer_ppgtt, Rpc_unmap_buffer_ppgtt, + Rpc_map_buffer_ppgtt, Rpc_unmap_buffer_ppgtt, Rpc_query_buffer_ppgtt, Rpc_set_tiling); }; diff --git a/repos/os/src/drivers/gpu/intel/main.cc b/repos/os/src/drivers/gpu/intel/main.cc index 3a56b1cb7e..51ffb00c29 100644 --- a/repos/os/src/drivers/gpu/intel/main.cc +++ b/repos/os/src/drivers/gpu/intel/main.cc @@ -2016,6 +2016,23 @@ class Gpu::Session_component : public Genode::Session_object _apply_buffer_local(id, lookup_and_unmap); } + Gpu::addr_t query_buffer_ppgtt(Gpu::Buffer_id id) override + { + Gpu::addr_t result = (Gpu::addr_t)-1; + + auto lookup_va = [&] (Buffer_local &buffer_local) { + + if (!buffer_local.ppgtt_va_valid) { + Genode::error("buffer not mapped"); + return; + } + + result = buffer_local.ppgtt_va; + }; + _apply_buffer_local(id, lookup_va); + return result; + } + bool set_tiling(Gpu::Buffer_id id, Genode::uint32_t const mode) override { diff --git a/repos/os/src/server/black_hole/gpu.h b/repos/os/src/server/black_hole/gpu.h index cb8c0dff37..7a624c201a 100644 --- a/repos/os/src/server/black_hole/gpu.h +++ b/repos/os/src/server/black_hole/gpu.h @@ -113,6 +113,11 @@ class Black_hole::Gpu_session : public Session_object Gpu::addr_t /* va */) override { } + Gpu::addr_t query_buffer_ppgtt(Buffer_id /* id */) override + { + return (Gpu::addr_t)-1; + } + bool set_tiling(Buffer_id /* id */, uint32_t const /* mode */) override {