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 };