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: 18+ 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-19 12:05 ` Will Deacon [this message]
2014-08-20 11:23 ` Arnd Bergmann
2014-09-04 13:39 ` Lorenzo Pieralisi
2014-09-04 14:05 ` Arnd Bergmann
2014-09-04 16:02 ` Lorenzo Pieralisi
2014-09-04 18:56 ` Arnd Bergmann
2014-08-20 11:27 ` Arnd Bergmann
2014-08-20 12:31 ` Liviu Dudau
2014-08-20 19:39 ` Arnd Bergmann
2014-08-21 23:07 ` Liviu Dudau
2014-08-20 22:35 ` Bjorn Helgaas
2014-08-21 18:02 ` Bjorn Helgaas
2014-08-21 22:13 ` Liviu Dudau
2014-08-21 23:01 ` Liviu Dudau
2014-08-22 5:13 ` Bjorn Helgaas
2014-08-22 12:32 ` Liviu Dudau
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=linux-arm-kernel@lists.infradead.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).