From f98466430f709fcde556361a841a330a420c91f7 Mon Sep 17 00:00:00 2001 From: Johannes Schlatow Date: Fri, 20 Jan 2023 17:52:15 +0100 Subject: [PATCH] platform_drv: don't restrict ownership to session This is a prerequisite for letting the platform driver acquire control devices. genodelabs/genode#4761 --- repos/os/src/drivers/platform/device.cc | 23 ++++++------- repos/os/src/drivers/platform/device.h | 9 +++--- repos/os/src/drivers/platform/device_owner.h | 32 +++++++++++++++++++ .../src/drivers/platform/session_component.cc | 12 +++++++ .../src/drivers/platform/session_component.h | 10 +++++- 5 files changed, 70 insertions(+), 16 deletions(-) create mode 100644 repos/os/src/drivers/platform/device_owner.h diff --git a/repos/os/src/drivers/platform/device.cc b/repos/os/src/drivers/platform/device.cc index a4a83e0181..f5ec9abe0f 100644 --- a/repos/os/src/drivers/platform/device.cc +++ b/repos/os/src/drivers/platform/device.cc @@ -15,12 +15,12 @@ #include #include +#include #include -#include -Driver::Device::Owner::Owner(Session_component & session) -: obj_id(reinterpret_cast(&session)) {} +Driver::Device::Owner::Owner(Device_owner & owner) +: obj_id(reinterpret_cast(&owner)) {} Driver::Device::Name Driver::Device::name() const { return _name; } @@ -32,9 +32,9 @@ Driver::Device::Type Driver::Device::type() const { return _type; } Driver::Device::Owner Driver::Device::owner() const { return _owner; } -void Driver::Device::acquire(Session_component & sc) +void Driver::Device::acquire(Device_owner & owner) { - if (!_owner.valid()) _owner = sc; + if (!_owner.valid()) _owner = owner; _power_domain_list.for_each([&] (Power_domain & p) { @@ -81,19 +81,20 @@ void Driver::Device::acquire(Session_component & sc) } }); - pci_enable(_env, sc.device_pd(), *this); - sc.update_devices_rom(); + owner.enable_device(*this); + owner.update_devices_rom(); + _model.device_status_changed(); } -void Driver::Device::release(Session_component & sc) +void Driver::Device::release(Device_owner & owner) { - if (!(_owner == sc)) + if (!(_owner == owner)) return; if (!_leave_operational) { - pci_disable(_env, *this); + owner.disable_device(*this); _reset_domain_list.for_each([&] (Reset_domain & r) { @@ -115,7 +116,7 @@ void Driver::Device::release(Session_component & sc) } _owner = Owner(); - sc.update_devices_rom(); + owner.update_devices_rom(); _model.device_status_changed(); } diff --git a/repos/os/src/drivers/platform/device.h b/repos/os/src/drivers/platform/device.h index 029162e1ab..e378c7f792 100644 --- a/repos/os/src/drivers/platform/device.h +++ b/repos/os/src/drivers/platform/device.h @@ -28,6 +28,7 @@ #include #include #include +#include namespace Driver { @@ -36,7 +37,7 @@ namespace Driver { class Device; struct Device_reporter; struct Device_model; - class Session_component; + struct Device_owner; struct Irq_update_policy; struct Io_mem_update_policy; struct Io_port_update_policy; @@ -70,7 +71,7 @@ class Driver::Device : private List_model::Element void * obj_id; Owner() : obj_id(nullptr) {} - Owner(Session_component & session); + Owner(Device_owner & owner); bool operator == (Owner const & o) const { return obj_id == o.obj_id; } @@ -218,8 +219,8 @@ class Driver::Device : private List_model::Element Type type() const; Owner owner() const; - virtual void acquire(Session_component &); - virtual void release(Session_component &); + virtual void acquire(Device_owner &); + virtual void release(Device_owner &); template void for_each_irq(FN const & fn) const { diff --git a/repos/os/src/drivers/platform/device_owner.h b/repos/os/src/drivers/platform/device_owner.h new file mode 100644 index 0000000000..c852c37d31 --- /dev/null +++ b/repos/os/src/drivers/platform/device_owner.h @@ -0,0 +1,32 @@ +/* + * \brief Platform driver - Device owner abstraction + * \author Johannes Schlatow + * \date 2023-01-20 + */ + +/* + * Copyright (C) 2023 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 _SRC__DRIVERS__PLATFORM__DEVICE_OWNER_H_ +#define _SRC__DRIVERS__PLATFORM__DEVICE_OWNER_H_ + +namespace Driver +{ + struct Device; + struct Device_owner; +} + + +struct Driver::Device_owner +{ + virtual void enable_device(Device const &) {}; + virtual void disable_device(Device const &) {}; + virtual void update_devices_rom() {}; + virtual ~Device_owner() { } +}; + +#endif /* _SRC__DRIVERS__PLATFORM__DEVICE_OWNER_H_ */ diff --git a/repos/os/src/drivers/platform/session_component.cc b/repos/os/src/drivers/platform/session_component.cc index a913efdf11..917e86349b 100644 --- a/repos/os/src/drivers/platform/session_component.cc +++ b/repos/os/src/drivers/platform/session_component.cc @@ -125,6 +125,18 @@ void Session_component::update_devices_rom() } +void Session_component::enable_device(Device const & device) +{ + pci_enable(_env, device_pd(), device); +} + + +void Session_component::disable_device(Device const & device) +{ + pci_disable(_env, device); +} + + Genode::Rom_session_capability Session_component::devices_rom() { return _rom_session.cap(); } diff --git a/repos/os/src/drivers/platform/session_component.h b/repos/os/src/drivers/platform/session_component.h index 570b83d45c..862692f60f 100644 --- a/repos/os/src/drivers/platform/session_component.h +++ b/repos/os/src/drivers/platform/session_component.h @@ -26,6 +26,7 @@ #include #include +#include namespace Driver { class Session_component; @@ -36,6 +37,7 @@ namespace Driver { class Driver::Session_component : public Session_object, + public Device_owner, private Registry::Element, private Dynamic_rom_session::Xml_producer { @@ -61,13 +63,19 @@ class Driver::Session_component Device_pd & device_pd(); bool matches(Device const &) const; - void update_devices_rom(); Ram_quota_guard & ram_quota_guard() { return _ram_quota_guard(); } Cap_quota_guard & cap_quota_guard() { return _cap_quota_guard(); } void update_policy(bool info, Policy_version version); + /************************** + ** Device Owner methods ** + **************************/ + + void enable_device(Device const &) override; + void disable_device(Device const &) override; + void update_devices_rom() override; /************************** ** Platform Session API **