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