From 7da691b52af02bb334dd979bf5c2603e3289e5a5 Mon Sep 17 00:00:00 2001 From: Christian Helmuth Date: Wed, 9 Mar 2022 15:00:31 +0100 Subject: [PATCH] pc/usb: defer startup until config is available The commit also adds lx_kit/initial_config.h as utility. --- .../src/include/lx_kit/initial_config.h | 56 +++++++++++++++++++ repos/pc/src/drivers/usb_host/pc/main.cc | 10 ++-- 2 files changed, 62 insertions(+), 4 deletions(-) create mode 100644 repos/dde_linux/src/include/lx_kit/initial_config.h diff --git a/repos/dde_linux/src/include/lx_kit/initial_config.h b/repos/dde_linux/src/include/lx_kit/initial_config.h new file mode 100644 index 0000000000..5048e87a93 --- /dev/null +++ b/repos/dde_linux/src/include/lx_kit/initial_config.h @@ -0,0 +1,56 @@ +/* + * \brief Lx_kit initial config utility + * \author Christian Helmuth + * \author Norman Feske + * \date 2022-03-11 + */ + +/* + * Copyright (C) 2022 Genode Labs GmbH + * + * This file is distributed under the terms of the GNU General Public License + * version 2. + */ + +#ifndef _LX_KIT__INITIAL_CONFIG_H_ +#define _LX_KIT__INITIAL_CONFIG_H_ + +#include +#include + +namespace Lx_kit { + using namespace Genode; + + struct Initial_config; +} + + +struct Lx_kit::Initial_config +{ + Attached_rom_dataspace rom; + + void _handle_signal() { rom.update(); } + + Initial_config(Genode::Env &env) : rom(env, "config") + { + /* + * Defer the startup of the USB driver until the first configuration + * becomes available. This is needed in scenarios where the configuration + * is dynamically generated and supplied to the USB driver via the + * report-ROM service. + */ + + Io_signal_handler sigh { + env.ep(), *this, &Initial_config::_handle_signal }; + + rom.sigh(sigh); + _handle_signal(); + + while (rom.xml().type() != "config") + env.ep().wait_and_dispatch_one_io_signal(); + + rom.sigh(Signal_context_capability()); + } +}; + +#endif /* _LX_KIT__INITIAL_CONFIG_H_ */ diff --git a/repos/pc/src/drivers/usb_host/pc/main.cc b/repos/pc/src/drivers/usb_host/pc/main.cc index 705340b00a..18e54eb7f2 100644 --- a/repos/pc/src/drivers/usb_host/pc/main.cc +++ b/repos/pc/src/drivers/usb_host/pc/main.cc @@ -11,7 +11,6 @@ * version 2. */ -#include #include #include @@ -19,6 +18,7 @@ #include #include #include +#include #include #include @@ -50,8 +50,6 @@ struct Main : private Entrypoint::Io_progress_handler &Main::handle_signal }; Sliced_heap sliced_heap { env.ram(), env.rm() }; - Attached_rom_dataspace config_rom { env, "config" }; - /** * Entrypoint::Io_progress_handler */ @@ -68,7 +66,11 @@ struct Main : private Entrypoint::Io_progress_handler Main(Env & env) : env(env) { - _bios_handoff = config_rom.xml().attribute_value("bios_handoff", true); + { + Lx_kit::Initial_config config { env }; + + _bios_handoff = config.rom.xml().attribute_value("bios_handoff", true); + } Lx_kit::initialize(env);