mirror of
https://github.com/torvalds/linux.git
synced 2024-12-26 12:52:30 +00:00
Merge master.kernel.org:/pub/scm/linux/kernel/git/gregkh/pci-2.6
* master.kernel.org:/pub/scm/linux/kernel/git/gregkh/pci-2.6: PCI: Remove quirk_via_abnormal_poweroff PCI: reset pci device state to unknown state for resume PCI: x86-64: mmconfig missing printk levels PCI: fix pci_fixup_video as it blows up on sparc64 acpiphp: fix latch status
This commit is contained in:
commit
fe31eb6797
@ -342,6 +342,61 @@ 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;
|
||||
|
||||
/*
|
||||
* From information provided by
|
||||
* "David Miller" <davem@davemloft.net>
|
||||
* The bridge control register is valid for PCI header
|
||||
* type BRIDGE, or CARDBUS. Host to PCI controllers use
|
||||
* PCI header type NORMAL.
|
||||
*/
|
||||
if (bridge
|
||||
&&((bridge->hdr_type == PCI_HEADER_TYPE_BRIDGE)
|
||||
||(bridge->hdr_type == PCI_HEADER_TYPE_CARDBUS))) {
|
||||
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.
|
||||
*
|
||||
|
@ -1,4 +1,4 @@
|
||||
#
|
||||
# Makefile for the ia64-specific parts of the pci bus
|
||||
#
|
||||
obj-y := pci.o
|
||||
obj-y := pci.o fixup.o
|
||||
|
69
arch/ia64/pci/fixup.c
Normal file
69
arch/ia64/pci/fixup.c
Normal file
@ -0,0 +1,69 @@
|
||||
/*
|
||||
* Exceptions for specific devices. Usually work-arounds for fatal design flaws.
|
||||
* Derived from fixup.c of i386 tree.
|
||||
*/
|
||||
|
||||
#include <linux/pci.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/machvec.h>
|
||||
|
||||
/*
|
||||
* 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 ((strcmp(platform_name, "dig") != 0)
|
||||
&& (strcmp(platform_name, "hpzx1") != 0))
|
||||
return;
|
||||
/* Maybe, this machine supports legacy memory map. */
|
||||
|
||||
if ((pdev->class >> 8) != PCI_CLASS_DISPLAY_VGA)
|
||||
return;
|
||||
|
||||
/* Is VGA routed to us? */
|
||||
bus = pdev->bus;
|
||||
while (bus) {
|
||||
bridge = bus->self;
|
||||
|
||||
/*
|
||||
* From information provided by
|
||||
* "David Miller" <davem@davemloft.net>
|
||||
* The bridge control register is valid for PCI header
|
||||
* type BRIDGE, or CARDBUS. Host to PCI controllers use
|
||||
* PCI header type NORMAL.
|
||||
*/
|
||||
if (bridge
|
||||
&&((bridge->hdr_type == PCI_HEADER_TYPE_BRIDGE)
|
||||
||(bridge->hdr_type == PCI_HEADER_TYPE_CARDBUS))) {
|
||||
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);
|
@ -220,7 +220,7 @@ void __init pci_mmcfg_init(int type)
|
||||
|
||||
pci_mmcfg_virt = kmalloc(sizeof(*pci_mmcfg_virt) * pci_mmcfg_config_num, GFP_KERNEL);
|
||||
if (pci_mmcfg_virt == NULL) {
|
||||
printk("PCI: Can not allocate memory for mmconfig structures\n");
|
||||
printk(KERN_ERR "PCI: Can not allocate memory for mmconfig structures\n");
|
||||
return;
|
||||
}
|
||||
for (i = 0; i < pci_mmcfg_config_num; ++i) {
|
||||
@ -228,7 +228,8 @@ void __init pci_mmcfg_init(int type)
|
||||
pci_mmcfg_virt[i].virt = ioremap_nocache(pci_mmcfg_config[i].base_address,
|
||||
MMCONFIG_APER_MAX);
|
||||
if (!pci_mmcfg_virt[i].virt) {
|
||||
printk("PCI: Cannot map mmconfig aperture for segment %d\n",
|
||||
printk(KERN_ERR "PCI: Cannot map mmconfig aperture for "
|
||||
"segment %d\n",
|
||||
pci_mmcfg_config[i].pci_segment_group_number);
|
||||
return;
|
||||
}
|
||||
|
@ -1807,8 +1807,8 @@ u8 acpiphp_get_power_status(struct acpiphp_slot *slot)
|
||||
|
||||
|
||||
/*
|
||||
* latch closed: 1
|
||||
* latch open: 0
|
||||
* latch open: 1
|
||||
* latch closed: 0
|
||||
*/
|
||||
u8 acpiphp_get_latch_status(struct acpiphp_slot *slot)
|
||||
{
|
||||
@ -1816,7 +1816,7 @@ u8 acpiphp_get_latch_status(struct acpiphp_slot *slot)
|
||||
|
||||
sta = get_slot_status(slot);
|
||||
|
||||
return (sta & ACPI_STA_SHOW_IN_UI) ? 1 : 0;
|
||||
return (sta & ACPI_STA_SHOW_IN_UI) ? 0 : 1;
|
||||
}
|
||||
|
||||
|
||||
|
@ -264,6 +264,13 @@ static int pci_device_remove(struct device * dev)
|
||||
pci_dev->driver = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* If the device is still on, set the power state as "unknown",
|
||||
* since it might change by the next time we load the driver.
|
||||
*/
|
||||
if (pci_dev->current_state == PCI_D0)
|
||||
pci_dev->current_state = PCI_UNKNOWN;
|
||||
|
||||
/*
|
||||
* We would love to complain here if pci_dev->is_enabled is set, that
|
||||
* the driver should have called pci_disable_device(), but the
|
||||
@ -288,6 +295,12 @@ static int pci_device_suspend(struct device * dev, pm_message_t state)
|
||||
suspend_report_result(drv->suspend, i);
|
||||
} else {
|
||||
pci_save_state(pci_dev);
|
||||
/*
|
||||
* mark its power state as "unknown", since we don't know if
|
||||
* e.g. the BIOS will change its device state when we suspend.
|
||||
*/
|
||||
if (pci_dev->current_state == PCI_D0)
|
||||
pci_dev->current_state = PCI_UNKNOWN;
|
||||
}
|
||||
return i;
|
||||
}
|
||||
|
@ -714,33 +714,6 @@ static void __devinit quirk_vt82c598_id(struct pci_dev *dev)
|
||||
}
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C597_0, quirk_vt82c598_id );
|
||||
|
||||
#ifdef CONFIG_ACPI_SLEEP
|
||||
|
||||
/*
|
||||
* Some VIA systems boot with the abnormal status flag set. This can cause
|
||||
* the BIOS to re-POST the system on resume rather than passing control
|
||||
* back to the OS. Clear the flag on boot
|
||||
*/
|
||||
static void __devinit quirk_via_abnormal_poweroff(struct pci_dev *dev)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
acpi_hw_register_read(ACPI_MTX_DO_NOT_LOCK, ACPI_REGISTER_PM1_STATUS,
|
||||
®);
|
||||
|
||||
if (reg & 0x800) {
|
||||
printk("Clearing abnormal poweroff flag\n");
|
||||
acpi_hw_register_write(ACPI_MTX_DO_NOT_LOCK,
|
||||
ACPI_REGISTER_PM1_STATUS,
|
||||
(u16)0x800);
|
||||
}
|
||||
}
|
||||
|
||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8235, quirk_via_abnormal_poweroff);
|
||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237, quirk_via_abnormal_poweroff);
|
||||
|
||||
#endif
|
||||
|
||||
/*
|
||||
* CardBus controllers have a legacy base address that enables them
|
||||
* to respond as i82365 pcmcia controllers. We don't want them to
|
||||
@ -1619,52 +1592,6 @@ static void __devinit fixup_rev1_53c810(struct pci_dev* dev)
|
||||
}
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NCR, PCI_DEVICE_ID_NCR_53C810, fixup_rev1_53c810);
|
||||
|
||||
/*
|
||||
* 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 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, fixup_video);
|
||||
|
||||
|
||||
static void pci_do_fixups(struct pci_dev *dev, struct pci_fixup *f, struct pci_fixup *end)
|
||||
{
|
||||
while (f < end) {
|
||||
|
@ -72,8 +72,9 @@ void __iomem *pci_map_rom(struct pci_dev *pdev, size_t *size)
|
||||
int last_image;
|
||||
|
||||
/*
|
||||
* IORESOURCE_ROM_SHADOW set if the VGA enable bit of the Bridge Control
|
||||
* register is set for embedded VGA.
|
||||
* IORESOURCE_ROM_SHADOW set on x86, x86_64 and IA64 supports legacy
|
||||
* memory map if the VGA enable bit of the Bridge Control register is
|
||||
* set for embedded VGA.
|
||||
*/
|
||||
if (res->flags & IORESOURCE_ROM_SHADOW) {
|
||||
/* primary video rom always starts here */
|
||||
|
Loading…
Reference in New Issue
Block a user