From: Jesse Barnes <jbarnes@engr.sgi.com>
To: Jon Smirl <jonsmirl@yahoo.com>
Cc: Greg KH <greg@kroah.com>,
linux-kernel@vger.kernel.org, linux-pci@atrey.karlin.mff.cuni.cz
Subject: Re: [PATCH] add PCI ROMs to sysfs
Date: Mon, 2 Aug 2004 10:02:31 -0700 [thread overview]
Message-ID: <200408021002.31117.jbarnes@engr.sgi.com> (raw)
In-Reply-To: <200407310859.45769.jbarnes@engr.sgi.com>
[-- Attachment #1: Type: text/plain, Size: 999 bytes --]
On Saturday, July 31, 2004 8:59 am, Jesse Barnes wrote:
> On Friday, July 30, 2004 3:15 pm, Jon Smirl wrote:
> > If you set pci_dev->resource[PCI_ROM_RESOURCE] to C000:0 won't this
> > mess up pci_assign_resource()/release_resource()?
>
> Yeah, you're right, that wouldn't be a good thing to do. I guess I'll have
> to hang a different structure off of the pci_dev so we can tell the sysfs
> rom handling code where to get the rom. Doing it that way would allow us
> to deal with cards that really need a copy made too, though the default
> behavior would be to read it directly.
>
> How does that sound?
Here's a new patch that implements that suggestion, though without any special
cases for the various cards that might need the ROM copy (e.g. those with
shared decoders or whose ROMs are in the system ROM somewhere). How does it
look, Greg? It it suitable for the mainline yet? I expect those familiar
with the various cards to add the necessary quirks code as needed.
Thanks,
Jesse
[-- Attachment #2: pci-sysfs-rom-7.patch --]
[-- Type: text/plain, Size: 6230 bytes --]
===== drivers/pci/pci-sysfs.c 1.10 vs edited =====
--- 1.10/drivers/pci/pci-sysfs.c 2004-06-04 06:23:04 -07:00
+++ edited/drivers/pci/pci-sysfs.c 2004-08-02 09:57:11 -07:00
@@ -164,6 +164,92 @@
return count;
}
+/**
+ * pci_enable_rom - enable ROM decoding for a PCI device
+ * @dev: PCI device to enable
+ *
+ * Enable ROM decoding on @dev. This involves simply turning on the last
+ * bit of the PCI ROM BAR. Note that some cards may share address decoders
+ * between the ROM and other resources, so enabling it may disable access
+ * to MMIO registers or other card memory.
+ */
+static void
+pci_enable_rom(struct pci_dev *dev)
+{
+ u32 rom_addr;
+
+ pci_read_config_dword(dev, PCI_ROM_ADDRESS, &rom_addr);
+ rom_addr |= PCI_ROM_ADDRESS_ENABLE;
+ pci_write_config_dword(dev, PCI_ROM_ADDRESS, rom_addr);
+}
+
+/**
+ * pci_disable_rom - disable ROM decoding for a PCI device
+ * @dev: PCI device to disable
+ *
+ * Disable ROM decoding on a PCI device by turning off the last bit in the
+ * ROM BAR.
+ */
+static void
+pci_disable_rom(struct pci_dev *dev)
+{
+ u32 rom_addr;
+
+ pci_read_config_dword(dev, PCI_ROM_ADDRESS, &rom_addr);
+ rom_addr &= ~PCI_ROM_ADDRESS_ENABLE;
+ pci_write_config_dword(dev, PCI_ROM_ADDRESS, rom_addr);
+}
+
+/**
+ * pci_read_rom - read a PCI ROM
+ * @kobj: kernel object handle
+ * @buf: where to put the data we read from the ROM
+ * @off: file offset
+ * @count: number of bytes to read
+ *
+ * Put @count bytes starting at @off into @buf from the ROM in the PCI
+ * device corresponding to @kobj.
+ */
+static ssize_t
+pci_read_rom(struct kobject *kobj, char *buf, loff_t off, size_t count)
+{
+ struct pci_dev *dev = to_pci_dev(container_of(kobj,struct device,kobj));
+ loff_t init_off = off;
+ unsigned long start = pci_resource_start(dev, PCI_ROM_RESOURCE);
+ int size = pci_resource_len(dev, PCI_ROM_RESOURCE);
+ char direct_access = dev->rom_info.rom ? 0 : 1;
+
+ if (off > size)
+ return 0;
+ if (off + count > size) {
+ size -= off;
+ count = size;
+ } else {
+ size = count;
+ }
+
+ /* Enable ROM space decodes and do the reads */
+ if (direct_access)
+ pci_enable_rom(dev);
+
+ while (size > 0) {
+ unsigned char val;
+ if (direct_access)
+ val = readb(start + off);
+ else
+ val = *(dev->rom_info.rom + off);
+ buf[off - init_off] = val;
+ off++;
+ --size;
+ }
+
+ /* Disable again before continuing */
+ if (direct_access)
+ pci_disable_rom(dev);
+
+ return count;
+}
+
static struct bin_attribute pci_config_attr = {
.attr = {
.name = "config",
@@ -186,13 +272,50 @@
.write = pci_write_config,
};
-void pci_create_sysfs_dev_files (struct pci_dev *pdev)
+void pci_create_sysfs_dev_files(struct pci_dev *pdev)
{
if (pdev->cfg_size < 4096)
sysfs_create_bin_file(&pdev->dev.kobj, &pci_config_attr);
else
sysfs_create_bin_file(&pdev->dev.kobj, &pcie_config_attr);
+ /* If the device has a ROM, try to expose it in sysfs. */
+ if (pci_resource_len(pdev, PCI_ROM_RESOURCE)) {
+ struct bin_attribute *rom_attr;
+ rom_attr = kmalloc(sizeof(*rom_attr), GFP_ATOMIC);
+
+ pdev->rom_info.rom_attr = NULL;
+ if (!rom_attr)
+ goto out;
+
+ pdev->rom_info.rom_attr = rom_attr;
+ rom_attr->attr.name = "rom";
+ rom_attr->attr.mode = S_IRUSR;
+ rom_attr->attr.owner = THIS_MODULE;
+ rom_attr->read = pci_read_rom;
+ rom_attr->size = pci_resource_len(pdev, PCI_ROM_RESOURCE);
+ sysfs_create_bin_file(&pdev->dev.kobj, rom_attr);
+ }
+ out:
/* add platform-specific attributes */
pcibios_add_platform_entries(pdev);
+}
+
+/**
+ * pci_remove_sysfs_dev_files - cleanup PCI specific sysfs files
+ * @pdev: device whose entries we should free
+ *
+ * Cleanup when @pdev is removed from sysfs.
+ */
+void pci_remove_sysfs_dev_files(struct pci_dev *pdev)
+{
+ if (pdev->cfg_size < 4096)
+ sysfs_remove_bin_file(&pdev->dev.kobj, &pci_config_attr);
+ else
+ sysfs_remove_bin_file(&pdev->dev.kobj, &pcie_config_attr);
+
+ if (pdev->rom_info.rom_attr) {
+ sysfs_remove_bin_file(&pdev->dev.kobj, pdev->rom_info.rom_attr);
+ kfree(pdev->rom_info.rom_attr);
+ }
}
===== drivers/pci/pci.h 1.12 vs edited =====
--- 1.12/drivers/pci/pci.h 2004-06-04 06:23:04 -07:00
+++ edited/drivers/pci/pci.h 2004-08-02 09:41:02 -07:00
@@ -3,6 +3,7 @@
extern int pci_hotplug (struct device *dev, char **envp, int num_envp,
char *buffer, int buffer_size);
extern void pci_create_sysfs_dev_files(struct pci_dev *pdev);
+extern void pci_remove_sysfs_dev_files(struct pci_dev *pdev);
extern int pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res,
unsigned long size, unsigned long align,
unsigned long min, unsigned int type_mask,
===== drivers/pci/probe.c 1.65 vs edited =====
--- 1.65/drivers/pci/probe.c 2004-05-21 11:45:27 -07:00
+++ edited/drivers/pci/probe.c 2004-08-02 09:43:21 -07:00
@@ -157,6 +157,8 @@
#endif
}
}
+
+ dev->rom_info.rom = NULL;
if (rom) {
dev->rom_base_reg = rom;
res = &dev->resource[PCI_ROM_RESOURCE];
===== drivers/pci/remove.c 1.3 vs edited =====
--- 1.3/drivers/pci/remove.c 2004-02-03 09:17:30 -08:00
+++ edited/drivers/pci/remove.c 2004-08-02 09:41:52 -07:00
@@ -26,6 +26,9 @@
static void pci_destroy_dev(struct pci_dev *dev)
{
pci_proc_detach_device(dev);
+ /* Free the copy of the ROM if we made one */
+ kfree(dev->rom_info.rom);
+ pci_remove_sysfs_dev_files(dev);
device_unregister(&dev->dev);
/* Remove the device from the device lists, and prevent any further
===== include/linux/pci.h 1.130 vs edited =====
--- 1.130/include/linux/pci.h 2004-06-30 11:21:27 -07:00
+++ edited/include/linux/pci.h 2004-08-02 09:32:08 -07:00
@@ -471,6 +471,11 @@
pci_mmap_mem
};
+struct rom_info {
+ char *rom; /* copy of the ROM if necessary */
+ struct bin_attribute *rom_attr;
+};
+
/* This defines the direction arg to the DMA mapping routines. */
#define PCI_DMA_BIDIRECTIONAL 0
#define PCI_DMA_TODEVICE 1
@@ -537,6 +542,7 @@
unsigned int is_busmaster:1; /* device is busmaster */
unsigned int saved_config_space[16]; /* config space saved at suspend time */
+ struct rom_info rom_info; /* How and where to get the ROM info for this device */
#ifdef CONFIG_PCI_NAMES
#define PCI_NAME_SIZE 96
#define PCI_NAME_HALF __stringify(43) /* less than half to handle slop */
next prev parent reply other threads:[~2004-08-02 17:04 UTC|newest]
Thread overview: 110+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-07-30 21:09 [PATCH] add PCI ROMs to sysfs Jesse Barnes
2004-07-30 21:29 ` Greg KH
2004-07-30 21:34 ` Jesse Barnes
2004-07-30 21:39 ` Greg KH
2004-07-30 21:48 ` Jesse Barnes
2004-07-30 22:15 ` Jon Smirl
2004-07-31 15:59 ` Jesse Barnes
2004-08-02 17:02 ` Jesse Barnes [this message]
2004-08-02 17:29 ` Jon Smirl
2004-08-02 21:00 ` Jon Smirl
2004-08-02 21:05 ` Jesse Barnes
2004-08-02 23:32 ` Alan Cox
2004-08-02 23:30 ` Alan Cox
2004-08-03 2:03 ` Jesse Barnes
2004-08-03 2:32 ` Jon Smirl
2004-08-03 17:07 ` Jesse Barnes
2004-08-03 21:19 ` Jon Smirl
2004-08-03 21:28 ` Jesse Barnes
2004-08-03 21:30 ` Jesse Barnes
2004-08-03 21:31 ` Martin Mares
2004-08-03 21:36 ` Jon Smirl
2004-08-03 21:39 ` Martin Mares
2004-08-04 6:00 ` lspci and ROM on bridge, was: " Jon Smirl
2004-08-04 16:04 ` Martin Mares
2004-08-05 5:05 ` Jon Smirl
2004-08-05 5:41 ` Benjamin Herrenschmidt
2004-08-05 11:53 ` Jon Smirl
2004-08-05 15:54 ` Jesse Barnes
2004-08-05 16:25 ` Jesse Barnes
2004-08-05 20:45 ` Jon Smirl
2004-08-05 21:12 ` Jesse Barnes
2004-08-06 21:14 ` Jon Smirl
2004-08-06 22:33 ` Jesse Barnes
2004-08-11 17:04 ` Jesse Barnes
2004-08-11 17:28 ` Greg KH
2004-08-11 18:02 ` Jesse Barnes
2004-08-11 18:12 ` Greg KH
2004-08-12 1:28 ` Marcelo Tosatti
2004-08-12 14:38 ` Jesse Barnes
2004-08-12 17:29 ` Greg KH
2004-08-12 2:25 ` Miles Bader
2004-08-12 4:38 ` Greg KH
2004-08-12 9:18 ` Geert Uytterhoeven
2004-08-12 22:01 ` Matthew Wilcox
2004-08-11 19:24 ` Jon Smirl
2004-08-11 19:44 ` Jesse Barnes
2004-08-11 20:11 ` Alan Cox
2004-08-11 23:31 ` Jon Smirl
2004-08-12 11:51 ` Alan Cox
2004-08-12 20:28 ` Jon Smirl
2004-08-12 0:45 ` Jon Smirl
2004-08-12 4:37 ` Greg KH
2004-08-04 6:08 ` Jon Smirl
2004-08-04 15:56 ` Jesse Barnes
2004-07-30 21:53 ` Jon Smirl
2004-07-31 10:03 ` Vojtech Pavlik
2004-07-31 13:28 ` Jon Smirl
2004-07-31 15:42 ` Greg KH
-- strict thread matches above, loose matches on Subject: below --
2004-08-04 15:57 Petr Vandrovec
2004-08-04 17:06 ` Jesse Barnes
2004-08-05 1:38 ` Jon Smirl
2004-08-11 23:27 Pallipadi, Venkatesh
2004-08-12 0:22 ` Jon Smirl
2004-08-12 2:22 ` Jon Smirl
2004-08-13 18:17 ` Martin Mares
2004-08-14 5:34 ` Jon Smirl
2004-08-14 9:47 ` Martin Mares
2004-08-14 14:17 ` Jon Smirl
2004-08-14 22:10 ` Martin Mares
2004-08-14 23:39 ` Jon Smirl
2004-08-18 18:13 ` Jon Smirl
2004-08-18 18:37 ` Jesse Barnes
2004-08-23 22:51 ` Greg KH
2004-08-25 17:32 ` Jon Smirl
2004-08-25 17:42 ` Greg KH
2004-08-25 18:06 ` Jon Smirl
2004-08-25 18:19 ` Greg KH
2004-08-25 18:45 ` Jon Smirl
2004-08-25 18:55 ` Greg KH
2004-08-25 20:06 ` Jon Smirl
2004-08-26 13:13 ` Matthew Wilcox
2004-08-26 15:40 ` Jon Smirl
2004-08-26 15:58 ` Matthew Wilcox
2004-08-26 19:54 ` Jon Smirl
2004-08-28 16:15 ` Matthew Wilcox
2004-08-28 17:33 ` Jon Smirl
2004-08-28 17:38 ` Jon Smirl
2004-08-27 16:43 ` Matthew Wilcox
2004-08-27 22:29 ` Jon Smirl
2004-08-28 16:35 ` Matthew Wilcox
2004-08-28 21:53 ` Grant Grundler
2004-08-25 18:29 ` Matthew Wilcox
2004-08-19 12:51 ` Alan Cox
2004-08-19 23:00 ` Jon Smirl
2004-08-19 14:01 ` Martin Mares
2004-08-19 23:11 ` Jon Smirl
2004-08-20 10:26 ` Martin Mares
2004-08-25 15:36 ` Matthew Wilcox
2004-08-25 15:50 ` Jon Smirl
2004-08-12 8:39 Thomas Winischhofer
2004-08-29 4:58 Jon Smirl
2004-09-03 1:40 Jon Smirl
2004-09-03 17:27 ` Jesse Barnes
2004-09-03 17:45 ` Jesse Barnes
2004-09-03 18:06 ` Jesse Barnes
2004-09-08 3:15 Jon Smirl
2004-09-08 6:07 ` Greg KH
2004-09-08 23:50 ` Greg KH
2004-10-08 2:20 ` Jon Smirl
2004-11-05 23:06 ` Greg KH
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=200408021002.31117.jbarnes@engr.sgi.com \
--to=jbarnes@engr.sgi.com \
--cc=greg@kroah.com \
--cc=jonsmirl@yahoo.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@atrey.karlin.mff.cuni.cz \
/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.