]>
Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | #ifndef __ASM_S390_PCI_H |
2 | #define __ASM_S390_PCI_H | |
3 | ||
cd248341 | 4 | /* must be set before including asm-generic/pci.h */ |
1da177e4 | 5 | #define PCI_DMA_BUS_IS_PHYS (0) |
cd248341 JG |
6 | /* must be set before including pci_clp.h */ |
7 | #define PCI_BAR_COUNT 6 | |
1da177e4 | 8 | |
57b5918c | 9 | #include <linux/pci.h> |
80ed156a | 10 | #include <linux/mutex.h> |
cd248341 | 11 | #include <asm-generic/pci.h> |
a755a45d | 12 | #include <asm/pci_clp.h> |
d0b08853 | 13 | #include <asm/pci_debug.h> |
bd3a1725 | 14 | #include <asm/sclp.h> |
1da177e4 | 15 | |
cd248341 JG |
16 | #define PCIBIOS_MIN_IO 0x1000 |
17 | #define PCIBIOS_MIN_MEM 0x10000000 | |
18 | ||
19 | #define pcibios_assign_all_busses() (0) | |
20 | ||
21 | void __iomem *pci_iomap(struct pci_dev *, int, unsigned long); | |
22 | void pci_iounmap(struct pci_dev *, void __iomem *); | |
23 | int pci_domain_nr(struct pci_bus *); | |
24 | int pci_proc_domain(struct pci_bus *); | |
25 | ||
26 | #define ZPCI_BUS_NR 0 /* default bus number */ | |
27 | #define ZPCI_DEVFN 0 /* default device number */ | |
28 | ||
29 | /* PCI Function Controls */ | |
30 | #define ZPCI_FC_FN_ENABLED 0x80 | |
31 | #define ZPCI_FC_ERROR 0x40 | |
32 | #define ZPCI_FC_BLOCKED 0x20 | |
33 | #define ZPCI_FC_DMA_ENABLED 0x10 | |
34 | ||
f9dc447e SO |
35 | #define ZPCI_FMB_DMA_COUNTER_VALID (1 << 23) |
36 | ||
37 | struct zpci_fmb_fmt0 { | |
38 | u64 dma_rbytes; | |
39 | u64 dma_wbytes; | |
40 | }; | |
41 | ||
42 | struct zpci_fmb_fmt1 { | |
43 | u64 rx_bytes; | |
44 | u64 rx_packets; | |
45 | u64 tx_bytes; | |
46 | u64 tx_packets; | |
47 | }; | |
48 | ||
49 | struct zpci_fmb_fmt2 { | |
50 | u64 consumed_work_units; | |
51 | u64 max_work_units; | |
52 | }; | |
53 | ||
d0b08853 | 54 | struct zpci_fmb { |
f9dc447e SO |
55 | u32 format : 8; |
56 | u32 fmt_ind : 24; | |
d0b08853 JG |
57 | u32 samples; |
58 | u64 last_update; | |
f9dc447e | 59 | /* common counters */ |
d0b08853 JG |
60 | u64 ld_ops; |
61 | u64 st_ops; | |
62 | u64 stb_ops; | |
63 | u64 rpcit_ops; | |
f9dc447e SO |
64 | /* format specific counters */ |
65 | union { | |
66 | struct zpci_fmb_fmt0 fmt0; | |
67 | struct zpci_fmb_fmt1 fmt1; | |
68 | struct zpci_fmb_fmt2 fmt2; | |
69 | }; | |
9d89d9e6 | 70 | } __packed __aligned(128); |
d0b08853 | 71 | |
cd248341 JG |
72 | enum zpci_state { |
73 | ZPCI_FN_STATE_RESERVED, | |
74 | ZPCI_FN_STATE_STANDBY, | |
75 | ZPCI_FN_STATE_CONFIGURED, | |
76 | ZPCI_FN_STATE_ONLINE, | |
77 | NR_ZPCI_FN_STATES, | |
78 | }; | |
79 | ||
80 | struct zpci_bar_struct { | |
7a572a3a | 81 | struct resource *res; /* bus resource */ |
cd248341 | 82 | u32 val; /* bar start & 3 flag bits */ |
cd248341 | 83 | u16 map_idx; /* index into bar mapping array */ |
7a572a3a | 84 | u8 size; /* order 2 exponent */ |
cd248341 JG |
85 | }; |
86 | ||
8128f23c GS |
87 | struct s390_domain; |
88 | ||
cd248341 JG |
89 | /* Private data per function */ |
90 | struct zpci_dev { | |
cd248341 JG |
91 | struct pci_bus *bus; |
92 | struct list_head entry; /* list of all zpci_devices, needed for hotplug, etc. */ | |
93 | ||
94 | enum zpci_state state; | |
95 | u32 fid; /* function ID, used by sclp */ | |
96 | u32 fh; /* function handle, used by insn's */ | |
ac4995b9 | 97 | u16 vfn; /* virtual function number */ |
cd248341 JG |
98 | u16 pchid; /* physical channel ID */ |
99 | u8 pfgid; /* function group ID */ | |
ac4995b9 | 100 | u8 pft; /* pci function type */ |
cd248341 JG |
101 | u16 domain; |
102 | ||
80ed156a | 103 | struct mutex lock; |
ac4995b9 SO |
104 | u8 pfip[CLP_PFIP_NR_SEGMENTS]; /* pci function internal path */ |
105 | u32 uid; /* user defined id */ | |
106 | u8 util_str[CLP_UTIL_STR_LEN]; /* utility string */ | |
107 | ||
9a4da8a5 JG |
108 | /* IRQ stuff */ |
109 | u64 msi_addr; /* MSI address */ | |
b19148f6 | 110 | unsigned int max_msi; /* maximum number of MSI's */ |
5d0d8f43 | 111 | struct airq_iv *aibv; /* adapter interrupt bit vector */ |
9a4da8a5 JG |
112 | unsigned int aisb; /* number of the summary bit */ |
113 | ||
828b35f6 JG |
114 | /* DMA stuff */ |
115 | unsigned long *dma_table; | |
116 | spinlock_t dma_table_lock; | |
117 | int tlb_refresh; | |
118 | ||
119 | spinlock_t iommu_bitmap_lock; | |
120 | unsigned long *iommu_bitmap; | |
13954fd6 | 121 | unsigned long *lazy_bitmap; |
828b35f6 JG |
122 | unsigned long iommu_size; |
123 | unsigned long iommu_pages; | |
124 | unsigned int next_bit; | |
125 | ||
7a572a3a | 126 | char res_name[16]; |
cd248341 JG |
127 | struct zpci_bar_struct bars[PCI_BAR_COUNT]; |
128 | ||
828b35f6 JG |
129 | u64 start_dma; /* Start of available DMA addresses */ |
130 | u64 end_dma; /* End of available DMA addresses */ | |
131 | u64 dma_mask; /* DMA address space mask */ | |
132 | ||
d0b08853 JG |
133 | /* Function measurement block */ |
134 | struct zpci_fmb *fmb; | |
135 | u16 fmb_update; /* update interval */ | |
0b7589ec | 136 | u16 fmb_length; |
6001018a SO |
137 | /* software counters */ |
138 | atomic64_t allocated_pages; | |
139 | atomic64_t mapped_pages; | |
140 | atomic64_t unmapped_pages; | |
d0b08853 | 141 | |
cd248341 | 142 | enum pci_bus_speed max_bus_speed; |
d0b08853 JG |
143 | |
144 | struct dentry *debugfs_dev; | |
145 | struct dentry *debugfs_perf; | |
8128f23c GS |
146 | |
147 | struct s390_domain *s390_domain; /* s390 IOMMU domain data */ | |
cd248341 JG |
148 | }; |
149 | ||
150 | static inline bool zdev_enabled(struct zpci_dev *zdev) | |
151 | { | |
152 | return (zdev->fh & (1UL << 31)) ? true : false; | |
153 | } | |
154 | ||
93065d04 SO |
155 | extern const struct attribute_group *zpci_attr_groups[]; |
156 | ||
cd248341 JG |
157 | /* ----------------------------------------------------------------------------- |
158 | Prototypes | |
159 | ----------------------------------------------------------------------------- */ | |
160 | /* Base stuff */ | |
cd248341 JG |
161 | int zpci_create_device(struct zpci_dev *); |
162 | int zpci_enable_device(struct zpci_dev *); | |
cb65a669 | 163 | int zpci_disable_device(struct zpci_dev *); |
cd248341 | 164 | void zpci_stop_device(struct zpci_dev *); |
828b35f6 JG |
165 | int zpci_register_ioat(struct zpci_dev *, u8, u64, u64, u64); |
166 | int zpci_unregister_ioat(struct zpci_dev *, u8); | |
cd248341 | 167 | |
a755a45d | 168 | /* CLP */ |
1d578966 SO |
169 | int clp_scan_pci_devices(void); |
170 | int clp_rescan_pci_devices(void); | |
57b5918c | 171 | int clp_rescan_pci_devices_simple(void); |
a755a45d JG |
172 | int clp_add_pci_device(u32, u32, int); |
173 | int clp_enable_fh(struct zpci_dev *, u8); | |
174 | int clp_disable_fh(struct zpci_dev *); | |
175 | ||
9a17e972 | 176 | #ifdef CONFIG_PCI |
cbc0dd1f JG |
177 | /* Error handling and recovery */ |
178 | void zpci_event_error(void *); | |
179 | void zpci_event_availability(void *); | |
57b5918c | 180 | void zpci_rescan(void); |
aa3b7c29 | 181 | bool zpci_is_enabled(void); |
9a17e972 SO |
182 | #else /* CONFIG_PCI */ |
183 | static inline void zpci_event_error(void *e) {} | |
184 | static inline void zpci_event_availability(void *e) {} | |
57b5918c | 185 | static inline void zpci_rescan(void) {} |
9a17e972 | 186 | #endif /* CONFIG_PCI */ |
cbc0dd1f | 187 | |
67f43f38 SO |
188 | #ifdef CONFIG_HOTPLUG_PCI_S390 |
189 | int zpci_init_slot(struct zpci_dev *); | |
190 | void zpci_exit_slot(struct zpci_dev *); | |
191 | #else /* CONFIG_HOTPLUG_PCI_S390 */ | |
192 | static inline int zpci_init_slot(struct zpci_dev *zdev) | |
193 | { | |
194 | return 0; | |
195 | } | |
196 | static inline void zpci_exit_slot(struct zpci_dev *zdev) {} | |
197 | #endif /* CONFIG_HOTPLUG_PCI_S390 */ | |
198 | ||
cd248341 | 199 | /* Helpers */ |
198a5278 SO |
200 | static inline struct zpci_dev *to_zpci(struct pci_dev *pdev) |
201 | { | |
202 | return pdev->sysdata; | |
203 | } | |
204 | ||
cd248341 | 205 | struct zpci_dev *get_zdev_by_fid(u32); |
cd248341 | 206 | |
828b35f6 JG |
207 | /* DMA */ |
208 | int zpci_dma_init(void); | |
209 | void zpci_dma_exit(void); | |
210 | ||
d0b08853 JG |
211 | /* FMB */ |
212 | int zpci_fmb_enable_device(struct zpci_dev *); | |
213 | int zpci_fmb_disable_device(struct zpci_dev *); | |
214 | ||
215 | /* Debug */ | |
216 | int zpci_debug_init(void); | |
217 | void zpci_debug_exit(void); | |
9a99649f | 218 | void zpci_debug_init_device(struct zpci_dev *, const char *); |
d0b08853 JG |
219 | void zpci_debug_exit_device(struct zpci_dev *); |
220 | void zpci_debug_info(struct zpci_dev *, struct seq_file *); | |
221 | ||
bd3a1725 MS |
222 | /* Error reporting */ |
223 | int zpci_report_error(struct pci_dev *, struct zpci_report_error_header *); | |
224 | ||
3a368f74 PH |
225 | #ifdef CONFIG_NUMA |
226 | ||
227 | /* Returns the node based on PCI bus */ | |
228 | static inline int __pcibus_to_node(const struct pci_bus *bus) | |
229 | { | |
230 | return NUMA_NO_NODE; | |
231 | } | |
232 | ||
233 | static inline const struct cpumask * | |
234 | cpumask_of_pcibus(const struct pci_bus *bus) | |
235 | { | |
236 | return cpu_online_mask; | |
237 | } | |
238 | ||
239 | #endif /* CONFIG_NUMA */ | |
240 | ||
cd248341 | 241 | #endif |