diff -urN 2.3.30pre6/arch/alpha/kernel/irq.c a/arch/alpha/kernel/irq.c --- 2.3.30pre6/arch/alpha/kernel/irq.c Sat Dec 4 04:45:46 1999 +++ a/arch/alpha/kernel/irq.c Sun Dec 5 15:28:11 1999 @@ -22,15 +22,15 @@ #include #include #include +#include #include #include -#include #include #include +#include #include "proto.h" -#include "irq_impl.h" #define vulp volatile unsigned long * #define vuip volatile unsigned int * @@ -182,7 +182,8 @@ */ static struct irqaction timer_irq = { NULL, 0, 0, NULL, NULL, NULL}; -static struct irqaction *irq_action[NR_IRQS]; +spinlock_t irq_controller_lock = SPIN_LOCK_UNLOCKED; +irq_desc_t irq_desc[NR_IRQS] __cacheline_aligned = { [0 ... NR_IRQS-1] = {0,} }; static inline void @@ -230,12 +231,7 @@ int check_irq(unsigned int irq) { - struct irqaction **p; - - p = irq_action + irq; - if (*p == NULL) - return 0; - return -EBUSY; + return irq_desc[irq].action ? -EBUSY : 0; } int @@ -253,7 +249,7 @@ if (!handler) return -EINVAL; - p = irq_action + irq; + p = &irq_desc[irq].action; action = *p; if (action) { /* Can't share interrupts unless both agree to */ @@ -314,14 +310,14 @@ printk("Trying to free reserved IRQ %d\n", irq); return; } - for (p = irq + irq_action; (action = *p) != NULL; p = &action->next) { + for (p = &irq_desc[irq].action; (action = *p) != NULL; p = &action->next) { if (action->dev_id != dev_id) continue; /* Found it - now free it */ save_and_cli(flags); *p = action->next; - if (!irq[irq_action]) + if (!irq_desc[irq].action) mask_irq(irq); restore_flags(flags); kfree(action); @@ -344,7 +340,7 @@ #endif for (i = 0; i < NR_IRQS; i++) { - action = irq_action[i]; + action = irq_desc[i].action; if (!action) continue; p += sprintf(p, "%3d: ",i); @@ -541,63 +537,6 @@ } } -#undef INIT_STUCK -#define INIT_STUCK (1<<26) - -#undef STUCK -#define STUCK \ - if (!--stuck) { \ - printk("irq_enter stuck (irq=%d, cpu=%d, global=%d)\n", \ - irq, cpu, global_irq_holder); \ - stuck = INIT_STUCK; \ - } - -#undef VERBOSE_IRQLOCK_DEBUGGING - -void -irq_enter(int cpu, int irq) -{ -#ifdef VERBOSE_IRQLOCK_DEBUGGING - extern void smp_show_backtrace_all_cpus(void); -#endif - int stuck = INIT_STUCK; - - hardirq_enter(cpu, irq); - barrier(); - while (spin_is_locked(&global_irq_lock)) { - if (cpu == global_irq_holder) { - int globl_locked = spin_is_locked(&global_irq_lock); - int globl_icount = atomic_read(&global_irq_count); - int local_count = local_irq_count(cpu); - - /* It is very important that we load the state - variables before we do the first call to - printk() as printk() could end up changing - them... */ - - printk("CPU[%d]: where [%p] glocked[%d] gicnt[%d]" - " licnt[%d]\n", - cpu, previous_irqholder, globl_locked, - globl_icount, local_count); -#ifdef VERBOSE_IRQLOCK_DEBUGGING - printk("Performing backtrace on all CPUs," - " write this down!\n"); - smp_show_backtrace_all_cpus(); -#endif - break; - } - STUCK; - barrier(); - } -} - -void -irq_exit(int cpu, int irq) -{ - hardirq_exit(cpu, irq); - release_irqlock(cpu); -} - static void show(char * str, void *where) { @@ -698,12 +637,6 @@ } #endif } - -#else /* !__SMP__ */ - -#define irq_enter(cpu, irq) (++local_irq_count(cpu)) -#define irq_exit(cpu, irq) (--local_irq_count(cpu)) - #endif /* __SMP__ */ static void @@ -720,7 +653,7 @@ printk("PC = %016lx PS=%04lx\n", regs->pc, regs->ps); printk("Expecting: "); for (i = 0; i < ACTUAL_NR_IRQS; i++) - if ((action = irq_action[i])) + if ((action = irq_desc[i].action)) while (action->handler) { printk("[%s:%d] ", action->name, i); action = action->next; @@ -774,7 +707,7 @@ irq_enter(cpu, irq); kstat.irqs[cpu][irq] += 1; - action = irq_action[irq]; + action = irq_desc[irq].action; /* * For normal interrupts, we mask it out, and then ACK it. @@ -823,7 +756,7 @@ if (!(PROBE_MASK & (1UL << i))) { continue; } - action = irq_action[i]; + action = irq_desc[i].action; if (!action) { enable_irq(i); irqs |= (1UL << i); diff -urN 2.3.30pre6/arch/alpha/kernel/irq_impl.h a/arch/alpha/kernel/irq_impl.h --- 2.3.30pre6/arch/alpha/kernel/irq_impl.h Sat Dec 4 04:45:46 1999 +++ a/arch/alpha/kernel/irq_impl.h Thu Jan 1 01:00:00 1970 @@ -1,87 +0,0 @@ -/* - * linux/arch/alpha/kernel/irq.h - * - * Copyright (C) 1995 Linus Torvalds - * Copyright (C) 1998 Richard Henderson - * - * This file contains declarations and inline functions for interfacing - * with the IRQ handling routines in irq.c. - */ - -#include - -#define STANDARD_INIT_IRQ_PROLOG \ - outb(0, DMA1_RESET_REG); \ - outb(0, DMA2_RESET_REG); \ - outb(0, DMA1_CLR_MASK_REG); \ - outb(0, DMA2_CLR_MASK_REG) - -extern unsigned long _alpha_irq_masks[2]; -#define alpha_irq_mask _alpha_irq_masks[0] - -extern void common_ack_irq(unsigned long irq); -extern void isa_device_interrupt(unsigned long vector, struct pt_regs * regs); -extern void srm_device_interrupt(unsigned long vector, struct pt_regs * regs); - -extern void handle_irq(int irq, int ack, struct pt_regs * regs); - -#define RTC_IRQ 8 -#ifdef CONFIG_RTC -#define TIMER_IRQ 0 /* timer is the pit */ -#else -#define TIMER_IRQ RTC_IRQ /* timer is the rtc */ -#endif - -/* - * PROBE_MASK is the bitset of irqs that we consider for autoprobing. - */ - -/* NOTE: we only handle the first 64 IRQs in this code. */ - -/* The normal mask includes all the IRQs except timer IRQ 0. */ -#define _PROBE_MASK(nr_irqs) \ - (((nr_irqs > 63) ? ~0UL : ((1UL << (nr_irqs & 63)) - 1)) & ~1UL) - -/* Mask out unused timer irq 0 and RTC irq 8. */ -#define P2K_PROBE_MASK (_PROBE_MASK(16) & ~0x101UL) - -/* Mask out unused timer irq 0, "irqs" 20-30, and the EISA cascade. */ -#define ALCOR_PROBE_MASK (_PROBE_MASK(48) & ~0xfff000000001UL) - -/* Leave timer IRQ 0 in the mask. */ -#define RUFFIAN_PROBE_MASK (_PROBE_MASK(48) | 1UL) - -/* Do not probe/enable beyond the PCI devices. */ -#define TSUNAMI_PROBE_MASK _PROBE_MASK(48) - -#if defined(CONFIG_ALPHA_GENERIC) -# define PROBE_MASK alpha_mv.irq_probe_mask -#elif defined(CONFIG_ALPHA_P2K) -# define PROBE_MASK P2K_PROBE_MASK -#elif defined(CONFIG_ALPHA_ALCOR) || defined(CONFIG_ALPHA_XLT) -# define PROBE_MASK ALCOR_PROBE_MASK -#elif defined(CONFIG_ALPHA_RUFFIAN) -# define PROBE_MASK RUFFIAN_PROBE_MASK -#elif defined(CONFIG_ALPHA_DP264) -# define PROBE_MASK TSUNAMI_PROBE_MASK -#else -# define PROBE_MASK _PROBE_MASK(NR_IRQS) -#endif - - -extern char _stext; -static inline void alpha_do_profile (unsigned long pc) -{ - if (prof_buffer && current->pid) { - pc -= (unsigned long) &_stext; - pc >>= prof_shift; - /* - * Don't ignore out-of-bounds PC values silently, - * put them into the last histogram slot, so if - * present, they will show up as a sharp peak. - */ - if (pc > prof_len - 1) - pc = prof_len - 1; - atomic_inc((atomic_t *)&prof_buffer[pc]); - } -} diff -urN 2.3.30pre6/arch/alpha/kernel/pci.c a/arch/alpha/kernel/pci.c --- 2.3.30pre6/arch/alpha/kernel/pci.c Sat Dec 4 04:45:46 1999 +++ a/arch/alpha/kernel/pci.c Sun Dec 5 15:23:32 1999 @@ -57,11 +57,32 @@ dev->class = PCI_CLASS_BRIDGE_ISA; } +static void __init +quirk_vga_enable_rom(struct pci_dev *dev) +{ + /* If it's a VGA, enable its BIOS ROM at C0000. + But if its a Cirrus 543x/544x DISABLE it, since + enabling ROM disables the memory... */ + if ((dev->class >> 8) == PCI_CLASS_DISPLAY_VGA && + /* But if its a Cirrus 543x/544x DISABLE it */ + (dev->vendor != PCI_VENDOR_ID_CIRRUS || + (dev->device < 0x00a0) || (dev->device > 0x00ac))) + { + u32 reg; + + pci_read_config_dword(dev, dev->rom_base_reg, ®); + reg |= PCI_ROM_ADDRESS_ENABLE; + pci_write_config_dword(dev, dev->rom_base_reg, reg); + dev->resource[PCI_ROM_RESOURCE].flags |= PCI_ROM_ADDRESS_ENABLE; + } +} + struct pci_fixup pcibios_fixups[] __initdata = { { PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82375, quirk_eisa_bridge }, { PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82378, quirk_isa_bridge }, + { PCI_FIXUP_FINAL, PCI_ANY_ID, PCI_ANY_ID, quirk_vga_enable_rom }, { 0 } }; @@ -71,7 +92,7 @@ #define MB (1024*KB) #define GB (1024*MB) -void __init +void pcibios_align_resource(void *data, struct resource *res, unsigned long size) { struct pci_dev * dev = data; @@ -145,13 +166,13 @@ static void __init pcibios_assign_special(struct pci_dev * dev) { + int i; + /* The first three resources of an IDE controler are often magic, so leave them unchanged. This is true, for instance, of the Contaq 82C693 as seen on SX164 and DP264. */ if (dev->class >> 8 == PCI_CLASS_STORAGE_IDE) { - int i; - /* Resource 1 of IDE controller is the address of HD_CMD register which actually occupies a single byte (0x3f6 for ide0) in reported 0x3f4-3f7 range. We have to fix @@ -163,6 +184,16 @@ if (dev->resource[i].flags && dev->resource[i].start) pci_claim_resource(dev, i); } + /* + * We don't have code that will init the CYPRESS bridge correctly + * so we do the next best thing, and depend on the previous + * console code to do the right thing, and ignore it here... :-\ + */ + else if (dev->vendor == PCI_VENDOR_ID_CONTAQ && + dev->device == PCI_DEVICE_ID_CONTAQ_82C693) + for (i = 0; i < PCI_NUM_RESOURCES; i++) + if (dev->resource[i].flags && dev->resource[i].start) + pci_claim_resource(dev, i); } @@ -285,6 +316,31 @@ } void __init +pcibios_fixup_irqs(void) +{ + struct pci_dev *dev; + for (dev = pci_devices; dev; dev = dev->next) + { + if ((dev->class >> 16 == PCI_BASE_CLASS_BRIDGE) && + (dev->class >> 8 != PCI_CLASS_BRIDGE_PCMCIA)) + continue; + + /* + * We don't have code that will init the CYPRESS bridge + * correctly so we do the next best thing, and depend on + * the previous console code to do the right thing, and + * ignore it here... :-\ + */ + if (dev->vendor == PCI_VENDOR_ID_CONTAQ && + dev->device == PCI_DEVICE_ID_CONTAQ_82C693) + continue; + + pdev_fixup_irq(dev, + alpha_mv.pci_swizzle, alpha_mv.pci_map_irq); + } +} + +void __init common_init_pci(void) { struct pci_controler *hose; @@ -303,7 +359,7 @@ pci_assign_unassigned_resources(alpha_mv.min_io_address, alpha_mv.min_mem_address); - pci_fixup_irqs(alpha_mv.pci_swizzle, alpha_mv.pci_map_irq); + pcibios_fixup_irqs(); pci_set_bus_ranges(); } diff -urN 2.3.30pre6/arch/alpha/kernel/smp.c a/arch/alpha/kernel/smp.c --- 2.3.30pre6/arch/alpha/kernel/smp.c Sat Dec 4 04:45:46 1999 +++ a/arch/alpha/kernel/smp.c Sun Dec 5 15:31:24 1999 @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -32,7 +33,6 @@ #include #include "proto.h" -#include "irq_impl.h" #define DEBUG_SMP 0 @@ -47,8 +47,8 @@ /* A collection of single bit ipi messages. */ static struct { - unsigned long bits __cacheline_aligned; -} ipi_data[NR_CPUS]; + unsigned long bits ____cacheline_aligned; +} ipi_data[NR_CPUS] __cacheline_aligned; enum ipi_message_type { IPI_RESCHEDULE, @@ -56,7 +56,7 @@ IPI_CPU_STOP, }; -spinlock_t kernel_flag __cacheline_aligned = SPIN_LOCK_UNLOCKED; +spinlock_t kernel_flag = SPIN_LOCK_UNLOCKED; /* Set to a secondary's cpuid when it comes online. */ static unsigned long smp_secondary_alive; diff -urN 2.3.30pre6/arch/alpha/kernel/sys_alcor.c a/arch/alpha/kernel/sys_alcor.c --- 2.3.30pre6/arch/alpha/kernel/sys_alcor.c Sat Dec 4 04:45:46 1999 +++ a/arch/alpha/kernel/sys_alcor.c Sun Dec 5 15:20:06 1999 @@ -27,7 +27,7 @@ #include #include "proto.h" -#include "irq_impl.h" +#include #include "pci_impl.h" #include "machvec_impl.h" diff -urN 2.3.30pre6/arch/alpha/kernel/sys_cabriolet.c a/arch/alpha/kernel/sys_cabriolet.c --- 2.3.30pre6/arch/alpha/kernel/sys_cabriolet.c Sat Dec 4 04:45:46 1999 +++ a/arch/alpha/kernel/sys_cabriolet.c Sun Dec 5 15:44:02 1999 @@ -31,7 +31,7 @@ #include #include "proto.h" -#include "irq_impl.h" +#include #include "pci_impl.h" #include "machvec_impl.h" @@ -298,7 +298,6 @@ init_irq: cabriolet_init_irq, init_pit: common_init_pit, init_pci: cabriolet_init_pci, - kill_arch: common_kill_arch, pci_map_irq: cabriolet_map_irq, pci_swizzle: common_swizzle, }; @@ -327,7 +326,6 @@ init_irq: cabriolet_init_irq, init_pit: common_init_pit, init_pci: cabriolet_init_pci, - kill_arch: common_kill_arch, pci_map_irq: eb66p_map_irq, pci_swizzle: common_swizzle, }; @@ -356,7 +354,6 @@ init_irq: cabriolet_init_irq, init_pit: common_init_pit, init_pci: alphapc164_init_pci, - kill_arch: common_kill_arch, pci_map_irq: alphapc164_map_irq, pci_swizzle: common_swizzle, }; @@ -385,7 +382,6 @@ init_irq: cabriolet_init_irq, init_pit: common_init_pit, init_pci: alphapc164_init_pci, - kill_arch: common_kill_arch, pci_map_irq: alphapc164_map_irq, pci_swizzle: common_swizzle, }; diff -urN 2.3.30pre6/arch/alpha/kernel/sys_dp264.c a/arch/alpha/kernel/sys_dp264.c --- 2.3.30pre6/arch/alpha/kernel/sys_dp264.c Sat Dec 4 04:45:46 1999 +++ a/arch/alpha/kernel/sys_dp264.c Sun Dec 5 15:32:25 1999 @@ -27,7 +27,7 @@ #include #include "proto.h" -#include "irq_impl.h" +#include #include "pci_impl.h" #include "machvec_impl.h" @@ -39,28 +39,30 @@ static void dp264_update_irq_hw(unsigned long irq, unsigned long mask, int unmask_p) { - if (irq >= 16) { - volatile unsigned long *csr; + volatile unsigned long *csr; - if (TSUNAMI_bootcpu < 2) - if (!TSUNAMI_bootcpu) - csr = &TSUNAMI_cchip->dim0.csr; - else - csr = &TSUNAMI_cchip->dim1.csr; + if (TSUNAMI_bootcpu < 2) { + if (!TSUNAMI_bootcpu) + csr = &TSUNAMI_cchip->dim0.csr; else - if (TSUNAMI_bootcpu == 2) - csr = &TSUNAMI_cchip->dim2.csr; - else - csr = &TSUNAMI_cchip->dim3.csr; - - *csr = ~mask; - mb(); - *csr; + csr = &TSUNAMI_cchip->dim1.csr; + } else { + if (TSUNAMI_bootcpu == 2) + csr = &TSUNAMI_cchip->dim2.csr; + else + csr = &TSUNAMI_cchip->dim3.csr; + } + + *csr = ~mask; + mb(); + *csr; + + if (irq < 16) { + if (irq >= 8) + outb(mask >> 8, 0xA1); /* ISA PIC2 */ + else + outb(mask, 0x21); /* ISA PIC1 */ } - else if (irq >= 8) - outb(mask >> 8, 0xA1); /* ISA PIC2 */ - else - outb(mask, 0x21); /* ISA PIC1 */ } static void diff -urN 2.3.30pre6/arch/alpha/kernel/sys_eb64p.c a/arch/alpha/kernel/sys_eb64p.c --- 2.3.30pre6/arch/alpha/kernel/sys_eb64p.c Sat Dec 4 04:45:46 1999 +++ a/arch/alpha/kernel/sys_eb64p.c Sun Dec 5 15:43:49 1999 @@ -28,7 +28,7 @@ #include #include "proto.h" -#include "irq_impl.h" +#include #include "pci_impl.h" #include "machvec_impl.h" @@ -212,7 +212,6 @@ init_irq: eb64p_init_irq, init_pit: common_init_pit, init_pci: common_init_pci, - kill_arch: common_kill_arch, pci_map_irq: eb64p_map_irq, pci_swizzle: common_swizzle, }; diff -urN 2.3.30pre6/arch/alpha/kernel/sys_eiger.c a/arch/alpha/kernel/sys_eiger.c --- 2.3.30pre6/arch/alpha/kernel/sys_eiger.c Sat Dec 4 04:45:46 1999 +++ a/arch/alpha/kernel/sys_eiger.c Sun Dec 5 15:20:06 1999 @@ -29,7 +29,7 @@ #include #include "proto.h" -#include "irq_impl.h" +#include #include "pci_impl.h" #include "machvec_impl.h" diff -urN 2.3.30pre6/arch/alpha/kernel/sys_jensen.c a/arch/alpha/kernel/sys_jensen.c --- 2.3.30pre6/arch/alpha/kernel/sys_jensen.c Sat Dec 4 04:45:46 1999 +++ a/arch/alpha/kernel/sys_jensen.c Sun Dec 5 15:20:06 1999 @@ -28,7 +28,7 @@ #include #include "proto.h" -#include "irq_impl.h" +#include #include "machvec_impl.h" diff -urN 2.3.30pre6/arch/alpha/kernel/sys_miata.c a/arch/alpha/kernel/sys_miata.c --- 2.3.30pre6/arch/alpha/kernel/sys_miata.c Sat Dec 4 04:45:46 1999 +++ a/arch/alpha/kernel/sys_miata.c Sun Dec 5 15:20:06 1999 @@ -25,7 +25,7 @@ #include #include "proto.h" -#include "irq_impl.h" +#include #include "pci_impl.h" #include "machvec_impl.h" diff -urN 2.3.30pre6/arch/alpha/kernel/sys_mikasa.c a/arch/alpha/kernel/sys_mikasa.c --- 2.3.30pre6/arch/alpha/kernel/sys_mikasa.c Sat Dec 4 04:45:46 1999 +++ a/arch/alpha/kernel/sys_mikasa.c Sun Dec 5 15:44:15 1999 @@ -28,7 +28,7 @@ #include #include "proto.h" -#include "irq_impl.h" +#include #include "pci_impl.h" #include "machvec_impl.h" @@ -223,7 +223,6 @@ init_irq: mikasa_init_irq, init_pit: common_init_pit, init_pci: common_init_pci, - kill_arch: common_kill_arch, pci_map_irq: mikasa_map_irq, pci_swizzle: common_swizzle, }; diff -urN 2.3.30pre6/arch/alpha/kernel/sys_nautilus.c a/arch/alpha/kernel/sys_nautilus.c --- 2.3.30pre6/arch/alpha/kernel/sys_nautilus.c Sat Dec 4 04:45:46 1999 +++ a/arch/alpha/kernel/sys_nautilus.c Sun Dec 5 15:20:06 1999 @@ -45,7 +45,7 @@ #include #include "proto.h" -#include "irq_impl.h" +#include #include "pci_impl.h" #include "machvec_impl.h" diff -urN 2.3.30pre6/arch/alpha/kernel/sys_noritake.c a/arch/alpha/kernel/sys_noritake.c --- 2.3.30pre6/arch/alpha/kernel/sys_noritake.c Sat Dec 4 04:45:46 1999 +++ a/arch/alpha/kernel/sys_noritake.c Sun Dec 5 15:44:28 1999 @@ -29,7 +29,7 @@ #include #include "proto.h" -#include "irq_impl.h" +#include #include "pci_impl.h" #include "machvec_impl.h" @@ -283,7 +283,6 @@ init_irq: noritake_init_irq, init_pit: common_init_pit, init_pci: common_init_pci, - kill_arch: common_kill_arch, pci_map_irq: noritake_map_irq, pci_swizzle: noritake_swizzle, }; diff -urN 2.3.30pre6/arch/alpha/kernel/sys_rawhide.c a/arch/alpha/kernel/sys_rawhide.c --- 2.3.30pre6/arch/alpha/kernel/sys_rawhide.c Sat Dec 4 04:45:46 1999 +++ a/arch/alpha/kernel/sys_rawhide.c Sun Dec 5 15:20:06 1999 @@ -25,7 +25,7 @@ #include #include "proto.h" -#include "irq_impl.h" +#include #include "pci_impl.h" #include "machvec_impl.h" diff -urN 2.3.30pre6/arch/alpha/kernel/sys_ruffian.c a/arch/alpha/kernel/sys_ruffian.c --- 2.3.30pre6/arch/alpha/kernel/sys_ruffian.c Sat Dec 4 04:45:46 1999 +++ a/arch/alpha/kernel/sys_ruffian.c Sun Dec 5 15:20:06 1999 @@ -26,7 +26,7 @@ #include #include "proto.h" -#include "irq_impl.h" +#include #include "pci_impl.h" #include "machvec_impl.h" diff -urN 2.3.30pre6/arch/alpha/kernel/sys_rx164.c a/arch/alpha/kernel/sys_rx164.c --- 2.3.30pre6/arch/alpha/kernel/sys_rx164.c Sat Dec 4 04:45:46 1999 +++ a/arch/alpha/kernel/sys_rx164.c Sun Dec 5 15:20:06 1999 @@ -26,7 +26,7 @@ #include #include "proto.h" -#include "irq_impl.h" +#include #include "pci_impl.h" #include "machvec_impl.h" diff -urN 2.3.30pre6/arch/alpha/kernel/sys_sable.c a/arch/alpha/kernel/sys_sable.c --- 2.3.30pre6/arch/alpha/kernel/sys_sable.c Sat Dec 4 04:45:46 1999 +++ a/arch/alpha/kernel/sys_sable.c Sun Dec 5 15:44:40 1999 @@ -26,7 +26,7 @@ #include #include "proto.h" -#include "irq_impl.h" +#include #include "pci_impl.h" #include "machvec_impl.h" @@ -283,7 +283,6 @@ init_irq: sable_init_irq, init_pit: common_init_pit, init_pci: common_init_pci, - kill_arch: common_kill_arch, pci_map_irq: sable_map_irq, pci_swizzle: common_swizzle, diff -urN 2.3.30pre6/arch/alpha/kernel/sys_sio.c a/arch/alpha/kernel/sys_sio.c --- 2.3.30pre6/arch/alpha/kernel/sys_sio.c Sat Dec 4 04:45:46 1999 +++ a/arch/alpha/kernel/sys_sio.c Sun Dec 5 15:44:54 1999 @@ -30,7 +30,7 @@ #include #include "proto.h" -#include "irq_impl.h" +#include #include "pci_impl.h" #include "machvec_impl.h" @@ -359,7 +359,6 @@ init_irq: sio_init_irq, init_pit: common_init_pit, init_pci: noname_init_pci, - kill_arch: common_kill_arch, pci_map_irq: noname_map_irq, pci_swizzle: common_swizzle, @@ -392,7 +391,6 @@ init_irq: sio_init_irq, init_pit: common_init_pit, init_pci: noname_init_pci, - kill_arch: common_kill_arch, pci_map_irq: noname_map_irq, pci_swizzle: common_swizzle, @@ -434,7 +432,6 @@ init_irq: sio_init_irq, init_pit: common_init_pit, init_pci: noname_init_pci, - kill_arch: common_kill_arch, pci_map_irq: p2k_map_irq, pci_swizzle: common_swizzle, @@ -467,7 +464,6 @@ init_irq: sio_init_irq, init_pit: common_init_pit, init_pci: noname_init_pci, - kill_arch: common_kill_arch, pci_map_irq: noname_map_irq, pci_swizzle: common_swizzle, diff -urN 2.3.30pre6/arch/alpha/kernel/sys_sx164.c a/arch/alpha/kernel/sys_sx164.c --- 2.3.30pre6/arch/alpha/kernel/sys_sx164.c Sat Dec 4 04:45:46 1999 +++ a/arch/alpha/kernel/sys_sx164.c Sun Dec 5 15:20:06 1999 @@ -26,7 +26,7 @@ #include #include "proto.h" -#include "irq_impl.h" +#include #include "pci_impl.h" #include "machvec_impl.h" diff -urN 2.3.30pre6/arch/alpha/kernel/sys_takara.c a/arch/alpha/kernel/sys_takara.c --- 2.3.30pre6/arch/alpha/kernel/sys_takara.c Sat Dec 4 04:45:46 1999 +++ a/arch/alpha/kernel/sys_takara.c Sun Dec 5 15:20:06 1999 @@ -25,7 +25,7 @@ #include #include "proto.h" -#include "irq_impl.h" +#include #include "pci_impl.h" #include "machvec_impl.h" diff -urN 2.3.30pre6/arch/alpha/kernel/time.c a/arch/alpha/kernel/time.c --- 2.3.30pre6/arch/alpha/kernel/time.c Sat Dec 4 04:45:46 1999 +++ a/arch/alpha/kernel/time.c Sun Dec 5 15:20:06 1999 @@ -40,7 +40,7 @@ #include #include "proto.h" -#include "irq_impl.h" +#include extern rwlock_t xtime_lock; extern volatile unsigned long lost_ticks; /* kernel/sched.c */ diff -urN 2.3.30pre6/drivers/net/rrunner.c a/drivers/net/rrunner.c --- 2.3.30pre6/drivers/net/rrunner.c Sun Nov 21 03:20:18 1999 +++ a/drivers/net/rrunner.c Sun Dec 5 15:20:07 1999 @@ -32,10 +32,10 @@ #include #include #include +#include #include #include -#include #include #include #include diff -urN 2.3.30pre6/drivers/pci/setup.c a/drivers/pci/setup.c --- 2.3.30pre6/drivers/pci/setup.c Sat Dec 4 04:45:47 1999 +++ a/drivers/pci/setup.c Sun Dec 5 15:20:08 1999 @@ -16,8 +16,7 @@ #include #include #include - -#include +#include #define DEBUG_CONFIG 0 @@ -271,7 +270,7 @@ pbus_set_ranges(bus, NULL); } -static void +void __init pdev_fixup_irq(struct pci_dev *dev, u8 (*swizzle)(struct pci_dev *, u8 *), int (*map_irq)(struct pci_dev *, u8, u8)) diff -urN 2.3.30pre6/include/asm-alpha/cache.h a/include/asm-alpha/cache.h --- 2.3.30pre6/include/asm-alpha/cache.h Tue Sep 14 14:33:21 1999 +++ a/include/asm-alpha/cache.h Sun Dec 5 15:20:08 1999 @@ -10,6 +10,4 @@ #define L1_CACHE_ALIGN(x) (((x)+(L1_CACHE_BYTES-1))&~(L1_CACHE_BYTES-1)) #define SMP_CACHE_BYTES L1_CACHE_BYTES -#define __cacheline_aligned __attribute__((__aligned__(L1_CACHE_BYTES))) - #endif diff -urN 2.3.30pre6/include/asm-alpha/hardirq.h a/include/asm-alpha/hardirq.h --- 2.3.30pre6/include/asm-alpha/hardirq.h Thu Dec 2 03:08:05 1999 +++ a/include/asm-alpha/hardirq.h Sun Dec 5 15:36:33 1999 @@ -28,8 +28,8 @@ #define hardirq_trylock(cpu) (local_irq_count(cpu) == 0) #define hardirq_endlock(cpu) ((void) 0) -#define hardirq_enter(cpu, irq) (local_irq_count(cpu)++) -#define hardirq_exit(cpu, irq) (local_irq_count(cpu)--) +#define irq_enter(cpu, irq) (local_irq_count(cpu)++) +#define irq_exit(cpu, irq) (local_irq_count(cpu)--) #define synchronize_irq() barrier() @@ -52,13 +52,16 @@ } } -static inline void hardirq_enter(int cpu, int irq) +static inline void irq_enter(int cpu, int irq) { ++local_irq_count(cpu); atomic_inc(&global_irq_count); + + while (spin_is_locked(&global_irq_lock)) + barrier(); } -static inline void hardirq_exit(int cpu, int irq) +static inline void irq_exit(int cpu, int irq) { atomic_dec(&global_irq_count); --local_irq_count(cpu); @@ -66,11 +69,10 @@ static inline int hardirq_trylock(int cpu) { - return (!atomic_read(&global_irq_count) - && !spin_is_locked(&global_irq_lock)); + return !local_irq_count(cpu) && !spin_is_locked(&global_irq_lock); } -#define hardirq_endlock(cpu) ((void)0) +#define hardirq_endlock(cpu) do { } while (0) extern void synchronize_irq(void); diff -urN 2.3.30pre6/include/asm-alpha/hw_irq.h a/include/asm-alpha/hw_irq.h --- 2.3.30pre6/include/asm-alpha/hw_irq.h Thu Jan 1 01:00:00 1970 +++ a/include/asm-alpha/hw_irq.h Sun Dec 5 15:38:27 1999 @@ -0,0 +1,91 @@ +#ifndef _ALPHA_HW_IRQ_H +#define _ALPHA_HW_IRQ_H +/* + * linux/arch/alpha/kernel/irq.h + * + * Copyright (C) 1995 Linus Torvalds + * Copyright (C) 1998 Richard Henderson + * + * This file contains declarations and inline functions for interfacing + * with the IRQ handling routines in irq.c. + */ + +#include + +#define STANDARD_INIT_IRQ_PROLOG \ + outb(0, DMA1_RESET_REG); \ + outb(0, DMA2_RESET_REG); \ + outb(0, DMA1_CLR_MASK_REG); \ + outb(0, DMA2_CLR_MASK_REG) + +extern unsigned long _alpha_irq_masks[2]; +#define alpha_irq_mask _alpha_irq_masks[0] + +extern void common_ack_irq(unsigned long irq); +extern void isa_device_interrupt(unsigned long vector, struct pt_regs * regs); +extern void srm_device_interrupt(unsigned long vector, struct pt_regs * regs); + +extern void handle_irq(int irq, int ack, struct pt_regs * regs); + +#define RTC_IRQ 8 +#ifdef CONFIG_RTC +#define TIMER_IRQ 0 /* timer is the pit */ +#else +#define TIMER_IRQ RTC_IRQ /* timer is the rtc */ +#endif + +/* + * PROBE_MASK is the bitset of irqs that we consider for autoprobing. + */ + +/* NOTE: we only handle the first 64 IRQs in this code. */ + +/* The normal mask includes all the IRQs except timer IRQ 0. */ +#define _PROBE_MASK(nr_irqs) \ + (((nr_irqs > 63) ? ~0UL : ((1UL << (nr_irqs & 63)) - 1)) & ~1UL) + +/* Mask out unused timer irq 0 and RTC irq 8. */ +#define P2K_PROBE_MASK (_PROBE_MASK(16) & ~0x101UL) + +/* Mask out unused timer irq 0, "irqs" 20-30, and the EISA cascade. */ +#define ALCOR_PROBE_MASK (_PROBE_MASK(48) & ~0xfff000000001UL) + +/* Leave timer IRQ 0 in the mask. */ +#define RUFFIAN_PROBE_MASK (_PROBE_MASK(48) | 1UL) + +/* Do not probe/enable beyond the PCI devices. */ +#define TSUNAMI_PROBE_MASK _PROBE_MASK(48) + +#if defined(CONFIG_ALPHA_GENERIC) +# define PROBE_MASK alpha_mv.irq_probe_mask +#elif defined(CONFIG_ALPHA_P2K) +# define PROBE_MASK P2K_PROBE_MASK +#elif defined(CONFIG_ALPHA_ALCOR) || defined(CONFIG_ALPHA_XLT) +# define PROBE_MASK ALCOR_PROBE_MASK +#elif defined(CONFIG_ALPHA_RUFFIAN) +# define PROBE_MASK RUFFIAN_PROBE_MASK +#elif defined(CONFIG_ALPHA_DP264) +# define PROBE_MASK TSUNAMI_PROBE_MASK +#else +# define PROBE_MASK _PROBE_MASK(NR_IRQS) +#endif + + +extern char _stext; +static inline void alpha_do_profile (unsigned long pc) +{ + if (prof_buffer && current->pid) { + pc -= (unsigned long) &_stext; + pc >>= prof_shift; + /* + * Don't ignore out-of-bounds PC values silently, + * put them into the last histogram slot, so if + * present, they will show up as a sharp peak. + */ + if (pc > prof_len - 1) + pc = prof_len - 1; + atomic_inc((atomic_t *)&prof_buffer[pc]); + } +} + +#endif diff -urN 2.3.30pre6/include/asm-alpha/irq.h a/include/asm-alpha/irq.h --- 2.3.30pre6/include/asm-alpha/irq.h Sat Dec 4 04:45:47 1999 +++ a/include/asm-alpha/irq.h Sun Dec 5 15:36:33 1999 @@ -67,9 +67,6 @@ extern void disable_irq_nosync(unsigned int); extern void enable_irq(unsigned int); -extern void irq_enter(int cpu, int irq); -extern void irq_exit(int cpu, int irq); - struct pt_regs; extern void (*perf_irq)(unsigned long, struct pt_regs *); diff -urN 2.3.30pre6/include/asm-i386/cache.h a/include/asm-i386/cache.h --- 2.3.30pre6/include/asm-i386/cache.h Tue Sep 14 14:33:21 1999 +++ a/include/asm-i386/cache.h Sun Dec 5 15:20:10 1999 @@ -11,16 +11,4 @@ #define L1_CACHE_BYTES 16 #endif -#define L1_CACHE_ALIGN(x) (((x)+(L1_CACHE_BYTES-1))&~(L1_CACHE_BYTES-1)) - -#define SMP_CACHE_BYTES L1_CACHE_BYTES - -#ifdef MODULE -#define __cacheline_aligned __attribute__((__aligned__(L1_CACHE_BYTES))) -#else -#define __cacheline_aligned \ - __attribute__((__aligned__(L1_CACHE_BYTES), \ - __section__(".data.cacheline_aligned"))) -#endif - #endif diff -urN 2.3.30pre6/include/asm-i386/hardirq.h a/include/asm-i386/hardirq.h --- 2.3.30pre6/include/asm-i386/hardirq.h Sat Dec 4 18:18:08 1999 +++ a/include/asm-i386/hardirq.h Sun Dec 5 15:20:10 1999 @@ -17,8 +17,8 @@ #define hardirq_trylock(cpu) (local_irq_count[cpu] == 0) #define hardirq_endlock(cpu) do { } while (0) -#define hardirq_enter(cpu) (local_irq_count[cpu]++) -#define hardirq_exit(cpu) (local_irq_count[cpu]--) +#define irq_enter(cpu, irq) (local_irq_count[cpu]++) +#define irq_exit(cpu, irq) (local_irq_count[cpu]--) #define synchronize_irq() barrier() @@ -39,13 +39,17 @@ } } -static inline void hardirq_enter(int cpu) +static inline void irq_enter(int cpu, int irq) { ++local_irq_count[cpu]; atomic_inc(&global_irq_count); + + while (test_bit(0,&global_irq_lock)) { + /* nothing */; + } } -static inline void hardirq_exit(int cpu) +static inline void irq_exit(int cpu, int irq) { atomic_dec(&global_irq_count); --local_irq_count[cpu]; diff -urN 2.3.30pre6/include/linux/bootmem.h a/include/linux/bootmem.h --- 2.3.30pre6/include/linux/bootmem.h Sat Dec 4 04:45:48 1999 +++ a/include/linux/bootmem.h Sun Dec 5 15:36:53 1999 @@ -3,7 +3,7 @@ #include #include -#include +#include #include /* diff -urN 2.3.30pre6/include/linux/cache.h a/include/linux/cache.h --- 2.3.30pre6/include/linux/cache.h Thu Jan 1 01:00:00 1970 +++ a/include/linux/cache.h Sun Dec 5 15:20:10 1999 @@ -0,0 +1,28 @@ +#ifndef __LINUX_CACHE_H +#define __LINUX_CACHE_H + +#include + +#ifndef L1_CACHE_ALIGN +#define L1_CACHE_ALIGN(x) (((x)+(L1_CACHE_BYTES-1))&~(L1_CACHE_BYTES-1)) +#endif + +#ifndef SMP_CACHE_BYTES +#define SMP_CACHE_BYTES L1_CACHE_BYTES +#endif + +#ifndef ____cacheline_aligned +#define ____cacheline_aligned __attribute__((__aligned__(SMP_CACHE_BYTES))) +#endif + +#ifndef __cacheline_aligned +#ifdef MODULE +#define __cacheline_aligned ____cacheline_aligned +#else +#define __cacheline_aligned \ + __attribute__((__aligned__(SMP_CACHE_BYTES), \ + __section__(".data.cacheline_aligned"))) +#endif +#endif /* __cacheline_aligned */ + +#endif /* __LINUX_CACHE_H */ diff -urN 2.3.30pre6/include/linux/fs.h a/include/linux/fs.h --- 2.3.30pre6/include/linux/fs.h Sat Dec 4 04:45:48 1999 +++ a/include/linux/fs.h Sun Dec 5 15:36:33 1999 @@ -18,10 +18,10 @@ #include #include #include +#include #include #include -#include struct poll_table_struct; diff -urN 2.3.30pre6/include/linux/irq.h a/include/linux/irq.h --- 2.3.30pre6/include/linux/irq.h Sat Dec 4 18:20:27 1999 +++ a/include/linux/irq.h Sun Dec 5 15:38:41 1999 @@ -42,7 +42,7 @@ independent code */ struct irqaction *action; /* IRQ action list */ unsigned int depth; /* Disable depth for nested irq disables */ -} irq_desc_t; +} ____cacheline_aligned irq_desc_t; #include /* the arch dependent stuff */ @@ -51,27 +51,6 @@ extern int handle_IRQ_event(unsigned int, struct pt_regs *, struct irqaction *); extern spinlock_t irq_controller_lock; extern int setup_irq(unsigned int , struct irqaction * ); - -#ifdef __SMP__ - -#include - -static inline void irq_enter(int cpu, unsigned int irq) -{ - hardirq_enter(cpu); - while (test_bit(0,&global_irq_lock)) { - /* nothing */; - } -} - -static inline void irq_exit(int cpu, unsigned int irq) -{ - hardirq_exit(cpu); -} -#else -#define irq_enter(cpu, irq) (++local_irq_count[cpu]) -#define irq_exit(cpu, irq) (--local_irq_count[cpu]) -#endif extern hw_irq_controller no_irq_type; /* needed in every arch ? */ diff -urN 2.3.30pre6/include/linux/pci.h a/include/linux/pci.h --- 2.3.30pre6/include/linux/pci.h Sat Dec 4 04:45:48 1999 +++ a/include/linux/pci.h Sun Dec 5 15:36:33 1999 @@ -478,6 +478,8 @@ int pci_claim_resource(struct pci_dev *, int); void pci_assign_unassigned_resources(u32 min_io, u32 min_mem); void pci_set_bus_ranges(void); +void pdev_fixup_irq(struct pci_dev *, u8 (*)(struct pci_dev *, u8 *), + int (*)(struct pci_dev *, u8, u8)); void pci_fixup_irqs(u8 (*)(struct pci_dev *, u8 *), int (*)(struct pci_dev *, u8, u8)); diff -urN 2.3.30pre6/include/linux/slab.h a/include/linux/slab.h --- 2.3.30pre6/include/linux/slab.h Sat Dec 4 18:18:11 1999 +++ a/include/linux/slab.h Sun Dec 5 15:36:33 1999 @@ -12,7 +12,7 @@ typedef struct kmem_cache_s kmem_cache_t; #include -#include +#include /* flags for kmem_cache_alloc() */ #define SLAB_BUFFER GFP_BUFFER