diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/pci.h | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/include/linux/pci.h b/include/linux/pci.h index b9bb6c46e0..2aabe90f1c 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h | |||
@@ -617,6 +617,68 @@ extern int pci_enable_msix(struct pci_dev* dev, | |||
617 | struct msix_entry *entries, int nvec); | 617 | struct msix_entry *entries, int nvec); |
618 | extern void pci_disable_msix(struct pci_dev *dev); | 618 | extern void pci_disable_msix(struct pci_dev *dev); |
619 | extern void msi_remove_pci_irq_vectors(struct pci_dev *dev); | 619 | extern void msi_remove_pci_irq_vectors(struct pci_dev *dev); |
620 | |||
621 | /* | ||
622 | * MSI operation vector. Used by the msi core code (drivers/pci/msi.c) | ||
623 | * to abstract platform-specific tasks relating to MSI address generation | ||
624 | * and resource management. | ||
625 | */ | ||
626 | struct msi_ops { | ||
627 | int needs_64bit_address; | ||
628 | /** | ||
629 | * setup - generate an MSI bus address and data for a given vector | ||
630 | * @pdev: PCI device context (in) | ||
631 | * @irq: irq allocated by the msi core (in) | ||
632 | * @msg: PCI bus address and data for msi message (out) | ||
633 | * | ||
634 | * Description: The setup op is used to generate a PCI bus addres and | ||
635 | * data which the msi core will program into the card MSI capability | ||
636 | * registers. The setup routine is responsible for picking an initial | ||
637 | * cpu to target the MSI at. The setup routine is responsible for | ||
638 | * examining pdev to determine the MSI capabilities of the card and | ||
639 | * generating a suitable address/data. The setup routine is | ||
640 | * responsible for allocating and tracking any system resources it | ||
641 | * needs to route the MSI to the cpu it picks, and for associating | ||
642 | * those resources with the passed in vector. | ||
643 | * | ||
644 | * Returns 0 if the MSI address/data was successfully setup. | ||
645 | **/ | ||
646 | |||
647 | int (*setup) (struct pci_dev *pdev, unsigned int irq, | ||
648 | struct msi_msg *msg); | ||
649 | |||
650 | /** | ||
651 | * teardown - release resources allocated by setup | ||
652 | * @vector: vector context for resources (in) | ||
653 | * | ||
654 | * Description: The teardown op is used to release any resources | ||
655 | * that were allocated in the setup routine associated with the passed | ||
656 | * in vector. | ||
657 | **/ | ||
658 | |||
659 | void (*teardown) (unsigned int irq); | ||
660 | |||
661 | /** | ||
662 | * target - retarget an MSI at a different cpu | ||
663 | * @vector: vector context for resources (in) | ||
664 | * @cpu: new cpu to direct vector at (in) | ||
665 | * @addr_hi: new value of PCI bus upper 32 bits (in/out) | ||
666 | * @addr_lo: new value of PCI bus lower 32 bits (in/out) | ||
667 | * | ||
668 | * Description: The target op is used to redirect an MSI vector | ||
669 | * at a different cpu. addr_hi/addr_lo coming in are the existing | ||
670 | * values that the MSI core has programmed into the card. The | ||
671 | * target code is responsible for freeing any resources (if any) | ||
672 | * associated with the old address, and generating a new PCI bus | ||
673 | * addr_hi/addr_lo that will redirect the vector at the indicated cpu. | ||
674 | **/ | ||
675 | |||
676 | void (*target) (unsigned int irq, cpumask_t cpumask, | ||
677 | struct msi_msg *msg); | ||
678 | }; | ||
679 | |||
680 | extern int msi_register(struct msi_ops *ops); | ||
681 | |||
620 | #endif | 682 | #endif |
621 | 683 | ||
622 | extern void pci_block_user_cfg_access(struct pci_dev *dev); | 684 | extern void pci_block_user_cfg_access(struct pci_dev *dev); |