Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

powerpc: Convert the FSL MSI code to use msi_bitmap

This is 90% straight forward, although we have to change a few
printk format strings as well because of the change in type of hwirq.

Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
Signed-off-by: Paul Mackerras <paulus@samba.org>

authored by

Michael Ellerman and committed by
Paul Mackerras
7e7ab367 7e302869

+17 -91
+14 -89
arch/powerpc/sysdev/fsl_msi.c
··· 14 14 */ 15 15 #include <linux/irq.h> 16 16 #include <linux/bootmem.h> 17 - #include <linux/bitmap.h> 18 17 #include <linux/msi.h> 19 18 #include <linux/pci.h> 20 19 #include <linux/of_platform.h> ··· 66 67 .map = fsl_msi_host_map, 67 68 }; 68 69 69 - static irq_hw_number_t fsl_msi_alloc_hwirqs(struct fsl_msi *msi, int num) 70 - { 71 - unsigned long flags; 72 - int order = get_count_order(num); 73 - int offset; 74 - 75 - spin_lock_irqsave(&msi->bitmap_lock, flags); 76 - 77 - offset = bitmap_find_free_region(msi->fsl_msi_bitmap, 78 - NR_MSI_IRQS, order); 79 - 80 - spin_unlock_irqrestore(&msi->bitmap_lock, flags); 81 - 82 - pr_debug("%s: allocated 0x%x (2^%d) at offset 0x%x\n", 83 - __func__, num, order, offset); 84 - 85 - return offset; 86 - } 87 - 88 - static void fsl_msi_free_hwirqs(struct fsl_msi *msi, int offset, int num) 89 - { 90 - unsigned long flags; 91 - int order = get_count_order(num); 92 - 93 - pr_debug("%s: freeing 0x%x (2^%d) at offset 0x%x\n", 94 - __func__, num, order, offset); 95 - 96 - spin_lock_irqsave(&msi->bitmap_lock, flags); 97 - bitmap_release_region(msi->fsl_msi_bitmap, offset, order); 98 - spin_unlock_irqrestore(&msi->bitmap_lock, flags); 99 - } 100 - 101 - static int fsl_msi_free_dt_hwirqs(struct fsl_msi *msi) 102 - { 103 - int i; 104 - int len; 105 - const u32 *p; 106 - 107 - bitmap_allocate_region(msi->fsl_msi_bitmap, 0, 108 - get_count_order(NR_MSI_IRQS)); 109 - 110 - p = of_get_property(msi->irqhost->of_node, "msi-available-ranges", 111 - &len); 112 - 113 - if (!p) { 114 - /* No msi-available-ranges property, 115 - * All the 256 MSI interrupts can be used 116 - */ 117 - fsl_msi_free_hwirqs(msi, 0, 0x100); 118 - return 0; 119 - } 120 - 121 - if ((len % (2 * sizeof(u32))) != 0) { 122 - printk(KERN_WARNING "fsl_msi: Malformed msi-available-ranges " 123 - "property on %s\n", msi->irqhost->of_node->full_name); 124 - return -EINVAL; 125 - } 126 - 127 - /* Format is: (<u32 start> <u32 count>)+ */ 128 - len /= 2 * sizeof(u32); 129 - for (i = 0; i < len; i++, p += 2) 130 - fsl_msi_free_hwirqs(msi, *p, *(p + 1)); 131 - 132 - return 0; 133 - } 134 - 135 70 static int fsl_msi_init_allocator(struct fsl_msi *msi_data) 136 71 { 137 72 int rc; 138 - int size = BITS_TO_LONGS(NR_MSI_IRQS) * sizeof(u32); 139 73 140 - msi_data->fsl_msi_bitmap = kzalloc(size, GFP_KERNEL); 74 + rc = msi_bitmap_alloc(&msi_data->bitmap, NR_MSI_IRQS, 75 + msi_data->irqhost->of_node); 76 + if (rc) 77 + return rc; 141 78 142 - if (msi_data->fsl_msi_bitmap == NULL) { 143 - pr_debug("%s: ENOMEM allocating allocator bitmap!\n", 144 - __func__); 145 - return -ENOMEM; 79 + rc = msi_bitmap_reserve_dt_hwirqs(&msi_data->bitmap); 80 + if (rc < 0) { 81 + msi_bitmap_free(&msi_data->bitmap); 82 + return rc; 146 83 } 147 84 148 - rc = fsl_msi_free_dt_hwirqs(msi_data); 149 - if (rc) 150 - goto out_free; 151 - 152 85 return 0; 153 - out_free: 154 - kfree(msi_data->fsl_msi_bitmap); 155 - 156 - msi_data->fsl_msi_bitmap = NULL; 157 - return rc; 158 - 159 86 } 160 87 161 88 static int fsl_msi_check_device(struct pci_dev *pdev, int nvec, int type) ··· 101 176 if (entry->irq == NO_IRQ) 102 177 continue; 103 178 set_irq_msi(entry->irq, NULL); 104 - fsl_msi_free_hwirqs(msi_data, virq_to_hw(entry->irq), 1); 179 + msi_bitmap_free_hwirqs(&msi_data->bitmap, 180 + virq_to_hw(entry->irq), 1); 105 181 irq_dispose_mapping(entry->irq); 106 182 } 107 183 ··· 124 198 125 199 static int fsl_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type) 126 200 { 127 - irq_hw_number_t hwirq; 128 - int rc; 201 + int rc, hwirq; 129 202 unsigned int virq; 130 203 struct msi_desc *entry; 131 204 struct msi_msg msg; 132 205 struct fsl_msi *msi_data = fsl_msi; 133 206 134 207 list_for_each_entry(entry, &pdev->msi_list, list) { 135 - hwirq = fsl_msi_alloc_hwirqs(msi_data, 1); 208 + hwirq = msi_bitmap_alloc_hwirqs(&msi_data->bitmap, 1); 136 209 if (hwirq < 0) { 137 210 rc = hwirq; 138 211 pr_debug("%s: fail allocating msi interrupt\n", ··· 142 217 virq = irq_create_mapping(msi_data->irqhost, hwirq); 143 218 144 219 if (virq == NO_IRQ) { 145 - pr_debug("%s: fail mapping hwirq 0x%lx\n", 220 + pr_debug("%s: fail mapping hwirq 0x%x\n", 146 221 __func__, hwirq); 147 - fsl_msi_free_hwirqs(msi_data, hwirq, 1); 222 + msi_bitmap_free_hwirqs(&msi_data->bitmap, hwirq, 1); 148 223 rc = -ENOSPC; 149 224 goto out_free; 150 225 }
+3 -2
arch/powerpc/sysdev/fsl_msi.h
··· 13 13 #ifndef _POWERPC_SYSDEV_FSL_MSI_H 14 14 #define _POWERPC_SYSDEV_FSL_MSI_H 15 15 16 + #include <asm/msi_bitmap.h> 17 + 16 18 #define NR_MSI_REG 8 17 19 #define IRQS_PER_MSI_REG 32 18 20 #define NR_MSI_IRQS (NR_MSI_REG * IRQS_PER_MSI_REG) ··· 33 31 void __iomem *msi_regs; 34 32 u32 feature; 35 33 36 - unsigned long *fsl_msi_bitmap; 37 - spinlock_t bitmap_lock; 34 + struct msi_bitmap bitmap; 38 35 }; 39 36 40 37 #endif /* _POWERPC_SYSDEV_FSL_MSI_H */