On Friday 16 February 2007 13:10, Eric W. Biederman wrote: > To do this I believe will require a s/unsigned int irq/struct irq_desc *irq/ > throughout the entire kernel. Getting the arch specific code and the > generic kernel infrastructure fixed and ready for that change looks > like a pain but pretty doable.
We did something like this a few years back on the s390 architecture, which happens to be lucky enough not to share any interrupt based drivers with any of the other architectures. It helped a lot on s390, and I think the change will be beneficial on others as well, e.g. powerpc already uses 'virtual' interrupt numbers to collapse the large (sparse) range of interrupt numbers into 512 unique numbers. This could easily be avoided if there was simply an array of irq_desc structures per interrupt controller. However, I also think we should maintain the old interface, and introduce a new one to deal only with those cases that benefit from it (MSI, Xen, powerpc VIO, ...). This means one subsystem can be converted at a time. I don't think there is a point converting the legacy ISA interrupts to a different interface, as the concept of IRQ numbers is part of the subsystem itself (if you want to call ISA a subsystem...). For PCI, it makes a lot more sense to use something else, considering that PCI interrupts are defined as 'pins' instead of 'lines', and while an interrupt pin is defined per slot, while the line is per bus, in a system with multiple PCI buses, the line is still not necessarily unique. One interface I could imagine for PCI devices would be /* generic functions */ int request_irq_desc(struct irq_desc *desc, irq_handler_t handler, unsigned long irqflags, const char *devname, void *dev_id); int free_irq_desc(struct irq_desc *desc, void *dev_id); /* legacy functions */ int request_irq(int irq, irq_handler_t handler, unsigned long irqflags, const char *devname, void *dev_id) { return request_irq_desc(lookup_irq_desc(irq), handler, irqflags, devname, dev_id); } int free_irq(int irq, void *dev_id) { return free_irq_desc(lookup_irq_desc(irq), dev_id); } /* pci specific */ struct irq_desc *pci_request_irq(struct pci_device *dev, int pin, irq_handler_t handler) { struct irq_desc *desc = pci_lookup_irq(dev, pin); int ret; if (!desc) return NULL; ret = request_irq_desc(desc, handler, IRQF_SHARED, &dev->dev.bus_id, dev); if (ret < 0) return NULL; return desc; } int pci_free_irq(struct pci_device *dev, int pin) { return free_irq_desc(pci_lookup_irq(dev, pin), dev); } Now I don't know enough about MSI yet, but I could imagine that something along these lines would work as well, and we could simply require all drivers that want to support MSI to use the new interfaces. Arnd <>< - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/