From: Herve Codina <herve.codina@bootlin.com>
To: Matti Vaittinen <mazziesaccount@gmail.com>,
Herve Codina <herve.codina@bootlin.com>,
Thomas Gleixner <tglx@linutronix.de>,
Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>,
Richard Weinberger <richard@nod.at>,
Anton Ivanov <anton.ivanov@cambridgegreys.com>,
Johannes Berg <johannes@sipsolutions.net>,
Marc Zyngier <maz@kernel.org>
Cc: linux-kernel@vger.kernel.org, devicetree@vger.kernel.org,
linux-um@lists.infradead.org,
Allan Nielsen <allan.nielsen@microchip.com>,
Horatiu Vultur <horatiu.vultur@microchip.com>,
Steen Hegelund <steen.hegelund@microchip.com>,
Thomas Petazzoni <thomas.petazzoni@bootlin.com>
Subject: [PATCH 15/23] irqdomain: Add support for generic irq chips creation before publishing a domain
Date: Fri, 14 Jun 2024 19:32:16 +0200 [thread overview]
Message-ID: <20240614173232.1184015-16-herve.codina@bootlin.com> (raw)
In-Reply-To: <20240614173232.1184015-1-herve.codina@bootlin.com>
The current API functions create an irq_domain and also publish this
newly created to domain. Once an irq_domain is published, consumers can
request IRQ in order to use them.
Some interrupt controller drivers have to perform some more operations
with the created irq_domain in order to have it ready to be used.
For instance:
- Allocate generic irq chips with irq_alloc_domain_generic_chips()
- Retrieve the generic irq chips with irq_get_domain_generic_chip()
- Initialize retrieved chips: set register base address and offsets,
set several hooks such as irq_mask, irq_unmask, ...
With the newly introduced irq_domain_alloc_generic_chips(), an interrupt
controller driver can use the irq_domain_chip_generic_info structure and
set the init() hook to perform its generic chips initialization.
In order to avoid a window where the domain is published but not yet
ready to be used, handle the generic chip creation (i.e the
irq_domain_alloc_generic_chips() call) before the domain is published.
Suggested-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Herve Codina <herve.codina@bootlin.com>
---
include/linux/irqdomain.h | 9 +++++++++
kernel/irq/irqdomain.c | 14 +++++++++++++-
2 files changed, 22 insertions(+), 1 deletion(-)
diff --git a/include/linux/irqdomain.h b/include/linux/irqdomain.h
index 2c927edc4d43..5540b22a755c 100644
--- a/include/linux/irqdomain.h
+++ b/include/linux/irqdomain.h
@@ -210,6 +210,9 @@ enum {
/* Irq domain is a MSI device domain */
IRQ_DOMAIN_FLAG_MSI_DEVICE = (1 << 9),
+ /* Irq domain must destroy generic chips when removed */
+ IRQ_DOMAIN_FLAG_DESTROY_GC = (1 << 10),
+
/*
* Flags starting from IRQ_DOMAIN_FLAG_NONCORE are reserved
* for implementation specific purposes and ignored by the
@@ -259,6 +262,9 @@ static inline struct fwnode_handle *irq_domain_alloc_fwnode(phys_addr_t *pa)
}
void irq_domain_free_fwnode(struct fwnode_handle *fwnode);
+
+struct irq_domain_chip_generic_info;
+
/**
* struct irq_domain_info - Domain information structure
* @fwnode: firmware node for the interrupt controller
@@ -270,6 +276,8 @@ void irq_domain_free_fwnode(struct fwnode_handle *fwnode);
* @bus_token: Domain bus token
* @ops: Domain operation callbacks
* @host_data: Controller private data pointer
+ * @dgc_info: Geneneric chip information structure pointer used to
+ * create generic chips for the domain if not NULL.
* @init: Function called when the domain is created.
* Allow to do some additional domain initialisation.
* @exit: Function called when the domain is destroyed.
@@ -290,6 +298,7 @@ struct irq_domain_info {
*/
struct irq_domain *parent;
#endif
+ struct irq_domain_chip_generic_info *dgc_info;
int (*init)(struct irq_domain *d);
void (*exit)(struct irq_domain *d);
};
diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c
index 9efc9f180308..d95ca575a108 100644
--- a/kernel/irq/irqdomain.c
+++ b/kernel/irq/irqdomain.c
@@ -292,16 +292,25 @@ struct irq_domain *irq_domain_instantiate(const struct irq_domain_info *info)
}
#endif
+ if (info->dgc_info) {
+ err = irq_domain_alloc_generic_chips(domain, info->dgc_info);
+ if (err)
+ goto err_domain_free;
+ }
+
if (info->init) {
err = info->init(domain);
if (err)
- goto err_domain_free;
+ goto err_domain_gc_remove;
}
__irq_domain_publish(domain);
return domain;
+err_domain_gc_remove:
+ if (info->dgc_info)
+ irq_domain_remove_generic_chips(domain);
err_domain_free:
irq_domain_free(domain);
return ERR_PTR(err);
@@ -369,6 +378,9 @@ void irq_domain_remove(struct irq_domain *domain)
mutex_unlock(&irq_domain_mutex);
+ if (domain->flags & IRQ_DOMAIN_FLAG_DESTROY_GC)
+ irq_domain_remove_generic_chips(domain);
+
pr_debug("Removed domain %s\n", domain->name);
irq_domain_free(domain);
}
--
2.45.0
next prev parent reply other threads:[~2024-06-14 17:33 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-14 17:32 [PATCH 00/23] Introduce irq_domain_instanciate() Herve Codina
2024-06-14 17:32 ` [PATCH 01/23] irqdomain: Introduce irq_domain_free() Herve Codina
2024-06-14 17:32 ` [PATCH 02/23] irqdomain: Introduce irq_domain_instantiate() Herve Codina
2024-06-14 17:32 ` [PATCH 03/23] irqdomain: Fixed unbalanced fwnode get and put Herve Codina
2024-06-14 17:32 ` [PATCH 04/23] irqdomain: Constify parameter in is_fwnode_irqchip() Herve Codina
2024-06-14 17:32 ` [PATCH 05/23] irqdomain: Use a dedicated function to set the domain name Herve Codina
2024-06-14 17:32 ` [PATCH 06/23] irqdomain: Convert __irq_domain_create() to use struct irq_domain_info Herve Codina
2024-06-14 17:32 ` [PATCH 07/23] irqdomain: Handle additional domain flags in irq_domain_instantiate() Herve Codina
2024-06-14 17:32 ` [PATCH 08/23] irqdomain: Handle domain hierarchy parent " Herve Codina
2024-06-14 17:32 ` [PATCH 09/23] irqdomain: Use irq_domain_instantiate() for hierarchy domain creation Herve Codina
2024-06-14 17:32 ` [PATCH 10/23] irqdomain: Make __irq_domain_create() return an error code Herve Codina
2024-06-14 17:32 ` [PATCH 11/23] irqdomain: Handle domain bus token in irq_domain_create() Herve Codina
2024-06-14 17:32 ` [PATCH 12/23] irqdomain: Introduce init() and exit() hooks Herve Codina
2024-06-14 17:32 ` [PATCH 13/23] genirq/generic_chip: Introduce irq_domain_{alloc,remove}_generic_chips() Herve Codina
2024-06-14 17:32 ` [PATCH 14/23] genirq/generic_chip: Introduce init() and exit() hooks Herve Codina
2024-06-14 17:32 ` Herve Codina [this message]
2024-06-14 17:32 ` [PATCH 16/23] irqdomain: Add a resource managed version of irq_domain_instantiate() Herve Codina
2024-06-14 17:32 ` [PATCH 17/23] irqdomain: Convert __irq_domain_add() wrappers to irq_domain_instantiate() Herve Codina
2024-06-14 17:32 ` [PATCH 18/23] irqdomain: Convert domain creation functions " Herve Codina
2024-06-14 17:32 ` [PATCH 19/23] um: virt-pci: Use irq_domain_instantiate() Herve Codina
2024-06-14 17:32 ` [PATCH 20/23] irqdomain: Remove __irq_domain_add() Herve Codina
2024-06-14 17:32 ` [PATCH 21/23] dt-bindings: interrupt-controller: Add support for Microchip LAN966x OIC Herve Codina
2024-06-14 17:32 ` [PATCH 22/23] irqchip: Add support for " Herve Codina
2024-06-14 17:32 ` [PATCH 23/23] MAINTAINERS: Add the Microchip LAN966x OIC driver entry Herve Codina
2024-06-17 13:57 ` [PATCH 00/23] Introduce irq_domain_instanciate() Thomas Gleixner
2024-06-18 13:05 ` Matti Vaittinen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240614173232.1184015-16-herve.codina@bootlin.com \
--to=herve.codina@bootlin.com \
--cc=allan.nielsen@microchip.com \
--cc=anton.ivanov@cambridgegreys.com \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=horatiu.vultur@microchip.com \
--cc=johannes@sipsolutions.net \
--cc=krzk+dt@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-um@lists.infradead.org \
--cc=maz@kernel.org \
--cc=mazziesaccount@gmail.com \
--cc=richard@nod.at \
--cc=robh@kernel.org \
--cc=steen.hegelund@microchip.com \
--cc=tglx@linutronix.de \
--cc=thomas.petazzoni@bootlin.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).