[PATCH v3 1/2] PCI: generic: remove dependency on hw_pci
Jayachandran C.
jchandra at broadcom.com
Fri Jul 31 09:07:01 PDT 2015
On Thu, Jul 30, 2015 at 02:35:21PM +0100, Lorenzo Pieralisi wrote:
> On Wed, Jul 29, 2015 at 04:28:00PM +0100, Jayachandran C wrote:
> > The current code in pci-host-generic.c uses pci_common_init_dev()
> > from ARM platform to do some of the PCI initializations, and this
> > prevents it from being used in ARM64.
> >
> > The initialization done by pci_common_init_dev() that is needed
> > by pci-host-generic.c is really limited, and can be done easily
> > in the same file without using hw_pci API. The ARM platform
> > requires a pci_sys_data as sysdata for the PCI bus, this can be
> > handled by setting up gen_pci to have a pci_sys_data variable as
> > the first element.
>
> For the sake of enabling it on ARM64, I am okay with getting
> this merged, keeping in mind that as I already said pci_sys_data
> has to go, it is a hack and I do not want it to spread to
> ALL PCI host drivers that have to work on both ARM/ARM64.
>
> Comments and tags below.
>
> > Signed-off-by: Jayachandran C <jchandra at broadcom.com>
> > ---
> > Here's v3 of the patchset.
> >
> > v2-v3
> > - rebase to 4.2-rc
> > - fix PCI_PROBE_ONLY check before calling pcie configure
> > - added a comment above sysdata
> > - updated the commit message
> >
> > v1->v2
> > - Address comments from Arnd Bergmann and Lorenzo Pieralisi
> > - move contents of gen_pci_init to gen_pci_probe
> > - assign resources only when !probe_only
> > - tested on ARM32 with qemu option -M virt
> >
> > Notes:
> > - passing a zeroed out pci_sys_data for ARM looks ok, but I haven't
> > tested it on ARM.
> > - tested it on ARM64 fast model
> > - Any information on how this can be tested on arm is welcome.
> > - There is only one ifdef, and that can be removed when arm64 gets
> > a sysdata, or when arm loses its sysdata.
> >
> > drivers/pci/host/pci-host-generic.c | 55 ++++++++++++++++++++++++-------------
> > 1 file changed, 36 insertions(+), 19 deletions(-)
> >
> > diff --git a/drivers/pci/host/pci-host-generic.c b/drivers/pci/host/pci-host-generic.c
> > index ba46e58..e9d9c80 100644
> > --- a/drivers/pci/host/pci-host-generic.c
> > +++ b/drivers/pci/host/pci-host-generic.c
> > @@ -38,7 +38,15 @@ struct gen_pci_cfg_windows {
> > const struct gen_pci_cfg_bus_ops *ops;
> > };
> >
> > +/*
> > + * ARM needs platform specific pci_sys_data as the sysdata for PCI.
> > + * We add the sys as the first field below to handle this. sys will
> > + * set to 0, so that the pci functions in do the right thing.
> > + */
> > struct gen_pci {
> > +#ifdef CONFIG_ARM
> > + struct pci_sys_data sys;
> > +#endif
> > struct pci_host_bridge host;
> > struct gen_pci_cfg_windows cfg;
> > struct list_head resources;
> > @@ -48,8 +56,7 @@ static void __iomem *gen_pci_map_cfg_bus_cam(struct pci_bus *bus,
> > unsigned int devfn,
> > int where)
> > {
> > - struct pci_sys_data *sys = bus->sysdata;
> > - struct gen_pci *pci = sys->private_data;
> > + struct gen_pci *pci = bus->sysdata;
> > resource_size_t idx = bus->number - pci->cfg.bus_range->start;
> >
> > return pci->cfg.win[idx] + ((devfn << 8) | where);
> > @@ -64,8 +71,7 @@ static void __iomem *gen_pci_map_cfg_bus_ecam(struct pci_bus *bus,
> > unsigned int devfn,
> > int where)
> > {
> > - struct pci_sys_data *sys = bus->sysdata;
> > - struct gen_pci *pci = sys->private_data;
> > + struct gen_pci *pci = bus->sysdata;
> > resource_size_t idx = bus->number - pci->cfg.bus_range->start;
> >
> > return pci->cfg.win[idx] + ((devfn << 12) | where);
> > @@ -198,13 +204,6 @@ static int gen_pci_parse_map_cfg_windows(struct gen_pci *pci)
> > return 0;
> > }
> >
> > -static int gen_pci_setup(int nr, struct pci_sys_data *sys)
> > -{
> > - struct gen_pci *pci = sys->private_data;
> > - list_splice_init(&pci->resources, &sys->resources);
> > - return 1;
> > -}
> > -
> > static int gen_pci_probe(struct platform_device *pdev)
> > {
> > int err;
> > @@ -214,13 +213,7 @@ static int gen_pci_probe(struct platform_device *pdev)
> > struct device *dev = &pdev->dev;
> > struct device_node *np = dev->of_node;
> > struct gen_pci *pci = devm_kzalloc(dev, sizeof(*pci), GFP_KERNEL);
> > - struct hw_pci hw = {
> > - .nr_controllers = 1,
> > - .private_data = (void **)&pci,
> > - .setup = gen_pci_setup,
> > - .map_irq = of_irq_parse_and_map_pci,
> > - .ops = &gen_pci_ops,
> > - };
> > + struct pci_bus *bus;
> >
> > if (!pci)
> > return -ENOMEM;
> > @@ -258,7 +251,31 @@ static int gen_pci_probe(struct platform_device *pdev)
> > return err;
> > }
> >
> > - pci_common_init_dev(dev, &hw);
> > + /* do not reassign resource if probe only */
> > + if (!pci_has_flag(PCI_PROBE_ONLY))
> > + pci_add_flags(PCI_REASSIGN_ALL_RSRC);
>
> You should add PCI_REASSIGN_ALL_BUS here. As I said in patch 2 comment,
The idea is to do exactly what pci_common_init_dev does on ARM. There is
not need to change behavior on ARM and deal with the fallout in this
patchset.
> please enable setup-irq.c in an explicit commit, re-sequence the
> series and fold the Kconfig ARM64 enablement in this patch.
I would think that the Makefile and Kconfig changes should be
togethter as the arm64 enablement patch. The previous patch is
to update the gen_pci driver, and it really makes sense in that
order. I am not sure why you suggest this change.
JC.
More information about the linux-arm-kernel
mailing list