diff options
-rw-r--r-- | Documentation/filesystems/sysfs-pci.txt | 13 | ||||
-rw-r--r-- | arch/ia64/sn/kernel/io_acpi_init.c | 2 | ||||
-rw-r--r-- | arch/ia64/sn/kernel/io_init.c | 2 | ||||
-rw-r--r-- | drivers/pci/pci-sysfs.c | 4 | ||||
-rw-r--r-- | drivers/pci/rom.c | 8 | ||||
-rw-r--r-- | include/linux/pci.h | 2 |
6 files changed, 22 insertions, 9 deletions
diff --git a/Documentation/filesystems/sysfs-pci.txt b/Documentation/filesystems/sysfs-pci.txt index 68ef48839c04..9f8740ca3f3b 100644 --- a/Documentation/filesystems/sysfs-pci.txt +++ b/Documentation/filesystems/sysfs-pci.txt | |||
@@ -9,6 +9,7 @@ that support it. For example, a given bus might look like this: | |||
9 | | |-- class | 9 | | |-- class |
10 | | |-- config | 10 | | |-- config |
11 | | |-- device | 11 | | |-- device |
12 | | |-- enable | ||
12 | | |-- irq | 13 | | |-- irq |
13 | | |-- local_cpus | 14 | | |-- local_cpus |
14 | | |-- resource | 15 | | |-- resource |
@@ -32,6 +33,7 @@ files, each with their own function. | |||
32 | class PCI class (ascii, ro) | 33 | class PCI class (ascii, ro) |
33 | config PCI config space (binary, rw) | 34 | config PCI config space (binary, rw) |
34 | device PCI device (ascii, ro) | 35 | device PCI device (ascii, ro) |
36 | enable Whether the device is enabled (ascii, rw) | ||
35 | irq IRQ number (ascii, ro) | 37 | irq IRQ number (ascii, ro) |
36 | local_cpus nearby CPU mask (cpumask, ro) | 38 | local_cpus nearby CPU mask (cpumask, ro) |
37 | resource PCI resource host addresses (ascii, ro) | 39 | resource PCI resource host addresses (ascii, ro) |
@@ -57,10 +59,19 @@ used to do actual device programming from userspace. Note that some platforms | |||
57 | don't support mmapping of certain resources, so be sure to check the return | 59 | don't support mmapping of certain resources, so be sure to check the return |
58 | value from any attempted mmap. | 60 | value from any attempted mmap. |
59 | 61 | ||
62 | The 'enable' file provides a counter that indicates how many times the device | ||
63 | has been enabled. If the 'enable' file currently returns '4', and a '1' is | ||
64 | echoed into it, it will then return '5'. Echoing a '0' into it will decrease | ||
65 | the count. Even when it returns to 0, though, some of the initialisation | ||
66 | may not be reversed. | ||
67 | |||
60 | The 'rom' file is special in that it provides read-only access to the device's | 68 | The 'rom' file is special in that it provides read-only access to the device's |
61 | ROM file, if available. It's disabled by default, however, so applications | 69 | ROM file, if available. It's disabled by default, however, so applications |
62 | should write the string "1" to the file to enable it before attempting a read | 70 | should write the string "1" to the file to enable it before attempting a read |
63 | call, and disable it following the access by writing "0" to the file. | 71 | call, and disable it following the access by writing "0" to the file. Note |
72 | that the device must be enabled for a rom read to return data succesfully. | ||
73 | In the event a driver is not bound to the device, it can be enabled using the | ||
74 | 'enable' file, documented above. | ||
64 | 75 | ||
65 | Accessing legacy resources through sysfs | 76 | Accessing legacy resources through sysfs |
66 | ---------------------------------------- | 77 | ---------------------------------------- |
diff --git a/arch/ia64/sn/kernel/io_acpi_init.c b/arch/ia64/sn/kernel/io_acpi_init.c index c5a214026a77..d0223abbbbd4 100644 --- a/arch/ia64/sn/kernel/io_acpi_init.c +++ b/arch/ia64/sn/kernel/io_acpi_init.c | |||
@@ -443,7 +443,7 @@ sn_acpi_slot_fixup(struct pci_dev *dev) | |||
443 | size = pci_resource_len(dev, PCI_ROM_RESOURCE); | 443 | size = pci_resource_len(dev, PCI_ROM_RESOURCE); |
444 | addr = ioremap(pcidev_info->pdi_pio_mapped_addr[PCI_ROM_RESOURCE], | 444 | addr = ioremap(pcidev_info->pdi_pio_mapped_addr[PCI_ROM_RESOURCE], |
445 | size); | 445 | size); |
446 | image_size = pci_get_rom_size(addr, size); | 446 | image_size = pci_get_rom_size(dev, addr, size); |
447 | dev->resource[PCI_ROM_RESOURCE].start = (unsigned long) addr; | 447 | dev->resource[PCI_ROM_RESOURCE].start = (unsigned long) addr; |
448 | dev->resource[PCI_ROM_RESOURCE].end = | 448 | dev->resource[PCI_ROM_RESOURCE].end = |
449 | (unsigned long) addr + image_size - 1; | 449 | (unsigned long) addr + image_size - 1; |
diff --git a/arch/ia64/sn/kernel/io_init.c b/arch/ia64/sn/kernel/io_init.c index 4e1801bad83a..e2eb2da60f96 100644 --- a/arch/ia64/sn/kernel/io_init.c +++ b/arch/ia64/sn/kernel/io_init.c | |||
@@ -269,7 +269,7 @@ sn_io_slot_fixup(struct pci_dev *dev) | |||
269 | 269 | ||
270 | rom = ioremap(pci_resource_start(dev, PCI_ROM_RESOURCE), | 270 | rom = ioremap(pci_resource_start(dev, PCI_ROM_RESOURCE), |
271 | size + 1); | 271 | size + 1); |
272 | image_size = pci_get_rom_size(rom, size + 1); | 272 | image_size = pci_get_rom_size(dev, rom, size + 1); |
273 | dev->resource[PCI_ROM_RESOURCE].end = | 273 | dev->resource[PCI_ROM_RESOURCE].end = |
274 | dev->resource[PCI_ROM_RESOURCE].start + | 274 | dev->resource[PCI_ROM_RESOURCE].start + |
275 | image_size - 1; | 275 | image_size - 1; |
diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c index db7ec14fa719..dfc4e0ddf241 100644 --- a/drivers/pci/pci-sysfs.c +++ b/drivers/pci/pci-sysfs.c | |||
@@ -768,8 +768,8 @@ pci_read_rom(struct kobject *kobj, struct bin_attribute *bin_attr, | |||
768 | return -EINVAL; | 768 | return -EINVAL; |
769 | 769 | ||
770 | rom = pci_map_rom(pdev, &size); /* size starts out as PCI window size */ | 770 | rom = pci_map_rom(pdev, &size); /* size starts out as PCI window size */ |
771 | if (!rom) | 771 | if (!rom || !size) |
772 | return 0; | 772 | return -EIO; |
773 | 773 | ||
774 | if (off >= size) | 774 | if (off >= size) |
775 | count = 0; | 775 | count = 0; |
diff --git a/drivers/pci/rom.c b/drivers/pci/rom.c index 132a78159b60..29cbe47f219f 100644 --- a/drivers/pci/rom.c +++ b/drivers/pci/rom.c | |||
@@ -63,7 +63,7 @@ void pci_disable_rom(struct pci_dev *pdev) | |||
63 | * The PCI window size could be much larger than the | 63 | * The PCI window size could be much larger than the |
64 | * actual image size. | 64 | * actual image size. |
65 | */ | 65 | */ |
66 | size_t pci_get_rom_size(void __iomem *rom, size_t size) | 66 | size_t pci_get_rom_size(struct pci_dev *pdev, void __iomem *rom, size_t size) |
67 | { | 67 | { |
68 | void __iomem *image; | 68 | void __iomem *image; |
69 | int last_image; | 69 | int last_image; |
@@ -72,8 +72,10 @@ size_t pci_get_rom_size(void __iomem *rom, size_t size) | |||
72 | do { | 72 | do { |
73 | void __iomem *pds; | 73 | void __iomem *pds; |
74 | /* Standard PCI ROMs start out with these bytes 55 AA */ | 74 | /* Standard PCI ROMs start out with these bytes 55 AA */ |
75 | if (readb(image) != 0x55) | 75 | if (readb(image) != 0x55) { |
76 | dev_err(&pdev->dev, "Invalid ROM contents\n"); | ||
76 | break; | 77 | break; |
78 | } | ||
77 | if (readb(image + 1) != 0xAA) | 79 | if (readb(image + 1) != 0xAA) |
78 | break; | 80 | break; |
79 | /* get the PCI data structure and check its signature */ | 81 | /* get the PCI data structure and check its signature */ |
@@ -159,7 +161,7 @@ void __iomem *pci_map_rom(struct pci_dev *pdev, size_t *size) | |||
159 | * size is much larger than the actual size of the ROM. | 161 | * size is much larger than the actual size of the ROM. |
160 | * True size is important if the ROM is going to be copied. | 162 | * True size is important if the ROM is going to be copied. |
161 | */ | 163 | */ |
162 | *size = pci_get_rom_size(rom, *size); | 164 | *size = pci_get_rom_size(pdev, rom, *size); |
163 | return rom; | 165 | return rom; |
164 | } | 166 | } |
165 | 167 | ||
diff --git a/include/linux/pci.h b/include/linux/pci.h index 48890cf3f96e..7bd624bfdcfd 100644 --- a/include/linux/pci.h +++ b/include/linux/pci.h | |||
@@ -684,7 +684,7 @@ int pci_enable_rom(struct pci_dev *pdev); | |||
684 | void pci_disable_rom(struct pci_dev *pdev); | 684 | void pci_disable_rom(struct pci_dev *pdev); |
685 | void __iomem __must_check *pci_map_rom(struct pci_dev *pdev, size_t *size); | 685 | void __iomem __must_check *pci_map_rom(struct pci_dev *pdev, size_t *size); |
686 | void pci_unmap_rom(struct pci_dev *pdev, void __iomem *rom); | 686 | void pci_unmap_rom(struct pci_dev *pdev, void __iomem *rom); |
687 | size_t pci_get_rom_size(void __iomem *rom, size_t size); | 687 | size_t pci_get_rom_size(struct pci_dev *pdev, void __iomem *rom, size_t size); |
688 | 688 | ||
689 | /* Power management related routines */ | 689 | /* Power management related routines */ |
690 | int pci_save_state(struct pci_dev *dev); | 690 | int pci_save_state(struct pci_dev *dev); |