From: "Krzysztof Wilczyński" <kw@linux.com>
To: Bjorn Helgaas <bhelgaas@google.com>
Cc: "Pali Rohár" <pali@kernel.org>,
"Oliver O'Halloran" <oohall@gmail.com>,
"Greg Kroah-Hartman" <gregkh@linuxfoundation.org>,
"Daniel Vetter" <daniel.vetter@ffwll.ch>,
"Joe Perches" <joe@perches.com>,
"Dan Williams" <dan.j.williams@intel.com>,
"Mauro Carvalho Chehab" <mchehab+huawei@kernel.org>,
"David Sterba" <dsterba@suse.com>,
linux-pci@vger.kernel.org
Subject: [PATCH 11/20] PCI: Rearrange attributes from the pci_dev_group
Date: Fri, 16 Apr 2021 20:58:47 +0000 [thread overview]
Message-ID: <20210416205856.3234481-12-kw@linux.com> (raw)
In-Reply-To: <20210416205856.3234481-1-kw@linux.com>
When new sysfs objects were added to the PCI device over time, the code
that implemented new attributes has been added in many different places
in the pci-sysfs.c file. This makes it hard to read and also hard to
find relevant code.
Thus, collect all the attributes that are part of the "pci_dev_group"
attribute group together and move to the top of the file sorting
everything attribute in the order of use.
No functional change intended.
Suggested-by: Bjorn Helgaas <bhelgaas@google.com>
Signed-off-by: Krzysztof Wilczyński <kw@linux.com>
---
drivers/pci/pci-sysfs.c | 695 +++++++++++++++++++++-------------------
1 file changed, 369 insertions(+), 326 deletions(-)
diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c
index 96302b63f6c5..5f83ff087f2c 100644
--- a/drivers/pci/pci-sysfs.c
+++ b/drivers/pci/pci-sysfs.c
@@ -30,50 +30,6 @@
static int sysfs_initialized; /* = 0 */
-/* show configuration fields */
-#define pci_config_attr(field, format_string) \
-static ssize_t \
-field##_show(struct device *dev, struct device_attribute *attr, char *buf) \
-{ \
- struct pci_dev *pdev = to_pci_dev(dev); \
- \
- return sysfs_emit(buf, format_string, pdev->field); \
-} \
-static DEVICE_ATTR_RO(field)
-
-pci_config_attr(vendor, "0x%04x\n");
-pci_config_attr(device, "0x%04x\n");
-pci_config_attr(subsystem_vendor, "0x%04x\n");
-pci_config_attr(subsystem_device, "0x%04x\n");
-pci_config_attr(revision, "0x%02x\n");
-pci_config_attr(class, "0x%06x\n");
-pci_config_attr(irq, "%u\n");
-
-static ssize_t broken_parity_status_show(struct device *dev,
- struct device_attribute *attr,
- char *buf)
-{
- struct pci_dev *pdev = to_pci_dev(dev);
-
- return sysfs_emit(buf, "%u\n", pdev->broken_parity_status);
-}
-
-static ssize_t broken_parity_status_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t count)
-{
- bool broken;
- struct pci_dev *pdev = to_pci_dev(dev);
-
- if (kstrtobool(buf, &broken) < 0)
- return -EINVAL;
-
- pdev->broken_parity_status = !!broken;
-
- return count;
-}
-static DEVICE_ATTR_RW(broken_parity_status);
-
static ssize_t pci_dev_show_local_cpu(struct device *dev, bool list,
struct device_attribute *attr, char *buf)
{
@@ -93,43 +49,6 @@ static ssize_t pci_dev_show_local_cpu(struct device *dev, bool list,
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, 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, true, attr, buf);
-}
-static DEVICE_ATTR_RO(local_cpulist);
-
-/*
- * PCI Bus Class Devices
- */
-static ssize_t cpuaffinity_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct pci_bus *bus = to_pci_bus(dev);
- const struct cpumask *cpumask = cpumask_of_pcibus(bus);
-
- 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)
-{
- struct pci_bus *bus = to_pci_bus(dev);
- const struct cpumask *cpumask = cpumask_of_pcibus(bus);
-
- return cpumap_print_to_pagebuf(true, buf, cpumask);
-}
-static DEVICE_ATTR_RO(cpulistaffinity);
-
static ssize_t power_state_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
@@ -139,7 +58,6 @@ static ssize_t power_state_show(struct device *dev,
}
static DEVICE_ATTR_RO(power_state);
-/* show resources */
static ssize_t resource_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
@@ -166,89 +84,82 @@ static ssize_t resource_show(struct device *dev,
}
static DEVICE_ATTR_RO(resource);
-static ssize_t max_link_speed_show(struct device *dev,
- struct device_attribute *attr, char *buf)
+static ssize_t vendor_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
{
struct pci_dev *pdev = to_pci_dev(dev);
- return sysfs_emit(buf, "%s\n",
- pci_speed_string(pcie_get_speed_cap(pdev)));
+ return sysfs_emit(buf, "0x%04x\n", pdev->vendor);
}
-static DEVICE_ATTR_RO(max_link_speed);
+static DEVICE_ATTR_RO(vendor);
-static ssize_t max_link_width_show(struct device *dev,
- struct device_attribute *attr, char *buf)
+static ssize_t device_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
{
struct pci_dev *pdev = to_pci_dev(dev);
- return sysfs_emit(buf, "%u\n", pcie_get_width_cap(pdev));
+ return sysfs_emit(buf, "0x%04x\n", pdev->device);
}
-static DEVICE_ATTR_RO(max_link_width);
+static DEVICE_ATTR_RO(device);
-static ssize_t current_link_speed_show(struct device *dev,
- struct device_attribute *attr, char *buf)
+static ssize_t subsystem_vendor_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
{
struct pci_dev *pdev = to_pci_dev(dev);
- enum pci_bus_speed speed;
-
- pcie_bandwidth_available(pdev, NULL, &speed, NULL);
- return sysfs_emit(buf, "%s\n", pci_speed_string(speed));
+ return sysfs_emit(buf, "0x%04x\n", pdev->subsystem_vendor);
}
-static DEVICE_ATTR_RO(current_link_speed);
+static DEVICE_ATTR_RO(subsystem_vendor);
-static ssize_t current_link_width_show(struct device *dev,
- struct device_attribute *attr, char *buf)
+static ssize_t subsystem_device_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
{
struct pci_dev *pdev = to_pci_dev(dev);
- enum pcie_link_width width;
- pcie_bandwidth_available(pdev, NULL, NULL, &width);
-
- return sysfs_emit(buf, "%u\n", width);
+ return sysfs_emit(buf, "0x%04x\n", pdev->subsystem_device);
}
-static DEVICE_ATTR_RO(current_link_width);
+static DEVICE_ATTR_RO(subsystem_device);
-static ssize_t secondary_bus_number_show(struct device *dev,
- struct device_attribute *attr,
- char *buf)
+static ssize_t revision_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
{
struct pci_dev *pdev = to_pci_dev(dev);
- u8 sec_bus;
- int err;
-
- err = pci_read_config_byte(pdev, PCI_SECONDARY_BUS, &sec_bus);
- if (err)
- return -EINVAL;
- return sysfs_emit(buf, "%u\n", sec_bus);
+ return sysfs_emit(buf, "0x%02x\n", pdev->revision);
}
-static DEVICE_ATTR_RO(secondary_bus_number);
+static DEVICE_ATTR_RO(revision);
-static ssize_t subordinate_bus_number_show(struct device *dev,
- struct device_attribute *attr,
- char *buf)
+static ssize_t class_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
{
struct pci_dev *pdev = to_pci_dev(dev);
- u8 sub_bus;
- int err;
- err = pci_read_config_byte(pdev, PCI_SUBORDINATE_BUS, &sub_bus);
- if (err)
- return -EINVAL;
-
- return sysfs_emit(buf, "%u\n", sub_bus);
+ return sysfs_emit(buf, "0x%06x\n", pdev->class);
}
-static DEVICE_ATTR_RO(subordinate_bus_number);
+static DEVICE_ATTR_RO(class);
-static ssize_t ari_enabled_show(struct device *dev,
- struct device_attribute *attr, char *buf)
+static ssize_t irq_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
{
struct pci_dev *pdev = to_pci_dev(dev);
- return sysfs_emit(buf, "%u\n", pci_ari_enabled(pdev->bus));
+ return sysfs_emit(buf, "%u\n", pdev->irq);
}
-static DEVICE_ATTR_RO(ari_enabled);
+static DEVICE_ATTR_RO(irq);
+
+static ssize_t local_cpus_show(struct device *dev,
+ struct device_attribute *attr, char *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, true, attr, buf);
+}
+static DEVICE_ATTR_RO(local_cpulist);
static ssize_t modalias_show(struct device *dev,
struct device_attribute *attr, char *buf)
@@ -263,6 +174,68 @@ static ssize_t modalias_show(struct device *dev,
}
static DEVICE_ATTR_RO(modalias);
+#ifdef CONFIG_NUMA
+static ssize_t numa_node_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ return sysfs_emit(buf, "%d\n", dev->numa_node);
+}
+
+static ssize_t numa_node_store(struct device *dev,
+ struct device_attribute *attr, const char *buf,
+ size_t count)
+{
+ int node;
+ struct pci_dev *pdev = to_pci_dev(dev);
+
+ if (!capable(CAP_SYS_ADMIN))
+ return -EPERM;
+
+ if (kstrtoint(buf, 0, &node) < 0)
+ return -EINVAL;
+
+ if ((node < 0 && node != NUMA_NO_NODE) || node >= MAX_NUMNODES)
+ return -EINVAL;
+
+ if (node != NUMA_NO_NODE && !node_online(node))
+ return -EINVAL;
+
+ add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK);
+ pci_alert(pdev, FW_BUG "Overriding NUMA node to %d. Contact your vendor for updates.",
+ node);
+
+ dev->numa_node = node;
+
+ return count;
+}
+static DEVICE_ATTR_RW(numa_node);
+#endif
+
+static ssize_t dma_mask_bits_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct pci_dev *pdev = to_pci_dev(dev);
+
+ return sysfs_emit(buf, "%d\n", fls64(pdev->dma_mask));
+}
+static DEVICE_ATTR_RO(dma_mask_bits);
+
+static ssize_t consistent_dma_mask_bits_show(struct device *dev,
+ struct device_attribute *attr,
+ char *buf)
+{
+ return sysfs_emit(buf, "%d\n", fls64(dev->coherent_dma_mask));
+}
+static DEVICE_ATTR_RO(consistent_dma_mask_bits);
+
+static ssize_t enable_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct pci_dev *pdev = to_pci_dev(dev);
+
+ return sysfs_emit(buf, "%u\n", atomic_read(&pdev->enable_cnt));
+}
+
static ssize_t enable_store(struct device *dev,
struct device_attribute *attr, const char *buf,
size_t count)
@@ -294,118 +267,319 @@ static ssize_t enable_store(struct device *dev,
return count;
}
+static DEVICE_ATTR_RW(enable);
-static ssize_t enable_show(struct device *dev,
- struct device_attribute *attr, char *buf)
+static ssize_t broken_parity_status_show(struct device *dev,
+ struct device_attribute *attr,
+ char *buf)
{
struct pci_dev *pdev = to_pci_dev(dev);
- return sysfs_emit(buf, "%u\n", atomic_read(&pdev->enable_cnt));
+ return sysfs_emit(buf, "%u\n", pdev->broken_parity_status);
}
-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)
+static ssize_t broken_parity_status_store(struct device *dev,
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ bool broken;
+ struct pci_dev *pdev = to_pci_dev(dev);
+
+ if (kstrtobool(buf, &broken) < 0)
+ return -EINVAL;
+
+ pdev->broken_parity_status = !!broken;
+
+ return count;
+}
+static DEVICE_ATTR_RW(broken_parity_status);
+
+static ssize_t msi_bus_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
{
- int node;
struct pci_dev *pdev = to_pci_dev(dev);
+ struct pci_bus *subordinate = pdev->subordinate;
+
+ return sysfs_emit(buf, "%u\n", subordinate ?
+ !(subordinate->bus_flags & PCI_BUS_FLAGS_NO_MSI)
+ : !pdev->no_msi);
+}
+
+static ssize_t msi_bus_store(struct device *dev,
+ struct device_attribute *attr, const char *buf,
+ size_t count)
+{
+ bool allowed;
+ struct pci_dev *pdev = to_pci_dev(dev);
+ struct pci_bus *subordinate = pdev->subordinate;
if (!capable(CAP_SYS_ADMIN))
return -EPERM;
- if (kstrtoint(buf, 0, &node) < 0)
+ if (kstrtobool(buf, &allowed) < 0)
return -EINVAL;
- if ((node < 0 && node != NUMA_NO_NODE) || node >= MAX_NUMNODES)
+ /*
+ * "no_msi" and "bus_flags" only affect what happens when a driver
+ * requests MSI or MSI-X. They don't affect any drivers that have
+ * already requested MSI or MSI-X.
+ */
+ if (!subordinate) {
+ pdev->no_msi = !allowed;
+ pci_info(pdev, "MSI/MSI-X %s for future drivers\n",
+ allowed ? "allowed" : "disallowed");
+ return count;
+ }
+
+ if (allowed)
+ subordinate->bus_flags &= ~PCI_BUS_FLAGS_NO_MSI;
+ else
+ subordinate->bus_flags |= PCI_BUS_FLAGS_NO_MSI;
+
+ dev_info(&subordinate->dev, "MSI/MSI-X %s for future drivers of devices on this bus\n",
+ allowed ? "allowed" : "disallowed");
+
+ return count;
+}
+static DEVICE_ATTR_RW(msi_bus);
+
+#if defined(CONFIG_PM) && defined(CONFIG_ACPI)
+static ssize_t d3cold_allowed_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct pci_dev *pdev = to_pci_dev(dev);
+
+ return sysfs_emit(buf, "%u\n", pdev->d3cold_allowed);
+}
+
+static ssize_t d3cold_allowed_store(struct device *dev,
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ bool allowed;
+ struct pci_dev *pdev = to_pci_dev(dev);
+
+ if (kstrtobool(buf, &allowed) < 0)
return -EINVAL;
- if (node != NUMA_NO_NODE && !node_online(node))
+ pdev->d3cold_allowed = !!allowed;
+ if (pdev->d3cold_allowed)
+ pci_d3cold_enable(pdev);
+ else
+ pci_d3cold_disable(pdev);
+
+ pm_runtime_resume(dev);
+
+ return count;
+}
+static DEVICE_ATTR_RW(d3cold_allowed);
+#endif
+
+#ifdef CONFIG_OF
+static ssize_t devspec_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct pci_dev *pdev = to_pci_dev(dev);
+ struct device_node *np = pci_device_to_OF_node(pdev);
+
+ if (!np)
+ return 0;
+
+ return sysfs_emit(buf, "%pOF", np);
+}
+static DEVICE_ATTR_RO(devspec);
+#endif
+
+static ssize_t driver_override_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct pci_dev *pdev = to_pci_dev(dev);
+ ssize_t len;
+
+ device_lock(dev);
+ len = sysfs_emit(buf, "%s\n", pdev->driver_override);
+ device_unlock(dev);
+
+ return len;
+}
+
+static ssize_t driver_override_store(struct device *dev,
+ struct device_attribute *attr,
+ const char *buf, size_t count)
+{
+ char *driver_override, *old, *cp;
+ struct pci_dev *pdev = to_pci_dev(dev);
+
+ /* We need to keep extra room for a newline */
+ if (count >= (PAGE_SIZE - 1))
return -EINVAL;
- add_taint(TAINT_FIRMWARE_WORKAROUND, LOCKDEP_STILL_OK);
- pci_alert(pdev, FW_BUG "Overriding NUMA node to %d. Contact your vendor for updates.",
- node);
+ driver_override = kstrndup(buf, count, GFP_KERNEL);
+ if (!driver_override)
+ return -ENOMEM;
+
+ cp = strchr(driver_override, '\n');
+ if (cp)
+ *cp = '\0';
+
+ device_lock(dev);
+ old = pdev->driver_override;
+ if (strlen(driver_override)) {
+ pdev->driver_override = driver_override;
+ } else {
+ kfree(driver_override);
+ pdev->driver_override = NULL;
+ }
+ device_unlock(dev);
+
+ kfree(old);
+
+ return count;
+}
+static DEVICE_ATTR_RW(driver_override);
+
+static ssize_t ari_enabled_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct pci_dev *pdev = to_pci_dev(dev);
+
+ return sysfs_emit(buf, "%u\n", pci_ari_enabled(pdev->bus));
+}
+static DEVICE_ATTR_RO(ari_enabled);
+
+static struct attribute *pci_dev_attrs[] = {
+ &dev_attr_power_state.attr,
+ &dev_attr_resource.attr,
+ &dev_attr_vendor.attr,
+ &dev_attr_device.attr,
+ &dev_attr_subsystem_vendor.attr,
+ &dev_attr_subsystem_device.attr,
+ &dev_attr_revision.attr,
+ &dev_attr_class.attr,
+ &dev_attr_irq.attr,
+ &dev_attr_local_cpus.attr,
+ &dev_attr_local_cpulist.attr,
+ &dev_attr_modalias.attr,
+#ifdef CONFIG_NUMA
+ &dev_attr_numa_node.attr,
+#endif
+ &dev_attr_dma_mask_bits.attr,
+ &dev_attr_consistent_dma_mask_bits.attr,
+ &dev_attr_enable.attr,
+ &dev_attr_broken_parity_status.attr,
+ &dev_attr_msi_bus.attr,
+#if defined(CONFIG_PM) && defined(CONFIG_ACPI)
+ &dev_attr_d3cold_allowed.attr,
+#endif
+#ifdef CONFIG_OF
+ &dev_attr_devspec.attr,
+#endif
+ &dev_attr_driver_override.attr,
+ &dev_attr_ari_enabled.attr,
+ NULL,
+};
+
+static const struct attribute_group pci_dev_group = {
+ .attrs = pci_dev_attrs,
+};
- dev->numa_node = node;
+/*
+ * PCI Bus Class Devices
+ */
+static ssize_t cpuaffinity_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
+{
+ struct pci_bus *bus = to_pci_bus(dev);
+ const struct cpumask *cpumask = cpumask_of_pcibus(bus);
- return count;
+ return cpumap_print_to_pagebuf(false, buf, cpumask);
}
+static DEVICE_ATTR_RO(cpuaffinity);
-static ssize_t numa_node_show(struct device *dev,
- struct device_attribute *attr, char *buf)
+static ssize_t cpulistaffinity_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
{
- return sysfs_emit(buf, "%d\n", dev->numa_node);
+ struct pci_bus *bus = to_pci_bus(dev);
+ const struct cpumask *cpumask = cpumask_of_pcibus(bus);
+
+ return cpumap_print_to_pagebuf(true, buf, cpumask);
}
-static DEVICE_ATTR_RW(numa_node);
-#endif
+static DEVICE_ATTR_RO(cpulistaffinity);
-static ssize_t dma_mask_bits_show(struct device *dev,
- struct device_attribute *attr, char *buf)
+static ssize_t max_link_speed_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
{
struct pci_dev *pdev = to_pci_dev(dev);
- return sysfs_emit(buf, "%d\n", fls64(pdev->dma_mask));
+ return sysfs_emit(buf, "%s\n",
+ pci_speed_string(pcie_get_speed_cap(pdev)));
}
-static DEVICE_ATTR_RO(dma_mask_bits);
+static DEVICE_ATTR_RO(max_link_speed);
-static ssize_t consistent_dma_mask_bits_show(struct device *dev,
- struct device_attribute *attr,
- char *buf)
+static ssize_t max_link_width_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
{
- return sysfs_emit(buf, "%d\n", fls64(dev->coherent_dma_mask));
+ struct pci_dev *pdev = to_pci_dev(dev);
+
+ return sysfs_emit(buf, "%u\n", pcie_get_width_cap(pdev));
}
-static DEVICE_ATTR_RO(consistent_dma_mask_bits);
+static DEVICE_ATTR_RO(max_link_width);
-static ssize_t msi_bus_show(struct device *dev,
- struct device_attribute *attr, char *buf)
+static ssize_t current_link_speed_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
{
struct pci_dev *pdev = to_pci_dev(dev);
- struct pci_bus *subordinate = pdev->subordinate;
+ enum pci_bus_speed speed;
- return sysfs_emit(buf, "%u\n", subordinate ?
- !(subordinate->bus_flags & PCI_BUS_FLAGS_NO_MSI)
- : !pdev->no_msi);
+ pcie_bandwidth_available(pdev, NULL, &speed, NULL);
+
+ return sysfs_emit(buf, "%s\n", pci_speed_string(speed));
}
+static DEVICE_ATTR_RO(current_link_speed);
-static ssize_t msi_bus_store(struct device *dev,
- struct device_attribute *attr, const char *buf,
- size_t count)
+static ssize_t current_link_width_show(struct device *dev,
+ struct device_attribute *attr, char *buf)
{
- bool allowed;
struct pci_dev *pdev = to_pci_dev(dev);
- struct pci_bus *subordinate = pdev->subordinate;
+ enum pcie_link_width width;
- if (!capable(CAP_SYS_ADMIN))
- return -EPERM;
+ pcie_bandwidth_available(pdev, NULL, NULL, &width);
- if (kstrtobool(buf, &allowed) < 0)
+ return sysfs_emit(buf, "%u\n", width);
+}
+static DEVICE_ATTR_RO(current_link_width);
+
+static ssize_t secondary_bus_number_show(struct device *dev,
+ struct device_attribute *attr,
+ char *buf)
+{
+ struct pci_dev *pdev = to_pci_dev(dev);
+ u8 sec_bus;
+ int err;
+
+ err = pci_read_config_byte(pdev, PCI_SECONDARY_BUS, &sec_bus);
+ if (err)
return -EINVAL;
- /*
- * "no_msi" and "bus_flags" only affect what happens when a driver
- * requests MSI or MSI-X. They don't affect any drivers that have
- * already requested MSI or MSI-X.
- */
- if (!subordinate) {
- pdev->no_msi = !allowed;
- pci_info(pdev, "MSI/MSI-X %s for future drivers\n",
- allowed ? "allowed" : "disallowed");
- return count;
- }
+ return sysfs_emit(buf, "%u\n", sec_bus);
+}
+static DEVICE_ATTR_RO(secondary_bus_number);
- if (allowed)
- subordinate->bus_flags &= ~PCI_BUS_FLAGS_NO_MSI;
- else
- subordinate->bus_flags |= PCI_BUS_FLAGS_NO_MSI;
+static ssize_t subordinate_bus_number_show(struct device *dev,
+ struct device_attribute *attr,
+ char *buf)
+{
+ struct pci_dev *pdev = to_pci_dev(dev);
+ u8 sub_bus;
+ int err;
- dev_info(&subordinate->dev, "MSI/MSI-X %s for future drivers of devices on this bus\n",
- allowed ? "allowed" : "disallowed");
+ err = pci_read_config_byte(pdev, PCI_SUBORDINATE_BUS, &sub_bus);
+ if (err)
+ return -EINVAL;
- return count;
+ return sysfs_emit(buf, "%u\n", sub_bus);
}
-static DEVICE_ATTR_RW(msi_bus);
+static DEVICE_ATTR_RO(subordinate_bus_number);
static ssize_t rescan_store(struct bus_type *bus, const char *buf, size_t count)
{
@@ -502,133 +676,6 @@ static ssize_t bus_rescan_store(struct device *dev,
static struct device_attribute dev_attr_bus_rescan = __ATTR(rescan, 0200, NULL,
bus_rescan_store);
-#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)
-{
- bool allowed;
- struct pci_dev *pdev = to_pci_dev(dev);
-
- if (kstrtobool(buf, &allowed) < 0)
- return -EINVAL;
-
- pdev->d3cold_allowed = !!allowed;
- if (pdev->d3cold_allowed)
- pci_d3cold_enable(pdev);
- else
- pci_d3cold_disable(pdev);
-
- pm_runtime_resume(dev);
-
- return count;
-}
-
-static ssize_t d3cold_allowed_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct pci_dev *pdev = to_pci_dev(dev);
-
- return sysfs_emit(buf, "%u\n", pdev->d3cold_allowed);
-}
-static DEVICE_ATTR_RW(d3cold_allowed);
-#endif
-
-#ifdef CONFIG_OF
-static ssize_t devspec_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct pci_dev *pdev = to_pci_dev(dev);
- struct device_node *np = pci_device_to_OF_node(pdev);
-
- if (!np)
- return 0;
-
- return sysfs_emit(buf, "%pOF", np);
-}
-static DEVICE_ATTR_RO(devspec);
-#endif
-
-static ssize_t driver_override_store(struct device *dev,
- struct device_attribute *attr,
- const char *buf, size_t count)
-{
- char *driver_override, *old, *cp;
- struct pci_dev *pdev = to_pci_dev(dev);
-
- /* We need to keep extra room for a newline */
- if (count >= (PAGE_SIZE - 1))
- return -EINVAL;
-
- driver_override = kstrndup(buf, count, GFP_KERNEL);
- if (!driver_override)
- return -ENOMEM;
-
- cp = strchr(driver_override, '\n');
- if (cp)
- *cp = '\0';
-
- device_lock(dev);
- old = pdev->driver_override;
- if (strlen(driver_override)) {
- pdev->driver_override = driver_override;
- } else {
- kfree(driver_override);
- pdev->driver_override = NULL;
- }
- device_unlock(dev);
-
- kfree(old);
-
- return count;
-}
-
-static ssize_t driver_override_show(struct device *dev,
- struct device_attribute *attr, char *buf)
-{
- struct pci_dev *pdev = to_pci_dev(dev);
- ssize_t len;
-
- device_lock(dev);
- len = sysfs_emit(buf, "%s\n", pdev->driver_override);
- device_unlock(dev);
-
- return len;
-}
-static DEVICE_ATTR_RW(driver_override);
-
-static struct attribute *pci_dev_attrs[] = {
- &dev_attr_power_state.attr,
- &dev_attr_resource.attr,
- &dev_attr_vendor.attr,
- &dev_attr_device.attr,
- &dev_attr_subsystem_vendor.attr,
- &dev_attr_subsystem_device.attr,
- &dev_attr_revision.attr,
- &dev_attr_class.attr,
- &dev_attr_irq.attr,
- &dev_attr_local_cpus.attr,
- &dev_attr_local_cpulist.attr,
- &dev_attr_modalias.attr,
-#ifdef CONFIG_NUMA
- &dev_attr_numa_node.attr,
-#endif
- &dev_attr_dma_mask_bits.attr,
- &dev_attr_consistent_dma_mask_bits.attr,
- &dev_attr_enable.attr,
- &dev_attr_broken_parity_status.attr,
- &dev_attr_msi_bus.attr,
-#if defined(CONFIG_PM) && defined(CONFIG_ACPI)
- &dev_attr_d3cold_allowed.attr,
-#endif
-#ifdef CONFIG_OF
- &dev_attr_devspec.attr,
-#endif
- &dev_attr_driver_override.attr,
- &dev_attr_ari_enabled.attr,
- NULL,
-};
-
static struct attribute *pci_bridge_attrs[] = {
&dev_attr_subordinate_bus_number.attr,
&dev_attr_secondary_bus_number.attr,
@@ -1504,10 +1551,6 @@ static umode_t pcie_dev_attr_is_visible(struct kobject *kobj,
return a->mode;
}
-static const struct attribute_group pci_dev_group = {
- .attrs = pci_dev_attrs,
-};
-
const struct attribute_group *pci_dev_groups[] = {
&pci_dev_group,
&pci_dev_config_attr_group,
--
2.31.0
next prev parent reply other threads:[~2021-04-16 20:59 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-04-16 20:58 [PATCH 00/20] PCI: Convert dynamic sysfs objects into static Krzysztof Wilczyński
2021-04-16 20:58 ` [PATCH 01/20] PCI: Convert dynamic "config" sysfs object " Krzysztof Wilczyński
2021-04-16 20:58 ` [PATCH 02/20] PCI: Convert dynamic "rom" " Krzysztof Wilczyński
2021-04-16 20:58 ` [PATCH 03/20] PCI: Convert dynamic "reset" " Krzysztof Wilczyński
2021-04-16 20:58 ` [PATCH 04/20] PCI/VPD: Convert dynamic "vpd" " Krzysztof Wilczyński
2021-04-16 20:58 ` [PATCH 05/20] PCI: Convert dynamic "index" and "label" sysfs objects " Krzysztof Wilczyński
2021-04-16 20:58 ` [PATCH 06/20] sysfs: Introduce BIN_ATTR_ADMIN_RO and BIN_ATTR_ADMIN_RW Krzysztof Wilczyński
2021-04-16 20:58 ` [PATCH 07/20] PCI: Convert PCI sysfs objects to use BIN_ATTR_ADMIN_RW macro Krzysztof Wilczyński
2021-04-16 20:58 ` [PATCH 08/20] PCI: Move to kstrtobool() to handle user input Krzysztof Wilczyński
2021-04-16 20:58 ` [PATCH 09/20] PCI: Use sysfs_emit() and sysfs_emit_at() in "show" functions Krzysztof Wilczyński
2021-04-16 20:58 ` [PATCH 10/20] PCI: Update style to be more consistent Krzysztof Wilczyński
2021-04-16 20:58 ` Krzysztof Wilczyński [this message]
2021-04-16 20:58 ` [PATCH 12/20] PCI: Rearrange attributes from the pci_dev_config_attr_group Krzysztof Wilczyński
2021-04-16 20:58 ` [PATCH 13/20] PCI: Rearrange attributes from the pci_dev_rom_attr_group Krzysztof Wilczyński
2021-04-16 20:58 ` [PATCH 14/20] PCI: Rearrange attributes from the pci_dev_reset_attr_group Krzysztof Wilczyński
2021-04-16 20:58 ` [PATCH 15/20] PCI: Rearrange attributes from the pci_dev_attr_group Krzysztof Wilczyński
2021-04-16 20:58 ` [PATCH 16/20] PCI: Rearrange attributes from the pci_dev_hp_attr_group Krzysztof Wilczyński
2021-04-16 20:58 ` [PATCH 17/20] PCI: Rearrange attributes from the pci_bridge_attr_group Krzysztof Wilczyński
2021-04-16 20:58 ` [PATCH 18/20] PCI: Rearrange attributes from the pcie_dev_attr_group Krzysztof Wilczyński
2021-04-16 20:58 ` [PATCH 19/20] PCI: Rearrange attributes from the pci_bus_group Krzysztof Wilczyński
2021-04-16 20:58 ` [PATCH 20/20] PCI: Rearrange attributes from the pcibus_group Krzysztof Wilczyński
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210416205856.3234481-12-kw@linux.com \
--to=kw@linux.com \
--cc=bhelgaas@google.com \
--cc=dan.j.williams@intel.com \
--cc=daniel.vetter@ffwll.ch \
--cc=dsterba@suse.com \
--cc=gregkh@linuxfoundation.org \
--cc=joe@perches.com \
--cc=linux-pci@vger.kernel.org \
--cc=mchehab+huawei@kernel.org \
--cc=oohall@gmail.com \
--cc=pali@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).