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>
38 #include <asm/pci_x86.h> /* for struct irq_routing_table */
41 #define attn_on(sl) ibmphp_hpc_writeslot (sl, HPC_SLOT_ATTNON)
42 #define attn_off(sl) ibmphp_hpc_writeslot (sl, HPC_SLOT_ATTNOFF)
43 #define attn_LED_blink(sl) ibmphp_hpc_writeslot (sl, HPC_SLOT_BLINKLED)
44 #define get_ctrl_revision(sl, rev) ibmphp_hpc_readslot (sl, READ_REVLEVEL, rev)
45 #define get_hpc_options(sl, opt) ibmphp_hpc_readslot (sl, READ_HPCOPTIONS, opt)
47 #define DRIVER_VERSION "0.6"
48 #define DRIVER_DESC "IBM Hot Plug PCI Controller Driver"
53 module_param(debug
, bool, S_IRUGO
| S_IWUSR
);
54 MODULE_PARM_DESC (debug
, "Debugging mode enabled or not");
55 MODULE_LICENSE ("GPL");
56 MODULE_DESCRIPTION (DRIVER_DESC
);
58 struct pci_bus
*ibmphp_pci_bus
;
61 static int irqs
[16]; /* PIC mode IRQ's we're using so far (in case MPS
62 * 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
=
91 CURRENT_BUS_MODE(slot_cur
->busstatus
);
93 slot_cur
->bus_on
->current_bus_mode
= 0xFF;
95 debug("busstatus = %x, bus_speed = %x, bus_mode = %x\n",
97 slot_cur
->bus_on
->current_speed
,
98 slot_cur
->bus_on
->current_bus_mode
);
104 static inline int slot_update(struct slot
**sl
)
107 rc
= ibmphp_hpc_readslot(*sl
, READ_ALLSTAT
, NULL
);
111 rc
= get_cur_bus_info(sl
);
115 static int __init
get_max_slots (void)
117 struct slot
* slot_cur
;
118 struct list_head
* tmp
;
121 list_for_each(tmp
, &ibmphp_slot_head
) {
122 slot_cur
= list_entry(tmp
, struct slot
, ibm_slot_list
);
123 /* sometimes the hot-pluggable slots start with 4 (not always from 1) */
124 slot_count
= max(slot_count
, slot_cur
->number
);
129 /* This routine will put the correct slot->device information per slot. It's
130 * called from initialization of the slot structures. It will also assign
131 * interrupt numbers per each slot.
132 * Parameters: struct slot
133 * Returns 0 or errors
135 int ibmphp_init_devno(struct slot
**cur_slot
)
137 struct irq_routing_table
*rtable
;
142 rtable
= pcibios_get_irq_routing_table();
144 err("no BIOS routing table...\n");
148 len
= (rtable
->size
- sizeof(struct irq_routing_table
)) /
149 sizeof(struct irq_info
);
155 for (loop
= 0; loop
< len
; loop
++) {
156 if ((*cur_slot
)->number
== rtable
->slots
[loop
].slot
&&
157 (*cur_slot
)->bus
== rtable
->slots
[loop
].bus
) {
158 struct io_apic_irq_attr irq_attr
;
160 (*cur_slot
)->device
= PCI_SLOT(rtable
->slots
[loop
].devfn
);
161 for (i
= 0; i
< 4; i
++)
162 (*cur_slot
)->irq
[i
] = IO_APIC_get_PCI_irq_vector((int) (*cur_slot
)->bus
,
163 (int) (*cur_slot
)->device
, i
,
166 debug("(*cur_slot)->irq[0] = %x\n",
167 (*cur_slot
)->irq
[0]);
168 debug("(*cur_slot)->irq[1] = %x\n",
169 (*cur_slot
)->irq
[1]);
170 debug("(*cur_slot)->irq[2] = %x\n",
171 (*cur_slot
)->irq
[2]);
172 debug("(*cur_slot)->irq[3] = %x\n",
173 (*cur_slot
)->irq
[3]);
175 debug("rtable->exlusive_irqs = %x\n",
176 rtable
->exclusive_irqs
);
177 debug("rtable->slots[loop].irq[0].bitmap = %x\n",
178 rtable
->slots
[loop
].irq
[0].bitmap
);
179 debug("rtable->slots[loop].irq[1].bitmap = %x\n",
180 rtable
->slots
[loop
].irq
[1].bitmap
);
181 debug("rtable->slots[loop].irq[2].bitmap = %x\n",
182 rtable
->slots
[loop
].irq
[2].bitmap
);
183 debug("rtable->slots[loop].irq[3].bitmap = %x\n",
184 rtable
->slots
[loop
].irq
[3].bitmap
);
186 debug("rtable->slots[loop].irq[0].link = %x\n",
187 rtable
->slots
[loop
].irq
[0].link
);
188 debug("rtable->slots[loop].irq[1].link = %x\n",
189 rtable
->slots
[loop
].irq
[1].link
);
190 debug("rtable->slots[loop].irq[2].link = %x\n",
191 rtable
->slots
[loop
].irq
[2].link
);
192 debug("rtable->slots[loop].irq[3].link = %x\n",
193 rtable
->slots
[loop
].irq
[3].link
);
194 debug("end of init_devno\n");
204 static inline int power_on(struct slot
*slot_cur
)
206 u8 cmd
= HPC_SLOT_ON
;
209 retval
= ibmphp_hpc_writeslot(slot_cur
, cmd
);
211 err("power on failed\n");
214 if (CTLR_RESULT(slot_cur
->ctrl
->status
)) {
215 err("command not completed successfully in power_on\n");
218 msleep(3000); /* For ServeRAID cards, and some 66 PCI */
222 static inline int power_off(struct slot
*slot_cur
)
224 u8 cmd
= HPC_SLOT_OFF
;
227 retval
= ibmphp_hpc_writeslot(slot_cur
, cmd
);
229 err("power off failed\n");
232 if (CTLR_RESULT(slot_cur
->ctrl
->status
)) {
233 err("command not completed successfully in power_off\n");
239 static int set_attention_status(struct hotplug_slot
*hotplug_slot
, u8 value
)
243 u8 cmd
= 0x00; /* avoid compiler warning */
245 debug("set_attention_status - Entry hotplug_slot[%lx] value[%x]\n",
246 (ulong
) hotplug_slot
, value
);
247 ibmphp_lock_operations();
252 case HPC_SLOT_ATTN_OFF
:
253 cmd
= HPC_SLOT_ATTNOFF
;
255 case HPC_SLOT_ATTN_ON
:
256 cmd
= HPC_SLOT_ATTNON
;
258 case HPC_SLOT_ATTN_BLINK
:
259 cmd
= HPC_SLOT_BLINKLED
;
263 err("set_attention_status - Error : invalid input [%x]\n",
268 pslot
= hotplug_slot
->private;
270 rc
= ibmphp_hpc_writeslot(pslot
, cmd
);
277 ibmphp_unlock_operations();
279 debug("set_attention_status - Exit rc[%d]\n", rc
);
283 static int get_attention_status(struct hotplug_slot
*hotplug_slot
, u8
* value
)
289 debug("get_attention_status - Entry hotplug_slot[%lx] pvalue[%lx]\n",
290 (ulong
) hotplug_slot
, (ulong
) value
);
292 ibmphp_lock_operations();
294 pslot
= hotplug_slot
->private;
296 memcpy(&myslot
, pslot
, sizeof(struct slot
));
297 rc
= ibmphp_hpc_readslot(pslot
, READ_SLOTSTATUS
,
300 rc
= ibmphp_hpc_readslot(pslot
,
302 &(myslot
.ext_status
));
304 *value
= SLOT_ATTN(myslot
.status
,
309 ibmphp_unlock_operations();
310 debug("get_attention_status - Exit rc[%d] value[%x]\n", rc
, *value
);
314 static int get_latch_status(struct hotplug_slot
*hotplug_slot
, u8
* value
)
320 debug("get_latch_status - Entry hotplug_slot[%lx] pvalue[%lx]\n",
321 (ulong
) hotplug_slot
, (ulong
) value
);
322 ibmphp_lock_operations();
324 pslot
= hotplug_slot
->private;
326 memcpy(&myslot
, pslot
, sizeof(struct slot
));
327 rc
= ibmphp_hpc_readslot(pslot
, READ_SLOTSTATUS
,
330 *value
= SLOT_LATCH(myslot
.status
);
334 ibmphp_unlock_operations();
335 debug("get_latch_status - Exit rc[%d] rc[%x] value[%x]\n",
341 static int get_power_status(struct hotplug_slot
*hotplug_slot
, u8
* value
)
347 debug("get_power_status - Entry hotplug_slot[%lx] pvalue[%lx]\n",
348 (ulong
) hotplug_slot
, (ulong
) value
);
349 ibmphp_lock_operations();
351 pslot
= hotplug_slot
->private;
353 memcpy(&myslot
, pslot
, sizeof(struct slot
));
354 rc
= ibmphp_hpc_readslot(pslot
, READ_SLOTSTATUS
,
357 *value
= SLOT_PWRGD(myslot
.status
);
361 ibmphp_unlock_operations();
362 debug("get_power_status - Exit rc[%d] rc[%x] value[%x]\n",
367 static int get_adapter_present(struct hotplug_slot
*hotplug_slot
, u8
* value
)
374 debug("get_adapter_status - Entry hotplug_slot[%lx] pvalue[%lx]\n",
375 (ulong
) hotplug_slot
, (ulong
) value
);
376 ibmphp_lock_operations();
378 pslot
= hotplug_slot
->private;
380 memcpy(&myslot
, pslot
, sizeof(struct slot
));
381 rc
= ibmphp_hpc_readslot(pslot
, READ_SLOTSTATUS
,
384 present
= SLOT_PRESENT(myslot
.status
);
385 if (present
== HPC_SLOT_EMPTY
)
393 ibmphp_unlock_operations();
394 debug("get_adapter_present - Exit rc[%d] value[%x]\n", rc
, *value
);
398 static int get_max_bus_speed(struct hotplug_slot
*hotplug_slot
, enum pci_bus_speed
*value
)
404 debug("%s - Entry hotplug_slot[%p] pvalue[%p]\n", __func__
,
405 hotplug_slot
, value
);
407 ibmphp_lock_operations();
410 pslot
= hotplug_slot
->private;
413 mode
= pslot
->supported_bus_mode
;
414 *value
= pslot
->supported_speed
;
419 if (mode
== BUS_MODE_PCIX
)
424 *value
= pslot
->supported_speed
+ 0x01;
427 /* Note (will need to change): there would be soon 256, 512 also */
433 ibmphp_unlock_operations();
434 debug("%s - Exit rc[%d] value[%x]\n", __func__
, rc
, *value
);
438 static int get_cur_bus_speed(struct hotplug_slot
*hotplug_slot
, enum pci_bus_speed
*value
)
444 debug("%s - Entry hotplug_slot[%p] pvalue[%p]\n", __func__
,
445 hotplug_slot
, value
);
447 ibmphp_lock_operations();
450 pslot
= hotplug_slot
->private;
452 rc
= get_cur_bus_info(&pslot
);
454 mode
= pslot
->bus_on
->current_bus_mode
;
455 *value
= pslot
->bus_on
->current_speed
;
460 if (mode
== BUS_MODE_PCIX
)
462 else if (mode
== BUS_MODE_PCI
)
465 *value
= PCI_SPEED_UNKNOWN
;
472 /* Note of change: there would also be 256, 512 soon */
479 ibmphp_unlock_operations();
480 debug("%s - Exit rc[%d] value[%x]\n", __func__
, rc
, *value
);
485 static int get_max_adapter_speed_1(struct hotplug_slot *hotplug_slot, u8 * value, u8 flag)
491 debug("get_max_adapter_speed_1 - Entry hotplug_slot[%lx] pvalue[%lx]\n",
492 (ulong)hotplug_slot, (ulong) value);
495 ibmphp_lock_operations();
497 if (hotplug_slot && value) {
498 pslot = hotplug_slot->private;
500 memcpy(&myslot, pslot, sizeof(struct slot));
501 rc = ibmphp_hpc_readslot(pslot, READ_SLOTSTATUS,
504 if (!(SLOT_LATCH (myslot.status)) &&
505 (SLOT_PRESENT (myslot.status))) {
506 rc = ibmphp_hpc_readslot(pslot,
508 &(myslot.ext_status));
510 *value = SLOT_SPEED(myslot.ext_status);
512 *value = MAX_ADAPTER_NONE;
517 ibmphp_unlock_operations();
519 debug("get_max_adapter_speed_1 - Exit rc[%d] value[%x]\n", rc, *value);
523 static int get_bus_name(struct hotplug_slot *hotplug_slot, char * value)
526 struct slot *pslot = NULL;
528 debug("get_bus_name - Entry hotplug_slot[%lx]\n", (ulong)hotplug_slot);
530 ibmphp_lock_operations();
533 pslot = hotplug_slot->private;
536 snprintf(value, 100, "Bus %x", pslot->bus);
541 ibmphp_unlock_operations();
542 debug("get_bus_name - Exit rc[%d] value[%x]\n", rc, *value);
547 /****************************************************************************
548 * This routine will initialize the ops data structure used in the validate
549 * function. It will also power off empty slots that are powered on since BIOS
550 * leaves those on, albeit disconnected
551 ****************************************************************************/
552 static int __init
init_ops(void)
554 struct slot
*slot_cur
;
555 struct list_head
*tmp
;
559 list_for_each(tmp
, &ibmphp_slot_head
) {
560 slot_cur
= list_entry(tmp
, struct slot
, ibm_slot_list
);
565 debug("BEFORE GETTING SLOT STATUS, slot # %x\n",
567 if (slot_cur
->ctrl
->revision
== 0xFF)
568 if (get_ctrl_revision(slot_cur
,
569 &slot_cur
->ctrl
->revision
))
572 if (slot_cur
->bus_on
->current_speed
== 0xFF)
573 if (get_cur_bus_info(&slot_cur
))
576 if (slot_cur
->ctrl
->options
== 0xFF)
577 if (get_hpc_options(slot_cur
, &slot_cur
->ctrl
->options
))
580 retval
= slot_update(&slot_cur
);
584 debug("status = %x\n", slot_cur
->status
);
585 debug("ext_status = %x\n", slot_cur
->ext_status
);
586 debug("SLOT_POWER = %x\n", SLOT_POWER(slot_cur
->status
));
587 debug("SLOT_PRESENT = %x\n", SLOT_PRESENT(slot_cur
->status
));
588 debug("SLOT_LATCH = %x\n", SLOT_LATCH(slot_cur
->status
));
590 if ((SLOT_PWRGD(slot_cur
->status
)) &&
591 !(SLOT_PRESENT(slot_cur
->status
)) &&
592 !(SLOT_LATCH(slot_cur
->status
))) {
593 debug("BEFORE POWER OFF COMMAND\n");
594 rc
= power_off(slot_cur
);
598 /* retval = slot_update(&slot_cur);
601 * ibmphp_update_slot_info(slot_cur);
609 /* This operation will check whether the slot is within the bounds and
610 * the operation is valid to perform on that slot
611 * Parameters: slot, operation
612 * Returns: 0 or error codes
614 static int validate(struct slot
*slot_cur
, int opn
)
621 number
= slot_cur
->number
;
622 if ((number
> max_slots
) || (number
< 0))
624 debug("slot_number in validate is %d\n", slot_cur
->number
);
626 retval
= slot_update(&slot_cur
);
632 if (!(SLOT_PWRGD(slot_cur
->status
)) &&
633 (SLOT_PRESENT(slot_cur
->status
)) &&
634 !(SLOT_LATCH(slot_cur
->status
)))
638 if ((SLOT_PWRGD(slot_cur
->status
)) &&
639 (SLOT_PRESENT(slot_cur
->status
)) &&
640 !(SLOT_LATCH(slot_cur
->status
)))
646 err("validate failed....\n");
650 /****************************************************************************
651 * This routine is for updating the data structures in the hotplug core
652 * Parameters: struct slot
653 * Returns: 0 or error
654 ****************************************************************************/
655 int ibmphp_update_slot_info(struct slot
*slot_cur
)
657 struct hotplug_slot_info
*info
;
662 info
= kmalloc(sizeof(struct hotplug_slot_info
), GFP_KERNEL
);
664 err("out of system memory\n");
668 info
->power_status
= SLOT_PWRGD(slot_cur
->status
);
669 info
->attention_status
= SLOT_ATTN(slot_cur
->status
,
670 slot_cur
->ext_status
);
671 info
->latch_status
= SLOT_LATCH(slot_cur
->status
);
672 if (!SLOT_PRESENT(slot_cur
->status
)) {
673 info
->adapter_status
= 0;
674 /* info->max_adapter_speed_status = MAX_ADAPTER_NONE; */
676 info
->adapter_status
= 1;
677 /* get_max_adapter_speed_1(slot_cur->hotplug_slot,
678 &info->max_adapter_speed_status, 0); */
681 bus_speed
= slot_cur
->bus_on
->current_speed
;
682 mode
= slot_cur
->bus_on
->current_bus_mode
;
688 if (mode
== BUS_MODE_PCIX
)
690 else if (mode
== BUS_MODE_PCI
)
693 bus_speed
= PCI_SPEED_UNKNOWN
;
700 bus_speed
= PCI_SPEED_UNKNOWN
;
703 info
->cur_bus_speed
= bus_speed
;
704 info
->max_bus_speed
= slot_cur
->hotplug_slot
->info
->max_bus_speed
;
707 rc
= pci_hp_change_slot_info(slot_cur
->hotplug_slot
, info
);
713 /******************************************************************************
714 * This function will return the pci_func, given bus and devfunc, or NULL. It
715 * is called from visit routines
716 ******************************************************************************/
718 static struct pci_func
*ibm_slot_find(u8 busno
, u8 device
, u8 function
)
720 struct pci_func
*func_cur
;
721 struct slot
*slot_cur
;
722 struct list_head
* tmp
;
723 list_for_each(tmp
, &ibmphp_slot_head
) {
724 slot_cur
= list_entry(tmp
, struct slot
, ibm_slot_list
);
725 if (slot_cur
->func
) {
726 func_cur
= slot_cur
->func
;
728 if ((func_cur
->busno
== busno
) &&
729 (func_cur
->device
== device
) &&
730 (func_cur
->function
== function
))
732 func_cur
= func_cur
->next
;
739 /*************************************************************
740 * This routine frees up memory used by struct slot, including
741 * the pointers to pci_func, bus, hotplug_slot, controller,
742 * and deregistering from the hotplug core
743 *************************************************************/
744 static void free_slots(void)
746 struct slot
*slot_cur
;
747 struct list_head
* tmp
;
748 struct list_head
* next
;
750 debug("%s -- enter\n", __func__
);
752 list_for_each_safe(tmp
, next
, &ibmphp_slot_head
) {
753 slot_cur
= list_entry(tmp
, struct slot
, ibm_slot_list
);
754 pci_hp_deregister(slot_cur
->hotplug_slot
);
756 debug("%s -- exit\n", __func__
);
759 static void ibm_unconfigure_device(struct pci_func
*func
)
761 struct pci_dev
*temp
;
764 debug("inside %s\n", __func__
);
765 debug("func->device = %x, func->function = %x\n",
766 func
->device
, func
->function
);
767 debug("func->device << 3 | 0x0 = %x\n", func
->device
<< 3 | 0x0);
769 for (j
= 0; j
< 0x08; j
++) {
770 temp
= pci_get_bus_and_slot(func
->busno
, (func
->device
<< 3) | j
);
772 pci_remove_bus_device(temp
);
776 pci_dev_put(func
->dev
);
780 * The following function is to fix kernel bug regarding
781 * getting bus entries, here we manually add those primary
782 * bus entries to kernel bus structure whenever apply
784 static u8
bus_structure_fixup(u8 busno
)
790 if (pci_find_bus(0, busno
) || !(ibmphp_find_same_bus_num(busno
)))
793 bus
= kmalloc(sizeof(*bus
), GFP_KERNEL
);
795 err("%s - out of memory\n", __func__
);
798 dev
= kmalloc(sizeof(*dev
), GFP_KERNEL
);
801 err("%s - out of memory\n", __func__
);
806 bus
->ops
= ibmphp_pci_bus
->ops
;
808 for (dev
->devfn
= 0; dev
->devfn
< 256; dev
->devfn
+= 8) {
809 if (!pci_read_config_word(dev
, PCI_VENDOR_ID
, &l
) &&
810 (l
!= 0x0000) && (l
!= 0xffff)) {
811 debug("%s - Inside bus_struture_fixup()\n",
813 pci_scan_bus(busno
, ibmphp_pci_bus
->ops
, NULL
);
824 static int ibm_configure_device(struct pci_func
*func
)
827 struct pci_bus
*child
;
829 int flag
= 0; /* this is to make sure we don't double scan the bus,
830 for bridged devices primarily */
832 if (!(bus_structure_fixup(func
->busno
)))
834 if (func
->dev
== NULL
)
835 func
->dev
= pci_get_bus_and_slot(func
->busno
,
836 PCI_DEVFN(func
->device
, func
->function
));
838 if (func
->dev
== NULL
) {
839 struct pci_bus
*bus
= pci_find_bus(0, func
->busno
);
843 num
= pci_scan_slot(bus
,
844 PCI_DEVFN(func
->device
, func
->function
));
846 pci_bus_add_devices(bus
);
848 func
->dev
= pci_get_bus_and_slot(func
->busno
,
849 PCI_DEVFN(func
->device
, func
->function
));
850 if (func
->dev
== NULL
) {
851 err("ERROR... : pci_dev still NULL\n");
855 if (!(flag
) && (func
->dev
->hdr_type
== PCI_HEADER_TYPE_BRIDGE
)) {
856 pci_read_config_byte(func
->dev
, PCI_SECONDARY_BUS
, &bus
);
857 child
= pci_add_new_bus(func
->dev
->bus
, func
->dev
, bus
);
858 pci_do_scan_bus(child
);
864 /*******************************************************
865 * Returns whether the bus is empty or not
866 *******************************************************/
867 static int is_bus_empty(struct slot
* slot_cur
)
870 struct slot
* tmp_slot
;
871 u8 i
= slot_cur
->bus_on
->slot_min
;
873 while (i
<= slot_cur
->bus_on
->slot_max
) {
874 if (i
== slot_cur
->number
) {
878 tmp_slot
= ibmphp_get_slot_from_physical_num(i
);
881 rc
= slot_update(&tmp_slot
);
884 if (SLOT_PRESENT(tmp_slot
->status
) &&
885 SLOT_PWRGD(tmp_slot
->status
))
892 /***********************************************************
893 * If the HPC permits and the bus currently empty, tries to set the
894 * bus speed and mode at the maximum card and bus capability
896 * Returns: bus is set (0) or error code
897 ***********************************************************/
898 static int set_bus(struct slot
* slot_cur
)
904 static struct pci_device_id ciobx
[] = {
905 { PCI_DEVICE(PCI_VENDOR_ID_SERVERWORKS
, 0x0101) },
909 debug("%s - entry slot # %d\n", __func__
, slot_cur
->number
);
910 if (SET_BUS_STATUS(slot_cur
->ctrl
) && is_bus_empty(slot_cur
)) {
911 rc
= slot_update(&slot_cur
);
914 speed
= SLOT_SPEED(slot_cur
->ext_status
);
915 debug("ext_status = %x, speed = %x\n", slot_cur
->ext_status
, speed
);
917 case HPC_SLOT_SPEED_33
:
918 cmd
= HPC_BUS_33CONVMODE
;
920 case HPC_SLOT_SPEED_66
:
921 if (SLOT_PCIX(slot_cur
->ext_status
)) {
922 if ((slot_cur
->supported_speed
>= BUS_SPEED_66
) &&
923 (slot_cur
->supported_bus_mode
== BUS_MODE_PCIX
))
924 cmd
= HPC_BUS_66PCIXMODE
;
925 else if (!SLOT_BUS_MODE(slot_cur
->ext_status
))
926 /* if max slot/bus capability is 66 pci
927 and there's no bus mode mismatch, then
928 the adapter supports 66 pci */
929 cmd
= HPC_BUS_66CONVMODE
;
931 cmd
= HPC_BUS_33CONVMODE
;
933 if (slot_cur
->supported_speed
>= BUS_SPEED_66
)
934 cmd
= HPC_BUS_66CONVMODE
;
936 cmd
= HPC_BUS_33CONVMODE
;
939 case HPC_SLOT_SPEED_133
:
940 switch (slot_cur
->supported_speed
) {
942 cmd
= HPC_BUS_33CONVMODE
;
945 if (slot_cur
->supported_bus_mode
== BUS_MODE_PCIX
)
946 cmd
= HPC_BUS_66PCIXMODE
;
948 cmd
= HPC_BUS_66CONVMODE
;
951 cmd
= HPC_BUS_100PCIXMODE
;
954 /* This is to take care of the bug in CIOBX chip */
955 if (pci_dev_present(ciobx
))
956 ibmphp_hpc_writeslot(slot_cur
,
957 HPC_BUS_100PCIXMODE
);
958 cmd
= HPC_BUS_133PCIXMODE
;
961 err("Wrong bus speed\n");
966 err("wrong slot speed\n");
969 debug("setting bus speed for slot %d, cmd %x\n",
970 slot_cur
->number
, cmd
);
971 retval
= ibmphp_hpc_writeslot(slot_cur
, cmd
);
973 err("setting bus speed failed\n");
976 if (CTLR_RESULT(slot_cur
->ctrl
->status
)) {
977 err("command not completed successfully in set_bus\n");
981 /* This is for x440, once Brandon fixes the firmware,
982 will not need this delay */
984 debug("%s -Exit\n", __func__
);
988 /* This routine checks the bus limitations that the slot is on from the BIOS.
989 * This is used in deciding whether or not to power up the slot.
990 * (electrical/spec limitations. For example, >1 133 MHz or >2 66 PCI cards on
993 * Returns: 0 = no limitations, -EINVAL = exceeded limitations on the bus
995 static int check_limitations(struct slot
*slot_cur
)
998 struct slot
* tmp_slot
;
1002 for (i
= slot_cur
->bus_on
->slot_min
; i
<= slot_cur
->bus_on
->slot_max
; i
++) {
1003 tmp_slot
= ibmphp_get_slot_from_physical_num(i
);
1006 if ((SLOT_PWRGD(tmp_slot
->status
)) &&
1007 !(SLOT_CONNECT(tmp_slot
->status
)))
1010 get_cur_bus_info(&slot_cur
);
1011 switch (slot_cur
->bus_on
->current_speed
) {
1013 limitation
= slot_cur
->bus_on
->slots_at_33_conv
;
1016 if (slot_cur
->bus_on
->current_bus_mode
== BUS_MODE_PCIX
)
1017 limitation
= slot_cur
->bus_on
->slots_at_66_pcix
;
1019 limitation
= slot_cur
->bus_on
->slots_at_66_conv
;
1022 limitation
= slot_cur
->bus_on
->slots_at_100_pcix
;
1025 limitation
= slot_cur
->bus_on
->slots_at_133_pcix
;
1029 if ((count
+ 1) > limitation
)
1034 static inline void print_card_capability(struct slot
*slot_cur
)
1036 info("capability of the card is ");
1037 if ((slot_cur
->ext_status
& CARD_INFO
) == PCIX133
)
1038 info(" 133 MHz PCI-X\n");
1039 else if ((slot_cur
->ext_status
& CARD_INFO
) == PCIX66
)
1040 info(" 66 MHz PCI-X\n");
1041 else if ((slot_cur
->ext_status
& CARD_INFO
) == PCI66
)
1042 info(" 66 MHz PCI\n");
1044 info(" 33 MHz PCI\n");
1048 /* This routine will power on the slot, configure the device(s) and find the
1050 * Parameters: hotplug_slot
1051 * Returns: 0 or failure codes
1053 static int enable_slot(struct hotplug_slot
*hs
)
1056 struct slot
*slot_cur
;
1058 struct pci_func
*tmp_func
;
1060 ibmphp_lock_operations();
1062 debug("ENABLING SLOT........\n");
1063 slot_cur
= hs
->private;
1065 if ((rc
= validate(slot_cur
, ENABLE
))) {
1066 err("validate function failed\n");
1070 attn_LED_blink(slot_cur
);
1072 rc
= set_bus(slot_cur
);
1074 err("was not able to set the bus\n");
1078 /*-----------------debugging------------------------------*/
1079 get_cur_bus_info(&slot_cur
);
1080 debug("the current bus speed right after set_bus = %x\n",
1081 slot_cur
->bus_on
->current_speed
);
1082 /*----------------------------------------------------------*/
1084 rc
= check_limitations(slot_cur
);
1086 err("Adding this card exceeds the limitations of this bus.\n");
1087 err("(i.e., >1 133MHz cards running on same bus, or "
1088 ">2 66 PCI cards running on same bus.\n");
1089 err("Try hot-adding into another bus\n");
1094 rc
= power_on(slot_cur
);
1097 err("something wrong when powering up... please see below for details\n");
1098 /* need to turn off before on, otherwise, blinking overwrites */
1101 if (slot_update(&slot_cur
)) {
1107 /* Check to see the error of why it failed */
1108 if ((SLOT_POWER(slot_cur
->status
)) &&
1109 !(SLOT_PWRGD(slot_cur
->status
)))
1110 err("power fault occurred trying to power up\n");
1111 else if (SLOT_BUS_SPEED(slot_cur
->status
)) {
1112 err("bus speed mismatch occurred. please check "
1113 "current bus speed and card capability\n");
1114 print_card_capability(slot_cur
);
1115 } else if (SLOT_BUS_MODE(slot_cur
->ext_status
)) {
1116 err("bus mode mismatch occurred. please check "
1117 "current bus mode and card capability\n");
1118 print_card_capability(slot_cur
);
1120 ibmphp_update_slot_info(slot_cur
);
1123 debug("after power_on\n");
1124 /*-----------------------debugging---------------------------*/
1125 get_cur_bus_info(&slot_cur
);
1126 debug("the current bus speed right after power_on = %x\n",
1127 slot_cur
->bus_on
->current_speed
);
1128 /*----------------------------------------------------------*/
1130 rc
= slot_update(&slot_cur
);
1135 if (SLOT_POWER(slot_cur
->status
) && !(SLOT_PWRGD(slot_cur
->status
))) {
1136 err("power fault occurred trying to power up...\n");
1139 if (SLOT_POWER(slot_cur
->status
) && (SLOT_BUS_SPEED(slot_cur
->status
))) {
1140 err("bus speed mismatch occurred. please check current bus "
1141 "speed and card capability\n");
1142 print_card_capability(slot_cur
);
1145 /* Don't think this case will happen after above checks...
1146 * but just in case, for paranoia sake */
1147 if (!(SLOT_POWER(slot_cur
->status
))) {
1148 err("power on failed...\n");
1152 slot_cur
->func
= kzalloc(sizeof(struct pci_func
), GFP_KERNEL
);
1153 if (!slot_cur
->func
) {
1154 /* We cannot do update_slot_info here, since no memory for
1155 * kmalloc n.e.ways, and update_slot_info allocates some */
1156 err("out of system memory\n");
1160 slot_cur
->func
->busno
= slot_cur
->bus
;
1161 slot_cur
->func
->device
= slot_cur
->device
;
1162 for (i
= 0; i
< 4; i
++)
1163 slot_cur
->func
->irq
[i
] = slot_cur
->irq
[i
];
1165 debug("b4 configure_card, slot_cur->bus = %x, slot_cur->device = %x\n",
1166 slot_cur
->bus
, slot_cur
->device
);
1168 if (ibmphp_configure_card(slot_cur
->func
, slot_cur
->number
)) {
1169 err("configure_card was unsuccessful...\n");
1170 /* true because don't need to actually deallocate resources,
1171 * just remove references */
1172 ibmphp_unconfigure_card(&slot_cur
, 1);
1173 debug("after unconfigure_card\n");
1174 slot_cur
->func
= NULL
;
1181 tmp_func
= ibm_slot_find(slot_cur
->bus
, slot_cur
->func
->device
,
1183 if (tmp_func
&& !(tmp_func
->dev
))
1184 ibm_configure_device(tmp_func
);
1188 if (slot_update(&slot_cur
)) {
1192 ibmphp_print_test();
1193 rc
= ibmphp_update_slot_info(slot_cur
);
1195 ibmphp_unlock_operations();
1199 attn_off(slot_cur
); /* need to turn off if was blinking b4 */
1202 rcpr
= slot_update(&slot_cur
);
1207 ibmphp_update_slot_info(slot_cur
);
1211 attn_off(slot_cur
); /* need to turn off if was blinking b4 */
1213 rcpr
= power_off(slot_cur
);
1221 /**************************************************************
1222 * HOT REMOVING ADAPTER CARD *
1223 * INPUT: POINTER TO THE HOTPLUG SLOT STRUCTURE *
1224 * OUTPUT: SUCCESS 0 ; FAILURE: UNCONFIGURE , VALIDATE *
1226 **************************************************************/
1227 static int ibmphp_disable_slot(struct hotplug_slot
*hotplug_slot
)
1229 struct slot
*slot
= hotplug_slot
->private;
1232 ibmphp_lock_operations();
1233 rc
= ibmphp_do_disable_slot(slot
);
1234 ibmphp_unlock_operations();
1238 int ibmphp_do_disable_slot(struct slot
*slot_cur
)
1243 debug("DISABLING SLOT...\n");
1245 if ((slot_cur
== NULL
) || (slot_cur
->ctrl
== NULL
)) {
1249 flag
= slot_cur
->flag
;
1253 rc
= validate(slot_cur
, DISABLE
);
1254 /* checking if powered off already & valid slot # */
1258 attn_LED_blink(slot_cur
);
1260 if (slot_cur
->func
== NULL
) {
1261 /* We need this for fncs's that were there on bootup */
1262 slot_cur
->func
= kzalloc(sizeof(struct pci_func
), GFP_KERNEL
);
1263 if (!slot_cur
->func
) {
1264 err("out of system memory\n");
1268 slot_cur
->func
->busno
= slot_cur
->bus
;
1269 slot_cur
->func
->device
= slot_cur
->device
;
1272 ibm_unconfigure_device(slot_cur
->func
);
1274 /* If we got here from latch suddenly opening on operating card or
1275 a power fault, there's no power to the card, so cannot
1276 read from it to determine what resources it occupied. This operation
1277 is forbidden anyhow. The best we can do is remove it from kernel
1285 rc
= ibmphp_unconfigure_card(&slot_cur
, 0);
1286 slot_cur
->func
= NULL
;
1287 debug("in disable_slot. after unconfigure_card\n");
1289 err("could not unconfigure card.\n");
1293 rc
= ibmphp_hpc_writeslot(slot_cur
, HPC_SLOT_OFF
);
1298 rc
= slot_update(&slot_cur
);
1302 rc
= ibmphp_update_slot_info(slot_cur
);
1303 ibmphp_print_test();
1308 /* Need to turn off if was blinking b4 */
1311 if (slot_update(&slot_cur
)) {
1316 ibmphp_update_slot_info(slot_cur
);
1320 struct hotplug_slot_ops ibmphp_hotplug_slot_ops
= {
1321 .set_attention_status
= set_attention_status
,
1322 .enable_slot
= enable_slot
,
1323 .disable_slot
= ibmphp_disable_slot
,
1324 .hardware_test
= NULL
,
1325 .get_power_status
= get_power_status
,
1326 .get_attention_status
= get_attention_status
,
1327 .get_latch_status
= get_latch_status
,
1328 .get_adapter_status
= get_adapter_present
,
1329 .get_max_bus_speed
= get_max_bus_speed
,
1330 .get_cur_bus_speed
= get_cur_bus_speed
,
1331 /* .get_max_adapter_speed = get_max_adapter_speed,
1332 .get_bus_name_status = get_bus_name,
1336 static void ibmphp_unload(void)
1339 debug("after slots\n");
1340 ibmphp_free_resources();
1341 debug("after resources\n");
1342 ibmphp_free_bus_info_queue();
1343 debug("after bus info\n");
1344 ibmphp_free_ebda_hpc_queue();
1345 debug("after ebda hpc\n");
1346 ibmphp_free_ebda_pci_rsrc_queue();
1347 debug("after ebda pci rsrc\n");
1348 kfree(ibmphp_pci_bus
);
1351 static int __init
ibmphp_init(void)
1353 struct pci_bus
*bus
;
1359 info(DRIVER_DESC
" version: " DRIVER_VERSION
"\n");
1361 ibmphp_pci_bus
= kmalloc(sizeof(*ibmphp_pci_bus
), GFP_KERNEL
);
1362 if (!ibmphp_pci_bus
) {
1363 err("out of memory\n");
1368 bus
= pci_find_bus(0, 0);
1370 err("Can't find the root pci bus, can not continue\n");
1374 memcpy(ibmphp_pci_bus
, bus
, sizeof(*ibmphp_pci_bus
));
1376 ibmphp_debug
= debug
;
1378 ibmphp_hpc_initvars();
1380 for (i
= 0; i
< 16; i
++)
1383 if ((rc
= ibmphp_access_ebda()))
1385 debug("after ibmphp_access_ebda()\n");
1387 if ((rc
= ibmphp_rsrc_init()))
1389 debug("AFTER Resource & EBDA INITIALIZATIONS\n");
1391 max_slots
= get_max_slots();
1393 if ((rc
= ibmphp_register_pci()))
1401 ibmphp_print_test();
1402 if ((rc
= ibmphp_hpc_start_poll_thread())) {
1414 static void __exit
ibmphp_exit(void)
1416 ibmphp_hpc_stop_poll_thread();
1417 debug("after polling\n");
1422 module_init(ibmphp_init
);
1423 module_exit(ibmphp_exit
);