From: Will Deacon <will.deacon@arm.com>
To: Liviu Dudau <Liviu.Dudau@arm.com>
Cc: Bjorn Helgaas <bhelgaas@google.com>,
Catalin Marinas <Catalin.Marinas@arm.com>,
Arnd Bergmann <arnd@arndb.de>, Jingoo Han <jg1.han@samsung.com>,
Kukjin Kim <kgene.kim@samsung.com>,
Suravee Suthikulanit <suravee.suthikulpanit@amd.com>,
linux-pci <linux-pci@vger.kernel.org>,
LKML <linux-kernel@vger.kernel.org>,
LAKML <linux-arm-kernel@lists.infradead.org>
Subject: Re: [PATCH] drivers: pci: convert generic host controller to DT host bridge creation API
Date: Tue, 19 Aug 2014 13:05:54 +0100 [thread overview]
Message-ID: <20140819120553.GA23128@arm.com> (raw)
In-Reply-To: <1407861695-25549-1-git-send-email-Liviu.Dudau@arm.com>
Hi guys,
On Tue, Aug 12, 2014 at 05:41:35PM +0100, Liviu Dudau wrote:
> From: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
>
> In order to consolidate DT configuration for PCI host controllers in the
> kernel, a new API was introduced that allows creating a host bridge
> and its PCI bus from DT, removing duplicated code present in the
> majority of pci host driver implementations.
>
> This patch converts the existing PCI generic host controller driver to
> the new API. Most of the code parsing ranges and creating resources is
> now delegated to of_create_pci_host_bridge() API which also triggers
> a scan of the root bus.
>
> The setup hook passed by the host controller code to the generic DT
> layer completes the initialization by performing resource filtering
> (ie it checks that at least one non-prefetchable memory resource is
> present), remapping IO and configuration regions and initializing
> the required PCI flags.
[...]
> -static void gen_pci_release_of_pci_ranges(struct gen_pci *pci)
> -{
> - struct pci_host_bridge_window *win;
> -
> - list_for_each_entry(win, &pci->resources, list)
> - release_resource(win->res);
> -
> - pci_free_resource_list(&pci->resources);
> -}
I take it Liviu's core patches take care of this clean-up now if we fail mid
way through requesting the resources?
> -static int gen_pci_setup(int nr, struct pci_sys_data *sys)
> +static int gen_pci_setup(struct pci_host_bridge *host,
> + resource_size_t io_cpuaddr)
> {
> - struct gen_pci *pci = sys->private_data;
> - list_splice_init(&pci->resources, &sys->resources);
> - return 1;
> + int err;
> + struct pci_host_bridge_window *window;
> + u32 restype, prefetchable;
> + struct device *dev = host->dev.parent;
> + struct resource *iores = NULL;
> + bool res_valid = false;
> +
> + list_for_each_entry(window, &host->windows, list) {
> + restype = window->res->flags & IORESOURCE_TYPE_BITS;
> + prefetchable = window->res->flags & IORESOURCE_PREFETCH;
> +
> + /*
> + * Require at least one non-prefetchable MEM resource
> + */
> + if ((restype == IORESOURCE_MEM) && !prefetchable)
> + res_valid = true;
> +
> + if (restype == IORESOURCE_IO)
> + iores = window->res;
> + }
> +
> + if (!res_valid) {
> + dev_err(dev, "non-prefetchable memory resource required\n");
> + return -EINVAL;
> + }
> +
> + if (iores) {
> + if (!PAGE_ALIGNED(io_cpuaddr))
> + return -EINVAL;
Why is this alignment check not in the core code? Probably a question for
somebody like Arnd, but do we need to deal with multiple IO resources?
Currently we'll just silently take the last one that we found, which doesn't
sound ideal.
> + if (err)
> + return err;
> + }
> +
> + /* Parse and map our Configuration Space windows */
> + err = gen_pci_parse_map_cfg_windows(host);
> + if (err)
> + return err;
> +
> + pci_add_flags(PCI_ENABLE_PROC_DOMAINS);
> + pci_add_flags(PCI_REASSIGN_ALL_BUS | PCI_REASSIGN_ALL_RSRC);
Why does this belong in the host controller driver and how does it interact
with the probe-only property?
Will
WARNING: multiple messages have this Message-ID (diff)
From: will.deacon@arm.com (Will Deacon)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH] drivers: pci: convert generic host controller to DT host bridge creation API
Date: Tue, 19 Aug 2014 13:05:54 +0100 [thread overview]
Message-ID: <20140819120553.GA23128@arm.com> (raw)
In-Reply-To: <1407861695-25549-1-git-send-email-Liviu.Dudau@arm.com>
Hi guys,
On Tue, Aug 12, 2014 at 05:41:35PM +0100, Liviu Dudau wrote:
> From: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
>
> In order to consolidate DT configuration for PCI host controllers in the
> kernel, a new API was introduced that allows creating a host bridge
> and its PCI bus from DT, removing duplicated code present in the
> majority of pci host driver implementations.
>
> This patch converts the existing PCI generic host controller driver to
> the new API. Most of the code parsing ranges and creating resources is
> now delegated to of_create_pci_host_bridge() API which also triggers
> a scan of the root bus.
>
> The setup hook passed by the host controller code to the generic DT
> layer completes the initialization by performing resource filtering
> (ie it checks that at least one non-prefetchable memory resource is
> present), remapping IO and configuration regions and initializing
> the required PCI flags.
[...]
> -static void gen_pci_release_of_pci_ranges(struct gen_pci *pci)
> -{
> - struct pci_host_bridge_window *win;
> -
> - list_for_each_entry(win, &pci->resources, list)
> - release_resource(win->res);
> -
> - pci_free_resource_list(&pci->resources);
> -}
I take it Liviu's core patches take care of this clean-up now if we fail mid
way through requesting the resources?
> -static int gen_pci_setup(int nr, struct pci_sys_data *sys)
> +static int gen_pci_setup(struct pci_host_bridge *host,
> + resource_size_t io_cpuaddr)
> {
> - struct gen_pci *pci = sys->private_data;
> - list_splice_init(&pci->resources, &sys->resources);
> - return 1;
> + int err;
> + struct pci_host_bridge_window *window;
> + u32 restype, prefetchable;
> + struct device *dev = host->dev.parent;
> + struct resource *iores = NULL;
> + bool res_valid = false;
> +
> + list_for_each_entry(window, &host->windows, list) {
> + restype = window->res->flags & IORESOURCE_TYPE_BITS;
> + prefetchable = window->res->flags & IORESOURCE_PREFETCH;
> +
> + /*
> + * Require at least one non-prefetchable MEM resource
> + */
> + if ((restype == IORESOURCE_MEM) && !prefetchable)
> + res_valid = true;
> +
> + if (restype == IORESOURCE_IO)
> + iores = window->res;
> + }
> +
> + if (!res_valid) {
> + dev_err(dev, "non-prefetchable memory resource required\n");
> + return -EINVAL;
> + }
> +
> + if (iores) {
> + if (!PAGE_ALIGNED(io_cpuaddr))
> + return -EINVAL;
Why is this alignment check not in the core code? Probably a question for
somebody like Arnd, but do we need to deal with multiple IO resources?
Currently we'll just silently take the last one that we found, which doesn't
sound ideal.
> + if (err)
> + return err;
> + }
> +
> + /* Parse and map our Configuration Space windows */
> + err = gen_pci_parse_map_cfg_windows(host);
> + if (err)
> + return err;
> +
> + pci_add_flags(PCI_ENABLE_PROC_DOMAINS);
> + pci_add_flags(PCI_REASSIGN_ALL_BUS | PCI_REASSIGN_ALL_RSRC);
Why does this belong in the host controller driver and how does it interact
with the probe-only property?
Will
next prev parent reply other threads:[~2014-08-19 12:05 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-08-12 16:41 [PATCH] drivers: pci: convert generic host controller to DT host bridge creation API Liviu Dudau
2014-08-12 16:41 ` Liviu Dudau
2014-08-19 12:05 ` Will Deacon [this message]
2014-08-19 12:05 ` Will Deacon
2014-08-20 11:23 ` Arnd Bergmann
2014-08-20 11:23 ` Arnd Bergmann
2014-09-04 13:39 ` Lorenzo Pieralisi
2014-09-04 13:39 ` Lorenzo Pieralisi
2014-09-04 14:05 ` Arnd Bergmann
2014-09-04 14:05 ` Arnd Bergmann
2014-09-04 16:02 ` Lorenzo Pieralisi
2014-09-04 16:02 ` Lorenzo Pieralisi
2014-09-04 18:56 ` Arnd Bergmann
2014-09-04 18:56 ` Arnd Bergmann
2014-08-20 11:27 ` Arnd Bergmann
2014-08-20 11:27 ` Arnd Bergmann
2014-08-20 12:31 ` Liviu Dudau
2014-08-20 12:31 ` Liviu Dudau
2014-08-20 19:39 ` Arnd Bergmann
2014-08-20 19:39 ` Arnd Bergmann
2014-08-21 23:07 ` Liviu Dudau
2014-08-21 23:07 ` Liviu Dudau
2014-08-20 22:35 ` Bjorn Helgaas
2014-08-20 22:35 ` Bjorn Helgaas
2014-08-21 18:02 ` Bjorn Helgaas
2014-08-21 18:02 ` Bjorn Helgaas
2014-08-21 22:13 ` Liviu Dudau
2014-08-21 22:13 ` Liviu Dudau
2014-08-21 23:01 ` Liviu Dudau
2014-08-21 23:01 ` Liviu Dudau
2014-08-22 5:13 ` Bjorn Helgaas
2014-08-22 5:13 ` Bjorn Helgaas
2014-08-22 12:32 ` Liviu Dudau
2014-08-22 12:32 ` Liviu Dudau
2014-08-22 15:27 ` Bjorn Helgaas
2014-08-22 15:27 ` Bjorn Helgaas
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=20140819120553.GA23128@arm.com \
--to=will.deacon@arm.com \
--cc=Catalin.Marinas@arm.com \
--cc=Liviu.Dudau@arm.com \
--cc=arnd@arndb.de \
--cc=bhelgaas@google.com \
--cc=jg1.han@samsung.com \
--cc=kgene.kim@samsung.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=suravee.suthikulpanit@amd.com \
/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.