• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * IBM Hot Plug Controller Driver
4  *
5  * Written By: Irene Zubarev, IBM Corporation
6  *
7  * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com)
8  * Copyright (C) 2001,2002 IBM Corp.
9  *
10  * All rights reserved.
11  *
12  * Send feedback to <gregkh@us.ibm.com>
13  *
14  */
15 
16 #include <linux/module.h>
17 #include <linux/slab.h>
18 #include <linux/pci.h>
19 #include <linux/list.h>
20 #include "ibmphp.h"
21 
22 
23 static int configure_device(struct pci_func *);
24 static int configure_bridge(struct pci_func **, u8);
25 static struct res_needed *scan_behind_bridge(struct pci_func *, u8);
26 static int add_new_bus(struct bus_node *, struct resource_node *, struct resource_node *, struct resource_node *, u8);
27 static u8 find_sec_number(u8 primary_busno, u8 slotno);
28 
29 /*
30  * NOTE..... If BIOS doesn't provide default routing, we assign:
31  * 9 for SCSI, 10 for LAN adapters, and 11 for everything else.
32  * If adapter is bridged, then we assign 11 to it and devices behind it.
33  * We also assign the same irq numbers for multi function devices.
34  * These are PIC mode, so shouldn't matter n.e.ways (hopefully)
35  */
assign_alt_irq(struct pci_func * cur_func,u8 class_code)36 static void assign_alt_irq(struct pci_func *cur_func, u8 class_code)
37 {
38 	int j;
39 	for (j = 0; j < 4; j++) {
40 		if (cur_func->irq[j] == 0xff) {
41 			switch (class_code) {
42 				case PCI_BASE_CLASS_STORAGE:
43 					cur_func->irq[j] = SCSI_IRQ;
44 					break;
45 				case PCI_BASE_CLASS_NETWORK:
46 					cur_func->irq[j] = LAN_IRQ;
47 					break;
48 				default:
49 					cur_func->irq[j] = OTHER_IRQ;
50 					break;
51 			}
52 		}
53 	}
54 }
55 
56 /*
57  * Configures the device to be added (will allocate needed resources if it
58  * can), the device can be a bridge or a regular pci device, can also be
59  * multi-functional
60  *
61  * Input: function to be added
62  *
63  * TO DO:  The error case with Multifunction device or multi function bridge,
64  * if there is an error, will need to go through all previous functions and
65  * unconfigure....or can add some code into unconfigure_card....
66  */
ibmphp_configure_card(struct pci_func * func,u8 slotno)67 int ibmphp_configure_card(struct pci_func *func, u8 slotno)
68 {
69 	u16 vendor_id;
70 	u32 class;
71 	u8 class_code;
72 	u8 hdr_type, device, sec_number;
73 	u8 function;
74 	struct pci_func *newfunc;	/* for multi devices */
75 	struct pci_func *cur_func, *prev_func;
76 	int rc, i, j;
77 	int cleanup_count;
78 	u8 flag;
79 	u8 valid_device = 0x00; /* to see if we are able to read from card any device info at all */
80 
81 	debug("inside configure_card, func->busno = %x\n", func->busno);
82 
83 	device = func->device;
84 	cur_func = func;
85 
86 	/* We only get bus and device from IRQ routing table.  So at this point,
87 	 * func->busno is correct, and func->device contains only device (at the 5
88 	 * highest bits)
89 	 */
90 
91 	/* For every function on the card */
92 	for (function = 0x00; function < 0x08; function++) {
93 		unsigned int devfn = PCI_DEVFN(device, function);
94 		ibmphp_pci_bus->number = cur_func->busno;
95 
96 		cur_func->function = function;
97 
98 		debug("inside the loop, cur_func->busno = %x, cur_func->device = %x, cur_func->function = %x\n",
99 			cur_func->busno, cur_func->device, cur_func->function);
100 
101 		pci_bus_read_config_word(ibmphp_pci_bus, devfn, PCI_VENDOR_ID, &vendor_id);
102 
103 		debug("vendor_id is %x\n", vendor_id);
104 		if (vendor_id != PCI_VENDOR_ID_NOTVALID) {
105 			/* found correct device!!! */
106 			debug("found valid device, vendor_id = %x\n", vendor_id);
107 
108 			++valid_device;
109 
110 			/* header: x x x x x x x x
111 			 *         | |___________|=> 1=PPB bridge, 0=normal device, 2=CardBus Bridge
112 			 *         |_=> 0 = single function device, 1 = multi-function device
113 			 */
114 
115 			pci_bus_read_config_byte(ibmphp_pci_bus, devfn, PCI_HEADER_TYPE, &hdr_type);
116 			pci_bus_read_config_dword(ibmphp_pci_bus, devfn, PCI_CLASS_REVISION, &class);
117 
118 			class_code = class >> 24;
119 			debug("hrd_type = %x, class = %x, class_code %x\n", hdr_type, class, class_code);
120 			class >>= 8;	/* to take revision out, class = class.subclass.prog i/f */
121 			if (class == PCI_CLASS_NOT_DEFINED_VGA) {
122 				err("The device %x is VGA compatible and as is not supported for hot plugging. "
123 				     "Please choose another device.\n", cur_func->device);
124 				return -ENODEV;
125 			} else if (class == PCI_CLASS_DISPLAY_VGA) {
126 				err("The device %x is not supported for hot plugging. Please choose another device.\n",
127 				     cur_func->device);
128 				return -ENODEV;
129 			}
130 			switch (hdr_type) {
131 				case PCI_HEADER_TYPE_NORMAL:
132 					debug("single device case.... vendor id = %x, hdr_type = %x, class = %x\n", vendor_id, hdr_type, class);
133 					assign_alt_irq(cur_func, class_code);
134 					rc = configure_device(cur_func);
135 					if (rc < 0) {
136 						/* We need to do this in case some other BARs were properly inserted */
137 						err("was not able to configure devfunc %x on bus %x.\n",
138 						     cur_func->device, cur_func->busno);
139 						cleanup_count = 6;
140 						goto error;
141 					}
142 					cur_func->next = NULL;
143 					function = 0x8;
144 					break;
145 				case PCI_HEADER_TYPE_MULTIDEVICE:
146 					assign_alt_irq(cur_func, class_code);
147 					rc = configure_device(cur_func);
148 					if (rc < 0) {
149 						/* We need to do this in case some other BARs were properly inserted */
150 						err("was not able to configure devfunc %x on bus %x...bailing out\n",
151 						     cur_func->device, cur_func->busno);
152 						cleanup_count = 6;
153 						goto error;
154 					}
155 					newfunc = kzalloc(sizeof(*newfunc), GFP_KERNEL);
156 					if (!newfunc)
157 						return -ENOMEM;
158 
159 					newfunc->busno = cur_func->busno;
160 					newfunc->device = device;
161 					cur_func->next = newfunc;
162 					cur_func = newfunc;
163 					for (j = 0; j < 4; j++)
164 						newfunc->irq[j] = cur_func->irq[j];
165 					break;
166 				case PCI_HEADER_TYPE_MULTIBRIDGE:
167 					class >>= 8;
168 					if (class != PCI_CLASS_BRIDGE_PCI) {
169 						err("This %x is not PCI-to-PCI bridge, and as is not supported for hot-plugging.  Please insert another card.\n",
170 						     cur_func->device);
171 						return -ENODEV;
172 					}
173 					assign_alt_irq(cur_func, class_code);
174 					rc = configure_bridge(&cur_func, slotno);
175 					if (rc == -ENODEV) {
176 						err("You chose to insert Single Bridge, or nested bridges, this is not supported...\n");
177 						err("Bus %x, devfunc %x\n", cur_func->busno, cur_func->device);
178 						return rc;
179 					}
180 					if (rc) {
181 						/* We need to do this in case some other BARs were properly inserted */
182 						err("was not able to hot-add PPB properly.\n");
183 						func->bus = 1; /* To indicate to the unconfigure function that this is a PPB */
184 						cleanup_count = 2;
185 						goto error;
186 					}
187 
188 					pci_bus_read_config_byte(ibmphp_pci_bus, devfn, PCI_SECONDARY_BUS, &sec_number);
189 					flag = 0;
190 					for (i = 0; i < 32; i++) {
191 						if (func->devices[i]) {
192 							newfunc = kzalloc(sizeof(*newfunc), GFP_KERNEL);
193 							if (!newfunc)
194 								return -ENOMEM;
195 
196 							newfunc->busno = sec_number;
197 							newfunc->device = (u8) i;
198 							for (j = 0; j < 4; j++)
199 								newfunc->irq[j] = cur_func->irq[j];
200 
201 							if (flag) {
202 								for (prev_func = cur_func; prev_func->next; prev_func = prev_func->next) ;
203 								prev_func->next = newfunc;
204 							} else
205 								cur_func->next = newfunc;
206 
207 							rc = ibmphp_configure_card(newfunc, slotno);
208 							/* This could only happen if kmalloc failed */
209 							if (rc) {
210 								/* We need to do this in case bridge itself got configured properly, but devices behind it failed */
211 								func->bus = 1; /* To indicate to the unconfigure function that this is a PPB */
212 								cleanup_count = 2;
213 								goto error;
214 							}
215 							flag = 1;
216 						}
217 					}
218 
219 					newfunc = kzalloc(sizeof(*newfunc), GFP_KERNEL);
220 					if (!newfunc)
221 						return -ENOMEM;
222 
223 					newfunc->busno = cur_func->busno;
224 					newfunc->device = device;
225 					for (j = 0; j < 4; j++)
226 						newfunc->irq[j] = cur_func->irq[j];
227 					for (prev_func = cur_func; prev_func->next; prev_func = prev_func->next);
228 					prev_func->next = newfunc;
229 					cur_func = newfunc;
230 					break;
231 				case PCI_HEADER_TYPE_BRIDGE:
232 					class >>= 8;
233 					debug("class now is %x\n", class);
234 					if (class != PCI_CLASS_BRIDGE_PCI) {
235 						err("This %x is not PCI-to-PCI bridge, and as is not supported for hot-plugging.  Please insert another card.\n",
236 						     cur_func->device);
237 						return -ENODEV;
238 					}
239 
240 					assign_alt_irq(cur_func, class_code);
241 
242 					debug("cur_func->busno b4 configure_bridge is %x\n", cur_func->busno);
243 					rc = configure_bridge(&cur_func, slotno);
244 					if (rc == -ENODEV) {
245 						err("You chose to insert Single Bridge, or nested bridges, this is not supported...\n");
246 						err("Bus %x, devfunc %x\n", cur_func->busno, cur_func->device);
247 						return rc;
248 					}
249 					if (rc) {
250 						/* We need to do this in case some other BARs were properly inserted */
251 						func->bus = 1; /* To indicate to the unconfigure function that this is a PPB */
252 						err("was not able to hot-add PPB properly.\n");
253 						cleanup_count = 2;
254 						goto error;
255 					}
256 					debug("cur_func->busno = %x, device = %x, function = %x\n",
257 						cur_func->busno, device, function);
258 					pci_bus_read_config_byte(ibmphp_pci_bus, devfn, PCI_SECONDARY_BUS, &sec_number);
259 					debug("after configuring bridge..., sec_number = %x\n", sec_number);
260 					flag = 0;
261 					for (i = 0; i < 32; i++) {
262 						if (func->devices[i]) {
263 							debug("inside for loop, device is %x\n", i);
264 							newfunc = kzalloc(sizeof(*newfunc), GFP_KERNEL);
265 							if (!newfunc)
266 								return -ENOMEM;
267 
268 							newfunc->busno = sec_number;
269 							newfunc->device = (u8) i;
270 							for (j = 0; j < 4; j++)
271 								newfunc->irq[j] = cur_func->irq[j];
272 
273 							if (flag) {
274 								for (prev_func = cur_func; prev_func->next; prev_func = prev_func->next);
275 								prev_func->next = newfunc;
276 							} else
277 								cur_func->next = newfunc;
278 
279 							rc = ibmphp_configure_card(newfunc, slotno);
280 
281 							/* Again, this case should not happen... For complete paranoia, will need to call remove_bus */
282 							if (rc) {
283 								/* We need to do this in case some other BARs were properly inserted */
284 								func->bus = 1; /* To indicate to the unconfigure function that this is a PPB */
285 								cleanup_count = 2;
286 								goto error;
287 							}
288 							flag = 1;
289 						}
290 					}
291 
292 					function = 0x8;
293 					break;
294 				default:
295 					err("MAJOR PROBLEM!!!!, header type not supported? %x\n", hdr_type);
296 					return -ENXIO;
297 					break;
298 			}	/* end of switch */
299 		}	/* end of valid device */
300 	}	/* end of for */
301 
302 	if (!valid_device) {
303 		err("Cannot find any valid devices on the card.  Or unable to read from card.\n");
304 		return -ENODEV;
305 	}
306 
307 	return 0;
308 
309 error:
310 	for (i = 0; i < cleanup_count; i++) {
311 		if (cur_func->io[i]) {
312 			ibmphp_remove_resource(cur_func->io[i]);
313 			cur_func->io[i] = NULL;
314 		} else if (cur_func->pfmem[i]) {
315 			ibmphp_remove_resource(cur_func->pfmem[i]);
316 			cur_func->pfmem[i] = NULL;
317 		} else if (cur_func->mem[i]) {
318 			ibmphp_remove_resource(cur_func->mem[i]);
319 			cur_func->mem[i] = NULL;
320 		}
321 	}
322 	return rc;
323 }
324 
325 /*
326  * This function configures the pci BARs of a single device.
327  * Input: pointer to the pci_func
328  * Output: configured PCI, 0, or error
329  */
configure_device(struct pci_func * func)330 static int configure_device(struct pci_func *func)
331 {
332 	u32 bar[6];
333 	u32 address[] = {
334 		PCI_BASE_ADDRESS_0,
335 		PCI_BASE_ADDRESS_1,
336 		PCI_BASE_ADDRESS_2,
337 		PCI_BASE_ADDRESS_3,
338 		PCI_BASE_ADDRESS_4,
339 		PCI_BASE_ADDRESS_5,
340 		0
341 	};
342 	u8 irq;
343 	int count;
344 	int len[6];
345 	struct resource_node *io[6];
346 	struct resource_node *mem[6];
347 	struct resource_node *mem_tmp;
348 	struct resource_node *pfmem[6];
349 	unsigned int devfn;
350 
351 	debug("%s - inside\n", __func__);
352 
353 	devfn = PCI_DEVFN(func->device, func->function);
354 	ibmphp_pci_bus->number = func->busno;
355 
356 	for (count = 0; address[count]; count++) {	/* for 6 BARs */
357 
358 		/* not sure if i need this.  per scott, said maybe need * something like this
359 		   if devices don't adhere 100% to the spec, so don't want to write
360 		   to the reserved bits
361 
362 		pcibios_read_config_byte(cur_func->busno, cur_func->device,
363 		PCI_BASE_ADDRESS_0 + 4 * count, &tmp);
364 		if (tmp & 0x01) // IO
365 			pcibios_write_config_dword(cur_func->busno, cur_func->device,
366 			PCI_BASE_ADDRESS_0 + 4 * count, 0xFFFFFFFD);
367 		else  // Memory
368 			pcibios_write_config_dword(cur_func->busno, cur_func->device,
369 			PCI_BASE_ADDRESS_0 + 4 * count, 0xFFFFFFFF);
370 		 */
371 		pci_bus_write_config_dword(ibmphp_pci_bus, devfn, address[count], 0xFFFFFFFF);
372 		pci_bus_read_config_dword(ibmphp_pci_bus, devfn, address[count], &bar[count]);
373 
374 		if (!bar[count])	/* This BAR is not implemented */
375 			continue;
376 
377 		debug("Device %x BAR %d wants %x\n", func->device, count, bar[count]);
378 
379 		if (bar[count] & PCI_BASE_ADDRESS_SPACE_IO) {
380 			/* This is IO */
381 			debug("inside IO SPACE\n");
382 
383 			len[count] = bar[count] & 0xFFFFFFFC;
384 			len[count] = ~len[count] + 1;
385 
386 			debug("len[count] in IO %x, count %d\n", len[count], count);
387 
388 			io[count] = kzalloc(sizeof(struct resource_node), GFP_KERNEL);
389 
390 			if (!io[count])
391 				return -ENOMEM;
392 
393 			io[count]->type = IO;
394 			io[count]->busno = func->busno;
395 			io[count]->devfunc = PCI_DEVFN(func->device, func->function);
396 			io[count]->len = len[count];
397 			if (ibmphp_check_resource(io[count], 0) == 0) {
398 				ibmphp_add_resource(io[count]);
399 				func->io[count] = io[count];
400 			} else {
401 				err("cannot allocate requested io for bus %x device %x function %x len %x\n",
402 				     func->busno, func->device, func->function, len[count]);
403 				kfree(io[count]);
404 				return -EIO;
405 			}
406 			pci_bus_write_config_dword(ibmphp_pci_bus, devfn, address[count], func->io[count]->start);
407 
408 			/* _______________This is for debugging purposes only_____________________ */
409 			debug("b4 writing, the IO address is %x\n", func->io[count]->start);
410 			pci_bus_read_config_dword(ibmphp_pci_bus, devfn, address[count], &bar[count]);
411 			debug("after writing.... the start address is %x\n", bar[count]);
412 			/* _________________________________________________________________________*/
413 
414 		} else {
415 			/* This is Memory */
416 			if (bar[count] & PCI_BASE_ADDRESS_MEM_PREFETCH) {
417 				/* pfmem */
418 				debug("PFMEM SPACE\n");
419 
420 				len[count] = bar[count] & 0xFFFFFFF0;
421 				len[count] = ~len[count] + 1;
422 
423 				debug("len[count] in PFMEM %x, count %d\n", len[count], count);
424 
425 				pfmem[count] = kzalloc(sizeof(struct resource_node), GFP_KERNEL);
426 				if (!pfmem[count])
427 					return -ENOMEM;
428 
429 				pfmem[count]->type = PFMEM;
430 				pfmem[count]->busno = func->busno;
431 				pfmem[count]->devfunc = PCI_DEVFN(func->device,
432 							func->function);
433 				pfmem[count]->len = len[count];
434 				pfmem[count]->fromMem = 0;
435 				if (ibmphp_check_resource(pfmem[count], 0) == 0) {
436 					ibmphp_add_resource(pfmem[count]);
437 					func->pfmem[count] = pfmem[count];
438 				} else {
439 					mem_tmp = kzalloc(sizeof(*mem_tmp), GFP_KERNEL);
440 					if (!mem_tmp) {
441 						kfree(pfmem[count]);
442 						return -ENOMEM;
443 					}
444 					mem_tmp->type = MEM;
445 					mem_tmp->busno = pfmem[count]->busno;
446 					mem_tmp->devfunc = pfmem[count]->devfunc;
447 					mem_tmp->len = pfmem[count]->len;
448 					debug("there's no pfmem... going into mem.\n");
449 					if (ibmphp_check_resource(mem_tmp, 0) == 0) {
450 						ibmphp_add_resource(mem_tmp);
451 						pfmem[count]->fromMem = 1;
452 						pfmem[count]->rangeno = mem_tmp->rangeno;
453 						pfmem[count]->start = mem_tmp->start;
454 						pfmem[count]->end = mem_tmp->end;
455 						ibmphp_add_pfmem_from_mem(pfmem[count]);
456 						func->pfmem[count] = pfmem[count];
457 					} else {
458 						err("cannot allocate requested pfmem for bus %x, device %x, len %x\n",
459 						     func->busno, func->device, len[count]);
460 						kfree(mem_tmp);
461 						kfree(pfmem[count]);
462 						return -EIO;
463 					}
464 				}
465 
466 				pci_bus_write_config_dword(ibmphp_pci_bus, devfn, address[count], func->pfmem[count]->start);
467 
468 				/*_______________This is for debugging purposes only______________________________*/
469 				debug("b4 writing, start address is %x\n", func->pfmem[count]->start);
470 				pci_bus_read_config_dword(ibmphp_pci_bus, devfn, address[count], &bar[count]);
471 				debug("after writing, start address is %x\n", bar[count]);
472 				/*_________________________________________________________________________________*/
473 
474 				if (bar[count] & PCI_BASE_ADDRESS_MEM_TYPE_64) {	/* takes up another dword */
475 					debug("inside the mem 64 case, count %d\n", count);
476 					count += 1;
477 					/* on the 2nd dword, write all 0s, since we can't handle them n.e.ways */
478 					pci_bus_write_config_dword(ibmphp_pci_bus, devfn, address[count], 0x00000000);
479 				}
480 			} else {
481 				/* regular memory */
482 				debug("REGULAR MEM SPACE\n");
483 
484 				len[count] = bar[count] & 0xFFFFFFF0;
485 				len[count] = ~len[count] + 1;
486 
487 				debug("len[count] in Mem %x, count %d\n", len[count], count);
488 
489 				mem[count] = kzalloc(sizeof(struct resource_node), GFP_KERNEL);
490 				if (!mem[count])
491 					return -ENOMEM;
492 
493 				mem[count]->type = MEM;
494 				mem[count]->busno = func->busno;
495 				mem[count]->devfunc = PCI_DEVFN(func->device,
496 							func->function);
497 				mem[count]->len = len[count];
498 				if (ibmphp_check_resource(mem[count], 0) == 0) {
499 					ibmphp_add_resource(mem[count]);
500 					func->mem[count] = mem[count];
501 				} else {
502 					err("cannot allocate requested mem for bus %x, device %x, len %x\n",
503 					     func->busno, func->device, len[count]);
504 					kfree(mem[count]);
505 					return -EIO;
506 				}
507 				pci_bus_write_config_dword(ibmphp_pci_bus, devfn, address[count], func->mem[count]->start);
508 				/* _______________________This is for debugging purposes only _______________________*/
509 				debug("b4 writing, start address is %x\n", func->mem[count]->start);
510 				pci_bus_read_config_dword(ibmphp_pci_bus, devfn, address[count], &bar[count]);
511 				debug("after writing, the address is %x\n", bar[count]);
512 				/* __________________________________________________________________________________*/
513 
514 				if (bar[count] & PCI_BASE_ADDRESS_MEM_TYPE_64) {
515 					/* takes up another dword */
516 					debug("inside mem 64 case, reg. mem, count %d\n", count);
517 					count += 1;
518 					/* on the 2nd dword, write all 0s, since we can't handle them n.e.ways */
519 					pci_bus_write_config_dword(ibmphp_pci_bus, devfn, address[count], 0x00000000);
520 				}
521 			}
522 		}		/* end of mem */
523 	}			/* end of for */
524 
525 	func->bus = 0;		/* To indicate that this is not a PPB */
526 	pci_bus_read_config_byte(ibmphp_pci_bus, devfn, PCI_INTERRUPT_PIN, &irq);
527 	if ((irq > 0x00) && (irq < 0x05))
528 		pci_bus_write_config_byte(ibmphp_pci_bus, devfn, PCI_INTERRUPT_LINE, func->irq[irq - 1]);
529 
530 	pci_bus_write_config_byte(ibmphp_pci_bus, devfn, PCI_CACHE_LINE_SIZE, CACHE);
531 	pci_bus_write_config_byte(ibmphp_pci_bus, devfn, PCI_LATENCY_TIMER, LATENCY);
532 
533 	pci_bus_write_config_dword(ibmphp_pci_bus, devfn, PCI_ROM_ADDRESS, 0x00L);
534 	pci_bus_write_config_word(ibmphp_pci_bus, devfn, PCI_COMMAND, DEVICEENABLE);
535 
536 	return 0;
537 }
538 
539 /******************************************************************************
540  * This routine configures a PCI-2-PCI bridge and the functions behind it
541  * Parameters: pci_func
542  * Returns:
543  ******************************************************************************/
configure_bridge(struct pci_func ** func_passed,u8 slotno)544 static int configure_bridge(struct pci_func **func_passed, u8 slotno)
545 {
546 	int count;
547 	int i;
548 	int rc;
549 	u8 sec_number;
550 	u8 io_base;
551 	u16 pfmem_base;
552 	u32 bar[2];
553 	u32 len[2];
554 	u8 flag_io = 0;
555 	u8 flag_mem = 0;
556 	u8 flag_pfmem = 0;
557 	u8 need_io_upper = 0;
558 	u8 need_pfmem_upper = 0;
559 	struct res_needed *amount_needed = NULL;
560 	struct resource_node *io = NULL;
561 	struct resource_node *bus_io[2] = {NULL, NULL};
562 	struct resource_node *mem = NULL;
563 	struct resource_node *bus_mem[2] = {NULL, NULL};
564 	struct resource_node *mem_tmp = NULL;
565 	struct resource_node *pfmem = NULL;
566 	struct resource_node *bus_pfmem[2] = {NULL, NULL};
567 	struct bus_node *bus;
568 	u32 address[] = {
569 		PCI_BASE_ADDRESS_0,
570 		PCI_BASE_ADDRESS_1,
571 		0
572 	};
573 	struct pci_func *func = *func_passed;
574 	unsigned int devfn;
575 	u8 irq;
576 	int retval;
577 
578 	debug("%s - enter\n", __func__);
579 
580 	devfn = PCI_DEVFN(func->function, func->device);
581 	ibmphp_pci_bus->number = func->busno;
582 
583 	/* Configuring necessary info for the bridge so that we could see the devices
584 	 * behind it
585 	 */
586 
587 	pci_bus_write_config_byte(ibmphp_pci_bus, devfn, PCI_PRIMARY_BUS, func->busno);
588 
589 	/* _____________________For debugging purposes only __________________________
590 	pci_bus_config_byte(ibmphp_pci_bus, devfn, PCI_PRIMARY_BUS, &pri_number);
591 	debug("primary # written into the bridge is %x\n", pri_number);
592 	 ___________________________________________________________________________*/
593 
594 	/* in EBDA, only get allocated 1 additional bus # per slot */
595 	sec_number = find_sec_number(func->busno, slotno);
596 	if (sec_number == 0xff) {
597 		err("cannot allocate secondary bus number for the bridged device\n");
598 		return -EINVAL;
599 	}
600 
601 	debug("after find_sec_number, the number we got is %x\n", sec_number);
602 	debug("AFTER FIND_SEC_NUMBER, func->busno IS %x\n", func->busno);
603 
604 	pci_bus_write_config_byte(ibmphp_pci_bus, devfn, PCI_SECONDARY_BUS, sec_number);
605 
606 	/* __________________For debugging purposes only __________________________________
607 	pci_bus_read_config_byte(ibmphp_pci_bus, devfn, PCI_SECONDARY_BUS, &sec_number);
608 	debug("sec_number after write/read is %x\n", sec_number);
609 	 ________________________________________________________________________________*/
610 
611 	pci_bus_write_config_byte(ibmphp_pci_bus, devfn, PCI_SUBORDINATE_BUS, sec_number);
612 
613 	/* __________________For debugging purposes only ____________________________________
614 	pci_bus_read_config_byte(ibmphp_pci_bus, devfn, PCI_SUBORDINATE_BUS, &sec_number);
615 	debug("subordinate number after write/read is %x\n", sec_number);
616 	 __________________________________________________________________________________*/
617 
618 	pci_bus_write_config_byte(ibmphp_pci_bus, devfn, PCI_CACHE_LINE_SIZE, CACHE);
619 	pci_bus_write_config_byte(ibmphp_pci_bus, devfn, PCI_LATENCY_TIMER, LATENCY);
620 	pci_bus_write_config_byte(ibmphp_pci_bus, devfn, PCI_SEC_LATENCY_TIMER, LATENCY);
621 
622 	debug("func->busno is %x\n", func->busno);
623 	debug("sec_number after writing is %x\n", sec_number);
624 
625 
626 	/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
627 	   !!!!!!!!!!!!!!!NEED TO ADD!!!  FAST BACK-TO-BACK ENABLE!!!!!!!!!!!!!!!!!!!!
628 	   !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/
629 
630 
631 	/* First we need to allocate mem/io for the bridge itself in case it needs it */
632 	for (count = 0; address[count]; count++) {	/* for 2 BARs */
633 		pci_bus_write_config_dword(ibmphp_pci_bus, devfn, address[count], 0xFFFFFFFF);
634 		pci_bus_read_config_dword(ibmphp_pci_bus, devfn, address[count], &bar[count]);
635 
636 		if (!bar[count]) {
637 			/* This BAR is not implemented */
638 			debug("so we come here then, eh?, count = %d\n", count);
639 			continue;
640 		}
641 		//  tmp_bar = bar[count];
642 
643 		debug("Bar %d wants %x\n", count, bar[count]);
644 
645 		if (bar[count] & PCI_BASE_ADDRESS_SPACE_IO) {
646 			/* This is IO */
647 			len[count] = bar[count] & 0xFFFFFFFC;
648 			len[count] = ~len[count] + 1;
649 
650 			debug("len[count] in IO = %x\n", len[count]);
651 
652 			bus_io[count] = kzalloc(sizeof(struct resource_node), GFP_KERNEL);
653 
654 			if (!bus_io[count]) {
655 				retval = -ENOMEM;
656 				goto error;
657 			}
658 			bus_io[count]->type = IO;
659 			bus_io[count]->busno = func->busno;
660 			bus_io[count]->devfunc = PCI_DEVFN(func->device,
661 							func->function);
662 			bus_io[count]->len = len[count];
663 			if (ibmphp_check_resource(bus_io[count], 0) == 0) {
664 				ibmphp_add_resource(bus_io[count]);
665 				func->io[count] = bus_io[count];
666 			} else {
667 				err("cannot allocate requested io for bus %x, device %x, len %x\n",
668 				     func->busno, func->device, len[count]);
669 				kfree(bus_io[count]);
670 				return -EIO;
671 			}
672 
673 			pci_bus_write_config_dword(ibmphp_pci_bus, devfn, address[count], func->io[count]->start);
674 
675 		} else {
676 			/* This is Memory */
677 			if (bar[count] & PCI_BASE_ADDRESS_MEM_PREFETCH) {
678 				/* pfmem */
679 				len[count] = bar[count] & 0xFFFFFFF0;
680 				len[count] = ~len[count] + 1;
681 
682 				debug("len[count] in PFMEM = %x\n", len[count]);
683 
684 				bus_pfmem[count] = kzalloc(sizeof(struct resource_node), GFP_KERNEL);
685 				if (!bus_pfmem[count]) {
686 					retval = -ENOMEM;
687 					goto error;
688 				}
689 				bus_pfmem[count]->type = PFMEM;
690 				bus_pfmem[count]->busno = func->busno;
691 				bus_pfmem[count]->devfunc = PCI_DEVFN(func->device,
692 							func->function);
693 				bus_pfmem[count]->len = len[count];
694 				bus_pfmem[count]->fromMem = 0;
695 				if (ibmphp_check_resource(bus_pfmem[count], 0) == 0) {
696 					ibmphp_add_resource(bus_pfmem[count]);
697 					func->pfmem[count] = bus_pfmem[count];
698 				} else {
699 					mem_tmp = kzalloc(sizeof(*mem_tmp), GFP_KERNEL);
700 					if (!mem_tmp) {
701 						retval = -ENOMEM;
702 						goto error;
703 					}
704 					mem_tmp->type = MEM;
705 					mem_tmp->busno = bus_pfmem[count]->busno;
706 					mem_tmp->devfunc = bus_pfmem[count]->devfunc;
707 					mem_tmp->len = bus_pfmem[count]->len;
708 					if (ibmphp_check_resource(mem_tmp, 0) == 0) {
709 						ibmphp_add_resource(mem_tmp);
710 						bus_pfmem[count]->fromMem = 1;
711 						bus_pfmem[count]->rangeno = mem_tmp->rangeno;
712 						ibmphp_add_pfmem_from_mem(bus_pfmem[count]);
713 						func->pfmem[count] = bus_pfmem[count];
714 					} else {
715 						err("cannot allocate requested pfmem for bus %x, device %x, len %x\n",
716 						     func->busno, func->device, len[count]);
717 						kfree(mem_tmp);
718 						kfree(bus_pfmem[count]);
719 						return -EIO;
720 					}
721 				}
722 
723 				pci_bus_write_config_dword(ibmphp_pci_bus, devfn, address[count], func->pfmem[count]->start);
724 
725 				if (bar[count] & PCI_BASE_ADDRESS_MEM_TYPE_64) {
726 					/* takes up another dword */
727 					count += 1;
728 					/* on the 2nd dword, write all 0s, since we can't handle them n.e.ways */
729 					pci_bus_write_config_dword(ibmphp_pci_bus, devfn, address[count], 0x00000000);
730 
731 				}
732 			} else {
733 				/* regular memory */
734 				len[count] = bar[count] & 0xFFFFFFF0;
735 				len[count] = ~len[count] + 1;
736 
737 				debug("len[count] in Memory is %x\n", len[count]);
738 
739 				bus_mem[count] = kzalloc(sizeof(struct resource_node), GFP_KERNEL);
740 				if (!bus_mem[count]) {
741 					retval = -ENOMEM;
742 					goto error;
743 				}
744 				bus_mem[count]->type = MEM;
745 				bus_mem[count]->busno = func->busno;
746 				bus_mem[count]->devfunc = PCI_DEVFN(func->device,
747 							func->function);
748 				bus_mem[count]->len = len[count];
749 				if (ibmphp_check_resource(bus_mem[count], 0) == 0) {
750 					ibmphp_add_resource(bus_mem[count]);
751 					func->mem[count] = bus_mem[count];
752 				} else {
753 					err("cannot allocate requested mem for bus %x, device %x, len %x\n",
754 					     func->busno, func->device, len[count]);
755 					kfree(bus_mem[count]);
756 					return -EIO;
757 				}
758 
759 				pci_bus_write_config_dword(ibmphp_pci_bus, devfn, address[count], func->mem[count]->start);
760 
761 				if (bar[count] & PCI_BASE_ADDRESS_MEM_TYPE_64) {
762 					/* takes up another dword */
763 					count += 1;
764 					/* on the 2nd dword, write all 0s, since we can't handle them n.e.ways */
765 					pci_bus_write_config_dword(ibmphp_pci_bus, devfn, address[count], 0x00000000);
766 
767 				}
768 			}
769 		}		/* end of mem */
770 	}			/* end of for  */
771 
772 	/* Now need to see how much space the devices behind the bridge needed */
773 	amount_needed = scan_behind_bridge(func, sec_number);
774 	if (amount_needed == NULL)
775 		return -ENOMEM;
776 
777 	ibmphp_pci_bus->number = func->busno;
778 	debug("after coming back from scan_behind_bridge\n");
779 	debug("amount_needed->not_correct = %x\n", amount_needed->not_correct);
780 	debug("amount_needed->io = %x\n", amount_needed->io);
781 	debug("amount_needed->mem = %x\n", amount_needed->mem);
782 	debug("amount_needed->pfmem =  %x\n", amount_needed->pfmem);
783 
784 	if (amount_needed->not_correct) {
785 		debug("amount_needed is not correct\n");
786 		for (count = 0; address[count]; count++) {
787 			/* for 2 BARs */
788 			if (bus_io[count]) {
789 				ibmphp_remove_resource(bus_io[count]);
790 				func->io[count] = NULL;
791 			} else if (bus_pfmem[count]) {
792 				ibmphp_remove_resource(bus_pfmem[count]);
793 				func->pfmem[count] = NULL;
794 			} else if (bus_mem[count]) {
795 				ibmphp_remove_resource(bus_mem[count]);
796 				func->mem[count] = NULL;
797 			}
798 		}
799 		kfree(amount_needed);
800 		return -ENODEV;
801 	}
802 
803 	if (!amount_needed->io) {
804 		debug("it doesn't want IO?\n");
805 		flag_io = 1;
806 	} else {
807 		debug("it wants %x IO behind the bridge\n", amount_needed->io);
808 		io = kzalloc(sizeof(*io), GFP_KERNEL);
809 
810 		if (!io) {
811 			retval = -ENOMEM;
812 			goto error;
813 		}
814 		io->type = IO;
815 		io->busno = func->busno;
816 		io->devfunc = PCI_DEVFN(func->device, func->function);
817 		io->len = amount_needed->io;
818 		if (ibmphp_check_resource(io, 1) == 0) {
819 			debug("were we able to add io\n");
820 			ibmphp_add_resource(io);
821 			flag_io = 1;
822 		}
823 	}
824 
825 	if (!amount_needed->mem) {
826 		debug("it doesn't want n.e.memory?\n");
827 		flag_mem = 1;
828 	} else {
829 		debug("it wants %x memory behind the bridge\n", amount_needed->mem);
830 		mem = kzalloc(sizeof(*mem), GFP_KERNEL);
831 		if (!mem) {
832 			retval = -ENOMEM;
833 			goto error;
834 		}
835 		mem->type = MEM;
836 		mem->busno = func->busno;
837 		mem->devfunc = PCI_DEVFN(func->device, func->function);
838 		mem->len = amount_needed->mem;
839 		if (ibmphp_check_resource(mem, 1) == 0) {
840 			ibmphp_add_resource(mem);
841 			flag_mem = 1;
842 			debug("were we able to add mem\n");
843 		}
844 	}
845 
846 	if (!amount_needed->pfmem) {
847 		debug("it doesn't want n.e.pfmem mem?\n");
848 		flag_pfmem = 1;
849 	} else {
850 		debug("it wants %x pfmemory behind the bridge\n", amount_needed->pfmem);
851 		pfmem = kzalloc(sizeof(*pfmem), GFP_KERNEL);
852 		if (!pfmem) {
853 			retval = -ENOMEM;
854 			goto error;
855 		}
856 		pfmem->type = PFMEM;
857 		pfmem->busno = func->busno;
858 		pfmem->devfunc = PCI_DEVFN(func->device, func->function);
859 		pfmem->len = amount_needed->pfmem;
860 		pfmem->fromMem = 0;
861 		if (ibmphp_check_resource(pfmem, 1) == 0) {
862 			ibmphp_add_resource(pfmem);
863 			flag_pfmem = 1;
864 		} else {
865 			mem_tmp = kzalloc(sizeof(*mem_tmp), GFP_KERNEL);
866 			if (!mem_tmp) {
867 				retval = -ENOMEM;
868 				goto error;
869 			}
870 			mem_tmp->type = MEM;
871 			mem_tmp->busno = pfmem->busno;
872 			mem_tmp->devfunc = pfmem->devfunc;
873 			mem_tmp->len = pfmem->len;
874 			if (ibmphp_check_resource(mem_tmp, 1) == 0) {
875 				ibmphp_add_resource(mem_tmp);
876 				pfmem->fromMem = 1;
877 				pfmem->rangeno = mem_tmp->rangeno;
878 				ibmphp_add_pfmem_from_mem(pfmem);
879 				flag_pfmem = 1;
880 			}
881 		}
882 	}
883 
884 	debug("b4 if (flag_io && flag_mem && flag_pfmem)\n");
885 	debug("flag_io = %x, flag_mem = %x, flag_pfmem = %x\n", flag_io, flag_mem, flag_pfmem);
886 
887 	if (flag_io && flag_mem && flag_pfmem) {
888 		/* If on bootup, there was a bridged card in this slot,
889 		 * then card was removed and ibmphp got unloaded and loaded
890 		 * back again, there's no way for us to remove the bus
891 		 * struct, so no need to kmalloc, can use existing node
892 		 */
893 		bus = ibmphp_find_res_bus(sec_number);
894 		if (!bus) {
895 			bus = kzalloc(sizeof(*bus), GFP_KERNEL);
896 			if (!bus) {
897 				retval = -ENOMEM;
898 				goto error;
899 			}
900 			bus->busno = sec_number;
901 			debug("b4 adding new bus\n");
902 			rc = add_new_bus(bus, io, mem, pfmem, func->busno);
903 		} else if (!(bus->rangeIO) && !(bus->rangeMem) && !(bus->rangePFMem))
904 			rc = add_new_bus(bus, io, mem, pfmem, 0xFF);
905 		else {
906 			err("expected bus structure not empty?\n");
907 			retval = -EIO;
908 			goto error;
909 		}
910 		if (rc) {
911 			if (rc == -ENOMEM) {
912 				ibmphp_remove_bus(bus, func->busno);
913 				kfree(amount_needed);
914 				return rc;
915 			}
916 			retval = rc;
917 			goto error;
918 		}
919 		pci_bus_read_config_byte(ibmphp_pci_bus, devfn, PCI_IO_BASE, &io_base);
920 		pci_bus_read_config_word(ibmphp_pci_bus, devfn, PCI_PREF_MEMORY_BASE, &pfmem_base);
921 
922 		if ((io_base & PCI_IO_RANGE_TYPE_MASK) == PCI_IO_RANGE_TYPE_32) {
923 			debug("io 32\n");
924 			need_io_upper = 1;
925 		}
926 		if ((pfmem_base & PCI_PREF_RANGE_TYPE_MASK) == PCI_PREF_RANGE_TYPE_64) {
927 			debug("pfmem 64\n");
928 			need_pfmem_upper = 1;
929 		}
930 
931 		if (bus->noIORanges) {
932 			pci_bus_write_config_byte(ibmphp_pci_bus, devfn, PCI_IO_BASE, 0x00 | bus->rangeIO->start >> 8);
933 			pci_bus_write_config_byte(ibmphp_pci_bus, devfn, PCI_IO_LIMIT, 0x00 | bus->rangeIO->end >> 8);
934 
935 			/* _______________This is for debugging purposes only ____________________
936 			pci_bus_read_config_byte(ibmphp_pci_bus, devfn, PCI_IO_BASE, &temp);
937 			debug("io_base = %x\n", (temp & PCI_IO_RANGE_TYPE_MASK) << 8);
938 			pci_bus_read_config_byte(ibmphp_pci_bus, devfn, PCI_IO_LIMIT, &temp);
939 			debug("io_limit = %x\n", (temp & PCI_IO_RANGE_TYPE_MASK) << 8);
940 			 ________________________________________________________________________*/
941 
942 			if (need_io_upper) {	/* since can't support n.e.ways */
943 				pci_bus_write_config_word(ibmphp_pci_bus, devfn, PCI_IO_BASE_UPPER16, 0x0000);
944 				pci_bus_write_config_word(ibmphp_pci_bus, devfn, PCI_IO_LIMIT_UPPER16, 0x0000);
945 			}
946 		} else {
947 			pci_bus_write_config_byte(ibmphp_pci_bus, devfn, PCI_IO_BASE, 0x00);
948 			pci_bus_write_config_byte(ibmphp_pci_bus, devfn, PCI_IO_LIMIT, 0x00);
949 		}
950 
951 		if (bus->noMemRanges) {
952 			pci_bus_write_config_word(ibmphp_pci_bus, devfn, PCI_MEMORY_BASE, 0x0000 | bus->rangeMem->start >> 16);
953 			pci_bus_write_config_word(ibmphp_pci_bus, devfn, PCI_MEMORY_LIMIT, 0x0000 | bus->rangeMem->end >> 16);
954 
955 			/* ____________________This is for debugging purposes only ________________________
956 			pci_bus_read_config_word(ibmphp_pci_bus, devfn, PCI_MEMORY_BASE, &temp);
957 			debug("mem_base = %x\n", (temp & PCI_MEMORY_RANGE_TYPE_MASK) << 16);
958 			pci_bus_read_config_word(ibmphp_pci_bus, devfn, PCI_MEMORY_LIMIT, &temp);
959 			debug("mem_limit = %x\n", (temp & PCI_MEMORY_RANGE_TYPE_MASK) << 16);
960 			 __________________________________________________________________________________*/
961 
962 		} else {
963 			pci_bus_write_config_word(ibmphp_pci_bus, devfn, PCI_MEMORY_BASE, 0xffff);
964 			pci_bus_write_config_word(ibmphp_pci_bus, devfn, PCI_MEMORY_LIMIT, 0x0000);
965 		}
966 		if (bus->noPFMemRanges) {
967 			pci_bus_write_config_word(ibmphp_pci_bus, devfn, PCI_PREF_MEMORY_BASE, 0x0000 | bus->rangePFMem->start >> 16);
968 			pci_bus_write_config_word(ibmphp_pci_bus, devfn, PCI_PREF_MEMORY_LIMIT, 0x0000 | bus->rangePFMem->end >> 16);
969 
970 			/* __________________________This is for debugging purposes only _______________________
971 			pci_bus_read_config_word(ibmphp_pci_bus, devfn, PCI_PREF_MEMORY_BASE, &temp);
972 			debug("pfmem_base = %x", (temp & PCI_MEMORY_RANGE_TYPE_MASK) << 16);
973 			pci_bus_read_config_word(ibmphp_pci_bus, devfn, PCI_PREF_MEMORY_LIMIT, &temp);
974 			debug("pfmem_limit = %x\n", (temp & PCI_MEMORY_RANGE_TYPE_MASK) << 16);
975 			 ______________________________________________________________________________________*/
976 
977 			if (need_pfmem_upper) {	/* since can't support n.e.ways */
978 				pci_bus_write_config_dword(ibmphp_pci_bus, devfn, PCI_PREF_BASE_UPPER32, 0x00000000);
979 				pci_bus_write_config_dword(ibmphp_pci_bus, devfn, PCI_PREF_LIMIT_UPPER32, 0x00000000);
980 			}
981 		} else {
982 			pci_bus_write_config_word(ibmphp_pci_bus, devfn, PCI_PREF_MEMORY_BASE, 0xffff);
983 			pci_bus_write_config_word(ibmphp_pci_bus, devfn, PCI_PREF_MEMORY_LIMIT, 0x0000);
984 		}
985 
986 		debug("b4 writing control information\n");
987 
988 		pci_bus_read_config_byte(ibmphp_pci_bus, devfn, PCI_INTERRUPT_PIN, &irq);
989 		if ((irq > 0x00) && (irq < 0x05))
990 			pci_bus_write_config_byte(ibmphp_pci_bus, devfn, PCI_INTERRUPT_LINE, func->irq[irq - 1]);
991 		/*
992 		pci_bus_write_config_byte(ibmphp_pci_bus, devfn, PCI_BRIDGE_CONTROL, ctrl);
993 		pci_bus_write_config_byte(ibmphp_pci_bus, devfn, PCI_BRIDGE_CONTROL, PCI_BRIDGE_CTL_PARITY);
994 		pci_bus_write_config_byte(ibmphp_pci_bus, devfn, PCI_BRIDGE_CONTROL, PCI_BRIDGE_CTL_SERR);
995 		 */
996 
997 		pci_bus_write_config_word(ibmphp_pci_bus, devfn, PCI_COMMAND, DEVICEENABLE);
998 		pci_bus_write_config_word(ibmphp_pci_bus, devfn, PCI_BRIDGE_CONTROL, 0x07);
999 		for (i = 0; i < 32; i++) {
1000 			if (amount_needed->devices[i]) {
1001 				debug("device where devices[i] is 1 = %x\n", i);
1002 				func->devices[i] = 1;
1003 			}
1004 		}
1005 		func->bus = 1;	/* For unconfiguring, to indicate it's PPB */
1006 		func_passed = &func;
1007 		debug("func->busno b4 returning is %x\n", func->busno);
1008 		debug("func->busno b4 returning in the other structure is %x\n", (*func_passed)->busno);
1009 		kfree(amount_needed);
1010 		return 0;
1011 	} else {
1012 		err("Configuring bridge was unsuccessful...\n");
1013 		mem_tmp = NULL;
1014 		retval = -EIO;
1015 		goto error;
1016 	}
1017 
1018 error:
1019 	kfree(amount_needed);
1020 	if (pfmem)
1021 		ibmphp_remove_resource(pfmem);
1022 	if (io)
1023 		ibmphp_remove_resource(io);
1024 	if (mem)
1025 		ibmphp_remove_resource(mem);
1026 	for (i = 0; i < 2; i++) {	/* for 2 BARs */
1027 		if (bus_io[i]) {
1028 			ibmphp_remove_resource(bus_io[i]);
1029 			func->io[i] = NULL;
1030 		} else if (bus_pfmem[i]) {
1031 			ibmphp_remove_resource(bus_pfmem[i]);
1032 			func->pfmem[i] = NULL;
1033 		} else if (bus_mem[i]) {
1034 			ibmphp_remove_resource(bus_mem[i]);
1035 			func->mem[i] = NULL;
1036 		}
1037 	}
1038 	return retval;
1039 }
1040 
1041 /*****************************************************************************
1042  * This function adds up the amount of resources needed behind the PPB bridge
1043  * and passes it to the configure_bridge function
1044  * Input: bridge function
1045  * Output: amount of resources needed
1046  *****************************************************************************/
scan_behind_bridge(struct pci_func * func,u8 busno)1047 static struct res_needed *scan_behind_bridge(struct pci_func *func, u8 busno)
1048 {
1049 	int count, len[6];
1050 	u16 vendor_id;
1051 	u8 hdr_type;
1052 	u8 device, function;
1053 	unsigned int devfn;
1054 	int howmany = 0;	/*this is to see if there are any devices behind the bridge */
1055 
1056 	u32 bar[6], class;
1057 	u32 address[] = {
1058 		PCI_BASE_ADDRESS_0,
1059 		PCI_BASE_ADDRESS_1,
1060 		PCI_BASE_ADDRESS_2,
1061 		PCI_BASE_ADDRESS_3,
1062 		PCI_BASE_ADDRESS_4,
1063 		PCI_BASE_ADDRESS_5,
1064 		0
1065 	};
1066 	struct res_needed *amount;
1067 
1068 	amount = kzalloc(sizeof(*amount), GFP_KERNEL);
1069 	if (amount == NULL)
1070 		return NULL;
1071 
1072 	ibmphp_pci_bus->number = busno;
1073 
1074 	debug("the bus_no behind the bridge is %x\n", busno);
1075 	debug("scanning devices behind the bridge...\n");
1076 	for (device = 0; device < 32; device++) {
1077 		amount->devices[device] = 0;
1078 		for (function = 0; function < 8; function++) {
1079 			devfn = PCI_DEVFN(device, function);
1080 
1081 			pci_bus_read_config_word(ibmphp_pci_bus, devfn, PCI_VENDOR_ID, &vendor_id);
1082 
1083 			if (vendor_id != PCI_VENDOR_ID_NOTVALID) {
1084 				/* found correct device!!! */
1085 				howmany++;
1086 
1087 				pci_bus_read_config_byte(ibmphp_pci_bus, devfn, PCI_HEADER_TYPE, &hdr_type);
1088 				pci_bus_read_config_dword(ibmphp_pci_bus, devfn, PCI_CLASS_REVISION, &class);
1089 
1090 				debug("hdr_type behind the bridge is %x\n", hdr_type);
1091 				if ((hdr_type & 0x7f) == PCI_HEADER_TYPE_BRIDGE) {
1092 					err("embedded bridges not supported for hot-plugging.\n");
1093 					amount->not_correct = 1;
1094 					return amount;
1095 				}
1096 
1097 				class >>= 8;	/* to take revision out, class = class.subclass.prog i/f */
1098 				if (class == PCI_CLASS_NOT_DEFINED_VGA) {
1099 					err("The device %x is VGA compatible and as is not supported for hot plugging.  Please choose another device.\n", device);
1100 					amount->not_correct = 1;
1101 					return amount;
1102 				} else if (class == PCI_CLASS_DISPLAY_VGA) {
1103 					err("The device %x is not supported for hot plugging.  Please choose another device.\n", device);
1104 					amount->not_correct = 1;
1105 					return amount;
1106 				}
1107 
1108 				amount->devices[device] = 1;
1109 
1110 				for (count = 0; address[count]; count++) {
1111 					/* for 6 BARs */
1112 					/*
1113 					pci_bus_read_config_byte(ibmphp_pci_bus, devfn, address[count], &tmp);
1114 					if (tmp & 0x01) // IO
1115 						pci_bus_write_config_dword(ibmphp_pci_bus, devfn, address[count], 0xFFFFFFFD);
1116 					else // MEMORY
1117 						pci_bus_write_config_dword(ibmphp_pci_bus, devfn, address[count], 0xFFFFFFFF);
1118 					*/
1119 					pci_bus_write_config_dword(ibmphp_pci_bus, devfn, address[count], 0xFFFFFFFF);
1120 					pci_bus_read_config_dword(ibmphp_pci_bus, devfn, address[count], &bar[count]);
1121 
1122 					debug("what is bar[count]? %x, count = %d\n", bar[count], count);
1123 
1124 					if (!bar[count])	/* This BAR is not implemented */
1125 						continue;
1126 
1127 					//tmp_bar = bar[count];
1128 
1129 					debug("count %d device %x function %x wants %x resources\n", count, device, function, bar[count]);
1130 
1131 					if (bar[count] & PCI_BASE_ADDRESS_SPACE_IO) {
1132 						/* This is IO */
1133 						len[count] = bar[count] & 0xFFFFFFFC;
1134 						len[count] = ~len[count] + 1;
1135 						amount->io += len[count];
1136 					} else {
1137 						/* This is Memory */
1138 						if (bar[count] & PCI_BASE_ADDRESS_MEM_PREFETCH) {
1139 							/* pfmem */
1140 							len[count] = bar[count] & 0xFFFFFFF0;
1141 							len[count] = ~len[count] + 1;
1142 							amount->pfmem += len[count];
1143 							if (bar[count] & PCI_BASE_ADDRESS_MEM_TYPE_64)
1144 								/* takes up another dword */
1145 								count += 1;
1146 
1147 						} else {
1148 							/* regular memory */
1149 							len[count] = bar[count] & 0xFFFFFFF0;
1150 							len[count] = ~len[count] + 1;
1151 							amount->mem += len[count];
1152 							if (bar[count] & PCI_BASE_ADDRESS_MEM_TYPE_64) {
1153 								/* takes up another dword */
1154 								count += 1;
1155 							}
1156 						}
1157 					}
1158 				}	/* end for */
1159 			}	/* end if (valid) */
1160 		}	/* end for */
1161 	}	/* end for */
1162 
1163 	if (!howmany)
1164 		amount->not_correct = 1;
1165 	else
1166 		amount->not_correct = 0;
1167 	if ((amount->io) && (amount->io < IOBRIDGE))
1168 		amount->io = IOBRIDGE;
1169 	if ((amount->mem) && (amount->mem < MEMBRIDGE))
1170 		amount->mem = MEMBRIDGE;
1171 	if ((amount->pfmem) && (amount->pfmem < MEMBRIDGE))
1172 		amount->pfmem = MEMBRIDGE;
1173 	return amount;
1174 }
1175 
1176 /* The following 3 unconfigure_boot_ routines deal with the case when we had the card
1177  * upon bootup in the system, since we don't allocate func to such case, we need to read
1178  * the start addresses from pci config space and then find the corresponding entries in
1179  * our resource lists.  The functions return either 0, -ENODEV, or -1 (general failure)
1180  * Change: we also call these functions even if we configured the card ourselves (i.e., not
1181  * the bootup case), since it should work same way
1182  */
unconfigure_boot_device(u8 busno,u8 device,u8 function)1183 static int unconfigure_boot_device(u8 busno, u8 device, u8 function)
1184 {
1185 	u32 start_address;
1186 	u32 address[] = {
1187 		PCI_BASE_ADDRESS_0,
1188 		PCI_BASE_ADDRESS_1,
1189 		PCI_BASE_ADDRESS_2,
1190 		PCI_BASE_ADDRESS_3,
1191 		PCI_BASE_ADDRESS_4,
1192 		PCI_BASE_ADDRESS_5,
1193 		0
1194 	};
1195 	int count;
1196 	struct resource_node *io;
1197 	struct resource_node *mem;
1198 	struct resource_node *pfmem;
1199 	struct bus_node *bus;
1200 	u32 end_address;
1201 	u32 temp_end;
1202 	u32 size;
1203 	u32 tmp_address;
1204 	unsigned int devfn;
1205 
1206 	debug("%s - enter\n", __func__);
1207 
1208 	bus = ibmphp_find_res_bus(busno);
1209 	if (!bus) {
1210 		debug("cannot find corresponding bus.\n");
1211 		return -EINVAL;
1212 	}
1213 
1214 	devfn = PCI_DEVFN(device, function);
1215 	ibmphp_pci_bus->number = busno;
1216 	for (count = 0; address[count]; count++) {	/* for 6 BARs */
1217 		pci_bus_read_config_dword(ibmphp_pci_bus, devfn, address[count], &start_address);
1218 
1219 		/* We can do this here, b/c by that time the device driver of the card has been stopped */
1220 
1221 		pci_bus_write_config_dword(ibmphp_pci_bus, devfn, address[count], 0xFFFFFFFF);
1222 		pci_bus_read_config_dword(ibmphp_pci_bus, devfn, address[count], &size);
1223 		pci_bus_write_config_dword(ibmphp_pci_bus, devfn, address[count], start_address);
1224 
1225 		debug("start_address is %x\n", start_address);
1226 		debug("busno, device, function %x %x %x\n", busno, device, function);
1227 		if (!size) {
1228 			/* This BAR is not implemented */
1229 			debug("is this bar no implemented?, count = %d\n", count);
1230 			continue;
1231 		}
1232 		tmp_address = start_address;
1233 		if (start_address & PCI_BASE_ADDRESS_SPACE_IO) {
1234 			/* This is IO */
1235 			start_address &= PCI_BASE_ADDRESS_IO_MASK;
1236 			size = size & 0xFFFFFFFC;
1237 			size = ~size + 1;
1238 			end_address = start_address + size - 1;
1239 			if (ibmphp_find_resource(bus, start_address, &io, IO))
1240 				goto report_search_failure;
1241 
1242 			debug("io->start = %x\n", io->start);
1243 			temp_end = io->end;
1244 			start_address = io->end + 1;
1245 			ibmphp_remove_resource(io);
1246 			/* This is needed b/c of the old I/O restrictions in the BIOS */
1247 			while (temp_end < end_address) {
1248 				if (ibmphp_find_resource(bus, start_address,
1249 							 &io, IO))
1250 					goto report_search_failure;
1251 
1252 				debug("io->start = %x\n", io->start);
1253 				temp_end = io->end;
1254 				start_address = io->end + 1;
1255 				ibmphp_remove_resource(io);
1256 			}
1257 
1258 			/* ????????? DO WE NEED TO WRITE ANYTHING INTO THE PCI CONFIG SPACE BACK ?????????? */
1259 		} else {
1260 			/* This is Memory */
1261 			if (start_address & PCI_BASE_ADDRESS_MEM_PREFETCH) {
1262 				/* pfmem */
1263 				debug("start address of pfmem is %x\n", start_address);
1264 				start_address &= PCI_BASE_ADDRESS_MEM_MASK;
1265 
1266 				if (ibmphp_find_resource(bus, start_address, &pfmem, PFMEM) < 0) {
1267 					err("cannot find corresponding PFMEM resource to remove\n");
1268 					return -EIO;
1269 				}
1270 				if (pfmem) {
1271 					debug("pfmem->start = %x\n", pfmem->start);
1272 
1273 					ibmphp_remove_resource(pfmem);
1274 				}
1275 			} else {
1276 				/* regular memory */
1277 				debug("start address of mem is %x\n", start_address);
1278 				start_address &= PCI_BASE_ADDRESS_MEM_MASK;
1279 
1280 				if (ibmphp_find_resource(bus, start_address, &mem, MEM) < 0) {
1281 					err("cannot find corresponding MEM resource to remove\n");
1282 					return -EIO;
1283 				}
1284 				if (mem) {
1285 					debug("mem->start = %x\n", mem->start);
1286 
1287 					ibmphp_remove_resource(mem);
1288 				}
1289 			}
1290 			if (tmp_address & PCI_BASE_ADDRESS_MEM_TYPE_64) {
1291 				/* takes up another dword */
1292 				count += 1;
1293 			}
1294 		}	/* end of mem */
1295 	}	/* end of for */
1296 
1297 	return 0;
1298 
1299 report_search_failure:
1300 	err("cannot find corresponding IO resource to remove\n");
1301 	return -EIO;
1302 }
1303 
unconfigure_boot_bridge(u8 busno,u8 device,u8 function)1304 static int unconfigure_boot_bridge(u8 busno, u8 device, u8 function)
1305 {
1306 	int count;
1307 	int bus_no, pri_no, sub_no, sec_no = 0;
1308 	u32 start_address, tmp_address;
1309 	u8 sec_number, sub_number, pri_number;
1310 	struct resource_node *io = NULL;
1311 	struct resource_node *mem = NULL;
1312 	struct resource_node *pfmem = NULL;
1313 	struct bus_node *bus;
1314 	u32 address[] = {
1315 		PCI_BASE_ADDRESS_0,
1316 		PCI_BASE_ADDRESS_1,
1317 		0
1318 	};
1319 	unsigned int devfn;
1320 
1321 	devfn = PCI_DEVFN(device, function);
1322 	ibmphp_pci_bus->number = busno;
1323 	bus_no = (int) busno;
1324 	debug("busno is %x\n", busno);
1325 	pci_bus_read_config_byte(ibmphp_pci_bus, devfn, PCI_PRIMARY_BUS, &pri_number);
1326 	debug("%s - busno = %x, primary_number = %x\n", __func__, busno, pri_number);
1327 
1328 	pci_bus_read_config_byte(ibmphp_pci_bus, devfn, PCI_SECONDARY_BUS, &sec_number);
1329 	debug("sec_number is %x\n", sec_number);
1330 	sec_no = (int) sec_number;
1331 	pri_no = (int) pri_number;
1332 	if (pri_no != bus_no) {
1333 		err("primary numbers in our structures and pci config space don't match.\n");
1334 		return -EINVAL;
1335 	}
1336 
1337 	pci_bus_read_config_byte(ibmphp_pci_bus, devfn, PCI_SUBORDINATE_BUS, &sub_number);
1338 	sub_no = (int) sub_number;
1339 	debug("sub_no is %d, sec_no is %d\n", sub_no, sec_no);
1340 	if (sec_no != sub_number) {
1341 		err("there're more buses behind this bridge.  Hot removal is not supported.  Please choose another card\n");
1342 		return -ENODEV;
1343 	}
1344 
1345 	bus = ibmphp_find_res_bus(sec_number);
1346 	if (!bus) {
1347 		err("cannot find Bus structure for the bridged device\n");
1348 		return -EINVAL;
1349 	}
1350 	debug("bus->busno is %x\n", bus->busno);
1351 	debug("sec_number is %x\n", sec_number);
1352 
1353 	ibmphp_remove_bus(bus, busno);
1354 
1355 	for (count = 0; address[count]; count++) {
1356 		/* for 2 BARs */
1357 		pci_bus_read_config_dword(ibmphp_pci_bus, devfn, address[count], &start_address);
1358 
1359 		if (!start_address) {
1360 			/* This BAR is not implemented */
1361 			continue;
1362 		}
1363 
1364 		tmp_address = start_address;
1365 
1366 		if (start_address & PCI_BASE_ADDRESS_SPACE_IO) {
1367 			/* This is IO */
1368 			start_address &= PCI_BASE_ADDRESS_IO_MASK;
1369 			if (ibmphp_find_resource(bus, start_address, &io, IO) < 0) {
1370 				err("cannot find corresponding IO resource to remove\n");
1371 				return -EIO;
1372 			}
1373 			if (io)
1374 				debug("io->start = %x\n", io->start);
1375 
1376 			ibmphp_remove_resource(io);
1377 
1378 			/* ????????? DO WE NEED TO WRITE ANYTHING INTO THE PCI CONFIG SPACE BACK ?????????? */
1379 		} else {
1380 			/* This is Memory */
1381 			if (start_address & PCI_BASE_ADDRESS_MEM_PREFETCH) {
1382 				/* pfmem */
1383 				start_address &= PCI_BASE_ADDRESS_MEM_MASK;
1384 				if (ibmphp_find_resource(bus, start_address, &pfmem, PFMEM) < 0) {
1385 					err("cannot find corresponding PFMEM resource to remove\n");
1386 					return -EINVAL;
1387 				}
1388 				if (pfmem) {
1389 					debug("pfmem->start = %x\n", pfmem->start);
1390 
1391 					ibmphp_remove_resource(pfmem);
1392 				}
1393 			} else {
1394 				/* regular memory */
1395 				start_address &= PCI_BASE_ADDRESS_MEM_MASK;
1396 				if (ibmphp_find_resource(bus, start_address, &mem, MEM) < 0) {
1397 					err("cannot find corresponding MEM resource to remove\n");
1398 					return -EINVAL;
1399 				}
1400 				if (mem) {
1401 					debug("mem->start = %x\n", mem->start);
1402 
1403 					ibmphp_remove_resource(mem);
1404 				}
1405 			}
1406 			if (tmp_address & PCI_BASE_ADDRESS_MEM_TYPE_64) {
1407 				/* takes up another dword */
1408 				count += 1;
1409 			}
1410 		}	/* end of mem */
1411 	}	/* end of for */
1412 	debug("%s - exiting, returning success\n", __func__);
1413 	return 0;
1414 }
1415 
unconfigure_boot_card(struct slot * slot_cur)1416 static int unconfigure_boot_card(struct slot *slot_cur)
1417 {
1418 	u16 vendor_id;
1419 	u32 class;
1420 	u8 hdr_type;
1421 	u8 device;
1422 	u8 busno;
1423 	u8 function;
1424 	int rc;
1425 	unsigned int devfn;
1426 	u8 valid_device = 0x00; /* To see if we are ever able to find valid device and read it */
1427 
1428 	debug("%s - enter\n", __func__);
1429 
1430 	device = slot_cur->device;
1431 	busno = slot_cur->bus;
1432 
1433 	debug("b4 for loop, device is %x\n", device);
1434 	/* For every function on the card */
1435 	for (function = 0x0; function < 0x08; function++) {
1436 		devfn = PCI_DEVFN(device, function);
1437 		ibmphp_pci_bus->number = busno;
1438 
1439 		pci_bus_read_config_word(ibmphp_pci_bus, devfn, PCI_VENDOR_ID, &vendor_id);
1440 
1441 		if (vendor_id != PCI_VENDOR_ID_NOTVALID) {
1442 			/* found correct device!!! */
1443 			++valid_device;
1444 
1445 			debug("%s - found correct device\n", __func__);
1446 
1447 			/* header: x x x x x x x x
1448 			 *         | |___________|=> 1=PPB bridge, 0=normal device, 2=CardBus Bridge
1449 			 *         |_=> 0 = single function device, 1 = multi-function device
1450 			 */
1451 
1452 			pci_bus_read_config_byte(ibmphp_pci_bus, devfn, PCI_HEADER_TYPE, &hdr_type);
1453 			pci_bus_read_config_dword(ibmphp_pci_bus, devfn, PCI_CLASS_REVISION, &class);
1454 
1455 			debug("hdr_type %x, class %x\n", hdr_type, class);
1456 			class >>= 8;	/* to take revision out, class = class.subclass.prog i/f */
1457 			if (class == PCI_CLASS_NOT_DEFINED_VGA) {
1458 				err("The device %x function %x is VGA compatible and is not supported for hot removing.  Please choose another device.\n", device, function);
1459 				return -ENODEV;
1460 			} else if (class == PCI_CLASS_DISPLAY_VGA) {
1461 				err("The device %x function %x is not supported for hot removing.  Please choose another device.\n", device, function);
1462 				return -ENODEV;
1463 			}
1464 
1465 			switch (hdr_type) {
1466 				case PCI_HEADER_TYPE_NORMAL:
1467 					rc = unconfigure_boot_device(busno, device, function);
1468 					if (rc) {
1469 						err("was not able to unconfigure device %x func %x on bus %x. bailing out...\n",
1470 						     device, function, busno);
1471 						return rc;
1472 					}
1473 					function = 0x8;
1474 					break;
1475 				case PCI_HEADER_TYPE_MULTIDEVICE:
1476 					rc = unconfigure_boot_device(busno, device, function);
1477 					if (rc) {
1478 						err("was not able to unconfigure device %x func %x on bus %x. bailing out...\n",
1479 						     device, function, busno);
1480 						return rc;
1481 					}
1482 					break;
1483 				case PCI_HEADER_TYPE_BRIDGE:
1484 					class >>= 8;
1485 					if (class != PCI_CLASS_BRIDGE_PCI) {
1486 						err("This device %x function %x is not PCI-to-PCI bridge, and is not supported for hot-removing.  Please try another card.\n", device, function);
1487 						return -ENODEV;
1488 					}
1489 					rc = unconfigure_boot_bridge(busno, device, function);
1490 					if (rc != 0) {
1491 						err("was not able to hot-remove PPB properly.\n");
1492 						return rc;
1493 					}
1494 
1495 					function = 0x8;
1496 					break;
1497 				case PCI_HEADER_TYPE_MULTIBRIDGE:
1498 					class >>= 8;
1499 					if (class != PCI_CLASS_BRIDGE_PCI) {
1500 						err("This device %x function %x is not PCI-to-PCI bridge,  and is not supported for hot-removing.  Please try another card.\n", device, function);
1501 						return -ENODEV;
1502 					}
1503 					rc = unconfigure_boot_bridge(busno, device, function);
1504 					if (rc != 0) {
1505 						err("was not able to hot-remove PPB properly.\n");
1506 						return rc;
1507 					}
1508 					break;
1509 				default:
1510 					err("MAJOR PROBLEM!!!! Cannot read device's header\n");
1511 					return -1;
1512 					break;
1513 			}	/* end of switch */
1514 		}	/* end of valid device */
1515 	}	/* end of for */
1516 
1517 	if (!valid_device) {
1518 		err("Could not find device to unconfigure.  Or could not read the card.\n");
1519 		return -1;
1520 	}
1521 	return 0;
1522 }
1523 
1524 /*
1525  * free the resources of the card (multi, single, or bridged)
1526  * Parameters: slot, flag to say if this is for removing entire module or just
1527  * unconfiguring the device
1528  * TO DO:  will probably need to add some code in case there was some resource,
1529  * to remove it... this is from when we have errors in the configure_card...
1530  *			!!!!!!!!!!!!!!!!!!!!!!!!!FOR BUSES!!!!!!!!!!!!
1531  * Returns: 0, -1, -ENODEV
1532  */
ibmphp_unconfigure_card(struct slot ** slot_cur,int the_end)1533 int ibmphp_unconfigure_card(struct slot **slot_cur, int the_end)
1534 {
1535 	int i;
1536 	int count;
1537 	int rc;
1538 	struct slot *sl = *slot_cur;
1539 	struct pci_func *cur_func = NULL;
1540 	struct pci_func *temp_func;
1541 
1542 	debug("%s - enter\n", __func__);
1543 
1544 	if (!the_end) {
1545 		/* Need to unconfigure the card */
1546 		rc = unconfigure_boot_card(sl);
1547 		if ((rc == -ENODEV) || (rc == -EIO) || (rc == -EINVAL)) {
1548 			/* In all other cases, will still need to get rid of func structure if it exists */
1549 			return rc;
1550 		}
1551 	}
1552 
1553 	if (sl->func) {
1554 		cur_func = sl->func;
1555 		while (cur_func) {
1556 			/* TO DO: WILL MOST LIKELY NEED TO GET RID OF THE BUS STRUCTURE FROM RESOURCES AS WELL */
1557 			if (cur_func->bus) {
1558 				/* in other words, it's a PPB */
1559 				count = 2;
1560 			} else {
1561 				count = 6;
1562 			}
1563 
1564 			for (i = 0; i < count; i++) {
1565 				if (cur_func->io[i]) {
1566 					debug("io[%d] exists\n", i);
1567 					if (the_end > 0)
1568 						ibmphp_remove_resource(cur_func->io[i]);
1569 					cur_func->io[i] = NULL;
1570 				}
1571 				if (cur_func->mem[i]) {
1572 					debug("mem[%d] exists\n", i);
1573 					if (the_end > 0)
1574 						ibmphp_remove_resource(cur_func->mem[i]);
1575 					cur_func->mem[i] = NULL;
1576 				}
1577 				if (cur_func->pfmem[i]) {
1578 					debug("pfmem[%d] exists\n", i);
1579 					if (the_end > 0)
1580 						ibmphp_remove_resource(cur_func->pfmem[i]);
1581 					cur_func->pfmem[i] = NULL;
1582 				}
1583 			}
1584 
1585 			temp_func = cur_func->next;
1586 			kfree(cur_func);
1587 			cur_func = temp_func;
1588 		}
1589 	}
1590 
1591 	sl->func = NULL;
1592 	*slot_cur = sl;
1593 	debug("%s - exit\n", __func__);
1594 	return 0;
1595 }
1596 
1597 /*
1598  * add a new bus resulting from hot-plugging a PPB bridge with devices
1599  *
1600  * Input: bus and the amount of resources needed (we know we can assign those,
1601  *        since they've been checked already
1602  * Output: bus added to the correct spot
1603  *         0, -1, error
1604  */
add_new_bus(struct bus_node * bus,struct resource_node * io,struct resource_node * mem,struct resource_node * pfmem,u8 parent_busno)1605 static int add_new_bus(struct bus_node *bus, struct resource_node *io, struct resource_node *mem, struct resource_node *pfmem, u8 parent_busno)
1606 {
1607 	struct range_node *io_range = NULL;
1608 	struct range_node *mem_range = NULL;
1609 	struct range_node *pfmem_range = NULL;
1610 	struct bus_node *cur_bus = NULL;
1611 
1612 	/* Trying to find the parent bus number */
1613 	if (parent_busno != 0xFF) {
1614 		cur_bus	= ibmphp_find_res_bus(parent_busno);
1615 		if (!cur_bus) {
1616 			err("strange, cannot find bus which is supposed to be at the system... something is terribly wrong...\n");
1617 			return -ENODEV;
1618 		}
1619 
1620 		list_add(&bus->bus_list, &cur_bus->bus_list);
1621 	}
1622 	if (io) {
1623 		io_range = kzalloc(sizeof(*io_range), GFP_KERNEL);
1624 		if (!io_range)
1625 			return -ENOMEM;
1626 
1627 		io_range->start = io->start;
1628 		io_range->end = io->end;
1629 		io_range->rangeno = 1;
1630 		bus->noIORanges = 1;
1631 		bus->rangeIO = io_range;
1632 	}
1633 	if (mem) {
1634 		mem_range = kzalloc(sizeof(*mem_range), GFP_KERNEL);
1635 		if (!mem_range)
1636 			return -ENOMEM;
1637 
1638 		mem_range->start = mem->start;
1639 		mem_range->end = mem->end;
1640 		mem_range->rangeno = 1;
1641 		bus->noMemRanges = 1;
1642 		bus->rangeMem = mem_range;
1643 	}
1644 	if (pfmem) {
1645 		pfmem_range = kzalloc(sizeof(*pfmem_range), GFP_KERNEL);
1646 		if (!pfmem_range)
1647 			return -ENOMEM;
1648 
1649 		pfmem_range->start = pfmem->start;
1650 		pfmem_range->end = pfmem->end;
1651 		pfmem_range->rangeno = 1;
1652 		bus->noPFMemRanges = 1;
1653 		bus->rangePFMem = pfmem_range;
1654 	}
1655 	return 0;
1656 }
1657 
1658 /*
1659  * find the 1st available bus number for PPB to set as its secondary bus
1660  * Parameters: bus_number of the primary bus
1661  * Returns: bus_number of the secondary bus or 0xff in case of failure
1662  */
find_sec_number(u8 primary_busno,u8 slotno)1663 static u8 find_sec_number(u8 primary_busno, u8 slotno)
1664 {
1665 	int min, max;
1666 	u8 busno;
1667 	struct bus_info *bus;
1668 	struct bus_node *bus_cur;
1669 
1670 	bus = ibmphp_find_same_bus_num(primary_busno);
1671 	if (!bus) {
1672 		err("cannot get slot range of the bus from the BIOS\n");
1673 		return 0xff;
1674 	}
1675 	max = bus->slot_max;
1676 	min = bus->slot_min;
1677 	if ((slotno > max) || (slotno < min)) {
1678 		err("got the wrong range\n");
1679 		return 0xff;
1680 	}
1681 	busno = (u8) (slotno - (u8) min);
1682 	busno += primary_busno + 0x01;
1683 	bus_cur = ibmphp_find_res_bus(busno);
1684 	/* either there is no such bus number, or there are no ranges, which
1685 	 * can only happen if we removed the bridged device in previous load
1686 	 * of the driver, and now only have the skeleton bus struct
1687 	 */
1688 	if ((!bus_cur) || (!(bus_cur->rangeIO) && !(bus_cur->rangeMem) && !(bus_cur->rangePFMem)))
1689 		return busno;
1690 	return 0xff;
1691 }
1692