From: Yinghai Lu <yinghai@kernel.org>
To: Jesse Barnes <jbarnes@virtuousgeek.org>
Cc: Bjorn Helgaas <bhelgaas@google.com>,
linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org,
Yinghai Lu <yinghai@kernel.org>
Subject: [PATCH 5/8] PCI: add generic device into pci_host_bridge struct
Date: Sun, 26 Feb 2012 15:33:19 -0800 [thread overview]
Message-ID: <1330299202-3838-6-git-send-email-yinghai@kernel.org> (raw)
In-Reply-To: <1330299202-3838-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 | 14 ---------
drivers/pci/pci.h | 2 -
drivers/pci/probe.c | 65 ++++++++++++++++++++++++----------------------
include/linux/pci.h | 4 ++
4 files changed, 38 insertions(+), 47 deletions(-)
Index: linux-2.6/drivers/pci/host-bridge.c
===================================================================
--- linux-2.6.orig/drivers/pci/host-bridge.c
+++ linux-2.6/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;
@@ -33,16 +26,11 @@ static struct pci_bus *find_pci_root_bus
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;
if (!bus)
return NULL;
- 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)
Index: linux-2.6/drivers/pci/pci.h
===================================================================
--- linux-2.6.orig/drivers/pci/pci.h
+++ linux-2.6/drivers/pci/pci.h
@@ -231,8 +231,6 @@ static inline int pci_ari_enabled(struct
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 */
Index: linux-2.6/drivers/pci/probe.c
===================================================================
--- linux-2.6.orig/drivers/pci/probe.c
+++ linux-2.6/drivers/pci/probe.c
@@ -421,6 +421,19 @@ static struct pci_bus * pci_alloc_bus(vo
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 *d
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(stru
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(stru
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(stru
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(stru
}
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;
}
Index: linux-2.6/include/linux/pci.h
===================================================================
--- linux-2.6.orig/include/linux/pci.h
+++ linux-2.6/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
next prev parent reply other threads:[~2012-02-26 23:33 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-02-26 23:33 [PATCH 0/8] PCI: pci_host_bridge related cleanup Yinghai Lu
2012-02-26 23:33 ` [PATCH 1/8] PCI: Separate host_bridge code out from probe.c Yinghai Lu
2012-02-26 23:33 ` [PATCH 2/8] x86, PCI: have own version for pcibios_bus_to_resource Yinghai Lu
2012-02-27 17:34 ` Bjorn Helgaas
2012-02-26 23:33 ` [PATCH 3/8] x86, PCI: Fix memleak with get_current_resources Yinghai Lu
2012-02-26 23:33 ` [PATCH 4/8] PCI: make pci_host_bridge more robust Yinghai Lu
2012-02-27 17:44 ` Bjorn Helgaas
2012-02-26 23:33 ` Yinghai Lu [this message]
2012-02-27 17:57 ` [PATCH 5/8] PCI: add generic device into pci_host_bridge struct Bjorn Helgaas
2012-02-27 19:08 ` Yinghai Lu
2012-02-27 19:17 ` Bjorn Helgaas
2012-02-27 20:49 ` Yinghai Lu
2012-02-27 22:24 ` Bjorn Helgaas
2012-02-27 22:55 ` Yinghai Lu
2012-02-27 23:00 ` Bjorn Helgaas
2012-02-26 23:33 ` [PATCH 6/8] PCI: add host bridge release support Yinghai Lu
2012-02-26 23:33 ` [PATCH 7/8] x86, PCI: break down get_current_resource() Yinghai Lu
2012-02-26 23:33 ` [PATCH 8/8] x86, PCI: add host bridge resource release for using _CRS 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=1330299202-3838-6-git-send-email-yinghai@kernel.org \
--to=yinghai@kernel.org \
--cc=bhelgaas@google.com \
--cc=jbarnes@virtuousgeek.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.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).