linux-pci.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Yinghai Lu <yinghai@kernel.org>
To: Jesse Barnes <jbarnes@virtuousgeek.org>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	Tony Luck <tony.luck@intel.com>,
	David Miller <davem@davemloft.net>, x86 <x86@kernel.org>
Cc: Bjorn Helgaas <bhelgaas@google.com>,
	Dominik Brodowski <linux@dominikbrodowski.net>,
	linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-arch@vger.kernel.org, Yinghai Lu <yinghai@kernel.org>
Subject: [PATCH 04/36] PCI: add generic device into pci_host_bridge struct
Date: Wed, 29 Feb 2012 19:00:05 -0800	[thread overview]
Message-ID: <1330570837-26638-5-git-send-email-yinghai@kernel.org> (raw)
In-Reply-To: <1330570837-26638-1-git-send-email-yinghai@kernel.org>

use that device for pci_root_bus bridge pointer.

With that make code more simple.

Also we can use pci_release_bus_bridge_dev() to release allocated
pci_host_bridge during removing path.

At last, we can use root bus bridge pointer to get host bridge pointer instead
of going over host bridge list, so could kill that host bridge list.

Signed-off-by: Yinghai Lu <yinghai@kernel.org>
---
 drivers/pci/host-bridge.c |   15 +---------
 drivers/pci/pci.h         |    2 -
 drivers/pci/probe.c       |   65 +++++++++++++++++++++++---------------------
 include/linux/pci.h       |    4 ++-
 4 files changed, 38 insertions(+), 48 deletions(-)

diff --git a/drivers/pci/host-bridge.c b/drivers/pci/host-bridge.c
index 78adcc0..a55c3f8 100644
--- a/drivers/pci/host-bridge.c
+++ b/drivers/pci/host-bridge.c
@@ -9,13 +9,6 @@
 
 #include "pci.h"
 
