You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/pci-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/pci-2.6: (22 commits) PCI Hotplug: move pci_hotplug.h to include/linux/ change pci hotplug subsystem maintainer to Kristen PCI: optionally sort device lists breadth-first cpcihp_generic: prevent loading without "bridge" parameter pci: Additional search functions PCI: quirks: switch quirks code offender to use pci_get API PCI: Update MSI-HOWTO.txt according to pci_msi_supported() PCI: Improve pci_msi_supported() comments PCI hotplug: ioremap balanced with iounmap shpchp: remove unnecessary cmd_busy member from struct controller shpchp: fix command completion check pci: Stamp out pci_find_* usage in fakephp PCI: fix pcie_portdrv_restore_config undefined without CONFIG_PM error Fix DMA resource allocation in ACPIPnP PCI: Turn pci_fixup_video into generic for embedded VGA PCI: add ICH7/8 ACPI/GPIO io resource quirks PCI: pcie-check-and-return-bus_register-errors fix PCI: VIA IRQ quirk behaviour change pciehp: Remove unnecessary check in pciehp_ctrl.c pciehp - add missing locking ...
This commit is contained in:
@@ -470,7 +470,68 @@ LOC: 324553 325068
|
||||
ERR: 0
|
||||
MIS: 0
|
||||
|
||||
6. FAQ
|
||||
6. MSI quirks
|
||||
|
||||
Several PCI chipsets or devices are known to not support MSI.
|
||||
The PCI stack provides 3 possible levels of MSI disabling:
|
||||
* on a single device
|
||||
* on all devices behind a specific bridge
|
||||
* globally
|
||||
|
||||
6.1. Disabling MSI on a single device
|
||||
|
||||
Under some circumstances, it might be required to disable MSI on a
|
||||
single device, It may be achived by either not calling pci_enable_msi()
|
||||
or all, or setting the pci_dev->no_msi flag before (most of the time
|
||||
in a quirk).
|
||||
|
||||
6.2. Disabling MSI below a bridge
|
||||
|
||||
The vast majority of MSI quirks are required by PCI bridges not
|
||||
being able to route MSI between busses. In this case, MSI have to be
|
||||
disabled on all devices behind this bridge. It is achieves by setting
|
||||
the PCI_BUS_FLAGS_NO_MSI flag in the pci_bus->bus_flags of the bridge
|
||||
subordinate bus. There is no need to set the same flag on bridges that
|
||||
are below the broken brigde. When pci_enable_msi() is called to enable
|
||||
MSI on a device, pci_msi_supported() takes care of checking the NO_MSI
|
||||
flag in all parent busses of the device.
|
||||
|
||||
Some bridges actually support dynamic MSI support enabling/disabling
|
||||
by changing some bits in their PCI configuration space (especially
|
||||
the Hypertransport chipsets such as the nVidia nForce and Serverworks
|
||||
HT2000). It may then be required to update the NO_MSI flag on the
|
||||
corresponding devices in the sysfs hierarchy. To enable MSI support
|
||||
on device "0000:00:0e", do:
|
||||
|
||||
echo 1 > /sys/bus/pci/devices/0000:00:0e/msi_bus
|
||||
|
||||
To disable MSI support, echo 0 instead of 1. Note that it should be
|
||||
used with caution since changing this value might break interrupts.
|
||||
|
||||
6.3. Disabling MSI globally
|
||||
|
||||
Some extreme cases may require to disable MSI globally on the system.
|
||||
For now, the only known case is a Serverworks PCI-X chipsets (MSI are
|
||||
not supported on several busses that are not all connected to the
|
||||
chipset in the Linux PCI hierarchy). In the vast majority of other
|
||||
cases, disabling only behind a specific bridge is enough.
|
||||
|
||||
For debugging purpose, the user may also pass pci=nomsi on the kernel
|
||||
command-line to explicitly disable MSI globally. But, once the appro-
|
||||
priate quirks are added to the kernel, this option should not be
|
||||
required anymore.
|
||||
|
||||
6.4. Finding why MSI cannot be enabled on a device
|
||||
|
||||
Assuming that MSI are not enabled on a device, you should look at
|
||||
dmesg to find messages that quirks may output when disabling MSI
|
||||
on some devices, some bridges or even globally.
|
||||
Then, lspci -t gives the list of bridges above a device. Reading
|
||||
/sys/bus/pci/devices/0000:00:0e/msi_bus will tell you whether MSI
|
||||
are enabled (1) or disabled (0). In 0 is found in a single bridge
|
||||
msi_bus file above the device, MSI cannot be enabled.
|
||||
|
||||
7. FAQ
|
||||
|
||||
Q1. Are there any limitations on using the MSI?
|
||||
|
||||
|
||||
@@ -1231,6 +1231,11 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
machine check when some devices' config space
|
||||
is read. But various workarounds are disabled
|
||||
and some IOMMU drivers will not work.
|
||||
bfsort Sort PCI devices into breadth-first order.
|
||||
This sorting is done to get a device
|
||||
order compatible with older (<= 2.4) kernels.
|
||||
nobfsort Don't sort PCI devices into breadth-first order.
|
||||
|
||||
pcmv= [HW,PCMCIA] BadgePAD 4
|
||||
|
||||
pd. [PARIDE]
|
||||
|
||||
+2
-2
@@ -2309,8 +2309,8 @@ T: quilt kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
|
||||
S: Supported
|
||||
|
||||
PCI HOTPLUG CORE
|
||||
P: Greg Kroah-Hartman
|
||||
M: gregkh@suse.de
|
||||
P: Kristen Carlson Accardi
|
||||
M: kristen.c.accardi@intel.com
|
||||
S: Supported
|
||||
|
||||
PCI HOTPLUG COMPAQ DRIVER
|
||||
|
||||
+57
-2
@@ -20,6 +20,7 @@
|
||||
unsigned int pci_probe = PCI_PROBE_BIOS | PCI_PROBE_CONF1 | PCI_PROBE_CONF2 |
|
||||
PCI_PROBE_MMCONF;
|
||||
|
||||
int pci_bf_sort;
|
||||
int pci_routeirq;
|
||||
int pcibios_last_bus = -1;
|
||||
unsigned long pirq_table_addr;
|
||||
@@ -117,6 +118,20 @@ void __devinit pcibios_fixup_bus(struct pci_bus *b)
|
||||
pci_read_bridge_bases(b);
|
||||
}
|
||||
|
||||
/*
|
||||
* Only use DMI information to set this if nothing was passed
|
||||
* on the kernel command line (which was parsed earlier).
|
||||
*/
|
||||
|
||||
static int __devinit set_bf_sort(struct dmi_system_id *d)
|
||||
{
|
||||
if (pci_bf_sort == pci_bf_sort_default) {
|
||||
pci_bf_sort = pci_dmi_bf;
|
||||
printk(KERN_INFO "PCI: %s detected, enabling pci=bfsort.\n", d->ident);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Enable renumbering of PCI bus# ranges to reach all PCI busses (Cardbus)
|
||||
*/
|
||||
@@ -130,11 +145,11 @@ static int __devinit assign_all_busses(struct dmi_system_id *d)
|
||||
}
|
||||
#endif
|
||||
|
||||
static struct dmi_system_id __devinitdata pciprobe_dmi_table[] = {
|
||||
#ifdef __i386__
|
||||
/*
|
||||
* Laptops which need pci=assign-busses to see Cardbus cards
|
||||
*/
|
||||
static struct dmi_system_id __devinitdata pciprobe_dmi_table[] = {
|
||||
#ifdef __i386__
|
||||
{
|
||||
.callback = assign_all_busses,
|
||||
.ident = "Samsung X20 Laptop",
|
||||
@@ -144,6 +159,38 @@ static struct dmi_system_id __devinitdata pciprobe_dmi_table[] = {
|
||||
},
|
||||
},
|
||||
#endif /* __i386__ */
|
||||
{
|
||||
.callback = set_bf_sort,
|
||||
.ident = "Dell PowerEdge 1950",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Dell"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 1950"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = set_bf_sort,
|
||||
.ident = "Dell PowerEdge 1955",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Dell"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 1955"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = set_bf_sort,
|
||||
.ident = "Dell PowerEdge 2900",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Dell"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 2900"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.callback = set_bf_sort,
|
||||
.ident = "Dell PowerEdge 2950",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Dell"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "PowerEdge 2950"),
|
||||
},
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
@@ -189,6 +236,8 @@ static int __init pcibios_init(void)
|
||||
|
||||
pcibios_resource_survey();
|
||||
|
||||
if (pci_bf_sort >= pci_force_bf)
|
||||
pci_sort_breadthfirst();
|
||||
#ifdef CONFIG_PCI_BIOS
|
||||
if ((pci_probe & PCI_BIOS_SORT) && !(pci_probe & PCI_NO_SORT))
|
||||
pcibios_sort();
|
||||
@@ -203,6 +252,12 @@ char * __devinit pcibios_setup(char *str)
|
||||
if (!strcmp(str, "off")) {
|
||||
pci_probe = 0;
|
||||
return NULL;
|
||||
} else if (!strcmp(str, "bfsort")) {
|
||||
pci_bf_sort = pci_force_bf;
|
||||
return NULL;
|
||||
} else if (!strcmp(str, "nobfsort")) {
|
||||
pci_bf_sort = pci_force_nobf;
|
||||
return NULL;
|
||||
}
|
||||
#ifdef CONFIG_PCI_BIOS
|
||||
else if (!strcmp(str, "bios")) {
|
||||
|
||||
@@ -342,51 +342,6 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_MCH_PB1, pcie_r
|
||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_MCH_PC, pcie_rootport_aspm_quirk );
|
||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_MCH_PC1, pcie_rootport_aspm_quirk );
|
||||
|
||||
/*
|
||||
* Fixup to mark boot BIOS video selected by BIOS before it changes
|
||||
*
|
||||
* From information provided by "Jon Smirl" <jonsmirl@gmail.com>
|
||||
*
|
||||
* The standard boot ROM sequence for an x86 machine uses the BIOS
|
||||
* to select an initial video card for boot display. This boot video
|
||||
* card will have it's BIOS copied to C0000 in system RAM.
|
||||
* IORESOURCE_ROM_SHADOW is used to associate the boot video
|
||||
* card with this copy. On laptops this copy has to be used since
|
||||
* the main ROM may be compressed or combined with another image.
|
||||
* See pci_map_rom() for use of this flag. IORESOURCE_ROM_SHADOW
|
||||
* is marked here since the boot video device will be the only enabled
|
||||
* video device at this point.
|
||||
*/
|
||||
|
||||
static void __devinit pci_fixup_video(struct pci_dev *pdev)
|
||||
{
|
||||
struct pci_dev *bridge;
|
||||
struct pci_bus *bus;
|
||||
u16 config;
|
||||
|
||||
if ((pdev->class >> 8) != PCI_CLASS_DISPLAY_VGA)
|
||||
return;
|
||||
|
||||
/* Is VGA routed to us? */
|
||||
bus = pdev->bus;
|
||||
while (bus) {
|
||||
bridge = bus->self;
|
||||
if (bridge) {
|
||||
pci_read_config_word(bridge, PCI_BRIDGE_CONTROL,
|
||||
&config);
|
||||
if (!(config & PCI_BRIDGE_CTL_VGA))
|
||||
return;
|
||||
}
|
||||
bus = bus->parent;
|
||||
}
|
||||
pci_read_config_word(pdev, PCI_COMMAND, &config);
|
||||
if (config & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) {
|
||||
pdev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_SHADOW;
|
||||
printk(KERN_DEBUG "Boot video device is %s\n", pci_name(pdev));
|
||||
}
|
||||
}
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_ANY_ID, PCI_ANY_ID, pci_fixup_video);
|
||||
|
||||
/*
|
||||
* Some Toshiba laptops need extra code to enable their TI TSB43AB22/A.
|
||||
*
|
||||
|
||||
@@ -30,6 +30,13 @@
|
||||
extern unsigned int pci_probe;
|
||||
extern unsigned long pirq_table_addr;
|
||||
|
||||
enum pci_bf_sort_state {
|
||||
pci_bf_sort_default,
|
||||
pci_force_nobf,
|
||||
pci_force_bf,
|
||||
pci_dmi_bf,
|
||||
};
|
||||
|
||||
/* pci-i386.c */
|
||||
|
||||
extern unsigned int pcibios_max_latency;
|
||||
|
||||
@@ -29,10 +29,10 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/pci_hotplug.h>
|
||||
#include <acpi/acpi.h>
|
||||
#include <acpi/acpi_bus.h>
|
||||
#include <acpi/actypes.h>
|
||||
#include "pci_hotplug.h"
|
||||
|
||||
#define MY_NAME "acpi_pcihp"
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/kobject.h> /* for KOBJ_NAME_LEN */
|
||||
#include <linux/mutex.h>
|
||||
#include "pci_hotplug.h"
|
||||
#include <linux/pci_hotplug.h>
|
||||
|
||||
#define dbg(format, arg...) \
|
||||
do { \
|
||||
|
||||
@@ -37,10 +37,10 @@
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/pci_hotplug.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/smp.h>
|
||||
#include <linux/smp_lock.h>
|
||||
#include "pci_hotplug.h"
|
||||
#include "acpiphp.h"
|
||||
|
||||
#define MY_NAME "acpiphp"
|
||||
|
||||
@@ -45,11 +45,11 @@
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/pci_hotplug.h>
|
||||
#include <linux/smp_lock.h>
|
||||
#include <linux/mutex.h>
|
||||
|
||||
#include "../pci.h"
|
||||
#include "pci_hotplug.h"
|
||||
#include "acpiphp.h"
|
||||
|
||||
static LIST_HEAD(bridge_list);
|
||||
|
||||
@@ -35,7 +35,6 @@
|
||||
#include <linux/moduleparam.h>
|
||||
|
||||
#include "acpiphp.h"
|
||||
#include "pci_hotplug.h"
|
||||
|
||||
#define DRIVER_VERSION "1.0.1"
|
||||
#define DRIVER_AUTHOR "Irene Zubarev <zubarev@us.ibm.com>, Vernon Mauery <vernux@us.ibm.com>"
|
||||
|
||||
@@ -29,12 +29,12 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/pci_hotplug.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/smp_lock.h>
|
||||
#include <asm/atomic.h>
|
||||
#include <linux/delay.h>
|
||||
#include "pci_hotplug.h"
|
||||
#include "cpci_hotplug.h"
|
||||
|
||||
#define DRIVER_AUTHOR "Scott Murray <scottm@somanetworks.com>"
|
||||
|
||||
@@ -26,9 +26,9 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/pci_hotplug.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include "../pci.h"
|
||||
#include "pci_hotplug.h"
|
||||
#include "cpci_hotplug.h"
|
||||
|
||||
#define MY_NAME "cpci_hotplug"
|
||||
|
||||
@@ -84,7 +84,7 @@ static int __init validate_parameters(void)
|
||||
|
||||
if(!bridge) {
|
||||
info("not configured, disabling.");
|
||||
return 1;
|
||||
return -EINVAL;
|
||||
}
|
||||
str = bridge;
|
||||
if(!*str)
|
||||
@@ -147,7 +147,7 @@ static int __init cpcihp_generic_init(void)
|
||||
|
||||
info(DRIVER_DESC " version: " DRIVER_VERSION);
|
||||
status = validate_parameters();
|
||||
if(status != 0)
|
||||
if (status)
|
||||
return status;
|
||||
|
||||
r = request_region(port, 1, "#ENUM hotswap signal register");
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
#ifndef _CPQPHP_H
|
||||
#define _CPQPHP_H
|
||||
|
||||
#include "pci_hotplug.h"
|
||||
#include <linux/interrupt.h>
|
||||
#include <asm/io.h> /* for read? and write? functions */
|
||||
#include <linux/delay.h> /* for delays */
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/pci_hotplug.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
#include <linux/wait.h>
|
||||
#include <linux/smp_lock.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/pci_hotplug.h>
|
||||
#include "cpqphp.h"
|
||||
|
||||
static u32 configure_new_device(struct controller* ctrl, struct pci_func *func,
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/pci_hotplug.h>
|
||||
#include <linux/init.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include "cpqphp.h"
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/pci_hotplug.h>
|
||||
#include "../pci.h"
|
||||
#include "cpqphp.h"
|
||||
#include "cpqphp_nvram.h"
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
#include <linux/proc_fs.h>
|
||||
#include <linux/workqueue.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/pci_hotplug.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include "cpqphp.h"
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user