diff options
author | Greg Kroah-Hartman <gregkh@suse.de> | 2006-06-29 16:22:39 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-06-29 16:22:39 -0700 |
commit | 79fb1c201c3f0925d6f12c71ab4bbbe5c3bc72e4 (patch) | |
tree | cecb40cbc9729140cd3ee0304bb3b7083222b4e2 /pci | |
parent | 596689eea70b7fccc51e15c346e720c27aeefcbf (diff) | |
download | patches-79fb1c201c3f0925d6f12c71ab4bbbe5c3bc72e4.tar.gz |
remove some pci patches that should be dropped
Diffstat (limited to 'pci')
4 files changed, 0 insertions, 508 deletions
diff --git a/pci/pci-legacy-i-o-port-free-driver-changes-to-generic-pci-code.patch b/pci/pci-legacy-i-o-port-free-driver-changes-to-generic-pci-code.patch deleted file mode 100644 index c874c0508fbeb..0000000000000 --- a/pci/pci-legacy-i-o-port-free-driver-changes-to-generic-pci-code.patch +++ /dev/null @@ -1,186 +0,0 @@ -From kaneshige.kenji@jp.fujitsu.com Sun Mar 26 21:37:51 2006 -Message-ID: <4427799E.1070902@jp.fujitsu.com> -Date: Mon, 27 Mar 2006 14:35:26 +0900 -From: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> -To: Andrew Morton <akpm@osdl.org> -CC: greg@kroah.com, linux-kernel@vger.kernel.org, linux-pci@atrey.karlin.mff.cuni.cz -Subject: PCI: legacy I/O port free driver - Changes to generic PCI code - -This patch adds the following changes into generic PCI code especially -for PCI legacy free drivers. - - - Moved the following two things from pci_enable_device() into - pci_enable_device_bars(). By this change, we can use - pci_enable_device_bars() to enable only the specific regions. - - o Call pci_fixup_device() on the device - o Set dev->is_enabled - - - Added new field 'bars_enabled' into struct pci_device to - remember which BARs already enabled. This new field is - initialized at pci_enable_device_bars() time and cleared - at pci_disable_device() time. - - - Changed pci_request_regions()/pci_release_regions() to - request/release only the regions which have already been - enabled. - - - Added helper routine pci_select_bars() which makes proper mask - of BARs from the specified resource type. This would be very - helpful for users of pci_enable_device_bars(). - -Signed-off-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/pci/pci-driver.c | 3 ++- - drivers/pci/pci.c | 47 ++++++++++++++++++++++++++++++++++++++++------- - include/linux/pci.h | 2 ++ - 3 files changed, 44 insertions(+), 8 deletions(-) - ---- gregkh-2.6.orig/drivers/pci/pci-driver.c -+++ gregkh-2.6/drivers/pci/pci-driver.c -@@ -318,7 +318,8 @@ static int pci_default_resume(struct pci - pci_restore_state(pci_dev); - /* if the device was enabled before suspend, reenable */ - if (pci_dev->is_enabled) -- retval = pci_enable_device(pci_dev); -+ retval = pci_enable_device_bars(pci_dev, -+ pci_dev->bars_enabled); - /* if the device was busmaster before the suspend, make it busmaster again */ - if (pci_dev->is_busmaster) - pci_set_master(pci_dev); ---- gregkh-2.6.orig/drivers/pci/pci.c -+++ gregkh-2.6/drivers/pci/pci.c -@@ -503,6 +503,9 @@ pci_enable_device_bars(struct pci_dev *d - err = pcibios_enable_device(dev, bars); - if (err < 0) - return err; -+ pci_fixup_device(pci_fixup_enable, dev); -+ dev->is_enabled = 1; -+ dev->bars_enabled = bars; - return 0; - } - -@@ -525,8 +528,6 @@ pci_enable_device(struct pci_dev *dev) - err = pci_enable_device_bars(dev, (1 << PCI_NUM_RESOURCES) - 1); - if (err) - return err; -- pci_fixup_device(pci_fixup_enable, dev); -- dev->is_enabled = 1; - return 0; - } - -@@ -568,6 +569,7 @@ pci_disable_device(struct pci_dev *dev) - - pcibios_disable_device(dev); - dev->is_enabled = 0; -+ dev->bars_enabled = 0; - } - - /** -@@ -650,6 +652,12 @@ void pci_release_region(struct pci_dev * - { - if (pci_resource_len(pdev, bar) == 0) - return; -+ if (!(pdev->bars_enabled & (1 << bar))) { -+ dev_warn(&pdev->dev, -+ "Trying to release region #%d that is not enabled\n", -+ bar + 1); -+ return; -+ } - if (pci_resource_flags(pdev, bar) & IORESOURCE_IO) - release_region(pci_resource_start(pdev, bar), - pci_resource_len(pdev, bar)); -@@ -676,7 +684,12 @@ int pci_request_region(struct pci_dev *p - { - if (pci_resource_len(pdev, bar) == 0) - return 0; -- -+ if (!(pdev->bars_enabled & (1 << bar))) { -+ dev_warn(&pdev->dev, -+ "Trying to request region #%d that is not enabled\n", -+ bar + 1); -+ goto err_out; -+ } - if (pci_resource_flags(pdev, bar) & IORESOURCE_IO) { - if (!request_region(pci_resource_start(pdev, bar), - pci_resource_len(pdev, bar), res_name)) -@@ -716,7 +729,8 @@ void pci_release_regions(struct pci_dev - int i; - - for (i = 0; i < 6; i++) -- pci_release_region(pdev, i); -+ if (pdev->bars_enabled & (1 << i)) -+ pci_release_region(pdev, i); - } - - /** -@@ -737,13 +751,15 @@ int pci_request_regions(struct pci_dev * - int i; - - for (i = 0; i < 6; i++) -- if(pci_request_region(pdev, i, res_name)) -- goto err_out; -+ if (pdev->bars_enabled & (1 << i)) -+ if(pci_request_region(pdev, i, res_name)) -+ goto err_out; - return 0; - - err_out: - while(--i >= 0) -- pci_release_region(pdev, i); -+ if (pdev->bars_enabled & (1 << i)) -+ pci_release_region(pdev, i); - - return -EBUSY; - } -@@ -918,6 +934,22 @@ pci_set_consistent_dma_mask(struct pci_d - } - #endif - -+/** -+ * pci_select_bars - Make BAR mask from the type of resource -+ * @pdev: the PCI device for which BAR mask is made -+ * @flags: resource type mask to be selected -+ * -+ * This helper routine makes bar mask from the type of resource. -+ */ -+int pci_select_bars(struct pci_dev *dev, unsigned long flags) -+{ -+ int i, bars = 0; -+ for (i = 0; i < PCI_NUM_RESOURCES; i++) -+ if (pci_resource_flags(dev, i) & flags) -+ bars |= (1 << i); -+ return bars; -+} -+ - static int __devinit pci_init(void) - { - struct pci_dev *dev = NULL; -@@ -975,6 +1007,7 @@ EXPORT_SYMBOL(pci_set_dma_mask); - EXPORT_SYMBOL(pci_set_consistent_dma_mask); - EXPORT_SYMBOL(pci_assign_resource); - EXPORT_SYMBOL(pci_find_parent_resource); -+EXPORT_SYMBOL(pci_select_bars); - - EXPORT_SYMBOL(pci_set_power_state); - EXPORT_SYMBOL(pci_save_state); ---- gregkh-2.6.orig/include/linux/pci.h -+++ gregkh-2.6/include/linux/pci.h -@@ -171,6 +171,7 @@ struct pci_dev { - struct bin_attribute *rom_attr; /* attribute descriptor for sysfs ROM entry */ - int rom_attr_enabled; /* has display of the rom attribute been enabled? */ - struct bin_attribute *res_attr[DEVICE_COUNT_RESOURCE]; /* sysfs file for resources */ -+ int bars_enabled; /* BARs enabled */ - }; - - #define pci_dev_g(n) list_entry(n, struct pci_dev, global_list) -@@ -504,6 +505,7 @@ void pci_update_resource(struct pci_dev - int pci_assign_resource(struct pci_dev *dev, int i); - int pci_assign_resource_fixed(struct pci_dev *dev, int i); - void pci_restore_bars(struct pci_dev *dev); -+int pci_select_bars(struct pci_dev *dev, unsigned long flags); - - /* ROM control related routines */ - void __iomem __must_check *pci_map_rom(struct pci_dev *pdev, size_t *size); diff --git a/pci/pci-legacy-i-o-port-free-driver-make-emulex-lpfc-driver-legacy-i-o-port-free.patch b/pci/pci-legacy-i-o-port-free-driver-make-emulex-lpfc-driver-legacy-i-o-port-free.patch deleted file mode 100644 index 2cfd19873f175..0000000000000 --- a/pci/pci-legacy-i-o-port-free-driver-make-emulex-lpfc-driver-legacy-i-o-port-free.patch +++ /dev/null @@ -1,30 +0,0 @@ -From kaneshige.kenji@jp.fujitsu.com Thu Mar 23 21:43:15 2006 -Message-ID: <44238546.6080401@jp.fujitsu.com> -Date: Fri, 24 Mar 2006 14:36:06 +0900 -From: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> -To: Greg KH <greg@kroah.com> -CC: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>, Andrew Morton <akpm@osdl.org> -Subject: PCI: legacy I/O port free driver - Make Emulex lpfc driver legacy I/O port free - -This patch makes Emulex lpfc driver legacy I/O port free. - -Signed-off-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/scsi/lpfc/lpfc_init.c | 3 ++- - 1 file changed, 2 insertions(+), 1 deletion(-) - ---- gregkh-2.6.orig/drivers/scsi/lpfc/lpfc_init.c -+++ gregkh-2.6/drivers/scsi/lpfc/lpfc_init.c -@@ -1425,8 +1425,9 @@ lpfc_pci_probe_one(struct pci_dev *pdev, - int error = -ENODEV, retval; - int i; - uint16_t iotag; -+ int bars = pci_select_bars(pdev, IORESOURCE_MEM); - -- if (pci_enable_device(pdev)) -+ if (pci_enable_device_bars(pdev, bars)) - goto out; - if (pci_request_regions(pdev, LPFC_DRIVER_NAME)) - goto out_disable_device; diff --git a/pci/pci-legacy-i-o-port-free-driver-make-intel-e1000-driver-legacy-i-o-port-free.patch b/pci/pci-legacy-i-o-port-free-driver-make-intel-e1000-driver-legacy-i-o-port-free.patch deleted file mode 100644 index 9fcaaa21b6b12..0000000000000 --- a/pci/pci-legacy-i-o-port-free-driver-make-intel-e1000-driver-legacy-i-o-port-free.patch +++ /dev/null @@ -1,200 +0,0 @@ -From kaneshige.kenji@jp.fujitsu.com Thu Mar 23 21:41:53 2006 -Message-ID: <442384EA.60606@jp.fujitsu.com> -Date: Fri, 24 Mar 2006 14:34:34 +0900 -From: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> -To: Greg KH <greg@kroah.com> -CC: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>, Andrew Morton <akpm@osdl.org> -Subject: PCI: legacy I/O port free driver - Make Intel e1000 driver legacy I/O port free - -This patch makes Intel e1000 driver legacy I/O port free. - -Signed-off-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - drivers/net/e1000/e1000.h | 6 +- - drivers/net/e1000/e1000_main.c | 123 ++++++++++++++++++++++------------------- - 2 files changed, 71 insertions(+), 58 deletions(-) - ---- gregkh-2.6.orig/drivers/net/e1000/e1000.h -+++ gregkh-2.6/drivers/net/e1000/e1000.h -@@ -78,8 +78,9 @@ - #define BAR_1 1 - #define BAR_5 5 - --#define INTEL_E1000_ETHERNET_DEVICE(device_id) {\ -- PCI_DEVICE(PCI_VENDOR_ID_INTEL, device_id)} -+#define E1000_NO_IOPORT (1 << 0) -+#define INTEL_E1000_ETHERNET_DEVICE(device_id, flags) {\ -+ PCI_DEVICE(PCI_VENDOR_ID_INTEL, device_id), .driver_data = flags} - - struct e1000_adapter; - -@@ -340,6 +341,7 @@ struct e1000_adapter { - #ifdef NETIF_F_TSO - boolean_t tso_force; - #endif -+ int bars; /* BARs to be enabled */ - }; - - ---- gregkh-2.6.orig/drivers/net/e1000/e1000_main.c -+++ gregkh-2.6/drivers/net/e1000/e1000_main.c -@@ -48,54 +48,54 @@ static char e1000_copyright[] = "Copyrig - * {PCI_DEVICE(PCI_VENDOR_ID_INTEL, device_id)} - */ - static struct pci_device_id e1000_pci_tbl[] = { -- INTEL_E1000_ETHERNET_DEVICE(0x1000), -- INTEL_E1000_ETHERNET_DEVICE(0x1001), -- INTEL_E1000_ETHERNET_DEVICE(0x1004), -- INTEL_E1000_ETHERNET_DEVICE(0x1008), -- INTEL_E1000_ETHERNET_DEVICE(0x1009), -- INTEL_E1000_ETHERNET_DEVICE(0x100C), -- INTEL_E1000_ETHERNET_DEVICE(0x100D), -- INTEL_E1000_ETHERNET_DEVICE(0x100E), -- INTEL_E1000_ETHERNET_DEVICE(0x100F), -- INTEL_E1000_ETHERNET_DEVICE(0x1010), -- INTEL_E1000_ETHERNET_DEVICE(0x1011), -- INTEL_E1000_ETHERNET_DEVICE(0x1012), -- INTEL_E1000_ETHERNET_DEVICE(0x1013), -- INTEL_E1000_ETHERNET_DEVICE(0x1014), -- INTEL_E1000_ETHERNET_DEVICE(0x1015), -- INTEL_E1000_ETHERNET_DEVICE(0x1016), -- INTEL_E1000_ETHERNET_DEVICE(0x1017), -- INTEL_E1000_ETHERNET_DEVICE(0x1018), -- INTEL_E1000_ETHERNET_DEVICE(0x1019), -- INTEL_E1000_ETHERNET_DEVICE(0x101A), -- INTEL_E1000_ETHERNET_DEVICE(0x101D), -- INTEL_E1000_ETHERNET_DEVICE(0x101E), -- INTEL_E1000_ETHERNET_DEVICE(0x1026), -- INTEL_E1000_ETHERNET_DEVICE(0x1027), -- INTEL_E1000_ETHERNET_DEVICE(0x1028), -- INTEL_E1000_ETHERNET_DEVICE(0x105E), -- INTEL_E1000_ETHERNET_DEVICE(0x105F), -- INTEL_E1000_ETHERNET_DEVICE(0x1060), -- INTEL_E1000_ETHERNET_DEVICE(0x1075), -- INTEL_E1000_ETHERNET_DEVICE(0x1076), -- INTEL_E1000_ETHERNET_DEVICE(0x1077), -- INTEL_E1000_ETHERNET_DEVICE(0x1078), -- INTEL_E1000_ETHERNET_DEVICE(0x1079), -- INTEL_E1000_ETHERNET_DEVICE(0x107A), -- INTEL_E1000_ETHERNET_DEVICE(0x107B), -- INTEL_E1000_ETHERNET_DEVICE(0x107C), -- INTEL_E1000_ETHERNET_DEVICE(0x107D), -- INTEL_E1000_ETHERNET_DEVICE(0x107E), -- INTEL_E1000_ETHERNET_DEVICE(0x107F), -- INTEL_E1000_ETHERNET_DEVICE(0x108A), -- INTEL_E1000_ETHERNET_DEVICE(0x108B), -- INTEL_E1000_ETHERNET_DEVICE(0x108C), -- INTEL_E1000_ETHERNET_DEVICE(0x1096), -- INTEL_E1000_ETHERNET_DEVICE(0x1098), -- INTEL_E1000_ETHERNET_DEVICE(0x1099), -- INTEL_E1000_ETHERNET_DEVICE(0x109A), -- INTEL_E1000_ETHERNET_DEVICE(0x10B5), -- INTEL_E1000_ETHERNET_DEVICE(0x10B9), -+ INTEL_E1000_ETHERNET_DEVICE(0x1000, E1000_NO_IOPORT), -+ INTEL_E1000_ETHERNET_DEVICE(0x1001, E1000_NO_IOPORT), -+ INTEL_E1000_ETHERNET_DEVICE(0x1004, E1000_NO_IOPORT), -+ INTEL_E1000_ETHERNET_DEVICE(0x1008, 0), -+ INTEL_E1000_ETHERNET_DEVICE(0x1009, 0), -+ INTEL_E1000_ETHERNET_DEVICE(0x100C, 0), -+ INTEL_E1000_ETHERNET_DEVICE(0x100D, 0), -+ INTEL_E1000_ETHERNET_DEVICE(0x100E, 0), -+ INTEL_E1000_ETHERNET_DEVICE(0x100F, 0), -+ INTEL_E1000_ETHERNET_DEVICE(0x1010, 0), -+ INTEL_E1000_ETHERNET_DEVICE(0x1011, 0), -+ INTEL_E1000_ETHERNET_DEVICE(0x1012, 0), -+ INTEL_E1000_ETHERNET_DEVICE(0x1013, 0), -+ INTEL_E1000_ETHERNET_DEVICE(0x1014, E1000_NO_IOPORT), -+ INTEL_E1000_ETHERNET_DEVICE(0x1015, 0), -+ INTEL_E1000_ETHERNET_DEVICE(0x1016, 0), -+ INTEL_E1000_ETHERNET_DEVICE(0x1017, 0), -+ INTEL_E1000_ETHERNET_DEVICE(0x1018, 0), -+ INTEL_E1000_ETHERNET_DEVICE(0x1019, E1000_NO_IOPORT), -+ INTEL_E1000_ETHERNET_DEVICE(0x101A, E1000_NO_IOPORT), -+ INTEL_E1000_ETHERNET_DEVICE(0x101D, 0), -+ INTEL_E1000_ETHERNET_DEVICE(0x101E, 0), -+ INTEL_E1000_ETHERNET_DEVICE(0x1026, E1000_NO_IOPORT), -+ INTEL_E1000_ETHERNET_DEVICE(0x1027, E1000_NO_IOPORT), -+ INTEL_E1000_ETHERNET_DEVICE(0x1028, E1000_NO_IOPORT), -+ INTEL_E1000_ETHERNET_DEVICE(0x105E, E1000_NO_IOPORT), -+ INTEL_E1000_ETHERNET_DEVICE(0x105F, E1000_NO_IOPORT), -+ INTEL_E1000_ETHERNET_DEVICE(0x1060, E1000_NO_IOPORT), -+ INTEL_E1000_ETHERNET_DEVICE(0x1075, E1000_NO_IOPORT), -+ INTEL_E1000_ETHERNET_DEVICE(0x1076, 0), -+ INTEL_E1000_ETHERNET_DEVICE(0x1077, 0), -+ INTEL_E1000_ETHERNET_DEVICE(0x1078, 0), -+ INTEL_E1000_ETHERNET_DEVICE(0x1079, E1000_NO_IOPORT), -+ INTEL_E1000_ETHERNET_DEVICE(0x107A, E1000_NO_IOPORT), -+ INTEL_E1000_ETHERNET_DEVICE(0x107B, E1000_NO_IOPORT), -+ INTEL_E1000_ETHERNET_DEVICE(0x107C, 0), -+ INTEL_E1000_ETHERNET_DEVICE(0x107D, E1000_NO_IOPORT), -+ INTEL_E1000_ETHERNET_DEVICE(0x107E, E1000_NO_IOPORT), -+ INTEL_E1000_ETHERNET_DEVICE(0x107F, E1000_NO_IOPORT), -+ INTEL_E1000_ETHERNET_DEVICE(0x108A, E1000_NO_IOPORT), -+ INTEL_E1000_ETHERNET_DEVICE(0x108B, E1000_NO_IOPORT), -+ INTEL_E1000_ETHERNET_DEVICE(0x108C, E1000_NO_IOPORT), -+ INTEL_E1000_ETHERNET_DEVICE(0x1096, 0), -+ INTEL_E1000_ETHERNET_DEVICE(0x1098, 0), -+ INTEL_E1000_ETHERNET_DEVICE(0x1099, E1000_NO_IOPORT), -+ INTEL_E1000_ETHERNET_DEVICE(0x109A, E1000_NO_IOPORT), -+ INTEL_E1000_ETHERNET_DEVICE(0x10B5, E1000_NO_IOPORT), -+ INTEL_E1000_ETHERNET_DEVICE(0x10B9, 0), - /* required last entry */ - {0,} - }; -@@ -596,7 +596,14 @@ e1000_probe(struct pci_dev *pdev, - int i, err, pci_using_dac; - uint16_t eeprom_data; - uint16_t eeprom_apme_mask = E1000_EEPROM_APME; -- if ((err = pci_enable_device(pdev))) -+ int bars; -+ -+ if (ent->driver_data & E1000_NO_IOPORT) -+ bars = pci_select_bars(pdev, IORESOURCE_MEM); -+ else -+ bars = pci_select_bars(pdev, IORESOURCE_MEM | IORESOURCE_IO); -+ -+ if ((err = pci_enable_device_bars(pdev, bars))) - return err; - - if (!(err = pci_set_dma_mask(pdev, DMA_64BIT_MASK))) { -@@ -629,6 +636,7 @@ e1000_probe(struct pci_dev *pdev, - adapter->pdev = pdev; - adapter->hw.back = adapter; - adapter->msg_enable = (1 << debug) - 1; -+ adapter->bars = bars; - - mmio_start = pci_resource_start(pdev, BAR_0); - mmio_len = pci_resource_len(pdev, BAR_0); -@@ -639,12 +647,15 @@ e1000_probe(struct pci_dev *pdev, - goto err_ioremap; - } - -- for (i = BAR_1; i <= BAR_5; i++) { -- if (pci_resource_len(pdev, i) == 0) -- continue; -- if (pci_resource_flags(pdev, i) & IORESOURCE_IO) { -- adapter->hw.io_base = pci_resource_start(pdev, i); -- break; -+ if (!(ent->driver_data & E1000_NO_IOPORT)) { -+ for (i = BAR_1; i <= BAR_5; i++) { -+ if (pci_resource_len(pdev, i) == 0) -+ continue; -+ if (pci_resource_flags(pdev, i) & IORESOURCE_IO) { -+ adapter->hw.io_base = -+ pci_resource_start(pdev, i); -+ break; -+ } - } - } - -@@ -4553,7 +4564,7 @@ e1000_resume(struct pci_dev *pdev) - - pci_set_power_state(pdev, PCI_D0); - e1000_pci_restore_state(adapter); -- ret_val = pci_enable_device(pdev); -+ ret_val = pci_enable_device_bars(pdev, adapter->bars); - pci_set_master(pdev); - - pci_enable_wake(pdev, PCI_D3hot, 0); diff --git a/pci/pci-legacy-i-o-port-free-driver-update-documentation-pci_txt.patch b/pci/pci-legacy-i-o-port-free-driver-update-documentation-pci_txt.patch deleted file mode 100644 index 1022f045a9966..0000000000000 --- a/pci/pci-legacy-i-o-port-free-driver-update-documentation-pci_txt.patch +++ /dev/null @@ -1,92 +0,0 @@ -From kaneshige.kenji@jp.fujitsu.com Thu Mar 23 21:39:19 2006 -Message-ID: <44238469.8080009@jp.fujitsu.com> -Date: Fri, 24 Mar 2006 14:32:25 +0900 -From: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> -To: Greg KH <greg@kroah.com> -CC: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com>, Andrew Morton <akpm@osdl.org> -Subject: PCI: legacy I/O port free driver - Update Documentation/pci.txt - -This patch adds the description about legacy I/O port free driver into -Documentation/pci.txt. - -Signed-off-by: Kenji Kaneshige <kaneshige.kenji@jp.fujitsu.com> -Signed-off-by: Grant Grundler <grundler@parisc-linux.org> -Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> - ---- - Documentation/pci.txt | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++ - 1 file changed, 67 insertions(+) - ---- gregkh-2.6.orig/Documentation/pci.txt -+++ gregkh-2.6/Documentation/pci.txt -@@ -287,3 +287,70 @@ having sane locking. - pci_find_device() Superseded by pci_get_device() - pci_find_subsys() Superseded by pci_get_subsys() - pci_find_slot() Superseded by pci_get_slot() -+ -+ -+9. Legacy I/O port free driver -+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+Large servers may not be able to provide I/O port resources to all PCI -+devices. I/O Port space is only 64KB on Intel Architecture[1] and is -+likely also fragmented since the I/O base register of PCI-to-PCI -+bridge will usually be aligned to a 4KB boundary[2]. On such systems, -+pci_enable_device() and pci_request_regions() will fail when -+attempting to enable I/O Port regions that don't have I/O Port -+resources assigned. -+ -+Fortunately, many PCI devices which request I/O Port resources also -+provide access to the same registers via MMIO BARs. These devices can -+be handled without using I/O port space and the drivers typically -+offer a CONFIG_ option to only use MMIO regions -+(e.g. CONFIG_TULIP_MMIO). PCI devices typically provide I/O port -+interface for legacy OSs and will work when I/O port resources are not -+assigned. The "PCI Local Bus Specification Revision 3.0" discusses -+this on p.44, "IMPLEMENTATION NOTE". -+ -+If your PCI device driver doesn't need I/O port resources assigned to -+I/O Port BARs, you should use pci_enable_device_bars() instead of -+pci_enable_device() in order not to enable I/O port regions for the -+corresponding devices. -+ -+[1] Some systems support 64KB I/O port space per PCI segment. -+[2] Some PCI-to-PCI bridges support optional 1KB aligned I/O base. -+ -+ -+10. MMIO Space and "Write Posting" -+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -+Converting a driver from using I/O Port space to using MMIO space -+often requires some additional changes. Specifically, "write posting" -+needs to be handled. Most drivers (e.g. tg3, acenic, sym53c8xx_2) -+already do. I/O Port space guarantees write transactions reach the PCI -+device before the CPU can continue. Writes to MMIO space allow to CPU -+continue before the transaction reaches the PCI device. HW weenies -+call this "Write Posting" because the write completion is "posted" to -+the CPU before the transaction has reached it's destination. -+ -+Thus, timing sensitive code should add readl() where the CPU is -+expected to wait before doing other work. The classic "bit banging" -+sequence works fine for I/O Port space: -+ -+ for (i=8; --i; val >>= 1) { -+ outb(val & 1, ioport_reg); /* write bit */ -+ udelay(10); -+ } -+ -+The same sequence for MMIO space should be: -+ -+ for (i=8; --i; val >>= 1) { -+ writeb(val & 1, mmio_reg); /* write bit */ -+ readb(safe_mmio_reg); /* flush posted write */ -+ udelay(10); -+ } -+ -+It is important that "safe_mmio_reg" not have any side effects that -+interferes with the correct operation of the device. -+ -+Another case to watch out for is when resetting a PCI device. Use PCI -+Configuration space reads to flush the writel(). This will gracefully -+handle the PCI master abort on all platforms if the PCI device is -+expected to not respond to a readl(). Most x86 platforms will allow -+MMIO reads to master abort (aka "Soft Fail") and return garbage -+(e.g. ~0). But many RISC platforms will crash (aka "Hard Fail"). |