1 /* SPDX-License-Identifier: GPL-2.0-only */
4 * PCI defines and function prototypes
5 * Copyright 1994, Drew Eckhardt
6 * Copyright 1997--1999 Martin Mares <mj@atrey.karlin.mff.cuni.cz>
8 * For more information, please consult the following manuals (look at
9 * http://www.pcisig.com/ for how to get them):
11 * PCI BIOS Specification
12 * PCI Local Bus Specification
13 * PCI to PCI Bridge Specification
14 * PCI System Design Guide
22 /* When <device/pci.h> is needed, it supposed to provide <device/pci_{def,type}.h> */
23 #include <device/device.h>
24 #include <device/pci_def.h> /* IWYU pragma: export */
25 #include <device/pci_ops.h>
26 #include <device/pci_rom.h>
27 #include <device/pci_type.h> /* IWYU pragma: export */
31 /* Common pci operations without a standard interface */
32 struct pci_operations
{
33 /* set the Subsystem IDs for the PCI device */
34 void (*set_subsystem
)(struct device
*dev
, unsigned int vendor
,
36 void (*get_ltr_max_latencies
)(u16
*max_snoop
, u16
*max_nosnoop
);
40 const struct device_operations
*ops
;
41 unsigned short vendor
;
42 unsigned short device
;
43 const unsigned short *devices
;
61 #define __pci_driver __attribute__((used, __section__(".rodata.pci_driver")))
63 #define __pci_driver __attribute__((unused))
66 /** start of compile time generated pci driver array */
67 extern struct pci_driver _pci_drivers
[];
68 /** end of compile time generated pci driver array */
69 extern struct pci_driver _epci_drivers
[];
71 /* Set Subsystem ID operation for PCI devices */
72 extern struct pci_operations pci_dev_ops_pci
;
73 extern struct device_operations default_pci_ops_dev
;
74 extern struct device_operations default_pci_ops_bus
;
76 void pci_dev_read_resources(struct device
*dev
);
77 void pci_bus_read_resources(struct device
*dev
);
78 void pci_dev_set_resources(struct device
*dev
);
79 void pci_dev_enable_resources(struct device
*dev
);
80 void pci_bus_enable_resources(struct device
*dev
);
81 void pci_bus_reset(struct bus
*bus
);
82 struct device
*pci_probe_dev(struct device
*dev
, struct bus
*bus
,
84 void do_pci_scan_bridge(struct device
*dev
,
85 void (*do_scan_bus
)(struct bus
*bus
,
86 unsigned int min_devfn
, unsigned int max_devfn
));
88 void pci_scan_bridge(struct device
*bus
);
89 void pci_scan_bus(struct bus
*bus
, unsigned int min_devfn
,
90 unsigned int max_devfn
);
92 uint8_t pci_moving_config8(struct device
*dev
, unsigned int reg
);
93 uint16_t pci_moving_config16(struct device
*dev
, unsigned int reg
);
94 uint32_t pci_moving_config32(struct device
*dev
, unsigned int reg
);
95 struct resource
*pci_get_resource(struct device
*dev
, unsigned long index
);
96 void pci_dev_set_subsystem(struct device
*dev
, unsigned int vendor
,
98 void pci_dev_init(struct device
*dev
);
99 unsigned int pci_match_simple_dev(struct device
*dev
, pci_devfn_t sdev
);
100 uint16_t pci_find_cap_recursive(const struct device
*dev
, uint16_t cap
);
101 bool pci_has_pme_pin(const struct device
*dev
);
103 const char *pin_to_str(int pin
);
104 int get_pci_irq_pins(struct device
*dev
, struct device
**parent_bdg
);
105 void pci_assign_irqs(struct device
*dev
, const unsigned char pIntAtoD
[4]);
106 const char *get_pci_class_name(struct device
*dev
);
107 const char *get_pci_subclass_name(struct device
*dev
);
109 size_t pci_msix_table_size(struct device
*dev
);
110 int pci_msix_table_bar(struct device
*dev
, u32
*offset
, u8
*idx
);
111 struct msix_entry
*pci_msix_get_table(struct device
*dev
);
113 #define PCI_IO_BRIDGE_ALIGN 4096
114 #define PCI_MEM_BRIDGE_ALIGN (1024*1024)
116 #define PCI_ID(VENDOR_ID, DEVICE_ID) \
117 ((((DEVICE_ID) & 0xFFFF) << 16) | ((VENDOR_ID) & 0xFFFF))
119 pci_devfn_t
pci_locate_device(unsigned int pci_id
, pci_devfn_t dev
);
120 pci_devfn_t
pci_locate_device_on_bus(unsigned int pci_id
, unsigned int bus
);
122 void pci_s_assert_secondary_reset(pci_devfn_t p2p_bridge
);
123 void pci_s_deassert_secondary_reset(pci_devfn_t p2p_bridge
);
124 void pci_s_bridge_set_secondary(pci_devfn_t p2p_bridge
, u8 secondary
);
126 int pci_early_device_probe(u8 bus
, u8 dev
, u32 mmio_base
);
128 static inline int pci_base_address_is_memory_space(unsigned int attr
)
130 return (attr
& PCI_BASE_ADDRESS_SPACE
) == PCI_BASE_ADDRESS_SPACE_MEMORY
;
133 void pci_dev_disable_bus_master(const struct device
*dev
);
135 static __always_inline
136 #if ENV_PCI_SIMPLE_DEVICE
137 void pci_dev_request_bus_master(pci_devfn_t dev
)
139 void pci_dev_request_bus_master(struct device
*dev
)
140 #endif /* ENV_PCI_SIMPLE_DEVICE */
142 if (CONFIG(PCI_ALLOW_BUS_MASTER_ANY_DEVICE
))
143 pci_or_config16(dev
, PCI_COMMAND
, PCI_COMMAND_MASTER
);
146 #endif /* CONFIG_PCI */
148 void pci_early_bridge_init(void);