A small set of core changes for the interrupt subsystem:
- Expose the MSI message in the existing debug filesystem dump. That's
useful for validation and debugging.
- Small cleanups
-----BEGIN PGP SIGNATURE-----
iQJHBAABCgAxFiEEQp8+kY+LLUocC4bMphj1TA10mKEFAmff3hwTHHRnbHhAbGlu
dXRyb25peC5kZQAKCRCmGPVMDXSYoXLsEACHNrH1Pl7J7L7NUu2XW/CW1pPrfw2d
A0GrGdAEGnLr8Pt4u45uNwYxmVcEQEdlobJ/nj/x31vg1OKFccirBbFHiLRqf1KK
dwNeasSrMUuickBLSF+a7IxtdIYYPWUslrao67bTjxrStOT32EgDVudg1jRe3AB1
O/keSLicj6TEqUlEhEdUTANFY3aInJqPvObveuqcqggVhK6SWqG87DnYeH20hVE4
OPQHp32PD5pzSrYc+aPlc0UpaWmZdxnIt5pHU4QNp1ZaxVVKwUxAJGcJrHiPw0id
jVz6Q3e98dWEY1oRl7qKkcWRr+1FrA4NlGqvGxSWoxZEFyPZrTxA2UZ7LNF75akq
EpA/my70a92ZJ5VHdyWh6jFQAZHdPlhNu1wQhQQIFfp1nqv8ZMVL+IkVgf3xO1zK
IT4Ru60ieR0TXPPO4lzf7mojbywgCrEYMm6QP3uulkcWFKfOEPZlBhspfEIVAHPZ
v+bNebNYx7i50W8n6ataRChHVhoHrZsGygsK8K4z/8UWcnqevYojnAOVF/e6rVN+
NPHKbz/gzxIfDVVfoKmq+aHgnQk1K3ZaYvc3OjyHgW5KFqUTUvz5R1Hgdc4cmcPs
BejIhhaRd47s5yl90tx9HmXsOYDznQDVxbmR1EWl0y9QO8uCJ0NIdlyXYBrLbm5q
3GgDiQWoaEyg+w==
=zPgs
-----END PGP SIGNATURE-----
Merge tag 'irq-core-2025-03-23' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull irq updates from Thomas Gleixner:
"A small set of core changes for the interrupt subsystem:
- Expose the MSI message in the existing debug filesystem dump.
That's useful for validation and debugging.
- Small cleanups"
* tag 'irq-core-2025-03-23' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
genirq: Make a few functions static
irqdomain: Remove extern from function declarations
genirq/msi: Expose MSI message data in debugfs
pull/838/merge
commit
43a7eec035
|
|
@ -350,13 +350,13 @@ struct irq_domain *irq_domain_create_legacy(struct fwnode_handle *fwnode,
|
||||||
irq_hw_number_t first_hwirq,
|
irq_hw_number_t first_hwirq,
|
||||||
const struct irq_domain_ops *ops,
|
const struct irq_domain_ops *ops,
|
||||||
void *host_data);
|
void *host_data);
|
||||||
extern struct irq_domain *irq_find_matching_fwspec(struct irq_fwspec *fwspec,
|
struct irq_domain *irq_find_matching_fwspec(struct irq_fwspec *fwspec,
|
||||||
enum irq_domain_bus_token bus_token);
|
enum irq_domain_bus_token bus_token);
|
||||||
extern void irq_set_default_host(struct irq_domain *host);
|
void irq_set_default_host(struct irq_domain *host);
|
||||||
extern struct irq_domain *irq_get_default_host(void);
|
struct irq_domain *irq_get_default_host(void);
|
||||||
extern int irq_domain_alloc_descs(int virq, unsigned int nr_irqs,
|
int irq_domain_alloc_descs(int virq, unsigned int nr_irqs,
|
||||||
irq_hw_number_t hwirq, int node,
|
irq_hw_number_t hwirq, int node,
|
||||||
const struct irq_affinity_desc *affinity);
|
const struct irq_affinity_desc *affinity);
|
||||||
|
|
||||||
static inline struct fwnode_handle *of_node_to_fwnode(struct device_node *node)
|
static inline struct fwnode_handle *of_node_to_fwnode(struct device_node *node)
|
||||||
{
|
{
|
||||||
|
|
@ -370,8 +370,8 @@ static inline bool is_fwnode_irqchip(const struct fwnode_handle *fwnode)
|
||||||
return fwnode && fwnode->ops == &irqchip_fwnode_ops;
|
return fwnode && fwnode->ops == &irqchip_fwnode_ops;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern void irq_domain_update_bus_token(struct irq_domain *domain,
|
void irq_domain_update_bus_token(struct irq_domain *domain,
|
||||||
enum irq_domain_bus_token bus_token);
|
enum irq_domain_bus_token bus_token);
|
||||||
|
|
||||||
static inline
|
static inline
|
||||||
struct irq_domain *irq_find_matching_fwnode(struct fwnode_handle *fwnode,
|
struct irq_domain *irq_find_matching_fwnode(struct fwnode_handle *fwnode,
|
||||||
|
|
@ -454,7 +454,7 @@ static inline struct irq_domain *irq_domain_add_nomap(struct device_node *of_nod
|
||||||
return IS_ERR(d) ? NULL : d;
|
return IS_ERR(d) ? NULL : d;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern unsigned int irq_create_direct_mapping(struct irq_domain *host);
|
unsigned int irq_create_direct_mapping(struct irq_domain *host);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static inline struct irq_domain *irq_domain_add_tree(struct device_node *of_node,
|
static inline struct irq_domain *irq_domain_add_tree(struct device_node *of_node,
|
||||||
|
|
@ -507,19 +507,19 @@ static inline struct irq_domain *irq_domain_create_tree(struct fwnode_handle *fw
|
||||||
return IS_ERR(d) ? NULL : d;
|
return IS_ERR(d) ? NULL : d;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern void irq_domain_remove(struct irq_domain *host);
|
void irq_domain_remove(struct irq_domain *host);
|
||||||
|
|
||||||
extern int irq_domain_associate(struct irq_domain *domain, unsigned int irq,
|
int irq_domain_associate(struct irq_domain *domain, unsigned int irq,
|
||||||
irq_hw_number_t hwirq);
|
irq_hw_number_t hwirq);
|
||||||
extern void irq_domain_associate_many(struct irq_domain *domain,
|
void irq_domain_associate_many(struct irq_domain *domain,
|
||||||
unsigned int irq_base,
|
unsigned int irq_base,
|
||||||
irq_hw_number_t hwirq_base, int count);
|
irq_hw_number_t hwirq_base, int count);
|
||||||
|
|
||||||
extern unsigned int irq_create_mapping_affinity(struct irq_domain *host,
|
unsigned int irq_create_mapping_affinity(struct irq_domain *host,
|
||||||
irq_hw_number_t hwirq,
|
irq_hw_number_t hwirq,
|
||||||
const struct irq_affinity_desc *affinity);
|
const struct irq_affinity_desc *affinity);
|
||||||
extern unsigned int irq_create_fwspec_mapping(struct irq_fwspec *fwspec);
|
unsigned int irq_create_fwspec_mapping(struct irq_fwspec *fwspec);
|
||||||
extern void irq_dispose_mapping(unsigned int virq);
|
void irq_dispose_mapping(unsigned int virq);
|
||||||
|
|
||||||
static inline unsigned int irq_create_mapping(struct irq_domain *host,
|
static inline unsigned int irq_create_mapping(struct irq_domain *host,
|
||||||
irq_hw_number_t hwirq)
|
irq_hw_number_t hwirq)
|
||||||
|
|
@ -527,9 +527,9 @@ static inline unsigned int irq_create_mapping(struct irq_domain *host,
|
||||||
return irq_create_mapping_affinity(host, hwirq, NULL);
|
return irq_create_mapping_affinity(host, hwirq, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern struct irq_desc *__irq_resolve_mapping(struct irq_domain *domain,
|
struct irq_desc *__irq_resolve_mapping(struct irq_domain *domain,
|
||||||
irq_hw_number_t hwirq,
|
irq_hw_number_t hwirq,
|
||||||
unsigned int *irq);
|
unsigned int *irq);
|
||||||
|
|
||||||
static inline struct irq_desc *irq_resolve_mapping(struct irq_domain *domain,
|
static inline struct irq_desc *irq_resolve_mapping(struct irq_domain *domain,
|
||||||
irq_hw_number_t hwirq)
|
irq_hw_number_t hwirq)
|
||||||
|
|
@ -587,19 +587,21 @@ int irq_reserve_ipi(struct irq_domain *domain, const struct cpumask *dest);
|
||||||
int irq_destroy_ipi(unsigned int irq, const struct cpumask *dest);
|
int irq_destroy_ipi(unsigned int irq, const struct cpumask *dest);
|
||||||
|
|
||||||
/* V2 interfaces to support hierarchy IRQ domains. */
|
/* V2 interfaces to support hierarchy IRQ domains. */
|
||||||
extern struct irq_data *irq_domain_get_irq_data(struct irq_domain *domain,
|
struct irq_data *irq_domain_get_irq_data(struct irq_domain *domain,
|
||||||
unsigned int virq);
|
unsigned int virq);
|
||||||
extern void irq_domain_set_info(struct irq_domain *domain, unsigned int virq,
|
void irq_domain_set_info(struct irq_domain *domain, unsigned int virq,
|
||||||
irq_hw_number_t hwirq,
|
irq_hw_number_t hwirq,
|
||||||
const struct irq_chip *chip,
|
const struct irq_chip *chip,
|
||||||
void *chip_data, irq_flow_handler_t handler,
|
void *chip_data, irq_flow_handler_t handler,
|
||||||
void *handler_data, const char *handler_name);
|
void *handler_data, const char *handler_name);
|
||||||
extern void irq_domain_reset_irq_data(struct irq_data *irq_data);
|
void irq_domain_reset_irq_data(struct irq_data *irq_data);
|
||||||
#ifdef CONFIG_IRQ_DOMAIN_HIERARCHY
|
#ifdef CONFIG_IRQ_DOMAIN_HIERARCHY
|
||||||
extern struct irq_domain *irq_domain_create_hierarchy(struct irq_domain *parent,
|
struct irq_domain *irq_domain_create_hierarchy(struct irq_domain *parent,
|
||||||
unsigned int flags, unsigned int size,
|
unsigned int flags,
|
||||||
struct fwnode_handle *fwnode,
|
unsigned int size,
|
||||||
const struct irq_domain_ops *ops, void *host_data);
|
struct fwnode_handle *fwnode,
|
||||||
|
const struct irq_domain_ops *ops,
|
||||||
|
void *host_data);
|
||||||
|
|
||||||
static inline struct irq_domain *irq_domain_add_hierarchy(struct irq_domain *parent,
|
static inline struct irq_domain *irq_domain_add_hierarchy(struct irq_domain *parent,
|
||||||
unsigned int flags,
|
unsigned int flags,
|
||||||
|
|
@ -613,13 +615,13 @@ static inline struct irq_domain *irq_domain_add_hierarchy(struct irq_domain *par
|
||||||
ops, host_data);
|
ops, host_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int __irq_domain_alloc_irqs(struct irq_domain *domain, int irq_base,
|
int __irq_domain_alloc_irqs(struct irq_domain *domain, int irq_base,
|
||||||
unsigned int nr_irqs, int node, void *arg,
|
unsigned int nr_irqs, int node, void *arg,
|
||||||
bool realloc,
|
bool realloc,
|
||||||
const struct irq_affinity_desc *affinity);
|
const struct irq_affinity_desc *affinity);
|
||||||
extern void irq_domain_free_irqs(unsigned int virq, unsigned int nr_irqs);
|
void irq_domain_free_irqs(unsigned int virq, unsigned int nr_irqs);
|
||||||
extern int irq_domain_activate_irq(struct irq_data *irq_data, bool early);
|
int irq_domain_activate_irq(struct irq_data *irq_data, bool early);
|
||||||
extern void irq_domain_deactivate_irq(struct irq_data *irq_data);
|
void irq_domain_deactivate_irq(struct irq_data *irq_data);
|
||||||
|
|
||||||
static inline int irq_domain_alloc_irqs(struct irq_domain *domain,
|
static inline int irq_domain_alloc_irqs(struct irq_domain *domain,
|
||||||
unsigned int nr_irqs, int node, void *arg)
|
unsigned int nr_irqs, int node, void *arg)
|
||||||
|
|
@ -628,32 +630,29 @@ static inline int irq_domain_alloc_irqs(struct irq_domain *domain,
|
||||||
NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int irq_domain_alloc_irqs_hierarchy(struct irq_domain *domain,
|
int irq_domain_set_hwirq_and_chip(struct irq_domain *domain,
|
||||||
unsigned int irq_base,
|
unsigned int virq,
|
||||||
unsigned int nr_irqs, void *arg);
|
irq_hw_number_t hwirq,
|
||||||
extern int irq_domain_set_hwirq_and_chip(struct irq_domain *domain,
|
const struct irq_chip *chip,
|
||||||
unsigned int virq,
|
void *chip_data);
|
||||||
irq_hw_number_t hwirq,
|
void irq_domain_free_irqs_common(struct irq_domain *domain,
|
||||||
const struct irq_chip *chip,
|
unsigned int virq,
|
||||||
void *chip_data);
|
unsigned int nr_irqs);
|
||||||
extern void irq_domain_free_irqs_common(struct irq_domain *domain,
|
void irq_domain_free_irqs_top(struct irq_domain *domain,
|
||||||
unsigned int virq,
|
unsigned int virq, unsigned int nr_irqs);
|
||||||
unsigned int nr_irqs);
|
|
||||||
extern void irq_domain_free_irqs_top(struct irq_domain *domain,
|
|
||||||
unsigned int virq, unsigned int nr_irqs);
|
|
||||||
|
|
||||||
extern int irq_domain_push_irq(struct irq_domain *domain, int virq, void *arg);
|
int irq_domain_push_irq(struct irq_domain *domain, int virq, void *arg);
|
||||||
extern int irq_domain_pop_irq(struct irq_domain *domain, int virq);
|
int irq_domain_pop_irq(struct irq_domain *domain, int virq);
|
||||||
|
|
||||||
extern int irq_domain_alloc_irqs_parent(struct irq_domain *domain,
|
int irq_domain_alloc_irqs_parent(struct irq_domain *domain,
|
||||||
unsigned int irq_base,
|
unsigned int irq_base,
|
||||||
unsigned int nr_irqs, void *arg);
|
unsigned int nr_irqs, void *arg);
|
||||||
|
|
||||||
extern void irq_domain_free_irqs_parent(struct irq_domain *domain,
|
void irq_domain_free_irqs_parent(struct irq_domain *domain,
|
||||||
unsigned int irq_base,
|
unsigned int irq_base,
|
||||||
unsigned int nr_irqs);
|
unsigned int nr_irqs);
|
||||||
|
|
||||||
extern int irq_domain_disconnect_hierarchy(struct irq_domain *domain,
|
int irq_domain_disconnect_hierarchy(struct irq_domain *domain,
|
||||||
unsigned int virq);
|
unsigned int virq);
|
||||||
|
|
||||||
static inline bool irq_domain_is_hierarchy(struct irq_domain *domain)
|
static inline bool irq_domain_is_hierarchy(struct irq_domain *domain)
|
||||||
|
|
|
||||||
|
|
@ -232,6 +232,21 @@ __irq_startup_managed(struct irq_desc *desc, const struct cpumask *aff,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static void irq_enable(struct irq_desc *desc)
|
||||||
|
{
|
||||||
|
if (!irqd_irq_disabled(&desc->irq_data)) {
|
||||||
|
unmask_irq(desc);
|
||||||
|
} else {
|
||||||
|
irq_state_clr_disabled(desc);
|
||||||
|
if (desc->irq_data.chip->irq_enable) {
|
||||||
|
desc->irq_data.chip->irq_enable(&desc->irq_data);
|
||||||
|
irq_state_clr_masked(desc);
|
||||||
|
} else {
|
||||||
|
unmask_irq(desc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int __irq_startup(struct irq_desc *desc)
|
static int __irq_startup(struct irq_desc *desc)
|
||||||
{
|
{
|
||||||
struct irq_data *d = irq_desc_get_irq_data(desc);
|
struct irq_data *d = irq_desc_get_irq_data(desc);
|
||||||
|
|
@ -332,21 +347,6 @@ void irq_shutdown_and_deactivate(struct irq_desc *desc)
|
||||||
irq_domain_deactivate_irq(&desc->irq_data);
|
irq_domain_deactivate_irq(&desc->irq_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void irq_enable(struct irq_desc *desc)
|
|
||||||
{
|
|
||||||
if (!irqd_irq_disabled(&desc->irq_data)) {
|
|
||||||
unmask_irq(desc);
|
|
||||||
} else {
|
|
||||||
irq_state_clr_disabled(desc);
|
|
||||||
if (desc->irq_data.chip->irq_enable) {
|
|
||||||
desc->irq_data.chip->irq_enable(&desc->irq_data);
|
|
||||||
irq_state_clr_masked(desc);
|
|
||||||
} else {
|
|
||||||
unmask_irq(desc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void __irq_disable(struct irq_desc *desc, bool mask)
|
static void __irq_disable(struct irq_desc *desc, bool mask)
|
||||||
{
|
{
|
||||||
if (irqd_irq_disabled(&desc->irq_data)) {
|
if (irqd_irq_disabled(&desc->irq_data)) {
|
||||||
|
|
|
||||||
|
|
@ -90,7 +90,6 @@ extern int irq_startup(struct irq_desc *desc, bool resend, bool force);
|
||||||
|
|
||||||
extern void irq_shutdown(struct irq_desc *desc);
|
extern void irq_shutdown(struct irq_desc *desc);
|
||||||
extern void irq_shutdown_and_deactivate(struct irq_desc *desc);
|
extern void irq_shutdown_and_deactivate(struct irq_desc *desc);
|
||||||
extern void irq_enable(struct irq_desc *desc);
|
|
||||||
extern void irq_disable(struct irq_desc *desc);
|
extern void irq_disable(struct irq_desc *desc);
|
||||||
extern void irq_percpu_enable(struct irq_desc *desc, unsigned int cpu);
|
extern void irq_percpu_enable(struct irq_desc *desc, unsigned int cpu);
|
||||||
extern void irq_percpu_disable(struct irq_desc *desc, unsigned int cpu);
|
extern void irq_percpu_disable(struct irq_desc *desc, unsigned int cpu);
|
||||||
|
|
@ -98,18 +97,12 @@ extern void mask_irq(struct irq_desc *desc);
|
||||||
extern void unmask_irq(struct irq_desc *desc);
|
extern void unmask_irq(struct irq_desc *desc);
|
||||||
extern void unmask_threaded_irq(struct irq_desc *desc);
|
extern void unmask_threaded_irq(struct irq_desc *desc);
|
||||||
|
|
||||||
extern unsigned int kstat_irqs_desc(struct irq_desc *desc, const struct cpumask *cpumask);
|
|
||||||
|
|
||||||
#ifdef CONFIG_SPARSE_IRQ
|
#ifdef CONFIG_SPARSE_IRQ
|
||||||
static inline void irq_mark_irq(unsigned int irq) { }
|
static inline void irq_mark_irq(unsigned int irq) { }
|
||||||
#else
|
#else
|
||||||
extern void irq_mark_irq(unsigned int irq);
|
extern void irq_mark_irq(unsigned int irq);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern int __irq_get_irqchip_state(struct irq_data *data,
|
|
||||||
enum irqchip_irq_state which,
|
|
||||||
bool *state);
|
|
||||||
|
|
||||||
irqreturn_t __handle_irq_event_percpu(struct irq_desc *desc);
|
irqreturn_t __handle_irq_event_percpu(struct irq_desc *desc);
|
||||||
irqreturn_t handle_irq_event_percpu(struct irq_desc *desc);
|
irqreturn_t handle_irq_event_percpu(struct irq_desc *desc);
|
||||||
irqreturn_t handle_irq_event(struct irq_desc *desc);
|
irqreturn_t handle_irq_event(struct irq_desc *desc);
|
||||||
|
|
@ -139,8 +132,6 @@ static inline void unregister_handler_proc(unsigned int irq,
|
||||||
|
|
||||||
extern bool irq_can_set_affinity_usr(unsigned int irq);
|
extern bool irq_can_set_affinity_usr(unsigned int irq);
|
||||||
|
|
||||||
extern void irq_set_thread_affinity(struct irq_desc *desc);
|
|
||||||
|
|
||||||
extern int irq_do_set_affinity(struct irq_data *data,
|
extern int irq_do_set_affinity(struct irq_data *data,
|
||||||
const struct cpumask *dest, bool force);
|
const struct cpumask *dest, bool force);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -991,7 +991,7 @@ unsigned int kstat_irqs_cpu(unsigned int irq, int cpu)
|
||||||
return desc && desc->kstat_irqs ? per_cpu(desc->kstat_irqs->cnt, cpu) : 0;
|
return desc && desc->kstat_irqs ? per_cpu(desc->kstat_irqs->cnt, cpu) : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int kstat_irqs_desc(struct irq_desc *desc, const struct cpumask *cpumask)
|
static unsigned int kstat_irqs_desc(struct irq_desc *desc, const struct cpumask *cpumask)
|
||||||
{
|
{
|
||||||
unsigned int sum = 0;
|
unsigned int sum = 0;
|
||||||
int cpu;
|
int cpu;
|
||||||
|
|
|
||||||
|
|
@ -1589,9 +1589,8 @@ static void irq_domain_free_irqs_hierarchy(struct irq_domain *domain,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int irq_domain_alloc_irqs_hierarchy(struct irq_domain *domain,
|
static int irq_domain_alloc_irqs_hierarchy(struct irq_domain *domain, unsigned int irq_base,
|
||||||
unsigned int irq_base,
|
unsigned int nr_irqs, void *arg)
|
||||||
unsigned int nr_irqs, void *arg)
|
|
||||||
{
|
{
|
||||||
if (!domain->ops->alloc) {
|
if (!domain->ops->alloc) {
|
||||||
pr_debug("domain->ops->alloc() is NULL\n");
|
pr_debug("domain->ops->alloc() is NULL\n");
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,8 @@ static int __init setup_forced_irqthreads(char *arg)
|
||||||
early_param("threadirqs", setup_forced_irqthreads);
|
early_param("threadirqs", setup_forced_irqthreads);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static int __irq_get_irqchip_state(struct irq_data *d, enum irqchip_irq_state which, bool *state);
|
||||||
|
|
||||||
static void __synchronize_hardirq(struct irq_desc *desc, bool sync_chip)
|
static void __synchronize_hardirq(struct irq_desc *desc, bool sync_chip)
|
||||||
{
|
{
|
||||||
struct irq_data *irqd = irq_desc_get_irq_data(desc);
|
struct irq_data *irqd = irq_desc_get_irq_data(desc);
|
||||||
|
|
@ -187,7 +189,7 @@ bool irq_can_set_affinity_usr(unsigned int irq)
|
||||||
* set_cpus_allowed_ptr() here as we hold desc->lock and this
|
* set_cpus_allowed_ptr() here as we hold desc->lock and this
|
||||||
* code can be called from hard interrupt context.
|
* code can be called from hard interrupt context.
|
||||||
*/
|
*/
|
||||||
void irq_set_thread_affinity(struct irq_desc *desc)
|
static void irq_set_thread_affinity(struct irq_desc *desc)
|
||||||
{
|
{
|
||||||
struct irqaction *action;
|
struct irqaction *action;
|
||||||
|
|
||||||
|
|
@ -2789,8 +2791,7 @@ out:
|
||||||
irq_put_desc_unlock(desc, flags);
|
irq_put_desc_unlock(desc, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
int __irq_get_irqchip_state(struct irq_data *data, enum irqchip_irq_state which,
|
static int __irq_get_irqchip_state(struct irq_data *data, enum irqchip_irq_state which, bool *state)
|
||||||
bool *state)
|
|
||||||
{
|
{
|
||||||
struct irq_chip *chip;
|
struct irq_chip *chip;
|
||||||
int err = -EINVAL;
|
int err = -EINVAL;
|
||||||
|
|
|
||||||
|
|
@ -15,6 +15,7 @@
|
||||||
#include <linux/mutex.h>
|
#include <linux/mutex.h>
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
#include <linux/seq_file.h>
|
||||||
#include <linux/sysfs.h>
|
#include <linux/sysfs.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/xarray.h>
|
#include <linux/xarray.h>
|
||||||
|
|
@ -756,12 +757,30 @@ static int msi_domain_translate(struct irq_domain *domain, struct irq_fwspec *fw
|
||||||
return info->ops->msi_translate(domain, fwspec, hwirq, type);
|
return info->ops->msi_translate(domain, fwspec, hwirq, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_GENERIC_IRQ_DEBUGFS
|
||||||
|
static void msi_domain_debug_show(struct seq_file *m, struct irq_domain *d,
|
||||||
|
struct irq_data *irqd, int ind)
|
||||||
|
{
|
||||||
|
struct msi_desc *desc = irq_data_get_msi_desc(irqd);
|
||||||
|
|
||||||
|
if (!desc)
|
||||||
|
return;
|
||||||
|
|
||||||
|
seq_printf(m, "\n%*saddress_hi: 0x%08x", ind + 1, "", desc->msg.address_hi);
|
||||||
|
seq_printf(m, "\n%*saddress_lo: 0x%08x", ind + 1, "", desc->msg.address_lo);
|
||||||
|
seq_printf(m, "\n%*smsg_data: 0x%08x\n", ind + 1, "", desc->msg.data);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static const struct irq_domain_ops msi_domain_ops = {
|
static const struct irq_domain_ops msi_domain_ops = {
|
||||||
.alloc = msi_domain_alloc,
|
.alloc = msi_domain_alloc,
|
||||||
.free = msi_domain_free,
|
.free = msi_domain_free,
|
||||||
.activate = msi_domain_activate,
|
.activate = msi_domain_activate,
|
||||||
.deactivate = msi_domain_deactivate,
|
.deactivate = msi_domain_deactivate,
|
||||||
.translate = msi_domain_translate,
|
.translate = msi_domain_translate,
|
||||||
|
#ifdef CONFIG_GENERIC_IRQ_DEBUGFS
|
||||||
|
.debug_show = msi_domain_debug_show,
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
static irq_hw_number_t msi_domain_ops_get_hwirq(struct msi_domain_info *info,
|
static irq_hw_number_t msi_domain_ops_get_hwirq(struct msi_domain_info *info,
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue