Skip to content

Commit 1f83515

Browse files
author
Marc Zyngier
committed
genirq/msi: Allow creation of a tree-based irqdomain for platform-msi
platform_msi_create_device_domain() always creates a revmap-based irqdomain, which has the drawback of requiring the number of MSIs that can be allocated ahead of time. This is not always possible, and we sometimes need to use a tree-based irqdomain instead. Add a new platform_msi_create_device_tree_domain() helper to that effect. Reported-by: Miquel Raynal <miquel.raynal@bootlin.com> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com> Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com> Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
1 parent 0c4cb97 commit 1f83515

File tree

2 files changed

+20
-11
lines changed

2 files changed

+20
-11
lines changed

drivers/base/platform-msi.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -321,11 +321,12 @@ void *platform_msi_get_host_data(struct irq_domain *domain)
321321
* Returns an irqdomain for @nvec interrupts
322322
*/
323323
struct irq_domain *
324-
platform_msi_create_device_domain(struct device *dev,
325-
unsigned int nvec,
326-
irq_write_msi_msg_t write_msi_msg,
327-
const struct irq_domain_ops *ops,
328-
void *host_data)
324+
__platform_msi_create_device_domain(struct device *dev,
325+
unsigned int nvec,
326+
bool is_tree,
327+
irq_write_msi_msg_t write_msi_msg,
328+
const struct irq_domain_ops *ops,
329+
void *host_data)
329330
{
330331
struct platform_msi_priv_data *data;
331332
struct irq_domain *domain;
@@ -336,7 +337,8 @@ platform_msi_create_device_domain(struct device *dev,
336337
return NULL;
337338

338339
data->host_data = host_data;
339-
domain = irq_domain_create_hierarchy(dev->msi_domain, 0, nvec,
340+
domain = irq_domain_create_hierarchy(dev->msi_domain, 0,
341+
is_tree ? 0 : nvec,
340342
dev->fwnode, ops, data);
341343
if (!domain)
342344
goto free_priv;

include/linux/msi.h

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -317,11 +317,18 @@ int msi_domain_prepare_irqs(struct irq_domain *domain, struct device *dev,
317317
int msi_domain_populate_irqs(struct irq_domain *domain, struct device *dev,
318318
int virq, int nvec, msi_alloc_info_t *args);
319319
struct irq_domain *
320-
platform_msi_create_device_domain(struct device *dev,
321-
unsigned int nvec,
322-
irq_write_msi_msg_t write_msi_msg,
323-
const struct irq_domain_ops *ops,
324-
void *host_data);
320+
__platform_msi_create_device_domain(struct device *dev,
321+
unsigned int nvec,
322+
bool is_tree,
323+
irq_write_msi_msg_t write_msi_msg,
324+
const struct irq_domain_ops *ops,
325+
void *host_data);
326+
327+
#define platform_msi_create_device_domain(dev, nvec, write, ops, data) \
328+
__platform_msi_create_device_domain(dev, nvec, false, write, ops, data)
329+
#define platform_msi_create_device_tree_domain(dev, nvec, write, ops, data) \
330+
__platform_msi_create_device_domain(dev, nvec, true, write, ops, data)
331+
325332
int platform_msi_domain_alloc(struct irq_domain *domain, unsigned int virq,
326333
unsigned int nr_irqs);
327334
void platform_msi_domain_free(struct irq_domain *domain, unsigned int virq,

0 commit comments

Comments
 (0)