From a2e29c02261db9fc3eab5f70131b5a0ccd04d922 Mon Sep 17 00:00:00 2001 From: Christian Helmuth Date: Tue, 21 Mar 2023 11:59:32 +0100 Subject: [PATCH] driver_manager: defer block_devices report Now, block_devices are reported earliest right after the devices ROM was parsed and neither AHCI nor NVMe were found. If one or both devices were found, the report is deferred after all expected reports arrived. Issue #4791 --- repos/gems/src/app/driver_manager/main.cc | 35 ++++++++++++++--------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/repos/gems/src/app/driver_manager/main.cc b/repos/gems/src/app/driver_manager/main.cc index da4a3ac9cb..b691af4898 100644 --- a/repos/gems/src/app/driver_manager/main.cc +++ b/repos/gems/src/app/driver_manager/main.cc @@ -30,7 +30,6 @@ namespace Driver_manager { using namespace Genode; struct Main; - struct Block_devices_generator; struct Device_driver; struct Intel_gpu_driver; struct Intel_fb_driver; @@ -45,12 +44,6 @@ namespace Driver_manager { } -struct Driver_manager::Block_devices_generator : Interface -{ - virtual void generate_block_devices() = 0; -}; - - class Driver_manager::Device_driver : Noncopyable { public: @@ -351,7 +344,7 @@ struct Driver_manager::Nvme_driver : Device_driver }; -struct Driver_manager::Main : private Block_devices_generator +struct Driver_manager::Main { Env &_env; @@ -373,6 +366,8 @@ struct Driver_manager::Main : private Block_devices_generator Constructible _ahci_driver { }; Constructible _nvme_driver { }; + bool _devices_rom_parsed { false }; + bool _use_ohci { true }; Boot_fb_driver::Mode _boot_fb_mode() const @@ -423,10 +418,20 @@ struct Driver_manager::Main : private Block_devices_generator Ahci_driver::Default_label _default_block_device() const; - /** - * Block_devices_generator interface - */ - void generate_block_devices() override { _generate_block_devices(_block_devices); } + void _generate_block_devices() + { + /* devices must be detected before the checks below can be conducted */ + if (!_devices_rom_parsed) + return; + + /* check that all drivers completed initialization before reporting */ + if (_ahci_driver.constructed() && !_ahci_ports.xml().has_type("ports")) + return; + if (_nvme_driver.constructed() && !_nvme_ns.xml().has_type("controller")) + return; + + _generate_block_devices(_block_devices); + } Main(Env &env) : _env(env) { @@ -535,13 +540,15 @@ void Driver_manager::Main::_handle_devices_update() _usb_devices.sigh(_usb_devices_update_handler); _handle_usb_devices_update(); + + _devices_rom_parsed = true; } void Driver_manager::Main::_handle_ahci_ports_update() { _ahci_ports.update(); - _generate_block_devices(_block_devices); + _generate_block_devices(); /* update service forwarding rules */ _generate_init_config(_init_config); @@ -551,7 +558,7 @@ void Driver_manager::Main::_handle_ahci_ports_update() void Driver_manager::Main::_handle_nvme_ns_update() { _nvme_ns.update(); - _generate_block_devices(_block_devices); + _generate_block_devices(); /* update service forwarding rules */ _generate_init_config(_init_config);