From: "Krzysztof Wilczyński" <kwilczynski@kernel.org>
To: Bjorn Helgaas <bhelgaas@google.com>
Cc: "Bjorn Helgaas" <helgaas@kernel.org>,
"Manivannan Sadhasivam" <mani@kernel.org>,
"Lorenzo Pieralisi" <lpieralisi@kernel.org>,
"Alex Williamson" <alex@shazbot.org>,
"Magnus Lindholm" <linmag7@gmail.com>,
"Matt Turner" <mattst88@gmail.com>,
"Richard Henderson" <richard.henderson@linaro.org>,
"Christophe Leroy" <chleroy@kernel.org>,
"Madhavan Srinivasan" <maddy@linux.ibm.com>,
"Michael Ellerman" <mpe@ellerman.id.au>,
"Nicholas Piggin" <npiggin@gmail.com>,
"Dexuan Cui" <decui@microsoft.com>,
"Krzysztof Hałasa" <khalasa@piap.pl>,
"Lukas Wunner" <lukas@wunner.de>,
"Oliver O'Halloran" <oohall@gmail.com>,
"Saurabh Singh Sengar" <ssengar@microsoft.com>,
"Shuan He" <heshuan@bytedance.com>,
"Srivatsa Bhat" <srivatsabhat@microsoft.com>,
"Ilpo Järvinen" <ilpo.jarvinen@linux.intel.com>,
linux-pci@vger.kernel.org, linux-alpha@vger.kernel.org,
linuxppc-dev@lists.ozlabs.org
Subject: [PATCH v8 23/25] PCI/sysfs: Convert legacy I/O and memory attributes to static definitions
Date: Fri, 19 Jun 2026 08:51:58 +0000 [thread overview]
Message-ID: <20260619085200.3729431-24-kwilczynski@kernel.org> (raw)
In-Reply-To: <20260619085200.3729431-1-kwilczynski@kernel.org>
Currently, legacy_io and legacy_mem are dynamically allocated and
created by pci_create_legacy_files(), with pci_adjust_legacy_attr()
updating the attributes at runtime on Alpha to rename them and shift
the size for sparse addressing.
Convert to four static const attributes (legacy_io, legacy_io_sparse,
legacy_mem, legacy_mem_sparse) with is_bin_visible() callbacks that
use pci_legacy_has_sparse() to select the appropriate variant per bus.
The sizes are compile-time constants and .size is set directly on
each attribute.
Register the groups in pcibus_groups[] under a HAVE_PCI_LEGACY guard
so the driver model handles creation and removal automatically.
Stub out pci_create_legacy_files() and pci_remove_legacy_files() as
the dynamic creation is no longer needed. Remove the __weak
pci_adjust_legacy_attr(), Alpha's override, and its declaration from
both Alpha and PowerPC asm/pci.h headers.
Tested-by: Shivaprasad G Bhat <sbhat@linux.ibm.com>
Signed-off-by: Krzysztof Wilczyński <kwilczynski@kernel.org>
---
arch/alpha/include/asm/pci.h | 2 -
arch/alpha/kernel/pci-sysfs.c | 24 -----
arch/powerpc/include/asm/pci.h | 2 -
drivers/pci/pci-sysfs.c | 191 +++++++++++++++++----------------
4 files changed, 98 insertions(+), 121 deletions(-)
diff --git a/arch/alpha/include/asm/pci.h b/arch/alpha/include/asm/pci.h
index 95de7ffd59e8..ad5d1391e1fa 100644
--- a/arch/alpha/include/asm/pci.h
+++ b/arch/alpha/include/asm/pci.h
@@ -84,8 +84,6 @@ extern int pci_legacy_write(struct pci_bus *bus, loff_t port, u32 val,
extern int pci_mmap_legacy_page_range(struct pci_bus *bus,
struct vm_area_struct *vma,
enum pci_mmap_state mmap_state);
-extern void pci_adjust_legacy_attr(struct pci_bus *bus,
- enum pci_mmap_state mmap_type);
extern bool pci_legacy_has_sparse(struct pci_bus *bus,
enum pci_mmap_state type);
#define HAVE_PCI_LEGACY 1
diff --git a/arch/alpha/kernel/pci-sysfs.c b/arch/alpha/kernel/pci-sysfs.c
index 2d878b310629..37cba711ade5 100644
--- a/arch/alpha/kernel/pci-sysfs.c
+++ b/arch/alpha/kernel/pci-sysfs.c
@@ -191,30 +191,6 @@ bool pci_legacy_has_sparse(struct pci_bus *bus, enum pci_mmap_state type)
return has_sparse(hose, type);
}
-/**
- * pci_adjust_legacy_attr - adjustment of legacy file attributes
- * @bus: bus to create files under
- * @mmap_type: I/O port or memory
- *
- * Adjust file name and size for sparse mappings.
- */
-void pci_adjust_legacy_attr(struct pci_bus *bus, enum pci_mmap_state mmap_type)
-{
- struct pci_controller *hose = bus->sysdata;
-
- if (!has_sparse(hose, mmap_type))
- return;
-
- if (mmap_type == pci_mmap_mem) {
- bus->legacy_mem->attr.name = "legacy_mem_sparse";
- bus->legacy_mem->size <<= 5;
- } else {
- bus->legacy_io->attr.name = "legacy_io_sparse";
- bus->legacy_io->size <<= 5;
- }
- return;
-}
-
/* Legacy I/O bus read/write functions */
int pci_legacy_read(struct pci_bus *bus, loff_t port, u32 *val, size_t size)
{
diff --git a/arch/powerpc/include/asm/pci.h b/arch/powerpc/include/asm/pci.h
index 46a9c4491ed0..72f286e74786 100644
--- a/arch/powerpc/include/asm/pci.h
+++ b/arch/powerpc/include/asm/pci.h
@@ -82,8 +82,6 @@ extern int pci_legacy_write(struct pci_bus *bus, loff_t port, u32 val,
extern int pci_mmap_legacy_page_range(struct pci_bus *bus,
struct vm_area_struct *vma,
enum pci_mmap_state mmap_state);
-extern void pci_adjust_legacy_attr(struct pci_bus *bus,
- enum pci_mmap_state mmap_type);
#define HAVE_PCI_LEGACY 1
extern void pcibios_claim_one_bus(struct pci_bus *b);
diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c
index 7f1d8e07924f..dfb4e06677fc 100644
--- a/drivers/pci/pci-sysfs.c
+++ b/drivers/pci/pci-sysfs.c
@@ -676,11 +676,6 @@ static const struct attribute_group pcibus_group = {
.attrs = pcibus_attrs,
};
-const struct attribute_group *pcibus_groups[] = {
- &pcibus_group,
- NULL,
-};
-
static ssize_t boot_vga_show(struct device *dev, struct device_attribute *attr,
char *buf)
{
@@ -879,19 +874,6 @@ static const struct attribute_group pci_dev_config_attr_group = {
.bin_size = pci_dev_config_attr_bin_size,
};
-/*
- * llseek operation for mmappable PCI resources.
- * May be left unused if the arch doesn't provide them.
- */
-static __maybe_unused loff_t
-pci_llseek_resource_legacy(struct file *filep,
- struct kobject *kobj __always_unused,
- const struct bin_attribute *attr,
- loff_t offset, int whence)
-{
- return fixed_size_llseek(filep, offset, whence, attr->size);
-}
-
#ifdef HAVE_PCI_LEGACY
#define pci_legacy_resource_io_attr(_suffix, _size) \
@@ -1010,91 +992,114 @@ bool __weak pci_legacy_has_sparse(struct pci_bus *bus,
return false;
}
-/**
- * pci_adjust_legacy_attr - adjustment of legacy file attributes
- * @b: bus to create files under
- * @mmap_type: I/O port or memory
- *
- * Stub implementation. Can be overridden by arch if necessary.
- */
-void __weak pci_adjust_legacy_attr(struct pci_bus *b,
- enum pci_mmap_state mmap_type)
+static inline umode_t __pci_legacy_is_visible(struct kobject *kobj,
+ const struct bin_attribute *a,
+ enum pci_mmap_state type,
+ bool sparse)
{
+ struct pci_bus *bus = to_pci_bus(kobj_to_dev(kobj));
+
+ if (pci_legacy_has_sparse(bus, type) != sparse)
+ return 0;
+
+ return a->attr.mode;
}
-/**
- * pci_create_legacy_files - create legacy I/O port and memory files
- * @b: bus to create files under
- *
- * Some platforms allow access to legacy I/O port and ISA memory space on
- * a per-bus basis. This routine creates the files and ties them into
- * their associated read, write and mmap files from pci-sysfs.c
- *
- * On error unwind, but don't propagate the error to the caller
- * as it is ok to set up the PCI bus without these files.
- */
-void pci_create_legacy_files(struct pci_bus *b)
+static umode_t pci_legacy_io_is_visible(struct kobject *kobj,
+ const struct bin_attribute *a, int n)
{
- int error;
-
- if (!sysfs_initialized)
- return;
-
- b->legacy_io = kzalloc_objs(struct bin_attribute, 2, GFP_ATOMIC);
- if (!b->legacy_io)
- goto kzalloc_err;
-
- sysfs_bin_attr_init(b->legacy_io);
- b->legacy_io->attr.name = "legacy_io";
- b->legacy_io->size = PCI_LEGACY_IO_SIZE;
- b->legacy_io->attr.mode = 0600;
- b->legacy_io->read = pci_read_legacy_io;
- b->legacy_io->write = pci_write_legacy_io;
- /* See pci_create_attr() for motivation */
- b->legacy_io->llseek = pci_llseek_resource_legacy;
- b->legacy_io->mmap = pci_mmap_legacy_io;
- b->legacy_io->f_mapping = iomem_get_mapping;
- pci_adjust_legacy_attr(b, pci_mmap_io);
- error = device_create_bin_file(&b->dev, b->legacy_io);
- if (error)
- goto legacy_io_err;
-
- /* Allocated above after the legacy_io struct */
- b->legacy_mem = b->legacy_io + 1;
- sysfs_bin_attr_init(b->legacy_mem);
- b->legacy_mem->attr.name = "legacy_mem";
- b->legacy_mem->size = PCI_LEGACY_MEM_SIZE;
- b->legacy_mem->attr.mode = 0600;
- b->legacy_mem->mmap = pci_mmap_legacy_mem;
- /* See pci_create_attr() for motivation */
- b->legacy_mem->llseek = pci_llseek_resource_legacy;
- b->legacy_mem->f_mapping = iomem_get_mapping;
- pci_adjust_legacy_attr(b, pci_mmap_mem);
- error = device_create_bin_file(&b->dev, b->legacy_mem);
- if (error)
- goto legacy_mem_err;
-
- return;
-
-legacy_mem_err:
- device_remove_bin_file(&b->dev, b->legacy_io);
-legacy_io_err:
- kfree(b->legacy_io);
- b->legacy_io = NULL;
-kzalloc_err:
- dev_warn(&b->dev, "could not create legacy I/O port and ISA memory resources in sysfs\n");
+ return __pci_legacy_is_visible(kobj, a, pci_mmap_io, false);
}
-void pci_remove_legacy_files(struct pci_bus *b)
+static umode_t pci_legacy_io_sparse_is_visible(struct kobject *kobj,
+ const struct bin_attribute *a,
+ int n)
{
- if (b->legacy_io) {
- device_remove_bin_file(&b->dev, b->legacy_io);
- device_remove_bin_file(&b->dev, b->legacy_mem);
- kfree(b->legacy_io); /* both are allocated here */
- }
+ return __pci_legacy_is_visible(kobj, a, pci_mmap_io, true);
}
+
+static umode_t pci_legacy_mem_is_visible(struct kobject *kobj,
+ const struct bin_attribute *a, int n)
+{
+ return __pci_legacy_is_visible(kobj, a, pci_mmap_mem, false);
+}
+
+static umode_t pci_legacy_mem_sparse_is_visible(struct kobject *kobj,
+ const struct bin_attribute *a,
+ int n)
+{
+ return __pci_legacy_is_visible(kobj, a, pci_mmap_mem, true);
+}
+
+static loff_t pci_llseek_resource_legacy(struct file *filep,
+ struct kobject *kobj __always_unused,
+ const struct bin_attribute *attr,
+ loff_t offset, int whence)
+{
+ return fixed_size_llseek(filep, offset, whence, attr->size);
+}
+
+pci_legacy_resource_io_attr(, PCI_LEGACY_IO_SIZE);
+pci_legacy_resource_io_attr(_sparse, PCI_LEGACY_IO_SIZE << 5);
+
+pci_legacy_resource_mem_attr(, PCI_LEGACY_MEM_SIZE);
+pci_legacy_resource_mem_attr(_sparse, PCI_LEGACY_MEM_SIZE << 5);
+
+static const struct bin_attribute *const pci_legacy_io_attrs[] = {
+ &pci_legacy_io_attr,
+ NULL,
+};
+
+static const struct bin_attribute *const pci_legacy_io_sparse_attrs[] = {
+ &pci_legacy_io_sparse_attr,
+ NULL,
+};
+
+static const struct bin_attribute *const pci_legacy_mem_attrs[] = {
+ &pci_legacy_mem_attr,
+ NULL,
+};
+
+static const struct bin_attribute *const pci_legacy_mem_sparse_attrs[] = {
+ &pci_legacy_mem_sparse_attr,
+ NULL,
+};
+
+static const struct attribute_group pci_legacy_io_group = {
+ .bin_attrs = pci_legacy_io_attrs,
+ .is_bin_visible = pci_legacy_io_is_visible,
+};
+
+static const struct attribute_group pci_legacy_io_sparse_group = {
+ .bin_attrs = pci_legacy_io_sparse_attrs,
+ .is_bin_visible = pci_legacy_io_sparse_is_visible,
+};
+
+static const struct attribute_group pci_legacy_mem_group = {
+ .bin_attrs = pci_legacy_mem_attrs,
+ .is_bin_visible = pci_legacy_mem_is_visible,
+};
+
+static const struct attribute_group pci_legacy_mem_sparse_group = {
+ .bin_attrs = pci_legacy_mem_sparse_attrs,
+ .is_bin_visible = pci_legacy_mem_sparse_is_visible,
+};
+
+void pci_create_legacy_files(struct pci_bus *b) { }
+void pci_remove_legacy_files(struct pci_bus *b) { }
#endif /* HAVE_PCI_LEGACY */
+const struct attribute_group *pcibus_groups[] = {
+ &pcibus_group,
+#ifdef HAVE_PCI_LEGACY
+ &pci_legacy_io_group,
+ &pci_legacy_io_sparse_group,
+ &pci_legacy_mem_group,
+ &pci_legacy_mem_sparse_group,
+#endif
+ NULL,
+};
+
#if defined(HAVE_PCI_MMAP) || defined(ARCH_GENERIC_PCI_MMAP_RESOURCE)
/**
* pci_mmap_resource - map a PCI resource into user memory space
--
2.54.0
next prev parent reply other threads:[~2026-06-19 8:53 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-19 8:51 [PATCH v8 00/25] PCI: Convert all dynamic sysfs attributes to static Krzysztof Wilczyński
2026-06-19 8:51 ` [PATCH v8 01/25] PCI/sysfs: Use PCI resource accessor macros Krzysztof Wilczyński
2026-06-19 9:09 ` sashiko-bot
2026-06-19 8:51 ` [PATCH v8 02/25] PCI: Add pci_resource_is_io() and pci_resource_is_mem() helpers Krzysztof Wilczyński
2026-06-19 8:59 ` sashiko-bot
2026-06-19 8:51 ` [PATCH v8 03/25] PCI/sysfs: Only allow supported resource types in I/O and MMIO helpers Krzysztof Wilczyński
2026-06-19 9:01 ` sashiko-bot
2026-06-19 8:51 ` [PATCH v8 04/25] PCI/sysfs: Split pci_llseek_resource() for device and legacy attributes Krzysztof Wilczyński
2026-06-19 9:03 ` sashiko-bot
2026-06-19 8:51 ` [PATCH v8 05/25] PCI/sysfs: Add CAP_SYS_ADMIN check to __resource_resize_store() Krzysztof Wilczyński
2026-06-19 9:01 ` sashiko-bot
2026-06-19 8:51 ` [PATCH v8 06/25] PCI/sysfs: Add static PCI resource attribute macros Krzysztof Wilczyński
2026-06-19 9:11 ` sashiko-bot
2026-06-19 8:51 ` [PATCH v8 07/25] PCI/sysfs: Convert PCI resource files to static attributes Krzysztof Wilczyński
2026-06-19 9:08 ` sashiko-bot
2026-06-19 8:51 ` [PATCH v8 08/25] PCI/sysfs: Warn about BAR resize failure in __resource_resize_store() Krzysztof Wilczyński
2026-06-19 9:03 ` sashiko-bot
2026-06-19 8:51 ` [PATCH v8 09/25] PCI/sysfs: Add stubs for pci_{create,remove}_sysfs_dev_files() Krzysztof Wilczyński
2026-06-19 9:28 ` sashiko-bot
2026-06-19 8:51 ` [PATCH v8 10/25] PCI/sysfs: Limit pci_sysfs_init() late_initcall compile scope Krzysztof Wilczyński
2026-06-19 9:35 ` sashiko-bot
2026-06-19 8:51 ` [PATCH v8 11/25] alpha/PCI: Add security_locked_down() check to pci_mmap_resource() Krzysztof Wilczyński
2026-06-19 9:05 ` sashiko-bot
2026-06-19 8:51 ` [PATCH v8 12/25] alpha/PCI: Use BAR index in sysfs attr->private instead of resource pointer Krzysztof Wilczyński
2026-06-19 9:02 ` sashiko-bot
2026-06-19 8:51 ` [PATCH v8 13/25] alpha/PCI: Use PCI resource accessor macros Krzysztof Wilczyński
2026-06-19 9:04 ` sashiko-bot
2026-06-19 8:51 ` [PATCH v8 14/25] alpha/PCI: Fix __pci_mmap_fits() overflow for zero-length BARs Krzysztof Wilczyński
2026-06-19 9:11 ` sashiko-bot
2026-06-19 8:51 ` [PATCH v8 15/25] alpha/PCI: Remove WARN from __pci_mmap_fits() and __legacy_mmap_fits() Krzysztof Wilczyński
2026-06-19 8:56 ` sashiko-bot
2026-06-19 8:51 ` [PATCH v8 16/25] alpha/PCI: Add static PCI resource attribute macros Krzysztof Wilczyński
2026-06-19 9:04 ` sashiko-bot
2026-06-19 8:51 ` [PATCH v8 17/25] alpha/PCI: Convert resource files to static attributes Krzysztof Wilczyński
2026-06-19 9:09 ` sashiko-bot
2026-06-19 8:51 ` [PATCH v8 18/25] PCI/sysfs: Remove pci_{create,remove}_sysfs_dev_files() Krzysztof Wilczyński
2026-06-19 9:20 ` sashiko-bot
2026-06-19 8:51 ` [PATCH v8 19/25] PCI: Add macros for legacy I/O and memory address space sizes Krzysztof Wilczyński
2026-06-19 9:12 ` sashiko-bot
2026-06-19 8:51 ` [PATCH v8 20/25] alpha/PCI: Compute legacy size in pci_mmap_legacy_page_range() Krzysztof Wilczyński
2026-06-19 9:12 ` sashiko-bot
2026-06-19 8:51 ` [PATCH v8 21/25] PCI/sysfs: Add __weak pci_legacy_has_sparse() helper Krzysztof Wilczyński
2026-06-19 9:08 ` sashiko-bot
2026-06-19 8:51 ` [PATCH v8 22/25] PCI/sysfs: Add legacy I/O and memory attribute macros Krzysztof Wilczyński
2026-06-19 9:18 ` sashiko-bot
2026-06-19 18:26 ` Krzysztof Wilczyński
2026-06-19 8:51 ` Krzysztof Wilczyński [this message]
2026-06-19 9:16 ` [PATCH v8 23/25] PCI/sysfs: Convert legacy I/O and memory attributes to static definitions sashiko-bot
2026-06-19 18:31 ` Krzysztof Wilczyński
2026-06-19 8:51 ` [PATCH v8 24/25] PCI/sysfs: Remove pci_create_legacy_files() and pci_sysfs_init() Krzysztof Wilczyński
2026-06-19 9:11 ` sashiko-bot
2026-06-19 8:52 ` [PATCH v8 25/25] PCI/sysfs: Limit BAR resize attribute scope to platforms with PCI mmap Krzysztof Wilczyński
2026-06-19 9:29 ` sashiko-bot
2026-06-19 18:39 ` [PATCH v8 00/25] PCI: Convert all dynamic sysfs attributes to static 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=20260619085200.3729431-24-kwilczynski@kernel.org \
--to=kwilczynski@kernel.org \
--cc=alex@shazbot.org \
--cc=bhelgaas@google.com \
--cc=chleroy@kernel.org \
--cc=decui@microsoft.com \
--cc=helgaas@kernel.org \
--cc=heshuan@bytedance.com \
--cc=ilpo.jarvinen@linux.intel.com \
--cc=khalasa@piap.pl \
--cc=linmag7@gmail.com \
--cc=linux-alpha@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=lpieralisi@kernel.org \
--cc=lukas@wunner.de \
--cc=maddy@linux.ibm.com \
--cc=mani@kernel.org \
--cc=mattst88@gmail.com \
--cc=mpe@ellerman.id.au \
--cc=npiggin@gmail.com \
--cc=oohall@gmail.com \
--cc=richard.henderson@linaro.org \
--cc=srivatsabhat@microsoft.com \
--cc=ssengar@microsoft.com \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.