aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/linux/irqdomain.h35
-rw-r--r--kernel/irq/irqdomain.c14
2 files changed, 49 insertions, 0 deletions
diff --git a/include/linux/irqdomain.h b/include/linux/irqdomain.h
index ffb84604c1de..bc2f5719dace 100644
--- a/include/linux/irqdomain.h
+++ b/include/linux/irqdomain.h
@@ -183,6 +183,12 @@ enum {
183 /* Irq domain is an IPI domain with single virq */ 183 /* Irq domain is an IPI domain with single virq */
184 IRQ_DOMAIN_FLAG_IPI_SINGLE = (1 << 3), 184 IRQ_DOMAIN_FLAG_IPI_SINGLE = (1 << 3),
185 185
186 /* Irq domain implements MSIs */
187 IRQ_DOMAIN_FLAG_MSI = (1 << 4),
188
189 /* Irq domain implements MSI remapping */
190 IRQ_DOMAIN_FLAG_MSI_REMAP = (1 << 5),
191
186 /* 192 /*
187 * Flags starting from IRQ_DOMAIN_FLAG_NONCORE are reserved 193 * Flags starting from IRQ_DOMAIN_FLAG_NONCORE are reserved
188 * for implementation specific purposes and ignored by the 194 * for implementation specific purposes and ignored by the
@@ -446,6 +452,19 @@ static inline bool irq_domain_is_ipi_single(struct irq_domain *domain)
446{ 452{
447 return domain->flags & IRQ_DOMAIN_FLAG_IPI_SINGLE; 453 return domain->flags & IRQ_DOMAIN_FLAG_IPI_SINGLE;
448} 454}
455
456static inline bool irq_domain_is_msi(struct irq_domain *domain)
457{
458 return domain->flags & IRQ_DOMAIN_FLAG_MSI;
459}
460
461static inline bool irq_domain_is_msi_remap(struct irq_domain *domain)
462{
463 return domain->flags & IRQ_DOMAIN_FLAG_MSI_REMAP;
464}
465
466extern bool irq_domain_hierarchical_is_msi_remap(struct irq_domain *domain);
467
449#else /* CONFIG_IRQ_DOMAIN_HIERARCHY */ 468#else /* CONFIG_IRQ_DOMAIN_HIERARCHY */
450static inline void irq_domain_activate_irq(struct irq_data *data) { } 469static inline void irq_domain_activate_irq(struct irq_data *data) { }
451static inline void irq_domain_deactivate_irq(struct irq_data *data) { } 470static inline void irq_domain_deactivate_irq(struct irq_data *data) { }
@@ -477,6 +496,22 @@ static inline bool irq_domain_is_ipi_single(struct irq_domain *domain)
477{ 496{
478 return false; 497 return false;
479} 498}
499
500static inline bool irq_domain_is_msi(struct irq_domain *domain)
501{
502 return false;
503}
504
505static inline bool irq_domain_is_msi_remap(struct irq_domain *domain)
506{
507 return false;
508}
509
510static inline bool
511irq_domain_hierarchical_is_msi_remap(struct irq_domain *domain)
512{
513 return false;
514}
480#endif /* CONFIG_IRQ_DOMAIN_HIERARCHY */ 515#endif /* CONFIG_IRQ_DOMAIN_HIERARCHY */
481 516
482#else /* CONFIG_IRQ_DOMAIN */ 517#else /* CONFIG_IRQ_DOMAIN */
diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c
index 8c0a0ae43521..876e13172dc8 100644
--- a/kernel/irq/irqdomain.c
+++ b/kernel/irq/irqdomain.c
@@ -1392,6 +1392,20 @@ static void irq_domain_check_hierarchy(struct irq_domain *domain)
1392 if (domain->ops->alloc) 1392 if (domain->ops->alloc)
1393 domain->flags |= IRQ_DOMAIN_FLAG_HIERARCHY; 1393 domain->flags |= IRQ_DOMAIN_FLAG_HIERARCHY;
1394} 1394}
1395
1396/**
1397 * irq_domain_hierarchical_is_msi_remap - Check if the domain or any
1398 * parent has MSI remapping support
1399 * @domain: domain pointer
1400 */
1401bool irq_domain_hierarchical_is_msi_remap(struct irq_domain *domain)
1402{
1403 for (; domain; domain = domain->parent) {
1404 if (irq_domain_is_msi_remap(domain))
1405 return true;
1406 }
1407 return false;
1408}
1395#else /* CONFIG_IRQ_DOMAIN_HIERARCHY */ 1409#else /* CONFIG_IRQ_DOMAIN_HIERARCHY */
1396/** 1410/**
1397 * irq_domain_get_irq_data - Get irq_data associated with @virq and @domain 1411 * irq_domain_get_irq_data - Get irq_data associated with @virq and @domain