Originally written by Jason Jin and Mingkai Hu for mpc8536.
When QorIQ based board is configured as a PCIe agent, then unlock/enable
inbound PCI configuration cycles and init a 4K inbound memory window;
so that a PCIe host can access the PCIe agents SDRAM at address 0x0
* Supported in fsl_pci_init_port() after adding pcie_ep as a param
* Revamped copyright in drivers/pci/fsl_pci_init.c
* Mods in 85xx based board specific pci init after this change
Signed-off-by: Vivek Mahajan <vivek.mahajan@freescale.com>
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
                                pcie_ep ? "End Point" : "Root Complex",
                                pci_info[num].regs);
                first_free_busno = fsl_pci_init_port(&pci_info[num++],
-                                       &pcie3_hose, first_free_busno);
+                               &pcie3_hose, first_free_busno, pcie_ep);
                /*
                 * Activate ULI1575 legacy chip by performing a fake
                 * memory access.  Needed to make ULI RTC work.
                                pcie_ep ? "End Point" : "Root Complex",
                                pci_info[num].regs);
                first_free_busno = fsl_pci_init_port(&pci_info[num++],
-                                       &pcie2_hose, first_free_busno);
+                               &pcie2_hose, first_free_busno, pcie_ep);
        } else {
                printf ("    PCIE2: disabled\n");
        }
                                pcie_ep ? "End Point" : "Root Complex",
                                pci_info[num].regs);
                first_free_busno = fsl_pci_init_port(&pci_info[num++],
-                                       &pcie1_hose, first_free_busno);
+                               &pcie1_hose, first_free_busno, pcie_ep);
        } else {
                printf ("    PCIE1: disabled\n");
        }
 
                                pcie_ep ? "End Point" : "Root Complex",
                                pci_info[num].regs);
                first_free_busno = fsl_pci_init_port(&pci_info[num++],
-                                       &pcie2_hose, first_free_busno);
+                                       &pcie2_hose, first_free_busno, pcie_ep);
        } else {
                printf ("    PCIE2: disabled\n");
        }
                                pcie_ep ? "End Point" : "Root Complex",
                                pci_info[num].regs);
                first_free_busno = fsl_pci_init_port(&pci_info[num++],
-                                       &pcie1_hose, first_free_busno);
+                                       &pcie1_hose, first_free_busno, pcie_ep);
        } else {
                printf ("    PCIE1: disabled\n");
        }
 
                                pcie_ep ? "End Point" : "Root Complex",
                                pci_info[num].regs);
                first_free_busno = fsl_pci_init_port(&pci_info[num++],
-                                       &pcie2_hose, first_free_busno);
+                               &pcie2_hose, first_free_busno, pcie_ep);
 
                /*
                 * The workaround doesn't work on p2020 because the location
                                pcie_ep ? "End Point" : "Root Complex",
                                pci_info[num].regs);
                first_free_busno = fsl_pci_init_port(&pci_info[num++],
-                                       &pcie3_hose, first_free_busno);
+                               &pcie3_hose, first_free_busno, pcie_ep);
        } else {
                printf("    PCIE3: disabled\n");
        }
                                pcie_ep ? "End Point" : "Root Complex",
                                pci_info[num].regs);
                first_free_busno = fsl_pci_init_port(&pci_info[num++],
-                                       &pcie1_hose, first_free_busno);
+                               &pcie1_hose, first_free_busno, pcie_ep);
        } else {
                printf("    PCIE1: disabled\n");
        }
 
 
                SET_STD_PCI_INFO(pci_info[num], 1);
                first_free_busno = fsl_pci_init_port(&pci_info[num++],
-                                       &pci1_hose, first_free_busno);
+                                       &pci1_hose, first_free_busno, 0);
        } else {
                printf ("    PCI: disabled\n");
        }
                SET_STD_PCIE_INFO(pci_info[num], 1);
                printf ("    PCIE at base address %lx\n", pci_info[num].regs);
                first_free_busno = fsl_pci_init_port(&pci_info[num++],
-                                       &pcie1_hose, first_free_busno);
+                                       &pcie1_hose, first_free_busno, 0);
        } else {
                printf ("    PCIE: disabled\n");
        }
 
 /*
- * Copyright 2007 Freescale Semiconductor, Inc.
+ * Copyright 2007-2009 Freescale Semiconductor, Inc.
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
 }
 
 int fsl_pci_init_port(struct fsl_pci_info *pci_info,
-                       struct pci_controller *hose, int busno)
+                       struct pci_controller *hose, int busno, int pcie_ep)
 {
        volatile ccsr_fsl_pci_t *pci;
        struct pci_region *r;
 
        pci = (ccsr_fsl_pci_t *) pci_info->regs;
 
+       if (pcie_ep) {
+               volatile pit_t *pi = &pci->pit[2];
+
+               pci_setup_indirect(hose, (u32)&pci->cfg_addr,
+                                        (u32)&pci->cfg_data);
+               out_be32(&pi->pitar, 0);
+               out_be32(&pi->piwbar, 0);
+               out_be32(&pi->piwar, PIWAR_EN | PIWAR_LOCAL |
+                       PIWAR_READ_SNOOP | PIWAR_WRITE_SNOOP | PIWAR_IWS_4K);
+
+               fsl_pci_config_unlock(hose);
+               return 0;
+       }
+
        /* on non-PCIe controllers we don't have pme_msg_det so this code
         * should do nothing since the read will return 0
         */
 
 #define PIWAR_LOCAL            0x00f00000
 #define PIWAR_READ_SNOOP       0x00050000
 #define PIWAR_WRITE_SNOOP      0x00005000
+#define PIWAR_IWS_4K           0x0000000b
        u32     res2[3];
 } pit_t;
 
 };
 
 int fsl_pci_init_port(struct fsl_pci_info *pci_info,
-                               struct pci_controller *hose, int busno);
+                       struct pci_controller *hose, int busno, int pcie_ep);
 
 #define SET_STD_PCI_INFO(x, num) \
 {                      \