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 { }
}