genode/repos/base/include/irq_session/connection.h
Johannes Schlatow eefaa07024 base: add irq_type session argument
By adding the `irq_type` argument, one can explicitly specify whether to
use LEGACY, MSI or MSI-X interrupts. We formerly used the
`device_phys_config` to implicitly select MSI, however, with the
addition of IOMMU support to the platform driver there is at least one
instance where we need an MSI for a non-PCI device.

Yet, by adding another session argument to the Irq session, we exceed
the character limit for session args. Since not all arguments are
relevant for LEGACY interrupts resp. MSI, we can split the Irq_connection
constructor to handle the two cases separately and omit unneeded
arguments.

genodelabs/genode#5002
2023-11-28 19:35:16 +01:00

66 lines
2.1 KiB
C++

/*
* \brief Connection to IRQ service
* \author Norman Feske
* \date 2008-08-22
*/
/*
* Copyright (C) 2008-2023 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
#ifndef _INCLUDE__IRQ_SESSION__CONNECTION_H_
#define _INCLUDE__IRQ_SESSION__CONNECTION_H_
#include <irq_session/client.h>
#include <base/connection.h>
namespace Genode { struct Irq_connection; }
struct Genode::Irq_connection : Connection<Irq_session>, Irq_session_client
{
/**
* Constructor
*
* \param label physical interrupt number
* \param trigger interrupt trigger (e.g., level/edge)
* \param polarity interrupt trigger polarity (e.g., low/high)
*/
Irq_connection(Env &env,
Label const &label,
Trigger trigger = Irq_session::TRIGGER_UNCHANGED,
Polarity polarity = Irq_session::POLARITY_UNCHANGED)
:
Connection<Irq_session>(env, label, Ram_quota { RAM_QUOTA },
Args("irq_number=", label, ", "
"irq_trigger=", unsigned(trigger), ", "
"irq_polarity=", unsigned(polarity), ", "
"irq_type=", unsigned(TYPE_LEGACY))),
Irq_session_client(cap())
{ }
/**
* Constructor
*
* \param label (virtual) interrupt number
* \param device_config_phys config-space physical address
* \param type interrupt type (e.g., msi/msi-x)
*/
Irq_connection(Env &env,
Label const &label,
addr_t device_config_phys,
Type type = Irq_session::TYPE_MSI)
:
Connection<Irq_session>(env, label, Ram_quota { RAM_QUOTA },
Args("irq_number=", label, ", "
"device_config_phys=", Hex(device_config_phys), ", "
"irq_type=", unsigned(type))),
Irq_session_client(cap())
{ }
};
#endif /* _INCLUDE__IRQ_SESSION__CONNECTION_H_ */