1 /* 2 * Compaq Hot Plug Controller Driver 3 * 4 * Copyright (C) 1995,2001 Compaq Computer Corporation 5 * Copyright (C) 2001 Greg Kroah-Hartman (greg@kroah.com) 6 * Copyright (C) 2001 IBM Corp. 7 * 8 * All rights reserved. 9 * 10 * This program is free software; you can redistribute it and/or modify 11 * it under the terms of the GNU General Public License as published by 12 * the Free Software Foundation; either version 2 of the License, or (at 13 * your option) any later version. 14 * 15 * This program is distributed in the hope that it will be useful, but 16 * WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or 18 * NON INFRINGEMENT. See the GNU General Public License for more 19 * details. 20 * 21 * You should have received a copy of the GNU General Public License 22 * along with this program; if not, write to the Free Software 23 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 24 * 25 * Send feedback to <greg@kroah.com> 26 * 27 */ 28 29 #include <linux/config.h> 30 #include <linux/module.h> 31 #include <linux/kernel.h> 32 #include <linux/types.h> 33 #include <linux/slab.h> 34 #include <linux/workqueue.h> 35 #include <linux/interrupt.h> 36 #include <linux/delay.h> 37 #include <linux/wait.h> 38 #include <linux/smp_lock.h> 39 #include <linux/pci.h> 40 #include "cpqphp.h" 41 42 static u32 configure_new_device(struct controller* ctrl, struct pci_func *func, 43 u8 behind_bridge, struct resource_lists *resources); 44 static int configure_new_function(struct controller* ctrl, struct pci_func *func, 45 u8 behind_bridge, struct resource_lists *resources); 46 static void interrupt_event_handler(struct controller *ctrl); 47 48 static struct semaphore event_semaphore; /* mutex for process loop (up if something to process) */ 49 static struct semaphore event_exit; /* guard ensure thread has exited before calling it quits */ 50 static int event_finished; 51 static unsigned long pushbutton_pending; /* = 0 */ 52 53 /* things needed for the long_delay function */ 54 static struct semaphore delay_sem; 55 static wait_queue_head_t delay_wait; 56 57 /* delay is in jiffies to wait for */ 58 static void long_delay(int delay) 59 { 60 DECLARE_WAITQUEUE(wait, current); 61 62 /* only allow 1 customer into the delay queue at once 63 * yes this makes some people wait even longer, but who really cares? 64 * this is for _huge_ delays to make the hardware happy as the 65 * signals bounce around 66 */ 67 down (&delay_sem); 68 69 init_waitqueue_head(&delay_wait); 70 71 add_wait_queue(&delay_wait, &wait); 72 msleep_interruptible(jiffies_to_msecs(delay)); 73 remove_wait_queue(&delay_wait, &wait); 74 75 up(&delay_sem); 76 } 77 78 79 /* FIXME: The following line needs to be somewhere else... */ 80 #define WRONG_BUS_FREQUENCY 0x07 81 static u8 handle_switch_change(u8 change, struct controller * ctrl) 82 { 83 int hp_slot; 84 u8 rc = 0; 85 u16 temp_word; 86 struct pci_func *func; 87 struct event_info *taskInfo; 88 89 if (!change) 90 return 0; 91 92 /* Switch Change */ 93 dbg("cpqsbd: Switch interrupt received.\n"); 94 95 for (hp_slot = 0; hp_slot < 6; hp_slot++) { 96 if (change & (0x1L << hp_slot)) { 97 /********************************** 98 * this one changed. 99 **********************************/ 100 func = cpqhp_slot_find(ctrl->bus, 101 (hp_slot + ctrl->slot_device_offset), 0); 102 103 /* this is the structure that tells the worker thread 104 *what to do */ 105 taskInfo = &(ctrl->event_queue[ctrl->next_event]); 106 ctrl->next_event = (ctrl->next_event + 1) % 10; 107 taskInfo->hp_slot = hp_slot; 108 109 rc++; 110 111 temp_word = ctrl->ctrl_int_comp >> 16; 112 func->presence_save = (temp_word >> hp_slot) & 0x01; 113 func->presence_save |= (temp_word >> (hp_slot + 7)) & 0x02; 114 115 if (ctrl->ctrl_int_comp & (0x1L << hp_slot)) { 116 /********************************** 117 * Switch opened 118 **********************************/ 119 120 func->switch_save = 0; 121 122 taskInfo->event_type = INT_SWITCH_OPEN; 123 } else { 124 /********************************** 125 * Switch closed 126 **********************************/ 127 128 func->switch_save = 0x10; 129 130 taskInfo->event_type = INT_SWITCH_CLOSE; 131 } 132 } 133 } 134 135 return rc; 136 } 137 138 /** 139 * cpqhp_find_slot: find the struct slot of given device 140 * @ctrl: scan lots of this controller 141 * @device: the device id to find 142 */ 143 static struct slot *cpqhp_find_slot(struct controller *ctrl, u8 device) 144 { 145 struct slot *slot = ctrl->slot; 146 147 while (slot && (slot->device != device)) { 148 slot = slot->next; 149 } 150 151 return slot; 152 } 153 154 155 static u8 handle_presence_change(u16 change, struct controller * ctrl) 156 { 157 int hp_slot; 158 u8 rc = 0; 159 u8 temp_byte; 160 u16 temp_word; 161 struct pci_func *func; 162 struct event_info *taskInfo; 163 struct slot *p_slot; 164 165 if (!change) 166 return 0; 167 168 /********************************** 169 * Presence Change 170 **********************************/ 171 dbg("cpqsbd: Presence/Notify input change.\n"); 172 dbg(" Changed bits are 0x%4.4x\n", change ); 173 174 for (hp_slot = 0; hp_slot < 6; hp_slot++) { 175 if (change & (0x0101 << hp_slot)) { 176 /********************************** 177 * this one changed. 178 **********************************/ 179 func = cpqhp_slot_find(ctrl->bus, 180 (hp_slot + ctrl->slot_device_offset), 0); 181 182 taskInfo = &(ctrl->event_queue[ctrl->next_event]); 183 ctrl->next_event = (ctrl->next_event + 1) % 10; 184 taskInfo->hp_slot = hp_slot; 185 186 rc++; 187 188 p_slot = cpqhp_find_slot(ctrl, hp_slot + (readb(ctrl->hpc_reg + SLOT_MASK) >> 4)); 189 if (!p_slot) 190 return 0; 191 192 /* If the switch closed, must be a button 193 * If not in button mode, nevermind */ 194 if (func->switch_save && (ctrl->push_button == 1)) { 195 temp_word = ctrl->ctrl_int_comp >> 16; 196 temp_byte = (temp_word >> hp_slot) & 0x01; 197 temp_byte |= (temp_word >> (hp_slot + 7)) & 0x02; 198 199 if (temp_byte != func->presence_save) { 200 /************************************** 201 * button Pressed (doesn't do anything) 202 **************************************/ 203 dbg("hp_slot %d button pressed\n", hp_slot); 204 taskInfo->event_type = INT_BUTTON_PRESS; 205 } else { 206 /********************************** 207 * button Released - TAKE ACTION!!!! 208 **********************************/ 209 dbg("hp_slot %d button released\n", hp_slot); 210 taskInfo->event_type = INT_BUTTON_RELEASE; 211 212 /* Cancel if we are still blinking */ 213 if ((p_slot->state == BLINKINGON_STATE) 214 || (p_slot->state == BLINKINGOFF_STATE)) { 215 taskInfo->event_type = INT_BUTTON_CANCEL; 216 dbg("hp_slot %d button cancel\n", hp_slot); 217 } else if ((p_slot->state == POWERON_STATE) 218 || (p_slot->state == POWEROFF_STATE)) { 219 /* info(msg_button_ignore, p_slot->number); */ 220 taskInfo->event_type = INT_BUTTON_IGNORE; 221 dbg("hp_slot %d button ignore\n", hp_slot); 222 } 223 } 224 } else { 225 /* Switch is open, assume a presence change 226 * Save the presence state */ 227 temp_word = ctrl->ctrl_int_comp >> 16; 228 func->presence_save = (temp_word >> hp_slot) & 0x01; 229 func->presence_save |= (temp_word >> (hp_slot + 7)) & 0x02; 230 231 if ((!(ctrl->ctrl_int_comp & (0x010000 << hp_slot))) || 232 (!(ctrl->ctrl_int_comp & (0x01000000 << hp_slot)))) { 233 /* Present */ 234 taskInfo->event_type = INT_PRESENCE_ON; 235 } else { 236 /* Not Present */ 237 taskInfo->event_type = INT_PRESENCE_OFF; 238 } 239 } 240 } 241 } 242 243 return rc; 244 } 245 246 247 static u8 handle_power_fault(u8 change, struct controller * ctrl) 248 { 249 int hp_slot; 250 u8 rc = 0; 251 struct pci_func *func; 252 struct event_info *taskInfo; 253 254 if (!change) 255 return 0; 256 257 /********************************** 258 * power fault 259 **********************************/ 260 261 info("power fault interrupt\n"); 262 263 for (hp_slot = 0; hp_slot < 6; hp_slot++) { 264 if (change & (0x01 << hp_slot)) { 265 /********************************** 266 * this one changed. 267 **********************************/ 268 func = cpqhp_slot_find(ctrl->bus, 269 (hp_slot + ctrl->slot_device_offset), 0); 270 271 taskInfo = &(ctrl->event_queue[ctrl->next_event]); 272 ctrl->next_event = (ctrl->next_event + 1) % 10; 273 taskInfo->hp_slot = hp_slot; 274 275 rc++; 276 277 if (ctrl->ctrl_int_comp & (0x00000100 << hp_slot)) { 278 /********************************** 279 * power fault Cleared 280 **********************************/ 281 func->status = 0x00; 282 283 taskInfo->event_type = INT_POWER_FAULT_CLEAR; 284 } else { 285 /********************************** 286 * power fault 287 **********************************/ 288 taskInfo->event_type = INT_POWER_FAULT; 289 290 if (ctrl->rev < 4) { 291 amber_LED_on (ctrl, hp_slot); 292 green_LED_off (ctrl, hp_slot); 293 set_SOGO (ctrl); 294 295 /* this is a fatal condition, we want 296 * to crash the machine to protect from 297 * data corruption. simulated_NMI 298 * shouldn't ever return */ 299 /* FIXME 300 simulated_NMI(hp_slot, ctrl); */ 301 302 /* The following code causes a software 303 * crash just in case simulated_NMI did 304 * return */ 305 /*FIXME 306 panic(msg_power_fault); */ 307 } else { 308 /* set power fault status for this board */ 309 func->status = 0xFF; 310 info("power fault bit %x set\n", hp_slot); 311 } 312 } 313 } 314 } 315 316 return rc; 317 } 318 319 320 /** 321 * sort_by_size: sort nodes on the list by their length, smallest first. 322 * @head: list to sort 323 * 324 */ 325 static int sort_by_size(struct pci_resource **head) 326 { 327 struct pci_resource *current_res; 328 struct pci_resource *next_res; 329 int out_of_order = 1; 330 331 if (!(*head)) 332 return 1; 333 334 if (!((*head)->next)) 335 return 0; 336 337 while (out_of_order) { 338 out_of_order = 0; 339 340 /* Special case for swapping list head */ 341 if (((*head)->next) && 342 ((*head)->length > (*head)->next->length)) { 343 out_of_order++; 344 current_res = *head; 345 *head = (*head)->next; 346 current_res->next = (*head)->next; 347 (*head)->next = current_res; 348 } 349 350 current_res = *head; 351 352 while (current_res->next && current_res->next->next) { 353 if (current_res->next->length > current_res->next->next->length) { 354 out_of_order++; 355 next_res = current_res->next; 356 current_res->next = current_res->next->next; 357 current_res = current_res->next; 358 next_res->next = current_res->next; 359 current_res->next = next_res; 360 } else 361 current_res = current_res->next; 362 } 363 } /* End of out_of_order loop */ 364 365 return 0; 366 } 367 368 369 /** 370 * sort_by_max_size: sort nodes on the list by their length, largest first. 371 * @head: list to sort 372 * 373 */ 374 static int sort_by_max_size(struct pci_resource **head) 375 { 376 struct pci_resource *current_res; 377 struct pci_resource *next_res; 378 int out_of_order = 1; 379 380 if (!(*head)) 381 return 1; 382 383 if (!((*head)->next)) 384 return 0; 385 386 while (out_of_order) { 387 out_of_order = 0; 388 389 /* Special case for swapping list head */ 390 if (((*head)->next) && 391 ((*head)->length < (*head)->next->length)) { 392 out_of_order++; 393 current_res = *head; 394 *head = (*head)->next; 395 current_res->next = (*head)->next; 396 (*head)->next = current_res; 397 } 398 399 current_res = *head; 400 401 while (current_res->next && current_res->next->next) { 402 if (current_res->next->length < current_res->next->next->length) { 403 out_of_order++; 404 next_res = current_res->next; 405 current_res->next = current_res->next->next; 406 current_res = current_res->next; 407 next_res->next = current_res->next; 408 current_res->next = next_res; 409 } else 410 current_res = current_res->next; 411 } 412 } /* End of out_of_order loop */ 413 414 return 0; 415 } 416 417 418 /** 419 * do_pre_bridge_resource_split: find node of resources that are unused 420 * 421 */ 422 static struct pci_resource *do_pre_bridge_resource_split(struct pci_resource **head, 423 struct pci_resource **orig_head, u32 alignment) 424 { 425 struct pci_resource *prevnode = NULL; 426 struct pci_resource *node; 427 struct pci_resource *split_node; 428 u32 rc; 429 u32 temp_dword; 430 dbg("do_pre_bridge_resource_split\n"); 431 432 if (!(*head) || !(*orig_head)) 433 return NULL; 434 435 rc = cpqhp_resource_sort_and_combine(head); 436 437 if (rc) 438 return NULL; 439 440 if ((*head)->base != (*orig_head)->base) 441 return NULL; 442 443 if ((*head)->length == (*orig_head)->length) 444 return NULL; 445 446 447 /* If we got here, there the bridge requires some of the resource, but 448 * we may be able to split some off of the front */ 449 450 node = *head; 451 452 if (node->length & (alignment -1)) { 453 /* this one isn't an aligned length, so we'll make a new entry 454 * and split it up. */ 455 split_node = kmalloc(sizeof(*split_node), GFP_KERNEL); 456 457 if (!split_node) 458 return NULL; 459 460 temp_dword = (node->length | (alignment-1)) + 1 - alignment; 461 462 split_node->base = node->base; 463 split_node->length = temp_dword; 464 465 node->length -= temp_dword; 466 node->base += split_node->length; 467 468 /* Put it in the list */ 469 *head = split_node; 470 split_node->next = node; 471 } 472 473 if (node->length < alignment) 474 return NULL; 475 476 /* Now unlink it */ 477 if (*head == node) { 478 *head = node->next; 479 } else { 480 prevnode = *head; 481 while (prevnode->next != node) 482 prevnode = prevnode->next; 483 484 prevnode->next = node->next; 485 } 486 node->next = NULL; 487 488 return node; 489 } 490 491 492 /** 493 * do_bridge_resource_split: find one node of resources that aren't in use 494 * 495 */ 496 static struct pci_resource *do_bridge_resource_split(struct pci_resource **head, u32 alignment) 497 { 498 struct pci_resource *prevnode = NULL; 499 struct pci_resource *node; 500 u32 rc; 501 u32 temp_dword; 502 503 rc = cpqhp_resource_sort_and_combine(head); 504 505 if (rc) 506 return NULL; 507 508 node = *head; 509 510 while (node->next) { 511 prevnode = node; 512 node = node->next; 513 kfree(prevnode); 514 } 515 516 if (node->length < alignment) 517 goto error; 518 519 if (node->base & (alignment - 1)) { 520 /* Short circuit if adjusted size is too small */ 521 temp_dword = (node->base | (alignment-1)) + 1; 522 if ((node->length - (temp_dword - node->base)) < alignment) 523 goto error; 524 525 node->length -= (temp_dword - node->base); 526 node->base = temp_dword; 527 } 528 529 if (node->length & (alignment - 1)) 530 /* There's stuff in use after this node */ 531 goto error; 532 533 return node; 534 error: 535 kfree(node); 536 return NULL; 537 } 538 539 540 /** 541 * get_io_resource: find first node of given size not in ISA aliasing window. 542 * @head: list to search 543 * @size: size of node to find, must be a power of two. 544 * 545 * Description: this function sorts the resource list by size and then returns 546 * returns the first node of "size" length that is not in the ISA aliasing 547 * window. If it finds a node larger than "size" it will split it up. 548 * 549 */ 550 static struct pci_resource *get_io_resource(struct pci_resource **head, u32 size) 551 { 552 struct pci_resource *prevnode; 553 struct pci_resource *node; 554 struct pci_resource *split_node; 555 u32 temp_dword; 556 557 if (!(*head)) 558 return NULL; 559 560 if ( cpqhp_resource_sort_and_combine(head) ) 561 return NULL; 562 563 if ( sort_by_size(head) ) 564 return NULL; 565 566 for (node = *head; node; node = node->next) { 567 if (node->length < size) 568 continue; 569 570 if (node->base & (size - 1)) { 571 /* this one isn't base aligned properly 572 * so we'll make a new entry and split it up */ 573 temp_dword = (node->base | (size-1)) + 1; 574 575 /* Short circuit if adjusted size is too small */ 576 if ((node->length - (temp_dword - node->base)) < size) 577 continue; 578 579 split_node = kmalloc(sizeof(*split_node), GFP_KERNEL); 580 581 if (!split_node) 582 return NULL; 583 584 split_node->base = node->base; 585 split_node->length = temp_dword - node->base; 586 node->base = temp_dword; 587 node->length -= split_node->length; 588 589 /* Put it in the list */ 590 split_node->next = node->next; 591 node->next = split_node; 592 } /* End of non-aligned base */ 593 594 /* Don't need to check if too small since we already did */ 595 if (node->length > size) { 596 /* this one is longer than we need 597 * so we'll make a new entry and split it up */ 598 split_node = kmalloc(sizeof(*split_node), GFP_KERNEL); 599 600 if (!split_node) 601 return NULL; 602 603 split_node->base = node->base + size; 604 split_node->length = node->length - size; 605 node->length = size; 606 607 /* Put it in the list */ 608 split_node->next = node->next; 609 node->next = split_node; 610 } /* End of too big on top end */ 611 612 /* For IO make sure it's not in the ISA aliasing space */ 613 if (node->base & 0x300L) 614 continue; 615 616 /* If we got here, then it is the right size 617 * Now take it out of the list and break */ 618 if (*head == node) { 619 *head = node->next; 620 } else { 621 prevnode = *head; 622 while (prevnode->next != node) 623 prevnode = prevnode->next; 624 625 prevnode->next = node->next; 626 } 627 node->next = NULL; 628 break; 629 } 630 631 return node; 632 } 633 634 635 /** 636 * get_max_resource: get largest node which has at least the given size. 637 * @head: the list to search the node in 638 * @size: the minimum size of the node to find 639 * 640 * Description: Gets the largest node that is at least "size" big from the 641 * list pointed to by head. It aligns the node on top and bottom 642 * to "size" alignment before returning it. 643 */ 644 static struct pci_resource *get_max_resource(struct pci_resource **head, u32 size) 645 { 646 struct pci_resource *max; 647 struct pci_resource *temp; 648 struct pci_resource *split_node; 649 u32 temp_dword; 650 651 if (cpqhp_resource_sort_and_combine(head)) 652 return NULL; 653 654 if (sort_by_max_size(head)) 655 return NULL; 656 657 for (max = *head; max; max = max->next) { 658 /* If not big enough we could probably just bail, 659 * instead we'll continue to the next. */ 660 if (max->length < size) 661 continue; 662 663 if (max->base & (size - 1)) { 664 /* this one isn't base aligned properly 665 * so we'll make a new entry and split it up */ 666 temp_dword = (max->base | (size-1)) + 1; 667 668 /* Short circuit if adjusted size is too small */ 669 if ((max->length - (temp_dword - max->base)) < size) 670 continue; 671 672 split_node = kmalloc(sizeof(*split_node), GFP_KERNEL); 673 674 if (!split_node) 675 return NULL; 676 677 split_node->base = max->base; 678 split_node->length = temp_dword - max->base; 679 max->base = temp_dword; 680 max->length -= split_node->length; 681 682 split_node->next = max->next; 683 max->next = split_node; 684 } 685 686 if ((max->base + max->length) & (size - 1)) { 687 /* this one isn't end aligned properly at the top 688 * so we'll make a new entry and split it up */ 689 split_node = kmalloc(sizeof(*split_node), GFP_KERNEL); 690 691 if (!split_node) 692 return NULL; 693 temp_dword = ((max->base + max->length) & ~(size - 1)); 694 split_node->base = temp_dword; 695 split_node->length = max->length + max->base 696 - split_node->base; 697 max->length -= split_node->length; 698 699 split_node->next = max->next; 700 max->next = split_node; 701 } 702 703 /* Make sure it didn't shrink too much when we aligned it */ 704 if (max->length < size) 705 continue; 706 707 /* Now take it out of the list */ 708 temp = *head; 709 if (temp == max) { 710 *head = max->next; 711 } else { 712 while (temp && temp->next != max) { 713 temp = temp->next; 714 } 715 716 temp->next = max->next; 717 } 718 719 max->next = NULL; 720 break; 721 } 722 723 return max; 724 } 725 726 727 /** 728 * get_resource: find resource of given size and split up larger ones. 729 * @head: the list to search for resources 730 * @size: the size limit to use 731 * 732 * Description: This function sorts the resource list by size and then 733 * returns the first node of "size" length. If it finds a node 734 * larger than "size" it will split it up. 735 * 736 * size must be a power of two. 737 */ 738 static struct pci_resource *get_resource(struct pci_resource **head, u32 size) 739 { 740 struct pci_resource *prevnode; 741 struct pci_resource *node; 742 struct pci_resource *split_node; 743 u32 temp_dword; 744 745 if (cpqhp_resource_sort_and_combine(head)) 746 return NULL; 747 748 if (sort_by_size(head)) 749 return NULL; 750 751 for (node = *head; node; node = node->next) { 752 dbg("%s: req_size =%x node=%p, base=%x, length=%x\n", 753 __FUNCTION__, size, node, node->base, node->length); 754 if (node->length < size) 755 continue; 756 757 if (node->base & (size - 1)) { 758 dbg("%s: not aligned\n", __FUNCTION__); 759 /* this one isn't base aligned properly 760 * so we'll make a new entry and split it up */ 761 temp_dword = (node->base | (size-1)) + 1; 762 763 /* Short circuit if adjusted size is too small */ 764 if ((node->length - (temp_dword - node->base)) < size) 765 continue; 766 767 split_node = kmalloc(sizeof(*split_node), GFP_KERNEL); 768 769 if (!split_node) 770 return NULL; 771 772 split_node->base = node->base; 773 split_node->length = temp_dword - node->base; 774 node->base = temp_dword; 775 node->length -= split_node->length; 776 777 split_node->next = node->next; 778 node->next = split_node; 779 } /* End of non-aligned base */ 780 781 /* Don't need to check if too small since we already did */ 782 if (node->length > size) { 783 dbg("%s: too big\n", __FUNCTION__); 784 /* this one is longer than we need 785 * so we'll make a new entry and split it up */ 786 split_node = kmalloc(sizeof(*split_node), GFP_KERNEL); 787 788 if (!split_node) 789 return NULL; 790 791 split_node->base = node->base + size; 792 split_node->length = node->length - size; 793 node->length = size; 794 795 /* Put it in the list */ 796 split_node->next = node->next; 797 node->next = split_node; 798 } /* End of too big on top end */ 799 800 dbg("%s: got one!!!\n", __FUNCTION__); 801 /* If we got here, then it is the right size 802 * Now take it out of the list */ 803 if (*head == node) { 804 *head = node->next; 805 } else { 806 prevnode = *head; 807 while (prevnode->next != node) 808 prevnode = prevnode->next; 809 810 prevnode->next = node->next; 811 } 812 node->next = NULL; 813 break; 814 } 815 return node; 816 } 817 818 819 /** 820 * cpqhp_resource_sort_and_combine: sort nodes by base addresses and clean up. 821 * @head: the list to sort and clean up 822 * 823 * Description: Sorts all of the nodes in the list in ascending order by 824 * their base addresses. Also does garbage collection by 825 * combining adjacent nodes. 826 * 827 * returns 0 if success 828 */ 829 int cpqhp_resource_sort_and_combine(struct pci_resource **head) 830 { 831 struct pci_resource *node1; 832 struct pci_resource *node2; 833 int out_of_order = 1; 834 835 dbg("%s: head = %p, *head = %p\n", __FUNCTION__, head, *head); 836 837 if (!(*head)) 838 return 1; 839 840 dbg("*head->next = %p\n",(*head)->next); 841 842 if (!(*head)->next) 843 return 0; /* only one item on the list, already sorted! */ 844 845 dbg("*head->base = 0x%x\n",(*head)->base); 846 dbg("*head->next->base = 0x%x\n",(*head)->next->base); 847 while (out_of_order) { 848 out_of_order = 0; 849 850 /* Special case for swapping list head */ 851 if (((*head)->next) && 852 ((*head)->base > (*head)->next->base)) { 853 node1 = *head; 854 (*head) = (*head)->next; 855 node1->next = (*head)->next; 856 (*head)->next = node1; 857 out_of_order++; 858 } 859 860 node1 = (*head); 861 862 while (node1->next && node1->next->next) { 863 if (node1->next->base > node1->next->next->base) { 864 out_of_order++; 865 node2 = node1->next; 866 node1->next = node1->next->next; 867 node1 = node1->next; 868 node2->next = node1->next; 869 node1->next = node2; 870 } else 871 node1 = node1->next; 872 } 873 } /* End of out_of_order loop */ 874 875 node1 = *head; 876 877 while (node1 && node1->next) { 878 if ((node1->base + node1->length) == node1->next->base) { 879 /* Combine */ 880 dbg("8..\n"); 881 node1->length += node1->next->length; 882 node2 = node1->next; 883 node1->next = node1->next->next; 884 kfree(node2); 885 } else 886 node1 = node1->next; 887 } 888 889 return 0; 890 } 891 892 893 irqreturn_t cpqhp_ctrl_intr(int IRQ, void *data, struct pt_regs *regs) 894 { 895 struct controller *ctrl = data; 896 u8 schedule_flag = 0; 897 u8 reset; 898 u16 misc; 899 u32 Diff; 900 u32 temp_dword; 901 902 903 misc = readw(ctrl->hpc_reg + MISC); 904 /*************************************** 905 * Check to see if it was our interrupt 906 ***************************************/ 907 if (!(misc & 0x000C)) { 908 return IRQ_NONE; 909 } 910 911 if (misc & 0x0004) { 912 /********************************** 913 * Serial Output interrupt Pending 914 **********************************/ 915 916 /* Clear the interrupt */ 917 misc |= 0x0004; 918 writew(misc, ctrl->hpc_reg + MISC); 919 920 /* Read to clear posted writes */ 921 misc = readw(ctrl->hpc_reg + MISC); 922 923 dbg ("%s - waking up\n", __FUNCTION__); 924 wake_up_interruptible(&ctrl->queue); 925 } 926 927 if (misc & 0x0008) { 928 /* General-interrupt-input interrupt Pending */ 929 Diff = readl(ctrl->hpc_reg + INT_INPUT_CLEAR) ^ ctrl->ctrl_int_comp; 930 931 ctrl->ctrl_int_comp = readl(ctrl->hpc_reg + INT_INPUT_CLEAR); 932 933 /* Clear the interrupt */ 934 writel(Diff, ctrl->hpc_reg + INT_INPUT_CLEAR); 935 936 /* Read it back to clear any posted writes */ 937 temp_dword = readl(ctrl->hpc_reg + INT_INPUT_CLEAR); 938 939 if (!Diff) 940 /* Clear all interrupts */ 941 writel(0xFFFFFFFF, ctrl->hpc_reg + INT_INPUT_CLEAR); 942 943 schedule_flag += handle_switch_change((u8)(Diff & 0xFFL), ctrl); 944 schedule_flag += handle_presence_change((u16)((Diff & 0xFFFF0000L) >> 16), ctrl); 945 schedule_flag += handle_power_fault((u8)((Diff & 0xFF00L) >> 8), ctrl); 946 } 947 948 reset = readb(ctrl->hpc_reg + RESET_FREQ_MODE); 949 if (reset & 0x40) { 950 /* Bus reset has completed */ 951 reset &= 0xCF; 952 writeb(reset, ctrl->hpc_reg + RESET_FREQ_MODE); 953 reset = readb(ctrl->hpc_reg + RESET_FREQ_MODE); 954 wake_up_interruptible(&ctrl->queue); 955 } 956 957 if (schedule_flag) { 958 up(&event_semaphore); 959 dbg("Signal event_semaphore\n"); 960 } 961 return IRQ_HANDLED; 962 } 963 964 965 /** 966 * cpqhp_slot_create - Creates a node and adds it to the proper bus. 967 * @busnumber - bus where new node is to be located 968 * 969 * Returns pointer to the new node or NULL if unsuccessful 970 */ 971 struct pci_func *cpqhp_slot_create(u8 busnumber) 972 { 973 struct pci_func *new_slot; 974 struct pci_func *next; 975 976 new_slot = kmalloc(sizeof(*new_slot), GFP_KERNEL); 977 978 if (new_slot == NULL) { 979 /* I'm not dead yet! 980 * You will be. */ 981 return new_slot; 982 } 983 984 memset(new_slot, 0, sizeof(struct pci_func)); 985 986 new_slot->next = NULL; 987 new_slot->configured = 1; 988 989 if (cpqhp_slot_list[busnumber] == NULL) { 990 cpqhp_slot_list[busnumber] = new_slot; 991 } else { 992 next = cpqhp_slot_list[busnumber]; 993 while (next->next != NULL) 994 next = next->next; 995 next->next = new_slot; 996 } 997 return new_slot; 998 } 999 1000 1001 /** 1002 * slot_remove - Removes a node from the linked list of slots. 1003 * @old_slot: slot to remove 1004 * 1005 * Returns 0 if successful, !0 otherwise. 1006 */ 1007 static int slot_remove(struct pci_func * old_slot) 1008 { 1009 struct pci_func *next; 1010 1011 if (old_slot == NULL) 1012 return 1; 1013 1014 next = cpqhp_slot_list[old_slot->bus]; 1015 1016 if (next == NULL) { 1017 return 1; 1018 } 1019 1020 if (next == old_slot) { 1021 cpqhp_slot_list[old_slot->bus] = old_slot->next; 1022 cpqhp_destroy_board_resources(old_slot); 1023 kfree(old_slot); 1024 return 0; 1025 } 1026 1027 while ((next->next != old_slot) && (next->next != NULL)) { 1028 next = next->next; 1029 } 1030 1031 if (next->next == old_slot) { 1032 next->next = old_slot->next; 1033 cpqhp_destroy_board_resources(old_slot); 1034 kfree(old_slot); 1035 return 0; 1036 } else 1037 return 2; 1038 } 1039 1040 1041 /** 1042 * bridge_slot_remove - Removes a node from the linked list of slots. 1043 * @bridge: bridge to remove 1044 * 1045 * Returns 0 if successful, !0 otherwise. 1046 */ 1047 static int bridge_slot_remove(struct pci_func *bridge) 1048 { 1049 u8 subordinateBus, secondaryBus; 1050 u8 tempBus; 1051 struct pci_func *next; 1052 1053 secondaryBus = (bridge->config_space[0x06] >> 8) & 0xFF; 1054 subordinateBus = (bridge->config_space[0x06] >> 16) & 0xFF; 1055 1056 for (tempBus = secondaryBus; tempBus <= subordinateBus; tempBus++) { 1057 next = cpqhp_slot_list[tempBus]; 1058 1059 while (!slot_remove(next)) { 1060 next = cpqhp_slot_list[tempBus]; 1061 } 1062 } 1063 1064 next = cpqhp_slot_list[bridge->bus]; 1065 1066 if (next == NULL) 1067 return 1; 1068 1069 if (next == bridge) { 1070 cpqhp_slot_list[bridge->bus] = bridge->next; 1071 goto out; 1072 } 1073 1074 while ((next->next != bridge) && (next->next != NULL)) 1075 next = next->next; 1076 1077 if (next->next != bridge) 1078 return 2; 1079 next->next = bridge->next; 1080 out: 1081 kfree(bridge); 1082 return 0; 1083 } 1084 1085 1086 /** 1087 * cpqhp_slot_find - Looks for a node by bus, and device, multiple functions accessed 1088 * @bus: bus to find 1089 * @device: device to find 1090 * @index: is 0 for first function found, 1 for the second... 1091 * 1092 * Returns pointer to the node if successful, %NULL otherwise. 1093 */ 1094 struct pci_func *cpqhp_slot_find(u8 bus, u8 device, u8 index) 1095 { 1096 int found = -1; 1097 struct pci_func *func; 1098 1099 func = cpqhp_slot_list[bus]; 1100 1101 if ((func == NULL) || ((func->device == device) && (index == 0))) 1102 return func; 1103 1104 if (func->device == device) 1105 found++; 1106 1107 while (func->next != NULL) { 1108 func = func->next; 1109 1110 if (func->device == device) 1111 found++; 1112 1113 if (found == index) 1114 return func; 1115 } 1116 1117 return NULL; 1118 } 1119 1120 1121 /* DJZ: I don't think is_bridge will work as is. 1122 * FIXME */ 1123 static int is_bridge(struct pci_func * func) 1124 { 1125 /* Check the header type */ 1126 if (((func->config_space[0x03] >> 16) & 0xFF) == 0x01) 1127 return 1; 1128 else 1129 return 0; 1130 } 1131 1132 1133 /** 1134 * set_controller_speed - set the frequency and/or mode of a specific 1135 * controller segment. 1136 * 1137 * @ctrl: controller to change frequency/mode for. 1138 * @adapter_speed: the speed of the adapter we want to match. 1139 * @hp_slot: the slot number where the adapter is installed. 1140 * 1141 * Returns 0 if we successfully change frequency and/or mode to match the 1142 * adapter speed. 1143 * 1144 */ 1145 static u8 set_controller_speed(struct controller *ctrl, u8 adapter_speed, u8 hp_slot) 1146 { 1147 struct slot *slot; 1148 u8 reg; 1149 u8 slot_power = readb(ctrl->hpc_reg + SLOT_POWER); 1150 u16 reg16; 1151 u32 leds = readl(ctrl->hpc_reg + LED_CONTROL); 1152 1153 if (ctrl->speed == adapter_speed) 1154 return 0; 1155 1156 /* We don't allow freq/mode changes if we find another adapter running 1157 * in another slot on this controller */ 1158 for(slot = ctrl->slot; slot; slot = slot->next) { 1159 if (slot->device == (hp_slot + ctrl->slot_device_offset)) 1160 continue; 1161 if (!slot->hotplug_slot && !slot->hotplug_slot->info) 1162 continue; 1163 if (slot->hotplug_slot->info->adapter_status == 0) 1164 continue; 1165 /* If another adapter is running on the same segment but at a 1166 * lower speed/mode, we allow the new adapter to function at 1167 * this rate if supported */ 1168 if (ctrl->speed < adapter_speed) 1169 return 0; 1170 1171 return 1; 1172 } 1173 1174 /* If the controller doesn't support freq/mode changes and the 1175 * controller is running at a higher mode, we bail */ 1176 if ((ctrl->speed > adapter_speed) && (!ctrl->pcix_speed_capability)) 1177 return 1; 1178 1179 /* But we allow the adapter to run at a lower rate if possible */ 1180 if ((ctrl->speed < adapter_speed) && (!ctrl->pcix_speed_capability)) 1181 return 0; 1182 1183 /* We try to set the max speed supported by both the adapter and 1184 * controller */ 1185 if (ctrl->speed_capability < adapter_speed) { 1186 if (ctrl->speed == ctrl->speed_capability) 1187 return 0; 1188 adapter_speed = ctrl->speed_capability; 1189 } 1190 1191 writel(0x0L, ctrl->hpc_reg + LED_CONTROL); 1192 writeb(0x00, ctrl->hpc_reg + SLOT_ENABLE); 1193 1194 set_SOGO(ctrl); 1195 wait_for_ctrl_irq(ctrl); 1196 1197 if (adapter_speed != PCI_SPEED_133MHz_PCIX) 1198 reg = 0xF5; 1199 else 1200 reg = 0xF4; 1201 pci_write_config_byte(ctrl->pci_dev, 0x41, reg); 1202 1203 reg16 = readw(ctrl->hpc_reg + NEXT_CURR_FREQ); 1204 reg16 &= ~0x000F; 1205 switch(adapter_speed) { 1206 case(PCI_SPEED_133MHz_PCIX): 1207 reg = 0x75; 1208 reg16 |= 0xB; 1209 break; 1210 case(PCI_SPEED_100MHz_PCIX): 1211 reg = 0x74; 1212 reg16 |= 0xA; 1213 break; 1214 case(PCI_SPEED_66MHz_PCIX): 1215 reg = 0x73; 1216 reg16 |= 0x9; 1217 break; 1218 case(PCI_SPEED_66MHz): 1219 reg = 0x73; 1220 reg16 |= 0x1; 1221 break; 1222 default: /* 33MHz PCI 2.2 */ 1223 reg = 0x71; 1224 break; 1225 1226 } 1227 reg16 |= 0xB << 12; 1228 writew(reg16, ctrl->hpc_reg + NEXT_CURR_FREQ); 1229 1230 mdelay(5); 1231 1232 /* Reenable interrupts */ 1233 writel(0, ctrl->hpc_reg + INT_MASK); 1234 1235 pci_write_config_byte(ctrl->pci_dev, 0x41, reg); 1236 1237 /* Restart state machine */ 1238 reg = ~0xF; 1239 pci_read_config_byte(ctrl->pci_dev, 0x43, ®); 1240 pci_write_config_byte(ctrl->pci_dev, 0x43, reg); 1241 1242 /* Only if mode change...*/ 1243 if (((ctrl->speed == PCI_SPEED_66MHz) && (adapter_speed == PCI_SPEED_66MHz_PCIX)) || 1244 ((ctrl->speed == PCI_SPEED_66MHz_PCIX) && (adapter_speed == PCI_SPEED_66MHz))) 1245 set_SOGO(ctrl); 1246 1247 wait_for_ctrl_irq(ctrl); 1248 mdelay(1100); 1249 1250 /* Restore LED/Slot state */ 1251 writel(leds, ctrl->hpc_reg + LED_CONTROL); 1252 writeb(slot_power, ctrl->hpc_reg + SLOT_ENABLE); 1253 1254 set_SOGO(ctrl); 1255 wait_for_ctrl_irq(ctrl); 1256 1257 ctrl->speed = adapter_speed; 1258 slot = cpqhp_find_slot(ctrl, hp_slot + ctrl->slot_device_offset); 1259 1260 info("Successfully changed frequency/mode for adapter in slot %d\n", 1261 slot->number); 1262 return 0; 1263 } 1264 1265 /* the following routines constitute the bulk of the 1266 hotplug controller logic 1267 */ 1268 1269 1270 /** 1271 * board_replaced - Called after a board has been replaced in the system. 1272 * 1273 * This is only used if we don't have resources for hot add 1274 * Turns power on for the board 1275 * Checks to see if board is the same 1276 * If board is same, reconfigures it 1277 * If board isn't same, turns it back off. 1278 * 1279 */ 1280 static u32 board_replaced(struct pci_func *func, struct controller *ctrl) 1281 { 1282 u8 hp_slot; 1283 u8 temp_byte; 1284 u8 adapter_speed; 1285 u32 rc = 0; 1286 1287 hp_slot = func->device - ctrl->slot_device_offset; 1288 1289 if (readl(ctrl->hpc_reg + INT_INPUT_CLEAR) & (0x01L << hp_slot)) { 1290 /********************************** 1291 * The switch is open. 1292 **********************************/ 1293 rc = INTERLOCK_OPEN; 1294 } else if (is_slot_enabled (ctrl, hp_slot)) { 1295 /********************************** 1296 * The board is already on 1297 **********************************/ 1298 rc = CARD_FUNCTIONING; 1299 } else { 1300 mutex_lock(&ctrl->crit_sect); 1301 1302 /* turn on board without attaching to the bus */ 1303 enable_slot_power (ctrl, hp_slot); 1304 1305 set_SOGO(ctrl); 1306 1307 /* Wait for SOBS to be unset */ 1308 wait_for_ctrl_irq (ctrl); 1309 1310 /* Change bits in slot power register to force another shift out 1311 * NOTE: this is to work around the timer bug */ 1312 temp_byte = readb(ctrl->hpc_reg + SLOT_POWER); 1313 writeb(0x00, ctrl->hpc_reg + SLOT_POWER); 1314 writeb(temp_byte, ctrl->hpc_reg + SLOT_POWER); 1315 1316 set_SOGO(ctrl); 1317 1318 /* Wait for SOBS to be unset */ 1319 wait_for_ctrl_irq (ctrl); 1320 1321 adapter_speed = get_adapter_speed(ctrl, hp_slot); 1322 if (ctrl->speed != adapter_speed) 1323 if (set_controller_speed(ctrl, adapter_speed, hp_slot)) 1324 rc = WRONG_BUS_FREQUENCY; 1325 1326 /* turn off board without attaching to the bus */ 1327 disable_slot_power (ctrl, hp_slot); 1328 1329 set_SOGO(ctrl); 1330 1331 /* Wait for SOBS to be unset */ 1332 wait_for_ctrl_irq (ctrl); 1333 1334 mutex_unlock(&ctrl->crit_sect); 1335 1336 if (rc) 1337 return rc; 1338 1339 mutex_lock(&ctrl->crit_sect); 1340 1341 slot_enable (ctrl, hp_slot); 1342 green_LED_blink (ctrl, hp_slot); 1343 1344 amber_LED_off (ctrl, hp_slot); 1345 1346 set_SOGO(ctrl); 1347 1348 /* Wait for SOBS to be unset */ 1349 wait_for_ctrl_irq (ctrl); 1350 1351 mutex_unlock(&ctrl->crit_sect); 1352 1353 /* Wait for ~1 second because of hot plug spec */ 1354 long_delay(1*HZ); 1355 1356 /* Check for a power fault */ 1357 if (func->status == 0xFF) { 1358 /* power fault occurred, but it was benign */ 1359 rc = POWER_FAILURE; 1360 func->status = 0; 1361 } else 1362 rc = cpqhp_valid_replace(ctrl, func); 1363 1364 if (!rc) { 1365 /* It must be the same board */ 1366 1367 rc = cpqhp_configure_board(ctrl, func); 1368 1369 /* If configuration fails, turn it off 1370 * Get slot won't work for devices behind 1371 * bridges, but in this case it will always be 1372 * called for the "base" bus/dev/func of an 1373 * adapter. */ 1374 1375 mutex_lock(&ctrl->crit_sect); 1376 1377 amber_LED_on (ctrl, hp_slot); 1378 green_LED_off (ctrl, hp_slot); 1379 slot_disable (ctrl, hp_slot); 1380 1381 set_SOGO(ctrl); 1382 1383 /* Wait for SOBS to be unset */ 1384 wait_for_ctrl_irq (ctrl); 1385 1386 mutex_unlock(&ctrl->crit_sect); 1387 1388 if (rc) 1389 return rc; 1390 else 1391 return 1; 1392 1393 } else { 1394 /* Something is wrong 1395 1396 * Get slot won't work for devices behind bridges, but 1397 * in this case it will always be called for the "base" 1398 * bus/dev/func of an adapter. */ 1399 1400 mutex_lock(&ctrl->crit_sect); 1401 1402 amber_LED_on (ctrl, hp_slot); 1403 green_LED_off (ctrl, hp_slot); 1404 slot_disable (ctrl, hp_slot); 1405 1406 set_SOGO(ctrl); 1407 1408 /* Wait for SOBS to be unset */ 1409 wait_for_ctrl_irq (ctrl); 1410 1411 mutex_unlock(&ctrl->crit_sect); 1412 } 1413 1414 } 1415 return rc; 1416 1417 } 1418 1419 1420 /** 1421 * board_added - Called after a board has been added to the system. 1422 * 1423 * Turns power on for the board 1424 * Configures board 1425 * 1426 */ 1427 static u32 board_added(struct pci_func *func, struct controller *ctrl) 1428 { 1429 u8 hp_slot; 1430 u8 temp_byte; 1431 u8 adapter_speed; 1432 int index; 1433 u32 temp_register = 0xFFFFFFFF; 1434 u32 rc = 0; 1435 struct pci_func *new_slot = NULL; 1436 struct slot *p_slot; 1437 struct resource_lists res_lists; 1438 1439 hp_slot = func->device - ctrl->slot_device_offset; 1440 dbg("%s: func->device, slot_offset, hp_slot = %d, %d ,%d\n", 1441 __FUNCTION__, func->device, ctrl->slot_device_offset, hp_slot); 1442 1443 mutex_lock(&ctrl->crit_sect); 1444 1445 /* turn on board without attaching to the bus */ 1446 enable_slot_power(ctrl, hp_slot); 1447 1448 set_SOGO(ctrl); 1449 1450 /* Wait for SOBS to be unset */ 1451 wait_for_ctrl_irq (ctrl); 1452 1453 /* Change bits in slot power register to force another shift out 1454 * NOTE: this is to work around the timer bug */ 1455 temp_byte = readb(ctrl->hpc_reg + SLOT_POWER); 1456 writeb(0x00, ctrl->hpc_reg + SLOT_POWER); 1457 writeb(temp_byte, ctrl->hpc_reg + SLOT_POWER); 1458 1459 set_SOGO(ctrl); 1460 1461 /* Wait for SOBS to be unset */ 1462 wait_for_ctrl_irq (ctrl); 1463 1464 adapter_speed = get_adapter_speed(ctrl, hp_slot); 1465 if (ctrl->speed != adapter_speed) 1466 if (set_controller_speed(ctrl, adapter_speed, hp_slot)) 1467 rc = WRONG_BUS_FREQUENCY; 1468 1469 /* turn off board without attaching to the bus */ 1470 disable_slot_power (ctrl, hp_slot); 1471 1472 set_SOGO(ctrl); 1473 1474 /* Wait for SOBS to be unset */ 1475 wait_for_ctrl_irq(ctrl); 1476 1477 mutex_unlock(&ctrl->crit_sect); 1478 1479 if (rc) 1480 return rc; 1481 1482 p_slot = cpqhp_find_slot(ctrl, hp_slot + ctrl->slot_device_offset); 1483 1484 /* turn on board and blink green LED */ 1485 1486 dbg("%s: before down\n", __FUNCTION__); 1487 mutex_lock(&ctrl->crit_sect); 1488 dbg("%s: after down\n", __FUNCTION__); 1489 1490 dbg("%s: before slot_enable\n", __FUNCTION__); 1491 slot_enable (ctrl, hp_slot); 1492 1493 dbg("%s: before green_LED_blink\n", __FUNCTION__); 1494 green_LED_blink (ctrl, hp_slot); 1495 1496 dbg("%s: before amber_LED_blink\n", __FUNCTION__); 1497 amber_LED_off (ctrl, hp_slot); 1498 1499 dbg("%s: before set_SOGO\n", __FUNCTION__); 1500 set_SOGO(ctrl); 1501 1502 /* Wait for SOBS to be unset */ 1503 dbg("%s: before wait_for_ctrl_irq\n", __FUNCTION__); 1504 wait_for_ctrl_irq (ctrl); 1505 dbg("%s: after wait_for_ctrl_irq\n", __FUNCTION__); 1506 1507 dbg("%s: before up\n", __FUNCTION__); 1508 mutex_unlock(&ctrl->crit_sect); 1509 dbg("%s: after up\n", __FUNCTION__); 1510 1511 /* Wait for ~1 second because of hot plug spec */ 1512 dbg("%s: before long_delay\n", __FUNCTION__); 1513 long_delay(1*HZ); 1514 dbg("%s: after long_delay\n", __FUNCTION__); 1515 1516 dbg("%s: func status = %x\n", __FUNCTION__, func->status); 1517 /* Check for a power fault */ 1518 if (func->status == 0xFF) { 1519 /* power fault occurred, but it was benign */ 1520 temp_register = 0xFFFFFFFF; 1521 dbg("%s: temp register set to %x by power fault\n", __FUNCTION__, temp_register); 1522 rc = POWER_FAILURE; 1523 func->status = 0; 1524 } else { 1525 /* Get vendor/device ID u32 */ 1526 ctrl->pci_bus->number = func->bus; 1527 rc = pci_bus_read_config_dword (ctrl->pci_bus, PCI_DEVFN(func->device, func->function), PCI_VENDOR_ID, &temp_register); 1528 dbg("%s: pci_read_config_dword returns %d\n", __FUNCTION__, rc); 1529 dbg("%s: temp_register is %x\n", __FUNCTION__, temp_register); 1530 1531 if (rc != 0) { 1532 /* Something's wrong here */ 1533 temp_register = 0xFFFFFFFF; 1534 dbg("%s: temp register set to %x by error\n", __FUNCTION__, temp_register); 1535 } 1536 /* Preset return code. It will be changed later if things go okay. */ 1537 rc = NO_ADAPTER_PRESENT; 1538 } 1539 1540 /* All F's is an empty slot or an invalid board */ 1541 if (temp_register != 0xFFFFFFFF) { /* Check for a board in the slot */ 1542 res_lists.io_head = ctrl->io_head; 1543 res_lists.mem_head = ctrl->mem_head; 1544 res_lists.p_mem_head = ctrl->p_mem_head; 1545 res_lists.bus_head = ctrl->bus_head; 1546 res_lists.irqs = NULL; 1547 1548 rc = configure_new_device(ctrl, func, 0, &res_lists); 1549 1550 dbg("%s: back from configure_new_device\n", __FUNCTION__); 1551 ctrl->io_head = res_lists.io_head; 1552 ctrl->mem_head = res_lists.mem_head; 1553 ctrl->p_mem_head = res_lists.p_mem_head; 1554 ctrl->bus_head = res_lists.bus_head; 1555 1556 cpqhp_resource_sort_and_combine(&(ctrl->mem_head)); 1557 cpqhp_resource_sort_and_combine(&(ctrl->p_mem_head)); 1558 cpqhp_resource_sort_and_combine(&(ctrl->io_head)); 1559 cpqhp_resource_sort_and_combine(&(ctrl->bus_head)); 1560 1561 if (rc) { 1562 mutex_lock(&ctrl->crit_sect); 1563 1564 amber_LED_on (ctrl, hp_slot); 1565 green_LED_off (ctrl, hp_slot); 1566 slot_disable (ctrl, hp_slot); 1567 1568 set_SOGO(ctrl); 1569 1570 /* Wait for SOBS to be unset */ 1571 wait_for_ctrl_irq (ctrl); 1572 1573 mutex_unlock(&ctrl->crit_sect); 1574 return rc; 1575 } else { 1576 cpqhp_save_slot_config(ctrl, func); 1577 } 1578 1579 1580 func->status = 0; 1581 func->switch_save = 0x10; 1582 func->is_a_board = 0x01; 1583 1584 /* next, we will instantiate the linux pci_dev structures (with 1585 * appropriate driver notification, if already present) */ 1586 dbg("%s: configure linux pci_dev structure\n", __FUNCTION__); 1587 index = 0; 1588 do { 1589 new_slot = cpqhp_slot_find(ctrl->bus, func->device, index++); 1590 if (new_slot && !new_slot->pci_dev) { 1591 cpqhp_configure_device(ctrl, new_slot); 1592 } 1593 } while (new_slot); 1594 1595 mutex_lock(&ctrl->crit_sect); 1596 1597 green_LED_on (ctrl, hp_slot); 1598 1599 set_SOGO(ctrl); 1600 1601 /* Wait for SOBS to be unset */ 1602 wait_for_ctrl_irq (ctrl); 1603 1604 mutex_unlock(&ctrl->crit_sect); 1605 } else { 1606 mutex_lock(&ctrl->crit_sect); 1607 1608 amber_LED_on (ctrl, hp_slot); 1609 green_LED_off (ctrl, hp_slot); 1610 slot_disable (ctrl, hp_slot); 1611 1612 set_SOGO(ctrl); 1613 1614 /* Wait for SOBS to be unset */ 1615 wait_for_ctrl_irq (ctrl); 1616 1617 mutex_unlock(&ctrl->crit_sect); 1618 1619 return rc; 1620 } 1621 return 0; 1622 } 1623 1624 1625 /** 1626 * remove_board - Turns off slot and LED's 1627 * 1628 */ 1629 static u32 remove_board(struct pci_func * func, u32 replace_flag, struct controller * ctrl) 1630 { 1631 int index; 1632 u8 skip = 0; 1633 u8 device; 1634 u8 hp_slot; 1635 u8 temp_byte; 1636 u32 rc; 1637 struct resource_lists res_lists; 1638 struct pci_func *temp_func; 1639 1640 if (cpqhp_unconfigure_device(func)) 1641 return 1; 1642 1643 device = func->device; 1644 1645 hp_slot = func->device - ctrl->slot_device_offset; 1646 dbg("In %s, hp_slot = %d\n", __FUNCTION__, hp_slot); 1647 1648 /* When we get here, it is safe to change base address registers. 1649 * We will attempt to save the base address register lengths */ 1650 if (replace_flag || !ctrl->add_support) 1651 rc = cpqhp_save_base_addr_length(ctrl, func); 1652 else if (!func->bus_head && !func->mem_head && 1653 !func->p_mem_head && !func->io_head) { 1654 /* Here we check to see if we've saved any of the board's 1655 * resources already. If so, we'll skip the attempt to 1656 * determine what's being used. */ 1657 index = 0; 1658 temp_func = cpqhp_slot_find(func->bus, func->device, index++); 1659 while (temp_func) { 1660 if (temp_func->bus_head || temp_func->mem_head 1661 || temp_func->p_mem_head || temp_func->io_head) { 1662 skip = 1; 1663 break; 1664 } 1665 temp_func = cpqhp_slot_find(temp_func->bus, temp_func->device, index++); 1666 } 1667 1668 if (!skip) 1669 rc = cpqhp_save_used_resources(ctrl, func); 1670 } 1671 /* Change status to shutdown */ 1672 if (func->is_a_board) 1673 func->status = 0x01; 1674 func->configured = 0; 1675 1676 mutex_lock(&ctrl->crit_sect); 1677 1678 green_LED_off (ctrl, hp_slot); 1679 slot_disable (ctrl, hp_slot); 1680 1681 set_SOGO(ctrl); 1682 1683 /* turn off SERR for slot */ 1684 temp_byte = readb(ctrl->hpc_reg + SLOT_SERR); 1685 temp_byte &= ~(0x01 << hp_slot); 1686 writeb(temp_byte, ctrl->hpc_reg + SLOT_SERR); 1687 1688 /* Wait for SOBS to be unset */ 1689 wait_for_ctrl_irq (ctrl); 1690 1691 mutex_unlock(&ctrl->crit_sect); 1692 1693 if (!replace_flag && ctrl->add_support) { 1694 while (func) { 1695 res_lists.io_head = ctrl->io_head; 1696 res_lists.mem_head = ctrl->mem_head; 1697 res_lists.p_mem_head = ctrl->p_mem_head; 1698 res_lists.bus_head = ctrl->bus_head; 1699 1700 cpqhp_return_board_resources(func, &res_lists); 1701 1702 ctrl->io_head = res_lists.io_head; 1703 ctrl->mem_head = res_lists.mem_head; 1704 ctrl->p_mem_head = res_lists.p_mem_head; 1705 ctrl->bus_head = res_lists.bus_head; 1706 1707 cpqhp_resource_sort_and_combine(&(ctrl->mem_head)); 1708 cpqhp_resource_sort_and_combine(&(ctrl->p_mem_head)); 1709 cpqhp_resource_sort_and_combine(&(ctrl->io_head)); 1710 cpqhp_resource_sort_and_combine(&(ctrl->bus_head)); 1711 1712 if (is_bridge(func)) { 1713 bridge_slot_remove(func); 1714 } else 1715 slot_remove(func); 1716 1717 func = cpqhp_slot_find(ctrl->bus, device, 0); 1718 } 1719 1720 /* Setup slot structure with entry for empty slot */ 1721 func = cpqhp_slot_create(ctrl->bus); 1722 1723 if (func == NULL) 1724 return 1; 1725 1726 func->bus = ctrl->bus; 1727 func->device = device; 1728 func->function = 0; 1729 func->configured = 0; 1730 func->switch_save = 0x10; 1731 func->is_a_board = 0; 1732 func->p_task_event = NULL; 1733 } 1734 1735 return 0; 1736 } 1737 1738 static void pushbutton_helper_thread(unsigned long data) 1739 { 1740 pushbutton_pending = data; 1741 up(&event_semaphore); 1742 } 1743 1744 1745 /* this is the main worker thread */ 1746 static int event_thread(void* data) 1747 { 1748 struct controller *ctrl; 1749 lock_kernel(); 1750 daemonize("phpd_event"); 1751 1752 unlock_kernel(); 1753 1754 while (1) { 1755 dbg("!!!!event_thread sleeping\n"); 1756 down_interruptible (&event_semaphore); 1757 dbg("event_thread woken finished = %d\n", event_finished); 1758 if (event_finished) break; 1759 /* Do stuff here */ 1760 if (pushbutton_pending) 1761 cpqhp_pushbutton_thread(pushbutton_pending); 1762 else 1763 for (ctrl = cpqhp_ctrl_list; ctrl; ctrl=ctrl->next) 1764 interrupt_event_handler(ctrl); 1765 } 1766 dbg("event_thread signals exit\n"); 1767 up(&event_exit); 1768 return 0; 1769 } 1770 1771 1772 int cpqhp_event_start_thread(void) 1773 { 1774 int pid; 1775 1776 /* initialize our semaphores */ 1777 init_MUTEX(&delay_sem); 1778 init_MUTEX_LOCKED(&event_semaphore); 1779 init_MUTEX_LOCKED(&event_exit); 1780 event_finished=0; 1781 1782 pid = kernel_thread(event_thread, NULL, 0); 1783 if (pid < 0) { 1784 err ("Can't start up our event thread\n"); 1785 return -1; 1786 } 1787 dbg("Our event thread pid = %d\n", pid); 1788 return 0; 1789 } 1790 1791 1792 void cpqhp_event_stop_thread(void) 1793 { 1794 event_finished = 1; 1795 dbg("event_thread finish command given\n"); 1796 up(&event_semaphore); 1797 dbg("wait for event_thread to exit\n"); 1798 down(&event_exit); 1799 } 1800 1801 1802 static int update_slot_info(struct controller *ctrl, struct slot *slot) 1803 { 1804 struct hotplug_slot_info *info; 1805 int result; 1806 1807 info = kmalloc(sizeof(*info), GFP_KERNEL); 1808 if (!info) 1809 return -ENOMEM; 1810 1811 info->power_status = get_slot_enabled(ctrl, slot); 1812 info->attention_status = cpq_get_attention_status(ctrl, slot); 1813 info->latch_status = cpq_get_latch_status(ctrl, slot); 1814 info->adapter_status = get_presence_status(ctrl, slot); 1815 result = pci_hp_change_slot_info(slot->hotplug_slot, info); 1816 kfree (info); 1817 return result; 1818 } 1819 1820 static void interrupt_event_handler(struct controller *ctrl) 1821 { 1822 int loop = 0; 1823 int change = 1; 1824 struct pci_func *func; 1825 u8 hp_slot; 1826 struct slot *p_slot; 1827 1828 while (change) { 1829 change = 0; 1830 1831 for (loop = 0; loop < 10; loop++) { 1832 /* dbg("loop %d\n", loop); */ 1833 if (ctrl->event_queue[loop].event_type != 0) { 1834 hp_slot = ctrl->event_queue[loop].hp_slot; 1835 1836 func = cpqhp_slot_find(ctrl->bus, (hp_slot + ctrl->slot_device_offset), 0); 1837 if (!func) 1838 return; 1839 1840 p_slot = cpqhp_find_slot(ctrl, hp_slot + ctrl->slot_device_offset); 1841 if (!p_slot) 1842 return; 1843 1844 dbg("hp_slot %d, func %p, p_slot %p\n", 1845 hp_slot, func, p_slot); 1846 1847 if (ctrl->event_queue[loop].event_type == INT_BUTTON_PRESS) { 1848 dbg("button pressed\n"); 1849 } else if (ctrl->event_queue[loop].event_type == 1850 INT_BUTTON_CANCEL) { 1851 dbg("button cancel\n"); 1852 del_timer(&p_slot->task_event); 1853 1854 mutex_lock(&ctrl->crit_sect); 1855 1856 if (p_slot->state == BLINKINGOFF_STATE) { 1857 /* slot is on */ 1858 dbg("turn on green LED\n"); 1859 green_LED_on (ctrl, hp_slot); 1860 } else if (p_slot->state == BLINKINGON_STATE) { 1861 /* slot is off */ 1862 dbg("turn off green LED\n"); 1863 green_LED_off (ctrl, hp_slot); 1864 } 1865 1866 info(msg_button_cancel, p_slot->number); 1867 1868 p_slot->state = STATIC_STATE; 1869 1870 amber_LED_off (ctrl, hp_slot); 1871 1872 set_SOGO(ctrl); 1873 1874 /* Wait for SOBS to be unset */ 1875 wait_for_ctrl_irq (ctrl); 1876 1877 mutex_unlock(&ctrl->crit_sect); 1878 } 1879 /*** button Released (No action on press...) */ 1880 else if (ctrl->event_queue[loop].event_type == INT_BUTTON_RELEASE) { 1881 dbg("button release\n"); 1882 1883 if (is_slot_enabled (ctrl, hp_slot)) { 1884 dbg("slot is on\n"); 1885 p_slot->state = BLINKINGOFF_STATE; 1886 info(msg_button_off, p_slot->number); 1887 } else { 1888 dbg("slot is off\n"); 1889 p_slot->state = BLINKINGON_STATE; 1890 info(msg_button_on, p_slot->number); 1891 } 1892 mutex_lock(&ctrl->crit_sect); 1893 1894 dbg("blink green LED and turn off amber\n"); 1895 1896 amber_LED_off (ctrl, hp_slot); 1897 green_LED_blink (ctrl, hp_slot); 1898 1899 set_SOGO(ctrl); 1900 1901 /* Wait for SOBS to be unset */ 1902 wait_for_ctrl_irq (ctrl); 1903 1904 mutex_unlock(&ctrl->crit_sect); 1905 init_timer(&p_slot->task_event); 1906 p_slot->hp_slot = hp_slot; 1907 p_slot->ctrl = ctrl; 1908 /* p_slot->physical_slot = physical_slot; */ 1909 p_slot->task_event.expires = jiffies + 5 * HZ; /* 5 second delay */ 1910 p_slot->task_event.function = pushbutton_helper_thread; 1911 p_slot->task_event.data = (u32) p_slot; 1912 1913 dbg("add_timer p_slot = %p\n", p_slot); 1914 add_timer(&p_slot->task_event); 1915 } 1916 /***********POWER FAULT */ 1917 else if (ctrl->event_queue[loop].event_type == INT_POWER_FAULT) { 1918 dbg("power fault\n"); 1919 } else { 1920 /* refresh notification */ 1921 if (p_slot) 1922 update_slot_info(ctrl, p_slot); 1923 } 1924 1925 ctrl->event_queue[loop].event_type = 0; 1926 1927 change = 1; 1928 } 1929 } /* End of FOR loop */ 1930 } 1931 1932 return; 1933 } 1934 1935 1936 /** 1937 * cpqhp_pushbutton_thread 1938 * 1939 * Scheduled procedure to handle blocking stuff for the pushbuttons 1940 * Handles all pending events and exits. 1941 * 1942 */ 1943 void cpqhp_pushbutton_thread(unsigned long slot) 1944 { 1945 u8 hp_slot; 1946 u8 device; 1947 struct pci_func *func; 1948 struct slot *p_slot = (struct slot *) slot; 1949 struct controller *ctrl = (struct controller *) p_slot->ctrl; 1950 1951 pushbutton_pending = 0; 1952 hp_slot = p_slot->hp_slot; 1953 1954 device = p_slot->device; 1955 1956 if (is_slot_enabled(ctrl, hp_slot)) { 1957 p_slot->state = POWEROFF_STATE; 1958 /* power Down board */ 1959 func = cpqhp_slot_find(p_slot->bus, p_slot->device, 0); 1960 dbg("In power_down_board, func = %p, ctrl = %p\n", func, ctrl); 1961 if (!func) { 1962 dbg("Error! func NULL in %s\n", __FUNCTION__); 1963 return ; 1964 } 1965 1966 if (func != NULL && ctrl != NULL) { 1967 if (cpqhp_process_SS(ctrl, func) != 0) { 1968 amber_LED_on (ctrl, hp_slot); 1969 green_LED_on (ctrl, hp_slot); 1970 1971 set_SOGO(ctrl); 1972 1973 /* Wait for SOBS to be unset */ 1974 wait_for_ctrl_irq (ctrl); 1975 } 1976 } 1977 1978 p_slot->state = STATIC_STATE; 1979 } else { 1980 p_slot->state = POWERON_STATE; 1981 /* slot is off */ 1982 1983 func = cpqhp_slot_find(p_slot->bus, p_slot->device, 0); 1984 dbg("In add_board, func = %p, ctrl = %p\n", func, ctrl); 1985 if (!func) { 1986 dbg("Error! func NULL in %s\n", __FUNCTION__); 1987 return ; 1988 } 1989 1990 if (func != NULL && ctrl != NULL) { 1991 if (cpqhp_process_SI(ctrl, func) != 0) { 1992 amber_LED_on(ctrl, hp_slot); 1993 green_LED_off(ctrl, hp_slot); 1994 1995 set_SOGO(ctrl); 1996 1997 /* Wait for SOBS to be unset */ 1998 wait_for_ctrl_irq (ctrl); 1999 } 2000 } 2001 2002 p_slot->state = STATIC_STATE; 2003 } 2004 2005 return; 2006 } 2007 2008 2009 int cpqhp_process_SI(struct controller *ctrl, struct pci_func *func) 2010 { 2011 u8 device, hp_slot; 2012 u16 temp_word; 2013 u32 tempdword; 2014 int rc; 2015 struct slot* p_slot; 2016 int physical_slot = 0; 2017 2018 tempdword = 0; 2019 2020 device = func->device; 2021 hp_slot = device - ctrl->slot_device_offset; 2022 p_slot = cpqhp_find_slot(ctrl, device); 2023 if (p_slot) 2024 physical_slot = p_slot->number; 2025 2026 /* Check to see if the interlock is closed */ 2027 tempdword = readl(ctrl->hpc_reg + INT_INPUT_CLEAR); 2028 2029 if (tempdword & (0x01 << hp_slot)) { 2030 return 1; 2031 } 2032 2033 if (func->is_a_board) { 2034 rc = board_replaced(func, ctrl); 2035 } else { 2036 /* add board */ 2037 slot_remove(func); 2038 2039 func = cpqhp_slot_create(ctrl->bus); 2040 if (func == NULL) 2041 return 1; 2042 2043 func->bus = ctrl->bus; 2044 func->device = device; 2045 func->function = 0; 2046 func->configured = 0; 2047 func->is_a_board = 1; 2048 2049 /* We have to save the presence info for these slots */ 2050 temp_word = ctrl->ctrl_int_comp >> 16; 2051 func->presence_save = (temp_word >> hp_slot) & 0x01; 2052 func->presence_save |= (temp_word >> (hp_slot + 7)) & 0x02; 2053 2054 if (ctrl->ctrl_int_comp & (0x1L << hp_slot)) { 2055 func->switch_save = 0; 2056 } else { 2057 func->switch_save = 0x10; 2058 } 2059 2060 rc = board_added(func, ctrl); 2061 if (rc) { 2062 if (is_bridge(func)) { 2063 bridge_slot_remove(func); 2064 } else 2065 slot_remove(func); 2066 2067 /* Setup slot structure with entry for empty slot */ 2068 func = cpqhp_slot_create(ctrl->bus); 2069 2070 if (func == NULL) 2071 return 1; 2072 2073 func->bus = ctrl->bus; 2074 func->device = device; 2075 func->function = 0; 2076 func->configured = 0; 2077 func->is_a_board = 0; 2078 2079 /* We have to save the presence info for these slots */ 2080 temp_word = ctrl->ctrl_int_comp >> 16; 2081 func->presence_save = (temp_word >> hp_slot) & 0x01; 2082 func->presence_save |= 2083 (temp_word >> (hp_slot + 7)) & 0x02; 2084 2085 if (ctrl->ctrl_int_comp & (0x1L << hp_slot)) { 2086 func->switch_save = 0; 2087 } else { 2088 func->switch_save = 0x10; 2089 } 2090 } 2091 } 2092 2093 if (rc) { 2094 dbg("%s: rc = %d\n", __FUNCTION__, rc); 2095 } 2096 2097 if (p_slot) 2098 update_slot_info(ctrl, p_slot); 2099 2100 return rc; 2101 } 2102 2103 2104 int cpqhp_process_SS(struct controller *ctrl, struct pci_func *func) 2105 { 2106 u8 device, class_code, header_type, BCR; 2107 u8 index = 0; 2108 u8 replace_flag; 2109 u32 rc = 0; 2110 unsigned int devfn; 2111 struct slot* p_slot; 2112 struct pci_bus *pci_bus = ctrl->pci_bus; 2113 int physical_slot=0; 2114 2115 device = func->device; 2116 func = cpqhp_slot_find(ctrl->bus, device, index++); 2117 p_slot = cpqhp_find_slot(ctrl, device); 2118 if (p_slot) { 2119 physical_slot = p_slot->number; 2120 } 2121 2122 /* Make sure there are no video controllers here */ 2123 while (func && !rc) { 2124 pci_bus->number = func->bus; 2125 devfn = PCI_DEVFN(func->device, func->function); 2126 2127 /* Check the Class Code */ 2128 rc = pci_bus_read_config_byte (pci_bus, devfn, 0x0B, &class_code); 2129 if (rc) 2130 return rc; 2131 2132 if (class_code == PCI_BASE_CLASS_DISPLAY) { 2133 /* Display/Video adapter (not supported) */ 2134 rc = REMOVE_NOT_SUPPORTED; 2135 } else { 2136 /* See if it's a bridge */ 2137 rc = pci_bus_read_config_byte (pci_bus, devfn, PCI_HEADER_TYPE, &header_type); 2138 if (rc) 2139 return rc; 2140 2141 /* If it's a bridge, check the VGA Enable bit */ 2142 if ((header_type & 0x7F) == PCI_HEADER_TYPE_BRIDGE) { 2143 rc = pci_bus_read_config_byte (pci_bus, devfn, PCI_BRIDGE_CONTROL, &BCR); 2144 if (rc) 2145 return rc; 2146 2147 /* If the VGA Enable bit is set, remove isn't 2148 * supported */ 2149 if (BCR & PCI_BRIDGE_CTL_VGA) { 2150 rc = REMOVE_NOT_SUPPORTED; 2151 } 2152 } 2153 } 2154 2155 func = cpqhp_slot_find(ctrl->bus, device, index++); 2156 } 2157 2158 func = cpqhp_slot_find(ctrl->bus, device, 0); 2159 if ((func != NULL) && !rc) { 2160 /* FIXME: Replace flag should be passed into process_SS */ 2161 replace_flag = !(ctrl->add_support); 2162 rc = remove_board(func, replace_flag, ctrl); 2163 } else if (!rc) { 2164 rc = 1; 2165 } 2166 2167 if (p_slot) 2168 update_slot_info(ctrl, p_slot); 2169 2170 return rc; 2171 } 2172 2173 /** 2174 * switch_leds: switch the leds, go from one site to the other. 2175 * @ctrl: controller to use 2176 * @num_of_slots: number of slots to use 2177 * @direction: 1 to start from the left side, 0 to start right. 2178 */ 2179 static void switch_leds(struct controller *ctrl, const int num_of_slots, 2180 u32 *work_LED, const int direction) 2181 { 2182 int loop; 2183 2184 for (loop = 0; loop < num_of_slots; loop++) { 2185 if (direction) 2186 *work_LED = *work_LED >> 1; 2187 else 2188 *work_LED = *work_LED << 1; 2189 writel(*work_LED, ctrl->hpc_reg + LED_CONTROL); 2190 2191 set_SOGO(ctrl); 2192 2193 /* Wait for SOGO interrupt */ 2194 wait_for_ctrl_irq(ctrl); 2195 2196 /* Get ready for next iteration */ 2197 long_delay((2*HZ)/10); 2198 } 2199 } 2200 2201 /** 2202 * hardware_test - runs hardware tests 2203 * 2204 * For hot plug ctrl folks to play with. 2205 * test_num is the number written to the "test" file in sysfs 2206 * 2207 */ 2208 int cpqhp_hardware_test(struct controller *ctrl, int test_num) 2209 { 2210 u32 save_LED; 2211 u32 work_LED; 2212 int loop; 2213 int num_of_slots; 2214 2215 num_of_slots = readb(ctrl->hpc_reg + SLOT_MASK) & 0x0f; 2216 2217 switch (test_num) { 2218 case 1: 2219 /* Do stuff here! */ 2220 2221 /* Do that funky LED thing */ 2222 /* so we can restore them later */ 2223 save_LED = readl(ctrl->hpc_reg + LED_CONTROL); 2224 work_LED = 0x01010101; 2225 switch_leds(ctrl, num_of_slots, &work_LED, 0); 2226 switch_leds(ctrl, num_of_slots, &work_LED, 1); 2227 switch_leds(ctrl, num_of_slots, &work_LED, 0); 2228 switch_leds(ctrl, num_of_slots, &work_LED, 1); 2229 2230 work_LED = 0x01010000; 2231 writel(work_LED, ctrl->hpc_reg + LED_CONTROL); 2232 switch_leds(ctrl, num_of_slots, &work_LED, 0); 2233 switch_leds(ctrl, num_of_slots, &work_LED, 1); 2234 work_LED = 0x00000101; 2235 writel(work_LED, ctrl->hpc_reg + LED_CONTROL); 2236 switch_leds(ctrl, num_of_slots, &work_LED, 0); 2237 switch_leds(ctrl, num_of_slots, &work_LED, 1); 2238 2239 work_LED = 0x01010000; 2240 writel(work_LED, ctrl->hpc_reg + LED_CONTROL); 2241 for (loop = 0; loop < num_of_slots; loop++) { 2242 set_SOGO(ctrl); 2243 2244 /* Wait for SOGO interrupt */ 2245 wait_for_ctrl_irq (ctrl); 2246 2247 /* Get ready for next iteration */ 2248 long_delay((3*HZ)/10); 2249 work_LED = work_LED >> 16; 2250 writel(work_LED, ctrl->hpc_reg + LED_CONTROL); 2251 2252 set_SOGO(ctrl); 2253 2254 /* Wait for SOGO interrupt */ 2255 wait_for_ctrl_irq (ctrl); 2256 2257 /* Get ready for next iteration */ 2258 long_delay((3*HZ)/10); 2259 work_LED = work_LED << 16; 2260 writel(work_LED, ctrl->hpc_reg + LED_CONTROL); 2261 work_LED = work_LED << 1; 2262 writel(work_LED, ctrl->hpc_reg + LED_CONTROL); 2263 } 2264 2265 /* put it back the way it was */ 2266 writel(save_LED, ctrl->hpc_reg + LED_CONTROL); 2267 2268 set_SOGO(ctrl); 2269 2270 /* Wait for SOBS to be unset */ 2271 wait_for_ctrl_irq (ctrl); 2272 break; 2273 case 2: 2274 /* Do other stuff here! */ 2275 break; 2276 case 3: 2277 /* and more... */ 2278 break; 2279 } 2280 return 0; 2281 } 2282 2283 2284 /** 2285 * configure_new_device - Configures the PCI header information of one board. 2286 * 2287 * @ctrl: pointer to controller structure 2288 * @func: pointer to function structure 2289 * @behind_bridge: 1 if this is a recursive call, 0 if not 2290 * @resources: pointer to set of resource lists 2291 * 2292 * Returns 0 if success 2293 * 2294 */ 2295 static u32 configure_new_device(struct controller * ctrl, struct pci_func * func, 2296 u8 behind_bridge, struct resource_lists * resources) 2297 { 2298 u8 temp_byte, function, max_functions, stop_it; 2299 int rc; 2300 u32 ID; 2301 struct pci_func *new_slot; 2302 int index; 2303 2304 new_slot = func; 2305 2306 dbg("%s\n", __FUNCTION__); 2307 /* Check for Multi-function device */ 2308 ctrl->pci_bus->number = func->bus; 2309 rc = pci_bus_read_config_byte (ctrl->pci_bus, PCI_DEVFN(func->device, func->function), 0x0E, &temp_byte); 2310 if (rc) { 2311 dbg("%s: rc = %d\n", __FUNCTION__, rc); 2312 return rc; 2313 } 2314 2315 if (temp_byte & 0x80) /* Multi-function device */ 2316 max_functions = 8; 2317 else 2318 max_functions = 1; 2319 2320 function = 0; 2321 2322 do { 2323 rc = configure_new_function(ctrl, new_slot, behind_bridge, resources); 2324 2325 if (rc) { 2326 dbg("configure_new_function failed %d\n",rc); 2327 index = 0; 2328 2329 while (new_slot) { 2330 new_slot = cpqhp_slot_find(new_slot->bus, new_slot->device, index++); 2331 2332 if (new_slot) 2333 cpqhp_return_board_resources(new_slot, resources); 2334 } 2335 2336 return rc; 2337 } 2338 2339 function++; 2340 2341 stop_it = 0; 2342 2343 /* The following loop skips to the next present function 2344 * and creates a board structure */ 2345 2346 while ((function < max_functions) && (!stop_it)) { 2347 pci_bus_read_config_dword (ctrl->pci_bus, PCI_DEVFN(func->device, function), 0x00, &ID); 2348 2349 if (ID == 0xFFFFFFFF) { /* There's nothing there. */ 2350 function++; 2351 } else { /* There's something there */ 2352 /* Setup slot structure. */ 2353 new_slot = cpqhp_slot_create(func->bus); 2354 2355 if (new_slot == NULL) 2356 return 1; 2357 2358 new_slot->bus = func->bus; 2359 new_slot->device = func->device; 2360 new_slot->function = function; 2361 new_slot->is_a_board = 1; 2362 new_slot->status = 0; 2363 2364 stop_it++; 2365 } 2366 } 2367 2368 } while (function < max_functions); 2369 dbg("returning from configure_new_device\n"); 2370 2371 return 0; 2372 } 2373 2374 2375 /* 2376 Configuration logic that involves the hotplug data structures and 2377 their bookkeeping 2378 */ 2379 2380 2381 /** 2382 * configure_new_function - Configures the PCI header information of one device 2383 * 2384 * @ctrl: pointer to controller structure 2385 * @func: pointer to function structure 2386 * @behind_bridge: 1 if this is a recursive call, 0 if not 2387 * @resources: pointer to set of resource lists 2388 * 2389 * Calls itself recursively for bridged devices. 2390 * Returns 0 if success 2391 * 2392 */ 2393 static int configure_new_function(struct controller *ctrl, struct pci_func *func, 2394 u8 behind_bridge, 2395 struct resource_lists *resources) 2396 { 2397 int cloop; 2398 u8 IRQ = 0; 2399 u8 temp_byte; 2400 u8 device; 2401 u8 class_code; 2402 u16 command; 2403 u16 temp_word; 2404 u32 temp_dword; 2405 u32 rc; 2406 u32 temp_register; 2407 u32 base; 2408 u32 ID; 2409 unsigned int devfn; 2410 struct pci_resource *mem_node; 2411 struct pci_resource *p_mem_node; 2412 struct pci_resource *io_node; 2413 struct pci_resource *bus_node; 2414 struct pci_resource *hold_mem_node; 2415 struct pci_resource *hold_p_mem_node; 2416 struct pci_resource *hold_IO_node; 2417 struct pci_resource *hold_bus_node; 2418 struct irq_mapping irqs; 2419 struct pci_func *new_slot; 2420 struct pci_bus *pci_bus; 2421 struct resource_lists temp_resources; 2422 2423 pci_bus = ctrl->pci_bus; 2424 pci_bus->number = func->bus; 2425 devfn = PCI_DEVFN(func->device, func->function); 2426 2427 /* Check for Bridge */ 2428 rc = pci_bus_read_config_byte(pci_bus, devfn, PCI_HEADER_TYPE, &temp_byte); 2429 if (rc) 2430 return rc; 2431 2432 if ((temp_byte & 0x7F) == PCI_HEADER_TYPE_BRIDGE) { /* PCI-PCI Bridge */ 2433 /* set Primary bus */ 2434 dbg("set Primary bus = %d\n", func->bus); 2435 rc = pci_bus_write_config_byte(pci_bus, devfn, PCI_PRIMARY_BUS, func->bus); 2436 if (rc) 2437 return rc; 2438 2439 /* find range of busses to use */ 2440 dbg("find ranges of buses to use\n"); 2441 bus_node = get_max_resource(&(resources->bus_head), 1); 2442 2443 /* If we don't have any busses to allocate, we can't continue */ 2444 if (!bus_node) 2445 return -ENOMEM; 2446 2447 /* set Secondary bus */ 2448 temp_byte = bus_node->base; 2449 dbg("set Secondary bus = %d\n", bus_node->base); 2450 rc = pci_bus_write_config_byte(pci_bus, devfn, PCI_SECONDARY_BUS, temp_byte); 2451 if (rc) 2452 return rc; 2453 2454 /* set subordinate bus */ 2455 temp_byte = bus_node->base + bus_node->length - 1; 2456 dbg("set subordinate bus = %d\n", bus_node->base + bus_node->length - 1); 2457 rc = pci_bus_write_config_byte(pci_bus, devfn, PCI_SUBORDINATE_BUS, temp_byte); 2458 if (rc) 2459 return rc; 2460 2461 /* set subordinate Latency Timer and base Latency Timer */ 2462 temp_byte = 0x40; 2463 rc = pci_bus_write_config_byte(pci_bus, devfn, PCI_SEC_LATENCY_TIMER, temp_byte); 2464 if (rc) 2465 return rc; 2466 rc = pci_bus_write_config_byte(pci_bus, devfn, PCI_LATENCY_TIMER, temp_byte); 2467 if (rc) 2468 return rc; 2469 2470 /* set Cache Line size */ 2471 temp_byte = 0x08; 2472 rc = pci_bus_write_config_byte(pci_bus, devfn, PCI_CACHE_LINE_SIZE, temp_byte); 2473 if (rc) 2474 return rc; 2475 2476 /* Setup the IO, memory, and prefetchable windows */ 2477 io_node = get_max_resource(&(resources->io_head), 0x1000); 2478 if (!io_node) 2479 return -ENOMEM; 2480 mem_node = get_max_resource(&(resources->mem_head), 0x100000); 2481 if (!mem_node) 2482 return -ENOMEM; 2483 p_mem_node = get_max_resource(&(resources->p_mem_head), 0x100000); 2484 if (!p_mem_node) 2485 return -ENOMEM; 2486 dbg("Setup the IO, memory, and prefetchable windows\n"); 2487 dbg("io_node\n"); 2488 dbg("(base, len, next) (%x, %x, %p)\n", io_node->base, 2489 io_node->length, io_node->next); 2490 dbg("mem_node\n"); 2491 dbg("(base, len, next) (%x, %x, %p)\n", mem_node->base, 2492 mem_node->length, mem_node->next); 2493 dbg("p_mem_node\n"); 2494 dbg("(base, len, next) (%x, %x, %p)\n", p_mem_node->base, 2495 p_mem_node->length, p_mem_node->next); 2496 2497 /* set up the IRQ info */ 2498 if (!resources->irqs) { 2499 irqs.barber_pole = 0; 2500 irqs.interrupt[0] = 0; 2501 irqs.interrupt[1] = 0; 2502 irqs.interrupt[2] = 0; 2503 irqs.interrupt[3] = 0; 2504 irqs.valid_INT = 0; 2505 } else { 2506 irqs.barber_pole = resources->irqs->barber_pole; 2507 irqs.interrupt[0] = resources->irqs->interrupt[0]; 2508 irqs.interrupt[1] = resources->irqs->interrupt[1]; 2509 irqs.interrupt[2] = resources->irqs->interrupt[2]; 2510 irqs.interrupt[3] = resources->irqs->interrupt[3]; 2511 irqs.valid_INT = resources->irqs->valid_INT; 2512 } 2513 2514 /* set up resource lists that are now aligned on top and bottom 2515 * for anything behind the bridge. */ 2516 temp_resources.bus_head = bus_node; 2517 temp_resources.io_head = io_node; 2518 temp_resources.mem_head = mem_node; 2519 temp_resources.p_mem_head = p_mem_node; 2520 temp_resources.irqs = &irqs; 2521 2522 /* Make copies of the nodes we are going to pass down so that 2523 * if there is a problem,we can just use these to free resources */ 2524 hold_bus_node = kmalloc(sizeof(*hold_bus_node), GFP_KERNEL); 2525 hold_IO_node = kmalloc(sizeof(*hold_IO_node), GFP_KERNEL); 2526 hold_mem_node = kmalloc(sizeof(*hold_mem_node), GFP_KERNEL); 2527 hold_p_mem_node = kmalloc(sizeof(*hold_p_mem_node), GFP_KERNEL); 2528 2529 if (!hold_bus_node || !hold_IO_node || !hold_mem_node || !hold_p_mem_node) { 2530 kfree(hold_bus_node); 2531 kfree(hold_IO_node); 2532 kfree(hold_mem_node); 2533 kfree(hold_p_mem_node); 2534 2535 return 1; 2536 } 2537 2538 memcpy(hold_bus_node, bus_node, sizeof(struct pci_resource)); 2539 2540 bus_node->base += 1; 2541 bus_node->length -= 1; 2542 bus_node->next = NULL; 2543 2544 /* If we have IO resources copy them and fill in the bridge's 2545 * IO range registers */ 2546 if (io_node) { 2547 memcpy(hold_IO_node, io_node, sizeof(struct pci_resource)); 2548 io_node->next = NULL; 2549 2550 /* set IO base and Limit registers */ 2551 temp_byte = io_node->base >> 8; 2552 rc = pci_bus_write_config_byte(pci_bus, devfn, PCI_IO_BASE, temp_byte); 2553 2554 temp_byte = (io_node->base + io_node->length - 1) >> 8; 2555 rc = pci_bus_write_config_byte(pci_bus, devfn, PCI_IO_LIMIT, temp_byte); 2556 } else { 2557 kfree(hold_IO_node); 2558 hold_IO_node = NULL; 2559 } 2560 2561 /* If we have memory resources copy them and fill in the 2562 * bridge's memory range registers. Otherwise, fill in the 2563 * range registers with values that disable them. */ 2564 if (mem_node) { 2565 memcpy(hold_mem_node, mem_node, sizeof(struct pci_resource)); 2566 mem_node->next = NULL; 2567 2568 /* set Mem base and Limit registers */ 2569 temp_word = mem_node->base >> 16; 2570 rc = pci_bus_write_config_word(pci_bus, devfn, PCI_MEMORY_BASE, temp_word); 2571 2572 temp_word = (mem_node->base + mem_node->length - 1) >> 16; 2573 rc = pci_bus_write_config_word(pci_bus, devfn, PCI_MEMORY_LIMIT, temp_word); 2574 } else { 2575 temp_word = 0xFFFF; 2576 rc = pci_bus_write_config_word(pci_bus, devfn, PCI_MEMORY_BASE, temp_word); 2577 2578 temp_word = 0x0000; 2579 rc = pci_bus_write_config_word(pci_bus, devfn, PCI_MEMORY_LIMIT, temp_word); 2580 2581 kfree(hold_mem_node); 2582 hold_mem_node = NULL; 2583 } 2584 2585 memcpy(hold_p_mem_node, p_mem_node, sizeof(struct pci_resource)); 2586 p_mem_node->next = NULL; 2587 2588 /* set Pre Mem base and Limit registers */ 2589 temp_word = p_mem_node->base >> 16; 2590 rc = pci_bus_write_config_word (pci_bus, devfn, PCI_PREF_MEMORY_BASE, temp_word); 2591 2592 temp_word = (p_mem_node->base + p_mem_node->length - 1) >> 16; 2593 rc = pci_bus_write_config_word (pci_bus, devfn, PCI_PREF_MEMORY_LIMIT, temp_word); 2594 2595 /* Adjust this to compensate for extra adjustment in first loop */ 2596 irqs.barber_pole--; 2597 2598 rc = 0; 2599 2600 /* Here we actually find the devices and configure them */ 2601 for (device = 0; (device <= 0x1F) && !rc; device++) { 2602 irqs.barber_pole = (irqs.barber_pole + 1) & 0x03; 2603 2604 ID = 0xFFFFFFFF; 2605 pci_bus->number = hold_bus_node->base; 2606 pci_bus_read_config_dword (pci_bus, PCI_DEVFN(device, 0), 0x00, &ID); 2607 pci_bus->number = func->bus; 2608 2609 if (ID != 0xFFFFFFFF) { /* device present */ 2610 /* Setup slot structure. */ 2611 new_slot = cpqhp_slot_create(hold_bus_node->base); 2612 2613 if (new_slot == NULL) { 2614 rc = -ENOMEM; 2615 continue; 2616 } 2617 2618 new_slot->bus = hold_bus_node->base; 2619 new_slot->device = device; 2620 new_slot->function = 0; 2621 new_slot->is_a_board = 1; 2622 new_slot->status = 0; 2623 2624 rc = configure_new_device(ctrl, new_slot, 1, &temp_resources); 2625 dbg("configure_new_device rc=0x%x\n",rc); 2626 } /* End of IF (device in slot?) */ 2627 } /* End of FOR loop */ 2628 2629 if (rc) 2630 goto free_and_out; 2631 /* save the interrupt routing information */ 2632 if (resources->irqs) { 2633 resources->irqs->interrupt[0] = irqs.interrupt[0]; 2634 resources->irqs->interrupt[1] = irqs.interrupt[1]; 2635 resources->irqs->interrupt[2] = irqs.interrupt[2]; 2636 resources->irqs->interrupt[3] = irqs.interrupt[3]; 2637 resources->irqs->valid_INT = irqs.valid_INT; 2638 } else if (!behind_bridge) { 2639 /* We need to hook up the interrupts here */ 2640 for (cloop = 0; cloop < 4; cloop++) { 2641 if (irqs.valid_INT & (0x01 << cloop)) { 2642 rc = cpqhp_set_irq(func->bus, func->device, 2643 0x0A + cloop, irqs.interrupt[cloop]); 2644 if (rc) 2645 goto free_and_out; 2646 } 2647 } /* end of for loop */ 2648 } 2649 /* Return unused bus resources 2650 * First use the temporary node to store information for 2651 * the board */ 2652 if (hold_bus_node && bus_node && temp_resources.bus_head) { 2653 hold_bus_node->length = bus_node->base - hold_bus_node->base; 2654 2655 hold_bus_node->next = func->bus_head; 2656 func->bus_head = hold_bus_node; 2657 2658 temp_byte = temp_resources.bus_head->base - 1; 2659 2660 /* set subordinate bus */ 2661 rc = pci_bus_write_config_byte (pci_bus, devfn, PCI_SUBORDINATE_BUS, temp_byte); 2662 2663 if (temp_resources.bus_head->length == 0) { 2664 kfree(temp_resources.bus_head); 2665 temp_resources.bus_head = NULL; 2666 } else { 2667 return_resource(&(resources->bus_head), temp_resources.bus_head); 2668 } 2669 } 2670 2671 /* If we have IO space available and there is some left, 2672 * return the unused portion */ 2673 if (hold_IO_node && temp_resources.io_head) { 2674 io_node = do_pre_bridge_resource_split(&(temp_resources.io_head), 2675 &hold_IO_node, 0x1000); 2676 2677 /* Check if we were able to split something off */ 2678 if (io_node) { 2679 hold_IO_node->base = io_node->base + io_node->length; 2680 2681 temp_byte = (hold_IO_node->base) >> 8; 2682 rc = pci_bus_write_config_word (pci_bus, devfn, PCI_IO_BASE, temp_byte); 2683 2684 return_resource(&(resources->io_head), io_node); 2685 } 2686 2687 io_node = do_bridge_resource_split(&(temp_resources.io_head), 0x1000); 2688 2689 /* Check if we were able to split something off */ 2690 if (io_node) { 2691 /* First use the temporary node to store 2692 * information for the board */ 2693 hold_IO_node->length = io_node->base - hold_IO_node->base; 2694 2695 /* If we used any, add it to the board's list */ 2696 if (hold_IO_node->length) { 2697 hold_IO_node->next = func->io_head; 2698 func->io_head = hold_IO_node; 2699 2700 temp_byte = (io_node->base - 1) >> 8; 2701 rc = pci_bus_write_config_byte (pci_bus, devfn, PCI_IO_LIMIT, temp_byte); 2702 2703 return_resource(&(resources->io_head), io_node); 2704 } else { 2705 /* it doesn't need any IO */ 2706 temp_word = 0x0000; 2707 rc = pci_bus_write_config_word (pci_bus, devfn, PCI_IO_LIMIT, temp_word); 2708 2709 return_resource(&(resources->io_head), io_node); 2710 kfree(hold_IO_node); 2711 } 2712 } else { 2713 /* it used most of the range */ 2714 hold_IO_node->next = func->io_head; 2715 func->io_head = hold_IO_node; 2716 } 2717 } else if (hold_IO_node) { 2718 /* it used the whole range */ 2719 hold_IO_node->next = func->io_head; 2720 func->io_head = hold_IO_node; 2721 } 2722 /* If we have memory space available and there is some left, 2723 * return the unused portion */ 2724 if (hold_mem_node && temp_resources.mem_head) { 2725 mem_node = do_pre_bridge_resource_split(&(temp_resources. mem_head), 2726 &hold_mem_node, 0x100000); 2727 2728 /* Check if we were able to split something off */ 2729 if (mem_node) { 2730 hold_mem_node->base = mem_node->base + mem_node->length; 2731 2732 temp_word = (hold_mem_node->base) >> 16; 2733 rc = pci_bus_write_config_word (pci_bus, devfn, PCI_MEMORY_BASE, temp_word); 2734 2735 return_resource(&(resources->mem_head), mem_node); 2736 } 2737 2738 mem_node = do_bridge_resource_split(&(temp_resources.mem_head), 0x100000); 2739 2740 /* Check if we were able to split something off */ 2741 if (mem_node) { 2742 /* First use the temporary node to store 2743 * information for the board */ 2744 hold_mem_node->length = mem_node->base - hold_mem_node->base; 2745 2746 if (hold_mem_node->length) { 2747 hold_mem_node->next = func->mem_head; 2748 func->mem_head = hold_mem_node; 2749 2750 /* configure end address */ 2751 temp_word = (mem_node->base - 1) >> 16; 2752 rc = pci_bus_write_config_word (pci_bus, devfn, PCI_MEMORY_LIMIT, temp_word); 2753 2754 /* Return unused resources to the pool */ 2755 return_resource(&(resources->mem_head), mem_node); 2756 } else { 2757 /* it doesn't need any Mem */ 2758 temp_word = 0x0000; 2759 rc = pci_bus_write_config_word (pci_bus, devfn, PCI_MEMORY_LIMIT, temp_word); 2760 2761 return_resource(&(resources->mem_head), mem_node); 2762 kfree(hold_mem_node); 2763 } 2764 } else { 2765 /* it used most of the range */ 2766 hold_mem_node->next = func->mem_head; 2767 func->mem_head = hold_mem_node; 2768 } 2769 } else if (hold_mem_node) { 2770 /* it used the whole range */ 2771 hold_mem_node->next = func->mem_head; 2772 func->mem_head = hold_mem_node; 2773 } 2774 /* If we have prefetchable memory space available and there 2775 * is some left at the end, return the unused portion */ 2776 if (hold_p_mem_node && temp_resources.p_mem_head) { 2777 p_mem_node = do_pre_bridge_resource_split(&(temp_resources.p_mem_head), 2778 &hold_p_mem_node, 0x100000); 2779 2780 /* Check if we were able to split something off */ 2781 if (p_mem_node) { 2782 hold_p_mem_node->base = p_mem_node->base + p_mem_node->length; 2783 2784 temp_word = (hold_p_mem_node->base) >> 16; 2785 rc = pci_bus_write_config_word (pci_bus, devfn, PCI_PREF_MEMORY_BASE, temp_word); 2786 2787 return_resource(&(resources->p_mem_head), p_mem_node); 2788 } 2789 2790 p_mem_node = do_bridge_resource_split(&(temp_resources.p_mem_head), 0x100000); 2791 2792 /* Check if we were able to split something off */ 2793 if (p_mem_node) { 2794 /* First use the temporary node to store 2795 * information for the board */ 2796 hold_p_mem_node->length = p_mem_node->base - hold_p_mem_node->base; 2797 2798 /* If we used any, add it to the board's list */ 2799 if (hold_p_mem_node->length) { 2800 hold_p_mem_node->next = func->p_mem_head; 2801 func->p_mem_head = hold_p_mem_node; 2802 2803 temp_word = (p_mem_node->base - 1) >> 16; 2804 rc = pci_bus_write_config_word (pci_bus, devfn, PCI_PREF_MEMORY_LIMIT, temp_word); 2805 2806 return_resource(&(resources->p_mem_head), p_mem_node); 2807 } else { 2808 /* it doesn't need any PMem */ 2809 temp_word = 0x0000; 2810 rc = pci_bus_write_config_word (pci_bus, devfn, PCI_PREF_MEMORY_LIMIT, temp_word); 2811 2812 return_resource(&(resources->p_mem_head), p_mem_node); 2813 kfree(hold_p_mem_node); 2814 } 2815 } else { 2816 /* it used the most of the range */ 2817 hold_p_mem_node->next = func->p_mem_head; 2818 func->p_mem_head = hold_p_mem_node; 2819 } 2820 } else if (hold_p_mem_node) { 2821 /* it used the whole range */ 2822 hold_p_mem_node->next = func->p_mem_head; 2823 func->p_mem_head = hold_p_mem_node; 2824 } 2825 /* We should be configuring an IRQ and the bridge's base address 2826 * registers if it needs them. Although we have never seen such 2827 * a device */ 2828 2829 /* enable card */ 2830 command = 0x0157; /* = PCI_COMMAND_IO | 2831 * PCI_COMMAND_MEMORY | 2832 * PCI_COMMAND_MASTER | 2833 * PCI_COMMAND_INVALIDATE | 2834 * PCI_COMMAND_PARITY | 2835 * PCI_COMMAND_SERR */ 2836 rc = pci_bus_write_config_word (pci_bus, devfn, PCI_COMMAND, command); 2837 2838 /* set Bridge Control Register */ 2839 command = 0x07; /* = PCI_BRIDGE_CTL_PARITY | 2840 * PCI_BRIDGE_CTL_SERR | 2841 * PCI_BRIDGE_CTL_NO_ISA */ 2842 rc = pci_bus_write_config_word (pci_bus, devfn, PCI_BRIDGE_CONTROL, command); 2843 } else if ((temp_byte & 0x7F) == PCI_HEADER_TYPE_NORMAL) { 2844 /* Standard device */ 2845 rc = pci_bus_read_config_byte (pci_bus, devfn, 0x0B, &class_code); 2846 2847 if (class_code == PCI_BASE_CLASS_DISPLAY) { 2848 /* Display (video) adapter (not supported) */ 2849 return DEVICE_TYPE_NOT_SUPPORTED; 2850 } 2851 /* Figure out IO and memory needs */ 2852 for (cloop = 0x10; cloop <= 0x24; cloop += 4) { 2853 temp_register = 0xFFFFFFFF; 2854 2855 dbg("CND: bus=%d, devfn=%d, offset=%d\n", pci_bus->number, devfn, cloop); 2856 rc = pci_bus_write_config_dword (pci_bus, devfn, cloop, temp_register); 2857 2858 rc = pci_bus_read_config_dword (pci_bus, devfn, cloop, &temp_register); 2859 dbg("CND: base = 0x%x\n", temp_register); 2860 2861 if (temp_register) { /* If this register is implemented */ 2862 if ((temp_register & 0x03L) == 0x01) { 2863 /* Map IO */ 2864 2865 /* set base = amount of IO space */ 2866 base = temp_register & 0xFFFFFFFC; 2867 base = ~base + 1; 2868 2869 dbg("CND: length = 0x%x\n", base); 2870 io_node = get_io_resource(&(resources->io_head), base); 2871 dbg("Got io_node start = %8.8x, length = %8.8x next (%p)\n", 2872 io_node->base, io_node->length, io_node->next); 2873 dbg("func (%p) io_head (%p)\n", func, func->io_head); 2874 2875 /* allocate the resource to the board */ 2876 if (io_node) { 2877 base = io_node->base; 2878 2879 io_node->next = func->io_head; 2880 func->io_head = io_node; 2881 } else 2882 return -ENOMEM; 2883 } else if ((temp_register & 0x0BL) == 0x08) { 2884 /* Map prefetchable memory */ 2885 base = temp_register & 0xFFFFFFF0; 2886 base = ~base + 1; 2887 2888 dbg("CND: length = 0x%x\n", base); 2889 p_mem_node = get_resource(&(resources->p_mem_head), base); 2890 2891 /* allocate the resource to the board */ 2892 if (p_mem_node) { 2893 base = p_mem_node->base; 2894 2895 p_mem_node->next = func->p_mem_head; 2896 func->p_mem_head = p_mem_node; 2897 } else 2898 return -ENOMEM; 2899 } else if ((temp_register & 0x0BL) == 0x00) { 2900 /* Map memory */ 2901 base = temp_register & 0xFFFFFFF0; 2902 base = ~base + 1; 2903 2904 dbg("CND: length = 0x%x\n", base); 2905 mem_node = get_resource(&(resources->mem_head), base); 2906 2907 /* allocate the resource to the board */ 2908 if (mem_node) { 2909 base = mem_node->base; 2910 2911 mem_node->next = func->mem_head; 2912 func->mem_head = mem_node; 2913 } else 2914 return -ENOMEM; 2915 } else if ((temp_register & 0x0BL) == 0x04) { 2916 /* Map memory */ 2917 base = temp_register & 0xFFFFFFF0; 2918 base = ~base + 1; 2919 2920 dbg("CND: length = 0x%x\n", base); 2921 mem_node = get_resource(&(resources->mem_head), base); 2922 2923 /* allocate the resource to the board */ 2924 if (mem_node) { 2925 base = mem_node->base; 2926 2927 mem_node->next = func->mem_head; 2928 func->mem_head = mem_node; 2929 } else 2930 return -ENOMEM; 2931 } else if ((temp_register & 0x0BL) == 0x06) { 2932 /* Those bits are reserved, we can't handle this */ 2933 return 1; 2934 } else { 2935 /* Requesting space below 1M */ 2936 return NOT_ENOUGH_RESOURCES; 2937 } 2938 2939 rc = pci_bus_write_config_dword(pci_bus, devfn, cloop, base); 2940 2941 /* Check for 64-bit base */ 2942 if ((temp_register & 0x07L) == 0x04) { 2943 cloop += 4; 2944 2945 /* Upper 32 bits of address always zero 2946 * on today's systems */ 2947 /* FIXME this is probably not true on 2948 * Alpha and ia64??? */ 2949 base = 0; 2950 rc = pci_bus_write_config_dword(pci_bus, devfn, cloop, base); 2951 } 2952 } 2953 } /* End of base register loop */ 2954 if (cpqhp_legacy_mode) { 2955 /* Figure out which interrupt pin this function uses */ 2956 rc = pci_bus_read_config_byte (pci_bus, devfn, 2957 PCI_INTERRUPT_PIN, &temp_byte); 2958 2959 /* If this function needs an interrupt and we are behind 2960 * a bridge and the pin is tied to something that's 2961 * alread mapped, set this one the same */ 2962 if (temp_byte && resources->irqs && 2963 (resources->irqs->valid_INT & 2964 (0x01 << ((temp_byte + resources->irqs->barber_pole - 1) & 0x03)))) { 2965 /* We have to share with something already set up */ 2966 IRQ = resources->irqs->interrupt[(temp_byte + 2967 resources->irqs->barber_pole - 1) & 0x03]; 2968 } else { 2969 /* Program IRQ based on card type */ 2970 rc = pci_bus_read_config_byte (pci_bus, devfn, 0x0B, &class_code); 2971 2972 if (class_code == PCI_BASE_CLASS_STORAGE) { 2973 IRQ = cpqhp_disk_irq; 2974 } else { 2975 IRQ = cpqhp_nic_irq; 2976 } 2977 } 2978 2979 /* IRQ Line */ 2980 rc = pci_bus_write_config_byte (pci_bus, devfn, PCI_INTERRUPT_LINE, IRQ); 2981 } 2982 2983 if (!behind_bridge) { 2984 rc = cpqhp_set_irq(func->bus, func->device, temp_byte + 0x09, IRQ); 2985 if (rc) 2986 return 1; 2987 } else { 2988 /* TBD - this code may also belong in the other clause 2989 * of this If statement */ 2990 resources->irqs->interrupt[(temp_byte + resources->irqs->barber_pole - 1) & 0x03] = IRQ; 2991 resources->irqs->valid_INT |= 0x01 << (temp_byte + resources->irqs->barber_pole - 1) & 0x03; 2992 } 2993 2994 /* Latency Timer */ 2995 temp_byte = 0x40; 2996 rc = pci_bus_write_config_byte(pci_bus, devfn, 2997 PCI_LATENCY_TIMER, temp_byte); 2998 2999 /* Cache Line size */ 3000 temp_byte = 0x08; 3001 rc = pci_bus_write_config_byte(pci_bus, devfn, 3002 PCI_CACHE_LINE_SIZE, temp_byte); 3003 3004 /* disable ROM base Address */ 3005 temp_dword = 0x00L; 3006 rc = pci_bus_write_config_word(pci_bus, devfn, 3007 PCI_ROM_ADDRESS, temp_dword); 3008 3009 /* enable card */ 3010 temp_word = 0x0157; /* = PCI_COMMAND_IO | 3011 * PCI_COMMAND_MEMORY | 3012 * PCI_COMMAND_MASTER | 3013 * PCI_COMMAND_INVALIDATE | 3014 * PCI_COMMAND_PARITY | 3015 * PCI_COMMAND_SERR */ 3016 rc = pci_bus_write_config_word (pci_bus, devfn, 3017 PCI_COMMAND, temp_word); 3018 } else { /* End of Not-A-Bridge else */ 3019 /* It's some strange type of PCI adapter (Cardbus?) */ 3020 return DEVICE_TYPE_NOT_SUPPORTED; 3021 } 3022 3023 func->configured = 1; 3024 3025 return 0; 3026 free_and_out: 3027 cpqhp_destroy_resource_list (&temp_resources); 3028 3029 return_resource(&(resources-> bus_head), hold_bus_node); 3030 return_resource(&(resources-> io_head), hold_IO_node); 3031 return_resource(&(resources-> mem_head), hold_mem_node); 3032 return_resource(&(resources-> p_mem_head), hold_p_mem_node); 3033 return rc; 3034 } 3035