Merge branches 'pci/host-generic', 'pci/host-mvebu', 'pci/host-rcar', 'pci/host-tegra', 'pci/msi', 'pci/misc', 'pci/resource' and 'pci/virtualization' into next
* pci/host-generic: PCI: generic: Fix GPL v2 license string typo * pci/host-mvebu: PCI: mvebu: Fix GPL v2 license string typo * pci/host-rcar: PCI: rcar: Fix GPL v2 license string typo * pci/host-tegra: PCI: tegra: Fix GPL v2 license string typo * pci/msi: PCI/MSI: Use irq_get_msi_desc() to simplify code PCI/MSI: Remove unused list access in __pci_restore_msix_state() PCI/MSI: Retrieve first MSI IRQ from msi_desc rather than pci_dev PCI/MSI: Remove unused function msi_remove_pci_irq_vectors() PCI/MSI: Add msi_setup_entry() to clean up MSI initialization * pci/misc: PCI: Configure ASPM when enabling device x86: don't exclude low BIOS area when allocating address space for non-PCI cards PCI: Add include guard to include/linux/pci_ids.h x86, ia64: Move EFI_FB vga_default_device() initialization to pci_vga_fixup() * pci/resource: PCI: Tidy resource assignment messages PCI: Return conventional error values from pci_revert_fw_address() PCI: Cleanup control flow PCI: Support BAR sizes up to 128GB PCI: Keep original resource if we fail to expand it * pci/virtualization: powerpc/pci: Remove duplicate logic PCI: Make resetting secondary bus logic common
This commit is contained in:
parent
1d0df48692
eed6542dd5
505d8655f7
68947eb175
d975cb5703
e11ece5a5e
1f6ae47ecf
64da465e98
21dd5a43d0
commit
792688fde4
17 changed files with 152 additions and 157 deletions
|
@ -6,6 +6,7 @@
|
||||||
#include <linux/pci.h>
|
#include <linux/pci.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/vgaarb.h>
|
#include <linux/vgaarb.h>
|
||||||
|
#include <linux/screen_info.h>
|
||||||
|
|
||||||
#include <asm/machvec.h>
|
#include <asm/machvec.h>
|
||||||
|
|
||||||
|
@ -37,6 +38,27 @@ static void pci_fixup_video(struct pci_dev *pdev)
|
||||||
return;
|
return;
|
||||||
/* Maybe, this machine supports legacy memory map. */
|
/* Maybe, this machine supports legacy memory map. */
|
||||||
|
|
||||||
|
if (!vga_default_device()) {
|
||||||
|
resource_size_t start, end;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* Does firmware framebuffer belong to us? */
|
||||||
|
for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
|
||||||
|
if (!(pci_resource_flags(pdev, i) & IORESOURCE_MEM))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
start = pci_resource_start(pdev, i);
|
||||||
|
end = pci_resource_end(pdev, i);
|
||||||
|
|
||||||
|
if (!start || !end)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (screen_info.lfb_base >= start &&
|
||||||
|
(screen_info.lfb_base + screen_info.lfb_size) < end)
|
||||||
|
vga_set_default_device(pdev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Is VGA routed to us? */
|
/* Is VGA routed to us? */
|
||||||
bus = pdev->bus;
|
bus = pdev->bus;
|
||||||
while (bus) {
|
while (bus) {
|
||||||
|
|
|
@ -123,21 +123,12 @@ resource_size_t pcibios_window_alignment(struct pci_bus *bus,
|
||||||
|
|
||||||
void pcibios_reset_secondary_bus(struct pci_dev *dev)
|
void pcibios_reset_secondary_bus(struct pci_dev *dev)
|
||||||
{
|
{
|
||||||
u16 ctrl;
|
|
||||||
|
|
||||||
if (ppc_md.pcibios_reset_secondary_bus) {
|
if (ppc_md.pcibios_reset_secondary_bus) {
|
||||||
ppc_md.pcibios_reset_secondary_bus(dev);
|
ppc_md.pcibios_reset_secondary_bus(dev);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
pci_read_config_word(dev, PCI_BRIDGE_CONTROL, &ctrl);
|
pci_reset_secondary_bus(dev);
|
||||||
ctrl |= PCI_BRIDGE_CTL_BUS_RESET;
|
|
||||||
pci_write_config_word(dev, PCI_BRIDGE_CONTROL, ctrl);
|
|
||||||
msleep(2);
|
|
||||||
|
|
||||||
ctrl &= ~PCI_BRIDGE_CTL_BUS_RESET;
|
|
||||||
pci_write_config_word(dev, PCI_BRIDGE_CONTROL, ctrl);
|
|
||||||
ssleep(1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static resource_size_t pcibios_io_size(const struct pci_controller *hose)
|
static resource_size_t pcibios_io_size(const struct pci_controller *hose)
|
||||||
|
|
|
@ -17,10 +17,4 @@
|
||||||
#define vga_readb(x) (*(x))
|
#define vga_readb(x) (*(x))
|
||||||
#define vga_writeb(x, y) (*(y) = (x))
|
#define vga_writeb(x, y) (*(y) = (x))
|
||||||
|
|
||||||
#ifdef CONFIG_FB_EFI
|
|
||||||
#define __ARCH_HAS_VGA_DEFAULT_DEVICE
|
|
||||||
extern struct pci_dev *vga_default_device(void);
|
|
||||||
extern void vga_set_default_device(struct pci_dev *pdev);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif /* _ASM_X86_VGA_H */
|
#endif /* _ASM_X86_VGA_H */
|
||||||
|
|
|
@ -37,10 +37,12 @@ static void remove_e820_regions(struct resource *avail)
|
||||||
|
|
||||||
void arch_remove_reservations(struct resource *avail)
|
void arch_remove_reservations(struct resource *avail)
|
||||||
{
|
{
|
||||||
/* Trim out BIOS areas (low 1MB and high 2MB) and E820 regions */
|
/*
|
||||||
|
* Trim out BIOS area (high 2MB) and E820 regions. We do not remove
|
||||||
|
* the low 1MB unconditionally, as this area is needed for some ISA
|
||||||
|
* cards requiring a memory range, e.g. the i82365 PCMCIA controller.
|
||||||
|
*/
|
||||||
if (avail->flags & IORESOURCE_MEM) {
|
if (avail->flags & IORESOURCE_MEM) {
|
||||||
if (avail->start < BIOS_END)
|
|
||||||
avail->start = BIOS_END;
|
|
||||||
resource_clip(avail, BIOS_ROM_BASE, BIOS_ROM_END);
|
resource_clip(avail, BIOS_ROM_BASE, BIOS_ROM_END);
|
||||||
|
|
||||||
remove_e820_regions(avail);
|
remove_e820_regions(avail);
|
||||||
|
|
|
@ -326,6 +326,27 @@ static void pci_fixup_video(struct pci_dev *pdev)
|
||||||
struct pci_bus *bus;
|
struct pci_bus *bus;
|
||||||
u16 config;
|
u16 config;
|
||||||
|
|
||||||
|
if (!vga_default_device()) {
|
||||||
|
resource_size_t start, end;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* Does firmware framebuffer belong to us? */
|
||||||
|
for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
|
||||||
|
if (!(pci_resource_flags(pdev, i) & IORESOURCE_MEM))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
start = pci_resource_start(pdev, i);
|
||||||
|
end = pci_resource_end(pdev, i);
|
||||||
|
|
||||||
|
if (!start || !end)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (screen_info.lfb_base >= start &&
|
||||||
|
(screen_info.lfb_base + screen_info.lfb_size) < end)
|
||||||
|
vga_set_default_device(pdev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Is VGA routed to us? */
|
/* Is VGA routed to us? */
|
||||||
bus = pdev->bus;
|
bus = pdev->bus;
|
||||||
while (bus) {
|
while (bus) {
|
||||||
|
|
|
@ -162,6 +162,10 @@ pcibios_align_resource(void *data, const struct resource *res,
|
||||||
return start;
|
return start;
|
||||||
if (start & 0x300)
|
if (start & 0x300)
|
||||||
start = (start + 0x3ff) & ~0x3ff;
|
start = (start + 0x3ff) & ~0x3ff;
|
||||||
|
} else if (res->flags & IORESOURCE_MEM) {
|
||||||
|
/* The low 1MB range is reserved for ISA cards */
|
||||||
|
if (start < BIOS_END)
|
||||||
|
start = BIOS_END;
|
||||||
}
|
}
|
||||||
return start;
|
return start;
|
||||||
}
|
}
|
||||||
|
|
|
@ -385,4 +385,4 @@ module_platform_driver(gen_pci_driver);
|
||||||
|
|
||||||
MODULE_DESCRIPTION("Generic PCI host driver");
|
MODULE_DESCRIPTION("Generic PCI host driver");
|
||||||
MODULE_AUTHOR("Will Deacon <will.deacon@arm.com>");
|
MODULE_AUTHOR("Will Deacon <will.deacon@arm.com>");
|
||||||
MODULE_LICENSE("GPLv2");
|
MODULE_LICENSE("GPL v2");
|
||||||
|
|
|
@ -1094,4 +1094,4 @@ module_platform_driver(mvebu_pcie_driver);
|
||||||
|
|
||||||
MODULE_AUTHOR("Thomas Petazzoni <thomas.petazzoni@free-electrons.com>");
|
MODULE_AUTHOR("Thomas Petazzoni <thomas.petazzoni@free-electrons.com>");
|
||||||
MODULE_DESCRIPTION("Marvell EBU PCIe driver");
|
MODULE_DESCRIPTION("Marvell EBU PCIe driver");
|
||||||
MODULE_LICENSE("GPLv2");
|
MODULE_LICENSE("GPL v2");
|
||||||
|
|
|
@ -1716,4 +1716,4 @@ module_platform_driver(tegra_pcie_driver);
|
||||||
|
|
||||||
MODULE_AUTHOR("Thierry Reding <treding@nvidia.com>");
|
MODULE_AUTHOR("Thierry Reding <treding@nvidia.com>");
|
||||||
MODULE_DESCRIPTION("NVIDIA Tegra PCIe driver");
|
MODULE_DESCRIPTION("NVIDIA Tegra PCIe driver");
|
||||||
MODULE_LICENSE("GPLv2");
|
MODULE_LICENSE("GPL v2");
|
||||||
|
|
|
@ -989,4 +989,4 @@ module_platform_driver(rcar_pcie_driver);
|
||||||
|
|
||||||
MODULE_AUTHOR("Phil Edworthy <phil.edworthy@renesas.com>");
|
MODULE_AUTHOR("Phil Edworthy <phil.edworthy@renesas.com>");
|
||||||
MODULE_DESCRIPTION("Renesas R-Car PCIe driver");
|
MODULE_DESCRIPTION("Renesas R-Car PCIe driver");
|
||||||
MODULE_LICENSE("GPLv2");
|
MODULE_LICENSE("GPL v2");
|
||||||
|
|
|
@ -235,7 +235,7 @@ static void msi_set_mask_bit(struct irq_data *data, u32 flag)
|
||||||
msix_mask_irq(desc, flag);
|
msix_mask_irq(desc, flag);
|
||||||
readl(desc->mask_base); /* Flush write to device */
|
readl(desc->mask_base); /* Flush write to device */
|
||||||
} else {
|
} else {
|
||||||
unsigned offset = data->irq - desc->dev->irq;
|
unsigned offset = data->irq - desc->irq;
|
||||||
msi_mask_irq(desc, 1 << offset, flag << offset);
|
msi_mask_irq(desc, 1 << offset, flag << offset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -463,7 +463,6 @@ static void __pci_restore_msix_state(struct pci_dev *dev)
|
||||||
if (!dev->msix_enabled)
|
if (!dev->msix_enabled)
|
||||||
return;
|
return;
|
||||||
BUG_ON(list_empty(&dev->msi_list));
|
BUG_ON(list_empty(&dev->msi_list));
|
||||||
entry = list_first_entry(&dev->msi_list, struct msi_desc, list);
|
|
||||||
|
|
||||||
/* route the table */
|
/* route the table */
|
||||||
pci_intx_for_msi(dev, 0);
|
pci_intx_for_msi(dev, 0);
|
||||||
|
@ -488,7 +487,6 @@ EXPORT_SYMBOL_GPL(pci_restore_msi_state);
|
||||||
static ssize_t msi_mode_show(struct device *dev, struct device_attribute *attr,
|
static ssize_t msi_mode_show(struct device *dev, struct device_attribute *attr,
|
||||||
char *buf)
|
char *buf)
|
||||||
{
|
{
|
||||||
struct pci_dev *pdev = to_pci_dev(dev);
|
|
||||||
struct msi_desc *entry;
|
struct msi_desc *entry;
|
||||||
unsigned long irq;
|
unsigned long irq;
|
||||||
int retval;
|
int retval;
|
||||||
|
@ -497,12 +495,11 @@ static ssize_t msi_mode_show(struct device *dev, struct device_attribute *attr,
|
||||||
if (retval)
|
if (retval)
|
||||||
return retval;
|
return retval;
|
||||||
|
|
||||||
list_for_each_entry(entry, &pdev->msi_list, list) {
|
entry = irq_get_msi_desc(irq);
|
||||||
if (entry->irq == irq) {
|
if (entry)
|
||||||
return sprintf(buf, "%s\n",
|
return sprintf(buf, "%s\n",
|
||||||
entry->msi_attrib.is_msix ? "msix" : "msi");
|
entry->msi_attrib.is_msix ? "msix" : "msi");
|
||||||
}
|
|
||||||
}
|
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -581,6 +578,38 @@ static int populate_msi_sysfs(struct pci_dev *pdev)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct msi_desc *msi_setup_entry(struct pci_dev *dev)
|
||||||
|
{
|
||||||
|
u16 control;
|
||||||
|
struct msi_desc *entry;
|
||||||
|
|
||||||
|
/* MSI Entry Initialization */
|
||||||
|
entry = alloc_msi_entry(dev);
|
||||||
|
if (!entry)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &control);
|
||||||
|
|
||||||
|
entry->msi_attrib.is_msix = 0;
|
||||||
|
entry->msi_attrib.is_64 = !!(control & PCI_MSI_FLAGS_64BIT);
|
||||||
|
entry->msi_attrib.entry_nr = 0;
|
||||||
|
entry->msi_attrib.maskbit = !!(control & PCI_MSI_FLAGS_MASKBIT);
|
||||||
|
entry->msi_attrib.default_irq = dev->irq; /* Save IOAPIC IRQ */
|
||||||
|
entry->msi_attrib.pos = dev->msi_cap;
|
||||||
|
entry->msi_attrib.multi_cap = (control & PCI_MSI_FLAGS_QMASK) >> 1;
|
||||||
|
|
||||||
|
if (control & PCI_MSI_FLAGS_64BIT)
|
||||||
|
entry->mask_pos = dev->msi_cap + PCI_MSI_MASK_64;
|
||||||
|
else
|
||||||
|
entry->mask_pos = dev->msi_cap + PCI_MSI_MASK_32;
|
||||||
|
|
||||||
|
/* Save the initial mask status */
|
||||||
|
if (entry->msi_attrib.maskbit)
|
||||||
|
pci_read_config_dword(dev, entry->mask_pos, &entry->masked);
|
||||||
|
|
||||||
|
return entry;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* msi_capability_init - configure device's MSI capability structure
|
* msi_capability_init - configure device's MSI capability structure
|
||||||
* @dev: pointer to the pci_dev data structure of MSI device function
|
* @dev: pointer to the pci_dev data structure of MSI device function
|
||||||
|
@ -596,32 +625,15 @@ static int msi_capability_init(struct pci_dev *dev, int nvec)
|
||||||
{
|
{
|
||||||
struct msi_desc *entry;
|
struct msi_desc *entry;
|
||||||
int ret;
|
int ret;
|
||||||
u16 control;
|
|
||||||
unsigned mask;
|
unsigned mask;
|
||||||
|
|
||||||
msi_set_enable(dev, 0); /* Disable MSI during set up */
|
msi_set_enable(dev, 0); /* Disable MSI during set up */
|
||||||
|
|
||||||
pci_read_config_word(dev, dev->msi_cap + PCI_MSI_FLAGS, &control);
|
entry = msi_setup_entry(dev);
|
||||||
/* MSI Entry Initialization */
|
|
||||||
entry = alloc_msi_entry(dev);
|
|
||||||
if (!entry)
|
if (!entry)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
entry->msi_attrib.is_msix = 0;
|
|
||||||
entry->msi_attrib.is_64 = !!(control & PCI_MSI_FLAGS_64BIT);
|
|
||||||
entry->msi_attrib.entry_nr = 0;
|
|
||||||
entry->msi_attrib.maskbit = !!(control & PCI_MSI_FLAGS_MASKBIT);
|
|
||||||
entry->msi_attrib.default_irq = dev->irq; /* Save IOAPIC IRQ */
|
|
||||||
entry->msi_attrib.pos = dev->msi_cap;
|
|
||||||
entry->msi_attrib.multi_cap = (control & PCI_MSI_FLAGS_QMASK) >> 1;
|
|
||||||
|
|
||||||
if (control & PCI_MSI_FLAGS_64BIT)
|
|
||||||
entry->mask_pos = dev->msi_cap + PCI_MSI_MASK_64;
|
|
||||||
else
|
|
||||||
entry->mask_pos = dev->msi_cap + PCI_MSI_MASK_32;
|
|
||||||
/* All MSIs are unmasked by default, Mask them all */
|
/* All MSIs are unmasked by default, Mask them all */
|
||||||
if (entry->msi_attrib.maskbit)
|
|
||||||
pci_read_config_dword(dev, entry->mask_pos, &entry->masked);
|
|
||||||
mask = msi_mask(entry->msi_attrib.multi_cap);
|
mask = msi_mask(entry->msi_attrib.multi_cap);
|
||||||
msi_mask_irq(entry, mask, mask);
|
msi_mask_irq(entry, mask, mask);
|
||||||
|
|
||||||
|
@ -999,24 +1011,6 @@ void pci_disable_msix(struct pci_dev *dev)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(pci_disable_msix);
|
EXPORT_SYMBOL(pci_disable_msix);
|
||||||
|
|
||||||
/**
|
|
||||||
* msi_remove_pci_irq_vectors - reclaim MSI(X) irqs to unused state
|
|
||||||
* @dev: pointer to the pci_dev data structure of MSI(X) device function
|
|
||||||
*
|
|
||||||
* Being called during hotplug remove, from which the device function
|
|
||||||
* is hot-removed. All previous assigned MSI/MSI-X irqs, if
|
|
||||||
* allocated for this device function, are reclaimed to unused state,
|
|
||||||
* which may be used later on.
|
|
||||||
**/
|
|
||||||
void msi_remove_pci_irq_vectors(struct pci_dev *dev)
|
|
||||||
{
|
|
||||||
if (!pci_msi_enable || !dev)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (dev->msi_enabled || dev->msix_enabled)
|
|
||||||
free_msi_irqs(dev);
|
|
||||||
}
|
|
||||||
|
|
||||||
void pci_no_msi(void)
|
void pci_no_msi(void)
|
||||||
{
|
{
|
||||||
pci_msi_enable = 0;
|
pci_msi_enable = 0;
|
||||||
|
|
|
@ -839,12 +839,6 @@ int pci_set_power_state(struct pci_dev *dev, pci_power_t state)
|
||||||
|
|
||||||
if (!__pci_complete_power_transition(dev, state))
|
if (!__pci_complete_power_transition(dev, state))
|
||||||
error = 0;
|
error = 0;
|
||||||
/*
|
|
||||||
* When aspm_policy is "powersave" this call ensures
|
|
||||||
* that ASPM is configured.
|
|
||||||
*/
|
|
||||||
if (!error && dev->bus->self)
|
|
||||||
pcie_aspm_powersave_config_link(dev->bus->self);
|
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
@ -1195,12 +1189,18 @@ int __weak pcibios_enable_device(struct pci_dev *dev, int bars)
|
||||||
static int do_pci_enable_device(struct pci_dev *dev, int bars)
|
static int do_pci_enable_device(struct pci_dev *dev, int bars)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
struct pci_dev *bridge;
|
||||||
u16 cmd;
|
u16 cmd;
|
||||||
u8 pin;
|
u8 pin;
|
||||||
|
|
||||||
err = pci_set_power_state(dev, PCI_D0);
|
err = pci_set_power_state(dev, PCI_D0);
|
||||||
if (err < 0 && err != -EIO)
|
if (err < 0 && err != -EIO)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
bridge = pci_upstream_bridge(dev);
|
||||||
|
if (bridge)
|
||||||
|
pcie_aspm_powersave_config_link(bridge);
|
||||||
|
|
||||||
err = pcibios_enable_device(dev, bars);
|
err = pcibios_enable_device(dev, bars);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
|
@ -3193,7 +3193,7 @@ static int pci_pm_reset(struct pci_dev *dev, int probe)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void __weak pcibios_reset_secondary_bus(struct pci_dev *dev)
|
void pci_reset_secondary_bus(struct pci_dev *dev)
|
||||||
{
|
{
|
||||||
u16 ctrl;
|
u16 ctrl;
|
||||||
|
|
||||||
|
@ -3219,6 +3219,11 @@ void __weak pcibios_reset_secondary_bus(struct pci_dev *dev)
|
||||||
ssleep(1);
|
ssleep(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void __weak pcibios_reset_secondary_bus(struct pci_dev *dev)
|
||||||
|
{
|
||||||
|
pci_reset_secondary_bus(dev);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* pci_reset_bridge_secondary_bus - Reset the secondary bus on a PCI bridge.
|
* pci_reset_bridge_secondary_bus - Reset the secondary bus on a PCI bridge.
|
||||||
* @dev: Bridge device
|
* @dev: Bridge device
|
||||||
|
|
|
@ -925,7 +925,7 @@ static int pbus_size_mem(struct pci_bus *bus, unsigned long mask,
|
||||||
{
|
{
|
||||||
struct pci_dev *dev;
|
struct pci_dev *dev;
|
||||||
resource_size_t min_align, align, size, size0, size1;
|
resource_size_t min_align, align, size, size0, size1;
|
||||||
resource_size_t aligns[14]; /* Alignments from 1Mb to 8Gb */
|
resource_size_t aligns[18]; /* Alignments from 1Mb to 128Gb */
|
||||||
int order, max_order;
|
int order, max_order;
|
||||||
struct resource *b_res = find_free_bus_resource(bus,
|
struct resource *b_res = find_free_bus_resource(bus,
|
||||||
mask | IORESOURCE_PREFETCH, type);
|
mask | IORESOURCE_PREFETCH, type);
|
||||||
|
|
|
@ -166,11 +166,10 @@ static int pci_revert_fw_address(struct resource *res, struct pci_dev *dev,
|
||||||
{
|
{
|
||||||
struct resource *root, *conflict;
|
struct resource *root, *conflict;
|
||||||
resource_size_t fw_addr, start, end;
|
resource_size_t fw_addr, start, end;
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
fw_addr = pcibios_retrieve_fw_addr(dev, resno);
|
fw_addr = pcibios_retrieve_fw_addr(dev, resno);
|
||||||
if (!fw_addr)
|
if (!fw_addr)
|
||||||
return 1;
|
return -ENOMEM;
|
||||||
|
|
||||||
start = res->start;
|
start = res->start;
|
||||||
end = res->end;
|
end = res->end;
|
||||||
|
@ -189,14 +188,13 @@ static int pci_revert_fw_address(struct resource *res, struct pci_dev *dev,
|
||||||
resno, res);
|
resno, res);
|
||||||
conflict = request_resource_conflict(root, res);
|
conflict = request_resource_conflict(root, res);
|
||||||
if (conflict) {
|
if (conflict) {
|
||||||
dev_info(&dev->dev,
|
dev_info(&dev->dev, "BAR %d: %pR conflicts with %s %pR\n",
|
||||||
"BAR %d: %pR conflicts with %s %pR\n", resno,
|
resno, res, conflict->name, conflict);
|
||||||
res, conflict->name, conflict);
|
|
||||||
res->start = start;
|
res->start = start;
|
||||||
res->end = end;
|
res->end = end;
|
||||||
ret = 1;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
return ret;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __pci_assign_resource(struct pci_bus *bus, struct pci_dev *dev,
|
static int __pci_assign_resource(struct pci_bus *bus, struct pci_dev *dev,
|
||||||
|
@ -250,10 +248,8 @@ static int __pci_assign_resource(struct pci_bus *bus, struct pci_dev *dev,
|
||||||
static int _pci_assign_resource(struct pci_dev *dev, int resno,
|
static int _pci_assign_resource(struct pci_dev *dev, int resno,
|
||||||
resource_size_t size, resource_size_t min_align)
|
resource_size_t size, resource_size_t min_align)
|
||||||
{
|
{
|
||||||
struct resource *res = dev->resource + resno;
|
|
||||||
struct pci_bus *bus;
|
struct pci_bus *bus;
|
||||||
int ret;
|
int ret;
|
||||||
char *type;
|
|
||||||
|
|
||||||
bus = dev->bus;
|
bus = dev->bus;
|
||||||
while ((ret = __pci_assign_resource(bus, dev, resno, size, min_align))) {
|
while ((ret = __pci_assign_resource(bus, dev, resno, size, min_align))) {
|
||||||
|
@ -262,21 +258,6 @@ static int _pci_assign_resource(struct pci_dev *dev, int resno,
|
||||||
bus = bus->parent;
|
bus = bus->parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret) {
|
|
||||||
if (res->flags & IORESOURCE_MEM)
|
|
||||||
if (res->flags & IORESOURCE_PREFETCH)
|
|
||||||
type = "mem pref";
|
|
||||||
else
|
|
||||||
type = "mem";
|
|
||||||
else if (res->flags & IORESOURCE_IO)
|
|
||||||
type = "io";
|
|
||||||
else
|
|
||||||
type = "unknown";
|
|
||||||
dev_info(&dev->dev,
|
|
||||||
"BAR %d: can't assign %s (size %#llx)\n",
|
|
||||||
resno, type, (unsigned long long) resource_size(res));
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -302,17 +283,24 @@ int pci_assign_resource(struct pci_dev *dev, int resno)
|
||||||
* where firmware left it. That at least has a chance of
|
* where firmware left it. That at least has a chance of
|
||||||
* working, which is better than just leaving it disabled.
|
* working, which is better than just leaving it disabled.
|
||||||
*/
|
*/
|
||||||
if (ret < 0)
|
if (ret < 0) {
|
||||||
|
dev_info(&dev->dev, "BAR %d: no space for %pR\n", resno, res);
|
||||||
ret = pci_revert_fw_address(res, dev, resno, size);
|
ret = pci_revert_fw_address(res, dev, resno, size);
|
||||||
|
|
||||||
if (!ret) {
|
|
||||||
res->flags &= ~IORESOURCE_UNSET;
|
|
||||||
res->flags &= ~IORESOURCE_STARTALIGN;
|
|
||||||
dev_info(&dev->dev, "BAR %d: assigned %pR\n", resno, res);
|
|
||||||
if (resno < PCI_BRIDGE_RESOURCES)
|
|
||||||
pci_update_resource(dev, resno);
|
|
||||||
}
|
}
|
||||||
return ret;
|
|
||||||
|
if (ret < 0) {
|
||||||
|
dev_info(&dev->dev, "BAR %d: failed to assign %pR\n", resno,
|
||||||
|
res);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
res->flags &= ~IORESOURCE_UNSET;
|
||||||
|
res->flags &= ~IORESOURCE_STARTALIGN;
|
||||||
|
dev_info(&dev->dev, "BAR %d: assigned %pR\n", resno, res);
|
||||||
|
if (resno < PCI_BRIDGE_RESOURCES)
|
||||||
|
pci_update_resource(dev, resno);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(pci_assign_resource);
|
EXPORT_SYMBOL(pci_assign_resource);
|
||||||
|
|
||||||
|
@ -320,9 +308,11 @@ int pci_reassign_resource(struct pci_dev *dev, int resno, resource_size_t addsiz
|
||||||
resource_size_t min_align)
|
resource_size_t min_align)
|
||||||
{
|
{
|
||||||
struct resource *res = dev->resource + resno;
|
struct resource *res = dev->resource + resno;
|
||||||
|
unsigned long flags;
|
||||||
resource_size_t new_size;
|
resource_size_t new_size;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
flags = res->flags;
|
||||||
res->flags |= IORESOURCE_UNSET;
|
res->flags |= IORESOURCE_UNSET;
|
||||||
if (!res->parent) {
|
if (!res->parent) {
|
||||||
dev_info(&dev->dev, "BAR %d: can't reassign an unassigned resource %pR\n",
|
dev_info(&dev->dev, "BAR %d: can't reassign an unassigned resource %pR\n",
|
||||||
|
@ -333,14 +323,21 @@ int pci_reassign_resource(struct pci_dev *dev, int resno, resource_size_t addsiz
|
||||||
/* already aligned with min_align */
|
/* already aligned with min_align */
|
||||||
new_size = resource_size(res) + addsize;
|
new_size = resource_size(res) + addsize;
|
||||||
ret = _pci_assign_resource(dev, resno, new_size, min_align);
|
ret = _pci_assign_resource(dev, resno, new_size, min_align);
|
||||||
if (!ret) {
|
if (ret) {
|
||||||
res->flags &= ~IORESOURCE_UNSET;
|
res->flags = flags;
|
||||||
res->flags &= ~IORESOURCE_STARTALIGN;
|
dev_info(&dev->dev, "BAR %d: %pR (failed to expand by %#llx)\n",
|
||||||
dev_info(&dev->dev, "BAR %d: reassigned %pR\n", resno, res);
|
resno, res, (unsigned long long) addsize);
|
||||||
if (resno < PCI_BRIDGE_RESOURCES)
|
return ret;
|
||||||
pci_update_resource(dev, resno);
|
|
||||||
}
|
}
|
||||||
return ret;
|
|
||||||
|
res->flags &= ~IORESOURCE_UNSET;
|
||||||
|
res->flags &= ~IORESOURCE_STARTALIGN;
|
||||||
|
dev_info(&dev->dev, "BAR %d: reassigned %pR (expanded by %#llx)\n",
|
||||||
|
resno, res, (unsigned long long) addsize);
|
||||||
|
if (resno < PCI_BRIDGE_RESOURCES)
|
||||||
|
pci_update_resource(dev, resno);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int pci_enable_resources(struct pci_dev *dev, int mask)
|
int pci_enable_resources(struct pci_dev *dev, int mask)
|
||||||
|
|
|
@ -19,8 +19,6 @@
|
||||||
|
|
||||||
static bool request_mem_succeeded = false;
|
static bool request_mem_succeeded = false;
|
||||||
|
|
||||||
static struct pci_dev *default_vga;
|
|
||||||
|
|
||||||
static struct fb_var_screeninfo efifb_defined = {
|
static struct fb_var_screeninfo efifb_defined = {
|
||||||
.activate = FB_ACTIVATE_NOW,
|
.activate = FB_ACTIVATE_NOW,
|
||||||
.height = -1,
|
.height = -1,
|
||||||
|
@ -84,23 +82,10 @@ static struct fb_ops efifb_ops = {
|
||||||
.fb_imageblit = cfb_imageblit,
|
.fb_imageblit = cfb_imageblit,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct pci_dev *vga_default_device(void)
|
|
||||||
{
|
|
||||||
return default_vga;
|
|
||||||
}
|
|
||||||
|
|
||||||
EXPORT_SYMBOL_GPL(vga_default_device);
|
|
||||||
|
|
||||||
void vga_set_default_device(struct pci_dev *pdev)
|
|
||||||
{
|
|
||||||
default_vga = pdev;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int efifb_setup(char *options)
|
static int efifb_setup(char *options)
|
||||||
{
|
{
|
||||||
char *this_opt;
|
char *this_opt;
|
||||||
int i;
|
int i;
|
||||||
struct pci_dev *dev = NULL;
|
|
||||||
|
|
||||||
if (options && *options) {
|
if (options && *options) {
|
||||||
while ((this_opt = strsep(&options, ",")) != NULL) {
|
while ((this_opt = strsep(&options, ",")) != NULL) {
|
||||||
|
@ -126,30 +111,6 @@ static int efifb_setup(char *options)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for_each_pci_dev(dev) {
|
|
||||||
int i;
|
|
||||||
|
|
||||||
if ((dev->class >> 8) != PCI_CLASS_DISPLAY_VGA)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
for (i=0; i < DEVICE_COUNT_RESOURCE; i++) {
|
|
||||||
resource_size_t start, end;
|
|
||||||
|
|
||||||
if (!(pci_resource_flags(dev, i) & IORESOURCE_MEM))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
start = pci_resource_start(dev, i);
|
|
||||||
end = pci_resource_end(dev, i);
|
|
||||||
|
|
||||||
if (!start || !end)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (screen_info.lfb_base >= start &&
|
|
||||||
(screen_info.lfb_base + screen_info.lfb_size) < end)
|
|
||||||
default_vga = dev;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -978,6 +978,8 @@ int pci_try_reset_slot(struct pci_slot *slot);
|
||||||
int pci_probe_reset_bus(struct pci_bus *bus);
|
int pci_probe_reset_bus(struct pci_bus *bus);
|
||||||
int pci_reset_bus(struct pci_bus *bus);
|
int pci_reset_bus(struct pci_bus *bus);
|
||||||
int pci_try_reset_bus(struct pci_bus *bus);
|
int pci_try_reset_bus(struct pci_bus *bus);
|
||||||
|
void pci_reset_secondary_bus(struct pci_dev *dev);
|
||||||
|
void pcibios_reset_secondary_bus(struct pci_dev *dev);
|
||||||
void pci_reset_bridge_secondary_bus(struct pci_dev *dev);
|
void pci_reset_bridge_secondary_bus(struct pci_dev *dev);
|
||||||
void pci_update_resource(struct pci_dev *dev, int resno);
|
void pci_update_resource(struct pci_dev *dev, int resno);
|
||||||
int __must_check pci_assign_resource(struct pci_dev *dev, int i);
|
int __must_check pci_assign_resource(struct pci_dev *dev, int i);
|
||||||
|
@ -1186,7 +1188,6 @@ int pci_msix_vec_count(struct pci_dev *dev);
|
||||||
int pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries, int nvec);
|
int pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries, int nvec);
|
||||||
void pci_msix_shutdown(struct pci_dev *dev);
|
void pci_msix_shutdown(struct pci_dev *dev);
|
||||||
void pci_disable_msix(struct pci_dev *dev);
|
void pci_disable_msix(struct pci_dev *dev);
|
||||||
void msi_remove_pci_irq_vectors(struct pci_dev *dev);
|
|
||||||
void pci_restore_msi_state(struct pci_dev *dev);
|
void pci_restore_msi_state(struct pci_dev *dev);
|
||||||
int pci_msi_enabled(void);
|
int pci_msi_enabled(void);
|
||||||
int pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec);
|
int pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec);
|
||||||
|
@ -1217,7 +1218,6 @@ static inline int pci_enable_msix(struct pci_dev *dev,
|
||||||
{ return -ENOSYS; }
|
{ return -ENOSYS; }
|
||||||
static inline void pci_msix_shutdown(struct pci_dev *dev) { }
|
static inline void pci_msix_shutdown(struct pci_dev *dev) { }
|
||||||
static inline void pci_disable_msix(struct pci_dev *dev) { }
|
static inline void pci_disable_msix(struct pci_dev *dev) { }
|
||||||
static inline void msi_remove_pci_irq_vectors(struct pci_dev *dev) { }
|
|
||||||
static inline void pci_restore_msi_state(struct pci_dev *dev) { }
|
static inline void pci_restore_msi_state(struct pci_dev *dev) { }
|
||||||
static inline int pci_msi_enabled(void) { return 0; }
|
static inline int pci_msi_enabled(void) { return 0; }
|
||||||
static inline int pci_enable_msi_range(struct pci_dev *dev, int minvec,
|
static inline int pci_enable_msi_range(struct pci_dev *dev, int minvec,
|
||||||
|
|
|
@ -6,6 +6,8 @@
|
||||||
* Do not add new entries to this file unless the definitions
|
* Do not add new entries to this file unless the definitions
|
||||||
* are shared between multiple drivers.
|
* are shared between multiple drivers.
|
||||||
*/
|
*/
|
||||||
|
#ifndef _LINUX_PCI_IDS_H
|
||||||
|
#define _LINUX_PCI_IDS_H
|
||||||
|
|
||||||
/* Device classes and subclasses */
|
/* Device classes and subclasses */
|
||||||
|
|
||||||
|
@ -2968,3 +2970,5 @@
|
||||||
#define PCI_DEVICE_ID_XEN_PLATFORM 0x0001
|
#define PCI_DEVICE_ID_XEN_PLATFORM 0x0001
|
||||||
|
|
||||||
#define PCI_VENDOR_ID_OCZ 0x1b85
|
#define PCI_VENDOR_ID_OCZ 0x1b85
|
||||||
|
|
||||||
|
#endif /* _LINUX_PCI_IDS_H */
|
||||||
|
|
Loading…
Reference in a new issue