diff options
-rw-r--r-- | board/freescale/mpc837xemds/mpc837xemds.c | 41 | ||||
-rw-r--r-- | board/freescale/mpc837xemds/pci.c | 3 | ||||
-rw-r--r-- | include/configs/MPC837XEMDS.h | 3 |
3 files changed, 47 insertions, 0 deletions
diff --git a/board/freescale/mpc837xemds/mpc837xemds.c b/board/freescale/mpc837xemds/mpc837xemds.c index f4bdb89..49afa7c 100644 --- a/board/freescale/mpc837xemds/mpc837xemds.c +++ b/board/freescale/mpc837xemds/mpc837xemds.c @@ -270,6 +270,45 @@ int checkboard(void) return 0; } +#ifdef CONFIG_PCI +int board_pci_host_broken(void) +{ + struct immap __iomem *im = (struct immap __iomem *)CONFIG_SYS_IMMR; + const u32 rcw_mask = HRCWH_PCI1_ARBITER_ENABLE | HRCWH_PCI_HOST; + const char *pci_ea = getenv("pci_external_arbiter"); + + /* It's always OK in case of external arbiter. */ + if (pci_ea && !strcmp(pci_ea, "yes")) + return 0; + + if ((in_be32(&im->reset.rcwh) & rcw_mask) != rcw_mask) + return 1; + + return 0; +} + +static void ft_pci_fixup(void *blob, bd_t *bd) +{ + const char *status = "broken (no arbiter)"; + int off; + int err; + + off = fdt_path_offset(blob, "pci0"); + if (off < 0) { + printf("WARNING: could not find pci0 alias: %s.\n", + fdt_strerror(off)); + return; + } + + err = fdt_setprop(blob, off, "status", status, strlen(status) + 1); + if (err) { + printf("WARNING: could not set status for pci0: %s.\n", + fdt_strerror(err)); + return; + } +} +#endif + #if defined(CONFIG_OF_BOARD_SETUP) void ft_board_setup(void *blob, bd_t *bd) { @@ -277,6 +316,8 @@ void ft_board_setup(void *blob, bd_t *bd) ft_tsec_fixup(blob, bd); #ifdef CONFIG_PCI ft_pci_setup(blob, bd); + if (board_pci_host_broken()) + ft_pci_fixup(blob, bd); #endif } #endif /* CONFIG_OF_BOARD_SETUP */ diff --git a/board/freescale/mpc837xemds/pci.c b/board/freescale/mpc837xemds/pci.c index 24cc130..df4e748 100644 --- a/board/freescale/mpc837xemds/pci.c +++ b/board/freescale/mpc837xemds/pci.c @@ -47,6 +47,9 @@ void pci_init_board(void) volatile law83xx_t *pci_law = immr->sysconf.pcilaw; struct pci_region *reg[] = { pci_regions }; + if (board_pci_host_broken()) + return; + /* Enable all 5 PCI_CLK_OUTPUTS */ clk->occr |= 0xf8000000; udelay(2000); diff --git a/include/configs/MPC837XEMDS.h b/include/configs/MPC837XEMDS.h index e2f0942..c3431ee 100644 --- a/include/configs/MPC837XEMDS.h +++ b/include/configs/MPC837XEMDS.h @@ -348,6 +348,9 @@ #define CONFIG_SYS_PCI_SLV_MEM_SIZE 0x80000000 #ifdef CONFIG_PCI +#ifndef __ASSEMBLY__ +extern int board_pci_host_broken(void); +#endif #define CONFIG_83XX_GENERIC_PCI 1 /* Use generic PCI setup */ #define CONFIG_PQ_MDS_PIB 1 /* PQ MDS Platform IO Board */ |