From 8ab0638be9085e24d418d6a70c6cd5efa9d8e8a6 Mon Sep 17 00:00:00 2001 From: Adrian-Ken Rueegsegger Date: Mon, 11 Jan 2016 14:47:05 +0100 Subject: [PATCH] platform_drv: report MSI masking capability --- .../drivers/platform/spec/x86/pci_device.cc | 20 +++++++++++-------- .../platform/spec/x86/pci_device_component.h | 1 + 2 files changed, 13 insertions(+), 8 deletions(-) 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 e57d8b4b6..589f626d4 100644 --- a/repos/os/src/drivers/platform/spec/x86/pci_device.cc +++ b/repos/os/src/drivers/platform/spec/x86/pci_device.cc @@ -153,11 +153,12 @@ Genode::Irq_session_capability Platform::Device_component::irq(Genode::uint8_t i (!_session->msi_usage() || !_msi_cap()) ? ~0UL : _config_space); _ep->manage(_irq_session); + Genode::uint16_t msi_cap = _msi_cap(); + if (_irq_session->msi()) { Genode::addr_t msi_address = _irq_session->msi_address(); Genode::uint32_t msi_value = _irq_session->msi_data(); - Genode::uint16_t msi_cap = _msi_cap(); Genode::uint16_t msi = _device_config.read(&_config_access, msi_cap + 2, @@ -188,29 +189,32 @@ Genode::Irq_session_capability Platform::Device_component::irq(Genode::uint8_t i Platform::Device::ACCESS_8BIT); } - bool msi_64 = false; - Genode::uint16_t msi_cap = _msi_cap(); + bool msi_64 = false; + bool msi_mask = false; if (msi_cap) { Genode::uint16_t msi = _device_config.read(&_config_access, msi_cap + 2, Platform::Device::ACCESS_16BIT); - msi_64 = msi & CAP_MSI_64; + msi_64 = msi & CAP_MSI_64; + msi_mask = msi & CAP_MASK; } if (_irq_session->msi()) - PINF("%x:%x.%x uses MSI %s, vector 0x%lx, address 0x%lx", + PINF("%x:%x.%x uses MSI %s, vector 0x%lx, address 0x%lx%s", _device_config.bus_number(), _device_config.device_number(), _device_config.function_number(), msi_64 ? "64bit" : "32bit", - _irq_session->msi_data(), _irq_session->msi_address()); + _irq_session->msi_data(), _irq_session->msi_address(), + msi_mask ? ", maskable" : ", non-maskable"); else - PINF("%x:%x.%x uses IRQ, vector 0x%x%s", + PINF("%x:%x.%x uses IRQ, vector 0x%x%s%s", _device_config.bus_number(), _device_config.device_number(), _device_config.function_number(), _irq_line, msi_cap ? (msi_64 ? ", MSI 64bit capable" : - ", MSI 32bit capable") : ""); + ", MSI 32bit capable") : "", + msi_mask ? ", maskable" : ", non-maskable"); return _irq_session->cap(); } diff --git a/repos/os/src/drivers/platform/spec/x86/pci_device_component.h b/repos/os/src/drivers/platform/spec/x86/pci_device_component.h index ea20dc389..a241bf7c8 100644 --- a/repos/os/src/drivers/platform/spec/x86/pci_device_component.h +++ b/repos/os/src/drivers/platform/spec/x86/pci_device_component.h @@ -62,6 +62,7 @@ class Platform::Device_component : public Genode::Rpc_object, PCI_IRQ_PIN = 0x3d, CAP_MSI_64 = 0x80, + CAP_MASK = 0x100, MSI_ENABLED = 0x1 };