xref: /openbmc/linux/drivers/pci/pcie/portdrv.h (revision ef794260)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  * File:	portdrv.h
4ef794260SBjorn Helgaas  * Purpose:	PCI Express Port Bus Driver's Data Structures
51da177e4SLinus Torvalds  *
61da177e4SLinus Torvalds  * Copyright (C) 2004 Intel
71da177e4SLinus Torvalds  * Copyright (C) Tom Long Nguyen (tom.l.nguyen@intel.com)
81da177e4SLinus Torvalds  */
91da177e4SLinus Torvalds 
101da177e4SLinus Torvalds #ifndef _PORTDRV_H_
111da177e4SLinus Torvalds #define _PORTDRV_H_
121da177e4SLinus Torvalds 
133ec6a8d0SAndrew Morton #include <linux/compiler.h>
143ec6a8d0SAndrew Morton 
15ef794260SBjorn Helgaas /* Service Type */
16ef794260SBjorn Helgaas #define PCIE_PORT_SERVICE_PME_SHIFT	0	/* Power Management Event */
17ef794260SBjorn Helgaas #define PCIE_PORT_SERVICE_PME		(1 << PCIE_PORT_SERVICE_PME_SHIFT)
18ef794260SBjorn Helgaas #define PCIE_PORT_SERVICE_AER_SHIFT	1	/* Advanced Error Reporting */
19ef794260SBjorn Helgaas #define PCIE_PORT_SERVICE_AER		(1 << PCIE_PORT_SERVICE_AER_SHIFT)
20ef794260SBjorn Helgaas #define PCIE_PORT_SERVICE_HP_SHIFT	2	/* Native Hotplug */
21ef794260SBjorn Helgaas #define PCIE_PORT_SERVICE_HP		(1 << PCIE_PORT_SERVICE_HP_SHIFT)
22ef794260SBjorn Helgaas #define PCIE_PORT_SERVICE_VC_SHIFT	3	/* Virtual Channel */
23ef794260SBjorn Helgaas #define PCIE_PORT_SERVICE_VC		(1 << PCIE_PORT_SERVICE_VC_SHIFT)
24ef794260SBjorn Helgaas #define PCIE_PORT_SERVICE_DPC_SHIFT	4	/* Downstream Port Containment */
25ef794260SBjorn Helgaas #define PCIE_PORT_SERVICE_DPC		(1 << PCIE_PORT_SERVICE_DPC_SHIFT)
26ef794260SBjorn Helgaas 
2710126ac1SKeith Busch #define PCIE_PORT_DEVICE_MAXSERVICES   5
28ef794260SBjorn Helgaas 
29ef794260SBjorn Helgaas /* Port Type */
30ef794260SBjorn Helgaas #define PCIE_ANY_PORT			(~0)
31ef794260SBjorn Helgaas 
32ef794260SBjorn Helgaas struct pcie_device {
33ef794260SBjorn Helgaas 	int		irq;	    /* Service IRQ/MSI/MSI-X Vector */
34ef794260SBjorn Helgaas 	struct pci_dev *port;	    /* Root/Upstream/Downstream Port */
35ef794260SBjorn Helgaas 	u32		service;    /* Port service this device represents */
36ef794260SBjorn Helgaas 	void		*priv_data; /* Service Private Data */
37ef794260SBjorn Helgaas 	struct device	device;     /* Generic Device Interface */
38ef794260SBjorn Helgaas };
39ef794260SBjorn Helgaas #define to_pcie_device(d) container_of(d, struct pcie_device, device)
40ef794260SBjorn Helgaas 
41ef794260SBjorn Helgaas static inline void set_service_data(struct pcie_device *dev, void *data)
42ef794260SBjorn Helgaas {
43ef794260SBjorn Helgaas 	dev->priv_data = data;
44ef794260SBjorn Helgaas }
45ef794260SBjorn Helgaas 
46ef794260SBjorn Helgaas static inline void *get_service_data(struct pcie_device *dev)
47ef794260SBjorn Helgaas {
48ef794260SBjorn Helgaas 	return dev->priv_data;
49ef794260SBjorn Helgaas }
50ef794260SBjorn Helgaas 
51ef794260SBjorn Helgaas struct pcie_port_service_driver {
52ef794260SBjorn Helgaas 	const char *name;
53ef794260SBjorn Helgaas 	int (*probe) (struct pcie_device *dev);
54ef794260SBjorn Helgaas 	void (*remove) (struct pcie_device *dev);
55ef794260SBjorn Helgaas 	int (*suspend) (struct pcie_device *dev);
56ef794260SBjorn Helgaas 	int (*resume) (struct pcie_device *dev);
57ef794260SBjorn Helgaas 
58ef794260SBjorn Helgaas 	/* Device driver may resume normal operations */
59ef794260SBjorn Helgaas 	void (*error_resume)(struct pci_dev *dev);
60ef794260SBjorn Helgaas 
61ef794260SBjorn Helgaas 	/* Link Reset Capability - AER service driver specific */
62ef794260SBjorn Helgaas 	pci_ers_result_t (*reset_link) (struct pci_dev *dev);
63ef794260SBjorn Helgaas 
64ef794260SBjorn Helgaas 	int port_type;  /* Type of the port this driver can handle */
65ef794260SBjorn Helgaas 	u32 service;    /* Port service this device represents */
66ef794260SBjorn Helgaas 
67ef794260SBjorn Helgaas 	struct device_driver driver;
68ef794260SBjorn Helgaas };
69ef794260SBjorn Helgaas #define to_service_driver(d) \
70ef794260SBjorn Helgaas 	container_of(d, struct pcie_port_service_driver, driver)
71ef794260SBjorn Helgaas 
72ef794260SBjorn Helgaas int pcie_port_service_register(struct pcie_port_service_driver *new);
73ef794260SBjorn Helgaas void pcie_port_service_unregister(struct pcie_port_service_driver *new);
74ef794260SBjorn Helgaas 
75b43d4513SRafael J. Wysocki /*
76a1d5f18cSGabriele Paoloni  * The PCIe Capability Interrupt Message Number (PCIe r3.1, sec 7.8.2) must
77a1d5f18cSGabriele Paoloni  * be one of the first 32 MSI-X entries.  Per PCI r3.0, sec 6.8.3.1, MSI
78a1d5f18cSGabriele Paoloni  * supports a maximum of 32 vectors per function.
79b43d4513SRafael J. Wysocki  */
80a1d5f18cSGabriele Paoloni #define PCIE_PORT_MAX_MSI_ENTRIES	32
811da177e4SLinus Torvalds 
826d81417dSKeith Busch #define get_descriptor_id(type, service) (((type - 4) << 8) | service)
831da177e4SLinus Torvalds 
841da177e4SLinus Torvalds extern struct bus_type pcie_port_bus_type;
85f39d5b72SBjorn Helgaas int pcie_port_device_register(struct pci_dev *dev);
861da177e4SLinus Torvalds #ifdef CONFIG_PM
87f39d5b72SBjorn Helgaas int pcie_port_device_suspend(struct device *dev);
88f39d5b72SBjorn Helgaas int pcie_port_device_resume(struct device *dev);
891da177e4SLinus Torvalds #endif
90f39d5b72SBjorn Helgaas void pcie_port_device_remove(struct pci_dev *dev);
91f39d5b72SBjorn Helgaas int __must_check pcie_port_bus_register(void);
92f39d5b72SBjorn Helgaas void pcie_port_bus_unregister(void);
931da177e4SLinus Torvalds 
9428eb5f27SRafael J. Wysocki struct pci_dev;
9528eb5f27SRafael J. Wysocki 
96f39d5b72SBjorn Helgaas void pcie_clear_root_pme_status(struct pci_dev *dev);
97fe31e697SRafael J. Wysocki 
987570a333SMUNEDA Takahiro #ifdef CONFIG_HOTPLUG_PCI_PCIE
997570a333SMUNEDA Takahiro extern bool pciehp_msi_disabled;
1007570a333SMUNEDA Takahiro 
1017570a333SMUNEDA Takahiro static inline bool pciehp_no_msi(void)
1027570a333SMUNEDA Takahiro {
1037570a333SMUNEDA Takahiro 	return pciehp_msi_disabled;
1047570a333SMUNEDA Takahiro }
1057570a333SMUNEDA Takahiro 
1067570a333SMUNEDA Takahiro #else  /* !CONFIG_HOTPLUG_PCI_PCIE */
1077570a333SMUNEDA Takahiro static inline bool pciehp_no_msi(void) { return false; }
1087570a333SMUNEDA Takahiro #endif /* !CONFIG_HOTPLUG_PCI_PCIE */
1097570a333SMUNEDA Takahiro 
110c39fae14SRafael J. Wysocki #ifdef CONFIG_PCIE_PME
111c39fae14SRafael J. Wysocki extern bool pcie_pme_msi_disabled;
112c39fae14SRafael J. Wysocki 
113c39fae14SRafael J. Wysocki static inline void pcie_pme_disable_msi(void)
114c39fae14SRafael J. Wysocki {
115c39fae14SRafael J. Wysocki 	pcie_pme_msi_disabled = true;
116c39fae14SRafael J. Wysocki }
117c39fae14SRafael J. Wysocki 
118c39fae14SRafael J. Wysocki static inline bool pcie_pme_no_msi(void)
119c39fae14SRafael J. Wysocki {
120c39fae14SRafael J. Wysocki 	return pcie_pme_msi_disabled;
121c39fae14SRafael J. Wysocki }
12228eb5f27SRafael J. Wysocki 
123f39d5b72SBjorn Helgaas void pcie_pme_interrupt_enable(struct pci_dev *dev, bool enable);
124c39fae14SRafael J. Wysocki #else /* !CONFIG_PCIE_PME */
125c39fae14SRafael J. Wysocki static inline void pcie_pme_disable_msi(void) {}
126c39fae14SRafael J. Wysocki static inline bool pcie_pme_no_msi(void) { return false; }
12728eb5f27SRafael J. Wysocki static inline void pcie_pme_interrupt_enable(struct pci_dev *dev, bool en) {}
128c39fae14SRafael J. Wysocki #endif /* !CONFIG_PCIE_PME */
129c39fae14SRafael J. Wysocki 
13028eb5f27SRafael J. Wysocki #ifdef CONFIG_ACPI
13188a97da1SJon Derrick void pcie_port_acpi_setup(struct pci_dev *port, int *mask);
13228eb5f27SRafael J. Wysocki 
13388a97da1SJon Derrick static inline void pcie_port_platform_notify(struct pci_dev *port, int *mask)
13428eb5f27SRafael J. Wysocki {
13588a97da1SJon Derrick 	pcie_port_acpi_setup(port, mask);
13628eb5f27SRafael J. Wysocki }
13728eb5f27SRafael J. Wysocki #else /* !CONFIG_ACPI */
13888a97da1SJon Derrick static inline void pcie_port_platform_notify(struct pci_dev *port, int *mask){}
13928eb5f27SRafael J. Wysocki #endif /* !CONFIG_ACPI */
14028eb5f27SRafael J. Wysocki 
1411da177e4SLinus Torvalds #endif /* _PORTDRV_H_ */
142