From 243c819257995b683a1629585b983b49d4d7f2f2 Mon Sep 17 00:00:00 2001 From: Stefan Kalkowski Date: Wed, 5 Oct 2022 14:57:04 +0200 Subject: [PATCH] pci_decode: use MSI enumerator as function value Instead of using a global value to enumerate the MSIs, use a function argument instead. Whenever the process of PCI device reporting gets started again, due to an initially too small report buffer, the MSI enumeration value is reset again. Formerly, we wasted MSI numbers. Ref genodelabs/genode#4628 --- repos/os/src/app/pci_decode/main.cc | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/repos/os/src/app/pci_decode/main.cc b/repos/os/src/app/pci_decode/main.cc index c8c43c4eac..4726d59e14 100644 --- a/repos/os/src/app/pci_decode/main.cc +++ b/repos/os/src/app/pci_decode/main.cc @@ -37,13 +37,6 @@ struct Main Expanding_reporter pci_reporter { env, "devices", "devices" }; Registry bridge_registry {}; /* contains host bridges */ - /* - * We count beginning from 1 not 0, because some clients (Linux drivers) - * do not ignore the pseudo MSI number announced, but interpret zero as - * invalid. - */ - unsigned msi_number { 1U }; - bool apic_capable { false }; bool msi_capable { false }; @@ -55,9 +48,9 @@ struct Main void parse_pci_function(Bdf bdf, Config & cfg, addr_t cfg_phys_base, - Xml_generator & generator); - void parse_pci_bus(bus_t bus, bus_t offset, addr_t base, - addr_t phys_base, Xml_generator & generator); + Xml_generator & generator, unsigned & msi); + void parse_pci_bus(bus_t bus, bus_t offset, addr_t base, addr_t phys_base, + Xml_generator & generator, unsigned & msi); void parse_irq_override_rules(Xml_node & xml); void parse_pci_config_spaces(Xml_node & xml); @@ -77,7 +70,8 @@ struct Main void Main::parse_pci_function(Bdf bdf, Config & cfg, addr_t cfg_phys_base, - Xml_generator & gen) + Xml_generator & gen, + unsigned & msi_number) { cfg.scan(); @@ -207,7 +201,8 @@ void Main::parse_pci_bus(bus_t bus, bus_t offset, addr_t base, addr_t phys_base, - Xml_generator & generator) + Xml_generator & generator, + unsigned & msi_number) { auto per_function = [&] (addr_t config_base, addr_t config_phys_base, dev_t dev, func_t fn) { @@ -216,7 +211,7 @@ void Main::parse_pci_bus(bus_t bus, return true; parse_pci_function({(bus_t)(bus+offset), dev, fn}, cfg, - config_phys_base, generator); + config_phys_base, generator, msi_number); return !(fn == 0 && !cfg.read()); }; @@ -239,6 +234,12 @@ void Main::parse_pci_config_spaces(Xml_node & xml) { pci_reporter.generate([&] (Xml_generator & generator) { + /* + * We count beginning from 1 not 0, because some clients (Linux drivers) + * do not ignore the pseudo MSI number announced, but interpret zero as + * invalid. + */ + unsigned msi_number = 1; unsigned host_bridge_num = 0; xml.for_each_sub_node("bdf", [&] (Xml_node & xml) @@ -265,7 +266,7 @@ void Main::parse_pci_config_spaces(Xml_node & xml) do parse_pci_bus((bus_t)bus, bus_off, (addr_t)pci_config_ds->local_addr(), - base, generator); + base, generator, msi_number); while (bus++ < last_bus); pci_config_ds.destruct();