From 11ee72eaa6c394f111d3e9732b6e8cace714e6aa Mon Sep 17 00:00:00 2001 From: Reto Buerki Date: Tue, 16 Feb 2016 16:41:08 +0100 Subject: [PATCH] hw: Add MSI variables to Irq_session_component Extend the base-hw Irq_session_component class with _is_msi, _address and _value variables required to support MSI mode of operation. Return MSI configuration in info() function if _is_msi is set to true. --- .../src/core/include/irq_session_component.h | 14 ++++++++++++-- repos/base-hw/src/core/irq_session_component.cc | 3 ++- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/repos/base-hw/src/core/include/irq_session_component.h b/repos/base-hw/src/core/include/irq_session_component.h index ce0ed8297..d81a699e2 100644 --- a/repos/base-hw/src/core/include/irq_session_component.h +++ b/repos/base-hw/src/core/include/irq_session_component.h @@ -31,6 +31,8 @@ class Genode::Irq_session_component : public Rpc_object, unsigned _irq_number; Range_allocator *_irq_alloc; Genode::uint8_t _kernel_object[sizeof(Kernel::User_irq)]; + bool _is_msi; + addr_t _address, _value; Signal_context_capability _sig_cap; @@ -58,8 +60,16 @@ class Genode::Irq_session_component : public Rpc_object, void ack_irq() override; void sigh(Signal_context_capability) override; - Info info() override { - return { .type = Genode::Irq_session::Info::Type::INVALID }; } + + Info info() override + { + if (!_is_msi) { + return { .type = Info::Type::INVALID }; + } + return { .type = Info::Type::MSI, + .address = _address, + .value = _value }; + } }; #endif /* _INCLUDE__IRQ_SESSION_COMPONENT_H_ */ diff --git a/repos/base-hw/src/core/irq_session_component.cc b/repos/base-hw/src/core/irq_session_component.cc index 6c8868d66..acdba3094 100644 --- a/repos/base-hw/src/core/irq_session_component.cc +++ b/repos/base-hw/src/core/irq_session_component.cc @@ -66,7 +66,8 @@ Irq_session_component::~Irq_session_component() Irq_session_component::Irq_session_component(Range_allocator * const irq_alloc, const char * const args) : - _irq_number(Platform::irq(_find_irq_number(args))), _irq_alloc(irq_alloc) + _irq_number(Platform::irq(_find_irq_number(args))), _irq_alloc(irq_alloc), + _is_msi(false), _address(0), _value(0) { long const msi = Arg_string::find_arg(args, "device_config_phys").long_value(0); if (msi)