From e3803fb8613232f985504d98f8e3ab4c8525a615 Mon Sep 17 00:00:00 2001 From: Norman Feske Date: Thu, 21 Mar 2024 14:24:58 +0100 Subject: [PATCH] sculpt: host PS/2 driver in runtime Issue #5150 --- repos/gems/sculpt/drivers/pc | 19 +---- repos/gems/sculpt/event_filter/default | 2 +- repos/gems/sculpt/event_filter/pc | 2 +- repos/gems/src/app/sculpt_manager/main.cc | 11 +-- .../src/app/sculpt_manager/model/board_info.h | 23 +++--- .../gems/src/app/sculpt_manager/ps2_driver.h | 70 +++++++++++++++++++ 6 files changed, 94 insertions(+), 33 deletions(-) create mode 100644 repos/gems/src/app/sculpt_manager/ps2_driver.h diff --git a/repos/gems/sculpt/drivers/pc b/repos/gems/sculpt/drivers/pc index cdec6b826d..fb3087a8ca 100644 --- a/repos/gems/sculpt/drivers/pc +++ b/repos/gems/sculpt/drivers/pc @@ -125,7 +125,7 @@ - + @@ -141,23 +141,6 @@ - - - - - - - - - - - - - - - - - diff --git a/repos/gems/sculpt/event_filter/default b/repos/gems/sculpt/event_filter/default index a23a946f8d..d188b61e7b 100644 --- a/repos/gems/sculpt/event_filter/default +++ b/repos/gems/sculpt/event_filter/default @@ -8,7 +8,7 @@ - + diff --git a/repos/gems/sculpt/event_filter/pc b/repos/gems/sculpt/event_filter/pc index 547d925c5f..b2c09865b1 100644 --- a/repos/gems/sculpt/event_filter/pc +++ b/repos/gems/sculpt/event_filter/pc @@ -35,6 +35,6 @@ - + diff --git a/repos/gems/src/app/sculpt_manager/main.cc b/repos/gems/src/app/sculpt_manager/main.cc index 680c55769f..f8bd040598 100644 --- a/repos/gems/src/app/sculpt_manager/main.cc +++ b/repos/gems/src/app/sculpt_manager/main.cc @@ -45,6 +45,7 @@ #include #include #include +#include #include #include #include @@ -223,14 +224,15 @@ struct Sculpt::Main : Input_event_handler, _board_info = Board_info::from_xml(_devices.xml(), _platform.xml()); _fb_driver.update(_child_states, _board_info, _platform.xml()); + _ps2_driver.update(_child_states, _board_info); _update_usb_drivers(); update_network_dialog(); generate_runtime_config(); } - Fb_driver _fb_driver { }; - + Ps2_driver _ps2_driver { }; + Fb_driver _fb_driver { }; Usb_driver _usb_driver { _env, *this }; void _update_usb_drivers() @@ -2114,7 +2116,8 @@ void Sculpt::Main::_generate_runtime_config(Xml_generator &xml) const xml.attribute("height", _affinity_space.height()); }); - _fb_driver.gen_start_nodes(xml); + _ps2_driver.gen_start_node(xml); + _fb_driver .gen_start_nodes(xml); _usb_driver.gen_start_nodes(xml); _dialog_runtime.gen_start_nodes(xml); @@ -2262,7 +2265,7 @@ void Sculpt::Main::_generate_event_filter_config(Xml_generator &xml) xml.attribute("label", label); xml.attribute("input", input); }); }; - gen_policy("drivers -> ps2", "ps2"); + gen_policy("runtime -> ps2", "ps2"); gen_policy("runtime -> usb_hid", "usb"); gen_policy("drivers -> touch", "touch"); gen_policy("drivers -> sdl", "sdl"); diff --git a/repos/gems/src/app/sculpt_manager/model/board_info.h b/repos/gems/src/app/sculpt_manager/model/board_info.h index 867425fef2..5ec0eed4fc 100644 --- a/repos/gems/src/app/sculpt_manager/model/board_info.h +++ b/repos/gems/src/app/sculpt_manager/model/board_info.h @@ -20,15 +20,16 @@ namespace Sculpt { struct Board_info; } struct Sculpt::Board_info { - bool wifi_present; - bool lan_present; - bool modem_present; - bool intel_gfx_present; - bool boot_fb_present; - bool vesa_fb_present; - bool nvme_present; - bool ahci_present; - bool usb_present; + bool wifi_present, + lan_present, + modem_present, + intel_gfx_present, + boot_fb_present, + vesa_fb_present, + nvme_present, + ahci_present, + usb_present, + ps2_present; static Board_info from_xml(Xml_node const &devices, Xml_node const &platform) { @@ -40,6 +41,10 @@ struct Sculpt::Board_info bool vga = false; devices.for_each_sub_node("device", [&] (Xml_node const &device) { + + if (device.attribute_value("name", String<16>()) == "ps2") + result.ps2_present = true; + device.with_optional_sub_node("pci-config", [&] (Xml_node const &pci) { enum class Pci_class : unsigned { diff --git a/repos/gems/src/app/sculpt_manager/ps2_driver.h b/repos/gems/src/app/sculpt_manager/ps2_driver.h new file mode 100644 index 0000000000..79d463e3a7 --- /dev/null +++ b/repos/gems/src/app/sculpt_manager/ps2_driver.h @@ -0,0 +1,70 @@ +/* + * \brief Sculpt PS/2-driver management + * \author Norman Feske + * \date 2024-03-21 + */ + +/* + * Copyright (C) 2024 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 _PS2_DRIVER_H_ +#define _PS2_DRIVER_H_ + +/* local includes */ +#include +#include +#include + +namespace Sculpt { struct Ps2_driver; } + + +struct Sculpt::Ps2_driver : private Noncopyable +{ + Constructible _ps2 { }; + + void gen_start_node(Xml_generator &xml) const + { + if (!_ps2.constructed()) + return; + + xml.node("start", [&] { + _ps2->gen_start_node_content(xml); + + gen_named_node(xml, "binary", "ps2_drv"); + + xml.node("config", [&] { + xml.attribute("capslock_led", "rom"); + xml.attribute("numlock_led", "rom"); + xml.attribute("system", "yes"); + }); + + xml.node("route", [&] { + gen_parent_route(xml); + gen_parent_rom_route(xml, "capslock", "capslock"); + gen_parent_rom_route(xml, "numlock", "numlock"); + gen_parent_rom_route(xml, "system", "config -> managed/system"); + gen_parent_route (xml); + gen_parent_route (xml); + gen_parent_route (xml); + gen_parent_route (xml); + gen_parent_route(xml); + gen_service_node(xml, [&] { + xml.node("parent", [&] { + xml.attribute("label", "ps2"); }); }); + }); + }); + }; + + void update(Registry ®istry, Board_info const &board_info) + { + _ps2.conditional(board_info.ps2_present, + registry, "ps2", Priority::MULTIMEDIA, + Ram_quota { 1*1024*1024 }, Cap_quota { 100 }); + } +}; + +#endif /* _PS2_DRIVER_H_ */