@@ -171,7 +171,7 @@ static struct irq_chip iproc_msi_irq_chip = {
171171
172172static struct msi_domain_info iproc_msi_domain_info = {
173173 .flags = MSI_FLAG_USE_DEF_DOM_OPS | MSI_FLAG_USE_DEF_CHIP_OPS |
174- MSI_FLAG_MULTI_PCI_MSI | MSI_FLAG_PCI_MSIX ,
174+ MSI_FLAG_PCI_MSIX ,
175175 .chip = & iproc_msi_irq_chip ,
176176};
177177
@@ -250,20 +250,23 @@ static int iproc_msi_irq_domain_alloc(struct irq_domain *domain,
250250 struct iproc_msi * msi = domain -> host_data ;
251251 int hwirq , i ;
252252
253+ if (msi -> nr_cpus > 1 && nr_irqs > 1 )
254+ return - EINVAL ;
255+
253256 mutex_lock (& msi -> bitmap_lock );
254257
255- /* Allocate 'nr_cpus' number of MSI vectors each time */
256- hwirq = bitmap_find_next_zero_area (msi -> bitmap , msi -> nr_msi_vecs , 0 ,
257- msi -> nr_cpus , 0 );
258- if (hwirq < msi -> nr_msi_vecs ) {
259- bitmap_set (msi -> bitmap , hwirq , msi -> nr_cpus );
260- } else {
261- mutex_unlock (& msi -> bitmap_lock );
262- return - ENOSPC ;
263- }
258+ /*
259+ * Allocate 'nr_irqs' multiplied by 'nr_cpus' number of MSI vectors
260+ * each time
261+ */
262+ hwirq = bitmap_find_free_region (msi -> bitmap , msi -> nr_msi_vecs ,
263+ order_base_2 (msi -> nr_cpus * nr_irqs ));
264264
265265 mutex_unlock (& msi -> bitmap_lock );
266266
267+ if (hwirq < 0 )
268+ return - ENOSPC ;
269+
267270 for (i = 0 ; i < nr_irqs ; i ++ ) {
268271 irq_domain_set_info (domain , virq + i , hwirq + i ,
269272 & iproc_msi_bottom_irq_chip ,
@@ -284,7 +287,8 @@ static void iproc_msi_irq_domain_free(struct irq_domain *domain,
284287 mutex_lock (& msi -> bitmap_lock );
285288
286289 hwirq = hwirq_to_canonical_hwirq (msi , data -> hwirq );
287- bitmap_clear (msi -> bitmap , hwirq , msi -> nr_cpus );
290+ bitmap_release_region (msi -> bitmap , hwirq ,
291+ order_base_2 (msi -> nr_cpus * nr_irqs ));
288292
289293 mutex_unlock (& msi -> bitmap_lock );
290294
@@ -539,6 +543,9 @@ int iproc_msi_init(struct iproc_pcie *pcie, struct device_node *node)
539543 mutex_init (& msi -> bitmap_lock );
540544 msi -> nr_cpus = num_possible_cpus ();
541545
546+ if (msi -> nr_cpus == 1 )
547+ iproc_msi_domain_info .flags |= MSI_FLAG_MULTI_PCI_MSI ;
548+
542549 msi -> nr_irqs = of_irq_count (node );
543550 if (!msi -> nr_irqs ) {
544551 dev_err (pcie -> dev , "found no MSI GIC interrupt\n" );
0 commit comments