diff options
Diffstat (limited to 'board/freescale')
22 files changed, 3567 insertions, 0 deletions
| diff --git a/board/freescale/common/cadmus.c b/board/freescale/common/cadmus.c new file mode 100644 index 000000000..5f86de5af --- /dev/null +++ b/board/freescale/common/cadmus.c @@ -0,0 +1,95 @@ +/* + * Copyright 2004 Freescale Semiconductor. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + + +#include <common.h> + + +/* + * CADMUS Board System Registers + */ +#ifndef CFG_CADMUS_BASE_REG +#define CFG_CADMUS_BASE_REG	(CADMUS_BASE_ADDR + 0x4000) +#endif + +typedef struct cadmus_reg { +    u_char cm_ver;		/* Board version */ +    u_char cm_csr;		/* General control/status */ +    u_char cm_rst;		/* Reset control */ +    u_char cm_hsclk;		/* High speed clock */ +    u_char cm_hsxclk;		/* High speed clock extended */ +    u_char cm_led;		/* LED data */ +    u_char cm_pci;		/* PCI control/status */ +    u_char cm_dma;		/* DMA control */ +    u_char cm_reserved[248];	/* Total 256 bytes */ +} cadmus_reg_t; + + +unsigned int +get_board_version(void) +{ +	volatile cadmus_reg_t *cadmus = (cadmus_reg_t *)CFG_CADMUS_BASE_REG; + +	return cadmus->cm_ver; +} + + +unsigned long +get_clock_freq(void) +{ +	volatile cadmus_reg_t *cadmus = (cadmus_reg_t *)CFG_CADMUS_BASE_REG; + +	uint pci1_speed = (cadmus->cm_pci >> 2) & 0x3; /* PSPEED in [4:5] */ + +	if (pci1_speed == 0) { +		return 33000000; +	} else if (pci1_speed == 1) { +		return 66000000; +	} else { +		/* Really, unknown. Be safe? */ +		return 33000000; +	} +} + + +unsigned int +get_pci_slot(void) +{ +	volatile cadmus_reg_t *cadmus = (cadmus_reg_t *)CFG_CADMUS_BASE_REG; + +	/* +	 * PCI slot in USER bits CSR[6:7] by convention. +	 */ +	return ((cadmus->cm_csr >> 6) & 0x3) + 1; +} + + +unsigned int +get_pci_dual(void) +{ +	volatile cadmus_reg_t *cadmus = (cadmus_reg_t *)CFG_CADMUS_BASE_REG; + +	/* +	 * PCI DUAL in CM_PCI[3] +	 */ +	return cadmus->cm_pci & 0x10; +} diff --git a/board/freescale/common/cadmus.h b/board/freescale/common/cadmus.h new file mode 100644 index 000000000..217ea6425 --- /dev/null +++ b/board/freescale/common/cadmus.h @@ -0,0 +1,54 @@ +/* + * Copyright 2004 Freescale Semiconductor. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#ifndef __CADMUS_H_ +#define __CADMUS_H_ + + +/* + * CADMUS Board System Register interface. + */ + +/* + * Returns board version register. + */ +extern unsigned int get_board_version(void); + +/* + * Returns either 33000000 or 66000000 as the SYS_CLK_FREQ. + */ +extern unsigned long get_clock_freq(void); + + +/* + * Returns 1 - 4, as found in the USER CSR[6:7] bits. + */ +extern unsigned int get_pci_slot(void); + + +/* + * Returns PCI DUAL as found in CM_PCI[3]. + */ +extern unsigned int get_pci_dual(void); + + +#endif	/* __CADMUS_H_ */ diff --git a/board/freescale/common/eeprom.c b/board/freescale/common/eeprom.c new file mode 100644 index 000000000..5034e0ca2 --- /dev/null +++ b/board/freescale/common/eeprom.c @@ -0,0 +1,60 @@ +/* + * Copyright 2004 Freescale Semiconductor. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + + +#include <common.h> +#include <i2c.h> + +#include "eeprom.h" + + +typedef struct { +	char idee_pcbid[4];		/* "CCID" for CDC v1.X */ +	u8 idee_major; +	u8 idee_minor; +	char idee_serial[10]; +	char idee_errata[2]; +	char idee_date[8];		/* yyyymmdd */ +	/* The rest of the EEPROM space is reserved */ +} id_eeprom_t; + + +unsigned int +get_cpu_board_revision(void) +{ +	uint major = 0; +	uint minor = 0; + +	id_eeprom_t id_eeprom; + +	i2c_read(CFG_I2C_EEPROM_ADDR, 0, 2, +		 (uchar *) &id_eeprom, sizeof(id_eeprom)); + +	major = id_eeprom.idee_major; +	minor = id_eeprom.idee_minor; + +	if (major == 0xff && minor == 0xff) { +		major = minor = 0; +	} + +	return MPC85XX_CPU_BOARD_REV(major,minor); +} diff --git a/board/freescale/common/eeprom.h b/board/freescale/common/eeprom.h new file mode 100644 index 000000000..12a078904 --- /dev/null +++ b/board/freescale/common/eeprom.h @@ -0,0 +1,50 @@ +/* + * Copyright 2004 Freescale Semiconductor. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#ifndef __EEPROM_H_ +#define __EEPROM_H_ + + +/* + * EEPROM Board System Register interface. + */ + + +/* + * CPU Board Revision + */ +#define MPC85XX_CPU_BOARD_REV(maj, min)	((((maj)&0xff) << 8) | ((min) & 0xff)) +#define MPC85XX_CPU_BOARD_MAJOR(rev)	(((rev) >> 8) & 0xff) +#define MPC85XX_CPU_BOARD_MINOR(rev)	((rev) & 0xff) + +#define MPC85XX_CPU_BOARD_REV_UNKNOWN	MPC85XX_CPU_BOARD_REV(0,0) +#define MPC85XX_CPU_BOARD_REV_1_0	MPC85XX_CPU_BOARD_REV(1,0) +#define MPC85XX_CPU_BOARD_REV_1_1	MPC85XX_CPU_BOARD_REV(1,1) + +/* + * Returns CPU board revision register as a 16-bit value with + * the Major in the high byte, and Minor in the low byte. + */ +extern unsigned int get_cpu_board_revision(void); + + +#endif	/* __CADMUS_H_ */ diff --git a/board/freescale/common/ft_board.c b/board/freescale/common/ft_board.c new file mode 100644 index 000000000..6f221aff2 --- /dev/null +++ b/board/freescale/common/ft_board.c @@ -0,0 +1,72 @@ +/* + * Copyright 2004 Freescale Semiconductor. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <common.h> +#include <libfdt.h> +#include <fdt_support.h> +#include "cadmus.h" + +#if defined(CONFIG_OF_BOARD_SETUP) +static void cds_pci_fixup(void *blob) +{ +	int node, tmp[2]; +	const char *path; +	int len, slot, i; +	u32 *map = NULL; + +	node = fdt_path_offset(blob, "/aliases"); +	tmp[0] = 0; +	if (node >= 0) { +		path = fdt_getprop(blob, node, "pci0", NULL); +		if (path) { +			node = fdt_path_offset(blob, path); +			if (node >= 0) { +				map = fdt_getprop_w(blob, node, "interrupt-map", &len); +			} +		} +	} + +	if (map) { +		len /= sizeof(u32); + +		slot = get_pci_slot(); + +		for (i=0;i<len;i+=7) { +			/* We rotate the interrupt pins so that the mapping +			 * changes depending on the slot the carrier card is in. +			 */ +			map[3] = ((map[3] + slot - 2) % 4) + 1; +			map+=7; +		} +	} +} + +void +ft_board_setup(void *blob, bd_t *bd) +{ +	ft_cpu_setup(blob, bd); +#ifdef CONFIG_PCI +	ft_pci_setup(blob, bd); +	cds_pci_fixup(blob); +#endif +} +#endif diff --git a/board/freescale/common/via.c b/board/freescale/common/via.c new file mode 100644 index 000000000..4a63d7794 --- /dev/null +++ b/board/freescale/common/via.c @@ -0,0 +1,109 @@ +/* + * Copyright 2006 Freescale Semiconductor. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <common.h> +#include <pci.h> + +/* Config the VIA chip */ +void mpc85xx_config_via(struct pci_controller *hose, +			pci_dev_t dev, struct pci_config_table *tab) +{ +	pci_dev_t bridge; +	unsigned int cmdstat; + +	/* Enable USB and IDE functions */ +	pci_hose_write_config_byte(hose, dev, 0x48, 0x08); + +	pci_hose_read_config_dword(hose, dev, PCI_COMMAND, &cmdstat); +	cmdstat |= PCI_COMMAND_IO | PCI_COMMAND_MEMORY| PCI_COMMAND_MASTER; +	pci_hose_write_config_dword(hose, dev, PCI_COMMAND, cmdstat); +	pci_hose_write_config_byte(hose, dev, PCI_CACHE_LINE_SIZE, 0x08); +	pci_hose_write_config_byte(hose, dev, PCI_LATENCY_TIMER, 0x80); + +	/* +	 * Force the backplane P2P bridge to have a window +	 * open from 0x00000000-0x00001fff in PCI I/O space. +	 * This allows legacy I/O (i8259, etc) on the VIA +	 * southbridge to be accessed. +	 */ +	bridge = PCI_BDF(0,BRIDGE_ID,0); +	pci_hose_write_config_byte(hose, bridge, PCI_IO_BASE, 0); +	pci_hose_write_config_word(hose, bridge, PCI_IO_BASE_UPPER16, 0); +	pci_hose_write_config_byte(hose, bridge, PCI_IO_LIMIT, 0x10); +	pci_hose_write_config_word(hose, bridge, PCI_IO_LIMIT_UPPER16, 0); +} + +/* Function 1, IDE */ +void mpc85xx_config_via_usbide(struct pci_controller *hose, +			       pci_dev_t dev, struct pci_config_table *tab) +{ +	pciauto_config_device(hose, dev); +	/* +	 * Since the P2P window was forced to cover the fixed +	 * legacy I/O addresses, it is necessary to manually +	 * place the base addresses for the IDE and USB functions +	 * within this window. +	 */ +	pci_hose_write_config_dword(hose, dev, PCI_BASE_ADDRESS_0, 0x1ff8); +	pci_hose_write_config_dword(hose, dev, PCI_BASE_ADDRESS_1, 0x1ff4); +	pci_hose_write_config_dword(hose, dev, PCI_BASE_ADDRESS_2, 0x1fe8); +	pci_hose_write_config_dword(hose, dev, PCI_BASE_ADDRESS_3, 0x1fe4); +	pci_hose_write_config_dword(hose, dev, PCI_BASE_ADDRESS_4, 0x1fd0); +} + +/* Function 2, USB ports 0-1 */ +void mpc85xx_config_via_usb(struct pci_controller *hose, +			    pci_dev_t dev, struct pci_config_table *tab) +{ +	pciauto_config_device(hose, dev); + +	pci_hose_write_config_dword(hose, dev, PCI_BASE_ADDRESS_4, 0x1fa0); +} + +/* Function 3, USB ports 2-3 */ +void mpc85xx_config_via_usb2(struct pci_controller *hose, +			     pci_dev_t dev, struct pci_config_table *tab) +{ +	pciauto_config_device(hose, dev); + +	pci_hose_write_config_dword(hose, dev, PCI_BASE_ADDRESS_4, 0x1f80); +} + +/* Function 5, Power Management */ +void mpc85xx_config_via_power(struct pci_controller *hose, +			      pci_dev_t dev, struct pci_config_table *tab) +{ +	pciauto_config_device(hose, dev); + +	pci_hose_write_config_dword(hose, dev, PCI_BASE_ADDRESS_0, 0x1e00); +	pci_hose_write_config_dword(hose, dev, PCI_BASE_ADDRESS_1, 0x1dfc); +	pci_hose_write_config_dword(hose, dev, PCI_BASE_ADDRESS_2, 0x1df8); +} + +/* Function 6, AC97 Interface */ +void mpc85xx_config_via_ac97(struct pci_controller *hose, +			     pci_dev_t dev, struct pci_config_table *tab) +{ +	pciauto_config_device(hose, dev); + +	pci_hose_write_config_dword(hose, dev, PCI_BASE_ADDRESS_0, 0x1c00); +} diff --git a/board/freescale/common/via.h b/board/freescale/common/via.h new file mode 100644 index 000000000..77cfacc52 --- /dev/null +++ b/board/freescale/common/via.h @@ -0,0 +1,18 @@ +#ifndef _MPC85xx_VIA_H +void mpc85xx_config_via(struct pci_controller* hose, pci_dev_t dev, struct pci_config_table *tab); + +/* Function 1, IDE */ +void mpc85xx_config_via_usbide(struct pci_controller* hose, pci_dev_t dev, struct pci_config_table *tab); + +/* Function 2, USB ports 0-1 */ +void mpc85xx_config_via_usb(struct pci_controller* hose, pci_dev_t dev, struct pci_config_table *tab); + +/* Function 3, USB ports 2-3 */ +void mpc85xx_config_via_usb2(struct pci_controller* hose, pci_dev_t dev, struct pci_config_table *tab); + +/* Function 5, Power Management */ +void mpc85xx_config_via_power(struct pci_controller* hose, pci_dev_t dev, struct pci_config_table *tab); + +/* Function 6, AC97 Interface */ +void mpc85xx_config_via_ac97(struct pci_controller* hose, pci_dev_t dev, struct pci_config_table *tab); +#endif /* _MPC85xx_VIA_H */ diff --git a/board/freescale/mpc8541cds/Makefile b/board/freescale/mpc8541cds/Makefile new file mode 100644 index 000000000..7f5309885 --- /dev/null +++ b/board/freescale/mpc8541cds/Makefile @@ -0,0 +1,60 @@ +# +# Copyright 2004 Freescale Semiconductor. +# (C) Copyright 2001-2006 +# Wolfgang Denk, DENX Software Engineering, wd@denx.de. +# +# See file CREDITS for list of people who contributed to this +# project. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# + +include $(TOPDIR)/config.mk +ifneq ($(OBJTREE),$(SRCTREE)) +$(shell mkdir -p $(obj)../common) +endif + +LIB	= $(obj)lib$(BOARD).a + +COBJS	:= $(BOARD).o \ +	   ../common/cadmus.o \ +	   ../common/eeprom.o \ +	   ../common/ft_board.o \ +	   ../common/via.o + +SOBJS	:= init.o + +SRCS	:= $(SOBJS:.o=.S) $(COBJS:.o=.c) +OBJS	:= $(addprefix $(obj),$(COBJS)) +SOBJS	:= $(addprefix $(obj),$(SOBJS)) + +$(LIB):	$(obj).depend $(OBJS) $(SOBJS) +	$(AR) $(ARFLAGS) $@ $(OBJS) + +clean: +	rm -f $(OBJS) $(SOBJS) + +distclean:	clean +	rm -f $(LIB) core *.bak .depend + +######################################################################### + +# defines $(obj).depend target +include $(SRCTREE)/rules.mk + +sinclude $(obj).depend + +######################################################################### diff --git a/board/freescale/mpc8541cds/config.mk b/board/freescale/mpc8541cds/config.mk new file mode 100644 index 000000000..17cc8bce9 --- /dev/null +++ b/board/freescale/mpc8541cds/config.mk @@ -0,0 +1,30 @@ +# +# Copyright 2004 Freescale Semiconductor. +# +# See file CREDITS for list of people who contributed to this +# project. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# + +# +# mpc8541cds board +# +TEXT_BASE = 0xfff80000 + +PLATFORM_CPPFLAGS += -DCONFIG_E500=1 +PLATFORM_CPPFLAGS += -DCONFIG_MPC85xx=1 +PLATFORM_CPPFLAGS += -DCONFIG_MPC8541=1 diff --git a/board/freescale/mpc8541cds/init.S b/board/freescale/mpc8541cds/init.S new file mode 100644 index 000000000..978bda5e4 --- /dev/null +++ b/board/freescale/mpc8541cds/init.S @@ -0,0 +1,255 @@ +/* + * Copyright 2004 Freescale Semiconductor. + * Copyright 2002,2003, Motorola Inc. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <ppc_asm.tmpl> +#include <ppc_defs.h> +#include <asm/cache.h> +#include <asm/mmu.h> +#include <config.h> +#include <mpc85xx.h> + + +/* + * TLB0 and TLB1 Entries + * + * Out of reset, TLB1's Entry 0 maps the highest 4K for CCSRBAR. + * However, CCSRBAR is then relocated to CFG_CCSRBAR right after + * these TLB entries are established. + * + * The TLB entries for DDR are dynamically setup in spd_sdram() + * and use TLB1 Entries 8 through 15 as needed according to the + * size of DDR memory. + * + * MAS0: tlbsel, esel, nv + * MAS1: valid, iprot, tid, ts, tsize + * MAS2: epn, sharen, x0, x1, w, i, m, g, e + * MAS3: rpn, u0-u3, ux, sx, uw, sw, ur, sr + */ + +#define	entry_start \ +	mflr	r1 	;	\ +	bl	0f 	; + +#define	entry_end \ +0:	mflr	r0	;	\ +	mtlr	r1	;	\ +	blr		; + + +	.section	.bootpg, "ax" +	.globl	tlb1_entry +tlb1_entry: +	entry_start + +	/* +	 * Number of TLB0 and TLB1 entries in the following table +	 */ +	.long 13 + +#if (CFG_CCSRBAR_DEFAULT != CFG_CCSRBAR) +	/* +	 * TLB0		4K	Non-cacheable, guarded +	 * 0xff700000	4K	Initial CCSRBAR mapping +	 * +	 * This ends up at a TLB0 Index==0 entry, and must not collide +	 * with other TLB0 Entries. +	 */ +	.long TLB1_MAS0(0, 0, 0) +	.long TLB1_MAS1(1, 0, 0, 0, 0) +	.long TLB1_MAS2(E500_TLB_EPN(CFG_CCSRBAR_DEFAULT), 0,0,0,0,1,0,1,0) +	.long TLB1_MAS3(E500_TLB_RPN(CFG_CCSRBAR_DEFAULT), 0,0,0,0,0,1,0,1,0,1) +#else +#error("Update the number of table entries in tlb1_entry") +#endif + +	/* +	 * TLB0		16K	Cacheable, non-guarded +	 * 0xd001_0000	16K	Temporary Global data for initialization +	 * +	 * Use four 4K TLB0 entries.  These entries must be cacheable +	 * as they provide the bootstrap memory before the memory +	 * controler and real memory have been configured. +	 * +	 * These entries end up at TLB0 Indicies 0x10, 0x14, 0x18 and 0x1c, +	 * and must not collide with other TLB0 entries. +	 */ +	.long TLB1_MAS0(0, 0, 0) +	.long TLB1_MAS1(1, 0, 0, 0, 0) +	.long TLB1_MAS2(E500_TLB_EPN(CFG_INIT_RAM_ADDR), +			0,0,0,0,0,0,0,0) +	.long TLB1_MAS3(E500_TLB_RPN(CFG_INIT_RAM_ADDR), +			0,0,0,0,0,1,0,1,0,1) + +	.long TLB1_MAS0(0, 0, 0) +	.long TLB1_MAS1(1, 0, 0, 0, 0) +	.long TLB1_MAS2(E500_TLB_EPN(CFG_INIT_RAM_ADDR + 4 * 1024), +			0,0,0,0,0,0,0,0) +	.long TLB1_MAS3(E500_TLB_RPN(CFG_INIT_RAM_ADDR + 4 * 1024), +			0,0,0,0,0,1,0,1,0,1) + +	.long TLB1_MAS0(0, 0, 0) +	.long TLB1_MAS1(1, 0, 0, 0, 0) +	.long TLB1_MAS2(E500_TLB_EPN(CFG_INIT_RAM_ADDR + 8 * 1024), +			0,0,0,0,0,0,0,0) +	.long TLB1_MAS3(E500_TLB_RPN(CFG_INIT_RAM_ADDR + 8 * 1024), +			0,0,0,0,0,1,0,1,0,1) + +	.long TLB1_MAS0(0, 0, 0) +	.long TLB1_MAS1(1, 0, 0, 0, 0) +	.long TLB1_MAS2(E500_TLB_EPN(CFG_INIT_RAM_ADDR + 12 * 1024), +			0,0,0,0,0,0,0,0) +	.long TLB1_MAS3(E500_TLB_RPN(CFG_INIT_RAM_ADDR + 12 * 1024), +			0,0,0,0,0,1,0,1,0,1) + + +	/* +	 * TLB 0:	16M	Non-cacheable, guarded +	 * 0xff000000	16M	FLASH +	 * Out of reset this entry is only 4K. +	 */ +	.long TLB1_MAS0(1, 0, 0) +	.long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_16M) +	.long TLB1_MAS2(E500_TLB_EPN(CFG_FLASH_BASE), 0,0,0,0,1,0,1,0) +	.long TLB1_MAS3(E500_TLB_RPN(CFG_FLASH_BASE), 0,0,0,0,0,1,0,1,0,1) + +	/* +	 * TLB 1:	256M	Non-cacheable, guarded +	 * 0x80000000	256M	PCI1 MEM First half +	 */ +	.long TLB1_MAS0(1, 1, 0) +	.long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_256M) +	.long TLB1_MAS2(E500_TLB_EPN(CFG_PCI1_MEM_BASE), 0,0,0,0,1,0,1,0) +	.long TLB1_MAS3(E500_TLB_RPN(CFG_PCI1_MEM_BASE), 0,0,0,0,0,1,0,1,0,1) + +	/* +	 * TLB 2:	256M	Non-cacheable, guarded +	 * 0x90000000	256M	PCI1 MEM Second half +	 */ +	.long TLB1_MAS0(1, 2, 0) +	.long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_256M) +	.long TLB1_MAS2(E500_TLB_EPN(CFG_PCI1_MEM_BASE + 0x10000000), +			0,0,0,0,1,0,1,0) +	.long TLB1_MAS3(E500_TLB_RPN(CFG_PCI1_MEM_BASE + 0x10000000), +			0,0,0,0,0,1,0,1,0,1) + +	/* +	 * TLB 3:	256M	Non-cacheable, guarded +	 * 0xa0000000	256M	PCI2 MEM First half +	 */ +	.long TLB1_MAS0(1, 3, 0) +	.long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_256M) +	.long TLB1_MAS2(E500_TLB_EPN(CFG_PCI2_MEM_BASE), 0,0,0,0,1,0,1,0) +	.long TLB1_MAS3(E500_TLB_RPN(CFG_PCI2_MEM_BASE), 0,0,0,0,0,1,0,1,0,1) + +	/* +	 * TLB 4:	256M	Non-cacheable, guarded +	 * 0xb0000000	256M	PCI2 MEM Second half +	 */ +	.long TLB1_MAS0(1, 4, 0) +	.long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_256M) +	.long TLB1_MAS2(E500_TLB_EPN(CFG_PCI2_MEM_BASE + 0x10000000), +			0,0,0,0,1,0,1,0) +	.long TLB1_MAS3(E500_TLB_RPN(CFG_PCI2_MEM_BASE + 0x10000000), +			0,0,0,0,0,1,0,1,0,1) + +	/* +	 * TLB 5:	64M	Non-cacheable, guarded +	 * 0xe000_0000	1M	CCSRBAR +	 * 0xe200_0000	16M	PCI1 IO +	 * 0xe300_0000	16M	PCI2 IO +	 */ +	.long TLB1_MAS0(1, 5, 0) +	.long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_64M) +	.long TLB1_MAS2(E500_TLB_EPN(CFG_CCSRBAR), 0,0,0,0,1,0,1,0) +	.long TLB1_MAS3(E500_TLB_RPN(CFG_CCSRBAR), 0,0,0,0,0,1,0,1,0,1) + +	/* +	 * TLB 6:	64M	Cacheable, non-guarded +	 * 0xf000_0000	64M	LBC SDRAM +	 */ +	.long TLB1_MAS0(1, 6, 0) +	.long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_64M) +	.long TLB1_MAS2(E500_TLB_EPN(CFG_LBC_SDRAM_BASE), 0,0,0,0,0,0,0,0) +	.long TLB1_MAS3(E500_TLB_RPN(CFG_LBC_SDRAM_BASE), 0,0,0,0,0,1,0,1,0,1) + +	/* +	 * TLB 7:	1M	Non-cacheable, guarded +	 * 0xf8000000	1M	CADMUS registers +	 */ +	.long TLB1_MAS0(1, 7, 0) +	.long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_1M) +	.long TLB1_MAS2(E500_TLB_EPN(CADMUS_BASE_ADDR), 0,0,0,0,1,0,1,0) +	.long TLB1_MAS3(E500_TLB_RPN(CADMUS_BASE_ADDR), 0,0,0,0,0,1,0,1,0,1) + +	entry_end + +/* + * LAW(Local Access Window) configuration: + * + * 0x0000_0000     0x7fff_ffff     DDR                     2G + * 0x8000_0000     0x9fff_ffff     PCI1 MEM                512M + * 0xa000_0000     0xbfff_ffff     PCI2 MEM                512M + * 0xe000_0000     0xe000_ffff     CCSR                    1M + * 0xe200_0000     0xe20f_ffff     PCI1 IO                 1M + * 0xe210_0000     0xe21f_ffff     PCI2 IO                 1M + * 0xf000_0000     0xf7ff_ffff     SDRAM                   128M + * 0xf800_0000     0xf80f_ffff     NVRAM/CADMUS (*)        1M + * 0xff00_0000     0xff7f_ffff     FLASH (2nd bank)        8M + * 0xff80_0000     0xffff_ffff     FLASH (boot bank)       8M + * + * Notes: + *    CCSRBAR and L2-as-SRAM don't need a configured Local Access Window. + *    If flash is 8M at default position (last 8M), no LAW needed. + * + * The defines below are 1-off of the actual LAWAR0 usage. + * So LAWAR3 define uses the LAWAR4 register in the ECM. + */ + +#define LAWBAR0 0 +#define LAWAR0  ((LAWAR_TRGT_IF_DDR | (LAWAR_SIZE & LAWAR_SIZE_128M)) & ~LAWAR_EN) + +#define LAWBAR1 ((CFG_PCI1_MEM_BASE>>12) & 0xfffff) +#define LAWAR1 	(LAWAR_EN | LAWAR_TRGT_IF_PCI1 | (LAWAR_SIZE & LAWAR_SIZE_512M)) + +#define LAWBAR2 ((CFG_PCI2_MEM_BASE>>12) & 0xfffff) +#define LAWAR2 	(LAWAR_EN | LAWAR_TRGT_IF_PCI2 | (LAWAR_SIZE & LAWAR_SIZE_512M)) + +#define LAWBAR3 ((CFG_PCI1_IO_PHYS>>12) & 0xfffff) +#define LAWAR3 	(LAWAR_EN | LAWAR_TRGT_IF_PCI1 | (LAWAR_SIZE & LAWAR_SIZE_1M)) + +#define LAWBAR4 ((CFG_PCI2_IO_PHYS>>12) & 0xfffff) +#define LAWAR4 	(LAWAR_EN | LAWAR_TRGT_IF_PCI2 | (LAWAR_SIZE & LAWAR_SIZE_1M)) + +/* LBC window - maps 256M 0xf0000000 -> 0xffffffff */ +#define LAWBAR5 ((CFG_LBC_SDRAM_BASE>>12) & 0xfffff) +#define LAWAR5 	(LAWAR_EN | LAWAR_TRGT_IF_LBC | (LAWAR_SIZE & LAWAR_SIZE_256M)) + +	.section .bootpg, "ax" +	.globl	law_entry + +law_entry: +	entry_start +	.long 6 +	.long LAWBAR0,LAWAR0,LAWBAR1,LAWAR1,LAWBAR2,LAWAR2,LAWBAR3,LAWAR3 +	.long LAWBAR4,LAWAR4,LAWBAR5,LAWAR5 +	entry_end diff --git a/board/freescale/mpc8541cds/mpc8541cds.c b/board/freescale/mpc8541cds/mpc8541cds.c new file mode 100644 index 000000000..9ab98d4b6 --- /dev/null +++ b/board/freescale/mpc8541cds/mpc8541cds.c @@ -0,0 +1,534 @@ +/* + * Copyright 2004 Freescale Semiconductor. + * + * (C) Copyright 2002 Scott McNutt <smcnutt@artesyncp.com> + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <common.h> +#include <pci.h> +#include <asm/processor.h> +#include <asm/immap_85xx.h> +#include <ioports.h> +#include <spd.h> +#include <libfdt.h> +#include <fdt_support.h> + +#include "../common/cadmus.h" +#include "../common/eeprom.h" +#include "../common/via.h" + +#if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER) +extern void ddr_enable_ecc(unsigned int dram_size); +#endif + +extern long int spd_sdram(void); + +void local_bus_init(void); +void sdram_init(void); + +/* + * I/O Port configuration table + * + * if conf is 1, then that port pin will be configured at boot time + * according to the five values podr/pdir/ppar/psor/pdat for that entry + */ + +const iop_conf_t iop_conf_tab[4][32] = { + +    /* Port A configuration */ +    {   /*            conf ppar psor pdir podr pdat */ +	/* PA31 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 TxENB */ +	/* PA30 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 TxClav   */ +	/* PA29 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 TxSOC  */ +	/* PA28 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 RxENB */ +	/* PA27 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 RxSOC */ +	/* PA26 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 RxClav */ +	/* PA25 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXD[0] */ +	/* PA24 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXD[1] */ +	/* PA23 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXD[2] */ +	/* PA22 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXD[3] */ +	/* PA21 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXD[4] */ +	/* PA20 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXD[5] */ +	/* PA19 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXD[6] */ +	/* PA18 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXD[7] */ +	/* PA17 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXD[7] */ +	/* PA16 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXD[6] */ +	/* PA15 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXD[5] */ +	/* PA14 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXD[4] */ +	/* PA13 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXD[3] */ +	/* PA12 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXD[2] */ +	/* PA11 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXD[1] */ +	/* PA10 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXD[0] */ +	/* PA9  */ {   0,   1,   1,   1,   0,   0   }, /* FCC1 L1TXD */ +	/* PA8  */ {   0,   1,   1,   0,   0,   0   }, /* FCC1 L1RXD */ +	/* PA7  */ {   0,   0,   0,   1,   0,   0   }, /* PA7 */ +	/* PA6  */ {   0,   1,   1,   1,   0,   0   }, /* TDM A1 L1RSYNC */ +	/* PA5  */ {   0,   0,   0,   1,   0,   0   }, /* PA5 */ +	/* PA4  */ {   0,   0,   0,   1,   0,   0   }, /* PA4 */ +	/* PA3  */ {   0,   0,   0,   1,   0,   0   }, /* PA3 */ +	/* PA2  */ {   0,   0,   0,   1,   0,   0   }, /* PA2 */ +	/* PA1  */ {   1,   0,   0,   0,   0,   0   }, /* FREERUN */ +	/* PA0  */ {   0,   0,   0,   1,   0,   0   }  /* PA0 */ +    }, + +    /* Port B configuration */ +    {   /*            conf ppar psor pdir podr pdat */ +	/* PB31 */ {   1,   1,   0,   1,   0,   0   }, /* FCC2 MII TX_ER */ +	/* PB30 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RX_DV */ +	/* PB29 */ {   1,   1,   1,   1,   0,   0   }, /* FCC2 MII TX_EN */ +	/* PB28 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RX_ER */ +	/* PB27 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII COL */ +	/* PB26 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII CRS */ +	/* PB25 */ {   1,   1,   0,   1,   0,   0   }, /* FCC2 MII TxD[3] */ +	/* PB24 */ {   1,   1,   0,   1,   0,   0   }, /* FCC2 MII TxD[2] */ +	/* PB23 */ {   1,   1,   0,   1,   0,   0   }, /* FCC2 MII TxD[1] */ +	/* PB22 */ {   1,   1,   0,   1,   0,   0   }, /* FCC2 MII TxD[0] */ +	/* PB21 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RxD[0] */ +	/* PB20 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RxD[1] */ +	/* PB19 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RxD[2] */ +	/* PB18 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RxD[3] */ +	/* PB17 */ {   0,   1,   0,   0,   0,   0   }, /* FCC3:RX_DIV */ +	/* PB16 */ {   0,   1,   0,   0,   0,   0   }, /* FCC3:RX_ERR */ +	/* PB15 */ {   0,   1,   0,   1,   0,   0   }, /* FCC3:TX_ERR */ +	/* PB14 */ {   0,   1,   0,   1,   0,   0   }, /* FCC3:TX_EN */ +	/* PB13 */ {   0,   1,   0,   0,   0,   0   }, /* FCC3:COL */ +	/* PB12 */ {   0,   1,   0,   0,   0,   0   }, /* FCC3:CRS */ +	/* PB11 */ {   0,   1,   0,   0,   0,   0   }, /* FCC3:RXD */ +	/* PB10 */ {   0,   1,   0,   0,   0,   0   }, /* FCC3:RXD */ +	/* PB9  */ {   0,   1,   0,   0,   0,   0   }, /* FCC3:RXD */ +	/* PB8  */ {   0,   1,   0,   0,   0,   0   }, /* FCC3:RXD */ +	/* PB7  */ {   0,   1,   0,   1,   0,   0   }, /* FCC3:TXD */ +	/* PB6  */ {   0,   1,   0,   1,   0,   0   }, /* FCC3:TXD */ +	/* PB5  */ {   0,   1,   0,   1,   0,   0   }, /* FCC3:TXD */ +	/* PB4  */ {   0,   1,   0,   1,   0,   0   }, /* FCC3:TXD */ +	/* PB3  */ {   0,   0,   0,   0,   0,   0   }, /* pin doesn't exist */ +	/* PB2  */ {   0,   0,   0,   0,   0,   0   }, /* pin doesn't exist */ +	/* PB1  */ {   0,   0,   0,   0,   0,   0   }, /* pin doesn't exist */ +	/* PB0  */ {   0,   0,   0,   0,   0,   0   }  /* pin doesn't exist */ +    }, + +    /* Port C */ +    {   /*            conf ppar psor pdir podr pdat */ +	/* PC31 */ {   0,   0,   0,   1,   0,   0   }, /* PC31 */ +	/* PC30 */ {   0,   0,   0,   1,   0,   0   }, /* PC30 */ +	/* PC29 */ {   0,   1,   1,   0,   0,   0   }, /* SCC1 EN *CLSN */ +	/* PC28 */ {   0,   0,   0,   1,   0,   0   }, /* PC28 */ +	/* PC27 */ {   0,   0,   0,   1,   0,   0   }, /* UART Clock in */ +	/* PC26 */ {   0,   0,   0,   1,   0,   0   }, /* PC26 */ +	/* PC25 */ {   0,   0,   0,   1,   0,   0   }, /* PC25 */ +	/* PC24 */ {   0,   0,   0,   1,   0,   0   }, /* PC24 */ +	/* PC23 */ {   0,   1,   0,   1,   0,   0   }, /* ATMTFCLK */ +	/* PC22 */ {   0,   1,   0,   0,   0,   0   }, /* ATMRFCLK */ +	/* PC21 */ {   0,   1,   0,   0,   0,   0   }, /* SCC1 EN RXCLK */ +	/* PC20 */ {   0,   1,   0,   0,   0,   0   }, /* SCC1 EN TXCLK */ +	/* PC19 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RX_CLK CLK13 */ +	/* PC18 */ {   1,   1,   0,   0,   0,   0   }, /* FCC Tx Clock (CLK14) */ +	/* PC17 */ {   0,   0,   0,   1,   0,   0   }, /* PC17 */ +	/* PC16 */ {   0,   1,   0,   0,   0,   0   }, /* FCC Tx Clock (CLK16) */ +	/* PC15 */ {   1,   1,   0,   0,   0,   0   }, /* PC15 */ +	/* PC14 */ {   0,   1,   0,   0,   0,   0   }, /* SCC1 EN *CD */ +	/* PC13 */ {   0,   0,   0,   1,   0,   0   }, /* PC13 */ +	/* PC12 */ {   0,   1,   0,   1,   0,   0   }, /* PC12 */ +	/* PC11 */ {   0,   0,   0,   1,   0,   0   }, /* LXT971 transmit control */ +	/* PC10 */ {   1,   0,   0,   1,   0,   0   }, /* FETHMDC */ +	/* PC9  */ {   1,   0,   0,   0,   0,   0   }, /* FETHMDIO */ +	/* PC8  */ {   0,   0,   0,   1,   0,   0   }, /* PC8 */ +	/* PC7  */ {   0,   0,   0,   1,   0,   0   }, /* PC7 */ +	/* PC6  */ {   0,   0,   0,   1,   0,   0   }, /* PC6 */ +	/* PC5  */ {   0,   0,   0,   1,   0,   0   }, /* PC5 */ +	/* PC4  */ {   0,   0,   0,   1,   0,   0   }, /* PC4 */ +	/* PC3  */ {   0,   0,   0,   1,   0,   0   }, /* PC3 */ +	/* PC2  */ {   0,   0,   0,   1,   0,   1   }, /* ENET FDE */ +	/* PC1  */ {   0,   0,   0,   1,   0,   0   }, /* ENET DSQE */ +	/* PC0  */ {   0,   0,   0,   1,   0,   0   }, /* ENET LBK */ +    }, + +    /* Port D */ +    {   /*            conf ppar psor pdir podr pdat */ +	/* PD31 */ {   1,   1,   0,   0,   0,   0   }, /* SCC1 EN RxD */ +	/* PD30 */ {   1,   1,   1,   1,   0,   0   }, /* SCC1 EN TxD */ +	/* PD29 */ {   1,   1,   0,   1,   0,   0   }, /* SCC1 EN TENA */ +	/* PD28 */ {   0,   1,   0,   0,   0,   0   }, /* PD28 */ +	/* PD27 */ {   0,   1,   1,   1,   0,   0   }, /* PD27 */ +	/* PD26 */ {   0,   0,   0,   1,   0,   0   }, /* PD26 */ +	/* PD25 */ {   0,   0,   0,   1,   0,   0   }, /* PD25 */ +	/* PD24 */ {   0,   0,   0,   1,   0,   0   }, /* PD24 */ +	/* PD23 */ {   0,   0,   0,   1,   0,   0   }, /* PD23 */ +	/* PD22 */ {   0,   0,   0,   1,   0,   0   }, /* PD22 */ +	/* PD21 */ {   0,   0,   0,   1,   0,   0   }, /* PD21 */ +	/* PD20 */ {   0,   0,   0,   1,   0,   0   }, /* PD20 */ +	/* PD19 */ {   0,   0,   0,   1,   0,   0   }, /* PD19 */ +	/* PD18 */ {   0,   0,   0,   1,   0,   0   }, /* PD18 */ +	/* PD17 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXPRTY */ +	/* PD16 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXPRTY */ +	/* PD15 */ {   0,   1,   1,   0,   1,   0   }, /* I2C SDA */ +	/* PD14 */ {   0,   0,   0,   1,   0,   0   }, /* LED */ +	/* PD13 */ {   0,   0,   0,   0,   0,   0   }, /* PD13 */ +	/* PD12 */ {   0,   0,   0,   0,   0,   0   }, /* PD12 */ +	/* PD11 */ {   0,   0,   0,   0,   0,   0   }, /* PD11 */ +	/* PD10 */ {   0,   0,   0,   0,   0,   0   }, /* PD10 */ +	/* PD9  */ {   0,   1,   0,   1,   0,   0   }, /* SMC1 TXD */ +	/* PD8  */ {   0,   1,   0,   0,   0,   0   }, /* SMC1 RXD */ +	/* PD7  */ {   0,   0,   0,   1,   0,   1   }, /* PD7 */ +	/* PD6  */ {   0,   0,   0,   1,   0,   1   }, /* PD6 */ +	/* PD5  */ {   0,   0,   0,   1,   0,   1   }, /* PD5 */ +	/* PD4  */ {   0,   0,   0,   1,   0,   1   }, /* PD4 */ +	/* PD3  */ {   0,   0,   0,   0,   0,   0   }, /* pin doesn't exist */ +	/* PD2  */ {   0,   0,   0,   0,   0,   0   }, /* pin doesn't exist */ +	/* PD1  */ {   0,   0,   0,   0,   0,   0   }, /* pin doesn't exist */ +	/* PD0  */ {   0,   0,   0,   0,   0,   0   }  /* pin doesn't exist */ +    } +}; + +int board_early_init_f (void) +{ +	return 0; +} + +int checkboard (void) +{ +	volatile ccsr_gur_t *gur = (void *)(CFG_MPC85xx_GUTS_ADDR); + +	/* PCI slot in USER bits CSR[6:7] by convention. */ +	uint pci_slot = get_pci_slot (); + +	uint pci_dual = get_pci_dual ();	/* PCI DUAL in CM_PCI[3] */ +	uint pci1_32 = gur->pordevsr & 0x10000;	/* PORDEVSR[15] */ +	uint pci1_clk_sel = gur->porpllsr & 0x8000;	/* PORPLLSR[16] */ +	uint pci2_clk_sel = gur->porpllsr & 0x4000;	/* PORPLLSR[17] */ + +	uint pci1_speed = get_clock_freq ();	/* PCI PSPEED in [4:5] */ + +	uint cpu_board_rev = get_cpu_board_revision (); + +	printf ("Board: CDS Version 0x%02x, PCI Slot %d\n", +		get_board_version (), pci_slot); + +	printf ("CPU Board Revision %d.%d (0x%04x)\n", +		MPC85XX_CPU_BOARD_MAJOR (cpu_board_rev), +		MPC85XX_CPU_BOARD_MINOR (cpu_board_rev), cpu_board_rev); + +	printf ("    PCI1: %d bit, %s MHz, %s\n", +		(pci1_32) ? 32 : 64, +		(pci1_speed == 33000000) ? "33" : +		(pci1_speed == 66000000) ? "66" : "unknown", +		pci1_clk_sel ? "sync" : "async"); + +	if (pci_dual) { +		printf ("    PCI2: 32 bit, 66 MHz, %s\n", +			pci2_clk_sel ? "sync" : "async"); +	} else { +		printf ("    PCI2: disabled\n"); +	} + +	/* +	 * Initialize local bus. +	 */ +	local_bus_init (); + +	return 0; +} + +long int +initdram(int board_type) +{ +	long dram_size = 0; + +	puts("Initializing\n"); + +#if defined(CONFIG_DDR_DLL) +	{ +		/* +		 * Work around to stabilize DDR DLL MSYNC_IN. +		 * Errata DDR9 seems to have been fixed. +		 * This is now the workaround for Errata DDR11: +		 *    Override DLL = 1, Course Adj = 1, Tap Select = 0 +		 */ + +		volatile ccsr_gur_t *gur = (void *)(CFG_MPC85xx_GUTS_ADDR); + +		gur->ddrdllcr = 0x81000000; +		asm("sync;isync;msync"); +		udelay(200); +	} +#endif +	dram_size = spd_sdram(); + +#if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER) +	/* +	 * Initialize and enable DDR ECC. +	 */ +	ddr_enable_ecc(dram_size); +#endif +	/* +	 * SDRAM Initialization +	 */ +	sdram_init(); + +	puts("    DDR: "); +	return dram_size; +} + +/* + * Initialize Local Bus + */ +void +local_bus_init(void) +{ +	volatile ccsr_gur_t *gur = (void *)(CFG_MPC85xx_GUTS_ADDR); +	volatile ccsr_lbc_t *lbc = (void *)(CFG_MPC85xx_LBC_ADDR); + +	uint clkdiv; +	uint lbc_hz; +	sys_info_t sysinfo; +	uint temp_lbcdll; + +	/* +	 * Errata LBC11. +	 * Fix Local Bus clock glitch when DLL is enabled. +	 * +	 * If localbus freq is < 66Mhz, DLL bypass mode must be used. +	 * If localbus freq is > 133Mhz, DLL can be safely enabled. +	 * Between 66 and 133, the DLL is enabled with an override workaround. +	 */ + +	get_sys_info(&sysinfo); +	clkdiv = lbc->lcrr & 0x0f; +	lbc_hz = sysinfo.freqSystemBus / 1000000 / clkdiv; + +	if (lbc_hz < 66) { +		lbc->lcrr |= 0x80000000;	/* DLL Bypass */ + +	} else if (lbc_hz >= 133) { +		lbc->lcrr &= (~0x80000000);		/* DLL Enabled */ + +	} else { +		lbc->lcrr &= (~0x8000000);	/* DLL Enabled */ +		udelay(200); + +		/* +		 * Sample LBC DLL ctrl reg, upshift it to set the +		 * override bits. +		 */ +		temp_lbcdll = gur->lbcdllcr; +		gur->lbcdllcr = (((temp_lbcdll & 0xff) << 16) | 0x80000000); +		asm("sync;isync;msync"); +	} +} + +/* + * Initialize SDRAM memory on the Local Bus. + */ +void +sdram_init(void) +{ +#if defined(CFG_OR2_PRELIM) && defined(CFG_BR2_PRELIM) + +	uint idx; +	volatile ccsr_lbc_t *lbc = (void *)(CFG_MPC85xx_LBC_ADDR); +	uint *sdram_addr = (uint *)CFG_LBC_SDRAM_BASE; +	uint cpu_board_rev; +	uint lsdmr_common; + +	puts("    SDRAM: "); + +	print_size (CFG_LBC_SDRAM_SIZE * 1024 * 1024, "\n"); + +	/* +	 * Setup SDRAM Base and Option Registers +	 */ +	lbc->or2 = CFG_OR2_PRELIM; +	asm("msync"); + +	lbc->br2 = CFG_BR2_PRELIM; +	asm("msync"); + +	lbc->lbcr = CFG_LBC_LBCR; +	asm("msync"); + + +	lbc->lsrt = CFG_LBC_LSRT; +	lbc->mrtpr = CFG_LBC_MRTPR; +	asm("msync"); + +	/* +	 * Determine which address lines to use baed on CPU board rev. +	 */ +	cpu_board_rev = get_cpu_board_revision(); +	lsdmr_common = CFG_LBC_LSDMR_COMMON; +	if (cpu_board_rev == MPC85XX_CPU_BOARD_REV_1_0) { +		lsdmr_common |= CFG_LBC_LSDMR_BSMA1617; +	} else if (cpu_board_rev == MPC85XX_CPU_BOARD_REV_1_1) { +		lsdmr_common |= CFG_LBC_LSDMR_BSMA1516; +	} else { +		/* +		 * Assume something unable to identify itself is +		 * really old, and likely has lines 16/17 mapped. +		 */ +		lsdmr_common |= CFG_LBC_LSDMR_BSMA1617; +	} + +	/* +	 * Issue PRECHARGE ALL command. +	 */ +	lbc->lsdmr = lsdmr_common | CFG_LBC_LSDMR_OP_PCHALL; +	asm("sync;msync"); +	*sdram_addr = 0xff; +	ppcDcbf((unsigned long) sdram_addr); +	udelay(100); + +	/* +	 * Issue 8 AUTO REFRESH commands. +	 */ +	for (idx = 0; idx < 8; idx++) { +		lbc->lsdmr = lsdmr_common | CFG_LBC_LSDMR_OP_ARFRSH; +		asm("sync;msync"); +		*sdram_addr = 0xff; +		ppcDcbf((unsigned long) sdram_addr); +		udelay(100); +	} + +	/* +	 * Issue 8 MODE-set command. +	 */ +	lbc->lsdmr = lsdmr_common | CFG_LBC_LSDMR_OP_MRW; +	asm("sync;msync"); +	*sdram_addr = 0xff; +	ppcDcbf((unsigned long) sdram_addr); +	udelay(100); + +	/* +	 * Issue NORMAL OP command. +	 */ +	lbc->lsdmr = lsdmr_common | CFG_LBC_LSDMR_OP_NORMAL; +	asm("sync;msync"); +	*sdram_addr = 0xff; +	ppcDcbf((unsigned long) sdram_addr); +	udelay(200);    /* Overkill. Must wait > 200 bus cycles */ + +#endif	/* enable SDRAM init */ +} + +#if defined(CFG_DRAM_TEST) +int +testdram(void) +{ +	uint *pstart = (uint *) CFG_MEMTEST_START; +	uint *pend = (uint *) CFG_MEMTEST_END; +	uint *p; + +	printf("Testing DRAM from 0x%08x to 0x%08x\n", +	       CFG_MEMTEST_START, +	       CFG_MEMTEST_END); + +	printf("DRAM test phase 1:\n"); +	for (p = pstart; p < pend; p++) +		*p = 0xaaaaaaaa; + +	for (p = pstart; p < pend; p++) { +		if (*p != 0xaaaaaaaa) { +			printf ("DRAM test fails at: %08x\n", (uint) p); +			return 1; +		} +	} + +	printf("DRAM test phase 2:\n"); +	for (p = pstart; p < pend; p++) +		*p = 0x55555555; + +	for (p = pstart; p < pend; p++) { +		if (*p != 0x55555555) { +			printf ("DRAM test fails at: %08x\n", (uint) p); +			return 1; +		} +	} + +	printf("DRAM test passed.\n"); +	return 0; +} +#endif + +#if defined(CONFIG_PCI) +/* For some reason the Tundra PCI bridge shows up on itself as a + * different device.  Work around that by refusing to configure it. + */ +void dummy_func(struct pci_controller* hose, pci_dev_t dev, struct pci_config_table *tab) { } + +static struct pci_config_table pci_mpc85xxcds_config_table[] = { +	{0x10e3, 0x0513, PCI_ANY_ID, 1, 3, PCI_ANY_ID, dummy_func, {0,0,0}}, +	{0x1106, 0x0686, PCI_ANY_ID, 1, VIA_ID, 0, mpc85xx_config_via, {0,0,0}}, +	{0x1106, 0x0571, PCI_ANY_ID, 1, VIA_ID, 1, +		mpc85xx_config_via_usbide, {0,0,0}}, +	{0x1105, 0x3038, PCI_ANY_ID, 1, VIA_ID, 2, +		mpc85xx_config_via_usb, {0,0,0}}, +	{0x1106, 0x3038, PCI_ANY_ID, 1, VIA_ID, 3, +		mpc85xx_config_via_usb2, {0,0,0}}, +	{0x1106, 0x3058, PCI_ANY_ID, 1, VIA_ID, 5, +		mpc85xx_config_via_power, {0,0,0}}, +	{0x1106, 0x3068, PCI_ANY_ID, 1, VIA_ID, 6, +		mpc85xx_config_via_ac97, {0,0,0}}, +	{}, +}; + +static struct pci_controller hose[] = { +	{ config_table: pci_mpc85xxcds_config_table,}, +#ifdef CONFIG_MPC85XX_PCI2 +	{}, +#endif +}; + +#endif	/* CONFIG_PCI */ + +void +pci_init_board(void) +{ +#ifdef CONFIG_PCI +	pci_mpc85xx_init(hose); +#endif +} + +#if defined(CONFIG_OF_BOARD_SETUP) +void +ft_pci_setup(void *blob, bd_t *bd) +{ +	int node, tmp[2]; +	const char *path; + +	node = fdt_path_offset(blob, "/aliases"); +	tmp[0] = 0; +	if (node >= 0) { +#ifdef CONFIG_PCI1 +		path = fdt_getprop(blob, node, "pci0", NULL); +		if (path) { +			tmp[1] = hose[0].last_busno - hose[0].first_busno; +			do_fixup_by_path(blob, path, "bus-range", &tmp, 8, 1); +		} +#endif +#ifdef CONFIG_MPC85XX_PCI2 +		path = fdt_getprop(blob, node, "pci1", NULL); +		if (path) { +			tmp[1] = hose[1].last_busno - hose[1].first_busno; +			do_fixup_by_path(blob, path, "bus-range", &tmp, 8, 1); +		} +#endif +	} +} +#endif diff --git a/board/freescale/mpc8541cds/u-boot.lds b/board/freescale/mpc8541cds/u-boot.lds new file mode 100644 index 000000000..4360d677e --- /dev/null +++ b/board/freescale/mpc8541cds/u-boot.lds @@ -0,0 +1,150 @@ +/* + * Copyright 2004 Freescale Semiconductor. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +OUTPUT_ARCH(powerpc) +SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/local/lib); SEARCH_DIR(/usr/local/powerpc-any-elf/lib); +/* Do we need any of these for elf? +   __DYNAMIC = 0;    */ +SECTIONS +{ +  .resetvec 0xFFFFFFFC : +  { +    *(.resetvec) +  } = 0xffff + +  .bootpg 0xFFFFF000 : +  { +    cpu/mpc85xx/start.o	(.bootpg) +    board/freescale/mpc8541cds/init.o (.bootpg) +  } = 0xffff + +  /* Read-only sections, merged into text segment: */ +  . = + SIZEOF_HEADERS; +  .interp : { *(.interp) } +  .hash          : { *(.hash)		} +  .dynsym        : { *(.dynsym)		} +  .dynstr        : { *(.dynstr)		} +  .rel.text      : { *(.rel.text)		} +  .rela.text     : { *(.rela.text) 	} +  .rel.data      : { *(.rel.data)		} +  .rela.data     : { *(.rela.data) 	} +  .rel.rodata    : { *(.rel.rodata) 	} +  .rela.rodata   : { *(.rela.rodata) 	} +  .rel.got       : { *(.rel.got)		} +  .rela.got      : { *(.rela.got)		} +  .rel.ctors     : { *(.rel.ctors)	} +  .rela.ctors    : { *(.rela.ctors)	} +  .rel.dtors     : { *(.rel.dtors)	} +  .rela.dtors    : { *(.rela.dtors)	} +  .rel.bss       : { *(.rel.bss)		} +  .rela.bss      : { *(.rela.bss)		} +  .rel.plt       : { *(.rel.plt)		} +  .rela.plt      : { *(.rela.plt)		} +  .init          : { *(.init)	} +  .plt : { *(.plt) } +  .text      : +  { +    cpu/mpc85xx/start.o	(.text) +    board/freescale/mpc8541cds/init.o (.text) +    cpu/mpc85xx/traps.o (.text) +    cpu/mpc85xx/interrupts.o (.text) +    cpu/mpc85xx/cpu_init.o (.text) +    cpu/mpc85xx/cpu.o (.text) +    drivers/net/tsec.o (.text) +    cpu/mpc85xx/speed.o (.text) +    cpu/mpc85xx/pci.o (.text) +    common/dlmalloc.o (.text) +    lib_generic/crc32.o (.text) +    lib_ppc/extable.o (.text) +    lib_generic/zlib.o (.text) +    *(.text) +    *(.fixup) +    *(.got1) +   } +    _etext = .; +    PROVIDE (etext = .); +    .rodata    : +   { +    *(.rodata) +    *(.rodata1) +    *(.rodata.str1.4) +    *(.eh_frame) +  } +  .fini      : { *(.fini)    } =0 +  .ctors     : { *(.ctors)   } +  .dtors     : { *(.dtors)   } + +  /* Read-write section, merged into data segment: */ +  . = (. + 0x00FF) & 0xFFFFFF00; +  _erotext = .; +  PROVIDE (erotext = .); +  .reloc   : +  { +    *(.got) +    _GOT2_TABLE_ = .; +    *(.got2) +    _FIXUP_TABLE_ = .; +    *(.fixup) +  } +  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >> 2; +  __fixup_entries = (. - _FIXUP_TABLE_) >> 2; + +  .data    : +  { +    *(.data) +    *(.data1) +    *(.sdata) +    *(.sdata2) +    *(.dynamic) +    CONSTRUCTORS +  } +  _edata  =  .; +  PROVIDE (edata = .); + +  . = .; +  __u_boot_cmd_start = .; +  .u_boot_cmd : { *(.u_boot_cmd) } +  __u_boot_cmd_end = .; + +  . = .; +  __start___ex_table = .; +  __ex_table : { *(__ex_table) } +  __stop___ex_table = .; + +  . = ALIGN(256); +  __init_begin = .; +  .text.init : { *(.text.init) } +  .data.init : { *(.data.init) } +  . = ALIGN(256); +  __init_end = .; + +  __bss_start = .; +  .bss       : +  { +   *(.sbss) *(.scommon) +   *(.dynbss) +   *(.bss) +   *(COMMON) +  } +  _end = . ; +  PROVIDE (end = .); +} diff --git a/board/freescale/mpc8548cds/Makefile b/board/freescale/mpc8548cds/Makefile new file mode 100644 index 000000000..7f5309885 --- /dev/null +++ b/board/freescale/mpc8548cds/Makefile @@ -0,0 +1,60 @@ +# +# Copyright 2004 Freescale Semiconductor. +# (C) Copyright 2001-2006 +# Wolfgang Denk, DENX Software Engineering, wd@denx.de. +# +# See file CREDITS for list of people who contributed to this +# project. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# + +include $(TOPDIR)/config.mk +ifneq ($(OBJTREE),$(SRCTREE)) +$(shell mkdir -p $(obj)../common) +endif + +LIB	= $(obj)lib$(BOARD).a + +COBJS	:= $(BOARD).o \ +	   ../common/cadmus.o \ +	   ../common/eeprom.o \ +	   ../common/ft_board.o \ +	   ../common/via.o + +SOBJS	:= init.o + +SRCS	:= $(SOBJS:.o=.S) $(COBJS:.o=.c) +OBJS	:= $(addprefix $(obj),$(COBJS)) +SOBJS	:= $(addprefix $(obj),$(SOBJS)) + +$(LIB):	$(obj).depend $(OBJS) $(SOBJS) +	$(AR) $(ARFLAGS) $@ $(OBJS) + +clean: +	rm -f $(OBJS) $(SOBJS) + +distclean:	clean +	rm -f $(LIB) core *.bak .depend + +######################################################################### + +# defines $(obj).depend target +include $(SRCTREE)/rules.mk + +sinclude $(obj).depend + +######################################################################### diff --git a/board/freescale/mpc8548cds/config.mk b/board/freescale/mpc8548cds/config.mk new file mode 100644 index 000000000..b23bc8737 --- /dev/null +++ b/board/freescale/mpc8548cds/config.mk @@ -0,0 +1,32 @@ +# +# Copyright 2004, 2007 Freescale Semiconductor. +# +# See file CREDITS for list of people who contributed to this +# project. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# + +# +# mpc8548cds board +# +ifndef TEXT_BASE +TEXT_BASE = 0xfff80000 +endif + +PLATFORM_CPPFLAGS += -DCONFIG_E500=1 +PLATFORM_CPPFLAGS += -DCONFIG_MPC85xx=1 +PLATFORM_CPPFLAGS += -DCONFIG_MPC8548=1 diff --git a/board/freescale/mpc8548cds/init.S b/board/freescale/mpc8548cds/init.S new file mode 100644 index 000000000..a83a0952c --- /dev/null +++ b/board/freescale/mpc8548cds/init.S @@ -0,0 +1,263 @@ +/* + * Copyright 2004, 2007 Freescale Semiconductor. + * Copyright 2002,2003, Motorola Inc. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <ppc_asm.tmpl> +#include <ppc_defs.h> +#include <asm/cache.h> +#include <asm/mmu.h> +#include <config.h> +#include <mpc85xx.h> + +/* + * TLB0 and TLB1 Entries + * + * Out of reset, TLB1's Entry 0 maps the highest 4K for CCSRBAR. + * However, CCSRBAR is then relocated to CFG_CCSRBAR right after + * these TLB entries are established. + * + * The TLB entries for DDR are dynamically setup in spd_sdram() + * and use TLB1 Entries 8 through 15 as needed according to the + * size of DDR memory. + * + * MAS0: tlbsel, esel, nv + * MAS1: valid, iprot, tid, ts, tsize + * MAS2: epn, sharen, x0, x1, w, i, m, g, e + * MAS3: rpn, u0-u3, ux, sx, uw, sw, ur, sr + */ + +#define	entry_start \ +	mflr	r1	;	\ +	bl	0f	; + +#define	entry_end \ +0:	mflr	r0	;	\ +	mtlr	r1	;	\ +	blr		; + + +	.section	.bootpg, "ax" +	.globl	tlb1_entry +tlb1_entry: +	entry_start + +	/* +	 * Number of TLB0 and TLB1 entries in the following table +	 */ +	.long (2f-1f)/16 + +1: +#if (CFG_CCSRBAR_DEFAULT != CFG_CCSRBAR) +	/* +	 * TLB0		4K	Non-cacheable, guarded +	 * 0xff700000	4K	Initial CCSRBAR mapping +	 * +	 * This ends up at a TLB0 Index==0 entry, and must not collide +	 * with other TLB0 Entries. +	 */ +	.long TLB1_MAS0(0, 0, 0) +	.long TLB1_MAS1(1, 0, 0, 0, 0) +	.long TLB1_MAS2(E500_TLB_EPN(CFG_CCSRBAR_DEFAULT), 0,0,0,0,1,0,1,0) +	.long TLB1_MAS3(E500_TLB_RPN(CFG_CCSRBAR_DEFAULT), 0,0,0,0,0,1,0,1,0,1) +#else +#error("Update the number of table entries in tlb1_entry") +#endif + +	/* +	 * TLB0		16K	Cacheable, guarded +	 * Temporary Global data for initialization +	 * +	 * Use four 4K TLB0 entries.  These entries must be cacheable +	 * as they provide the bootstrap memory before the memory +	 * controler and real memory have been configured. +	 * +	 * These entries end up at TLB0 Indicies 0x10, 0x14, 0x18 and 0x1c, +	 * and must not collide with other TLB0 entries. +	 */ +	.long TLB1_MAS0(0, 0, 0) +	.long TLB1_MAS1(1, 0, 0, 0, 0) +	.long TLB1_MAS2(E500_TLB_EPN(CFG_INIT_RAM_ADDR), +			0,0,0,0,0,0,1,0) +	.long TLB1_MAS3(E500_TLB_RPN(CFG_INIT_RAM_ADDR), +			0,0,0,0,0,1,0,1,0,1) + +	.long TLB1_MAS0(0, 0, 0) +	.long TLB1_MAS1(1, 0, 0, 0, 0) +	.long TLB1_MAS2(E500_TLB_EPN(CFG_INIT_RAM_ADDR + 4 * 1024), +			0,0,0,0,0,0,1,0) +	.long TLB1_MAS3(E500_TLB_RPN(CFG_INIT_RAM_ADDR + 4 * 1024), +			0,0,0,0,0,1,0,1,0,1) + +	.long TLB1_MAS0(0, 0, 0) +	.long TLB1_MAS1(1, 0, 0, 0, 0) +	.long TLB1_MAS2(E500_TLB_EPN(CFG_INIT_RAM_ADDR + 8 * 1024), +			0,0,0,0,0,0,1,0) +	.long TLB1_MAS3(E500_TLB_RPN(CFG_INIT_RAM_ADDR + 8 * 1024), +			0,0,0,0,0,1,0,1,0,1) + +	.long TLB1_MAS0(0, 0, 0) +	.long TLB1_MAS1(1, 0, 0, 0, 0) +	.long TLB1_MAS2(E500_TLB_EPN(CFG_INIT_RAM_ADDR + 12 * 1024), +			0,0,0,0,0,0,1,0) +	.long TLB1_MAS3(E500_TLB_RPN(CFG_INIT_RAM_ADDR + 12 * 1024), +			0,0,0,0,0,1,0,1,0,1) + + +	/* +	 * TLB 0:	16M	Non-cacheable, guarded +	 * 0xff000000	16M	FLASH +	 * Out of reset this entry is only 4K. +	 */ +	.long TLB1_MAS0(1, 0, 0) +	.long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_16M) +	.long TLB1_MAS2(E500_TLB_EPN(CFG_BOOT_BLOCK), 0,0,0,0,1,0,1,0) +	.long TLB1_MAS3(E500_TLB_RPN(CFG_BOOT_BLOCK), 0,0,0,0,0,1,0,1,0,1) + +	/* +	 * TLB 1:	1G	Non-cacheable, guarded +	 * 0x80000000	1G	PCI1/PCIE  8,9,a,b +	 */ +	.long TLB1_MAS0(1, 1, 0) +	.long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_1G) +	.long TLB1_MAS2(E500_TLB_EPN(CFG_PCI_PHYS), 0,0,0,0,1,0,1,0) +	.long TLB1_MAS3(E500_TLB_RPN(CFG_PCI_PHYS), 0,0,0,0,0,1,0,1,0,1) + +#ifdef CFG_RIO_MEM_PHYS +	/* +	 * TLB 2:	256M	Non-cacheable, guarded +	 */ +	.long TLB1_MAS0(1, 2, 0) +	.long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_256M) +	.long TLB1_MAS2(E500_TLB_EPN(CFG_RIO_MEM_PHYS), +			0,0,0,0,1,0,1,0) +	.long TLB1_MAS3(E500_TLB_RPN(CFG_RIO_MEM_PHYS),	0,0,0,0,0,1,0,1,0,1) + +	/* +	 * TLB 3:	256M	Non-cacheable, guarded +	 */ +	.long TLB1_MAS0(1, 3, 0) +	.long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_256M) +	.long TLB1_MAS2(E500_TLB_EPN(CFG_RIO_MEM_PHYS + 0x10000000), +			0,0,0,0,1,0,1,0) +	.long TLB1_MAS3(E500_TLB_RPN(CFG_RIO_MEM_PHYS + 0x10000000), +			0,0,0,0,0,1,0,1,0,1) +#endif +	/* +	 * TLB 5:	64M	Non-cacheable, guarded +	 * 0xe000_0000	1M	CCSRBAR +	 * 0xe200_0000	1M	PCI1 IO +	 * 0xe210_0000	1M	PCI2 IO +	 * 0xe300_0000	1M	PCIe IO +	 */ +	.long TLB1_MAS0(1, 5, 0) +	.long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_64M) +	.long TLB1_MAS2(E500_TLB_EPN(CFG_CCSRBAR), 0,0,0,0,1,0,1,0) +	.long TLB1_MAS3(E500_TLB_RPN(CFG_CCSRBAR), 0,0,0,0,0,1,0,1,0,1) + +	/* +	 * TLB 6:	64M	Cacheable, non-guarded +	 * 0xf000_0000	64M	LBC SDRAM +	 */ +	.long TLB1_MAS0(1, 6, 0) +	.long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_64M) +	.long TLB1_MAS2(E500_TLB_EPN(CFG_LBC_CACHE_BASE), 0,0,0,0,0,0,0,0) +	.long TLB1_MAS3(E500_TLB_RPN(CFG_LBC_CACHE_BASE), 0,0,0,0,0,1,0,1,0,1) + +	/* +	 * TLB 7:	64M	Non-cacheable, guarded +	 * 0xf8000000	64M	CADMUS registers, relocated L2SRAM +	 */ +	.long TLB1_MAS0(1, 7, 0) +	.long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_64M) +	.long TLB1_MAS2(E500_TLB_EPN(CFG_LBC_NONCACHE_BASE), 0,0,0,0,1,0,1,0) +	.long TLB1_MAS3(E500_TLB_RPN(CFG_LBC_NONCACHE_BASE), 0,0,0,0,0,1,0,1,0,1) + +2: +	entry_end + +/* + * LAW(Local Access Window) configuration: + * + * 0x0000_0000     0x7fff_ffff     DDR                     2G + * 0x8000_0000     0x9fff_ffff     PCI1 MEM                512M + * 0xa000_0000     0xbfff_ffff     PCIe MEM                512M + * 0xc000_0000     0xdfff_ffff     RapidIO                 512M + * 0xe000_0000     0xe000_ffff     CCSR                    1M + * 0xe200_0000     0xe10f_ffff     PCI1 IO                 1M + * 0xe280_0000     0xe20f_ffff     PCI2 IO                 1M + * 0xe300_0000     0xe30f_ffff     PCIe IO                 1M + * 0xf000_0000     0xf3ff_ffff     SDRAM                   64M + * 0xf800_0000     0xf80f_ffff     NVRAM/CADMUS (*)        1M + * 0xff00_0000     0xff7f_ffff     FLASH (2nd bank)        8M + * 0xff80_0000     0xffff_ffff     FLASH (boot bank)       8M + * + * Notes: + *    CCSRBAR and L2-as-SRAM don't need a configured Local Access Window. + *    If flash is 8M at default position (last 8M), no LAW needed. + * + * LAW 0 is reserved for boot mapping + */ + +	.section .bootpg, "ax" +	.globl	law_entry +law_entry: +	entry_start + +	.long (4f-3f)/8 +3: +	.long  0 +	.long  (LAWAR_TRGT_IF_DDR | (LAWAR_SIZE & LAWAR_SIZE_128M)) & ~LAWAR_EN + +#ifdef CFG_PCI1_MEM_PHYS +	.long	(CFG_PCI1_MEM_PHYS>>12) & 0xfffff +	.long	LAWAR_EN | LAWAR_TRGT_IF_PCI1 | (LAWAR_SIZE & LAWAR_SIZE_512M) + +	.long	(CFG_PCI1_IO_PHYS>>12) & 0xfffff +	.long	LAWAR_EN | LAWAR_TRGT_IF_PCI1 | (LAWAR_SIZE & LAWAR_SIZE_1M) +#endif + +#ifdef CFG_PCI2_MEM_PHYS +	.long	(CFG_PCI2_MEM_PHYS>>12) & 0xfffff +	.long	LAWAR_EN | LAWAR_TRGT_IF_PCI2 | (LAWAR_SIZE & LAWAR_SIZE_512M) + +	.long	(CFG_PCI2_IO_PHYS>>12) & 0xfffff +	.long	LAWAR_EN | LAWAR_TRGT_IF_PCI2 | (LAWAR_SIZE & LAWAR_SIZE_1M) +#endif + +#ifdef CFG_PCIE1_MEM_PHYS +	.long	(CFG_PCIE1_MEM_PHYS>>12) & 0xfffff +	.long	LAWAR_EN | LAWAR_TRGT_IF_PCIE1 | (LAWAR_SIZE & LAWAR_SIZE_512M) + +	.long	(CFG_PCIE1_IO_PHYS>>12) & 0xfffff +	.long	LAWAR_EN | LAWAR_TRGT_IF_PCIE1 | (LAWAR_SIZE & LAWAR_SIZE_1M) +#endif + +	/* LBC window - maps 256M 0xf0000000 -> 0xffffffff */ +	.long	(CFG_LBC_CACHE_BASE>>12) & 0xfffff +	.long	LAWAR_EN | LAWAR_TRGT_IF_LBC | (LAWAR_SIZE & LAWAR_SIZE_256M) + +#ifdef CFG_RIO_MEM_PHYS +	.long	(CFG_RIO_MEM_PHYS>>12) & 0xfffff +	.long	LAWAR_EN | LAWAR_TRGT_IF_RIO | (LAWAR_SIZE & LAWAR_SIZE_512M) +#endif +4: +	entry_end diff --git a/board/freescale/mpc8548cds/mpc8548cds.c b/board/freescale/mpc8548cds/mpc8548cds.c new file mode 100644 index 000000000..47e2dd86c --- /dev/null +++ b/board/freescale/mpc8548cds/mpc8548cds.c @@ -0,0 +1,547 @@ +/* + * Copyright 2004, 2007 Freescale Semiconductor. + * + * (C) Copyright 2002 Scott McNutt <smcnutt@artesyncp.com> + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <common.h> +#include <pci.h> +#include <asm/processor.h> +#include <asm/immap_85xx.h> +#include <asm/immap_fsl_pci.h> +#include <spd.h> +#include <miiphy.h> +#include <libfdt.h> +#include <fdt_support.h> + +#include "../common/cadmus.h" +#include "../common/eeprom.h" +#include "../common/via.h" + +#if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER) +extern void ddr_enable_ecc(unsigned int dram_size); +#endif + +DECLARE_GLOBAL_DATA_PTR; + +extern long int spd_sdram(void); + +void local_bus_init(void); +void sdram_init(void); + +int board_early_init_f (void) +{ +	return 0; +} + +int checkboard (void) +{ +	volatile ccsr_gur_t *gur = (void *)(CFG_MPC85xx_GUTS_ADDR); +	volatile ccsr_local_ecm_t *ecm = (void *)(CFG_MPC85xx_ECM_ADDR); + +	/* PCI slot in USER bits CSR[6:7] by convention. */ +	uint pci_slot = get_pci_slot (); + +	uint cpu_board_rev = get_cpu_board_revision (); + +	printf ("Board: CDS Version 0x%02x, PCI Slot %d\n", +		get_board_version (), pci_slot); + +	printf ("CPU Board Revision %d.%d (0x%04x)\n", +		MPC85XX_CPU_BOARD_MAJOR (cpu_board_rev), +		MPC85XX_CPU_BOARD_MINOR (cpu_board_rev), cpu_board_rev); +	/* +	 * Initialize local bus. +	 */ +	local_bus_init (); + +	/* +	 * Fix CPU2 errata: A core hang possible while executing a +	 * msync instruction and a snoopable transaction from an I/O +	 * master tagged to make quick forward progress is present. +	 */ +	ecm->eebpcr |= (1 << 16); + +	/* +	 * Hack TSEC 3 and 4 IO voltages. +	 */ +	gur->tsec34ioovcr = 0xe7e0;	/*  1110 0111 1110 0xxx */ + +	ecm->eedr = 0xffffffff;		/* clear ecm errors */ +	ecm->eeer = 0xffffffff;		/* enable ecm errors */ +	return 0; +} + +long int +initdram(int board_type) +{ +	long dram_size = 0; + +	puts("Initializing\n"); + +#if defined(CONFIG_DDR_DLL) +	{ +		/* +		 * Work around to stabilize DDR DLL MSYNC_IN. +		 * Errata DDR9 seems to have been fixed. +		 * This is now the workaround for Errata DDR11: +		 *    Override DLL = 1, Course Adj = 1, Tap Select = 0 +		 */ + +		volatile ccsr_gur_t *gur = (void *)(CFG_MPC85xx_GUTS_ADDR); + +		gur->ddrdllcr = 0x81000000; +		asm("sync;isync;msync"); +		udelay(200); +	} +#endif +	dram_size = spd_sdram(); + +#if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER) +	/* +	 * Initialize and enable DDR ECC. +	 */ +	ddr_enable_ecc(dram_size); +#endif +	/* +	 * SDRAM Initialization +	 */ +	sdram_init(); + +	puts("    DDR: "); +	return dram_size; +} + +/* + * Initialize Local Bus + */ +void +local_bus_init(void) +{ +	volatile ccsr_gur_t *gur = (void *)(CFG_MPC85xx_GUTS_ADDR); +	volatile ccsr_lbc_t *lbc = (void *)(CFG_MPC85xx_LBC_ADDR); + +	uint clkdiv; +	uint lbc_hz; +	sys_info_t sysinfo; + +	get_sys_info(&sysinfo); +	clkdiv = (lbc->lcrr & 0x0f) * 2; +	lbc_hz = sysinfo.freqSystemBus / 1000000 / clkdiv; + +	gur->lbiuiplldcr1 = 0x00078080; +	if (clkdiv == 16) { +		gur->lbiuiplldcr0 = 0x7c0f1bf0; +	} else if (clkdiv == 8) { +		gur->lbiuiplldcr0 = 0x6c0f1bf0; +	} else if (clkdiv == 4) { +		gur->lbiuiplldcr0 = 0x5c0f1bf0; +	} + +	lbc->lcrr |= 0x00030000; + +	asm("sync;isync;msync"); + +	lbc->ltesr = 0xffffffff;	/* Clear LBC error interrupts */ +	lbc->lteir = 0xffffffff;	/* Enable LBC error interrupts */ +} + +/* + * Initialize SDRAM memory on the Local Bus. + */ +void +sdram_init(void) +{ +#if defined(CFG_OR2_PRELIM) && defined(CFG_BR2_PRELIM) + +	uint idx; +	volatile ccsr_lbc_t *lbc = (void *)(CFG_MPC85xx_LBC_ADDR); +	uint *sdram_addr = (uint *)CFG_LBC_SDRAM_BASE; +	uint cpu_board_rev; +	uint lsdmr_common; + +	puts("    SDRAM: "); + +	print_size (CFG_LBC_SDRAM_SIZE * 1024 * 1024, "\n"); + +	/* +	 * Setup SDRAM Base and Option Registers +	 */ +	lbc->or2 = CFG_OR2_PRELIM; +	asm("msync"); + +	lbc->br2 = CFG_BR2_PRELIM; +	asm("msync"); + +	lbc->lbcr = CFG_LBC_LBCR; +	asm("msync"); + + +	lbc->lsrt = CFG_LBC_LSRT; +	lbc->mrtpr = CFG_LBC_MRTPR; +	asm("msync"); + +	/* +	 * MPC8548 uses "new" 15-16 style addressing. +	 */ +	cpu_board_rev = get_cpu_board_revision(); +	lsdmr_common = CFG_LBC_LSDMR_COMMON; +	lsdmr_common |= CFG_LBC_LSDMR_BSMA1516; + +	/* +	 * Issue PRECHARGE ALL command. +	 */ +	lbc->lsdmr = lsdmr_common | CFG_LBC_LSDMR_OP_PCHALL; +	asm("sync;msync"); +	*sdram_addr = 0xff; +	ppcDcbf((unsigned long) sdram_addr); +	udelay(100); + +	/* +	 * Issue 8 AUTO REFRESH commands. +	 */ +	for (idx = 0; idx < 8; idx++) { +		lbc->lsdmr = lsdmr_common | CFG_LBC_LSDMR_OP_ARFRSH; +		asm("sync;msync"); +		*sdram_addr = 0xff; +		ppcDcbf((unsigned long) sdram_addr); +		udelay(100); +	} + +	/* +	 * Issue 8 MODE-set command. +	 */ +	lbc->lsdmr = lsdmr_common | CFG_LBC_LSDMR_OP_MRW; +	asm("sync;msync"); +	*sdram_addr = 0xff; +	ppcDcbf((unsigned long) sdram_addr); +	udelay(100); + +	/* +	 * Issue NORMAL OP command. +	 */ +	lbc->lsdmr = lsdmr_common | CFG_LBC_LSDMR_OP_NORMAL; +	asm("sync;msync"); +	*sdram_addr = 0xff; +	ppcDcbf((unsigned long) sdram_addr); +	udelay(200);    /* Overkill. Must wait > 200 bus cycles */ + +#endif	/* enable SDRAM init */ +} + +#if defined(CFG_DRAM_TEST) +int +testdram(void) +{ +	uint *pstart = (uint *) CFG_MEMTEST_START; +	uint *pend = (uint *) CFG_MEMTEST_END; +	uint *p; + +	printf("Testing DRAM from 0x%08x to 0x%08x\n", +	       CFG_MEMTEST_START, +	       CFG_MEMTEST_END); + +	printf("DRAM test phase 1:\n"); +	for (p = pstart; p < pend; p++) +		*p = 0xaaaaaaaa; + +	for (p = pstart; p < pend; p++) { +		if (*p != 0xaaaaaaaa) { +			printf ("DRAM test fails at: %08x\n", (uint) p); +			return 1; +		} +	} + +	printf("DRAM test phase 2:\n"); +	for (p = pstart; p < pend; p++) +		*p = 0x55555555; + +	for (p = pstart; p < pend; p++) { +		if (*p != 0x55555555) { +			printf ("DRAM test fails at: %08x\n", (uint) p); +			return 1; +		} +	} + +	printf("DRAM test passed.\n"); +	return 0; +} +#endif + +#if defined(CONFIG_PCI) || defined(CONFIG_PCI1) +/* For some reason the Tundra PCI bridge shows up on itself as a + * different device.  Work around that by refusing to configure it. + */ +void dummy_func(struct pci_controller* hose, pci_dev_t dev, struct pci_config_table *tab) { } + +static struct pci_config_table pci_mpc85xxcds_config_table[] = { +	{0x10e3, 0x0513, PCI_ANY_ID, 1, 3, PCI_ANY_ID, dummy_func, {0,0,0}}, +	{0x1106, 0x0686, PCI_ANY_ID, 1, VIA_ID, 0, mpc85xx_config_via, {0,0,0}}, +	{0x1106, 0x0571, PCI_ANY_ID, 1, VIA_ID, 1, +		mpc85xx_config_via_usbide, {0,0,0}}, +	{0x1105, 0x3038, PCI_ANY_ID, 1, VIA_ID, 2, +		mpc85xx_config_via_usb, {0,0,0}}, +	{0x1106, 0x3038, PCI_ANY_ID, 1, VIA_ID, 3, +		mpc85xx_config_via_usb2, {0,0,0}}, +	{0x1106, 0x3058, PCI_ANY_ID, 1, VIA_ID, 5, +		mpc85xx_config_via_power, {0,0,0}}, +	{0x1106, 0x3068, PCI_ANY_ID, 1, VIA_ID, 6, +		mpc85xx_config_via_ac97, {0,0,0}}, +	{}, +}; + +static struct pci_controller pci1_hose = { +	config_table: pci_mpc85xxcds_config_table}; +#endif	/* CONFIG_PCI */ + +#ifdef CONFIG_PCI2 +static struct pci_controller pci2_hose; +#endif	/* CONFIG_PCI2 */ + +#ifdef CONFIG_PCIE1 +static struct pci_controller pcie1_hose; +#endif	/* CONFIG_PCIE1 */ + +int first_free_busno=0; + +void +pci_init_board(void) +{ +	volatile ccsr_gur_t *gur = (void *)(CFG_MPC85xx_GUTS_ADDR); +	uint io_sel = (gur->pordevsr & MPC85xx_PORDEVSR_IO_SEL) >> 19; +	uint host_agent = (gur->porbmsr & MPC85xx_PORBMSR_HA) >> 16; + + +#ifdef CONFIG_PCI1 +{ +	volatile ccsr_fsl_pci_t *pci = (ccsr_fsl_pci_t *) CFG_PCI1_ADDR; +	extern void fsl_pci_init(struct pci_controller *hose); +	struct pci_controller *hose = &pci1_hose; +	struct pci_config_table *table; + +	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] */ + +	uint pci_agent = (host_agent == 3) || (host_agent == 4 ) || (host_agent == 6); + +	uint pci_speed = get_clock_freq ();	/* PCI PSPEED in [4:5] */ + +	if (!(gur->devdisr & MPC85xx_DEVDISR_PCI1)) { +		printf ("    PCI: %d bit, %s MHz, %s, %s, %s\n", +			(pci_32) ? 32 : 64, +			(pci_speed == 33333000) ? "33" : +			(pci_speed == 66666000) ? "66" : "unknown", +			pci_clk_sel ? "sync" : "async", +			pci_agent ? "agent" : "host", +			pci_arb ? "arbiter" : "external-arbiter" +			); + + +		/* inbound */ +		pci_set_region(hose->regions + 0, +			       CFG_PCI_MEMORY_BUS, +			       CFG_PCI_MEMORY_PHYS, +			       CFG_PCI_MEMORY_SIZE, +			       PCI_REGION_MEM | PCI_REGION_MEMORY); + + +		/* outbound memory */ +		pci_set_region(hose->regions + 1, +			       CFG_PCI1_MEM_BASE, +			       CFG_PCI1_MEM_PHYS, +			       CFG_PCI1_MEM_SIZE, +			       PCI_REGION_MEM); + +		/* outbound io */ +		pci_set_region(hose->regions + 2, +			       CFG_PCI1_IO_BASE, +			       CFG_PCI1_IO_PHYS, +			       CFG_PCI1_IO_SIZE, +			       PCI_REGION_IO); +		hose->region_count = 3; + +		/* relocate config table pointers */ +		hose->config_table = \ +			(struct pci_config_table *)((uint)hose->config_table + gd->reloc_off); +		for (table = hose->config_table; table && table->vendor; table++) +			table->config_device += gd->reloc_off; + +		hose->first_busno=first_free_busno; +		pci_setup_indirect(hose, (int) &pci->cfg_addr, (int) &pci->cfg_data); + +		fsl_pci_init(hose); +		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 & PORDEVSR_PCI)) { +			/* 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 +	} else { +		printf ("    PCI: disabled\n"); +	} +} +#else +	gur->devdisr |= MPC85xx_DEVDISR_PCI1; /* disable */ +#endif + +#ifdef CONFIG_PCI2 +{ +	uint pci2_clk_sel = gur->porpllsr & 0x4000;	/* PORPLLSR[17] */ +	uint pci_dual = get_pci_dual ();	/* PCI DUAL in CM_PCI[3] */ +	if (pci_dual) { +		printf ("    PCI2: 32 bit, 66 MHz, %s\n", +			pci2_clk_sel ? "sync" : "async"); +	} else { +		printf ("    PCI2: disabled\n"); +	} +} +#else +	gur->devdisr |= MPC85xx_DEVDISR_PCI2; /* disable */ +#endif /* CONFIG_PCI2 */ + +#ifdef CONFIG_PCIE1 +{ +	volatile ccsr_fsl_pci_t *pci = (ccsr_fsl_pci_t *) CFG_PCIE1_ADDR; +	extern void fsl_pci_init(struct pci_controller *hose); +	struct pci_controller *hose = &pcie1_hose; +	int pcie_ep =  (host_agent == 0) || (host_agent == 2 ) || (host_agent == 3); + +	int pcie_configured  = io_sel >= 1; + +	if (pcie_configured && !(gur->devdisr & MPC85xx_DEVDISR_PCIE)){ +		printf ("\n    PCIE connected to slot as %s (base address %x)", +			pcie_ep ? "End Point" : "Root Complex", +			(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"); + +		/* inbound */ +		pci_set_region(hose->regions + 0, +			       CFG_PCI_MEMORY_BUS, +			       CFG_PCI_MEMORY_PHYS, +			       CFG_PCI_MEMORY_SIZE, +			       PCI_REGION_MEM | PCI_REGION_MEMORY); + +		/* outbound memory */ +		pci_set_region(hose->regions + 1, +			       CFG_PCIE1_MEM_BASE, +			       CFG_PCIE1_MEM_PHYS, +			       CFG_PCIE1_MEM_SIZE, +			       PCI_REGION_MEM); + +		/* outbound io */ +		pci_set_region(hose->regions + 2, +			       CFG_PCIE1_IO_BASE, +			       CFG_PCIE1_IO_PHYS, +			       CFG_PCIE1_IO_SIZE, +			       PCI_REGION_IO); + +		hose->region_count = 3; + +		hose->first_busno=first_free_busno; +		pci_setup_indirect(hose, (int) &pci->cfg_addr, (int) &pci->cfg_data); + +		fsl_pci_init(hose); +		printf ("PCIE on bus %d - %d\n",hose->first_busno,hose->last_busno); + +		first_free_busno=hose->last_busno+1; + +	} else { +		printf ("    PCIE: disabled\n"); +	} + } +#else +	gur->devdisr |= MPC85xx_DEVDISR_PCIE; /* disable */ +#endif + +} + +int last_stage_init(void) +{ +	unsigned short temp; + +	/* Change the resistors for the PHY */ +	/* This is needed to get the RGMII working for the 1.3+ +	 * CDS cards */ +	if (get_board_version() ==  0x13) { +		miiphy_write(CONFIG_TSEC1_NAME, +				TSEC1_PHY_ADDR, 29, 18); + +		miiphy_read(CONFIG_TSEC1_NAME, +				TSEC1_PHY_ADDR, 30, &temp); + +		temp = (temp & 0xf03f); +		temp |= 2 << 9;		/* 36 ohm */ +		temp |= 2 << 6;		/* 39 ohm */ + +		miiphy_write(CONFIG_TSEC1_NAME, +				TSEC1_PHY_ADDR, 30, temp); + +		miiphy_write(CONFIG_TSEC1_NAME, +				TSEC1_PHY_ADDR, 29, 3); + +		miiphy_write(CONFIG_TSEC1_NAME, +				TSEC1_PHY_ADDR, 30, 0x8000); +	} + +	return 0; +} + + +#if defined(CONFIG_OF_BOARD_SETUP) +void +ft_pci_setup(void *blob, bd_t *bd) +{ +	int node, tmp[2]; +	const char *path; + +	node = fdt_path_offset(blob, "/aliases"); +	tmp[0] = 0; +	if (node >= 0) { +#ifdef CONFIG_PCI1 +		path = fdt_getprop(blob, node, "pci0", NULL); +		if (path) { +			tmp[1] = pci1_hose.last_busno - pci1_hose.first_busno; +			do_fixup_by_path(blob, path, "bus-range", &tmp, 8, 1); +		} +#endif +#ifdef CONFIG_PCIE1 +		path = fdt_getprop(blob, node, "pci1", NULL); +		if (path) { +			tmp[1] = pcie1_hose.last_busno - pcie1_hose.first_busno; +			do_fixup_by_path(blob, path, "bus-range", &tmp, 8, 1); +		} +#endif +	} +} +#endif diff --git a/board/freescale/mpc8548cds/u-boot.lds b/board/freescale/mpc8548cds/u-boot.lds new file mode 100644 index 000000000..ee772d3ae --- /dev/null +++ b/board/freescale/mpc8548cds/u-boot.lds @@ -0,0 +1,149 @@ +/* + * Copyright 2004, 2007 Freescale Semiconductor. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +OUTPUT_ARCH(powerpc) +SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/local/lib); SEARCH_DIR(/usr/local/powerpc-any-elf/lib); +/* Do we need any of these for elf? +   __DYNAMIC = 0;    */ +SECTIONS +{ +  .resetvec 0xFFFFFFFC : +  { +    *(.resetvec) +  } = 0xffff + +  .bootpg 0xFFFFF000 : +  { +    cpu/mpc85xx/start.o	(.bootpg) +    board/freescale/mpc8548cds/init.o (.bootpg) +  } = 0xffff + +  /* Read-only sections, merged into text segment: */ +  . = + SIZEOF_HEADERS; +  .interp : { *(.interp) } +  .hash          : { *(.hash)		} +  .dynsym        : { *(.dynsym)		} +  .dynstr        : { *(.dynstr)		} +  .rel.text      : { *(.rel.text)		} +  .rela.text     : { *(.rela.text) 	} +  .rel.data      : { *(.rel.data)		} +  .rela.data     : { *(.rela.data) 	} +  .rel.rodata    : { *(.rel.rodata) 	} +  .rela.rodata   : { *(.rela.rodata) 	} +  .rel.got       : { *(.rel.got)		} +  .rela.got      : { *(.rela.got)		} +  .rel.ctors     : { *(.rel.ctors)	} +  .rela.ctors    : { *(.rela.ctors)	} +  .rel.dtors     : { *(.rel.dtors)	} +  .rela.dtors    : { *(.rela.dtors)	} +  .rel.bss       : { *(.rel.bss)		} +  .rela.bss      : { *(.rela.bss)		} +  .rel.plt       : { *(.rel.plt)		} +  .rela.plt      : { *(.rela.plt)		} +  .init          : { *(.init)	} +  .plt : { *(.plt) } +  .text      : +  { +    cpu/mpc85xx/start.o	(.text) +    board/freescale/mpc8548cds/init.o (.text) +    cpu/mpc85xx/traps.o (.text) +    cpu/mpc85xx/interrupts.o (.text) +    cpu/mpc85xx/cpu_init.o (.text) +    cpu/mpc85xx/cpu.o (.text) +    drivers/net/tsec.o (.text) +    cpu/mpc85xx/speed.o (.text) +    common/dlmalloc.o (.text) +    lib_generic/crc32.o (.text) +    lib_ppc/extable.o (.text) +    lib_generic/zlib.o (.text) +    *(.text) +    *(.fixup) +    *(.got1) +   } +    _etext = .; +    PROVIDE (etext = .); +    .rodata    : +   { +    *(.rodata) +    *(.rodata1) +    *(.rodata.str1.4) +    *(.eh_frame) +  } +  .fini      : { *(.fini)    } =0 +  .ctors     : { *(.ctors)   } +  .dtors     : { *(.dtors)   } + +  /* Read-write section, merged into data segment: */ +  . = (. + 0x00FF) & 0xFFFFFF00; +  _erotext = .; +  PROVIDE (erotext = .); +  .reloc   : +  { +    *(.got) +    _GOT2_TABLE_ = .; +    *(.got2) +    _FIXUP_TABLE_ = .; +    *(.fixup) +  } +  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >> 2; +  __fixup_entries = (. - _FIXUP_TABLE_) >> 2; + +  .data    : +  { +    *(.data) +    *(.data1) +    *(.sdata) +    *(.sdata2) +    *(.dynamic) +    CONSTRUCTORS +  } +  _edata  =  .; +  PROVIDE (edata = .); + +  . = .; +  __u_boot_cmd_start = .; +  .u_boot_cmd : { *(.u_boot_cmd) } +  __u_boot_cmd_end = .; + +  . = .; +  __start___ex_table = .; +  __ex_table : { *(__ex_table) } +  __stop___ex_table = .; + +  . = ALIGN(256); +  __init_begin = .; +  .text.init : { *(.text.init) } +  .data.init : { *(.data.init) } +  . = ALIGN(256); +  __init_end = .; + +  __bss_start = .; +  .bss       : +  { +   *(.sbss) *(.scommon) +   *(.dynbss) +   *(.bss) +   *(COMMON) +  } +  _end = . ; +  PROVIDE (end = .); +} diff --git a/board/freescale/mpc8555cds/Makefile b/board/freescale/mpc8555cds/Makefile new file mode 100644 index 000000000..7f5309885 --- /dev/null +++ b/board/freescale/mpc8555cds/Makefile @@ -0,0 +1,60 @@ +# +# Copyright 2004 Freescale Semiconductor. +# (C) Copyright 2001-2006 +# Wolfgang Denk, DENX Software Engineering, wd@denx.de. +# +# See file CREDITS for list of people who contributed to this +# project. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# + +include $(TOPDIR)/config.mk +ifneq ($(OBJTREE),$(SRCTREE)) +$(shell mkdir -p $(obj)../common) +endif + +LIB	= $(obj)lib$(BOARD).a + +COBJS	:= $(BOARD).o \ +	   ../common/cadmus.o \ +	   ../common/eeprom.o \ +	   ../common/ft_board.o \ +	   ../common/via.o + +SOBJS	:= init.o + +SRCS	:= $(SOBJS:.o=.S) $(COBJS:.o=.c) +OBJS	:= $(addprefix $(obj),$(COBJS)) +SOBJS	:= $(addprefix $(obj),$(SOBJS)) + +$(LIB):	$(obj).depend $(OBJS) $(SOBJS) +	$(AR) $(ARFLAGS) $@ $(OBJS) + +clean: +	rm -f $(OBJS) $(SOBJS) + +distclean:	clean +	rm -f $(LIB) core *.bak .depend + +######################################################################### + +# defines $(obj).depend target +include $(SRCTREE)/rules.mk + +sinclude $(obj).depend + +######################################################################### diff --git a/board/freescale/mpc8555cds/config.mk b/board/freescale/mpc8555cds/config.mk new file mode 100644 index 000000000..5dcaa774d --- /dev/null +++ b/board/freescale/mpc8555cds/config.mk @@ -0,0 +1,30 @@ +# +# Copyright 2004 Freescale Semiconductor. +# +# See file CREDITS for list of people who contributed to this +# project. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License as +# published by the Free Software Foundation; either version 2 of +# the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, +# MA 02111-1307 USA +# + +# +# mpc8555cds board +# +TEXT_BASE = 0xfff80000 + +PLATFORM_CPPFLAGS += -DCONFIG_E500=1 +PLATFORM_CPPFLAGS += -DCONFIG_MPC85xx=1 +PLATFORM_CPPFLAGS += -DCONFIG_MPC8555=1 diff --git a/board/freescale/mpc8555cds/init.S b/board/freescale/mpc8555cds/init.S new file mode 100644 index 000000000..978bda5e4 --- /dev/null +++ b/board/freescale/mpc8555cds/init.S @@ -0,0 +1,255 @@ +/* + * Copyright 2004 Freescale Semiconductor. + * Copyright 2002,2003, Motorola Inc. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <ppc_asm.tmpl> +#include <ppc_defs.h> +#include <asm/cache.h> +#include <asm/mmu.h> +#include <config.h> +#include <mpc85xx.h> + + +/* + * TLB0 and TLB1 Entries + * + * Out of reset, TLB1's Entry 0 maps the highest 4K for CCSRBAR. + * However, CCSRBAR is then relocated to CFG_CCSRBAR right after + * these TLB entries are established. + * + * The TLB entries for DDR are dynamically setup in spd_sdram() + * and use TLB1 Entries 8 through 15 as needed according to the + * size of DDR memory. + * + * MAS0: tlbsel, esel, nv + * MAS1: valid, iprot, tid, ts, tsize + * MAS2: epn, sharen, x0, x1, w, i, m, g, e + * MAS3: rpn, u0-u3, ux, sx, uw, sw, ur, sr + */ + +#define	entry_start \ +	mflr	r1 	;	\ +	bl	0f 	; + +#define	entry_end \ +0:	mflr	r0	;	\ +	mtlr	r1	;	\ +	blr		; + + +	.section	.bootpg, "ax" +	.globl	tlb1_entry +tlb1_entry: +	entry_start + +	/* +	 * Number of TLB0 and TLB1 entries in the following table +	 */ +	.long 13 + +#if (CFG_CCSRBAR_DEFAULT != CFG_CCSRBAR) +	/* +	 * TLB0		4K	Non-cacheable, guarded +	 * 0xff700000	4K	Initial CCSRBAR mapping +	 * +	 * This ends up at a TLB0 Index==0 entry, and must not collide +	 * with other TLB0 Entries. +	 */ +	.long TLB1_MAS0(0, 0, 0) +	.long TLB1_MAS1(1, 0, 0, 0, 0) +	.long TLB1_MAS2(E500_TLB_EPN(CFG_CCSRBAR_DEFAULT), 0,0,0,0,1,0,1,0) +	.long TLB1_MAS3(E500_TLB_RPN(CFG_CCSRBAR_DEFAULT), 0,0,0,0,0,1,0,1,0,1) +#else +#error("Update the number of table entries in tlb1_entry") +#endif + +	/* +	 * TLB0		16K	Cacheable, non-guarded +	 * 0xd001_0000	16K	Temporary Global data for initialization +	 * +	 * Use four 4K TLB0 entries.  These entries must be cacheable +	 * as they provide the bootstrap memory before the memory +	 * controler and real memory have been configured. +	 * +	 * These entries end up at TLB0 Indicies 0x10, 0x14, 0x18 and 0x1c, +	 * and must not collide with other TLB0 entries. +	 */ +	.long TLB1_MAS0(0, 0, 0) +	.long TLB1_MAS1(1, 0, 0, 0, 0) +	.long TLB1_MAS2(E500_TLB_EPN(CFG_INIT_RAM_ADDR), +			0,0,0,0,0,0,0,0) +	.long TLB1_MAS3(E500_TLB_RPN(CFG_INIT_RAM_ADDR), +			0,0,0,0,0,1,0,1,0,1) + +	.long TLB1_MAS0(0, 0, 0) +	.long TLB1_MAS1(1, 0, 0, 0, 0) +	.long TLB1_MAS2(E500_TLB_EPN(CFG_INIT_RAM_ADDR + 4 * 1024), +			0,0,0,0,0,0,0,0) +	.long TLB1_MAS3(E500_TLB_RPN(CFG_INIT_RAM_ADDR + 4 * 1024), +			0,0,0,0,0,1,0,1,0,1) + +	.long TLB1_MAS0(0, 0, 0) +	.long TLB1_MAS1(1, 0, 0, 0, 0) +	.long TLB1_MAS2(E500_TLB_EPN(CFG_INIT_RAM_ADDR + 8 * 1024), +			0,0,0,0,0,0,0,0) +	.long TLB1_MAS3(E500_TLB_RPN(CFG_INIT_RAM_ADDR + 8 * 1024), +			0,0,0,0,0,1,0,1,0,1) + +	.long TLB1_MAS0(0, 0, 0) +	.long TLB1_MAS1(1, 0, 0, 0, 0) +	.long TLB1_MAS2(E500_TLB_EPN(CFG_INIT_RAM_ADDR + 12 * 1024), +			0,0,0,0,0,0,0,0) +	.long TLB1_MAS3(E500_TLB_RPN(CFG_INIT_RAM_ADDR + 12 * 1024), +			0,0,0,0,0,1,0,1,0,1) + + +	/* +	 * TLB 0:	16M	Non-cacheable, guarded +	 * 0xff000000	16M	FLASH +	 * Out of reset this entry is only 4K. +	 */ +	.long TLB1_MAS0(1, 0, 0) +	.long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_16M) +	.long TLB1_MAS2(E500_TLB_EPN(CFG_FLASH_BASE), 0,0,0,0,1,0,1,0) +	.long TLB1_MAS3(E500_TLB_RPN(CFG_FLASH_BASE), 0,0,0,0,0,1,0,1,0,1) + +	/* +	 * TLB 1:	256M	Non-cacheable, guarded +	 * 0x80000000	256M	PCI1 MEM First half +	 */ +	.long TLB1_MAS0(1, 1, 0) +	.long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_256M) +	.long TLB1_MAS2(E500_TLB_EPN(CFG_PCI1_MEM_BASE), 0,0,0,0,1,0,1,0) +	.long TLB1_MAS3(E500_TLB_RPN(CFG_PCI1_MEM_BASE), 0,0,0,0,0,1,0,1,0,1) + +	/* +	 * TLB 2:	256M	Non-cacheable, guarded +	 * 0x90000000	256M	PCI1 MEM Second half +	 */ +	.long TLB1_MAS0(1, 2, 0) +	.long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_256M) +	.long TLB1_MAS2(E500_TLB_EPN(CFG_PCI1_MEM_BASE + 0x10000000), +			0,0,0,0,1,0,1,0) +	.long TLB1_MAS3(E500_TLB_RPN(CFG_PCI1_MEM_BASE + 0x10000000), +			0,0,0,0,0,1,0,1,0,1) + +	/* +	 * TLB 3:	256M	Non-cacheable, guarded +	 * 0xa0000000	256M	PCI2 MEM First half +	 */ +	.long TLB1_MAS0(1, 3, 0) +	.long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_256M) +	.long TLB1_MAS2(E500_TLB_EPN(CFG_PCI2_MEM_BASE), 0,0,0,0,1,0,1,0) +	.long TLB1_MAS3(E500_TLB_RPN(CFG_PCI2_MEM_BASE), 0,0,0,0,0,1,0,1,0,1) + +	/* +	 * TLB 4:	256M	Non-cacheable, guarded +	 * 0xb0000000	256M	PCI2 MEM Second half +	 */ +	.long TLB1_MAS0(1, 4, 0) +	.long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_256M) +	.long TLB1_MAS2(E500_TLB_EPN(CFG_PCI2_MEM_BASE + 0x10000000), +			0,0,0,0,1,0,1,0) +	.long TLB1_MAS3(E500_TLB_RPN(CFG_PCI2_MEM_BASE + 0x10000000), +			0,0,0,0,0,1,0,1,0,1) + +	/* +	 * TLB 5:	64M	Non-cacheable, guarded +	 * 0xe000_0000	1M	CCSRBAR +	 * 0xe200_0000	16M	PCI1 IO +	 * 0xe300_0000	16M	PCI2 IO +	 */ +	.long TLB1_MAS0(1, 5, 0) +	.long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_64M) +	.long TLB1_MAS2(E500_TLB_EPN(CFG_CCSRBAR), 0,0,0,0,1,0,1,0) +	.long TLB1_MAS3(E500_TLB_RPN(CFG_CCSRBAR), 0,0,0,0,0,1,0,1,0,1) + +	/* +	 * TLB 6:	64M	Cacheable, non-guarded +	 * 0xf000_0000	64M	LBC SDRAM +	 */ +	.long TLB1_MAS0(1, 6, 0) +	.long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_64M) +	.long TLB1_MAS2(E500_TLB_EPN(CFG_LBC_SDRAM_BASE), 0,0,0,0,0,0,0,0) +	.long TLB1_MAS3(E500_TLB_RPN(CFG_LBC_SDRAM_BASE), 0,0,0,0,0,1,0,1,0,1) + +	/* +	 * TLB 7:	1M	Non-cacheable, guarded +	 * 0xf8000000	1M	CADMUS registers +	 */ +	.long TLB1_MAS0(1, 7, 0) +	.long TLB1_MAS1(1, 1, 0, 0, BOOKE_PAGESZ_1M) +	.long TLB1_MAS2(E500_TLB_EPN(CADMUS_BASE_ADDR), 0,0,0,0,1,0,1,0) +	.long TLB1_MAS3(E500_TLB_RPN(CADMUS_BASE_ADDR), 0,0,0,0,0,1,0,1,0,1) + +	entry_end + +/* + * LAW(Local Access Window) configuration: + * + * 0x0000_0000     0x7fff_ffff     DDR                     2G + * 0x8000_0000     0x9fff_ffff     PCI1 MEM                512M + * 0xa000_0000     0xbfff_ffff     PCI2 MEM                512M + * 0xe000_0000     0xe000_ffff     CCSR                    1M + * 0xe200_0000     0xe20f_ffff     PCI1 IO                 1M + * 0xe210_0000     0xe21f_ffff     PCI2 IO                 1M + * 0xf000_0000     0xf7ff_ffff     SDRAM                   128M + * 0xf800_0000     0xf80f_ffff     NVRAM/CADMUS (*)        1M + * 0xff00_0000     0xff7f_ffff     FLASH (2nd bank)        8M + * 0xff80_0000     0xffff_ffff     FLASH (boot bank)       8M + * + * Notes: + *    CCSRBAR and L2-as-SRAM don't need a configured Local Access Window. + *    If flash is 8M at default position (last 8M), no LAW needed. + * + * The defines below are 1-off of the actual LAWAR0 usage. + * So LAWAR3 define uses the LAWAR4 register in the ECM. + */ + +#define LAWBAR0 0 +#define LAWAR0  ((LAWAR_TRGT_IF_DDR | (LAWAR_SIZE & LAWAR_SIZE_128M)) & ~LAWAR_EN) + +#define LAWBAR1 ((CFG_PCI1_MEM_BASE>>12) & 0xfffff) +#define LAWAR1 	(LAWAR_EN | LAWAR_TRGT_IF_PCI1 | (LAWAR_SIZE & LAWAR_SIZE_512M)) + +#define LAWBAR2 ((CFG_PCI2_MEM_BASE>>12) & 0xfffff) +#define LAWAR2 	(LAWAR_EN | LAWAR_TRGT_IF_PCI2 | (LAWAR_SIZE & LAWAR_SIZE_512M)) + +#define LAWBAR3 ((CFG_PCI1_IO_PHYS>>12) & 0xfffff) +#define LAWAR3 	(LAWAR_EN | LAWAR_TRGT_IF_PCI1 | (LAWAR_SIZE & LAWAR_SIZE_1M)) + +#define LAWBAR4 ((CFG_PCI2_IO_PHYS>>12) & 0xfffff) +#define LAWAR4 	(LAWAR_EN | LAWAR_TRGT_IF_PCI2 | (LAWAR_SIZE & LAWAR_SIZE_1M)) + +/* LBC window - maps 256M 0xf0000000 -> 0xffffffff */ +#define LAWBAR5 ((CFG_LBC_SDRAM_BASE>>12) & 0xfffff) +#define LAWAR5 	(LAWAR_EN | LAWAR_TRGT_IF_LBC | (LAWAR_SIZE & LAWAR_SIZE_256M)) + +	.section .bootpg, "ax" +	.globl	law_entry + +law_entry: +	entry_start +	.long 6 +	.long LAWBAR0,LAWAR0,LAWBAR1,LAWAR1,LAWBAR2,LAWAR2,LAWBAR3,LAWAR3 +	.long LAWBAR4,LAWAR4,LAWBAR5,LAWAR5 +	entry_end diff --git a/board/freescale/mpc8555cds/mpc8555cds.c b/board/freescale/mpc8555cds/mpc8555cds.c new file mode 100644 index 000000000..74c220d4f --- /dev/null +++ b/board/freescale/mpc8555cds/mpc8555cds.c @@ -0,0 +1,534 @@ +/* + * Copyright 2004 Freescale Semiconductor. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <common.h> +#include <pci.h> +#include <asm/processor.h> +#include <asm/immap_85xx.h> +#include <ioports.h> +#include <spd.h> +#include <libfdt.h> +#include <fdt_support.h> + +#include "../common/cadmus.h" +#include "../common/eeprom.h" +#include "../common/via.h" + +#if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER) +extern void ddr_enable_ecc(unsigned int dram_size); +#endif + +extern long int spd_sdram(void); + +void local_bus_init(void); +void sdram_init(void); + +/* + * I/O Port configuration table + * + * if conf is 1, then that port pin will be configured at boot time + * according to the five values podr/pdir/ppar/psor/pdat for that entry + */ + +const iop_conf_t iop_conf_tab[4][32] = { + +    /* Port A configuration */ +    {   /*            conf ppar psor pdir podr pdat */ +	/* PA31 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 TxENB */ +	/* PA30 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 TxClav   */ +	/* PA29 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 TxSOC  */ +	/* PA28 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 RxENB */ +	/* PA27 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 RxSOC */ +	/* PA26 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 RxClav */ +	/* PA25 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXD[0] */ +	/* PA24 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXD[1] */ +	/* PA23 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXD[2] */ +	/* PA22 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXD[3] */ +	/* PA21 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXD[4] */ +	/* PA20 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXD[5] */ +	/* PA19 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXD[6] */ +	/* PA18 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXD[7] */ +	/* PA17 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXD[7] */ +	/* PA16 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXD[6] */ +	/* PA15 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXD[5] */ +	/* PA14 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXD[4] */ +	/* PA13 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXD[3] */ +	/* PA12 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXD[2] */ +	/* PA11 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXD[1] */ +	/* PA10 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXD[0] */ +	/* PA9  */ {   0,   1,   1,   1,   0,   0   }, /* FCC1 L1TXD */ +	/* PA8  */ {   0,   1,   1,   0,   0,   0   }, /* FCC1 L1RXD */ +	/* PA7  */ {   0,   0,   0,   1,   0,   0   }, /* PA7 */ +	/* PA6  */ {   0,   1,   1,   1,   0,   0   }, /* TDM A1 L1RSYNC */ +	/* PA5  */ {   0,   0,   0,   1,   0,   0   }, /* PA5 */ +	/* PA4  */ {   0,   0,   0,   1,   0,   0   }, /* PA4 */ +	/* PA3  */ {   0,   0,   0,   1,   0,   0   }, /* PA3 */ +	/* PA2  */ {   0,   0,   0,   1,   0,   0   }, /* PA2 */ +	/* PA1  */ {   1,   0,   0,   0,   0,   0   }, /* FREERUN */ +	/* PA0  */ {   0,   0,   0,   1,   0,   0   }  /* PA0 */ +    }, + +    /* Port B configuration */ +    {   /*            conf ppar psor pdir podr pdat */ +	/* PB31 */ {   1,   1,   0,   1,   0,   0   }, /* FCC2 MII TX_ER */ +	/* PB30 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RX_DV */ +	/* PB29 */ {   1,   1,   1,   1,   0,   0   }, /* FCC2 MII TX_EN */ +	/* PB28 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RX_ER */ +	/* PB27 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII COL */ +	/* PB26 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII CRS */ +	/* PB25 */ {   1,   1,   0,   1,   0,   0   }, /* FCC2 MII TxD[3] */ +	/* PB24 */ {   1,   1,   0,   1,   0,   0   }, /* FCC2 MII TxD[2] */ +	/* PB23 */ {   1,   1,   0,   1,   0,   0   }, /* FCC2 MII TxD[1] */ +	/* PB22 */ {   1,   1,   0,   1,   0,   0   }, /* FCC2 MII TxD[0] */ +	/* PB21 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RxD[0] */ +	/* PB20 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RxD[1] */ +	/* PB19 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RxD[2] */ +	/* PB18 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RxD[3] */ +	/* PB17 */ {   0,   1,   0,   0,   0,   0   }, /* FCC3:RX_DIV */ +	/* PB16 */ {   0,   1,   0,   0,   0,   0   }, /* FCC3:RX_ERR */ +	/* PB15 */ {   0,   1,   0,   1,   0,   0   }, /* FCC3:TX_ERR */ +	/* PB14 */ {   0,   1,   0,   1,   0,   0   }, /* FCC3:TX_EN */ +	/* PB13 */ {   0,   1,   0,   0,   0,   0   }, /* FCC3:COL */ +	/* PB12 */ {   0,   1,   0,   0,   0,   0   }, /* FCC3:CRS */ +	/* PB11 */ {   0,   1,   0,   0,   0,   0   }, /* FCC3:RXD */ +	/* PB10 */ {   0,   1,   0,   0,   0,   0   }, /* FCC3:RXD */ +	/* PB9  */ {   0,   1,   0,   0,   0,   0   }, /* FCC3:RXD */ +	/* PB8  */ {   0,   1,   0,   0,   0,   0   }, /* FCC3:RXD */ +	/* PB7  */ {   0,   1,   0,   1,   0,   0   }, /* FCC3:TXD */ +	/* PB6  */ {   0,   1,   0,   1,   0,   0   }, /* FCC3:TXD */ +	/* PB5  */ {   0,   1,   0,   1,   0,   0   }, /* FCC3:TXD */ +	/* PB4  */ {   0,   1,   0,   1,   0,   0   }, /* FCC3:TXD */ +	/* PB3  */ {   0,   0,   0,   0,   0,   0   }, /* pin doesn't exist */ +	/* PB2  */ {   0,   0,   0,   0,   0,   0   }, /* pin doesn't exist */ +	/* PB1  */ {   0,   0,   0,   0,   0,   0   }, /* pin doesn't exist */ +	/* PB0  */ {   0,   0,   0,   0,   0,   0   }  /* pin doesn't exist */ +    }, + +    /* Port C */ +    {   /*            conf ppar psor pdir podr pdat */ +	/* PC31 */ {   0,   0,   0,   1,   0,   0   }, /* PC31 */ +	/* PC30 */ {   0,   0,   0,   1,   0,   0   }, /* PC30 */ +	/* PC29 */ {   0,   1,   1,   0,   0,   0   }, /* SCC1 EN *CLSN */ +	/* PC28 */ {   0,   0,   0,   1,   0,   0   }, /* PC28 */ +	/* PC27 */ {   0,   0,   0,   1,   0,   0   }, /* UART Clock in */ +	/* PC26 */ {   0,   0,   0,   1,   0,   0   }, /* PC26 */ +	/* PC25 */ {   0,   0,   0,   1,   0,   0   }, /* PC25 */ +	/* PC24 */ {   0,   0,   0,   1,   0,   0   }, /* PC24 */ +	/* PC23 */ {   0,   1,   0,   1,   0,   0   }, /* ATMTFCLK */ +	/* PC22 */ {   0,   1,   0,   0,   0,   0   }, /* ATMRFCLK */ +	/* PC21 */ {   0,   1,   0,   0,   0,   0   }, /* SCC1 EN RXCLK */ +	/* PC20 */ {   0,   1,   0,   0,   0,   0   }, /* SCC1 EN TXCLK */ +	/* PC19 */ {   1,   1,   0,   0,   0,   0   }, /* FCC2 MII RX_CLK CLK13 */ +	/* PC18 */ {   1,   1,   0,   0,   0,   0   }, /* FCC Tx Clock (CLK14) */ +	/* PC17 */ {   0,   0,   0,   1,   0,   0   }, /* PC17 */ +	/* PC16 */ {   0,   1,   0,   0,   0,   0   }, /* FCC Tx Clock (CLK16) */ +	/* PC15 */ {   1,   1,   0,   0,   0,   0   }, /* PC15 */ +	/* PC14 */ {   0,   1,   0,   0,   0,   0   }, /* SCC1 EN *CD */ +	/* PC13 */ {   0,   0,   0,   1,   0,   0   }, /* PC13 */ +	/* PC12 */ {   0,   1,   0,   1,   0,   0   }, /* PC12 */ +	/* PC11 */ {   0,   0,   0,   1,   0,   0   }, /* LXT971 transmit control */ +	/* PC10 */ {   1,   0,   0,   1,   0,   0   }, /* FETHMDC */ +	/* PC9  */ {   1,   0,   0,   0,   0,   0   }, /* FETHMDIO */ +	/* PC8  */ {   0,   0,   0,   1,   0,   0   }, /* PC8 */ +	/* PC7  */ {   0,   0,   0,   1,   0,   0   }, /* PC7 */ +	/* PC6  */ {   0,   0,   0,   1,   0,   0   }, /* PC6 */ +	/* PC5  */ {   0,   0,   0,   1,   0,   0   }, /* PC5 */ +	/* PC4  */ {   0,   0,   0,   1,   0,   0   }, /* PC4 */ +	/* PC3  */ {   0,   0,   0,   1,   0,   0   }, /* PC3 */ +	/* PC2  */ {   0,   0,   0,   1,   0,   1   }, /* ENET FDE */ +	/* PC1  */ {   0,   0,   0,   1,   0,   0   }, /* ENET DSQE */ +	/* PC0  */ {   0,   0,   0,   1,   0,   0   }, /* ENET LBK */ +    }, + +    /* Port D */ +    {   /*            conf ppar psor pdir podr pdat */ +	/* PD31 */ {   1,   1,   0,   0,   0,   0   }, /* SCC1 EN RxD */ +	/* PD30 */ {   1,   1,   1,   1,   0,   0   }, /* SCC1 EN TxD */ +	/* PD29 */ {   1,   1,   0,   1,   0,   0   }, /* SCC1 EN TENA */ +	/* PD28 */ {   0,   1,   0,   0,   0,   0   }, /* PD28 */ +	/* PD27 */ {   0,   1,   1,   1,   0,   0   }, /* PD27 */ +	/* PD26 */ {   0,   0,   0,   1,   0,   0   }, /* PD26 */ +	/* PD25 */ {   0,   0,   0,   1,   0,   0   }, /* PD25 */ +	/* PD24 */ {   0,   0,   0,   1,   0,   0   }, /* PD24 */ +	/* PD23 */ {   0,   0,   0,   1,   0,   0   }, /* PD23 */ +	/* PD22 */ {   0,   0,   0,   1,   0,   0   }, /* PD22 */ +	/* PD21 */ {   0,   0,   0,   1,   0,   0   }, /* PD21 */ +	/* PD20 */ {   0,   0,   0,   1,   0,   0   }, /* PD20 */ +	/* PD19 */ {   0,   0,   0,   1,   0,   0   }, /* PD19 */ +	/* PD18 */ {   0,   0,   0,   1,   0,   0   }, /* PD18 */ +	/* PD17 */ {   0,   1,   0,   0,   0,   0   }, /* FCC1 ATMRXPRTY */ +	/* PD16 */ {   0,   1,   0,   1,   0,   0   }, /* FCC1 ATMTXPRTY */ +	/* PD15 */ {   0,   1,   1,   0,   1,   0   }, /* I2C SDA */ +	/* PD14 */ {   0,   0,   0,   1,   0,   0   }, /* LED */ +	/* PD13 */ {   0,   0,   0,   0,   0,   0   }, /* PD13 */ +	/* PD12 */ {   0,   0,   0,   0,   0,   0   }, /* PD12 */ +	/* PD11 */ {   0,   0,   0,   0,   0,   0   }, /* PD11 */ +	/* PD10 */ {   0,   0,   0,   0,   0,   0   }, /* PD10 */ +	/* PD9  */ {   0,   1,   0,   1,   0,   0   }, /* SMC1 TXD */ +	/* PD8  */ {   0,   1,   0,   0,   0,   0   }, /* SMC1 RXD */ +	/* PD7  */ {   0,   0,   0,   1,   0,   1   }, /* PD7 */ +	/* PD6  */ {   0,   0,   0,   1,   0,   1   }, /* PD6 */ +	/* PD5  */ {   0,   0,   0,   1,   0,   1   }, /* PD5 */ +	/* PD4  */ {   0,   0,   0,   1,   0,   1   }, /* PD4 */ +	/* PD3  */ {   0,   0,   0,   0,   0,   0   }, /* pin doesn't exist */ +	/* PD2  */ {   0,   0,   0,   0,   0,   0   }, /* pin doesn't exist */ +	/* PD1  */ {   0,   0,   0,   0,   0,   0   }, /* pin doesn't exist */ +	/* PD0  */ {   0,   0,   0,   0,   0,   0   }  /* pin doesn't exist */ +    } +}; + +int board_early_init_f (void) +{ +	return 0; +} + +int checkboard (void) +{ +	volatile ccsr_gur_t *gur = (void *)(CFG_MPC85xx_GUTS_ADDR); + +	/* PCI slot in USER bits CSR[6:7] by convention. */ +	uint pci_slot = get_pci_slot (); + +	uint pci_dual = get_pci_dual ();	/* PCI DUAL in CM_PCI[3] */ +	uint pci1_32 = gur->pordevsr & 0x10000;	/* PORDEVSR[15] */ +	uint pci1_clk_sel = gur->porpllsr & 0x8000;	/* PORPLLSR[16] */ +	uint pci2_clk_sel = gur->porpllsr & 0x4000;	/* PORPLLSR[17] */ + +	uint pci1_speed = get_clock_freq ();	/* PCI PSPEED in [4:5] */ + +	uint cpu_board_rev = get_cpu_board_revision (); + +	printf ("Board: CDS Version 0x%02x, PCI Slot %d\n", +		get_board_version (), pci_slot); + +	printf ("CPU Board Revision %d.%d (0x%04x)\n", +		MPC85XX_CPU_BOARD_MAJOR (cpu_board_rev), +		MPC85XX_CPU_BOARD_MINOR (cpu_board_rev), cpu_board_rev); + +	printf ("    PCI1: %d bit, %s MHz, %s\n", +		(pci1_32) ? 32 : 64, +		(pci1_speed == 33000000) ? "33" : +		(pci1_speed == 66000000) ? "66" : "unknown", +		pci1_clk_sel ? "sync" : "async"); + +	if (pci_dual) { +		printf ("    PCI2: 32 bit, 66 MHz, %s\n", +			pci2_clk_sel ? "sync" : "async"); +	} else { +		printf ("    PCI2: disabled\n"); +	} + +	/* +	 * Initialize local bus. +	 */ +	local_bus_init (); + +	return 0; +} + +long int +initdram(int board_type) +{ +	long dram_size = 0; + +	puts("Initializing\n"); + +#if defined(CONFIG_DDR_DLL) +	{ +		/* +		 * Work around to stabilize DDR DLL MSYNC_IN. +		 * Errata DDR9 seems to have been fixed. +		 * This is now the workaround for Errata DDR11: +		 *    Override DLL = 1, Course Adj = 1, Tap Select = 0 +		 */ + +		volatile ccsr_gur_t *gur = (void *)(CFG_MPC85xx_GUTS_ADDR); + +		gur->ddrdllcr = 0x81000000; +		asm("sync;isync;msync"); +		udelay(200); +	} +#endif +	dram_size = spd_sdram(); + +#if defined(CONFIG_DDR_ECC) && !defined(CONFIG_ECC_INIT_VIA_DDRCONTROLLER) +	/* +	 * Initialize and enable DDR ECC. +	 */ +	ddr_enable_ecc(dram_size); +#endif +	/* +	 * SDRAM Initialization +	 */ +	sdram_init(); + +	puts("    DDR: "); +	return dram_size; +} + +/* + * Initialize Local Bus + */ +void +local_bus_init(void) +{ +	volatile ccsr_gur_t *gur = (void *)(CFG_MPC85xx_GUTS_ADDR); +	volatile ccsr_lbc_t *lbc = (void *)(CFG_MPC85xx_LBC_ADDR); + +	uint clkdiv; +	uint lbc_hz; +	sys_info_t sysinfo; +	uint temp_lbcdll; + +	/* +	 * Errata LBC11. +	 * Fix Local Bus clock glitch when DLL is enabled. +	 * +	 * If localbus freq is < 66Mhz, DLL bypass mode must be used. +	 * If localbus freq is > 133Mhz, DLL can be safely enabled. +	 * Between 66 and 133, the DLL is enabled with an override workaround. +	 */ + +	get_sys_info(&sysinfo); +	clkdiv = lbc->lcrr & 0x0f; +	lbc_hz = sysinfo.freqSystemBus / 1000000 / clkdiv; + +	if (lbc_hz < 66) { +		lbc->lcrr |= 0x80000000;	/* DLL Bypass */ + +	} else if (lbc_hz >= 133) { +		lbc->lcrr &= (~0x80000000);		/* DLL Enabled */ + +	} else { +		lbc->lcrr &= (~0x8000000);	/* DLL Enabled */ +		udelay(200); + +		/* +		 * Sample LBC DLL ctrl reg, upshift it to set the +		 * override bits. +		 */ +		temp_lbcdll = gur->lbcdllcr; +		gur->lbcdllcr = (((temp_lbcdll & 0xff) << 16) | 0x80000000); +		asm("sync;isync;msync"); +	} +} + +/* + * Initialize SDRAM memory on the Local Bus. + */ +void +sdram_init(void) +{ +#if defined(CFG_OR2_PRELIM) && defined(CFG_BR2_PRELIM) + +	uint idx; +	volatile ccsr_lbc_t *lbc = (void *)(CFG_MPC85xx_LBC_ADDR); +	uint *sdram_addr = (uint *)CFG_LBC_SDRAM_BASE; +	uint cpu_board_rev; +	uint lsdmr_common; + +	puts("    SDRAM: "); + +	print_size (CFG_LBC_SDRAM_SIZE * 1024 * 1024, "\n"); + +	/* +	 * Setup SDRAM Base and Option Registers +	 */ +	lbc->or2 = CFG_OR2_PRELIM; +	asm("msync"); + +	lbc->br2 = CFG_BR2_PRELIM; +	asm("msync"); + +	lbc->lbcr = CFG_LBC_LBCR; +	asm("msync"); + +	lbc->lsrt = CFG_LBC_LSRT; +	lbc->mrtpr = CFG_LBC_MRTPR; +	asm("msync"); + +	/* +	 * Determine which address lines to use baed on CPU board rev. +	 */ +	cpu_board_rev = get_cpu_board_revision(); +	lsdmr_common = CFG_LBC_LSDMR_COMMON; +	if (cpu_board_rev == MPC85XX_CPU_BOARD_REV_1_0) { +		lsdmr_common |= CFG_LBC_LSDMR_BSMA1617; +	} else if (cpu_board_rev == MPC85XX_CPU_BOARD_REV_1_1) { +		lsdmr_common |= CFG_LBC_LSDMR_BSMA1516; +	} else { +		/* +		 * Assume something unable to identify itself is +		 * really old, and likely has lines 16/17 mapped. +		 */ +		lsdmr_common |= CFG_LBC_LSDMR_BSMA1617; +	} + +	/* +	 * Issue PRECHARGE ALL command. +	 */ +	lbc->lsdmr = lsdmr_common | CFG_LBC_LSDMR_OP_PCHALL; +	asm("sync;msync"); +	*sdram_addr = 0xff; +	ppcDcbf((unsigned long) sdram_addr); +	udelay(100); + +	/* +	 * Issue 8 AUTO REFRESH commands. +	 */ +	for (idx = 0; idx < 8; idx++) { +		lbc->lsdmr = lsdmr_common | CFG_LBC_LSDMR_OP_ARFRSH; +		asm("sync;msync"); +		*sdram_addr = 0xff; +		ppcDcbf((unsigned long) sdram_addr); +		udelay(100); +	} + +	/* +	 * Issue 8 MODE-set command. +	 */ +	lbc->lsdmr = lsdmr_common | CFG_LBC_LSDMR_OP_MRW; +	asm("sync;msync"); +	*sdram_addr = 0xff; +	ppcDcbf((unsigned long) sdram_addr); +	udelay(100); + +	/* +	 * Issue NORMAL OP command. +	 */ +	lbc->lsdmr = lsdmr_common | CFG_LBC_LSDMR_OP_NORMAL; +	asm("sync;msync"); +	*sdram_addr = 0xff; +	ppcDcbf((unsigned long) sdram_addr); +	udelay(200);    /* Overkill. Must wait > 200 bus cycles */ + +#endif	/* enable SDRAM init */ +} + +#if defined(CFG_DRAM_TEST) +int +testdram(void) +{ +	uint *pstart = (uint *) CFG_MEMTEST_START; +	uint *pend = (uint *) CFG_MEMTEST_END; +	uint *p; + +	printf("Testing DRAM from 0x%08x to 0x%08x\n", +	       CFG_MEMTEST_START, +	       CFG_MEMTEST_END); + +	printf("DRAM test phase 1:\n"); +	for (p = pstart; p < pend; p++) +		*p = 0xaaaaaaaa; + +	for (p = pstart; p < pend; p++) { +		if (*p != 0xaaaaaaaa) { +			printf ("DRAM test fails at: %08x\n", (uint) p); +			return 1; +		} +	} + +	printf("DRAM test phase 2:\n"); +	for (p = pstart; p < pend; p++) +		*p = 0x55555555; + +	for (p = pstart; p < pend; p++) { +		if (*p != 0x55555555) { +			printf ("DRAM test fails at: %08x\n", (uint) p); +			return 1; +		} +	} + +	printf("DRAM test passed.\n"); +	return 0; +} +#endif + +#ifdef CONFIG_PCI +/* For some reason the Tundra PCI bridge shows up on itself as a + * different device.  Work around that by refusing to configure it + */ +void dummy_func(struct pci_controller* hose, pci_dev_t dev, struct pci_config_table *tab) { } + +static struct pci_config_table pci_mpc85xxcds_config_table[] = { +	{0x10e3, 0x0513, PCI_ANY_ID, 1, 3, PCI_ANY_ID, dummy_func, {0,0,0}}, +	{0x1106, 0x0686, PCI_ANY_ID, 1, VIA_ID, 0, mpc85xx_config_via, {0,0,0}}, +	{0x1106, 0x0571, PCI_ANY_ID, 1, VIA_ID, 1, +		mpc85xx_config_via_usbide, {0,0,0}}, +	{0x1105, 0x3038, PCI_ANY_ID, 1, VIA_ID, 2, +		mpc85xx_config_via_usb, {0,0,0}}, +	{0x1106, 0x3038, PCI_ANY_ID, 1, VIA_ID, 3, +		mpc85xx_config_via_usb2, {0,0,0}}, +	{0x1106, 0x3058, PCI_ANY_ID, 1, VIA_ID, 5, +		mpc85xx_config_via_power, {0,0,0}}, +	{0x1106, 0x3068, PCI_ANY_ID, 1, VIA_ID, 6, +		mpc85xx_config_via_ac97, {0,0,0}}, +	{}, +}; + + +static struct pci_controller hose[] = { +	{ +	config_table: pci_mpc85xxcds_config_table, +	}, +#ifdef CONFIG_MPC85XX_PCI2 +	{}, +#endif +}; + +#endif + +void +pci_init_board(void) +{ +#ifdef CONFIG_PCI +	pci_mpc85xx_init(hose); +#endif +} + +#if defined(CONFIG_OF_BOARD_SETUP) +void +ft_pci_setup(void *blob, bd_t *bd) +{ +	int node, tmp[2]; +	const char *path; + +	node = fdt_path_offset(blob, "/aliases"); +	tmp[0] = 0; +	if (node >= 0) { +#ifdef CONFIG_PCI1 +		path = fdt_getprop(blob, node, "pci0", NULL); +		if (path) { +			tmp[1] = hose[0].last_busno - hose[0].first_busno; +			do_fixup_by_path(blob, path, "bus-range", &tmp, 8, 1); +		} +#endif +#ifdef CONFIG_MPC85XX_PCI2 +		path = fdt_getprop(blob, node, "pci1", NULL); +		if (path) { +			tmp[1] = hose[1].last_busno - hose[1].first_busno; +			do_fixup_by_path(blob, path, "bus-range", &tmp, 8, 1); +		} +#endif +	} +} +#endif diff --git a/board/freescale/mpc8555cds/u-boot.lds b/board/freescale/mpc8555cds/u-boot.lds new file mode 100644 index 000000000..df21ea86e --- /dev/null +++ b/board/freescale/mpc8555cds/u-boot.lds @@ -0,0 +1,150 @@ +/* + * Copyright 2004 Freescale Semiconductor. + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +OUTPUT_ARCH(powerpc) +SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/local/lib); SEARCH_DIR(/usr/local/powerpc-any-elf/lib); +/* Do we need any of these for elf? +   __DYNAMIC = 0;    */ +SECTIONS +{ +  .resetvec 0xFFFFFFFC : +  { +    *(.resetvec) +  } = 0xffff + +  .bootpg 0xFFFFF000 : +  { +    cpu/mpc85xx/start.o	(.bootpg) +    board/freescale/mpc8555cds/init.o (.bootpg) +  } = 0xffff + +  /* Read-only sections, merged into text segment: */ +  . = + SIZEOF_HEADERS; +  .interp : { *(.interp) } +  .hash          : { *(.hash)		} +  .dynsym        : { *(.dynsym)		} +  .dynstr        : { *(.dynstr)		} +  .rel.text      : { *(.rel.text)		} +  .rela.text     : { *(.rela.text) 	} +  .rel.data      : { *(.rel.data)		} +  .rela.data     : { *(.rela.data) 	} +  .rel.rodata    : { *(.rel.rodata) 	} +  .rela.rodata   : { *(.rela.rodata) 	} +  .rel.got       : { *(.rel.got)		} +  .rela.got      : { *(.rela.got)		} +  .rel.ctors     : { *(.rel.ctors)	} +  .rela.ctors    : { *(.rela.ctors)	} +  .rel.dtors     : { *(.rel.dtors)	} +  .rela.dtors    : { *(.rela.dtors)	} +  .rel.bss       : { *(.rel.bss)		} +  .rela.bss      : { *(.rela.bss)		} +  .rel.plt       : { *(.rel.plt)		} +  .rela.plt      : { *(.rela.plt)		} +  .init          : { *(.init)	} +  .plt : { *(.plt) } +  .text      : +  { +    cpu/mpc85xx/start.o	(.text) +    board/freescale/mpc8555cds/init.o (.text) +    cpu/mpc85xx/traps.o (.text) +    cpu/mpc85xx/interrupts.o (.text) +    cpu/mpc85xx/cpu_init.o (.text) +    cpu/mpc85xx/cpu.o (.text) +    drivers/net/tsec.o (.text) +    cpu/mpc85xx/speed.o (.text) +    cpu/mpc85xx/pci.o (.text) +    common/dlmalloc.o (.text) +    lib_generic/crc32.o (.text) +    lib_ppc/extable.o (.text) +    lib_generic/zlib.o (.text) +    *(.text) +    *(.fixup) +    *(.got1) +   } +    _etext = .; +    PROVIDE (etext = .); +    .rodata    : +   { +    *(.rodata) +    *(.rodata1) +    *(.rodata.str1.4) +    *(.eh_frame) +  } +  .fini      : { *(.fini)    } =0 +  .ctors     : { *(.ctors)   } +  .dtors     : { *(.dtors)   } + +  /* Read-write section, merged into data segment: */ +  . = (. + 0x00FF) & 0xFFFFFF00; +  _erotext = .; +  PROVIDE (erotext = .); +  .reloc   : +  { +    *(.got) +    _GOT2_TABLE_ = .; +    *(.got2) +    _FIXUP_TABLE_ = .; +    *(.fixup) +  } +  __got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >> 2; +  __fixup_entries = (. - _FIXUP_TABLE_) >> 2; + +  .data    : +  { +    *(.data) +    *(.data1) +    *(.sdata) +    *(.sdata2) +    *(.dynamic) +    CONSTRUCTORS +  } +  _edata  =  .; +  PROVIDE (edata = .); + +  . = .; +  __u_boot_cmd_start = .; +  .u_boot_cmd : { *(.u_boot_cmd) } +  __u_boot_cmd_end = .; + +  . = .; +  __start___ex_table = .; +  __ex_table : { *(__ex_table) } +  __stop___ex_table = .; + +  . = ALIGN(256); +  __init_begin = .; +  .text.init : { *(.text.init) } +  .data.init : { *(.data.init) } +  . = ALIGN(256); +  __init_end = .; + +  __bss_start = .; +  .bss       : +  { +   *(.sbss) *(.scommon) +   *(.dynbss) +   *(.bss) +   *(COMMON) +  } +  _end = . ; +  PROVIDE (end = .); +} |