1ba6ab11d8
We currently keep 2 lists of PCI devices in the system, one in the driver core, and one all on its own. This second list is sorted at boot time, in "BIOS" order, to try to remain compatible with older kernels (2.2 and earlier days). There was also a "nosort" option to turn this sorting off, to remain compatible with even older kernel versions, but that just ends up being what we have been doing from 2.5 days... Unfortunately, the second list of devices is not really ever used to determine the probing order of PCI devices or drivers[1]. That is done using the driver core list instead. This change happened back in the early 2.5 days. Relying on BIOS ording for the binding of drivers to specific device names is problematic for many reasons, and userspace tools like udev exist to properly name devices in a persistant manner if that is needed, no reliance on the BIOS is needed. Matt Domsch and others at Dell noticed this back in 2006, and added a boot option to sort the PCI device lists (both of them) in a breadth-first manner to help remain compatible with the 2.4 order, if needed for any reason. This option is not going away, as some systems rely on them. This patch removes the sorting of the internal PCI device list in "BIOS" mode, as it's not needed at all anymore, and hasn't for many years. I've also removed the PCI flags for this from some other arches that for some reason defined them, but never used them. This should not change the ordering of any drivers or device probing. [1] The old-style pci_get_device and pci_find_device() still used this sorting order, but there are very few drivers that use these functions, as they are deprecated for use in this manner. If for some reason, a driver rely on the order and uses these functions, the breadth-first boot option will resolve any problem. Cc: Matt Domsch <Matt_Domsch@dell.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
81 lines
2.2 KiB
C
81 lines
2.2 KiB
C
/* ASB2305 Arch-specific PCI declarations
|
|
*
|
|
* Copyright (C) 2007 Red Hat, Inc. All Rights Reserved.
|
|
* Written by David Howells (dhowells@redhat.com)
|
|
* Derived from: arch/i386/kernel/pci-i386.h: (c) 1999 Martin Mares <mj@ucw.cz>
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public Licence
|
|
* as published by the Free Software Foundation; either version
|
|
* 2 of the Licence, or (at your option) any later version.
|
|
*/
|
|
#ifndef _PCI_ASB2305_H
|
|
#define _PCI_ASB2305_H
|
|
|
|
#undef DEBUG
|
|
|
|
#ifdef DEBUG
|
|
#define DBG(x...) printk(x)
|
|
#else
|
|
#define DBG(x...)
|
|
#endif
|
|
|
|
#define PCI_PROBE_BIOS 1
|
|
#define PCI_PROBE_CONF1 2
|
|
#define PCI_PROBE_CONF2 4
|
|
#define PCI_NO_CHECKS 0x400
|
|
#define PCI_ASSIGN_ROMS 0x1000
|
|
#define PCI_BIOS_IRQ_SCAN 0x2000
|
|
|
|
extern unsigned int pci_probe;
|
|
|
|
/* pci-asb2305.c */
|
|
|
|
extern unsigned int pcibios_max_latency;
|
|
|
|
extern void pcibios_resource_survey(void);
|
|
extern int pcibios_enable_resources(struct pci_dev *dev, int mask);
|
|
|
|
/* pci.c */
|
|
|
|
extern int pcibios_last_bus;
|
|
extern struct pci_bus *pci_root_bus;
|
|
extern struct pci_ops *pci_root_ops;
|
|
|
|
extern struct irq_routing_table *pcibios_get_irq_routing_table(void);
|
|
extern int pcibios_set_irq_routing(struct pci_dev *dev, int pin, int irq);
|
|
|
|
/* pci-irq.c */
|
|
|
|
struct irq_info {
|
|
u8 bus, devfn; /* Bus, device and function */
|
|
struct {
|
|
u8 link; /* IRQ line ID, chipset dependent,
|
|
* 0=not routed */
|
|
u16 bitmap; /* Available IRQs */
|
|
} __attribute__((packed)) irq[4];
|
|
u8 slot; /* Slot number, 0=onboard */
|
|
u8 rfu;
|
|
} __attribute__((packed));
|
|
|
|
struct irq_routing_table {
|
|
u32 signature; /* PIRQ_SIGNATURE should be here */
|
|
u16 version; /* PIRQ_VERSION */
|
|
u16 size; /* Table size in bytes */
|
|
u8 rtr_bus, rtr_devfn; /* Where the interrupt router lies */
|
|
u16 exclusive_irqs; /* IRQs devoted exclusively to PCI usage */
|
|
u16 rtr_vendor, rtr_device; /* Vendor and device ID of interrupt router */
|
|
u32 miniport_data; /* Crap */
|
|
u8 rfu[11];
|
|
u8 checksum; /* Modulo 256 checksum must give zero */
|
|
struct irq_info slots[0];
|
|
} __attribute__((packed));
|
|
|
|
extern unsigned int pcibios_irq_mask;
|
|
|
|
extern void pcibios_irq_init(void);
|
|
extern void pcibios_fixup_irqs(void);
|
|
extern void pcibios_enable_irq(struct pci_dev *dev);
|
|
|
|
#endif /* PCI_ASB2305_H */
|