aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric Auger <eric.auger@redhat.com>2017-01-19 15:57:57 -0500
committerWill Deacon <will.deacon@arm.com>2017-01-23 10:00:44 -0500
commit631a9639ac413da6242cb15558ebd661cf633622 (patch)
tree02bd936b0fae2a4b8410550de6ed63bb1aff8ac8
parent50019f09a4baa0bd6635d4933c1bfed22d66b640 (diff)
irqdomain: Add irq domain MSI and MSI_REMAP flags
We introduce two new enum values for the irq domain flag: - IRQ_DOMAIN_FLAG_MSI indicates the irq domain corresponds to an MSI domain - IRQ_DOMAIN_FLAG_MSI_REMAP indicates the irq domain has MSI remapping capabilities. Those values will be useful to check all MSI irq domains have MSI remapping support when assessing the safety of IRQ assignment to a guest. irq_domain_hierarchical_is_msi_remap() allows to check if an irq domain or any parent implements MSI remapping. Signed-off-by: Eric Auger <eric.auger@redhat.com> Reviewed-by: Marc Zyngier <marc.zyngier@arm.com> Reviewed-by: Tomasz Nowicki <tomasz.nowicki@caviumnetworks.com> Tested-by: Tomasz Nowicki <tomasz.nowicki@caviumnetworks.com> Tested-by: Bharat Bhushan <bharat.bhushan@nxp.com> Signed-off-by: Will Deacon <will.deacon@arm.com>
-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