Merge tag 'driver-core-3.19-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git...
[firefly-linux-kernel-4.4.55.git] / drivers / pci / pci-sysfs.c
index 2c6643fdc0cf27bcb9b726bb6c9febf3ca137dc7..aa012fb3834b48dbc0001565d453b2dc267009c1 100644 (file)
@@ -77,11 +77,10 @@ static ssize_t broken_parity_status_store(struct device *dev,
 }
 static DEVICE_ATTR_RW(broken_parity_status);
 
-static ssize_t pci_dev_show_local_cpu(struct device *dev, int type,
+static ssize_t pci_dev_show_local_cpu(struct device *dev, bool list,
                                      struct device_attribute *attr, char *buf)
 {
        const struct cpumask *mask;
-       int len;
 
 #ifdef CONFIG_NUMA
        mask = (dev_to_node(dev) == -1) ? cpu_online_mask :
@@ -89,59 +88,41 @@ static ssize_t pci_dev_show_local_cpu(struct device *dev, int type,
 #else
        mask = cpumask_of_pcibus(to_pci_dev(dev)->bus);
 #endif
-       len = type ?
-               cpumask_scnprintf(buf, PAGE_SIZE-2, mask) :
-               cpulist_scnprintf(buf, PAGE_SIZE-2, mask);
-
-       buf[len++] = '\n';
-       buf[len] = '\0';
-       return len;
+       return cpumap_print_to_pagebuf(list, buf, mask);
 }
 
 static ssize_t local_cpus_show(struct device *dev,
                               struct device_attribute *attr, char *buf)
 {
-       return pci_dev_show_local_cpu(dev, 1, attr, buf);
+       return pci_dev_show_local_cpu(dev, false, attr, buf);
 }
 static DEVICE_ATTR_RO(local_cpus);
 
 static ssize_t local_cpulist_show(struct device *dev,
                                  struct device_attribute *attr, char *buf)
 {
-       return pci_dev_show_local_cpu(dev, 0, attr, buf);
+       return pci_dev_show_local_cpu(dev, true, attr, buf);
 }
 static DEVICE_ATTR_RO(local_cpulist);
 
 /*
  * PCI Bus Class Devices
  */
-static ssize_t pci_bus_show_cpuaffinity(struct device *dev, int type,
-                                       struct device_attribute *attr,
-                                       char *buf)
-{
-       int ret;
-       const struct cpumask *cpumask;
-
-       cpumask = cpumask_of_pcibus(to_pci_bus(dev));
-       ret = type ?
-               cpulist_scnprintf(buf, PAGE_SIZE-2, cpumask) :
-               cpumask_scnprintf(buf, PAGE_SIZE-2, cpumask);
-       buf[ret++] = '\n';
-       buf[ret] = '\0';
-       return ret;
-}
-
 static ssize_t cpuaffinity_show(struct device *dev,
                                struct device_attribute *attr, char *buf)
 {
-       return pci_bus_show_cpuaffinity(dev, 0, attr, buf);
+       const struct cpumask *cpumask = cpumask_of_pcibus(to_pci_bus(dev));
+
+       return cpumap_print_to_pagebuf(false, buf, cpumask);
 }
 static DEVICE_ATTR_RO(cpuaffinity);
 
 static ssize_t cpulistaffinity_show(struct device *dev,
                                    struct device_attribute *attr, char *buf)
 {
-       return pci_bus_show_cpuaffinity(dev, 1, attr, buf);
+       const struct cpumask *cpumask = cpumask_of_pcibus(to_pci_bus(dev));
+
+       return cpumap_print_to_pagebuf(true, buf, cpumask);
 }
 static DEVICE_ATTR_RO(cpulistaffinity);
 
@@ -221,12 +202,37 @@ static ssize_t enable_show(struct device *dev, struct device_attribute *attr,
 static DEVICE_ATTR_RW(enable);
 
 #ifdef CONFIG_NUMA
+static ssize_t numa_node_store(struct device *dev,
+                              struct device_attribute *attr, const char *buf,
+                              size_t count)
+{
+       struct pci_dev *pdev = to_pci_dev(dev);
+       int node, ret;
+
+       if (!capable(CAP_SYS_ADMIN))
+               return -EPERM;
+
+       ret = kstrtoint(buf, 0, &node);
+       if (ret)
+               return ret;
+
+       if (!node_online(node))
+               return -EINVAL;
+
+       add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK);
+       dev_alert(&pdev->dev, FW_BUG "Overriding NUMA node to %d.  Contact your vendor for updates.",
+                 node);
+
+       dev->numa_node = node;
+       return count;
+}
+
 static ssize_t numa_node_show(struct device *dev, struct device_attribute *attr,
                              char *buf)
 {
        return sprintf(buf, "%d\n", dev->numa_node);
 }
-static DEVICE_ATTR_RO(numa_node);
+static DEVICE_ATTR_RW(numa_node);
 #endif
 
 static ssize_t dma_mask_bits_show(struct device *dev,
@@ -385,7 +391,7 @@ static ssize_t dev_bus_rescan_store(struct device *dev,
 }
 static DEVICE_ATTR(rescan, (S_IWUSR|S_IWGRP), NULL, dev_bus_rescan_store);
 
-#if defined(CONFIG_PM_RUNTIME) && defined(CONFIG_ACPI)
+#if defined(CONFIG_PM) && defined(CONFIG_ACPI)
 static ssize_t d3cold_allowed_store(struct device *dev,
                                    struct device_attribute *attr,
                                    const char *buf, size_t count)
@@ -566,7 +572,7 @@ static struct attribute *pci_dev_attrs[] = {
        &dev_attr_enable.attr,
        &dev_attr_broken_parity_status.attr,
        &dev_attr_msi_bus.attr,
-#if defined(CONFIG_PM_RUNTIME) && defined(CONFIG_ACPI)
+#if defined(CONFIG_PM) && defined(CONFIG_ACPI)
        &dev_attr_d3cold_allowed.attr,
 #endif
 #ifdef CONFIG_OF