]> git.sur5r.net Git - u-boot/blobdiff - board/freescale/mpc8569mds/mpc8569mds.c
ppc/8xxx: Refactor code to determine if PCI is enabled & agent/host
[u-boot] / board / freescale / mpc8569mds / mpc8569mds.c
index 53fef43f359096614ea928104daccddea65deff3..cc8873117ef7411fa9a67dd4176c35bc34e46a1a 100644 (file)
@@ -27,7 +27,7 @@
 #include <asm/processor.h>
 #include <asm/mmu.h>
 #include <asm/immap_85xx.h>
-#include <asm/immap_fsl_pci.h>
+#include <asm/fsl_pci.h>
 #include <asm/fsl_ddr_sdram.h>
 #include <asm/io.h>
 #include <spd_sdram.h>
@@ -47,6 +47,7 @@ const qe_iop_conf_t qe_iop_conf_tab[] = {
        /* QE_MUX_MDIO */
        {2,  30, 3, 0, 2}, /* QE_MUX_MDIO              */
 
+#if defined(CONFIG_SYS_UCC_RGMII_MODE)
        /* UCC_1_RGMII */
        {2, 11, 2, 0, 1}, /* CLK12 */
        {0,  0, 1, 0, 3}, /* ENET1_TXD0_SER1_TXD0      */
@@ -77,6 +78,80 @@ const qe_iop_conf_t qe_iop_conf_tab[] = {
        {2,  3, 2, 0, 1}, /* ENET2_GRXCLK              */
        {2,  2, 1, 0, 2}, /* ENET2_GTXCLK              */
 
+       /* UCC_3_RGMII */
+       {2, 11, 2, 0, 1}, /* CLK12 */
+       {0, 29, 1, 0, 2}, /* ENET3_TXD0_SER3_TXD0      */
+       {0, 30, 1, 0, 3}, /* ENET3_TXD1_SER3_TXD1      */
+       {0, 31, 1, 0, 2}, /* ENET3_TXD2_SER3_TXD2      */
+       {1,  0, 1, 0, 3}, /* ENET3_TXD3_SER3_TXD3      */
+       {1,  3, 2, 0, 3}, /* ENET3_RXD0_SER3_RXD0      */
+       {1,  4, 2, 0, 1}, /* ENET3_RXD1_SER3_RXD1      */
+       {1,  5, 2, 0, 2}, /* ENET3_RXD2_SER3_RXD2      */
+       {1,  6, 2, 0, 3}, /* ENET3_RXD3_SER3_RXD3      */
+       {1,  1, 1, 0, 1}, /* ENET3_TX_EN_SER3_RTS_B    */
+       {1,  9, 2, 0, 3}, /* ENET3_RX_DV_SER3_CTS_B    */
+       {2,  9, 2, 0, 2}, /* ENET3_GRXCLK              */
+       {2, 25, 1, 0, 2}, /* ENET3_GTXCLK              */
+
+       /* UCC_4_RGMII */
+       {2, 16, 2, 0, 3}, /* CLK17 */
+       {1, 12, 1, 0, 2}, /* ENET4_TXD0_SER4_TXD0      */
+       {1, 13, 1, 0, 2}, /* ENET4_TXD1_SER4_TXD1      */
+       {1, 14, 1, 0, 1}, /* ENET4_TXD2_SER4_TXD2      */
+       {1, 15, 1, 0, 2}, /* ENET4_TXD3_SER4_TXD3      */
+       {1, 18, 2, 0, 2}, /* ENET4_RXD0_SER4_RXD0      */
+       {1, 19, 2, 0, 1}, /* ENET4_RXD1_SER4_RXD1      */
+       {1, 20, 2, 0, 1}, /* ENET4_RXD2_SER4_RXD2      */
+       {1, 21, 2, 0, 2}, /* ENET4_RXD3_SER4_RXD3      */
+       {1, 16, 1, 0, 2}, /* ENET4_TX_EN_SER4_RTS_B    */
+       {1, 24, 2, 0, 3}, /* ENET4_RX_DV_SER4_CTS_B    */
+       {2, 17, 2, 0, 2}, /* ENET4_GRXCLK              */
+       {2, 24, 1, 0, 2}, /* ENET4_GTXCLK              */
+
+#elif defined(CONFIG_SYS_UCC_RMII_MODE)
+       /* UCC_1_RMII */
+       {2, 15, 2, 0, 1}, /* CLK16 */
+       {0,  0, 1, 0, 3}, /* ENET1_TXD0_SER1_TXD0      */
+       {0,  1, 1, 0, 3}, /* ENET1_TXD1_SER1_TXD1      */
+       {0,  6, 2, 0, 3}, /* ENET1_RXD0_SER1_RXD0      */
+       {0,  7, 2, 0, 1}, /* ENET1_RXD1_SER1_RXD1      */
+       {0,  4, 1, 0, 2}, /* ENET1_TX_EN_SER1_RTS_B    */
+       {0, 12, 2, 0, 3}, /* ENET1_RX_DV_SER1_CTS_B    */
+
+       /* UCC_2_RMII */
+       {2, 15, 2, 0, 1}, /* CLK16 */
+       {0, 14, 1, 0, 2}, /* ENET2_TXD0_SER2_TXD0      */
+       {0, 15, 1, 0, 2}, /* ENET2_TXD1_SER2_TXD1      */
+       {0, 20, 2, 0, 2}, /* ENET2_RXD0_SER2_RXD0      */
+       {0, 21, 2, 0, 1}, /* ENET2_RXD1_SER2_RXD1      */
+       {0, 18, 1, 0, 2}, /* ENET2_TX_EN_SER2_RTS_B    */
+       {0, 26, 2, 0, 3}, /* ENET2_RX_DV_SER2_CTS_B    */
+
+       /* UCC_3_RMII */
+       {2, 15, 2, 0, 1}, /* CLK16 */
+       {0, 29, 1, 0, 2}, /* ENET3_TXD0_SER3_TXD0      */
+       {0, 30, 1, 0, 3}, /* ENET3_TXD1_SER3_TXD1      */
+       {1,  3, 2, 0, 3}, /* ENET3_RXD0_SER3_RXD0      */
+       {1,  4, 2, 0, 1}, /* ENET3_RXD1_SER3_RXD1      */
+       {1,  1, 1, 0, 1}, /* ENET3_TX_EN_SER3_RTS_B    */
+       {1,  9, 2, 0, 3}, /* ENET3_RX_DV_SER3_CTS_B    */
+
+       /* UCC_4_RMII */
+       {2, 15, 2, 0, 1}, /* CLK16 */
+       {1, 12, 1, 0, 2}, /* ENET4_TXD0_SER4_TXD0      */
+       {1, 13, 1, 0, 2}, /* ENET4_TXD1_SER4_TXD1      */
+       {1, 18, 2, 0, 2}, /* ENET4_RXD0_SER4_RXD0      */
+       {1, 19, 2, 0, 1}, /* ENET4_RXD1_SER4_RXD1      */
+       {1, 16, 1, 0, 2}, /* ENET4_TX_EN_SER4_RTS_B    */
+       {1, 24, 2, 0, 3}, /* ENET4_RX_DV_SER4_CTS_B    */
+#endif
+
+       /* UART1 is muxed with QE PortF bit [9-12].*/
+       {5, 12, 2, 0, 3}, /* UART1_SIN */
+       {5, 9,  1, 0, 3}, /* UART1_SOUT */
+       {5, 10, 2, 0, 3}, /* UART1_CTS_B */
+       {5, 11, 1, 0, 2}, /* UART1_RTS_B */
+
        {0,  0, 0, 0, QE_IOP_TAB_END} /* END of table */
 };
 
@@ -92,7 +167,7 @@ int board_early_init_f (void)
        enable_8569mds_flash_write();
 
 #ifdef CONFIG_QE
-       enable_8569mds_qe_mdio();
+       enable_8569mds_qe_uec();
 #endif
 
 #if CONFIG_SYS_I2C2_OFFSET
@@ -232,9 +307,6 @@ local_bus_init(void)
 static struct pci_controller pcie1_hose;
 #endif  /* CONFIG_PCIE1 */
 
-extern int fsl_pci_setup_inbound_windows(struct pci_region *r);
-extern void fsl_pci_init(struct pci_controller *hose);
-
 int first_free_busno = 0;
 
 #ifdef CONFIG_PCI
@@ -259,9 +331,9 @@ pci_init_board(void)
 
        pci = (ccsr_fsl_pci_t *) CONFIG_SYS_PCIE1_ADDR;
        hose = &pcie1_hose;
-       pcie_ep =  (host_agent == 0) || (host_agent == 2 ) || (host_agent == 3);
+       pcie_ep = is_fsl_pci_agent(LAW_TRGT_IF_PCIE_1, host_agent);
        r = hose->regions;
-       pcie_configured  = io_sel >= 1;
+       pcie_configured = is_fsl_pci_cfg(LAW_TRGT_IF_PCIE_1, io_sel);
 
        if (pcie_configured && !(gur->devdisr & MPC85xx_DEVDISR_PCIE)){
                printf ("\n    PCIE connected to slot as %s (base address %x)",
@@ -275,9 +347,6 @@ pci_init_board(void)
                }
                printf ("\n");
 
-               /* inbound */
-               r += fsl_pci_setup_inbound_windows(r);
-
                /* outbound memory */
                pci_set_region(r++,
                                CONFIG_SYS_PCIE1_MEM_BUS,
@@ -295,10 +364,8 @@ pci_init_board(void)
                hose->region_count = r - hose->regions;
 
                hose->first_busno=first_free_busno;
-               pci_setup_indirect(hose, (int) &pci->cfg_addr,
-                                       (int) &pci->cfg_data);
 
-               fsl_pci_init(hose);
+               fsl_pci_init(hose, (u32)&pci->cfg_addr, (u32)&pci->cfg_data);
                printf ("PCIE on bus %02x - %02x\n",
                                hose->first_busno,hose->last_busno);
 
@@ -315,11 +382,63 @@ pci_init_board(void)
 #endif /* CONFIG_PCI */
 
 #if defined(CONFIG_OF_BOARD_SETUP)
-extern void ft_fsl_pci_setup(void *blob, const char *pci_alias,
-                       struct pci_controller *hose);
-
 void ft_board_setup(void *blob, bd_t *bd)
 {
+#if defined(CONFIG_SYS_UCC_RMII_MODE)
+       int nodeoff, off, err;
+       unsigned int val;
+       const u32 *ph;
+       const u32 *index;
+
+       /* fixup device tree for supporting rmii mode */
+       nodeoff = -1;
+       while ((nodeoff = fdt_node_offset_by_compatible(blob, nodeoff,
+                               "ucc_geth")) >= 0) {
+               err = fdt_setprop_string(blob, nodeoff, "tx-clock-name",
+                                               "clk16");
+               if (err < 0) {
+                       printf("WARNING: could not set tx-clock-name %s.\n",
+                               fdt_strerror(err));
+                       break;
+               }
+
+               err = fdt_setprop_string(blob, nodeoff, "phy-connection-type",
+                                       "rmii");
+               if (err < 0) {
+                       printf("WARNING: could not set phy-connection-type "
+                               "%s.\n", fdt_strerror(err));
+                       break;
+               }
+
+               index = fdt_getprop(blob, nodeoff, "cell-index", 0);
+               if (index == NULL) {
+                       printf("WARNING: could not get cell-index of ucc\n");
+                       break;
+               }
+
+               ph = fdt_getprop(blob, nodeoff, "phy-handle", 0);
+               if (ph == NULL) {
+                       printf("WARNING: could not get phy-handle of ucc\n");
+                       break;
+               }
+
+               off = fdt_node_offset_by_phandle(blob, *ph);
+               if (off < 0) {
+                       printf("WARNING: could not get phy node %s.\n",
+                               fdt_strerror(err));
+                       break;
+               }
+
+               val = 0x7 + *index; /* RMII phy address starts from 0x8 */
+
+               err = fdt_setprop(blob, off, "reg", &val, sizeof(u32));
+               if (err < 0) {
+                       printf("WARNING: could not set reg for phy-handle "
+                               "%s.\n", fdt_strerror(err));
+                       break;
+               }
+       }
+#endif
        ft_cpu_setup(blob, bd);
 
 #ifdef CONFIG_PCIE1