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