2 * IBM Hot Plug Controller Driver
4 * Written By: Chuck Cole, Jyoti Shah, Tong Yu, Irene Zubarev, IBM Corporation
6 * Copyright (c) 2001,2003 Greg Kroah-Hartman (greg@kroah.com)
7 * Copyright (c) 2001-2003 IBM Corp.
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License as published by
13 * the Free Software Foundation; either version 2 of the License, or (at
14 * your option) any later version.
16 * This program is distributed in the hope that it will be useful, but
17 * WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
19 * NON INFRINGEMENT. See the GNU General Public License for more
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 * Send feedback to <gregkh@us.ibm.com>
30 #include <linux/init.h>
31 #include <linux/module.h>
32 #include <linux/slab.h>
33 #include <linux/pci.h>
34 #include <linux/interrupt.h>
35 #include <linux/delay.h>
36 #include <linux/wait.h>
37 #include <linux/smp_lock.h>
39 #include "../../../arch/i386/pci/pci.h" /* for struct irq_routing_table */
42 #define attn_on(sl) ibmphp_hpc_writeslot (sl, HPC_SLOT_ATTNON)
43 #define attn_off(sl) ibmphp_hpc_writeslot (sl, HPC_SLOT_ATTNOFF)
44 #define attn_LED_blink(sl) ibmphp_hpc_writeslot (sl, HPC_SLOT_BLINKLED)
45 #define get_ctrl_revision(sl, rev) ibmphp_hpc_readslot (sl, READ_REVLEVEL, rev)
46 #define get_hpc_options(sl, opt) ibmphp_hpc_readslot (sl, READ_HPCOPTIONS, opt)
48 #define DRIVER_VERSION "0.6"
49 #define DRIVER_DESC "IBM Hot Plug PCI Controller Driver"
54 MODULE_PARM (debug
, "i");
55 MODULE_PARM_DESC (debug
, "Debugging mode enabled or not");
56 MODULE_LICENSE ("GPL");
57 MODULE_DESCRIPTION (DRIVER_DESC
);
59 struct pci_bus
*ibmphp_pci_bus
;
62 static int irqs
[16]; /* PIC mode IRQ's we're using so far (in case MPS tables don't provide default info for empty slots */
67 static int get_max_adapter_speed_1 (struct hotplug_slot *, u8 *, u8);
69 static inline int get_max_adapter_speed (struct hotplug_slot *hs, u8 *value)
71 return get_max_adapter_speed_1 (hs, value, 1);
74 static inline int get_cur_bus_info (struct slot
**sl
)
77 struct slot
* slot_cur
= *sl
;
79 debug ("options = %x\n", slot_cur
->ctrl
->options
);
80 debug ("revision = %x\n", slot_cur
->ctrl
->revision
);
82 if (READ_BUS_STATUS (slot_cur
->ctrl
))
83 rc
= ibmphp_hpc_readslot (slot_cur
, READ_BUSSTATUS
, NULL
);
88 slot_cur
->bus_on
->current_speed
= CURRENT_BUS_SPEED (slot_cur
->busstatus
);
89 if (READ_BUS_MODE (slot_cur
->ctrl
))
90 slot_cur
->bus_on
->current_bus_mode
= CURRENT_BUS_MODE (slot_cur
->busstatus
);
92 slot_cur
->bus_on
->current_bus_mode
= 0xFF;
94 debug ("busstatus = %x, bus_speed = %x, bus_mode = %x\n", slot_cur
->busstatus
, slot_cur
->bus_on
->current_speed
, slot_cur
->bus_on
->current_bus_mode
);
100 static inline int slot_update (struct slot
**sl
)
103 rc
= ibmphp_hpc_readslot (*sl
, READ_ALLSTAT
, NULL
);
107 return get_cur_bus_info (sl
);
111 static int __init
get_max_slots (void)
113 struct slot
* slot_cur
;
114 struct list_head
* tmp
;
117 list_for_each (tmp
, &ibmphp_slot_head
) {
118 slot_cur
= list_entry (tmp
, struct slot
, ibm_slot_list
);
119 /* sometimes the hot-pluggable slots start with 4 (not always from 1 */
120 slot_count
= max (slot_count
, slot_cur
->number
);
125 /* This routine will put the correct slot->device information per slot. It's
126 * called from initialization of the slot structures. It will also assign
127 * interrupt numbers per each slot.
128 * Parameters: struct slot
129 * Returns 0 or errors
131 int ibmphp_init_devno (struct slot
**cur_slot
)
133 struct irq_routing_table
*rtable
;
138 rtable
= pcibios_get_irq_routing_table ();
140 err ("no BIOS routing table...\n");
144 len
= (rtable
->size
- sizeof (struct irq_routing_table
)) / sizeof (struct irq_info
);
148 for (loop
= 0; loop
< len
; loop
++) {
149 if ((*cur_slot
)->number
== rtable
->slots
[loop
].slot
) {
150 if ((*cur_slot
)->bus
== rtable
->slots
[loop
].bus
) {
151 (*cur_slot
)->device
= PCI_SLOT (rtable
->slots
[loop
].devfn
);
152 for (i
= 0; i
< 4; i
++)
153 (*cur_slot
)->irq
[i
] = IO_APIC_get_PCI_irq_vector ((int) (*cur_slot
)->bus
, (int) (*cur_slot
)->device
, i
);
155 debug ("(*cur_slot)->irq[0] = %x\n", (*cur_slot
)->irq
[0]);
156 debug ("(*cur_slot)->irq[1] = %x\n", (*cur_slot
)->irq
[1]);
157 debug ("(*cur_slot)->irq[2] = %x\n", (*cur_slot
)->irq
[2]);
158 debug ("(*cur_slot)->irq[3] = %x\n", (*cur_slot
)->irq
[3]);
160 debug ("rtable->exlusive_irqs = %x\n", rtable
->exclusive_irqs
);
161 debug ("rtable->slots[loop].irq[0].bitmap = %x\n", rtable
->slots
[loop
].irq
[0].bitmap
);
162 debug ("rtable->slots[loop].irq[1].bitmap = %x\n", rtable
->slots
[loop
].irq
[1].bitmap
);
163 debug ("rtable->slots[loop].irq[2].bitmap = %x\n", rtable
->slots
[loop
].irq
[2].bitmap
);
164 debug ("rtable->slots[loop].irq[3].bitmap = %x\n", rtable
->slots
[loop
].irq
[3].bitmap
);
166 debug ("rtable->slots[loop].irq[0].link= %x\n", rtable
->slots
[loop
].irq
[0].link
);
167 debug ("rtable->slots[loop].irq[1].link = %x\n", rtable
->slots
[loop
].irq
[1].link
);
168 debug ("rtable->slots[loop].irq[2].link = %x\n", rtable
->slots
[loop
].irq
[2].link
);
169 debug ("rtable->slots[loop].irq[3].link = %x\n", rtable
->slots
[loop
].irq
[3].link
);
170 debug ("end of init_devno\n");
179 static inline int power_on (struct slot
*slot_cur
)
181 u8 cmd
= HPC_SLOT_ON
;
184 retval
= ibmphp_hpc_writeslot (slot_cur
, cmd
);
186 err ("power on failed\n");
189 if (CTLR_RESULT (slot_cur
->ctrl
->status
)) {
190 err ("command not completed successfully in power_on \n");
193 long_delay (3 * HZ
); /* For ServeRAID cards, and some 66 PCI */
197 static inline int power_off (struct slot
*slot_cur
)
199 u8 cmd
= HPC_SLOT_OFF
;
202 retval
= ibmphp_hpc_writeslot (slot_cur
, cmd
);
204 err ("power off failed \n");
207 if (CTLR_RESULT (slot_cur
->ctrl
->status
)) {
208 err ("command not completed successfully in power_off \n");
214 static int set_attention_status (struct hotplug_slot
*hotplug_slot
, u8 value
)
221 debug ("set_attention_status - Entry hotplug_slot[%lx] value[%x]\n", (ulong
) hotplug_slot
, value
);
222 ibmphp_lock_operations ();
223 cmd
= 0x00; // avoid compiler warning
227 case HPC_SLOT_ATTN_OFF
:
228 cmd
= HPC_SLOT_ATTNOFF
;
230 case HPC_SLOT_ATTN_ON
:
231 cmd
= HPC_SLOT_ATTNON
;
233 case HPC_SLOT_ATTN_BLINK
:
234 cmd
= HPC_SLOT_BLINKLED
;
238 err ("set_attention_status - Error : invalid input [%x]\n", value
);
242 pslot
= (struct slot
*) hotplug_slot
->private;
244 hpcrc
= ibmphp_hpc_writeslot (pslot
, cmd
);
254 ibmphp_unlock_operations ();
256 debug ("set_attention_status - Exit rc[%d]\n", rc
);
260 static int get_attention_status (struct hotplug_slot
*hotplug_slot
, u8
* value
)
267 debug ("get_attention_status - Entry hotplug_slot[%lx] pvalue[%lx]\n", (ulong
) hotplug_slot
, (ulong
) value
);
269 ibmphp_lock_operations ();
270 if (hotplug_slot
&& value
) {
271 pslot
= (struct slot
*) hotplug_slot
->private;
273 memcpy ((void *) &myslot
, (void *) pslot
, sizeof (struct slot
));
274 hpcrc
= ibmphp_hpc_readslot (pslot
, READ_SLOTSTATUS
, &(myslot
.status
));
276 hpcrc
= ibmphp_hpc_readslot (pslot
, READ_EXTSLOTSTATUS
, &(myslot
.ext_status
));
278 *value
= SLOT_ATTN (myslot
.status
, myslot
.ext_status
);
288 ibmphp_unlock_operations ();
289 debug ("get_attention_status - Exit rc[%d] hpcrc[%x] value[%x]\n", rc
, hpcrc
, *value
);
293 static int get_latch_status (struct hotplug_slot
*hotplug_slot
, u8
* value
)
300 debug ("get_latch_status - Entry hotplug_slot[%lx] pvalue[%lx]\n", (ulong
) hotplug_slot
, (ulong
) value
);
301 ibmphp_lock_operations ();
302 if (hotplug_slot
&& value
) {
303 pslot
= (struct slot
*) hotplug_slot
->private;
305 memcpy ((void *) &myslot
, (void *) pslot
, sizeof (struct slot
));
306 hpcrc
= ibmphp_hpc_readslot (pslot
, READ_SLOTSTATUS
, &(myslot
.status
));
308 *value
= SLOT_LATCH (myslot
.status
);
318 ibmphp_unlock_operations ();
319 debug ("get_latch_status - Exit rc[%d] hpcrc[%x] value[%x]\n", rc
, hpcrc
, *value
);
324 static int get_power_status (struct hotplug_slot
*hotplug_slot
, u8
* value
)
331 debug ("get_power_status - Entry hotplug_slot[%lx] pvalue[%lx]\n", (ulong
) hotplug_slot
, (ulong
) value
);
332 ibmphp_lock_operations ();
333 if (hotplug_slot
&& value
) {
334 pslot
= (struct slot
*) hotplug_slot
->private;
336 memcpy ((void *) &myslot
, (void *) pslot
, sizeof (struct slot
));
337 hpcrc
= ibmphp_hpc_readslot (pslot
, READ_SLOTSTATUS
, &(myslot
.status
));
339 *value
= SLOT_PWRGD (myslot
.status
);
349 ibmphp_unlock_operations ();
350 debug ("get_power_status - Exit rc[%d] hpcrc[%x] value[%x]\n", rc
, hpcrc
, *value
);
354 static int get_adapter_present (struct hotplug_slot
*hotplug_slot
, u8
* value
)
362 debug ("get_adapter_status - Entry hotplug_slot[%lx] pvalue[%lx]\n", (ulong
) hotplug_slot
, (ulong
) value
);
363 ibmphp_lock_operations ();
364 if (hotplug_slot
&& value
) {
365 pslot
= (struct slot
*) hotplug_slot
->private;
367 memcpy ((void *) &myslot
, (void *) pslot
, sizeof (struct slot
));
368 hpcrc
= ibmphp_hpc_readslot (pslot
, READ_SLOTSTATUS
, &(myslot
.status
));
370 present
= SLOT_PRESENT (myslot
.status
);
371 if (present
== HPC_SLOT_EMPTY
)
383 ibmphp_unlock_operations ();
384 debug ("get_adapter_present - Exit rc[%d] hpcrc[%x] value[%x]\n", rc
, hpcrc
, *value
);
388 static int get_max_bus_speed (struct hotplug_slot
*hotplug_slot
, enum pci_bus_speed
*value
)
394 debug ("%s - Entry hotplug_slot[%p] pvalue[%p]\n", __FUNCTION__
,
395 hotplug_slot
, value
);
397 ibmphp_lock_operations ();
399 if (hotplug_slot
&& value
) {
400 pslot
= (struct slot
*) hotplug_slot
->private;
403 mode
= pslot
->supported_bus_mode
;
404 *value
= pslot
->supported_speed
;
409 if (mode
== BUS_MODE_PCIX
)
414 *value
= pslot
->supported_speed
+ 0x01;
417 /* Note (will need to change): there would be soon 256, 512 also */
424 ibmphp_unlock_operations ();
425 debug ("%s - Exit rc[%d] value[%x]\n", __FUNCTION__
, rc
, *value
);
429 static int get_cur_bus_speed (struct hotplug_slot
*hotplug_slot
, enum pci_bus_speed
*value
)
435 debug ("%s - Entry hotplug_slot[%p] pvalue[%p]\n", __FUNCTION__
,
436 hotplug_slot
, value
);
438 ibmphp_lock_operations ();
440 if (hotplug_slot
&& value
) {
441 pslot
= (struct slot
*) hotplug_slot
->private;
443 rc
= get_cur_bus_info (&pslot
);
445 mode
= pslot
->bus_on
->current_bus_mode
;
446 *value
= pslot
->bus_on
->current_speed
;
451 if (mode
== BUS_MODE_PCIX
)
453 else if (mode
== BUS_MODE_PCI
)
456 *value
= PCI_SPEED_UNKNOWN
;
463 /* Note of change: there would also be 256, 512 soon */
471 ibmphp_unlock_operations ();
472 debug ("%s - Exit rc[%d] value[%x]\n", __FUNCTION__
, rc
, *value
);
476 static int get_max_adapter_speed_1 (struct hotplug_slot *hotplug_slot, u8 * value, u8 flag)
483 debug ("get_max_adapter_speed_1 - Entry hotplug_slot[%lx] pvalue[%lx]\n", (ulong)hotplug_slot, (ulong) value);
486 ibmphp_lock_operations ();
488 if (hotplug_slot && value) {
489 pslot = (struct slot *) hotplug_slot->private;
491 memcpy ((void *) &myslot, (void *) pslot, sizeof (struct slot));
492 hpcrc = ibmphp_hpc_readslot (pslot, READ_SLOTSTATUS, &(myslot.status));
494 if (!(SLOT_LATCH (myslot.status)) && (SLOT_PRESENT (myslot.status))) {
495 hpcrc = ibmphp_hpc_readslot (pslot, READ_EXTSLOTSTATUS, &(myslot.ext_status));
497 *value = SLOT_SPEED (myslot.ext_status);
501 *value = MAX_ADAPTER_NONE;
512 ibmphp_unlock_operations ();
514 debug ("get_max_adapter_speed_1 - Exit rc[%d] hpcrc[%x] value[%x]\n", rc, hpcrc, *value);
518 static int get_bus_name (struct hotplug_slot *hotplug_slot, char * value)
521 struct slot *pslot = NULL;
523 debug ("get_bus_name - Entry hotplug_slot[%lx] \n", (ulong)hotplug_slot);
525 ibmphp_lock_operations ();
528 pslot = (struct slot *) hotplug_slot->private;
531 snprintf (value, 100, "Bus %x", pslot->bus);
536 ibmphp_unlock_operations ();
537 debug ("get_bus_name - Exit rc[%d] value[%x]\n", rc, *value);
542 /*******************************************************************************
543 * This routine will initialize the ops data structure used in the validate
544 * function. It will also power off empty slots that are powered on since BIOS
545 * leaves those on, albeit disconnected
546 ******************************************************************************/
547 static int __init
init_ops (void)
549 struct slot
*slot_cur
;
550 struct list_head
*tmp
;
554 list_for_each (tmp
, &ibmphp_slot_head
) {
555 slot_cur
= list_entry (tmp
, struct slot
, ibm_slot_list
);
560 debug ("BEFORE GETTING SLOT STATUS, slot # %x\n", slot_cur
->number
);
561 if (slot_cur
->ctrl
->revision
== 0xFF)
562 if (get_ctrl_revision (slot_cur
, &slot_cur
->ctrl
->revision
))
565 if (slot_cur
->bus_on
->current_speed
== 0xFF)
566 if (get_cur_bus_info (&slot_cur
))
569 if (slot_cur
->ctrl
->options
== 0xFF)
570 if (get_hpc_options (slot_cur
, &slot_cur
->ctrl
->options
))
573 retval
= slot_update (&slot_cur
);
577 debug ("status = %x\n", slot_cur
->status
);
578 debug ("ext_status = %x\n", slot_cur
->ext_status
);
579 debug ("SLOT_POWER = %x\n", SLOT_POWER (slot_cur
->status
));
580 debug ("SLOT_PRESENT = %x\n", SLOT_PRESENT (slot_cur
->status
));
581 debug ("SLOT_LATCH = %x\n", SLOT_LATCH (slot_cur
->status
));
583 if ((SLOT_PWRGD (slot_cur
->status
)) &&
584 !(SLOT_PRESENT (slot_cur
->status
)) &&
585 !(SLOT_LATCH (slot_cur
->status
))) {
586 debug ("BEFORE POWER OFF COMMAND\n");
587 rc
= power_off (slot_cur
);
591 /* retval = slot_update (&slot_cur);
594 * ibmphp_update_slot_info (slot_cur);
602 /* This operation will check whether the slot is within the bounds and
603 * the operation is valid to perform on that slot
604 * Parameters: slot, operation
605 * Returns: 0 or error codes
607 static int validate (struct slot
*slot_cur
, int opn
)
614 number
= slot_cur
->number
;
615 if ((number
> max_slots
) || (number
< 0))
617 debug ("slot_number in validate is %d\n", slot_cur
->number
);
619 retval
= slot_update (&slot_cur
);
625 if (!(SLOT_PWRGD (slot_cur
->status
)) &&
626 (SLOT_PRESENT (slot_cur
->status
)) &&
627 !(SLOT_LATCH (slot_cur
->status
)))
631 if ((SLOT_PWRGD (slot_cur
->status
)) &&
632 (SLOT_PRESENT (slot_cur
->status
)) &&
633 !(SLOT_LATCH (slot_cur
->status
)))
639 err ("validate failed....\n");
643 /********************************************************************************
644 * This routine is for updating the data structures in the hotplug core
645 * Parameters: struct slot
646 * Returns: 0 or error
647 *******************************************************************************/
648 int ibmphp_update_slot_info (struct slot
*slot_cur
)
650 struct hotplug_slot_info
*info
;
655 info
= kmalloc (sizeof (struct hotplug_slot_info
), GFP_KERNEL
);
657 err ("out of system memory \n");
661 info
->power_status
= SLOT_PWRGD (slot_cur
->status
);
662 info
->attention_status
= SLOT_ATTN (slot_cur
->status
, slot_cur
->ext_status
);
663 info
->latch_status
= SLOT_LATCH (slot_cur
->status
);
664 if (!SLOT_PRESENT (slot_cur
->status
)) {
665 info
->adapter_status
= 0;
666 // info->max_adapter_speed_status = MAX_ADAPTER_NONE;
668 info
->adapter_status
= 1;
669 // get_max_adapter_speed_1 (slot_cur->hotplug_slot, &info->max_adapter_speed_status, 0);
672 bus_speed
= slot_cur
->bus_on
->current_speed
;
673 mode
= slot_cur
->bus_on
->current_bus_mode
;
679 if (mode
== BUS_MODE_PCIX
)
681 else if (mode
== BUS_MODE_PCI
)
684 bus_speed
= PCI_SPEED_UNKNOWN
;
691 bus_speed
= PCI_SPEED_UNKNOWN
;
694 info
->cur_bus_speed
= bus_speed
;
695 info
->max_bus_speed
= slot_cur
->hotplug_slot
->info
->max_bus_speed
;
698 rc
= pci_hp_change_slot_info (slot_cur
->hotplug_slot
, info
);
704 /******************************************************************************
705 * This function will return the pci_func, given bus and devfunc, or NULL. It
706 * is called from visit routines
707 ******************************************************************************/
709 static struct pci_func
*ibm_slot_find (u8 busno
, u8 device
, u8 function
)
711 struct pci_func
*func_cur
;
712 struct slot
*slot_cur
;
713 struct list_head
* tmp
;
714 list_for_each (tmp
, &ibmphp_slot_head
) {
715 slot_cur
= list_entry (tmp
, struct slot
, ibm_slot_list
);
716 if (slot_cur
->func
) {
717 func_cur
= slot_cur
->func
;
719 if ((func_cur
->busno
== busno
) && (func_cur
->device
== device
) && (func_cur
->function
== function
))
721 func_cur
= func_cur
->next
;
728 /*************************************************************
729 * This routine frees up memory used by struct slot, including
730 * the pointers to pci_func, bus, hotplug_slot, controller,
731 * and deregistering from the hotplug core
732 *************************************************************/
733 static void free_slots (void)
735 struct slot
*slot_cur
;
736 struct list_head
* tmp
;
737 struct list_head
* next
;
739 debug ("%s -- enter\n", __FUNCTION__
);
741 list_for_each_safe (tmp
, next
, &ibmphp_slot_head
) {
742 slot_cur
= list_entry (tmp
, struct slot
, ibm_slot_list
);
743 pci_hp_deregister (slot_cur
->hotplug_slot
);
745 debug ("%s -- exit\n", __FUNCTION__
);
748 static int ibm_unconfigure_device (struct pci_func
*func
)
750 struct pci_dev
*temp
;
753 debug ("inside %s\n", __FUNCTION__
);
754 debug ("func->device = %x, func->function = %x\n", func
->device
, func
->function
);
755 debug ("func->device << 3 | 0x0 = %x\n", func
->device
<< 3 | 0x0);
757 for (j
= 0; j
< 0x08; j
++) {
758 temp
= pci_find_slot (func
->busno
, (func
->device
<< 3) | j
);
760 pci_remove_bus_device(temp
);
766 * The following function is to fix kernel bug regarding
767 * getting bus entries, here we manually add those primary
768 * bus entries to kernel bus structure whenever apply
771 static u8
bus_structure_fixup (u8 busno
)
777 if (pci_find_bus(busno
) || !(ibmphp_find_same_bus_num (busno
)))
780 bus
= kmalloc (sizeof (*bus
), GFP_KERNEL
);
782 err ("%s - out of memory\n", __FUNCTION__
);
785 dev
= kmalloc (sizeof (*dev
), GFP_KERNEL
);
788 err ("%s - out of memory\n", __FUNCTION__
);
793 bus
->ops
= ibmphp_pci_bus
->ops
;
795 for (dev
->devfn
= 0; dev
->devfn
< 256; dev
->devfn
+= 8) {
796 if (!pci_read_config_word (dev
, PCI_VENDOR_ID
, &l
) && l
!= 0x0000 && l
!= 0xffff) {
797 debug ("%s - Inside bus_struture_fixup() \n", __FUNCTION__
);
798 pci_scan_bus (busno
, ibmphp_pci_bus
->ops
, NULL
);
809 static int ibm_configure_device (struct pci_func
*func
)
812 struct pci_bus
*child
;
814 int flag
= 0; /* this is to make sure we don't double scan the bus, for bridged devices primarily */
816 if (!(bus_structure_fixup (func
->busno
)))
818 if (func
->dev
== NULL
)
819 func
->dev
= pci_find_slot (func
->busno
, PCI_DEVFN(func
->device
, func
->function
));
821 if (func
->dev
== NULL
) {
822 struct pci_bus
*bus
= pci_find_bus(func
->busno
);
826 num
= pci_scan_slot(bus
, PCI_DEVFN(func
->device
, func
->function
));
828 pci_bus_add_devices(bus
);
830 func
->dev
= pci_find_slot(func
->busno
, PCI_DEVFN(func
->device
, func
->function
));
831 if (func
->dev
== NULL
) {
832 err ("ERROR... : pci_dev still NULL \n");
836 if (!(flag
) && (func
->dev
->hdr_type
== PCI_HEADER_TYPE_BRIDGE
)) {
837 pci_read_config_byte (func
->dev
, PCI_SECONDARY_BUS
, &bus
);
838 child
= (struct pci_bus
*) pci_add_new_bus (func
->dev
->bus
, (func
->dev
), bus
);
839 pci_do_scan_bus (child
);
845 /*******************************************************
846 * Returns whether the bus is empty or not
847 *******************************************************/
848 static int is_bus_empty (struct slot
* slot_cur
)
851 struct slot
* tmp_slot
;
852 u8 i
= slot_cur
->bus_on
->slot_min
;
854 while (i
<= slot_cur
->bus_on
->slot_max
) {
855 if (i
== slot_cur
->number
) {
859 tmp_slot
= ibmphp_get_slot_from_physical_num (i
);
862 rc
= slot_update (&tmp_slot
);
865 if (SLOT_PRESENT (tmp_slot
->status
) && SLOT_PWRGD (tmp_slot
->status
))
872 /***********************************************************
873 * If the HPC permits and the bus currently empty, tries to set the
874 * bus speed and mode at the maximum card and bus capability
876 * Returns: bus is set (0) or error code
877 ***********************************************************/
878 static int set_bus (struct slot
* slot_cur
)
883 struct pci_dev
*dev
= NULL
;
886 debug ("%s - entry slot # %d \n", __FUNCTION__
, slot_cur
->number
);
887 if (SET_BUS_STATUS (slot_cur
->ctrl
) && is_bus_empty (slot_cur
)) {
888 rc
= slot_update (&slot_cur
);
891 speed
= SLOT_SPEED (slot_cur
->ext_status
);
892 debug ("ext_status = %x, speed = %x\n", slot_cur
->ext_status
, speed
);
894 case HPC_SLOT_SPEED_33
:
895 cmd
= HPC_BUS_33CONVMODE
;
897 case HPC_SLOT_SPEED_66
:
898 if (SLOT_PCIX (slot_cur
->ext_status
)) {
899 if ((slot_cur
->supported_speed
>= BUS_SPEED_66
) && (slot_cur
->supported_bus_mode
== BUS_MODE_PCIX
))
900 cmd
= HPC_BUS_66PCIXMODE
;
901 else if (!SLOT_BUS_MODE (slot_cur
->ext_status
))
902 /* if max slot/bus capability is 66 pci
903 and there's no bus mode mismatch, then
904 the adapter supports 66 pci */
905 cmd
= HPC_BUS_66CONVMODE
;
907 cmd
= HPC_BUS_33CONVMODE
;
909 if (slot_cur
->supported_speed
>= BUS_SPEED_66
)
910 cmd
= HPC_BUS_66CONVMODE
;
912 cmd
= HPC_BUS_33CONVMODE
;
915 case HPC_SLOT_SPEED_133
:
916 switch (slot_cur
->supported_speed
) {
918 cmd
= HPC_BUS_33CONVMODE
;
921 if (slot_cur
->supported_bus_mode
== BUS_MODE_PCIX
)
922 cmd
= HPC_BUS_66PCIXMODE
;
924 cmd
= HPC_BUS_66CONVMODE
;
927 cmd
= HPC_BUS_100PCIXMODE
;
930 /* This is to take care of the bug in CIOBX chip */
931 while ((dev
= pci_find_device(PCI_VENDOR_ID_SERVERWORKS
,
932 0x0101, dev
)) != NULL
)
933 ibmphp_hpc_writeslot (slot_cur
, HPC_BUS_100PCIXMODE
);
934 cmd
= HPC_BUS_133PCIXMODE
;
937 err ("Wrong bus speed \n");
942 err ("wrong slot speed \n");
945 debug ("setting bus speed for slot %d, cmd %x\n", slot_cur
->number
, cmd
);
946 retval
= ibmphp_hpc_writeslot (slot_cur
, cmd
);
948 err ("setting bus speed failed\n");
951 if (CTLR_RESULT (slot_cur
->ctrl
->status
)) {
952 err ("command not completed successfully in set_bus \n");
956 /* This is for x440, once Brandon fixes the firmware,
957 will not need this delay */
959 debug ("%s -Exit \n", __FUNCTION__
);
963 /* This routine checks the bus limitations that the slot is on from the BIOS.
964 * This is used in deciding whether or not to power up the slot.
965 * (electrical/spec limitations. For example, >1 133 MHz or >2 66 PCI cards on
968 * Returns: 0 = no limitations, -EINVAL = exceeded limitations on the bus
970 static int check_limitations (struct slot
*slot_cur
)
973 struct slot
* tmp_slot
;
977 for (i
= slot_cur
->bus_on
->slot_min
; i
<= slot_cur
->bus_on
->slot_max
; i
++) {
978 tmp_slot
= ibmphp_get_slot_from_physical_num (i
);
981 if ((SLOT_PWRGD (tmp_slot
->status
)) && !(SLOT_CONNECT (tmp_slot
->status
)))
984 get_cur_bus_info (&slot_cur
);
985 switch (slot_cur
->bus_on
->current_speed
) {
987 limitation
= slot_cur
->bus_on
->slots_at_33_conv
;
990 if (slot_cur
->bus_on
->current_bus_mode
== BUS_MODE_PCIX
)
991 limitation
= slot_cur
->bus_on
->slots_at_66_pcix
;
993 limitation
= slot_cur
->bus_on
->slots_at_66_conv
;
996 limitation
= slot_cur
->bus_on
->slots_at_100_pcix
;
999 limitation
= slot_cur
->bus_on
->slots_at_133_pcix
;
1003 if ((count
+ 1) > limitation
)
1008 static inline void print_card_capability (struct slot
*slot_cur
)
1010 info ("capability of the card is ");
1011 if ((slot_cur
->ext_status
& CARD_INFO
) == PCIX133
)
1012 info (" 133 MHz PCI-X \n");
1013 else if ((slot_cur
->ext_status
& CARD_INFO
) == PCIX66
)
1014 info (" 66 MHz PCI-X \n");
1015 else if ((slot_cur
->ext_status
& CARD_INFO
) == PCI66
)
1016 info (" 66 MHz PCI \n");
1018 info (" 33 MHz PCI \n");
1022 /* This routine will power on the slot, configure the device(s) and find the
1024 * Parameters: hotplug_slot
1025 * Returns: 0 or failure codes
1027 static int enable_slot (struct hotplug_slot
*hs
)
1030 struct slot
*slot_cur
;
1032 struct pci_func
*tmp_func
;
1034 ibmphp_lock_operations ();
1036 debug ("ENABLING SLOT........ \n");
1037 slot_cur
= (struct slot
*) hs
->private;
1039 if ((rc
= validate (slot_cur
, ENABLE
))) {
1040 err ("validate function failed \n");
1044 attn_LED_blink (slot_cur
);
1046 rc
= set_bus (slot_cur
);
1048 err ("was not able to set the bus \n");
1052 /*-----------------debugging------------------------------*/
1053 get_cur_bus_info (&slot_cur
);
1054 debug ("the current bus speed right after set_bus = %x \n", slot_cur
->bus_on
->current_speed
);
1055 /*----------------------------------------------------------*/
1057 rc
= check_limitations (slot_cur
);
1059 err ("Adding this card exceeds the limitations of this bus.\n");
1060 err ("(i.e., >1 133MHz cards running on same bus, or "
1061 ">2 66 PCI cards running on same bus\n.");
1062 err ("Try hot-adding into another bus \n");
1067 rc
= power_on (slot_cur
);
1070 err ("something wrong when powering up... please see below for details\n");
1071 /* need to turn off before on, otherwise, blinking overwrites */
1074 if (slot_update (&slot_cur
)) {
1075 attn_off (slot_cur
);
1080 /* Check to see the error of why it failed */
1081 if ((SLOT_POWER (slot_cur
->status
)) && !(SLOT_PWRGD (slot_cur
->status
)))
1082 err ("power fault occurred trying to power up \n");
1083 else if (SLOT_BUS_SPEED (slot_cur
->status
)) {
1084 err ("bus speed mismatch occurred. please check current bus speed and card capability \n");
1085 print_card_capability (slot_cur
);
1086 } else if (SLOT_BUS_MODE (slot_cur
->ext_status
)) {
1087 err ("bus mode mismatch occurred. please check current bus mode and card capability \n");
1088 print_card_capability (slot_cur
);
1090 ibmphp_update_slot_info (slot_cur
);
1093 debug ("after power_on\n");
1094 /*-----------------------debugging---------------------------*/
1095 get_cur_bus_info (&slot_cur
);
1096 debug ("the current bus speed right after power_on = %x \n", slot_cur
->bus_on
->current_speed
);
1097 /*----------------------------------------------------------*/
1099 rc
= slot_update (&slot_cur
);
1104 if (SLOT_POWER (slot_cur
->status
) && !(SLOT_PWRGD (slot_cur
->status
))) {
1105 err ("power fault occurred trying to power up... \n");
1108 if (SLOT_POWER (slot_cur
->status
) && (SLOT_BUS_SPEED (slot_cur
->status
))) {
1109 err ("bus speed mismatch occurred. please check current bus speed and card capability \n");
1110 print_card_capability (slot_cur
);
1113 /* Don't think this case will happen after above checks... but just in case, for paranoia sake */
1114 if (!(SLOT_POWER (slot_cur
->status
))) {
1115 err ("power on failed... \n");
1119 slot_cur
->func
= (struct pci_func
*) kmalloc (sizeof (struct pci_func
), GFP_KERNEL
);
1120 if (!slot_cur
->func
) {
1121 /* We cannot do update_slot_info here, since no memory for
1122 * kmalloc n.e.ways, and update_slot_info allocates some */
1123 err ("out of system memory \n");
1127 memset (slot_cur
->func
, 0, sizeof (struct pci_func
));
1128 slot_cur
->func
->busno
= slot_cur
->bus
;
1129 slot_cur
->func
->device
= slot_cur
->device
;
1130 for (i
= 0; i
< 4; i
++)
1131 slot_cur
->func
->irq
[i
] = slot_cur
->irq
[i
];
1133 debug ("b4 configure_card, slot_cur->bus = %x, slot_cur->device = %x\n", slot_cur
->bus
, slot_cur
->device
);
1135 if (ibmphp_configure_card (slot_cur
->func
, slot_cur
->number
)) {
1136 err ("configure_card was unsuccessful... \n");
1137 ibmphp_unconfigure_card (&slot_cur
, 1); /* true because don't need to actually deallocate resources, just remove references */
1138 debug ("after unconfigure_card\n");
1139 slot_cur
->func
= NULL
;
1146 tmp_func
= ibm_slot_find (slot_cur
->bus
, slot_cur
->func
->device
, function
++);
1147 if (tmp_func
&& !(tmp_func
->dev
))
1148 ibm_configure_device (tmp_func
);
1151 attn_off (slot_cur
);
1152 if (slot_update (&slot_cur
)) {
1156 ibmphp_print_test ();
1157 rc
= ibmphp_update_slot_info (slot_cur
);
1159 ibmphp_unlock_operations();
1163 attn_off (slot_cur
); /* need to turn off if was blinking b4 */
1166 rcpr
= slot_update (&slot_cur
);
1171 ibmphp_update_slot_info (slot_cur
);
1175 attn_off (slot_cur
); /* need to turn off if was blinking b4 */
1177 rcpr
= power_off (slot_cur
);
1185 /**************************************************************
1186 * HOT REMOVING ADAPTER CARD *
1187 * INPUT: POINTER TO THE HOTPLUG SLOT STRUCTURE *
1188 * OUTPUT: SUCCESS 0 ; FAILURE: UNCONFIGURE , VALIDATE *
1190 **************************************************************/
1191 int ibmphp_disable_slot (struct hotplug_slot
*hotplug_slot
)
1193 struct slot
*slot
= hotplug_slot
->private;
1196 ibmphp_lock_operations();
1197 rc
= ibmphp_do_disable_slot(slot
);
1198 ibmphp_unlock_operations();
1202 int ibmphp_do_disable_slot (struct slot
*slot_cur
)
1207 debug ("DISABLING SLOT... \n");
1209 if ((slot_cur
== NULL
) || (slot_cur
->ctrl
== NULL
)) {
1213 flag
= slot_cur
->flag
;
1214 slot_cur
->flag
= TRUE
;
1217 rc
= validate (slot_cur
, DISABLE
); /* checking if powered off already & valid slot # */
1221 attn_LED_blink (slot_cur
);
1223 if (slot_cur
->func
== NULL
) {
1224 /* We need this for fncs's that were there on bootup */
1225 slot_cur
->func
= (struct pci_func
*) kmalloc (sizeof (struct pci_func
), GFP_KERNEL
);
1226 if (!slot_cur
->func
) {
1227 err ("out of system memory \n");
1231 memset (slot_cur
->func
, 0, sizeof (struct pci_func
));
1232 slot_cur
->func
->busno
= slot_cur
->bus
;
1233 slot_cur
->func
->device
= slot_cur
->device
;
1236 if ((rc
= ibm_unconfigure_device (slot_cur
->func
))) {
1237 err ("removing from kernel failed... \n");
1238 err ("Please check to see if it was statically linked or is "
1239 "in use otherwise. (perhaps the driver is not 'hot-removable')\n");
1243 /* If we got here from latch suddenly opening on operating card or
1244 a power fault, there's no power to the card, so cannot
1245 read from it to determine what resources it occupied. This operation
1246 is forbidden anyhow. The best we can do is remove it from kernel
1250 attn_off (slot_cur
);
1254 rc
= ibmphp_unconfigure_card (&slot_cur
, 0);
1255 slot_cur
->func
= NULL
;
1256 debug ("in disable_slot. after unconfigure_card\n");
1258 err ("could not unconfigure card.\n");
1262 rc
= ibmphp_hpc_writeslot (slot_cur
, HPC_SLOT_OFF
);
1266 attn_off (slot_cur
);
1267 rc
= slot_update (&slot_cur
);
1271 rc
= ibmphp_update_slot_info (slot_cur
);
1272 ibmphp_print_test ();
1277 /* Need to turn off if was blinking b4 */
1278 attn_off (slot_cur
);
1280 if (slot_update (&slot_cur
)) {
1285 ibmphp_update_slot_info (slot_cur
);
1289 struct hotplug_slot_ops ibmphp_hotplug_slot_ops
= {
1290 .owner
= THIS_MODULE
,
1291 .set_attention_status
= set_attention_status
,
1292 .enable_slot
= enable_slot
,
1293 .disable_slot
= ibmphp_disable_slot
,
1294 .hardware_test
= NULL
,
1295 .get_power_status
= get_power_status
,
1296 .get_attention_status
= get_attention_status
,
1297 .get_latch_status
= get_latch_status
,
1298 .get_adapter_status
= get_adapter_present
,
1299 .get_max_bus_speed
= get_max_bus_speed
,
1300 .get_cur_bus_speed
= get_cur_bus_speed
,
1301 /* .get_max_adapter_speed = get_max_adapter_speed,
1302 .get_bus_name_status = get_bus_name,
1306 static void ibmphp_unload (void)
1309 debug ("after slots \n");
1310 ibmphp_free_resources ();
1311 debug ("after resources \n");
1312 ibmphp_free_bus_info_queue ();
1313 debug ("after bus info \n");
1314 ibmphp_free_ebda_hpc_queue ();
1315 debug ("after ebda hpc \n");
1316 ibmphp_free_ebda_pci_rsrc_queue ();
1317 debug ("after ebda pci rsrc \n");
1318 kfree (ibmphp_pci_bus
);
1321 static int __init
ibmphp_init (void)
1323 struct pci_bus
*bus
;
1329 info (DRIVER_DESC
" version: " DRIVER_VERSION
"\n");
1331 ibmphp_pci_bus
= kmalloc (sizeof (*ibmphp_pci_bus
), GFP_KERNEL
);
1332 if (!ibmphp_pci_bus
) {
1333 err ("out of memory\n");
1338 bus
= pci_find_bus(0);
1340 err ("Can't find the root pci bus, can not continue\n");
1344 memcpy (ibmphp_pci_bus
, bus
, sizeof (*ibmphp_pci_bus
));
1346 ibmphp_debug
= debug
;
1348 ibmphp_hpc_initvars ();
1350 for (i
= 0; i
< 16; i
++)
1353 if ((rc
= ibmphp_access_ebda ()))
1355 debug ("after ibmphp_access_ebda ()\n");
1357 if ((rc
= ibmphp_rsrc_init ()))
1359 debug ("AFTER Resource & EBDA INITIALIZATIONS\n");
1361 max_slots
= get_max_slots ();
1363 if ((rc
= ibmphp_register_pci ()))
1371 ibmphp_print_test ();
1372 if ((rc
= ibmphp_hpc_start_poll_thread ())) {
1376 /* lock ourselves into memory with a module
1377 * count of -1 so that no one can unload us. */
1378 module_put(THIS_MODULE
);
1388 static void __exit
ibmphp_exit (void)
1390 ibmphp_hpc_stop_poll_thread ();
1391 debug ("after polling\n");
1396 module_init (ibmphp_init
);
1397 module_exit (ibmphp_exit
);