[PATCH 4/4] powerpc: Convert the MPIC MSI code to use msi_bitmap

2008-08-05 Thread Michael Ellerman
This effects the U3 MSI code as well as the PASEMI MSI code. We keep
some of the MPIC routines as helpers, and also the U3 best-guess
reservation logic. The rest is replaced by the generic code.

And a few printk format changes due to hwirq type change.

Signed-off-by: Michael Ellerman <[EMAIL PROTECTED]>
---
 arch/powerpc/include/asm/mpic.h   |4 +-
 arch/powerpc/sysdev/mpic.h|2 -
 arch/powerpc/sysdev/mpic_msi.c|  123 +
 arch/powerpc/sysdev/mpic_pasemi_msi.c |   24 ---
 arch/powerpc/sysdev/mpic_u3msi.c  |   22 +++---
 5 files changed, 44 insertions(+), 131 deletions(-)

diff --git a/arch/powerpc/include/asm/mpic.h b/arch/powerpc/include/asm/mpic.h
index fe566a3..34d9ac4 100644
--- a/arch/powerpc/include/asm/mpic.h
+++ b/arch/powerpc/include/asm/mpic.h
@@ -5,6 +5,7 @@
 #include 
 #include 
 #include 
+#include 
 
 /*
  * Global registers
@@ -301,8 +302,7 @@ struct mpic
 #endif
 
 #ifdef CONFIG_PCI_MSI
-   spinlock_t  bitmap_lock;
-   unsigned long   *hwirq_bitmap;
+   struct msi_bitmap   msi_bitmap;
 #endif
 
 #ifdef CONFIG_MPIC_BROKEN_REGREAD
diff --git a/arch/powerpc/sysdev/mpic.h b/arch/powerpc/sysdev/mpic.h
index fbf8a26..6209c62 100644
--- a/arch/powerpc/sysdev/mpic.h
+++ b/arch/powerpc/sysdev/mpic.h
@@ -14,8 +14,6 @@
 #ifdef CONFIG_PCI_MSI
 extern void mpic_msi_reserve_hwirq(struct mpic *mpic, irq_hw_number_t hwirq);
 extern int mpic_msi_init_allocator(struct mpic *mpic);
-extern irq_hw_number_t mpic_msi_alloc_hwirqs(struct mpic *mpic, int num);
-extern void mpic_msi_free_hwirqs(struct mpic *mpic, int offset, int num);
 extern int mpic_u3msi_init(struct mpic *mpic);
 extern int mpic_pasemi_msi_init(struct mpic *mpic);
 #else
diff --git a/arch/powerpc/sysdev/mpic_msi.c b/arch/powerpc/sysdev/mpic_msi.c
index de3e5e8..1d44eee 100644
--- a/arch/powerpc/sysdev/mpic_msi.c
+++ b/arch/powerpc/sysdev/mpic_msi.c
@@ -15,59 +15,17 @@
 #include 
 #include 
 #include 
+#include 
 
 #include 
 
-static void __mpic_msi_reserve_hwirq(struct mpic *mpic, irq_hw_number_t hwirq)
-{
-   pr_debug("mpic: reserving hwirq 0x%lx\n", hwirq);
-   bitmap_allocate_region(mpic->hwirq_bitmap, hwirq, 0);
-}
-
 void mpic_msi_reserve_hwirq(struct mpic *mpic, irq_hw_number_t hwirq)
 {
-   unsigned long flags;
-
/* The mpic calls this even when there is no allocator setup */
-   if (!mpic->hwirq_bitmap)
+   if (!mpic->msi_bitmap.bitmap)
return;
 
