[SPARC64]: Allocate ivector_table dynamically.
authorDavid S. Miller <davem@sunset.davemloft.net>
Sun, 14 Oct 2007 04:43:31 +0000 (21:43 -0700)
committerDavid S. Miller <davem@sunset.davemloft.net>
Sun, 14 Oct 2007 04:53:16 +0000 (21:53 -0700)
Shrinks kernel by 16K compared to before the IVEC physical
address changes.

Signed-off-by: David S. Miller <davem@davemloft.net>
arch/sparc64/kernel/irq.c

index 26cdf47981c374232caa1b6c56d28275c33d8751..5a92851296c03fd4ef0414e7c19462a2b60b9346 100644 (file)
@@ -64,7 +64,7 @@ struct ino_bucket {
 };
 
 #define NUM_IVECS      (IMAP_INR + 1)
-struct ino_bucket ivector_table[NUM_IVECS] __attribute__ ((aligned (SMP_CACHE_BYTES)));
+struct ino_bucket *ivector_table;
 unsigned long ivector_table_pa;
 
 #define __irq_ino(irq) \
@@ -928,22 +928,22 @@ static struct irqaction timer_irq_action = {
        .name = "timer",
 };
 
-/* XXX Belongs in a common location. XXX */
-static unsigned long kimage_addr_to_ra(void *p)
-{
-       unsigned long val = (unsigned long) p;
-
-       return kern_base + (val - KERNBASE);
-}
-
 /* Only invoked on boot processor. */
 void __init init_IRQ(void)
 {
+       unsigned long size;
+
        map_prom_timers();
        kill_prom_timer();
-       memset(&ivector_table[0], 0, sizeof(ivector_table));
 
-       ivector_table_pa = kimage_addr_to_ra(&ivector_table[0]);
+       size = sizeof(struct ino_bucket) * NUM_IVECS;
+       ivector_table = alloc_bootmem_low(size);
+       if (!ivector_table) {
+               prom_printf("Fatal error, cannot allocate ivector_table\n");
+               prom_halt();
+       }
+
+       ivector_table_pa = __pa(ivector_table);
 
        if (tlb_type == hypervisor)
                sun4v_init_mondo_queues();