-static LIST_HEAD(pci_host_bridges);
-
-void add_to_pci_host_bridges(struct pci_host_bridge *bridge)
-{
-	list_add_tail(&bridge->list, &pci_host_bridges);
-}
-
 static struct pci_bus *find_pci_root_bus(struct pci_dev *dev)
 {
 	struct pci_bus *bus;
@@ -30,14 +23,8 @@ static struct pci_bus *find_pci_root_bus(struct pci_dev *dev)
 static struct pci_host_bridge *find_pci_host_bridge(struct pci_dev *dev)
 {
 	struct pci_bus *bus = find_pci_root_bus(dev);
-	struct pci_host_bridge *bridge;
-
-	list_for_each_entry(bridge, &pci_host_bridges, list) {
-		if (bridge->bus == bus)
-			return bridge;
-	}
 
-	return NULL;
+	return to_pci_host_bridge(bus->bridge);
 }
 
 static bool resource_contains(struct resource *res1, struct resource *res2)
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
index c695a92..e494347 100644
--- a/drivers/pci/pci.h
+++ b/drivers/pci/pci.h
@@ -231,8 +231,6 @@ static inline int pci_ari_enabled(struct pci_bus *bus)
 void pci_reassigndev_resource_alignment(struct pci_dev *dev);
 extern void pci_disable_bridge_window(struct pci_dev *dev);
 
-void add_to_pci_host_bridges(struct pci_host_bridge *bridge);
-
 /* Single Root I/O Virtualization */
 struct pci_sriov {
 	int pos;		/* capability position */
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
index 89a82a3..fb3dd4b 100644
--- a/drivers/pci/probe.c
+++ b/drivers/pci/probe.c
@@ -421,6 +421,19 @@ static struct pci_bus * pci_alloc_bus(void)
 	return b;
 }
 
+static struct pci_host_bridge *pci_alloc_host_bridge(struct pci_bus *b)
+{
+	struct pci_host_bridge *bridge;
+
+	bridge = kzalloc(sizeof(*bridge), GFP_KERNEL);
+	if (bridge) {
+		INIT_LIST_HEAD(&bridge->windows);
+		bridge->bus = b;
+	}
+
+	return bridge;
+}
+
 static unsigned char pcix_bus_speed[] = {
 	PCI_SPEED_UNKNOWN,		/* 0 */
 	PCI_SPEED_66MHz_PCIX,		/* 1 */
@@ -1121,7 +1134,13 @@ int pci_cfg_space_size(struct pci_dev *dev)
 
 static void pci_release_bus_bridge_dev(struct device *dev)
 {
-	kfree(dev);
+	struct pci_host_bridge *bridge = to_pci_host_bridge(dev);
+
+	/* TODO: need to free window->res */
+
+	pci_free_resource_list(&bridge->windows);
+
+	kfree(bridge);
 }
 
 struct pci_dev *alloc_pci_dev(void)
@@ -1570,28 +1589,19 @@ struct pci_bus *pci_create_root_bus(struct device *parent, int bus,
 	int error;
 	struct pci_host_bridge *bridge;
 	struct pci_bus *b, *b2;
-	struct device *dev;
 	struct pci_host_bridge_window *window, *n;
 	struct resource *res;
 	resource_size_t offset;
 	char bus_addr[64];
 	char *fmt;
 
-	bridge = kzalloc(sizeof(*bridge), GFP_KERNEL);
-	if (!bridge)
-		return NULL;
 
 	b = pci_alloc_bus();
 	if (!b)
-		goto err_bus;
-
-	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
-	if (!dev)
-		goto err_dev;
+		return NULL;
 
 	b->sysdata = sysdata;
 	b->ops = ops;
-
 	b2 = pci_find_bus(pci_domain_nr(b), bus);
 	if (b2) {
 		/* If we already got to this bus through a different bridge, ignore it */
@@ -1599,13 +1609,17 @@ struct pci_bus *pci_create_root_bus(struct device *parent, int bus,
 		goto err_out;
 	}
 
-	dev->parent = parent;
-	dev->release = pci_release_bus_bridge_dev;
-	dev_set_name(dev, "pci%04x:%02x", pci_domain_nr(b), bus);
-	error = device_register(dev);
+	bridge = pci_alloc_host_bridge(b);
+	if (!bridge)
+		goto err_out;
+
+	bridge->dev.parent = parent;
+	bridge->dev.release = pci_release_bus_bridge_dev;
+	dev_set_name(&bridge->dev, "pci%04x:%02x", pci_domain_nr(b), bus);
+	error = device_register(&bridge->dev);
 	if (error)
-		goto dev_reg_err;
-	b->bridge = get_device(dev);
+		goto bridge_dev_reg_err;
+	b->bridge = get_device(&bridge->dev);
 	device_enable_async_suspend(b->bridge);
 	pci_set_bus_of_node(b);
 
@@ -1624,9 +1638,6 @@ struct pci_bus *pci_create_root_bus(struct device *parent, int bus,
 
 	b->number = b->secondary = bus;
 
-	bridge->bus = b;
-	INIT_LIST_HEAD(&bridge->windows);
-
 	if (parent)
 		dev_info(parent, "PCI host bridge to bus %s\n", dev_name(&b->dev));
 	else
@@ -1652,25 +1663,17 @@ struct pci_bus *pci_create_root_bus(struct device *parent, int bus,
 	}
 
 	down_write(&pci_bus_sem);
-	add_to_pci_host_bridges(bridge);
 	list_add_tail(&b->node, &pci_root_buses);
 	up_write(&pci_bus_sem);
 
 	return b;
 
 class_dev_reg_err:
-	device_unregister(dev);
-dev_reg_err:
-	down_write(&pci_bus_sem);
-	list_del(&bridge->list);
-	list_del(&b->node);
-	up_write(&pci_bus_sem);
+	device_unregister(&bridge->dev);
+bridge_dev_reg_err:
+	kfree(bridge);
 err_out:
-	kfree(dev);
-err_dev:
 	kfree(b);
-err_bus:
-	kfree(bridge);
 	return NULL;
 }
 
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 5584aac..310610e 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -375,11 +375,13 @@ struct pci_host_bridge_window {
 };
 
 struct pci_host_bridge {
-	struct list_head list;
+	struct device dev;
 	struct pci_bus *bus;		/* root bus */
 	struct list_head windows;	/* pci_host_bridge_windows */
 };
 
+#define	to_pci_host_bridge(n) container_of(n, struct pci_host_bridge, dev)
+
 /*
  * The first PCI_BRIDGE_RESOURCE_NUM PCI bus resources (those that correspond
  * to P2P or CardBus bridge windows) go in a table.  Additional ones (for
-- 
1.7.7


  parent reply	other threads:[~2012-03-01  3:00 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-03-01  3:00 [PATCH -v2 00/36] PCI: pci_host_bridge related cleanup and busn_alloc Yinghai Lu
2012-03-01  3:00 ` [PATCH 01/36] PCI: Separate host_bridge code out from probe.c Yinghai Lu
2012-03-01  3:00 ` [PATCH 02/36] x86, PCI: Fix memleak with get_current_resources Yinghai Lu
2012-03-15  8:39   ` Taku Izumi
2012-03-15 17:44     ` Yinghai Lu
2012-03-01  3:00 ` [PATCH 03/36] PCI: rename pci_host_bridge() to find_pci_root_bridge() Yinghai Lu
2012-03-01  3:00 ` Yinghai Lu [this message]
2012-03-01  3:00 ` [PATCH 05/36] PCI: add host bridge release support Yinghai Lu
2012-03-01  3:00 ` [PATCH 06/36] x86, PCI: break down get_current_resource() Yinghai Lu
2012-03-01  3:00 ` [PATCH 07/36] x86, PCI: add host bridge resource release for using _CRS Yinghai Lu
2012-03-01  3:00 ` [PATCH 08/36] x86, PCI: embed name acpi version pci_root_info struct Yinghai Lu
2012-03-01  3:00 ` [PATCH 09/36] x86, PCI: embed pci_sysdata into pci_root_info on acpi path Yinghai Lu
2012-03-01  3:00 ` [PATCH 10/36] x86, PCI: Allocating pci_root_info for not using _CRS path Yinghai Lu
2012-03-01  3:00 ` [PATCH 11/36] x86, PCI: Merge root info printing for nocrs path Yinghai Lu
2012-03-01  3:00 ` [PATCH 12/36] x86, PCI: add print all root info " Yinghai Lu
2012-03-01  3:00 ` [PATCH 13/36] x86, PCI: allocate temp range array in amd_bus pci_root_info probing Yinghai Lu
2012-03-01  3:00 ` [PATCH 14/36] x86, PCI: Merge pcibios_scan_root and pci_scan_bus_on_node Yinghai Lu
2012-03-01  3:00 ` [PATCH 15/36] PCI: Add busn_res into struct pci_bus Yinghai Lu
2012-03-01  3:00 ` [PATCH 16/36] PCI: Add busn_res operation functions Yinghai Lu
2012-03-01  3:00 ` [PATCH 17/36] PCI: release busn when removing bus Yinghai Lu
2012-03-01  3:00 ` [PATCH 18/36] PCI: insert busn_res in pci_create_root_bus Yinghai Lu
2012-03-01  3:00 ` [PATCH 19/36] PCI: checking busn_res in pci_scan_root_bus Yinghai Lu
2012-03-01  3:00 ` [PATCH 20/36] PCI: default busn_resource Yinghai Lu
2012-03-01  3:00 ` [PATCH 21/36] PCI: add default res for pci_scan_bus Yinghai Lu
2012-03-01  3:00 ` [PATCH 22/36] x86, PCI: add busn into resources list for acpi path Yinghai Lu
2012-03-01  3:00 ` [PATCH 23/36] x86, PCI: put busn resource in pci_root_info for no_crs path Yinghai Lu
2012-03-01  3:00 ` [PATCH 24/36] PCI, ia64: Register busn_res for root buses Yinghai Lu
2012-03-01  3:00 ` [PATCH 25/36] PCI, sparc: " Yinghai Lu
2012-03-01  3:00 ` [PATCH 26/36] PCI, powerpc: " Yinghai Lu
2012-03-01  3:00 ` [PATCH 27/36] PCI, parisc: " Yinghai Lu
2012-03-01  3:00 ` [PATCH 28/36] PCI: Add pci_bus_extend/shrink_top() Yinghai Lu
2012-03-16 19:36   ` Bjorn Helgaas
2012-03-16 20:42     ` Yinghai Lu
2012-03-16 21:04       ` Bjorn Helgaas
2012-03-01  3:00 ` [PATCH 29/36] PCI: Probe safe range that we can use for unassigned bridge Yinghai Lu
2012-03-01  3:00 ` [PATCH 30/36] PCI: Strict checking of valid range for bridge Yinghai Lu
2012-03-01  3:00 ` [PATCH 31/36] PCI: Allocate bus range instead of use max blindly Yinghai Lu
2012-03-01  3:00 ` [PATCH 32/36] PCI: kill pci_fixup_parent_subordinate_busnr() Yinghai Lu
2012-03-01  3:00 ` [PATCH 33/36] PCI: Seperate child bus scanning to two passes overall Yinghai Lu
2012-03-01  3:00 ` [PATCH 34/36] pcmcia: remove workaround for fixing pci parent bus subordinate Yinghai Lu
2012-03-01  3:00 ` [PATCH 35/36] PCI: Double checking setting for bus register and bus struct Yinghai Lu
2012-03-01  3:00 ` [PATCH 36/36] PCI, pciehp: Remove not needed bus number range checking Yinghai Lu
2012-03-15  6:40 ` [PATCH -v2 00/36] PCI: pci_host_bridge related cleanup and busn_alloc Taku Izumi
2012-03-15 17:40   ` Yinghai Lu

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=1330570837-26638-5-git-send-email-yinghai@kernel.org \
    --to=yinghai@kernel.org \
    --cc=benh@kernel.crashing.org \
    --cc=bhelgaas@google.com \
    --cc=davem@davemloft.net \
    --cc=jbarnes@virtuousgeek.org \
    --cc=linux-arch@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=linux@dominikbrodowski.net \
    --cc=tony.luck@intel.com \
    --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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).