xref: /openbmc/linux/drivers/pci/pcie/portdrv.h (revision ea401499)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  * Purpose:	PCI Express Port Bus Driver's Internal Data Structures
41da177e4SLinus Torvalds  *
51da177e4SLinus Torvalds  * Copyright (C) 2004 Intel
61da177e4SLinus Torvalds  * Copyright (C) Tom Long Nguyen (tom.l.nguyen@intel.com)
71da177e4SLinus Torvalds  */
81da177e4SLinus Torvalds 
91da177e4SLinus Torvalds #ifndef _PORTDRV_H_
101da177e4SLinus Torvalds #define _PORTDRV_H_
111da177e4SLinus Torvalds 
123ec6a8d0SAndrew Morton #include <linux/compiler.h>
133ec6a8d0SAndrew Morton 
14ef794260SBjorn Helgaas /* Service Type */
15ef794260SBjorn Helgaas #define PCIE_PORT_SERVICE_PME_SHIFT	0	/* Power Management Event */
16ef794260SBjorn Helgaas #define PCIE_PORT_SERVICE_PME		(1 << PCIE_PORT_SERVICE_PME_SHIFT)
17ef794260SBjorn Helgaas #define PCIE_PORT_SERVICE_AER_SHIFT	1	/* Advanced Error Reporting */
18ef794260SBjorn Helgaas #define PCIE_PORT_SERVICE_AER		(1 << PCIE_PORT_SERVICE_AER_SHIFT)
19ef794260SBjorn Helgaas #define PCIE_PORT_SERVICE_HP_SHIFT	2	/* Native Hotplug */
20ef794260SBjorn Helgaas #define PCIE_PORT_SERVICE_HP		(1 << PCIE_PORT_SERVICE_HP_SHIFT)
21168f3ae5SBjorn Helgaas #define PCIE_PORT_SERVICE_DPC_SHIFT	3	/* Downstream Port Containment */
22ef794260SBjorn Helgaas #define PCIE_PORT_SERVICE_DPC		(1 << PCIE_PORT_SERVICE_DPC_SHIFT)
23e8303bb7SAlexandru Gagniuc #define PCIE_PORT_SERVICE_BWNOTIF_SHIFT	4	/* Bandwidth notification */
24e8303bb7SAlexandru Gagniuc #define PCIE_PORT_SERVICE_BWNOTIF	(1 << PCIE_PORT_SERVICE_BWNOTIF_SHIFT)
25ef794260SBjorn Helgaas 
26e8303bb7SAlexandru Gagniuc #define PCIE_PORT_DEVICE_MAXSERVICES   5
27ef794260SBjorn Helgaas 
2835a0b237SOlof Johansson extern bool pcie_ports_dpc_native;
2935a0b237SOlof Johansson 
30c29de841SKeith Busch #ifdef CONFIG_PCIEAER
31c29de841SKeith Busch int pcie_aer_init(void);
32708b2000SKuppuswamy Sathyanarayanan int pcie_aer_is_native(struct pci_dev *dev);
33c29de841SKeith Busch #else
34c29de841SKeith Busch static inline int pcie_aer_init(void) { return 0; }
35708b2000SKuppuswamy Sathyanarayanan static inline int pcie_aer_is_native(struct pci_dev *dev) { return 0; }
36c29de841SKeith Busch #endif
37c29de841SKeith Busch 
38c29de841SKeith Busch #ifdef CONFIG_HOTPLUG_PCI_PCIE
39c29de841SKeith Busch int pcie_hp_init(void);
40c29de841SKeith Busch #else
41c29de841SKeith Busch static inline int pcie_hp_init(void) { return 0; }
42c29de841SKeith Busch #endif
43c29de841SKeith Busch 
44c29de841SKeith Busch #ifdef CONFIG_PCIE_PME
45c29de841SKeith Busch int pcie_pme_init(void);
46c29de841SKeith Busch #else
47c29de841SKeith Busch static inline int pcie_pme_init(void) { return 0; }
48c29de841SKeith Busch #endif
49c29de841SKeith Busch 
50c29de841SKeith Busch #ifdef CONFIG_PCIE_DPC
51c29de841SKeith Busch int pcie_dpc_init(void);
52c29de841SKeith Busch #else
53c29de841SKeith Busch static inline int pcie_dpc_init(void) { return 0; }
54c29de841SKeith Busch #endif
55c29de841SKeith Busch 
56ef794260SBjorn Helgaas /* Port Type */
57ef794260SBjorn Helgaas #define PCIE_ANY_PORT			(~0)
58ef794260SBjorn Helgaas 
59ef794260SBjorn Helgaas struct pcie_device {
60ef794260SBjorn Helgaas 	int		irq;	    /* Service IRQ/MSI/MSI-X Vector */
61ef794260SBjorn Helgaas 	struct pci_dev *port;	    /* Root/Upstream/Downstream Port */
62ef794260SBjorn Helgaas 	u32		service;    /* Port service this device represents */
63ef794260SBjorn Helgaas 	void		*priv_data; /* Service Private Data */
64ef794260SBjorn Helgaas 	struct device	device;     /* Generic Device Interface */
65ef794260SBjorn Helgaas };
66ef794260SBjorn Helgaas #define to_pcie_device(d) container_of(d, struct pcie_device, device)
67ef794260SBjorn Helgaas 
68ef794260SBjorn Helgaas static inline void set_service_data(struct pcie_device *dev, void *data)
69ef794260SBjorn Helgaas {
70ef794260SBjorn Helgaas 	dev->priv_data = data;
71ef794260SBjorn Helgaas }
72ef794260SBjorn Helgaas 
73ef794260SBjorn Helgaas static inline void *get_service_data(struct pcie_device *dev)
74ef794260SBjorn Helgaas {
75ef794260SBjorn Helgaas 	return dev->priv_data;
76ef794260SBjorn Helgaas }
77ef794260SBjorn Helgaas 
78ef794260SBjorn Helgaas struct pcie_port_service_driver {
79ef794260SBjorn Helgaas 	const char *name;
80ef794260SBjorn Helgaas 	int (*probe)(struct pcie_device *dev);
81ef794260SBjorn Helgaas 	void (*remove)(struct pcie_device *dev);
82ef794260SBjorn Helgaas 	int (*suspend)(struct pcie_device *dev);
8379037824SLukas Wunner 	int (*resume_noirq)(struct pcie_device *dev);
84ef794260SBjorn Helgaas 	int (*resume)(struct pcie_device *dev);
8594c7993fSMika Westerberg 	int (*runtime_suspend)(struct pcie_device *dev);
8694c7993fSMika Westerberg 	int (*runtime_resume)(struct pcie_device *dev);
87ef794260SBjorn Helgaas 
88*ea401499SLukas Wunner 	int (*slot_reset)(struct pcie_device *dev);
89*ea401499SLukas Wunner 
90ef794260SBjorn Helgaas 	/* Device driver may resume normal operations */
91ef794260SBjorn Helgaas 	void (*error_resume)(struct pci_dev *dev);
92ef794260SBjorn Helgaas 
93ef794260SBjorn Helgaas 	int port_type;  /* Type of the port this driver can handle */
94ef794260SBjorn Helgaas 	u32 service;    /* Port service this device represents */
95ef794260SBjorn Helgaas 
96ef794260SBjorn Helgaas 	struct device_driver driver;
97ef794260SBjorn Helgaas };
98ef794260SBjorn Helgaas #define to_service_driver(d) \
99ef794260SBjorn Helgaas 	container_of(d, struct pcie_port_service_driver, driver)
100ef794260SBjorn Helgaas 
101ef794260SBjorn Helgaas int pcie_port_service_register(struct pcie_port_service_driver *new);
102ef794260SBjorn Helgaas void pcie_port_service_unregister(struct pcie_port_service_driver *new);
103ef794260SBjorn Helgaas 
104b43d4513SRafael J. Wysocki /*
105a1d5f18cSGabriele Paoloni  * The PCIe Capability Interrupt Message Number (PCIe r3.1, sec 7.8.2) must
106a1d5f18cSGabriele Paoloni  * be one of the first 32 MSI-X entries.  Per PCI r3.0, sec 6.8.3.1, MSI
107a1d5f18cSGabriele Paoloni  * supports a maximum of 32 vectors per function.
108b43d4513SRafael J. Wysocki  */
109a1d5f18cSGabriele Paoloni #define PCIE_PORT_MAX_MSI_ENTRIES	32
1101da177e4SLinus Torvalds 
1116d81417dSKeith Busch #define get_descriptor_id(type, service) (((type - 4) << 8) | service)
1121da177e4SLinus Torvalds 
1131da177e4SLinus Torvalds extern struct bus_type pcie_port_bus_type;
114f39d5b72SBjorn Helgaas int pcie_port_device_register(struct pci_dev *dev);
1153134689fSLukas Wunner int pcie_port_device_iter(struct device *dev, void *data);
1161da177e4SLinus Torvalds #ifdef CONFIG_PM
117f39d5b72SBjorn Helgaas int pcie_port_device_suspend(struct device *dev);
11879037824SLukas Wunner int pcie_port_device_resume_noirq(struct device *dev);
119f39d5b72SBjorn Helgaas int pcie_port_device_resume(struct device *dev);
12094c7993fSMika Westerberg int pcie_port_device_runtime_suspend(struct device *dev);
12194c7993fSMika Westerberg int pcie_port_device_runtime_resume(struct device *dev);
1221da177e4SLinus Torvalds #endif
123f39d5b72SBjorn Helgaas void pcie_port_device_remove(struct pci_dev *dev);
124f39d5b72SBjorn Helgaas int __must_check pcie_port_bus_register(void);
125f39d5b72SBjorn Helgaas void pcie_port_bus_unregister(void);
1261da177e4SLinus Torvalds 
12728eb5f27SRafael J. Wysocki struct pci_dev;
12828eb5f27SRafael J. Wysocki 
129c39fae14SRafael J. Wysocki #ifdef CONFIG_PCIE_PME
130c39fae14SRafael J. Wysocki extern bool pcie_pme_msi_disabled;
131c39fae14SRafael J. Wysocki 
132c39fae14SRafael J. Wysocki static inline void pcie_pme_disable_msi(void)
133c39fae14SRafael J. Wysocki {
134c39fae14SRafael J. Wysocki 	pcie_pme_msi_disabled = true;
135c39fae14SRafael J. Wysocki }
136c39fae14SRafael J. Wysocki 
137c39fae14SRafael J. Wysocki static inline bool pcie_pme_no_msi(void)
138c39fae14SRafael J. Wysocki {
139c39fae14SRafael J. Wysocki 	return pcie_pme_msi_disabled;
140c39fae14SRafael J. Wysocki }
14128eb5f27SRafael J. Wysocki 
142f39d5b72SBjorn Helgaas void pcie_pme_interrupt_enable(struct pci_dev *dev, bool enable);
143c39fae14SRafael J. Wysocki #else /* !CONFIG_PCIE_PME */
144c39fae14SRafael J. Wysocki static inline void pcie_pme_disable_msi(void) {}
145c39fae14SRafael J. Wysocki static inline bool pcie_pme_no_msi(void) { return false; }
14628eb5f27SRafael J. Wysocki static inline void pcie_pme_interrupt_enable(struct pci_dev *dev, bool en) {}
147c39fae14SRafael J. Wysocki #endif /* !CONFIG_PCIE_PME */
148c39fae14SRafael J. Wysocki 
149e76d596aSOza Pawandeep struct device *pcie_port_find_device(struct pci_dev *dev, u32 service);
1501da177e4SLinus Torvalds #endif /* _PORTDRV_H_ */
151