xref: /openbmc/linux/drivers/pci/hotplug/cpqphp_pci.c (revision 1da177e4)
1 /*
2  * Compaq Hot Plug Controller Driver
3  *
4  * Copyright (C) 1995,2001 Compaq Computer Corporation
5  * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com)
6  * Copyright (C) 2001 IBM Corp.
7  *
8  * All rights reserved.
9  *
10  * This program is free software; you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation; either version 2 of the License, or (at
13  * your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful, but
16  * WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
18  * NON INFRINGEMENT.  See the GNU General Public License for more
19  * details.
20  *
21  * You should have received a copy of the GNU General Public License
22  * along with this program; if not, write to the Free Software
23  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24  *
25  * Send feedback to <greg@kroah.com>
26  *
27  */
28 
29 #include <linux/config.h>
30 #include <linux/module.h>
31 #include <linux/kernel.h>
32 #include <linux/types.h>
33 #include <linux/slab.h>
34 #include <linux/workqueue.h>
35 #include <linux/proc_fs.h>
36 #include <linux/pci.h>
37 #include "../pci.h"
38 #include "cpqphp.h"
39 #include "cpqphp_nvram.h"
40 #include "../../../arch/i386/pci/pci.h"	/* horrible hack showing how processor dependent we are... */
41 
42 
43 u8 cpqhp_nic_irq;
44 u8 cpqhp_disk_irq;
45 
46 static u16 unused_IRQ;
47 
48 /*
49  * detect_HRT_floating_pointer
50  *
51  * find the Hot Plug Resource Table in the specified region of memory.
52  *
53  */
54 static void __iomem *detect_HRT_floating_pointer(void __iomem *begin, void __iomem *end)
55 {
56 	void __iomem *fp;
57 	void __iomem *endp;
58 	u8 temp1, temp2, temp3, temp4;
59 	int status = 0;
60 
61 	endp = (end - sizeof(struct hrt) + 1);
62 
63 	for (fp = begin; fp <= endp; fp += 16) {
64 		temp1 = readb(fp + SIG0);
65 		temp2 = readb(fp + SIG1);
66 		temp3 = readb(fp + SIG2);
67 		temp4 = readb(fp + SIG3);
68 		if (temp1 == '$' &&
69 		    temp2 == 'H' &&
70 		    temp3 == 'R' &&
71 		    temp4 == 'T') {
72 			status = 1;
73 			break;
74 		}
75 	}
76 
77 	if (!status)
78 		fp = NULL;
79 
80 	dbg("Discovered Hotplug Resource Table at %p\n", fp);
81 	return fp;
82 }
83 
84 
85 int cpqhp_configure_device (struct controller* ctrl, struct pci_func* func)
86 {
87 	unsigned char bus;
88 	struct pci_bus *child;
89 	int num;
90 
91 	if (func->pci_dev == NULL)
92 		func->pci_dev = pci_find_slot(func->bus, PCI_DEVFN(func->device, func->function));
93 
94 	/* No pci device, we need to create it then */
95 	if (func->pci_dev == NULL) {
96 		dbg("INFO: pci_dev still null\n");
97 
98 		num = pci_scan_slot(ctrl->pci_dev->bus, PCI_DEVFN(func->device, func->function));
99 		if (num)
100 			pci_bus_add_devices(ctrl->pci_dev->bus);
101 
102 		func->pci_dev = pci_find_slot(func->bus, PCI_DEVFN(func->device, func->function));
103 		if (func->pci_dev == NULL) {
104 			dbg("ERROR: pci_dev still null\n");
105 			return 0;
106 		}
107 	}
108 
109 	if (func->pci_dev->hdr_type == PCI_HEADER_TYPE_BRIDGE) {
110 		pci_read_config_byte(func->pci_dev, PCI_SECONDARY_BUS, &bus);
111 		child = (struct pci_bus*) pci_add_new_bus(func->pci_dev->bus, (func->pci_dev), bus);
112 		pci_do_scan_bus(child);
113 	}
114 
115 	return 0;
116 }
117 
118 
119 int cpqhp_unconfigure_device(struct pci_func* func)
120 {
121 	int j;
122 
123 	dbg("%s: bus/dev/func = %x/%x/%x\n", __FUNCTION__, func->bus, func->device, func->function);
124 
125 	for (j=0; j<8 ; j++) {
126 		struct pci_dev* temp = pci_find_slot(func->bus, PCI_DEVFN(func->device, j));
127 		if (temp)
128 			pci_remove_bus_device(temp);
129 	}
130 	return 0;
131 }
132 
133 static int PCI_RefinedAccessConfig(struct pci_bus *bus, unsigned int devfn, u8 offset, u32 *value)
134 {
135 	u32 vendID = 0;
136 
137 	if (pci_bus_read_config_dword (bus, devfn, PCI_VENDOR_ID, &vendID) == -1)
138 		return -1;
139 	if (vendID == 0xffffffff)
140 		return -1;
141 	return pci_bus_read_config_dword (bus, devfn, offset, value);
142 }
143 
144 
145 /*
146  * cpqhp_set_irq
147  *
148  * @bus_num: bus number of PCI device
149  * @dev_num: device number of PCI device
150  * @slot: pointer to u8 where slot number will be returned
151  */
152 int cpqhp_set_irq (u8 bus_num, u8 dev_num, u8 int_pin, u8 irq_num)
153 {
154 	int rc = 0;
155 
156 	if (cpqhp_legacy_mode) {
157 		struct pci_dev *fakedev;
158 		struct pci_bus *fakebus;
159 		u16 temp_word;
160 
161 		fakedev = kmalloc(sizeof(*fakedev), GFP_KERNEL);
162 		fakebus = kmalloc(sizeof(*fakebus), GFP_KERNEL);
163 		if (!fakedev || !fakebus) {
164 			kfree(fakedev);
165 			kfree(fakebus);
166 			return -ENOMEM;
167 		}
168 
169 		fakedev->devfn = dev_num << 3;
170 		fakedev->bus = fakebus;
171 		fakebus->number = bus_num;
172 		dbg("%s: dev %d, bus %d, pin %d, num %d\n",
173 		    __FUNCTION__, dev_num, bus_num, int_pin, irq_num);
174 		rc = pcibios_set_irq_routing(fakedev, int_pin - 0x0a, irq_num);
175 		kfree(fakedev);
176 		kfree(fakebus);
177 		dbg("%s: rc %d\n", __FUNCTION__, rc);
178 		if (!rc)
179 			return !rc;
180 
181 		// set the Edge Level Control Register (ELCR)
182 		temp_word = inb(0x4d0);
183 		temp_word |= inb(0x4d1) << 8;
184 
185 		temp_word |= 0x01 << irq_num;
186 
187 		// This should only be for x86 as it sets the Edge Level Control Register
188 		outb((u8) (temp_word & 0xFF), 0x4d0);
189 		outb((u8) ((temp_word & 0xFF00) >> 8), 0x4d1);
190 		rc = 0;
191 	}
192 
193 	return rc;
194 }
195 
196 
197 /*
198  * WTF??? This function isn't in the code, yet a function calls it, but the
199  * compiler optimizes it away?  strange.  Here as a placeholder to keep the
200  * compiler happy.
201  */
202 static int PCI_ScanBusNonBridge (u8 bus, u8 device)
203 {
204 	return 0;
205 }
206 
207 static int PCI_ScanBusForNonBridge(struct controller *ctrl, u8 bus_num, u8 * dev_num)
208 {
209 	u16 tdevice;
210 	u32 work;
211 	u8 tbus;
212 
213 	ctrl->pci_bus->number = bus_num;
214 
215 	for (tdevice = 0; tdevice < 0xFF; tdevice++) {
216 		//Scan for access first
217 		if (PCI_RefinedAccessConfig(ctrl->pci_bus, tdevice, 0x08, &work) == -1)
218 			continue;
219 		dbg("Looking for nonbridge bus_num %d dev_num %d\n", bus_num, tdevice);
220 		//Yep we got one. Not a bridge ?
221 		if ((work >> 8) != PCI_TO_PCI_BRIDGE_CLASS) {
222 			*dev_num = tdevice;
223 			dbg("found it !\n");
224 			return 0;
225 		}
226 	}
227 	for (tdevice = 0; tdevice < 0xFF; tdevice++) {
228 		//Scan for access first
229 		if (PCI_RefinedAccessConfig(ctrl->pci_bus, tdevice, 0x08, &work) == -1)
230 			continue;
231 		dbg("Looking for bridge bus_num %d dev_num %d\n", bus_num, tdevice);
232 		//Yep we got one. bridge ?
233 		if ((work >> 8) == PCI_TO_PCI_BRIDGE_CLASS) {
234 			pci_bus_read_config_byte (ctrl->pci_bus, PCI_DEVFN(tdevice, 0), PCI_SECONDARY_BUS, &tbus);
235 			dbg("Recurse on bus_num %d tdevice %d\n", tbus, tdevice);
236 			if (PCI_ScanBusNonBridge(tbus, tdevice) == 0)
237 				return 0;
238 		}
239 	}
240 
241 	return -1;
242 }
243 
244 
245 static int PCI_GetBusDevHelper(struct controller *ctrl, u8 *bus_num, u8 *dev_num, u8 slot, u8 nobridge)
246 {
247 	struct irq_routing_table *PCIIRQRoutingInfoLength;
248 	long len;
249 	long loop;
250 	u32 work;
251 
252 	u8 tbus, tdevice, tslot;
253 
254 	PCIIRQRoutingInfoLength = pcibios_get_irq_routing_table();
255 	if (!PCIIRQRoutingInfoLength)
256 		return -1;
257 
258 	len = (PCIIRQRoutingInfoLength->size -
259 	       sizeof(struct irq_routing_table)) / sizeof(struct irq_info);
260 	// Make sure I got at least one entry
261 	if (len == 0) {
262 		if (PCIIRQRoutingInfoLength != NULL)
263 			kfree(PCIIRQRoutingInfoLength );
264 		return -1;
265 	}
266 
267 	for (loop = 0; loop < len; ++loop) {
268 		tbus = PCIIRQRoutingInfoLength->slots[loop].bus;
269 		tdevice = PCIIRQRoutingInfoLength->slots[loop].devfn;
270 		tslot = PCIIRQRoutingInfoLength->slots[loop].slot;
271 
272 		if (tslot == slot) {
273 			*bus_num = tbus;
274 			*dev_num = tdevice;
275 			ctrl->pci_bus->number = tbus;
276 			pci_bus_read_config_dword (ctrl->pci_bus, *dev_num, PCI_VENDOR_ID, &work);
277 			if (!nobridge || (work == 0xffffffff)) {
278 				if (PCIIRQRoutingInfoLength != NULL)
279 					kfree(PCIIRQRoutingInfoLength );
280 				return 0;
281 			}
282 
283 			dbg("bus_num %d devfn %d\n", *bus_num, *dev_num);
284 			pci_bus_read_config_dword (ctrl->pci_bus, *dev_num, PCI_CLASS_REVISION, &work);
285 			dbg("work >> 8 (%x) = BRIDGE (%x)\n", work >> 8, PCI_TO_PCI_BRIDGE_CLASS);
286 
287 			if ((work >> 8) == PCI_TO_PCI_BRIDGE_CLASS) {
288 				pci_bus_read_config_byte (ctrl->pci_bus, *dev_num, PCI_SECONDARY_BUS, &tbus);
289 				dbg("Scan bus for Non Bridge: bus %d\n", tbus);
290 				if (PCI_ScanBusForNonBridge(ctrl, tbus, dev_num) == 0) {
291 					*bus_num = tbus;
292 					if (PCIIRQRoutingInfoLength != NULL)
293 						kfree(PCIIRQRoutingInfoLength );
294 					return 0;
295 				}
296 			} else {
297 				if (PCIIRQRoutingInfoLength != NULL)
298 					kfree(PCIIRQRoutingInfoLength );
299 				return 0;
300 			}
301 
302 		}
303 	}
304 	if (PCIIRQRoutingInfoLength != NULL)
305 		kfree(PCIIRQRoutingInfoLength );
306 	return -1;
307 }
308 
309 
310 int cpqhp_get_bus_dev (struct controller *ctrl, u8 * bus_num, u8 * dev_num, u8 slot)
311 {
312 	return PCI_GetBusDevHelper(ctrl, bus_num, dev_num, slot, 0);	//plain (bridges allowed)
313 }
314 
315 
316 /* More PCI configuration routines; this time centered around hotplug controller */
317 
318 
319 /*
320  * cpqhp_save_config
321  *
322  * Reads configuration for all slots in a PCI bus and saves info.
323  *
324  * Note:  For non-hot plug busses, the slot # saved is the device #
325  *
326  * returns 0 if success
327  */
328 int cpqhp_save_config(struct controller *ctrl, int busnumber, int is_hot_plug)
329 {
330 	long rc;
331 	u8 class_code;
332 	u8 header_type;
333 	u32 ID;
334 	u8 secondary_bus;
335 	struct pci_func *new_slot;
336 	int sub_bus;
337 	int FirstSupported;
338 	int LastSupported;
339 	int max_functions;
340 	int function;
341 	u8 DevError;
342 	int device = 0;
343 	int cloop = 0;
344 	int stop_it;
345 	int index;
346 
347 	//              Decide which slots are supported
348 
349 	if (is_hot_plug) {
350 		//*********************************
351 		// is_hot_plug is the slot mask
352 		//*********************************
353 		FirstSupported = is_hot_plug >> 4;
354 		LastSupported = FirstSupported + (is_hot_plug & 0x0F) - 1;
355 	} else {
356 		FirstSupported = 0;
357 		LastSupported = 0x1F;
358 	}
359 
360 	//     Save PCI configuration space for all devices in supported slots
361 	ctrl->pci_bus->number = busnumber;
362 	for (device = FirstSupported; device <= LastSupported; device++) {
363 		ID = 0xFFFFFFFF;
364 		rc = pci_bus_read_config_dword (ctrl->pci_bus, PCI_DEVFN(device, 0), PCI_VENDOR_ID, &ID);
365 
366 		if (ID != 0xFFFFFFFF) {	  //  device in slot
367 			rc = pci_bus_read_config_byte (ctrl->pci_bus, PCI_DEVFN(device, 0), 0x0B, &class_code);
368 			if (rc)
369 				return rc;
370 
371 			rc = pci_bus_read_config_byte (ctrl->pci_bus, PCI_DEVFN(device, 0), PCI_HEADER_TYPE, &header_type);
372 			if (rc)
373 				return rc;
374 
375 			// If multi-function device, set max_functions to 8
376 			if (header_type & 0x80)
377 				max_functions = 8;
378 			else
379 				max_functions = 1;
380 
381 			function = 0;
382 
383 			do {
384 				DevError = 0;
385 
386 				if ((header_type & 0x7F) == PCI_HEADER_TYPE_BRIDGE) {   // P-P Bridge
387 					//  Recurse the subordinate bus
388 					//  get the subordinate bus number
389 					rc = pci_bus_read_config_byte (ctrl->pci_bus, PCI_DEVFN(device, function), PCI_SECONDARY_BUS, &secondary_bus);
390 					if (rc) {
391 						return rc;
392 					} else {
393 						sub_bus = (int) secondary_bus;
394 
395 						// Save secondary bus cfg spc
396 						// with this recursive call.
397 						rc = cpqhp_save_config(ctrl, sub_bus, 0);
398 						if (rc)
399 							return rc;
400 						ctrl->pci_bus->number = busnumber;
401 					}
402 				}
403 
404 				index = 0;
405 				new_slot = cpqhp_slot_find(busnumber, device, index++);
406 				while (new_slot &&
407 				       (new_slot->function != (u8) function))
408 					new_slot = cpqhp_slot_find(busnumber, device, index++);
409 
410 				if (!new_slot) {
411 					// Setup slot structure.
412 					new_slot = cpqhp_slot_create(busnumber);
413 
414 					if (new_slot == NULL)
415 						return(1);
416 				}
417 
418 				new_slot->bus = (u8) busnumber;
419 				new_slot->device = (u8) device;
420 				new_slot->function = (u8) function;
421 				new_slot->is_a_board = 1;
422 				new_slot->switch_save = 0x10;
423 				// In case of unsupported board
424 				new_slot->status = DevError;
425 				new_slot->pci_dev = pci_find_slot(new_slot->bus, (new_slot->device << 3) | new_slot->function);
426 
427 				for (cloop = 0; cloop < 0x20; cloop++) {
428 					rc = pci_bus_read_config_dword (ctrl->pci_bus, PCI_DEVFN(device, function), cloop << 2, (u32 *) & (new_slot-> config_space [cloop]));
429 					if (rc)
430 						return rc;
431 				}
432 
433 				function++;
434 
435 				stop_it = 0;
436 
437 				//  this loop skips to the next present function
438 				//  reading in Class Code and Header type.
439 
440 				while ((function < max_functions)&&(!stop_it)) {
441 					rc = pci_bus_read_config_dword (ctrl->pci_bus, PCI_DEVFN(device, function), PCI_VENDOR_ID, &ID);
442 					if (ID == 0xFFFFFFFF) {	 // nothing there.
443 						function++;
444 					} else {  // Something there
445 						rc = pci_bus_read_config_byte (ctrl->pci_bus, PCI_DEVFN(device, function), 0x0B, &class_code);
446 						if (rc)
447 							return rc;
448 
449 						rc = pci_bus_read_config_byte (ctrl->pci_bus, PCI_DEVFN(device, function), PCI_HEADER_TYPE, &header_type);
450 						if (rc)
451 							return rc;
452 
453 						stop_it++;
454 					}
455 				}
456 
457 			} while (function < max_functions);
458 		}		// End of IF (device in slot?)
459 		else if (is_hot_plug) {
460 			// Setup slot structure with entry for empty slot
461 			new_slot = cpqhp_slot_create(busnumber);
462 
463 			if (new_slot == NULL) {
464 				return(1);
465 			}
466 
467 			new_slot->bus = (u8) busnumber;
468 			new_slot->device = (u8) device;
469 			new_slot->function = 0;
470 			new_slot->is_a_board = 0;
471 			new_slot->presence_save = 0;
472 			new_slot->switch_save = 0;
473 		}
474 	}			// End of FOR loop
475 
476 	return(0);
477 }
478 
479 
480 /*
481  * cpqhp_save_slot_config
482  *
483  * Saves configuration info for all PCI devices in a given slot
484  * including subordinate busses.
485  *
486  * returns 0 if success
487  */
488 int cpqhp_save_slot_config (struct controller *ctrl, struct pci_func * new_slot)
489 {
490 	long rc;
491 	u8 class_code;
492 	u8 header_type;
493 	u32 ID;
494 	u8 secondary_bus;
495 	int sub_bus;
496 	int max_functions;
497 	int function;
498 	int cloop = 0;
499 	int stop_it;
500 
501 	ID = 0xFFFFFFFF;
502 
503 	ctrl->pci_bus->number = new_slot->bus;
504 	pci_bus_read_config_dword (ctrl->pci_bus, PCI_DEVFN(new_slot->device, 0), PCI_VENDOR_ID, &ID);
505 
506 	if (ID != 0xFFFFFFFF) {	  //  device in slot
507 		pci_bus_read_config_byte (ctrl->pci_bus, PCI_DEVFN(new_slot->device, 0), 0x0B, &class_code);
508 		pci_bus_read_config_byte (ctrl->pci_bus, PCI_DEVFN(new_slot->device, 0), PCI_HEADER_TYPE, &header_type);
509 
510 		if (header_type & 0x80)	// Multi-function device
511 			max_functions = 8;
512 		else
513 			max_functions = 1;
514 
515 		function = 0;
516 
517 		do {
518 			if ((header_type & 0x7F) == PCI_HEADER_TYPE_BRIDGE) {	  // PCI-PCI Bridge
519 				//  Recurse the subordinate bus
520 				pci_bus_read_config_byte (ctrl->pci_bus, PCI_DEVFN(new_slot->device, function), PCI_SECONDARY_BUS, &secondary_bus);
521 
522 				sub_bus = (int) secondary_bus;
523 
524 				// Save the config headers for the secondary bus.
525 				rc = cpqhp_save_config(ctrl, sub_bus, 0);
526 				if (rc)
527 					return(rc);
528 				ctrl->pci_bus->number = new_slot->bus;
529 
530 			}	// End of IF
531 
532 			new_slot->status = 0;
533 
534 			for (cloop = 0; cloop < 0x20; cloop++) {
535 				pci_bus_read_config_dword (ctrl->pci_bus, PCI_DEVFN(new_slot->device, function), cloop << 2, (u32 *) & (new_slot-> config_space [cloop]));
536 			}
537 
538 			function++;
539 
540 			stop_it = 0;
541 
542 			//  this loop skips to the next present function
543 			//  reading in the Class Code and the Header type.
544 
545 			while ((function < max_functions) && (!stop_it)) {
546 				pci_bus_read_config_dword (ctrl->pci_bus, PCI_DEVFN(new_slot->device, function), PCI_VENDOR_ID, &ID);
547 
548 				if (ID == 0xFFFFFFFF) {	 // nothing there.
549 					function++;
550 				} else {  // Something there
551 					pci_bus_read_config_byte (ctrl->pci_bus, PCI_DEVFN(new_slot->device, function), 0x0B, &class_code);
552 
553 					pci_bus_read_config_byte (ctrl->pci_bus, PCI_DEVFN(new_slot->device, function), PCI_HEADER_TYPE, &header_type);
554 
555 					stop_it++;
556 				}
557 			}
558 
559 		} while (function < max_functions);
560 	}			// End of IF (device in slot?)
561 	else {
562 		return 2;
563 	}
564 
565 	return 0;
566 }
567 
568 
569 /*
570  * cpqhp_save_base_addr_length
571  *
572  * Saves the length of all base address registers for the
573  * specified slot.  this is for hot plug REPLACE
574  *
575  * returns 0 if success
576  */
577 int cpqhp_save_base_addr_length(struct controller *ctrl, struct pci_func * func)
578 {
579 	u8 cloop;
580 	u8 header_type;
581 	u8 secondary_bus;
582 	u8 type;
583 	int sub_bus;
584 	u32 temp_register;
585 	u32 base;
586 	u32 rc;
587 	struct pci_func *next;
588 	int index = 0;
589 	struct pci_bus *pci_bus = ctrl->pci_bus;
590 	unsigned int devfn;
591 
592 	func = cpqhp_slot_find(func->bus, func->device, index++);
593 
594 	while (func != NULL) {
595 		pci_bus->number = func->bus;
596 		devfn = PCI_DEVFN(func->device, func->function);
597 
598 		// Check for Bridge
599 		pci_bus_read_config_byte (pci_bus, devfn, PCI_HEADER_TYPE, &header_type);
600 
601 		if ((header_type & 0x7F) == PCI_HEADER_TYPE_BRIDGE) {
602 			// PCI-PCI Bridge
603 			pci_bus_read_config_byte (pci_bus, devfn, PCI_SECONDARY_BUS, &secondary_bus);
604 
605 			sub_bus = (int) secondary_bus;
606 
607 			next = cpqhp_slot_list[sub_bus];
608 
609 			while (next != NULL) {
610 				rc = cpqhp_save_base_addr_length(ctrl, next);
611 				if (rc)
612 					return rc;
613 
614 				next = next->next;
615 			}
616 			pci_bus->number = func->bus;
617 
618 			//FIXME: this loop is duplicated in the non-bridge case.  The two could be rolled together
619 			// Figure out IO and memory base lengths
620 			for (cloop = 0x10; cloop <= 0x14; cloop += 4) {
621 				temp_register = 0xFFFFFFFF;
622 				pci_bus_write_config_dword (pci_bus, devfn, cloop, temp_register);
623 				pci_bus_read_config_dword (pci_bus, devfn, cloop, &base);
624 
625 				if (base) {  // If this register is implemented
626 					if (base & 0x01L) {
627 						// IO base
628 						// set base = amount of IO space requested
629 						base = base & 0xFFFFFFFE;
630 						base = (~base) + 1;
631 
632 						type = 1;
633 					} else {
634 						// memory base
635 						base = base & 0xFFFFFFF0;
636 						base = (~base) + 1;
637 
638 						type = 0;
639 					}
640 				} else {
641 					base = 0x0L;
642 					type = 0;
643 				}
644 
645 				// Save information in slot structure
646 				func->base_length[(cloop - 0x10) >> 2] =
647 				base;
648 				func->base_type[(cloop - 0x10) >> 2] = type;
649 
650 			}	// End of base register loop
651 
652 
653 		} else if ((header_type & 0x7F) == 0x00) {	  // PCI-PCI Bridge
654 			// Figure out IO and memory base lengths
655 			for (cloop = 0x10; cloop <= 0x24; cloop += 4) {
656 				temp_register = 0xFFFFFFFF;
657 				pci_bus_write_config_dword (pci_bus, devfn, cloop, temp_register);
658 				pci_bus_read_config_dword (pci_bus, devfn, cloop, &base);
659 
660 				if (base) {  // If this register is implemented
661 					if (base & 0x01L) {
662 						// IO base
663 						// base = amount of IO space requested
664 						base = base & 0xFFFFFFFE;
665 						base = (~base) + 1;
666 
667 						type = 1;
668 					} else {
669 						// memory base
670 						// base = amount of memory space requested
671 						base = base & 0xFFFFFFF0;
672 						base = (~base) + 1;
673 
674 						type = 0;
675 					}
676 				} else {
677 					base = 0x0L;
678 					type = 0;
679 				}
680 
681 				// Save information in slot structure
682 				func->base_length[(cloop - 0x10) >> 2] = base;
683 				func->base_type[(cloop - 0x10) >> 2] = type;
684 
685 			}	// End of base register loop
686 
687 		} else {	  // Some other unknown header type
688 		}
689 
690 		// find the next device in this slot
691 		func = cpqhp_slot_find(func->bus, func->device, index++);
692 	}
693 
694 	return(0);
695 }
696 
697 
698 /*
699  * cpqhp_save_used_resources
700  *
701  * Stores used resource information for existing boards.  this is
702  * for boards that were in the system when this driver was loaded.
703  * this function is for hot plug ADD
704  *
705  * returns 0 if success
706  */
707 int cpqhp_save_used_resources (struct controller *ctrl, struct pci_func * func)
708 {
709 	u8 cloop;
710 	u8 header_type;
711 	u8 secondary_bus;
712 	u8 temp_byte;
713 	u8 b_base;
714 	u8 b_length;
715 	u16 command;
716 	u16 save_command;
717 	u16 w_base;
718 	u16 w_length;
719 	u32 temp_register;
720 	u32 save_base;
721 	u32 base;
722 	int index = 0;
723 	struct pci_resource *mem_node;
724 	struct pci_resource *p_mem_node;
725 	struct pci_resource *io_node;
726 	struct pci_resource *bus_node;
727 	struct pci_bus *pci_bus = ctrl->pci_bus;
728 	unsigned int devfn;
729 
730 	func = cpqhp_slot_find(func->bus, func->device, index++);
731 
732 	while ((func != NULL) && func->is_a_board) {
733 		pci_bus->number = func->bus;
734 		devfn = PCI_DEVFN(func->device, func->function);
735 
736 		// Save the command register
737 		pci_bus_read_config_word(pci_bus, devfn, PCI_COMMAND, &save_command);
738 
739 		// disable card
740 		command = 0x00;
741 		pci_bus_write_config_word(pci_bus, devfn, PCI_COMMAND, command);
742 
743 		// Check for Bridge
744 		pci_bus_read_config_byte(pci_bus, devfn, PCI_HEADER_TYPE, &header_type);
745 
746 		if ((header_type & 0x7F) == PCI_HEADER_TYPE_BRIDGE) {	  // PCI-PCI Bridge
747 			// Clear Bridge Control Register
748 			command = 0x00;
749 			pci_bus_write_config_word(pci_bus, devfn, PCI_BRIDGE_CONTROL, command);
750 			pci_bus_read_config_byte(pci_bus, devfn, PCI_SECONDARY_BUS, &secondary_bus);
751 			pci_bus_read_config_byte(pci_bus, devfn, PCI_SUBORDINATE_BUS, &temp_byte);
752 
753 			bus_node = kmalloc(sizeof(*bus_node), GFP_KERNEL);
754 			if (!bus_node)
755 				return -ENOMEM;
756 
757 			bus_node->base = secondary_bus;
758 			bus_node->length = temp_byte - secondary_bus + 1;
759 
760 			bus_node->next = func->bus_head;
761 			func->bus_head = bus_node;
762 
763 			// Save IO base and Limit registers
764 			pci_bus_read_config_byte(pci_bus, devfn, PCI_IO_BASE, &b_base);
765 			pci_bus_read_config_byte(pci_bus, devfn, PCI_IO_LIMIT, &b_length);
766 
767 			if ((b_base <= b_length) && (save_command & 0x01)) {
768 				io_node = kmalloc(sizeof(*io_node), GFP_KERNEL);
769 				if (!io_node)
770 					return -ENOMEM;
771 
772 				io_node->base = (b_base & 0xF0) << 8;
773 				io_node->length = (b_length - b_base + 0x10) << 8;
774 
775 				io_node->next = func->io_head;
776 				func->io_head = io_node;
777 			}
778 
779 			// Save memory base and Limit registers
780 			pci_bus_read_config_word(pci_bus, devfn, PCI_MEMORY_BASE, &w_base);
781 			pci_bus_read_config_word(pci_bus, devfn, PCI_MEMORY_LIMIT, &w_length);
782 
783 			if ((w_base <= w_length) && (save_command & 0x02)) {
784 				mem_node = kmalloc(sizeof(*mem_node), GFP_KERNEL);
785 				if (!mem_node)
786 					return -ENOMEM;
787 
788 				mem_node->base = w_base << 16;
789 				mem_node->length = (w_length - w_base + 0x10) << 16;
790 
791 				mem_node->next = func->mem_head;
792 				func->mem_head = mem_node;
793 			}
794 
795 			// Save prefetchable memory base and Limit registers
796 			pci_bus_read_config_word(pci_bus, devfn, PCI_PREF_MEMORY_BASE, &w_base);
797 			pci_bus_read_config_word(pci_bus, devfn, PCI_PREF_MEMORY_LIMIT, &w_length);
798 
799 			if ((w_base <= w_length) && (save_command & 0x02)) {
800 				p_mem_node = kmalloc(sizeof(*p_mem_node), GFP_KERNEL);
801 				if (!p_mem_node)
802 					return -ENOMEM;
803 
804 				p_mem_node->base = w_base << 16;
805 				p_mem_node->length = (w_length - w_base + 0x10) << 16;
806 
807 				p_mem_node->next = func->p_mem_head;
808 				func->p_mem_head = p_mem_node;
809 			}
810 			// Figure out IO and memory base lengths
811 			for (cloop = 0x10; cloop <= 0x14; cloop += 4) {
812 				pci_bus_read_config_dword (pci_bus, devfn, cloop, &save_base);
813 
814 				temp_register = 0xFFFFFFFF;
815 				pci_bus_write_config_dword(pci_bus, devfn, cloop, temp_register);
816 				pci_bus_read_config_dword(pci_bus, devfn, cloop, &base);
817 
818 				temp_register = base;
819 
820 				if (base) {  // If this register is implemented
821 					if (((base & 0x03L) == 0x01)
822 					    && (save_command & 0x01)) {
823 						// IO base
824 						// set temp_register = amount of IO space requested
825 						temp_register = base & 0xFFFFFFFE;
826 						temp_register = (~temp_register) + 1;
827 
828 						io_node = kmalloc(sizeof(*io_node),
829 								GFP_KERNEL);
830 						if (!io_node)
831 							return -ENOMEM;
832 
833 						io_node->base =
834 						save_base & (~0x03L);
835 						io_node->length = temp_register;
836 
837 						io_node->next = func->io_head;
838 						func->io_head = io_node;
839 					} else
840 						if (((base & 0x0BL) == 0x08)
841 						    && (save_command & 0x02)) {
842 						// prefetchable memory base
843 						temp_register = base & 0xFFFFFFF0;
844 						temp_register = (~temp_register) + 1;
845 
846 						p_mem_node = kmalloc(sizeof(*p_mem_node),
847 								GFP_KERNEL);
848 						if (!p_mem_node)
849 							return -ENOMEM;
850 
851 						p_mem_node->base = save_base & (~0x0FL);
852 						p_mem_node->length = temp_register;
853 
854 						p_mem_node->next = func->p_mem_head;
855 						func->p_mem_head = p_mem_node;
856 					} else
857 						if (((base & 0x0BL) == 0x00)
858 						    && (save_command & 0x02)) {
859 						// prefetchable memory base
860 						temp_register = base & 0xFFFFFFF0;
861 						temp_register = (~temp_register) + 1;
862 
863 						mem_node = kmalloc(sizeof(*mem_node),
864 								GFP_KERNEL);
865 						if (!mem_node)
866 							return -ENOMEM;
867 
868 						mem_node->base = save_base & (~0x0FL);
869 						mem_node->length = temp_register;
870 
871 						mem_node->next = func->mem_head;
872 						func->mem_head = mem_node;
873 					} else
874 						return(1);
875 				}
876 			}	// End of base register loop
877 		} else if ((header_type & 0x7F) == 0x00) {	  // Standard header
878 			// Figure out IO and memory base lengths
879 			for (cloop = 0x10; cloop <= 0x24; cloop += 4) {
880 				pci_bus_read_config_dword(pci_bus, devfn, cloop, &save_base);
881 
882 				temp_register = 0xFFFFFFFF;
883 				pci_bus_write_config_dword(pci_bus, devfn, cloop, temp_register);
884 				pci_bus_read_config_dword(pci_bus, devfn, cloop, &base);
885 
886 				temp_register = base;
887 
888 				if (base) {	  // If this register is implemented
889 					if (((base & 0x03L) == 0x01)
890 					    && (save_command & 0x01)) {
891 						// IO base
892 						// set temp_register = amount of IO space requested
893 						temp_register = base & 0xFFFFFFFE;
894 						temp_register = (~temp_register) + 1;
895 
896 						io_node = kmalloc(sizeof(*io_node),
897 								GFP_KERNEL);
898 						if (!io_node)
899 							return -ENOMEM;
900 
901 						io_node->base = save_base & (~0x01L);
902 						io_node->length = temp_register;
903 
904 						io_node->next = func->io_head;
905 						func->io_head = io_node;
906 					} else
907 						if (((base & 0x0BL) == 0x08)
908 						    && (save_command & 0x02)) {
909 						// prefetchable memory base
910 						temp_register = base & 0xFFFFFFF0;
911 						temp_register = (~temp_register) + 1;
912 
913 						p_mem_node = kmalloc(sizeof(*p_mem_node),
914 								GFP_KERNEL);
915 						if (!p_mem_node)
916 							return -ENOMEM;
917 
918 						p_mem_node->base = save_base & (~0x0FL);
919 						p_mem_node->length = temp_register;
920 
921 						p_mem_node->next = func->p_mem_head;
922 						func->p_mem_head = p_mem_node;
923 					} else
924 						if (((base & 0x0BL) == 0x00)
925 						    && (save_command & 0x02)) {
926 						// prefetchable memory base
927 						temp_register = base & 0xFFFFFFF0;
928 						temp_register = (~temp_register) + 1;
929 
930 						mem_node = kmalloc(sizeof(*mem_node),
931 								GFP_KERNEL);
932 						if (!mem_node)
933 							return -ENOMEM;
934 
935 						mem_node->base = save_base & (~0x0FL);
936 						mem_node->length = temp_register;
937 
938 						mem_node->next = func->mem_head;
939 						func->mem_head = mem_node;
940 					} else
941 						return(1);
942 				}
943 			}	// End of base register loop
944 		} else {	  // Some other unknown header type
945 		}
946 
947 		// find the next device in this slot
948 		func = cpqhp_slot_find(func->bus, func->device, index++);
949 	}
950 
951 	return(0);
952 }
953 
954 
955 /*
956  * cpqhp_configure_board
957  *
958  * Copies saved configuration information to one slot.
959  * this is called recursively for bridge devices.
960  * this is for hot plug REPLACE!
961  *
962  * returns 0 if success
963  */
964 int cpqhp_configure_board(struct controller *ctrl, struct pci_func * func)
965 {
966 	int cloop;
967 	u8 header_type;
968 	u8 secondary_bus;
969 	int sub_bus;
970 	struct pci_func *next;
971 	u32 temp;
972 	u32 rc;
973 	int index = 0;
974 	struct pci_bus *pci_bus = ctrl->pci_bus;
975 	unsigned int devfn;
976 
977 	func = cpqhp_slot_find(func->bus, func->device, index++);
978 
979 	while (func != NULL) {
980 		pci_bus->number = func->bus;
981 		devfn = PCI_DEVFN(func->device, func->function);
982 
983 		// Start at the top of config space so that the control
984 		// registers are programmed last
985 		for (cloop = 0x3C; cloop > 0; cloop -= 4) {
986 			pci_bus_write_config_dword (pci_bus, devfn, cloop, func->config_space[cloop >> 2]);
987 		}
988 
989 		pci_bus_read_config_byte (pci_bus, devfn, PCI_HEADER_TYPE, &header_type);
990 
991 		// If this is a bridge device, restore subordinate devices
992 		if ((header_type & 0x7F) == PCI_HEADER_TYPE_BRIDGE) {	  // PCI-PCI Bridge
993 			pci_bus_read_config_byte (pci_bus, devfn, PCI_SECONDARY_BUS, &secondary_bus);
994 
995 			sub_bus = (int) secondary_bus;
996 
997 			next = cpqhp_slot_list[sub_bus];
998 
999 			while (next != NULL) {
1000 				rc = cpqhp_configure_board(ctrl, next);
1001 				if (rc)
1002 					return rc;
1003 
1004 				next = next->next;
1005 			}
1006 		} else {
1007 
1008 			// Check all the base Address Registers to make sure
1009 			// they are the same.  If not, the board is different.
1010 
1011 			for (cloop = 16; cloop < 40; cloop += 4) {
1012 				pci_bus_read_config_dword (pci_bus, devfn, cloop, &temp);
1013 
1014 				if (temp != func->config_space[cloop >> 2]) {
1015 					dbg("Config space compare failure!!! offset = %x\n", cloop);
1016 					dbg("bus = %x, device = %x, function = %x\n", func->bus, func->device, func->function);
1017 					dbg("temp = %x, config space = %x\n\n", temp, func->config_space[cloop >> 2]);
1018 					return 1;
1019 				}
1020 			}
1021 		}
1022 
1023 		func->configured = 1;
1024 
1025 		func = cpqhp_slot_find(func->bus, func->device, index++);
1026 	}
1027 
1028 	return 0;
1029 }
1030 
1031 
1032 /*
1033  * cpqhp_valid_replace
1034  *
1035  * this function checks to see if a board is the same as the
1036  * one it is replacing.  this check will detect if the device's
1037  * vendor or device id's are the same
1038  *
1039  * returns 0 if the board is the same nonzero otherwise
1040  */
1041 int cpqhp_valid_replace(struct controller *ctrl, struct pci_func * func)
1042 {
1043 	u8 cloop;
1044 	u8 header_type;
1045 	u8 secondary_bus;
1046 	u8 type;
1047 	u32 temp_register = 0;
1048 	u32 base;
1049 	u32 rc;
1050 	struct pci_func *next;
1051 	int index = 0;
1052 	struct pci_bus *pci_bus = ctrl->pci_bus;
1053 	unsigned int devfn;
1054 
1055 	if (!func->is_a_board)
1056 		return(ADD_NOT_SUPPORTED);
1057 
1058 	func = cpqhp_slot_find(func->bus, func->device, index++);
1059 
1060 	while (func != NULL) {
1061 		pci_bus->number = func->bus;
1062 		devfn = PCI_DEVFN(func->device, func->function);
1063 
1064 		pci_bus_read_config_dword (pci_bus, devfn, PCI_VENDOR_ID, &temp_register);
1065 
1066 		// No adapter present
1067 		if (temp_register == 0xFFFFFFFF)
1068 			return(NO_ADAPTER_PRESENT);
1069 
1070 		if (temp_register != func->config_space[0])
1071 			return(ADAPTER_NOT_SAME);
1072 
1073 		// Check for same revision number and class code
1074 		pci_bus_read_config_dword (pci_bus, devfn, PCI_CLASS_REVISION, &temp_register);
1075 
1076 		// Adapter not the same
1077 		if (temp_register != func->config_space[0x08 >> 2])
1078 			return(ADAPTER_NOT_SAME);
1079 
1080 		// Check for Bridge
1081 		pci_bus_read_config_byte (pci_bus, devfn, PCI_HEADER_TYPE, &header_type);
1082 
1083 		if ((header_type & 0x7F) == PCI_HEADER_TYPE_BRIDGE) {	  // PCI-PCI Bridge
1084 			// In order to continue checking, we must program the
1085 			// bus registers in the bridge to respond to accesses
1086 			// for it's subordinate bus(es)
1087 
1088 			temp_register = func->config_space[0x18 >> 2];
1089 			pci_bus_write_config_dword (pci_bus, devfn, PCI_PRIMARY_BUS, temp_register);
1090 
1091 			secondary_bus = (temp_register >> 8) & 0xFF;
1092 
1093 			next = cpqhp_slot_list[secondary_bus];
1094 
1095 			while (next != NULL) {
1096 				rc = cpqhp_valid_replace(ctrl, next);
1097 				if (rc)
1098 					return rc;
1099 
1100 				next = next->next;
1101 			}
1102 
1103 		}
1104 		// Check to see if it is a standard config header
1105 		else if ((header_type & 0x7F) == PCI_HEADER_TYPE_NORMAL) {
1106 			// Check subsystem vendor and ID
1107 			pci_bus_read_config_dword (pci_bus, devfn, PCI_SUBSYSTEM_VENDOR_ID, &temp_register);
1108 
1109 			if (temp_register != func->config_space[0x2C >> 2]) {
1110 				// If it's a SMART-2 and the register isn't filled
1111 				// in, ignore the difference because
1112 				// they just have an old rev of the firmware
1113 
1114 				if (!((func->config_space[0] == 0xAE100E11)
1115 				      && (temp_register == 0x00L)))
1116 					return(ADAPTER_NOT_SAME);
1117 			}
1118 			// Figure out IO and memory base lengths
1119 			for (cloop = 0x10; cloop <= 0x24; cloop += 4) {
1120 				temp_register = 0xFFFFFFFF;
1121 				pci_bus_write_config_dword (pci_bus, devfn, cloop, temp_register);
1122 				pci_bus_read_config_dword (pci_bus, devfn, cloop, &base);
1123 				if (base) {	  // If this register is implemented
1124 					if (base & 0x01L) {
1125 						// IO base
1126 						// set base = amount of IO space requested
1127 						base = base & 0xFFFFFFFE;
1128 						base = (~base) + 1;
1129 
1130 						type = 1;
1131 					} else {
1132 						// memory base
1133 						base = base & 0xFFFFFFF0;
1134 						base = (~base) + 1;
1135 
1136 						type = 0;
1137 					}
1138 				} else {
1139 					base = 0x0L;
1140 					type = 0;
1141 				}
1142 
1143 				// Check information in slot structure
1144 				if (func->base_length[(cloop - 0x10) >> 2] != base)
1145 					return(ADAPTER_NOT_SAME);
1146 
1147 				if (func->base_type[(cloop - 0x10) >> 2] != type)
1148 					return(ADAPTER_NOT_SAME);
1149 
1150 			}	// End of base register loop
1151 
1152 		}		// End of (type 0 config space) else
1153 		else {
1154 			// this is not a type 0 or 1 config space header so
1155 			// we don't know how to do it
1156 			return(DEVICE_TYPE_NOT_SUPPORTED);
1157 		}
1158 
1159 		// Get the next function
1160 		func = cpqhp_slot_find(func->bus, func->device, index++);
1161 	}
1162 
1163 
1164 	return 0;
1165 }
1166 
1167 
1168 /*
1169  * cpqhp_find_available_resources
1170  *
1171  * Finds available memory, IO, and IRQ resources for programming
1172  * devices which may be added to the system
1173  * this function is for hot plug ADD!
1174  *
1175  * returns 0 if success
1176  */
1177 int cpqhp_find_available_resources(struct controller *ctrl, void __iomem *rom_start)
1178 {
1179 	u8 temp;
1180 	u8 populated_slot;
1181 	u8 bridged_slot;
1182 	void __iomem *one_slot;
1183 	void __iomem *rom_resource_table;
1184 	struct pci_func *func = NULL;
1185 	int i = 10, index;
1186 	u32 temp_dword, rc;
1187 	struct pci_resource *mem_node;
1188 	struct pci_resource *p_mem_node;
1189 	struct pci_resource *io_node;
1190 	struct pci_resource *bus_node;
1191 
1192 	rom_resource_table = detect_HRT_floating_pointer(rom_start, rom_start+0xffff);
1193 	dbg("rom_resource_table = %p\n", rom_resource_table);
1194 
1195 	if (rom_resource_table == NULL) {
1196 		return -ENODEV;
1197 	}
1198 	// Sum all resources and setup resource maps
1199 	unused_IRQ = readl(rom_resource_table + UNUSED_IRQ);
1200 	dbg("unused_IRQ = %x\n", unused_IRQ);
1201 
1202 	temp = 0;
1203 	while (unused_IRQ) {
1204 		if (unused_IRQ & 1) {
1205 			cpqhp_disk_irq = temp;
1206 			break;
1207 		}
1208 		unused_IRQ = unused_IRQ >> 1;
1209 		temp++;
1210 	}
1211 
1212 	dbg("cpqhp_disk_irq= %d\n", cpqhp_disk_irq);
1213 	unused_IRQ = unused_IRQ >> 1;
1214 	temp++;
1215 
1216 	while (unused_IRQ) {
1217 		if (unused_IRQ & 1) {
1218 			cpqhp_nic_irq = temp;
1219 			break;
1220 		}
1221 		unused_IRQ = unused_IRQ >> 1;
1222 		temp++;
1223 	}
1224 
1225 	dbg("cpqhp_nic_irq= %d\n", cpqhp_nic_irq);
1226 	unused_IRQ = readl(rom_resource_table + PCIIRQ);
1227 
1228 	temp = 0;
1229 
1230 	if (!cpqhp_nic_irq) {
1231 		cpqhp_nic_irq = ctrl->cfgspc_irq;
1232 	}
1233 
1234 	if (!cpqhp_disk_irq) {
1235 		cpqhp_disk_irq = ctrl->cfgspc_irq;
1236 	}
1237 
1238 	dbg("cpqhp_disk_irq, cpqhp_nic_irq= %d, %d\n", cpqhp_disk_irq, cpqhp_nic_irq);
1239 
1240 	rc = compaq_nvram_load(rom_start, ctrl);
1241 	if (rc)
1242 		return rc;
1243 
1244 	one_slot = rom_resource_table + sizeof (struct hrt);
1245 
1246 	i = readb(rom_resource_table + NUMBER_OF_ENTRIES);
1247 	dbg("number_of_entries = %d\n", i);
1248 
1249 	if (!readb(one_slot + SECONDARY_BUS))
1250 		return 1;
1251 
1252 	dbg("dev|IO base|length|Mem base|length|Pre base|length|PB SB MB\n");
1253 
1254 	while (i && readb(one_slot + SECONDARY_BUS)) {
1255 		u8 dev_func = readb(one_slot + DEV_FUNC);
1256 		u8 primary_bus = readb(one_slot + PRIMARY_BUS);
1257 		u8 secondary_bus = readb(one_slot + SECONDARY_BUS);
1258 		u8 max_bus = readb(one_slot + MAX_BUS);
1259 		u16 io_base = readw(one_slot + IO_BASE);
1260 		u16 io_length = readw(one_slot + IO_LENGTH);
1261 		u16 mem_base = readw(one_slot + MEM_BASE);
1262 		u16 mem_length = readw(one_slot + MEM_LENGTH);
1263 		u16 pre_mem_base = readw(one_slot + PRE_MEM_BASE);
1264 		u16 pre_mem_length = readw(one_slot + PRE_MEM_LENGTH);
1265 
1266 		dbg("%2.2x | %4.4x  | %4.4x | %4.4x   | %4.4x | %4.4x   | %4.4x |%2.2x %2.2x %2.2x\n",
1267 		    dev_func, io_base, io_length, mem_base, mem_length, pre_mem_base, pre_mem_length,
1268 		    primary_bus, secondary_bus, max_bus);
1269 
1270 		// If this entry isn't for our controller's bus, ignore it
1271 		if (primary_bus != ctrl->bus) {
1272 			i--;
1273 			one_slot += sizeof (struct slot_rt);
1274 			continue;
1275 		}
1276 		// find out if this entry is for an occupied slot
1277 		ctrl->pci_bus->number = primary_bus;
1278 		pci_bus_read_config_dword (ctrl->pci_bus, dev_func, PCI_VENDOR_ID, &temp_dword);
1279 		dbg("temp_D_word = %x\n", temp_dword);
1280 
1281 		if (temp_dword != 0xFFFFFFFF) {
1282 			index = 0;
1283 			func = cpqhp_slot_find(primary_bus, dev_func >> 3, 0);
1284 
1285 			while (func && (func->function != (dev_func & 0x07))) {
1286 				dbg("func = %p (bus, dev, fun) = (%d, %d, %d)\n", func, primary_bus, dev_func >> 3, index);
1287 				func = cpqhp_slot_find(primary_bus, dev_func >> 3, index++);
1288 			}
1289 
1290 			// If we can't find a match, skip this table entry
1291 			if (!func) {
1292 				i--;
1293 				one_slot += sizeof (struct slot_rt);
1294 				continue;
1295 			}
1296 			// this may not work and shouldn't be used
1297 			if (secondary_bus != primary_bus)
1298 				bridged_slot = 1;
1299 			else
1300 				bridged_slot = 0;
1301 
1302 			populated_slot = 1;
1303 		} else {
1304 			populated_slot = 0;
1305 			bridged_slot = 0;
1306 		}
1307 
1308 
1309 		// If we've got a valid IO base, use it
1310 
1311 		temp_dword = io_base + io_length;
1312 
1313 		if ((io_base) && (temp_dword < 0x10000)) {
1314 			io_node = kmalloc(sizeof(*io_node), GFP_KERNEL);
1315 			if (!io_node)
1316 				return -ENOMEM;
1317 
1318 			io_node->base = io_base;
1319 			io_node->length = io_length;
1320 
1321 			dbg("found io_node(base, length) = %x, %x\n",
1322 					io_node->base, io_node->length);
1323 			dbg("populated slot =%d \n", populated_slot);
1324 			if (!populated_slot) {
1325 				io_node->next = ctrl->io_head;
1326 				ctrl->io_head = io_node;
1327 			} else {
1328 				io_node->next = func->io_head;
1329 				func->io_head = io_node;
1330 			}
1331 		}
1332 
1333 		// If we've got a valid memory base, use it
1334 		temp_dword = mem_base + mem_length;
1335 		if ((mem_base) && (temp_dword < 0x10000)) {
1336 			mem_node = kmalloc(sizeof(*mem_node), GFP_KERNEL);
1337 			if (!mem_node)
1338 				return -ENOMEM;
1339 
1340 			mem_node->base = mem_base << 16;
1341 
1342 			mem_node->length = mem_length << 16;
1343 
1344 			dbg("found mem_node(base, length) = %x, %x\n",
1345 					mem_node->base, mem_node->length);
1346 			dbg("populated slot =%d \n", populated_slot);
1347 			if (!populated_slot) {
1348 				mem_node->next = ctrl->mem_head;
1349 				ctrl->mem_head = mem_node;
1350 			} else {
1351 				mem_node->next = func->mem_head;
1352 				func->mem_head = mem_node;
1353 			}
1354 		}
1355 
1356 		// If we've got a valid prefetchable memory base, and
1357 		// the base + length isn't greater than 0xFFFF
1358 		temp_dword = pre_mem_base + pre_mem_length;
1359 		if ((pre_mem_base) && (temp_dword < 0x10000)) {
1360 			p_mem_node = kmalloc(sizeof(*p_mem_node), GFP_KERNEL);
1361 			if (!p_mem_node)
1362 				return -ENOMEM;
1363 
1364 			p_mem_node->base = pre_mem_base << 16;
1365 
1366 			p_mem_node->length = pre_mem_length << 16;
1367 			dbg("found p_mem_node(base, length) = %x, %x\n",
1368 					p_mem_node->base, p_mem_node->length);
1369 			dbg("populated slot =%d \n", populated_slot);
1370 
1371 			if (!populated_slot) {
1372 				p_mem_node->next = ctrl->p_mem_head;
1373 				ctrl->p_mem_head = p_mem_node;
1374 			} else {
1375 				p_mem_node->next = func->p_mem_head;
1376 				func->p_mem_head = p_mem_node;
1377 			}
1378 		}
1379 
1380 		// If we've got a valid bus number, use it
1381 		// The second condition is to ignore bus numbers on
1382 		// populated slots that don't have PCI-PCI bridges
1383 		if (secondary_bus && (secondary_bus != primary_bus)) {
1384 			bus_node = kmalloc(sizeof(*bus_node), GFP_KERNEL);
1385 			if (!bus_node)
1386 				return -ENOMEM;
1387 
1388 			bus_node->base = secondary_bus;
1389 			bus_node->length = max_bus - secondary_bus + 1;
1390 			dbg("found bus_node(base, length) = %x, %x\n",
1391 					bus_node->base, bus_node->length);
1392 			dbg("populated slot =%d \n", populated_slot);
1393 			if (!populated_slot) {
1394 				bus_node->next = ctrl->bus_head;
1395 				ctrl->bus_head = bus_node;
1396 			} else {
1397 				bus_node->next = func->bus_head;
1398 				func->bus_head = bus_node;
1399 			}
1400 		}
1401 
1402 		i--;
1403 		one_slot += sizeof (struct slot_rt);
1404 	}
1405 
1406 	// If all of the following fail, we don't have any resources for
1407 	// hot plug add
1408 	rc = 1;
1409 	rc &= cpqhp_resource_sort_and_combine(&(ctrl->mem_head));
1410 	rc &= cpqhp_resource_sort_and_combine(&(ctrl->p_mem_head));
1411 	rc &= cpqhp_resource_sort_and_combine(&(ctrl->io_head));
1412 	rc &= cpqhp_resource_sort_and_combine(&(ctrl->bus_head));
1413 
1414 	return rc;
1415 }
1416 
1417 
1418 /*
1419  * cpqhp_return_board_resources
1420  *
1421  * this routine returns all resources allocated to a board to
1422  * the available pool.
1423  *
1424  * returns 0 if success
1425  */
1426 int cpqhp_return_board_resources(struct pci_func * func, struct resource_lists * resources)
1427 {
1428 	int rc = 0;
1429 	struct pci_resource *node;
1430 	struct pci_resource *t_node;
1431 	dbg("%s\n", __FUNCTION__);
1432 
1433 	if (!func)
1434 		return 1;
1435 
1436 	node = func->io_head;
1437 	func->io_head = NULL;
1438 	while (node) {
1439 		t_node = node->next;
1440 		return_resource(&(resources->io_head), node);
1441 		node = t_node;
1442 	}
1443 
1444 	node = func->mem_head;
1445 	func->mem_head = NULL;
1446 	while (node) {
1447 		t_node = node->next;
1448 		return_resource(&(resources->mem_head), node);
1449 		node = t_node;
1450 	}
1451 
1452 	node = func->p_mem_head;
1453 	func->p_mem_head = NULL;
1454 	while (node) {
1455 		t_node = node->next;
1456 		return_resource(&(resources->p_mem_head), node);
1457 		node = t_node;
1458 	}
1459 
1460 	node = func->bus_head;
1461 	func->bus_head = NULL;
1462 	while (node) {
1463 		t_node = node->next;
1464 		return_resource(&(resources->bus_head), node);
1465 		node = t_node;
1466 	}
1467 
1468 	rc |= cpqhp_resource_sort_and_combine(&(resources->mem_head));
1469 	rc |= cpqhp_resource_sort_and_combine(&(resources->p_mem_head));
1470 	rc |= cpqhp_resource_sort_and_combine(&(resources->io_head));
1471 	rc |= cpqhp_resource_sort_and_combine(&(resources->bus_head));
1472 
1473 	return rc;
1474 }
1475 
1476 
1477 /*
1478  * cpqhp_destroy_resource_list
1479  *
1480  * Puts node back in the resource list pointed to by head
1481  */
1482 void cpqhp_destroy_resource_list (struct resource_lists * resources)
1483 {
1484 	struct pci_resource *res, *tres;
1485 
1486 	res = resources->io_head;
1487 	resources->io_head = NULL;
1488 
1489 	while (res) {
1490 		tres = res;
1491 		res = res->next;
1492 		kfree(tres);
1493 	}
1494 
1495 	res = resources->mem_head;
1496 	resources->mem_head = NULL;
1497 
1498 	while (res) {
1499 		tres = res;
1500 		res = res->next;
1501 		kfree(tres);
1502 	}
1503 
1504 	res = resources->p_mem_head;
1505 	resources->p_mem_head = NULL;
1506 
1507 	while (res) {
1508 		tres = res;
1509 		res = res->next;
1510 		kfree(tres);
1511 	}
1512 
1513 	res = resources->bus_head;
1514 	resources->bus_head = NULL;
1515 
1516 	while (res) {
1517 		tres = res;
1518 		res = res->next;
1519 		kfree(tres);
1520 	}
1521 }
1522 
1523 
1524 /*
1525  * cpqhp_destroy_board_resources
1526  *
1527  * Puts node back in the resource list pointed to by head
1528  */
1529 void cpqhp_destroy_board_resources (struct pci_func * func)
1530 {
1531 	struct pci_resource *res, *tres;
1532 
1533 	res = func->io_head;
1534 	func->io_head = NULL;
1535 
1536 	while (res) {
1537 		tres = res;
1538 		res = res->next;
1539 		kfree(tres);
1540 	}
1541 
1542 	res = func->mem_head;
1543 	func->mem_head = NULL;
1544 
1545 	while (res) {
1546 		tres = res;
1547 		res = res->next;
1548 		kfree(tres);
1549 	}
1550 
1551 	res = func->p_mem_head;
1552 	func->p_mem_head = NULL;
1553 
1554 	while (res) {
1555 		tres = res;
1556 		res = res->next;
1557 		kfree(tres);
1558 	}
1559 
1560 	res = func->bus_head;
1561 	func->bus_head = NULL;
1562 
1563 	while (res) {
1564 		tres = res;
1565 		res = res->next;
1566 		kfree(tres);
1567 	}
1568 }
1569 
1570