xref: /openbmc/linux/arch/sparc/kernel/pci_impl.h (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
2a88b5ba8SSam Ravnborg /* pci_impl.h: Helper definitions for PCI controller support.
3a88b5ba8SSam Ravnborg  *
4a88b5ba8SSam Ravnborg  * Copyright (C) 1999, 2007 David S. Miller (davem@davemloft.net)
5a88b5ba8SSam Ravnborg  */
6a88b5ba8SSam Ravnborg 
7a88b5ba8SSam Ravnborg #ifndef PCI_IMPL_H
8a88b5ba8SSam Ravnborg #define PCI_IMPL_H
9a88b5ba8SSam Ravnborg 
10a88b5ba8SSam Ravnborg #include <linux/types.h>
11a88b5ba8SSam Ravnborg #include <linux/spinlock.h>
12a88b5ba8SSam Ravnborg #include <linux/pci.h>
13a88b5ba8SSam Ravnborg #include <linux/msi.h>
14a88b5ba8SSam Ravnborg #include <asm/io.h>
15a88b5ba8SSam Ravnborg #include <asm/prom.h>
16a88b5ba8SSam Ravnborg #include <asm/iommu.h>
17a88b5ba8SSam Ravnborg 
18a88b5ba8SSam Ravnborg /* The abstraction used here is that there are PCI controllers,
19a88b5ba8SSam Ravnborg  * each with one (Sabre) or two (PSYCHO/SCHIZO) PCI bus modules
20a88b5ba8SSam Ravnborg  * underneath.  Each PCI bus module uses an IOMMU (shared by both
21a88b5ba8SSam Ravnborg  * PBMs of a controller, or per-PBM), and if a streaming buffer
22a88b5ba8SSam Ravnborg  * is present, each PCI bus module has it's own. (ie. the IOMMU
23a88b5ba8SSam Ravnborg  * might be shared between PBMs, the STC is never shared)
24a88b5ba8SSam Ravnborg  * Furthermore, each PCI bus module controls it's own autonomous
25a88b5ba8SSam Ravnborg  * PCI bus.
26a88b5ba8SSam Ravnborg  */
27a88b5ba8SSam Ravnborg 
28a88b5ba8SSam Ravnborg #define PCI_STC_FLUSHFLAG_INIT(STC) \
29a88b5ba8SSam Ravnborg 	(*((STC)->strbuf_flushflag) = 0UL)
30a88b5ba8SSam Ravnborg #define PCI_STC_FLUSHFLAG_SET(STC) \
31a88b5ba8SSam Ravnborg 	(*((STC)->strbuf_flushflag) != 0UL)
32a88b5ba8SSam Ravnborg 
33a88b5ba8SSam Ravnborg #ifdef CONFIG_PCI_MSI
34a88b5ba8SSam Ravnborg struct pci_pbm_info;
35a88b5ba8SSam Ravnborg struct sparc64_msiq_ops {
36a88b5ba8SSam Ravnborg 	int (*get_head)(struct pci_pbm_info *pbm, unsigned long msiqid,
37a88b5ba8SSam Ravnborg 			unsigned long *head);
38a88b5ba8SSam Ravnborg 	int (*dequeue_msi)(struct pci_pbm_info *pbm, unsigned long msiqid,
39a88b5ba8SSam Ravnborg 			   unsigned long *head, unsigned long *msi);
40a88b5ba8SSam Ravnborg 	int (*set_head)(struct pci_pbm_info *pbm, unsigned long msiqid,
41a88b5ba8SSam Ravnborg 			unsigned long head);
42a88b5ba8SSam Ravnborg 	int (*msi_setup)(struct pci_pbm_info *pbm, unsigned long msiqid,
43a88b5ba8SSam Ravnborg 			 unsigned long msi, int is_msi64);
44a88b5ba8SSam Ravnborg 	int (*msi_teardown)(struct pci_pbm_info *pbm, unsigned long msi);
45a88b5ba8SSam Ravnborg 	int (*msiq_alloc)(struct pci_pbm_info *pbm);
46a88b5ba8SSam Ravnborg 	void (*msiq_free)(struct pci_pbm_info *pbm);
47a88b5ba8SSam Ravnborg 	int (*msiq_build_irq)(struct pci_pbm_info *pbm, unsigned long msiqid,
48a88b5ba8SSam Ravnborg 			      unsigned long devino);
49a88b5ba8SSam Ravnborg };
50a88b5ba8SSam Ravnborg 
512e74a74fSSam Ravnborg void sparc64_pbm_msi_init(struct pci_pbm_info *pbm,
52a88b5ba8SSam Ravnborg 			  const struct sparc64_msiq_ops *ops);
53a88b5ba8SSam Ravnborg 
54a88b5ba8SSam Ravnborg struct sparc64_msiq_cookie {
55a88b5ba8SSam Ravnborg 	struct pci_pbm_info *pbm;
56a88b5ba8SSam Ravnborg 	unsigned long msiqid;
57a88b5ba8SSam Ravnborg };
58a88b5ba8SSam Ravnborg #endif
59a88b5ba8SSam Ravnborg 
60a88b5ba8SSam Ravnborg struct pci_pbm_info {
61a88b5ba8SSam Ravnborg 	struct pci_pbm_info		*next;
62a88b5ba8SSam Ravnborg 	struct pci_pbm_info		*sibling;
63a88b5ba8SSam Ravnborg 	int				index;
64a88b5ba8SSam Ravnborg 
65a88b5ba8SSam Ravnborg 	/* Physical address base of controller registers. */
66a88b5ba8SSam Ravnborg 	unsigned long			controller_regs;
67a88b5ba8SSam Ravnborg 
68a88b5ba8SSam Ravnborg 	/* Physical address base of PBM registers. */
69a88b5ba8SSam Ravnborg 	unsigned long			pbm_regs;
70a88b5ba8SSam Ravnborg 
71a88b5ba8SSam Ravnborg 	/* Physical address of DMA sync register, if any.  */
72a88b5ba8SSam Ravnborg 	unsigned long			sync_reg;
73a88b5ba8SSam Ravnborg 
74a88b5ba8SSam Ravnborg 	/* Opaque 32-bit system bus Port ID. */
75a88b5ba8SSam Ravnborg 	u32				portid;
76a88b5ba8SSam Ravnborg 
77a88b5ba8SSam Ravnborg 	/* Opaque 32-bit handle used for hypervisor calls.  */
78a88b5ba8SSam Ravnborg 	u32				devhandle;
79a88b5ba8SSam Ravnborg 
80a88b5ba8SSam Ravnborg 	/* Chipset version information. */
81a88b5ba8SSam Ravnborg 	int				chip_type;
82a88b5ba8SSam Ravnborg #define PBM_CHIP_TYPE_SABRE		1
83a88b5ba8SSam Ravnborg #define PBM_CHIP_TYPE_PSYCHO		2
84a88b5ba8SSam Ravnborg #define PBM_CHIP_TYPE_SCHIZO		3
85a88b5ba8SSam Ravnborg #define PBM_CHIP_TYPE_SCHIZO_PLUS	4
86a88b5ba8SSam Ravnborg #define PBM_CHIP_TYPE_TOMATILLO		5
87a88b5ba8SSam Ravnborg 	int				chip_version;
88a88b5ba8SSam Ravnborg 	int				chip_revision;
89a88b5ba8SSam Ravnborg 
90a88b5ba8SSam Ravnborg 	/* Name used for top-level resources. */
91c22618a1SGrant Likely 	const char			*name;
92a88b5ba8SSam Ravnborg 
93a88b5ba8SSam Ravnborg 	/* OBP specific information. */
94cd4cd730SGrant Likely 	struct platform_device		*op;
95a88b5ba8SSam Ravnborg 	u64				ino_bitmap;
96a88b5ba8SSam Ravnborg 
97a88b5ba8SSam Ravnborg 	/* PBM I/O and Memory space resources. */
98a88b5ba8SSam Ravnborg 	struct resource			io_space;
99a88b5ba8SSam Ravnborg 	struct resource			mem_space;
100af86fa40SYinghai Lu 	struct resource			mem64_space;
1013f1b540dSYinghai Lu 	struct resource			busn;
102*b4a30448SYinghai Lu 	/* offset */
103*b4a30448SYinghai Lu 	resource_size_t			io_offset;
104*b4a30448SYinghai Lu 	resource_size_t			mem_offset;
105*b4a30448SYinghai Lu 	resource_size_t			mem64_offset;
106a88b5ba8SSam Ravnborg 
107a88b5ba8SSam Ravnborg 	/* Base of PCI Config space, can be per-PBM or shared. */
108a88b5ba8SSam Ravnborg 	unsigned long			config_space;
109a88b5ba8SSam Ravnborg 
110a88b5ba8SSam Ravnborg 	/* This will be 12 on PCI-E controllers, 8 elsewhere.  */
111a88b5ba8SSam Ravnborg 	unsigned long			config_space_reg_bits;
112a88b5ba8SSam Ravnborg 
113a88b5ba8SSam Ravnborg 	unsigned long			pci_afsr;
114a88b5ba8SSam Ravnborg 	unsigned long			pci_afar;
115a88b5ba8SSam Ravnborg 	unsigned long			pci_csr;
116a88b5ba8SSam Ravnborg 
117a88b5ba8SSam Ravnborg 	/* State of 66MHz capabilities on this PBM. */
118a88b5ba8SSam Ravnborg 	int				is_66mhz_capable;
119a88b5ba8SSam Ravnborg 	int				all_devs_66mhz;
120a88b5ba8SSam Ravnborg 
121a88b5ba8SSam Ravnborg #ifdef CONFIG_PCI_MSI
122a88b5ba8SSam Ravnborg 	/* MSI info.  */
123a88b5ba8SSam Ravnborg 	u32				msiq_num;
124a88b5ba8SSam Ravnborg 	u32				msiq_ent_count;
125a88b5ba8SSam Ravnborg 	u32				msiq_first;
126a88b5ba8SSam Ravnborg 	u32				msiq_first_devino;
127a88b5ba8SSam Ravnborg 	u32				msiq_rotor;
128a88b5ba8SSam Ravnborg 	struct sparc64_msiq_cookie	*msiq_irq_cookies;
129a88b5ba8SSam Ravnborg 	u32				msi_num;
130a88b5ba8SSam Ravnborg 	u32				msi_first;
131a88b5ba8SSam Ravnborg 	u32				msi_data_mask;
132a88b5ba8SSam Ravnborg 	u32				msix_data_width;
133a88b5ba8SSam Ravnborg 	u64				msi32_start;
134a88b5ba8SSam Ravnborg 	u64				msi64_start;
135a88b5ba8SSam Ravnborg 	u32				msi32_len;
136a88b5ba8SSam Ravnborg 	u32				msi64_len;
137a88b5ba8SSam Ravnborg 	void				*msi_queues;
138a88b5ba8SSam Ravnborg 	unsigned long			*msi_bitmap;
139a88b5ba8SSam Ravnborg 	unsigned int			*msi_irq_table;
14044ed3c0cSSam Ravnborg 	int (*setup_msi_irq)(unsigned int *irq_p, struct pci_dev *pdev,
141a88b5ba8SSam Ravnborg 			     struct msi_desc *entry);
14244ed3c0cSSam Ravnborg 	void (*teardown_msi_irq)(unsigned int irq, struct pci_dev *pdev);
143a88b5ba8SSam Ravnborg 	const struct sparc64_msiq_ops	*msi_ops;
144a88b5ba8SSam Ravnborg #endif /* !(CONFIG_PCI_MSI) */
145a88b5ba8SSam Ravnborg 
146a88b5ba8SSam Ravnborg 	/* This PBM's streaming buffer. */
147a88b5ba8SSam Ravnborg 	struct strbuf			stc;
148a88b5ba8SSam Ravnborg 
149a88b5ba8SSam Ravnborg 	/* IOMMU state, potentially shared by both PBM segments. */
150a88b5ba8SSam Ravnborg 	struct iommu			*iommu;
151a88b5ba8SSam Ravnborg 
152a88b5ba8SSam Ravnborg 	/* Now things for the actual PCI bus probes. */
153a88b5ba8SSam Ravnborg 	unsigned int			pci_first_busno;
154a88b5ba8SSam Ravnborg 	unsigned int			pci_last_busno;
155a88b5ba8SSam Ravnborg 	struct pci_bus			*pci_bus;
156a88b5ba8SSam Ravnborg 	struct pci_ops			*pci_ops;
157a88b5ba8SSam Ravnborg 
158a88b5ba8SSam Ravnborg 	int				numa_node;
159a88b5ba8SSam Ravnborg };
160a88b5ba8SSam Ravnborg 
161a88b5ba8SSam Ravnborg extern struct pci_pbm_info *pci_pbm_root;
162a88b5ba8SSam Ravnborg 
163a88b5ba8SSam Ravnborg extern int pci_num_pbms;
164a88b5ba8SSam Ravnborg 
165a88b5ba8SSam Ravnborg /* PCI bus scanning and fixup support. */
1662e74a74fSSam Ravnborg void pci_get_pbm_props(struct pci_pbm_info *pbm);
1672e74a74fSSam Ravnborg struct pci_bus *pci_scan_one_pbm(struct pci_pbm_info *pbm,
168a88b5ba8SSam Ravnborg 				 struct device *parent);
1692e74a74fSSam Ravnborg void pci_determine_mem_io_space(struct pci_pbm_info *pbm);
170a88b5ba8SSam Ravnborg 
171a88b5ba8SSam Ravnborg /* Error reporting support. */
1722e74a74fSSam Ravnborg void pci_scan_for_target_abort(struct pci_pbm_info *, struct pci_bus *);
1732e74a74fSSam Ravnborg void pci_scan_for_master_abort(struct pci_pbm_info *, struct pci_bus *);
1742e74a74fSSam Ravnborg void pci_scan_for_parity_error(struct pci_pbm_info *, struct pci_bus *);
175a88b5ba8SSam Ravnborg 
176a88b5ba8SSam Ravnborg /* Configuration space access. */
1772e74a74fSSam Ravnborg void pci_config_read8(u8 *addr, u8 *ret);
1782e74a74fSSam Ravnborg void pci_config_read16(u16 *addr, u16 *ret);
1792e74a74fSSam Ravnborg void pci_config_read32(u32 *addr, u32 *ret);
1802e74a74fSSam Ravnborg void pci_config_write8(u8 *addr, u8 val);
1812e74a74fSSam Ravnborg void pci_config_write16(u16 *addr, u16 val);
1822e74a74fSSam Ravnborg void pci_config_write32(u32 *addr, u32 val);
183a88b5ba8SSam Ravnborg 
184a88b5ba8SSam Ravnborg extern struct pci_ops sun4u_pci_ops;
185a88b5ba8SSam Ravnborg extern struct pci_ops sun4v_pci_ops;
186a88b5ba8SSam Ravnborg 
187a88b5ba8SSam Ravnborg extern volatile int pci_poke_in_progress;
188a88b5ba8SSam Ravnborg extern volatile int pci_poke_cpu;
189a88b5ba8SSam Ravnborg extern volatile int pci_poke_faulted;
190a88b5ba8SSam Ravnborg 
191a88b5ba8SSam Ravnborg #endif /* !(PCI_IMPL_H) */
192