On Thu, 2013-09-12 at 18:07 +0800, Minghuan Lian wrote:
> The Freescale's Layerscape series processors will use the same PCI
> controller but change cores from PowerPC to ARM. This patch is to
> rework FSL PCI driver to support PowerPC and ARM simultaneously.
> PowerPC uses structure pci_controller to describe PCI controller,
> but arm uses structure hw_pci and pci_sys_data. They also have
> different architecture implementation and initialization flow.
> The architecture-dependent driver will bridge the gap, get the
> settings from the common driver and initialize the corresponding
> structure and call the related interface to register PCI controller.
> The common driver pci-fsl.c removes all the architecture-specific
> code and provides structure fsl_pci to store all the controller
> settings and the common functionalities that include reading/writing
> PCI configuration space, parsing dts node and getting the MEM/IO and
> bus number ranges, setting ATMU and check link status.
> 
> Signed-off-by: Minghuan Lian <minghuan.l...@freescale.com>
> ---
> Based on upstream master
> The function has been tested on MPC8315ERDB MPC8572DS P5020DS P3041DS
> and T4240QDS boards 
> 
> Change log:
> v3:
> 1. use 'fsl_arch' as function name prefix of all the
>    architecture-specific hooks.
> 2. Move PCI compatible definitions from arch/powerpc/sysdev/fsl_pci.c
>    to driver/pci/host/pci-fsl.c 
> 
> v2:
> 1. Use 'pci' instead of 'pcie' in new file name and file contents. 
> 2. Use iowrite32be()/iowrite32() instead of out_be32/le32()
> 3. Fix ppc_md.dma_set_mask setting
> 4. Synchronizes host->first_busno and pci->first_busno.
> 5. Fix PCI IO space settings
> 6. Some small changes according to Scott's comments.
> 
> 
>  arch/powerpc/Kconfig          |   1 +
>  arch/powerpc/sysdev/fsl_pci.c | 150 +++++++++-
>  drivers/edac/mpc85xx_edac.c   |   9 -
>  drivers/pci/host/Kconfig      |   4 +
>  drivers/pci/host/Makefile     |   1 +
>  drivers/pci/host/pci-fsl.c    | 656 
> +++++++++++++++++++++++++++---------------
>  include/linux/fsl/pci.h       |  69 +++++
>  7 files changed, 648 insertions(+), 242 deletions(-)

The PCI mailing list and maintainer should be included.

> diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
> index 6b7530f..657d90f 100644
> --- a/arch/powerpc/Kconfig
> +++ b/arch/powerpc/Kconfig
> @@ -691,6 +691,7 @@ config FSL_SOC
>  
>  config FSL_PCI
>       bool
> +     select PCI_FSL if FSL_SOC_BOOKE || PPC_86xx
>       select PPC_INDIRECT_PCI
>       select PCI_QUIRKS
>  
> diff --git a/arch/powerpc/sysdev/fsl_pci.c b/arch/powerpc/sysdev/fsl_pci.c
> index a189ff0..4cb12e8 100644
> --- a/arch/powerpc/sysdev/fsl_pci.c
> +++ b/arch/powerpc/sysdev/fsl_pci.c
> @@ -62,7 +62,11 @@ static void quirk_fsl_pcie_header(struct pci_dev *dev)
>  #if defined(CONFIG_FSL_SOC_BOOKE) || defined(CONFIG_PPC_86xx)
>  
>  #define MAX_PHYS_ADDR_BITS   40
> -static u64 pci64_dma_offset = 1ull << MAX_PHYS_ADDR_BITS;
> +
> +u64 fsl_arch_pci64_dma_offset(void)
> +{
> +     return 1ull << MAX_PHYS_ADDR_BITS;
> +}
>  
>  static int fsl_pci_dma_set_mask(struct device *dev, u64 dma_mask)
>  {
> @@ -77,17 +81,43 @@ static int fsl_pci_dma_set_mask(struct device *dev, u64 
> dma_mask)
>       if ((dev->bus == &pci_bus_type) &&
>           dma_mask >= DMA_BIT_MASK(MAX_PHYS_ADDR_BITS)) {
>               set_dma_ops(dev, &dma_direct_ops);
> -             set_dma_offset(dev, pci64_dma_offset);
> +             set_dma_offset(dev, fsl_arch_pci64_dma_offset());
>       }

Is the intent for fsl_arch_pci64_dma_offset() to eventually do something
that isn't calculable at compile time?
 
>       *dev->dma_mask = dma_mask;
>       return 0;
>  }
>  
> +struct fsl_pci *fsl_arch_sys_to_pci(void *sys)
> +{
> +     struct pci_controller *hose = sys;
> +     struct fsl_pci *pci = hose->private_data;

If this were just to convert to fsl_pci, that seems like header
material.

> +     /* Update the first bus number */
> +     if (pci->first_busno != hose->first_busno)
> +             pci->first_busno = hose->first_busno;

This isn't part of the interface description in the header...

> +static int mpc83xx_pcie_check_link(struct pci_controller *hose)
> +{
> +     u32 val = 0;
> +
> +#define PCIE_LTSSM   0x0404          /* PCIE Link Training and Status */
> +#define PCIE_LTSSM_L0        0x16            /* L0 state */
> +
> +     early_read_config_dword(hose, 0, 0, PCIE_LTSSM, &val);
> +     if (val < PCIE_LTSSM_L0)
> +             return 1;
> +     return 0;
> +}

Aren't PCIE_LTSSM and PCIE_LTSSM_L0 defined in include/linux/fsl/pci.h
at this point?

> @@ -260,14 +259,6 @@ int mpc85xx_pci_err_probe(struct platform_device *op)
>       /* we only need the error registers */
>       r.start += 0xe00;
>  
> -     if (!devm_request_mem_region(&op->dev, r.start, resource_size(&r),
> -                                     pdata->name)) {
> -             printk(KERN_ERR "%s: Error while requesting mem region\n",
> -                    __func__);
> -             res = -EBUSY;
> -             goto err;
> -     }

Why?  If the relationship between the edac driver and the main pci
driver is changing, explain that.

>       pdata->pci_vbase = devm_ioremap(&op->dev, r.start, resource_size(&r));
>       if (!pdata->pci_vbase) {
>               printk(KERN_ERR "%s: Unable to setup PCI err regs\n", __func__);
> diff --git a/drivers/pci/host/Kconfig b/drivers/pci/host/Kconfig
> index 3d95048..37d25ae 100644
> --- a/drivers/pci/host/Kconfig
> +++ b/drivers/pci/host/Kconfig
> @@ -19,4 +19,8 @@ config PCI_TEGRA
>       bool "NVIDIA Tegra PCIe controller"
>       depends on ARCH_TEGRA
>  
> +config PCI_FSL
> +     bool "Freescale PCI/PCIe controller"
> +     depends on FSL_SOC_BOOKE || PPC_86xx

Needs help text.

Make it clear that this is for 85xx/86xx/QorIQ/Layerscape, not all
Freescale chips with PCI/PCIe.

>  no_bridge:
> -     iounmap(hose->private_data);
> -     /* unmap cfg_data & cfg_addr separately if not on same page */
> -     if (((unsigned long)hose->cfg_data & PAGE_MASK) !=
> -         ((unsigned long)hose->cfg_addr & PAGE_MASK))
> -             iounmap(hose->cfg_data);
> -     iounmap(hose->cfg_addr);
> -     pcibios_free_controller(hose);
> -     return -ENODEV;
> +     dev_info(&pdev->dev, "It works as EP mode\n");
> +     return -EPERM;

This is a poorly phrased message.  In any case, what does this change
have to do with making the PCI driver compatible with layerscape?

-Scott



_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to