diff options
-rw-r--r-- | include/linux/irqdomain.h | 35 | ||||
-rw-r--r-- | kernel/irq/irqdomain.c | 14 |
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 | |||
456 | static inline bool irq_domain_is_msi(struct irq_domain *domain) | ||
457 | { | ||
458 | return domain->flags & IRQ_DOMAIN_FLAG_MSI; | ||
459 | } | ||
460 | |||
461 | static inline bool irq_domain_is_msi_remap(struct irq_domain *domain) | ||
462 | { | ||
463 | return domain->flags & IRQ_DOMAIN_FLAG_MSI_REMAP; | ||
464 | } | ||
465 | |||
466 | extern bool irq_domain_hierarchical_is_msi_remap(struct irq_domain *domain); | ||
467 | |||
449 | #else /* CONFIG_IRQ_DOMAIN_HIERARCHY */ | 468 | #else /* CONFIG_IRQ_DOMAIN_HIERARCHY */ |
450 | static inline void irq_domain_activate_irq(struct irq_data *data) { } | 469 | static inline void irq_domain_activate_irq(struct irq_data *data) { } |
451 | static inline void irq_domain_deactivate_irq(struct irq_data *data) { } | 470 | static 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 | |||
500 | static inline bool irq_domain_is_msi(struct irq_domain *domain) | ||
501 | { | ||
502 | return false; | ||
503 | } | ||
504 | |||
505 | static inline bool irq_domain_is_msi_remap(struct irq_domain *domain) | ||
506 | { | ||
507 | return false; | ||
508 | } | ||
509 | |||
510 | static inline bool | ||
511 | irq_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 | */ | ||
1401 | bool 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 |