[PATCH 7/8] x86, pci: convert SETUP_PCI data to list

2015-02-28 Thread Yinghai Lu
So we could avoid ioremap every time later.

Cc: Bjorn Helgaas 
Cc: linux-...@vger.kernel.org
Signed-off-by: Yinghai Lu 
---
 arch/x86/pci/common.c | 77 +--
 1 file changed, 63 insertions(+), 14 deletions(-)

diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c
index 4846db7..7b6fb94 100644
--- a/arch/x86/pci/common.c
+++ b/arch/x86/pci/common.c
@@ -680,10 +680,41 @@ void __init add_pci(u64 pa_data)
early_memunmap(data, sizeof(*data));
 }
 
-int pcibios_add_device(struct pci_dev *dev)
+struct firmware_setup_pci_entry {
+   struct list_head list;
+   uint16_t vendor;
+   uint16_t devid;
+   uint64_t pcilen;
+   unsigned long segment;
+   unsigned long bus;
+   unsigned long device;
+   unsigned long function;
+   phys_addr_t rom;
+};
+
+static LIST_HEAD(setup_pci_entries);
+
+static void __init firmware_setup_pci_add_entry(struct pci_setup_rom *rom,
+   u64 pa_data,
+   struct firmware_setup_pci_entry *entry)
+{
+   entry->segment = rom->segment;
+   entry->bus = rom->bus;
+   entry->device = rom->device;
+   entry->function = rom->function;
+   entry->vendor = rom->vendor;
+   entry->devid = rom->devid;
+   entry->rom = pa_data + offsetof(struct pci_setup_rom, romdata);
+   entry->pcilen = rom->pcilen;
+
+   list_add(>list, _pci_entries);
+}
+
+static __init int fill_setup_pci_entries(void)
 {
struct setup_data *data;
struct pci_setup_rom *rom;
+   struct firmware_setup_pci_entry *entry;
u64 pa_data;
 
pa_data = pci_setup_data;
@@ -692,24 +723,42 @@ int pcibios_add_device(struct pci_dev *dev)
if (!data)
return -ENOMEM;
 
-   rom = (struct pci_setup_rom *)data;
-
-   if ((pci_domain_nr(dev->bus) == rom->segment) &&
-   (dev->bus->number == rom->bus) &&
-   (PCI_SLOT(dev->devfn) == rom->device) &&
-   (PCI_FUNC(dev->devfn) == rom->function) &&
-   (dev->vendor == rom->vendor) &&
-   (dev->device == rom->devid)) {
-   dev->rom = pa_data +
- offsetof(struct pci_setup_rom, romdata);
-   dev->romlen = rom->pcilen;
+   entry = kzalloc(sizeof(struct firmware_setup_pci_entry),
+   GFP_ATOMIC);
+   if (!entry) {
+   iounmap(data);
+   return -ENOMEM;
+   }
+
+   firmware_setup_pci_add_entry((struct pci_setup_rom *)data,
+pa_data, entry);
+   pa_data = data->next;
+   iounmap(data);
+   }
+
+   return 0;
+}
+postcore_initcall(fill_setup_pci_entries);
+
+int pcibios_add_device(struct pci_dev *dev)
+{
+   struct firmware_setup_pci_entry *entry;
+
+   list_for_each_entry(entry, _pci_entries, list) {
+   if ((pci_domain_nr(dev->bus) == entry->segment) &&
+   (dev->bus->number == entry->bus) &&
+   (PCI_SLOT(dev->devfn) == entry->device) &&
+   (PCI_FUNC(dev->devfn) == entry->function) &&
+   (dev->vendor == entry->vendor) &&
+   (dev->device == entry->devid)) {
+   dev->rom = entry->rom;
+   dev->romlen = entry->pcilen;
dev_printk(KERN_DEBUG, >dev, "set rom to [%#010lx, 
%#010lx] via SETUP_PCI\n",
   (unsigned long)dev->rom,
   (unsigned long)(dev->rom + dev->romlen - 1));
}
-   pa_data = data->next;
-   iounmap(data);
}
+
return 0;
 }
 
-- 
1.8.4.5

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 7/8] x86, pci: convert SETUP_PCI data to list

