xref: /OK3568_Linux_fs/kernel/arch/s390/include/asm/pci.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef __ASM_S390_PCI_H
3*4882a593Smuzhiyun #define __ASM_S390_PCI_H
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun #include <linux/pci.h>
6*4882a593Smuzhiyun #include <linux/mutex.h>
7*4882a593Smuzhiyun #include <linux/iommu.h>
8*4882a593Smuzhiyun #include <linux/pci_hotplug.h>
9*4882a593Smuzhiyun #include <asm-generic/pci.h>
10*4882a593Smuzhiyun #include <asm/pci_clp.h>
11*4882a593Smuzhiyun #include <asm/pci_debug.h>
12*4882a593Smuzhiyun #include <asm/sclp.h>
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun #define PCIBIOS_MIN_IO		0x1000
15*4882a593Smuzhiyun #define PCIBIOS_MIN_MEM		0x10000000
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #define pcibios_assign_all_busses()	(0)
18*4882a593Smuzhiyun 
19*4882a593Smuzhiyun void __iomem *pci_iomap(struct pci_dev *, int, unsigned long);
20*4882a593Smuzhiyun void pci_iounmap(struct pci_dev *, void __iomem *);
21*4882a593Smuzhiyun int pci_domain_nr(struct pci_bus *);
22*4882a593Smuzhiyun int pci_proc_domain(struct pci_bus *);
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun #define ZPCI_BUS_NR			0	/* default bus number */
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun #define ZPCI_NR_DMA_SPACES		1
27*4882a593Smuzhiyun #define ZPCI_NR_DEVICES			CONFIG_PCI_NR_FUNCTIONS
28*4882a593Smuzhiyun #define ZPCI_DOMAIN_BITMAP_SIZE		(1 << 16)
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun #ifdef PCI
31*4882a593Smuzhiyun #if (ZPCI_NR_DEVICES > ZPCI_DOMAIN_BITMAP_SIZE)
32*4882a593Smuzhiyun # error ZPCI_NR_DEVICES can not be bigger than ZPCI_DOMAIN_BITMAP_SIZE
33*4882a593Smuzhiyun #endif
34*4882a593Smuzhiyun #endif /* PCI */
35*4882a593Smuzhiyun 
36*4882a593Smuzhiyun /* PCI Function Controls */
37*4882a593Smuzhiyun #define ZPCI_FC_FN_ENABLED		0x80
38*4882a593Smuzhiyun #define ZPCI_FC_ERROR			0x40
39*4882a593Smuzhiyun #define ZPCI_FC_BLOCKED			0x20
40*4882a593Smuzhiyun #define ZPCI_FC_DMA_ENABLED		0x10
41*4882a593Smuzhiyun 
42*4882a593Smuzhiyun #define ZPCI_FMB_DMA_COUNTER_VALID	(1 << 23)
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun struct zpci_fmb_fmt0 {
45*4882a593Smuzhiyun 	u64 dma_rbytes;
46*4882a593Smuzhiyun 	u64 dma_wbytes;
47*4882a593Smuzhiyun };
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun struct zpci_fmb_fmt1 {
50*4882a593Smuzhiyun 	u64 rx_bytes;
51*4882a593Smuzhiyun 	u64 rx_packets;
52*4882a593Smuzhiyun 	u64 tx_bytes;
53*4882a593Smuzhiyun 	u64 tx_packets;
54*4882a593Smuzhiyun };
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun struct zpci_fmb_fmt2 {
57*4882a593Smuzhiyun 	u64 consumed_work_units;
58*4882a593Smuzhiyun 	u64 max_work_units;
59*4882a593Smuzhiyun };
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun struct zpci_fmb_fmt3 {
62*4882a593Smuzhiyun 	u64 tx_bytes;
63*4882a593Smuzhiyun };
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun struct zpci_fmb {
66*4882a593Smuzhiyun 	u32 format	: 8;
67*4882a593Smuzhiyun 	u32 fmt_ind	: 24;
68*4882a593Smuzhiyun 	u32 samples;
69*4882a593Smuzhiyun 	u64 last_update;
70*4882a593Smuzhiyun 	/* common counters */
71*4882a593Smuzhiyun 	u64 ld_ops;
72*4882a593Smuzhiyun 	u64 st_ops;
73*4882a593Smuzhiyun 	u64 stb_ops;
74*4882a593Smuzhiyun 	u64 rpcit_ops;
75*4882a593Smuzhiyun 	/* format specific counters */
76*4882a593Smuzhiyun 	union {
77*4882a593Smuzhiyun 		struct zpci_fmb_fmt0 fmt0;
78*4882a593Smuzhiyun 		struct zpci_fmb_fmt1 fmt1;
79*4882a593Smuzhiyun 		struct zpci_fmb_fmt2 fmt2;
80*4882a593Smuzhiyun 		struct zpci_fmb_fmt3 fmt3;
81*4882a593Smuzhiyun 	};
82*4882a593Smuzhiyun } __packed __aligned(128);
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun enum zpci_state {
85*4882a593Smuzhiyun 	ZPCI_FN_STATE_STANDBY = 0,
86*4882a593Smuzhiyun 	ZPCI_FN_STATE_CONFIGURED = 1,
87*4882a593Smuzhiyun 	ZPCI_FN_STATE_RESERVED = 2,
88*4882a593Smuzhiyun 	ZPCI_FN_STATE_ONLINE = 3,
89*4882a593Smuzhiyun };
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun struct zpci_bar_struct {
92*4882a593Smuzhiyun 	struct resource *res;		/* bus resource */
93*4882a593Smuzhiyun 	void __iomem	*mio_wb;
94*4882a593Smuzhiyun 	void __iomem	*mio_wt;
95*4882a593Smuzhiyun 	u32		val;		/* bar start & 3 flag bits */
96*4882a593Smuzhiyun 	u16		map_idx;	/* index into bar mapping array */
97*4882a593Smuzhiyun 	u8		size;		/* order 2 exponent */
98*4882a593Smuzhiyun };
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun struct s390_domain;
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun #define ZPCI_FUNCTIONS_PER_BUS 256
103*4882a593Smuzhiyun struct zpci_bus {
104*4882a593Smuzhiyun 	struct kref		kref;
105*4882a593Smuzhiyun 	struct pci_bus		*bus;
106*4882a593Smuzhiyun 	struct zpci_dev		*function[ZPCI_FUNCTIONS_PER_BUS];
107*4882a593Smuzhiyun 	struct list_head	resources;
108*4882a593Smuzhiyun 	struct list_head	bus_next;
109*4882a593Smuzhiyun 	struct resource		bus_resource;
110*4882a593Smuzhiyun 	int			pchid;
111*4882a593Smuzhiyun 	int			domain_nr;
112*4882a593Smuzhiyun 	bool			multifunction;
113*4882a593Smuzhiyun 	enum pci_bus_speed	max_bus_speed;
114*4882a593Smuzhiyun };
115*4882a593Smuzhiyun 
116*4882a593Smuzhiyun /* Private data per function */
117*4882a593Smuzhiyun struct zpci_dev {
118*4882a593Smuzhiyun 	struct zpci_bus *zbus;
119*4882a593Smuzhiyun 	struct list_head entry;		/* list of all zpci_devices, needed for hotplug, etc. */
120*4882a593Smuzhiyun 	struct list_head bus_next;
121*4882a593Smuzhiyun 	struct kref kref;
122*4882a593Smuzhiyun 	struct hotplug_slot hotplug_slot;
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun 	enum zpci_state state;
125*4882a593Smuzhiyun 	u32		fid;		/* function ID, used by sclp */
126*4882a593Smuzhiyun 	u32		fh;		/* function handle, used by insn's */
127*4882a593Smuzhiyun 	u16		vfn;		/* virtual function number */
128*4882a593Smuzhiyun 	u16		pchid;		/* physical channel ID */
129*4882a593Smuzhiyun 	u8		pfgid;		/* function group ID */
130*4882a593Smuzhiyun 	u8		pft;		/* pci function type */
131*4882a593Smuzhiyun 	u8		port;
132*4882a593Smuzhiyun 	u8		rid_available	: 1;
133*4882a593Smuzhiyun 	u8		has_hp_slot	: 1;
134*4882a593Smuzhiyun 	u8		is_physfn	: 1;
135*4882a593Smuzhiyun 	u8		util_str_avail	: 1;
136*4882a593Smuzhiyun 	u8		reserved	: 4;
137*4882a593Smuzhiyun 	unsigned int	devfn;		/* DEVFN part of the RID*/
138*4882a593Smuzhiyun 
139*4882a593Smuzhiyun 	struct mutex lock;
140*4882a593Smuzhiyun 	u8 pfip[CLP_PFIP_NR_SEGMENTS];	/* pci function internal path */
141*4882a593Smuzhiyun 	u32 uid;			/* user defined id */
142*4882a593Smuzhiyun 	u8 util_str[CLP_UTIL_STR_LEN];	/* utility string */
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun 	/* IRQ stuff */
145*4882a593Smuzhiyun 	u64		msi_addr;	/* MSI address */
146*4882a593Smuzhiyun 	unsigned int	max_msi;	/* maximum number of MSI's */
147*4882a593Smuzhiyun 	unsigned int	msi_first_bit;
148*4882a593Smuzhiyun 	unsigned int	msi_nr_irqs;
149*4882a593Smuzhiyun 	struct airq_iv *aibv;		/* adapter interrupt bit vector */
150*4882a593Smuzhiyun 	unsigned long	aisb;		/* number of the summary bit */
151*4882a593Smuzhiyun 
152*4882a593Smuzhiyun 	/* DMA stuff */
153*4882a593Smuzhiyun 	unsigned long	*dma_table;
154*4882a593Smuzhiyun 	spinlock_t	dma_table_lock;
155*4882a593Smuzhiyun 	int		tlb_refresh;
156*4882a593Smuzhiyun 
157*4882a593Smuzhiyun 	spinlock_t	iommu_bitmap_lock;
158*4882a593Smuzhiyun 	unsigned long	*iommu_bitmap;
159*4882a593Smuzhiyun 	unsigned long	*lazy_bitmap;
160*4882a593Smuzhiyun 	unsigned long	iommu_size;
161*4882a593Smuzhiyun 	unsigned long	iommu_pages;
162*4882a593Smuzhiyun 	unsigned int	next_bit;
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun 	struct iommu_device iommu_dev;  /* IOMMU core handle */
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun 	char res_name[16];
167*4882a593Smuzhiyun 	bool mio_capable;
168*4882a593Smuzhiyun 	struct zpci_bar_struct bars[PCI_STD_NUM_BARS];
169*4882a593Smuzhiyun 
170*4882a593Smuzhiyun 	u64		start_dma;	/* Start of available DMA addresses */
171*4882a593Smuzhiyun 	u64		end_dma;	/* End of available DMA addresses */
172*4882a593Smuzhiyun 	u64		dma_mask;	/* DMA address space mask */
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun 	/* Function measurement block */
175*4882a593Smuzhiyun 	struct zpci_fmb *fmb;
176*4882a593Smuzhiyun 	u16		fmb_update;	/* update interval */
177*4882a593Smuzhiyun 	u16		fmb_length;
178*4882a593Smuzhiyun 	/* software counters */
179*4882a593Smuzhiyun 	atomic64_t allocated_pages;
180*4882a593Smuzhiyun 	atomic64_t mapped_pages;
181*4882a593Smuzhiyun 	atomic64_t unmapped_pages;
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun 	u8		version;
184*4882a593Smuzhiyun 	enum pci_bus_speed max_bus_speed;
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun 	struct dentry	*debugfs_dev;
187*4882a593Smuzhiyun 
188*4882a593Smuzhiyun 	struct s390_domain *s390_domain; /* s390 IOMMU domain data */
189*4882a593Smuzhiyun };
190*4882a593Smuzhiyun 
zdev_enabled(struct zpci_dev * zdev)191*4882a593Smuzhiyun static inline bool zdev_enabled(struct zpci_dev *zdev)
192*4882a593Smuzhiyun {
193*4882a593Smuzhiyun 	return (zdev->fh & (1UL << 31)) ? true : false;
194*4882a593Smuzhiyun }
195*4882a593Smuzhiyun 
196*4882a593Smuzhiyun extern const struct attribute_group *zpci_attr_groups[];
197*4882a593Smuzhiyun extern unsigned int s390_pci_force_floating __initdata;
198*4882a593Smuzhiyun extern unsigned int s390_pci_no_rid;
199*4882a593Smuzhiyun 
200*4882a593Smuzhiyun /* -----------------------------------------------------------------------------
201*4882a593Smuzhiyun   Prototypes
202*4882a593Smuzhiyun ----------------------------------------------------------------------------- */
203*4882a593Smuzhiyun /* Base stuff */
204*4882a593Smuzhiyun int zpci_create_device(u32 fid, u32 fh, enum zpci_state state);
205*4882a593Smuzhiyun void zpci_remove_device(struct zpci_dev *zdev, bool set_error);
206*4882a593Smuzhiyun int zpci_enable_device(struct zpci_dev *);
207*4882a593Smuzhiyun int zpci_disable_device(struct zpci_dev *);
208*4882a593Smuzhiyun void zpci_device_reserved(struct zpci_dev *zdev);
209*4882a593Smuzhiyun bool zpci_is_device_configured(struct zpci_dev *zdev);
210*4882a593Smuzhiyun 
211*4882a593Smuzhiyun int zpci_register_ioat(struct zpci_dev *, u8, u64, u64, u64);
212*4882a593Smuzhiyun int zpci_unregister_ioat(struct zpci_dev *, u8);
213*4882a593Smuzhiyun void zpci_remove_reserved_devices(void);
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun /* CLP */
216*4882a593Smuzhiyun int clp_setup_writeback_mio(void);
217*4882a593Smuzhiyun int clp_scan_pci_devices(void);
218*4882a593Smuzhiyun int clp_query_pci_fn(struct zpci_dev *zdev);
219*4882a593Smuzhiyun int clp_enable_fh(struct zpci_dev *, u8);
220*4882a593Smuzhiyun int clp_disable_fh(struct zpci_dev *);
221*4882a593Smuzhiyun int clp_get_state(u32 fid, enum zpci_state *state);
222*4882a593Smuzhiyun 
223*4882a593Smuzhiyun /* UID */
224*4882a593Smuzhiyun void update_uid_checking(bool new);
225*4882a593Smuzhiyun 
226*4882a593Smuzhiyun /* IOMMU Interface */
227*4882a593Smuzhiyun int zpci_init_iommu(struct zpci_dev *zdev);
228*4882a593Smuzhiyun void zpci_destroy_iommu(struct zpci_dev *zdev);
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun #ifdef CONFIG_PCI
zpci_use_mio(struct zpci_dev * zdev)231*4882a593Smuzhiyun static inline bool zpci_use_mio(struct zpci_dev *zdev)
232*4882a593Smuzhiyun {
233*4882a593Smuzhiyun 	return static_branch_likely(&have_mio) && zdev->mio_capable;
234*4882a593Smuzhiyun }
235*4882a593Smuzhiyun 
236*4882a593Smuzhiyun /* Error handling and recovery */
237*4882a593Smuzhiyun void zpci_event_error(void *);
238*4882a593Smuzhiyun void zpci_event_availability(void *);
239*4882a593Smuzhiyun bool zpci_is_enabled(void);
240*4882a593Smuzhiyun #else /* CONFIG_PCI */
zpci_event_error(void * e)241*4882a593Smuzhiyun static inline void zpci_event_error(void *e) {}
zpci_event_availability(void * e)242*4882a593Smuzhiyun static inline void zpci_event_availability(void *e) {}
243*4882a593Smuzhiyun #endif /* CONFIG_PCI */
244*4882a593Smuzhiyun 
245*4882a593Smuzhiyun #ifdef CONFIG_HOTPLUG_PCI_S390
246*4882a593Smuzhiyun int zpci_init_slot(struct zpci_dev *);
247*4882a593Smuzhiyun void zpci_exit_slot(struct zpci_dev *);
248*4882a593Smuzhiyun #else /* CONFIG_HOTPLUG_PCI_S390 */
zpci_init_slot(struct zpci_dev * zdev)249*4882a593Smuzhiyun static inline int zpci_init_slot(struct zpci_dev *zdev)
250*4882a593Smuzhiyun {
251*4882a593Smuzhiyun 	return 0;
252*4882a593Smuzhiyun }
zpci_exit_slot(struct zpci_dev * zdev)253*4882a593Smuzhiyun static inline void zpci_exit_slot(struct zpci_dev *zdev) {}
254*4882a593Smuzhiyun #endif /* CONFIG_HOTPLUG_PCI_S390 */
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun /* Helpers */
to_zpci(struct pci_dev * pdev)257*4882a593Smuzhiyun static inline struct zpci_dev *to_zpci(struct pci_dev *pdev)
258*4882a593Smuzhiyun {
259*4882a593Smuzhiyun 	struct zpci_bus *zbus = pdev->sysdata;
260*4882a593Smuzhiyun 
261*4882a593Smuzhiyun 	return zbus->function[pdev->devfn];
262*4882a593Smuzhiyun }
263*4882a593Smuzhiyun 
to_zpci_dev(struct device * dev)264*4882a593Smuzhiyun static inline struct zpci_dev *to_zpci_dev(struct device *dev)
265*4882a593Smuzhiyun {
266*4882a593Smuzhiyun 	return to_zpci(to_pci_dev(dev));
267*4882a593Smuzhiyun }
268*4882a593Smuzhiyun 
269*4882a593Smuzhiyun struct zpci_dev *get_zdev_by_fid(u32);
270*4882a593Smuzhiyun 
271*4882a593Smuzhiyun /* DMA */
272*4882a593Smuzhiyun int zpci_dma_init(void);
273*4882a593Smuzhiyun void zpci_dma_exit(void);
274*4882a593Smuzhiyun 
275*4882a593Smuzhiyun int __init zpci_irq_init(void);
276*4882a593Smuzhiyun void __init zpci_irq_exit(void);
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun /* FMB */
279*4882a593Smuzhiyun int zpci_fmb_enable_device(struct zpci_dev *);
280*4882a593Smuzhiyun int zpci_fmb_disable_device(struct zpci_dev *);
281*4882a593Smuzhiyun 
282*4882a593Smuzhiyun /* Debug */
283*4882a593Smuzhiyun int zpci_debug_init(void);
284*4882a593Smuzhiyun void zpci_debug_exit(void);
285*4882a593Smuzhiyun void zpci_debug_init_device(struct zpci_dev *, const char *);
286*4882a593Smuzhiyun void zpci_debug_exit_device(struct zpci_dev *);
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun /* Error reporting */
289*4882a593Smuzhiyun int zpci_report_error(struct pci_dev *, struct zpci_report_error_header *);
290*4882a593Smuzhiyun 
291*4882a593Smuzhiyun #ifdef CONFIG_NUMA
292*4882a593Smuzhiyun 
293*4882a593Smuzhiyun /* Returns the node based on PCI bus */
__pcibus_to_node(const struct pci_bus * bus)294*4882a593Smuzhiyun static inline int __pcibus_to_node(const struct pci_bus *bus)
295*4882a593Smuzhiyun {
296*4882a593Smuzhiyun 	return NUMA_NO_NODE;
297*4882a593Smuzhiyun }
298*4882a593Smuzhiyun 
299*4882a593Smuzhiyun static inline const struct cpumask *
cpumask_of_pcibus(const struct pci_bus * bus)300*4882a593Smuzhiyun cpumask_of_pcibus(const struct pci_bus *bus)
301*4882a593Smuzhiyun {
302*4882a593Smuzhiyun 	return cpu_online_mask;
303*4882a593Smuzhiyun }
304*4882a593Smuzhiyun 
305*4882a593Smuzhiyun #endif /* CONFIG_NUMA */
306*4882a593Smuzhiyun 
307*4882a593Smuzhiyun #endif
308