b43d451385
If MSI-X interrupt mode is used by the PCI Express port driver, too many vectors are allocated and it is not ensured that the right vectors will be used for the right services. Namely, the PCI Express specification states that both PCI Express native PME and PCI Express hotplug will always use the same MSI or MSI-X message for signalling interrupts, which implies that the same vector will be used by both of them. Also, the VC service does not use interrupts at all. Moreover, is not clear which of the vectors allocated by pci_enable_msix() in the current code will be used for PME and hotplug and which of them will be used for AER if all of these services are configured. For these reasons, rework the allocation of interrupts for PCI Express ports so that if MSI-X are enabled, the right vectors will be used for the right purposes. Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl> Reviewed-by: Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com> Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
49 lines
1.4 KiB
C
49 lines
1.4 KiB
C
/*
|
|
* File: portdrv.h
|
|
* Purpose: PCI Express Port Bus Driver's Internal Data Structures
|
|
*
|
|
* Copyright (C) 2004 Intel
|
|
* Copyright (C) Tom Long Nguyen (tom.l.nguyen@intel.com)
|
|
*/
|
|
|
|
#ifndef _PORTDRV_H_
|
|
#define _PORTDRV_H_
|
|
|
|
#include <linux/compiler.h>
|
|
|
|
#if !defined(PCI_CAP_ID_PME)
|
|
#define PCI_CAP_ID_PME 1
|
|
#endif
|
|
|
|
#if !defined(PCI_CAP_ID_EXP)
|
|
#define PCI_CAP_ID_EXP 0x10
|
|
#endif
|
|
|
|
#define PORT_TYPE_MASK 0xf
|
|
#define PORT_TO_SLOT_MASK 0x100
|
|
#define SLOT_HP_CAPABLE_MASK 0x40
|
|
#define PCIE_CAPABILITIES_REG 0x2
|
|
#define PCIE_SLOT_CAPABILITIES_REG 0x14
|
|
#define PCIE_PORT_DEVICE_MAXSERVICES 4
|
|
#define PCIE_PORT_MSI_VECTOR_MASK 0x1f
|
|
/*
|
|
* According to the PCI Express Base Specification 2.0, the indices of the MSI-X
|
|
* table entires used by port services must not exceed 31
|
|
*/
|
|
#define PCIE_PORT_MAX_MSIX_ENTRIES 32
|
|
|
|
#define get_descriptor_id(type, service) (((type - 4) << 4) | service)
|
|
|
|
extern struct bus_type pcie_port_bus_type;
|
|
extern int pcie_port_device_probe(struct pci_dev *dev);
|
|
extern int pcie_port_device_register(struct pci_dev *dev);
|
|
#ifdef CONFIG_PM
|
|
extern int pcie_port_device_suspend(struct pci_dev *dev, pm_message_t state);
|
|
extern int pcie_port_device_resume(struct pci_dev *dev);
|
|
#endif
|
|
extern void pcie_port_device_remove(struct pci_dev *dev);
|
|
extern int __must_check pcie_port_bus_register(void);
|
|
extern void pcie_port_bus_unregister(void);
|
|
|
|
#endif /* _PORTDRV_H_ */
|