xref: /openbsd-src/sys/dev/pci/drm/include/linux/pci.h (revision 4f495ac8768dc770cdb1ae2753e6721524368f7c)
1*4f495ac8Sjsg /*	$OpenBSD: pci.h,v 1.18 2024/08/28 04:55:45 jsg Exp $	*/
27f4dd379Sjsg /*
37f4dd379Sjsg  * Copyright (c) 2015 Mark Kettenis
47f4dd379Sjsg  *
57f4dd379Sjsg  * Permission to use, copy, modify, and distribute this software for any
67f4dd379Sjsg  * purpose with or without fee is hereby granted, provided that the above
77f4dd379Sjsg  * copyright notice and this permission notice appear in all copies.
87f4dd379Sjsg  *
97f4dd379Sjsg  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
107f4dd379Sjsg  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
117f4dd379Sjsg  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
127f4dd379Sjsg  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
137f4dd379Sjsg  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
147f4dd379Sjsg  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
157f4dd379Sjsg  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
167f4dd379Sjsg  */
177f4dd379Sjsg 
18c1a0e5c3Skettenis #ifndef _LINUX_PCI_H_
19c1a0e5c3Skettenis #define _LINUX_PCI_H_
207f4dd379Sjsg 
217f4dd379Sjsg #include <sys/types.h>
227f4dd379Sjsg /* sparc64 cpu.h needs time.h and siginfo.h (indirect via param.h) */
237f4dd379Sjsg #include <sys/param.h>
247f4dd379Sjsg #include <machine/cpu.h>
25c349dbc7Sjsg 
26c349dbc7Sjsg #include <dev/pci/pcireg.h>
27c349dbc7Sjsg #include <dev/pci/pcivar.h>
28c349dbc7Sjsg #include <dev/pci/pcidevs.h>
297f4dd379Sjsg #include <uvm/uvm_extern.h>
307f4dd379Sjsg 
317f4dd379Sjsg #include <linux/io.h>
327f4dd379Sjsg #include <linux/ioport.h>
337f4dd379Sjsg #include <linux/kobject.h>
341bb76ff1Sjsg #include <linux/dma-mapping.h>
35c349dbc7Sjsg #include <linux/mod_devicetable.h>
36*4f495ac8Sjsg #include <linux/device.h>
377f4dd379Sjsg 
387f4dd379Sjsg struct pci_dev;
397f4dd379Sjsg 
407f4dd379Sjsg struct pci_bus {
417f4dd379Sjsg 	pci_chipset_tag_t pc;
427f4dd379Sjsg 	unsigned char	number;
43c349dbc7Sjsg 	int		domain_nr;
447f4dd379Sjsg 	pcitag_t	*bridgetag;
457f4dd379Sjsg 	struct pci_dev	*self;
467f4dd379Sjsg };
477f4dd379Sjsg 
486a77e6adSkettenis struct pci_acpi {
496a77e6adSkettenis 	struct aml_node	*node;
506a77e6adSkettenis };
516a77e6adSkettenis 
527f4dd379Sjsg struct pci_dev {
537f4dd379Sjsg 	struct pci_bus	_bus;
547f4dd379Sjsg 	struct pci_bus	*bus;
557f4dd379Sjsg 
567f4dd379Sjsg 	unsigned int	devfn;
577f4dd379Sjsg 	uint16_t	vendor;
587f4dd379Sjsg 	uint16_t	device;
597f4dd379Sjsg 	uint16_t	subsystem_vendor;
607f4dd379Sjsg 	uint16_t	subsystem_device;
617f4dd379Sjsg 	uint8_t		revision;
625ca02815Sjsg 	uint32_t	class;		/* class:subclass:interface */
637f4dd379Sjsg 
647f4dd379Sjsg 	pci_chipset_tag_t pc;
657f4dd379Sjsg 	pcitag_t	tag;
667f4dd379Sjsg 	struct pci_softc *pci;
677f4dd379Sjsg 
687f4dd379Sjsg 	int		irq;
697f4dd379Sjsg 	int		msi_enabled;
707f4dd379Sjsg 	uint8_t		no_64bit_msi;
71a32a15bdSjsg 	uint8_t		ltr_path;
726a77e6adSkettenis 
736a77e6adSkettenis 	struct pci_acpi dev;
74*4f495ac8Sjsg 	struct device *_dev;
757f4dd379Sjsg };
767f4dd379Sjsg #define PCI_ANY_ID (uint16_t) (~0U)
777f4dd379Sjsg 
781bb76ff1Sjsg #define PCI_DEVICE(v, p)		\
791bb76ff1Sjsg 	.vendor = (v),			\
801bb76ff1Sjsg 	.device = (p),			\
811bb76ff1Sjsg 	.subvendor = PCI_ANY_ID,	\
821bb76ff1Sjsg 	.subdevice = PCI_ANY_ID
831bb76ff1Sjsg 
84c349dbc7Sjsg #ifndef PCI_MEM_START
85c349dbc7Sjsg #define PCI_MEM_START	0
86c349dbc7Sjsg #endif
87c349dbc7Sjsg 
88c349dbc7Sjsg #ifndef PCI_MEM_END
89c349dbc7Sjsg #define PCI_MEM_END	0xffffffff
90c349dbc7Sjsg #endif
91c349dbc7Sjsg 
92c349dbc7Sjsg #ifndef PCI_MEM64_END
93c349dbc7Sjsg #define PCI_MEM64_END	0xffffffffffffffff
94c349dbc7Sjsg #endif
95c349dbc7Sjsg 
967f4dd379Sjsg #define PCI_VENDOR_ID_APPLE	PCI_VENDOR_APPLE
977f4dd379Sjsg #define PCI_VENDOR_ID_ASUSTEK	PCI_VENDOR_ASUSTEK
987f4dd379Sjsg #define PCI_VENDOR_ID_ATI	PCI_VENDOR_ATI
997f4dd379Sjsg #define PCI_VENDOR_ID_DELL	PCI_VENDOR_DELL
1007f4dd379Sjsg #define PCI_VENDOR_ID_HP	PCI_VENDOR_HP
1017f4dd379Sjsg #define PCI_VENDOR_ID_IBM	PCI_VENDOR_IBM
1027f4dd379Sjsg #define PCI_VENDOR_ID_INTEL	PCI_VENDOR_INTEL
1037f4dd379Sjsg #define PCI_VENDOR_ID_SONY	PCI_VENDOR_SONY
1047f4dd379Sjsg #define PCI_VENDOR_ID_VIA	PCI_VENDOR_VIATECH
1057f4dd379Sjsg 
1067f4dd379Sjsg #define PCI_DEVICE_ID_ATI_RADEON_QY	PCI_PRODUCT_ATI_RADEON_QY
1077f4dd379Sjsg 
1087f4dd379Sjsg #define PCI_SUBVENDOR_ID_REDHAT_QUMRANET	0x1af4
1097f4dd379Sjsg #define PCI_SUBDEVICE_ID_QEMU			0x1100
1107f4dd379Sjsg 
1117f4dd379Sjsg #define PCI_DEVFN(slot, func)	((slot) << 3 | (func))
1127f4dd379Sjsg #define PCI_SLOT(devfn)		((devfn) >> 3)
1137f4dd379Sjsg #define PCI_FUNC(devfn)		((devfn) & 0x7)
114d67406ebSjsg #define PCI_BUS_NUM(devfn)	(((devfn) >> 8) & 0xff)
1157f4dd379Sjsg 
1167f4dd379Sjsg #define pci_dev_put(x)
1177f4dd379Sjsg 
1187f4dd379Sjsg #define PCI_EXP_DEVSTA		0x0a
1197f4dd379Sjsg #define PCI_EXP_DEVSTA_TRPND	0x0020
1207f4dd379Sjsg #define PCI_EXP_LNKCAP		0x0c
1217f4dd379Sjsg #define PCI_EXP_LNKCAP_CLKPM	0x00040000
1227f4dd379Sjsg #define PCI_EXP_LNKCTL		0x10
1237f4dd379Sjsg #define PCI_EXP_LNKCTL_HAWD	0x0200
1247f4dd379Sjsg #define PCI_EXP_LNKCTL2		0x30
125c349dbc7Sjsg #define PCI_EXP_LNKCTL2_ENTER_COMP	0x0010
126c349dbc7Sjsg #define PCI_EXP_LNKCTL2_TX_MARGIN	0x0380
127c349dbc7Sjsg #define PCI_EXP_LNKCTL2_TLS		PCI_PCIE_LCSR2_TLS
128c349dbc7Sjsg #define PCI_EXP_LNKCTL2_TLS_2_5GT	PCI_PCIE_LCSR2_TLS_2_5
129c349dbc7Sjsg #define PCI_EXP_LNKCTL2_TLS_5_0GT	PCI_PCIE_LCSR2_TLS_5
130c349dbc7Sjsg #define PCI_EXP_LNKCTL2_TLS_8_0GT	PCI_PCIE_LCSR2_TLS_8
1317f4dd379Sjsg 
1327f4dd379Sjsg #define PCI_COMMAND		PCI_COMMAND_STATUS_REG
1337f4dd379Sjsg #define PCI_COMMAND_MEMORY	PCI_COMMAND_MEM_ENABLE
1347f4dd379Sjsg 
1357f4dd379Sjsg static inline int
1367f4dd379Sjsg pci_read_config_dword(struct pci_dev *pdev, int reg, u32 *val)
1377f4dd379Sjsg {
1387f4dd379Sjsg 	*val = pci_conf_read(pdev->pc, pdev->tag, reg);
1397f4dd379Sjsg 	return 0;
1407f4dd379Sjsg }
1417f4dd379Sjsg 
1427f4dd379Sjsg static inline int
1437f4dd379Sjsg pci_read_config_word(struct pci_dev *pdev, int reg, u16 *val)
1447f4dd379Sjsg {
1457f4dd379Sjsg 	uint32_t v;
1467f4dd379Sjsg 
1477f4dd379Sjsg 	v = pci_conf_read(pdev->pc, pdev->tag, (reg & ~0x2));
1487f4dd379Sjsg 	*val = (v >> ((reg & 0x2) * 8));
1497f4dd379Sjsg 	return 0;
1507f4dd379Sjsg }
1517f4dd379Sjsg 
1527f4dd379Sjsg static inline int
1537f4dd379Sjsg pci_read_config_byte(struct pci_dev *pdev, int reg, u8 *val)
1547f4dd379Sjsg {
1557f4dd379Sjsg 	uint32_t v;
1567f4dd379Sjsg 
1577f4dd379Sjsg 	v = pci_conf_read(pdev->pc, pdev->tag, (reg & ~0x3));
1587f4dd379Sjsg 	*val = (v >> ((reg & 0x3) * 8));
1597f4dd379Sjsg 	return 0;
1607f4dd379Sjsg }
1617f4dd379Sjsg 
1627f4dd379Sjsg static inline int
1637f4dd379Sjsg pci_write_config_dword(struct pci_dev *pdev, int reg, u32 val)
1647f4dd379Sjsg {
1657f4dd379Sjsg 	pci_conf_write(pdev->pc, pdev->tag, reg, val);
1667f4dd379Sjsg 	return 0;
1677f4dd379Sjsg }
1687f4dd379Sjsg 
1697f4dd379Sjsg static inline int
1707f4dd379Sjsg pci_write_config_word(struct pci_dev *pdev, int reg, u16 val)
1717f4dd379Sjsg {
1727f4dd379Sjsg 	uint32_t v;
1737f4dd379Sjsg 
1747f4dd379Sjsg 	v = pci_conf_read(pdev->pc, pdev->tag, (reg & ~0x2));
1757f4dd379Sjsg 	v &= ~(0xffff << ((reg & 0x2) * 8));
1767f4dd379Sjsg 	v |= (val << ((reg & 0x2) * 8));
1777f4dd379Sjsg 	pci_conf_write(pdev->pc, pdev->tag, (reg & ~0x2), v);
1787f4dd379Sjsg 	return 0;
1797f4dd379Sjsg }
1807f4dd379Sjsg 
1817f4dd379Sjsg static inline int
1827f4dd379Sjsg pci_write_config_byte(struct pci_dev *pdev, int reg, u8 val)
1837f4dd379Sjsg {
1847f4dd379Sjsg 	uint32_t v;
1857f4dd379Sjsg 
1867f4dd379Sjsg 	v = pci_conf_read(pdev->pc, pdev->tag, (reg & ~0x3));
1877f4dd379Sjsg 	v &= ~(0xff << ((reg & 0x3) * 8));
1887f4dd379Sjsg 	v |= (val << ((reg & 0x3) * 8));
1897f4dd379Sjsg 	pci_conf_write(pdev->pc, pdev->tag, (reg & ~0x3), v);
1907f4dd379Sjsg 	return 0;
1917f4dd379Sjsg }
1927f4dd379Sjsg 
1937f4dd379Sjsg static inline int
1947f4dd379Sjsg pci_bus_read_config_word(struct pci_bus *bus, unsigned int devfn,
1957f4dd379Sjsg     int reg, u16 *val)
1967f4dd379Sjsg {
1977f4dd379Sjsg 	pcitag_t tag = pci_make_tag(bus->pc, bus->number,
1987f4dd379Sjsg 	    PCI_SLOT(devfn), PCI_FUNC(devfn));
1997f4dd379Sjsg 	uint32_t v;
2007f4dd379Sjsg 
2017f4dd379Sjsg 	v = pci_conf_read(bus->pc, tag, (reg & ~0x2));
2027f4dd379Sjsg 	*val = (v >> ((reg & 0x2) * 8));
2037f4dd379Sjsg 	return 0;
2047f4dd379Sjsg }
2057f4dd379Sjsg 
2067f4dd379Sjsg static inline int
2077f4dd379Sjsg pci_bus_read_config_byte(struct pci_bus *bus, unsigned int devfn,
2087f4dd379Sjsg     int reg, u8 *val)
2097f4dd379Sjsg {
2107f4dd379Sjsg 	pcitag_t tag = pci_make_tag(bus->pc, bus->number,
2117f4dd379Sjsg 	    PCI_SLOT(devfn), PCI_FUNC(devfn));
2127f4dd379Sjsg 	uint32_t v;
2137f4dd379Sjsg 
2147f4dd379Sjsg 	v = pci_conf_read(bus->pc, tag, (reg & ~0x3));
2157f4dd379Sjsg 	*val = (v >> ((reg & 0x3) * 8));
2167f4dd379Sjsg 	return 0;
2177f4dd379Sjsg }
2187f4dd379Sjsg 
2197f4dd379Sjsg static inline int
2207f4dd379Sjsg pci_bus_write_config_byte(struct pci_bus *bus, unsigned int devfn,
2217f4dd379Sjsg     int reg, u8 val)
2227f4dd379Sjsg {
2237f4dd379Sjsg 	pcitag_t tag = pci_make_tag(bus->pc, bus->number,
2247f4dd379Sjsg 	    PCI_SLOT(devfn), PCI_FUNC(devfn));
2257f4dd379Sjsg 	uint32_t v;
2267f4dd379Sjsg 
2277f4dd379Sjsg 	v = pci_conf_read(bus->pc, tag, (reg & ~0x3));
2287f4dd379Sjsg 	v &= ~(0xff << ((reg & 0x3) * 8));
2297f4dd379Sjsg 	v |= (val << ((reg & 0x3) * 8));
2307f4dd379Sjsg 	pci_conf_write(bus->pc, tag, (reg & ~0x3), v);
2317f4dd379Sjsg 	return 0;
2327f4dd379Sjsg }
2337f4dd379Sjsg 
2347f4dd379Sjsg static inline int
2357f4dd379Sjsg pci_pcie_cap(struct pci_dev *pdev)
2367f4dd379Sjsg {
2377f4dd379Sjsg 	int pos;
2387f4dd379Sjsg 	if (!pci_get_capability(pdev->pc, pdev->tag, PCI_CAP_PCIEXPRESS,
2397f4dd379Sjsg 	    &pos, NULL))
2407f4dd379Sjsg 		return -EINVAL;
2417f4dd379Sjsg 	return pos;
2427f4dd379Sjsg }
2437f4dd379Sjsg 
2445276e8c8Sjsg bool pcie_aspm_enabled(struct pci_dev *);
2455276e8c8Sjsg 
2467f4dd379Sjsg static inline bool
247c349dbc7Sjsg pci_is_pcie(struct pci_dev *pdev)
248c349dbc7Sjsg {
249c349dbc7Sjsg 	return (pci_pcie_cap(pdev) > 0);
250c349dbc7Sjsg }
251c349dbc7Sjsg 
252c349dbc7Sjsg static inline bool
2537f4dd379Sjsg pci_is_root_bus(struct pci_bus *pbus)
2547f4dd379Sjsg {
2557f4dd379Sjsg 	return (pbus->bridgetag == NULL);
2567f4dd379Sjsg }
2577f4dd379Sjsg 
258b2e07619Sjsg static inline struct pci_dev *
259b2e07619Sjsg pci_upstream_bridge(struct pci_dev *pdev)
260b2e07619Sjsg {
261b2e07619Sjsg 	if (pci_is_root_bus(pdev->bus))
262b2e07619Sjsg 		return NULL;
263b2e07619Sjsg 	return pdev->bus->self;
264b2e07619Sjsg }
265b2e07619Sjsg 
266b2e07619Sjsg /* XXX check for ACPI _PR3 */
267b2e07619Sjsg static inline bool
268b2e07619Sjsg pci_pr3_present(struct pci_dev *pdev)
269b2e07619Sjsg {
270b2e07619Sjsg 	return false;
271b2e07619Sjsg }
272b2e07619Sjsg 
2737f4dd379Sjsg static inline int
2747f4dd379Sjsg pcie_capability_read_dword(struct pci_dev *pdev, int off, u32 *val)
2757f4dd379Sjsg {
2767f4dd379Sjsg 	int pos;
2777f4dd379Sjsg 	if (!pci_get_capability(pdev->pc, pdev->tag, PCI_CAP_PCIEXPRESS,
2787f4dd379Sjsg 	    &pos, NULL)) {
2797f4dd379Sjsg 		*val = 0;
2807f4dd379Sjsg 		return -EINVAL;
2817f4dd379Sjsg 	}
2827f4dd379Sjsg 	*val = pci_conf_read(pdev->pc, pdev->tag, pos + off);
2837f4dd379Sjsg 	return 0;
2847f4dd379Sjsg }
2857f4dd379Sjsg 
286c349dbc7Sjsg static inline int
287c349dbc7Sjsg pcie_capability_read_word(struct pci_dev *pdev, int off, u16 *val)
288c349dbc7Sjsg {
289c349dbc7Sjsg 	int pos;
290c349dbc7Sjsg 	if (!pci_get_capability(pdev->pc, pdev->tag, PCI_CAP_PCIEXPRESS,
291c349dbc7Sjsg 	    &pos, NULL)) {
292c349dbc7Sjsg 		*val = 0;
293c349dbc7Sjsg 		return -EINVAL;
294c349dbc7Sjsg 	}
295c349dbc7Sjsg 	pci_read_config_word(pdev, pos + off, val);
296c349dbc7Sjsg 	return 0;
297c349dbc7Sjsg }
298c349dbc7Sjsg 
299c349dbc7Sjsg static inline int
300c349dbc7Sjsg pcie_capability_write_word(struct pci_dev *pdev, int off, u16 val)
301c349dbc7Sjsg {
302c349dbc7Sjsg 	int pos;
303c349dbc7Sjsg 	if (!pci_get_capability(pdev->pc, pdev->tag, PCI_CAP_PCIEXPRESS,
304c349dbc7Sjsg 	    &pos, NULL))
305c349dbc7Sjsg 		return -EINVAL;
306c349dbc7Sjsg 	pci_write_config_word(pdev, pos + off, val);
307c349dbc7Sjsg 	return 0;
308c349dbc7Sjsg }
309c349dbc7Sjsg 
310c349dbc7Sjsg static inline int
311f0b298f8Sjsg pcie_capability_set_word(struct pci_dev *pdev, int off, u16 val)
312f0b298f8Sjsg {
313f0b298f8Sjsg 	u16 r;
314f0b298f8Sjsg 	pcie_capability_read_word(pdev, off, &r);
315f0b298f8Sjsg 	r |= val;
316f0b298f8Sjsg 	pcie_capability_write_word(pdev, off, r);
317f0b298f8Sjsg 	return 0;
318f0b298f8Sjsg }
319f0b298f8Sjsg 
320f0b298f8Sjsg static inline int
321f0b298f8Sjsg pcie_capability_clear_and_set_word(struct pci_dev *pdev, int off, u16 c, u16 s)
322f0b298f8Sjsg {
323f0b298f8Sjsg 	u16 r;
324f0b298f8Sjsg 	pcie_capability_read_word(pdev, off, &r);
325f0b298f8Sjsg 	r &= ~c;
326f0b298f8Sjsg 	r |= s;
327f0b298f8Sjsg 	pcie_capability_write_word(pdev, off, r);
328f0b298f8Sjsg 	return 0;
329f0b298f8Sjsg }
330f0b298f8Sjsg 
331f0b298f8Sjsg static inline int
332c349dbc7Sjsg pcie_get_readrq(struct pci_dev *pdev)
333c349dbc7Sjsg {
334c349dbc7Sjsg 	uint16_t val;
335c349dbc7Sjsg 
336c349dbc7Sjsg 	pcie_capability_read_word(pdev, PCI_PCIE_DCSR, &val);
337c349dbc7Sjsg 
338c349dbc7Sjsg 	return 128 << ((val & PCI_PCIE_DCSR_MPS) >> 12);
339c349dbc7Sjsg }
340c349dbc7Sjsg 
341c349dbc7Sjsg static inline int
342c349dbc7Sjsg pcie_set_readrq(struct pci_dev *pdev, int rrq)
343c349dbc7Sjsg {
344c349dbc7Sjsg 	uint16_t val;
345c349dbc7Sjsg 
346c349dbc7Sjsg 	pcie_capability_read_word(pdev, PCI_PCIE_DCSR, &val);
347c349dbc7Sjsg 	val &= ~PCI_PCIE_DCSR_MPS;
348c349dbc7Sjsg 	val |= (ffs(rrq) - 8) << 12;
349c349dbc7Sjsg 	return pcie_capability_write_word(pdev, PCI_PCIE_DCSR, val);
350c349dbc7Sjsg }
351c349dbc7Sjsg 
35249261a46Sjsg static inline void
35349261a46Sjsg pci_set_master(struct pci_dev *pdev)
35449261a46Sjsg {
35549261a46Sjsg }
3567f4dd379Sjsg 
35749261a46Sjsg static inline void
35849261a46Sjsg pci_clear_master(struct pci_dev *pdev)
35949261a46Sjsg {
36049261a46Sjsg }
3617f4dd379Sjsg 
36249261a46Sjsg static inline void
36349261a46Sjsg pci_save_state(struct pci_dev *pdev)
36449261a46Sjsg {
36549261a46Sjsg }
36649261a46Sjsg 
36749261a46Sjsg static inline void
36849261a46Sjsg pci_restore_state(struct pci_dev *pdev)
36949261a46Sjsg {
37049261a46Sjsg }
37149261a46Sjsg 
37249261a46Sjsg static inline int
37349261a46Sjsg pci_enable_msi(struct pci_dev *pdev)
37449261a46Sjsg {
37549261a46Sjsg 	return 0;
37649261a46Sjsg }
37749261a46Sjsg 
37849261a46Sjsg static inline void
37949261a46Sjsg pci_disable_msi(struct pci_dev *pdev)
38049261a46Sjsg {
38149261a46Sjsg }
3827f4dd379Sjsg 
3837f4dd379Sjsg typedef enum {
3847f4dd379Sjsg 	PCI_D0,
3857f4dd379Sjsg 	PCI_D1,
3867f4dd379Sjsg 	PCI_D2,
3877f4dd379Sjsg 	PCI_D3hot,
3887f4dd379Sjsg 	PCI_D3cold
3897f4dd379Sjsg } pci_power_t;
3907f4dd379Sjsg 
3917f4dd379Sjsg enum pci_bus_speed {
3927f4dd379Sjsg 	PCIE_SPEED_2_5GT,
3937f4dd379Sjsg 	PCIE_SPEED_5_0GT,
3947f4dd379Sjsg 	PCIE_SPEED_8_0GT,
3957f4dd379Sjsg 	PCIE_SPEED_16_0GT,
3965ca02815Sjsg 	PCIE_SPEED_32_0GT,
3975ca02815Sjsg 	PCIE_SPEED_64_0GT,
3987f4dd379Sjsg 	PCI_SPEED_UNKNOWN
3997f4dd379Sjsg };
4007f4dd379Sjsg 
4017f4dd379Sjsg enum pcie_link_width {
4027f4dd379Sjsg 	PCIE_LNK_X1	= 1,
4037f4dd379Sjsg 	PCIE_LNK_X2	= 2,
4047f4dd379Sjsg 	PCIE_LNK_X4	= 4,
4057f4dd379Sjsg 	PCIE_LNK_X8	= 8,
4067f4dd379Sjsg 	PCIE_LNK_X12	= 12,
4077f4dd379Sjsg 	PCIE_LNK_X16	= 16,
4087f4dd379Sjsg 	PCIE_LNK_X32	= 32,
4097f4dd379Sjsg 	PCIE_LNK_WIDTH_UNKNOWN	= 0xff
4107f4dd379Sjsg };
4117f4dd379Sjsg 
412ad8b1aafSjsg typedef unsigned int pci_ers_result_t;
413ad8b1aafSjsg typedef unsigned int pci_channel_state_t;
414ad8b1aafSjsg 
415ad8b1aafSjsg #define PCI_ERS_RESULT_DISCONNECT	0
416ad8b1aafSjsg #define PCI_ERS_RESULT_RECOVERED	1
417ad8b1aafSjsg 
4187f4dd379Sjsg enum pci_bus_speed pcie_get_speed_cap(struct pci_dev *);
4197f4dd379Sjsg enum pcie_link_width pcie_get_width_cap(struct pci_dev *);
4207f4dd379Sjsg int pci_resize_resource(struct pci_dev *, int, int);
4217f4dd379Sjsg 
422c349dbc7Sjsg static inline void
423c349dbc7Sjsg pcie_bandwidth_available(struct pci_dev *pdev, struct pci_dev **ldev,
424c349dbc7Sjsg     enum pci_bus_speed *speed, enum pcie_link_width *width)
425c349dbc7Sjsg {
426c349dbc7Sjsg 	struct pci_dev *bdev = pdev->bus->self;
427c349dbc7Sjsg 	if (bdev == NULL)
428c349dbc7Sjsg 		return;
429c349dbc7Sjsg 
430c349dbc7Sjsg 	if (speed)
431c349dbc7Sjsg 		*speed = pcie_get_speed_cap(bdev);
432c349dbc7Sjsg 	if (width)
433c349dbc7Sjsg 		*width = pcie_get_width_cap(bdev);
434c349dbc7Sjsg }
435c349dbc7Sjsg 
43649261a46Sjsg static inline int
43749261a46Sjsg pci_enable_device(struct pci_dev *pdev)
43849261a46Sjsg {
43949261a46Sjsg 	return 0;
44049261a46Sjsg }
44149261a46Sjsg 
44249261a46Sjsg static inline void
44349261a46Sjsg pci_disable_device(struct pci_dev *pdev)
44449261a46Sjsg {
44549261a46Sjsg }
44649261a46Sjsg 
4471bb76ff1Sjsg static inline int
4481bb76ff1Sjsg pci_wait_for_pending_transaction(struct pci_dev *pdev)
4491bb76ff1Sjsg {
4501bb76ff1Sjsg 	return 0;
4511bb76ff1Sjsg }
4521bb76ff1Sjsg 
45349261a46Sjsg static inline bool
45449261a46Sjsg pci_is_thunderbolt_attached(struct pci_dev *pdev)
45549261a46Sjsg {
45649261a46Sjsg 	return false;
45749261a46Sjsg }
45849261a46Sjsg 
45949261a46Sjsg static inline void
46049261a46Sjsg pci_set_drvdata(struct pci_dev *pdev, void *data)
46149261a46Sjsg {
462*4f495ac8Sjsg 	dev_set_drvdata(pdev->_dev, data);
463*4f495ac8Sjsg }
464*4f495ac8Sjsg 
465*4f495ac8Sjsg static inline void *
466*4f495ac8Sjsg pci_get_drvdata(struct pci_dev *pdev)
467*4f495ac8Sjsg {
468*4f495ac8Sjsg 	return dev_get_drvdata(pdev->_dev);
46949261a46Sjsg }
4707f4dd379Sjsg 
4717f4dd379Sjsg static inline int
472c349dbc7Sjsg pci_domain_nr(struct pci_bus *pbus)
473c349dbc7Sjsg {
474c349dbc7Sjsg 	return pbus->domain_nr;
475c349dbc7Sjsg }
476c349dbc7Sjsg 
477c349dbc7Sjsg static inline int
478c349dbc7Sjsg pci_irq_vector(struct pci_dev *pdev, unsigned int num)
479c349dbc7Sjsg {
480c349dbc7Sjsg 	return pdev->irq;
481c349dbc7Sjsg }
482c349dbc7Sjsg 
483c349dbc7Sjsg static inline void
484c349dbc7Sjsg pci_free_irq_vectors(struct pci_dev *pdev)
485c349dbc7Sjsg {
486c349dbc7Sjsg }
487c349dbc7Sjsg 
488c349dbc7Sjsg static inline int
4897f4dd379Sjsg pci_set_power_state(struct pci_dev *dev, int state)
4907f4dd379Sjsg {
4917f4dd379Sjsg 	return 0;
4927f4dd379Sjsg }
4937f4dd379Sjsg 
4949342ba5eSkettenis struct pci_driver;
4959342ba5eSkettenis 
4969342ba5eSkettenis static inline int
4979342ba5eSkettenis pci_register_driver(struct pci_driver *pci_drv)
4989342ba5eSkettenis {
4999342ba5eSkettenis 	return 0;
5009342ba5eSkettenis }
5019342ba5eSkettenis 
50249261a46Sjsg static inline void
50349261a46Sjsg pci_unregister_driver(void *d)
50449261a46Sjsg {
50549261a46Sjsg }
50649261a46Sjsg 
507f005ef32Sjsg static inline u16
508f005ef32Sjsg pci_dev_id(struct pci_dev *dev)
509f005ef32Sjsg {
510f005ef32Sjsg 	return dev->devfn | (dev->bus->number << 8);
511f005ef32Sjsg }
512f005ef32Sjsg 
513f005ef32Sjsg static inline const struct pci_device_id *
514f005ef32Sjsg pci_match_id(const struct pci_device_id *ids, struct pci_dev *pdev)
515f005ef32Sjsg {
516f005ef32Sjsg 	int i = 0;
517f005ef32Sjsg 
518f005ef32Sjsg 	for (i = 0; ids[i].vendor != 0; i++) {
519f005ef32Sjsg 		if ((ids[i].vendor == pdev->vendor) &&
520f005ef32Sjsg 		    (ids[i].device == pdev->device ||
521f005ef32Sjsg 		     ids[i].device == PCI_ANY_ID) &&
522f005ef32Sjsg 		    (ids[i].subvendor == PCI_ANY_ID) &&
523f005ef32Sjsg 		    (ids[i].subdevice == PCI_ANY_ID))
524f005ef32Sjsg 			return &ids[i];
525f005ef32Sjsg 	}
526f005ef32Sjsg 	return NULL;
527f005ef32Sjsg }
528f005ef32Sjsg 
5296a77e6adSkettenis #define PCI_CLASS_DISPLAY_VGA \
5305ca02815Sjsg     ((PCI_CLASS_DISPLAY << 8) | PCI_SUBCLASS_DISPLAY_VGA)
5316a77e6adSkettenis #define PCI_CLASS_DISPLAY_OTHER \
5325ca02815Sjsg     ((PCI_CLASS_DISPLAY << 8) | PCI_SUBCLASS_DISPLAY_MISC)
533f005ef32Sjsg #define PCI_CLASS_ACCELERATOR_PROCESSING \
534f005ef32Sjsg     (PCI_CLASS_ACCELERATOR << 8)
5356a77e6adSkettenis 
536cc2e793aSkettenis static inline int
537cc2e793aSkettenis pci_device_is_present(struct pci_dev *pdev)
538cc2e793aSkettenis {
539cc2e793aSkettenis 	return 1;
540cc2e793aSkettenis }
541cc2e793aSkettenis 
542c1a0e5c3Skettenis #endif /* _LINUX_PCI_H_ */
543