xref: /linux/arch/s390/pci/pci.c (revision cd24834130ac655d15accee6757e0eaeab4ad4ef)
1*cd248341SJan Glauber /*
2*cd248341SJan Glauber  * Copyright IBM Corp. 2012
3*cd248341SJan Glauber  *
4*cd248341SJan Glauber  * Author(s):
5*cd248341SJan Glauber  *   Jan Glauber <jang@linux.vnet.ibm.com>
6*cd248341SJan Glauber  *
7*cd248341SJan Glauber  * The System z PCI code is a rewrite from a prototype by
8*cd248341SJan Glauber  * the following people (Kudoz!):
9*cd248341SJan Glauber  *   Alexander Schmidt <alexschm@de.ibm.com>
10*cd248341SJan Glauber  *   Christoph Raisch <raisch@de.ibm.com>
11*cd248341SJan Glauber  *   Hannes Hering <hering2@de.ibm.com>
12*cd248341SJan Glauber  *   Hoang-Nam Nguyen <hnguyen@de.ibm.com>
13*cd248341SJan Glauber  *   Jan-Bernd Themann <themann@de.ibm.com>
14*cd248341SJan Glauber  *   Stefan Roscher <stefan.roscher@de.ibm.com>
15*cd248341SJan Glauber  *   Thomas Klein <tklein@de.ibm.com>
16*cd248341SJan Glauber  */
17*cd248341SJan Glauber 
18*cd248341SJan Glauber #define COMPONENT "zPCI"
19*cd248341SJan Glauber #define pr_fmt(fmt) COMPONENT ": " fmt
20*cd248341SJan Glauber 
21*cd248341SJan Glauber #include <linux/kernel.h>
22*cd248341SJan Glauber #include <linux/slab.h>
23*cd248341SJan Glauber #include <linux/err.h>
24*cd248341SJan Glauber #include <linux/export.h>
25*cd248341SJan Glauber #include <linux/delay.h>
26*cd248341SJan Glauber #include <linux/seq_file.h>
27*cd248341SJan Glauber #include <linux/pci.h>
28*cd248341SJan Glauber #include <linux/msi.h>
29*cd248341SJan Glauber 
30*cd248341SJan Glauber #include <asm/facility.h>
31*cd248341SJan Glauber #include <asm/pci_insn.h>
32*cd248341SJan Glauber 
33*cd248341SJan Glauber #define DEBUG				/* enable pr_debug */
34*cd248341SJan Glauber 
35*cd248341SJan Glauber #define ZPCI_NR_DMA_SPACES		1
36*cd248341SJan Glauber #define ZPCI_NR_DEVICES			CONFIG_PCI_NR_FUNCTIONS
37*cd248341SJan Glauber 
38*cd248341SJan Glauber /* list of all detected zpci devices */
39*cd248341SJan Glauber LIST_HEAD(zpci_list);
40*cd248341SJan Glauber DEFINE_MUTEX(zpci_list_lock);
41*cd248341SJan Glauber 
42*cd248341SJan Glauber static DECLARE_BITMAP(zpci_domain, ZPCI_NR_DEVICES);
43*cd248341SJan Glauber static DEFINE_SPINLOCK(zpci_domain_lock);
44*cd248341SJan Glauber 
45*cd248341SJan Glauber /* I/O Map */
46*cd248341SJan Glauber static DEFINE_SPINLOCK(zpci_iomap_lock);
47*cd248341SJan Glauber static DECLARE_BITMAP(zpci_iomap, ZPCI_IOMAP_MAX_ENTRIES);
48*cd248341SJan Glauber struct zpci_iomap_entry *zpci_iomap_start;
49*cd248341SJan Glauber EXPORT_SYMBOL_GPL(zpci_iomap_start);
50*cd248341SJan Glauber 
51*cd248341SJan Glauber struct zpci_dev *get_zdev(struct pci_dev *pdev)
52*cd248341SJan Glauber {
53*cd248341SJan Glauber 	return (struct zpci_dev *) pdev->sysdata;
54*cd248341SJan Glauber }
55*cd248341SJan Glauber 
56*cd248341SJan Glauber struct zpci_dev *get_zdev_by_fid(u32 fid)
57*cd248341SJan Glauber {
58*cd248341SJan Glauber 	struct zpci_dev *tmp, *zdev = NULL;
59*cd248341SJan Glauber 
60*cd248341SJan Glauber 	mutex_lock(&zpci_list_lock);
61*cd248341SJan Glauber 	list_for_each_entry(tmp, &zpci_list, entry) {
62*cd248341SJan Glauber 		if (tmp->fid == fid) {
63*cd248341SJan Glauber 			zdev = tmp;
64*cd248341SJan Glauber 			break;
65*cd248341SJan Glauber 		}
66*cd248341SJan Glauber 	}
67*cd248341SJan Glauber 	mutex_unlock(&zpci_list_lock);
68*cd248341SJan Glauber 	return zdev;
69*cd248341SJan Glauber }
70*cd248341SJan Glauber 
71*cd248341SJan Glauber bool zpci_fid_present(u32 fid)
72*cd248341SJan Glauber {
73*cd248341SJan Glauber 	return (get_zdev_by_fid(fid) != NULL) ? true : false;
74*cd248341SJan Glauber }
75*cd248341SJan Glauber 
76*cd248341SJan Glauber static struct zpci_dev *get_zdev_by_bus(struct pci_bus *bus)
77*cd248341SJan Glauber {
78*cd248341SJan Glauber 	return (bus && bus->sysdata) ? (struct zpci_dev *) bus->sysdata : NULL;
79*cd248341SJan Glauber }
80*cd248341SJan Glauber 
81*cd248341SJan Glauber int pci_domain_nr(struct pci_bus *bus)
82*cd248341SJan Glauber {
83*cd248341SJan Glauber 	return ((struct zpci_dev *) bus->sysdata)->domain;
84*cd248341SJan Glauber }
85*cd248341SJan Glauber EXPORT_SYMBOL_GPL(pci_domain_nr);
86*cd248341SJan Glauber 
87*cd248341SJan Glauber int pci_proc_domain(struct pci_bus *bus)
88*cd248341SJan Glauber {
89*cd248341SJan Glauber 	return pci_domain_nr(bus);
90*cd248341SJan Glauber }
91*cd248341SJan Glauber EXPORT_SYMBOL_GPL(pci_proc_domain);
92*cd248341SJan Glauber 
93*cd248341SJan Glauber /* Store PCI function information block */
94*cd248341SJan Glauber static int zpci_store_fib(struct zpci_dev *zdev, u8 *fc)
95*cd248341SJan Glauber {
96*cd248341SJan Glauber 	struct zpci_fib *fib;
97*cd248341SJan Glauber 	u8 status, cc;
98*cd248341SJan Glauber 
99*cd248341SJan Glauber 	fib = (void *) get_zeroed_page(GFP_KERNEL);
100*cd248341SJan Glauber 	if (!fib)
101*cd248341SJan Glauber 		return -ENOMEM;
102*cd248341SJan Glauber 
103*cd248341SJan Glauber 	do {
104*cd248341SJan Glauber 		cc = __stpcifc(zdev->fh, 0, fib, &status);
105*cd248341SJan Glauber 		if (cc == 2) {
106*cd248341SJan Glauber 			msleep(ZPCI_INSN_BUSY_DELAY);
107*cd248341SJan Glauber 			memset(fib, 0, PAGE_SIZE);
108*cd248341SJan Glauber 		}
109*cd248341SJan Glauber 	} while (cc == 2);
110*cd248341SJan Glauber 
111*cd248341SJan Glauber 	if (cc)
112*cd248341SJan Glauber 		pr_err_once("%s: cc: %u  status: %u\n",
113*cd248341SJan Glauber 			    __func__, cc, status);
114*cd248341SJan Glauber 
115*cd248341SJan Glauber 	/* Return PCI function controls */
116*cd248341SJan Glauber 	*fc = fib->fc;
117*cd248341SJan Glauber 
118*cd248341SJan Glauber 	free_page((unsigned long) fib);
119*cd248341SJan Glauber 	return (cc) ? -EIO : 0;
120*cd248341SJan Glauber }
121*cd248341SJan Glauber 
122*cd248341SJan Glauber #define ZPCI_PCIAS_CFGSPC	15
123*cd248341SJan Glauber 
124*cd248341SJan Glauber static int zpci_cfg_load(struct zpci_dev *zdev, int offset, u32 *val, u8 len)
125*cd248341SJan Glauber {
126*cd248341SJan Glauber 	u64 req = ZPCI_CREATE_REQ(zdev->fh, ZPCI_PCIAS_CFGSPC, len);
127*cd248341SJan Glauber 	u64 data;
128*cd248341SJan Glauber 	int rc;
129*cd248341SJan Glauber 
130*cd248341SJan Glauber 	rc = pcilg_instr(&data, req, offset);
131*cd248341SJan Glauber 	data = data << ((8 - len) * 8);
132*cd248341SJan Glauber 	data = le64_to_cpu(data);
133*cd248341SJan Glauber 	if (!rc)
134*cd248341SJan Glauber 		*val = (u32) data;
135*cd248341SJan Glauber 	else
136*cd248341SJan Glauber 		*val = 0xffffffff;
137*cd248341SJan Glauber 	return rc;
138*cd248341SJan Glauber }
139*cd248341SJan Glauber 
140*cd248341SJan Glauber static int zpci_cfg_store(struct zpci_dev *zdev, int offset, u32 val, u8 len)
141*cd248341SJan Glauber {
142*cd248341SJan Glauber 	u64 req = ZPCI_CREATE_REQ(zdev->fh, ZPCI_PCIAS_CFGSPC, len);
143*cd248341SJan Glauber 	u64 data = val;
144*cd248341SJan Glauber 	int rc;
145*cd248341SJan Glauber 
146*cd248341SJan Glauber 	data = cpu_to_le64(data);
147*cd248341SJan Glauber 	data = data >> ((8 - len) * 8);
148*cd248341SJan Glauber 	rc = pcistg_instr(data, req, offset);
149*cd248341SJan Glauber 	return rc;
150*cd248341SJan Glauber }
151*cd248341SJan Glauber 
152*cd248341SJan Glauber void __devinit pcibios_fixup_bus(struct pci_bus *bus)
153*cd248341SJan Glauber {
154*cd248341SJan Glauber }
155*cd248341SJan Glauber 
156*cd248341SJan Glauber resource_size_t pcibios_align_resource(void *data, const struct resource *res,
157*cd248341SJan Glauber 				       resource_size_t size,
158*cd248341SJan Glauber 				       resource_size_t align)
159*cd248341SJan Glauber {
160*cd248341SJan Glauber 	return 0;
161*cd248341SJan Glauber }
162*cd248341SJan Glauber 
163*cd248341SJan Glauber /* Create a virtual mapping cookie for a PCI BAR */
164*cd248341SJan Glauber void __iomem *pci_iomap(struct pci_dev *pdev, int bar, unsigned long max)
165*cd248341SJan Glauber {
166*cd248341SJan Glauber 	struct zpci_dev *zdev =	get_zdev(pdev);
167*cd248341SJan Glauber 	u64 addr;
168*cd248341SJan Glauber 	int idx;
169*cd248341SJan Glauber 
170*cd248341SJan Glauber 	if ((bar & 7) != bar)
171*cd248341SJan Glauber 		return NULL;
172*cd248341SJan Glauber 
173*cd248341SJan Glauber 	idx = zdev->bars[bar].map_idx;
174*cd248341SJan Glauber 	spin_lock(&zpci_iomap_lock);
175*cd248341SJan Glauber 	zpci_iomap_start[idx].fh = zdev->fh;
176*cd248341SJan Glauber 	zpci_iomap_start[idx].bar = bar;
177*cd248341SJan Glauber 	spin_unlock(&zpci_iomap_lock);
178*cd248341SJan Glauber 
179*cd248341SJan Glauber 	addr = ZPCI_IOMAP_ADDR_BASE | ((u64) idx << 48);
180*cd248341SJan Glauber 	return (void __iomem *) addr;
181*cd248341SJan Glauber }
182*cd248341SJan Glauber EXPORT_SYMBOL_GPL(pci_iomap);
183*cd248341SJan Glauber 
184*cd248341SJan Glauber void pci_iounmap(struct pci_dev *pdev, void __iomem *addr)
185*cd248341SJan Glauber {
186*cd248341SJan Glauber 	unsigned int idx;
187*cd248341SJan Glauber 
188*cd248341SJan Glauber 	idx = (((__force u64) addr) & ~ZPCI_IOMAP_ADDR_BASE) >> 48;
189*cd248341SJan Glauber 	spin_lock(&zpci_iomap_lock);
190*cd248341SJan Glauber 	zpci_iomap_start[idx].fh = 0;
191*cd248341SJan Glauber 	zpci_iomap_start[idx].bar = 0;
192*cd248341SJan Glauber 	spin_unlock(&zpci_iomap_lock);
193*cd248341SJan Glauber }
194*cd248341SJan Glauber EXPORT_SYMBOL_GPL(pci_iounmap);
195*cd248341SJan Glauber 
196*cd248341SJan Glauber static int pci_read(struct pci_bus *bus, unsigned int devfn, int where,
197*cd248341SJan Glauber 		    int size, u32 *val)
198*cd248341SJan Glauber {
199*cd248341SJan Glauber 	struct zpci_dev *zdev = get_zdev_by_bus(bus);
200*cd248341SJan Glauber 
201*cd248341SJan Glauber 	if (!zdev || devfn != ZPCI_DEVFN)
202*cd248341SJan Glauber 		return 0;
203*cd248341SJan Glauber 	return zpci_cfg_load(zdev, where, val, size);
204*cd248341SJan Glauber }
205*cd248341SJan Glauber 
206*cd248341SJan Glauber static int pci_write(struct pci_bus *bus, unsigned int devfn, int where,
207*cd248341SJan Glauber 		     int size, u32 val)
208*cd248341SJan Glauber {
209*cd248341SJan Glauber 	struct zpci_dev *zdev = get_zdev_by_bus(bus);
210*cd248341SJan Glauber 
211*cd248341SJan Glauber 	if (!zdev || devfn != ZPCI_DEVFN)
212*cd248341SJan Glauber 		return 0;
213*cd248341SJan Glauber 	return zpci_cfg_store(zdev, where, val, size);
214*cd248341SJan Glauber }
215*cd248341SJan Glauber 
216*cd248341SJan Glauber static struct pci_ops pci_root_ops = {
217*cd248341SJan Glauber 	.read = pci_read,
218*cd248341SJan Glauber 	.write = pci_write,
219*cd248341SJan Glauber };
220*cd248341SJan Glauber 
221*cd248341SJan Glauber static void zpci_map_resources(struct zpci_dev *zdev)
222*cd248341SJan Glauber {
223*cd248341SJan Glauber 	struct pci_dev *pdev = zdev->pdev;
224*cd248341SJan Glauber 	resource_size_t len;
225*cd248341SJan Glauber 	int i;
226*cd248341SJan Glauber 
227*cd248341SJan Glauber 	for (i = 0; i < PCI_BAR_COUNT; i++) {
228*cd248341SJan Glauber 		len = pci_resource_len(pdev, i);
229*cd248341SJan Glauber 		if (!len)
230*cd248341SJan Glauber 			continue;
231*cd248341SJan Glauber 		pdev->resource[i].start = (resource_size_t) pci_iomap(pdev, i, 0);
232*cd248341SJan Glauber 		pdev->resource[i].end = pdev->resource[i].start + len - 1;
233*cd248341SJan Glauber 		pr_debug("BAR%i: -> start: %Lx  end: %Lx\n",
234*cd248341SJan Glauber 			i, pdev->resource[i].start, pdev->resource[i].end);
235*cd248341SJan Glauber 	}
236*cd248341SJan Glauber };
237*cd248341SJan Glauber 
238*cd248341SJan Glauber static void zpci_unmap_resources(struct pci_dev *pdev)
239*cd248341SJan Glauber {
240*cd248341SJan Glauber 	resource_size_t len;
241*cd248341SJan Glauber 	int i;
242*cd248341SJan Glauber 
243*cd248341SJan Glauber 	for (i = 0; i < PCI_BAR_COUNT; i++) {
244*cd248341SJan Glauber 		len = pci_resource_len(pdev, i);
245*cd248341SJan Glauber 		if (!len)
246*cd248341SJan Glauber 			continue;
247*cd248341SJan Glauber 		pci_iounmap(pdev, (void *) pdev->resource[i].start);
248*cd248341SJan Glauber 	}
249*cd248341SJan Glauber };
250*cd248341SJan Glauber 
251*cd248341SJan Glauber struct zpci_dev *zpci_alloc_device(void)
252*cd248341SJan Glauber {
253*cd248341SJan Glauber 	struct zpci_dev *zdev;
254*cd248341SJan Glauber 
255*cd248341SJan Glauber 	/* Alloc memory for our private pci device data */
256*cd248341SJan Glauber 	zdev = kzalloc(sizeof(*zdev), GFP_KERNEL);
257*cd248341SJan Glauber 	if (!zdev)
258*cd248341SJan Glauber 		return ERR_PTR(-ENOMEM);
259*cd248341SJan Glauber 	return zdev;
260*cd248341SJan Glauber }
261*cd248341SJan Glauber 
262*cd248341SJan Glauber void zpci_free_device(struct zpci_dev *zdev)
263*cd248341SJan Glauber {
264*cd248341SJan Glauber 	kfree(zdev);
265*cd248341SJan Glauber }
266*cd248341SJan Glauber 
267*cd248341SJan Glauber /* Called on removal of pci_dev, leaves zpci and bus device */
268*cd248341SJan Glauber static void zpci_remove_device(struct pci_dev *pdev)
269*cd248341SJan Glauber {
270*cd248341SJan Glauber 	struct zpci_dev *zdev = get_zdev(pdev);
271*cd248341SJan Glauber 
272*cd248341SJan Glauber 	dev_info(&pdev->dev, "Removing device %u\n", zdev->domain);
273*cd248341SJan Glauber 	zdev->state = ZPCI_FN_STATE_CONFIGURED;
274*cd248341SJan Glauber 	zpci_unmap_resources(pdev);
275*cd248341SJan Glauber 	list_del(&zdev->entry);		/* can be called from init */
276*cd248341SJan Glauber 	zdev->pdev = NULL;
277*cd248341SJan Glauber }
278*cd248341SJan Glauber 
279*cd248341SJan Glauber static void zpci_scan_devices(void)
280*cd248341SJan Glauber {
281*cd248341SJan Glauber 	struct zpci_dev *zdev;
282*cd248341SJan Glauber 
283*cd248341SJan Glauber 	mutex_lock(&zpci_list_lock);
284*cd248341SJan Glauber 	list_for_each_entry(zdev, &zpci_list, entry)
285*cd248341SJan Glauber 		if (zdev->state == ZPCI_FN_STATE_CONFIGURED)
286*cd248341SJan Glauber 			zpci_scan_device(zdev);
287*cd248341SJan Glauber 	mutex_unlock(&zpci_list_lock);
288*cd248341SJan Glauber }
289*cd248341SJan Glauber 
290*cd248341SJan Glauber /*
291*cd248341SJan Glauber  * Too late for any s390 specific setup, since interrupts must be set up
292*cd248341SJan Glauber  * already which requires DMA setup too and the pci scan will access the
293*cd248341SJan Glauber  * config space, which only works if the function handle is enabled.
294*cd248341SJan Glauber  */
295*cd248341SJan Glauber int pcibios_enable_device(struct pci_dev *pdev, int mask)
296*cd248341SJan Glauber {
297*cd248341SJan Glauber 	struct resource *res;
298*cd248341SJan Glauber 	u16 cmd;
299*cd248341SJan Glauber 	int i;
300*cd248341SJan Glauber 
301*cd248341SJan Glauber 	pci_read_config_word(pdev, PCI_COMMAND, &cmd);
302*cd248341SJan Glauber 
303*cd248341SJan Glauber 	for (i = 0; i < PCI_BAR_COUNT; i++) {
304*cd248341SJan Glauber 		res = &pdev->resource[i];
305*cd248341SJan Glauber 
306*cd248341SJan Glauber 		if (res->flags & IORESOURCE_IO)
307*cd248341SJan Glauber 			return -EINVAL;
308*cd248341SJan Glauber 
309*cd248341SJan Glauber 		if (res->flags & IORESOURCE_MEM)
310*cd248341SJan Glauber 			cmd |= PCI_COMMAND_MEMORY;
311*cd248341SJan Glauber 	}
312*cd248341SJan Glauber 	pci_write_config_word(pdev, PCI_COMMAND, cmd);
313*cd248341SJan Glauber 	return 0;
314*cd248341SJan Glauber }
315*cd248341SJan Glauber 
316*cd248341SJan Glauber void pcibios_disable_device(struct pci_dev *pdev)
317*cd248341SJan Glauber {
318*cd248341SJan Glauber 	zpci_remove_device(pdev);
319*cd248341SJan Glauber 	pdev->sysdata = NULL;
320*cd248341SJan Glauber }
321*cd248341SJan Glauber 
322*cd248341SJan Glauber static struct resource *zpci_alloc_bus_resource(unsigned long start, unsigned long size,
323*cd248341SJan Glauber 						unsigned long flags, int domain)
324*cd248341SJan Glauber {
325*cd248341SJan Glauber 	struct resource *r;
326*cd248341SJan Glauber 	char *name;
327*cd248341SJan Glauber 	int rc;
328*cd248341SJan Glauber 
329*cd248341SJan Glauber 	r = kzalloc(sizeof(*r), GFP_KERNEL);
330*cd248341SJan Glauber 	if (!r)
331*cd248341SJan Glauber 		return ERR_PTR(-ENOMEM);
332*cd248341SJan Glauber 	r->start = start;
333*cd248341SJan Glauber 	r->end = r->start + size - 1;
334*cd248341SJan Glauber 	r->flags = flags;
335*cd248341SJan Glauber 	r->parent = &iomem_resource;
336*cd248341SJan Glauber 	name = kmalloc(18, GFP_KERNEL);
337*cd248341SJan Glauber 	if (!name) {
338*cd248341SJan Glauber 		kfree(r);
339*cd248341SJan Glauber 		return ERR_PTR(-ENOMEM);
340*cd248341SJan Glauber 	}
341*cd248341SJan Glauber 	sprintf(name, "PCI Bus: %04x:%02x", domain, ZPCI_BUS_NR);
342*cd248341SJan Glauber 	r->name = name;
343*cd248341SJan Glauber 
344*cd248341SJan Glauber 	rc = request_resource(&iomem_resource, r);
345*cd248341SJan Glauber 	if (rc)
346*cd248341SJan Glauber 		pr_debug("request resource %pR failed\n", r);
347*cd248341SJan Glauber 	return r;
348*cd248341SJan Glauber }
349*cd248341SJan Glauber 
350*cd248341SJan Glauber static int zpci_alloc_iomap(struct zpci_dev *zdev)
351*cd248341SJan Glauber {
352*cd248341SJan Glauber 	int entry;
353*cd248341SJan Glauber 
354*cd248341SJan Glauber 	spin_lock(&zpci_iomap_lock);
355*cd248341SJan Glauber 	entry = find_first_zero_bit(zpci_iomap, ZPCI_IOMAP_MAX_ENTRIES);
356*cd248341SJan Glauber 	if (entry == ZPCI_IOMAP_MAX_ENTRIES) {
357*cd248341SJan Glauber 		spin_unlock(&zpci_iomap_lock);
358*cd248341SJan Glauber 		return -ENOSPC;
359*cd248341SJan Glauber 	}
360*cd248341SJan Glauber 	set_bit(entry, zpci_iomap);
361*cd248341SJan Glauber 	spin_unlock(&zpci_iomap_lock);
362*cd248341SJan Glauber 	return entry;
363*cd248341SJan Glauber }
364*cd248341SJan Glauber 
365*cd248341SJan Glauber static void zpci_free_iomap(struct zpci_dev *zdev, int entry)
366*cd248341SJan Glauber {
367*cd248341SJan Glauber 	spin_lock(&zpci_iomap_lock);
368*cd248341SJan Glauber 	memset(&zpci_iomap_start[entry], 0, sizeof(struct zpci_iomap_entry));
369*cd248341SJan Glauber 	clear_bit(entry, zpci_iomap);
370*cd248341SJan Glauber 	spin_unlock(&zpci_iomap_lock);
371*cd248341SJan Glauber }
372*cd248341SJan Glauber 
373*cd248341SJan Glauber static int zpci_create_device_bus(struct zpci_dev *zdev)
374*cd248341SJan Glauber {
375*cd248341SJan Glauber 	struct resource *res;
376*cd248341SJan Glauber 	LIST_HEAD(resources);
377*cd248341SJan Glauber 	int i;
378*cd248341SJan Glauber 
379*cd248341SJan Glauber 	/* allocate mapping entry for each used bar */
380*cd248341SJan Glauber 	for (i = 0; i < PCI_BAR_COUNT; i++) {
381*cd248341SJan Glauber 		unsigned long addr, size, flags;
382*cd248341SJan Glauber 		int entry;
383*cd248341SJan Glauber 
384*cd248341SJan Glauber 		if (!zdev->bars[i].size)
385*cd248341SJan Glauber 			continue;
386*cd248341SJan Glauber 		entry = zpci_alloc_iomap(zdev);
387*cd248341SJan Glauber 		if (entry < 0)
388*cd248341SJan Glauber 			return entry;
389*cd248341SJan Glauber 		zdev->bars[i].map_idx = entry;
390*cd248341SJan Glauber 
391*cd248341SJan Glauber 		/* only MMIO is supported */
392*cd248341SJan Glauber 		flags = IORESOURCE_MEM;
393*cd248341SJan Glauber 		if (zdev->bars[i].val & 8)
394*cd248341SJan Glauber 			flags |= IORESOURCE_PREFETCH;
395*cd248341SJan Glauber 		if (zdev->bars[i].val & 4)
396*cd248341SJan Glauber 			flags |= IORESOURCE_MEM_64;
397*cd248341SJan Glauber 
398*cd248341SJan Glauber 		addr = ZPCI_IOMAP_ADDR_BASE + ((u64) entry << 48);
399*cd248341SJan Glauber 
400*cd248341SJan Glauber 		size = 1UL << zdev->bars[i].size;
401*cd248341SJan Glauber 
402*cd248341SJan Glauber 		res = zpci_alloc_bus_resource(addr, size, flags, zdev->domain);
403*cd248341SJan Glauber 		if (IS_ERR(res)) {
404*cd248341SJan Glauber 			zpci_free_iomap(zdev, entry);
405*cd248341SJan Glauber 			return PTR_ERR(res);
406*cd248341SJan Glauber 		}
407*cd248341SJan Glauber 		pci_add_resource(&resources, res);
408*cd248341SJan Glauber 	}
409*cd248341SJan Glauber 
410*cd248341SJan Glauber 	zdev->bus = pci_create_root_bus(NULL, ZPCI_BUS_NR, &pci_root_ops,
411*cd248341SJan Glauber 					zdev, &resources);
412*cd248341SJan Glauber 	if (!zdev->bus)
413*cd248341SJan Glauber 		return -EIO;
414*cd248341SJan Glauber 
415*cd248341SJan Glauber 	zdev->bus->max_bus_speed = zdev->max_bus_speed;
416*cd248341SJan Glauber 	return 0;
417*cd248341SJan Glauber }
418*cd248341SJan Glauber 
419*cd248341SJan Glauber static int zpci_alloc_domain(struct zpci_dev *zdev)
420*cd248341SJan Glauber {
421*cd248341SJan Glauber 	spin_lock(&zpci_domain_lock);
422*cd248341SJan Glauber 	zdev->domain = find_first_zero_bit(zpci_domain, ZPCI_NR_DEVICES);
423*cd248341SJan Glauber 	if (zdev->domain == ZPCI_NR_DEVICES) {
424*cd248341SJan Glauber 		spin_unlock(&zpci_domain_lock);
425*cd248341SJan Glauber 		return -ENOSPC;
426*cd248341SJan Glauber 	}
427*cd248341SJan Glauber 	set_bit(zdev->domain, zpci_domain);
428*cd248341SJan Glauber 	spin_unlock(&zpci_domain_lock);
429*cd248341SJan Glauber 	return 0;
430*cd248341SJan Glauber }
431*cd248341SJan Glauber 
432*cd248341SJan Glauber static void zpci_free_domain(struct zpci_dev *zdev)
433*cd248341SJan Glauber {
434*cd248341SJan Glauber 	spin_lock(&zpci_domain_lock);
435*cd248341SJan Glauber 	clear_bit(zdev->domain, zpci_domain);
436*cd248341SJan Glauber 	spin_unlock(&zpci_domain_lock);
437*cd248341SJan Glauber }
438*cd248341SJan Glauber 
439*cd248341SJan Glauber int zpci_create_device(struct zpci_dev *zdev)
440*cd248341SJan Glauber {
441*cd248341SJan Glauber 	int rc;
442*cd248341SJan Glauber 
443*cd248341SJan Glauber 	rc = zpci_alloc_domain(zdev);
444*cd248341SJan Glauber 	if (rc)
445*cd248341SJan Glauber 		goto out;
446*cd248341SJan Glauber 
447*cd248341SJan Glauber 	rc = zpci_create_device_bus(zdev);
448*cd248341SJan Glauber 	if (rc)
449*cd248341SJan Glauber 		goto out_bus;
450*cd248341SJan Glauber 
451*cd248341SJan Glauber 	mutex_lock(&zpci_list_lock);
452*cd248341SJan Glauber 	list_add_tail(&zdev->entry, &zpci_list);
453*cd248341SJan Glauber 	mutex_unlock(&zpci_list_lock);
454*cd248341SJan Glauber 
455*cd248341SJan Glauber 	if (zdev->state == ZPCI_FN_STATE_STANDBY)
456*cd248341SJan Glauber 		return 0;
457*cd248341SJan Glauber 
458*cd248341SJan Glauber 	return 0;
459*cd248341SJan Glauber 
460*cd248341SJan Glauber out_bus:
461*cd248341SJan Glauber 	zpci_free_domain(zdev);
462*cd248341SJan Glauber out:
463*cd248341SJan Glauber 	return rc;
464*cd248341SJan Glauber }
465*cd248341SJan Glauber 
466*cd248341SJan Glauber void zpci_stop_device(struct zpci_dev *zdev)
467*cd248341SJan Glauber {
468*cd248341SJan Glauber 	/*
469*cd248341SJan Glauber 	 * Note: SCLP disables fh via set-pci-fn so don't
470*cd248341SJan Glauber 	 * do that here.
471*cd248341SJan Glauber 	 */
472*cd248341SJan Glauber }
473*cd248341SJan Glauber EXPORT_SYMBOL_GPL(zpci_stop_device);
474*cd248341SJan Glauber 
475*cd248341SJan Glauber int zpci_scan_device(struct zpci_dev *zdev)
476*cd248341SJan Glauber {
477*cd248341SJan Glauber 	zdev->pdev = pci_scan_single_device(zdev->bus, ZPCI_DEVFN);
478*cd248341SJan Glauber 	if (!zdev->pdev) {
479*cd248341SJan Glauber 		pr_err("pci_scan_single_device failed for fid: 0x%x\n",
480*cd248341SJan Glauber 			zdev->fid);
481*cd248341SJan Glauber 		goto out;
482*cd248341SJan Glauber 	}
483*cd248341SJan Glauber 
484*cd248341SJan Glauber 	zpci_map_resources(zdev);
485*cd248341SJan Glauber 	pci_bus_add_devices(zdev->bus);
486*cd248341SJan Glauber 
487*cd248341SJan Glauber 	/* now that pdev was added to the bus mark it as used */
488*cd248341SJan Glauber 	zdev->state = ZPCI_FN_STATE_ONLINE;
489*cd248341SJan Glauber 	return 0;
490*cd248341SJan Glauber 
491*cd248341SJan Glauber out:
492*cd248341SJan Glauber 	return -EIO;
493*cd248341SJan Glauber }
494*cd248341SJan Glauber EXPORT_SYMBOL_GPL(zpci_scan_device);
495*cd248341SJan Glauber 
496*cd248341SJan Glauber static inline int barsize(u8 size)
497*cd248341SJan Glauber {
498*cd248341SJan Glauber 	return (size) ? (1 << size) >> 10 : 0;
499*cd248341SJan Glauber }
500*cd248341SJan Glauber 
501*cd248341SJan Glauber static int zpci_mem_init(void)
502*cd248341SJan Glauber {
503*cd248341SJan Glauber 	/* TODO: use realloc */
504*cd248341SJan Glauber 	zpci_iomap_start = kzalloc(ZPCI_IOMAP_MAX_ENTRIES * sizeof(*zpci_iomap_start),
505*cd248341SJan Glauber 				   GFP_KERNEL);
506*cd248341SJan Glauber 	if (!zpci_iomap_start)
507*cd248341SJan Glauber 		goto error_zdev;
508*cd248341SJan Glauber 	return 0;
509*cd248341SJan Glauber 
510*cd248341SJan Glauber error_zdev:
511*cd248341SJan Glauber 	return -ENOMEM;
512*cd248341SJan Glauber }
513*cd248341SJan Glauber 
514*cd248341SJan Glauber static void zpci_mem_exit(void)
515*cd248341SJan Glauber {
516*cd248341SJan Glauber 	kfree(zpci_iomap_start);
517*cd248341SJan Glauber }
518*cd248341SJan Glauber 
519*cd248341SJan Glauber unsigned int pci_probe = 1;
520*cd248341SJan Glauber EXPORT_SYMBOL_GPL(pci_probe);
521*cd248341SJan Glauber 
522*cd248341SJan Glauber char * __init pcibios_setup(char *str)
523*cd248341SJan Glauber {
524*cd248341SJan Glauber 	if (!strcmp(str, "off")) {
525*cd248341SJan Glauber 		pci_probe = 0;
526*cd248341SJan Glauber 		return NULL;
527*cd248341SJan Glauber 	}
528*cd248341SJan Glauber 	return str;
529*cd248341SJan Glauber }
530*cd248341SJan Glauber 
531*cd248341SJan Glauber static int __init pci_base_init(void)
532*cd248341SJan Glauber {
533*cd248341SJan Glauber 	int rc;
534*cd248341SJan Glauber 
535*cd248341SJan Glauber 	if (!pci_probe)
536*cd248341SJan Glauber 		return 0;
537*cd248341SJan Glauber 
538*cd248341SJan Glauber 	if (!test_facility(2) || !test_facility(69)
539*cd248341SJan Glauber 	    || !test_facility(71) || !test_facility(72))
540*cd248341SJan Glauber 		return 0;
541*cd248341SJan Glauber 
542*cd248341SJan Glauber 	pr_info("Probing PCI hardware: PCI:%d  SID:%d  AEN:%d\n",
543*cd248341SJan Glauber 		test_facility(69), test_facility(70),
544*cd248341SJan Glauber 		test_facility(71));
545*cd248341SJan Glauber 
546*cd248341SJan Glauber 	rc = zpci_mem_init();
547*cd248341SJan Glauber 	if (rc)
548*cd248341SJan Glauber 		goto out_mem;
549*cd248341SJan Glauber 
550*cd248341SJan Glauber 	zpci_scan_devices();
551*cd248341SJan Glauber 	return 0;
552*cd248341SJan Glauber 
553*cd248341SJan Glauber 	zpci_mem_exit();
554*cd248341SJan Glauber out_mem:
555*cd248341SJan Glauber 	return rc;
556*cd248341SJan Glauber }
557*cd248341SJan Glauber subsys_initcall(pci_base_init);
558