From 7b1d25ed24945f00c5ba052a9206f56bb89f3254 Mon Sep 17 00:00:00 2001 From: Bjorn Helgaas Date: Tue, 4 Mar 2008 11:56:47 -0700 Subject: [PATCH] --- yaml --- r: 91679 b: refs/heads/master c: 842de40d93e00a5c40a1a7f520a6fbe422994e99 h: refs/heads/master i: 91677: ea5bc5ae8852260e739f0e96eb741255632d2b95 91675: 4c3e6ac3c0ac11c1bacc722c15716eb6f3710fe0 91671: a3dbc6d14062e9d4acc97479d686718391760f5b 91663: cb6539415ea163264a673c7c67c39cf9651b2372 91647: 1e16c1724abad10851efba1ffe42cac9f60bcf8e v: v3 --- [refs] | 2 +- trunk/drivers/pci/setup-res.c | 43 +++++++++++++++++++++++++++++++++++ trunk/include/linux/pci.h | 1 + 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index a9208c732a43..8193fe12ac9b 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 7d715a6c1ae5785d00fb9a876b5abdfc43abc44b +refs/heads/master: 842de40d93e00a5c40a1a7f520a6fbe422994e99 diff --git a/trunk/drivers/pci/setup-res.c b/trunk/drivers/pci/setup-res.c index 9e4d485ba9cd..bad509e40fbc 100644 --- a/trunk/drivers/pci/setup-res.c +++ b/trunk/drivers/pci/setup-res.c @@ -263,3 +263,46 @@ void pdev_sort_resources(struct pci_dev *dev, struct resource_list *head) } } } + +int pci_enable_resources(struct pci_dev *dev, int mask) +{ + u16 cmd, old_cmd; + int i; + struct resource *r; + + pci_read_config_word(dev, PCI_COMMAND, &cmd); + old_cmd = cmd; + + for (i = 0; i < PCI_NUM_RESOURCES; i++) { + if (!(mask & (1 << i))) + continue; + + r = &dev->resource[i]; + + if (!(r->flags & (IORESOURCE_IO | IORESOURCE_MEM))) + continue; + if ((i == PCI_ROM_RESOURCE) && + (!(r->flags & IORESOURCE_ROM_ENABLE))) + continue; + + if (!r->parent) { + dev_err(&dev->dev, "device not available because of " + "BAR %d [%llx:%llx] collisions\n", i, + (unsigned long long) r->start, + (unsigned long long) r->end); + return -EINVAL; + } + + if (r->flags & IORESOURCE_IO) + cmd |= PCI_COMMAND_IO; + if (r->flags & IORESOURCE_MEM) + cmd |= PCI_COMMAND_MEMORY; + } + + if (cmd != old_cmd) { + dev_info(&dev->dev, "enabling device (%04x -> %04x)\n", + old_cmd, cmd); + pci_write_config_word(dev, PCI_COMMAND, cmd); + } + return 0; +} diff --git a/trunk/include/linux/pci.h b/trunk/include/linux/pci.h index 14bf3d236d19..e2f46b05cf8b 100644 --- a/trunk/include/linux/pci.h +++ b/trunk/include/linux/pci.h @@ -624,6 +624,7 @@ int pci_claim_resource(struct pci_dev *, int); void pci_assign_unassigned_resources(void); void pdev_enable_device(struct pci_dev *); void pdev_sort_resources(struct pci_dev *, struct resource_list *); +int pci_enable_resources(struct pci_dev *, int mask); void pci_fixup_irqs(u8 (*)(struct pci_dev *, u8 *), int (*)(struct pci_dev *, u8, u8)); #define HAVE_PCI_REQ_REGIONS 2