blob: c290f13d1c47bbcc986f72f8bd715a6a7a888aee [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001#ifndef __ASM_S390_PCI_H
2#define __ASM_S390_PCI_H
3
Jan Glaubercd248342012-11-29 12:50:30 +01004/* must be set before including asm-generic/pci.h */
Linus Torvalds1da177e2005-04-16 15:20:36 -07005#define PCI_DMA_BUS_IS_PHYS (0)
Jan Glaubercd248342012-11-29 12:50:30 +01006/* must be set before including pci_clp.h */
7#define PCI_BAR_COUNT 6
Linus Torvalds1da177e2005-04-16 15:20:36 -07008
Sebastian Ott57b59182013-08-29 19:40:01 +02009#include <linux/pci.h>
Jan Glaubercd248342012-11-29 12:50:30 +010010#include <asm-generic/pci.h>
11#include <asm-generic/pci-dma-compat.h>
Jan Glaubera755a452012-11-29 12:55:21 +010012#include <asm/pci_clp.h>
Jan Glauberd0b08852012-12-11 14:53:35 +010013#include <asm/pci_debug.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070014
Jan Glaubercd248342012-11-29 12:50:30 +010015#define PCIBIOS_MIN_IO 0x1000
16#define PCIBIOS_MIN_MEM 0x10000000
17
18#define pcibios_assign_all_busses() (0)
19
20void __iomem *pci_iomap(struct pci_dev *, int, unsigned long);
21void pci_iounmap(struct pci_dev *, void __iomem *);
22int pci_domain_nr(struct pci_bus *);
23int pci_proc_domain(struct pci_bus *);
24
Jan Glauber9a4da8a2012-11-29 13:05:05 +010025/* MSI arch hooks */
26#define arch_setup_msi_irqs arch_setup_msi_irqs
27#define arch_teardown_msi_irqs arch_teardown_msi_irqs
28
Jan Glaubercd248342012-11-29 12:50:30 +010029#define ZPCI_BUS_NR 0 /* default bus number */
30#define ZPCI_DEVFN 0 /* default device number */
31
32/* PCI Function Controls */
33#define ZPCI_FC_FN_ENABLED 0x80
34#define ZPCI_FC_ERROR 0x40
35#define ZPCI_FC_BLOCKED 0x20
36#define ZPCI_FC_DMA_ENABLED 0x10
37
Jan Glauberd0b08852012-12-11 14:53:35 +010038struct zpci_fmb {
39 u32 format : 8;
40 u32 dma_valid : 1;
41 u32 : 23;
42 u32 samples;
43 u64 last_update;
44 /* hardware counters */
45 u64 ld_ops;
46 u64 st_ops;
47 u64 stb_ops;
48 u64 rpcit_ops;
49 u64 dma_rbytes;
50 u64 dma_wbytes;
51 /* software counters */
52 atomic64_t allocated_pages;
53 atomic64_t mapped_pages;
54 atomic64_t unmapped_pages;
55} __packed __aligned(16);
56
Martin Schwidefsky5d0d8f42013-06-25 16:36:29 +020057#define ZPCI_MSI_VEC_BITS 11
58#define ZPCI_MSI_VEC_MAX (1 << ZPCI_MSI_VEC_BITS)
59#define ZPCI_MSI_VEC_MASK (ZPCI_MSI_VEC_MAX - 1)
Jan Glauber9a4da8a2012-11-29 13:05:05 +010060
Jan Glaubercd248342012-11-29 12:50:30 +010061enum zpci_state {
62 ZPCI_FN_STATE_RESERVED,
63 ZPCI_FN_STATE_STANDBY,
64 ZPCI_FN_STATE_CONFIGURED,
65 ZPCI_FN_STATE_ONLINE,
66 NR_ZPCI_FN_STATES,
67};
68
69struct zpci_bar_struct {
70 u32 val; /* bar start & 3 flag bits */
71 u8 size; /* order 2 exponent */
72 u16 map_idx; /* index into bar mapping array */
73};
74
75/* Private data per function */
76struct zpci_dev {
77 struct pci_dev *pdev;
78 struct pci_bus *bus;
79 struct list_head entry; /* list of all zpci_devices, needed for hotplug, etc. */
80
81 enum zpci_state state;
82 u32 fid; /* function ID, used by sclp */
83 u32 fh; /* function handle, used by insn's */
84 u16 pchid; /* physical channel ID */
85 u8 pfgid; /* function group ID */
86 u16 domain;
87
Jan Glauber9a4da8a2012-11-29 13:05:05 +010088 /* IRQ stuff */
89 u64 msi_addr; /* MSI address */
Martin Schwidefsky5d0d8f42013-06-25 16:36:29 +020090 struct airq_iv *aibv; /* adapter interrupt bit vector */
Jan Glauber9a4da8a2012-11-29 13:05:05 +010091 unsigned int aisb; /* number of the summary bit */
92
Jan Glauber828b35f2012-11-29 14:33:30 +010093 /* DMA stuff */
94 unsigned long *dma_table;
95 spinlock_t dma_table_lock;
96 int tlb_refresh;
97
98 spinlock_t iommu_bitmap_lock;
99 unsigned long *iommu_bitmap;
100 unsigned long iommu_size;
101 unsigned long iommu_pages;
102 unsigned int next_bit;
103
Jan Glaubercd248342012-11-29 12:50:30 +0100104 struct zpci_bar_struct bars[PCI_BAR_COUNT];
105
Jan Glauber828b35f2012-11-29 14:33:30 +0100106 u64 start_dma; /* Start of available DMA addresses */
107 u64 end_dma; /* End of available DMA addresses */
108 u64 dma_mask; /* DMA address space mask */
109
Jan Glauberd0b08852012-12-11 14:53:35 +0100110 /* Function measurement block */
111 struct zpci_fmb *fmb;
112 u16 fmb_update; /* update interval */
113
Jan Glaubercd248342012-11-29 12:50:30 +0100114 enum pci_bus_speed max_bus_speed;
Jan Glauberd0b08852012-12-11 14:53:35 +0100115
116 struct dentry *debugfs_dev;
117 struct dentry *debugfs_perf;
Jan Glaubercd248342012-11-29 12:50:30 +0100118};
119
120static inline bool zdev_enabled(struct zpci_dev *zdev)
121{
122 return (zdev->fh & (1UL << 31)) ? true : false;
123}
124
125/* -----------------------------------------------------------------------------
126 Prototypes
127----------------------------------------------------------------------------- */
128/* Base stuff */
129struct zpci_dev *zpci_alloc_device(void);
130int zpci_create_device(struct zpci_dev *);
131int zpci_enable_device(struct zpci_dev *);
Sebastian Ottcb65a662013-04-16 14:12:17 +0200132int zpci_disable_device(struct zpci_dev *);
Jan Glaubercd248342012-11-29 12:50:30 +0100133void zpci_stop_device(struct zpci_dev *);
134void zpci_free_device(struct zpci_dev *);
Jan Glauber828b35f2012-11-29 14:33:30 +0100135int zpci_register_ioat(struct zpci_dev *, u8, u64, u64, u64);
136int zpci_unregister_ioat(struct zpci_dev *, u8);
Jan Glaubercd248342012-11-29 12:50:30 +0100137
Jan Glaubera755a452012-11-29 12:55:21 +0100138/* CLP */
Sebastian Ott1d578962013-08-29 19:37:28 +0200139int clp_scan_pci_devices(void);
140int clp_rescan_pci_devices(void);
Sebastian Ott57b59182013-08-29 19:40:01 +0200141int clp_rescan_pci_devices_simple(void);
Jan Glaubera755a452012-11-29 12:55:21 +0100142int clp_add_pci_device(u32, u32, int);
143int clp_enable_fh(struct zpci_dev *, u8);
144int clp_disable_fh(struct zpci_dev *);
145
Sebastian Ott9a17e972013-01-15 19:04:39 +0100146#ifdef CONFIG_PCI
Jan Glaubercbc0dd12012-11-29 14:34:48 +0100147/* Error handling and recovery */
148void zpci_event_error(void *);
149void zpci_event_availability(void *);
Sebastian Ott57b59182013-08-29 19:40:01 +0200150void zpci_rescan(void);
Sebastian Ott9a17e972013-01-15 19:04:39 +0100151#else /* CONFIG_PCI */
152static inline void zpci_event_error(void *e) {}
153static inline void zpci_event_availability(void *e) {}
Sebastian Ott57b59182013-08-29 19:40:01 +0200154static inline void zpci_rescan(void) {}
Sebastian Ott9a17e972013-01-15 19:04:39 +0100155#endif /* CONFIG_PCI */
Jan Glaubercbc0dd12012-11-29 14:34:48 +0100156
Sebastian Ott67f43f32013-08-29 19:33:16 +0200157#ifdef CONFIG_HOTPLUG_PCI_S390
158int zpci_init_slot(struct zpci_dev *);
159void zpci_exit_slot(struct zpci_dev *);
160#else /* CONFIG_HOTPLUG_PCI_S390 */
161static inline int zpci_init_slot(struct zpci_dev *zdev)
162{
163 return 0;
164}
165static inline void zpci_exit_slot(struct zpci_dev *zdev) {}
166#endif /* CONFIG_HOTPLUG_PCI_S390 */
167
Jan Glaubercd248342012-11-29 12:50:30 +0100168/* Helpers */
169struct zpci_dev *get_zdev(struct pci_dev *);
170struct zpci_dev *get_zdev_by_fid(u32);
Jan Glaubercd248342012-11-29 12:50:30 +0100171
Jan Glauber1e8da952012-11-29 14:36:55 +0100172/* sysfs */
173int zpci_sysfs_add_device(struct device *);
174void zpci_sysfs_remove_device(struct device *);
175
Jan Glauber828b35f2012-11-29 14:33:30 +0100176/* DMA */
177int zpci_dma_init(void);
178void zpci_dma_exit(void);
179
Jan Glauberd0b08852012-12-11 14:53:35 +0100180/* FMB */
181int zpci_fmb_enable_device(struct zpci_dev *);
182int zpci_fmb_disable_device(struct zpci_dev *);
183
184/* Debug */
185int zpci_debug_init(void);
186void zpci_debug_exit(void);
187void zpci_debug_init_device(struct zpci_dev *);
188void zpci_debug_exit_device(struct zpci_dev *);
189void zpci_debug_info(struct zpci_dev *, struct seq_file *);
190
Jan Glaubercd248342012-11-29 12:50:30 +0100191#endif