mirror of
https://github.com/genodelabs/genode.git
synced 2024-12-29 10:08:53 +00:00
eefaa07024
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
66 lines
2.1 KiB
C++
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_ */
|