From ea3ed25431a6e36c2ecc4776e970eae4c4774b98 Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Thu, 16 Jan 2025 13:30:30 +0100 Subject: [PATCH] base: support specifying PCI bdf on irq creation Required by the seL4 kernel interface for MSI creation and by another upstream kernel. Issue #5423 --- repos/base/include/irq_session/connection.h | 7 +++++-- repos/os/src/driver/platform/device_component.cc | 3 ++- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/repos/base/include/irq_session/connection.h b/repos/base/include/irq_session/connection.h index 5ad4784e5a..9491d156f4 100644 --- a/repos/base/include/irq_session/connection.h +++ b/repos/base/include/irq_session/connection.h @@ -46,17 +46,20 @@ struct Genode::Irq_connection : Connection, Irq_session_client * Constructor * * \param label (virtual) interrupt number - * \param device_config_phys config-space physical address + * \param device_config_phys PCI config-space physical address * \param type interrupt type (e.g., msi/msi-x) + * \param bdf PCI bdf of device */ Irq_connection(Env &env, Label const &label, addr_t device_config_phys, - Type type = Irq_session::TYPE_MSI) + Type type, + unsigned bdf = 0x10000 /* invalid */) : Connection(env, label, Ram_quota { RAM_QUOTA }, Args("irq_number=", label, ", " "device_config_phys=", Hex(device_config_phys), ", " + "bdf=", Hex(bdf), ", " "irq_type=", unsigned(type))), Irq_session_client(cap()) { } diff --git a/repos/os/src/driver/platform/device_component.cc b/repos/os/src/driver/platform/device_component.cc index ed5d710a55..ac598eebf8 100644 --- a/repos/os/src/driver/platform/device_component.cc +++ b/repos/os/src/driver/platform/device_component.cc @@ -168,7 +168,8 @@ Genode::Irq_session_capability Device_component::irq(unsigned idx) } else error("MSI(-x) detected for device without pci-config!"); - irq.irq.construct(_env, irq.number, pci_cfg_addr, irq.type); + irq.irq.construct(_env, irq.number, pci_cfg_addr, irq.type, + Pci::Bdf::rid(_pci_config->bdf)); } else irq.irq.construct(_env, irq.number, irq.mode, irq.polarity);