xref: /openbmc/linux/arch/powerpc/include/asm/pci-bridge.h (revision b8b572e1015f81b4e748417be2629dfe51ab99f9)
1*b8b572e1SStephen Rothwell #ifndef _ASM_POWERPC_PCI_BRIDGE_H
2*b8b572e1SStephen Rothwell #define _ASM_POWERPC_PCI_BRIDGE_H
3*b8b572e1SStephen Rothwell #ifdef __KERNEL__
4*b8b572e1SStephen Rothwell /*
5*b8b572e1SStephen Rothwell  * This program is free software; you can redistribute it and/or
6*b8b572e1SStephen Rothwell  * modify it under the terms of the GNU General Public License
7*b8b572e1SStephen Rothwell  * as published by the Free Software Foundation; either version
8*b8b572e1SStephen Rothwell  * 2 of the License, or (at your option) any later version.
9*b8b572e1SStephen Rothwell  */
10*b8b572e1SStephen Rothwell #include <linux/pci.h>
11*b8b572e1SStephen Rothwell #include <linux/list.h>
12*b8b572e1SStephen Rothwell #include <linux/ioport.h>
13*b8b572e1SStephen Rothwell 
14*b8b572e1SStephen Rothwell struct device_node;
15*b8b572e1SStephen Rothwell 
16*b8b572e1SStephen Rothwell extern unsigned int ppc_pci_flags;
17*b8b572e1SStephen Rothwell enum {
18*b8b572e1SStephen Rothwell 	/* Force re-assigning all resources (ignore firmware
19*b8b572e1SStephen Rothwell 	 * setup completely)
20*b8b572e1SStephen Rothwell 	 */
21*b8b572e1SStephen Rothwell 	PPC_PCI_REASSIGN_ALL_RSRC	= 0x00000001,
22*b8b572e1SStephen Rothwell 
23*b8b572e1SStephen Rothwell 	/* Re-assign all bus numbers */
24*b8b572e1SStephen Rothwell 	PPC_PCI_REASSIGN_ALL_BUS	= 0x00000002,
25*b8b572e1SStephen Rothwell 
26*b8b572e1SStephen Rothwell 	/* Do not try to assign, just use existing setup */
27*b8b572e1SStephen Rothwell 	PPC_PCI_PROBE_ONLY		= 0x00000004,
28*b8b572e1SStephen Rothwell 
29*b8b572e1SStephen Rothwell 	/* Don't bother with ISA alignment unless the bridge has
30*b8b572e1SStephen Rothwell 	 * ISA forwarding enabled
31*b8b572e1SStephen Rothwell 	 */
32*b8b572e1SStephen Rothwell 	PPC_PCI_CAN_SKIP_ISA_ALIGN	= 0x00000008,
33*b8b572e1SStephen Rothwell 
34*b8b572e1SStephen Rothwell 	/* Enable domain numbers in /proc */
35*b8b572e1SStephen Rothwell 	PPC_PCI_ENABLE_PROC_DOMAINS	= 0x00000010,
36*b8b572e1SStephen Rothwell 	/* ... except for domain 0 */
37*b8b572e1SStephen Rothwell 	PPC_PCI_COMPAT_DOMAIN_0		= 0x00000020,
38*b8b572e1SStephen Rothwell };
39*b8b572e1SStephen Rothwell 
40*b8b572e1SStephen Rothwell 
41*b8b572e1SStephen Rothwell /*
42*b8b572e1SStephen Rothwell  * Structure of a PCI controller (host bridge)
43*b8b572e1SStephen Rothwell  */
44*b8b572e1SStephen Rothwell struct pci_controller {
45*b8b572e1SStephen Rothwell 	struct pci_bus *bus;
46*b8b572e1SStephen Rothwell 	char is_dynamic;
47*b8b572e1SStephen Rothwell #ifdef CONFIG_PPC64
48*b8b572e1SStephen Rothwell 	int node;
49*b8b572e1SStephen Rothwell #endif
50*b8b572e1SStephen Rothwell 	struct device_node *dn;
51*b8b572e1SStephen Rothwell 	struct list_head list_node;
52*b8b572e1SStephen Rothwell 	struct device *parent;
53*b8b572e1SStephen Rothwell 
54*b8b572e1SStephen Rothwell 	int first_busno;
55*b8b572e1SStephen Rothwell 	int last_busno;
56*b8b572e1SStephen Rothwell #ifndef CONFIG_PPC64
57*b8b572e1SStephen Rothwell 	int self_busno;
58*b8b572e1SStephen Rothwell #endif
59*b8b572e1SStephen Rothwell 
60*b8b572e1SStephen Rothwell 	void __iomem *io_base_virt;
61*b8b572e1SStephen Rothwell #ifdef CONFIG_PPC64
62*b8b572e1SStephen Rothwell 	void *io_base_alloc;
63*b8b572e1SStephen Rothwell #endif
64*b8b572e1SStephen Rothwell 	resource_size_t io_base_phys;
65*b8b572e1SStephen Rothwell #ifndef CONFIG_PPC64
66*b8b572e1SStephen Rothwell 	resource_size_t pci_io_size;
67*b8b572e1SStephen Rothwell #endif
68*b8b572e1SStephen Rothwell 
69*b8b572e1SStephen Rothwell 	/* Some machines (PReP) have a non 1:1 mapping of
70*b8b572e1SStephen Rothwell 	 * the PCI memory space in the CPU bus space
71*b8b572e1SStephen Rothwell 	 */
72*b8b572e1SStephen Rothwell 	resource_size_t pci_mem_offset;
73*b8b572e1SStephen Rothwell #ifdef CONFIG_PPC64
74*b8b572e1SStephen Rothwell 	unsigned long pci_io_size;
75*b8b572e1SStephen Rothwell #endif
76*b8b572e1SStephen Rothwell 
77*b8b572e1SStephen Rothwell 	struct pci_ops *ops;
78*b8b572e1SStephen Rothwell 	unsigned int __iomem *cfg_addr;
79*b8b572e1SStephen Rothwell 	void __iomem *cfg_data;
80*b8b572e1SStephen Rothwell 
81*b8b572e1SStephen Rothwell #ifndef CONFIG_PPC64
82*b8b572e1SStephen Rothwell 	/*
83*b8b572e1SStephen Rothwell 	 * Used for variants of PCI indirect handling and possible quirks:
84*b8b572e1SStephen Rothwell 	 *  SET_CFG_TYPE - used on 4xx or any PHB that does explicit type0/1
85*b8b572e1SStephen Rothwell 	 *  EXT_REG - provides access to PCI-e extended registers
86*b8b572e1SStephen Rothwell 	 *  SURPRESS_PRIMARY_BUS - we surpress the setting of PCI_PRIMARY_BUS
87*b8b572e1SStephen Rothwell 	 *   on Freescale PCI-e controllers since they used the PCI_PRIMARY_BUS
88*b8b572e1SStephen Rothwell 	 *   to determine which bus number to match on when generating type0
89*b8b572e1SStephen Rothwell 	 *   config cycles
90*b8b572e1SStephen Rothwell 	 *  NO_PCIE_LINK - the Freescale PCI-e controllers have issues with
91*b8b572e1SStephen Rothwell 	 *   hanging if we don't have link and try to do config cycles to
92*b8b572e1SStephen Rothwell 	 *   anything but the PHB.  Only allow talking to the PHB if this is
93*b8b572e1SStephen Rothwell 	 *   set.
94*b8b572e1SStephen Rothwell 	 *  BIG_ENDIAN - cfg_addr is a big endian register
95*b8b572e1SStephen Rothwell 	 *  BROKEN_MRM - the 440EPx/GRx chips have an errata that causes hangs on
96*b8b572e1SStephen Rothwell 	 *   the PLB4.  Effectively disable MRM commands by setting this.
97*b8b572e1SStephen Rothwell 	 */
98*b8b572e1SStephen Rothwell #define PPC_INDIRECT_TYPE_SET_CFG_TYPE		0x00000001
99*b8b572e1SStephen Rothwell #define PPC_INDIRECT_TYPE_EXT_REG		0x00000002
100*b8b572e1SStephen Rothwell #define PPC_INDIRECT_TYPE_SURPRESS_PRIMARY_BUS	0x00000004
101*b8b572e1SStephen Rothwell #define PPC_INDIRECT_TYPE_NO_PCIE_LINK		0x00000008
102*b8b572e1SStephen Rothwell #define PPC_INDIRECT_TYPE_BIG_ENDIAN		0x00000010
103*b8b572e1SStephen Rothwell #define PPC_INDIRECT_TYPE_BROKEN_MRM		0x00000020
104*b8b572e1SStephen Rothwell 	u32 indirect_type;
105*b8b572e1SStephen Rothwell #endif	/* !CONFIG_PPC64 */
106*b8b572e1SStephen Rothwell 	/* Currently, we limit ourselves to 1 IO range and 3 mem
107*b8b572e1SStephen Rothwell 	 * ranges since the common pci_bus structure can't handle more
108*b8b572e1SStephen Rothwell 	 */
109*b8b572e1SStephen Rothwell 	struct resource	io_resource;
110*b8b572e1SStephen Rothwell 	struct resource mem_resources[3];
111*b8b572e1SStephen Rothwell 	int global_number;		/* PCI domain number */
112*b8b572e1SStephen Rothwell #ifdef CONFIG_PPC64
113*b8b572e1SStephen Rothwell 	unsigned long buid;
114*b8b572e1SStephen Rothwell 	unsigned long dma_window_base_cur;
115*b8b572e1SStephen Rothwell 	unsigned long dma_window_size;
116*b8b572e1SStephen Rothwell 
117*b8b572e1SStephen Rothwell 	void *private_data;
118*b8b572e1SStephen Rothwell #endif	/* CONFIG_PPC64 */
119*b8b572e1SStephen Rothwell };
120*b8b572e1SStephen Rothwell 
121*b8b572e1SStephen Rothwell #ifndef CONFIG_PPC64
122*b8b572e1SStephen Rothwell 
123*b8b572e1SStephen Rothwell static inline struct pci_controller *pci_bus_to_host(const struct pci_bus *bus)
124*b8b572e1SStephen Rothwell {
125*b8b572e1SStephen Rothwell 	return bus->sysdata;
126*b8b572e1SStephen Rothwell }
127*b8b572e1SStephen Rothwell 
128*b8b572e1SStephen Rothwell static inline int isa_vaddr_is_ioport(void __iomem *address)
129*b8b572e1SStephen Rothwell {
130*b8b572e1SStephen Rothwell 	/* No specific ISA handling on ppc32 at this stage, it
131*b8b572e1SStephen Rothwell 	 * all goes through PCI
132*b8b572e1SStephen Rothwell 	 */
133*b8b572e1SStephen Rothwell 	return 0;
134*b8b572e1SStephen Rothwell }
135*b8b572e1SStephen Rothwell 
136*b8b572e1SStephen Rothwell /* These are used for config access before all the PCI probing
137*b8b572e1SStephen Rothwell    has been done. */
138*b8b572e1SStephen Rothwell extern int early_read_config_byte(struct pci_controller *hose, int bus,
139*b8b572e1SStephen Rothwell 			int dev_fn, int where, u8 *val);
140*b8b572e1SStephen Rothwell extern int early_read_config_word(struct pci_controller *hose, int bus,
141*b8b572e1SStephen Rothwell 			int dev_fn, int where, u16 *val);
142*b8b572e1SStephen Rothwell extern int early_read_config_dword(struct pci_controller *hose, int bus,
143*b8b572e1SStephen Rothwell 			int dev_fn, int where, u32 *val);
144*b8b572e1SStephen Rothwell extern int early_write_config_byte(struct pci_controller *hose, int bus,
145*b8b572e1SStephen Rothwell 			int dev_fn, int where, u8 val);
146*b8b572e1SStephen Rothwell extern int early_write_config_word(struct pci_controller *hose, int bus,
147*b8b572e1SStephen Rothwell 			int dev_fn, int where, u16 val);
148*b8b572e1SStephen Rothwell extern int early_write_config_dword(struct pci_controller *hose, int bus,
149*b8b572e1SStephen Rothwell 			int dev_fn, int where, u32 val);
150*b8b572e1SStephen Rothwell 
151*b8b572e1SStephen Rothwell extern int early_find_capability(struct pci_controller *hose, int bus,
152*b8b572e1SStephen Rothwell 				 int dev_fn, int cap);
153*b8b572e1SStephen Rothwell 
154*b8b572e1SStephen Rothwell extern void setup_indirect_pci(struct pci_controller* hose,
155*b8b572e1SStephen Rothwell 			       resource_size_t cfg_addr,
156*b8b572e1SStephen Rothwell 			       resource_size_t cfg_data, u32 flags);
157*b8b572e1SStephen Rothwell extern void setup_grackle(struct pci_controller *hose);
158*b8b572e1SStephen Rothwell #else	/* CONFIG_PPC64 */
159*b8b572e1SStephen Rothwell 
160*b8b572e1SStephen Rothwell /*
161*b8b572e1SStephen Rothwell  * PCI stuff, for nodes representing PCI devices, pointed to
162*b8b572e1SStephen Rothwell  * by device_node->data.
163*b8b572e1SStephen Rothwell  */
164*b8b572e1SStephen Rothwell struct iommu_table;
165*b8b572e1SStephen Rothwell 
166*b8b572e1SStephen Rothwell struct pci_dn {
167*b8b572e1SStephen Rothwell 	int	busno;			/* pci bus number */
168*b8b572e1SStephen Rothwell 	int	devfn;			/* pci device and function number */
169*b8b572e1SStephen Rothwell 
170*b8b572e1SStephen Rothwell 	struct  pci_controller *phb;	/* for pci devices */
171*b8b572e1SStephen Rothwell 	struct	iommu_table *iommu_table;	/* for phb's or bridges */
172*b8b572e1SStephen Rothwell 	struct	device_node *node;	/* back-pointer to the device_node */
173*b8b572e1SStephen Rothwell 
174*b8b572e1SStephen Rothwell 	int	pci_ext_config_space;	/* for pci devices */
175*b8b572e1SStephen Rothwell 
176*b8b572e1SStephen Rothwell #ifdef CONFIG_EEH
177*b8b572e1SStephen Rothwell 	struct	pci_dev *pcidev;	/* back-pointer to the pci device */
178*b8b572e1SStephen Rothwell 	int	class_code;		/* pci device class */
179*b8b572e1SStephen Rothwell 	int	eeh_mode;		/* See eeh.h for possible EEH_MODEs */
180*b8b572e1SStephen Rothwell 	int	eeh_config_addr;
181*b8b572e1SStephen Rothwell 	int	eeh_pe_config_addr; /* new-style partition endpoint address */
182*b8b572e1SStephen Rothwell 	int	eeh_check_count;	/* # times driver ignored error */
183*b8b572e1SStephen Rothwell 	int	eeh_freeze_count;	/* # times this device froze up. */
184*b8b572e1SStephen Rothwell 	int	eeh_false_positives;	/* # times this device reported #ff's */
185*b8b572e1SStephen Rothwell 	u32	config_space[16];	/* saved PCI config space */
186*b8b572e1SStephen Rothwell #endif
187*b8b572e1SStephen Rothwell };
188*b8b572e1SStephen Rothwell 
189*b8b572e1SStephen Rothwell /* Get the pointer to a device_node's pci_dn */
190*b8b572e1SStephen Rothwell #define PCI_DN(dn)	((struct pci_dn *) (dn)->data)
191*b8b572e1SStephen Rothwell 
192*b8b572e1SStephen Rothwell extern struct device_node *fetch_dev_dn(struct pci_dev *dev);
193*b8b572e1SStephen Rothwell 
194*b8b572e1SStephen Rothwell /* Get a device_node from a pci_dev.  This code must be fast except
195*b8b572e1SStephen Rothwell  * in the case where the sysdata is incorrect and needs to be fixed
196*b8b572e1SStephen Rothwell  * up (this will only happen once).
197*b8b572e1SStephen Rothwell  * In this case the sysdata will have been inherited from a PCI host
198*b8b572e1SStephen Rothwell  * bridge or a PCI-PCI bridge further up the tree, so it will point
199*b8b572e1SStephen Rothwell  * to a valid struct pci_dn, just not the one we want.
200*b8b572e1SStephen Rothwell  */
201*b8b572e1SStephen Rothwell static inline struct device_node *pci_device_to_OF_node(struct pci_dev *dev)
202*b8b572e1SStephen Rothwell {
203*b8b572e1SStephen Rothwell 	struct device_node *dn = dev->sysdata;
204*b8b572e1SStephen Rothwell 	struct pci_dn *pdn = dn->data;
205*b8b572e1SStephen Rothwell 
206*b8b572e1SStephen Rothwell 	if (pdn && pdn->devfn == dev->devfn && pdn->busno == dev->bus->number)
207*b8b572e1SStephen Rothwell 		return dn;	/* fast path.  sysdata is good */
208*b8b572e1SStephen Rothwell 	return fetch_dev_dn(dev);
209*b8b572e1SStephen Rothwell }
210*b8b572e1SStephen Rothwell 
211*b8b572e1SStephen Rothwell static inline int pci_device_from_OF_node(struct device_node *np,
212*b8b572e1SStephen Rothwell 					  u8 *bus, u8 *devfn)
213*b8b572e1SStephen Rothwell {
214*b8b572e1SStephen Rothwell 	if (!PCI_DN(np))
215*b8b572e1SStephen Rothwell 		return -ENODEV;
216*b8b572e1SStephen Rothwell 	*bus = PCI_DN(np)->busno;
217*b8b572e1SStephen Rothwell 	*devfn = PCI_DN(np)->devfn;
218*b8b572e1SStephen Rothwell 	return 0;
219*b8b572e1SStephen Rothwell }
220*b8b572e1SStephen Rothwell 
221*b8b572e1SStephen Rothwell static inline struct device_node *pci_bus_to_OF_node(struct pci_bus *bus)
222*b8b572e1SStephen Rothwell {
223*b8b572e1SStephen Rothwell 	if (bus->self)
224*b8b572e1SStephen Rothwell 		return pci_device_to_OF_node(bus->self);
225*b8b572e1SStephen Rothwell 	else
226*b8b572e1SStephen Rothwell 		return bus->sysdata; /* Must be root bus (PHB) */
227*b8b572e1SStephen Rothwell }
228*b8b572e1SStephen Rothwell 
229*b8b572e1SStephen Rothwell /** Find the bus corresponding to the indicated device node */
230*b8b572e1SStephen Rothwell extern struct pci_bus *pcibios_find_pci_bus(struct device_node *dn);
231*b8b572e1SStephen Rothwell 
232*b8b572e1SStephen Rothwell /** Remove all of the PCI devices under this bus */
233*b8b572e1SStephen Rothwell extern void pcibios_remove_pci_devices(struct pci_bus *bus);
234*b8b572e1SStephen Rothwell 
235*b8b572e1SStephen Rothwell /** Discover new pci devices under this bus, and add them */
236*b8b572e1SStephen Rothwell extern void pcibios_add_pci_devices(struct pci_bus *bus);
237*b8b572e1SStephen Rothwell extern void pcibios_fixup_new_pci_devices(struct pci_bus *bus);
238*b8b572e1SStephen Rothwell 
239*b8b572e1SStephen Rothwell extern int pcibios_remove_root_bus(struct pci_controller *phb);
240*b8b572e1SStephen Rothwell 
241*b8b572e1SStephen Rothwell static inline struct pci_controller *pci_bus_to_host(const struct pci_bus *bus)
242*b8b572e1SStephen Rothwell {
243*b8b572e1SStephen Rothwell 	struct device_node *busdn = bus->sysdata;
244*b8b572e1SStephen Rothwell 
245*b8b572e1SStephen Rothwell 	BUG_ON(busdn == NULL);
246*b8b572e1SStephen Rothwell 	return PCI_DN(busdn)->phb;
247*b8b572e1SStephen Rothwell }
248*b8b572e1SStephen Rothwell 
249*b8b572e1SStephen Rothwell 
250*b8b572e1SStephen Rothwell extern void isa_bridge_find_early(struct pci_controller *hose);
251*b8b572e1SStephen Rothwell 
252*b8b572e1SStephen Rothwell static inline int isa_vaddr_is_ioport(void __iomem *address)
253*b8b572e1SStephen Rothwell {
254*b8b572e1SStephen Rothwell 	/* Check if address hits the reserved legacy IO range */
255*b8b572e1SStephen Rothwell 	unsigned long ea = (unsigned long)address;
256*b8b572e1SStephen Rothwell 	return ea >= ISA_IO_BASE && ea < ISA_IO_END;
257*b8b572e1SStephen Rothwell }
258*b8b572e1SStephen Rothwell 
259*b8b572e1SStephen Rothwell extern int pcibios_unmap_io_space(struct pci_bus *bus);
260*b8b572e1SStephen Rothwell extern int pcibios_map_io_space(struct pci_bus *bus);
261*b8b572e1SStephen Rothwell 
262*b8b572e1SStephen Rothwell /* Return values for ppc_md.pci_probe_mode function */
263*b8b572e1SStephen Rothwell #define PCI_PROBE_NONE		-1	/* Don't look at this bus at all */
264*b8b572e1SStephen Rothwell #define PCI_PROBE_NORMAL	0	/* Do normal PCI probing */
265*b8b572e1SStephen Rothwell #define PCI_PROBE_DEVTREE	1	/* Instantiate from device tree */
266*b8b572e1SStephen Rothwell 
267*b8b572e1SStephen Rothwell #ifdef CONFIG_NUMA
268*b8b572e1SStephen Rothwell #define PHB_SET_NODE(PHB, NODE)		((PHB)->node = (NODE))
269*b8b572e1SStephen Rothwell #else
270*b8b572e1SStephen Rothwell #define PHB_SET_NODE(PHB, NODE)		((PHB)->node = -1)
271*b8b572e1SStephen Rothwell #endif
272*b8b572e1SStephen Rothwell 
273*b8b572e1SStephen Rothwell #endif	/* CONFIG_PPC64 */
274*b8b572e1SStephen Rothwell 
275*b8b572e1SStephen Rothwell /* Get the PCI host controller for an OF device */
276*b8b572e1SStephen Rothwell extern struct pci_controller *pci_find_hose_for_OF_device(
277*b8b572e1SStephen Rothwell 			struct device_node* node);
278*b8b572e1SStephen Rothwell 
279*b8b572e1SStephen Rothwell /* Fill up host controller resources from the OF node */
280*b8b572e1SStephen Rothwell extern void pci_process_bridge_OF_ranges(struct pci_controller *hose,
281*b8b572e1SStephen Rothwell 			struct device_node *dev, int primary);
282*b8b572e1SStephen Rothwell 
283*b8b572e1SStephen Rothwell /* Allocate & free a PCI host bridge structure */
284*b8b572e1SStephen Rothwell extern struct pci_controller *pcibios_alloc_controller(struct device_node *dev);
285*b8b572e1SStephen Rothwell extern void pcibios_free_controller(struct pci_controller *phb);
286*b8b572e1SStephen Rothwell 
287*b8b572e1SStephen Rothwell #ifdef CONFIG_PCI
288*b8b572e1SStephen Rothwell extern unsigned long pci_address_to_pio(phys_addr_t address);
289*b8b572e1SStephen Rothwell extern int pcibios_vaddr_is_ioport(void __iomem *address);
290*b8b572e1SStephen Rothwell #else
291*b8b572e1SStephen Rothwell static inline unsigned long pci_address_to_pio(phys_addr_t address)
292*b8b572e1SStephen Rothwell {
293*b8b572e1SStephen Rothwell 	return (unsigned long)-1;
294*b8b572e1SStephen Rothwell }
295*b8b572e1SStephen Rothwell static inline int pcibios_vaddr_is_ioport(void __iomem *address)
296*b8b572e1SStephen Rothwell {
297*b8b572e1SStephen Rothwell 	return 0;
298*b8b572e1SStephen Rothwell }
299*b8b572e1SStephen Rothwell #endif	/* CONFIG_PCI */
300*b8b572e1SStephen Rothwell 
301*b8b572e1SStephen Rothwell #endif	/* __KERNEL__ */
302*b8b572e1SStephen Rothwell #endif	/* _ASM_POWERPC_PCI_BRIDGE_H */
303