From 336140c5f12e9781843f73accaa8965b53138a89 Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Mon, 18 Dec 2017 10:19:09 +0100 Subject: [PATCH] platform_drv: enable full access for pci bridges Issue #2620 --- .../src/drivers/platform/spec/x86/session.cc | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/repos/os/src/drivers/platform/spec/x86/session.cc b/repos/os/src/drivers/platform/spec/x86/session.cc index 5b8eb87694..57b008c809 100644 --- a/repos/os/src/drivers/platform/spec/x86/session.cc +++ b/repos/os/src/drivers/platform/spec/x86/session.cc @@ -63,6 +63,24 @@ void Platform::Pci_buses::scan_bus(Config_access &config_access, bridges()->insert(new (heap) Bridge(bus, dev, fun, sec_bus, sub_bus)); + enum { + PCI_CMD_REG = 0x4, + PCI_CMD_MASK = 0x7 /* IOPORT, MEM, DMA */ + }; + + unsigned short cmd = config.read(&config_access, PCI_CMD_REG, + Platform::Device::ACCESS_16BIT); + + if ((cmd & PCI_CMD_MASK) != PCI_CMD_MASK) { + config.write(&config_access, PCI_CMD_REG, + cmd | PCI_CMD_MASK, + Platform::Device::ACCESS_16BIT); + } + + Genode::log(config, " - bridge ", sec_bus, ":0.0", + ((cmd & PCI_CMD_MASK) != PCI_CMD_MASK) ? " enabled" + : ""); + scan_bus(config_access, heap, sec_bus); } }