2015-02-28 Thread Yinghai Lu
So we could avoid ioremap every time later.

Cc: Bjorn Helgaas bhelg...@google.com
Cc: linux-...@vger.kernel.org
Signed-off-by: Yinghai Lu ying...@kernel.org
---
 arch/x86/pci/common.c | 77 +--
 1 file changed, 63 insertions(+), 14 deletions(-)

diff --git a/arch/x86/pci/common.c b/arch/x86/pci/common.c
index 4846db7..7b6fb94 100644
--- a/arch/x86/pci/common.c
+++ b/arch/x86/pci/common.c
@@ -680,10 +680,41 @@ void __init add_pci(u64 pa_data)
early_memunmap(data, sizeof(*data));
 }
 
-int pcibios_add_device(struct pci_dev *dev)
+struct firmware_setup_pci_entry {
+   struct list_head list;
+   uint16_t vendor;
+   uint16_t devid;
+   uint64_t pcilen;
+   unsigned long segment;
+   unsigned long bus;
+   unsigned long device;
+   unsigned long function;
+   phys_addr_t rom;
+};
+
+static LIST_HEAD(setup_pci_entries);
+
+static void __init firmware_setup_pci_add_entry(struct pci_setup_rom *rom,
+   u64 pa_data,
+   struct firmware_setup_pci_entry *entry)
+{
+   entry-segment = rom-segment;
+   entry-bus = rom-bus;
+   entry-device = rom-device;
+   entry-function = rom-function;
+   entry-vendor = rom-vendor;
+   entry-devid = rom-devid;
+   entry-rom = pa_data + offsetof(struct pci_setup_rom, romdata);
+   entry-pcilen = rom-pcilen;
+
+   list_add(entry-list, setup_pci_entries);
+}
+
+static __init int fill_setup_pci_entries(void)
 {
struct setup_data *data;
struct pci_setup_rom *rom;
+   struct firmware_setup_pci_entry *entry;
u64 pa_data;
 
pa_data = pci_setup_data;
@@ -692,24 +723,42 @@ int pcibios_add_device(struct pci_dev *dev)
if (!data)
return -ENOMEM;
 
-   rom = (struct pci_setup_rom *)data;
-
-   if ((pci_domain_nr(dev-bus) == rom-segment) 
-   (dev-bus-number == rom-bus) 
-   (PCI_SLOT(dev-devfn) == rom-device) 
-   (PCI_FUNC(dev-devfn) == rom-function) 
-   (dev-vendor == rom-vendor) 
-   (dev-device == rom-devid)) {
-   dev-rom = pa_data +
- offsetof(struct pci_setup_rom, romdata);
-   dev-romlen = rom-pcilen;
+   entry = kzalloc(sizeof(struct firmware_setup_pci_entry),
+   GFP_ATOMIC);
+   if (!entry) {
+   iounmap(data);
+   return -ENOMEM;
+   }
+
+   firmware_setup_pci_add_entry((struct pci_setup_rom *)data,
+pa_data, entry);
+   pa_data = data-next;
+   iounmap(data);
+   }
+
+   return 0;
+}
+postcore_initcall(fill_setup_pci_entries);
+
+int pcibios_add_device(struct pci_dev *dev)
+{
+   struct firmware_setup_pci_entry *entry;
+
+   list_for_each_entry(entry, setup_pci_entries, list) {
+   if ((pci_domain_nr(dev-bus) == entry-segment) 
+   (dev-bus-number == entry-bus) 
+   (PCI_SLOT(dev-devfn) == entry-device) 
+   (PCI_FUNC(dev-devfn) == entry-function) 
+   (dev-vendor == entry-vendor) 
+   (dev-device == entry-devid)) {
+   dev-rom = entry-rom;
+   dev-romlen = entry-pcilen;
dev_printk(KERN_DEBUG, dev-dev, set rom to [%#010lx, 
%#010lx] via SETUP_PCI\n,
   (unsigned long)dev-rom,
   (unsigned long)(dev-rom + dev-romlen - 1));
}
-   pa_data = data-next;
-   iounmap(data);
}
+
return 0;
 }
 
-- 
1.8.4.5

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/