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 f4bdb8991..49afa7cf8 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 24cc13014..df4e748e9 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 e2f0942ce..c3431ee4c 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 */ |