From 50fc2aa2519e5c57b006ed13e0bb974bd10c5549 Mon Sep 17 00:00:00 2001 From: Martin Stein Date: Mon, 14 Mar 2022 17:30:33 +0100 Subject: [PATCH] black_hole: provide Gpu service Ref #4419 --- repos/os/recipes/pkg/black_hole/runtime | 2 + repos/os/recipes/pkg/test-black_hole/hash | 2 +- repos/os/recipes/pkg/test-black_hole/runtime | 5 +- repos/os/recipes/src/black_hole/hash | 2 +- repos/os/recipes/src/black_hole/used_apis | 1 + .../os/recipes/src/test-black_hole/used_apis | 1 + repos/os/src/server/black_hole/README | 2 + repos/os/src/server/black_hole/config.xsd | 1 + repos/os/src/server/black_hole/gpu.h | 171 ++++++++++++++++++ repos/os/src/server/black_hole/main.cc | 6 + repos/os/src/test/black_hole/main.cc | 2 + 11 files changed, 192 insertions(+), 3 deletions(-) create mode 100644 repos/os/src/server/black_hole/gpu.h diff --git a/repos/os/recipes/pkg/black_hole/runtime b/repos/os/recipes/pkg/black_hole/runtime index 1a4c938ea0..151b976374 100644 --- a/repos/os/recipes/pkg/black_hole/runtime +++ b/repos/os/recipes/pkg/black_hole/runtime @@ -8,6 +8,7 @@ + @@ -18,6 +19,7 @@ + diff --git a/repos/os/recipes/pkg/test-black_hole/hash b/repos/os/recipes/pkg/test-black_hole/hash index 768d031f6e..7ed84ff9ae 100644 --- a/repos/os/recipes/pkg/test-black_hole/hash +++ b/repos/os/recipes/pkg/test-black_hole/hash @@ -1 +1 @@ -2022-02-27 fe6aa1093a593ebb302573fcb11dab869c1acb0f +2022-03-14-a 6724cbbd02509f6ad5090732cbd0603996a364f6 diff --git a/repos/os/recipes/pkg/test-black_hole/runtime b/repos/os/recipes/pkg/test-black_hole/runtime index af214040be..a6a7158d1b 100644 --- a/repos/os/recipes/pkg/test-black_hole/runtime +++ b/repos/os/recipes/pkg/test-black_hole/runtime @@ -30,6 +30,7 @@ + @@ -39,6 +40,7 @@ + @@ -56,9 +58,10 @@ - + + diff --git a/repos/os/recipes/src/black_hole/hash b/repos/os/recipes/src/black_hole/hash index 102de3fdfa..a250f7076e 100644 --- a/repos/os/recipes/src/black_hole/hash +++ b/repos/os/recipes/src/black_hole/hash @@ -1 +1 @@ -2022-02-27 cc6e9715322ae66af7bb35c04f219ababd98c093 +2022-03-14-a 3803170cb66f1d232ca2b73416503d11d691568b diff --git a/repos/os/recipes/src/black_hole/used_apis b/repos/os/recipes/src/black_hole/used_apis index d9b80bac1d..c7a5c95daa 100644 --- a/repos/os/recipes/src/black_hole/used_apis +++ b/repos/os/recipes/src/black_hole/used_apis @@ -5,4 +5,5 @@ capture_session event_session nic_session uplink_session +gpu_session os diff --git a/repos/os/recipes/src/test-black_hole/used_apis b/repos/os/recipes/src/test-black_hole/used_apis index 53873ce068..94e0398cf3 100644 --- a/repos/os/recipes/src/test-black_hole/used_apis +++ b/repos/os/recipes/src/test-black_hole/used_apis @@ -7,3 +7,4 @@ event_session capture_session nic_session uplink_session +gpu_session diff --git a/repos/os/src/server/black_hole/README b/repos/os/src/server/black_hole/README index 2581c0e316..75766e389c 100644 --- a/repos/os/src/server/black_hole/README +++ b/repos/os/src/server/black_hole/README @@ -11,6 +11,7 @@ in the configuration of the component: * Nic * Uplink * ROM +* Gpu @@ -20,4 +21,5 @@ in the configuration of the component: + diff --git a/repos/os/src/server/black_hole/config.xsd b/repos/os/src/server/black_hole/config.xsd index c1205eed3c..ce5f03e69e 100644 --- a/repos/os/src/server/black_hole/config.xsd +++ b/repos/os/src/server/black_hole/config.xsd @@ -4,6 +4,7 @@ + diff --git a/repos/os/src/server/black_hole/gpu.h b/repos/os/src/server/black_hole/gpu.h new file mode 100644 index 0000000000..cb8c0dff37 --- /dev/null +++ b/repos/os/src/server/black_hole/gpu.h @@ -0,0 +1,171 @@ +/* + * \brief Gpu session component and root + * \author Martin Stein + * \date 2022-02-12 + */ + +/* + * Copyright (C) 2022 Genode Labs GmbH + * + * This file is part of the Genode OS framework, which is distributed + * under the terms of the GNU Affero General Public License version 3. + */ + +#ifndef _GPU_H_ +#define _GPU_H_ + +/* Genode includes */ +#include +#include +#include +#include +#include +#include + +namespace Black_hole { + + using namespace Genode; + using namespace Gpu; + + class Gpu_session; + class Gpu_root; + + using Gpu_root_component = Root_component; +} + + +class Black_hole::Gpu_session : public Session_object +{ + private: + + Env &_env; + Attached_ram_dataspace _info_dataspace { _env.ram(), _env.rm(), 1 }; + + public: + + Gpu_session(Env &env, + Resources resources, + Label const &label, + Diag diag) + : + Session_object { env.ep(), resources, label, diag }, + _env { env } + { } + + + /*************************** + ** Gpu session interface ** + ***************************/ + + Dataspace_capability info_dataspace() const override + { + return _info_dataspace.cap(); + } + + Sequence_number exec_buffer(Buffer_id /* id */, + size_t /* size */) override + { + throw Gpu::Session::Invalid_state(); + } + + bool complete(Sequence_number /* seqno */) override + { + return false; + } + + void completion_sigh(Signal_context_capability /* sigh */) override + { } + + Dataspace_capability alloc_buffer(Buffer_id /* id */, + size_t /* size */) override + { + return Dataspace_capability { }; + } + + void free_buffer(Buffer_id /* id */) override { } + + Buffer_capability export_buffer(Buffer_id /* id */) override + { + return Buffer_capability { }; + } + + void import_buffer(Buffer_capability /* cap */, + Buffer_id /* id */) override + { } + + Dataspace_capability + map_buffer(Buffer_id /* id */, + bool /* aperture */, + Mapping_attributes /* attrs */) override + { + return Dataspace_capability { }; + } + + void unmap_buffer(Buffer_id /* id */) override { } + + bool map_buffer_ppgtt(Buffer_id /* id */, + Gpu::addr_t /* va */) override + { + return false; + } + + void unmap_buffer_ppgtt(Buffer_id /* id */, + Gpu::addr_t /* va */) override + { } + + bool set_tiling(Buffer_id /* id */, + uint32_t const /* mode */) override + { + return false; + } +}; + + +class Black_hole::Gpu_root : public Gpu_root_component +{ + private: + + Env &_env; + + size_t _ram_quota(char const *args) + { + return Arg_string::find_arg(args, "ram_quota").ulong_value(0); + } + + protected: + + Gpu_session *_create_session(char const *args) override + { + /* at the moment we just need about ~160KiB for initial RCS bring-up */ + size_t const required_quota { Gpu::Session::REQUIRED_QUOTA / 2 }; + size_t const ram_quota { _ram_quota(args) }; + + if (ram_quota < required_quota) { + + Session_label const label { label_from_args(args) }; + warning("insufficient dontated ram_quota (", ram_quota, + " bytes), require ", required_quota, " bytes ", + " by '", label, "'"); + + throw Gpu::Session::Out_of_ram(); + } + Genode::Session::Resources const resources { + session_resources_from_args(args) }; + + return new (md_alloc()) + Gpu_session { + _env, resources, session_label_from_args(args), + session_diag_from_args(args) }; + } + + public: + + Gpu_root(Env &env, + Allocator &alloc) + : + Root_component { env.ep(), alloc }, + _env { env } + { } +}; + +#endif /* _GPU_H_ */ diff --git a/repos/os/src/server/black_hole/main.cc b/repos/os/src/server/black_hole/main.cc index 6642292f21..a25b52d0d1 100644 --- a/repos/os/src/server/black_hole/main.cc +++ b/repos/os/src/server/black_hole/main.cc @@ -28,6 +28,7 @@ #include "nic.h" #include "uplink.h" #include "rom.h" +#include "gpu.h" /*************** @@ -49,6 +50,7 @@ struct Black_hole::Main Genode::Constructible nic_root { }; Genode::Constructible uplink_root { }; Genode::Constructible rom_root { }; + Genode::Constructible gpu_root { }; Main(Genode::Env &env) : env(env) { @@ -82,6 +84,10 @@ struct Black_hole::Main rom_root.construct(env, heap); env.parent().announce(env.ep().manage(*rom_root)); } + if (_config_rom.xml().has_sub_node("gpu")) { + gpu_root.construct(env, heap); + env.parent().announce(env.ep().manage(*gpu_root)); + } } }; diff --git a/repos/os/src/test/black_hole/main.cc b/repos/os/src/test/black_hole/main.cc index 494cbbc635..94702911aa 100644 --- a/repos/os/src/test/black_hole/main.cc +++ b/repos/os/src/test/black_hole/main.cc @@ -23,6 +23,7 @@ #include /* os includes */ +#include #include #include #include @@ -336,6 +337,7 @@ class Black_hole_test::Main Signal_handler
_signal_handler { _env.ep(), *this, &Main::_handle_signal }; Audio_in::Connection _audio_in { _env, "left" }; Audio_out::Connection _audio_out { _env, "left" }; + Gpu::Connection _gpu { _env }; Nic_test _nic_test { _env, _heap, _signal_handler }; Uplink_test _uplink_test { _env, _heap, _signal_handler }; Capture_test _capture_test { _env };