All of lore.kernel.org
 help / color / mirror / Atom feed
From: Bjorn Helgaas <bhelgaas@google.com>
To: Yijing Wang <wangyijing@huawei.com>
Cc: Jiang Liu <jiang.liu@linux.intel.com>,
	linux-pci@vger.kernel.org, Yinghai Lu <yinghai@kernel.org>,
	linux-kernel@vger.kernel.org, Marc Zyngier <marc.zyngier@arm.com>,
	linux-arm-kernel@lists.infradead.org,
	Russell King <linux@arm.linux.org.uk>,
	x86@kernel.org, Thomas Gleixner <tglx@linutronix.de>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	Rusty Russell <rusty@rustcorp.com.au>,
	Tony Luck <tony.luck@intel.com>,
	linux-ia64@vger.kernel.org,
	"David S. Miller" <davem@davemloft.net>,
	Guan Xuetao <gxt@mprc.pku.edu.cn>,
	linux-alpha@vger.kernel.org, linux-m68k@vger.kernel.org,
	Liviu Dudau <liviu@dudau.co.uk>, Arnd Bergmann <arnd@arndb.de>,
	Geert Uytterhoeven <geert@linux-m68k.org>
Subject: Re: [PATCH v6 09/30] PCI: Separate pci_host_bridge creation out of pci_create_root_bus()
Date: Wed, 11 Mar 2015 22:52:02 -0500	[thread overview]
Message-ID: <20150312035202.GL10949@google.com> (raw)
In-Reply-To: <1425868467-9667-10-git-send-email-wangyijing@huawei.com>

On Mon, Mar 09, 2015 at 10:34:06AM +0800, Yijing Wang wrote:
> This patch separate pci_host_bridge creation out
> of pci_create_root_bus(), and try to make a generic
> pci_host_bridge, then we could place generic PCI
> infos like domain number in it. Also Ripping out
> pci_host_bridge creation from pci_create_root_bus()
> make code more better readability. Further more,
> we could use the generic pci_host_bridge to hold
> host bridge specific operations like
> pcibios_root_bridge_prepare(). The changes are
> transparent to platform host bridge drivers.
> 
> Signed-off-by: Yijing Wang <wangyijing@huawei.com>
> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
>  drivers/pci/host-bridge.c |   55 ++++++++++++++++++++++
>  drivers/pci/pci.h         |    3 +
>  drivers/pci/probe.c       |  114 ++++++++++++++++++++-------------------------
>  include/linux/pci.h       |    1 +
>  4 files changed, 109 insertions(+), 64 deletions(-)
> 
> diff --git a/drivers/pci/host-bridge.c b/drivers/pci/host-bridge.c
> index 39b2dbe..3bd45e7 100644
> --- a/drivers/pci/host-bridge.c
> +++ b/drivers/pci/host-bridge.c
> @@ -8,6 +8,61 @@
>  
>  #include "pci.h"
>  
> +static void pci_release_host_bridge_dev(struct device *dev)
> +{
> +	struct pci_host_bridge *bridge = to_pci_host_bridge(dev);
> +
> +	if (bridge->release_fn)
> +		bridge->release_fn(bridge);
> +
> +	pci_free_resource_list(&bridge->windows);
> +	kfree(bridge);
> +}
> +
> +struct pci_host_bridge *pci_create_host_bridge(
> +		struct device *parent, u32 db, struct list_head *resources)
> +{
> +	int error;
> +	int bus = PCI_BUSNUM(db);
> +	int domain = PCI_DOMAIN(db);
> +	struct pci_host_bridge *host;
> +	struct resource_entry *window, *n;
> +
> +	host = kzalloc(sizeof(*host), GFP_KERNEL);
> +	if (!host)
> +		return NULL;
> +
> +	host->busnum = bus;
> +	host->domain = domain;
> +	/* If support CONFIG_PCI_DOMAINS_GENERIC, use
> +	 * pci_host_assign_domain_nr() to assign domain
> +	 * number instead PCI_DOMAIN(db).
> +	 */

Follow the normal Linux comment style:

	host->domain = domain;

	/*
	 * If we support ...
	 */

> +	pci_host_assign_domain_nr(host);
> +
> +	host->dev.parent = parent;
> +	INIT_LIST_HEAD(&host->windows);
> +	host->dev.release = pci_release_host_bridge_dev;
> +	dev_set_name(&host->dev, "pci%04x:%02x", host->domain,
> +			host->busnum);
> +
> +	error = device_register(&host->dev);
> +	if (error) {
> +		put_device(&host->dev);
> +		return NULL;
> +	}
> +
> +	resource_list_for_each_entry_safe(window, n, resources)
> +		list_move_tail(&window->node, &host->windows);
> +
> +	return host;
> +}
> +
> +void pci_free_host_bridge(struct pci_host_bridge *host)
> +{
> +	device_unregister(&host->dev);
> +}
> +
>  static struct pci_bus *find_pci_root_bus(struct pci_bus *bus)
>  {
>  	while (bus->parent)
> diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
> index eeacab9..3de5e51 100644
> --- a/drivers/pci/pci.h
> +++ b/drivers/pci/pci.h
> @@ -323,4 +323,7 @@ static inline int pci_dev_specific_reset(struct pci_dev *dev, int probe)
>  }
>  #endif
>  
> +struct pci_host_bridge *pci_create_host_bridge(
> +		struct device *parent, u32 dombus, struct list_head *resources);
> +void pci_free_host_bridge(struct pci_host_bridge *host);

A later patch adds another declaration and a blank line here.  If you want
the blank line, add it here, when you're adding the first declarations in
this section.

