2 * PCI Express Hot Plug Controller Driver
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 * Copyright (C) 2003-2004 Intel Corporation
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 <greg@kroah.com>, <kristen.c.accardi@intel.com>
30 #include <linux/config.h>
31 #include <linux/module.h>
32 #include <linux/kernel.h>
33 #include <linux/types.h>
34 #include <linux/slab.h>
35 #include <linux/workqueue.h>
36 #include <linux/interrupt.h>
37 #include <linux/delay.h>
38 #include <linux/wait.h>
39 #include <linux/smp_lock.h>
40 #include <linux/pci.h>
45 static u32
configure_new_device(struct controller
*ctrl
, struct pci_func
*func
,
46 u8 behind_bridge
, struct resource_lists
*resources
, u8 bridge_bus
, u8 bridge_dev
);
47 static int configure_new_function( struct controller
*ctrl
, struct pci_func
*func
,
48 u8 behind_bridge
, struct resource_lists
*resources
, u8 bridge_bus
, u8 bridge_dev
);
49 static void interrupt_event_handler(struct controller
*ctrl
);
51 static struct semaphore event_semaphore
; /* mutex for process loop (up if something to process) */
52 static struct semaphore event_exit
; /* guard ensure thread has exited before calling it quits */
53 static int event_finished
;
54 static unsigned long pushbutton_pending
; /* = 0 */
55 static unsigned long surprise_rm_pending
; /* = 0 */
57 u8
pciehp_handle_attention_button(u8 hp_slot
, void *inst_id
)
59 struct controller
*ctrl
= (struct controller
*) inst_id
;
63 struct pci_func
*func
;
64 struct event_info
*taskInfo
;
66 /* Attention Button Change */
67 dbg("pciehp: Attention button interrupt received.\n");
69 func
= pciehp_slot_find(ctrl
->slot_bus
, (hp_slot
+ ctrl
->slot_device_offset
), 0);
71 /* This is the structure that tells the worker thread what to do */
72 taskInfo
= &(ctrl
->event_queue
[ctrl
->next_event
]);
73 p_slot
= pciehp_find_slot(ctrl
, hp_slot
+ ctrl
->slot_device_offset
);
75 p_slot
->hpc_ops
->get_adapter_status(p_slot
, &(func
->presence_save
));
76 p_slot
->hpc_ops
->get_latch_status(p_slot
, &getstatus
);
78 ctrl
->next_event
= (ctrl
->next_event
+ 1) % 10;
79 taskInfo
->hp_slot
= hp_slot
;
84 * Button pressed - See if need to TAKE ACTION!!!
86 info("Button pressed on Slot(%d)\n", ctrl
->first_slot
+ hp_slot
);
87 taskInfo
->event_type
= INT_BUTTON_PRESS
;
89 if ((p_slot
->state
== BLINKINGON_STATE
)
90 || (p_slot
->state
== BLINKINGOFF_STATE
)) {
91 /* Cancel if we are still blinking; this means that we press the
92 * attention again before the 5 sec. limit expires to cancel hot-add
95 taskInfo
->event_type
= INT_BUTTON_CANCEL
;
96 info("Button cancel on Slot(%d)\n", ctrl
->first_slot
+ hp_slot
);
97 } else if ((p_slot
->state
== POWERON_STATE
)
98 || (p_slot
->state
== POWEROFF_STATE
)) {
99 /* Ignore if the slot is on power-on or power-off state; this
100 * means that the previous attention button action to hot-add or
101 * hot-remove is undergoing
103 taskInfo
->event_type
= INT_BUTTON_IGNORE
;
104 info("Button ignore on Slot(%d)\n", ctrl
->first_slot
+ hp_slot
);
108 up(&event_semaphore
); /* signal event thread that new event is posted */
114 u8
pciehp_handle_switch_change(u8 hp_slot
, void *inst_id
)
116 struct controller
*ctrl
= (struct controller
*) inst_id
;
120 struct pci_func
*func
;
121 struct event_info
*taskInfo
;
124 dbg("pciehp: Switch interrupt received.\n");
126 func
= pciehp_slot_find(ctrl
->slot_bus
, (hp_slot
+ ctrl
->slot_device_offset
), 0);
128 /* This is the structure that tells the worker thread
131 taskInfo
= &(ctrl
->event_queue
[ctrl
->next_event
]);
132 ctrl
->next_event
= (ctrl
->next_event
+ 1) % 10;
133 taskInfo
->hp_slot
= hp_slot
;
136 p_slot
= pciehp_find_slot(ctrl
, hp_slot
+ ctrl
->slot_device_offset
);
137 p_slot
->hpc_ops
->get_adapter_status(p_slot
, &(func
->presence_save
));
138 p_slot
->hpc_ops
->get_latch_status(p_slot
, &getstatus
);
144 info("Latch open on Slot(%d)\n", ctrl
->first_slot
+ hp_slot
);
145 func
->switch_save
= 0;
146 taskInfo
->event_type
= INT_SWITCH_OPEN
;
151 info("Latch close on Slot(%d)\n", ctrl
->first_slot
+ hp_slot
);
152 func
->switch_save
= 0x10;
153 taskInfo
->event_type
= INT_SWITCH_CLOSE
;
157 up(&event_semaphore
); /* signal event thread that new event is posted */
162 u8
pciehp_handle_presence_change(u8 hp_slot
, void *inst_id
)
164 struct controller
*ctrl
= (struct controller
*) inst_id
;
167 struct pci_func
*func
;
168 struct event_info
*taskInfo
;
170 /* Presence Change */
171 dbg("pciehp: Presence/Notify input change.\n");
173 func
= pciehp_slot_find(ctrl
->slot_bus
, (hp_slot
+ ctrl
->slot_device_offset
), 0);
175 /* This is the structure that tells the worker thread
178 taskInfo
= &(ctrl
->event_queue
[ctrl
->next_event
]);
179 ctrl
->next_event
= (ctrl
->next_event
+ 1) % 10;
180 taskInfo
->hp_slot
= hp_slot
;
183 p_slot
= pciehp_find_slot(ctrl
, hp_slot
+ ctrl
->slot_device_offset
);
185 /* Switch is open, assume a presence change
186 * Save the presence state
188 p_slot
->hpc_ops
->get_adapter_status(p_slot
, &(func
->presence_save
));
189 if (func
->presence_save
) {
193 info("Card present on Slot(%d)\n", ctrl
->first_slot
+ hp_slot
);
194 taskInfo
->event_type
= INT_PRESENCE_ON
;
199 info("Card not present on Slot(%d)\n", ctrl
->first_slot
+ hp_slot
);
200 taskInfo
->event_type
= INT_PRESENCE_OFF
;
204 up(&event_semaphore
); /* signal event thread that new event is posted */
209 u8
pciehp_handle_power_fault(u8 hp_slot
, void *inst_id
)
211 struct controller
*ctrl
= (struct controller
*) inst_id
;
214 struct pci_func
*func
;
215 struct event_info
*taskInfo
;
218 dbg("pciehp: Power fault interrupt received.\n");
220 func
= pciehp_slot_find(ctrl
->slot_bus
, (hp_slot
+ ctrl
->slot_device_offset
), 0);
222 /* this is the structure that tells the worker thread
225 taskInfo
= &(ctrl
->event_queue
[ctrl
->next_event
]);
226 ctrl
->next_event
= (ctrl
->next_event
+ 1) % 10;
227 taskInfo
->hp_slot
= hp_slot
;
230 p_slot
= pciehp_find_slot(ctrl
, hp_slot
+ ctrl
->slot_device_offset
);
232 if ( !(p_slot
->hpc_ops
->query_power_fault(p_slot
))) {
234 * power fault Cleared
236 info("Power fault cleared on Slot(%d)\n", ctrl
->first_slot
+ hp_slot
);
238 taskInfo
->event_type
= INT_POWER_FAULT_CLEAR
;
243 info("Power fault on Slot(%d)\n", ctrl
->first_slot
+ hp_slot
);
244 taskInfo
->event_type
= INT_POWER_FAULT
;
245 /* set power fault status for this board */
247 info("power fault bit %x set\n", hp_slot
);
250 up(&event_semaphore
); /* signal event thread that new event is posted */
257 * sort_by_size: sort nodes by their length, smallest first.
259 * @head: list to sort
261 static int sort_by_size(struct pci_resource
**head
)
263 struct pci_resource
*current_res
;
264 struct pci_resource
*next_res
;
265 int out_of_order
= 1;
270 if (!((*head
)->next
))
273 while (out_of_order
) {
276 /* Special case for swapping list head */
277 if (((*head
)->next
) &&
278 ((*head
)->length
> (*head
)->next
->length
)) {
281 *head
= (*head
)->next
;
282 current_res
->next
= (*head
)->next
;
283 (*head
)->next
= current_res
;
288 while (current_res
->next
&& current_res
->next
->next
) {
289 if (current_res
->next
->length
> current_res
->next
->next
->length
) {
291 next_res
= current_res
->next
;
292 current_res
->next
= current_res
->next
->next
;
293 current_res
= current_res
->next
;
294 next_res
->next
= current_res
->next
;
295 current_res
->next
= next_res
;
297 current_res
= current_res
->next
;
299 } /* End of out_of_order loop */
308 * Sorts nodes on the list by their length.
312 static int sort_by_max_size(struct pci_resource
**head
)
314 struct pci_resource
*current_res
;
315 struct pci_resource
*next_res
;
316 int out_of_order
= 1;
321 if (!((*head
)->next
))
324 while (out_of_order
) {
327 /* Special case for swapping list head */
328 if (((*head
)->next
) &&
329 ((*head
)->length
< (*head
)->next
->length
)) {
332 *head
= (*head
)->next
;
333 current_res
->next
= (*head
)->next
;
334 (*head
)->next
= current_res
;
339 while (current_res
->next
&& current_res
->next
->next
) {
340 if (current_res
->next
->length
< current_res
->next
->next
->length
) {
342 next_res
= current_res
->next
;
343 current_res
->next
= current_res
->next
->next
;
344 current_res
= current_res
->next
;
345 next_res
->next
= current_res
->next
;
346 current_res
->next
= next_res
;
348 current_res
= current_res
->next
;
350 } /* End of out_of_order loop */
357 * do_pre_bridge_resource_split: return one unused resource node
358 * @head: list to scan
361 static struct pci_resource
*
362 do_pre_bridge_resource_split(struct pci_resource
**head
,
363 struct pci_resource
**orig_head
, u32 alignment
)
365 struct pci_resource
*prevnode
= NULL
;
366 struct pci_resource
*node
;
367 struct pci_resource
*split_node
;
370 dbg("do_pre_bridge_resource_split\n");
372 if (!(*head
) || !(*orig_head
))
375 rc
= pciehp_resource_sort_and_combine(head
);
380 if ((*head
)->base
!= (*orig_head
)->base
)
383 if ((*head
)->length
== (*orig_head
)->length
)
387 /* If we got here, there the bridge requires some of the resource, but
388 * we may be able to split some off of the front
392 if (node
->length
& (alignment
-1)) {
393 /* this one isn't an aligned length, so we'll make a new entry
396 split_node
= kmalloc(sizeof(struct pci_resource
), GFP_KERNEL
);
401 temp_dword
= (node
->length
| (alignment
-1)) + 1 - alignment
;
403 split_node
->base
= node
->base
;
404 split_node
->length
= temp_dword
;
406 node
->length
-= temp_dword
;
407 node
->base
+= split_node
->length
;
409 /* Put it in the list */
411 split_node
->next
= node
;
414 if (node
->length
< alignment
)
422 while (prevnode
->next
!= node
)
423 prevnode
= prevnode
->next
;
425 prevnode
->next
= node
->next
;
434 * do_bridge_resource_split: return one unused resource node
435 * @head: list to scan
438 static struct pci_resource
*
439 do_bridge_resource_split(struct pci_resource
**head
, u32 alignment
)
441 struct pci_resource
*prevnode
= NULL
;
442 struct pci_resource
*node
;
449 rc
= pciehp_resource_sort_and_combine(head
);
462 if (node
->length
< alignment
) {
467 if (node
->base
& (alignment
- 1)) {
468 /* Short circuit if adjusted size is too small */
469 temp_dword
= (node
->base
| (alignment
-1)) + 1;
470 if ((node
->length
- (temp_dword
- node
->base
)) < alignment
) {
475 node
->length
-= (temp_dword
- node
->base
);
476 node
->base
= temp_dword
;
479 if (node
->length
& (alignment
- 1)) {
480 /* There's stuff in use after this node */
492 * this function sorts the resource list by size and then
493 * returns the first node of "size" length that is not in the
494 * ISA aliasing window. If it finds a node larger than "size"
495 * it will split it up.
497 * size must be a power of two.
499 static struct pci_resource
*get_io_resource(struct pci_resource
**head
, u32 size
)
501 struct pci_resource
*prevnode
;
502 struct pci_resource
*node
;
503 struct pci_resource
*split_node
= NULL
;
509 if ( pciehp_resource_sort_and_combine(head
) )
512 if ( sort_by_size(head
) )
515 for (node
= *head
; node
; node
= node
->next
) {
516 if (node
->length
< size
)
519 if (node
->base
& (size
- 1)) {
520 /* this one isn't base aligned properly
521 so we'll make a new entry and split it up */
522 temp_dword
= (node
->base
| (size
-1)) + 1;
524 /*/ Short circuit if adjusted size is too small */
525 if ((node
->length
- (temp_dword
- node
->base
)) < size
)
528 split_node
= kmalloc(sizeof(struct pci_resource
),
534 split_node
->base
= node
->base
;
535 split_node
->length
= temp_dword
- node
->base
;
536 node
->base
= temp_dword
;
537 node
->length
-= split_node
->length
;
539 /* Put it in the list */
540 split_node
->next
= node
->next
;
541 node
->next
= split_node
;
542 } /* End of non-aligned base */
544 /* Don't need to check if too small since we already did */
545 if (node
->length
> size
) {
546 /* this one is longer than we need
547 so we'll make a new entry and split it up */
548 split_node
= kmalloc(sizeof(struct pci_resource
),
554 split_node
->base
= node
->base
+ size
;
555 split_node
->length
= node
->length
- size
;
558 /* Put it in the list */
559 split_node
->next
= node
->next
;
560 node
->next
= split_node
;
561 } /* End of too big on top end */
563 /* For IO make sure it's not in the ISA aliasing space */
564 if (node
->base
& 0x300L
)
567 /* If we got here, then it is the right size
568 Now take it out of the list */
573 while (prevnode
->next
!= node
)
574 prevnode
= prevnode
->next
;
576 prevnode
->next
= node
->next
;
590 * Gets the largest node that is at least "size" big from the
591 * list pointed to by head. It aligns the node on top and bottom
592 * to "size" alignment before returning it.
593 * J.I. modified to put max size limits of; 64M->32M->16M->8M->4M->1M
594 * This is needed to avoid allocating entire ACPI _CRS res to one child bridge/slot.
596 static struct pci_resource
*get_max_resource(struct pci_resource
**head
, u32 size
)
598 struct pci_resource
*max
;
599 struct pci_resource
*temp
;
600 struct pci_resource
*split_node
;
602 u32 max_size
[] = { 0x4000000, 0x2000000, 0x1000000, 0x0800000, 0x0400000, 0x0200000, 0x0100000, 0x00 };
608 if (pciehp_resource_sort_and_combine(head
))
611 if (sort_by_max_size(head
))
614 for (max
= *head
;max
; max
= max
->next
) {
616 /* If not big enough we could probably just bail,
617 instead we'll continue to the next. */
618 if (max
->length
< size
)
621 if (max
->base
& (size
- 1)) {
622 /* this one isn't base aligned properly
623 so we'll make a new entry and split it up */
624 temp_dword
= (max
->base
| (size
-1)) + 1;
626 /* Short circuit if adjusted size is too small */
627 if ((max
->length
- (temp_dword
- max
->base
)) < size
)
630 split_node
= kmalloc(sizeof(struct pci_resource
),
636 split_node
->base
= max
->base
;
637 split_node
->length
= temp_dword
- max
->base
;
638 max
->base
= temp_dword
;
639 max
->length
-= split_node
->length
;
641 /* Put it next in the list */
642 split_node
->next
= max
->next
;
643 max
->next
= split_node
;
646 if ((max
->base
+ max
->length
) & (size
- 1)) {
647 /* this one isn't end aligned properly at the top
648 so we'll make a new entry and split it up */
649 split_node
= kmalloc(sizeof(struct pci_resource
),
654 temp_dword
= ((max
->base
+ max
->length
) & ~(size
- 1));
655 split_node
->base
= temp_dword
;
656 split_node
->length
= max
->length
+ max
->base
658 max
->length
-= split_node
->length
;
660 /* Put it in the list */
661 split_node
->next
= max
->next
;
662 max
->next
= split_node
;
665 /* Make sure it didn't shrink too much when we aligned it */
666 if (max
->length
< size
)
669 for ( i
= 0; max_size
[i
] > size
; i
++) {
670 if (max
->length
> max_size
[i
]) {
671 split_node
= kmalloc(sizeof(struct pci_resource
),
674 break; /* return NULL; */
675 split_node
->base
= max
->base
+ max_size
[i
];
676 split_node
->length
= max
->length
- max_size
[i
];
677 max
->length
= max_size
[i
];
678 /* Put it next in the list */
679 split_node
->next
= max
->next
;
680 max
->next
= split_node
;
685 /* Now take it out of the list */
686 temp
= (struct pci_resource
*) *head
;
690 while (temp
&& temp
->next
!= max
) {
694 temp
->next
= max
->next
;
701 /* If we get here, we couldn't find one */
709 * this function sorts the resource list by size and then
710 * returns the first node of "size" length. If it finds a node
711 * larger than "size" it will split it up.
713 * size must be a power of two.
715 static struct pci_resource
*get_resource(struct pci_resource
**head
, u32 size
)
717 struct pci_resource
*prevnode
;
718 struct pci_resource
*node
;
719 struct pci_resource
*split_node
;
725 if ( pciehp_resource_sort_and_combine(head
) )
728 if ( sort_by_size(head
) )
731 for (node
= *head
; node
; node
= node
->next
) {
732 dbg("%s: req_size =0x%x node=%p, base=0x%x, length=0x%x\n",
733 __FUNCTION__
, size
, node
, node
->base
, node
->length
);
734 if (node
->length
< size
)
737 if (node
->base
& (size
- 1)) {
738 dbg("%s: not aligned\n", __FUNCTION__
);
739 /* this one isn't base aligned properly
740 so we'll make a new entry and split it up */
741 temp_dword
= (node
->base
| (size
-1)) + 1;
743 /* Short circuit if adjusted size is too small */
744 if ((node
->length
- (temp_dword
- node
->base
)) < size
)
747 split_node
= kmalloc(sizeof(struct pci_resource
),
753 split_node
->base
= node
->base
;
754 split_node
->length
= temp_dword
- node
->base
;
755 node
->base
= temp_dword
;
756 node
->length
-= split_node
->length
;
758 /* Put it in the list */
759 split_node
->next
= node
->next
;
760 node
->next
= split_node
;
761 } /* End of non-aligned base */
763 /* Don't need to check if too small since we already did */
764 if (node
->length
> size
) {
765 dbg("%s: too big\n", __FUNCTION__
);
766 /* this one is longer than we need
767 so we'll make a new entry and split it up */
768 split_node
= kmalloc(sizeof(struct pci_resource
),
774 split_node
->base
= node
->base
+ size
;
775 split_node
->length
= node
->length
- size
;
778 /* Put it in the list */
779 split_node
->next
= node
->next
;
780 node
->next
= split_node
;
781 } /* End of too big on top end */
783 dbg("%s: got one!!!\n", __FUNCTION__
);
784 /* If we got here, then it is the right size
785 Now take it out of the list */
790 while (prevnode
->next
!= node
)
791 prevnode
= prevnode
->next
;
793 prevnode
->next
= node
->next
;
804 * pciehp_resource_sort_and_combine
806 * Sorts all of the nodes in the list in ascending order by
807 * their base addresses. Also does garbage collection by
808 * combining adjacent nodes.
810 * returns 0 if success
812 int pciehp_resource_sort_and_combine(struct pci_resource
**head
)
814 struct pci_resource
*node1
;
815 struct pci_resource
*node2
;
816 int out_of_order
= 1;
818 dbg("%s: head = %p, *head = %p\n", __FUNCTION__
, head
, *head
);
823 dbg("*head->next = %p\n",(*head
)->next
);
826 return 0; /* only one item on the list, already sorted! */
828 dbg("*head->base = 0x%x\n",(*head
)->base
);
829 dbg("*head->next->base = 0x%x\n",(*head
)->next
->base
);
830 while (out_of_order
) {
833 /* Special case for swapping list head */
834 if (((*head
)->next
) &&
835 ((*head
)->base
> (*head
)->next
->base
)) {
837 (*head
) = (*head
)->next
;
838 node1
->next
= (*head
)->next
;
839 (*head
)->next
= node1
;
845 while (node1
->next
&& node1
->next
->next
) {
846 if (node1
->next
->base
> node1
->next
->next
->base
) {
849 node1
->next
= node1
->next
->next
;
851 node2
->next
= node1
->next
;
856 } /* End of out_of_order loop */
860 while (node1
&& node1
->next
) {
861 if ((node1
->base
+ node1
->length
) == node1
->next
->base
) {
864 node1
->length
+= node1
->next
->length
;
866 node1
->next
= node1
->next
->next
;
877 * pciehp_slot_create - Creates a node and adds it to the proper bus.
878 * @busnumber - bus where new node is to be located
880 * Returns pointer to the new node or NULL if unsuccessful
882 struct pci_func
*pciehp_slot_create(u8 busnumber
)
884 struct pci_func
*new_slot
;
885 struct pci_func
*next
;
886 dbg("%s: busnumber %x\n", __FUNCTION__
, busnumber
);
887 new_slot
= kmalloc(sizeof(struct pci_func
), GFP_KERNEL
);
889 if (new_slot
== NULL
)
892 memset(new_slot
, 0, sizeof(struct pci_func
));
894 new_slot
->next
= NULL
;
895 new_slot
->configured
= 1;
897 if (pciehp_slot_list
[busnumber
] == NULL
) {
898 pciehp_slot_list
[busnumber
] = new_slot
;
900 next
= pciehp_slot_list
[busnumber
];
901 while (next
->next
!= NULL
)
903 next
->next
= new_slot
;
910 * slot_remove - Removes a node from the linked list of slots.
911 * @old_slot: slot to remove
913 * Returns 0 if successful, !0 otherwise.
915 static int slot_remove(struct pci_func
* old_slot
)
917 struct pci_func
*next
;
919 if (old_slot
== NULL
)
922 next
= pciehp_slot_list
[old_slot
->bus
];
927 if (next
== old_slot
) {
928 pciehp_slot_list
[old_slot
->bus
] = old_slot
->next
;
929 pciehp_destroy_board_resources(old_slot
);
934 while ((next
->next
!= old_slot
) && (next
->next
!= NULL
)) {
938 if (next
->next
== old_slot
) {
939 next
->next
= old_slot
->next
;
940 pciehp_destroy_board_resources(old_slot
);
949 * bridge_slot_remove - Removes a node from the linked list of slots.
950 * @bridge: bridge to remove
952 * Returns 0 if successful, !0 otherwise.
954 static int bridge_slot_remove(struct pci_func
*bridge
)
956 u8 subordinateBus
, secondaryBus
;
958 struct pci_func
*next
;
963 secondaryBus
= (bridge
->config_space
[0x06] >> 8) & 0xFF;
964 subordinateBus
= (bridge
->config_space
[0x06] >> 16) & 0xFF;
966 for (tempBus
= secondaryBus
; tempBus
<= subordinateBus
; tempBus
++) {
967 next
= pciehp_slot_list
[tempBus
];
969 while (!slot_remove(next
)) {
970 next
= pciehp_slot_list
[tempBus
];
974 next
= pciehp_slot_list
[bridge
->bus
];
980 if (next
== bridge
) {
981 pciehp_slot_list
[bridge
->bus
] = bridge
->next
;
986 while ((next
->next
!= bridge
) && (next
->next
!= NULL
)) {
990 if (next
->next
== bridge
) {
991 next
->next
= bridge
->next
;
1000 * pciehp_slot_find - Looks for a node by bus, and device, multiple functions accessed
1002 * @device: device to find
1003 * @index: is 0 for first function found, 1 for the second...
1005 * Returns pointer to the node if successful, %NULL otherwise.
1007 struct pci_func
*pciehp_slot_find(u8 bus
, u8 device
, u8 index
)
1010 struct pci_func
*func
;
1012 func
= pciehp_slot_list
[bus
];
1013 dbg("%s: bus %x device %x index %x\n",
1014 __FUNCTION__
, bus
, device
, index
);
1016 dbg("%s: func-> bus %x device %x function %x pci_dev %p\n",
1017 __FUNCTION__
, func
->bus
, func
->device
, func
->function
,
1020 dbg("%s: func == NULL\n", __FUNCTION__
);
1022 if ((func
== NULL
) || ((func
->device
== device
) && (index
== 0)))
1025 if (func
->device
== device
)
1028 while (func
->next
!= NULL
) {
1031 dbg("%s: In while loop, func-> bus %x device %x function %x pci_dev %p\n",
1032 __FUNCTION__
, func
->bus
, func
->device
, func
->function
,
1034 if (func
->device
== device
)
1036 dbg("%s: while loop, found %d, index %d\n", __FUNCTION__
,
1039 if ((found
== index
) || (func
->function
== index
)) {
1040 dbg("%s: Found bus %x dev %x func %x\n", __FUNCTION__
,
1041 func
->bus
, func
->device
, func
->function
);
1049 static int is_bridge(struct pci_func
* func
)
1051 /* Check the header type */
1052 if (((func
->config_space
[0x03] >> 16) & 0xFF) == 0x01)
1059 /* The following routines constitute the bulk of the
1060 hotplug controller logic
1063 static void set_slot_off(struct controller
*ctrl
, struct slot
* pslot
)
1065 /* Wait for exclusive access to hardware */
1066 down(&ctrl
->crit_sect
);
1068 /* turn off slot, turn on Amber LED, turn off Green LED if supported*/
1069 if (POWER_CTRL(ctrl
->ctrlcap
)) {
1070 if (pslot
->hpc_ops
->power_off_slot(pslot
)) {
1071 err("%s: Issue of Slot Power Off command failed\n", __FUNCTION__
);
1072 up(&ctrl
->crit_sect
);
1075 wait_for_ctrl_irq (ctrl
);
1078 if (PWR_LED(ctrl
->ctrlcap
)) {
1079 pslot
->hpc_ops
->green_led_off(pslot
);
1080 wait_for_ctrl_irq (ctrl
);
1083 if (ATTN_LED(ctrl
->ctrlcap
)) {
1084 if (pslot
->hpc_ops
->set_attention_status(pslot
, 1)) {
1085 err("%s: Issue of Set Attention Led command failed\n", __FUNCTION__
);
1086 up(&ctrl
->crit_sect
);
1089 wait_for_ctrl_irq (ctrl
);
1092 /* Done with exclusive hardware access */
1093 up(&ctrl
->crit_sect
);
1097 * board_added - Called after a board has been added to the system.
1099 * Turns power on for the board
1103 static u32
board_added(struct pci_func
* func
, struct controller
* ctrl
)
1107 u32 temp_register
= 0xFFFFFFFF;
1109 struct pci_func
*new_func
= NULL
;
1110 struct slot
*p_slot
;
1111 struct resource_lists res_lists
;
1113 p_slot
= pciehp_find_slot(ctrl
, func
->device
);
1114 hp_slot
= func
->device
- ctrl
->slot_device_offset
;
1116 dbg("%s: func->device, slot_offset, hp_slot = %d, %d ,%d\n", __FUNCTION__
, func
->device
, ctrl
->slot_device_offset
, hp_slot
);
1118 /* Wait for exclusive access to hardware */
1119 down(&ctrl
->crit_sect
);
1121 if (POWER_CTRL(ctrl
->ctrlcap
)) {
1123 rc
= p_slot
->hpc_ops
->power_on_slot(p_slot
);
1125 up(&ctrl
->crit_sect
);
1129 /* Wait for the command to complete */
1130 wait_for_ctrl_irq (ctrl
);
1133 if (PWR_LED(ctrl
->ctrlcap
)) {
1134 p_slot
->hpc_ops
->green_led_blink(p_slot
);
1136 /* Wait for the command to complete */
1137 wait_for_ctrl_irq (ctrl
);
1140 /* Done with exclusive hardware access */
1141 up(&ctrl
->crit_sect
);
1143 /* Wait for ~1 second */
1144 dbg("%s: before long_delay\n", __FUNCTION__
);
1145 wait_for_ctrl_irq (ctrl
);
1146 dbg("%s: afterlong_delay\n", __FUNCTION__
);
1148 /* Check link training status */
1149 rc
= p_slot
->hpc_ops
->check_lnk_status(ctrl
);
1151 err("%s: Failed to check link status\n", __FUNCTION__
);
1152 set_slot_off(ctrl
, p_slot
);
1156 dbg("%s: func status = %x\n", __FUNCTION__
, func
->status
);
1158 /* Check for a power fault */
1159 if (func
->status
== 0xFF) {
1160 /* power fault occurred, but it was benign */
1161 temp_register
= 0xFFFFFFFF;
1162 dbg("%s: temp register set to %x by power fault\n", __FUNCTION__
, temp_register
);
1166 /* Get vendor/device ID u32 */
1167 rc
= pci_bus_read_config_dword (ctrl
->pci_dev
->subordinate
, PCI_DEVFN(func
->device
, func
->function
),
1168 PCI_VENDOR_ID
, &temp_register
);
1169 dbg("%s: pci_bus_read_config_dword returns %d\n", __FUNCTION__
, rc
);
1170 dbg("%s: temp_register is %x\n", __FUNCTION__
, temp_register
);
1173 /* Something's wrong here */
1174 temp_register
= 0xFFFFFFFF;
1175 dbg("%s: temp register set to %x by error\n", __FUNCTION__
, temp_register
);
1177 /* Preset return code. It will be changed later if things go okay. */
1178 rc
= NO_ADAPTER_PRESENT
;
1181 /* All F's is an empty slot or an invalid board */
1182 if (temp_register
!= 0xFFFFFFFF) { /* Check for a board in the slot */
1183 res_lists
.io_head
= ctrl
->io_head
;
1184 res_lists
.mem_head
= ctrl
->mem_head
;
1185 res_lists
.p_mem_head
= ctrl
->p_mem_head
;
1186 res_lists
.bus_head
= ctrl
->bus_head
;
1187 res_lists
.irqs
= NULL
;
1189 rc
= configure_new_device(ctrl
, func
, 0, &res_lists
, 0, 0);
1190 dbg("%s: back from configure_new_device\n", __FUNCTION__
);
1192 ctrl
->io_head
= res_lists
.io_head
;
1193 ctrl
->mem_head
= res_lists
.mem_head
;
1194 ctrl
->p_mem_head
= res_lists
.p_mem_head
;
1195 ctrl
->bus_head
= res_lists
.bus_head
;
1197 pciehp_resource_sort_and_combine(&(ctrl
->mem_head
));
1198 pciehp_resource_sort_and_combine(&(ctrl
->p_mem_head
));
1199 pciehp_resource_sort_and_combine(&(ctrl
->io_head
));
1200 pciehp_resource_sort_and_combine(&(ctrl
->bus_head
));
1203 set_slot_off(ctrl
, p_slot
);
1206 pciehp_save_slot_config(ctrl
, func
);
1209 func
->switch_save
= 0x10;
1210 func
->is_a_board
= 0x01;
1212 /* next, we will instantiate the linux pci_dev structures
1213 * (with appropriate driver notification, if already present)
1217 new_func
= pciehp_slot_find(ctrl
->slot_bus
, func
->device
, index
++);
1218 if (new_func
&& !new_func
->pci_dev
) {
1219 dbg("%s:call pci_hp_configure_dev, func %x\n",
1220 __FUNCTION__
, index
);
1221 pciehp_configure_device(ctrl
, new_func
);
1226 * Some PCI Express root ports require fixup after hot-plug operation.
1229 pci_fixup_device(pci_fixup_final
, ctrl
->pci_dev
);
1231 if (PWR_LED(ctrl
->ctrlcap
)) {
1232 /* Wait for exclusive access to hardware */
1233 down(&ctrl
->crit_sect
);
1235 p_slot
->hpc_ops
->green_led_on(p_slot
);
1237 /* Wait for the command to complete */
1238 wait_for_ctrl_irq (ctrl
);
1240 /* Done with exclusive hardware access */
1241 up(&ctrl
->crit_sect
);
1244 set_slot_off(ctrl
, p_slot
);
1252 * remove_board - Turns off slot and LED's
1255 static u32
remove_board(struct pci_func
*func
, struct controller
*ctrl
)
1262 struct resource_lists res_lists
;
1263 struct pci_func
*temp_func
;
1264 struct slot
*p_slot
;
1269 if (pciehp_unconfigure_device(func
))
1272 device
= func
->device
;
1274 hp_slot
= func
->device
- ctrl
->slot_device_offset
;
1275 p_slot
= pciehp_find_slot(ctrl
, hp_slot
+ ctrl
->slot_device_offset
);
1277 dbg("In %s, hp_slot = %d\n", __FUNCTION__
, hp_slot
);
1279 if ((ctrl
->add_support
) &&
1280 !(func
->bus_head
|| func
->mem_head
|| func
->p_mem_head
|| func
->io_head
)) {
1281 /* Here we check to see if we've saved any of the board's
1282 * resources already. If so, we'll skip the attempt to
1283 * determine what's being used.
1289 while ((temp_func
= pciehp_slot_find(temp_func
->bus
, temp_func
->device
, index
++))) {
1290 if (temp_func
->bus_head
|| temp_func
->mem_head
1291 || temp_func
->p_mem_head
|| temp_func
->io_head
) {
1298 rc
= pciehp_save_used_resources(ctrl
, func
, DISABLE_CARD
);
1300 /* Change status to shutdown */
1301 if (func
->is_a_board
)
1302 func
->status
= 0x01;
1303 func
->configured
= 0;
1305 /* Wait for exclusive access to hardware */
1306 down(&ctrl
->crit_sect
);
1308 if (POWER_CTRL(ctrl
->ctrlcap
)) {
1309 /* power off slot */
1310 rc
= p_slot
->hpc_ops
->power_off_slot(p_slot
);
1312 err("%s: Issue of Slot Disable command failed\n", __FUNCTION__
);
1313 up(&ctrl
->crit_sect
);
1316 /* Wait for the command to complete */
1317 wait_for_ctrl_irq (ctrl
);
1320 if (PWR_LED(ctrl
->ctrlcap
)) {
1321 /* turn off Green LED */
1322 p_slot
->hpc_ops
->green_led_off(p_slot
);
1324 /* Wait for the command to complete */
1325 wait_for_ctrl_irq (ctrl
);
1328 /* Done with exclusive hardware access */
1329 up(&ctrl
->crit_sect
);
1331 if (ctrl
->add_support
) {
1333 res_lists
.io_head
= ctrl
->io_head
;
1334 res_lists
.mem_head
= ctrl
->mem_head
;
1335 res_lists
.p_mem_head
= ctrl
->p_mem_head
;
1336 res_lists
.bus_head
= ctrl
->bus_head
;
1338 dbg("Returning resources to ctlr lists for (B/D/F) = (%#x/%#x/%#x)\n",
1339 func
->bus
, func
->device
, func
->function
);
1341 pciehp_return_board_resources(func
, &res_lists
);
1343 ctrl
->io_head
= res_lists
.io_head
;
1344 ctrl
->mem_head
= res_lists
.mem_head
;
1345 ctrl
->p_mem_head
= res_lists
.p_mem_head
;
1346 ctrl
->bus_head
= res_lists
.bus_head
;
1348 pciehp_resource_sort_and_combine(&(ctrl
->mem_head
));
1349 pciehp_resource_sort_and_combine(&(ctrl
->p_mem_head
));
1350 pciehp_resource_sort_and_combine(&(ctrl
->io_head
));
1351 pciehp_resource_sort_and_combine(&(ctrl
->bus_head
));
1353 if (is_bridge(func
)) {
1354 dbg("PCI Bridge Hot-Remove s:b:d:f(%02x:%02x:%02x:%02x)\n",
1355 ctrl
->seg
, func
->bus
, func
->device
, func
->function
);
1356 bridge_slot_remove(func
);
1358 dbg("PCI Function Hot-Remove s:b:d:f(%02x:%02x:%02x:%02x)\n",
1359 ctrl
->seg
, func
->bus
, func
->device
, func
->function
);
1363 func
= pciehp_slot_find(ctrl
->slot_bus
, device
, 0);
1366 /* Setup slot structure with entry for empty slot */
1367 func
= pciehp_slot_create(ctrl
->slot_bus
);
1373 func
->bus
= ctrl
->slot_bus
;
1374 func
->device
= device
;
1376 func
->configured
= 0;
1377 func
->switch_save
= 0x10;
1378 func
->is_a_board
= 0;
1385 static void pushbutton_helper_thread(unsigned long data
)
1387 pushbutton_pending
= data
;
1389 up(&event_semaphore
);
1393 * pciehp_pushbutton_thread
1395 * Scheduled procedure to handle blocking stuff for the pushbuttons
1396 * Handles all pending events and exits.
1399 static void pciehp_pushbutton_thread(unsigned long slot
)
1401 struct slot
*p_slot
= (struct slot
*) slot
;
1404 pushbutton_pending
= 0;
1407 dbg("%s: Error! slot NULL\n", __FUNCTION__
);
1411 p_slot
->hpc_ops
->get_power_status(p_slot
, &getstatus
);
1413 p_slot
->state
= POWEROFF_STATE
;
1414 dbg("In power_down_board, b:d(%x:%x)\n", p_slot
->bus
, p_slot
->device
);
1416 pciehp_disable_slot(p_slot
);
1417 p_slot
->state
= STATIC_STATE
;
1419 p_slot
->state
= POWERON_STATE
;
1420 dbg("In add_board, b:d(%x:%x)\n", p_slot
->bus
, p_slot
->device
);
1422 if (pciehp_enable_slot(p_slot
) && PWR_LED(p_slot
->ctrl
->ctrlcap
)) {
1423 /* Wait for exclusive access to hardware */
1424 down(&p_slot
->ctrl
->crit_sect
);
1426 p_slot
->hpc_ops
->green_led_off(p_slot
);
1428 /* Wait for the command to complete */
1429 wait_for_ctrl_irq (p_slot
->ctrl
);
1431 /* Done with exclusive hardware access */
1432 up(&p_slot
->ctrl
->crit_sect
);
1434 p_slot
->state
= STATIC_STATE
;
1441 * pciehp_surprise_rm_thread
1443 * Scheduled procedure to handle blocking stuff for the surprise removal
1444 * Handles all pending events and exits.
1447 static void pciehp_surprise_rm_thread(unsigned long slot
)
1449 struct slot
*p_slot
= (struct slot
*) slot
;
1452 surprise_rm_pending
= 0;
1455 dbg("%s: Error! slot NULL\n", __FUNCTION__
);
1459 p_slot
->hpc_ops
->get_adapter_status(p_slot
, &getstatus
);
1461 p_slot
->state
= POWEROFF_STATE
;
1462 dbg("In removing board, b:d(%x:%x)\n", p_slot
->bus
, p_slot
->device
);
1464 pciehp_disable_slot(p_slot
);
1465 p_slot
->state
= STATIC_STATE
;
1467 p_slot
->state
= POWERON_STATE
;
1468 dbg("In add_board, b:d(%x:%x)\n", p_slot
->bus
, p_slot
->device
);
1470 if (pciehp_enable_slot(p_slot
) && PWR_LED(p_slot
->ctrl
->ctrlcap
)) {
1471 /* Wait for exclusive access to hardware */
1472 down(&p_slot
->ctrl
->crit_sect
);
1474 p_slot
->hpc_ops
->green_led_off(p_slot
);
1476 /* Wait for the command to complete */
1477 wait_for_ctrl_irq (p_slot
->ctrl
);
1479 /* Done with exclusive hardware access */
1480 up(&p_slot
->ctrl
->crit_sect
);
1482 p_slot
->state
= STATIC_STATE
;
1490 /* this is the main worker thread */
1491 static int event_thread(void* data
)
1493 struct controller
*ctrl
;
1495 daemonize("pciehpd_event");
1500 dbg("!!!!event_thread sleeping\n");
1501 down_interruptible (&event_semaphore
);
1502 dbg("event_thread woken finished = %d\n", event_finished
);
1503 if (event_finished
|| signal_pending(current
))
1506 if (pushbutton_pending
)
1507 pciehp_pushbutton_thread(pushbutton_pending
);
1508 else if (surprise_rm_pending
)
1509 pciehp_surprise_rm_thread(surprise_rm_pending
);
1511 for (ctrl
= pciehp_ctrl_list
; ctrl
; ctrl
=ctrl
->next
)
1512 interrupt_event_handler(ctrl
);
1514 dbg("event_thread signals exit\n");
1519 int pciehp_event_start_thread(void)
1523 /* initialize our semaphores */
1524 init_MUTEX_LOCKED(&event_exit
);
1527 init_MUTEX_LOCKED(&event_semaphore
);
1528 pid
= kernel_thread(event_thread
, NULL
, 0);
1531 err ("Can't start up our event thread\n");
1534 dbg("Our event thread pid = %d\n", pid
);
1539 void pciehp_event_stop_thread(void)
1542 dbg("event_thread finish command given\n");
1543 up(&event_semaphore
);
1544 dbg("wait for event_thread to exit\n");
1549 static int update_slot_info(struct slot
*slot
)
1551 struct hotplug_slot_info
*info
;
1552 /* char buffer[SLOT_NAME_SIZE]; */
1555 info
= kmalloc(sizeof(struct hotplug_slot_info
), GFP_KERNEL
);
1559 /* make_slot_name (&buffer[0], SLOT_NAME_SIZE, slot); */
1561 slot
->hpc_ops
->get_power_status(slot
, &(info
->power_status
));
1562 slot
->hpc_ops
->get_attention_status(slot
, &(info
->attention_status
));
1563 slot
->hpc_ops
->get_latch_status(slot
, &(info
->latch_status
));
1564 slot
->hpc_ops
->get_adapter_status(slot
, &(info
->adapter_status
));
1566 /* result = pci_hp_change_slot_info(buffer, info); */
1567 result
= pci_hp_change_slot_info(slot
->hotplug_slot
, info
);
1572 static void interrupt_event_handler(struct controller
*ctrl
)
1576 struct pci_func
*func
;
1579 struct slot
*p_slot
;
1584 for (loop
= 0; loop
< 10; loop
++) {
1585 if (ctrl
->event_queue
[loop
].event_type
!= 0) {
1586 hp_slot
= ctrl
->event_queue
[loop
].hp_slot
;
1588 func
= pciehp_slot_find(ctrl
->slot_bus
, (hp_slot
+ ctrl
->slot_device_offset
), 0);
1590 p_slot
= pciehp_find_slot(ctrl
, hp_slot
+ ctrl
->slot_device_offset
);
1592 dbg("hp_slot %d, func %p, p_slot %p\n", hp_slot
, func
, p_slot
);
1594 if (ctrl
->event_queue
[loop
].event_type
== INT_BUTTON_CANCEL
) {
1595 dbg("button cancel\n");
1596 del_timer(&p_slot
->task_event
);
1598 switch (p_slot
->state
) {
1599 case BLINKINGOFF_STATE
:
1600 /* Wait for exclusive access to hardware */
1601 down(&ctrl
->crit_sect
);
1603 if (PWR_LED(ctrl
->ctrlcap
)) {
1604 p_slot
->hpc_ops
->green_led_on(p_slot
);
1605 /* Wait for the command to complete */
1606 wait_for_ctrl_irq (ctrl
);
1608 if (ATTN_LED(ctrl
->ctrlcap
)) {
1609 p_slot
->hpc_ops
->set_attention_status(p_slot
, 0);
1611 /* Wait for the command to complete */
1612 wait_for_ctrl_irq (ctrl
);
1614 /* Done with exclusive hardware access */
1615 up(&ctrl
->crit_sect
);
1617 case BLINKINGON_STATE
:
1618 /* Wait for exclusive access to hardware */
1619 down(&ctrl
->crit_sect
);
1621 if (PWR_LED(ctrl
->ctrlcap
)) {
1622 p_slot
->hpc_ops
->green_led_off(p_slot
);
1623 /* Wait for the command to complete */
1624 wait_for_ctrl_irq (ctrl
);
1626 if (ATTN_LED(ctrl
->ctrlcap
)){
1627 p_slot
->hpc_ops
->set_attention_status(p_slot
, 0);
1628 /* Wait for the command to complete */
1629 wait_for_ctrl_irq (ctrl
);
1631 /* Done with exclusive hardware access */
1632 up(&ctrl
->crit_sect
);
1636 warn("Not a valid state\n");
1639 info(msg_button_cancel
, p_slot
->number
);
1640 p_slot
->state
= STATIC_STATE
;
1642 /* ***********Button Pressed (No action on 1st press...) */
1643 else if (ctrl
->event_queue
[loop
].event_type
== INT_BUTTON_PRESS
) {
1645 if (ATTN_BUTTN(ctrl
->ctrlcap
)) {
1646 dbg("Button pressed\n");
1647 p_slot
->hpc_ops
->get_power_status(p_slot
, &getstatus
);
1650 dbg("slot is on\n");
1651 p_slot
->state
= BLINKINGOFF_STATE
;
1652 info(msg_button_off
, p_slot
->number
);
1655 dbg("slot is off\n");
1656 p_slot
->state
= BLINKINGON_STATE
;
1657 info(msg_button_on
, p_slot
->number
);
1660 /* Wait for exclusive access to hardware */
1661 down(&ctrl
->crit_sect
);
1663 /* blink green LED and turn off amber */
1664 if (PWR_LED(ctrl
->ctrlcap
)) {
1665 p_slot
->hpc_ops
->green_led_blink(p_slot
);
1666 /* Wait for the command to complete */
1667 wait_for_ctrl_irq (ctrl
);
1670 if (ATTN_LED(ctrl
->ctrlcap
)) {
1671 p_slot
->hpc_ops
->set_attention_status(p_slot
, 0);
1673 /* Wait for the command to complete */
1674 wait_for_ctrl_irq (ctrl
);
1677 /* Done with exclusive hardware access */
1678 up(&ctrl
->crit_sect
);
1680 init_timer(&p_slot
->task_event
);
1681 p_slot
->task_event
.expires
= jiffies
+ 5 * HZ
; /* 5 second delay */
1682 p_slot
->task_event
.function
= (void (*)(unsigned long)) pushbutton_helper_thread
;
1683 p_slot
->task_event
.data
= (unsigned long) p_slot
;
1685 dbg("add_timer p_slot = %p\n", (void *) p_slot
);
1686 add_timer(&p_slot
->task_event
);
1689 /***********POWER FAULT********************/
1690 else if (ctrl
->event_queue
[loop
].event_type
== INT_POWER_FAULT
) {
1691 if (POWER_CTRL(ctrl
->ctrlcap
)) {
1692 dbg("power fault\n");
1693 /* Wait for exclusive access to hardware */
1694 down(&ctrl
->crit_sect
);
1696 if (ATTN_LED(ctrl
->ctrlcap
)) {
1697 p_slot
->hpc_ops
->set_attention_status(p_slot
, 1);
1698 wait_for_ctrl_irq (ctrl
);
1701 if (PWR_LED(ctrl
->ctrlcap
)) {
1702 p_slot
->hpc_ops
->green_led_off(p_slot
);
1703 wait_for_ctrl_irq (ctrl
);
1706 /* Done with exclusive hardware access */
1707 up(&ctrl
->crit_sect
);
1710 /***********SURPRISE REMOVAL********************/
1711 else if ((ctrl
->event_queue
[loop
].event_type
== INT_PRESENCE_ON
) ||
1712 (ctrl
->event_queue
[loop
].event_type
== INT_PRESENCE_OFF
)) {
1713 if (HP_SUPR_RM(ctrl
->ctrlcap
)) {
1714 dbg("Surprise Removal\n");
1716 surprise_rm_pending
= (unsigned long) p_slot
;
1717 up(&event_semaphore
);
1718 update_slot_info(p_slot
);
1722 /* refresh notification */
1724 update_slot_info(p_slot
);
1727 ctrl
->event_queue
[loop
].event_type
= 0;
1731 } /* End of FOR loop */
1736 int pciehp_enable_slot(struct slot
*p_slot
)
1740 struct pci_func
*func
;
1742 func
= pciehp_slot_find(p_slot
->bus
, p_slot
->device
, 0);
1744 dbg("%s: Error! slot NULL\n", __FUNCTION__
);
1748 /* Check to see if (latch closed, card present, power off) */
1749 down(&p_slot
->ctrl
->crit_sect
);
1751 rc
= p_slot
->hpc_ops
->get_adapter_status(p_slot
, &getstatus
);
1752 if (rc
|| !getstatus
) {
1753 info("%s: no adapter on slot(%x)\n", __FUNCTION__
, p_slot
->number
);
1754 up(&p_slot
->ctrl
->crit_sect
);
1757 if (MRL_SENS(p_slot
->ctrl
->ctrlcap
)) {
1758 rc
= p_slot
->hpc_ops
->get_latch_status(p_slot
, &getstatus
);
1759 if (rc
|| getstatus
) {
1760 info("%s: latch open on slot(%x)\n", __FUNCTION__
, p_slot
->number
);
1761 up(&p_slot
->ctrl
->crit_sect
);
1766 if (POWER_CTRL(p_slot
->ctrl
->ctrlcap
)) {
1767 rc
= p_slot
->hpc_ops
->get_power_status(p_slot
, &getstatus
);
1768 if (rc
|| getstatus
) {
1769 info("%s: already enabled on slot(%x)\n", __FUNCTION__
, p_slot
->number
);
1770 up(&p_slot
->ctrl
->crit_sect
);
1774 up(&p_slot
->ctrl
->crit_sect
);
1778 func
= pciehp_slot_create(p_slot
->bus
);
1782 func
->bus
= p_slot
->bus
;
1783 func
->device
= p_slot
->device
;
1785 func
->configured
= 0;
1786 func
->is_a_board
= 1;
1788 /* We have to save the presence info for these slots */
1789 p_slot
->hpc_ops
->get_adapter_status(p_slot
, &(func
->presence_save
));
1790 p_slot
->hpc_ops
->get_latch_status(p_slot
, &getstatus
);
1791 func
->switch_save
= !getstatus
? 0x10:0;
1793 rc
= board_added(func
, p_slot
->ctrl
);
1795 if (is_bridge(func
))
1796 bridge_slot_remove(func
);
1800 /* Setup slot structure with entry for empty slot */
1801 func
= pciehp_slot_create(p_slot
->bus
);
1803 return 1; /* Out of memory */
1805 func
->bus
= p_slot
->bus
;
1806 func
->device
= p_slot
->device
;
1808 func
->configured
= 0;
1809 func
->is_a_board
= 1;
1811 /* We have to save the presence info for these slots */
1812 p_slot
->hpc_ops
->get_adapter_status(p_slot
, &(func
->presence_save
));
1813 p_slot
->hpc_ops
->get_latch_status(p_slot
, &getstatus
);
1814 func
->switch_save
= !getstatus
? 0x10:0;
1818 update_slot_info(p_slot
);
1824 int pciehp_disable_slot(struct slot
*p_slot
)
1826 u8 class_code
, header_type
, BCR
;
1832 struct pci_bus
*pci_bus
= p_slot
->ctrl
->pci_dev
->subordinate
;
1833 struct pci_func
*func
;
1838 /* Check to see if (latch closed, card present, power on) */
1839 down(&p_slot
->ctrl
->crit_sect
);
1841 if (!HP_SUPR_RM(p_slot
->ctrl
->ctrlcap
)) {
1842 ret
= p_slot
->hpc_ops
->get_adapter_status(p_slot
, &getstatus
);
1843 if (ret
|| !getstatus
) {
1844 info("%s: no adapter on slot(%x)\n", __FUNCTION__
, p_slot
->number
);
1845 up(&p_slot
->ctrl
->crit_sect
);
1850 if (MRL_SENS(p_slot
->ctrl
->ctrlcap
)) {
1851 ret
= p_slot
->hpc_ops
->get_latch_status(p_slot
, &getstatus
);
1852 if (ret
|| getstatus
) {
1853 info("%s: latch open on slot(%x)\n", __FUNCTION__
, p_slot
->number
);
1854 up(&p_slot
->ctrl
->crit_sect
);
1859 if (POWER_CTRL(p_slot
->ctrl
->ctrlcap
)) {
1860 ret
= p_slot
->hpc_ops
->get_power_status(p_slot
, &getstatus
);
1861 if (ret
|| !getstatus
) {
1862 info("%s: already disabled slot(%x)\n", __FUNCTION__
, p_slot
->number
);
1863 up(&p_slot
->ctrl
->crit_sect
);
1868 up(&p_slot
->ctrl
->crit_sect
);
1870 func
= pciehp_slot_find(p_slot
->bus
, p_slot
->device
, index
++);
1872 /* Make sure there are no video controllers here
1873 * for all func of p_slot
1875 while (func
&& !rc
) {
1876 pci_bus
->number
= func
->bus
;
1877 devfn
= PCI_DEVFN(func
->device
, func
->function
);
1879 /* Check the Class Code */
1880 rc
= pci_bus_read_config_byte (pci_bus
, devfn
, 0x0B, &class_code
);
1884 if (class_code
== PCI_BASE_CLASS_DISPLAY
) {
1885 /* Display/Video adapter (not supported) */
1886 rc
= REMOVE_NOT_SUPPORTED
;
1888 /* See if it's a bridge */
1889 rc
= pci_bus_read_config_byte (pci_bus
, devfn
, PCI_HEADER_TYPE
, &header_type
);
1893 /* If it's a bridge, check the VGA Enable bit */
1894 if ((header_type
& 0x7F) == PCI_HEADER_TYPE_BRIDGE
) {
1895 rc
= pci_bus_read_config_byte (pci_bus
, devfn
, PCI_BRIDGE_CONTROL
, &BCR
);
1899 /* If the VGA Enable bit is set, remove isn't supported */
1900 if (BCR
& PCI_BRIDGE_CTL_VGA
) {
1901 rc
= REMOVE_NOT_SUPPORTED
;
1906 func
= pciehp_slot_find(p_slot
->bus
, p_slot
->device
, index
++);
1909 func
= pciehp_slot_find(p_slot
->bus
, p_slot
->device
, 0);
1910 if ((func
!= NULL
) && !rc
) {
1911 rc
= remove_board(func
, p_slot
->ctrl
);
1916 update_slot_info(p_slot
);
1923 * configure_new_device - Configures the PCI header information of one board.
1925 * @ctrl: pointer to controller structure
1926 * @func: pointer to function structure
1927 * @behind_bridge: 1 if this is a recursive call, 0 if not
1928 * @resources: pointer to set of resource lists
1930 * Returns 0 if success
1933 static u32
configure_new_device(struct controller
* ctrl
, struct pci_func
* func
,
1934 u8 behind_bridge
, struct resource_lists
* resources
, u8 bridge_bus
, u8 bridge_dev
)
1936 u8 temp_byte
, function
, max_functions
, stop_it
;
1939 struct pci_func
*new_slot
;
1940 struct pci_bus lpci_bus
, *pci_bus
;
1945 dbg("%s\n", __FUNCTION__
);
1946 memcpy(&lpci_bus
, ctrl
->pci_dev
->subordinate
, sizeof(lpci_bus
));
1947 pci_bus
= &lpci_bus
;
1948 pci_bus
->number
= func
->bus
;
1950 /* Check for Multi-function device */
1951 rc
= pci_bus_read_config_byte(pci_bus
, PCI_DEVFN(func
->device
, func
->function
), 0x0E, &temp_byte
);
1953 dbg("%s: rc = %d\n", __FUNCTION__
, rc
);
1957 if (temp_byte
& 0x80) /* Multi-function device */
1965 rc
= configure_new_function(ctrl
, new_slot
, behind_bridge
,
1966 resources
, bridge_bus
, bridge_dev
);
1969 dbg("configure_new_function failed: %d\n", rc
);
1973 new_slot
= pciehp_slot_find(new_slot
->bus
,
1974 new_slot
->device
, index
++);
1977 pciehp_return_board_resources(new_slot
,
1988 /* The following loop skips to the next present function
1989 * and creates a board structure
1992 while ((function
< max_functions
) && (!stop_it
)) {
1993 pci_bus_read_config_dword(pci_bus
, PCI_DEVFN(func
->device
, function
), 0x00, &ID
);
1995 if (ID
== 0xFFFFFFFF) { /* There's nothing there. */
1997 } else { /* There's something there */
1998 /* Setup slot structure. */
1999 new_slot
= pciehp_slot_create(func
->bus
);
2001 if (new_slot
== NULL
) {
2006 new_slot
->bus
= func
->bus
;
2007 new_slot
->device
= func
->device
;
2008 new_slot
->function
= function
;
2009 new_slot
->is_a_board
= 1;
2010 new_slot
->status
= 0;
2016 } while (function
< max_functions
);
2017 dbg("returning from %s\n", __FUNCTION__
);
2023 * Configuration logic that involves the hotplug data structures and
2028 * configure_bridge: fill bridge's registers, either configure or disable it.
2031 configure_bridge(struct pci_bus
*pci_bus
, unsigned int devfn
,
2032 struct pci_resource
*mem_node
,
2033 struct pci_resource
**hold_mem_node
,
2034 int base_addr
, int limit_addr
)
2040 memcpy(*hold_mem_node
, mem_node
, sizeof(struct pci_resource
));
2041 mem_node
->next
= NULL
;
2043 /* set Mem base and Limit registers */
2044 RES_CHECK(mem_node
->base
, 16);
2045 temp_word
= (u16
)(mem_node
->base
>> 16);
2046 rc
= pci_bus_write_config_word(pci_bus
, devfn
, base_addr
, temp_word
);
2048 RES_CHECK(mem_node
->base
+ mem_node
->length
- 1, 16);
2049 temp_word
= (u16
)((mem_node
->base
+ mem_node
->length
- 1) >> 16);
2050 rc
= pci_bus_write_config_word(pci_bus
, devfn
, limit_addr
, temp_word
);
2053 rc
= pci_bus_write_config_word(pci_bus
, devfn
, base_addr
, temp_word
);
2056 rc
= pci_bus_write_config_word(pci_bus
, devfn
, limit_addr
, temp_word
);
2058 kfree(*hold_mem_node
);
2059 *hold_mem_node
= NULL
;
2065 configure_new_bridge(struct controller
*ctrl
, struct pci_func
*func
,
2066 u8 behind_bridge
, struct resource_lists
*resources
,
2067 struct pci_bus
*pci_bus
)
2076 struct pci_resource
*mem_node
;
2077 struct pci_resource
*p_mem_node
;
2078 struct pci_resource
*io_node
;
2079 struct pci_resource
*bus_node
;
2080 struct pci_resource
*hold_mem_node
;
2081 struct pci_resource
*hold_p_mem_node
;
2082 struct pci_resource
*hold_IO_node
;
2083 struct pci_resource
*hold_bus_node
;
2084 struct irq_mapping irqs
;
2085 struct pci_func
*new_slot
;
2086 struct resource_lists temp_resources
;
2088 devfn
= PCI_DEVFN(func
->device
, func
->function
);
2090 /* set Primary bus */
2091 dbg("set Primary bus = 0x%x\n", func
->bus
);
2092 rc
= pci_bus_write_config_byte(pci_bus
, devfn
, PCI_PRIMARY_BUS
, func
->bus
);
2096 /* find range of busses to use */
2097 bus_node
= get_max_resource(&resources
->bus_head
, 1L);
2099 /* If we don't have any busses to allocate, we can't continue */
2101 err("Got NO bus resource to use\n");
2104 dbg("Got ranges of buses to use: base:len=0x%x:%x\n", bus_node
->base
, bus_node
->length
);
2106 /* set Secondary bus */
2107 temp_byte
= (u8
)bus_node
->base
;
2108 dbg("set Secondary bus = 0x%x\n", temp_byte
);
2109 rc
= pci_bus_write_config_byte(pci_bus
, devfn
, PCI_SECONDARY_BUS
, temp_byte
);
2113 /* set subordinate bus */
2114 temp_byte
= (u8
)(bus_node
->base
+ bus_node
->length
- 1);
2115 dbg("set subordinate bus = 0x%x\n", temp_byte
);
2116 rc
= pci_bus_write_config_byte (pci_bus
, devfn
, PCI_SUBORDINATE_BUS
, temp_byte
);
2120 /* Set HP parameters (Cache Line Size, Latency Timer) */
2121 rc
= pciehprm_set_hpp(ctrl
, func
, PCI_HEADER_TYPE_BRIDGE
);
2125 /* Setup the IO, memory, and prefetchable windows */
2127 io_node
= get_max_resource(&(resources
->io_head
), 0x1000L
);
2129 dbg("io_node(base, len, next) (%x, %x, %p)\n", io_node
->base
,
2130 io_node
->length
, io_node
->next
);
2133 mem_node
= get_max_resource(&(resources
->mem_head
), 0x100000L
);
2135 dbg("mem_node(base, len, next) (%x, %x, %p)\n", mem_node
->base
,
2136 mem_node
->length
, mem_node
->next
);
2139 if (resources
->p_mem_head
)
2140 p_mem_node
= get_max_resource(&(resources
->p_mem_head
), 0x100000L
);
2143 * In some platform implementation, MEM and PMEM are not
2144 * distinguished, and hence ACPI _CRS has only MEM entries
2145 * for both MEM and PMEM.
2147 dbg("using MEM for PMEM\n");
2148 p_mem_node
= get_max_resource(&(resources
->mem_head
), 0x100000L
);
2151 dbg("p_mem_node(base, len, next) (%x, %x, %p)\n", p_mem_node
->base
,
2152 p_mem_node
->length
, p_mem_node
->next
);
2155 /* set up the IRQ info */
2156 if (!resources
->irqs
) {
2157 irqs
.barber_pole
= 0;
2158 irqs
.interrupt
[0] = 0;
2159 irqs
.interrupt
[1] = 0;
2160 irqs
.interrupt
[2] = 0;
2161 irqs
.interrupt
[3] = 0;
2164 irqs
.barber_pole
= resources
->irqs
->barber_pole
;
2165 irqs
.interrupt
[0] = resources
->irqs
->interrupt
[0];
2166 irqs
.interrupt
[1] = resources
->irqs
->interrupt
[1];
2167 irqs
.interrupt
[2] = resources
->irqs
->interrupt
[2];
2168 irqs
.interrupt
[3] = resources
->irqs
->interrupt
[3];
2169 irqs
.valid_INT
= resources
->irqs
->valid_INT
;
2172 /* set up resource lists that are now aligned on top and bottom
2173 * for anything behind the bridge.
2175 temp_resources
.bus_head
= bus_node
;
2176 temp_resources
.io_head
= io_node
;
2177 temp_resources
.mem_head
= mem_node
;
2178 temp_resources
.p_mem_head
= p_mem_node
;
2179 temp_resources
.irqs
= &irqs
;
2181 /* Make copies of the nodes we are going to pass down so that
2182 * if there is a problem,we can just use these to free resources
2184 hold_bus_node
= kmalloc(sizeof(struct pci_resource
), GFP_KERNEL
);
2185 hold_IO_node
= kmalloc(sizeof(struct pci_resource
), GFP_KERNEL
);
2186 hold_mem_node
= kmalloc(sizeof(struct pci_resource
), GFP_KERNEL
);
2187 hold_p_mem_node
= kmalloc(sizeof(struct pci_resource
), GFP_KERNEL
);
2189 if (!hold_bus_node
|| !hold_IO_node
|| !hold_mem_node
|| !hold_p_mem_node
) {
2190 kfree(hold_bus_node
);
2191 kfree(hold_IO_node
);
2192 kfree(hold_mem_node
);
2193 kfree(hold_p_mem_node
);
2198 memcpy(hold_bus_node
, bus_node
, sizeof(struct pci_resource
));
2200 bus_node
->base
+= 1;
2201 bus_node
->length
-= 1;
2202 bus_node
->next
= NULL
;
2204 /* If we have IO resources copy them and fill in the bridge's
2205 * IO range registers
2208 memcpy(hold_IO_node
, io_node
, sizeof(struct pci_resource
));
2209 io_node
->next
= NULL
;
2211 /* set IO base and Limit registers */
2212 RES_CHECK(io_node
->base
, 8);
2213 temp_byte
= (u8
)(io_node
->base
>> 8);
2214 rc
= pci_bus_write_config_byte (pci_bus
, devfn
, PCI_IO_BASE
, temp_byte
);
2216 RES_CHECK(io_node
->base
+ io_node
->length
- 1, 8);
2217 temp_byte
= (u8
)((io_node
->base
+ io_node
->length
- 1) >> 8);
2218 rc
= pci_bus_write_config_byte (pci_bus
, devfn
, PCI_IO_LIMIT
, temp_byte
);
2220 kfree(hold_IO_node
);
2221 hold_IO_node
= NULL
;
2224 /* If we have memory resources copy them and fill in the bridge's
2225 * memory range registers. Otherwise, fill in the range
2226 * registers with values that disable them.
2228 rc
= configure_bridge(pci_bus
, devfn
, mem_node
, &hold_mem_node
,
2229 PCI_MEMORY_BASE
, PCI_MEMORY_LIMIT
);
2231 /* If we have prefetchable memory resources copy them and
2232 * fill in the bridge's memory range registers. Otherwise,
2233 * fill in the range registers with values that disable them.
2235 rc
= configure_bridge(pci_bus
, devfn
, p_mem_node
, &hold_p_mem_node
,
2236 PCI_PREF_MEMORY_BASE
, PCI_PREF_MEMORY_LIMIT
);
2238 /* Adjust this to compensate for extra adjustment in first loop */
2243 /* Here we actually find the devices and configure them */
2244 for (device
= 0; (device
<= 0x1F) && !rc
; device
++) {
2245 irqs
.barber_pole
= (irqs
.barber_pole
+ 1) & 0x03;
2248 pci_bus
->number
= hold_bus_node
->base
;
2249 pci_bus_read_config_dword (pci_bus
, PCI_DEVFN(device
, 0), PCI_VENDOR_ID
, &ID
);
2250 pci_bus
->number
= func
->bus
;
2252 if (ID
!= 0xFFFFFFFF) { /* device Present */
2253 /* Setup slot structure. */
2254 new_slot
= pciehp_slot_create(hold_bus_node
->base
);
2256 if (new_slot
== NULL
) {
2262 new_slot
->bus
= hold_bus_node
->base
;
2263 new_slot
->device
= device
;
2264 new_slot
->function
= 0;
2265 new_slot
->is_a_board
= 1;
2266 new_slot
->status
= 0;
2268 rc
= configure_new_device(ctrl
, new_slot
, 1,
2269 &temp_resources
, func
->bus
,
2271 dbg("configure_new_device rc=0x%x\n",rc
);
2272 } /* End of IF (device in slot?) */
2273 } /* End of FOR loop */
2276 pciehp_destroy_resource_list(&temp_resources
);
2278 return_resource(&(resources
->bus_head
), hold_bus_node
);
2279 return_resource(&(resources
->io_head
), hold_IO_node
);
2280 return_resource(&(resources
->mem_head
), hold_mem_node
);
2281 return_resource(&(resources
->p_mem_head
), hold_p_mem_node
);
2285 /* save the interrupt routing information */
2286 if (resources
->irqs
) {
2287 resources
->irqs
->interrupt
[0] = irqs
.interrupt
[0];
2288 resources
->irqs
->interrupt
[1] = irqs
.interrupt
[1];
2289 resources
->irqs
->interrupt
[2] = irqs
.interrupt
[2];
2290 resources
->irqs
->interrupt
[3] = irqs
.interrupt
[3];
2291 resources
->irqs
->valid_INT
= irqs
.valid_INT
;
2292 } else if (!behind_bridge
) {
2293 /* We need to hook up the interrupts here */
2294 for (cloop
= 0; cloop
< 4; cloop
++) {
2295 if (irqs
.valid_INT
& (0x01 << cloop
)) {
2296 rc
= pciehp_set_irq(func
->bus
, func
->device
,
2297 0x0A + cloop
, irqs
.interrupt
[cloop
]);
2299 pciehp_destroy_resource_list (&temp_resources
);
2300 return_resource(&(resources
->bus_head
), hold_bus_node
);
2301 return_resource(&(resources
->io_head
), hold_IO_node
);
2302 return_resource(&(resources
->mem_head
), hold_mem_node
);
2303 return_resource(&(resources
->p_mem_head
), hold_p_mem_node
);
2307 } /* end of for loop */
2310 /* Return unused bus resources
2311 * First use the temporary node to store information for the board
2313 if (hold_bus_node
&& bus_node
&& temp_resources
.bus_head
) {
2314 hold_bus_node
->length
= bus_node
->base
- hold_bus_node
->base
;
2316 hold_bus_node
->next
= func
->bus_head
;
2317 func
->bus_head
= hold_bus_node
;
2319 temp_byte
= (u8
)(temp_resources
.bus_head
->base
- 1);
2321 /* set subordinate bus */
2322 dbg("re-set subordinate bus = 0x%x\n", temp_byte
);
2323 rc
= pci_bus_write_config_byte (pci_bus
, devfn
, PCI_SUBORDINATE_BUS
, temp_byte
);
2325 if (temp_resources
.bus_head
->length
== 0) {
2326 kfree(temp_resources
.bus_head
);
2327 temp_resources
.bus_head
= NULL
;
2329 dbg("return bus res of b:d(0x%x:%x) base:len(0x%x:%x)\n",
2330 func
->bus
, func
->device
, temp_resources
.bus_head
->base
, temp_resources
.bus_head
->length
);
2331 return_resource(&(resources
->bus_head
), temp_resources
.bus_head
);
2335 /* If we have IO space available and there is some left,
2336 * return the unused portion
2338 if (hold_IO_node
&& temp_resources
.io_head
) {
2339 io_node
= do_pre_bridge_resource_split(&(temp_resources
.io_head
),
2340 &hold_IO_node
, 0x1000);
2342 /* Check if we were able to split something off */
2344 hold_IO_node
->base
= io_node
->base
+ io_node
->length
;
2346 RES_CHECK(hold_IO_node
->base
, 8);
2347 temp_byte
= (u8
)((hold_IO_node
->base
) >> 8);
2348 rc
= pci_bus_write_config_byte (pci_bus
, devfn
, PCI_IO_BASE
, temp_byte
);
2350 return_resource(&(resources
->io_head
), io_node
);
2353 io_node
= do_bridge_resource_split(&(temp_resources
.io_head
), 0x1000);
2355 /* Check if we were able to split something off */
2357 /* First use the temporary node to store information for the board */
2358 hold_IO_node
->length
= io_node
->base
- hold_IO_node
->base
;
2360 /* If we used any, add it to the board's list */
2361 if (hold_IO_node
->length
) {
2362 hold_IO_node
->next
= func
->io_head
;
2363 func
->io_head
= hold_IO_node
;
2365 RES_CHECK(io_node
->base
- 1, 8);
2366 temp_byte
= (u8
)((io_node
->base
- 1) >> 8);
2367 rc
= pci_bus_write_config_byte (pci_bus
, devfn
, PCI_IO_LIMIT
, temp_byte
);
2369 return_resource(&(resources
->io_head
), io_node
);
2371 /* it doesn't need any IO */
2373 rc
= pci_bus_write_config_byte(pci_bus
, devfn
, PCI_IO_LIMIT
, temp_byte
);
2375 return_resource(&(resources
->io_head
), io_node
);
2376 kfree(hold_IO_node
);
2379 /* it used most of the range */
2380 hold_IO_node
->next
= func
->io_head
;
2381 func
->io_head
= hold_IO_node
;
2383 } else if (hold_IO_node
) {
2384 /* it used the whole range */
2385 hold_IO_node
->next
= func
->io_head
;
2386 func
->io_head
= hold_IO_node
;
2389 /* If we have memory space available and there is some left,
2390 * return the unused portion
2392 if (hold_mem_node
&& temp_resources
.mem_head
) {
2393 mem_node
= do_pre_bridge_resource_split(&(temp_resources
.mem_head
), &hold_mem_node
, 0x100000L
);
2395 /* Check if we were able to split something off */
2397 hold_mem_node
->base
= mem_node
->base
+ mem_node
->length
;
2399 RES_CHECK(hold_mem_node
->base
, 16);
2400 temp_word
= (u16
)((hold_mem_node
->base
) >> 16);
2401 rc
= pci_bus_write_config_word (pci_bus
, devfn
, PCI_MEMORY_BASE
, temp_word
);
2403 return_resource(&(resources
->mem_head
), mem_node
);
2406 mem_node
= do_bridge_resource_split(&(temp_resources
.mem_head
), 0x100000L
);
2408 /* Check if we were able to split something off */
2410 /* First use the temporary node to store information for the board */
2411 hold_mem_node
->length
= mem_node
->base
- hold_mem_node
->base
;
2413 if (hold_mem_node
->length
) {
2414 hold_mem_node
->next
= func
->mem_head
;
2415 func
->mem_head
= hold_mem_node
;
2417 /* configure end address */
2418 RES_CHECK(mem_node
->base
- 1, 16);
2419 temp_word
= (u16
)((mem_node
->base
- 1) >> 16);
2420 rc
= pci_bus_write_config_word (pci_bus
, devfn
, PCI_MEMORY_LIMIT
, temp_word
);
2422 /* Return unused resources to the pool */
2423 return_resource(&(resources
->mem_head
), mem_node
);
2425 /* it doesn't need any Mem */
2427 rc
= pci_bus_write_config_word (pci_bus
, devfn
, PCI_MEMORY_LIMIT
, temp_word
);
2429 return_resource(&(resources
->mem_head
), mem_node
);
2430 kfree(hold_mem_node
);
2433 /* it used most of the range */
2434 hold_mem_node
->next
= func
->mem_head
;
2435 func
->mem_head
= hold_mem_node
;
2437 } else if (hold_mem_node
) {
2438 /* it used the whole range */
2439 hold_mem_node
->next
= func
->mem_head
;
2440 func
->mem_head
= hold_mem_node
;
2443 /* If we have prefetchable memory space available and there is some
2444 * left at the end, return the unused portion
2446 if (hold_p_mem_node
&& temp_resources
.p_mem_head
) {
2447 p_mem_node
= do_pre_bridge_resource_split(&(temp_resources
.p_mem_head
),
2448 &hold_p_mem_node
, 0x100000L
);
2450 /* Check if we were able to split something off */
2452 hold_p_mem_node
->base
= p_mem_node
->base
+ p_mem_node
->length
;
2454 RES_CHECK(hold_p_mem_node
->base
, 16);
2455 temp_word
= (u16
)((hold_p_mem_node
->base
) >> 16);
2456 rc
= pci_bus_write_config_word (pci_bus
, devfn
, PCI_PREF_MEMORY_BASE
, temp_word
);
2458 return_resource(&(resources
->p_mem_head
), p_mem_node
);
2461 p_mem_node
= do_bridge_resource_split(&(temp_resources
.p_mem_head
), 0x100000L
);
2463 /* Check if we were able to split something off */
2465 /* First use the temporary node to store information for the board */
2466 hold_p_mem_node
->length
= p_mem_node
->base
- hold_p_mem_node
->base
;
2468 /* If we used any, add it to the board's list */
2469 if (hold_p_mem_node
->length
) {
2470 hold_p_mem_node
->next
= func
->p_mem_head
;
2471 func
->p_mem_head
= hold_p_mem_node
;
2473 RES_CHECK(p_mem_node
->base
- 1, 16);
2474 temp_word
= (u16
)((p_mem_node
->base
- 1) >> 16);
2475 rc
= pci_bus_write_config_word (pci_bus
, devfn
, PCI_PREF_MEMORY_LIMIT
, temp_word
);
2477 return_resource(&(resources
->p_mem_head
), p_mem_node
);
2479 /* it doesn't need any PMem */
2481 rc
= pci_bus_write_config_word (pci_bus
, devfn
, PCI_PREF_MEMORY_LIMIT
, temp_word
);
2483 return_resource(&(resources
->p_mem_head
), p_mem_node
);
2484 kfree(hold_p_mem_node
);
2487 /* it used the most of the range */
2488 hold_p_mem_node
->next
= func
->p_mem_head
;
2489 func
->p_mem_head
= hold_p_mem_node
;
2491 } else if (hold_p_mem_node
) {
2492 /* it used the whole range */
2493 hold_p_mem_node
->next
= func
->p_mem_head
;
2494 func
->p_mem_head
= hold_p_mem_node
;
2497 /* We should be configuring an IRQ and the bridge's base address
2498 * registers if it needs them. Although we have never seen such
2502 pciehprm_enable_card(ctrl
, func
, PCI_HEADER_TYPE_BRIDGE
);
2504 dbg("PCI Bridge Hot-Added s:b:d:f(%02x:%02x:%02x:%02x)\n", ctrl
->seg
, func
->bus
, func
->device
, func
->function
);
2510 * configure_new_function - Configures the PCI header information of one device
2512 * @ctrl: pointer to controller structure
2513 * @func: pointer to function structure
2514 * @behind_bridge: 1 if this is a recursive call, 0 if not
2515 * @resources: pointer to set of resource lists
2517 * Calls itself recursively for bridged devices.
2518 * Returns 0 if success
2522 configure_new_function(struct controller
*ctrl
, struct pci_func
*func
,
2523 u8 behind_bridge
, struct resource_lists
*resources
,
2524 u8 bridge_bus
, u8 bridge_dev
)
2533 struct pci_resource
*mem_node
;
2534 struct pci_resource
*io_node
;
2535 struct pci_bus lpci_bus
, *pci_bus
;
2537 memcpy(&lpci_bus
, ctrl
->pci_dev
->subordinate
, sizeof(lpci_bus
));
2538 pci_bus
= &lpci_bus
;
2539 pci_bus
->number
= func
->bus
;
2540 devfn
= PCI_DEVFN(func
->device
, func
->function
);
2542 /* Check for Bridge */
2543 rc
= pci_bus_read_config_byte(pci_bus
, devfn
, PCI_HEADER_TYPE
, &temp_byte
);
2546 dbg("%s: bus %x dev %x func %x temp_byte = %x\n", __FUNCTION__
,
2547 func
->bus
, func
->device
, func
->function
, temp_byte
);
2549 if ((temp_byte
& 0x7F) == PCI_HEADER_TYPE_BRIDGE
) { /* PCI-PCI Bridge */
2550 rc
= configure_new_bridge(ctrl
, func
, behind_bridge
, resources
,
2555 } else if ((temp_byte
& 0x7F) == PCI_HEADER_TYPE_NORMAL
) {
2556 /* Standard device */
2558 rc
= pci_bus_read_config_byte(pci_bus
, devfn
, 0x0B, &class_code
);
2560 if (class_code
== PCI_BASE_CLASS_DISPLAY
)
2561 return DEVICE_TYPE_NOT_SUPPORTED
;
2563 /* Figure out IO and memory needs */
2564 for (cloop
= PCI_BASE_ADDRESS_0
; cloop
<= PCI_BASE_ADDRESS_5
; cloop
+= 4) {
2565 temp_register
= 0xFFFFFFFF;
2567 rc
= pci_bus_write_config_dword (pci_bus
, devfn
, cloop
, temp_register
);
2568 rc
= pci_bus_read_config_dword(pci_bus
, devfn
, cloop
, &temp_register
);
2569 dbg("Bar[%x]=0x%x on bus:dev:func(0x%x:%x:%x)\n", cloop
, temp_register
,
2570 func
->bus
, func
->device
, func
->function
);
2576 if (temp_register
& PCI_BASE_ADDRESS_SPACE_IO
) {
2579 /* set base = amount of IO space */
2580 base
= temp_register
& 0xFFFFFFFC;
2583 dbg("NEED IO length(0x%x)\n", base
);
2584 io_node
= get_io_resource(&(resources
->io_head
),(ulong
)base
);
2586 /* allocate the resource to the board */
2588 dbg("Got IO base=0x%x(length=0x%x)\n", io_node
->base
, io_node
->length
);
2589 base
= (u32
)io_node
->base
;
2590 io_node
->next
= func
->io_head
;
2591 func
->io_head
= io_node
;
2593 err("Got NO IO resource(length=0x%x)\n", base
);
2596 } else { /* map MEM */
2597 int prefetchable
= 1;
2598 struct pci_resource
**res_node
= &func
->p_mem_head
;
2599 char *res_type_str
= "PMEM";
2602 if (!(temp_register
& PCI_BASE_ADDRESS_MEM_PREFETCH
)) {
2604 res_node
= &func
->mem_head
;
2608 base
= temp_register
& 0xFFFFFFF0;
2611 switch (temp_register
& PCI_BASE_ADDRESS_MEM_TYPE_MASK
) {
2612 case PCI_BASE_ADDRESS_MEM_TYPE_32
:
2613 dbg("NEED 32 %s bar=0x%x(length=0x%x)\n", res_type_str
, temp_register
, base
);
2615 if (prefetchable
&& resources
->p_mem_head
)
2616 mem_node
=get_resource(&(resources
->p_mem_head
), (ulong
)base
);
2619 dbg("using MEM for PMEM\n");
2620 mem_node
= get_resource(&(resources
->mem_head
), (ulong
)base
);
2623 /* allocate the resource to the board */
2625 base
= (u32
)mem_node
->base
;
2626 mem_node
->next
= *res_node
;
2627 *res_node
= mem_node
;
2628 dbg("Got 32 %s base=0x%x(length=0x%x)\n", res_type_str
, mem_node
->base
,
2631 err("Got NO 32 %s resource(length=0x%x)\n", res_type_str
, base
);
2635 case PCI_BASE_ADDRESS_MEM_TYPE_64
:
2636 rc
= pci_bus_read_config_dword(pci_bus
, devfn
, cloop
+4, &temp_register2
);
2637 dbg("NEED 64 %s bar=0x%x:%x(length=0x%x)\n", res_type_str
, temp_register2
,
2638 temp_register
, base
);
2640 if (prefetchable
&& resources
->p_mem_head
)
2641 mem_node
= get_resource(&(resources
->p_mem_head
), (ulong
)base
);
2644 dbg("using MEM for PMEM\n");
2645 mem_node
= get_resource(&(resources
->mem_head
), (ulong
)base
);
2648 /* allocate the resource to the board */
2650 base64
= mem_node
->base
;
2651 mem_node
->next
= *res_node
;
2652 *res_node
= mem_node
;
2653 dbg("Got 64 %s base=0x%x:%x(length=%x)\n", res_type_str
, (u32
)(base64
>> 32),
2654 (u32
)base64
, mem_node
->length
);
2656 err("Got NO 64 %s resource(length=0x%x)\n", res_type_str
, base
);
2661 dbg("reserved BAR type=0x%x\n", temp_register
);
2668 rc
= pci_bus_write_config_dword(pci_bus
, devfn
, cloop
, (u32
)base64
);
2673 dbg("%s: high dword of base64(0x%x) set to 0\n", __FUNCTION__
, (u32
)base64
);
2677 rc
= pci_bus_write_config_dword(pci_bus
, devfn
, cloop
, (u32
)base64
);
2679 rc
= pci_bus_write_config_dword(pci_bus
, devfn
, cloop
, base
);
2681 } /* End of base register loop */
2683 /* disable ROM base Address */
2684 rc
= pci_bus_write_config_dword (pci_bus
, devfn
, PCI_ROM_ADDRESS
, 0x00);
2686 /* Set HP parameters (Cache Line Size, Latency Timer) */
2687 rc
= pciehprm_set_hpp(ctrl
, func
, PCI_HEADER_TYPE_NORMAL
);
2691 pciehprm_enable_card(ctrl
, func
, PCI_HEADER_TYPE_NORMAL
);
2693 dbg("PCI function Hot-Added s:b:d:f(%02x:%02x:%02x:%02x)\n", ctrl
->seg
, func
->bus
, func
->device
,
2695 } /* End of Not-A-Bridge else */
2697 /* It's some strange type of PCI adapter (Cardbus?) */
2698 return DEVICE_TYPE_NOT_SUPPORTED
;
2701 func
->configured
= 1;