diff options
| author | roy zang <tie-fei.zang@freescale.com> | 2006-11-02 18:49:51 +0800 | 
|---|---|---|
| committer | Zang Tiefei <roy@bus.ap.freescale.net> | 2006-11-02 18:49:51 +0800 | 
| commit | 4c52783b3d024e153c4972b97332e314bc3bdc46 (patch) | |
| tree | ffc40c217c1b6b32e47837edaa0981f6e62403f5 | |
| parent | 69366bf42f22d67efce8da3f8c40a43d4a3c2695 (diff) | |
| download | olio-uboot-2014.01-4c52783b3d024e153c4972b97332e314bc3bdc46.tar.xz olio-uboot-2014.01-4c52783b3d024e153c4972b97332e314bc3bdc46.zip | |
General code modification for mpc7448hpc2 board support.
1. Add 7447A and 7448 processor support.
2. Add the following flags.
CFG_CONFIG_BUS_CLK : If the 74xx bus frequency can be configured dynamically
(such as by switch on board), this flag should be set.
CFG_EXCEPTION_AFTER_RELOCATE: If an exception occurs after the u-boot
relocates to RAM, this flag should be set.
CFG_SERIAL_HANG_IN_EXCEPTION: If the print out function will cause the
system hang in exception, this flag should be set.
There is a design issue for tsi108/109 pci configure  read. When pci scan
the slots, if there is no pci card, the tsi108/9 will cause a machine
check exception for mpc7448 processor.
Signed-off-by: Alexandre Bounine <alexandreb@tundra.com>
Signed-off-by: Roy Zang <tie-fei.zang@freescale.com>
| -rwxr-xr-x | MAKEALL | 4 | ||||
| -rw-r--r-- | Makefile | 3 | ||||
| -rw-r--r-- | README | 22 | ||||
| -rw-r--r-- | cpu/74xx_7xx/cpu.c | 54 | ||||
| -rw-r--r-- | cpu/74xx_7xx/cpu_init.c | 2 | ||||
| -rw-r--r-- | cpu/74xx_7xx/speed.c | 55 | ||||
| -rw-r--r-- | drivers/Makefile | 6 | ||||
| -rw-r--r-- | include/74xx_7xx.h | 1 | ||||
| -rw-r--r-- | include/asm-ppc/global_data.h | 3 | ||||
| -rw-r--r-- | lib_ppc/extable.c | 10 | 
10 files changed, 136 insertions, 24 deletions
| @@ -150,8 +150,8 @@ LIST_85xx="	\  #########################################################################  LIST_74xx="	\ -	DB64360		DB64460		EVB64260	P3G4		\ -	PCIPPC2		PCIPPC6		ZUMA				\ +	DB64360		DB64460		EVB64260	mpc7448hpc2	\ +	P3G4    	PCIPPC2		PCIPPC6		ZUMA		\  "  LIST_7xx="	\ @@ -1718,6 +1718,9 @@ EVB64260_config	\  EVB64260_750CX_config:	unconfig  	@$(MKCONFIG) EVB64260 ppc 74xx_7xx evb64260 +mpc7448hpc2_config:  unconfig +	@./mkconfig $(@:_config=) ppc 74xx_7xx mpc7448hpc2 +  P3G4_config: unconfig  	@$(MKCONFIG) $(@:_config=) ppc 74xx_7xx evb64260 @@ -2312,17 +2312,17 @@ configurations; the following names are supported:  	csb272_config		lwmon_config		sbc8260_config  	CU824_config		MBX860T_config		sbc8560_33_config  	DUET_ADS_config		MBX_config		sbc8560_66_config -	EBONY_config		MPC8260ADS_config	SM850_config -	ELPT860_config		MPC8540ADS_config	SPD823TS_config -	ESTEEM192E_config	MPC8540EVAL_config	stxgp3_config -	ETX094_config		MPC8560ADS_config	SXNI855T_config -	FADS823_config		NETVIA_config		TQM823L_config -	FADS850SAR_config	omap1510inn_config	TQM850L_config -	FADS860T_config		omap1610h2_config	TQM855L_config -	FPS850L_config		omap1610inn_config	TQM860L_config -				omap5912osk_config	walnut_config -				omap2420h4_config	Yukon8220_config -							ZPC1900_config +	EBONY_config		mpc7448hpc2_config	SM850_config +	ELPT860_config		MPC8260ADS_config	SPD823TS_config +	ESTEEM192E_config	MPC8540ADS_config	stxgp3_config +	ETX094_config		MPC8540EVAL_config	SXNI855T_config +	FADS823_config		NMPC8560ADS_config	TQM823L_config +	FADS850SAR_config	NETVIA_config		TQM850L_config +	FADS860T_config		omap1510inn_config	TQM855L_config +	FPS850L_config		omap1610h2_config	TQM860L_config +				omap1610inn_config	walnut_config +				omap5912osk_config	Yukon8220_config +				omap2420h4_config	ZPC1900_config  Note: for some board special configuration names may exist; check if        additional information is available from the board vendor; for diff --git a/cpu/74xx_7xx/cpu.c b/cpu/74xx_7xx/cpu.c index ca45e17ed..c3aadca29 100644 --- a/cpu/74xx_7xx/cpu.c +++ b/cpu/74xx_7xx/cpu.c @@ -44,6 +44,10 @@  #include <74xx_7xx.h>  #include <asm/cache.h> +#if defined(CONFIG_OF_FLAT_TREE) +#include <ft_build.h> +#endif +  #ifdef CONFIG_AMIGAONEG3SE  #include "../board/MAI/AmigaOneG3SE/via686.h"  #include "../board/MAI/AmigaOneG3SE/memio.h" @@ -101,6 +105,14 @@ get_cpu_type(void)  		type = CPU_7457;  		break; +	case 0x8003: +		type = CPU_7447A; +		break; +		 +	case 0x8004: +		type = CPU_7448; +		break; +		  	default:  		break;  	} @@ -164,6 +176,14 @@ int checkcpu (void)  		str = "MPC7457";  		break; +	case CPU_7447A: +		str = "MPC7447A"; +		break; + +	case CPU_7448: +		str = "MPC7448"; +		break; +  	default:  		printf("Unknown CPU -- PVR: 0x%08x\n", pvr);  		return -1; @@ -256,20 +276,19 @@ do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])  /*   * For the 7400 the TB clock runs at 1/4 the cpu bus speed.   */ -#ifdef CONFIG_AMIGAONEG3SE +#if defined(CONFIG_AMIGAONEG3SE) || defined(CFG_CONFIG_BUS_CLK)  unsigned long get_tbclk(void)  {  	return (gd->bus_clk / 4);  } -#else	/* ! CONFIG_AMIGAONEG3SE */ +#else	/* ! CONFIG_AMIGAONEG3SE and !CFG_CONFIG_BUS_CLK*/  unsigned long get_tbclk (void)  {  	return CFG_BUS_HZ / 4;  } -#endif	/* CONFIG_AMIGAONEG3SE */ +#endif	/* CONFIG_AMIGAONEG3SE or CFG_CONFIG_BUS_CLK*/  /* ------------------------------------------------------------------------- */ -  #if defined(CONFIG_WATCHDOG)  #if !defined(CONFIG_PCIPPC2) && !defined(CONFIG_BAB7xx)  void @@ -281,3 +300,30 @@ watchdog_reset(void)  #endif	/* CONFIG_WATCHDOG */  /* ------------------------------------------------------------------------- */ + +#ifdef CONFIG_OF_FLAT_TREE +void +ft_cpu_setup(void *blob, bd_t *bd) +{ +	u32 *p; +	ulong clock; +	int len; +		 +	clock = bd->bi_busfreq; +	 +	p = ft_get_prop(blob, "/cpus/" OF_CPU "/bus-frequency", &len); +	if (p != NULL) +		*p = cpu_to_be32(clock); + +#if defined(CONFIG_TSI108_ETH) +	p = ft_get_prop(blob, "/" OF_TSI "/ethernet@6200/address", &len); +		memcpy(p, bd->bi_enetaddr, 6); +#endif +  +#if defined(CONFIG_HAS_ETH1) +	p = ft_get_prop(blob, "/" OF_TSI "/ethernet@6600/address", &len); +		memcpy(p, bd->bi_enet1addr, 6); +#endif +} +#endif +/* ------------------------------------------------------------------------- */ diff --git a/cpu/74xx_7xx/cpu_init.c b/cpu/74xx_7xx/cpu_init.c index 93f180f26..1dd1b2cd8 100644 --- a/cpu/74xx_7xx/cpu_init.c +++ b/cpu/74xx_7xx/cpu_init.c @@ -43,6 +43,8 @@ cpu_init_f (void)  	case CPU_7450:  	case CPU_7455:  	case CPU_7457: +	case CPU_7447A: +	case CPU_7448:  		/* enable the timebase bit in HID0 */  		set_hid0(get_hid0() | 0x4000000);  		break; diff --git a/cpu/74xx_7xx/speed.c b/cpu/74xx_7xx/speed.c index 2dc510746..d52079456 100644 --- a/cpu/74xx_7xx/speed.c +++ b/cpu/74xx_7xx/speed.c @@ -31,6 +31,8 @@  DECLARE_GLOBAL_DATA_PTR; +extern unsigned long get_board_bus_clk(void); +  static const int hid1_multipliers_x_10[] = {  	25,	/* 0000 - 2.5x */  	75,	/* 0001 - 7.5x */ @@ -50,6 +52,41 @@ static const int hid1_multipliers_x_10[] = {  	0	/* 1111 - off */  }; +static const int hid1_7447A_multipliers_x_10[] = { +	115,    /* 00000 - 11.5x  */ +	170,    /* 00001 - 17x    */ +	75,     /* 00010 -  7.5x  */ +	150,    /* 00011 - 15x    */ +	70,     /* 00100 -  7x    */ +	180,    /* 00101 - 18x    */ +	10,     /* 00110 - bypass */ +	200,    /* 00111 - 20x    */ +	20,     /* 01000 -  2x    */ +	210,    /* 01001 - 21x    */ +	65,     /* 01010 -  6.5x  */ +	130,    /* 01011 - 13x    */ +	85,     /* 01100 -  8.5x  */ +	240,    /* 01101 - 13x    */ +	95,     /* 01110 -  9.5x  */ +	90,     /* 01111 -  9x    */ +	30,     /* 10000 -  3x    */ +	105,    /* 10001 - 10.5x  */ +	55,     /* 10010 -  5.5x  */ +	110,    /* 10011 - 11x    */ +	40,     /* 10100 -  4x    */ +	100,    /* 10101 - 10x    */ +	50,     /* 10110 -  5x    */ +	120,    /* 10111 - 12x    */ +	80,     /* 11000 -  8x    */ +	140,    /* 11001 - 14x    */ +	60,     /* 11010 -  6x    */ +	160,    /* 11011 - 16x    */ +	135,    /* 11100 - 13.5x  */ +	280,    /* 11101 - 28x    */ +	0,      /* 11110 - off    */ +	125     /* 11111 - 12.5x  */ +}; +  static const int hid1_fx_multipliers_x_10[] = {  	00,	/* 0000 - off */  	00,	/* 0001 - off */ @@ -89,8 +126,19 @@ int get_clocks (void)  {  	ulong clock = 0; +#ifdef CFG_CONFIG_BUS_CLK +	gd->bus_clk = get_board_bus_clk(); +#else +	gd->bus_clk = CFG_BUS_CLK; +#endif +  	/* calculate the clock frequency based upon the CPU type */  	switch (get_cpu_type()) { +	case CPU_7447A: +	case CPU_7448: +		clock = (gd->bus_clk / 10) * hid1_7447A_multipliers_x_10[(get_hid1 () >> 12) & 0x1F]; +		break; +		  	case CPU_7455:  	case CPU_7457:  		/* @@ -98,12 +146,12 @@ int get_clocks (void)  		 * Make sure division is done before multiplication to prevent 32-bit  		 * arithmetic overflows which will cause a negative number  		 */ -		clock = (CFG_BUS_CLK / 10) * hid1_multipliers_x_10[(get_hid1 () >> 13) & 0xF]; +		clock = (gd->bus_clk / 10) * hid1_multipliers_x_10[(get_hid1 () >> 13) & 0xF];  		break;  	case CPU_750GX:  	case CPU_750FX: -		clock = CFG_BUS_CLK * hid1_fx_multipliers_x_10[get_hid1 () >> 27] / 10; +		clock = gd->bus_clk * hid1_fx_multipliers_x_10[get_hid1 () >> 27] / 10;  		break;  	case CPU_7450: @@ -120,7 +168,7 @@ int get_clocks (void)  		 * Make sure division is done before multiplication to prevent 32-bit  		 * arithmetic overflows which will cause a negative number  		 */ -		clock = (CFG_BUS_CLK / 10) * hid1_multipliers_x_10[get_hid1 () >> 28]; +		clock = (gd->bus_clk / 10) * hid1_multipliers_x_10[get_hid1 () >> 28];  		break;  	case CPU_UNKNOWN: @@ -130,7 +178,6 @@ int get_clocks (void)  	}  	gd->cpu_clk = clock; -	gd->bus_clk = CFG_BUS_CLK;  	return (0);  } diff --git a/drivers/Makefile b/drivers/Makefile index 5a369df2c..6a3ea5da2 100644 --- a/drivers/Makefile +++ b/drivers/Makefile @@ -35,8 +35,8 @@ COBJS	= 3c589.o 5701rls.o ali512x.o atmel_usart.o \  	  lan91c96.o \  	  natsemi.o ne2000.o netarm_eth.o netconsole.o \  	  ns16550.o ns8382x.o ns87308.o ns7520_eth.o omap1510_i2c.o \ -	  omap24xx_i2c.o pci.o pci_auto.o pci_indirect.o \ -	  pcnet.o plb2800_eth.o \ +	  omap24xx_i2c.o pci.o pci_auto.o pci_indirect.o tsi108_pci.o\ +	  tsi108_i2c.o pcnet.o plb2800_eth.o \  	  ps2ser.o ps2mult.o pc_keyb.o \  	  rtl8019.o rtl8139.o rtl8169.o \  	  s3c4510b_eth.o s3c4510b_uart.o \ @@ -45,7 +45,7 @@ COBJS	= 3c589.o 5701rls.o ali512x.o atmel_usart.o \  	  serial_pl010.o serial_pl011.o serial_xuartlite.o \  	  sl811_usb.o sm501.o smc91111.o smiLynxEM.o \  	  status_led.o sym53c8xx.o ahci.o \ -	  ti_pci1410a.o tigon3.o tsec.o \ +	  ti_pci1410a.o tigon3.o tsec.o tsi108_eth.o\  	  usbdcore.o usbdcore_ep0.o usbdcore_omap1510.o usbtty.o \  	  videomodes.o w83c553f.o \  	  ks8695eth.o \ diff --git a/include/74xx_7xx.h b/include/74xx_7xx.h index a6287982a..7cd2f10b0 100644 --- a/include/74xx_7xx.h +++ b/include/74xx_7xx.h @@ -112,6 +112,7 @@ typedef enum __cpu_t {  	CPU_7400,  	CPU_7410,  	CPU_7450, CPU_7455, CPU_7457, +	CPU_7447A, CPU_7448,  	CPU_UNKNOWN} cpu_t;  extern cpu_t get_cpu_type(void); diff --git a/include/asm-ppc/global_data.h b/include/asm-ppc/global_data.h index b73af9646..166afbe87 100644 --- a/include/asm-ppc/global_data.h +++ b/include/asm-ppc/global_data.h @@ -49,6 +49,9 @@ typedef	struct	global_data {  	unsigned long	scc_clk;  	unsigned long	brg_clk;  #endif +#if defined(CONFIG_MPC7448HPC2) +	unsigned long   mem_clk; +#endif  #if defined(CONFIG_MPC83XX)  	/* There are other clocks in the MPC83XX */  	u32 csb_clk; diff --git a/lib_ppc/extable.c b/lib_ppc/extable.c index d92f14270..34b5d460c 100644 --- a/lib_ppc/extable.c +++ b/lib_ppc/extable.c @@ -50,14 +50,22 @@ search_one_table(const struct exception_table_entry *first,  		 const struct exception_table_entry *last,  		 unsigned long value)  { +	DECLARE_GLOBAL_DATA_PTR; +  	while (first <= last) {  		const struct exception_table_entry *mid;  		long diff;  		mid = (last - first) / 2 + first; +#ifdef CFG_EXCEPTION_AFTER_RELOCATE +		diff = (mid->insn + gd->reloc_off) - value; +		if (diff == 0) +			return (mid->fixup + gd->reloc_off); +#else  		diff = mid->insn - value;  		if (diff == 0)  			return mid->fixup; +#endif  		else if (diff < 0)  			first = mid+1;  		else @@ -75,8 +83,10 @@ search_exception_table(unsigned long addr)  	/* There is only the kernel to search.  */  	ret = search_one_table(__start___ex_table, __stop___ex_table-1, addr); +#if !defined(CFG_SERIAL_HANG_IN_EXCEPTION)  	if (ex_tab_message)  		printf("Bus Fault @ 0x%08lx, fixup 0x%08lx\n", addr, ret); +#endif  	if (ret) return ret;  	return 0; |