diff --git a/repos/base/run/platform_drv.inc b/repos/base/run/platform_drv.inc index 11f9439bb4..d7adf6f76a 100644 --- a/repos/base/run/platform_drv.inc +++ b/repos/base/run/platform_drv.inc @@ -107,7 +107,7 @@ proc platform_drv_policy {} { - + diff --git a/repos/gems/recipes/raw/drivers_managed-pc/drivers.config b/repos/gems/recipes/raw/drivers_managed-pc/drivers.config index 8aa941caf5..2a6fd85c03 100644 --- a/repos/gems/recipes/raw/drivers_managed-pc/drivers.config +++ b/repos/gems/recipes/raw/drivers_managed-pc/drivers.config @@ -124,7 +124,7 @@ - + diff --git a/repos/os/src/drivers/platform/spec/x86/README b/repos/os/src/drivers/platform/spec/x86/README index 83649f3b33..bcd8e3e4e9 100644 --- a/repos/os/src/drivers/platform/spec/x86/README +++ b/repos/os/src/drivers/platform/spec/x86/README @@ -66,13 +66,15 @@ the device specified by the triple, the device will not appear during device discovery by the client with the fuzzy pci class policy. -By default the driver will try to use MSIs if the device and the used kernel -supports it. This behaviour can be overwritten: +By default the driver will try to use first MSI-X, then MSI and finally GSI. +However, the MSI-X/MSI feature depends on the support by the used kernel and +the PCI capabilities of the device. The MSI and MSI-X feature can be disabled +explicitly by configuration, e.g.: ! ! ! -! +! ! ... ! ! diff --git a/repos/os/src/drivers/platform/spec/x86/pci_device.cc b/repos/os/src/drivers/platform/spec/x86/pci_device.cc index ad19eee710..6587f6ee24 100644 --- a/repos/os/src/drivers/platform/spec/x86/pci_device.cc +++ b/repos/os/src/drivers/platform/spec/x86/pci_device.cc @@ -175,10 +175,11 @@ Genode::Irq_session_capability Platform::Device_component::irq(uint8_t id) uint16_t const msi_cap = _msi_cap(); uint16_t const msix_cap = _msix_cap(); - + bool const try_msi_msix = (_session.msi_usage() && msi_cap) || + (_session.msix_usage() && msix_cap); _irq_session = construct_at(_mem_irq_component, _configure_irq(_irq_line, msi_cap, msix_cap), - (!_session.msi_usage() || (!msi_cap && !msix_cap)) ? ~0UL : _config_space, + try_msi_msix ? _config_space : ~0UL, _env, _global_heap); _env.ep().rpc_ep().manage(_irq_session); @@ -186,7 +187,7 @@ Genode::Irq_session_capability Platform::Device_component::irq(uint8_t id) bool msi_used = false; if (_irq_session->msi()) { - if (msix_cap) + if (_session.msix_usage() && msix_cap) msix_used = _setup_msix(msix_cap); if (!msix_used && msi_cap) msi_used = _setup_msi(msi_cap); diff --git a/repos/os/src/drivers/platform/spec/x86/pci_session_component.h b/repos/os/src/drivers/platform/spec/x86/pci_session_component.h index 382f1ae44a..82d07df707 100644 --- a/repos/os/src/drivers/platform/spec/x86/pci_session_component.h +++ b/repos/os/src/drivers/platform/spec/x86/pci_session_component.h @@ -221,7 +221,8 @@ class Platform::Session_component : public Rpc_object Pci::Config::Delayer &_delayer; Device_bars_pool &_devices_bars; bool _iommu; - bool _msi_usage { true }; + bool _msi_usage { true }; + bool _msix_usage { true }; /** * Registry of RAM dataspaces allocated by the session @@ -499,8 +500,9 @@ class Platform::Session_component : public Rpc_object { Session_policy const policy { _label, _config.xml() }; - typedef String<10> Mode; - _msi_usage = policy.attribute_value("irq_mode", Mode()) != "nomsi"; + _msi_usage = policy.attribute_value("msi", _msi_usage); + _msix_usage = _msi_usage && + policy.attribute_value("msix", _msix_usage); /* check policy for non-pci devices */ policy.for_each_sub_node("device", [&] (Xml_node device_node) { @@ -656,6 +658,11 @@ class Platform::Session_component : public Rpc_object bool msi_usage() const { return _msi_usage; } + /** + * Check whether msi-x usage was explicitly switched off + */ + bool msix_usage() const { return _msix_usage; } + /*************************** ** PCI session interface ** ***************************/ diff --git a/repos/ports/run/netperf.inc b/repos/ports/run/netperf.inc index 102e73b4a9..f9e609eec1 100644 --- a/repos/ports/run/netperf.inc +++ b/repos/ports/run/netperf.inc @@ -180,7 +180,7 @@ source ${genode_dir}/repos/base/run/platform_drv.inc proc platform_drv_policy {} { global use_wifi_driver if { $use_wifi_driver } { - return { }} + return { }} return { } }