diff options
Diffstat (limited to 'arch/i386/pci')
-rw-r--r-- | arch/i386/pci/early.c | 7 | ||||
-rw-r--r-- | arch/i386/pci/irq.c | 4 | ||||
-rw-r--r-- | arch/i386/pci/pcbios.c | 11 |
3 files changed, 19 insertions, 3 deletions
diff --git a/arch/i386/pci/early.c b/arch/i386/pci/early.c index 713d6c866cae..42df4b6606df 100644 --- a/arch/i386/pci/early.c +++ b/arch/i386/pci/early.c | |||
@@ -45,6 +45,13 @@ void write_pci_config(u8 bus, u8 slot, u8 func, u8 offset, | |||
45 | outl(val, 0xcfc); | 45 | outl(val, 0xcfc); |
46 | } | 46 | } |
47 | 47 | ||
48 | void write_pci_config_byte(u8 bus, u8 slot, u8 func, u8 offset, u8 val) | ||
49 | { | ||
50 | PDprintk("%x writing to %x: %x\n", slot, offset, val); | ||
51 | outl(0x80000000 | (bus<<16) | (slot<<11) | (func<<8) | offset, 0xcf8); | ||
52 | outb(val, 0xcfc); | ||
53 | } | ||
54 | |||
48 | int early_pci_allowed(void) | 55 | int early_pci_allowed(void) |
49 | { | 56 | { |
50 | return (pci_probe & (PCI_PROBE_CONF1|PCI_PROBE_NOEARLY)) == | 57 | return (pci_probe & (PCI_PROBE_CONF1|PCI_PROBE_NOEARLY)) == |
diff --git a/arch/i386/pci/irq.c b/arch/i386/pci/irq.c index e65551cd8216..f2cb942f8281 100644 --- a/arch/i386/pci/irq.c +++ b/arch/i386/pci/irq.c | |||
@@ -764,7 +764,7 @@ static void __init pirq_find_router(struct irq_router *r) | |||
764 | DBG(KERN_DEBUG "PCI: Attempting to find IRQ router for %04x:%04x\n", | 764 | DBG(KERN_DEBUG "PCI: Attempting to find IRQ router for %04x:%04x\n", |
765 | rt->rtr_vendor, rt->rtr_device); | 765 | rt->rtr_vendor, rt->rtr_device); |
766 | 766 | ||
767 | pirq_router_dev = pci_find_slot(rt->rtr_bus, rt->rtr_devfn); | 767 | pirq_router_dev = pci_get_bus_and_slot(rt->rtr_bus, rt->rtr_devfn); |
768 | if (!pirq_router_dev) { | 768 | if (!pirq_router_dev) { |
769 | DBG(KERN_DEBUG "PCI: Interrupt router not found at " | 769 | DBG(KERN_DEBUG "PCI: Interrupt router not found at " |
770 | "%02x:%02x\n", rt->rtr_bus, rt->rtr_devfn); | 770 | "%02x:%02x\n", rt->rtr_bus, rt->rtr_devfn); |
@@ -784,6 +784,8 @@ static void __init pirq_find_router(struct irq_router *r) | |||
784 | pirq_router_dev->vendor, | 784 | pirq_router_dev->vendor, |
785 | pirq_router_dev->device, | 785 | pirq_router_dev->device, |
786 | pci_name(pirq_router_dev)); | 786 | pci_name(pirq_router_dev)); |
787 | |||
788 | /* The device remains referenced for the kernel lifetime */ | ||
787 | } | 789 | } |
788 | 790 | ||
789 | static struct irq_info *pirq_get_info(struct pci_dev *dev) | 791 | static struct irq_info *pirq_get_info(struct pci_dev *dev) |
diff --git a/arch/i386/pci/pcbios.c b/arch/i386/pci/pcbios.c index ed1512a175ab..5f5193401bea 100644 --- a/arch/i386/pci/pcbios.c +++ b/arch/i386/pci/pcbios.c | |||
@@ -5,6 +5,7 @@ | |||
5 | #include <linux/pci.h> | 5 | #include <linux/pci.h> |
6 | #include <linux/init.h> | 6 | #include <linux/init.h> |
7 | #include <linux/module.h> | 7 | #include <linux/module.h> |
8 | #include <linux/uaccess.h> | ||
8 | #include "pci.h" | 9 | #include "pci.h" |
9 | #include "pci-functions.h" | 10 | #include "pci-functions.h" |
10 | 11 | ||
@@ -314,6 +315,10 @@ static struct pci_raw_ops * __devinit pci_find_bios(void) | |||
314 | for (check = (union bios32 *) __va(0xe0000); | 315 | for (check = (union bios32 *) __va(0xe0000); |
315 | check <= (union bios32 *) __va(0xffff0); | 316 | check <= (union bios32 *) __va(0xffff0); |
316 | ++check) { | 317 | ++check) { |
318 | long sig; | ||
319 | if (probe_kernel_address(&check->fields.signature, sig)) | ||
320 | continue; | ||
321 | |||
317 | if (check->fields.signature != BIOS32_SIGNATURE) | 322 | if (check->fields.signature != BIOS32_SIGNATURE) |
318 | continue; | 323 | continue; |
319 | length = check->fields.length * 16; | 324 | length = check->fields.length * 16; |
@@ -331,11 +336,13 @@ static struct pci_raw_ops * __devinit pci_find_bios(void) | |||
331 | } | 336 | } |
332 | DBG("PCI: BIOS32 Service Directory structure at 0x%p\n", check); | 337 | DBG("PCI: BIOS32 Service Directory structure at 0x%p\n", check); |
333 | if (check->fields.entry >= 0x100000) { | 338 | if (check->fields.entry >= 0x100000) { |
334 | printk("PCI: BIOS32 entry (0x%p) in high memory, cannot use.\n", check); | 339 | printk("PCI: BIOS32 entry (0x%p) in high memory, " |
340 | "cannot use.\n", check); | ||
335 | return NULL; | 341 | return NULL; |
336 | } else { | 342 | } else { |
337 | unsigned long bios32_entry = check->fields.entry; | 343 | unsigned long bios32_entry = check->fields.entry; |
338 | DBG("PCI: BIOS32 Service Directory entry at 0x%lx\n", bios32_entry); | 344 | DBG("PCI: BIOS32 Service Directory entry at 0x%lx\n", |
345 | bios32_entry); | ||
339 | bios32_indirect.address = bios32_entry + PAGE_OFFSET; | 346 | bios32_indirect.address = bios32_entry + PAGE_OFFSET; |
340 | if (check_pcibios()) | 347 | if (check_pcibios()) |
341 | return &pci_bios_access; | 348 | return &pci_bios_access; |