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