From: Yinghai Lu <yinghai@kernel.org>
To: Bjorn Helgaas <bhelgaas@google.com>,
Taku Izumi <izumi.taku@jp.fujitsu.com>,
Jiang Liu <jiang.liu@huawei.com>, x86 <x86@kernel.org>
Cc: Andrew Morton <akpm@linux-foundation.org>,
Linus Torvalds <torvalds@linux-foundation.org>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-acpi@vger.kernel.org, Yinghai Lu <yinghai@kernel.org>
Subject: [PATCH part2 6/6] PCI: Claim hw/fw allocated resources in hot add path.
Date: Sun, 2 Sep 2012 14:50:53 -0700 [thread overview]
Message-ID: <1346622653-30741-7-git-send-email-yinghai@kernel.org> (raw)
In-Reply-To: <1346622653-30741-1-git-send-email-yinghai@kernel.org>
During testing remove/rescan root bus 00, found
[ 338.142574] bus: 'pci': really_probe: probing driver ata_piix with device 0000:00:01.1
[ 338.146788] ata_piix 0000:00:01.1: device not available (can't reserve [io 0x01f0-0x01f7])
[ 338.150565] ata_piix: probe of 0000:00:01.1 failed with error -22
because that fixed resource is not claimed from
arch/x86/pci/i386.c::pcibios_allocate_resources()
that is init path.
Try to claim those resources, so on the remove/rescan will still use old
resources.
It is some kind honoring HW/FW setting in the registers during hot add.
esp root-bus hot add is through acpi, BIOS have chance to set some register
for us.
-v2: add rom resource claiming.
Signed-off-by: Yinghai Lu <yinghai@kernel.org>
---
arch/x86/pci/i386.c | 28 +++++++++++++++++++++-------
drivers/pci/bus.c | 2 ++
include/linux/pci.h | 1 +
3 files changed, 24 insertions(+), 7 deletions(-)
diff --git a/arch/x86/pci/i386.c b/arch/x86/pci/i386.c
index abf2a61..3cb7d66 100644
--- a/arch/x86/pci/i386.c
+++ b/arch/x86/pci/i386.c
@@ -201,13 +201,15 @@ EXPORT_SYMBOL(pcibios_align_resource);
* as well.
*/
-static void __init pcibios_allocate_bridge_resources(struct pci_dev *dev)
+static void pcibios_allocate_bridge_resources(struct pci_dev *dev)
{
int idx;
struct resource *r;
for (idx = PCI_BRIDGE_RESOURCES; idx < PCI_NUM_RESOURCES; idx++) {
r = &dev->resource[idx];
+ if (r->parent) /* Already allocated */
+ continue;
if (!r->flags)
continue;
if (!r->start || pci_claim_resource(dev, idx) < 0) {
@@ -223,7 +225,7 @@ static void __init pcibios_allocate_bridge_resources(struct pci_dev *dev)
}
}
-static void __init pcibios_allocate_bus_resources(struct pci_bus *bus)
+static void pcibios_allocate_bus_resources(struct pci_bus *bus)
{
struct pci_bus *child;
@@ -239,7 +241,7 @@ struct pci_check_idx_range {
int end;
};
-static void __init pcibios_allocate_dev_resources(struct pci_dev *dev, int pass)
+static void pcibios_allocate_dev_resources(struct pci_dev *dev, int pass)
{
int idx, disabled, i;
u16 command;
@@ -292,7 +294,7 @@ static void __init pcibios_allocate_dev_resources(struct pci_dev *dev, int pass)
}
}
-static void __init pcibios_allocate_resources(struct pci_bus *bus, int pass)
+static void pcibios_allocate_resources(struct pci_bus *bus, int pass)
{
struct pci_dev *dev;
struct pci_bus *child;
@@ -306,7 +308,7 @@ static void __init pcibios_allocate_resources(struct pci_bus *bus, int pass)
}
}
-static void __init pcibios_allocate_dev_rom_resource(struct pci_dev *dev)
+static void pcibios_allocate_dev_rom_resource(struct pci_dev *dev)
{
struct resource *r;
@@ -324,7 +326,7 @@ static void __init pcibios_allocate_dev_rom_resource(struct pci_dev *dev)
r->start = 0;
}
}
-static void __init __pcibios_allocate_rom_resources(struct pci_bus *bus)
+static void __pcibios_allocate_rom_resources(struct pci_bus *bus)
{
struct pci_dev *dev;
struct pci_bus *child;
@@ -337,7 +339,7 @@ static void __init __pcibios_allocate_rom_resources(struct pci_bus *bus)
__pcibios_allocate_rom_resources(child);
}
}
-static void __init pcibios_allocate_rom_resources(struct pci_bus *bus)
+static void pcibios_allocate_rom_resources(struct pci_bus *bus)
{
if (pci_probe & PCI_ASSIGN_ROMS)
return;
@@ -358,6 +360,18 @@ static int __init pcibios_assign_resources(void)
return 0;
}
+void pcibios_resource_survey_bus(struct pci_bus *bus)
+{
+ dev_printk(KERN_DEBUG, &bus->dev, "Allocating resources\n");
+
+ pcibios_allocate_bus_resources(bus);
+
+ pcibios_allocate_resources(bus, 0);
+ pcibios_allocate_resources(bus, 1);
+
+ pcibios_allocate_rom_resources(bus);
+}
+
void __init pcibios_resource_survey(void)
{
struct pci_bus *bus;
diff --git a/drivers/pci/bus.c b/drivers/pci/bus.c
index 4b0970b..2882d01 100644
--- a/drivers/pci/bus.c
+++ b/drivers/pci/bus.c
@@ -154,6 +154,8 @@ pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res,
return ret;
}
+void __weak pcibios_resource_survey_bus(struct pci_bus *bus) { }
+
/**
* pci_bus_add_device - add a single device
* @dev: device to add
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 1b460e1..29a4704 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -676,6 +676,7 @@ extern struct list_head pci_root_buses; /* list of all known PCI buses */
/* Some device drivers need know if pci is initiated */
extern int no_pci_devices(void);
+void pcibios_resource_survey_bus(struct pci_bus *bus);
void pcibios_fixup_bus(struct pci_bus *);
int __must_check pcibios_enable_device(struct pci_dev *, int mask);
/* Architecture specific versions may override this (weak) */
--
1.7.7
next prev parent reply other threads:[~2012-09-02 21:50 UTC|newest]
Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-09-02 21:50 [PATCH part2 0/6] PCI, x86: pci root bus hotplug support - part2 Yinghai Lu
2012-09-02 21:50 ` [PATCH part2 1/6] x86, PCI: Separate pcibios_allocate_bridge_resources() Yinghai Lu
2012-09-02 21:50 ` [PATCH part2 2/6] x86, PCI: Separate pcibios_allocate_dev_resources() Yinghai Lu
2012-09-02 21:50 ` [PATCH part2 3/6] x86, PCI: Let pcibios_allocate_bus_resources() take bus instead Yinghai Lu
2012-09-02 21:50 ` [PATCH part2 4/6] x86, PCI: Separate rom resource claim out Yinghai Lu
2012-09-17 23:38 ` Bjorn Helgaas
2012-09-18 3:18 ` Yinghai Lu
2012-09-02 21:50 ` [PATCH part2 5/6] PCI, x86: Add pcibios_fw_addr_done Yinghai Lu
2012-09-02 21:50 ` Yinghai Lu [this message]
2012-09-18 0:12 ` [PATCH part2 6/6] PCI: Claim hw/fw allocated resources in hot add path Bjorn Helgaas
2012-09-18 4:44 ` Yinghai Lu
2012-09-18 5:36 ` Yinghai Lu
2012-09-19 18:54 ` [PATCH 00/40] PCI, ACPI, x86: pci root bus hotplug support Yinghai Lu
2012-09-19 18:54 ` [PATCH 01/40] PCI: fix default vga ref_count Yinghai Lu
2012-09-21 20:52 ` Bjorn Helgaas
2012-09-21 21:18 ` Yinghai Lu
2012-09-23 15:25 ` Jiang Liu
2012-09-19 18:54 ` [PATCH 02/40] PCI, x86: clear initial value for root info resources Yinghai Lu
2012-09-19 18:54 ` [PATCH 03/40] PCI, ia64: " Yinghai Lu
2012-09-19 18:54 ` Yinghai Lu
2012-09-19 18:54 ` [PATCH 04/40] PCI, acpiphp: Add is_hotplug_bridge detection Yinghai Lu
2012-09-19 18:54 ` [PATCH 05/40] PCI: Add root bus children dev's res to fail list Yinghai Lu
2012-09-19 18:54 ` [PATCH 06/40] PCI: Split out stop_bus_device and remove_bus_dev again Yinghai Lu
2012-09-19 18:54 ` [PATCH 07/40] x86, PCI: Separate pcibios_allocate_bridge_resources() Yinghai Lu
2012-09-19 18:54 ` [PATCH 08/40] x86, PCI: Separate pcibios_allocate_dev_resources() Yinghai Lu
2012-09-19 18:54 ` [PATCH 09/40] x86, PCI: Let pcibios_allocate_bus_resources() take bus instead Yinghai Lu
2012-09-19 18:54 ` [PATCH 10/40] x86, PCI: Separate rom resource claim out Yinghai Lu
2012-09-19 18:54 ` [PATCH 11/40] PCI, x86: Add pcibios_fw_addr_done Yinghai Lu
2012-09-19 18:54 ` [PATCH 12/40] PCI, x86: Remove __init for hw/fw allocated functions Yinghai Lu
2012-09-19 18:54 ` [PATCH 13/40] PCI: Claim hw/fw allocated resources in hot add path Yinghai Lu
2012-09-19 18:54 ` [PATCH 14/40] PCI: Separate out pci_assign_unassigned_bus_resources() Yinghai Lu
2012-09-19 18:54 ` [PATCH 15/40] PCI: Move back pci_rescan_bus() to probe.c Yinghai Lu
2012-09-19 18:54 ` [PATCH 16/40] PCI: pci_bus_size_bridges() should not size own bridge Yinghai Lu
2012-09-19 18:54 ` [PATCH 17/40] PCI: Use __pci_bus_size_bridges() directly in pci_assign_unassigned_bus_resources() Yinghai Lu
2012-09-19 18:54 ` [PATCH 18/40] PCI: Rescan bus using callback method too Yinghai Lu
2012-09-19 18:54 ` [PATCH 19/40] PCI, sysfs: Clean up rescan/remove with schedule_callback Yinghai Lu
2012-09-19 18:54 ` [PATCH 20/40] PCI: Fix a device reference count leakage issue in pci_dev_present() Yinghai Lu
2012-09-19 18:54 ` [PATCH 21/40] PCI: Add pci_stop_and_remove_root_bus() Yinghai Lu
2012-09-19 18:54 ` [PATCH 22/40] PCI, acpiphp: Separate out hot-add support of pci host bridge Yinghai Lu
2012-10-12 10:36 ` Tang Chen
2012-09-19 18:54 ` [PATCH 23/40] PCI, ACPI: Pass device instead of handle when config root bridge Yinghai Lu
2012-09-19 18:54 ` [PATCH 24/40] PCI, acpi: Update acpi_pci_driver add/remove interface Yinghai Lu
2012-09-19 18:54 ` [PATCH 25/40] PCI, ACPI: Make acpi_pci_root_remove remove pci root bus too Yinghai Lu
2012-09-19 18:54 ` [PATCH 26/40] PCI, ACPI: del root bus prt Yinghai Lu
2012-09-19 18:54 ` [PATCH 27/40] ACPI: acpi_bus_trim to support two steps Yinghai Lu
2012-09-19 18:54 ` [PATCH 28/40] PCI, ACPI: Add pci_root_hp hot removal notification support Yinghai Lu
2012-09-19 18:54 ` [PATCH 29/40] PCI, ACPI: Add alloc_acpi_hp_work() Yinghai Lu
2012-09-19 18:54 ` [PATCH 30/40] PCI, acpiphp: Use acpi_hp_work Yinghai Lu
2012-09-19 18:54 ` [PATCH 31/40] PCI, pci_root_hp: " Yinghai Lu
2012-09-19 18:54 ` [PATCH 32/40] PCI, ACPI: Make kacpi_hotplug_wq static Yinghai Lu
2012-09-19 18:54 ` [PATCH 33/40] ACPI, PCI: Use normal list for struct acpi_pci_driver Yinghai Lu
2012-09-19 18:54 ` [PATCH 34/40] ACPI, PCI: Notify acpi_pci_drivers when hot-plugging PCI root bridges Yinghai Lu
2012-09-19 18:54 ` [PATCH 35/40] ACPI, PCI: Protect global lists in drivers/acpi/pci_root.c Yinghai Lu
2012-09-19 18:54 ` [PATCH 36/40] PCI: Set dev_node early for pci_dev Yinghai Lu
2012-09-19 18:54 ` [PATCH 37/40] PCI, x86: Move pci_enable_bridges() down Yinghai Lu
2012-09-19 18:54 ` [PATCH 38/40] ACPI, PCI: Skip extra pci_enable_bridges for non hot-add root Yinghai Lu
2012-09-19 18:54 ` [PATCH 39/40] PCI, acpiphp: Don't ailout even no slots found yet Yinghai Lu
2012-09-19 18:54 ` [PATCH 40/40] ACPI: Enable SCI_EMULATE to manually simulate physical hotplug testing Yinghai Lu
2012-10-17 7:50 ` [PATCH 00/40] PCI, ACPI, x86: pci root bus hotplug support Yijing Wang
2012-10-17 7:50 ` Yijing Wang
2012-10-17 16:19 ` Yinghai Lu
2012-10-18 0:51 ` Yijing Wang
2012-10-18 0:51 ` Yijing Wang
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1346622653-30741-7-git-send-email-yinghai@kernel.org \
--to=yinghai@kernel.org \
--cc=akpm@linux-foundation.org \
--cc=bhelgaas@google.com \
--cc=gregkh@linuxfoundation.org \
--cc=izumi.taku@jp.fujitsu.com \
--cc=jiang.liu@huawei.com \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=torvalds@linux-foundation.org \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.