mirror of
https://github.com/torvalds/linux.git
synced 2024-09-20 15:03:04 +00:00
Merge branch 'pci/sysfs'
- Compile pci-sysfs.c only if CONFIG_SYSFS=y, which reduces kernel size by ~120KB when it's disabled (Lukas Wunner) - Remove obsolete pci_cleanup_rom() declaration (Lukas Wunner) - Rework pci_dev_resource_resize_attr(n) macros to call a function instead of duplicating most of the body, which saves about 2.5KB of text (Ilpo Järvinen) * pci/sysfs: PCI/sysfs: Demacrofy pci_dev_resource_resize_attr(n) functions PCI: Remove obsolete pci_cleanup_rom() declaration PCI/sysfs: Compile pci-sysfs.c only if CONFIG_SYSFS=y # Conflicts: # drivers/pci/Makefile
This commit is contained in:
commit
b8de187056
|
@ -4,7 +4,7 @@
|
|||
|
||||
obj-$(CONFIG_PCI) += access.o bus.o probe.o host-bridge.o \
|
||||
remove.o pci.o pci-driver.o search.o \
|
||||
pci-sysfs.o rom.o setup-res.o irq.o vpd.o \
|
||||
rom.o setup-res.o irq.o vpd.o \
|
||||
setup-bus.o vc.o mmap.o devres.o
|
||||
|
||||
obj-$(CONFIG_PCI) += msi/
|
||||
|
@ -12,7 +12,7 @@ obj-$(CONFIG_PCI) += pcie/
|
|||
|
||||
ifdef CONFIG_PCI
|
||||
obj-$(CONFIG_PROC_FS) += proc.o
|
||||
obj-$(CONFIG_SYSFS) += slot.o
|
||||
obj-$(CONFIG_SYSFS) += pci-sysfs.o slot.o
|
||||
obj-$(CONFIG_ACPI) += pci-acpi.o
|
||||
obj-$(CONFIG_GENERIC_PCI_IOMAP) += iomap.o
|
||||
endif
|
||||
|
|
|
@ -11,6 +11,8 @@
|
|||
#include <linux/mm.h>
|
||||
#include <linux/pci.h>
|
||||
|
||||
#include "pci.h"
|
||||
|
||||
#ifdef ARCH_GENERIC_PCI_MMAP_RESOURCE
|
||||
|
||||
static const struct vm_operations_struct pci_phys_vm_ops = {
|
||||
|
@ -50,3 +52,30 @@ int pci_mmap_resource_range(struct pci_dev *pdev, int bar,
|
|||
}
|
||||
|
||||
#endif
|
||||
|
||||
#if (defined(CONFIG_SYSFS) || defined(CONFIG_PROC_FS)) && \
|
||||
(defined(HAVE_PCI_MMAP) || defined(ARCH_GENERIC_PCI_MMAP_RESOURCE))
|
||||
|
||||
int pci_mmap_fits(struct pci_dev *pdev, int resno, struct vm_area_struct *vma,
|
||||
enum pci_mmap_api mmap_api)
|
||||
{
|
||||
resource_size_t pci_start = 0, pci_end;
|
||||
unsigned long nr, start, size;
|
||||
|
||||
if (pci_resource_len(pdev, resno) == 0)
|
||||
return 0;
|
||||
nr = vma_pages(vma);
|
||||
start = vma->vm_pgoff;
|
||||
size = ((pci_resource_len(pdev, resno) - 1) >> PAGE_SHIFT) + 1;
|
||||
if (mmap_api == PCI_MMAP_PROCFS) {
|
||||
pci_resource_to_user(pdev, resno, &pdev->resource[resno],
|
||||
&pci_start, &pci_end);
|
||||
pci_start >>= PAGE_SHIFT;
|
||||
}
|
||||
if (start >= pci_start && start < pci_start + size &&
|
||||
start + nr <= pci_start + size)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1022,29 +1022,6 @@ void pci_remove_legacy_files(struct pci_bus *b)
|
|||
#endif /* HAVE_PCI_LEGACY */
|
||||
|
||||
#if defined(HAVE_PCI_MMAP) || defined(ARCH_GENERIC_PCI_MMAP_RESOURCE)
|
||||
|
||||
int pci_mmap_fits(struct pci_dev *pdev, int resno, struct vm_area_struct *vma,
|
||||
enum pci_mmap_api mmap_api)
|
||||
{
|
||||
unsigned long nr, start, size;
|
||||
resource_size_t pci_start = 0, pci_end;
|
||||
|
||||
if (pci_resource_len(pdev, resno) == 0)
|
||||
return 0;
|
||||
nr = vma_pages(vma);
|
||||
start = vma->vm_pgoff;
|
||||
size = ((pci_resource_len(pdev, resno) - 1) >> PAGE_SHIFT) + 1;
|
||||
if (mmap_api == PCI_MMAP_PROCFS) {
|
||||
pci_resource_to_user(pdev, resno, &pdev->resource[resno],
|
||||
&pci_start, &pci_end);
|
||||
pci_start >>= PAGE_SHIFT;
|
||||
}
|
||||
if (start >= pci_start && start < pci_start + size &&
|
||||
start + nr <= pci_start + size)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* pci_mmap_resource - map a PCI resource into user memory space
|
||||
* @kobj: kobject for mapping
|
||||
|
@ -1410,79 +1387,89 @@ static const struct attribute_group pci_dev_reset_attr_group = {
|
|||
.is_visible = pci_dev_reset_attr_is_visible,
|
||||
};
|
||||
|
||||
static ssize_t __resource_resize_show(struct device *dev, int n, char *buf)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(dev);
|
||||
ssize_t ret;
|
||||
|
||||
pci_config_pm_runtime_get(pdev);
|
||||
|
||||
ret = sysfs_emit(buf, "%016llx\n",
|
||||
(u64)pci_rebar_get_possible_sizes(pdev, n));
|
||||
|
||||
pci_config_pm_runtime_put(pdev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ssize_t __resource_resize_store(struct device *dev, int n,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(dev);
|
||||
unsigned long size, flags;
|
||||
int ret, i;
|
||||
u16 cmd;
|
||||
|
||||
if (kstrtoul(buf, 0, &size) < 0)
|
||||
return -EINVAL;
|
||||
|
||||
device_lock(dev);
|
||||
if (dev->driver) {
|
||||
ret = -EBUSY;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
pci_config_pm_runtime_get(pdev);
|
||||
|
||||
if ((pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA) {
|
||||
ret = aperture_remove_conflicting_pci_devices(pdev,
|
||||
"resourceN_resize");
|
||||
if (ret)
|
||||
goto pm_put;
|
||||
}
|
||||
|
||||
pci_read_config_word(pdev, PCI_COMMAND, &cmd);
|
||||
pci_write_config_word(pdev, PCI_COMMAND,
|
||||
cmd & ~PCI_COMMAND_MEMORY);
|
||||
|
||||
flags = pci_resource_flags(pdev, n);
|
||||
|
||||
pci_remove_resource_files(pdev);
|
||||
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
|
||||
if (pci_resource_len(pdev, i) &&
|
||||
pci_resource_flags(pdev, i) == flags)
|
||||
pci_release_resource(pdev, i);
|
||||
}
|
||||
|
||||
ret = pci_resize_resource(pdev, n, size);
|
||||
|
||||
pci_assign_unassigned_bus_resources(pdev->bus);
|
||||
|
||||
if (pci_create_resource_files(pdev))
|
||||
pci_warn(pdev, "Failed to recreate resource files after BAR resizing\n");
|
||||
|
||||
pci_write_config_word(pdev, PCI_COMMAND, cmd);
|
||||
pm_put:
|
||||
pci_config_pm_runtime_put(pdev);
|
||||
unlock:
|
||||
device_unlock(dev);
|
||||
|
||||
return ret ? ret : count;
|
||||
}
|
||||
|
||||
#define pci_dev_resource_resize_attr(n) \
|
||||
static ssize_t resource##n##_resize_show(struct device *dev, \
|
||||
struct device_attribute *attr, \
|
||||
char * buf) \
|
||||
char *buf) \
|
||||
{ \
|
||||
struct pci_dev *pdev = to_pci_dev(dev); \
|
||||
ssize_t ret; \
|
||||
\
|
||||
pci_config_pm_runtime_get(pdev); \
|
||||
\
|
||||
ret = sysfs_emit(buf, "%016llx\n", \
|
||||
(u64)pci_rebar_get_possible_sizes(pdev, n)); \
|
||||
\
|
||||
pci_config_pm_runtime_put(pdev); \
|
||||
\
|
||||
return ret; \
|
||||
return __resource_resize_show(dev, n, buf); \
|
||||
} \
|
||||
\
|
||||
static ssize_t resource##n##_resize_store(struct device *dev, \
|
||||
struct device_attribute *attr,\
|
||||
const char *buf, size_t count)\
|
||||
{ \
|
||||
struct pci_dev *pdev = to_pci_dev(dev); \
|
||||
unsigned long size, flags; \
|
||||
int ret, i; \
|
||||
u16 cmd; \
|
||||
\
|
||||
if (kstrtoul(buf, 0, &size) < 0) \
|
||||
return -EINVAL; \
|
||||
\
|
||||
device_lock(dev); \
|
||||
if (dev->driver) { \
|
||||
ret = -EBUSY; \
|
||||
goto unlock; \
|
||||
} \
|
||||
\
|
||||
pci_config_pm_runtime_get(pdev); \
|
||||
\
|
||||
if ((pdev->class >> 8) == PCI_CLASS_DISPLAY_VGA) { \
|
||||
ret = aperture_remove_conflicting_pci_devices(pdev, \
|
||||
"resourceN_resize"); \
|
||||
if (ret) \
|
||||
goto pm_put; \
|
||||
} \
|
||||
\
|
||||
pci_read_config_word(pdev, PCI_COMMAND, &cmd); \
|
||||
pci_write_config_word(pdev, PCI_COMMAND, \
|
||||
cmd & ~PCI_COMMAND_MEMORY); \
|
||||
\
|
||||
flags = pci_resource_flags(pdev, n); \
|
||||
\
|
||||
pci_remove_resource_files(pdev); \
|
||||
\
|
||||
for (i = 0; i < PCI_STD_NUM_BARS; i++) { \
|
||||
if (pci_resource_len(pdev, i) && \
|
||||
pci_resource_flags(pdev, i) == flags) \
|
||||
pci_release_resource(pdev, i); \
|
||||
} \
|
||||
\
|
||||
ret = pci_resize_resource(pdev, n, size); \
|
||||
\
|
||||
pci_assign_unassigned_bus_resources(pdev->bus); \
|
||||
\
|
||||
if (pci_create_resource_files(pdev)) \
|
||||
pci_warn(pdev, "Failed to recreate resource files after BAR resizing\n");\
|
||||
\
|
||||
pci_write_config_word(pdev, PCI_COMMAND, cmd); \
|
||||
pm_put: \
|
||||
pci_config_pm_runtime_put(pdev); \
|
||||
unlock: \
|
||||
device_unlock(dev); \
|
||||
\
|
||||
return ret ? ret : count; \
|
||||
return __resource_resize_store(dev, n, buf, count); \
|
||||
} \
|
||||
static DEVICE_ATTR_RW(resource##n##_resize)
|
||||
|
||||
|
@ -1660,7 +1647,7 @@ static const struct attribute_group pcie_dev_attr_group = {
|
|||
.is_visible = pcie_dev_attrs_are_visible,
|
||||
};
|
||||
|
||||
static const struct attribute_group *pci_dev_attr_groups[] = {
|
||||
const struct attribute_group *pci_dev_attr_groups[] = {
|
||||
&pci_dev_attr_group,
|
||||
&pci_dev_hp_attr_group,
|
||||
#ifdef CONFIG_PCI_IOV
|
||||
|
@ -1677,7 +1664,3 @@ static const struct attribute_group *pci_dev_attr_groups[] = {
|
|||
#endif
|
||||
NULL,
|
||||
};
|
||||
|
||||
const struct device_type pci_dev_type = {
|
||||
.groups = pci_dev_attr_groups,
|
||||
};
|
||||
|
|
|
@ -31,9 +31,6 @@ bool pcie_cap_has_rtctl(const struct pci_dev *dev);
|
|||
|
||||
/* Functions internal to the PCI core code */
|
||||
|
||||
int pci_create_sysfs_dev_files(struct pci_dev *pdev);
|
||||
void pci_remove_sysfs_dev_files(struct pci_dev *pdev);
|
||||
void pci_cleanup_rom(struct pci_dev *dev);
|
||||
#ifdef CONFIG_DMI
|
||||
extern const struct attribute_group pci_dev_smbios_attr_group;
|
||||
#endif
|
||||
|
@ -151,7 +148,7 @@ static inline int pci_proc_detach_bus(struct pci_bus *bus) { return 0; }
|
|||
/* Functions for PCI Hotplug drivers to use */
|
||||
int pci_hp_add_bridge(struct pci_dev *dev);
|
||||
|
||||
#ifdef HAVE_PCI_LEGACY
|
||||
#if defined(CONFIG_SYSFS) && defined(HAVE_PCI_LEGACY)
|
||||
void pci_create_legacy_files(struct pci_bus *bus);
|
||||
void pci_remove_legacy_files(struct pci_bus *bus);
|
||||
#else
|
||||
|
@ -184,10 +181,22 @@ static inline int pci_no_d1d2(struct pci_dev *dev)
|
|||
return (dev->no_d1d2 || parent_dstates);
|
||||
|
||||
}
|
||||
|
||||
#ifdef CONFIG_SYSFS
|
||||
int pci_create_sysfs_dev_files(struct pci_dev *pdev);
|
||||
void pci_remove_sysfs_dev_files(struct pci_dev *pdev);
|
||||
extern const struct attribute_group *pci_dev_groups[];
|
||||
extern const struct attribute_group *pci_dev_attr_groups[];
|
||||
extern const struct attribute_group *pcibus_groups[];
|
||||
extern const struct device_type pci_dev_type;
|
||||
extern const struct attribute_group *pci_bus_groups[];
|
||||
#else
|
||||
static inline int pci_create_sysfs_dev_files(struct pci_dev *pdev) { return 0; }
|
||||
static inline void pci_remove_sysfs_dev_files(struct pci_dev *pdev) { }
|
||||
#define pci_dev_groups NULL
|
||||
#define pci_dev_attr_groups NULL
|
||||
#define pcibus_groups NULL
|
||||
#define pci_bus_groups NULL
|
||||
#endif
|
||||
|
||||
extern unsigned long pci_hotplug_io_size;
|
||||
extern unsigned long pci_hotplug_mmio_size;
|
||||
|
|
|
@ -2297,6 +2297,10 @@ static void pci_release_dev(struct device *dev)
|
|||
kfree(pci_dev);
|
||||
}
|
||||
|
||||
static const struct device_type pci_dev_type = {
|
||||
.groups = pci_dev_attr_groups,
|
||||
};
|
||||
|
||||
struct pci_dev *pci_alloc_dev(struct pci_bus *bus)
|
||||
{
|
||||
struct pci_dev *dev;
|
||||
|
|
Loading…
Reference in New Issue
Block a user