Handle MPC85xx PCIe reset errata (PCI-Ex 38)
authorKumar Gala <galak@kernel.crashing.org>
Fri, 7 Dec 2007 18:17:34 +0000 (12:17 -0600)
committerKumar Gala <galak@kernel.crashing.org>
Wed, 12 Dec 2007 04:34:20 +0000 (22:34 -0600)
On the MPC85xx boards that have PCIe enable the PCIe errata fix.
(MPC8544DS, MPC8548CDS, MPC8568MDS).

Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
drivers/pci/fsl_pci_init.c
include/asm-ppc/immap_fsl_pci.h
include/configs/MPC8544DS.h
include/configs/MPC8548CDS.h
include/configs/MPC8568MDS.h

index 1e778844a5aad779ae51411ef436139c5fd9d843..68e45e17b3c3b5d3e3dca778587c15ad80736c3e 100644 (file)
@@ -112,6 +112,29 @@ fsl_pci_init(struct pci_controller *hose)
                pci_hose_read_config_word(hose, dev, PCI_LTSSM, &ltssm);
                enabled = ltssm >= PCI_LTSSM_L0;
 
+#ifdef CONFIG_FSL_PCIE_RESET
+               if (ltssm == 1) {
+                       int i;
+                       debug("....PCIe link error. "
+                             "LTSSM=0x%02x.", ltssm);
+                       pci->pdb_stat |= 0x08000000; /* assert PCIe reset */
+                       temp32 = pci->pdb_stat;
+                       udelay(100);
+                       debug("  Asserting PCIe reset @%x = %x\n",
+                             &pci->pdb_stat, pci->pdb_stat);
+                       pci->pdb_stat &= ~0x08000000; /* clear reset */
+                       asm("sync;isync");
+                       for (i=0; i<100 && ltssm < PCI_LTSSM_L0; i++) {
+                               pci_hose_read_config_word(hose, dev, PCI_LTSSM,
+                                                       &ltssm);
+                               udelay(1000);
+                               debug("....PCIe link error. "
+                                     "LTSSM=0x%02x.\n", ltssm);
+                       }
+                       enabled = ltssm >= PCI_LTSSM_L0;
+               }
+#endif
+
                if (!enabled) {
                        debug("....PCIE link error.  Skipping scan."
                              "LTSSM=0x%02x\n", ltssm);
index bd732b6688954319dbce03482935859778d59705..6715064c94d39b156f02cccfcc37c169f2710dfa 100644 (file)
@@ -144,7 +144,9 @@ typedef struct ccsr_pci {
        u32     perr_cap1;      /* 0xe2c - PCIE Error Capture Register 1 */
        u32     perr_cap2;      /* 0xe30 - PCIE Error Capture Register 2 */
        u32     perr_cap3;      /* 0xe34 - PCIE Error Capture Register 3 */
-       char    res23[456];     /*     (- #x1000 #xe38) 456 */
+       char    res23[200];
+       u32     pdb_stat;       /* 0xf00 - PCIE Debug Status */
+       char    res24[252];
 } ccsr_fsl_pci_t;
 
 #endif /*__IMMAP_fsl_pci__*/
index b8cd50b62986f511fe7d016d1c2d1f8acfeb0407..545a76cc62154c1050dcd70db70bbcb3b24f936d 100644 (file)
@@ -40,6 +40,7 @@
 #define CONFIG_PCIE2           1       /* PCIE controler 2 (slot 2) */
 #define CONFIG_PCIE3           1       /* PCIE controler 3 (ULI bridge) */
 #define CONFIG_FSL_PCI_INIT    1       /* Use common FSL init code */
+#define CONFIG_FSL_PCIE_RESET  1       /* need PCIe reset errata */
 
 #define CONFIG_TSEC_ENET               /* tsec ethernet support */
 #define CONFIG_ENV_OVERWRITE
index 95affa556a850def116b4e576e2ef0b5f53edb60..3f382e59a6b5053d11778e91b193dd6094d058ab 100644 (file)
@@ -42,6 +42,7 @@
 #undef CONFIG_RIO
 #undef CONFIG_PCI2
 #define CONFIG_FSL_PCI_INIT    1       /* Use common FSL init code */
+#define CONFIG_FSL_PCIE_RESET  1       /* need PCIe reset errata */
 
 #define CONFIG_TSEC_ENET               /* tsec ethernet support */
 #define CONFIG_ENV_OVERWRITE
index 3822c1b825172a161434cb805832484d881f929f..59f490e8566d73b8b0b293f91cafa3d517c471c6 100644 (file)
@@ -37,6 +37,7 @@
 #define CONFIG_PCI1            1       /* PCI controller */
 #define CONFIG_PCIE1           1       /* PCIE controller */
 #define CONFIG_FSL_PCI_INIT    1       /* use common fsl pci init code */
+#define CONFIG_FSL_PCIE_RESET  1       /* need PCIe reset errata */
 #define CONFIG_TSEC_ENET               /* tsec ethernet support */
 #define CONFIG_QE                      /* Enable QE */
 #define CONFIG_ENV_OVERWRITE