-   spin_lock_irqsave(&mpic->bitmap_lock, flags);
-   __mpic_msi_reserve_hwirq(mpic, hwirq);
-   spin_unlock_irqrestore(&mpic->bitmap_lock, flags);
-}
-
-irq_hw_number_t mpic_msi_alloc_hwirqs(struct mpic *mpic, int num)
-{
-   unsigned long flags;
-   int offset, order = get_count_order(num);
-
-   spin_lock_irqsave(&mpic->bitmap_lock, flags);
-   /*
-* This is fast, but stricter than we need. We might want to add
-* a fallback routine which does a linear search with no alignment.
-*/
-   offset = bitmap_find_free_region(mpic->hwirq_bitmap, mpic->irq_count,
-order);
-   spin_unlock_irqrestore(&mpic->bitmap_lock, flags);
-
-   pr_debug("mpic: allocated 0x%x (2^%d) at offset 0x%x\n",
-num, order, offset);
-
-   return offset;
-}
-
-void mpic_msi_free_hwirqs(struct mpic *mpic, int offset, int num)
-{
-   unsigned long flags;
-   int order = get_count_order(num);
-
-   pr_debug("mpic: freeing 0x%x (2^%d) at offset 0x%x\n",
-num, order, offset);
-
-   spin_lock_irqsave(&mpic->bitmap_lock, flags);
-   bitmap_release_region(mpic->hwirq_bitmap, offset, order);
-   spin_unlock_irqrestore(&mpic->bitmap_lock, flags);
+   msi_bitmap_reserve_hwirq(&mpic->msi_bitmap, hwirq);
 }
 
 #ifdef CONFIG_MPIC_U3_HT_IRQS
@@ -83,13 +41,13 @@ static int mpic_msi_reserve_u3_hwirqs(struct mpic *mpic)
 
/* Reserve source numbers we know are reserved in the HW */
for (i = 0;   i < 8;   i++)
-   __mpic_msi_reserve_hwirq(mpic, i);
+   msi_bitmap_reserve_hwirq(&mpic->msi_bitmap, i);
 
for (i = 42;  i < 46;  i++)
-   __mpic_msi_reserve_hwirq(mpic, i);
+   msi_bitmap_reserve_hwirq(&mpic->msi_bitmap, i);
 
for (i = 100; i < 105; i++)
-   __mpic_msi_reserve_hwirq(mpic, i);
+   msi_bitmap_reserve_hwirq(&mpic->msi_bitmap, i);
 
