提交 18e5e691 编写于 作者: B Bjorn Helgaas

Merge branches 'pci/aer', 'pci/enumeration', 'pci/kconfig', 'pci/misc',...

Merge branches 'pci/aer', 'pci/enumeration', 'pci/kconfig', 'pci/misc', 'pci/virtualization' and 'pci/vpd' into next

* pci/aer:
  PCI/AER: Log aer_inject error injections
  PCI/AER: Log actual error causes in aer_inject
  PCI/AER: Use dev_warn() in aer_inject
  PCI/AER: Fix aer_inject error codes

* pci/enumeration:
  PCI: Fix broken URL for Dell biosdevname

* pci/kconfig:
  PCI: Cleanup pci/pcie/Kconfig whitespace
  PCI: Include pci/hotplug Kconfig directly from pci/Kconfig
  PCI: Include pci/pcie/Kconfig directly from pci/Kconfig

* pci/misc:
  PCI: Add PCI_CLASS_SERIAL_USB_DEVICE definition
  PCI: Add QEMU top-level IDs for (sub)vendor & device
  unicore32: Remove unused HAVE_ARCH_PCI_SET_DMA_MASK definition
  PCI: Consolidate PCI DMA constants and interfaces in linux/pci-dma-compat.h
  PCI: Move pci_dma_* helpers to common code
  frv/PCI: Remove stray pci_{alloc,free}_consistent() declaration

* pci/virtualization:
  PCI: Wait for up to 1000ms after FLR reset
  PCI: Support SR-IOV on any function type

* pci/vpd:
  PCI: Prevent VPD access for buggy devices
  PCI: Sleep rather than busy-wait for VPD access completion
  PCI: Fold struct pci_vpd_pci22 into struct pci_vpd
  PCI: Rename VPD symbols to remove unnecessary "pci22"
  PCI: Remove struct pci_vpd_ops.release function pointer
  PCI: Move pci_vpd_release() from header file to pci/access.c
  PCI: Move pci_read_vpd() and pci_write_vpd() close to other VPD code
  PCI: Determine actual VPD size on first access
  PCI: Use bitfield instead of bool for struct pci_vpd_pci22.busy
  PCI: Allow access to VPD attributes with size 0
  PCI: Update VPD definitions
