diff options
Diffstat (limited to 'include/linux/pci.h')
| -rw-r--r-- | include/linux/pci.h | 63 | 
1 files changed, 58 insertions, 5 deletions
| diff --git a/include/linux/pci.h b/include/linux/pci.h index f958d0732af6..f68c58a93dd0 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h @@ -102,6 +102,28 @@ enum {  	DEVICE_COUNT_RESOURCE = PCI_NUM_RESOURCES,  }; +/** + * enum pci_interrupt_pin - PCI INTx interrupt values + * @PCI_INTERRUPT_UNKNOWN: Unknown or unassigned interrupt + * @PCI_INTERRUPT_INTA: PCI INTA pin + * @PCI_INTERRUPT_INTB: PCI INTB pin + * @PCI_INTERRUPT_INTC: PCI INTC pin + * @PCI_INTERRUPT_INTD: PCI INTD pin + * + * Corresponds to values for legacy PCI INTx interrupts, as can be found in the + * PCI_INTERRUPT_PIN register. + */ +enum pci_interrupt_pin { +	PCI_INTERRUPT_UNKNOWN, +	PCI_INTERRUPT_INTA, +	PCI_INTERRUPT_INTB, +	PCI_INTERRUPT_INTC, +	PCI_INTERRUPT_INTD, +}; + +/* The number of legacy PCI INTx interrupts */ +#define PCI_NUM_INTX	4 +  /*   * pci_power_t values must match the bits in the Capabilities PME_Support   * and Control/Status PowerState fields in the Power Management capability. @@ -453,6 +475,7 @@ struct pci_host_bridge {  	void *release_data;  	struct msi_controller *msi;  	unsigned int ignore_reset_delay:1;	/* for entire hierarchy */ +	unsigned int no_ext_tags:1;		/* no Extended Tags */  	/* Resource alignment requirements */  	resource_size_t (*align_resource)(struct pci_dev *dev,  			const struct resource *res, @@ -731,6 +754,7 @@ struct pci_driver {  	void (*shutdown) (struct pci_dev *dev);  	int (*sriov_configure) (struct pci_dev *dev, int num_vfs); /* PF pdev */  	const struct pci_error_handlers *err_handler; +	const struct attribute_group **groups;  	struct device_driver	driver;  	struct pci_dynids dynids;  }; @@ -846,7 +870,6 @@ char *pcibios_setup(char *str);  resource_size_t pcibios_align_resource(void *, const struct resource *,  				resource_size_t,  				resource_size_t); -void pcibios_update_irq(struct pci_dev *, int irq);  /* Weak but can be overriden by arch */  void pci_fixup_cardbus(struct pci_bus *); @@ -1164,8 +1187,6 @@ void pci_assign_unassigned_bus_resources(struct pci_bus *bus);  void pci_assign_unassigned_root_bus_resources(struct pci_bus *bus);  void pdev_enable_device(struct pci_dev *);  int pci_enable_resources(struct pci_dev *, int mask); -void pci_fixup_irqs(u8 (*)(struct pci_dev *, u8 *), -		    int (*)(const struct pci_dev *, u8, u8));  void pci_assign_irq(struct pci_dev *dev);  struct resource *pci_find_resource(struct pci_dev *dev, struct resource *res);  #define HAVE_PCI_REQ_REGIONS	2 @@ -1398,6 +1419,38 @@ pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,  					      NULL);  } +/** + * pci_irqd_intx_xlate() - Translate PCI INTx value to an IRQ domain hwirq + * @d: the INTx IRQ domain + * @node: the DT node for the device whose interrupt we're translating + * @intspec: the interrupt specifier data from the DT + * @intsize: the number of entries in @intspec + * @out_hwirq: pointer at which to write the hwirq number + * @out_type: pointer at which to write the interrupt type + * + * Translate a PCI INTx interrupt number from device tree in the range 1-4, as + * stored in the standard PCI_INTERRUPT_PIN register, to a value in the range + * 0-3 suitable for use in a 4 entry IRQ domain. That is, subtract one from the + * INTx value to obtain the hwirq number. + * + * Returns 0 on success, or -EINVAL if the interrupt specifier is out of range. + */ +static inline int pci_irqd_intx_xlate(struct irq_domain *d, +				      struct device_node *node, +				      const u32 *intspec, +				      unsigned int intsize, +				      unsigned long *out_hwirq, +				      unsigned int *out_type) +{ +	const u32 intx = intspec[0]; + +	if (intx < PCI_INTERRUPT_INTA || intx > PCI_INTERRUPT_INTD) +		return -EINVAL; + +	*out_hwirq = intx - PCI_INTERRUPT_INTA; +	return 0; +} +  #ifdef CONFIG_PCIEPORTBUS  extern bool pcie_ports_disabled;  extern bool pcie_ports_auto; @@ -2063,7 +2116,7 @@ static inline u16 pci_vpd_lrdt_tag(const u8 *lrdt)  /**   * pci_vpd_srdt_size - Extracts the Small Resource Data Type length - * @lrdt: Pointer to the beginning of the Small Resource Data Type tag + * @srdt: Pointer to the beginning of the Small Resource Data Type tag   *   * Returns the extracted Small Resource Data Type length.   */ @@ -2074,7 +2127,7 @@ static inline u8 pci_vpd_srdt_size(const u8 *srdt)  /**   * pci_vpd_srdt_tag - Extracts the Small Resource Data Type Tag Item - * @lrdt: Pointer to the beginning of the Small Resource Data Type tag + * @srdt: Pointer to the beginning of the Small Resource Data Type tag   *   * Returns the extracted Small Resource Data Type Tag Item.   */ |