2 * Standard 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>, <dely.l.sy@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/proc_fs.h>
37 #include <linux/pci.h>
41 #include "../../../arch/i386/pci/pci.h" /* horrible hack showing how processor dependant we are... */
44 int shpchp_configure_device (struct controller
* ctrl
, struct pci_func
* func
)
47 struct pci_bus
*child
;
50 if (func
->pci_dev
== NULL
)
51 func
->pci_dev
= pci_find_slot(func
->bus
, PCI_DEVFN(func
->device
, func
->function
));
53 /* Still NULL ? Well then scan for it ! */
54 if (func
->pci_dev
== NULL
) {
55 num
= pci_scan_slot(ctrl
->pci_dev
->subordinate
, PCI_DEVFN(func
->device
, func
->function
));
57 dbg("%s: subordiante %p number %x\n", __FUNCTION__
, ctrl
->pci_dev
->subordinate
,
58 ctrl
->pci_dev
->subordinate
->number
);
59 pci_bus_add_devices(ctrl
->pci_dev
->subordinate
);
62 func
->pci_dev
= pci_find_slot(func
->bus
, PCI_DEVFN(func
->device
, func
->function
));
63 if (func
->pci_dev
== NULL
) {
64 dbg("ERROR: pci_dev still null\n");
69 if (func
->pci_dev
->hdr_type
== PCI_HEADER_TYPE_BRIDGE
) {
70 pci_read_config_byte(func
->pci_dev
, PCI_SECONDARY_BUS
, &bus
);
71 child
= pci_add_new_bus(func
->pci_dev
->bus
, (func
->pci_dev
), bus
);
72 pci_do_scan_bus(child
);
80 int shpchp_unconfigure_device(struct pci_func
* func
)
85 dbg("%s: bus/dev/func = %x/%x/%x\n", __FUNCTION__
, func
->bus
,
86 func
->device
, func
->function
);
88 for (j
=0; j
<8 ; j
++) {
89 struct pci_dev
* temp
= pci_find_slot(func
->bus
,
90 (func
->device
<< 3) | j
);
92 pci_remove_bus_device(temp
);
101 * @bus_num: bus number of PCI device
102 * @dev_num: device number of PCI device
103 * @slot: pointer to u8 where slot number will be returned
105 int shpchp_set_irq (u8 bus_num
, u8 dev_num
, u8 int_pin
, u8 irq_num
)
107 #if defined(CONFIG_X86) && !defined(CONFIG_X86_IO_APIC) && !defined(CONFIG_X86_64)
110 struct pci_dev fakedev
;
111 struct pci_bus fakebus
;
113 fakedev
.devfn
= dev_num
<< 3;
114 fakedev
.bus
= &fakebus
;
115 fakebus
.number
= bus_num
;
116 dbg("%s: dev %d, bus %d, pin %d, num %d\n",
117 __FUNCTION__
, dev_num
, bus_num
, int_pin
, irq_num
);
118 rc
= pcibios_set_irq_routing(&fakedev
, int_pin
- 0x0a, irq_num
);
119 dbg("%s: rc %d\n", __FUNCTION__
, rc
);
123 /* set the Edge Level Control Register (ELCR) */
124 temp_word
= inb(0x4d0);
125 temp_word
|= inb(0x4d1) << 8;
127 temp_word
|= 0x01 << irq_num
;
129 /* This should only be for x86 as it sets the Edge Level Control Register */
130 outb((u8
) (temp_word
& 0xFF), 0x4d0);
131 outb((u8
) ((temp_word
& 0xFF00) >> 8), 0x4d1);
136 /* More PCI configuration routines; this time centered around hotplug controller */
142 * Reads configuration for all slots in a PCI bus and saves info.
144 * Note: For non-hot plug busses, the slot # saved is the device #
146 * returns 0 if success
148 int shpchp_save_config(struct controller
*ctrl
, int busnumber
, int num_ctlr_slots
, int first_device_num
)
155 struct pci_func
*new_slot
;
166 int is_hot_plug
= num_ctlr_slots
|| first_device_num
;
167 struct pci_bus lpci_bus
, *pci_bus
;
169 dbg("%s: num_ctlr_slots = %d, first_device_num = %d\n", __FUNCTION__
,
170 num_ctlr_slots
, first_device_num
);
172 memcpy(&lpci_bus
, ctrl
->pci_dev
->subordinate
, sizeof(lpci_bus
));
175 dbg("%s: num_ctlr_slots = %d, first_device_num = %d\n", __FUNCTION__
,
176 num_ctlr_slots
, first_device_num
);
178 /* Decide which slots are supported */
180 /*********************************
181 * is_hot_plug is the slot mask
182 *********************************/
183 FirstSupported
= first_device_num
;
184 LastSupported
= FirstSupported
+ num_ctlr_slots
- 1;
187 LastSupported
= 0x1F;
190 dbg("FirstSupported = %d, LastSupported = %d\n", FirstSupported
,
193 /* Save PCI configuration space for all devices in supported slots */
194 pci_bus
->number
= busnumber
;
195 for (device
= FirstSupported
; device
<= LastSupported
; device
++) {
197 rc
= pci_bus_read_config_dword(pci_bus
, PCI_DEVFN(device
, 0),
200 if (ID
!= 0xFFFFFFFF) { /* device in slot */
201 rc
= pci_bus_read_config_byte(pci_bus
, PCI_DEVFN(device
, 0),
206 rc
= pci_bus_read_config_byte(pci_bus
, PCI_DEVFN(device
, 0),
207 PCI_HEADER_TYPE
, &header_type
);
211 dbg("class_code = %x, header_type = %x\n", class_code
, header_type
);
213 /* If multi-function device, set max_functions to 8 */
214 if (header_type
& 0x80)
224 if ((header_type
& 0x7F) == PCI_HEADER_TYPE_BRIDGE
) { /* P-P Bridge */
225 /* Recurse the subordinate bus
226 * get the subordinate bus number
228 rc
= pci_bus_read_config_byte(pci_bus
,
229 PCI_DEVFN(device
, function
),
230 PCI_SECONDARY_BUS
, &secondary_bus
);
234 sub_bus
= (int) secondary_bus
;
236 /* Save secondary bus cfg spc with this recursive call. */
237 rc
= shpchp_save_config(ctrl
, sub_bus
, 0, 0);
244 new_slot
= shpchp_slot_find(busnumber
, device
, index
++);
246 dbg("new_slot = %p\n", new_slot
);
248 while (new_slot
&& (new_slot
->function
!= (u8
) function
)) {
249 new_slot
= shpchp_slot_find(busnumber
, device
, index
++);
250 dbg("new_slot = %p\n", new_slot
);
253 /* Setup slot structure. */
254 new_slot
= shpchp_slot_create(busnumber
);
255 dbg("new_slot = %p\n", new_slot
);
257 if (new_slot
== NULL
)
261 new_slot
->bus
= (u8
) busnumber
;
262 new_slot
->device
= (u8
) device
;
263 new_slot
->function
= (u8
) function
;
264 new_slot
->is_a_board
= 1;
265 new_slot
->switch_save
= 0x10;
266 new_slot
->pwr_save
= 1;
267 /* In case of unsupported board */
268 new_slot
->status
= DevError
;
269 new_slot
->pci_dev
= pci_find_slot(new_slot
->bus
,
270 (new_slot
->device
<< 3) | new_slot
->function
);
271 dbg("new_slot->pci_dev = %p\n", new_slot
->pci_dev
);
273 for (cloop
= 0; cloop
< 0x20; cloop
++) {
274 rc
= pci_bus_read_config_dword(pci_bus
,
275 PCI_DEVFN(device
, function
),
277 (u32
*) &(new_slot
->config_space
[cloop
]));
278 /* dbg("new_slot->config_space[%x] = %x\n",
279 cloop, new_slot->config_space[cloop]); */
288 /* this loop skips to the next present function
289 * reading in Class Code and Header type.
292 while ((function
< max_functions
)&&(!stop_it
)) {
293 rc
= pci_bus_read_config_dword(pci_bus
,
294 PCI_DEVFN(device
, function
),
297 if (ID
== 0xFFFFFFFF) { /* nothing there. */
299 dbg("Nothing there\n");
300 } else { /* Something there */
301 rc
= pci_bus_read_config_byte(pci_bus
,
302 PCI_DEVFN(device
, function
),
307 rc
= pci_bus_read_config_byte(pci_bus
,
308 PCI_DEVFN(device
, function
),
309 PCI_HEADER_TYPE
, &header_type
);
313 dbg("class_code = %x, header_type = %x\n",
314 class_code
, header_type
);
319 } while (function
< max_functions
);
320 /* End of IF (device in slot?) */
321 } else if (is_hot_plug
) {
322 /* Setup slot structure with entry for empty slot */
323 new_slot
= shpchp_slot_create(busnumber
);
325 if (new_slot
== NULL
) {
328 dbg("new_slot = %p\n", new_slot
);
330 new_slot
->bus
= (u8
) busnumber
;
331 new_slot
->device
= (u8
) device
;
332 new_slot
->function
= 0;
333 new_slot
->is_a_board
= 0;
334 new_slot
->presence_save
= 0;
335 new_slot
->switch_save
= 0;
337 } /* End of FOR loop */
344 * shpchp_save_slot_config
346 * Saves configuration info for all PCI devices in a given slot
347 * including subordinate busses.
349 * returns 0 if success
351 int shpchp_save_slot_config(struct controller
*ctrl
, struct pci_func
* new_slot
)
363 struct pci_bus lpci_bus
, *pci_bus
;
364 memcpy(&lpci_bus
, ctrl
->pci_dev
->subordinate
, sizeof(lpci_bus
));
366 pci_bus
->number
= new_slot
->bus
;
370 pci_bus_read_config_dword(pci_bus
, PCI_DEVFN(new_slot
->device
, 0),
373 if (ID
!= 0xFFFFFFFF) { /* device in slot */
374 pci_bus_read_config_byte(pci_bus
, PCI_DEVFN(new_slot
->device
, 0),
377 pci_bus_read_config_byte(pci_bus
, PCI_DEVFN(new_slot
->device
, 0),
378 PCI_HEADER_TYPE
, &header_type
);
380 if (header_type
& 0x80) /* Multi-function device */
388 if ((header_type
& 0x7F) == PCI_HEADER_TYPE_BRIDGE
) { /* PCI-PCI Bridge */
389 /* Recurse the subordinate bus */
390 pci_bus_read_config_byte(pci_bus
,
391 PCI_DEVFN(new_slot
->device
, function
),
392 PCI_SECONDARY_BUS
, &secondary_bus
);
394 sub_bus
= (int) secondary_bus
;
396 /* Save the config headers for the secondary bus. */
397 rc
= shpchp_save_config(ctrl
, sub_bus
, 0, 0);
404 new_slot
->status
= 0;
406 for (cloop
= 0; cloop
< 0x20; cloop
++) {
407 pci_bus_read_config_dword(pci_bus
,
408 PCI_DEVFN(new_slot
->device
, function
),
410 (u32
*) &(new_slot
->config_space
[cloop
]));
417 /* this loop skips to the next present function
418 * reading in the Class Code and the Header type.
421 while ((function
< max_functions
) && (!stop_it
)) {
422 pci_bus_read_config_dword(pci_bus
,
423 PCI_DEVFN(new_slot
->device
, function
),
426 if (ID
== 0xFFFFFFFF) { /* nothing there. */
428 } else { /* Something there */
429 pci_bus_read_config_byte(pci_bus
,
430 PCI_DEVFN(new_slot
->device
, function
),
433 pci_bus_read_config_byte(pci_bus
,
434 PCI_DEVFN(new_slot
->device
, function
),
435 PCI_HEADER_TYPE
, &header_type
);
441 } while (function
< max_functions
);
442 } /* End of IF (device in slot?) */
452 * shpchp_save_used_resources
454 * Stores used resource information for existing boards. this is
455 * for boards that were in the system when this driver was loaded.
456 * this function is for hot plug ADD
458 * returns 0 if success
459 * if disable == 1(DISABLE_CARD),
460 * it loops for all functions of the slot and disables them.
461 * else, it just get resources of the function and return.
463 int shpchp_save_used_resources(struct controller
*ctrl
, struct pci_func
*func
, int disable
)
471 u16 w_base
, w_length
;
478 struct pci_resource
*mem_node
= NULL
;
479 struct pci_resource
*p_mem_node
= NULL
;
480 struct pci_resource
*t_mem_node
;
481 struct pci_resource
*io_node
;
482 struct pci_resource
*bus_node
;
483 struct pci_bus lpci_bus
, *pci_bus
;
484 memcpy(&lpci_bus
, ctrl
->pci_dev
->subordinate
, sizeof(lpci_bus
));
488 func
= shpchp_slot_find(func
->bus
, func
->device
, index
++);
490 while ((func
!= NULL
) && func
->is_a_board
) {
491 pci_bus
->number
= func
->bus
;
492 devfn
= PCI_DEVFN(func
->device
, func
->function
);
494 /* Save the command register */
495 pci_bus_read_config_word(pci_bus
, devfn
, PCI_COMMAND
, &save_command
);
500 pci_bus_write_config_word(pci_bus
, devfn
, PCI_COMMAND
, command
);
503 /* Check for Bridge */
504 pci_bus_read_config_byte(pci_bus
, devfn
, PCI_HEADER_TYPE
, &header_type
);
506 if ((header_type
& 0x7F) == PCI_HEADER_TYPE_BRIDGE
) { /* PCI-PCI Bridge */
507 dbg("Save_used_res of PCI bridge b:d=0x%x:%x, sc=0x%x\n",
508 func
->bus
, func
->device
, save_command
);
510 /* Clear Bridge Control Register */
512 pci_bus_write_config_word(pci_bus
, devfn
, PCI_BRIDGE_CONTROL
, command
);
515 pci_bus_read_config_byte(pci_bus
, devfn
, PCI_SECONDARY_BUS
, &secondary_bus
);
516 pci_bus_read_config_byte(pci_bus
, devfn
, PCI_SUBORDINATE_BUS
, &temp_byte
);
518 bus_node
= kmalloc(sizeof(struct pci_resource
),
523 bus_node
->base
= (ulong
)secondary_bus
;
524 bus_node
->length
= (ulong
)(temp_byte
- secondary_bus
+ 1);
526 bus_node
->next
= func
->bus_head
;
527 func
->bus_head
= bus_node
;
529 /* Save IO base and Limit registers */
530 pci_bus_read_config_byte(pci_bus
, devfn
, PCI_IO_BASE
, &temp_byte
);
532 pci_bus_read_config_byte(pci_bus
, devfn
, PCI_IO_LIMIT
, &temp_byte
);
535 if ((base
<= length
) && (!disable
|| (save_command
& PCI_COMMAND_IO
))) {
536 io_node
= kmalloc(sizeof(struct pci_resource
),
541 io_node
->base
= (ulong
)(base
& PCI_IO_RANGE_MASK
) << 8;
542 io_node
->length
= (ulong
)(length
- base
+ 0x10) << 8;
544 io_node
->next
= func
->io_head
;
545 func
->io_head
= io_node
;
548 /* Save memory base and Limit registers */
549 pci_bus_read_config_word(pci_bus
, devfn
, PCI_MEMORY_BASE
, &w_base
);
550 pci_bus_read_config_word(pci_bus
, devfn
, PCI_MEMORY_LIMIT
, &w_length
);
552 if ((w_base
<= w_length
) && (!disable
|| (save_command
& PCI_COMMAND_MEMORY
))) {
553 mem_node
= kmalloc(sizeof(struct pci_resource
),
558 mem_node
->base
= (ulong
)w_base
<< 16;
559 mem_node
->length
= (ulong
)(w_length
- w_base
+ 0x10) << 16;
561 mem_node
->next
= func
->mem_head
;
562 func
->mem_head
= mem_node
;
564 /* Save prefetchable memory base and Limit registers */
565 pci_bus_read_config_word(pci_bus
, devfn
, PCI_PREF_MEMORY_BASE
, &w_base
);
566 pci_bus_read_config_word(pci_bus
, devfn
, PCI_PREF_MEMORY_LIMIT
, &w_length
);
568 if ((w_base
<= w_length
) && (!disable
|| (save_command
& PCI_COMMAND_MEMORY
))) {
569 p_mem_node
= kmalloc(sizeof(struct pci_resource
),
574 p_mem_node
->base
= (ulong
)w_base
<< 16;
575 p_mem_node
->length
= (ulong
)(w_length
- w_base
+ 0x10) << 16;
577 p_mem_node
->next
= func
->p_mem_head
;
578 func
->p_mem_head
= p_mem_node
;
580 } else if ((header_type
& 0x7F) == PCI_HEADER_TYPE_NORMAL
) {
581 dbg("Save_used_res of PCI adapter b:d=0x%x:%x, sc=0x%x\n",
582 func
->bus
, func
->device
, save_command
);
584 /* Figure out IO and memory base lengths */
585 for (cloop
= PCI_BASE_ADDRESS_0
; cloop
<= PCI_BASE_ADDRESS_5
; cloop
+= 4) {
586 pci_bus_read_config_dword(pci_bus
, devfn
, cloop
, &save_base
);
588 temp_register
= 0xFFFFFFFF;
589 pci_bus_write_config_dword(pci_bus
, devfn
, cloop
, temp_register
);
590 pci_bus_read_config_dword(pci_bus
, devfn
, cloop
, &temp_register
);
593 pci_bus_write_config_dword(pci_bus
, devfn
, cloop
, save_base
);
598 base
= temp_register
;
600 if ((base
& PCI_BASE_ADDRESS_SPACE_IO
) &&
601 (!disable
|| (save_command
& PCI_COMMAND_IO
))) {
603 /* set temp_register = amount of IO space requested */
604 base
= base
& 0xFFFFFFFCL
;
607 io_node
= kmalloc(sizeof (struct pci_resource
),
612 io_node
->base
= (ulong
)save_base
& PCI_BASE_ADDRESS_IO_MASK
;
613 io_node
->length
= (ulong
)base
;
614 dbg("sur adapter: IO bar=0x%x(length=0x%x)\n",
615 io_node
->base
, io_node
->length
);
617 io_node
->next
= func
->io_head
;
618 func
->io_head
= io_node
;
619 } else { /* map Memory */
620 int prefetchable
= 1;
621 /* struct pci_resources **res_node; */
622 char *res_type_str
= "PMEM";
625 t_mem_node
= kmalloc(sizeof (struct pci_resource
),
630 if (!(base
& PCI_BASE_ADDRESS_MEM_PREFETCH
) &&
631 (!disable
|| (save_command
& PCI_COMMAND_MEMORY
))) {
633 mem_node
= t_mem_node
;
636 p_mem_node
= t_mem_node
;
638 base
= base
& 0xFFFFFFF0L
;
641 switch (temp_register
& PCI_BASE_ADDRESS_MEM_TYPE_MASK
) {
642 case PCI_BASE_ADDRESS_MEM_TYPE_32
:
644 p_mem_node
->base
= (ulong
)save_base
& PCI_BASE_ADDRESS_MEM_MASK
;
645 p_mem_node
->length
= (ulong
)base
;
646 dbg("sur adapter: 32 %s bar=0x%x(length=0x%x)\n",
651 p_mem_node
->next
= func
->p_mem_head
;
652 func
->p_mem_head
= p_mem_node
;
654 mem_node
->base
= (ulong
)save_base
& PCI_BASE_ADDRESS_MEM_MASK
;
655 mem_node
->length
= (ulong
)base
;
656 dbg("sur adapter: 32 %s bar=0x%x(length=0x%x)\n",
661 mem_node
->next
= func
->mem_head
;
662 func
->mem_head
= mem_node
;
665 case PCI_BASE_ADDRESS_MEM_TYPE_64
:
666 pci_bus_read_config_dword(pci_bus
, devfn
, cloop
+4, &temp_register2
);
667 base64
= temp_register2
;
668 base64
= (base64
<< 32) | save_base
;
670 if (temp_register2
) {
671 dbg("sur adapter: 64 %s high dword of base64(0x%x:%x) masked to 0\n",
672 res_type_str
, temp_register2
, (u32
)base64
);
673 base64
&= 0x00000000FFFFFFFFL
;
677 p_mem_node
->base
= base64
& PCI_BASE_ADDRESS_MEM_MASK
;
678 p_mem_node
->length
= base
;
679 dbg("sur adapter: 64 %s base=0x%x(len=0x%x)\n",
684 p_mem_node
->next
= func
->p_mem_head
;
685 func
->p_mem_head
= p_mem_node
;
687 mem_node
->base
= base64
& PCI_BASE_ADDRESS_MEM_MASK
;
688 mem_node
->length
= base
;
689 dbg("sur adapter: 64 %s base=0x%x(len=0x%x)\n",
694 mem_node
->next
= func
->mem_head
;
695 func
->mem_head
= mem_node
;
700 dbg("asur: reserved BAR type=0x%x\n",
705 } /* End of base register loop */
706 } else { /* Some other unknown header type */
707 dbg("Save_used_res of PCI unknown type b:d=0x%x:%x. skip.\n",
708 func
->bus
, func
->device
);
711 /* find the next device in this slot */
714 func
= shpchp_slot_find(func
->bus
, func
->device
, index
++);
721 * kfree_resource_list: release memory of all list members
722 * @res: resource list to free
725 return_resource_list(struct pci_resource
**func
, struct pci_resource
**res
)
727 struct pci_resource
*node
;
728 struct pci_resource
*t_node
;
734 return_resource(res
, node
);
740 * shpchp_return_board_resources
742 * this routine returns all resources allocated to a board to
743 * the available pool.
745 * returns 0 if success
747 int shpchp_return_board_resources(struct pci_func
* func
,
748 struct resource_lists
* resources
)
751 dbg("%s\n", __FUNCTION__
);
756 return_resource_list(&(func
->io_head
),&(resources
->io_head
));
757 return_resource_list(&(func
->mem_head
),&(resources
->mem_head
));
758 return_resource_list(&(func
->p_mem_head
),&(resources
->p_mem_head
));
759 return_resource_list(&(func
->bus_head
),&(resources
->bus_head
));
761 rc
= shpchp_resource_sort_and_combine(&(resources
->mem_head
));
762 rc
|= shpchp_resource_sort_and_combine(&(resources
->p_mem_head
));
763 rc
|= shpchp_resource_sort_and_combine(&(resources
->io_head
));
764 rc
|= shpchp_resource_sort_and_combine(&(resources
->bus_head
));
770 * kfree_resource_list: release memory of all list members
771 * @res: resource list to free
774 kfree_resource_list(struct pci_resource
**r
)
776 struct pci_resource
*res
, *tres
;
789 * shpchp_destroy_resource_list: put node back in the resource list
790 * @resources: list to put nodes back
792 void shpchp_destroy_resource_list(struct resource_lists
*resources
)
794 kfree_resource_list(&(resources
->io_head
));
795 kfree_resource_list(&(resources
->mem_head
));
796 kfree_resource_list(&(resources
->p_mem_head
));
797 kfree_resource_list(&(resources
->bus_head
));
801 * shpchp_destroy_board_resources: put node back in the resource list
802 * @resources: list to put nodes back
804 void shpchp_destroy_board_resources(struct pci_func
* func
)
806 kfree_resource_list(&(func
->io_head
));
807 kfree_resource_list(&(func
->mem_head
));
808 kfree_resource_list(&(func
->p_mem_head
));
809 kfree_resource_list(&(func
->bus_head
));