...@@ -65,13 +65,6 @@ extern void pcibios_set_master(struct pci_dev *dev); ...@@ -65,13 +65,6 @@ extern void pcibios_set_master(struct pci_dev *dev);
decisions. */ decisions. */
#define PCI_DMA_BUS_IS_PHYS 0 #define PCI_DMA_BUS_IS_PHYS 0
#ifdef CONFIG_PCI
/* implement the pci_ DMA API in terms of the generic device dma_ one */
#include <asm-generic/pci-dma-compat.h>
#endif
/* TODO: integrate with include/asm-generic/pci.h ? */ /* TODO: integrate with include/asm-generic/pci.h ? */
static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel) static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel)
{ {
......
...@@ -1212,7 +1212,6 @@ config PCI_HOST_ITE8152 ...@@ -1212,7 +1212,6 @@ config PCI_HOST_ITE8152
select DMABOUNCE select DMABOUNCE
source "drivers/pci/Kconfig" source "drivers/pci/Kconfig"
source "drivers/pci/pcie/Kconfig"
source "drivers/pcmcia/Kconfig" source "drivers/pcmcia/Kconfig"
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
#define ASMARM_PCI_H #define ASMARM_PCI_H
#ifdef __KERNEL__ #ifdef __KERNEL__
#include <asm-generic/pci-dma-compat.h>
#include <asm/mach/pci.h> /* for pci_sys_data */ #include <asm/mach/pci.h> /* for pci_sys_data */
extern unsigned long pcibios_min_io; extern unsigned long pcibios_min_io;
......
...@@ -235,8 +235,6 @@ config PCI_SYSCALL ...@@ -235,8 +235,6 @@ config PCI_SYSCALL
def_bool PCI def_bool PCI
source "drivers/pci/Kconfig" source "drivers/pci/Kconfig"
source "drivers/pci/pcie/Kconfig"
source "drivers/pci/hotplug/Kconfig"
endmenu endmenu
......
...@@ -7,7 +7,6 @@ ...@@ -7,7 +7,6 @@
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm-generic/pci-dma-compat.h>
#define PCIBIOS_MIN_IO 0x1000 #define PCIBIOS_MIN_IO 0x1000
#define PCIBIOS_MIN_MEM 0 #define PCIBIOS_MIN_MEM 0
......
...@@ -5,6 +5,4 @@ ...@@ -5,6 +5,4 @@
#define PCI_DMA_BUS_IS_PHYS (1) #define PCI_DMA_BUS_IS_PHYS (1)
#include <asm-generic/pci-dma-compat.h>
#endif /* __ASM_AVR32_PCI_H__ */ #endif /* __ASM_AVR32_PCI_H__ */
...@@ -1233,8 +1233,6 @@ source "drivers/pci/Kconfig" ...@@ -1233,8 +1233,6 @@ source "drivers/pci/Kconfig"
source "drivers/pcmcia/Kconfig" source "drivers/pcmcia/Kconfig"
source "drivers/pci/hotplug/Kconfig"
endmenu endmenu
menu "Executable file formats" menu "Executable file formats"
......
...@@ -4,7 +4,6 @@ ...@@ -4,7 +4,6 @@
#define _ASM_BFIN_PCI_H #define _ASM_BFIN_PCI_H
#include <linux/scatterlist.h> #include <linux/scatterlist.h>
#include <asm-generic/pci-dma-compat.h>
#include <asm-generic/pci.h> #include <asm-generic/pci.h>
#define PCIBIOS_MIN_IO 0x00001000 #define PCIBIOS_MIN_IO 0x00001000
......
...@@ -48,9 +48,6 @@ extern int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, ...@@ -48,9 +48,6 @@ extern int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
/* implement the pci_ DMA API in terms of the generic device dma_ one */
#include <asm-generic/pci-dma-compat.h>
/* generic pci stuff */ /* generic pci stuff */
#include <asm-generic/pci.h> #include <asm-generic/pci.h>
......
...@@ -15,7 +15,6 @@ ...@@ -15,7 +15,6 @@
#include <linux/mm.h> #include <linux/mm.h>
#include <linux/scatterlist.h> #include <linux/scatterlist.h>
#include <asm-generic/pci-dma-compat.h>
#include <asm-generic/pci.h> #include <asm-generic/pci.h>
struct pci_dev; struct pci_dev;
...@@ -32,12 +31,6 @@ extern void consistent_sync_page(struct page *page, unsigned long offset, ...@@ -32,12 +31,6 @@ extern void consistent_sync_page(struct page *page, unsigned long offset,
size_t size, int direction); size_t size, int direction);
#endif #endif
extern void *pci_alloc_consistent(struct pci_dev *hwdev, size_t size,
dma_addr_t *dma_handle);
extern void pci_free_consistent(struct pci_dev *hwdev, size_t size,
void *vaddr, dma_addr_t dma_handle);
/* Return the index of the PCI controller for device PDEV. */ /* Return the index of the PCI controller for device PDEV. */
#define pci_controller_num(PDEV) (0) #define pci_controller_num(PDEV) (0)
......
...@@ -574,12 +574,8 @@ config PCI_DOMAINS ...@@ -574,12 +574,8 @@ config PCI_DOMAINS
config PCI_SYSCALL config PCI_SYSCALL
def_bool PCI def_bool PCI
source "drivers/pci/pcie/Kconfig"
source "drivers/pci/Kconfig" source "drivers/pci/Kconfig"
source "drivers/pci/hotplug/Kconfig"
source "drivers/pcmcia/Kconfig" source "drivers/pcmcia/Kconfig"
endmenu endmenu
......
...@@ -50,8 +50,6 @@ struct pci_dev; ...@@ -50,8 +50,6 @@ struct pci_dev;
extern unsigned long ia64_max_iommu_merge_mask; extern unsigned long ia64_max_iommu_merge_mask;
#define PCI_DMA_BUS_IS_PHYS (ia64_max_iommu_merge_mask == ~0UL) #define PCI_DMA_BUS_IS_PHYS (ia64_max_iommu_merge_mask == ~0UL)
#include <asm-generic/pci-dma-compat.h>
#define HAVE_PCI_MMAP #define HAVE_PCI_MMAP
extern int pci_mmap_page_range (struct pci_dev *dev, struct vm_area_struct *vma, extern int pci_mmap_page_range (struct pci_dev *dev, struct vm_area_struct *vma,
enum pci_mmap_state mmap_state, int write_combine); enum pci_mmap_state mmap_state, int write_combine);
......
...@@ -386,8 +386,6 @@ config ISA ...@@ -386,8 +386,6 @@ config ISA
source "drivers/pcmcia/Kconfig" source "drivers/pcmcia/Kconfig"
source "drivers/pci/hotplug/Kconfig"
endmenu endmenu
......
#ifndef _ASM_M68K_PCI_H #ifndef _ASM_M68K_PCI_H
#define _ASM_M68K_PCI_H #define _ASM_M68K_PCI_H
#include <asm-generic/pci-dma-compat.h>
#include <asm-generic/pci.h> #include <asm-generic/pci.h>
/* The PCI address space does equal the physical memory /* The PCI address space does equal the physical memory
......
...@@ -22,8 +22,6 @@ ...@@ -22,8 +22,6 @@
#include <asm/prom.h> #include <asm/prom.h>
#include <asm/pci-bridge.h> #include <asm/pci-bridge.h>
#include <asm-generic/pci-dma-compat.h>
#define PCIBIOS_MIN_IO 0x1000 #define PCIBIOS_MIN_IO 0x1000
#define PCIBIOS_MIN_MEM 0x10000000 #define PCIBIOS_MIN_MEM 0x10000000
......
...@@ -2876,8 +2876,6 @@ config PCI_DOMAINS ...@@ -2876,8 +2876,6 @@ config PCI_DOMAINS
source "drivers/pci/Kconfig" source "drivers/pci/Kconfig"
source "drivers/pci/pcie/Kconfig"
# #
# ISA support is now enabled via select. Too many systems still have the one # ISA support is now enabled via select. Too many systems still have the one
# or other ISA chip on the board that users don't know about so don't expect # or other ISA chip on the board that users don't know about so don't expect
...@@ -2937,8 +2935,6 @@ config ZONE_DMA32 ...@@ -2937,8 +2935,6 @@ config ZONE_DMA32
source "drivers/pcmcia/Kconfig" source "drivers/pcmcia/Kconfig"
source "drivers/pci/hotplug/Kconfig"
config RAPIDIO config RAPIDIO
tristate "RapidIO support" tristate "RapidIO support"
depends on PCI depends on PCI
......
...@@ -124,9 +124,6 @@ static inline int pci_proc_domain(struct pci_bus *bus) ...@@ -124,9 +124,6 @@ static inline int pci_proc_domain(struct pci_bus *bus)
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
/* implement the pci_ DMA API in terms of the generic device dma_ one */
#include <asm-generic/pci-dma-compat.h>
/* Do platform specific device initialization at pci_enable_device() time */ /* Do platform specific device initialization at pci_enable_device() time */
extern int pcibios_plat_dev_init(struct pci_dev *dev); extern int pcibios_plat_dev_init(struct pci_dev *dev);
......
...@@ -80,9 +80,6 @@ extern int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma, ...@@ -80,9 +80,6 @@ extern int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
/* implement the pci_ DMA API in terms of the generic device dma_ one */
#include <asm-generic/pci-dma-compat.h>
static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel) static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel)
{ {
return channel ? 15 : 14; return channel ? 15 : 14;
......
...@@ -194,9 +194,6 @@ extern void pcibios_init_bridge(struct pci_dev *); ...@@ -194,9 +194,6 @@ extern void pcibios_init_bridge(struct pci_dev *);
#define PCIBIOS_MIN_IO 0x10 #define PCIBIOS_MIN_IO 0x10
#define PCIBIOS_MIN_MEM 0x1000 /* NBPG - but pci/setup-res.c dies */ #define PCIBIOS_MIN_MEM 0x1000 /* NBPG - but pci/setup-res.c dies */
/* export the pci_ DMA API in terms of the dma_ one */
#include <asm-generic/pci-dma-compat.h>
static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel) static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel)
{ {
return channel ? 15 : 14; return channel ? 15 : 14;
......
...@@ -828,14 +828,10 @@ config PCI_8260 ...@@ -828,14 +828,10 @@ config PCI_8260
select PPC_INDIRECT_PCI select PPC_INDIRECT_PCI
default y default y
source "drivers/pci/pcie/Kconfig"
source "drivers/pci/Kconfig" source "drivers/pci/Kconfig"
source "drivers/pcmcia/Kconfig" source "drivers/pcmcia/Kconfig"
source "drivers/pci/hotplug/Kconfig"
config HAS_RAPIDIO config HAS_RAPIDIO
bool bool
default n default n
......
...@@ -20,8 +20,6 @@ ...@@ -20,8 +20,6 @@
#include <asm/prom.h> #include <asm/prom.h>
#include <asm/pci-bridge.h> #include <asm/pci-bridge.h>
#include <asm-generic/pci-dma-compat.h>
/* Return values for pci_controller_ops.probe_mode function */ /* Return values for pci_controller_ops.probe_mode function */
#define PCI_PROBE_NONE -1 /* Don't look at this bus at all */ #define PCI_PROBE_NONE -1 /* Don't look at this bus at all */
#define PCI_PROBE_NORMAL 0 /* Do normal PCI probing */ #define PCI_PROBE_NORMAL 0 /* Do normal PCI probing */
......
...@@ -605,8 +605,6 @@ config PCI_NR_MSI ...@@ -605,8 +605,6 @@ config PCI_NR_MSI
PCI devices. PCI devices.
source "drivers/pci/Kconfig" source "drivers/pci/Kconfig"
source "drivers/pci/pcie/Kconfig"
source "drivers/pci/hotplug/Kconfig"
endif # PCI endif # PCI
......
...@@ -9,7 +9,6 @@ ...@@ -9,7 +9,6 @@
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <asm-generic/pci.h> #include <asm-generic/pci.h>
#include <asm-generic/pci-dma-compat.h>
#include <asm/pci_clp.h> #include <asm/pci_clp.h>
#include <asm/pci_debug.h> #include <asm/pci_debug.h>
......
...@@ -847,14 +847,10 @@ config PCI ...@@ -847,14 +847,10 @@ config PCI
config PCI_DOMAINS config PCI_DOMAINS
bool bool
source "drivers/pci/pcie/Kconfig"
source "drivers/pci/Kconfig" source "drivers/pci/Kconfig"
source "drivers/pcmcia/Kconfig" source "drivers/pcmcia/Kconfig"
source "drivers/pci/hotplug/Kconfig"
endmenu endmenu
menu "Executable file formats" menu "Executable file formats"
......
...@@ -105,9 +105,6 @@ static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel) ...@@ -105,9 +105,6 @@ static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel)
return channel ? 15 : 14; return channel ? 15 : 14;
} }
/* generic DMA-mapping stuff */
#include <asm-generic/pci-dma-compat.h>
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#endif /* __ASM_SH_PCI_H */ #endif /* __ASM_SH_PCI_H */
...@@ -5,7 +5,4 @@ ...@@ -5,7 +5,4 @@
#else #else
#include <asm/pci_32.h> #include <asm/pci_32.h>
#endif #endif
#include <asm-generic/pci-dma-compat.h>
#endif #endif
...@@ -455,8 +455,6 @@ config TILE_PCI_IO ...@@ -455,8 +455,6 @@ config TILE_PCI_IO
source "drivers/pci/Kconfig" source "drivers/pci/Kconfig"
source "drivers/pci/pcie/Kconfig"
config TILE_USB config TILE_USB
tristate "Tilera USB host adapter support" tristate "Tilera USB host adapter support"
default y default y
...@@ -467,8 +465,6 @@ config TILE_USB ...@@ -467,8 +465,6 @@ config TILE_USB
Provides USB host adapter support for the built-in EHCI and OHCI Provides USB host adapter support for the built-in EHCI and OHCI
interfaces on TILE-Gx chips. interfaces on TILE-Gx chips.
source "drivers/pci/hotplug/Kconfig"
endmenu endmenu
menu "Executable file formats" menu "Executable file formats"
......
...@@ -226,7 +226,4 @@ static inline int pcibios_assign_all_busses(void) ...@@ -226,7 +226,4 @@ static inline int pcibios_assign_all_busses(void)
/* Use any cpu for PCI. */ /* Use any cpu for PCI. */
#define cpumask_of_pcibus(bus) cpu_online_mask #define cpumask_of_pcibus(bus) cpu_online_mask
/* implement the pci_ DMA API in terms of the generic device dma_ one */
#include <asm-generic/pci-dma-compat.h>
#endif /* _ASM_TILE_PCI_H */ #endif /* _ASM_TILE_PCI_H */
...@@ -13,7 +13,6 @@ ...@@ -13,7 +13,6 @@
#define __UNICORE_PCI_H__ #define __UNICORE_PCI_H__
#ifdef __KERNEL__ #ifdef __KERNEL__
#include <asm-generic/pci-dma-compat.h>
#include <asm-generic/pci.h> #include <asm-generic/pci.h>
#include <mach/hardware.h> /* for PCIBIOS_MIN_* */ #include <mach/hardware.h> /* for PCIBIOS_MIN_* */
......
...@@ -28,11 +28,6 @@ ...@@ -28,11 +28,6 @@
#define PCIBIOS_MIN_IO 0x4000 /* should lower than 64KB */ #define PCIBIOS_MIN_IO 0x4000 /* should lower than 64KB */
#define PCIBIOS_MIN_MEM io_v2p(PKUNITY_PCIMEM_BASE) #define PCIBIOS_MIN_MEM io_v2p(PKUNITY_PCIMEM_BASE)
/*
* We override the standard dma-mask routines for bouncing.
*/
#define HAVE_ARCH_PCI_SET_DMA_MASK
#define pcibios_assign_all_busses() 1 #define pcibios_assign_all_busses() 1
#endif /* __MACH_PUV3_HARDWARE_H__ */ #endif /* __MACH_PUV3_HARDWARE_H__ */
...@@ -2431,8 +2431,6 @@ config PCI_CNB20LE_QUIRK ...@@ -2431,8 +2431,6 @@ config PCI_CNB20LE_QUIRK
You should say N unless you know you need this. You should say N unless you know you need this.
source "drivers/pci/pcie/Kconfig"
source "drivers/pci/Kconfig" source "drivers/pci/Kconfig"
# x86_64 have no ISA slots, but can have ISA-style DMA. # x86_64 have no ISA slots, but can have ISA-style DMA.
...@@ -2588,8 +2586,6 @@ config AMD_NB ...@@ -2588,8 +2586,6 @@ config AMD_NB
source "drivers/pcmcia/Kconfig" source "drivers/pcmcia/Kconfig"
source "drivers/pci/hotplug/Kconfig"
config RAPIDIO config RAPIDIO
tristate "RapidIO support" tristate "RapidIO support"
depends on PCI depends on PCI
......
...@@ -105,9 +105,6 @@ void native_restore_msi_irqs(struct pci_dev *dev); ...@@ -105,9 +105,6 @@ void native_restore_msi_irqs(struct pci_dev *dev);
#include <asm/pci_64.h> #include <asm/pci_64.h>
#endif #endif
/* implement the pci_ DMA API in terms of the generic device dma_ one */
#include <asm-generic/pci-dma-compat.h>
/* generic pci stuff */ /* generic pci stuff */
#include <asm-generic/pci.h> #include <asm-generic/pci.h>
......
...@@ -413,8 +413,6 @@ config FORCE_MAX_ZONEORDER ...@@ -413,8 +413,6 @@ config FORCE_MAX_ZONEORDER
source "drivers/pcmcia/Kconfig" source "drivers/pcmcia/Kconfig"
source "drivers/pci/hotplug/Kconfig"
config PLATFORM_WANT_DEFAULT_MEM config PLATFORM_WANT_DEFAULT_MEM
def_bool n def_bool n
......
...@@ -55,9 +55,6 @@ int pci_mmap_page_range(struct pci_dev *pdev, struct vm_area_struct *vma, ...@@ -55,9 +55,6 @@ int pci_mmap_page_range(struct pci_dev *pdev, struct vm_area_struct *vma,
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
/* Implement the pci_ DMA API in terms of the generic device dma_ one */
#include <asm-generic/pci-dma-compat.h>
/* Generic PCI */ /* Generic PCI */
#include <asm-generic/pci.h> #include <asm-generic/pci.h>
......
...@@ -182,8 +182,8 @@ static const struct pci_device_id bochs_pci_tbl[] = { ...@@ -182,8 +182,8 @@ static const struct pci_device_id bochs_pci_tbl[] = {
{ {
.vendor = 0x1234, .vendor = 0x1234,
.device = 0x1111, .device = 0x1111,
.subvendor = 0x1af4, .subvendor = PCI_SUBVENDOR_ID_REDHAT_QUMRANET,
.subdevice = 0x1100, .subdevice = PCI_SUBDEVICE_ID_QEMU,
.driver_data = BOCHS_QEMU_STDVGA, .driver_data = BOCHS_QEMU_STDVGA,
}, },
{ {
......
...@@ -33,8 +33,9 @@ static struct drm_driver driver; ...@@ -33,8 +33,9 @@ static struct drm_driver driver;
/* only bind to the cirrus chip in qemu */ /* only bind to the cirrus chip in qemu */
static const struct pci_device_id pciidlist[] = { static const struct pci_device_id pciidlist[] = {
{ PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_5446, 0x1af4, 0x1100, 0, { PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_5446,
0, 0 }, PCI_SUBVENDOR_ID_REDHAT_QUMRANET, PCI_SUBDEVICE_ID_QEMU,
0, 0, 0 },
{ PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_5446, PCI_VENDOR_ID_XEN, { PCI_VENDOR_ID_CIRRUS, PCI_DEVICE_ID_CIRRUS_5446, PCI_VENDOR_ID_XEN,
0x0001, 0, 0, 0 }, 0x0001, 0, 0, 0 },
{0,} {0,}
......
...@@ -110,8 +110,6 @@ config IOMMU_HELPER ...@@ -110,8 +110,6 @@ config IOMMU_HELPER
source "drivers/pcmcia/Kconfig" source "drivers/pcmcia/Kconfig"
source "drivers/pci/hotplug/Kconfig"
endmenu endmenu
menu "PA-RISC specific drivers" menu "PA-RISC specific drivers"
......
# #
# PCI configuration # PCI configuration
# #
source "drivers/pci/pcie/Kconfig"
config PCI_BUS_ADDR_T_64BIT config PCI_BUS_ADDR_T_64BIT
def_bool y if (ARCH_DMA_ADDR_T_64BIT || 64BIT) def_bool y if (ARCH_DMA_ADDR_T_64BIT || 64BIT)
depends on PCI depends on PCI
...@@ -118,4 +121,5 @@ config PCI_LABEL ...@@ -118,4 +121,5 @@ config PCI_LABEL
def_bool y if (DMI || ACPI) def_bool y if (DMI || ACPI)
select NLS select NLS
source "drivers/pci/hotplug/Kconfig"
source "drivers/pci/host/Kconfig" source "drivers/pci/host/Kconfig"
...@@ -174,38 +174,6 @@ struct pci_ops *pci_bus_set_ops(struct pci_bus *bus, struct pci_ops *ops) ...@@ -174,38 +174,6 @@ struct pci_ops *pci_bus_set_ops(struct pci_bus *bus, struct pci_ops *ops)
} }
EXPORT_SYMBOL(pci_bus_set_ops); EXPORT_SYMBOL(pci_bus_set_ops);
/**
* pci_read_vpd - Read one entry from Vital Product Data
* @dev: pci device struct
* @pos: offset in vpd space
* @count: number of bytes to read
* @buf: pointer to where to store result
*
*/
ssize_t pci_read_vpd(struct pci_dev *dev, loff_t pos, size_t count, void *buf)
{
if (!dev->vpd || !dev->vpd->ops)
return -ENODEV;
return dev->vpd->ops->read(dev, pos, count, buf);
}
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 write
* @buf: buffer containing write data
*
*/
ssize_t pci_write_vpd(struct pci_dev *dev, loff_t pos, size_t count, const void *buf)
{
if (!dev->vpd || !dev->vpd->ops)
return -ENODEV;
return dev->vpd->ops->write(dev, pos, count, buf);
}
EXPORT_SYMBOL(pci_write_vpd);
/* /*
* The following routines are to prevent the user from accessing PCI config * The following routines are to prevent the user from accessing PCI config
* space when it's unsafe to do so. Some devices require this during BIST and * space when it's unsafe to do so. Some devices require this during BIST and
...@@ -277,15 +245,91 @@ PCI_USER_WRITE_CONFIG(dword, u32) ...@@ -277,15 +245,91 @@ PCI_USER_WRITE_CONFIG(dword, u32)
/* VPD access through PCI 2.2+ VPD capability */ /* VPD access through PCI 2.2+ VPD capability */
#define PCI_VPD_PCI22_SIZE (PCI_VPD_ADDR_MASK + 1) /**
* pci_read_vpd - Read one entry from Vital Product Data
* @dev: pci device struct
* @pos: offset in vpd space
* @count: number of bytes to read
* @buf: pointer to where to store result
*/
ssize_t pci_read_vpd(struct pci_dev *dev, loff_t pos, size_t count, void *buf)
{
if (!dev->vpd || !dev->vpd->ops)
return -ENODEV;
return dev->vpd->ops->read(dev, pos, count, buf);
}
EXPORT_SYMBOL(pci_read_vpd);
struct pci_vpd_pci22 { /**
struct pci_vpd base; * pci_write_vpd - Write entry to Vital Product Data
struct mutex lock; * @dev: pci device struct
u16 flag; * @pos: offset in vpd space
bool busy; * @count: number of bytes to write
u8 cap; * @buf: buffer containing write data
}; */
ssize_t pci_write_vpd(struct pci_dev *dev, loff_t pos, size_t count, const void *buf)
{
if (!dev->vpd || !dev->vpd->ops)
return -ENODEV;
return dev->vpd->ops->write(dev, pos, count, buf);
}
EXPORT_SYMBOL(pci_write_vpd);
#define PCI_VPD_MAX_SIZE (PCI_VPD_ADDR_MASK + 1)
/**
* pci_vpd_size - determine actual size of Vital Product Data
* @dev: pci device struct
* @old_size: current assumed size, also maximum allowed size
*/
static size_t pci_vpd_size(struct pci_dev *dev, size_t old_size)
{
size_t off = 0;
unsigned char header[1+2]; /* 1 byte tag, 2 bytes length */
while (off < old_size &&
pci_read_vpd(dev, off, 1, header) == 1) {
unsigned char tag;
if (header[0] & PCI_VPD_LRDT) {
/* Large Resource Data Type Tag */
tag = pci_vpd_lrdt_tag(header);
/* Only read length from known tag items */
if ((tag == PCI_VPD_LTIN_ID_STRING) ||
(tag == PCI_VPD_LTIN_RO_DATA) ||
(tag == PCI_VPD_LTIN_RW_DATA)) {
if (pci_read_vpd(dev, off+1, 2,
&header[1]) != 2) {
dev_warn(&dev->dev,
"invalid large VPD tag %02x size at offset %zu",
tag, off + 1);
return 0;
}
off += PCI_VPD_LRDT_TAG_SIZE +
pci_vpd_lrdt_size(header);
}
} else {
/* Short Resource Data Type Tag */
off += PCI_VPD_SRDT_TAG_SIZE +
pci_vpd_srdt_size(header);
tag = pci_vpd_srdt_tag(header);
}
if (tag == PCI_VPD_STIN_END) /* End tag descriptor */
return off;
if ((tag != PCI_VPD_LTIN_ID_STRING) &&
(tag != PCI_VPD_LTIN_RO_DATA) &&
(tag != PCI_VPD_LTIN_RW_DATA)) {
dev_warn(&dev->dev,
"invalid %s VPD tag %02x at offset %zu",
(header[0] & PCI_VPD_LRDT) ? "large" : "short",
tag, off);
return 0;
}
}
return 0;
}
/* /*
* Wait for last operation to complete. * Wait for last operation to complete.
...@@ -295,55 +339,71 @@ struct pci_vpd_pci22 { ...@@ -295,55 +339,71 @@ struct pci_vpd_pci22 {
* *
* Returns 0 on success, negative values indicate error. * Returns 0 on success, negative values indicate error.
*/ */
static int pci_vpd_pci22_wait(struct pci_dev *dev) static int pci_vpd_wait(struct pci_dev *dev)
{ {
struct pci_vpd_pci22 *vpd = struct pci_vpd *vpd = dev->vpd;
container_of(dev->vpd, struct pci_vpd_pci22, base); unsigned long timeout = jiffies + msecs_to_jiffies(50);
unsigned long timeout = jiffies + HZ/20 + 2; unsigned long max_sleep = 16;
u16 status; u16 status;
int ret; int ret;
if (!vpd->busy) if (!vpd->busy)
return 0; return 0;
for (;;) { while (time_before(jiffies, timeout)) {
ret = pci_user_read_config_word(dev, vpd->cap + PCI_VPD_ADDR, ret = pci_user_read_config_word(dev, vpd->cap + PCI_VPD_ADDR,
&status); &status);
if (ret < 0) if (ret < 0)
return ret; return ret;
if ((status & PCI_VPD_ADDR_F) == vpd->flag) { if ((status & PCI_VPD_ADDR_F) == vpd->flag) {
vpd->busy = false; vpd->busy = 0;
return 0; return 0;
} }
if (time_after(jiffies, timeout)) {
dev_printk(KERN_DEBUG, &dev->dev, "vpd r/w failed. This is likely a firmware bug on this device. Contact the card vendor for a firmware update\n");
return -ETIMEDOUT;
}
if (fatal_signal_pending(current)) if (fatal_signal_pending(current))
return -EINTR; return -EINTR;
if (!cond_resched())
udelay(10); usleep_range(10, max_sleep);
if (max_sleep < 1024)
max_sleep *= 2;
} }
dev_warn(&dev->dev, "VPD access failed. This is likely a firmware bug on this device. Contact the card vendor for a firmware update\n");
return -ETIMEDOUT;
} }
static ssize_t pci_vpd_pci22_read(struct pci_dev *dev, loff_t pos, size_t count, static ssize_t pci_vpd_read(struct pci_dev *dev, loff_t pos, size_t count,
void *arg) void *arg)
{ {
struct pci_vpd_pci22 *vpd = struct pci_vpd *vpd = dev->vpd;
container_of(dev->vpd, struct pci_vpd_pci22, base);
int ret; int ret;
loff_t end = pos + count; loff_t end = pos + count;
u8 *buf = arg; u8 *buf = arg;
if (pos < 0 || pos > vpd->base.len || end > vpd->base.len) if (pos < 0)
return -EINVAL; return -EINVAL;
if (!vpd->valid) {
vpd->valid = 1;
vpd->len = pci_vpd_size(dev, vpd->len);
}
if (vpd->len == 0)
return -EIO;
if (pos > vpd->len)
return 0;
if (end > vpd->len) {
end = vpd->len;
count = end - pos;
}
if (mutex_lock_killable(&vpd->lock)) if (mutex_lock_killable(&vpd->lock))
return -EINTR; return -EINTR;
ret = pci_vpd_pci22_wait(dev); ret = pci_vpd_wait(dev);
if (ret < 0) if (ret < 0)
goto out; goto out;
...@@ -355,9 +415,9 @@ static ssize_t pci_vpd_pci22_read(struct pci_dev *dev, loff_t pos, size_t count, ...@@ -355,9 +415,9 @@ static ssize_t pci_vpd_pci22_read(struct pci_dev *dev, loff_t pos, size_t count,
pos & ~3); pos & ~3);
if (ret < 0) if (ret < 0)
break; break;
vpd->busy = true; vpd->busy = 1;
vpd->flag = PCI_VPD_ADDR_F; vpd->flag = PCI_VPD_ADDR_F;
ret = pci_vpd_pci22_wait(dev); ret = pci_vpd_wait(dev);
if (ret < 0) if (ret < 0)
break; break;
...@@ -380,22 +440,32 @@ static ssize_t pci_vpd_pci22_read(struct pci_dev *dev, loff_t pos, size_t count, ...@@ -380,22 +440,32 @@ static ssize_t pci_vpd_pci22_read(struct pci_dev *dev, loff_t pos, size_t count,
return ret ? ret : count; return ret ? ret : count;
} }
static ssize_t pci_vpd_pci22_write(struct pci_dev *dev, loff_t pos, size_t count, static ssize_t pci_vpd_write(struct pci_dev *dev, loff_t pos, size_t count,
const void *arg) const void *arg)
{ {
struct pci_vpd_pci22 *vpd = struct pci_vpd *vpd = dev->vpd;
container_of(dev->vpd, struct pci_vpd_pci22, base);
const u8 *buf = arg; const u8 *buf = arg;
loff_t end = pos + count; loff_t end = pos + count;
int ret = 0; int ret = 0;
if (pos < 0 || (pos & 3) || (count & 3) || end > vpd->base.len) if (pos < 0 || (pos & 3) || (count & 3))
return -EINVAL;
if (!vpd->valid) {
vpd->valid = 1;
vpd->len = pci_vpd_size(dev, vpd->len);
}
if (vpd->len == 0)
return -EIO;
if (end > vpd->len)
return -EINVAL; return -EINVAL;
if (mutex_lock_killable(&vpd->lock)) if (mutex_lock_killable(&vpd->lock))
return -EINTR; return -EINTR;
ret = pci_vpd_pci22_wait(dev); ret = pci_vpd_wait(dev);
if (ret < 0) if (ret < 0)
goto out; goto out;
...@@ -415,9 +485,9 @@ static ssize_t pci_vpd_pci22_write(struct pci_dev *dev, loff_t pos, size_t count ...@@ -415,9 +485,9 @@ static ssize_t pci_vpd_pci22_write(struct pci_dev *dev, loff_t pos, size_t count
if (ret < 0) if (ret < 0)
break; break;
vpd->busy = true; vpd->busy = 1;
vpd->flag = 0; vpd->flag = 0;
ret = pci_vpd_pci22_wait(dev); ret = pci_vpd_wait(dev);
if (ret < 0) if (ret < 0)
break; break;
...@@ -428,15 +498,9 @@ static ssize_t pci_vpd_pci22_write(struct pci_dev *dev, loff_t pos, size_t count ...@@ -428,15 +498,9 @@ static ssize_t pci_vpd_pci22_write(struct pci_dev *dev, loff_t pos, size_t count
return ret ? ret : count; return ret ? ret : count;
} }
static void pci_vpd_pci22_release(struct pci_dev *dev) static const struct pci_vpd_ops pci_vpd_ops = {
{ .read = pci_vpd_read,
kfree(container_of(dev->vpd, struct pci_vpd_pci22, base)); .write = pci_vpd_write,
}
static const struct pci_vpd_ops pci_vpd_pci22_ops = {
.read = pci_vpd_pci22_read,
.write = pci_vpd_pci22_write,
.release = pci_vpd_pci22_release,
}; };
static ssize_t pci_vpd_f0_read(struct pci_dev *dev, loff_t pos, size_t count, static ssize_t pci_vpd_f0_read(struct pci_dev *dev, loff_t pos, size_t count,
...@@ -472,12 +536,11 @@ static ssize_t pci_vpd_f0_write(struct pci_dev *dev, loff_t pos, size_t count, ...@@ -472,12 +536,11 @@ static ssize_t pci_vpd_f0_write(struct pci_dev *dev, loff_t pos, size_t count,
static const struct pci_vpd_ops pci_vpd_f0_ops = { static const struct pci_vpd_ops pci_vpd_f0_ops = {
.read = pci_vpd_f0_read, .read = pci_vpd_f0_read,
.write = pci_vpd_f0_write, .write = pci_vpd_f0_write,
.release = pci_vpd_pci22_release,
}; };
int pci_vpd_pci22_init(struct pci_dev *dev) int pci_vpd_init(struct pci_dev *dev)
{ {
struct pci_vpd_pci22 *vpd; struct pci_vpd *vpd;
u8 cap; u8 cap;
cap = pci_find_capability(dev, PCI_CAP_ID_VPD); cap = pci_find_capability(dev, PCI_CAP_ID_VPD);
...@@ -488,18 +551,24 @@ int pci_vpd_pci22_init(struct pci_dev *dev) ...@@ -488,18 +551,24 @@ int pci_vpd_pci22_init(struct pci_dev *dev)
if (!vpd) if (!vpd)
return -ENOMEM; return -ENOMEM;
vpd->base.len = PCI_VPD_PCI22_SIZE; vpd->len = PCI_VPD_MAX_SIZE;
if (dev->dev_flags & PCI_DEV_FLAGS_VPD_REF_F0) if (dev->dev_flags & PCI_DEV_FLAGS_VPD_REF_F0)
vpd->base.ops = &pci_vpd_f0_ops; vpd->ops = &pci_vpd_f0_ops;
else else
vpd->base.ops = &pci_vpd_pci22_ops; vpd->ops = &pci_vpd_ops;
mutex_init(&vpd->lock); mutex_init(&vpd->lock);
vpd->cap = cap; vpd->cap = cap;
vpd->busy = false; vpd->busy = 0;
dev->vpd = &vpd->base; vpd->valid = 0;
dev->vpd = vpd;
return 0; return 0;
} }
void pci_vpd_release(struct pci_dev *dev)
{
kfree(dev->vpd);
}
/** /**
* pci_cfg_access_lock - Lock PCI config reads/writes * pci_cfg_access_lock - Lock PCI config reads/writes
* @dev: pci device struct * @dev: pci device struct
......
...@@ -387,10 +387,6 @@ static int sriov_init(struct pci_dev *dev, int pos) ...@@ -387,10 +387,6 @@ static int sriov_init(struct pci_dev *dev, int pos)
struct resource *res; struct resource *res;
struct pci_dev *pdev; struct pci_dev *pdev;
if (pci_pcie_type(dev) != PCI_EXP_TYPE_RC_END &&
pci_pcie_type(dev) != PCI_EXP_TYPE_ENDPOINT)
return -ENODEV;
pci_read_config_word(dev, pos + PCI_SRIOV_CTRL, &ctrl); pci_read_config_word(dev, pos + PCI_SRIOV_CTRL, &ctrl);
if (ctrl & PCI_SRIOV_CTRL_VFE) { if (ctrl & PCI_SRIOV_CTRL_VFE) {
pci_write_config_word(dev, pos + PCI_SRIOV_CTRL, 0); pci_write_config_word(dev, pos + PCI_SRIOV_CTRL, 0);
......
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
* the instance number and string from the type 41 record and exports * the instance number and string from the type 41 record and exports
* it to sysfs. * it to sysfs.
* *
* Please see http://linux.dell.com/wiki/index.php/Oss/libnetdevname for more * Please see http://linux.dell.com/files/biosdevname/ for more
* information. * information.
*/ */
......
...@@ -769,10 +769,12 @@ static ssize_t read_vpd_attr(struct file *filp, struct kobject *kobj, ...@@ -769,10 +769,12 @@ static ssize_t read_vpd_attr(struct file *filp, struct kobject *kobj,
{ {
struct pci_dev *dev = to_pci_dev(kobj_to_dev(kobj)); struct pci_dev *dev = to_pci_dev(kobj_to_dev(kobj));
if (off > bin_attr->size) if (bin_attr->size > 0) {
count = 0; if (off > bin_attr->size)
else if (count > bin_attr->size - off) count = 0;
count = bin_attr->size - off; else if (count > bin_attr->size - off)
count = bin_attr->size - off;
}
return pci_read_vpd(dev, off, count, buf); return pci_read_vpd(dev, off, count, buf);
} }
...@@ -783,10 +785,12 @@ static ssize_t write_vpd_attr(struct file *filp, struct kobject *kobj, ...@@ -783,10 +785,12 @@ static ssize_t write_vpd_attr(struct file *filp, struct kobject *kobj,
{ {
struct pci_dev *dev = to_pci_dev(kobj_to_dev(kobj)); struct pci_dev *dev = to_pci_dev(kobj_to_dev(kobj));
if (off > bin_attr->size) if (bin_attr->size > 0) {
count = 0; if (off > bin_attr->size)
else if (count > bin_attr->size - off) count = 0;
count = bin_attr->size - off; else if (count > bin_attr->size - off)
count = bin_attr->size - off;
}
return pci_write_vpd(dev, off, count, buf); return pci_write_vpd(dev, off, count, buf);
} }
...@@ -1319,7 +1323,7 @@ static int pci_create_capabilities_sysfs(struct pci_dev *dev) ...@@ -1319,7 +1323,7 @@ static int pci_create_capabilities_sysfs(struct pci_dev *dev)
return -ENOMEM; return -ENOMEM;
sysfs_bin_attr_init(attr); sysfs_bin_attr_init(attr);
attr->size = dev->vpd->len; attr->size = 0;
attr->attr.name = "vpd"; attr->attr.name = "vpd";
attr->attr.mode = S_IRUSR | S_IWUSR; attr->attr.mode = S_IRUSR | S_IWUSR;
attr->read = read_vpd_attr; attr->read = read_vpd_attr;
......
...@@ -3385,18 +3385,6 @@ bool pci_check_and_unmask_intx(struct pci_dev *dev) ...@@ -3385,18 +3385,6 @@ bool pci_check_and_unmask_intx(struct pci_dev *dev)
} }
EXPORT_SYMBOL_GPL(pci_check_and_unmask_intx); EXPORT_SYMBOL_GPL(pci_check_and_unmask_intx);
int pci_set_dma_max_seg_size(struct pci_dev *dev, unsigned int size)
{
return dma_set_max_seg_size(&dev->dev, size);
}
EXPORT_SYMBOL(pci_set_dma_max_seg_size);
int pci_set_dma_seg_boundary(struct pci_dev *dev, unsigned long mask)
{
return dma_set_seg_boundary(&dev->dev, mask);
}
EXPORT_SYMBOL(pci_set_dma_seg_boundary);
/** /**
* pci_wait_for_pending_transaction - waits for pending transaction * pci_wait_for_pending_transaction - waits for pending transaction
* @dev: the PCI device to operate on * @dev: the PCI device to operate on
...@@ -3413,6 +3401,29 @@ int pci_wait_for_pending_transaction(struct pci_dev *dev) ...@@ -3413,6 +3401,29 @@ int pci_wait_for_pending_transaction(struct pci_dev *dev)
} }
EXPORT_SYMBOL(pci_wait_for_pending_transaction); EXPORT_SYMBOL(pci_wait_for_pending_transaction);
/*
* We should only need to wait 100ms after FLR, but some devices take longer.
* Wait for up to 1000ms for config space to return something other than -1.
* Intel IGD requires this when an LCD panel is attached. We read the 2nd
* dword because VFs don't implement the 1st dword.
*/
static void pci_flr_wait(struct pci_dev *dev)
{
int i = 0;
u32 id;
do {
msleep(100);
pci_read_config_dword(dev, PCI_COMMAND, &id);
} while (i++ < 10 && id == ~0);
if (id == ~0)
dev_warn(&dev->dev, "Failed to return from FLR\n");
else if (i > 1)
dev_info(&dev->dev, "Required additional %dms to return from FLR\n",
(i - 1) * 100);
}
static int pcie_flr(struct pci_dev *dev, int probe) static int pcie_flr(struct pci_dev *dev, int probe)
{ {
u32 cap; u32 cap;
...@@ -3428,7 +3439,7 @@ static int pcie_flr(struct pci_dev *dev, int probe) ...@@ -3428,7 +3439,7 @@ static int pcie_flr(struct pci_dev *dev, int probe)
dev_err(&dev->dev, "timed out waiting for pending transaction; performing function level reset anyway\n"); dev_err(&dev->dev, "timed out waiting for pending transaction; performing function level reset anyway\n");
pcie_capability_set_word(dev, PCI_EXP_DEVCTL, PCI_EXP_DEVCTL_BCR_FLR); pcie_capability_set_word(dev, PCI_EXP_DEVCTL, PCI_EXP_DEVCTL_BCR_FLR);
msleep(100); pci_flr_wait(dev);
return 0; return 0;
} }
...@@ -3458,7 +3469,7 @@ static int pci_af_flr(struct pci_dev *dev, int probe) ...@@ -3458,7 +3469,7 @@ static int pci_af_flr(struct pci_dev *dev, int probe)
dev_err(&dev->dev, "timed out waiting for pending transaction; performing AF function level reset anyway\n"); dev_err(&dev->dev, "timed out waiting for pending transaction; performing AF function level reset anyway\n");
pci_write_config_byte(dev, pos + PCI_AF_CTRL, PCI_AF_CTRL_FLR); pci_write_config_byte(dev, pos + PCI_AF_CTRL, PCI_AF_CTRL_FLR);
msleep(100); pci_flr_wait(dev);
return 0; return 0;
} }
......
...@@ -97,21 +97,21 @@ static inline bool pci_has_subordinate(struct pci_dev *pci_dev) ...@@ -97,21 +97,21 @@ static inline bool pci_has_subordinate(struct pci_dev *pci_dev)
struct pci_vpd_ops { struct pci_vpd_ops {
ssize_t (*read)(struct pci_dev *dev, loff_t pos, size_t count, void *buf); ssize_t (*read)(struct pci_dev *dev, loff_t pos, size_t count, void *buf);
ssize_t (*write)(struct pci_dev *dev, loff_t pos, size_t count, const void *buf); ssize_t (*write)(struct pci_dev *dev, loff_t pos, size_t count, const void *buf);
void (*release)(struct pci_dev *dev);
}; };
struct pci_vpd { struct pci_vpd {
unsigned int len;
const struct pci_vpd_ops *ops; const struct pci_vpd_ops *ops;
struct bin_attribute *attr; /* descriptor for sysfs VPD entry */ struct bin_attribute *attr; /* descriptor for sysfs VPD entry */
struct mutex lock;
unsigned int len;
u16 flag;
u8 cap;
u8 busy:1;
u8 valid:1;
}; };
int pci_vpd_pci22_init(struct pci_dev *dev); int pci_vpd_init(struct pci_dev *dev);
static inline void pci_vpd_release(struct pci_dev *dev) void pci_vpd_release(struct pci_dev *dev);
{
if (dev->vpd)
dev->vpd->ops->release(dev);
}
/* PCI /proc functions */ /* PCI /proc functions */
#ifdef CONFIG_PROC_FS #ifdef CONFIG_PROC_FS
......
...@@ -44,6 +44,7 @@ config PCIEASPM ...@@ -44,6 +44,7 @@ config PCIEASPM
/sys/module/pcie_aspm/parameters/policy /sys/module/pcie_aspm/parameters/policy
When in doubt, say Y. When in doubt, say Y.
config PCIEASPM_DEBUG config PCIEASPM_DEBUG
bool "Debug PCI Express ASPM" bool "Debug PCI Express ASPM"
depends on PCIEASPM depends on PCIEASPM
...@@ -58,20 +59,20 @@ choice ...@@ -58,20 +59,20 @@ choice
depends on PCIEASPM depends on PCIEASPM
config PCIEASPM_DEFAULT config PCIEASPM_DEFAULT
bool "BIOS default" bool "BIOS default"
depends on PCIEASPM depends on PCIEASPM
help help
Use the BIOS defaults for PCI Express ASPM. Use the BIOS defaults for PCI Express ASPM.
config PCIEASPM_POWERSAVE config PCIEASPM_POWERSAVE
bool "Powersave" bool "Powersave"
depends on PCIEASPM depends on PCIEASPM
help help
Enable PCI Express ASPM L0s and L1 where possible, even if the Enable PCI Express ASPM L0s and L1 where possible, even if the
BIOS did not. BIOS did not.
config PCIEASPM_PERFORMANCE config PCIEASPM_PERFORMANCE
bool "Performance" bool "Performance"
depends on PCIEASPM depends on PCIEASPM
help help
Disable PCI Express ASPM L0s and L1, even if the BIOS enabled them. Disable PCI Express ASPM L0s and L1, even if the BIOS enabled them.
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/uaccess.h> #include <linux/uaccess.h>
#include <linux/stddef.h> #include <linux/stddef.h>
#include <linux/device.h>
#include "aerdrv.h" #include "aerdrv.h"
/* Override the existing corrected and uncorrected error masks */ /* Override the existing corrected and uncorrected error masks */
...@@ -357,13 +358,15 @@ static int aer_inject(struct aer_error_inj *einj) ...@@ -357,13 +358,15 @@ static int aer_inject(struct aer_error_inj *einj)
return -ENODEV; return -ENODEV;
rpdev = pcie_find_root_port(dev); rpdev = pcie_find_root_port(dev);
if (!rpdev) { if (!rpdev) {
dev_err(&dev->dev, "aer_inject: Root port not found\n");
ret = -ENODEV; ret = -ENODEV;
goto out_put; goto out_put;
} }
pos_cap_err = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR); pos_cap_err = pci_find_ext_capability(dev, PCI_EXT_CAP_ID_ERR);
if (!pos_cap_err) { if (!pos_cap_err) {
ret = -EPERM; dev_err(&dev->dev, "aer_inject: Device doesn't support AER\n");
ret = -EPROTONOSUPPORT;
goto out_put; goto out_put;
} }
pci_read_config_dword(dev, pos_cap_err + PCI_ERR_UNCOR_SEVER, &sever); pci_read_config_dword(dev, pos_cap_err + PCI_ERR_UNCOR_SEVER, &sever);
...@@ -373,7 +376,9 @@ static int aer_inject(struct aer_error_inj *einj) ...@@ -373,7 +376,9 @@ static int aer_inject(struct aer_error_inj *einj)
rp_pos_cap_err = pci_find_ext_capability(rpdev, PCI_EXT_CAP_ID_ERR); rp_pos_cap_err = pci_find_ext_capability(rpdev, PCI_EXT_CAP_ID_ERR);
if (!rp_pos_cap_err) { if (!rp_pos_cap_err) {
ret = -EPERM; dev_err(&rpdev->dev,
"aer_inject: Root port doesn't support AER\n");
ret = -EPROTONOSUPPORT;
goto out_put; goto out_put;
} }
...@@ -420,14 +425,16 @@ static int aer_inject(struct aer_error_inj *einj) ...@@ -420,14 +425,16 @@ static int aer_inject(struct aer_error_inj *einj)
if (!aer_mask_override && einj->cor_status && if (!aer_mask_override && einj->cor_status &&
!(einj->cor_status & ~cor_mask)) { !(einj->cor_status & ~cor_mask)) {
ret = -EINVAL; ret = -EINVAL;
printk(KERN_WARNING "The correctable error(s) is masked by device\n"); dev_warn(&dev->dev,
"aer_inject: The correctable error(s) is masked by device\n");
spin_unlock_irqrestore(&inject_lock, flags); spin_unlock_irqrestore(&inject_lock, flags);
goto out_put; goto out_put;
} }
if (!aer_mask_override && einj->uncor_status && if (!aer_mask_override && einj->uncor_status &&
!(einj->uncor_status & ~uncor_mask)) { !(einj->uncor_status & ~uncor_mask)) {
ret = -EINVAL; ret = -EINVAL;
printk(KERN_WARNING "The uncorrectable error(s) is masked by device\n"); dev_warn(&dev->dev,
"aer_inject: The uncorrectable error(s) is masked by device\n");
spin_unlock_irqrestore(&inject_lock, flags); spin_unlock_irqrestore(&inject_lock, flags);
goto out_put; goto out_put;
} }
...@@ -480,13 +487,19 @@ static int aer_inject(struct aer_error_inj *einj) ...@@ -480,13 +487,19 @@ static int aer_inject(struct aer_error_inj *einj)
if (find_aer_device(rpdev, &edev)) { if (find_aer_device(rpdev, &edev)) {
if (!get_service_data(edev)) { if (!get_service_data(edev)) {
printk(KERN_WARNING "AER service is not initialized\n"); dev_warn(&edev->device,
ret = -EINVAL; "aer_inject: AER service is not initialized\n");
ret = -EPROTONOSUPPORT;
goto out_put; goto out_put;
} }
dev_info(&edev->device,
"aer_inject: Injecting errors %08x/%08x into device %s\n",
einj->cor_status, einj->uncor_status, pci_name(dev));
aer_irq(-1, edev); aer_irq(-1, edev);
} else } else {
ret = -EINVAL; dev_err(&rpdev->dev, "aer_inject: AER device not found\n");
ret = -ENODEV;
}
out_put: out_put:
kfree(err_alloc); kfree(err_alloc);
kfree(rperr_alloc); kfree(rperr_alloc);
......
...@@ -1607,7 +1607,7 @@ static void pci_init_capabilities(struct pci_dev *dev) ...@@ -1607,7 +1607,7 @@ static void pci_init_capabilities(struct pci_dev *dev)
pci_pm_init(dev); pci_pm_init(dev);
/* Vital Product Data */ /* Vital Product Data */
pci_vpd_pci22_init(dev); pci_vpd_init(dev);
/* Alternative Routing-ID Forwarding */ /* Alternative Routing-ID Forwarding */
pci_configure_ari(dev); pci_configure_ari(dev);
......
...@@ -438,7 +438,7 @@ static void quirk_amd_nl_class(struct pci_dev *pdev) ...@@ -438,7 +438,7 @@ static void quirk_amd_nl_class(struct pci_dev *pdev)
u32 class = pdev->class; u32 class = pdev->class;
/* Use "USB Device (not host controller)" class */ /* Use "USB Device (not host controller)" class */
pdev->class = (PCI_CLASS_SERIAL_USB << 8) | 0xfe; pdev->class = PCI_CLASS_SERIAL_USB_DEVICE;
dev_info(&pdev->dev, "PCI class overridden (%#08x -> %#08x) so dwc3 driver can claim this instead of xhci\n", dev_info(&pdev->dev, "PCI class overridden (%#08x -> %#08x) so dwc3 driver can claim this instead of xhci\n",
class, pdev->class); class, pdev->class);
} }
...@@ -2134,6 +2134,35 @@ static void quirk_via_cx700_pci_parking_caching(struct pci_dev *dev) ...@@ -2134,6 +2134,35 @@ static void quirk_via_cx700_pci_parking_caching(struct pci_dev *dev)
} }
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, 0x324e, quirk_via_cx700_pci_parking_caching); DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, 0x324e, quirk_via_cx700_pci_parking_caching);
/*
* If a device follows the VPD format spec, the PCI core will not read or
* write past the VPD End Tag. But some vendors do not follow the VPD
* format spec, so we can't tell how much data is safe to access. Devices
* may behave unpredictably if we access too much. Blacklist these devices
* so we don't touch VPD at all.
*/
static void quirk_blacklist_vpd(struct pci_dev *dev)
{
if (dev->vpd) {
dev->vpd->len = 0;
dev_warn(&dev->dev, FW_BUG "VPD access disabled\n");
}
}
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_LSI_LOGIC, 0x0060, quirk_blacklist_vpd);
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_LSI_LOGIC, 0x007c, quirk_blacklist_vpd);
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_LSI_LOGIC, 0x0413, quirk_blacklist_vpd);
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_LSI_LOGIC, 0x0078, quirk_blacklist_vpd);
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_LSI_LOGIC, 0x0079, quirk_blacklist_vpd);
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_LSI_LOGIC, 0x0073, quirk_blacklist_vpd);
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_LSI_LOGIC, 0x0071, quirk_blacklist_vpd);
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_LSI_LOGIC, 0x005b, quirk_blacklist_vpd);
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_LSI_LOGIC, 0x002f, quirk_blacklist_vpd);
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_LSI_LOGIC, 0x005d, quirk_blacklist_vpd);
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_LSI_LOGIC, 0x005f, quirk_blacklist_vpd);
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATTANSIC, PCI_ANY_ID,
quirk_blacklist_vpd);
/* /*
* For Broadcom 5706, 5708, 5709 rev. A nics, any read beyond the * For Broadcom 5706, 5708, 5709 rev. A nics, any read beyond the
* VPD end tag will hang the device. This problem was initially * VPD end tag will hang the device. This problem was initially
......
...@@ -3397,7 +3397,7 @@ static int udc_pci_probe( ...@@ -3397,7 +3397,7 @@ static int udc_pci_probe(
static const struct pci_device_id pci_id[] = { static const struct pci_device_id pci_id[] = {
{ {
PCI_DEVICE(PCI_VENDOR_ID_AMD, 0x2096), PCI_DEVICE(PCI_VENDOR_ID_AMD, 0x2096),
.class = (PCI_CLASS_SERIAL_USB << 8) | 0xfe, .class = PCI_CLASS_SERIAL_USB_DEVICE,
.class_mask = 0xffffffff, .class_mask = 0xffffffff,
}, },
{}, {},
......
...@@ -1846,7 +1846,7 @@ static int goku_probe(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -1846,7 +1846,7 @@ static int goku_probe(struct pci_dev *pdev, const struct pci_device_id *id)
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
static const struct pci_device_id pci_ids[] = { { static const struct pci_device_id pci_ids[] = { {
.class = ((PCI_CLASS_SERIAL_USB << 8) | 0xfe), .class = PCI_CLASS_SERIAL_USB_DEVICE,
.class_mask = ~0, .class_mask = ~0,
.vendor = 0x102f, /* Toshiba */ .vendor = 0x102f, /* Toshiba */
.device = 0x0107, /* this UDC */ .device = 0x0107, /* this UDC */
......
...@@ -3735,7 +3735,7 @@ static void net2280_shutdown(struct pci_dev *pdev) ...@@ -3735,7 +3735,7 @@ static void net2280_shutdown(struct pci_dev *pdev)
/*-------------------------------------------------------------------------*/ /*-------------------------------------------------------------------------*/
static const struct pci_device_id pci_ids[] = { { static const struct pci_device_id pci_ids[] = { {
.class = ((PCI_CLASS_SERIAL_USB << 8) | 0xfe), .class = PCI_CLASS_SERIAL_USB_DEVICE,
.class_mask = ~0, .class_mask = ~0,
.vendor = PCI_VENDOR_ID_PLX_LEGACY, .vendor = PCI_VENDOR_ID_PLX_LEGACY,
.device = 0x2280, .device = 0x2280,
...@@ -3743,7 +3743,7 @@ static const struct pci_device_id pci_ids[] = { { ...@@ -3743,7 +3743,7 @@ static const struct pci_device_id pci_ids[] = { {
.subdevice = PCI_ANY_ID, .subdevice = PCI_ANY_ID,
.driver_data = PLX_LEGACY | PLX_2280, .driver_data = PLX_LEGACY | PLX_2280,
}, { }, {
.class = ((PCI_CLASS_SERIAL_USB << 8) | 0xfe), .class = PCI_CLASS_SERIAL_USB_DEVICE,
.class_mask = ~0, .class_mask = ~0,
.vendor = PCI_VENDOR_ID_PLX_LEGACY, .vendor = PCI_VENDOR_ID_PLX_LEGACY,
.device = 0x2282, .device = 0x2282,
...@@ -3752,7 +3752,7 @@ static const struct pci_device_id pci_ids[] = { { ...@@ -3752,7 +3752,7 @@ static const struct pci_device_id pci_ids[] = { {
.driver_data = PLX_LEGACY, .driver_data = PLX_LEGACY,
}, },
{ {
.class = ((PCI_CLASS_SERIAL_USB << 8) | 0xfe), .class = PCI_CLASS_SERIAL_USB_DEVICE,
.class_mask = ~0, .class_mask = ~0,
.vendor = PCI_VENDOR_ID_PLX, .vendor = PCI_VENDOR_ID_PLX,
.device = 0x3380, .device = 0x3380,
...@@ -3761,7 +3761,7 @@ static const struct pci_device_id pci_ids[] = { { ...@@ -3761,7 +3761,7 @@ static const struct pci_device_id pci_ids[] = { {
.driver_data = PLX_SUPERSPEED, .driver_data = PLX_SUPERSPEED,
}, },
{ {
.class = ((PCI_CLASS_SERIAL_USB << 8) | 0xfe), .class = PCI_CLASS_SERIAL_USB_DEVICE,
.class_mask = ~0, .class_mask = ~0,
.vendor = PCI_VENDOR_ID_PLX, .vendor = PCI_VENDOR_ID_PLX,
.device = 0x3382, .device = 0x3382,
......
...@@ -3234,22 +3234,22 @@ static const struct pci_device_id pch_udc_pcidev_id[] = { ...@@ -3234,22 +3234,22 @@ static const struct pci_device_id pch_udc_pcidev_id[] = {
{ {
PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE(PCI_VENDOR_ID_INTEL,
PCI_DEVICE_ID_INTEL_QUARK_X1000_UDC), PCI_DEVICE_ID_INTEL_QUARK_X1000_UDC),
.class = (PCI_CLASS_SERIAL_USB << 8) | 0xfe, .class = PCI_CLASS_SERIAL_USB_DEVICE,
.class_mask = 0xffffffff, .class_mask = 0xffffffff,
}, },
{ {
PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_EG20T_UDC), PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_EG20T_UDC),
.class = (PCI_CLASS_SERIAL_USB << 8) | 0xfe, .class = PCI_CLASS_SERIAL_USB_DEVICE,
.class_mask = 0xffffffff, .class_mask = 0xffffffff,
}, },
{ {
PCI_DEVICE(PCI_VENDOR_ID_ROHM, PCI_DEVICE_ID_ML7213_IOH_UDC), PCI_DEVICE(PCI_VENDOR_ID_ROHM, PCI_DEVICE_ID_ML7213_IOH_UDC),
.class = (PCI_CLASS_SERIAL_USB << 8) | 0xfe, .class = PCI_CLASS_SERIAL_USB_DEVICE,
.class_mask = 0xffffffff, .class_mask = 0xffffffff,
}, },
{ {
PCI_DEVICE(PCI_VENDOR_ID_ROHM, PCI_DEVICE_ID_ML7831_IOH_UDC), PCI_DEVICE(PCI_VENDOR_ID_ROHM, PCI_DEVICE_ID_ML7831_IOH_UDC),
.class = (PCI_CLASS_SERIAL_USB << 8) | 0xfe, .class = PCI_CLASS_SERIAL_USB_DEVICE,
.class_mask = 0xffffffff, .class_mask = 0xffffffff,
}, },
{ 0 }, { 0 },
......
...@@ -467,7 +467,7 @@ static const struct dev_pm_ops virtio_pci_pm_ops = { ...@@ -467,7 +467,7 @@ static const struct dev_pm_ops virtio_pci_pm_ops = {
/* Qumranet donated their vendor ID for devices 0x1000 thru 0x10FF. */ /* Qumranet donated their vendor ID for devices 0x1000 thru 0x10FF. */
static const struct pci_device_id virtio_pci_id_table[] = { static const struct pci_device_id virtio_pci_id_table[] = {
{ PCI_DEVICE(0x1af4, PCI_ANY_ID) }, { PCI_DEVICE(PCI_VENDOR_ID_REDHAT_QUMRANET, PCI_ANY_ID) },
{ 0 } { 0 }
}; };
......
...@@ -6,6 +6,12 @@ ...@@ -6,6 +6,12 @@
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
/* This defines the direction arg to the DMA mapping routines. */
#define PCI_DMA_BIDIRECTIONAL 0
#define PCI_DMA_TODEVICE 1
#define PCI_DMA_FROMDEVICE 2
#define PCI_DMA_NONE 3
static inline void * static inline void *
pci_alloc_consistent(struct pci_dev *hwdev, size_t size, pci_alloc_consistent(struct pci_dev *hwdev, size_t size,
dma_addr_t *dma_handle) dma_addr_t *dma_handle)
...@@ -113,6 +119,29 @@ static inline int pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask) ...@@ -113,6 +119,29 @@ static inline int pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask)
{ {
return dma_set_coherent_mask(&dev->dev, mask); return dma_set_coherent_mask(&dev->dev, mask);
} }
static inline int pci_set_dma_max_seg_size(struct pci_dev *dev,
unsigned int size)
{
return dma_set_max_seg_size(&dev->dev, size);
}
static inline int pci_set_dma_seg_boundary(struct pci_dev *dev,
unsigned long mask)
{
return dma_set_seg_boundary(&dev->dev, mask);
}
#else
static inline int pci_set_dma_mask(struct pci_dev *dev, u64 mask)
{ return -EIO; }
static inline int pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask)
{ return -EIO; }
static inline int pci_set_dma_max_seg_size(struct pci_dev *dev,
unsigned int size)
{ return -EIO; }
static inline int pci_set_dma_seg_boundary(struct pci_dev *dev,
unsigned long mask)
{ return -EIO; }
#endif #endif
#endif #endif
...@@ -70,12 +70,6 @@ enum pci_mmap_state { ...@@ -70,12 +70,6 @@ enum pci_mmap_state {
pci_mmap_mem pci_mmap_mem
}; };
/* This defines the direction arg to the DMA mapping routines. */
#define PCI_DMA_BIDIRECTIONAL 0
#define PCI_DMA_TODEVICE 1
#define PCI_DMA_FROMDEVICE 2
#define PCI_DMA_NONE 3
/* /*
* For PCI devices, the region numbers are assigned this way: * For PCI devices, the region numbers are assigned this way:
*/ */
...@@ -1038,8 +1032,6 @@ void pci_intx(struct pci_dev *dev, int enable); ...@@ -1038,8 +1032,6 @@ void pci_intx(struct pci_dev *dev, int enable);
bool pci_intx_mask_supported(struct pci_dev *dev); bool pci_intx_mask_supported(struct pci_dev *dev);
bool pci_check_and_mask_intx(struct pci_dev *dev); bool pci_check_and_mask_intx(struct pci_dev *dev);
bool pci_check_and_unmask_intx(struct pci_dev *dev); bool pci_check_and_unmask_intx(struct pci_dev *dev);
int pci_set_dma_max_seg_size(struct pci_dev *dev, unsigned int size);
int pci_set_dma_seg_boundary(struct pci_dev *dev, unsigned long mask);
int pci_wait_for_pending(struct pci_dev *dev, int pos, u16 mask); int pci_wait_for_pending(struct pci_dev *dev, int pos, u16 mask);
int pci_wait_for_pending_transaction(struct pci_dev *dev); int pci_wait_for_pending_transaction(struct pci_dev *dev);
int pcix_get_max_mmrbc(struct pci_dev *dev); int pcix_get_max_mmrbc(struct pci_dev *dev);
...@@ -1255,6 +1247,7 @@ resource_size_t pcibios_iov_resource_alignment(struct pci_dev *dev, int resno); ...@@ -1255,6 +1247,7 @@ resource_size_t pcibios_iov_resource_alignment(struct pci_dev *dev, int resno);
int pci_set_vga_state(struct pci_dev *pdev, bool decode, int pci_set_vga_state(struct pci_dev *pdev, bool decode,
unsigned int command_bits, u32 flags); unsigned int command_bits, u32 flags);
/* kmem_cache style wrapper around pci_alloc_consistent() */ /* kmem_cache style wrapper around pci_alloc_consistent() */
#include <linux/pci-dma.h> #include <linux/pci-dma.h>
...@@ -1466,16 +1459,6 @@ static inline struct pci_dev *pci_get_class(unsigned int class, ...@@ -1466,16 +1459,6 @@ static inline struct pci_dev *pci_get_class(unsigned int class,
static inline void pci_set_master(struct pci_dev *dev) { } static inline void pci_set_master(struct pci_dev *dev) { }
static inline int pci_enable_device(struct pci_dev *dev) { return -EIO; } static inline int pci_enable_device(struct pci_dev *dev) { return -EIO; }
static inline void pci_disable_device(struct pci_dev *dev) { } static inline void pci_disable_device(struct pci_dev *dev) { }
static inline int pci_set_dma_mask(struct pci_dev *dev, u64 mask)
{ return -EIO; }
static inline int pci_set_consistent_dma_mask(struct pci_dev *dev, u64 mask)
{ return -EIO; }
static inline int pci_set_dma_max_seg_size(struct pci_dev *dev,
unsigned int size)
{ return -EIO; }
static inline int pci_set_dma_seg_boundary(struct pci_dev *dev,
unsigned long mask)
{ return -EIO; }
static inline int pci_assign_resource(struct pci_dev *dev, int i) static inline int pci_assign_resource(struct pci_dev *dev, int i)
{ return -EBUSY; } { return -EBUSY; }
static inline int __pci_register_driver(struct pci_driver *drv, static inline int __pci_register_driver(struct pci_driver *drv,
...@@ -1856,12 +1839,13 @@ bool pci_acs_path_enabled(struct pci_dev *start, ...@@ -1856,12 +1839,13 @@ bool pci_acs_path_enabled(struct pci_dev *start,
#define PCI_VPD_LRDT_RW_DATA PCI_VPD_LRDT_ID(PCI_VPD_LTIN_RW_DATA) #define PCI_VPD_LRDT_RW_DATA PCI_VPD_LRDT_ID(PCI_VPD_LTIN_RW_DATA)
/* Small Resource Data Type Tag Item Names */ /* Small Resource Data Type Tag Item Names */
#define PCI_VPD_STIN_END 0x78 /* End */ #define PCI_VPD_STIN_END 0x0f /* End */
#define PCI_VPD_SRDT_END PCI_VPD_STIN_END #define PCI_VPD_SRDT_END (PCI_VPD_STIN_END << 3)
#define PCI_VPD_SRDT_TIN_MASK 0x78 #define PCI_VPD_SRDT_TIN_MASK 0x78
#define PCI_VPD_SRDT_LEN_MASK 0x07 #define PCI_VPD_SRDT_LEN_MASK 0x07
#define PCI_VPD_LRDT_TIN_MASK 0x7f
#define PCI_VPD_LRDT_TAG_SIZE 3 #define PCI_VPD_LRDT_TAG_SIZE 3
#define PCI_VPD_SRDT_TAG_SIZE 1 #define PCI_VPD_SRDT_TAG_SIZE 1
...@@ -1884,6 +1868,17 @@ static inline u16 pci_vpd_lrdt_size(const u8 *lrdt) ...@@ -1884,6 +1868,17 @@ static inline u16 pci_vpd_lrdt_size(const u8 *lrdt)
return (u16)lrdt[1] + ((u16)lrdt[2] << 8); return (u16)lrdt[1] + ((u16)lrdt[2] << 8);
} }
/**
* pci_vpd_lrdt_tag - Extracts the Large Resource Data Type Tag Item
* @lrdt: Pointer to the beginning of the Large Resource Data Type tag
*
* Returns the extracted Large Resource Data Type Tag item.
*/
static inline u16 pci_vpd_lrdt_tag(const u8 *lrdt)
{
return (u16)(lrdt[0] & PCI_VPD_LRDT_TIN_MASK);
}
/** /**
* pci_vpd_srdt_size - Extracts the Small Resource Data Type length * pci_vpd_srdt_size - Extracts the Small Resource Data Type length
* @lrdt: Pointer to the beginning of the Small Resource Data Type tag * @lrdt: Pointer to the beginning of the Small Resource Data Type tag
...@@ -1895,6 +1890,17 @@ static inline u8 pci_vpd_srdt_size(const u8 *srdt) ...@@ -1895,6 +1890,17 @@ static inline u8 pci_vpd_srdt_size(const u8 *srdt)
return (*srdt) & PCI_VPD_SRDT_LEN_MASK; return (*srdt) & PCI_VPD_SRDT_LEN_MASK;
} }
/**
* pci_vpd_srdt_tag - Extracts the Small Resource Data Type Tag Item
* @lrdt: Pointer to the beginning of the Small Resource Data Type tag
*
* Returns the extracted Small Resource Data Type Tag Item.
*/
static inline u8 pci_vpd_srdt_tag(const u8 *srdt)
{
return ((*srdt) & PCI_VPD_SRDT_TIN_MASK) >> 3;
}
/** /**
* pci_vpd_info_field_size - Extracts the information field length * pci_vpd_info_field_size - Extracts the information field length
* @lrdt: Pointer to the beginning of an information field header * @lrdt: Pointer to the beginning of an information field header
...@@ -2011,4 +2017,8 @@ static inline bool pci_ari_enabled(struct pci_bus *bus) ...@@ -2011,4 +2017,8 @@ static inline bool pci_ari_enabled(struct pci_bus *bus)
{ {
return bus->self && bus->self->ari_enabled; return bus->self && bus->self->ari_enabled;
} }
/* provide the legacy pci_dma_* API */
#include <linux/pci-dma-compat.h>
#endif /* LINUX_PCI_H */ #endif /* LINUX_PCI_H */
...@@ -110,6 +110,7 @@ ...@@ -110,6 +110,7 @@
#define PCI_CLASS_SERIAL_USB_OHCI 0x0c0310 #define PCI_CLASS_SERIAL_USB_OHCI 0x0c0310
#define PCI_CLASS_SERIAL_USB_EHCI 0x0c0320 #define PCI_CLASS_SERIAL_USB_EHCI 0x0c0320
#define PCI_CLASS_SERIAL_USB_XHCI 0x0c0330 #define PCI_CLASS_SERIAL_USB_XHCI 0x0c0330
#define PCI_CLASS_SERIAL_USB_DEVICE 0x0c03fe
#define PCI_CLASS_SERIAL_FIBER 0x0c04 #define PCI_CLASS_SERIAL_FIBER 0x0c04
#define PCI_CLASS_SERIAL_SMBUS 0x0c05 #define PCI_CLASS_SERIAL_SMBUS 0x0c05
...@@ -2506,6 +2507,10 @@ ...@@ -2506,6 +2507,10 @@
#define PCI_VENDOR_ID_AZWAVE 0x1a3b #define PCI_VENDOR_ID_AZWAVE 0x1a3b
#define PCI_VENDOR_ID_REDHAT_QUMRANET 0x1af4
#define PCI_SUBVENDOR_ID_REDHAT_QUMRANET 0x1af4
#define PCI_SUBDEVICE_ID_QEMU 0x1100
#define PCI_VENDOR_ID_ASMEDIA 0x1b21 #define PCI_VENDOR_ID_ASMEDIA 0x1b21
#define PCI_VENDOR_ID_CIRCUITCO 0x1cc8 #define PCI_VENDOR_ID_CIRCUITCO 0x1cc8
......
...@@ -2980,8 +2980,8 @@ static int snd_intel8x0_inside_vm(struct pci_dev *pci) ...@@ -2980,8 +2980,8 @@ static int snd_intel8x0_inside_vm(struct pci_dev *pci)
goto fini; goto fini;
/* check for known (emulated) devices */ /* check for known (emulated) devices */
if (pci->subsystem_vendor == 0x1af4 && if (pci->subsystem_vendor == PCI_SUBVENDOR_ID_REDHAT_QUMRANET &&
pci->subsystem_device == 0x1100) { pci->subsystem_device == PCI_SUBDEVICE_ID_QEMU) {
/* KVM emulated sound, PCI SSID: 1af4:1100 */ /* KVM emulated sound, PCI SSID: 1af4:1100 */
msg = "enable KVM"; msg = "enable KVM";
} else if (pci->subsystem_vendor == 0x1ab8) { } else if (pci->subsystem_vendor == 0x1ab8) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册