Commit 0ca0ef10 authored by Bjorn Helgaas's avatar Bjorn Helgaas

Merge branch 'pci/resource'

  - Convert pci_resource_to_user() to a weak function to remove
    HAVE_ARCH_PCI_RESOURCE_TO_USER #defines (Denis Efremov)

  - Use PCI_SRIOV_NUM_BARS for idiomatic loop structure (Denis Efremov)

  - Fix Resizable BAR size suspend/restore for 1MB BARs (Sumit Saxena)

  - Correct "pci=resource_alignment" example in documentation (Alexey
    Kardashevskiy)

* pci/resource:
  PCI: Correct pci=resource_alignment parameter example
  PCI: Restore Resizable BAR size bits correctly for 1MB BARs
  PCI: Use PCI_SRIOV_NUM_BARS in loops instead of PCI_IOV_RESOURCE_END
  PCI: Convert pci_resource_to_user() to a weak function

# Conflicts:
#	drivers/pci/pci.c
parents 203104c8 3b1b1ce3
...@@ -3452,12 +3452,13 @@ ...@@ -3452,12 +3452,13 @@
specify the device is described above. specify the device is described above.
If <order of align> is not specified, If <order of align> is not specified,
PAGE_SIZE is used as alignment. PAGE_SIZE is used as alignment.
PCI-PCI bridge can be specified, if resource A PCI-PCI bridge can be specified if resource
windows need to be expanded. windows need to be expanded.
To specify the alignment for several To specify the alignment for several
instances of a device, the PCI vendor, instances of a device, the PCI vendor,
device, subvendor, and subdevice may be device, subvendor, and subdevice may be
specified, e.g., 4096@pci:8086:9c22:103c:198f specified, e.g., 12@pci:8086:9c22:103c:198f
for 4096-byte alignment.
ecrc= Enable/disable PCIe ECRC (transaction layer ecrc= Enable/disable PCIe ECRC (transaction layer
end-to-end CRC checking). end-to-end CRC checking).
bios: Use BIOS/firmware settings. This is the bios: Use BIOS/firmware settings. This is the
......
...@@ -66,8 +66,6 @@ extern pgprot_t pci_phys_mem_access_prot(struct file *file, ...@@ -66,8 +66,6 @@ extern pgprot_t pci_phys_mem_access_prot(struct file *file,
unsigned long size, unsigned long size,
pgprot_t prot); pgprot_t prot);
#define HAVE_ARCH_PCI_RESOURCE_TO_USER
/* This part of code was originally in xilinx-pci.h */ /* This part of code was originally in xilinx-pci.h */
#ifdef CONFIG_PCI_XILINX #ifdef CONFIG_PCI_XILINX
extern void __init xilinx_pci_init(void); extern void __init xilinx_pci_init(void);
......
...@@ -108,7 +108,6 @@ extern unsigned long PCIBIOS_MIN_MEM; ...@@ -108,7 +108,6 @@ extern unsigned long PCIBIOS_MIN_MEM;
#define HAVE_PCI_MMAP #define HAVE_PCI_MMAP
#define ARCH_GENERIC_PCI_MMAP_RESOURCE #define ARCH_GENERIC_PCI_MMAP_RESOURCE
#define HAVE_ARCH_PCI_RESOURCE_TO_USER
/* /*
* Dynamic DMA mapping stuff. * Dynamic DMA mapping stuff.
......
...@@ -112,8 +112,6 @@ extern pgprot_t pci_phys_mem_access_prot(struct file *file, ...@@ -112,8 +112,6 @@ extern pgprot_t pci_phys_mem_access_prot(struct file *file,
unsigned long size, unsigned long size,
pgprot_t prot); pgprot_t prot);
#define HAVE_ARCH_PCI_RESOURCE_TO_USER
extern resource_size_t pcibios_io_space_offset(struct pci_controller *hose); extern resource_size_t pcibios_io_space_offset(struct pci_controller *hose);
extern void pcibios_setup_bus_devices(struct pci_bus *bus); extern void pcibios_setup_bus_devices(struct pci_bus *bus);
extern void pcibios_setup_bus_self(struct pci_bus *bus); extern void pcibios_setup_bus_self(struct pci_bus *bus);
......
...@@ -38,8 +38,6 @@ static inline int pci_proc_domain(struct pci_bus *bus) ...@@ -38,8 +38,6 @@ static inline int pci_proc_domain(struct pci_bus *bus)
#define arch_can_pci_mmap_io() 1 #define arch_can_pci_mmap_io() 1
#define HAVE_ARCH_PCI_GET_UNMAPPED_AREA #define HAVE_ARCH_PCI_GET_UNMAPPED_AREA
#define get_pci_unmapped_area get_fb_unmapped_area #define get_pci_unmapped_area get_fb_unmapped_area
#define HAVE_ARCH_PCI_RESOURCE_TO_USER
#endif /* CONFIG_SPARC64 */ #endif /* CONFIG_SPARC64 */
#if defined(CONFIG_SPARC64) || defined(CONFIG_LEON_PCI) #if defined(CONFIG_SPARC64) || defined(CONFIG_LEON_PCI)
......
...@@ -724,8 +724,8 @@ static void sriov_restore_state(struct pci_dev *dev) ...@@ -724,8 +724,8 @@ static void sriov_restore_state(struct pci_dev *dev)
ctrl |= iov->ctrl & PCI_SRIOV_CTRL_ARI; ctrl |= iov->ctrl & PCI_SRIOV_CTRL_ARI;
pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, ctrl); pci_write_config_word(dev, iov->pos + PCI_SRIOV_CTRL, ctrl);
for (i = PCI_IOV_RESOURCES; i <= PCI_IOV_RESOURCE_END; i++) for (i = 0; i < PCI_SRIOV_NUM_BARS; i++)
pci_update_resource(dev, i); pci_update_resource(dev, i + PCI_IOV_RESOURCES);
pci_write_config_dword(dev, iov->pos + PCI_SRIOV_SYS_PGSIZE, iov->pgsz); pci_write_config_dword(dev, iov->pos + PCI_SRIOV_SYS_PGSIZE, iov->pgsz);
pci_iov_set_numvfs(dev, iov->num_VFs); pci_iov_set_numvfs(dev, iov->num_VFs);
......
...@@ -1438,7 +1438,7 @@ static void pci_restore_rebar_state(struct pci_dev *pdev) ...@@ -1438,7 +1438,7 @@ static void pci_restore_rebar_state(struct pci_dev *pdev)
pci_read_config_dword(pdev, pos + PCI_REBAR_CTRL, &ctrl); pci_read_config_dword(pdev, pos + PCI_REBAR_CTRL, &ctrl);
bar_idx = ctrl & PCI_REBAR_CTRL_BAR_IDX; bar_idx = ctrl & PCI_REBAR_CTRL_BAR_IDX;
res = pdev->resource + bar_idx; res = pdev->resource + bar_idx;
size = order_base_2((resource_size(res) >> 20) | 1) - 1; size = ilog2(resource_size(res)) - 20;
ctrl &= ~PCI_REBAR_CTRL_BAR_SIZE; ctrl &= ~PCI_REBAR_CTRL_BAR_SIZE;
ctrl |= size << PCI_REBAR_CTRL_BAR_SHIFT; ctrl |= size << PCI_REBAR_CTRL_BAR_SHIFT;
pci_write_config_dword(pdev, pos + PCI_REBAR_CTRL, ctrl); pci_write_config_dword(pdev, pos + PCI_REBAR_CTRL, ctrl);
...@@ -5932,6 +5932,18 @@ resource_size_t __weak pcibios_default_alignment(void) ...@@ -5932,6 +5932,18 @@ resource_size_t __weak pcibios_default_alignment(void)
return 0; return 0;
} }
/*
* Arches that don't want to expose struct resource to userland as-is in
* sysfs and /proc can implement their own pci_resource_to_user().
*/
void __weak pci_resource_to_user(const struct pci_dev *dev, int bar,
const struct resource *rsrc,
resource_size_t *start, resource_size_t *end)
{
*start = rsrc->start;
*end = rsrc->end;
}
static char *resource_alignment_param; static char *resource_alignment_param;
static DEFINE_SPINLOCK(resource_alignment_lock); static DEFINE_SPINLOCK(resource_alignment_lock);
......
...@@ -1662,8 +1662,8 @@ static int iov_resources_unassigned(struct pci_dev *dev, void *data) ...@@ -1662,8 +1662,8 @@ static int iov_resources_unassigned(struct pci_dev *dev, void *data)
int i; int i;
bool *unassigned = data; bool *unassigned = data;
for (i = PCI_IOV_RESOURCES; i <= PCI_IOV_RESOURCE_END; i++) { for (i = 0; i < PCI_SRIOV_NUM_BARS; i++) {
struct resource *r = &dev->resource[i]; struct resource *r = &dev->resource[i + PCI_IOV_RESOURCES];
struct pci_bus_region region; struct pci_bus_region region;
/* Not assigned or rejected by kernel? */ /* Not assigned or rejected by kernel? */
......
...@@ -1860,25 +1860,9 @@ static inline const char *pci_name(const struct pci_dev *pdev) ...@@ -1860,25 +1860,9 @@ static inline const char *pci_name(const struct pci_dev *pdev)
return dev_name(&pdev->dev); return dev_name(&pdev->dev);
} }
/*
* Some archs don't want to expose struct resource to userland as-is
* in sysfs and /proc
*/
#ifdef HAVE_ARCH_PCI_RESOURCE_TO_USER
void pci_resource_to_user(const struct pci_dev *dev, int bar, void pci_resource_to_user(const struct pci_dev *dev, int bar,
const struct resource *rsrc, const struct resource *rsrc,
resource_size_t *start, resource_size_t *end); resource_size_t *start, resource_size_t *end);
#else
static inline void pci_resource_to_user(const struct pci_dev *dev, int bar,
const struct resource *rsrc, resource_size_t *start,
resource_size_t *end)
{
*start = rsrc->start;
*end = rsrc->end;
}
#endif /* HAVE_ARCH_PCI_RESOURCE_TO_USER */
/* /*
* The world is not perfect and supplies us with broken PCI devices. * The world is not perfect and supplies us with broken PCI devices.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment