sbc8548: update PCI/PCI-e support code
authorPaul Gortmaker <paul.gortmaker@windriver.com>
Mon, 21 Sep 2009 00:36:05 +0000 (20:36 -0400)
committerKumar Gala <galak@kernel.crashing.org>
Thu, 24 Sep 2009 17:05:00 +0000 (12:05 -0500)
The PCI/PCI-e support for the sbc8548 was based on an earlier
version of what the MPC8548CDS board was using, and in its
current state it won't even compile.  This re-syncs it to match
the latest codebase and makes use of the new shared PCI functions
to reduce board duplication.

It borrows from the MPC8568MDS, in that it pulls the PCI-e I/O
back to 0xe280_0000 (where PCI2 would be on MPC8548CDS), and
similarly it coalesces the PCI and PCI-e mem into one single TLB.

Both PCI-x and PCI-e have been tested with intel e1000 cards
under linux (with an accompanying dts change in place)

Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
Signed-off-by: Kumar Gala <galak@kernel.crashing.org>
board/sbc8548/law.c
board/sbc8548/sbc8548.c
board/sbc8548/tlb.c
include/configs/sbc8548.h

index e8c7ae2a2eeddcd49b8ba712569322b40d85c90e..6d1efc0c69e98122e25eb194445a4e1d6bf1e120 100644 (file)
  *
  * 0x0000_0000 0x0fff_ffff     DDR                     256M
  * 0x8000_0000 0x9fff_ffff     PCI1 MEM                512M
+ * 0xa000_0000 0xbfff_ffff     PCIe MEM                512M
  * 0xe000_0000 0xe000_ffff     CCSR                    1M
- * 0xe200_0000 0xe2ff_ffff     PCI1 IO                 16M
+ * 0xe200_0000 0xe27f_ffff     PCI1 IO                 8M
+ * 0xe280_0000 0xe2ff_ffff     PCIe IO                 8M
  * 0xf000_0000 0xf7ff_ffff     SDRAM                   128M
  * 0xf8b0_0000 0xf80f_ffff     EEPROM                  1M
  * 0xfb80_0000 0xff7f_ffff     FLASH (2nd bank)        64M
@@ -48,8 +50,14 @@ struct law_entry law_table[] = {
 #ifndef CONFIG_SPD_EEPROM
        SET_LAW(CONFIG_SYS_DDR_SDRAM_BASE, LAW_SIZE_256M, LAW_TRGT_IF_DDR),
 #endif
+#ifdef CONFIG_SYS_PCI1_MEM_PHYS
        SET_LAW(CONFIG_SYS_PCI1_MEM_PHYS, LAW_SIZE_512M, LAW_TRGT_IF_PCI),
-       SET_LAW(CONFIG_SYS_PCI1_IO_PHYS, LAW_SIZE_16M, LAW_TRGT_IF_PCI),
+       SET_LAW(CONFIG_SYS_PCI1_IO_PHYS, LAW_SIZE_8M, LAW_TRGT_IF_PCI),
+#endif
+#ifdef CONFIG_SYS_PCIE1_MEM_PHYS
+       SET_LAW(CONFIG_SYS_PCIE1_MEM_PHYS, LAW_SIZE_512M, LAW_TRGT_IF_PCIE_1),
+       SET_LAW(CONFIG_SYS_PCIE1_IO_PHYS, LAW_SIZE_8M, LAW_TRGT_IF_PCIE_1),
+#endif
        /* LBC window - maps 256M 0xf0000000 -> 0xffffffff */
        SET_LAW(CONFIG_SYS_LBC_SDRAM_BASE, LAW_SIZE_256M, LAW_TRGT_IF_LBC),
 };
index f4bfd925af6948b33750c520e0f81abcae1e487d..194f6ab961f9d68db5acfa97885d7037065edc88 100644 (file)
@@ -321,125 +321,74 @@ static struct pci_controller pci1_hose;
 static struct pci_controller pcie1_hose;
 #endif /* CONFIG_PCIE1 */
 
-int first_free_busno=0;
 
+#ifdef CONFIG_PCI
 void
 pci_init_board(void)
 {
        volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
+       struct fsl_pci_info pci_info[2];
+       u32 devdisr, pordevsr, porpllsr, io_sel;
+       int first_free_busno = 0;
+       int num = 0;
 
-#ifdef CONFIG_PCI1
-{
-       volatile ccsr_fsl_pci_t *pci = (ccsr_fsl_pci_t *) CONFIG_SYS_PCI1_ADDR;
-       struct pci_controller *hose = &pci1_hose;
-       struct pci_region *r = hose->regions;
+#ifdef CONFIG_PCIE1
+       int pcie_configured;
+#endif
 
-       uint pci_32 = gur->pordevsr & MPC85xx_PORDEVSR_PCI1_PCI32;      /* PORDEVSR[15] */
-       uint pci_arb = gur->pordevsr & MPC85xx_PORDEVSR_PCI1_ARB;       /* PORDEVSR[14] */
-       uint pci_clk_sel = gur->porpllsr & MPC85xx_PORDEVSR_PCI1_SPD;   /* PORPLLSR[16] */
+       devdisr = in_be32(&gur->devdisr);
+       pordevsr = in_be32(&gur->pordevsr);
+       porpllsr = in_be32(&gur->porpllsr);
+       io_sel = (pordevsr & MPC85xx_PORDEVSR_IO_SEL) >> 19;
 
-       uint pci_speed = CONFIG_SYS_CLK_FREQ;   /* get_clock_freq() */
+       debug("   pci_init_board: devdisr=%x, io_sel=%x\n", devdisr, io_sel);
+
+#ifdef CONFIG_PCI1
+       if (!(devdisr & MPC85xx_DEVDISR_PCI1)) {
+               uint pci_32 = pordevsr & MPC85xx_PORDEVSR_PCI1_PCI32;
+               uint pci_arb = pordevsr & MPC85xx_PORDEVSR_PCI1_ARB;
+               uint pci_clk_sel = porpllsr & MPC85xx_PORDEVSR_PCI1_SPD;
+               uint pci_speed = CONFIG_SYS_CLK_FREQ;   /* get_clock_freq() */
 
-       if (!(gur->devdisr & MPC85xx_DEVDISR_PCI1)) {
                printf ("    PCI host: %d bit, %s MHz, %s, %s\n",
                        (pci_32) ? 32 : 64,
                        (pci_speed == 33000000) ? "33" :
                        (pci_speed == 66000000) ? "66" : "unknown",
                        pci_clk_sel ? "sync" : "async",
-                       pci_arb ? "arbiter" : "external-arbiter"
-                       );
-
-               /* outbound memory */
-               pci_set_region(r++,
-                              CONFIG_SYS_PCI1_MEM_BASE,
-                              CONFIG_SYS_PCI1_MEM_PHYS,
-                              CONFIG_SYS_PCI1_MEM_SIZE,
-                              PCI_REGION_MEM);
-
-               /* outbound io */
-               pci_set_region(r++,
-                              CONFIG_SYS_PCI1_IO_BASE,
-                              CONFIG_SYS_PCI1_IO_PHYS,
-                              CONFIG_SYS_PCI1_IO_SIZE,
-                              PCI_REGION_IO);
-               hose->region_count = r - hose->regions;
-
-               hose->first_busno=first_free_busno;
-
-               fsl_pci_init(hose, (u32)&pci->cfg_addr, (u32)&pci->cfg_data);
-               first_free_busno=hose->last_busno+1;
-               printf ("PCI on bus %02x - %02x\n",hose->first_busno,hose->last_busno);
-#ifdef CONFIG_PCIX_CHECK
-               if (!(gur->pordevsr & MPC85xx_PORDEVSR_PCI1)) {
-                       /* PCI-X init */
-                       if (CONFIG_SYS_CLK_FREQ < 66000000)
-                               printf("PCI-X will only work at 66 MHz\n");
-
-                       reg16 = PCI_X_CMD_MAX_SPLIT | PCI_X_CMD_MAX_READ
-                               | PCI_X_CMD_ERO | PCI_X_CMD_DPERR_E;
-                       pci_hose_write_config_word(hose, bus, PCIX_COMMAND, reg16);
-               }
-#endif
+                       pci_arb ? "arbiter" : "external-arbiter");
+
+               SET_STD_PCI_INFO(pci_info[num], 1);
+               first_free_busno = fsl_pci_init_port(&pci_info[num++],
+                                       &pci1_hose, first_free_busno);
        } else {
                printf ("    PCI: disabled\n");
        }
-}
+
+       puts("\n");
 #else
-       gur->devdisr |= MPC85xx_DEVDISR_PCI1; /* disable */
+       setbits_be32(&gur->devdisr, MPC85xx_DEVDISR_PCI1); /* disable */
 #endif
 
-       gur->devdisr |= MPC85xx_DEVDISR_PCI2; /* disable PCI2 */
+       setbits_be32(&gur->devdisr, MPC85xx_DEVDISR_PCI2); /* disable PCI2 */
 
 #ifdef CONFIG_PCIE1
-{
-       volatile ccsr_fsl_pci_t *pci = (ccsr_fsl_pci_t *) CONFIG_SYS_PCIE1_ADDR;
-       struct pci_controller *hose = &pcie1_hose;
-       struct pci_region *r = hose->regions;
-
-       int pcie_configured = is_fsl_pci_cfg(LAW_TRGT_IF_PCIE_1, io_sel);
-
-       if (pcie_configured && !(gur->devdisr & MPC85xx_DEVDISR_PCIE)){
-               printf ("\n    PCIE at base address %x",
-                       (uint)pci);
-
-               if (pci->pme_msg_det) {
-                       pci->pme_msg_det = 0xffffffff;
-                       debug (" with errors.  Clearing.  Now 0x%08x",pci->pme_msg_det);
-               }
-               printf ("\n");
-
-               /* outbound memory */
-               pci_set_region(r++,
-                              CONFIG_SYS_PCIE1_MEM_BASE,
-                              CONFIG_SYS_PCIE1_MEM_PHYS,
-                              CONFIG_SYS_PCIE1_MEM_SIZE,
-                              PCI_REGION_MEM);
-
-               /* outbound io */
-               pci_set_region(r++,
-                              CONFIG_SYS_PCIE1_IO_BASE,
-                              CONFIG_SYS_PCIE1_IO_PHYS,
-                              CONFIG_SYS_PCIE1_IO_SIZE,
-                              PCI_REGION_IO);
-
-               hose->region_count = r - hose->regions;
-
-               hose->first_busno=first_free_busno;
-
-               fsl_pci_init(hose, (u32)&pci->cfg_addr, (u32)&pci->cfg_data);
-               printf ("PCIE on bus %d - %d\n",hose->first_busno,hose->last_busno);
-
-               first_free_busno=hose->last_busno+1;
+       pcie_configured = is_fsl_pci_cfg(LAW_TRGT_IF_PCIE_1, io_sel);
 
+       if (pcie_configured && !(devdisr & MPC85xx_DEVDISR_PCIE)){
+               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);
        } else {
                printf ("    PCIE: disabled\n");
        }
- }
+
+       puts("\n");
 #else
-       gur->devdisr |= MPC85xx_DEVDISR_PCIE; /* disable */
+       setbits_be32(&gur->devdisr, MPC85xx_DEVDISR_PCIE); /* disable */
 #endif
-
 }
+#endif
 
 int board_eth_init(bd_t *bis)
 {
index a1795fcfb28b0aac8800823bf0105fc73b20b589..38bdeb37c3009bcdc44d65ec6dc8ea95e8621d45 100644 (file)
@@ -56,60 +56,53 @@ struct fsl_e_tlb_entry tlb_table[] = {
                      0, 0, BOOKE_PAGESZ_64M, 1),
 
        /*
-        * TLB 1:       256M    Non-cacheable, guarded
-        * 0x80000000   256M    PCI1 MEM First half
+        * TLB 1:       1G      Non-cacheable, guarded
+        * 0x80000000   512M    PCI1 MEM
+        * 0xa0000000   512M    PCIe MEM
         */
-       SET_TLB_ENTRY(1, CONFIG_SYS_PCI1_MEM_PHYS, CONFIG_SYS_PCI1_MEM_PHYS,
+       SET_TLB_ENTRY(1, CONFIG_SYS_PCI1_MEM_VIRT, CONFIG_SYS_PCI1_MEM_PHYS,
                      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
-                     0, 1, BOOKE_PAGESZ_256M, 1),
+                     0, 1, BOOKE_PAGESZ_1G, 1),
 
        /*
-        * TLB 2:       256M    Non-cacheable, guarded
-        * 0x90000000   256M    PCI1 MEM Second half
-        */
-       SET_TLB_ENTRY(1, CONFIG_SYS_PCI1_MEM_PHYS + 0x10000000,
-                     CONFIG_SYS_PCI1_MEM_PHYS + 0x10000000,
-                     MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
-                     0, 2, BOOKE_PAGESZ_256M, 1),
-
-       /*
-        * TLB 3:       256M Cacheable, non-guarded
+        * TLB 2:       256M Cacheable, non-guarded
         * 0x0          256M DDR SDRAM
         */
-       #if !defined(CONFIG_SPD_EEPROM)
+#if !defined(CONFIG_SPD_EEPROM)
        SET_TLB_ENTRY(1, CONFIG_SYS_DDR_SDRAM_BASE, CONFIG_SYS_DDR_SDRAM_BASE,
                      MAS3_SX|MAS3_SW|MAS3_SR, 0,
-                     0, 3, BOOKE_PAGESZ_256M, 1),
-       #endif
+                     0, 2, BOOKE_PAGESZ_256M, 1),
+#endif
 
        /*
-        * TLB 4:       64M     Non-cacheable, guarded
+        * TLB 3:       64M     Non-cacheable, guarded
         * 0xe0000000   1M      CCSRBAR
-        * 0xe2000000   16M     PCI1 IO
+        * 0xe2000000   8M      PCI1 IO
+        * 0xe2800000   8M      PCIe IO
         */
        SET_TLB_ENTRY(1, CONFIG_SYS_CCSRBAR, CONFIG_SYS_CCSRBAR_PHYS,
                      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
-                     0, 4, BOOKE_PAGESZ_64M, 1),
+                     0, 3, BOOKE_PAGESZ_64M, 1),
 
        /*
-        * TLB 5:       64M     Cacheable, non-guarded
+        * TLB 4:       64M     Cacheable, non-guarded
         * 0xf0000000   64M     LBC SDRAM First half
         */
        SET_TLB_ENTRY(1, CONFIG_SYS_LBC_SDRAM_BASE, CONFIG_SYS_LBC_SDRAM_BASE,
                      MAS3_SX|MAS3_SW|MAS3_SR, 0,
-                     0, 5, BOOKE_PAGESZ_64M, 1),
+                     0, 4, BOOKE_PAGESZ_64M, 1),
 
        /*
-        * TLB 6:       64M     Cacheable, non-guarded
+        * TLB 5:       64M     Cacheable, non-guarded
         * 0xf4000000   64M     LBC SDRAM Second half
         */
        SET_TLB_ENTRY(1, CONFIG_SYS_LBC_SDRAM_BASE + 0x4000000,
                      CONFIG_SYS_LBC_SDRAM_BASE + 0x4000000,
                      MAS3_SX|MAS3_SW|MAS3_SR, 0,
-                     0, 6, BOOKE_PAGESZ_64M, 1),
+                     0, 5, BOOKE_PAGESZ_64M, 1),
 
        /*
-        * TLB 7:       16M     Cacheable, non-guarded
+        * TLB 6:       16M     Cacheable, non-guarded
         * 0xf8000000   1M      7-segment LED display
         * 0xf8100000   1M      User switches
         * 0xf8300000   1M      Board revision
@@ -117,24 +110,24 @@ struct fsl_e_tlb_entry tlb_table[] = {
         */
        SET_TLB_ENTRY(1, CONFIG_SYS_EPLD_BASE, CONFIG_SYS_EPLD_BASE,
                      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
-                     0, 7, BOOKE_PAGESZ_16M, 1),
+                     0, 6, BOOKE_PAGESZ_16M, 1),
 
        /*
-        * TLB 8:       4M      Non-cacheable, guarded
+        * TLB 7:       4M      Non-cacheable, guarded
         * 0xfb800000   4M      1st 4MB block of 64MB user FLASH
         */
        SET_TLB_ENTRY(1, CONFIG_SYS_ALT_FLASH, CONFIG_SYS_ALT_FLASH,
                      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
-                     0, 8, BOOKE_PAGESZ_4M, 1),
+                     0, 7, BOOKE_PAGESZ_4M, 1),
 
        /*
-        * TLB 9:       4M      Non-cacheable, guarded
+        * TLB 8:       4M      Non-cacheable, guarded
         * 0xfbc00000   4M      2nd 4MB block of 64MB user FLASH
         */
        SET_TLB_ENTRY(1, CONFIG_SYS_ALT_FLASH + 0x400000,
                      CONFIG_SYS_ALT_FLASH + 0x400000,
                      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
-                     0, 9, BOOKE_PAGESZ_4M, 1),
+                     0, 8, BOOKE_PAGESZ_4M, 1),
 
 };
 
index 009931df55c9bcd73f37eab092ec5650b0b3709f..1f340ed7fba60545d9d6b1262ce6a92dd4ffd733 100644 (file)
 #undef CONFIG_PCI1             /* PCI controller 1 */
 #undef CONFIG_PCIE1            /* PCIE controler 1 (slot 1) */
 #undef CONFIG_RIO
-#undef CONFIG_FSL_PCI_INIT             /* Use common FSL init code */
+
+#ifdef CONFIG_PCI
+#define CONFIG_FSL_PCI_INIT            /* Use common FSL init code */
+#define CONFIG_SYS_PCI_64BIT    1      /* enable 64-bit PCI resources */
+#endif
+#ifdef CONFIG_PCIE1
+#define CONFIG_FSL_PCIE_RESET   1      /* need PCIe reset errata */
+#endif
 
 #define CONFIG_TSEC_ENET               /* tsec ethernet support */
 #define CONFIG_ENV_OVERWRITE
  * General PCI
  * Memory space is mapped 1-1, but I/O space must start from 0.
  */
+#define CONFIG_SYS_PCI_VIRT            0x80000000      /* 1G PCI TLB */
 #define CONFIG_SYS_PCI_PHYS            0x80000000      /* 1G PCI TLB */
 
-#define CONFIG_SYS_PCI1_MEM_BASE       0x80000000
-#define CONFIG_SYS_PCI1_MEM_PHYS       CONFIG_SYS_PCI1_MEM_BASE
+#define CONFIG_SYS_PCI1_MEM_VIRT       0x80000000
+#define CONFIG_SYS_PCI1_MEM_BUS                0x80000000
+#define CONFIG_SYS_PCI1_MEM_PHYS       0x80000000
 #define CONFIG_SYS_PCI1_MEM_SIZE       0x20000000      /* 512M */
-#define CONFIG_SYS_PCI1_IO_BASE        0x00000000
-#define CONFIG_SYS_PCI1_IO_PHYS        0xe2000000
-#define CONFIG_SYS_PCI1_IO_SIZE        0x00100000      /* 1M */
-
-#ifdef CONFIG_PCI2
-#define CONFIG_SYS_PCI2_MEM_BASE       0xa0000000
-#define CONFIG_SYS_PCI2_MEM_PHYS       CONFIG_SYS_PCI2_MEM_BASE
-#define CONFIG_SYS_PCI2_MEM_SIZE       0x20000000      /* 512M */
-#define CONFIG_SYS_PCI2_IO_BASE        0x00000000
-#define CONFIG_SYS_PCI2_IO_PHYS        0xe2800000
-#define CONFIG_SYS_PCI2_IO_SIZE        0x00100000      /* 1M */
-#endif
+#define CONFIG_SYS_PCI1_IO_VIRT                0xe2000000
+#define CONFIG_SYS_PCI1_IO_BUS         0x00000000
+#define CONFIG_SYS_PCI1_IO_PHYS                0xe2000000
+#define CONFIG_SYS_PCI1_IO_SIZE                0x00800000      /* 8M */
 
 #ifdef CONFIG_PCIE1
-#define CONFIG_SYS_PCIE1_MEM_BASE      0xa0000000
-#define CONFIG_SYS_PCIE1_MEM_PHYS      CONFIG_SYS_PCIE1_MEM_BASE
+#define CONFIG_SYS_PCIE1_MEM_VIRT      0xa0000000
+#define CONFIG_SYS_PCIE1_MEM_BUS       0xa0000000
+#define CONFIG_SYS_PCIE1_MEM_PHYS      0xa0000000
 #define CONFIG_SYS_PCIE1_MEM_SIZE      0x20000000      /* 512M */
-#define CONFIG_SYS_PCIE1_IO_BASE       0x00000000
-#define CONFIG_SYS_PCIE1_IO_PHYS       0xe3000000
-#define CONFIG_SYS_PCIE1_IO_SIZE       0x00100000      /*   1M */
+#define CONFIG_SYS_PCIE1_IO_VIRT       0xe2800000
+#define CONFIG_SYS_PCIE1_IO_BUS                0x00000000
+#define CONFIG_SYS_PCIE1_IO_PHYS       0xe2800000
+#define CONFIG_SYS_PCIE1_IO_SIZE       0x00800000      /* 8M */
 #endif
 
 #ifdef CONFIG_RIO
 #undef CONFIG_EEPRO100
 #undef CONFIG_TULIP
 
-#undef CONFIG_PCI_SCAN_SHOW            /* show pci devices on startup */
+#define CONFIG_PCI_SCAN_SHOW           /* show pci devices on startup */
 
 #endif /* CONFIG_PCI */