From: Jesse Barnes <jbarnes@engr.sgi.com>
To: Jon Smirl <jonsmirl@yahoo.com>
Cc: lkml <linux-kernel@vger.kernel.org>
Subject: Re: Exposing ROM's though sysfs
Date: Fri, 30 Jul 2004 10:10:29 -0700 [thread overview]
Message-ID: <200407301010.29807.jbarnes@engr.sgi.com> (raw)
In-Reply-To: <20040730165339.76945.qmail@web14929.mail.yahoo.com>
[-- Attachment #1: Type: text/plain, Size: 1556 bytes --]
On Friday, July 30, 2004 9:53 am, Jon Smirl wrote:
> We talked at OLS about exposing adapter ROMs via sysfs. I have some
> time to work on this but I'm not sure about the right places to hook
> into the kernel.
How about this patch?
> The first problem is recording the boot video device. This is needed
> for laptops that compress their video and system ROMs together into a
> single ROM. When sysfs exposes the ROM for these adapters it needs to
> know the boot video device so that it can return the ROM image at
> C000:0 instead of trying to find an actual ROM. What is the right
> kernel structure for recording the boot video device? Where should this
> code live? It is probably x86 specific but have non-x86 laptops done
> the same trick?
If we have the pci quirks stuff fill in pci_dev->resource[PCI_ROM_RESOURCE]
with the right addresses, we should be ok.
> What about ISA support. Should we make an attempt to return ROM
> contents from ISA cards?
That's probably more trouble than it's worth, but if someone really wants it
they could always code it up.
> Note that not just video cards can have ROMs. Disk adapters commonly
> have them too. We probably want to expose these ROMs too.
>
> Do we want to expose the system ROM via sysfs? Where should it appear?
>
> Some Radeon cards have a bug where they forgot to clear a latch which
> makes the ROMs visible. Where should a fix for things like this go? I
> can put it in the radeon driver but if you try to read the ROM before
> the driver is loaded, the ROM won't be visible.
Jesse
[-- Attachment #2: pci-sysfs-rom.patch --]
[-- Type: text/plain, Size: 2349 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-07-30 10:07:49 -07:00
@@ -164,6 +164,61 @@
return count;
}
+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 = dev->resource[PCI_ROM_RESOURCE].start;
+ int size = dev->resource[PCI_ROM_RESOURCE].end -
+ dev->resource[PCI_ROM_RESOURCE].start;
+
+ if (off > size)
+ return 0;
+ if (off + count > size) {
+ size -= off;
+ count = size;
+ } else {
+ size = count;
+ }
+
+ /* Enable ROM space decodes and do the reads */
+ pci_write_config_dword(dev, 1, PCI_ROM_ADDRESS_ENABLE);
+
+ while (off & 3) {
+ unsigned char val;
+ val = readb(start + off);
+ buf[off - init_off] = val;
+ off++;
+ if (--size == 0)
+ break;
+ }
+
+ while (size > 3) {
+ unsigned int val;
+ val = readl(start + off);
+ buf[off - init_off] = val & 0xff;
+ buf[off - init_off + 1] = (val >> 8) & 0xff;
+ buf[off - init_off + 2] = (val >> 16) & 0xff;
+ buf[off - init_off + 3] = (val >> 24) & 0xff;
+ off += 4;
+ size -= 4;
+ }
+
+ while (size > 0) {
+ unsigned char val;
+ val = readb(start + off);
+ buf[off - init_off] = val;
+ off++;
+ --size;
+ }
+
+ /* Disable again before continuing */
+ pci_write_config_dword(dev, 1, ~PCI_ROM_ADDRESS_ENABLE);
+
+ return count;
+}
+
static struct bin_attribute pci_config_attr = {
.attr = {
.name = "config",
@@ -186,12 +241,28 @@
.write = pci_write_config,
};
+static struct bin_attribute pci_rom_attr = {
+ .attr = {
+ .name = "rom",
+ .mode = S_IRUGO | S_IWUSR,
+ .owner = THIS_MODULE,
+ },
+ .read = pci_read_rom,
+};
+
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, map it */
+ if (pdev->resource[PCI_ROM_RESOURCE].start) {
+ pci_rom_attr.size = pdev->resource[PCI_ROM_RESOURCE].end -
+ pdev->resource[PCI_ROM_RESOURCE].start;
+ sysfs_create_bin_file(&pdev->dev.kobj, &pci_rom_attr);
+ }
/* add platform-specific attributes */
pcibios_add_platform_entries(pdev);
next prev parent reply other threads:[~2004-07-30 17:16 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-07-30 16:53 Exposing ROM's though sysfs Jon Smirl
2004-07-30 17:10 ` Jesse Barnes [this message]
2004-07-30 17:19 ` Jesse Barnes
2004-07-30 17:24 ` Christoph Hellwig
2004-07-30 17:57 ` Jesse Barnes
2004-07-30 18:06 ` Jesse Barnes
2004-07-30 18:12 ` Matthew Wilcox
2004-07-30 18:12 ` Jesse Barnes
2004-07-30 18:20 ` Martin Mares
2004-07-30 18:49 ` Jesse Barnes
2004-07-30 19:55 ` Greg KH
2004-07-30 20:05 ` Jon Smirl
2004-07-30 20:16 ` Jesse Barnes
2004-07-30 20:29 ` Greg KH
2004-07-30 18:59 ` Jon Smirl
2004-07-30 19:04 ` Matthew Wilcox
2004-07-30 19:30 ` Jon Smirl
2004-07-30 19:35 ` Martin Mares
2004-07-30 19:39 ` Jon Smirl
2004-07-30 19:46 ` Martin Mares
2004-07-30 20:03 ` Jon Smirl
2004-07-30 20:10 ` Martin Mares
2004-07-30 20:13 ` Martin Mares
2004-07-30 20:25 ` Jesse Barnes
2004-07-30 20:32 ` Jon Smirl
2004-07-30 20:41 ` Martin Mares
2004-07-30 20:49 ` Jesse Barnes
2004-07-30 20:54 ` Martin Mares
2004-07-30 21:00 ` Jesse Barnes
2004-07-30 21:07 ` Jon Smirl
2004-07-30 21:12 ` Jesse Barnes
2004-07-30 19:47 ` Vojtech Pavlik
2004-07-30 22:18 ` Thomas Bogendoerfer
2004-07-30 22:39 ` Alan Cox
2004-07-30 19:25 ` Jon Smirl
2004-07-30 19:35 ` Vojtech Pavlik
2004-07-30 19:41 ` Jon Smirl
2004-07-30 19:48 ` Vojtech Pavlik
2004-07-30 20:20 ` Jesse Barnes
2004-07-30 22:41 ` Alan Cox
[not found] <1091207136.2762.181.camel@rohan.arnor.net>
2004-07-30 17:24 ` Jon Smirl
2004-07-30 19:14 ` Vojtech Pavlik
2004-07-30 20:26 ` Jesse Barnes
2004-07-30 22:36 ` Alan Cox
2004-08-03 21:41 ` Benjamin Herrenschmidt
2004-08-04 0:55 ` Jesse Barnes
2004-08-04 0:59 ` Benjamin Herrenschmidt
2004-08-04 1:37 ` Jon Smirl
2004-08-04 1:57 ` Benjamin Herrenschmidt
2004-08-04 2:16 ` Jesse Barnes
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=200407301010.29807.jbarnes@engr.sgi.com \
--to=jbarnes@engr.sgi.com \
--cc=jonsmirl@yahoo.com \
--cc=linux-kernel@vger.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 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.