x86/PCI: Factor out pcibios_allocate_dev_resources()

Factor pcibios_allocate_dev_resources() out of
pcibios_allocate_resources().  Currently we only allocate these
resources at boot-time with a for_each_pci_dev() loop.  Eventually
we'll use pcibios_allocate_dev_resources() for hot-added devices, too.

[bhelgaas: changelog]
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
This commit is contained in:
Yinghai Lu 2012-11-03 21:39:25 -07:00 коммит произвёл Bjorn Helgaas
Родитель f7ac356dc3
Коммит c7f4bbc92f
1 изменённых файлов: 23 добавлений и 19 удалений

Просмотреть файл

@ -232,9 +232,8 @@ struct pci_check_idx_range {
int end;
};
static void __init pcibios_allocate_resources(int pass)
static void __init pcibios_allocate_dev_resources(struct pci_dev *dev, int pass)
{
struct pci_dev *dev = NULL;
int idx, disabled, i;
u16 command;
struct resource *r;
@ -246,14 +245,13 @@ static void __init pcibios_allocate_resources(int pass)
#endif
};
for_each_pci_dev(dev) {
pci_read_config_word(dev, PCI_COMMAND, &command);
for (i = 0; i < ARRAY_SIZE(idx_range); i++)
pci_read_config_word(dev, PCI_COMMAND, &command);
for (i = 0; i < ARRAY_SIZE(idx_range); i++)
for (idx = idx_range[i].start; idx <= idx_range[i].end; idx++) {
r = &dev->resource[idx];
if (r->parent) /* Already allocated */
if (r->parent) /* Already allocated */
continue;
if (!r->start) /* Address not assigned at all */
if (!r->start) /* Address not assigned at all */
continue;
if (r->flags & IORESOURCE_IO)
disabled = !(command & PCI_COMMAND_IO);
@ -272,23 +270,29 @@ static void __init pcibios_allocate_resources(int pass)
}
}
}
if (!pass) {
r = &dev->resource[PCI_ROM_RESOURCE];
if (r->flags & IORESOURCE_ROM_ENABLE) {
/* Turn the ROM off, leave the resource region,
* but keep it unregistered. */
u32 reg;
dev_dbg(&dev->dev, "disabling ROM %pR\n", r);
r->flags &= ~IORESOURCE_ROM_ENABLE;
pci_read_config_dword(dev,
dev->rom_base_reg, &reg);
pci_write_config_dword(dev, dev->rom_base_reg,
if (!pass) {
r = &dev->resource[PCI_ROM_RESOURCE];
if (r->flags & IORESOURCE_ROM_ENABLE) {
/* Turn the ROM off, leave the resource region,
* but keep it unregistered. */
u32 reg;
dev_dbg(&dev->dev, "disabling ROM %pR\n", r);
r->flags &= ~IORESOURCE_ROM_ENABLE;
pci_read_config_dword(dev, dev->rom_base_reg, &reg);
pci_write_config_dword(dev, dev->rom_base_reg,
reg & ~PCI_ROM_ADDRESS_ENABLE);
}
}
}
}
static void __init pcibios_allocate_resources(int pass)
{
struct pci_dev *dev = NULL;
for_each_pci_dev(dev)
pcibios_allocate_dev_resources(dev, pass);
}
static int __init pcibios_assign_resources(void)
{
struct pci_dev *dev = NULL;