2 #include <linux/acpi.h>
3 #include <linux/init.h>
9 static int __devinit
can_skip_ioresource_align(const struct dmi_system_id
*d
)
11 pci_probe
|= PCI_CAN_SKIP_ISA_ALIGN
;
12 printk(KERN_INFO
"PCI: %s detected, can skip ISA alignment\n", d
->ident
);
16 static struct dmi_system_id acpi_pciprobe_dmi_table
[] = {
18 * Systems where PCI IO resource ISA alignment can be skipped
19 * when the ISA enable bit in the bridge control is not set
22 .callback
= can_skip_ioresource_align
,
23 .ident
= "IBM System x3800",
25 DMI_MATCH(DMI_SYS_VENDOR
, "IBM"),
26 DMI_MATCH(DMI_PRODUCT_NAME
, "x3800"),
30 .callback
= can_skip_ioresource_align
,
31 .ident
= "IBM System x3850",
33 DMI_MATCH(DMI_SYS_VENDOR
, "IBM"),
34 DMI_MATCH(DMI_PRODUCT_NAME
, "x3850"),
38 .callback
= can_skip_ioresource_align
,
39 .ident
= "IBM System x3950",
41 DMI_MATCH(DMI_SYS_VENDOR
, "IBM"),
42 DMI_MATCH(DMI_PRODUCT_NAME
, "x3950"),
48 struct pci_root_info
{
57 resource_to_addr(struct acpi_resource
*resource
,
58 struct acpi_resource_address64
*addr
)
62 status
= acpi_resource_to_address64(resource
, addr
);
63 if (ACPI_SUCCESS(status
) &&
64 (addr
->resource_type
== ACPI_MEMORY_RANGE
||
65 addr
->resource_type
== ACPI_IO_RANGE
) &&
66 addr
->address_length
> 0 &&
67 addr
->producer_consumer
== ACPI_PRODUCER
) {
74 count_resource(struct acpi_resource
*acpi_res
, void *data
)
76 struct pci_root_info
*info
= data
;
77 struct acpi_resource_address64 addr
;
80 if (info
->res_num
>= PCI_BUS_NUM_RESOURCES
)
83 status
= resource_to_addr(acpi_res
, &addr
);
84 if (ACPI_SUCCESS(status
))
90 setup_resource(struct acpi_resource
*acpi_res
, void *data
)
92 struct pci_root_info
*info
= data
;
94 struct acpi_resource_address64 addr
;
97 struct resource
*root
;
99 if (info
->res_num
>= PCI_BUS_NUM_RESOURCES
)
102 status
= resource_to_addr(acpi_res
, &addr
);
103 if (!ACPI_SUCCESS(status
))
106 if (addr
.resource_type
== ACPI_MEMORY_RANGE
) {
107 root
= &iomem_resource
;
108 flags
= IORESOURCE_MEM
;
109 if (addr
.info
.mem
.caching
== ACPI_PREFETCHABLE_MEMORY
)
110 flags
|= IORESOURCE_PREFETCH
;
111 } else if (addr
.resource_type
== ACPI_IO_RANGE
) {
112 root
= &ioport_resource
;
113 flags
= IORESOURCE_IO
;
117 res
= &info
->res
[info
->res_num
];
118 res
->name
= info
->name
;
120 res
->start
= addr
.minimum
+ addr
.translation_offset
;
121 res
->end
= res
->start
+ addr
.address_length
- 1;
124 if (insert_resource(root
, res
)) {
125 printk(KERN_ERR
"PCI: Failed to allocate 0x%lx-0x%lx "
126 "from %s for %s\n", (unsigned long) res
->start
,
127 (unsigned long) res
->end
, root
->name
, info
->name
);
129 info
->bus
->resource
[info
->res_num
] = res
;
136 adjust_transparent_bridge_resources(struct pci_bus
*bus
)
140 list_for_each_entry(dev
, &bus
->devices
, bus_list
) {
142 u16
class = dev
->class >> 8;
144 if (class == PCI_CLASS_BRIDGE_PCI
&& dev
->transparent
) {
145 for(i
= 3; i
< PCI_BUS_NUM_RESOURCES
; i
++)
146 dev
->subordinate
->resource
[i
] =
147 dev
->bus
->resource
[i
- 3];
153 get_current_resources(struct acpi_device
*device
, int busnum
,
156 struct pci_root_info info
;
161 acpi_walk_resources(device
->handle
, METHOD_NAME__CRS
, count_resource
,
166 size
= sizeof(*info
.res
) * info
.res_num
;
167 info
.res
= kmalloc(size
, GFP_KERNEL
);
171 info
.name
= kmalloc(12, GFP_KERNEL
);
173 goto name_alloc_fail
;
174 sprintf(info
.name
, "PCI Bus #%02x", busnum
);
177 acpi_walk_resources(device
->handle
, METHOD_NAME__CRS
, setup_resource
,
180 adjust_transparent_bridge_resources(bus
);
190 struct pci_bus
* __devinit
pci_acpi_scan_root(struct acpi_device
*device
, int domain
, int busnum
)
193 struct pci_sysdata
*sd
;
196 dmi_check_system(acpi_pciprobe_dmi_table
);
198 if (domain
&& !pci_domains_supported
) {
199 printk(KERN_WARNING
"PCI: Multiple domains not supported "
200 "(dom %d, bus %d)\n", domain
, busnum
);
204 /* Allocate per-root-bus (not per bus) arch-specific data.
205 * TODO: leak; this memory is never freed.
206 * It's arguable whether it's worth the trouble to care.
208 sd
= kzalloc(sizeof(*sd
), GFP_KERNEL
);
210 printk(KERN_ERR
"PCI: OOM, not probing PCI bus %02x\n", busnum
);
217 pxm
= acpi_get_pxm(device
->handle
);
218 #ifdef CONFIG_ACPI_NUMA
220 sd
->node
= pxm_to_node(pxm
);
223 bus
= pci_scan_bus_parented(NULL
, busnum
, &pci_root_ops
, sd
);
227 #ifdef CONFIG_ACPI_NUMA
230 printk("bus %d -> pxm %d -> node %d\n",
231 busnum
, pxm
, sd
->node
);
236 if (bus
&& (pci_probe
& PCI_USE__CRS
))
237 get_current_resources(device
, busnum
, bus
);
242 extern int pci_routeirq
;
243 static int __init
pci_acpi_init(void)
245 struct pci_dev
*dev
= NULL
;
253 printk(KERN_INFO
"PCI: Using ACPI for IRQ routing\n");
254 acpi_irq_penalty_init();
256 pcibios_enable_irq
= acpi_pci_irq_enable
;
257 pcibios_disable_irq
= acpi_pci_irq_disable
;
261 * PCI IRQ routing is set up by pci_enable_device(), but we
262 * also do it here in case there are still broken drivers that
263 * don't use pci_enable_device().
265 printk(KERN_INFO
"PCI: Routing PCI interrupts for all devices because \"pci=routeirq\" specified\n");
266 for_each_pci_dev(dev
)
267 acpi_pci_irq_enable(dev
);
269 printk(KERN_INFO
"PCI: If a device doesn't work, try \"pci=routeirq\". If it helps, post a report\n");
271 #ifdef CONFIG_X86_IO_APIC
278 subsys_initcall(pci_acpi_init
);