Lines Matching +full:msi +full:- +full:num +full:- +full:vecs

1 // SPDX-License-Identifier: GPL-2.0
4 * Loongson PCH MSI support
7 #define pr_fmt(fmt) "pch-msi: " fmt
10 #include <linux/msi.h>
39 .name = "PCH PCI MSI",
50 mutex_lock(&priv->msi_map_lock); in pch_msi_allocate_hwirq()
52 first = bitmap_find_free_region(priv->msi_map, priv->num_irqs, in pch_msi_allocate_hwirq()
55 mutex_unlock(&priv->msi_map_lock); in pch_msi_allocate_hwirq()
56 return -ENOSPC; in pch_msi_allocate_hwirq()
59 mutex_unlock(&priv->msi_map_lock); in pch_msi_allocate_hwirq()
61 return priv->irq_first + first; in pch_msi_allocate_hwirq()
67 int first = hwirq - priv->irq_first; in pch_msi_free_hwirq()
69 mutex_lock(&priv->msi_map_lock); in pch_msi_free_hwirq()
70 bitmap_release_region(priv->msi_map, first, get_count_order(num_req)); in pch_msi_free_hwirq()
71 mutex_unlock(&priv->msi_map_lock); in pch_msi_free_hwirq()
79 msg->address_hi = upper_32_bits(priv->doorbell); in pch_msi_compose_msi_msg()
80 msg->address_lo = lower_32_bits(priv->doorbell); in pch_msi_compose_msi_msg()
81 msg->data = data->hwirq; in pch_msi_compose_msi_msg()
91 .name = "PCH MSI",
104 fwspec.fwnode = domain->parent->fwnode; in pch_msi_parent_domain_alloc()
115 struct pch_msi_data *priv = domain->host_data; in pch_msi_middle_domain_alloc()
135 irq_domain_free_irqs_parent(domain, virq, i - 1); in pch_msi_middle_domain_alloc()
148 pch_msi_free_hwirq(priv, d->hwirq, nr_irqs); in pch_msi_middle_domain_free()
163 priv->num_irqs, in pch_msi_init_domains()
167 pr_err("Failed to create the MSI middle domain\n"); in pch_msi_init_domains()
168 return -ENOMEM; in pch_msi_init_domains()
171 middle_domain->parent = parent; in pch_msi_init_domains()
178 pr_err("Failed to create PCI MSI domain\n"); in pch_msi_init_domains()
180 return -ENOMEM; in pch_msi_init_domains()
197 return -ENXIO; in pch_msi_init()
202 return -ENOMEM; in pch_msi_init()
204 mutex_init(&priv->msi_map_lock); in pch_msi_init()
212 priv->doorbell = res.start; in pch_msi_init()
214 if (of_property_read_u32(node, "loongson,msi-base-vec", in pch_msi_init()
215 &priv->irq_first)) { in pch_msi_init()
216 pr_err("Unable to parse MSI vec base\n"); in pch_msi_init()
217 ret = -EINVAL; in pch_msi_init()
221 if (of_property_read_u32(node, "loongson,msi-num-vecs", in pch_msi_init()
222 &priv->num_irqs)) { in pch_msi_init()
223 pr_err("Unable to parse MSI vec number\n"); in pch_msi_init()
224 ret = -EINVAL; in pch_msi_init()
228 priv->msi_map = bitmap_alloc(priv->num_irqs, GFP_KERNEL); in pch_msi_init()
229 if (!priv->msi_map) { in pch_msi_init()
230 ret = -ENOMEM; in pch_msi_init()
235 priv->num_irqs, priv->irq_first); in pch_msi_init()
244 kfree(priv->msi_map); in pch_msi_init()
250 IRQCHIP_DECLARE(pch_msi, "loongson,pch-msi-1.0", pch_msi_init);