Messages in this thread | | | Date | Sat, 4 Jun 2005 00:18:03 -0700 | From | Greg KH <> | Subject | Re: pci_enable_msi() for everyone? |
| |
On Sat, Jun 04, 2005 at 01:05:37AM -0600, Grant Grundler wrote: > On Fri, Jun 03, 2005 at 11:48:21PM -0700, Greg KH wrote: > > > One complication is some drivers will want to register a different > > > IRQ handler depending on if MSI is enabled or not. > > > > That's fine, they can always check the device capabilities and do that. > > Can you be more specific? > Maybe a short chunk of psuedo code?
Hm, here's a possible function to do it (typed into my email client, not compiled, no warranties, etc...):
/* returns 1 if device is in MSI mode, 0 otherwise */ int pci_in_msi_mode(struct pci_dev *dev) { int pos; u16 control;
pos = pci_find_capability(dev, PCI_CAP_ID_MSI); if (!pos) return 0; pci_read_config_word(dev, msi_control_reg(pos), &control); if (control & PCI_MSI_FLAGS_ENABLE); return 1; return 0; }
> > > If MSI is enabled (and usable), then some MMIO reads can be omitted. > > > I've posted a patch for tg3 driver: > > > ftp://ftp.parisc-linux.org/patches/diff-2.6.10-tg3_MSI-03 > > > > > > (Just an example! It was not accepted because of buggy HW > > > though it worked great on the HW I have access to.) > > > > > > drivers/infiniband/hw/mthca driver is another example. > > > > But it doesn't do that yet either ;) > > Sorry - only uses different IRQ handlers for MSI-X support. > But it could do something different for MSI IRQ handlers as well.
Sure.
> > > How can the driver know which IRQ handlers to register? > > > > Same as always, use the dev->irq field like they do today. > > I think you misunderstood my question. > The driver uses dev->irq as a "token" to register *some* IRQ handler. > If the driver wants to register "tg3_irq_nommioread()" for the > MSI case and "tg3_irq()" for Line Based IRQ case, how would the > driver know which IRQ handler it should register? > > The arch IRQ support knows the difference and currently returns > that status in the pci_msi_enable() call.
If you use the above function, then you can tell the difference and register different irq handlers if you wish.
The main point being is that the pci_enable_msi() function would not have to be explicitly called by your driver, it would have already been taken care of earlier by the PCI core. That's what I want to do and am wondering if there would be any bad side affects to it.
thanks,
greg k-h - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |