mirror of
https://github.com/adulau/aha.git
synced 2024-12-27 19:26:25 +00:00
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci-2.6
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jbarnes/pci-2.6: PCI: only save/restore existent registers in the PCIe capability x86/PCI: don't bother with root quirks if _CRS is used docbooks: add/fix PCI kernel-doc PCI: cleanup debug output resources x86/PCI: set_pci_bus_resources_arch_default cleanups x86/PCI: Move set_pci_bus_resources_arch_default into arch/x86 x86/PCI: don't call e820_all_mapped with -1 in the mmconfig case PCI quirk: disable MSI on VIA VT3364 chipsets
This commit is contained in:
commit
3fb8e49200
15 changed files with 97 additions and 37 deletions
|
@ -190,16 +190,20 @@ X!Ekernel/module.c
|
|||
!Edrivers/pci/pci.c
|
||||
!Edrivers/pci/pci-driver.c
|
||||
!Edrivers/pci/remove.c
|
||||
!Edrivers/pci/pci-acpi.c
|
||||
!Edrivers/pci/search.c
|
||||
!Edrivers/pci/msi.c
|
||||
!Edrivers/pci/bus.c
|
||||
!Edrivers/pci/access.c
|
||||
!Edrivers/pci/irq.c
|
||||
!Edrivers/pci/htirq.c
|
||||
<!-- FIXME: Removed for now since no structured comments in source
|
||||
X!Edrivers/pci/hotplug.c
|
||||
-->
|
||||
!Edrivers/pci/probe.c
|
||||
!Edrivers/pci/slot.c
|
||||
!Edrivers/pci/rom.c
|
||||
!Edrivers/pci/iov.c
|
||||
!Idrivers/pci/pci-sysfs.c
|
||||
</sect1>
|
||||
<sect1><title>PCI Hotplug Support Library</title>
|
||||
!Edrivers/pci/hotplug/pci_hotplug_core.c
|
||||
|
|
|
@ -200,7 +200,7 @@ static inline void arch_fix_phys_package_id(int num, u32 slot)
|
|||
}
|
||||
|
||||
struct pci_bus;
|
||||
void set_pci_bus_resources_arch_default(struct pci_bus *b);
|
||||
void x86_pci_root_bus_res_quirks(struct pci_bus *b);
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
#define mc_capable() (cpumask_weight(cpu_core_mask(0)) != nr_cpu_ids)
|
||||
|
|
|
@ -94,12 +94,16 @@ struct pci_root_info {
|
|||
static int pci_root_num;
|
||||
static struct pci_root_info pci_root_info[PCI_ROOT_NR];
|
||||
|
||||
void set_pci_bus_resources_arch_default(struct pci_bus *b)
|
||||
void x86_pci_root_bus_res_quirks(struct pci_bus *b)
|
||||
{
|
||||
int i;
|
||||
int j;
|
||||
struct pci_root_info *info;
|
||||
|
||||
/* don't go for it if _CRS is used */
|
||||
if (pci_probe & PCI_USE__CRS)
|
||||
return;
|
||||
|
||||
/* if only one root bus, don't need to anything */
|
||||
if (pci_root_num < 2)
|
||||
return;
|
||||
|
|
|
@ -151,6 +151,9 @@ void __devinit pcibios_fixup_bus(struct pci_bus *b)
|
|||
{
|
||||
struct pci_dev *dev;
|
||||
|
||||
/* root bus? */
|
||||
if (!b->parent)
|
||||
x86_pci_root_bus_res_quirks(b);
|
||||
pci_read_bridge_bases(b);
|
||||
list_for_each_entry(dev, &b->devices, bus_list)
|
||||
pcibios_fixup_device_resources(dev);
|
||||
|
|
|
@ -238,6 +238,10 @@ void __init pcibios_resource_survey(void)
|
|||
*/
|
||||
fs_initcall(pcibios_assign_resources);
|
||||
|
||||
void __weak x86_pci_root_bus_res_quirks(struct pci_bus *b)
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
* If we set up a device for bus mastering, we need to check the latency
|
||||
* timer as certain crappy BIOSes forget to set it properly.
|
||||
|
|
|
@ -375,7 +375,7 @@ static acpi_status __init check_mcfg_resource(struct acpi_resource *res,
|
|||
if (!fixmem32)
|
||||
return AE_OK;
|
||||
if ((mcfg_res->start >= fixmem32->address) &&
|
||||
(mcfg_res->end < (fixmem32->address +
|
||||
(mcfg_res->end <= (fixmem32->address +
|
||||
fixmem32->address_length))) {
|
||||
mcfg_res->flags = 1;
|
||||
return AE_CTRL_TERMINATE;
|
||||
|
@ -392,7 +392,7 @@ static acpi_status __init check_mcfg_resource(struct acpi_resource *res,
|
|||
return AE_OK;
|
||||
|
||||
if ((mcfg_res->start >= address.minimum) &&
|
||||
(mcfg_res->end < (address.minimum + address.address_length))) {
|
||||
(mcfg_res->end <= (address.minimum + address.address_length))) {
|
||||
mcfg_res->flags = 1;
|
||||
return AE_CTRL_TERMINATE;
|
||||
}
|
||||
|
@ -439,7 +439,7 @@ static int __init is_mmconf_reserved(check_reserved_t is_reserved,
|
|||
u64 old_size = size;
|
||||
int valid = 0;
|
||||
|
||||
while (!is_reserved(addr, addr + size - 1, E820_RESERVED)) {
|
||||
while (!is_reserved(addr, addr + size, E820_RESERVED)) {
|
||||
size >>= 1;
|
||||
if (size < (16UL<<20))
|
||||
break;
|
||||
|
|
|
@ -87,8 +87,8 @@ EXPORT_SYMBOL(pci_read_vpd);
|
|||
* pci_write_vpd - Write entry to Vital Product Data
|
||||
* @dev: pci device struct
|
||||
* @pos: offset in vpd space
|
||||
* @count: number of bytes to read
|
||||
* @val: value to write
|
||||
* @count: number of bytes to write
|
||||
* @buf: buffer containing write data
|
||||
*
|
||||
*/
|
||||
ssize_t pci_write_vpd(struct pci_dev *dev, loff_t pos, size_t count, const void *buf)
|
||||
|
|
|
@ -158,6 +158,7 @@ int ht_create_irq(struct pci_dev *dev, int idx)
|
|||
|
||||
/**
|
||||
* ht_destroy_irq - destroy an irq created with ht_create_irq
|
||||
* @irq: irq to be destroyed
|
||||
*
|
||||
* This reverses ht_create_irq removing the specified irq from
|
||||
* existence. The irq should be free before this happens.
|
||||
|
|
|
@ -492,6 +492,7 @@ write_vpd_attr(struct kobject *kobj, struct bin_attribute *bin_attr,
|
|||
/**
|
||||
* pci_read_legacy_io - read byte(s) from legacy I/O port space
|
||||
* @kobj: kobject corresponding to file to read from
|
||||
* @bin_attr: struct bin_attribute for this file
|
||||
* @buf: buffer to store results
|
||||
* @off: offset into legacy I/O port space
|
||||
* @count: number of bytes to read
|
||||
|
@ -517,6 +518,7 @@ pci_read_legacy_io(struct kobject *kobj, struct bin_attribute *bin_attr,
|
|||
/**
|
||||
* pci_write_legacy_io - write byte(s) to legacy I/O port space
|
||||
* @kobj: kobject corresponding to file to read from
|
||||
* @bin_attr: struct bin_attribute for this file
|
||||
* @buf: buffer containing value to be written
|
||||
* @off: offset into legacy I/O port space
|
||||
* @count: number of bytes to write
|
||||
|
@ -733,9 +735,9 @@ pci_mmap_resource_wc(struct kobject *kobj, struct bin_attribute *attr,
|
|||
|
||||
/**
|
||||
* pci_remove_resource_files - cleanup resource files
|
||||
* @dev: dev to cleanup
|
||||
* @pdev: dev to cleanup
|
||||
*
|
||||
* If we created resource files for @dev, remove them from sysfs and
|
||||
* If we created resource files for @pdev, remove them from sysfs and
|
||||
* free their resources.
|
||||
*/
|
||||
static void
|
||||
|
@ -793,9 +795,9 @@ static int pci_create_attr(struct pci_dev *pdev, int num, int write_combine)
|
|||
|
||||
/**
|
||||
* pci_create_resource_files - create resource files in sysfs for @dev
|
||||
* @dev: dev in question
|
||||
* @pdev: dev in question
|
||||
*
|
||||
* Walk the resources in @dev creating files for each resource available.
|
||||
* Walk the resources in @pdev creating files for each resource available.
|
||||
*/
|
||||
static int pci_create_resource_files(struct pci_dev *pdev)
|
||||
{
|
||||
|
@ -829,6 +831,7 @@ void __weak pci_remove_resource_files(struct pci_dev *dev) { return; }
|
|||
/**
|
||||
* pci_write_rom - used to enable access to the PCI ROM display
|
||||
* @kobj: kernel object handle
|
||||
* @bin_attr: struct bin_attribute for this file
|
||||
* @buf: user input
|
||||
* @off: file offset
|
||||
* @count: number of byte in input
|
||||
|
@ -852,6 +855,7 @@ pci_write_rom(struct kobject *kobj, struct bin_attribute *bin_attr,
|
|||
/**
|
||||
* pci_read_rom - read a PCI ROM
|
||||
* @kobj: kernel object handle
|
||||
* @bin_attr: struct bin_attribute for this file
|
||||
* @buf: where to put the data we read from the ROM
|
||||
* @off: file offset
|
||||
* @count: number of bytes to read
|
||||
|
|
|
@ -681,11 +681,34 @@ EXPORT_SYMBOL(pci_choose_state);
|
|||
|
||||
#define PCI_EXP_SAVE_REGS 7
|
||||
|
||||
#define pcie_cap_has_devctl(type, flags) 1
|
||||
#define pcie_cap_has_lnkctl(type, flags) \
|
||||
((flags & PCI_EXP_FLAGS_VERS) > 1 || \
|
||||
(type == PCI_EXP_TYPE_ROOT_PORT || \
|
||||
type == PCI_EXP_TYPE_ENDPOINT || \
|
||||
type == PCI_EXP_TYPE_LEG_END))
|
||||
#define pcie_cap_has_sltctl(type, flags) \
|
||||
((flags & PCI_EXP_FLAGS_VERS) > 1 || \
|
||||
((type == PCI_EXP_TYPE_ROOT_PORT) || \
|
||||
(type == PCI_EXP_TYPE_DOWNSTREAM && \
|
||||
(flags & PCI_EXP_FLAGS_SLOT))))
|
||||
#define pcie_cap_has_rtctl(type, flags) \
|
||||
((flags & PCI_EXP_FLAGS_VERS) > 1 || \
|
||||
(type == PCI_EXP_TYPE_ROOT_PORT || \
|
||||
type == PCI_EXP_TYPE_RC_EC))
|
||||
#define pcie_cap_has_devctl2(type, flags) \
|
||||
((flags & PCI_EXP_FLAGS_VERS) > 1)
|
||||
#define pcie_cap_has_lnkctl2(type, flags) \
|
||||
((flags & PCI_EXP_FLAGS_VERS) > 1)
|
||||
#define pcie_cap_has_sltctl2(type, flags) \
|
||||
((flags & PCI_EXP_FLAGS_VERS) > 1)
|
||||
|
||||
static int pci_save_pcie_state(struct pci_dev *dev)
|
||||
{
|
||||
int pos, i = 0;
|
||||
struct pci_cap_saved_state *save_state;
|
||||
u16 *cap;
|
||||
u16 flags;
|
||||
|
||||
pos = pci_find_capability(dev, PCI_CAP_ID_EXP);
|
||||
if (pos <= 0)
|
||||
|
@ -698,12 +721,21 @@ static int pci_save_pcie_state(struct pci_dev *dev)
|
|||
}
|
||||
cap = (u16 *)&save_state->data[0];
|
||||
|
||||
pci_read_config_word(dev, pos + PCI_EXP_FLAGS, &flags);
|
||||
|
||||
if (pcie_cap_has_devctl(dev->pcie_type, flags))
|
||||
pci_read_config_word(dev, pos + PCI_EXP_DEVCTL, &cap[i++]);
|
||||
if (pcie_cap_has_lnkctl(dev->pcie_type, flags))
|
||||
pci_read_config_word(dev, pos + PCI_EXP_LNKCTL, &cap[i++]);
|
||||
if (pcie_cap_has_sltctl(dev->pcie_type, flags))
|
||||
pci_read_config_word(dev, pos + PCI_EXP_SLTCTL, &cap[i++]);
|
||||
if (pcie_cap_has_rtctl(dev->pcie_type, flags))
|
||||
pci_read_config_word(dev, pos + PCI_EXP_RTCTL, &cap[i++]);
|
||||
if (pcie_cap_has_devctl2(dev->pcie_type, flags))
|
||||
pci_read_config_word(dev, pos + PCI_EXP_DEVCTL2, &cap[i++]);
|
||||
if (pcie_cap_has_lnkctl2(dev->pcie_type, flags))
|
||||
pci_read_config_word(dev, pos + PCI_EXP_LNKCTL2, &cap[i++]);
|
||||
if (pcie_cap_has_sltctl2(dev->pcie_type, flags))
|
||||
pci_read_config_word(dev, pos + PCI_EXP_SLTCTL2, &cap[i++]);
|
||||
|
||||
return 0;
|
||||
|
@ -714,6 +746,7 @@ static void pci_restore_pcie_state(struct pci_dev *dev)
|
|||
int i = 0, pos;
|
||||
struct pci_cap_saved_state *save_state;
|
||||
u16 *cap;
|
||||
u16 flags;
|
||||
|
||||
save_state = pci_find_saved_cap(dev, PCI_CAP_ID_EXP);
|
||||
pos = pci_find_capability(dev, PCI_CAP_ID_EXP);
|
||||
|
@ -721,12 +754,21 @@ static void pci_restore_pcie_state(struct pci_dev *dev)
|
|||
return;
|
||||
cap = (u16 *)&save_state->data[0];
|
||||
|
||||
pci_read_config_word(dev, pos + PCI_EXP_FLAGS, &flags);
|
||||
|
||||
if (pcie_cap_has_devctl(dev->pcie_type, flags))
|
||||
pci_write_config_word(dev, pos + PCI_EXP_DEVCTL, cap[i++]);
|
||||
if (pcie_cap_has_lnkctl(dev->pcie_type, flags))
|
||||
pci_write_config_word(dev, pos + PCI_EXP_LNKCTL, cap[i++]);
|
||||
if (pcie_cap_has_sltctl(dev->pcie_type, flags))
|
||||
pci_write_config_word(dev, pos + PCI_EXP_SLTCTL, cap[i++]);
|
||||
if (pcie_cap_has_rtctl(dev->pcie_type, flags))
|
||||
pci_write_config_word(dev, pos + PCI_EXP_RTCTL, cap[i++]);
|
||||
if (pcie_cap_has_devctl2(dev->pcie_type, flags))
|
||||
pci_write_config_word(dev, pos + PCI_EXP_DEVCTL2, cap[i++]);
|
||||
if (pcie_cap_has_lnkctl2(dev->pcie_type, flags))
|
||||
pci_write_config_word(dev, pos + PCI_EXP_LNKCTL2, cap[i++]);
|
||||
if (pcie_cap_has_sltctl2(dev->pcie_type, flags))
|
||||
pci_write_config_word(dev, pos + PCI_EXP_SLTCTL2, cap[i++]);
|
||||
}
|
||||
|
||||
|
|
|
@ -1118,10 +1118,6 @@ unsigned int __devinit pci_scan_child_bus(struct pci_bus *bus)
|
|||
return max;
|
||||
}
|
||||
|
||||
void __attribute__((weak)) set_pci_bus_resources_arch_default(struct pci_bus *b)
|
||||
{
|
||||
}
|
||||
|
||||
struct pci_bus * pci_create_bus(struct device *parent,
|
||||
int bus, struct pci_ops *ops, void *sysdata)
|
||||
{
|
||||
|
@ -1180,8 +1176,6 @@ struct pci_bus * pci_create_bus(struct device *parent,
|
|||
b->resource[0] = &ioport_resource;
|
||||
b->resource[1] = &iomem_resource;
|
||||
|
||||
set_pci_bus_resources_arch_default(b);
|
||||
|
||||
return b;
|
||||
|
||||
dev_create_file_err:
|
||||
|
|
|
@ -2033,6 +2033,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS400_200, quirk_di
|
|||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS480, quirk_disable_all_msi);
|
||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VT3336, quirk_disable_all_msi);
|
||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VT3351, quirk_disable_all_msi);
|
||||
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VT3364, quirk_disable_all_msi);
|
||||
|
||||
/* Disable MSI on chipsets that are known to not support it */
|
||||
static void __devinit quirk_disable_msi(struct pci_dev *dev)
|
||||
|
|
|
@ -536,11 +536,13 @@ static void pci_bus_dump_res(struct pci_bus *bus)
|
|||
|
||||
for (i = 0; i < PCI_BUS_NUM_RESOURCES; i++) {
|
||||
struct resource *res = bus->resource[i];
|
||||
if (!res)
|
||||
if (!res || !res->end)
|
||||
continue;
|
||||
|
||||
dev_printk(KERN_DEBUG, &bus->dev, "resource %d %s %pR\n", i,
|
||||
(res->flags & IORESOURCE_IO) ? "io: " : "mem:", res);
|
||||
(res->flags & IORESOURCE_IO) ? "io: " :
|
||||
((res->flags & IORESOURCE_PREFETCH)? "pref mem":"mem:"),
|
||||
res);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -264,8 +264,8 @@ EXPORT_SYMBOL_GPL(pci_create_slot);
|
|||
|
||||
/**
|
||||
* pci_renumber_slot - update %struct pci_slot -> number
|
||||
* @slot - %struct pci_slot to update
|
||||
* @slot_nr - new number for slot
|
||||
* @slot: &struct pci_slot to update
|
||||
* @slot_nr: new number for slot
|
||||
*
|
||||
* The primary purpose of this interface is to allow callers who earlier
|
||||
* created a placeholder slot in pci_create_slot() by passing a -1 as
|
||||
|
|
|
@ -376,6 +376,7 @@
|
|||
#define PCI_EXP_TYPE_DOWNSTREAM 0x6 /* Downstream Port */
|
||||
#define PCI_EXP_TYPE_PCI_BRIDGE 0x7 /* PCI/PCI-X Bridge */
|
||||
#define PCI_EXP_TYPE_RC_END 0x9 /* Root Complex Integrated Endpoint */
|
||||
#define PCI_EXP_TYPE_RC_EC 0x10 /* Root Complex Event Collector */
|
||||
#define PCI_EXP_FLAGS_SLOT 0x0100 /* Slot implemented */
|
||||
#define PCI_EXP_FLAGS_IRQ 0x3e00 /* Interrupt message number */
|
||||
#define PCI_EXP_DEVCAP 4 /* Device capabilities */
|
||||
|
|
Loading…
Reference in a new issue