np = NULL;
while ((np = of_find_all_nodes(np))) {
@@ -99,7 +57,7 @@ static int mpic_msi_reserve_u3_hwirqs(struct mpic *mpic)
while (of_irq_map_one(np, index++, &oirq) == 0) {
ops->xlate(mpic->irqhost, NULL, oirq.specifier,
oirq.size, &hwirq, &flags);
-   __mpic_msi_reserve_hwirq(mpic, hwirq);
+   msi_bitmap_reserve_hwirq(&mpic->msi_bitmap, hwirq);
   

[PATCH 4/4] powerpc: Convert the MPIC MSI code to use msi_bitmap

2008-07-15 Thread Michael Ellerman
This effects the U3 MSI code as well as the PASEMI MSI code. We keep
some of the MPIC routines as helpers, and also the U3 best-guess
reservation logic. The rest is replaced by the generic code.

And a few printk format changes due to hwirq type change.

Signed-off-by: Michael Ellerman <[EMAIL PROTECTED]>
---
 arch/powerpc/sysdev/mpic.h|2 -
 arch/powerpc/sysdev/mpic_msi.c|  123 +
 arch/powerpc/sysdev/mpic_pasemi_msi.c |   24 ---
 arch/powerpc/sysdev/mpic_u3msi.c  |   22 +++---
 include/asm-powerpc/mpic.h|4 +-
 5 files changed, 44 insertions(+), 131 deletions(-)

diff --git a/arch/powerpc/sysdev/mpic.h b/arch/powerpc/sysdev/mpic.h
index fbf8a26..6209c62 100644
--- a/arch/powerpc/sysdev/mpic.h
+++ b/arch/powerpc/sysdev/mpic.h
@@ -14,8 +14,6 @@
 #ifdef CONFIG_PCI_MSI
 extern void mpic_msi_reserve_hwirq(struct mpic *mpic, irq_hw_number_t hwirq);
 extern int mpic_msi_init_allocator(struct mpic *mpic);
-extern irq_hw_number_t mpic_msi_alloc_hwirqs(struct mpic *mpic, int num);
-extern void mpic_msi_free_hwirqs(struct mpic *mpic, int offset, int num);
 extern int mpic_u3msi_init(struct mpic *mpic);
 extern int mpic_pasemi_msi_init(struct mpic *mpic);
 #else
diff --git a/arch/powerpc/sysdev/mpic_msi.c b/arch/powerpc/sysdev/mpic_msi.c
index de3e5e8..1d44eee 100644
--- a/arch/powerpc/sysdev/mpic_msi.c
+++ b/arch/powerpc/sysdev/mpic_msi.c
@@ -15,59 +15,17 @@
 #include 
 #include 
 #include 
+#include 
 
 #include 
 
-static void __mpic_msi_reserve_hwirq(struct mpic *mpic, irq_hw_number_t hwirq)
-{
-   pr_debug("mpic: reserving hwirq 0x%lx\n", hwirq);
-   bitmap_allocate_region(mpic->hwirq_bitmap, hwirq, 0);
-}
-
 void mpic_msi_reserve_hwirq(struct mpic *mpic, irq_hw_number_t hwirq)
 {
-   unsigned long flags;
-
/* The mpic calls this even when there is no allocator setup */
-   if (!mpic->hwirq_bitmap)
+   if (!mpic->msi_bitmap.bitmap)
return;
 
-   spin_lock_irqsave(&mpic->bitmap_lock, flags);
-   __mpic_msi_reserve_hwirq(mpic, hwirq);
-   spin_unlock_irqrestore(&mpic->bitmap_lock, flags);
-}
-
-irq_hw_number_t mpic_msi_alloc_hwirqs(struct mpic *mpic, int num)
-{
-   unsigned long flags;
-   int offset, order = get_count_order(num);
-
-   spin_lock_irqsave(&mpic->bitmap_lock, flags);
-   /*
-* This is fast, but stricter than we need. We might want to add
-* a fallback routine which does a linear search with no alignment.
-*/
-   offset = bitmap_find_free_region(mpic->hwirq_bitmap, mpic->irq_count,
-order);
-   spin_unlock_irqrestore(&mpic->bitmap_lock, flags);
-
-   pr_debug("mpic: allocated 0x%x (2^%d) at offset 0x%x\n",
-num, order, offset);
-
-   return offset;
-}
-
-void mpic_msi_free_hwirqs(struct mpic *mpic, int offset, int num)
-{
-   unsigned long flags;
-   int order = get_count_order(num);
-
-   pr_debug("mpic: freeing 0x%x (2^%d) at offset 0x%x\n",
-num, order, offset);
-
-   spin_lock_irqsave(&mpic->bitmap_lock, flags);
-   bitmap_release_region(mpic->hwirq_bitmap, offset, order);
-   spin_unlock_irqrestore(&mpic->bitmap_lock, flags);
+   msi_bitmap_reserve_hwirq(&mpic->msi_bitmap, hwirq);
 }
 
 #ifdef CONFIG_MPIC_U3_HT_IRQS
@@ -83,13 +41,13 @@ static int mpic_msi_reserve_u3_hwirqs(struct mpic *mpic)
 
/* Reserve source numbers we know are reserved in the HW */
for (i = 0;   i < 8;   i++)
-   __mpic_msi_reserve_hwirq(mpic, i);
+   msi_bitmap_reserve_hwirq(&mpic->msi_bitmap, i);
 
for (i = 42;  i < 46;  i++)
-   __mpic_msi_reserve_hwirq(mpic, i);
+   msi_bitmap_reserve_hwirq(&mpic->msi_bitmap, i);
 
for (i = 100; i < 105; i++)
-   __mpic_msi_reserve_hwirq(mpic, i);
+   msi_bitmap_reserve_hwirq(&mpic->msi_bitmap, i);
 
np = NULL;
while ((np = of_find_all_nodes(np))) {
@@ -99,7 +57,7 @@ static int mpic_msi_reserve_u3_hwirqs(struct mpic *mpic)
while (of_irq_map_one(np, index++, &oirq) == 0) {
ops->xlate(mpic->irqhost, NULL, oirq.specifier,
oirq.size, &hwirq, &flags);
-   __mpic_msi_reserve_hwirq(mpic, hwirq);
+   msi_bitmap_reserve_hwirq(&mpic->msi_bitmap, hwirq);
}
}
 
@@ -112,70 +70,25 @@ static int mpic_msi_reserve_u3_hwirqs(struct mpic *mpic)
 }
 #endif
 
-static int mpic_msi_reserve_dt_hwirqs(struct mpic *mpic)
-{
-   int i, len;
-   const u32 *p;
-
-   p = of_get_property(mpic->irqhost->of_node,
-   "msi-available-ranges", &len);
-   if (!p) {
-   pr_debug("mpic: no msi-available-ranges property found on %s\n",
- mpic->irqhost->of_node->full_name);
-   return -ENO