>  #endif /* DRIVERS_PCI_H */
> diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
> index 3d6befd..27ec612 100644
> --- a/drivers/pci/probe.c
> +++ b/drivers/pci/probe.c
> @@ -503,31 +503,6 @@ static struct pci_bus *pci_alloc_bus(struct pci_bus *parent)
>  	return b;
>  }
>  
> -static void pci_release_host_bridge_dev(struct device *dev)
> -{
> -	struct pci_host_bridge *bridge = to_pci_host_bridge(dev);
> -
> -	if (bridge->release_fn)
> -		bridge->release_fn(bridge);
> -
> -	pci_free_resource_list(&bridge->windows);
> -
> -	kfree(bridge);
> -}
> -
> -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)
> -		return NULL;
> -
> -	INIT_LIST_HEAD(&bridge->windows);
> -	bridge->bus = b;
> -	return bridge;
> -}
> -
>  static const unsigned char pcix_bus_speed[] = {
>  	PCI_SPEED_UNKNOWN,		/* 0 */
>  	PCI_SPEED_66MHz_PCIX,		/* 1 */
> @@ -1890,54 +1865,41 @@ void __weak pcibios_remove_bus(struct pci_bus *bus)
>  {
>  }
>  
> -struct pci_bus *pci_create_root_bus(struct device *parent, u32 db,
> -		struct pci_ops *ops, void *sysdata, struct list_head *resources)
> +static struct pci_bus *__pci_create_root_bus(
> +		struct pci_host_bridge *bridge, struct pci_ops *ops,
> +		void *sysdata)
>  {
>  	int error;
> -	struct pci_host_bridge *bridge;
>  	struct pci_bus *b, *b2;
> -	struct resource_entry *window, *n;
> +	struct resource_entry *window;
> +	struct device *parent;
>  	struct resource *res;
>  	resource_size_t offset;
>  	char bus_addr[64];
>  	char *fmt;
> -	u8	bus = PCI_BUSNUM(db);
>  
> +	parent = bridge->dev.parent;
>  	b = pci_alloc_bus(NULL);
>  	if (!b)
>  		return NULL;
>  
>  	b->sysdata = sysdata;
>  	b->ops = ops;
> -	b->number = b->busn_res.start = bus;
> +	b->number = b->busn_res.start = bridge->busnum;
>  	pci_bus_assign_domain_nr(b, parent);
> -	b2 = pci_find_bus(pci_domain_nr(b), bus);
> +	b2 = pci_find_bus(pci_domain_nr(b), b->number);
>  	if (b2) {
>  		/* If we already got to this bus through a different bridge, ignore it */
>  		dev_dbg(&b2->dev, "bus already known\n");
>  		goto err_out;
>  	}
>  
> -	bridge = pci_alloc_host_bridge(b);
> -	if (!bridge)
> -		goto err_out;
> -
> -	bridge->domain = PCI_DOMAIN(db);
> -	bridge->dev.parent = parent;
> -	bridge->dev.release = pci_release_host_bridge_dev;
> -	dev_set_name(&bridge->dev, "pci%04x:%02x", pci_domain_nr(b), bus);
> +	bridge->bus = b;
> +	b->bridge = get_device(&bridge->dev);
>  	error = pcibios_root_bridge_prepare(bridge);
> -	if (error) {
> -		kfree(bridge);
> +	if (error)
>  		goto err_out;
> -	}
>  
> -	error = device_register(&bridge->dev);
> -	if (error) {
> -		put_device(&bridge->dev);
> -		goto err_out;
> -	}
> -	b->bridge = get_device(&bridge->dev);
>  	device_enable_async_suspend(b->bridge);
>  	pci_set_bus_of_node(b);
>  
> @@ -1946,10 +1908,11 @@ struct pci_bus *pci_create_root_bus(struct device *parent, u32 db,
>  
>  	b->dev.class = &pcibus_class;
>  	b->dev.parent = b->bridge;
> -	dev_set_name(&b->dev, "%04x:%02x", pci_domain_nr(b), bus);
> +	dev_set_name(&b->dev, "%04x:%02x", bridge->domain,
> +			b->number);
>  	error = device_register(&b->dev);
>  	if (error)
> -		goto class_dev_reg_err;
> +		goto err_out;
>  
>  	pcibios_add_bus(b);
>  
> @@ -1962,12 +1925,11 @@ struct pci_bus *pci_create_root_bus(struct device *parent, u32 db,
>  		printk(KERN_INFO "PCI host bridge to bus %s\n", dev_name(&b->dev));
>  
>  	/* Add initial resources to the bus */
> -	resource_list_for_each_entry_safe(window, n, resources) {
> -		list_move_tail(&window->node, &bridge->windows);
> +	resource_list_for_each_entry(window, &bridge->windows) {
>  		res = window->res;
>  		offset = window->offset;
>  		if (res->flags & IORESOURCE_BUS)
> -			pci_bus_insert_busn_res(b, bus, res->end);
> +			pci_bus_insert_busn_res(b, b->number, res->end);
>  		else
>  			pci_bus_add_resource(b, res, 0);
>  		if (offset) {
> @@ -1989,14 +1951,23 @@ struct pci_bus *pci_create_root_bus(struct device *parent, u32 db,
>  
>  	return b;
>  
> -class_dev_reg_err:
> -	put_device(&bridge->dev);
> -	device_unregister(&bridge->dev);
>  err_out:
>  	kfree(b);
>  	return NULL;
>  }
>  
> +struct pci_bus *pci_create_root_bus(struct device *parent, u32 db,
> +		struct pci_ops *ops, void *sysdata, struct list_head *resources)
> +{
> +	struct pci_host_bridge *host;
> +
> +	host = pci_create_host_bridge(parent, db, resources);
> +	if (!host)
> +		return NULL;
> +
> +	return __pci_create_root_bus(host, ops, sysdata);
> +}
> +
>  int pci_bus_insert_busn_res(struct pci_bus *b, int bus, int bus_max)
>  {
>  	struct resource *res = &b->busn_res;
> @@ -2060,29 +2031,32 @@ void pci_bus_release_busn_res(struct pci_bus *b)
>  			res, ret ? "can not be" : "is");
>  }
>  
> -struct pci_bus *pci_scan_root_bus(struct device *parent, u32 db,
> -		struct pci_ops *ops, void *sysdata, struct list_head *resources)
> +static struct pci_bus *__pci_scan_root_bus(
> +		struct pci_host_bridge *host, struct pci_ops *ops,
> +		void *sysdata)
>  {
>  	struct resource_entry *window;
>  	bool found = false;
>  	struct pci_bus *b;
>  	int max;
>  
> -	resource_list_for_each_entry(window, resources)
> +	resource_list_for_each_entry(window, &host->windows)
>  		if (window->res->flags & IORESOURCE_BUS) {
>  			found = true;
>  			break;
>  		}
>  
> -	b = pci_create_root_bus(parent, db, ops, sysdata, resources);
> -	if (!b)
> +	b = __pci_create_root_bus(host, ops, sysdata);
> +	if (!b) {
> +		pci_free_host_bridge(host);
>  		return NULL;
> +	}
>  
>  	if (!found) {
>  		dev_info(&b->dev,
>  		 "No busn resource found for root bus, will use [bus %02x-ff]\n",
> -			PCI_BUSNUM(db));
> -		pci_bus_insert_busn_res(b, PCI_BUSNUM(db), 255);
> +			host->busnum);
> +		pci_bus_insert_busn_res(b, b->number, 255);
>  	}
>  
>  	max = pci_scan_child_bus(b);
> @@ -2092,6 +2066,18 @@ struct pci_bus *pci_scan_root_bus(struct device *parent, u32 db,
>  
>  	return b;
>  }
> +
> +struct pci_bus *pci_scan_root_bus(struct device *parent, u32 db,
> +		struct pci_ops *ops, void *sysdata, struct list_head *resources)
> +{
> +	struct pci_host_bridge *host;
> +
> +	host = pci_create_host_bridge(parent, db, resources);
> +	if (!host)
> +		return NULL;
> +
> +	return __pci_scan_root_bus(host, ops, sysdata);
> +}
>  EXPORT_SYMBOL(pci_scan_root_bus);
>  
>  struct pci_bus *pci_scan_bus(u32 db, struct pci_ops *ops,
> diff --git a/include/linux/pci.h b/include/linux/pci.h
> index 2b1b998..463eaa3 100644
> --- a/include/linux/pci.h
> +++ b/include/linux/pci.h
> @@ -402,6 +402,7 @@ static inline int pci_channel_offline(struct pci_dev *pdev)
>  
>  struct pci_host_bridge {
>  	u16	domain;
> +	u16 busnum;

Why do we need this?  host_bridge->bus->number and
host_bridge->bus->busn_res.start both already contain the same information,
and I hate to add a third place.  I know pci_create_host_bridge() doesn't
have a struct pci_bus at the point where you initialize busnum, but it does
have the resource list, which contains the bus number range.

>  	struct device dev;
>  	struct pci_bus *bus;		/* root bus */
>  	struct list_head windows;	/* resource_entry */
> -- 
> 1.7.1
> 

WARNING: multiple messages have this Message-ID (diff)
From: Bjorn Helgaas <bhelgaas@google.com>
To: Yijing Wang <wangyijing@huawei.com>
Cc: Jiang Liu <jiang.liu@linux.intel.com>,
	linux-pci@vger.kernel.org, Yinghai Lu <yinghai@kernel.org>,
	linux-kernel@vger.kernel.org, Marc Zyngier <marc.zyngier@arm.com>,
	linux-arm-kernel@lists.infradead.org,
	Russell King <linux@arm.linux.org.uk>,
	x86@kernel.org, Thomas Gleixner <tglx@linutronix.de>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	Rusty Russell <rusty@rustcorp.com.au>,
	Tony Luck <tony.luck@intel.com>,
	linux-ia64@vger.kernel.org,
	"David S. Miller" <davem@davemloft.net>,
	Guan Xuetao <gxt@mprc.pku.edu.cn>,
	linux-alpha@vger.kernel.org, linux-m68k@lists.linux-m68k.org,
	Liviu Dudau <liviu@dudau.co.uk>, Arnd Bergmann <arnd@arndb.de>,
	Geert Uytterhoeven <geert@linux-m68k.org>
Subject: Re: [PATCH v6 09/30] PCI: Separate pci_host_bridge creation out of pci_create_root_bus()
Date: Wed, 11 Mar 2015 22:52:02 -0500	[thread overview]
Message-ID: <20150312035202.GL10949@google.com> (raw)
In-Reply-To: <1425868467-9667-10-git-send-email-wangyijing@huawei.com>

On Mon, Mar 09, 2015 at 10:34:06AM +0800, Yijing Wang wrote:
> This patch separate pci_host_bridge creation out
> of pci_create_root_bus(), and try to make a generic
> pci_host_bridge, then we could place generic PCI
> infos like domain number in it. Also Ripping out
> pci_host_bridge creation from pci_create_root_bus()
> make code more better readability. Further more,
> we could use the generic pci_host_bridge to hold
> host bridge specific operations like
> pcibios_root_bridge_prepare(). The changes are
> transparent to platform host bridge drivers.
> 
> Signed-off-by: Yijing Wang <wangyijing@huawei.com>
> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
>  drivers/pci/host-bridge.c |   55 ++++++++++++++++++++++
>  drivers/pci/pci.h         |    3 +
>  drivers/pci/probe.c       |  114 ++++++++++++++++++++-------------------------
>  include/linux/pci.h       |    1 +
>  4 files changed, 109 insertions(+), 64 deletions(-)
> 
> diff --git a/drivers/pci/host-bridge.c b/drivers/pci/host-bridge.c
> index 39b2dbe..3bd45e7 100644
> --- a/drivers/pci/host-bridge.c
> +++ b/drivers/pci/host-bridge.c
> @@ -8,6 +8,61 @@
>  
>  #include "pci.h"
>  
> +static void pci_release_host_bridge_dev(struct device *dev)
> +{
> +	struct pci_host_bridge *bridge = to_pci_host_bridge(dev);
> +
> +	if (bridge->release_fn)
> +		bridge->release_fn(bridge);
> +
> +	pci_free_resource_list(&bridge->windows);
> +	kfree(bridge);
> +}
> +
> +struct pci_host_bridge *pci_create_host_bridge(
> +		struct device *parent, u32 db, struct list_head *resources)
> +{
> +	int error;
> +	int bus = PCI_BUSNUM(db);
> +	int domain = PCI_DOMAIN(db);
> +	struct pci_host_bridge *host;
> +	struct resource_entry *window, *n;
> +
> +	host = kzalloc(sizeof(*host), GFP_KERNEL);
> +	if (!host)
> +		return NULL;
> +
> +	host->busnum = bus;
> +	host->domain = domain;
> +	/* If support CONFIG_PCI_DOMAINS_GENERIC, use
> +	 * pci_host_assign_domain_nr() to assign domain
> +	 * number instead PCI_DOMAIN(db).
> +	 */

Follow the normal Linux comment style:

	host->domain = domain;

	/*
	 * If we support ...
	 */

> +	pci_host_assign_domain_nr(host);
> +
> +	host->dev.parent = parent;
> +	INIT_LIST_HEAD(&host->windows);
> +	host->dev.release = pci_release_host_bridge_dev;
> +	dev_set_name(&host->dev, "pci%04x:%02x", host->domain,
> +			host->busnum);
> +
> +	error = device_register(&host->dev);
> +	if (error) {
> +		put_device(&host->dev);
> +		return NULL;
> +	}
> +
> +	resource_list_for_each_entry_safe(window, n, resources)
> +		list_move_tail(&window->node, &host->windows);
> +
> +	return host;
> +}
> +
> +void pci_free_host_bridge(struct pci_host_bridge *host)
> +{
> +	device_unregister(&host->dev);
> +}
> +
>  static struct pci_bus *find_pci_root_bus(struct pci_bus *bus)
>  {
>  	while (bus->parent)
> diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
> index eeacab9..3de5e51 100644
> --- a/drivers/pci/pci.h
> +++ b/drivers/pci/pci.h
> @@ -323,4 +323,7 @@ static inline int pci_dev_specific_reset(struct pci_dev *dev, int probe)
>  }
>  #endif
>  
> +struct pci_host_bridge *pci_create_host_bridge(
> +		struct device *parent, u32 dombus, struct list_head *resources);
> +void pci_free_host_bridge(struct pci_host_bridge *host);

A later patch adds another declaration and a blank line here.  If you want
the blank line, add it here, when you're adding the first declarations in
this section.

>  #endif /* DRIVERS_PCI_H */
> diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
> index 3d6befd..27ec612 100644
> --- a/drivers/pci/probe.c
> +++ b/drivers/pci/probe.c
> @@ -503,31 +503,6 @@ static struct pci_bus *pci_alloc_bus(struct pci_bus *parent)
>  	return b;
>  }
>  
> -static void pci_release_host_bridge_dev(struct device *dev)
> -{
> -	struct pci_host_bridge *bridge = to_pci_host_bridge(dev);
> -
> -	if (bridge->release_fn)
> -		bridge->release_fn(bridge);
> -
> -	pci_free_resource_list(&bridge->windows);
> -
> -	kfree(bridge);
> -}
> -
> -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)
> -		return NULL;
> -
> -	INIT_LIST_HEAD(&bridge->windows);
> -	bridge->bus = b;
> -	return bridge;
> -}
> -
>  static const unsigned char pcix_bus_speed[] = {
>  	PCI_SPEED_UNKNOWN,		/* 0 */
>  	PCI_SPEED_66MHz_PCIX,		/* 1 */
> @@ -1890,54 +1865,41 @@ void __weak pcibios_remove_bus(struct pci_bus *bus)
>  {
>  }
>  
> -struct pci_bus *pci_create_root_bus(struct device *parent, u32 db,
> -		struct pci_ops *ops, void *sysdata, struct list_head *resources)
> +static struct pci_bus *__pci_create_root_bus(
> +		struct pci_host_bridge *bridge, struct pci_ops *ops,
> +		void *sysdata)
>  {
>  	int error;
> -	struct pci_host_bridge *bridge;
>  	struct pci_bus *b, *b2;
> -	struct resource_entry *window, *n;
> +	struct resource_entry *window;
> +	struct device *parent;
>  	struct resource *res;
>  	resource_size_t offset;
>  	char bus_addr[64];
>  	char *fmt;
> -	u8	bus = PCI_BUSNUM(db);
>  
> +	parent = bridge->dev.parent;
>  	b = pci_alloc_bus(NULL);
>  	if (!b)
>  		return NULL;
>  
>  	b->sysdata = sysdata;
>  	b->ops = ops;
> -	b->number = b->busn_res.start = bus;
> +	b->number = b->busn_res.start = bridge->busnum;
>  	pci_bus_assign_domain_nr(b, parent);
> -	b2 = pci_find_bus(pci_domain_nr(b), bus);
> +	b2 = pci_find_bus(pci_domain_nr(b), b->number);
>  	if (b2) {
>  		/* If we already got to this bus through a different bridge, ignore it */
>  		dev_dbg(&b2->dev, "bus already known\n");
>  		goto err_out;
>  	}
>  
> -	bridge = pci_alloc_host_bridge(b);
> -	if (!bridge)
> -		goto err_out;
> -
> -	bridge->domain = PCI_DOMAIN(db);
> -	bridge->dev.parent = parent;
> -	bridge->dev.release = pci_release_host_bridge_dev;
> -	dev_set_name(&bridge->dev, "pci%04x:%02x", pci_domain_nr(b), bus);
> +	bridge->bus = b;
> +	b->bridge = get_device(&bridge->dev);
>  	error = pcibios_root_bridge_prepare(bridge);
> -	if (error) {
> -		kfree(bridge);
> +	if (error)
>  		goto err_out;
> -	}
>  
> -	error = device_register(&bridge->dev);
> -	if (error) {
> -		put_device(&bridge->dev);
> -		goto err_out;
> -	}
> -	b->bridge = get_device(&bridge->dev);
>  	device_enable_async_suspend(b->bridge);
>  	pci_set_bus_of_node(b);
>  
> @@ -1946,10 +1908,11 @@ struct pci_bus *pci_create_root_bus(struct device *parent, u32 db,
>  
>  	b->dev.class = &pcibus_class;
>  	b->dev.parent = b->bridge;
> -	dev_set_name(&b->dev, "%04x:%02x", pci_domain_nr(b), bus);
> +	dev_set_name(&b->dev, "%04x:%02x", bridge->domain,
> +			b->number);
>  	error = device_register(&b->dev);
>  	if (error)
> -		goto class_dev_reg_err;
> +		goto err_out;
>  
>  	pcibios_add_bus(b);
>  
> @@ -1962,12 +1925,11 @@ struct pci_bus *pci_create_root_bus(struct device *parent, u32 db,
>  		printk(KERN_INFO "PCI host bridge to bus %s\n", dev_name(&b->dev));
>  
>  	/* Add initial resources to the bus */
> -	resource_list_for_each_entry_safe(window, n, resources) {
> -		list_move_tail(&window->node, &bridge->windows);
> +	resource_list_for_each_entry(window, &bridge->windows) {
>  		res = window->res;
>  		offset = window->offset;
>  		if (res->flags & IORESOURCE_BUS)
> -			pci_bus_insert_busn_res(b, bus, res->end);
> +			pci_bus_insert_busn_res(b, b->number, res->end);
>  		else
>  			pci_bus_add_resource(b, res, 0);
>  		if (offset) {
> @@ -1989,14 +1951,23 @@ struct pci_bus *pci_create_root_bus(struct device *parent, u32 db,
>  
>  	return b;
>  
> -class_dev_reg_err:
> -	put_device(&bridge->dev);
> -	device_unregister(&bridge->dev);
>  err_out:
>  	kfree(b);
>  	return NULL;
>  }
>  
> +struct pci_bus *pci_create_root_bus(struct device *parent, u32 db,
> +		struct pci_ops *ops, void *sysdata, struct list_head *resources)
> +{
> +	struct pci_host_bridge *host;
> +
> +	host = pci_create_host_bridge(parent, db, resources);
> +	if (!host)
> +		return NULL;
> +
> +	return __pci_create_root_bus(host, ops, sysdata);
> +}
> +
>  int pci_bus_insert_busn_res(struct pci_bus *b, int bus, int bus_max)
>  {
>  	struct resource *res = &b->busn_res;
> @@ -2060,29 +2031,32 @@ void pci_bus_release_busn_res(struct pci_bus *b)
>  			res, ret ? "can not be" : "is");
>  }
>  
> -struct pci_bus *pci_scan_root_bus(struct device *parent, u32 db,
> -		struct pci_ops *ops, void *sysdata, struct list_head *resources)
> +static struct pci_bus *__pci_scan_root_bus(
> +		struct pci_host_bridge *host, struct pci_ops *ops,
> +		void *sysdata)
>  {
>  	struct resource_entry *window;
>  	bool found = false;
>  	struct pci_bus *b;
>  	int max;
>  
> -	resource_list_for_each_entry(window, resources)
> +	resource_list_for_each_entry(window, &host->windows)
>  		if (window->res->flags & IORESOURCE_BUS) {
>  			found = true;
>  			break;
>  		}
>  
> -	b = pci_create_root_bus(parent, db, ops, sysdata, resources);
> -	if (!b)
> +	b = __pci_create_root_bus(host, ops, sysdata);
> +	if (!b) {
> +		pci_free_host_bridge(host);
>  		return NULL;
> +	}
>  
>  	if (!found) {
>  		dev_info(&b->dev,
>  		 "No busn resource found for root bus, will use [bus %02x-ff]\n",
> -			PCI_BUSNUM(db));
> -		pci_bus_insert_busn_res(b, PCI_BUSNUM(db), 255);
> +			host->busnum);
> +		pci_bus_insert_busn_res(b, b->number, 255);
>  	}
>  
>  	max = pci_scan_child_bus(b);
> @@ -2092,6 +2066,18 @@ struct pci_bus *pci_scan_root_bus(struct device *parent, u32 db,
>  
>  	return b;
>  }
> +
> +struct pci_bus *pci_scan_root_bus(struct device *parent, u32 db,
> +		struct pci_ops *ops, void *sysdata, struct list_head *resources)
> +{
> +	struct pci_host_bridge *host;
> +
> +	host = pci_create_host_bridge(parent, db, resources);
> +	if (!host)
> +		return NULL;
> +
> +	return __pci_scan_root_bus(host, ops, sysdata);
> +}
>  EXPORT_SYMBOL(pci_scan_root_bus);
>  
>  struct pci_bus *pci_scan_bus(u32 db, struct pci_ops *ops,
> diff --git a/include/linux/pci.h b/include/linux/pci.h
> index 2b1b998..463eaa3 100644
> --- a/include/linux/pci.h
> +++ b/include/linux/pci.h
> @@ -402,6 +402,7 @@ static inline int pci_channel_offline(struct pci_dev *pdev)
>  
>  struct pci_host_bridge {
>  	u16	domain;
> +	u16 busnum;

Why do we need this?  host_bridge->bus->number and
host_bridge->bus->busn_res.start both already contain the same information,
and I hate to add a third place.  I know pci_create_host_bridge() doesn't
have a struct pci_bus at the point where you initialize busnum, but it does
have the resource list, which contains the bus number range.

>  	struct device dev;
>  	struct pci_bus *bus;		/* root bus */
>  	struct list_head windows;	/* resource_entry */
> -- 
> 1.7.1
> 

WARNING: multiple messages have this Message-ID (diff)
From: bhelgaas@google.com (Bjorn Helgaas)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v6 09/30] PCI: Separate pci_host_bridge creation out of pci_create_root_bus()
Date: Wed, 11 Mar 2015 22:52:02 -0500	[thread overview]
Message-ID: <20150312035202.GL10949@google.com> (raw)
In-Reply-To: <1425868467-9667-10-git-send-email-wangyijing@huawei.com>

On Mon, Mar 09, 2015 at 10:34:06AM +0800, Yijing Wang wrote:
> This patch separate pci_host_bridge creation out
> of pci_create_root_bus(), and try to make a generic
> pci_host_bridge, then we could place generic PCI
> infos like domain number in it. Also Ripping out
> pci_host_bridge creation from pci_create_root_bus()
> make code more better readability. Further more,
> we could use the generic pci_host_bridge to hold
> host bridge specific operations like
> pcibios_root_bridge_prepare(). The changes are
> transparent to platform host bridge drivers.
> 
> Signed-off-by: Yijing Wang <wangyijing@huawei.com>
> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
>  drivers/pci/host-bridge.c |   55 ++++++++++++++++++++++
>  drivers/pci/pci.h         |    3 +
>  drivers/pci/probe.c       |  114 ++++++++++++++++++++-------------------------
>  include/linux/pci.h       |    1 +
>  4 files changed, 109 insertions(+), 64 deletions(-)
> 
> diff --git a/drivers/pci/host-bridge.c b/drivers/pci/host-bridge.c
> index 39b2dbe..3bd45e7 100644
> --- a/drivers/pci/host-bridge.c
> +++ b/drivers/pci/host-bridge.c
> @@ -8,6 +8,61 @@
>  
>  #include "pci.h"
>  
> +static void pci_release_host_bridge_dev(struct device *dev)
> +{
> +	struct pci_host_bridge *bridge = to_pci_host_bridge(dev);
> +
> +	if (bridge->release_fn)
> +		bridge->release_fn(bridge);
> +
> +	pci_free_resource_list(&bridge->windows);
> +	kfree(bridge);
> +}
> +
> +struct pci_host_bridge *pci_create_host_bridge(
> +		struct device *parent, u32 db, struct list_head *resources)
> +{
> +	int error;
> +	int bus = PCI_BUSNUM(db);
> +	int domain = PCI_DOMAIN(db);
> +	struct pci_host_bridge *host;
> +	struct resource_entry *window, *n;
> +
> +	host = kzalloc(sizeof(*host), GFP_KERNEL);
> +	if (!host)
> +		return NULL;
> +
> +	host->busnum = bus;
> +	host->domain = domain;
> +	/* If support CONFIG_PCI_DOMAINS_GENERIC, use
> +	 * pci_host_assign_domain_nr() to assign domain
> +	 * number instead PCI_DOMAIN(db).
> +	 */

Follow the normal Linux comment style:

	host->domain = domain;

	/*
	 * If we support ...
	 */

> +	pci_host_assign_domain_nr(host);
> +
> +	host->dev.parent = parent;
> +	INIT_LIST_HEAD(&host->windows);
> +	host->dev.release = pci_release_host_bridge_dev;
> +	dev_set_name(&host->dev, "pci%04x:%02x", host->domain,
> +			host->busnum);
> +
> +	error = device_register(&host->dev);
> +	if (error) {
> +		put_device(&host->dev);
> +		return NULL;
> +	}
> +
> +	resource_list_for_each_entry_safe(window, n, resources)
> +		list_move_tail(&window->node, &host->windows);
> +
> +	return host;
> +}
> +
> +void pci_free_host_bridge(struct pci_host_bridge *host)
> +{
> +	device_unregister(&host->dev);
> +}
> +
>  static struct pci_bus *find_pci_root_bus(struct pci_bus *bus)
>  {
>  	while (bus->parent)
> diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
> index eeacab9..3de5e51 100644
> --- a/drivers/pci/pci.h
> +++ b/drivers/pci/pci.h
> @@ -323,4 +323,7 @@ static inline int pci_dev_specific_reset(struct pci_dev *dev, int probe)
>  }
>  #endif
>  
> +struct pci_host_bridge *pci_create_host_bridge(
> +		struct device *parent, u32 dombus, struct list_head *resources);
> +void pci_free_host_bridge(struct pci_host_bridge *host);

A later patch adds another declaration and a blank line here.  If you want
the blank line, add it here, when you're adding the first declarations in
this section.

>  #endif /* DRIVERS_PCI_H */
> diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
> index 3d6befd..27ec612 100644
> --- a/drivers/pci/probe.c
> +++ b/drivers/pci/probe.c
> @@ -503,31 +503,6 @@ static struct pci_bus *pci_alloc_bus(struct pci_bus *parent)
>  	return b;
>  }
>  
> -static void pci_release_host_bridge_dev(struct device *dev)
> -{
> -	struct pci_host_bridge *bridge = to_pci_host_bridge(dev);
> -
> -	if (bridge->release_fn)
> -		bridge->release_fn(bridge);
> -
> -	pci_free_resource_list(&bridge->windows);
> -
> -	kfree(bridge);
> -}
> -
> -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)
> -		return NULL;
> -
> -	INIT_LIST_HEAD(&bridge->windows);
> -	bridge->bus = b;
> -	return bridge;
> -}
> -
>  static const unsigned char pcix_bus_speed[] = {
>  	PCI_SPEED_UNKNOWN,		/* 0 */
>  	PCI_SPEED_66MHz_PCIX,		/* 1 */
> @@ -1890,54 +1865,41 @@ void __weak pcibios_remove_bus(struct pci_bus *bus)
>  {
>  }
>  
> -struct pci_bus *pci_create_root_bus(struct device *parent, u32 db,
> -		struct pci_ops *ops, void *sysdata, struct list_head *resources)
> +static struct pci_bus *__pci_create_root_bus(
> +		struct pci_host_bridge *bridge, struct pci_ops *ops,
> +		void *sysdata)
>  {
>  	int error;
> -	struct pci_host_bridge *bridge;
>  	struct pci_bus *b, *b2;
> -	struct resource_entry *window, *n;
> +	struct resource_entry *window;
> +	struct device *parent;
>  	struct resource *res;
>  	resource_size_t offset;
>  	char bus_addr[64];
>  	char *fmt;
> -	u8	bus = PCI_BUSNUM(db);
>  
> +	parent = bridge->dev.parent;
>  	b = pci_alloc_bus(NULL);
>  	if (!b)
>  		return NULL;
>  
>  	b->sysdata = sysdata;
>  	b->ops = ops;
> -	b->number = b->busn_res.start = bus;
> +	b->number = b->busn_res.start = bridge->busnum;
>  	pci_bus_assign_domain_nr(b, parent);
> -	b2 = pci_find_bus(pci_domain_nr(b), bus);
> +	b2 = pci_find_bus(pci_domain_nr(b), b->number);
>  	if (b2) {
>  		/* If we already got to this bus through a different bridge, ignore it */
>  		dev_dbg(&b2->dev, "bus already known\n");
>  		goto err_out;
>  	}
>  
> -	bridge = pci_alloc_host_bridge(b);
> -	if (!bridge)
> -		goto err_out;
> -
> -	bridge->domain = PCI_DOMAIN(db);
> -	bridge->dev.parent = parent;
> -	bridge->dev.release = pci_release_host_bridge_dev;
> -	dev_set_name(&bridge->dev, "pci%04x:%02x", pci_domain_nr(b), bus);
> +	bridge->bus = b;
> +	b->bridge = get_device(&bridge->dev);
>  	error = pcibios_root_bridge_prepare(bridge);
> -	if (error) {
> -		kfree(bridge);
> +	if (error)
>  		goto err_out;
> -	}
>  
> -	error = device_register(&bridge->dev);
> -	if (error) {
> -		put_device(&bridge->dev);
> -		goto err_out;
> -	}
> -	b->bridge = get_device(&bridge->dev);
>  	device_enable_async_suspend(b->bridge);
>  	pci_set_bus_of_node(b);
>  
> @@ -1946,10 +1908,11 @@ struct pci_bus *pci_create_root_bus(struct device *parent, u32 db,
>  
>  	b->dev.class = &pcibus_class;
>  	b->dev.parent = b->bridge;
> -	dev_set_name(&b->dev, "%04x:%02x", pci_domain_nr(b), bus);
> +	dev_set_name(&b->dev, "%04x:%02x", bridge->domain,
> +			b->number);
>  	error = device_register(&b->dev);
>  	if (error)
> -		goto class_dev_reg_err;
> +		goto err_out;
>  
>  	pcibios_add_bus(b);
>  
> @@ -1962,12 +1925,11 @@ struct pci_bus *pci_create_root_bus(struct device *parent, u32 db,
>  		printk(KERN_INFO "PCI host bridge to bus %s\n", dev_name(&b->dev));
>  
>  	/* Add initial resources to the bus */
> -	resource_list_for_each_entry_safe(window, n, resources) {
> -		list_move_tail(&window->node, &bridge->windows);
> +	resource_list_for_each_entry(window, &bridge->windows) {
>  		res = window->res;
>  		offset = window->offset;
>  		if (res->flags & IORESOURCE_BUS)
> -			pci_bus_insert_busn_res(b, bus, res->end);
> +			pci_bus_insert_busn_res(b, b->number, res->end);
>  		else
>  			pci_bus_add_resource(b, res, 0);
>  		if (offset) {
> @@ -1989,14 +1951,23 @@ struct pci_bus *pci_create_root_bus(struct device *parent, u32 db,
>  
>  	return b;
>  
> -class_dev_reg_err:
> -	put_device(&bridge->dev);
> -	device_unregister(&bridge->dev);
>  err_out:
>  	kfree(b);
>  	return NULL;
>  }
>  
> +struct pci_bus *pci_create_root_bus(struct device *parent, u32 db,
> +		struct pci_ops *ops, void *sysdata, struct list_head *resources)
> +{
> +	struct pci_host_bridge *host;
> +
> +	host = pci_create_host_bridge(parent, db, resources);
> +	if (!host)
> +		return NULL;
> +
> +	return __pci_create_root_bus(host, ops, sysdata);
> +}
> +
>  int pci_bus_insert_busn_res(struct pci_bus *b, int bus, int bus_max)
>  {
>  	struct resource *res = &b->busn_res;
> @@ -2060,29 +2031,32 @@ void pci_bus_release_busn_res(struct pci_bus *b)
>  			res, ret ? "can not be" : "is");
>  }
>  
> -struct pci_bus *pci_scan_root_bus(struct device *parent, u32 db,
> -		struct pci_ops *ops, void *sysdata, struct list_head *resources)
> +static struct pci_bus *__pci_scan_root_bus(
> +		struct pci_host_bridge *host, struct pci_ops *ops,
> +		void *sysdata)
>  {
>  	struct resource_entry *window;
>  	bool found = false;
>  	struct pci_bus *b;
>  	int max;
>  
> -	resource_list_for_each_entry(window, resources)
> +	resource_list_for_each_entry(window, &host->windows)
>  		if (window->res->flags & IORESOURCE_BUS) {
>  			found = true;
>  			break;
>  		}
>  
> -	b = pci_create_root_bus(parent, db, ops, sysdata, resources);
> -	if (!b)
> +	b = __pci_create_root_bus(host, ops, sysdata);
> +	if (!b) {
> +		pci_free_host_bridge(host);
>  		return NULL;
> +	}
>  
>  	if (!found) {
>  		dev_info(&b->dev,
>  		 "No busn resource found for root bus, will use [bus %02x-ff]\n",
> -			PCI_BUSNUM(db));
> -		pci_bus_insert_busn_res(b, PCI_BUSNUM(db), 255);
> +			host->busnum);
> +		pci_bus_insert_busn_res(b, b->number, 255);
>  	}
>  
>  	max = pci_scan_child_bus(b);
> @@ -2092,6 +2066,18 @@ struct pci_bus *pci_scan_root_bus(struct device *parent, u32 db,
>  
>  	return b;
>  }
> +
> +struct pci_bus *pci_scan_root_bus(struct device *parent, u32 db,
> +		struct pci_ops *ops, void *sysdata, struct list_head *resources)
> +{
> +	struct pci_host_bridge *host;
> +
> +	host = pci_create_host_bridge(parent, db, resources);
> +	if (!host)
> +		return NULL;
> +
> +	return __pci_scan_root_bus(host, ops, sysdata);
> +}
>  EXPORT_SYMBOL(pci_scan_root_bus);
>  
>  struct pci_bus *pci_scan_bus(u32 db, struct pci_ops *ops,
> diff --git a/include/linux/pci.h b/include/linux/pci.h
> index 2b1b998..463eaa3 100644
> --- a/include/linux/pci.h
> +++ b/include/linux/pci.h
> @@ -402,6 +402,7 @@ static inline int pci_channel_offline(struct pci_dev *pdev)
>  
>  struct pci_host_bridge {
>  	u16	domain;
> +	u16 busnum;

Why do we need this?  host_bridge->bus->number and
host_bridge->bus->busn_res.start both already contain the same information,
and I hate to add a third place.  I know pci_create_host_bridge() doesn't
have a struct pci_bus at the point where you initialize busnum, but it does
have the resource list, which contains the bus number range.

>  	struct device dev;
>  	struct pci_bus *bus;		/* root bus */
>  	struct list_head windows;	/* resource_entry */
> -- 
> 1.7.1
> 

WARNING: multiple messages have this Message-ID (diff)
From: Bjorn Helgaas <bhelgaas@google.com>
To: Yijing Wang <wangyijing@huawei.com>
Cc: Jiang Liu <jiang.liu@linux.intel.com>,
	linux-pci@vger.kernel.org, Yinghai Lu <yinghai@kernel.org>,
	linux-kernel@vger.kernel.org, Marc Zyngier <marc.zyngier@arm.com>,
	linux-arm-kernel@lists.infradead.org,
	Russell King <linux@arm.linux.org.uk>,
	x86@kernel.org, Thomas Gleixner <tglx@linutronix.de>,
	Benjamin Herrenschmidt <benh@kernel.crashing.org>,
	Rusty Russell <rusty@rustcorp.com.au>,
	Tony Luck <tony.luck@intel.com>,
	linux-ia64@vger.kernel.org,
	"David S. Miller" <davem@davemloft.net>,
	Guan Xuetao <gxt@mprc.pku.edu.cn>,
	linux-alpha@vger.kernel.org, linux-m68k@vger.kernel.org,
	Liviu Dudau <liviu@dudau.co.uk>, Arnd Bergmann <arnd@arndb.de>,
	Geert Uytterhoeven <geert@linux-m68k.org>
Subject: Re: [PATCH v6 09/30] PCI: Separate pci_host_bridge creation out of pci_create_root_bus()
Date: Thu, 12 Mar 2015 03:52:02 +0000	[thread overview]
Message-ID: <20150312035202.GL10949@google.com> (raw)
In-Reply-To: <1425868467-9667-10-git-send-email-wangyijing@huawei.com>

On Mon, Mar 09, 2015 at 10:34:06AM +0800, Yijing Wang wrote:
> This patch separate pci_host_bridge creation out
> of pci_create_root_bus(), and try to make a generic
> pci_host_bridge, then we could place generic PCI
> infos like domain number in it. Also Ripping out
> pci_host_bridge creation from pci_create_root_bus()
> make code more better readability. Further more,
> we could use the generic pci_host_bridge to hold
> host bridge specific operations like
> pcibios_root_bridge_prepare(). The changes are
> transparent to platform host bridge drivers.
> 
> Signed-off-by: Yijing Wang <wangyijing@huawei.com>
> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
> ---
>  drivers/pci/host-bridge.c |   55 ++++++++++++++++++++++
>  drivers/pci/pci.h         |    3 +
>  drivers/pci/probe.c       |  114 ++++++++++++++++++++-------------------------
>  include/linux/pci.h       |    1 +
>  4 files changed, 109 insertions(+), 64 deletions(-)
> 
> diff --git a/drivers/pci/host-bridge.c b/drivers/pci/host-bridge.c
> index 39b2dbe..3bd45e7 100644
> --- a/drivers/pci/host-bridge.c
> +++ b/drivers/pci/host-bridge.c
> @@ -8,6 +8,61 @@
>  
>  #include "pci.h"
>  
> +static void pci_release_host_bridge_dev(struct device *dev)
> +{
> +	struct pci_host_bridge *bridge = to_pci_host_bridge(dev);
> +
> +	if (bridge->release_fn)
> +		bridge->release_fn(bridge);
> +
> +	pci_free_resource_list(&bridge->windows);
> +	kfree(bridge);
> +}
> +
> +struct pci_host_bridge *pci_create_host_bridge(
> +		struct device *parent, u32 db, struct list_head *resources)
> +{
> +	int error;
> +	int bus = PCI_BUSNUM(db);
> +	int domain = PCI_DOMAIN(db);
> +	struct pci_host_bridge *host;
> +	struct resource_entry *window, *n;
> +
> +	host = kzalloc(sizeof(*host), GFP_KERNEL);
> +	if (!host)
> +		return NULL;
> +
> +	host->busnum = bus;
> +	host->domain = domain;
> +	/* If support CONFIG_PCI_DOMAINS_GENERIC, use
> +	 * pci_host_assign_domain_nr() to assign domain
> +	 * number instead PCI_DOMAIN(db).
> +	 */

Follow the normal Linux comment style:

	host->domain = domain;

	/*
	 * If we support ...
	 */

> +	pci_host_assign_domain_nr(host);
> +
> +	host->dev.parent = parent;
> +	INIT_LIST_HEAD(&host->windows);
> +	host->dev.release = pci_release_host_bridge_dev;
> +	dev_set_name(&host->dev, "pci%04x:%02x", host->domain,
> +			host->busnum);
> +
> +	error = device_register(&host->dev);
> +	if (error) {
> +		put_device(&host->dev);
> +		return NULL;
> +	}
> +
> +	resource_list_for_each_entry_safe(window, n, resources)
> +		list_move_tail(&window->node, &host->windows);
> +
> +	return host;
> +}
> +
> +void pci_free_host_bridge(struct pci_host_bridge *host)
> +{
> +	device_unregister(&host->dev);
> +}
> +
>  static struct pci_bus *find_pci_root_bus(struct pci_bus *bus)
>  {
>  	while (bus->parent)
> diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
> index eeacab9..3de5e51 100644
> --- a/drivers/pci/pci.h
> +++ b/drivers/pci/pci.h
> @@ -323,4 +323,7 @@ static inline int pci_dev_specific_reset(struct pci_dev *dev, int probe)
>  }
>  #endif
>  
> +struct pci_host_bridge *pci_create_host_bridge(
> +		struct device *parent, u32 dombus, struct list_head *resources);
> +void pci_free_host_bridge(struct pci_host_bridge *host);

A later patch adds another declaration and a blank line here.  If you want
the blank line, add it here, when you're adding the first declarations in
this section.

>  #endif /* DRIVERS_PCI_H */
> diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
> index 3d6befd..27ec612 100644
> --- a/drivers/pci/probe.c
> +++ b/drivers/pci/probe.c
> @@ -503,31 +503,6 @@ static struct pci_bus *pci_alloc_bus(struct pci_bus *parent)
>  	return b;
>  }
>  
> -static void pci_release_host_bridge_dev(struct device *dev)
> -{
> -	struct pci_host_bridge *bridge = to_pci_host_bridge(dev);
> -
> -	if (bridge->release_fn)
> -		bridge->release_fn(bridge);
> -
> -	pci_free_resource_list(&bridge->windows);
> -
> -	kfree(bridge);
> -}
> -
> -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)
> -		return NULL;
> -
> -	INIT_LIST_HEAD(&bridge->windows);
> -	bridge->bus = b;
> -	return bridge;
> -}
> -
>  static const unsigned char pcix_bus_speed[] = {
>  	PCI_SPEED_UNKNOWN,		/* 0 */
>  	PCI_SPEED_66MHz_PCIX,		/* 1 */
> @@ -1890,54 +1865,41 @@ void __weak pcibios_remove_bus(struct pci_bus *bus)
>  {
>  }
>  
> -struct pci_bus *pci_create_root_bus(struct device *parent, u32 db,
> -		struct pci_ops *ops, void *sysdata, struct list_head *resources)
> +static struct pci_bus *__pci_create_root_bus(
> +		struct pci_host_bridge *bridge, struct pci_ops *ops,
> +		void *sysdata)
>  {
>  	int error;
> -	struct pci_host_bridge *bridge;
>  	struct pci_bus *b, *b2;
> -	struct resource_entry *window, *n;
> +	struct resource_entry *window;
> +	struct device *parent;
>  	struct resource *res;
>  	resource_size_t offset;
>  	char bus_addr[64];
>  	char *fmt;
> -	u8	bus = PCI_BUSNUM(db);
>  
> +	parent = bridge->dev.parent;
>  	b = pci_alloc_bus(NULL);
>  	if (!b)
>  		return NULL;
>  
>  	b->sysdata = sysdata;
>  	b->ops = ops;
> -	b->number = b->busn_res.start = bus;
> +	b->number = b->busn_res.start = bridge->busnum;
>  	pci_bus_assign_domain_nr(b, parent);
> -	b2 = pci_find_bus(pci_domain_nr(b), bus);
> +	b2 = pci_find_bus(pci_domain_nr(b), b->number);
>  	if (b2) {
>  		/* If we already got to this bus through a different bridge, ignore it */
>  		dev_dbg(&b2->dev, "bus already known\n");
>  		goto err_out;
>  	}
>  
> -	bridge = pci_alloc_host_bridge(b);
> -	if (!bridge)
> -		goto err_out;
> -
> -	bridge->domain = PCI_DOMAIN(db);
> -	bridge->dev.parent = parent;
> -	bridge->dev.release = pci_release_host_bridge_dev;
> -	dev_set_name(&bridge->dev, "pci%04x:%02x", pci_domain_nr(b), bus);
> +	bridge->bus = b;
> +	b->bridge = get_device(&bridge->dev);
>  	error = pcibios_root_bridge_prepare(bridge);
> -	if (error) {
> -		kfree(bridge);
> +	if (error)
>  		goto err_out;
> -	}
>  
> -	error = device_register(&bridge->dev);
> -	if (error) {
> -		put_device(&bridge->dev);
> -		goto err_out;
> -	}
> -	b->bridge = get_device(&bridge->dev);
>  	device_enable_async_suspend(b->bridge);
>  	pci_set_bus_of_node(b);
>  
> @@ -1946,10 +1908,11 @@ struct pci_bus *pci_create_root_bus(struct device *parent, u32 db,
>  
>  	b->dev.class = &pcibus_class;
>  	b->dev.parent = b->bridge;
> -	dev_set_name(&b->dev, "%04x:%02x", pci_domain_nr(b), bus);
> +	dev_set_name(&b->dev, "%04x:%02x", bridge->domain,
> +			b->number);
>  	error = device_register(&b->dev);
>  	if (error)
> -		goto class_dev_reg_err;
> +		goto err_out;
>  
>  	pcibios_add_bus(b);
>  
> @@ -1962,12 +1925,11 @@ struct pci_bus *pci_create_root_bus(struct device *parent, u32 db,
>  		printk(KERN_INFO "PCI host bridge to bus %s\n", dev_name(&b->dev));
>  
>  	/* Add initial resources to the bus */
> -	resource_list_for_each_entry_safe(window, n, resources) {
> -		list_move_tail(&window->node, &bridge->windows);
> +	resource_list_for_each_entry(window, &bridge->windows) {
>  		res = window->res;
>  		offset = window->offset;
>  		if (res->flags & IORESOURCE_BUS)
> -			pci_bus_insert_busn_res(b, bus, res->end);
> +			pci_bus_insert_busn_res(b, b->number, res->end);
>  		else
>  			pci_bus_add_resource(b, res, 0);
>  		if (offset) {
> @@ -1989,14 +1951,23 @@ struct pci_bus *pci_create_root_bus(struct device *parent, u32 db,
>  
>  	return b;
>  
> -class_dev_reg_err:
> -	put_device(&bridge->dev);
> -	device_unregister(&bridge->dev);
>  err_out:
>  	kfree(b);
>  	return NULL;
>  }
>  
> +struct pci_bus *pci_create_root_bus(struct device *parent, u32 db,
> +		struct pci_ops *ops, void *sysdata, struct list_head *resources)
> +{
> +	struct pci_host_bridge *host;
> +
> +	host = pci_create_host_bridge(parent, db, resources);
> +	if (!host)
> +		return NULL;
> +
> +	return __pci_create_root_bus(host, ops, sysdata);
> +}
> +
>  int pci_bus_insert_busn_res(struct pci_bus *b, int bus, int bus_max)
>  {
>  	struct resource *res = &b->busn_res;
> @@ -2060,29 +2031,32 @@ void pci_bus_release_busn_res(struct pci_bus *b)
>  			res, ret ? "can not be" : "is");
>  }
>  
> -struct pci_bus *pci_scan_root_bus(struct device *parent, u32 db,
> -		struct pci_ops *ops, void *sysdata, struct list_head *resources)
> +static struct pci_bus *__pci_scan_root_bus(
> +		struct pci_host_bridge *host, struct pci_ops *ops,
> +		void *sysdata)
>  {
>  	struct resource_entry *window;
>  	bool found = false;
>  	struct pci_bus *b;
>  	int max;
>  
> -	resource_list_for_each_entry(window, resources)
> +	resource_list_for_each_entry(window, &host->windows)
>  		if (window->res->flags & IORESOURCE_BUS) {
>  			found = true;
>  			break;
>  		}
>  
> -	b = pci_create_root_bus(parent, db, ops, sysdata, resources);
> -	if (!b)
> +	b = __pci_create_root_bus(host, ops, sysdata);
> +	if (!b) {
> +		pci_free_host_bridge(host);
>  		return NULL;
> +	}
>  
>  	if (!found) {
>  		dev_info(&b->dev,
>  		 "No busn resource found for root bus, will use [bus %02x-ff]\n",
> -			PCI_BUSNUM(db));
> -		pci_bus_insert_busn_res(b, PCI_BUSNUM(db), 255);
> +			host->busnum);
> +		pci_bus_insert_busn_res(b, b->number, 255);
>  	}
>  
>  	max = pci_scan_child_bus(b);
> @@ -2092,6 +2066,18 @@ struct pci_bus *pci_scan_root_bus(struct device *parent, u32 db,
>  
>  	return b;
>  }
> +
> +struct pci_bus *pci_scan_root_bus(struct device *parent, u32 db,
> +		struct pci_ops *ops, void *sysdata, struct list_head *resources)
> +{
> +	struct pci_host_bridge *host;
> +
> +	host = pci_create_host_bridge(parent, db, resources);
> +	if (!host)
> +		return NULL;
> +
> +	return __pci_scan_root_bus(host, ops, sysdata);
> +}
>  EXPORT_SYMBOL(pci_scan_root_bus);
>  
>  struct pci_bus *pci_scan_bus(u32 db, struct pci_ops *ops,
> diff --git a/include/linux/pci.h b/include/linux/pci.h
> index 2b1b998..463eaa3 100644
> --- a/include/linux/pci.h
> +++ b/include/linux/pci.h
> @@ -402,6 +402,7 @@ static inline int pci_channel_offline(struct pci_dev *pdev)
>  
>  struct pci_host_bridge {
>  	u16	domain;
> +	u16 busnum;

Why do we need this?  host_bridge->bus->number and
host_bridge->bus->busn_res.start both already contain the same information,
and I hate to add a third place.  I know pci_create_host_bridge() doesn't
have a struct pci_bus at the point where you initialize busnum, but it does
have the resource list, which contains the bus number range.

>  	struct device dev;
>  	struct pci_bus *bus;		/* root bus */
>  	struct list_head windows;	/* resource_entry */
> -- 
> 1.7.1
> 

  reply	other threads:[~2015-03-12  3:52 UTC|newest]

Thread overview: 513+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-03-09  2:33 [PATCH v6 00/30] Refine PCI scan interfaces and make generic pci host bridge Yijing Wang
2015-03-09  2:33 ` Yijing Wang
2015-03-09  2:33 ` Yijing Wang
2015-03-09  2:33 ` Yijing Wang
2015-03-09  2:33 ` Yijing Wang
2015-03-09  2:33 ` [PATCH v6 01/30] PCI: Rip out pci_bus_add_devices() from pci_scan_bus() Yijing Wang
2015-03-09  2:33   ` Yijing Wang
2015-03-09  2:33   ` Yijing Wang
2015-03-09  2:33   ` Yijing Wang
2015-03-09  2:33   ` Yijing Wang
2015-03-09  2:33   ` Yijing Wang
2015-03-09  2:33 ` Yijing Wang
2015-03-09  2:33 ` [PATCH v6 02/30] PCI: Rip out pci_bus_add_devices() from pci_scan_root_bus() Yijing Wang
2015-03-09  2:33 ` Yijing Wang
2015-03-09  2:33   ` Yijing Wang
2015-03-09  2:33   ` Yijing Wang
2015-03-09  2:33   ` Yijing Wang
2015-03-09  2:33   ` Yijing Wang
2015-03-09  2:33   ` Yijing Wang
2015-03-09  2:34 ` [PATCH v6 03/30] PCI: Export busn_resource to drivers/pci Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-11 22:28   ` Bjorn Helgaas
2015-03-11 22:28   ` Bjorn Helgaas
2015-03-11 22:28     ` Bjorn Helgaas
2015-03-11 22:28     ` Bjorn Helgaas
2015-03-11 22:28     ` Bjorn Helgaas
2015-03-12 11:42     ` Yijing Wang
2015-03-12 11:42     ` Yijing Wang
2015-03-12 11:42       ` Yijing Wang
2015-03-12 11:42       ` Yijing Wang
2015-03-12 11:42       ` Yijing Wang
2015-03-12 11:42       ` Yijing Wang
2015-03-12 19:32       ` Bjorn Helgaas
2015-03-12 19:32         ` Bjorn Helgaas
2015-03-12 19:32         ` Bjorn Helgaas
2015-03-12 19:32         ` Bjorn Helgaas
2015-03-13  1:57         ` Yijing Wang
2015-03-13  1:57           ` Yijing Wang
2015-03-13  1:57           ` Yijing Wang
2015-03-13  1:57           ` Yijing Wang
2015-03-13  1:57           ` Yijing Wang
2015-03-13  1:57         ` Yijing Wang
2015-03-09  2:34 ` Yijing Wang
2015-03-09  2:34 ` [PATCH v6 04/30] xen/PCI: Don't use deprecated function pci_scan_bus_parented() Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-11 22:32   ` Bjorn Helgaas
2015-03-11 22:32   ` Bjorn Helgaas
2015-03-11 22:32   ` Bjorn Helgaas
2015-03-11 22:32     ` Bjorn Helgaas
2015-03-11 22:32     ` Bjorn Helgaas
2015-03-11 22:32     ` Bjorn Helgaas
2015-03-12 11:46     ` Yijing Wang
2015-03-12 11:46       ` Yijing Wang
2015-03-12 11:46       ` Yijing Wang
2015-03-12 11:46       ` Yijing Wang
2015-03-12 11:46       ` Yijing Wang
2015-03-12 19:35       ` Bjorn Helgaas
2015-03-12 19:35       ` Bjorn Helgaas
2015-03-12 19:35       ` Bjorn Helgaas
2015-03-12 19:35         ` Bjorn Helgaas
2015-03-12 19:35         ` Bjorn Helgaas
2015-03-12 19:35         ` Bjorn Helgaas
2015-03-13  2:36         ` Yijing Wang
2015-03-13  2:36         ` Yijing Wang
2015-03-13  2:36           ` Yijing Wang
2015-03-13  2:36           ` Yijing Wang
2015-03-13  2:36           ` Yijing Wang
2015-03-13  2:36           ` Yijing Wang
2015-03-13 13:24           ` Bjorn Helgaas
2015-03-13 13:24           ` Bjorn Helgaas
2015-03-13 13:24           ` Bjorn Helgaas
2015-03-13 13:24             ` Bjorn Helgaas
2015-03-13 13:24             ` Bjorn Helgaas
2015-03-13 13:24             ` Bjorn Helgaas
2015-03-13 13:24             ` Bjorn Helgaas
2015-03-13 14:01             ` Konrad Rzeszutek Wilk
2015-03-13 14:01               ` Konrad Rzeszutek Wilk
2015-03-13 14:01               ` Konrad Rzeszutek Wilk
2015-03-13 14:01               ` Konrad Rzeszutek Wilk
2015-03-13 14:26               ` Bjorn Helgaas
2015-03-13 14:26                 ` Bjorn Helgaas
2015-03-13 14:26                 ` Bjorn Helgaas
2015-03-13 14:26                 ` Bjorn Helgaas
2015-03-25 19:23                 ` Konrad Rzeszutek Wilk
2015-03-25 19:23                   ` Konrad Rzeszutek Wilk
2015-03-25 19:23                   ` Konrad Rzeszutek Wilk
2015-03-25 19:23                   ` Konrad Rzeszutek Wilk
2015-03-26  1:18                   ` Yijing Wang
2015-03-26  1:18                   ` Yijing Wang
2015-03-26  1:18                     ` Yijing Wang
2015-03-26  1:18                     ` Yijing Wang
2015-03-26  1:18                     ` Yijing Wang
2015-03-26  7:30                   ` Yijing Wang
2015-03-26  7:30                     ` Yijing Wang
2015-03-26  7:30                     ` Yijing Wang
2015-03-26  7:30                     ` Yijing Wang
2015-03-26  7:30                   ` Yijing Wang
2015-03-25 19:23                 ` Konrad Rzeszutek Wilk
2015-03-13 14:26               ` Bjorn Helgaas
2015-03-13 14:01             ` Konrad Rzeszutek Wilk
2015-03-12 11:46     ` Yijing Wang
2015-03-12 11:46     ` Yijing Wang
2015-03-09  2:34 ` Yijing Wang
2015-03-09  2:34 ` Yijing Wang
2015-03-09  2:34 ` [PATCH v6 05/30] PCI: Remove deprecated pci_scan_bus_parented() Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34 ` [PATCH v6 06/30] PCI: Combine PCI domain and bus number in u32 arg Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-12  1:29   ` Bjorn Helgaas
2015-03-12  1:29   ` Bjorn Helgaas
2015-03-12  1:29     ` Bjorn Helgaas
2015-03-12  1:29     ` Bjorn Helgaas
2015-03-12  1:29     ` Bjorn Helgaas
2015-03-12 12:14     ` Yijing Wang
2015-03-12 12:14     ` Yijing Wang
2015-03-12 12:14       ` Yijing Wang
2015-03-12 12:14       ` Yijing Wang
2015-03-12 12:14       ` Yijing Wang
2015-03-12 12:14       ` Yijing Wang
2015-03-12 19:49       ` Bjorn Helgaas
2015-03-12 19:49       ` Bjorn Helgaas
2015-03-12 19:49         ` Bjorn Helgaas
2015-03-12 19:49         ` Bjorn Helgaas
2015-03-12 19:49         ` Bjorn Helgaas
2015-03-13  3:19         ` Yijing Wang
2015-03-13  3:19         ` Yijing Wang
2015-03-13  3:19           ` Yijing Wang
2015-03-13  3:19           ` Yijing Wang
2015-03-13  3:19           ` Yijing Wang
2015-03-13  3:19           ` Yijing Wang
2015-03-09  2:34 ` Yijing Wang
2015-03-09  2:34 ` [PATCH v6 07/30] PCI: Pass PCI domain number combined with root bus number Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-12  1:34   ` Bjorn Helgaas
2015-03-12  1:34   ` Bjorn Helgaas
2015-03-12  1:34   ` Bjorn Helgaas
2015-03-12  1:34     ` Bjorn Helgaas
2015-03-12  1:34     ` Bjorn Helgaas
2015-03-12  1:34     ` Bjorn Helgaas
2015-03-12  1:34     ` Bjorn Helgaas
2015-03-12  1:34     ` Bjorn Helgaas
2015-03-12 12:20     ` Yijing Wang
2015-03-12 12:20     ` Yijing Wang
2015-03-12 12:20     ` Yijing Wang
2015-03-12 12:20       ` Yijing Wang
2015-03-12 12:20       ` Yijing Wang
2015-03-12 12:20       ` Yijing Wang
2015-03-12 12:20       ` Yijing Wang
2015-03-12 12:20       ` Yijing Wang
2015-03-12 12:20       ` Yijing Wang
2015-03-17  5:15   ` [Xen-devel] " Manish Jaggi
2015-03-17  5:27     ` Manish Jaggi
2015-03-17  5:15     ` Manish Jaggi
2015-03-17  5:15     ` Manish Jaggi
2015-03-17  5:15     ` Manish Jaggi
2015-03-17  5:15     ` Manish Jaggi
2015-03-17  5:15     ` Manish Jaggi
2015-03-17 14:05     ` Ian Campbell
2015-03-17 14:05       ` Ian Campbell
2015-03-17 14:05       ` Ian Campbell
2015-03-17 14:05       ` Ian Campbell
2015-03-17 14:05       ` Ian Campbell
2015-03-17 14:05       ` Ian Campbell
2015-03-17 14:05       ` Ian Campbell
2015-03-18  4:26       ` Manish Jaggi
2015-03-18  5:56         ` Yijing Wang
2015-03-17 14:05     ` [Xen-devel] " Ian Campbell
2015-03-17 14:05     ` Ian Campbell
2015-03-17  5:15   ` Manish Jaggi
2015-03-17  5:15   ` [Xen-devel] " Manish Jaggi
2015-03-09  2:34 ` Yijing Wang
2015-03-09  2:34 ` Yijing Wang
2015-03-09  2:34 ` [PATCH v6 08/30] PCI: Introduce pci_host_assign_domain_nr() to assign domain Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-12  1:39   ` Bjorn Helgaas
2015-03-12  1:39   ` Bjorn Helgaas
2015-03-12  1:39     ` Bjorn Helgaas
2015-03-12  1:39     ` Bjorn Helgaas
2015-03-12  1:39     ` Bjorn Helgaas
2015-03-12 12:23     ` Yijing Wang
2015-03-12 12:23       ` Yijing Wang
2015-03-12 12:23       ` Yijing Wang
2015-03-12 12:23       ` Yijing Wang
2015-03-12 12:23       ` Yijing Wang
2015-03-12 12:23     ` Yijing Wang
2015-03-09  2:34 ` Yijing Wang
2015-03-09  2:34 ` [PATCH v6 09/30] PCI: Separate pci_host_bridge creation out of pci_create_root_bus() Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-12  3:52   ` Bjorn Helgaas [this message]
2015-03-12  3:52     ` Bjorn Helgaas
2015-03-12  3:52     ` Bjorn Helgaas
2015-03-12  3:52     ` Bjorn Helgaas
2015-03-12 13:44     ` Yijing Wang
2015-03-12 13:44     ` Yijing Wang
2015-03-12 13:44       ` Yijing Wang
2015-03-12 13:44       ` Yijing Wang
2015-03-12 13:44       ` Yijing Wang
2015-03-12 13:44       ` Yijing Wang
2015-03-12  3:52   ` Bjorn Helgaas
2015-03-21 23:21   ` Suravee Suthikulpanit
2015-03-21 23:21     ` Suravee Suthikulpanit
2015-03-21 23:21     ` Suravee Suthikulpanit
2015-03-21 23:21     ` Suravee Suthikulpanit
2015-03-21 23:21     ` Suravee Suthikulpanit
2015-03-23  1:08     ` Yijing Wang
2015-03-23  1:08     ` Yijing Wang
2015-03-23  1:08       ` Yijing Wang
2015-03-23  1:08       ` Yijing Wang
2015-03-23  1:08       ` Yijing Wang
2015-03-23  1:08       ` Yijing Wang
2015-03-09  2:34 ` Yijing Wang
2015-03-09  2:34 ` [PATCH v6 10/30] PCI: Introduce pci_host_bridge_list to manage host bridges Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-12  2:55   ` Bjorn Helgaas
2015-03-12  2:55     ` Bjorn Helgaas
2015-03-12  2:55     ` Bjorn Helgaas
2015-03-12  2:55     ` Bjorn Helgaas
2015-03-12 13:03     ` Yijing Wang
2015-03-12 13:03     ` Yijing Wang
2015-03-12 13:03       ` Yijing Wang
2015-03-12 13:03       ` Yijing Wang
2015-03-12 13:03       ` Yijing Wang
2015-03-12 13:03       ` Yijing Wang
2015-03-12 19:56       ` Bjorn Helgaas
2015-03-12 19:56         ` Bjorn Helgaas
2015-03-12 19:56         ` Bjorn Helgaas
2015-03-12 19:56         ` Bjorn Helgaas
2015-03-13  3:28         ` Yijing Wang
2015-03-13  3:28         ` Yijing Wang
2015-03-13  3:28           ` Yijing Wang
2015-03-13  3:28           ` Yijing Wang
2015-03-13  3:28           ` Yijing Wang
2015-03-13  3:28           ` Yijing Wang
2015-03-13 14:33           ` Bjorn Helgaas
2015-03-13 14:33             ` Bjorn Helgaas
2015-03-13 14:33             ` Bjorn Helgaas
2015-03-13 14:33             ` Bjorn Helgaas
2015-03-16  1:28             ` Yijing Wang
2015-03-16  1:28             ` Yijing Wang
2015-03-16  1:28               ` Yijing Wang
2015-03-16  1:28               ` Yijing Wang
2015-03-16  1:28               ` Yijing Wang
2015-03-16  1:28               ` Yijing Wang
2015-03-12 19:56       ` Bjorn Helgaas
2015-03-09  2:34 ` Yijing Wang
2015-03-09  2:34 ` [PATCH v6 11/30] PCI: Save sysdata in pci_host_bridge drvdata Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34 ` Yijing Wang
2015-03-09  2:34 ` [PATCH v6 12/30] PCI: Introduce pci_host_bridge_ops to support host specific operations Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-12  3:23   ` Bjorn Helgaas
2015-03-12  3:23   ` Bjorn Helgaas
2015-03-12  3:23     ` Bjorn Helgaas
2015-03-12  3:23     ` Bjorn Helgaas
2015-03-12  3:23     ` Bjorn Helgaas
2015-03-12 13:14     ` Yijing Wang
2015-03-12 13:14     ` Yijing Wang
2015-03-12 13:14       ` Yijing Wang
2015-03-12 13:14       ` Yijing Wang
2015-03-12 13:14       ` Yijing Wang
2015-03-12 13:14       ` Yijing Wang
2015-03-09  2:34 ` Yijing Wang
2015-03-09  2:34 ` [PATCH v6 13/30] PCI: Introduce new scan function pci_scan_host_bridge() Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-12  3:25   ` Bjorn Helgaas
2015-03-12  3:25     ` Bjorn Helgaas
2015-03-12  3:25     ` Bjorn Helgaas
2015-03-12  3:25     ` Bjorn Helgaas
2015-03-12 13:15     ` Yijing Wang
2015-03-12 13:15     ` Yijing Wang
2015-03-12 13:15       ` Yijing Wang
2015-03-12 13:15       ` Yijing Wang
2015-03-12 13:15       ` Yijing Wang
2015-03-12 13:15       ` Yijing Wang
2015-03-12  3:25   ` Bjorn Helgaas
2015-03-09  2:34 ` [PATCH v6 14/30] x86/PCI: Refine pci_acpi_scan_root() with generic pci_host_bridge Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34 ` Yijing Wang
2015-03-09  2:34 ` [PATCH v6 15/30] ia64/PCI: " Yijing Wang
2015-03-09  2:34 ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34 ` [PATCH v6 16/30] powerpc/pci: Rename pcibios_root_bridge_prepare() Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34 ` Yijing Wang
2015-03-09  2:34 ` [PATCH v6 17/30] powerpc/pci: Use pci_scan_host_bridge() for simplicity Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34 ` Yijing Wang
2015-03-09  2:34 ` [PATCH v6 18/30] PCI: Remove weak pcibios_root_bridge_prepare() Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34 ` [PATCH v6 19/30] sparc/PCI: Claim bus resources before pci_bus_add_devices() Yijing Wang
2015-03-09  2:34 ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34 ` [PATCH v6 20/30] sparc/PCI: Use pci_scan_host_bridge() for simplicity Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-12  3:30   ` Bjorn Helgaas
2015-03-12  3:30   ` Bjorn Helgaas
2015-03-12  3:30     ` Bjorn Helgaas
2015-03-12  3:30     ` Bjorn Helgaas
2015-03-12  3:30     ` Bjorn Helgaas
2015-03-12  3:30     ` Bjorn Helgaas
2015-03-12 13:17     ` Yijing Wang
2015-03-12 13:17     ` Yijing Wang
2015-03-12 13:17       ` Yijing Wang
2015-03-12 13:17       ` Yijing Wang
2015-03-12 13:17       ` Yijing Wang
2015-03-12 13:17       ` Yijing Wang
2015-03-12 13:17       ` Yijing Wang
2015-03-09  2:34 ` Yijing Wang
2015-03-09  2:34 ` [PATCH v6 21/30] PCI: Introduce pci_bus_child_max_busnr() Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-12  3:33   ` Bjorn Helgaas
2015-03-12  3:33     ` Bjorn Helgaas
2015-03-12  3:33     ` Bjorn Helgaas
2015-03-12  3:33     ` Bjorn Helgaas
2015-03-12 13:24     ` Yijing Wang
2015-03-12 13:24     ` Yijing Wang
2015-03-12 13:24       ` Yijing Wang
2015-03-12 13:24       ` Yijing Wang
2015-03-12 13:24       ` Yijing Wang
2015-03-12 13:24       ` Yijing Wang
2015-03-12  3:36   ` Bjorn Helgaas
2015-03-12  3:36   ` Bjorn Helgaas
2015-03-12  3:36     ` Bjorn Helgaas
2015-03-12  3:36     ` Bjorn Helgaas
2015-03-12  3:36     ` Bjorn Helgaas
2015-03-12 13:28     ` Yijing Wang
2015-03-12 13:28       ` Yijing Wang
2015-03-12 13:28       ` Yijing Wang
2015-03-12 13:28       ` Yijing Wang
2015-03-12 13:28       ` Yijing Wang
2015-03-12 20:00       ` Bjorn Helgaas
2015-03-12 20:00         ` Bjorn Helgaas
2015-03-12 20:00         ` Bjorn Helgaas
2015-03-12 20:00         ` Bjorn Helgaas
2015-03-12 20:00       ` Bjorn Helgaas
2015-03-12 13:28     ` Yijing Wang
2015-03-09  2:34 ` [PATCH v6 22/30] parisc/PCI: Use pci_scan_root_bus() for simplicity Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34 ` Yijing Wang
2015-03-09  2:34 ` [PATCH v6 23/30] PCI/mvebu: Use pci_common_init_dev() to simplify code Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34 ` [PATCH v6 24/30] PCI/tegra: Remove redundant tegra_pcie_scan_bus() Yijing Wang
2015-03-09  2:34 ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34 ` [PATCH v6 25/30] PCI/designware: Use pci_scan_root_bus() for simplicity Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34 ` Yijing Wang
2015-03-09  2:34 ` [PATCH v6 26/30] PCI/xgene: Use pci_scan_root_bus() instead of pci_create_root_bus() Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34 ` Yijing Wang
2015-03-09  2:34 ` [PATCH v6 27/30] PCI: Rename __pci_create_root_bus() to pci_create_root_bus() Yijing Wang
2015-03-09  2:34 ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34 ` [PATCH v6 28/30] PCI: Export find_pci_host_bridge() and rename to pci_find_host_bridge() Yijing Wang
2015-03-09  2:34 ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-12  3:43   ` Bjorn Helgaas
2015-03-12  3:43   ` Bjorn Helgaas
2015-03-12  3:43     ` Bjorn Helgaas
2015-03-12  3:43     ` Bjorn Helgaas
2015-03-12  3:43     ` Bjorn Helgaas
2015-03-12 13:29     ` Yijing Wang
2015-03-12 13:29       ` Yijing Wang
2015-03-12 13:29       ` Yijing Wang
2015-03-12 13:29       ` Yijing Wang
2015-03-12 13:29       ` Yijing Wang
2015-03-09  2:34 ` [PATCH v6 29/30] PCI: Remove platform specific pci_domain_nr() Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34 ` [PATCH v6 30/30] PCI: Remove pci_bus_assign_domain_nr() Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-09  2:34   ` Yijing Wang
2015-03-12  3:48   ` Bjorn Helgaas
2015-03-12  3:48   ` Bjorn Helgaas
2015-03-12  3:48     ` Bjorn Helgaas
2015-03-12  3:48     ` Bjorn Helgaas
2015-03-12  3:48     ` Bjorn Helgaas
2015-03-12 13:32     ` Yijing Wang
2015-03-12 13:32     ` Yijing Wang
2015-03-12 13:32       ` Yijing Wang
2015-03-12 13:32       ` Yijing Wang
2015-03-12 13:32       ` Yijing Wang
2015-03-12 13:32       ` Yijing Wang
2015-03-09  2:34 ` Yijing Wang
2015-03-12 21:23 ` [PATCH v6 00/30] Refine PCI scan interfaces and make generic pci host bridge Bjorn Helgaas
2015-03-12 21:23 ` Bjorn Helgaas
2015-03-12 21:23   ` Bjorn Helgaas
2015-03-12 21:23   ` Bjorn Helgaas
2015-03-12 21:23   ` Bjorn Helgaas
2015-03-13  3:29   ` Yijing Wang
2015-03-13  3:29     ` Yijing Wang
2015-03-13  3:29     ` Yijing Wang
2015-03-13  3:29     ` Yijing Wang
2015-03-13  3:29     ` Yijing Wang
2015-03-13 11:31   ` Liviu Dudau
2015-03-13 11:31   ` Liviu Dudau
2015-03-13 11:31     ` Liviu Dudau
2015-03-13 11:31     ` Liviu Dudau
2015-03-13 14:48     ` Bjorn Helgaas
2015-03-13 14:48       ` Bjorn Helgaas
2015-03-13 14:48       ` Bjorn Helgaas
2015-03-13 14:48       ` Bjorn Helgaas
2015-03-16  1:31       ` Yijing Wang
2015-03-16  1:31         ` Yijing Wang
2015-03-16  1:31         ` Yijing Wang
2015-03-16  1:31         ` Yijing Wang
2015-03-16  1:31         ` Yijing Wang
2015-03-13 14:48     ` Bjorn Helgaas
2015-03-16  1:48     ` Yijing Wang
2015-03-16  1:48     ` Yijing Wang
2015-03-16  1:48       ` Yijing Wang
2015-03-16  1:48       ` Yijing Wang
2015-03-16  1:48       ` Yijing Wang
2015-03-16  1:48       ` Yijing Wang
2015-03-17 10:55       ` Liviu Dudau
2015-03-17 10:55         ` Liviu Dudau
2015-03-17 10:55         ` Liviu Dudau
2015-03-17 10:55       ` Liviu Dudau

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=20150312035202.GL10949@google.com \
    --to=bhelgaas@google.com \
    --cc=arnd@arndb.de \
    --cc=benh@kernel.crashing.org \
    --cc=davem@davemloft.net \
    --cc=geert@linux-m68k.org \
    --cc=gxt@mprc.pku.edu.cn \
    --cc=jiang.liu@linux.intel.com \
    --cc=linux-alpha@vger.kernel.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-ia64@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-m68k@vger.kernel.org \
    --cc=linux-pci@vger.kernel.org \
    --cc=linux@arm.linux.org.uk \
    --cc=liviu@dudau.co.uk \
    --cc=marc.zyngier@arm.com \
    --cc=rusty@rustcorp.com.au \
    --cc=tglx@linutronix.de \
    --cc=tony.luck@intel.com \
    --cc=wangyijing@huawei.com \
    --cc=x86@kernel.org \
    --cc=yinghai@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.