Merge branch 'master' of /home/wd/git/u-boot/master
This commit is contained in:
		
						commit
						3df4f46f32
					
				
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1
									
								
								MAKEALL
								
								
								
								
							
							
						
						
									
										1
									
								
								MAKEALL
								
								
								
								
							| 
						 | 
					@ -428,6 +428,7 @@ LIST_85xx="		\
 | 
				
			||||||
	P2020RDB_NAND	\
 | 
						P2020RDB_NAND	\
 | 
				
			||||||
	P2020RDB_SDCARD	\
 | 
						P2020RDB_SDCARD	\
 | 
				
			||||||
	P2020RDB_SPIFLASH	\
 | 
						P2020RDB_SPIFLASH	\
 | 
				
			||||||
 | 
						P4080DS		\
 | 
				
			||||||
	PM854		\
 | 
						PM854		\
 | 
				
			||||||
	PM856		\
 | 
						PM856		\
 | 
				
			||||||
	sbc8540		\
 | 
						sbc8540		\
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										1
									
								
								Makefile
								
								
								
								
							
							
						
						
									
										1
									
								
								Makefile
								
								
								
								
							| 
						 | 
					@ -1788,6 +1788,7 @@ P2010RDB_config \
 | 
				
			||||||
P2010RDB_NAND_config \
 | 
					P2010RDB_NAND_config \
 | 
				
			||||||
P2010RDB_SDCARD_config \
 | 
					P2010RDB_SDCARD_config \
 | 
				
			||||||
P2010RDB_SPIFLASH_config \
 | 
					P2010RDB_SPIFLASH_config \
 | 
				
			||||||
 | 
					P2020DS_DDR2_config \
 | 
				
			||||||
P2020RDB_config \
 | 
					P2020RDB_config \
 | 
				
			||||||
P2020RDB_NAND_config \
 | 
					P2020RDB_NAND_config \
 | 
				
			||||||
P2020RDB_SDCARD_config \
 | 
					P2020RDB_SDCARD_config \
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										2
									
								
								README
								
								
								
								
							
							
						
						
									
										2
									
								
								README
								
								
								
								
							| 
						 | 
					@ -2572,7 +2572,7 @@ to save the current settings.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Please note that the environment is read-only until the monitor
 | 
					Please note that the environment is read-only until the monitor
 | 
				
			||||||
has been relocated to RAM and a RAM copy of the environment has been
 | 
					has been relocated to RAM and a RAM copy of the environment has been
 | 
				
			||||||
created; also, when using EEPROM you will have to use getenv_r()
 | 
					created; also, when using EEPROM you will have to use getenv_f()
 | 
				
			||||||
until then to read environment variables.
 | 
					until then to read environment variables.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The environment is protected by a CRC32 checksum. Before the monitor
 | 
					The environment is protected by a CRC32 checksum. Before the monitor
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -125,7 +125,7 @@ void blue_LED_off(void) __attribute__((weak, alias("__blue_LED_off")));
 | 
				
			||||||
static int init_baudrate (void)
 | 
					static int init_baudrate (void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char tmp[64];	/* long enough for environment variables */
 | 
						char tmp[64];	/* long enough for environment variables */
 | 
				
			||||||
	int i = getenv_r ("baudrate", tmp, sizeof (tmp));
 | 
						int i = getenv_f("baudrate", tmp, sizeof (tmp));
 | 
				
			||||||
	gd->bd->bi_baudrate = gd->baudrate = (i > 0)
 | 
						gd->bd->bi_baudrate = gd->baudrate = (i > 0)
 | 
				
			||||||
			? (int) simple_strtoul (tmp, NULL, 10)
 | 
								? (int) simple_strtoul (tmp, NULL, 10)
 | 
				
			||||||
			: CONFIG_BAUDRATE;
 | 
								: CONFIG_BAUDRATE;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -102,7 +102,7 @@ static int init_baudrate(void)
 | 
				
			||||||
	char tmp[64];
 | 
						char tmp[64];
 | 
				
			||||||
	int i;
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	i = getenv_r("baudrate", tmp, sizeof(tmp));
 | 
						i = getenv_f("baudrate", tmp, sizeof(tmp));
 | 
				
			||||||
	if (i > 0) {
 | 
						if (i > 0) {
 | 
				
			||||||
		gd->baudrate = simple_strtoul(tmp, NULL, 10);
 | 
							gd->baudrate = simple_strtoul(tmp, NULL, 10);
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -26,11 +26,9 @@ int do_gpio(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 | 
				
			||||||
		return 0;
 | 
							return 0;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (argc != 3) {
 | 
						if (argc != 3)
 | 
				
			||||||
 show_usage:
 | 
					 show_usage:
 | 
				
			||||||
		printf("Usage:\n%s\n", cmdtp->usage);
 | 
							return cmd_usage(cmdtp);
 | 
				
			||||||
		return 1;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* parse the behavior */
 | 
						/* parse the behavior */
 | 
				
			||||||
	ulong sub_cmd;
 | 
						ulong sub_cmd;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,49 +1,116 @@
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * jtag-console.c - console driver over Blackfin JTAG
 | 
					 * jtag-console.c - console driver over Blackfin JTAG
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Copyright (c) 2008 Analog Devices Inc.
 | 
					 * Copyright (c) 2008-2010 Analog Devices Inc.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * Licensed under the GPL-2 or later.
 | 
					 * Licensed under the GPL-2 or later.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <common.h>
 | 
					#include <common.h>
 | 
				
			||||||
 | 
					#include <malloc.h>
 | 
				
			||||||
#include <stdio_dev.h>
 | 
					#include <stdio_dev.h>
 | 
				
			||||||
#include <asm/blackfin.h>
 | 
					#include <asm/blackfin.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef DEBUG
 | 
				
			||||||
 | 
					# define dprintf(...) serial_printf(__VA_ARGS__)
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					# define dprintf(...) do { if (0) printf(__VA_ARGS__); } while (0)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline void dprintf_decode(const char *s, uint32_t len)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint32_t i;
 | 
				
			||||||
 | 
						for (i = 0; i < len; ++i)
 | 
				
			||||||
 | 
							if (s[i] < 0x20 || s[i] >= 0x7f)
 | 
				
			||||||
 | 
								dprintf("\\%o", s[i]);
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								dprintf("%c", s[i]);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline uint32_t bfin_write_emudat(uint32_t emudat)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						__asm__ __volatile__("emudat = %0;" : : "d"(emudat));
 | 
				
			||||||
 | 
						return emudat;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static inline uint32_t bfin_read_emudat(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						uint32_t emudat;
 | 
				
			||||||
 | 
						__asm__ __volatile__("%0 = emudat;" : "=d"(emudat));
 | 
				
			||||||
 | 
						return emudat;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef CONFIG_JTAG_CONSOLE_TIMEOUT
 | 
					#ifndef CONFIG_JTAG_CONSOLE_TIMEOUT
 | 
				
			||||||
# define CONFIG_JTAG_CONSOLE_TIMEOUT 500
 | 
					# define CONFIG_JTAG_CONSOLE_TIMEOUT 500
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* The Blackfin tends to be much much faster than the JTAG hardware. */
 | 
					/* The Blackfin tends to be much much faster than the JTAG hardware. */
 | 
				
			||||||
static void jtag_write_emudat(uint32_t emudat)
 | 
					static bool jtag_write_emudat(uint32_t emudat)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	static bool overflowed = false;
 | 
						static bool overflowed = false;
 | 
				
			||||||
	ulong timeout = get_timer(0) + CONFIG_JTAG_CONSOLE_TIMEOUT;
 | 
						ulong timeout = get_timer(0) + CONFIG_JTAG_CONSOLE_TIMEOUT;
 | 
				
			||||||
	while (bfin_read_DBGSTAT() & 0x1) {
 | 
						while (bfin_read_DBGSTAT() & 0x1) {
 | 
				
			||||||
		if (overflowed)
 | 
							if (overflowed)
 | 
				
			||||||
			return;
 | 
								return overflowed;
 | 
				
			||||||
		if (timeout < get_timer(0))
 | 
							if (timeout < get_timer(0))
 | 
				
			||||||
			overflowed = true;
 | 
								overflowed = true;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	overflowed = false;
 | 
						overflowed = false;
 | 
				
			||||||
	__asm__ __volatile__("emudat = %0;" : : "d"(emudat));
 | 
						bfin_write_emudat(emudat);
 | 
				
			||||||
 | 
						return overflowed;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
/* Transmit a buffer.  The format is:
 | 
					/* Transmit a buffer.  The format is:
 | 
				
			||||||
 * [32bit length][actual data]
 | 
					 * [32bit length][actual data]
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
static void jtag_send(const char *c, uint32_t len)
 | 
					static void jtag_send(const char *raw_str, uint32_t len)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	uint32_t i;
 | 
						const char *cooked_str;
 | 
				
			||||||
 | 
						uint32_t i, ex;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (len == 0)
 | 
						if (len == 0)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Ugh, need to output \r after \n */
 | 
				
			||||||
 | 
						ex = 0;
 | 
				
			||||||
 | 
						for (i = 0; i < len; ++i)
 | 
				
			||||||
 | 
							if (raw_str[i] == '\n')
 | 
				
			||||||
 | 
								++ex;
 | 
				
			||||||
 | 
						if (ex) {
 | 
				
			||||||
 | 
							char *c = malloc(len + ex);
 | 
				
			||||||
 | 
							cooked_str = c;
 | 
				
			||||||
 | 
							for (i = 0; i < len; ++i) {
 | 
				
			||||||
 | 
								*c++ = raw_str[i];
 | 
				
			||||||
 | 
								if (raw_str[i] == '\n')
 | 
				
			||||||
 | 
									*c++ = '\r';
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							len += ex;
 | 
				
			||||||
 | 
						} else
 | 
				
			||||||
 | 
							cooked_str = raw_str;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						dprintf("%s(\"", __func__);
 | 
				
			||||||
 | 
						dprintf_decode(cooked_str, len);
 | 
				
			||||||
 | 
						dprintf("\", %i)\n", len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* First send the length */
 | 
						/* First send the length */
 | 
				
			||||||
	jtag_write_emudat(len);
 | 
						if (jtag_write_emudat(len))
 | 
				
			||||||
 | 
							goto done;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Then send the data */
 | 
						/* Then send the data */
 | 
				
			||||||
	for (i = 0; i < len; i += 4)
 | 
						for (i = 0; i < len; i += 4) {
 | 
				
			||||||
		jtag_write_emudat((c[i] << 0) | (c[i+1] << 8) | (c[i+2] << 16) | (c[i+3] << 24));
 | 
							uint32_t emudat =
 | 
				
			||||||
 | 
								(cooked_str[i + 0] <<  0) |
 | 
				
			||||||
 | 
								(cooked_str[i + 1] <<  8) |
 | 
				
			||||||
 | 
								(cooked_str[i + 2] << 16) |
 | 
				
			||||||
 | 
								(cooked_str[i + 3] << 24);
 | 
				
			||||||
 | 
							if (jtag_write_emudat(emudat)) {
 | 
				
			||||||
 | 
								bfin_write_emudat(0);
 | 
				
			||||||
 | 
								goto done;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 done:
 | 
				
			||||||
 | 
						if (cooked_str != raw_str)
 | 
				
			||||||
 | 
							free((char *)cooked_str);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
static void jtag_putc(const char c)
 | 
					static void jtag_putc(const char c)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -59,7 +126,10 @@ static size_t inbound_len, leftovers_len;
 | 
				
			||||||
/* Lower layers want to know when jtag has data */
 | 
					/* Lower layers want to know when jtag has data */
 | 
				
			||||||
static int jtag_tstc_dbg(void)
 | 
					static int jtag_tstc_dbg(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	return (bfin_read_DBGSTAT() & 0x2);
 | 
						int ret = (bfin_read_DBGSTAT() & 0x2);
 | 
				
			||||||
 | 
						if (ret)
 | 
				
			||||||
 | 
							dprintf("%s: ret:%i\n", __func__, ret);
 | 
				
			||||||
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Higher layers want to know when any data is available */
 | 
					/* Higher layers want to know when any data is available */
 | 
				
			||||||
| 
						 | 
					@ -77,6 +147,9 @@ static int jtag_getc(void)
 | 
				
			||||||
	int ret;
 | 
						int ret;
 | 
				
			||||||
	uint32_t emudat;
 | 
						uint32_t emudat;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						dprintf("%s: inlen:%zu leftlen:%zu left:%x\n", __func__,
 | 
				
			||||||
 | 
							inbound_len, leftovers_len, leftovers);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* see if any data is left over */
 | 
						/* see if any data is left over */
 | 
				
			||||||
	if (leftovers_len) {
 | 
						if (leftovers_len) {
 | 
				
			||||||
		--leftovers_len;
 | 
							--leftovers_len;
 | 
				
			||||||
| 
						 | 
					@ -88,7 +161,7 @@ static int jtag_getc(void)
 | 
				
			||||||
	/* wait for new data ! */
 | 
						/* wait for new data ! */
 | 
				
			||||||
	while (!jtag_tstc_dbg())
 | 
						while (!jtag_tstc_dbg())
 | 
				
			||||||
		continue;
 | 
							continue;
 | 
				
			||||||
	__asm__("%0 = emudat;" : "=d"(emudat));
 | 
						emudat = bfin_read_emudat();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (inbound_len == 0) {
 | 
						if (inbound_len == 0) {
 | 
				
			||||||
		/* grab the length */
 | 
							/* grab the length */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -64,7 +64,7 @@ static int display_banner(void)
 | 
				
			||||||
static int init_baudrate(void)
 | 
					static int init_baudrate(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char baudrate[15];
 | 
						char baudrate[15];
 | 
				
			||||||
	int i = getenv_r("baudrate", baudrate, sizeof(baudrate));
 | 
						int i = getenv_f("baudrate", baudrate, sizeof(baudrate));
 | 
				
			||||||
	gd->bd->bi_baudrate = gd->baudrate = (i > 0)
 | 
						gd->bd->bi_baudrate = gd->baudrate = (i > 0)
 | 
				
			||||||
	    ? simple_strtoul(baudrate, NULL, 10)
 | 
						    ? simple_strtoul(baudrate, NULL, 10)
 | 
				
			||||||
	    : CONFIG_BAUDRATE;
 | 
						    : CONFIG_BAUDRATE;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -168,7 +168,7 @@ static void post_get_flags(int *test_flags)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 0; i < varnum; i++) {
 | 
						for (i = 0; i < varnum; i++) {
 | 
				
			||||||
		if (getenv_r(var[i], list, sizeof(list)) <= 0)
 | 
							if (getenv_f(var[i], list, sizeof(list)) <= 0)
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		for (j = 0; j < post_list_size; j++) {
 | 
							for (j = 0; j < post_list_size; j++) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -69,7 +69,7 @@ const char version_string[] =
 | 
				
			||||||
static int init_baudrate (void)
 | 
					static int init_baudrate (void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char tmp[64];	/* long enough for environment variables */
 | 
						char tmp[64];	/* long enough for environment variables */
 | 
				
			||||||
	int i = getenv_r("baudrate", tmp, 64);
 | 
						int i = getenv_f("baudrate", tmp, 64);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	gd->baudrate = (i != 0)
 | 
						gd->baudrate = (i != 0)
 | 
				
			||||||
			? (int) simple_strtoul (tmp, NULL, 10)
 | 
								? (int) simple_strtoul (tmp, NULL, 10)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -134,7 +134,7 @@ typedef int (init_fnc_t) (void);
 | 
				
			||||||
static int init_baudrate (void)
 | 
					static int init_baudrate (void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char tmp[64];	/* long enough for environment variables */
 | 
						char tmp[64];	/* long enough for environment variables */
 | 
				
			||||||
	int i = getenv_r ("baudrate", tmp, sizeof (tmp));
 | 
						int i = getenv_f("baudrate", tmp, sizeof (tmp));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	gd->baudrate = (i > 0)
 | 
						gd->baudrate = (i > 0)
 | 
				
			||||||
			? (int) simple_strtoul (tmp, NULL, 10)
 | 
								? (int) simple_strtoul (tmp, NULL, 10)
 | 
				
			||||||
| 
						 | 
					@ -278,7 +278,7 @@ board_init_f (ulong bootflag)
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * reserve protected RAM
 | 
						 * reserve protected RAM
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	i = getenv_r ("pram", tmp, sizeof (tmp));
 | 
						i = getenv_f("pram", tmp, sizeof (tmp));
 | 
				
			||||||
	reg = (i > 0) ? simple_strtoul (tmp, NULL, 10) : CONFIG_PRAM;
 | 
						reg = (i > 0) ? simple_strtoul (tmp, NULL, 10) : CONFIG_PRAM;
 | 
				
			||||||
	addr -= (reg << 10);		/* size is in kB */
 | 
						addr -= (reg << 10);		/* size is in kB */
 | 
				
			||||||
	debug ("Reserving %ldk for protected RAM at %08lx\n", reg, addr);
 | 
						debug ("Reserving %ldk for protected RAM at %08lx\n", reg, addr);
 | 
				
			||||||
| 
						 | 
					@ -549,7 +549,7 @@ void board_init_r (gd_t *id, ulong dest_addr)
 | 
				
			||||||
	 * Fill in missing fields of bd_info.
 | 
						 * Fill in missing fields of bd_info.
 | 
				
			||||||
	 * We do this here, where we have "normal" access to the
 | 
						 * We do this here, where we have "normal" access to the
 | 
				
			||||||
	 * environment; we used to do this still running from ROM,
 | 
						 * environment; we used to do this still running from ROM,
 | 
				
			||||||
	 * where had to use getenv_r(), which can be pretty slow when
 | 
						 * where had to use getenv_f(), which can be pretty slow when
 | 
				
			||||||
	 * the environment is in EEPROM.
 | 
						 * the environment is in EEPROM.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	bd->bi_ip_addr = getenv_IPaddr ("ipaddr");
 | 
						bd->bi_ip_addr = getenv_IPaddr ("ipaddr");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -105,7 +105,7 @@ int incaip_set_cpuclk (void)
 | 
				
			||||||
	char tmp[64];
 | 
						char tmp[64];
 | 
				
			||||||
	ulong cpuclk;
 | 
						ulong cpuclk;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (getenv_r ("cpuclk", tmp, sizeof (tmp)) > 0) {
 | 
						if (getenv_f("cpuclk", tmp, sizeof (tmp)) > 0) {
 | 
				
			||||||
		cpuclk = simple_strtoul (tmp, NULL, 10) * 1000000;
 | 
							cpuclk = simple_strtoul (tmp, NULL, 10) * 1000000;
 | 
				
			||||||
		cgu_init (cpuclk);
 | 
							cgu_init (cpuclk);
 | 
				
			||||||
		ebu_init (cpuclk);
 | 
							ebu_init (cpuclk);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -114,7 +114,7 @@ static void display_flash_config(ulong size)
 | 
				
			||||||
static int init_baudrate (void)
 | 
					static int init_baudrate (void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char tmp[64];	/* long enough for environment variables */
 | 
						char tmp[64];	/* long enough for environment variables */
 | 
				
			||||||
	int i = getenv_r ("baudrate", tmp, sizeof (tmp));
 | 
						int i = getenv_f("baudrate", tmp, sizeof (tmp));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	gd->baudrate = (i > 0)
 | 
						gd->baudrate = (i > 0)
 | 
				
			||||||
			? (int) simple_strtoul (tmp, NULL, 10)
 | 
								? (int) simple_strtoul (tmp, NULL, 10)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -64,12 +64,20 @@ COBJS-$(CONFIG_PPC_P5020)	+= ddr-gen3.o
 | 
				
			||||||
 | 
					
 | 
				
			||||||
COBJS-$(CONFIG_CPM2)	+= ether_fcc.o
 | 
					COBJS-$(CONFIG_CPM2)	+= ether_fcc.o
 | 
				
			||||||
COBJS-$(CONFIG_OF_LIBFDT) += fdt.o
 | 
					COBJS-$(CONFIG_OF_LIBFDT) += fdt.o
 | 
				
			||||||
 | 
					COBJS-$(CONFIG_FSL_CORENET) += liodn.o
 | 
				
			||||||
COBJS-$(CONFIG_MP)	+= mp.o
 | 
					COBJS-$(CONFIG_MP)	+= mp.o
 | 
				
			||||||
COBJS-$(CONFIG_MPC8536) += mpc8536_serdes.o
 | 
					COBJS-$(CONFIG_MPC8536) += mpc8536_serdes.o
 | 
				
			||||||
COBJS-$(CONFIG_P1022)	+= p1022_serdes.o
 | 
					COBJS-$(CONFIG_P1022)	+= p1022_serdes.o
 | 
				
			||||||
COBJS-$(CONFIG_PCI)	+= pci.o
 | 
					COBJS-$(CONFIG_PCI)	+= pci.o
 | 
				
			||||||
 | 
					COBJS-$(CONFIG_FSL_CORENET) += portals.o
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# various SoC specific assignments
 | 
				
			||||||
 | 
					COBJS-$(CONFIG_PPC_P4080) += p4080_ids.o
 | 
				
			||||||
 | 
					
 | 
				
			||||||
COBJS-$(CONFIG_QE)	+= qe_io.o
 | 
					COBJS-$(CONFIG_QE)	+= qe_io.o
 | 
				
			||||||
COBJS-$(CONFIG_CPM2)	+= serial_scc.o
 | 
					COBJS-$(CONFIG_CPM2)	+= serial_scc.o
 | 
				
			||||||
 | 
					COBJS-$(CONFIG_FSL_CORENET) += fsl_corenet_serdes.o
 | 
				
			||||||
 | 
					COBJS-$(CONFIG_PPC_P4080) += p4080_serdes.o
 | 
				
			||||||
 | 
					
 | 
				
			||||||
COBJS	= $(COBJS-y)
 | 
					COBJS	= $(COBJS-y)
 | 
				
			||||||
COBJS	+= cpu.o
 | 
					COBJS	+= cpu.o
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -41,6 +41,12 @@ static int do_errata(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(CONFIG_SYS_P4080_ERRATUM_SERDES8)
 | 
				
			||||||
 | 
						puts("Work-around for Erratum SERDES8 enabled\n");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#if defined(CONFIG_SYS_P4080_ERRATUM_CPU22)
 | 
				
			||||||
 | 
						puts("Work-around for Erratum CPU22 enabled\n");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -32,6 +32,7 @@
 | 
				
			||||||
#include <ioports.h>
 | 
					#include <ioports.h>
 | 
				
			||||||
#include <sata.h>
 | 
					#include <sata.h>
 | 
				
			||||||
#include <asm/io.h>
 | 
					#include <asm/io.h>
 | 
				
			||||||
 | 
					#include <asm/cache.h>
 | 
				
			||||||
#include <asm/mmu.h>
 | 
					#include <asm/mmu.h>
 | 
				
			||||||
#include <asm/fsl_law.h>
 | 
					#include <asm/fsl_law.h>
 | 
				
			||||||
#include <asm/fsl_serdes.h>
 | 
					#include <asm/fsl_serdes.h>
 | 
				
			||||||
| 
						 | 
					@ -127,6 +128,44 @@ void config_8560_ioports (volatile ccsr_cpm_t * cpm)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_SYS_FSL_CPC
 | 
				
			||||||
 | 
					static void enable_cpc(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int i;
 | 
				
			||||||
 | 
						u32 size = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						cpc_corenet_t *cpc = (cpc_corenet_t *)CONFIG_SYS_FSL_CPC_ADDR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (i = 0; i < CONFIG_SYS_NUM_CPC; i++, cpc++) {
 | 
				
			||||||
 | 
							u32 cpccfg0 = in_be32(&cpc->cpccfg0);
 | 
				
			||||||
 | 
							size += CPC_CFG0_SZ_K(cpccfg0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							out_be32(&cpc->cpccsr0, CPC_CSR0_CE | CPC_CSR0_PE);
 | 
				
			||||||
 | 
							/* Read back to sync write */
 | 
				
			||||||
 | 
							in_be32(&cpc->cpccsr0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						printf("Corenet Platform Cache: %d KB enabled\n", size);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void invalidate_cpc(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int i;
 | 
				
			||||||
 | 
						cpc_corenet_t *cpc = (cpc_corenet_t *)CONFIG_SYS_FSL_CPC_ADDR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (i = 0; i < CONFIG_SYS_NUM_CPC; i++, cpc++) {
 | 
				
			||||||
 | 
							/* Flash invalidate the CPC and clear all the locks */
 | 
				
			||||||
 | 
							out_be32(&cpc->cpccsr0, CPC_CSR0_FI | CPC_CSR0_LFC);
 | 
				
			||||||
 | 
							while (in_be32(&cpc->cpccsr0) & (CPC_CSR0_FI | CPC_CSR0_LFC))
 | 
				
			||||||
 | 
								;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define enable_cpc()
 | 
				
			||||||
 | 
					#define invalidate_cpc()
 | 
				
			||||||
 | 
					#endif /* CONFIG_SYS_FSL_CPC */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Breathe some life into the CPU...
 | 
					 * Breathe some life into the CPU...
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
| 
						 | 
					@ -188,6 +227,9 @@ void cpu_init_f (void)
 | 
				
			||||||
	corenet_tb_init();
 | 
						corenet_tb_init();
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	init_used_tlb_cams();
 | 
						init_used_tlb_cams();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Invalidate the CPC before DDR gets enabled */
 | 
				
			||||||
 | 
						invalidate_cpc();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -198,13 +240,18 @@ void cpu_init_f (void)
 | 
				
			||||||
 * use the same bit-encoding as the older 8555, etc, parts.
 | 
					 * use the same bit-encoding as the older 8555, etc, parts.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					 | 
				
			||||||
int cpu_init_r(void)
 | 
					int cpu_init_r(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifdef CONFIG_SYS_LBC_LCRR
 | 
					#ifdef CONFIG_SYS_LBC_LCRR
 | 
				
			||||||
	volatile fsl_lbc_t *lbc = LBC_BASE_ADDR;
 | 
						volatile fsl_lbc_t *lbc = LBC_BASE_ADDR;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(CONFIG_SYS_P4080_ERRATUM_CPU22)
 | 
				
			||||||
 | 
						flush_dcache();
 | 
				
			||||||
 | 
						mtspr(L1CSR2, (mfspr(L1CSR2) | L1CSR2_DCWS));
 | 
				
			||||||
 | 
						sync();
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	puts ("L2:    ");
 | 
						puts ("L2:    ");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(CONFIG_L2_CACHE)
 | 
					#if defined(CONFIG_L2_CACHE)
 | 
				
			||||||
| 
						 | 
					@ -319,6 +366,9 @@ int cpu_init_r(void)
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
	puts("disabled\n");
 | 
						puts("disabled\n");
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						enable_cpc();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_QE
 | 
					#ifdef CONFIG_QE
 | 
				
			||||||
	uint qe_base = CONFIG_SYS_IMMR + 0x00080000; /* QE immr base */
 | 
						uint qe_base = CONFIG_SYS_IMMR + 0x00080000; /* QE immr base */
 | 
				
			||||||
	qe_init(qe_base);
 | 
						qe_init(qe_base);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -33,6 +33,8 @@ void fsl_ddr_set_memctl_regs(const fsl_ddr_cfg_regs_t *regs,
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						out_be32(&ddr->eor, regs->ddr_eor);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 0; i < CONFIG_CHIP_SELECTS_PER_CTRL; i++) {
 | 
						for (i = 0; i < CONFIG_CHIP_SELECTS_PER_CTRL; i++) {
 | 
				
			||||||
		if (i == 0) {
 | 
							if (i == 0) {
 | 
				
			||||||
			out_be32(&ddr->cs0_bnds, regs->cs[i].bnds);
 | 
								out_be32(&ddr->cs0_bnds, regs->cs[i].bnds);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,6 +28,8 @@
 | 
				
			||||||
#include <fdt_support.h>
 | 
					#include <fdt_support.h>
 | 
				
			||||||
#include <asm/processor.h>
 | 
					#include <asm/processor.h>
 | 
				
			||||||
#include <linux/ctype.h>
 | 
					#include <linux/ctype.h>
 | 
				
			||||||
 | 
					#include <asm/io.h>
 | 
				
			||||||
 | 
					#include <asm/fsl_portals.h>
 | 
				
			||||||
#ifdef CONFIG_FSL_ESDHC
 | 
					#ifdef CONFIG_FSL_ESDHC
 | 
				
			||||||
#include <fsl_esdhc.h>
 | 
					#include <fsl_esdhc.h>
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -80,7 +82,30 @@ void ft_fixup_cpu(void *blob, u64 memory_limit)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_SYS_FSL_CPC
 | 
				
			||||||
 | 
					static inline void ft_fixup_l3cache(void *blob, int off)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						u32 line_size, num_ways, size, num_sets;
 | 
				
			||||||
 | 
						cpc_corenet_t *cpc = (void *)CONFIG_SYS_FSL_CPC_ADDR;
 | 
				
			||||||
 | 
						u32 cfg0 = in_be32(&cpc->cpccfg0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						size = CPC_CFG0_SZ_K(cfg0) * 1024 * CONFIG_SYS_NUM_CPC;
 | 
				
			||||||
 | 
						num_ways = CPC_CFG0_NUM_WAYS(cfg0);
 | 
				
			||||||
 | 
						line_size = CPC_CFG0_LINE_SZ(cfg0);
 | 
				
			||||||
 | 
						num_sets = size / (line_size * num_ways);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fdt_setprop(blob, off, "cache-unified", NULL, 0);
 | 
				
			||||||
 | 
						fdt_setprop_cell(blob, off, "cache-block-size", line_size);
 | 
				
			||||||
 | 
						fdt_setprop_cell(blob, off, "cache-size", size);
 | 
				
			||||||
 | 
						fdt_setprop_cell(blob, off, "cache-sets", num_sets);
 | 
				
			||||||
 | 
						fdt_setprop_cell(blob, off, "cache-level", 3);
 | 
				
			||||||
 | 
					#ifdef CONFIG_SYS_CACHE_STASHING
 | 
				
			||||||
 | 
						fdt_setprop_cell(blob, off, "cache-stash-id", 1);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
#define ft_fixup_l3cache(x, y)
 | 
					#define ft_fixup_l3cache(x, y)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(CONFIG_L2_CACHE)
 | 
					#if defined(CONFIG_L2_CACHE)
 | 
				
			||||||
/* return size in kilobytes */
 | 
					/* return size in kilobytes */
 | 
				
			||||||
| 
						 | 
					@ -422,4 +447,18 @@ void ft_cpu_setup(void *blob, bd_t *bd)
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ft_fixup_dpaa_clks(blob);
 | 
						ft_fixup_dpaa_clks(blob);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(CONFIG_SYS_BMAN_MEM_PHYS)
 | 
				
			||||||
 | 
						fdt_portal(blob, "fsl,bman-portal", "bman-portals",
 | 
				
			||||||
 | 
								(u64)CONFIG_SYS_BMAN_MEM_PHYS,
 | 
				
			||||||
 | 
								CONFIG_SYS_BMAN_MEM_SIZE);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(CONFIG_SYS_QMAN_MEM_PHYS)
 | 
				
			||||||
 | 
						fdt_portal(blob, "fsl,qman-portal", "qman-portals",
 | 
				
			||||||
 | 
								(u64)CONFIG_SYS_QMAN_MEM_PHYS,
 | 
				
			||||||
 | 
								CONFIG_SYS_QMAN_MEM_SIZE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fdt_fixup_qportals(blob);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,495 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright 2009-2010 Freescale Semiconductor, 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 <common.h>
 | 
				
			||||||
 | 
					#ifdef CONFIG_SYS_P4080_ERRATUM_SERDES8
 | 
				
			||||||
 | 
					#include <hwconfig.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#include <asm/fsl_serdes.h>
 | 
				
			||||||
 | 
					#include <asm/immap_85xx.h>
 | 
				
			||||||
 | 
					#include <asm/io.h>
 | 
				
			||||||
 | 
					#include <asm/processor.h>
 | 
				
			||||||
 | 
					#include <asm/fsl_law.h>
 | 
				
			||||||
 | 
					#include "fsl_corenet_serdes.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static u32 serdes_prtcl_map;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef DEBUG
 | 
				
			||||||
 | 
					static const char *serdes_prtcl_str[] = {
 | 
				
			||||||
 | 
						[NONE] = "NA",
 | 
				
			||||||
 | 
						[PCIE1] = "PCIE1",
 | 
				
			||||||
 | 
						[PCIE2] = "PCIE2",
 | 
				
			||||||
 | 
						[PCIE3] = "PCIE3",
 | 
				
			||||||
 | 
						[PCIE4] = "PCIE4",
 | 
				
			||||||
 | 
						[SATA1] = "SATA1",
 | 
				
			||||||
 | 
						[SATA2] = "SATA2",
 | 
				
			||||||
 | 
						[SRIO1] = "SRIO1",
 | 
				
			||||||
 | 
						[SRIO2] = "SRIO2",
 | 
				
			||||||
 | 
						[SGMII_FM1_DTSEC1] = "SGMII_FM1_DTSEC1",
 | 
				
			||||||
 | 
						[SGMII_FM1_DTSEC2] = "SGMII_FM1_DTSEC2",
 | 
				
			||||||
 | 
						[SGMII_FM1_DTSEC3] = "SGMII_FM1_DTSEC3",
 | 
				
			||||||
 | 
						[SGMII_FM1_DTSEC4] = "SGMII_FM1_DTSEC4",
 | 
				
			||||||
 | 
						[SGMII_FM1_DTSEC5] = "SGMII_FM1_DTSEC5",
 | 
				
			||||||
 | 
						[SGMII_FM2_DTSEC1] = "SGMII_FM2_DTSEC1",
 | 
				
			||||||
 | 
						[SGMII_FM2_DTSEC2] = "SGMII_FM2_DTSEC2",
 | 
				
			||||||
 | 
						[SGMII_FM2_DTSEC3] = "SGMII_FM2_DTSEC3",
 | 
				
			||||||
 | 
						[SGMII_FM2_DTSEC4] = "SGMII_FM2_DTSEC4",
 | 
				
			||||||
 | 
						[XAUI_FM1] = "XAUI_FM1",
 | 
				
			||||||
 | 
						[XAUI_FM2] = "XAUI_FM2",
 | 
				
			||||||
 | 
						[AURORA] = "DEBUG",
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const struct {
 | 
				
			||||||
 | 
						int idx;
 | 
				
			||||||
 | 
						unsigned int lpd; /* RCW lane powerdown bit */
 | 
				
			||||||
 | 
						int bank;
 | 
				
			||||||
 | 
					} lanes[SRDS_MAX_LANES] = {
 | 
				
			||||||
 | 
						{ 0, 152, FSL_SRDS_BANK_1 },
 | 
				
			||||||
 | 
						{ 1, 153, FSL_SRDS_BANK_1 },
 | 
				
			||||||
 | 
						{ 2, 154, FSL_SRDS_BANK_1 },
 | 
				
			||||||
 | 
						{ 3, 155, FSL_SRDS_BANK_1 },
 | 
				
			||||||
 | 
						{ 4, 156, FSL_SRDS_BANK_1 },
 | 
				
			||||||
 | 
						{ 5, 157, FSL_SRDS_BANK_1 },
 | 
				
			||||||
 | 
						{ 6, 158, FSL_SRDS_BANK_1 },
 | 
				
			||||||
 | 
						{ 7, 159, FSL_SRDS_BANK_1 },
 | 
				
			||||||
 | 
						{ 8, 160, FSL_SRDS_BANK_1 },
 | 
				
			||||||
 | 
						{ 9, 161, FSL_SRDS_BANK_1 },
 | 
				
			||||||
 | 
						{ 16, 162, FSL_SRDS_BANK_2 },
 | 
				
			||||||
 | 
						{ 17, 163, FSL_SRDS_BANK_2 },
 | 
				
			||||||
 | 
						{ 18, 164, FSL_SRDS_BANK_2 },
 | 
				
			||||||
 | 
						{ 19, 165, FSL_SRDS_BANK_2 },
 | 
				
			||||||
 | 
						{ 20, 170, FSL_SRDS_BANK_3 },
 | 
				
			||||||
 | 
						{ 21, 171, FSL_SRDS_BANK_3 },
 | 
				
			||||||
 | 
						{ 22, 172, FSL_SRDS_BANK_3 },
 | 
				
			||||||
 | 
						{ 23, 173, FSL_SRDS_BANK_3 },
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int serdes_get_lane_idx(int lane)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return lanes[lane].idx;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int serdes_get_bank(int lane)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return lanes[lane].bank;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int serdes_lane_enabled(int lane)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
 | 
				
			||||||
 | 
						serdes_corenet_t *regs = (void *)CONFIG_SYS_FSL_CORENET_SERDES_ADDR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						int bank = lanes[lane].bank;
 | 
				
			||||||
 | 
						int word = lanes[lane].lpd / 32;
 | 
				
			||||||
 | 
						int bit = lanes[lane].lpd % 32;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (in_be32(®s->bank[bank].rstctl) & SRDS_RSTCTL_SDPD)
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_SYS_P4080_ERRATUM_SERDES8
 | 
				
			||||||
 | 
						if (!IS_SVR_REV(get_svr(), 1, 0))
 | 
				
			||||||
 | 
							if (bank > 0)
 | 
				
			||||||
 | 
								return !(srds_lpd_b[bank] &
 | 
				
			||||||
 | 
										(8 >> (lane - (6 + 4 * bank))));
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return !(in_be32(&gur->rcwsr[word]) & (0x80000000 >> bit));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int is_serdes_configured(enum srds_prtcl device)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Is serdes enabled at all? */
 | 
				
			||||||
 | 
						if (!(in_be32(&gur->rcwsr[5]) & FSL_CORENET_RCWSR5_SRDS_EN))
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return (1 << device) & serdes_prtcl_map;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef CONFIG_SYS_DCSRBAR_PHYS
 | 
				
			||||||
 | 
					#define CONFIG_SYS_DCSRBAR_PHYS	0x80000000 /* Must be 1GB-aligned for rev1.0 */
 | 
				
			||||||
 | 
					#define CONFIG_SYS_DCSRBAR	0x80000000
 | 
				
			||||||
 | 
					#define __DCSR_NOT_DEFINED_BY_CONFIG
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_SYS_P4080_ERRATUM_SERDES8
 | 
				
			||||||
 | 
					static void enable_bank(ccsr_gur_t *gur, int bank)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						u32 rcw5;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * Enable the lanes SRDS_LPD_Bn.  The RCW bits are read-only in
 | 
				
			||||||
 | 
						 * CCSR, and read/write in DSCR.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						rcw5 = in_be32(gur->rcwsr + 5);
 | 
				
			||||||
 | 
						if (bank == FSL_SRDS_BANK_2) {
 | 
				
			||||||
 | 
							rcw5 &= ~FSL_CORENET_RCWSRn_SRDS_LPD_B2;
 | 
				
			||||||
 | 
							rcw5 |= srds_lpd_b[bank] << 26;
 | 
				
			||||||
 | 
						} else if (bank == FSL_SRDS_BANK_3) {
 | 
				
			||||||
 | 
							rcw5 &= ~FSL_CORENET_RCWSRn_SRDS_LPD_B3;
 | 
				
			||||||
 | 
							rcw5 |= srds_lpd_b[bank] << 18;
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							printf("SERDES: enable_bank: bad bank %d\n", bank + 1);
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* See similar code in cpu/mpc85xx/cpu_init.c for an explanation
 | 
				
			||||||
 | 
						 * of the DCSR mapping.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
					#ifdef __DCSR_NOT_DEFINED_BY_CONFIG
 | 
				
			||||||
 | 
							struct law_entry law = find_law(CONFIG_SYS_DCSRBAR_PHYS);
 | 
				
			||||||
 | 
							int law_index;
 | 
				
			||||||
 | 
							if (law.index == -1)
 | 
				
			||||||
 | 
								law_index = set_next_law(CONFIG_SYS_DCSRBAR_PHYS,
 | 
				
			||||||
 | 
											 LAW_SIZE_1M, LAW_TRGT_IF_DCSR);
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								set_law(law.index, CONFIG_SYS_DCSRBAR_PHYS, LAW_SIZE_1M,
 | 
				
			||||||
 | 
									LAW_TRGT_IF_DCSR);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
							u32 *p = (void *)CONFIG_SYS_DCSRBAR + 0x20114;
 | 
				
			||||||
 | 
							out_be32(p, rcw5);
 | 
				
			||||||
 | 
					#ifdef __DCSR_NOT_DEFINED_BY_CONFIG
 | 
				
			||||||
 | 
							if (law.index == -1)
 | 
				
			||||||
 | 
								disable_law(law_index);
 | 
				
			||||||
 | 
							else
 | 
				
			||||||
 | 
								set_law(law.index, law.addr, law.size, law.trgt_id);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * To avoid problems with clock jitter, rev 2 p4080 uses the pll from
 | 
				
			||||||
 | 
					 * bank 3 to clock banks 2 and 3, as well as a limited selection of
 | 
				
			||||||
 | 
					 * protocol configurations.  This requires that banks 2 and 3's lanes be
 | 
				
			||||||
 | 
					 * disabled in the RCW, and enabled with some fixup here to re-enable
 | 
				
			||||||
 | 
					 * them, and to configure bank 2's clock parameters in bank 3's pll in
 | 
				
			||||||
 | 
					 * cases where they differ.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					static void p4080_erratum_serdes8(serdes_corenet_t *regs, ccsr_gur_t *gur,
 | 
				
			||||||
 | 
									  u32 devdisr, u32 devdisr2, int cfg)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int srds_ratio_b2;
 | 
				
			||||||
 | 
						int rfck_sel;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * The disabled lanes of bank 2 will cause the associated
 | 
				
			||||||
 | 
						 * logic blocks to be disabled in DEVDISR.  We reverse that here.
 | 
				
			||||||
 | 
						 *
 | 
				
			||||||
 | 
						 * Note that normally it is not permitted to clear DEVDISR bits
 | 
				
			||||||
 | 
						 * once the device has been disabled, but the hardware people
 | 
				
			||||||
 | 
						 * say that this special case is OK.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						clrbits_be32(&gur->devdisr, devdisr);
 | 
				
			||||||
 | 
						clrbits_be32(&gur->devdisr2, devdisr2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * Some protocols require special handling.  There are a few
 | 
				
			||||||
 | 
						 * additional protocol configurations that can be used, which are
 | 
				
			||||||
 | 
						 * not listed here.  See app note 4065 for supported protocol
 | 
				
			||||||
 | 
						 * configurations.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						switch (cfg) {
 | 
				
			||||||
 | 
						case 0x19:
 | 
				
			||||||
 | 
							/*
 | 
				
			||||||
 | 
							 * Bank 2 has PCIe which wants BWSEL -- tell bank 3's PLL.
 | 
				
			||||||
 | 
							 * SGMII on bank 3 should still be usable.
 | 
				
			||||||
 | 
							 */
 | 
				
			||||||
 | 
							setbits_be32(®s->bank[FSL_SRDS_BANK_3].pllcr1,
 | 
				
			||||||
 | 
								     SRDS_PLLCR1_PLL_BWSEL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							enable_bank(gur, FSL_SRDS_BANK_3);
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						case 0x0f:
 | 
				
			||||||
 | 
						case 0x10:
 | 
				
			||||||
 | 
							/*
 | 
				
			||||||
 | 
							 * Banks 2 (XAUI) and 3 (SGMII) have different clocking
 | 
				
			||||||
 | 
							 * requirements in these configurations.  Bank 3 cannot
 | 
				
			||||||
 | 
							 * be used and should have its lanes (but not the bank
 | 
				
			||||||
 | 
							 * itself) disabled in the RCW.  We set up bank 3's pll
 | 
				
			||||||
 | 
							 * for bank 2's needs here.
 | 
				
			||||||
 | 
							 */
 | 
				
			||||||
 | 
							srds_ratio_b2 = (in_be32(&gur->rcwsr[4]) >> 13) & 7;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* Determine refclock from XAUI ratio */
 | 
				
			||||||
 | 
							switch (srds_ratio_b2) {
 | 
				
			||||||
 | 
							case 1: /* 20:1 */
 | 
				
			||||||
 | 
								rfck_sel = SRDS_PLLCR0_RFCK_SEL_156_25;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 2: /* 25:1 */
 | 
				
			||||||
 | 
								rfck_sel = SRDS_PLLCR0_RFCK_SEL_125;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							default:
 | 
				
			||||||
 | 
								printf("SERDES: bad SRDS_RATIO_B2 %d\n",
 | 
				
			||||||
 | 
								       srds_ratio_b2);
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							clrsetbits_be32(®s->bank[FSL_SRDS_BANK_3].pllcr0,
 | 
				
			||||||
 | 
									SRDS_PLLCR0_RFCK_SEL_MASK, rfck_sel);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							clrsetbits_be32(®s->bank[FSL_SRDS_BANK_3].pllcr0,
 | 
				
			||||||
 | 
									SRDS_PLLCR0_FRATE_SEL_MASK,
 | 
				
			||||||
 | 
									SRDS_PLLCR0_FRATE_SEL_6_25);
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							enable_bank(gur, FSL_SRDS_BANK_3);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void fsl_serdes_init(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
 | 
				
			||||||
 | 
						int cfg;
 | 
				
			||||||
 | 
						serdes_corenet_t *srds_regs;
 | 
				
			||||||
 | 
						int lane, bank, idx;
 | 
				
			||||||
 | 
						enum srds_prtcl lane_prtcl;
 | 
				
			||||||
 | 
						long long end_tick;
 | 
				
			||||||
 | 
						int have_bank[SRDS_MAX_BANK] = {};
 | 
				
			||||||
 | 
					#ifdef CONFIG_SYS_P4080_ERRATUM_SERDES8
 | 
				
			||||||
 | 
						u32 serdes8_devdisr = 0;
 | 
				
			||||||
 | 
						u32 serdes8_devdisr2 = 0;
 | 
				
			||||||
 | 
						char srds_lpd_opt[16];
 | 
				
			||||||
 | 
						const char *srds_lpd_arg;
 | 
				
			||||||
 | 
						size_t arglen;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Is serdes enabled at all? */
 | 
				
			||||||
 | 
						if (!(in_be32(&gur->rcwsr[5]) & FSL_CORENET_RCWSR5_SRDS_EN))
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						srds_regs = (void *)(CONFIG_SYS_FSL_CORENET_SERDES_ADDR);
 | 
				
			||||||
 | 
						cfg = (in_be32(&gur->rcwsr[4]) & FSL_CORENET_RCWSR4_SRDS_PRTCL) >> 26;
 | 
				
			||||||
 | 
						debug("Using SERDES configuration 0x%x, lane settings:\n", cfg);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!is_serdes_prtcl_valid(cfg)) {
 | 
				
			||||||
 | 
							printf("SERDES[PRTCL] = 0x%x is not valid\n", cfg);
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_SYS_P4080_ERRATUM_SERDES8
 | 
				
			||||||
 | 
						if (!IS_SVR_REV(get_svr(), 1, 0))
 | 
				
			||||||
 | 
							for (bank = 1; bank < ARRAY_SIZE(srds_lpd_b); bank++) {
 | 
				
			||||||
 | 
								sprintf(srds_lpd_opt, "fsl_srds_lpd_b%u", bank + 1);
 | 
				
			||||||
 | 
								srds_lpd_arg = hwconfig_subarg("serdes", srds_lpd_opt,
 | 
				
			||||||
 | 
											       &arglen);
 | 
				
			||||||
 | 
								if (srds_lpd_arg)
 | 
				
			||||||
 | 
									srds_lpd_b[bank] = simple_strtoul(srds_lpd_arg,
 | 
				
			||||||
 | 
													  NULL, 0);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Look for banks with all lanes disabled, and power down the bank. */
 | 
				
			||||||
 | 
						for (lane = 0; lane < SRDS_MAX_LANES; lane++) {
 | 
				
			||||||
 | 
							enum srds_prtcl lane_prtcl = serdes_get_prtcl(cfg, lane);
 | 
				
			||||||
 | 
							if (serdes_lane_enabled(lane)) {
 | 
				
			||||||
 | 
								have_bank[serdes_get_bank(lane)] = 1;
 | 
				
			||||||
 | 
								serdes_prtcl_map |= (1 << lane_prtcl);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_SYS_P4080_ERRATUM_SERDES8
 | 
				
			||||||
 | 
						if (IS_SVR_REV(get_svr(), 1, 0)) {
 | 
				
			||||||
 | 
							/* At least one bank must be disabled due to SERDES8.  If
 | 
				
			||||||
 | 
							 * no bank is found to be disabled based on lane
 | 
				
			||||||
 | 
							 * disables, disable bank 3 because we can't turn off its
 | 
				
			||||||
 | 
							 * lanes in the RCW without disabling MDIO due to erratum
 | 
				
			||||||
 | 
							 * GEN8.
 | 
				
			||||||
 | 
							 *
 | 
				
			||||||
 | 
							 * This means that if you are relying on bank 3 being
 | 
				
			||||||
 | 
							 * disabled to avoid SERDES8, in some cases you cannot
 | 
				
			||||||
 | 
							 * also disable all lanes of another bank, or else bank
 | 
				
			||||||
 | 
							 * 3 won't be disabled, leaving you with a configuration
 | 
				
			||||||
 | 
							 * that isn't valid according to SERDES8 (e.g. if banks
 | 
				
			||||||
 | 
							 * 2 and 3 have the same clock, and bank 1 is disabled
 | 
				
			||||||
 | 
							 * instead of 3).
 | 
				
			||||||
 | 
							 */
 | 
				
			||||||
 | 
							for (bank = 0; bank < SRDS_MAX_BANK; bank++) {
 | 
				
			||||||
 | 
								if (!have_bank[bank])
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (bank == SRDS_MAX_BANK)
 | 
				
			||||||
 | 
								have_bank[FSL_SRDS_BANK_3] = 0;
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							if (have_bank[FSL_SRDS_BANK_2])
 | 
				
			||||||
 | 
								have_bank[FSL_SRDS_BANK_3] = 1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (bank = 0; bank < SRDS_MAX_BANK; bank++) {
 | 
				
			||||||
 | 
							if (!have_bank[bank]) {
 | 
				
			||||||
 | 
								printf("SERDES: bank %d disabled\n", bank + 1);
 | 
				
			||||||
 | 
								setbits_be32(&srds_regs->bank[bank].rstctl,
 | 
				
			||||||
 | 
									     SRDS_RSTCTL_SDPD);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (lane = 0; lane < SRDS_MAX_LANES; lane++) {
 | 
				
			||||||
 | 
							idx = serdes_get_lane_idx(lane);
 | 
				
			||||||
 | 
							lane_prtcl = serdes_get_prtcl(cfg, lane);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef DEBUG
 | 
				
			||||||
 | 
							switch (lane) {
 | 
				
			||||||
 | 
							case 0:
 | 
				
			||||||
 | 
								puts("Bank1: ");
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 10:
 | 
				
			||||||
 | 
								puts("\nBank2: ");
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 14:
 | 
				
			||||||
 | 
								puts("\nBank3: ");
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							default:
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							printf("%s ", serdes_prtcl_str[lane_prtcl]);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_SYS_P4080_ERRATUM_SERDES8
 | 
				
			||||||
 | 
							switch (lane_prtcl) {
 | 
				
			||||||
 | 
							case PCIE1:
 | 
				
			||||||
 | 
							case PCIE2:
 | 
				
			||||||
 | 
							case PCIE3:
 | 
				
			||||||
 | 
								serdes8_devdisr |= FSL_CORENET_DEVDISR_PCIE1 >>
 | 
				
			||||||
 | 
										   (lane_prtcl - PCIE1);
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case SRIO1:
 | 
				
			||||||
 | 
							case SRIO2:
 | 
				
			||||||
 | 
								serdes8_devdisr |= FSL_CORENET_DEVDISR_SRIO1 >>
 | 
				
			||||||
 | 
										   (lane_prtcl - SRIO1);
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case SGMII_FM1_DTSEC1:
 | 
				
			||||||
 | 
								serdes8_devdisr2 |= FSL_CORENET_DEVDISR2_FM1 |
 | 
				
			||||||
 | 
										    FSL_CORENET_DEVDISR2_DTSEC1_1;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case SGMII_FM1_DTSEC2:
 | 
				
			||||||
 | 
								serdes8_devdisr2 |= FSL_CORENET_DEVDISR2_FM1 |
 | 
				
			||||||
 | 
										    FSL_CORENET_DEVDISR2_DTSEC1_2;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case SGMII_FM1_DTSEC3:
 | 
				
			||||||
 | 
								serdes8_devdisr2 |= FSL_CORENET_DEVDISR2_FM1 |
 | 
				
			||||||
 | 
										    FSL_CORENET_DEVDISR2_DTSEC1_3;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case SGMII_FM1_DTSEC4:
 | 
				
			||||||
 | 
								serdes8_devdisr2 |= FSL_CORENET_DEVDISR2_FM1 |
 | 
				
			||||||
 | 
										    FSL_CORENET_DEVDISR2_DTSEC1_4;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case SGMII_FM2_DTSEC1:
 | 
				
			||||||
 | 
								serdes8_devdisr2 |= FSL_CORENET_DEVDISR2_FM2 |
 | 
				
			||||||
 | 
										    FSL_CORENET_DEVDISR2_DTSEC2_1;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case SGMII_FM2_DTSEC2:
 | 
				
			||||||
 | 
								serdes8_devdisr2 |= FSL_CORENET_DEVDISR2_FM2 |
 | 
				
			||||||
 | 
										    FSL_CORENET_DEVDISR2_DTSEC2_2;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case SGMII_FM2_DTSEC3:
 | 
				
			||||||
 | 
								serdes8_devdisr2 |= FSL_CORENET_DEVDISR2_FM2 |
 | 
				
			||||||
 | 
										    FSL_CORENET_DEVDISR2_DTSEC2_3;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case SGMII_FM2_DTSEC4:
 | 
				
			||||||
 | 
								serdes8_devdisr2 |= FSL_CORENET_DEVDISR2_FM2 |
 | 
				
			||||||
 | 
										    FSL_CORENET_DEVDISR2_DTSEC2_4;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case XAUI_FM1:
 | 
				
			||||||
 | 
							case XAUI_FM2:
 | 
				
			||||||
 | 
								if (lane_prtcl == XAUI_FM1)
 | 
				
			||||||
 | 
									serdes8_devdisr2 |= FSL_CORENET_DEVDISR2_FM1	|
 | 
				
			||||||
 | 
											    FSL_CORENET_DEVDISR2_10GEC1;
 | 
				
			||||||
 | 
								else
 | 
				
			||||||
 | 
									serdes8_devdisr2 |= FSL_CORENET_DEVDISR2_FM2	|
 | 
				
			||||||
 | 
											    FSL_CORENET_DEVDISR2_10GEC2;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case AURORA:
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							default:
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef DEBUG
 | 
				
			||||||
 | 
						puts("\n");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (idx = 0; idx < SRDS_MAX_BANK; idx++) {
 | 
				
			||||||
 | 
							u32 rstctl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							bank = idx;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_SYS_P4080_ERRATUM_SERDES8
 | 
				
			||||||
 | 
							if (!IS_SVR_REV(get_svr(), 1, 0)) {
 | 
				
			||||||
 | 
								/*
 | 
				
			||||||
 | 
								 * Change bank init order to 0, 2, 1, so that the
 | 
				
			||||||
 | 
								 * third bank's PLL is established before we
 | 
				
			||||||
 | 
								 * start the second bank which shares the third
 | 
				
			||||||
 | 
								 * bank's PLL.
 | 
				
			||||||
 | 
								 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								if (idx == 1)
 | 
				
			||||||
 | 
									bank = FSL_SRDS_BANK_3;
 | 
				
			||||||
 | 
								else if (idx == 2)
 | 
				
			||||||
 | 
									bank = FSL_SRDS_BANK_2;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* Skip disabled banks */
 | 
				
			||||||
 | 
							if (!have_bank[bank])
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_SYS_P4080_ERRATUM_SERDES8
 | 
				
			||||||
 | 
							if (!IS_SVR_REV(get_svr(), 1, 0)) {
 | 
				
			||||||
 | 
								if (idx == 1) {
 | 
				
			||||||
 | 
									p4080_erratum_serdes8(srds_regs, gur,
 | 
				
			||||||
 | 
											      serdes8_devdisr,
 | 
				
			||||||
 | 
											      serdes8_devdisr2, cfg);
 | 
				
			||||||
 | 
								} else if (idx == 2) {
 | 
				
			||||||
 | 
									enable_bank(gur, FSL_SRDS_BANK_2);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* reset banks for errata */
 | 
				
			||||||
 | 
							setbits_be32(&srds_regs->bank[bank].rstctl, SRDS_RSTCTL_RST);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* wait for reset complete or 1-second timeout */
 | 
				
			||||||
 | 
							end_tick = usec2ticks(1000000) + get_ticks();
 | 
				
			||||||
 | 
							do {
 | 
				
			||||||
 | 
								rstctl = in_be32(&srds_regs->bank[bank].rstctl);
 | 
				
			||||||
 | 
								if (rstctl & SRDS_RSTCTL_RSTDONE)
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
							} while (end_tick > get_ticks());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (!(rstctl & SRDS_RSTCTL_RSTDONE)) {
 | 
				
			||||||
 | 
								printf("SERDES: timeout resetting bank %d\n",
 | 
				
			||||||
 | 
								       bank + 1);
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,44 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright 2009-2010 Freescale Semiconductor, Inc.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Author: Roy Zang <tie-fei.zang@freescale.com>
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * 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 __FSL_CORENET_SERDES_H
 | 
				
			||||||
 | 
					#define __FSL_CORENET_SERDES_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SRDS_MAX_LANES		18
 | 
				
			||||||
 | 
					#define SRDS_MAX_BANK		3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum srds_bank {
 | 
				
			||||||
 | 
						FSL_SRDS_BANK_1  = 0,
 | 
				
			||||||
 | 
						FSL_SRDS_BANK_2  = 1,
 | 
				
			||||||
 | 
						FSL_SRDS_BANK_3  = 2,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int is_serdes_prtcl_valid(u32 prtcl);
 | 
				
			||||||
 | 
					int serdes_get_lane_idx(int lane);
 | 
				
			||||||
 | 
					int serdes_get_bank(int lane);
 | 
				
			||||||
 | 
					int serdes_lane_enabled(int lane);
 | 
				
			||||||
 | 
					enum srds_prtcl serdes_get_prtcl(int cfg, int lane);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_SYS_P4080_ERRATUM_SERDES8
 | 
				
			||||||
 | 
					extern uint16_t srds_lpd_b[SRDS_MAX_BANK];
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /* __FSL_CORENET_SERDES_H */
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,187 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright 2008-2010 Freescale Semiconductor, 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 <common.h>
 | 
				
			||||||
 | 
					#include <libfdt.h>
 | 
				
			||||||
 | 
					#include <fdt_support.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <asm/immap_85xx.h>
 | 
				
			||||||
 | 
					#include <asm/io.h>
 | 
				
			||||||
 | 
					#include <asm/processor.h>
 | 
				
			||||||
 | 
					#include <asm/fsl_portals.h>
 | 
				
			||||||
 | 
					#include <asm/fsl_liodn.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int get_dpaa_liodn(enum fsl_dpaa_dev dpaa_dev, u32 *liodns, int liodn_offset)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						liodns[0] = liodn_bases[dpaa_dev].id[0] + liodn_offset;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (liodn_bases[dpaa_dev].num_ids == 2)
 | 
				
			||||||
 | 
							liodns[1] = liodn_bases[dpaa_dev].id[1] + liodn_offset;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return liodn_bases[dpaa_dev].num_ids;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void set_liodn(struct liodn_id_table *tbl, int size)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (i = 0; i < size; i++) {
 | 
				
			||||||
 | 
							u32 liodn;
 | 
				
			||||||
 | 
							if (tbl[i].num_ids == 2) {
 | 
				
			||||||
 | 
								liodn = (tbl[i].id[0] << 16) | tbl[i].id[1];
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								liodn = tbl[i].id[0];
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							out_be32((volatile u32 *)(tbl[i].reg_offset), liodn);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void setup_sec_liodn_base(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						ccsr_sec_t *sec = (void *)CONFIG_SYS_FSL_SEC_ADDR;
 | 
				
			||||||
 | 
						u32 base;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!IS_E_PROCESSOR(get_svr()))
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* QILCR[QSLOM] */
 | 
				
			||||||
 | 
						out_be32(&sec->qilcr_ms, 0x3ff<<16);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						base = (liodn_bases[FSL_HW_PORTAL_SEC].id[0] << 16) |
 | 
				
			||||||
 | 
							liodn_bases[FSL_HW_PORTAL_SEC].id[1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						out_be32(&sec->qilcr_ls, base);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_SYS_DPAA_FMAN
 | 
				
			||||||
 | 
					static void setup_fman_liodn_base(enum fsl_dpaa_dev dev,
 | 
				
			||||||
 | 
									  struct liodn_id_table *tbl, int size)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int i;
 | 
				
			||||||
 | 
						ccsr_fman_t *fm;
 | 
				
			||||||
 | 
						u32 base;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						switch(dev) {
 | 
				
			||||||
 | 
						case FSL_HW_PORTAL_FMAN1:
 | 
				
			||||||
 | 
							fm = (void *)CONFIG_SYS_FSL_FM1_ADDR;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if (CONFIG_SYS_NUM_FMAN == 2)
 | 
				
			||||||
 | 
						case FSL_HW_PORTAL_FMAN2:
 | 
				
			||||||
 | 
							fm = (void *)CONFIG_SYS_FSL_FM2_ADDR;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							printf("Error: Invalid device type to %s\n", __FUNCTION__);
 | 
				
			||||||
 | 
							return ;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						base = (liodn_bases[dev].id[0] << 16) | liodn_bases[dev].id[0];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* setup all bases the same */
 | 
				
			||||||
 | 
						for (i = 0; i < 32; i++) {
 | 
				
			||||||
 | 
							out_be32(&fm->fm_dma.fmdmplr[i], base);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* update tbl to ... */
 | 
				
			||||||
 | 
						for (i = 0; i < size; i++)
 | 
				
			||||||
 | 
							tbl[i].id[0] += liodn_bases[dev].id[0];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void setup_pme_liodn_base(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#ifdef CONFIG_SYS_DPAA_PME
 | 
				
			||||||
 | 
						ccsr_pme_t *pme = (void *)CONFIG_SYS_FSL_CORENET_PME_ADDR;
 | 
				
			||||||
 | 
						u32 base = (liodn_bases[FSL_HW_PORTAL_PME].id[0] << 16) |
 | 
				
			||||||
 | 
								liodn_bases[FSL_HW_PORTAL_PME].id[1];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						out_be32(&pme->liodnbr, base);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void set_liodns(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						/* setup general liodn offsets */
 | 
				
			||||||
 | 
						set_liodn(liodn_tbl, liodn_tbl_sz);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* setup SEC block liodn bases & offsets if we have one */
 | 
				
			||||||
 | 
						if (IS_E_PROCESSOR(get_svr())) {
 | 
				
			||||||
 | 
							set_liodn(sec_liodn_tbl, sec_liodn_tbl_sz);
 | 
				
			||||||
 | 
							setup_sec_liodn_base();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* setup FMAN block(s) liodn bases & offsets if we have one */
 | 
				
			||||||
 | 
					#ifdef CONFIG_SYS_DPAA_FMAN
 | 
				
			||||||
 | 
						set_liodn(fman1_liodn_tbl, fman1_liodn_tbl_sz);
 | 
				
			||||||
 | 
						setup_fman_liodn_base(FSL_HW_PORTAL_FMAN1, fman1_liodn_tbl,
 | 
				
			||||||
 | 
									fman1_liodn_tbl_sz);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if (CONFIG_SYS_NUM_FMAN == 2)
 | 
				
			||||||
 | 
						set_liodn(fman2_liodn_tbl, fman2_liodn_tbl_sz);
 | 
				
			||||||
 | 
						setup_fman_liodn_base(FSL_HW_PORTAL_FMAN2, fman2_liodn_tbl,
 | 
				
			||||||
 | 
									fman2_liodn_tbl_sz);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						/* setup PME liodn base */
 | 
				
			||||||
 | 
						setup_pme_liodn_base();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void fdt_fixup_liodn_tbl(void *blob, struct liodn_id_table *tbl, int sz)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (i = 0; i < sz; i++) {
 | 
				
			||||||
 | 
							int off;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (tbl[i].compat == NULL)
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							off = fdt_node_offset_by_compat_reg(blob,
 | 
				
			||||||
 | 
									tbl[i].compat, tbl[i].compat_offset);
 | 
				
			||||||
 | 
							if (off >= 0) {
 | 
				
			||||||
 | 
								off = fdt_setprop(blob, off, "fsl,liodn",
 | 
				
			||||||
 | 
									&tbl[i].id[0],
 | 
				
			||||||
 | 
									sizeof(u32) * tbl[i].num_ids);
 | 
				
			||||||
 | 
								if (off > 0)
 | 
				
			||||||
 | 
									printf("WARNING unable to set fsl,liodn for "
 | 
				
			||||||
 | 
										"%s: %s\n",
 | 
				
			||||||
 | 
										tbl[i].compat, fdt_strerror(off));
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								debug("WARNING: could not set fsl,liodn for %s: %s.\n",
 | 
				
			||||||
 | 
										tbl[i].compat, fdt_strerror(off));
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void fdt_fixup_liodn(void *blob)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						fdt_fixup_liodn_tbl(blob, liodn_tbl, liodn_tbl_sz);
 | 
				
			||||||
 | 
					#ifdef CONFIG_SYS_DPAA_FMAN
 | 
				
			||||||
 | 
						fdt_fixup_liodn_tbl(blob, fman1_liodn_tbl, fman1_liodn_tbl_sz);
 | 
				
			||||||
 | 
					#if (CONFIG_SYS_NUM_FMAN == 2)
 | 
				
			||||||
 | 
						fdt_fixup_liodn_tbl(blob, fman2_liodn_tbl, fman2_liodn_tbl_sz);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						fdt_fixup_liodn_tbl(blob, sec_liodn_tbl, sec_liodn_tbl_sz);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,115 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright 2010 Freescale Semiconductor, 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 <common.h>
 | 
				
			||||||
 | 
					#include <asm/fsl_portals.h>
 | 
				
			||||||
 | 
					#include <asm/fsl_liodn.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct qportal_info qp_info[CONFIG_SYS_QMAN_NUM_PORTALS] = {
 | 
				
			||||||
 | 
						/* dqrr liodn, frame data liodn, liodn off, sdest */
 | 
				
			||||||
 | 
						SET_QP_INFO( 1,  2,  1, 0),
 | 
				
			||||||
 | 
						SET_QP_INFO( 3,  4,  2, 1),
 | 
				
			||||||
 | 
						SET_QP_INFO( 5,  6,  3, 2),
 | 
				
			||||||
 | 
						SET_QP_INFO( 7,  8,  4, 3),
 | 
				
			||||||
 | 
						SET_QP_INFO( 9, 10,  5, 4),
 | 
				
			||||||
 | 
						SET_QP_INFO(11, 12,  6, 5),
 | 
				
			||||||
 | 
						SET_QP_INFO(13, 14,  7, 6),
 | 
				
			||||||
 | 
						SET_QP_INFO(15, 16,  8, 7),
 | 
				
			||||||
 | 
						SET_QP_INFO(17, 18,  9, 0), /* for now sdest to 0 */
 | 
				
			||||||
 | 
						SET_QP_INFO(19, 20, 10, 0), /* for now sdest to 0 */
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct liodn_id_table liodn_tbl[] = {
 | 
				
			||||||
 | 
						SET_USB_LIODN(1, "fsl-usb2-mph", 127),
 | 
				
			||||||
 | 
						SET_USB_LIODN(2, "fsl-usb2-dr", 157),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						SET_SDHC_LIODN(1, 156),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						SET_PCI_LIODN(1, 193),
 | 
				
			||||||
 | 
						SET_PCI_LIODN(2, 194),
 | 
				
			||||||
 | 
						SET_PCI_LIODN(3, 195),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						SET_DMA_LIODN(1, 196),
 | 
				
			||||||
 | 
						SET_DMA_LIODN(2, 197),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						SET_GUTS_LIODN("fsl,rapidio-delta", 198, rio1liodnr, 0),
 | 
				
			||||||
 | 
						SET_GUTS_LIODN(NULL, 199, rio2liodnr, 0),
 | 
				
			||||||
 | 
						SET_GUTS_LIODN(NULL, 200, rmuliodnr, 0),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						SET_QMAN_LIODN(31),
 | 
				
			||||||
 | 
						SET_BMAN_LIODN(32),
 | 
				
			||||||
 | 
						SET_PME_LIODN(128),
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_SYS_DPAA_FMAN
 | 
				
			||||||
 | 
					struct liodn_id_table fman1_liodn_tbl[] = {
 | 
				
			||||||
 | 
						SET_FMAN_RX_1G_LIODN(1, 0, 11),
 | 
				
			||||||
 | 
						SET_FMAN_RX_1G_LIODN(1, 1, 12),
 | 
				
			||||||
 | 
						SET_FMAN_RX_1G_LIODN(1, 2, 13),
 | 
				
			||||||
 | 
						SET_FMAN_RX_1G_LIODN(1, 3, 14),
 | 
				
			||||||
 | 
						SET_FMAN_RX_10G_LIODN(1, 0, 15),
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if (CONFIG_SYS_NUM_FMAN == 2)
 | 
				
			||||||
 | 
					struct liodn_id_table fman2_liodn_tbl[] = {
 | 
				
			||||||
 | 
						SET_FMAN_RX_1G_LIODN(2, 0, 16),
 | 
				
			||||||
 | 
						SET_FMAN_RX_1G_LIODN(2, 1, 17),
 | 
				
			||||||
 | 
						SET_FMAN_RX_1G_LIODN(2, 2, 18),
 | 
				
			||||||
 | 
						SET_FMAN_RX_1G_LIODN(2, 3, 19),
 | 
				
			||||||
 | 
						SET_FMAN_RX_10G_LIODN(2, 0, 20),
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct liodn_id_table sec_liodn_tbl[] = {
 | 
				
			||||||
 | 
						SET_SEC_JQ_LIODN_ENTRY(0, 146, 154),
 | 
				
			||||||
 | 
						SET_SEC_JQ_LIODN_ENTRY(1, 147, 155),
 | 
				
			||||||
 | 
						SET_SEC_JQ_LIODN_ENTRY(2, 178, 186),
 | 
				
			||||||
 | 
						SET_SEC_JQ_LIODN_ENTRY(3, 179, 187),
 | 
				
			||||||
 | 
						SET_SEC_RTIC_LIODN_ENTRY(a, 144),
 | 
				
			||||||
 | 
						SET_SEC_RTIC_LIODN_ENTRY(b, 145),
 | 
				
			||||||
 | 
						SET_SEC_RTIC_LIODN_ENTRY(c, 176),
 | 
				
			||||||
 | 
						SET_SEC_RTIC_LIODN_ENTRY(d, 177),
 | 
				
			||||||
 | 
						SET_SEC_DECO_LIODN_ENTRY(0, 129, 161),
 | 
				
			||||||
 | 
						SET_SEC_DECO_LIODN_ENTRY(1, 130, 162),
 | 
				
			||||||
 | 
						SET_SEC_DECO_LIODN_ENTRY(2, 131, 163),
 | 
				
			||||||
 | 
						SET_SEC_DECO_LIODN_ENTRY(3, 132, 164),
 | 
				
			||||||
 | 
						SET_SEC_DECO_LIODN_ENTRY(4, 133, 165),
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct liodn_id_table liodn_bases[] = {
 | 
				
			||||||
 | 
						[FSL_HW_PORTAL_SEC]  = SET_LIODN_BASE_2(96, 106),
 | 
				
			||||||
 | 
					#ifdef CONFIG_SYS_DPAA_FMAN
 | 
				
			||||||
 | 
						[FSL_HW_PORTAL_FMAN1] = SET_LIODN_BASE_1(32),
 | 
				
			||||||
 | 
					#if (CONFIG_SYS_NUM_FMAN == 2)
 | 
				
			||||||
 | 
						[FSL_HW_PORTAL_FMAN2] = SET_LIODN_BASE_1(64),
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef CONFIG_SYS_DPAA_PME
 | 
				
			||||||
 | 
						[FSL_HW_PORTAL_PME]   = SET_LIODN_BASE_2(116, 133),
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int liodn_tbl_sz = ARRAY_SIZE(liodn_tbl);
 | 
				
			||||||
 | 
					int fman1_liodn_tbl_sz = ARRAY_SIZE(fman1_liodn_tbl);
 | 
				
			||||||
 | 
					int fman2_liodn_tbl_sz = ARRAY_SIZE(fman2_liodn_tbl);
 | 
				
			||||||
 | 
					int sec_liodn_tbl_sz = ARRAY_SIZE(sec_liodn_tbl);
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,98 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright 2009-2010 Freescale Semiconductor, 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 <common.h>
 | 
				
			||||||
 | 
					#include <asm/io.h>
 | 
				
			||||||
 | 
					#include <asm/fsl_serdes.h>
 | 
				
			||||||
 | 
					#include <asm/processor.h>
 | 
				
			||||||
 | 
					#include <asm/io.h>
 | 
				
			||||||
 | 
					#include "fsl_corenet_serdes.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static u8 serdes_cfg_tbl[][SRDS_MAX_LANES] = {
 | 
				
			||||||
 | 
						[0x2] = {PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1, PCIE1,
 | 
				
			||||||
 | 
							AURORA, AURORA, XAUI_FM2, XAUI_FM2, XAUI_FM2, XAUI_FM2,
 | 
				
			||||||
 | 
							XAUI_FM1, XAUI_FM1, XAUI_FM1, XAUI_FM1},
 | 
				
			||||||
 | 
						[0x5] = {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE2, PCIE2, PCIE2,
 | 
				
			||||||
 | 
							AURORA, AURORA, XAUI_FM2, XAUI_FM2, XAUI_FM2, XAUI_FM2,
 | 
				
			||||||
 | 
							XAUI_FM1, XAUI_FM1, XAUI_FM1, XAUI_FM1},
 | 
				
			||||||
 | 
						[0x8] = {PCIE1, PCIE1, PCIE3, PCIE3, PCIE2, PCIE2, PCIE2, PCIE2,
 | 
				
			||||||
 | 
							AURORA, AURORA, XAUI_FM2, XAUI_FM2, XAUI_FM2, XAUI_FM2,
 | 
				
			||||||
 | 
							XAUI_FM1, XAUI_FM1, XAUI_FM1, XAUI_FM1},
 | 
				
			||||||
 | 
						[0xd] = {PCIE1, PCIE1, PCIE1, PCIE1, PCIE2, PCIE2, SGMII_FM2_DTSEC3,
 | 
				
			||||||
 | 
							SGMII_FM2_DTSEC4, AURORA, AURORA, XAUI_FM2, XAUI_FM2, XAUI_FM2,
 | 
				
			||||||
 | 
							XAUI_FM2, XAUI_FM1, XAUI_FM1, XAUI_FM1, XAUI_FM1},
 | 
				
			||||||
 | 
						[0xe] = {PCIE1, PCIE1, PCIE3, PCIE3, PCIE2, PCIE2, SGMII_FM2_DTSEC3,
 | 
				
			||||||
 | 
							SGMII_FM2_DTSEC4, AURORA, AURORA, XAUI_FM2, XAUI_FM2, XAUI_FM2,
 | 
				
			||||||
 | 
							XAUI_FM2, XAUI_FM1, XAUI_FM1, XAUI_FM1, XAUI_FM1},
 | 
				
			||||||
 | 
						[0xf] = {PCIE1, PCIE1, PCIE1, PCIE1, SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
 | 
				
			||||||
 | 
							SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4, AURORA, AURORA, XAUI_FM2,
 | 
				
			||||||
 | 
							XAUI_FM2, XAUI_FM2, XAUI_FM2, NONE, NONE, NONE, NONE},
 | 
				
			||||||
 | 
						[0x10] = {PCIE1, PCIE1, PCIE3, PCIE3, SGMII_FM2_DTSEC1,
 | 
				
			||||||
 | 
							SGMII_FM2_DTSEC2, SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4,
 | 
				
			||||||
 | 
							AURORA, AURORA, XAUI_FM2, XAUI_FM2, XAUI_FM2, XAUI_FM2,
 | 
				
			||||||
 | 
							NONE, NONE, NONE, NONE},
 | 
				
			||||||
 | 
						[0x13] = {SRIO2, SRIO2, SRIO2, SRIO2, SRIO1, SRIO1, SRIO1, SRIO1,
 | 
				
			||||||
 | 
							AURORA, AURORA, XAUI_FM2, XAUI_FM2, XAUI_FM2, XAUI_FM2,
 | 
				
			||||||
 | 
							XAUI_FM1, XAUI_FM1, XAUI_FM1, XAUI_FM1},
 | 
				
			||||||
 | 
						[0x16] = {SRIO2, SRIO2, SRIO2, SRIO2, SRIO1, SRIO1, SRIO1, SRIO1,
 | 
				
			||||||
 | 
							AURORA, AURORA, SGMII_FM2_DTSEC1, SGMII_FM2_DTSEC2,
 | 
				
			||||||
 | 
							SGMII_FM2_DTSEC3, SGMII_FM2_DTSEC4, SGMII_FM1_DTSEC1,
 | 
				
			||||||
 | 
							SGMII_FM1_DTSEC2, SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4},
 | 
				
			||||||
 | 
						[0x19] = {SRIO2, SRIO2, SRIO2, SRIO2, SRIO1, SRIO1, SRIO1, SRIO1,
 | 
				
			||||||
 | 
							AURORA, AURORA, PCIE3, PCIE3, PCIE3, PCIE3, SGMII_FM1_DTSEC1,
 | 
				
			||||||
 | 
							SGMII_FM1_DTSEC2, SGMII_FM1_DTSEC3, SGMII_FM1_DTSEC4},
 | 
				
			||||||
 | 
						[0x1d] = {PCIE1, PCIE1, PCIE3, PCIE3, NONE, SRIO2, NONE, SRIO1,
 | 
				
			||||||
 | 
							AURORA, AURORA, XAUI_FM2, XAUI_FM2, XAUI_FM2, XAUI_FM2,
 | 
				
			||||||
 | 
							XAUI_FM1, XAUI_FM1, XAUI_FM1, XAUI_FM1},
 | 
				
			||||||
 | 
						[0x22] = {PCIE1, PCIE1, PCIE1, PCIE1, SRIO1, SRIO1, SRIO1, SRIO1,
 | 
				
			||||||
 | 
							AURORA, AURORA, XAUI_FM2, XAUI_FM2, XAUI_FM2, XAUI_FM2,
 | 
				
			||||||
 | 
							XAUI_FM1, XAUI_FM1, XAUI_FM1, XAUI_FM1},
 | 
				
			||||||
 | 
						[0x25] = {PCIE1, PCIE1, PCIE3, PCIE3, SRIO1, SRIO1, SRIO1, SRIO1,
 | 
				
			||||||
 | 
							AURORA, AURORA, XAUI_FM2, XAUI_FM2, XAUI_FM2, XAUI_FM2,
 | 
				
			||||||
 | 
							XAUI_FM1, XAUI_FM1, XAUI_FM1, XAUI_FM1},
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_SYS_P4080_ERRATUM_SERDES8
 | 
				
			||||||
 | 
					uint16_t srds_lpd_b[SRDS_MAX_BANK];
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					enum srds_prtcl serdes_get_prtcl(int cfg, int lane)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (!serdes_lane_enabled(lane))
 | 
				
			||||||
 | 
							return NONE;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return serdes_cfg_tbl[cfg][lane];
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int is_serdes_prtcl_valid(u32 prtcl) {
 | 
				
			||||||
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (prtcl > ARRAY_SIZE(serdes_cfg_tbl))
 | 
				
			||||||
 | 
							return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (i = 0; i < SRDS_MAX_LANES; i++) {
 | 
				
			||||||
 | 
							if (serdes_cfg_tbl[prtcl][i] != NONE)
 | 
				
			||||||
 | 
								return 1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,238 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright 2008-2010 Freescale Semiconductor, 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 <common.h>
 | 
				
			||||||
 | 
					#include <libfdt.h>
 | 
				
			||||||
 | 
					#include <fdt_support.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <asm/processor.h>
 | 
				
			||||||
 | 
					#include <asm/io.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <asm/fsl_portals.h>
 | 
				
			||||||
 | 
					#include <asm/fsl_liodn.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static ccsr_qman_t *qman = (void *)CONFIG_SYS_FSL_CORENET_QMAN_ADDR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void setup_portals(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Set the Qman initiator BAR to match the LAW (for DQRR stashing) */
 | 
				
			||||||
 | 
					#ifdef CONFIG_PHYS_64BIT
 | 
				
			||||||
 | 
						out_be32(&qman->qcsp_bare, (u32)(CONFIG_SYS_QMAN_MEM_PHYS >> 32));
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
						out_be32(&qman->qcsp_bar, (u32)CONFIG_SYS_QMAN_MEM_PHYS);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (i = 0; i < CONFIG_SYS_QMAN_NUM_PORTALS; i++) {
 | 
				
			||||||
 | 
							u8 sdest = qp_info[i].sdest;
 | 
				
			||||||
 | 
							u16 fliodn = qp_info[i].fliodn;
 | 
				
			||||||
 | 
							u16 dliodn = qp_info[i].dliodn;
 | 
				
			||||||
 | 
							u16 liodn_off = qp_info[i].liodn_offset;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							out_be32(&qman->qcsp[i].qcsp_lio_cfg, (liodn_off << 16) |
 | 
				
			||||||
 | 
										dliodn);
 | 
				
			||||||
 | 
							/* set frame liodn */
 | 
				
			||||||
 | 
							out_be32(&qman->qcsp[i].qcsp_io_cfg, (sdest << 16) | fliodn);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* Update portal containter to match LAW setup of portal in phy map */
 | 
				
			||||||
 | 
					void fdt_portal(void *blob, const char *compat, const char *container,
 | 
				
			||||||
 | 
								u64 addr, u32 size)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int off;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						off = fdt_node_offset_by_compatible(blob, -1, compat);
 | 
				
			||||||
 | 
						if (off < 0)
 | 
				
			||||||
 | 
							return ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						off = fdt_parent_offset(blob, off);
 | 
				
			||||||
 | 
						/* if non-zero assume we have a container */
 | 
				
			||||||
 | 
						if (off > 0) {
 | 
				
			||||||
 | 
							char buf[60];
 | 
				
			||||||
 | 
							const char *p, *name;
 | 
				
			||||||
 | 
							u32 *range;
 | 
				
			||||||
 | 
							int len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* fixup ranges */
 | 
				
			||||||
 | 
							range = fdt_getprop_w(blob, off, "ranges", &len);
 | 
				
			||||||
 | 
							if (range == NULL) {
 | 
				
			||||||
 | 
								printf("ERROR: container for %s has no ranges", compat);
 | 
				
			||||||
 | 
								return ;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							range[0] = 0;
 | 
				
			||||||
 | 
							if (len == 16) {
 | 
				
			||||||
 | 
								range[1] = addr >> 32;
 | 
				
			||||||
 | 
								range[2] = addr & 0xffffffff;
 | 
				
			||||||
 | 
								range[3] = size;
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								range[1] = addr & 0xffffffff;
 | 
				
			||||||
 | 
								range[2] = size;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							fdt_setprop_inplace(blob, off, "ranges", range, len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* fixup the name */
 | 
				
			||||||
 | 
							name = fdt_get_name(blob, off, &len);
 | 
				
			||||||
 | 
							p = memchr(name, '@', len);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (p)
 | 
				
			||||||
 | 
								len = p - name;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							/* if we are given a container name check it
 | 
				
			||||||
 | 
							 * against what we found, if it doesnt match exit out */
 | 
				
			||||||
 | 
							if (container && (memcmp(container, name, len))) {
 | 
				
			||||||
 | 
								printf("WARNING: container names didn't match %s %s\n",
 | 
				
			||||||
 | 
									container, name);
 | 
				
			||||||
 | 
								return ;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							memcpy(&buf, name, len);
 | 
				
			||||||
 | 
							len += sprintf(&buf[len], "@%llx", addr);
 | 
				
			||||||
 | 
							fdt_set_name(blob, off, buf);
 | 
				
			||||||
 | 
							return ;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						printf("ERROR: %s isn't in a container.  Not supported\n", compat);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int fdt_qportal(void *blob, int off, int id, char *name,
 | 
				
			||||||
 | 
							       enum fsl_dpaa_dev dev, int create)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int childoff, dev_off, num, ret = 0;
 | 
				
			||||||
 | 
						uint32_t dev_handle;
 | 
				
			||||||
 | 
						u32 liodns[2];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						childoff = fdt_subnode_offset(blob, off, name);
 | 
				
			||||||
 | 
						if (create) {
 | 
				
			||||||
 | 
							if (childoff <= 0)
 | 
				
			||||||
 | 
								childoff = fdt_add_subnode(blob, off, name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (childoff > 0) {
 | 
				
			||||||
 | 
								char handle[64], *p;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								strncpy(handle, name, sizeof(handle));
 | 
				
			||||||
 | 
								p = strchr(handle, '@');
 | 
				
			||||||
 | 
								if (!strncmp(name, "fman", 4)) {
 | 
				
			||||||
 | 
									*p = *(p + 1);
 | 
				
			||||||
 | 
									p++;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								*p = '\0';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								dev_off = fdt_path_offset(blob, handle);
 | 
				
			||||||
 | 
								if (dev_off < 0)
 | 
				
			||||||
 | 
									return dev_off;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								dev_handle = fdt_get_phandle(blob, dev_off);
 | 
				
			||||||
 | 
								if (dev_handle <= 0) {
 | 
				
			||||||
 | 
									dev_handle = fdt_alloc_phandle(blob);
 | 
				
			||||||
 | 
									fdt_setprop_cell(blob, dev_off,
 | 
				
			||||||
 | 
										"linux,phandle", dev_handle);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								ret = fdt_setprop(blob, childoff, "dev-handle",
 | 
				
			||||||
 | 
										  &dev_handle, sizeof(dev_handle));
 | 
				
			||||||
 | 
								if (ret < 0)
 | 
				
			||||||
 | 
									return ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								num = get_dpaa_liodn(dev, &liodns[0], id);
 | 
				
			||||||
 | 
								ret = fdt_setprop(blob, childoff, "fsl,liodn",
 | 
				
			||||||
 | 
										  &liodns[0], sizeof(u32) * num);
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								return childoff;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							if (childoff > 0)
 | 
				
			||||||
 | 
								ret = fdt_del_node(blob, childoff);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void fdt_fixup_qportals(void *blob)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int off, err;
 | 
				
			||||||
 | 
						unsigned int maj, min;
 | 
				
			||||||
 | 
						u32 rev_1 = in_be32(&qman->ip_rev_1);
 | 
				
			||||||
 | 
						char compat[64];
 | 
				
			||||||
 | 
						int compat_len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						maj = (rev_1 >> 8) & 0xff;
 | 
				
			||||||
 | 
						min = rev_1 & 0xff;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						compat_len = sprintf(compat, "fsl,qman-portal-%u.%u", maj, min) + 1;
 | 
				
			||||||
 | 
						compat_len += sprintf(compat + compat_len, "fsl,qman-portal") + 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						off = fdt_node_offset_by_compatible(blob, -1, "fsl,qman-portal");
 | 
				
			||||||
 | 
						while (off != -FDT_ERR_NOTFOUND) {
 | 
				
			||||||
 | 
							u32 liodns[2];
 | 
				
			||||||
 | 
							const int *ci = fdt_getprop(blob, off, "cell-index", NULL);
 | 
				
			||||||
 | 
							int j, i = *ci;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							err = fdt_setprop(blob, off, "compatible", compat, compat_len);
 | 
				
			||||||
 | 
							if (err < 0)
 | 
				
			||||||
 | 
								goto err;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							liodns[0] = qp_info[i].dliodn;
 | 
				
			||||||
 | 
							liodns[1] = qp_info[i].fliodn;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							err = fdt_setprop(blob, off, "fsl,liodn",
 | 
				
			||||||
 | 
									  &liodns, sizeof(u32) * 2);
 | 
				
			||||||
 | 
							if (err < 0)
 | 
				
			||||||
 | 
								goto err;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							i++;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							err = fdt_qportal(blob, off, i, "crypto@0", FSL_HW_PORTAL_SEC,
 | 
				
			||||||
 | 
									  IS_E_PROCESSOR(get_svr()));
 | 
				
			||||||
 | 
							if (err < 0)
 | 
				
			||||||
 | 
								goto err;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_SYS_DPAA_PME
 | 
				
			||||||
 | 
							err = fdt_qportal(blob, off, i, "pme@0", FSL_HW_PORTAL_PME, 1);
 | 
				
			||||||
 | 
							if (err < 0)
 | 
				
			||||||
 | 
								goto err;
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
							fdt_qportal(blob, off, i, "pme@0", FSL_HW_PORTAL_PME, 0);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef CONFIG_SYS_DPAA_FMAN
 | 
				
			||||||
 | 
							for (j = 0; j < CONFIG_SYS_NUM_FMAN; j++) {
 | 
				
			||||||
 | 
								char name[] = "fman@0";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								name[sizeof(name) - 2] = '0' + j;
 | 
				
			||||||
 | 
								err = fdt_qportal(blob, off, i, name,
 | 
				
			||||||
 | 
										  FSL_HW_PORTAL_FMAN1 + j, 1);
 | 
				
			||||||
 | 
								if (err < 0)
 | 
				
			||||||
 | 
									goto err;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					err:
 | 
				
			||||||
 | 
							if (err < 0) {
 | 
				
			||||||
 | 
								printf("ERROR: unable to create props for %s: %s\n",
 | 
				
			||||||
 | 
									fdt_get_name(blob, off, NULL), fdt_strerror(err));
 | 
				
			||||||
 | 
								return;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							off = fdt_node_offset_by_compatible(blob, off, "fsl,qman-portal");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -136,6 +136,12 @@ __secondary_start_page:
 | 
				
			||||||
	mtspr	L1CSR2,r8
 | 
						mtspr	L1CSR2,r8
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(CONFIG_SYS_P4080_ERRATUM_CPU22)
 | 
				
			||||||
 | 
						mfspr	r8,L1CSR2
 | 
				
			||||||
 | 
						oris	r8,r8,(L1CSR2_DCWS)@h
 | 
				
			||||||
 | 
						mtspr	L1CSR2,r8
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_BACKSIDE_L2_CACHE
 | 
					#ifdef CONFIG_BACKSIDE_L2_CACHE
 | 
				
			||||||
	/* Enable/invalidate the L2 cache */
 | 
						/* Enable/invalidate the L2 cache */
 | 
				
			||||||
	msync
 | 
						msync
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -330,8 +330,18 @@ _start_e500:
 | 
				
			||||||
	lis     r8,FSL_BOOKE_MAS2(CONFIG_SYS_INIT_RAM_ADDR, 0)@h
 | 
						lis     r8,FSL_BOOKE_MAS2(CONFIG_SYS_INIT_RAM_ADDR, 0)@h
 | 
				
			||||||
	ori     r8,r8,FSL_BOOKE_MAS2(CONFIG_SYS_INIT_RAM_ADDR, 0)@l
 | 
						ori     r8,r8,FSL_BOOKE_MAS2(CONFIG_SYS_INIT_RAM_ADDR, 0)@l
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(CONFIG_SYS_INIT_RAM_ADDR_PHYS_LOW) && \
 | 
				
			||||||
 | 
					    defined(CONFIG_SYS_INIT_RAM_ADDR_PHYS_HIGH)
 | 
				
			||||||
 | 
						lis     r9,FSL_BOOKE_MAS3(CONFIG_SYS_INIT_RAM_ADDR_PHYS_LOW, 0,
 | 
				
			||||||
 | 
									(MAS3_SX|MAS3_SW|MAS3_SR))@h
 | 
				
			||||||
 | 
						ori     r9,r9,FSL_BOOKE_MAS3(CONFIG_SYS_INIT_RAM_ADDR_PHYS_LOW, 0,
 | 
				
			||||||
 | 
									(MAS3_SX|MAS3_SW|MAS3_SR))@l
 | 
				
			||||||
 | 
						li      r10,CONFIG_SYS_INIT_RAM_ADDR_PHYS_HIGH
 | 
				
			||||||
 | 
						mtspr	MAS7,r10
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
	lis     r9,FSL_BOOKE_MAS3(CONFIG_SYS_INIT_RAM_ADDR, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@h
 | 
						lis     r9,FSL_BOOKE_MAS3(CONFIG_SYS_INIT_RAM_ADDR, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@h
 | 
				
			||||||
	ori     r9,r9,FSL_BOOKE_MAS3(CONFIG_SYS_INIT_RAM_ADDR, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@l
 | 
						ori     r9,r9,FSL_BOOKE_MAS3(CONFIG_SYS_INIT_RAM_ADDR, 0, (MAS3_SX|MAS3_SW|MAS3_SR))@l
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	mtspr   MAS0,r6
 | 
						mtspr   MAS0,r6
 | 
				
			||||||
	mtspr   MAS1,r7
 | 
						mtspr   MAS1,r7
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -266,7 +266,7 @@ int get_clocks_866 (void)
 | 
				
			||||||
	long		  cpuclk = 0;
 | 
						long		  cpuclk = 0;
 | 
				
			||||||
	long		  sccr_reg;
 | 
						long		  sccr_reg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (getenv_r ("cpuclk", tmp, sizeof (tmp)) > 0)
 | 
						if (getenv_f("cpuclk", tmp, sizeof (tmp)) > 0)
 | 
				
			||||||
		cpuclk = simple_strtoul (tmp, NULL, 10) * 1000000;
 | 
							cpuclk = simple_strtoul (tmp, NULL, 10) * 1000000;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((CONFIG_SYS_8xx_CPUCLK_MIN > cpuclk) || (CONFIG_SYS_8xx_CPUCLK_MAX < cpuclk))
 | 
						if ((CONFIG_SYS_8xx_CPUCLK_MIN > cpuclk) || (CONFIG_SYS_8xx_CPUCLK_MAX < cpuclk))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -110,8 +110,14 @@ struct cpu_type *identify_cpu(u32 ver)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int cpu_numcores() {
 | 
					int cpu_numcores() {
 | 
				
			||||||
	struct cpu_type *cpu;
 | 
						ccsr_pic_t __iomem *pic = (void *)CONFIG_SYS_MPC85xx_PIC_ADDR;
 | 
				
			||||||
	cpu = gd->cpu;
 | 
						struct cpu_type *cpu = gd->cpu;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* better to query feature reporting register than just assume 1 */
 | 
				
			||||||
 | 
						if (cpu == &cpu_type_unknown)
 | 
				
			||||||
 | 
							return ((in_be32(&pic->frr) & MPC85xx_PICFRR_NCPU_MASK) >>
 | 
				
			||||||
 | 
								MPC85xx_PICFRR_NCPU_SHIFT) + 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return cpu->num_cores;
 | 
						return cpu->num_cores;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -48,6 +48,9 @@ typedef struct {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	unsigned long long total_mem;
 | 
						unsigned long long total_mem;
 | 
				
			||||||
	unsigned long long base_address;
 | 
						unsigned long long base_address;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* DDR3 RDIMM */
 | 
				
			||||||
 | 
						unsigned char rcw[16];	/* Register Control Word 0-15 */
 | 
				
			||||||
} common_timing_params_t;
 | 
					} common_timing_params_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -93,7 +93,7 @@ static inline unsigned int compute_cas_write_latency(void)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Chip Select Configuration (CSn_CONFIG) */
 | 
					/* Chip Select Configuration (CSn_CONFIG) */
 | 
				
			||||||
static void set_csn_config(int i, fsl_ddr_cfg_regs_t *ddr,
 | 
					static void set_csn_config(int dimm_number, int i, fsl_ddr_cfg_regs_t *ddr,
 | 
				
			||||||
			       const memctl_options_t *popts,
 | 
								       const memctl_options_t *popts,
 | 
				
			||||||
			       const dimm_params_t *dimm_params)
 | 
								       const dimm_params_t *dimm_params)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -106,28 +106,49 @@ static void set_csn_config(int i, fsl_ddr_cfg_regs_t *ddr,
 | 
				
			||||||
	unsigned int ba_bits_cs_n = 0; /* Num of bank bits for SDRAM on CSn */
 | 
						unsigned int ba_bits_cs_n = 0; /* Num of bank bits for SDRAM on CSn */
 | 
				
			||||||
	unsigned int row_bits_cs_n = 0; /* Num of row bits for SDRAM on CSn */
 | 
						unsigned int row_bits_cs_n = 0; /* Num of row bits for SDRAM on CSn */
 | 
				
			||||||
	unsigned int col_bits_cs_n = 0; /* Num of ocl bits for SDRAM on CSn */
 | 
						unsigned int col_bits_cs_n = 0; /* Num of ocl bits for SDRAM on CSn */
 | 
				
			||||||
 | 
						int go_config = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Compute CS_CONFIG only for existing ranks of each DIMM.  */
 | 
						/* Compute CS_CONFIG only for existing ranks of each DIMM.  */
 | 
				
			||||||
	if ((((i&1) == 0)
 | 
						switch (i) {
 | 
				
			||||||
	    && (dimm_params[i/2].n_ranks == 1))
 | 
						case 0:
 | 
				
			||||||
	    || (dimm_params[i/2].n_ranks == 2)) {
 | 
							if (dimm_params[dimm_number].n_ranks > 0) {
 | 
				
			||||||
		unsigned int n_banks_per_sdram_device;
 | 
								go_config = 1;
 | 
				
			||||||
		cs_n_en = 1;
 | 
					 | 
				
			||||||
		if (i == 0) {
 | 
					 | 
				
			||||||
			/* These fields only available in CS0_CONFIG */
 | 
								/* These fields only available in CS0_CONFIG */
 | 
				
			||||||
			intlv_en = popts->memctl_interleaving;
 | 
								intlv_en = popts->memctl_interleaving;
 | 
				
			||||||
			intlv_ctl = popts->memctl_interleaving_mode;
 | 
								intlv_ctl = popts->memctl_interleaving_mode;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						case 1:
 | 
				
			||||||
 | 
							if ((dimm_number == 0 && dimm_params[0].n_ranks > 1) || \
 | 
				
			||||||
 | 
							    (dimm_number == 1 && dimm_params[1].n_ranks > 0))
 | 
				
			||||||
 | 
								go_config = 1;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						case 2:
 | 
				
			||||||
 | 
							if ((dimm_number == 0 && dimm_params[0].n_ranks > 2) || \
 | 
				
			||||||
 | 
							   (dimm_number > 1 && dimm_params[dimm_number].n_ranks > 0))
 | 
				
			||||||
 | 
								go_config = 1;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						case 3:
 | 
				
			||||||
 | 
							if ((dimm_number == 0 && dimm_params[0].n_ranks > 3) || \
 | 
				
			||||||
 | 
							    (dimm_number == 1 && dimm_params[1].n_ranks > 1) || \
 | 
				
			||||||
 | 
							    (dimm_number == 3 && dimm_params[3].n_ranks > 0))
 | 
				
			||||||
 | 
								go_config = 1;
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							break;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (go_config) {
 | 
				
			||||||
 | 
							unsigned int n_banks_per_sdram_device;
 | 
				
			||||||
 | 
							cs_n_en = 1;
 | 
				
			||||||
		ap_n_en = popts->cs_local_opts[i].auto_precharge;
 | 
							ap_n_en = popts->cs_local_opts[i].auto_precharge;
 | 
				
			||||||
		odt_rd_cfg = popts->cs_local_opts[i].odt_rd_cfg;
 | 
							odt_rd_cfg = popts->cs_local_opts[i].odt_rd_cfg;
 | 
				
			||||||
		odt_wr_cfg = popts->cs_local_opts[i].odt_wr_cfg;
 | 
							odt_wr_cfg = popts->cs_local_opts[i].odt_wr_cfg;
 | 
				
			||||||
		n_banks_per_sdram_device
 | 
							n_banks_per_sdram_device
 | 
				
			||||||
			= dimm_params[i/2].n_banks_per_sdram_device;
 | 
								= dimm_params[dimm_number].n_banks_per_sdram_device;
 | 
				
			||||||
		ba_bits_cs_n = __ilog2(n_banks_per_sdram_device) - 2;
 | 
							ba_bits_cs_n = __ilog2(n_banks_per_sdram_device) - 2;
 | 
				
			||||||
		row_bits_cs_n = dimm_params[i/2].n_row_addr - 12;
 | 
							row_bits_cs_n = dimm_params[dimm_number].n_row_addr - 12;
 | 
				
			||||||
		col_bits_cs_n = dimm_params[i/2].n_col_addr - 8;
 | 
							col_bits_cs_n = dimm_params[dimm_number].n_col_addr - 8;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					 | 
				
			||||||
	ddr->cs[i].config = (0
 | 
						ddr->cs[i].config = (0
 | 
				
			||||||
		| ((cs_n_en & 0x1) << 31)
 | 
							| ((cs_n_en & 0x1) << 31)
 | 
				
			||||||
		| ((intlv_en & 0x3) << 29)
 | 
							| ((intlv_en & 0x3) << 29)
 | 
				
			||||||
| 
						 | 
					@ -178,7 +199,7 @@ static void set_timing_cfg_0(fsl_ddr_cfg_regs_t *ddr)
 | 
				
			||||||
	unsigned char act_pd_exit_mclk;
 | 
						unsigned char act_pd_exit_mclk;
 | 
				
			||||||
	/* Precharge powerdown exit timing (tXP). */
 | 
						/* Precharge powerdown exit timing (tXP). */
 | 
				
			||||||
	unsigned char pre_pd_exit_mclk;
 | 
						unsigned char pre_pd_exit_mclk;
 | 
				
			||||||
	/* Precharge powerdown exit timing (tAXPD). */
 | 
						/* ODT powerdown exit timing (tAXPD). */
 | 
				
			||||||
	unsigned char taxpd_mclk;
 | 
						unsigned char taxpd_mclk;
 | 
				
			||||||
	/* Mode register set cycle time (tMRD). */
 | 
						/* Mode register set cycle time (tMRD). */
 | 
				
			||||||
	unsigned char tmrd_mclk;
 | 
						unsigned char tmrd_mclk;
 | 
				
			||||||
| 
						 | 
					@ -190,13 +211,13 @@ static void set_timing_cfg_0(fsl_ddr_cfg_regs_t *ddr)
 | 
				
			||||||
	 * we use the tXP instead of it.
 | 
						 * we use the tXP instead of it.
 | 
				
			||||||
	 * tXP=max(3nCK, 7.5ns) for DDR3.
 | 
						 * tXP=max(3nCK, 7.5ns) for DDR3.
 | 
				
			||||||
	 * spec has not the tAXPD, we use
 | 
						 * spec has not the tAXPD, we use
 | 
				
			||||||
	 * tAXPD=8, need design to confirm.
 | 
						 * tAXPD=1, need design to confirm.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	int tXP = max((get_memory_clk_period_ps() * 3), 7500); /* unit=ps */
 | 
						int tXP = max((get_memory_clk_period_ps() * 3), 7500); /* unit=ps */
 | 
				
			||||||
	act_pd_exit_mclk = picos_to_mclk(tXP);
 | 
						act_pd_exit_mclk = picos_to_mclk(tXP);
 | 
				
			||||||
	/* Mode register MR0[A12] is '1' - fast exit */
 | 
						/* Mode register MR0[A12] is '1' - fast exit */
 | 
				
			||||||
	pre_pd_exit_mclk = act_pd_exit_mclk;
 | 
						pre_pd_exit_mclk = act_pd_exit_mclk;
 | 
				
			||||||
	taxpd_mclk = 8;
 | 
						taxpd_mclk = 1;
 | 
				
			||||||
	tmrd_mclk = 4;
 | 
						tmrd_mclk = 4;
 | 
				
			||||||
	/* set the turnaround time */
 | 
						/* set the turnaround time */
 | 
				
			||||||
	trwt_mclk = 1;
 | 
						trwt_mclk = 1;
 | 
				
			||||||
| 
						 | 
					@ -427,6 +448,35 @@ static void set_timing_cfg_2(fsl_ddr_cfg_regs_t *ddr,
 | 
				
			||||||
	debug("FSLDDR: timing_cfg_2 = 0x%08x\n", ddr->timing_cfg_2);
 | 
						debug("FSLDDR: timing_cfg_2 = 0x%08x\n", ddr->timing_cfg_2);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* DDR SDRAM Register Control Word */
 | 
				
			||||||
 | 
					static void set_ddr_sdram_rcw(fsl_ddr_cfg_regs_t *ddr,
 | 
				
			||||||
 | 
								       const common_timing_params_t *common_dimm)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if (common_dimm->all_DIMMs_registered
 | 
				
			||||||
 | 
							&& !common_dimm->all_DIMMs_unbuffered) {
 | 
				
			||||||
 | 
							ddr->ddr_sdram_rcw_1 =
 | 
				
			||||||
 | 
								common_dimm->rcw[0] << 28 | \
 | 
				
			||||||
 | 
								common_dimm->rcw[1] << 24 | \
 | 
				
			||||||
 | 
								common_dimm->rcw[2] << 20 | \
 | 
				
			||||||
 | 
								common_dimm->rcw[3] << 16 | \
 | 
				
			||||||
 | 
								common_dimm->rcw[4] << 12 | \
 | 
				
			||||||
 | 
								common_dimm->rcw[5] << 8 | \
 | 
				
			||||||
 | 
								common_dimm->rcw[6] << 4 | \
 | 
				
			||||||
 | 
								common_dimm->rcw[7];
 | 
				
			||||||
 | 
							ddr->ddr_sdram_rcw_2 =
 | 
				
			||||||
 | 
								common_dimm->rcw[8] << 28 | \
 | 
				
			||||||
 | 
								common_dimm->rcw[9] << 24 | \
 | 
				
			||||||
 | 
								common_dimm->rcw[10] << 20 | \
 | 
				
			||||||
 | 
								common_dimm->rcw[11] << 16 | \
 | 
				
			||||||
 | 
								common_dimm->rcw[12] << 12 | \
 | 
				
			||||||
 | 
								common_dimm->rcw[13] << 8 | \
 | 
				
			||||||
 | 
								common_dimm->rcw[14] << 4 | \
 | 
				
			||||||
 | 
								common_dimm->rcw[15];
 | 
				
			||||||
 | 
							debug("FSLDDR: ddr_sdram_rcw_1 = 0x%08x\n", ddr->ddr_sdram_rcw_1);
 | 
				
			||||||
 | 
							debug("FSLDDR: ddr_sdram_rcw_2 = 0x%08x\n", ddr->ddr_sdram_rcw_2);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* DDR SDRAM control configuration (DDR_SDRAM_CFG) */
 | 
					/* DDR SDRAM control configuration (DDR_SDRAM_CFG) */
 | 
				
			||||||
static void set_ddr_sdram_cfg(fsl_ddr_cfg_regs_t *ddr,
 | 
					static void set_ddr_sdram_cfg(fsl_ddr_cfg_regs_t *ddr,
 | 
				
			||||||
			       const memctl_options_t *popts,
 | 
								       const memctl_options_t *popts,
 | 
				
			||||||
| 
						 | 
					@ -521,6 +571,7 @@ static void set_ddr_sdram_cfg_2(fsl_ddr_cfg_regs_t *ddr,
 | 
				
			||||||
	unsigned int d_init;		/* DRAM data initialization */
 | 
						unsigned int d_init;		/* DRAM data initialization */
 | 
				
			||||||
	unsigned int rcw_en = 0;	/* Register Control Word Enable */
 | 
						unsigned int rcw_en = 0;	/* Register Control Word Enable */
 | 
				
			||||||
	unsigned int md_en = 0;		/* Mirrored DIMM Enable */
 | 
						unsigned int md_en = 0;		/* Mirrored DIMM Enable */
 | 
				
			||||||
 | 
						unsigned int qd_en = 0;		/* quad-rank DIMM Enable */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	dll_rst_dis = 1;	/* Make this configurable */
 | 
						dll_rst_dis = 1;	/* Make this configurable */
 | 
				
			||||||
	dqs_cfg = popts->DQS_config;
 | 
						dqs_cfg = popts->DQS_config;
 | 
				
			||||||
| 
						 | 
					@ -562,6 +613,7 @@ static void set_ddr_sdram_cfg_2(fsl_ddr_cfg_regs_t *ddr,
 | 
				
			||||||
#if defined(CONFIG_FSL_DDR3)
 | 
					#if defined(CONFIG_FSL_DDR3)
 | 
				
			||||||
	md_en = popts->mirrored_dimm;
 | 
						md_en = popts->mirrored_dimm;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
						qd_en = popts->quad_rank_present ? 1 : 0;
 | 
				
			||||||
	ddr->ddr_sdram_cfg_2 = (0
 | 
						ddr->ddr_sdram_cfg_2 = (0
 | 
				
			||||||
		| ((frc_sr & 0x1) << 31)
 | 
							| ((frc_sr & 0x1) << 31)
 | 
				
			||||||
		| ((sr_ie & 0x1) << 30)
 | 
							| ((sr_ie & 0x1) << 30)
 | 
				
			||||||
| 
						 | 
					@ -569,6 +621,7 @@ static void set_ddr_sdram_cfg_2(fsl_ddr_cfg_regs_t *ddr,
 | 
				
			||||||
		| ((dqs_cfg & 0x3) << 26)
 | 
							| ((dqs_cfg & 0x3) << 26)
 | 
				
			||||||
		| ((odt_cfg & 0x3) << 21)
 | 
							| ((odt_cfg & 0x3) << 21)
 | 
				
			||||||
		| ((num_pr & 0xf) << 12)
 | 
							| ((num_pr & 0xf) << 12)
 | 
				
			||||||
 | 
							| (qd_en << 9)
 | 
				
			||||||
		| ((obc_cfg & 0x1) << 6)
 | 
							| ((obc_cfg & 0x1) << 6)
 | 
				
			||||||
		| ((ap_en & 0x1) << 5)
 | 
							| ((ap_en & 0x1) << 5)
 | 
				
			||||||
		| ((d_init & 0x1) << 4)
 | 
							| ((d_init & 0x1) << 4)
 | 
				
			||||||
| 
						 | 
					@ -914,6 +967,7 @@ static void set_ddr_sdram_clk_cntl(fsl_ddr_cfg_regs_t *ddr,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	clk_adjust = popts->clk_adjust;
 | 
						clk_adjust = popts->clk_adjust;
 | 
				
			||||||
	ddr->ddr_sdram_clk_cntl = (clk_adjust & 0xF) << 23;
 | 
						ddr->ddr_sdram_clk_cntl = (clk_adjust & 0xF) << 23;
 | 
				
			||||||
 | 
						debug("FSLDDR: clk_cntl = 0x%08x\n", ddr->ddr_sdram_clk_cntl);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* DDR Initialization Address (DDR_INIT_ADDR) */
 | 
					/* DDR Initialization Address (DDR_INIT_ADDR) */
 | 
				
			||||||
| 
						 | 
					@ -977,9 +1031,9 @@ static void set_timing_cfg_5(fsl_ddr_cfg_regs_t *ddr)
 | 
				
			||||||
	unsigned int wodt_off = 0;	/* Write to ODT off */
 | 
						unsigned int wodt_off = 0;	/* Write to ODT off */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(CONFIG_FSL_DDR3)
 | 
					#if defined(CONFIG_FSL_DDR3)
 | 
				
			||||||
	rodt_on = 3;	/*  2 clocks */
 | 
						rodt_on = 2;	/*  2 clocks */
 | 
				
			||||||
	rodt_off = 4;	/*  4 clocks */
 | 
						rodt_off = 4;	/*  4 clocks */
 | 
				
			||||||
	wodt_on = 2;	/*  1 clocks */
 | 
						wodt_on = 1;	/*  1 clocks */
 | 
				
			||||||
	wodt_off = 4;	/*  4 clocks */
 | 
						wodt_off = 4;	/*  4 clocks */
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1052,9 +1106,9 @@ static void set_ddr_wrlvl_cntl(fsl_ddr_cfg_regs_t *ddr, unsigned int wrlvl_en,
 | 
				
			||||||
		/*
 | 
							/*
 | 
				
			||||||
		 * Write leveling repetition time
 | 
							 * Write leveling repetition time
 | 
				
			||||||
		 * at least tWLO + 6 clocks clocks
 | 
							 * at least tWLO + 6 clocks clocks
 | 
				
			||||||
		 * we set it 32
 | 
							 * we set it 64
 | 
				
			||||||
		 */
 | 
							 */
 | 
				
			||||||
		wrlvl_wlr = 0x5;
 | 
							wrlvl_wlr = 0x6;
 | 
				
			||||||
		/*
 | 
							/*
 | 
				
			||||||
		 * Write leveling start time
 | 
							 * Write leveling start time
 | 
				
			||||||
		 * The value use for the DQS_ADJUST for the first sample
 | 
							 * The value use for the DQS_ADJUST for the first sample
 | 
				
			||||||
| 
						 | 
					@ -1089,52 +1143,12 @@ static void set_ddr_sr_cntr(fsl_ddr_cfg_regs_t *ddr, unsigned int sr_it)
 | 
				
			||||||
	ddr->ddr_sr_cntr = (sr_it & 0xF) << 16;
 | 
						ddr->ddr_sr_cntr = (sr_it & 0xF) << 16;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* DDR SDRAM Register Control Word 1 (DDR_SDRAM_RCW_1) */
 | 
					static void set_ddr_eor(fsl_ddr_cfg_regs_t *ddr, const memctl_options_t *popts)
 | 
				
			||||||
static void set_ddr_sdram_rcw_1(fsl_ddr_cfg_regs_t *ddr)
 | 
					 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unsigned int rcw0 = 0;	/* RCW0: Register Control Word 0 */
 | 
						if (popts->addr_hash) {
 | 
				
			||||||
	unsigned int rcw1 = 0;	/* RCW1: Register Control Word 1 */
 | 
							ddr->ddr_eor = 0x40000000;	/* address hash enable */
 | 
				
			||||||
	unsigned int rcw2 = 0;	/* RCW2: Register Control Word 2 */
 | 
							puts("Addess hashing enabled.\n");
 | 
				
			||||||
	unsigned int rcw3 = 0;	/* RCW3: Register Control Word 3 */
 | 
					 | 
				
			||||||
	unsigned int rcw4 = 0;	/* RCW4: Register Control Word 4 */
 | 
					 | 
				
			||||||
	unsigned int rcw5 = 0;	/* RCW5: Register Control Word 5 */
 | 
					 | 
				
			||||||
	unsigned int rcw6 = 0;	/* RCW6: Register Control Word 6 */
 | 
					 | 
				
			||||||
	unsigned int rcw7 = 0;	/* RCW7: Register Control Word 7 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ddr->ddr_sdram_rcw_1 = (0
 | 
					 | 
				
			||||||
				| ((rcw0 & 0xF) << 28)
 | 
					 | 
				
			||||||
				| ((rcw1 & 0xF) << 24)
 | 
					 | 
				
			||||||
				| ((rcw2 & 0xF) << 20)
 | 
					 | 
				
			||||||
				| ((rcw3 & 0xF) << 16)
 | 
					 | 
				
			||||||
				| ((rcw4 & 0xF) << 12)
 | 
					 | 
				
			||||||
				| ((rcw5 & 0xF) << 8)
 | 
					 | 
				
			||||||
				| ((rcw6 & 0xF) << 4)
 | 
					 | 
				
			||||||
				| ((rcw7 & 0xF) << 0)
 | 
					 | 
				
			||||||
				);
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					 | 
				
			||||||
/* DDR SDRAM Register Control Word 2 (DDR_SDRAM_RCW_2) */
 | 
					 | 
				
			||||||
static void set_ddr_sdram_rcw_2(fsl_ddr_cfg_regs_t *ddr)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	unsigned int rcw8 = 0;	/* RCW0: Register Control Word 8 */
 | 
					 | 
				
			||||||
	unsigned int rcw9 = 0;	/* RCW1: Register Control Word 9 */
 | 
					 | 
				
			||||||
	unsigned int rcw10 = 0;	/* RCW2: Register Control Word 10 */
 | 
					 | 
				
			||||||
	unsigned int rcw11 = 0;	/* RCW3: Register Control Word 11 */
 | 
					 | 
				
			||||||
	unsigned int rcw12 = 0;	/* RCW4: Register Control Word 12 */
 | 
					 | 
				
			||||||
	unsigned int rcw13 = 0;	/* RCW5: Register Control Word 13 */
 | 
					 | 
				
			||||||
	unsigned int rcw14 = 0;	/* RCW6: Register Control Word 14 */
 | 
					 | 
				
			||||||
	unsigned int rcw15 = 0;	/* RCW7: Register Control Word 15 */
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	ddr->ddr_sdram_rcw_2 = (0
 | 
					 | 
				
			||||||
				| ((rcw8 & 0xF) << 28)
 | 
					 | 
				
			||||||
				| ((rcw9 & 0xF) << 24)
 | 
					 | 
				
			||||||
				| ((rcw10 & 0xF) << 20)
 | 
					 | 
				
			||||||
				| ((rcw11 & 0xF) << 16)
 | 
					 | 
				
			||||||
				| ((rcw12 & 0xF) << 12)
 | 
					 | 
				
			||||||
				| ((rcw13 & 0xF) << 8)
 | 
					 | 
				
			||||||
				| ((rcw14 & 0xF) << 4)
 | 
					 | 
				
			||||||
				| ((rcw15 & 0xF) << 0)
 | 
					 | 
				
			||||||
				);
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
unsigned int
 | 
					unsigned int
 | 
				
			||||||
| 
						 | 
					@ -1201,37 +1215,63 @@ compute_fsl_memctl_config_regs(const memctl_options_t *popts,
 | 
				
			||||||
	/* Chip Select Memory Bounds (CSn_BNDS) */
 | 
						/* Chip Select Memory Bounds (CSn_BNDS) */
 | 
				
			||||||
	for (i = 0; i < CONFIG_CHIP_SELECTS_PER_CTRL; i++) {
 | 
						for (i = 0; i < CONFIG_CHIP_SELECTS_PER_CTRL; i++) {
 | 
				
			||||||
		unsigned long long ea = 0, sa = 0;
 | 
							unsigned long long ea = 0, sa = 0;
 | 
				
			||||||
 | 
							unsigned int cs_per_dimm
 | 
				
			||||||
 | 
								= CONFIG_CHIP_SELECTS_PER_CTRL / CONFIG_DIMM_SLOTS_PER_CTLR;
 | 
				
			||||||
 | 
							unsigned int dimm_number
 | 
				
			||||||
 | 
								= i / cs_per_dimm;
 | 
				
			||||||
 | 
							unsigned long long rank_density
 | 
				
			||||||
 | 
								= dimm_params[dimm_number].rank_density;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (popts->ba_intlv_ctl && (i > 0) &&
 | 
							if (((i == 1) && (popts->ba_intlv_ctl & FSL_DDR_CS0_CS1)) ||
 | 
				
			||||||
			((popts->ba_intlv_ctl & 0x60) != FSL_DDR_CS2_CS3 )) {
 | 
								((i == 2) && (popts->ba_intlv_ctl & 0x04)) ||
 | 
				
			||||||
			/* Don't set up boundaries for other CS
 | 
								((i == 3) && (popts->ba_intlv_ctl & FSL_DDR_CS2_CS3))) {
 | 
				
			||||||
			 * other than CS0, if bank interleaving
 | 
								/*
 | 
				
			||||||
			 * is enabled and not CS2+CS3 interleaved.
 | 
								 * Don't set up boundaries for unused CS
 | 
				
			||||||
 | 
								 * cs1 for cs0_cs1, cs0_cs1_and_cs2_cs3, cs0_cs1_cs2_cs3
 | 
				
			||||||
 | 
								 * cs2 for cs0_cs1_cs2_cs3
 | 
				
			||||||
 | 
								 * cs3 for cs2_cs3, cs0_cs1_and_cs2_cs3, cs0_cs1_cs2_cs3
 | 
				
			||||||
			 * But we need to set the ODT_RD_CFG and
 | 
								 * But we need to set the ODT_RD_CFG and
 | 
				
			||||||
			 * ODT_WR_CFG for CS1_CONFIG here.
 | 
								 * ODT_WR_CFG for CS1_CONFIG here.
 | 
				
			||||||
			 */
 | 
								 */
 | 
				
			||||||
			set_csn_config(i, ddr, popts, dimm_params);
 | 
								set_csn_config(dimm_number, i, ddr, popts, dimm_params);
 | 
				
			||||||
			break;
 | 
								continue;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							if (dimm_params[dimm_number].n_ranks == 0) {
 | 
				
			||||||
		if (dimm_params[i/2].n_ranks == 0) {
 | 
					 | 
				
			||||||
			debug("Skipping setup of CS%u "
 | 
								debug("Skipping setup of CS%u "
 | 
				
			||||||
				"because n_ranks on DIMM %u is 0\n", i, i/2);
 | 
									"because n_ranks on DIMM %u is 0\n", i, dimm_number);
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if (popts->memctl_interleaving && popts->ba_intlv_ctl) {
 | 
							if (popts->memctl_interleaving && popts->ba_intlv_ctl) {
 | 
				
			||||||
			/*
 | 
								/*
 | 
				
			||||||
			 * This works superbank 2CS
 | 
								 * This works superbank 2CS
 | 
				
			||||||
			 * There are 2 memory controllers configured
 | 
								 * There are 2 or more memory controllers configured
 | 
				
			||||||
			 * identically, memory is interleaved between them,
 | 
								 * identically, memory is interleaved between them,
 | 
				
			||||||
			 * and each controller uses rank interleaving within
 | 
								 * and each controller uses rank interleaving within
 | 
				
			||||||
			 * itself. Therefore the starting and ending address
 | 
								 * itself. Therefore the starting and ending address
 | 
				
			||||||
			 * on each controller is twice the amount present on
 | 
								 * on each controller is twice the amount present on
 | 
				
			||||||
			 * each controller.
 | 
								 * each controller.
 | 
				
			||||||
			 */
 | 
								 */
 | 
				
			||||||
			unsigned long long rank_density
 | 
								unsigned long long ctlr_density = 0;
 | 
				
			||||||
					= dimm_params[0].capacity;
 | 
								switch (popts->ba_intlv_ctl & FSL_DDR_CS0_CS1_CS2_CS3) {
 | 
				
			||||||
			ea = (2 * (rank_density >> dbw_cap_adj)) - 1;
 | 
								case FSL_DDR_CS0_CS1:
 | 
				
			||||||
 | 
								case FSL_DDR_CS0_CS1_AND_CS2_CS3:
 | 
				
			||||||
 | 
									ctlr_density = dimm_params[0].rank_density * 2;
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								case FSL_DDR_CS2_CS3:
 | 
				
			||||||
 | 
									ctlr_density = dimm_params[0].rank_density;
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								case FSL_DDR_CS0_CS1_CS2_CS3:
 | 
				
			||||||
 | 
									/*
 | 
				
			||||||
 | 
									 * The four CS interleaving should have been verified by
 | 
				
			||||||
 | 
									 * populate_memctl_options()
 | 
				
			||||||
 | 
									 */
 | 
				
			||||||
 | 
									ctlr_density = dimm_params[0].rank_density * 4;
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								default:
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								ea = (CONFIG_NUM_DDR_CONTROLLERS *
 | 
				
			||||||
 | 
									(ctlr_density >> dbw_cap_adj)) - 1;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		else if (!popts->memctl_interleaving && popts->ba_intlv_ctl) {
 | 
							else if (!popts->memctl_interleaving && popts->ba_intlv_ctl) {
 | 
				
			||||||
			/*
 | 
								/*
 | 
				
			||||||
| 
						 | 
					@ -1243,8 +1283,6 @@ compute_fsl_memctl_config_regs(const memctl_options_t *popts,
 | 
				
			||||||
			 * controller needs to be programmed into its
 | 
								 * controller needs to be programmed into its
 | 
				
			||||||
			 * respective CS0_BNDS.
 | 
								 * respective CS0_BNDS.
 | 
				
			||||||
			 */
 | 
								 */
 | 
				
			||||||
			unsigned long long rank_density
 | 
					 | 
				
			||||||
						= dimm_params[i/2].rank_density;
 | 
					 | 
				
			||||||
			switch (popts->ba_intlv_ctl & FSL_DDR_CS0_CS1_CS2_CS3) {
 | 
								switch (popts->ba_intlv_ctl & FSL_DDR_CS0_CS1_CS2_CS3) {
 | 
				
			||||||
			case FSL_DDR_CS0_CS1_CS2_CS3:
 | 
								case FSL_DDR_CS0_CS1_CS2_CS3:
 | 
				
			||||||
				/* CS0+CS1+CS2+CS3 interleaving, only CS0_CNDS
 | 
									/* CS0+CS1+CS2+CS3 interleaving, only CS0_CNDS
 | 
				
			||||||
| 
						 | 
					@ -1257,9 +1295,13 @@ compute_fsl_memctl_config_regs(const memctl_options_t *popts,
 | 
				
			||||||
				/* CS0+CS1 and CS2+CS3 interleaving, CS0_CNDS
 | 
									/* CS0+CS1 and CS2+CS3 interleaving, CS0_CNDS
 | 
				
			||||||
				 * and CS2_CNDS need to be set.
 | 
									 * and CS2_CNDS need to be set.
 | 
				
			||||||
				 */
 | 
									 */
 | 
				
			||||||
				if (!(i&1)) {
 | 
									if ((i == 2) && (dimm_number == 0)) {
 | 
				
			||||||
					sa = dimm_params[i/2].base_address;
 | 
										sa = dimm_params[dimm_number].base_address +
 | 
				
			||||||
					ea = sa + (i * (rank_density >>
 | 
										      2 * (rank_density >> dbw_cap_adj);
 | 
				
			||||||
 | 
										ea = sa + 2 * (rank_density >> dbw_cap_adj) - 1;
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
 | 
										sa = dimm_params[dimm_number].base_address;
 | 
				
			||||||
 | 
										ea = sa + (2 * (rank_density >>
 | 
				
			||||||
						dbw_cap_adj)) - 1;
 | 
											dbw_cap_adj)) - 1;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
| 
						 | 
					@ -1267,16 +1309,31 @@ compute_fsl_memctl_config_regs(const memctl_options_t *popts,
 | 
				
			||||||
				/* CS0+CS1 interleaving, CS0_CNDS needs
 | 
									/* CS0+CS1 interleaving, CS0_CNDS needs
 | 
				
			||||||
				 * to be set
 | 
									 * to be set
 | 
				
			||||||
				 */
 | 
									 */
 | 
				
			||||||
				sa = common_dimm->base_address;
 | 
									if (dimm_params[dimm_number].n_ranks > (i % cs_per_dimm)) {
 | 
				
			||||||
				ea = sa + (2 * (rank_density >> dbw_cap_adj))-1;
 | 
										sa = dimm_params[dimm_number].base_address;
 | 
				
			||||||
 | 
										ea = sa + (rank_density >> dbw_cap_adj) - 1;
 | 
				
			||||||
 | 
										sa += (i % cs_per_dimm) * (rank_density >> dbw_cap_adj);
 | 
				
			||||||
 | 
										ea += (i % cs_per_dimm) * (rank_density >> dbw_cap_adj);
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
 | 
										sa = 0;
 | 
				
			||||||
 | 
										ea = 0;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									if (i == 0)
 | 
				
			||||||
 | 
										ea += (rank_density >> dbw_cap_adj);
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
			case FSL_DDR_CS2_CS3:
 | 
								case FSL_DDR_CS2_CS3:
 | 
				
			||||||
				/* CS2+CS3 interleaving*/
 | 
									/* CS2+CS3 interleaving*/
 | 
				
			||||||
				if (i == 2) {
 | 
									if (dimm_params[dimm_number].n_ranks > (i % cs_per_dimm)) {
 | 
				
			||||||
					sa = dimm_params[i/2].base_address;
 | 
										sa = dimm_params[dimm_number].base_address;
 | 
				
			||||||
					ea = sa + (2 * (rank_density >>
 | 
										ea = sa + (rank_density >> dbw_cap_adj) - 1;
 | 
				
			||||||
						dbw_cap_adj)) - 1;
 | 
										sa += (i % cs_per_dimm) * (rank_density >> dbw_cap_adj);
 | 
				
			||||||
 | 
										ea += (i % cs_per_dimm) * (rank_density >> dbw_cap_adj);
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
 | 
										sa = 0;
 | 
				
			||||||
 | 
										ea = 0;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
									if (i == 2)
 | 
				
			||||||
 | 
										ea += (rank_density >> dbw_cap_adj);
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
			default:  /* No bank(chip-select) interleaving */
 | 
								default:  /* No bank(chip-select) interleaving */
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
| 
						 | 
					@ -1292,8 +1349,6 @@ compute_fsl_memctl_config_regs(const memctl_options_t *popts,
 | 
				
			||||||
			 * memory in the two CS0 ranks.
 | 
								 * memory in the two CS0 ranks.
 | 
				
			||||||
			 */
 | 
								 */
 | 
				
			||||||
			if (i == 0) {
 | 
								if (i == 0) {
 | 
				
			||||||
				unsigned long long rank_density
 | 
					 | 
				
			||||||
						= dimm_params[0].rank_density;
 | 
					 | 
				
			||||||
				ea = (2 * (rank_density >> dbw_cap_adj)) - 1;
 | 
									ea = (2 * (rank_density >> dbw_cap_adj)) - 1;
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1303,20 +1358,14 @@ compute_fsl_memctl_config_regs(const memctl_options_t *popts,
 | 
				
			||||||
			 * No rank interleaving and no memory controller
 | 
								 * No rank interleaving and no memory controller
 | 
				
			||||||
			 * interleaving.
 | 
								 * interleaving.
 | 
				
			||||||
			 */
 | 
								 */
 | 
				
			||||||
			unsigned long long rank_density
 | 
								sa = dimm_params[dimm_number].base_address;
 | 
				
			||||||
						= dimm_params[i/2].rank_density;
 | 
					 | 
				
			||||||
			sa = dimm_params[i/2].base_address;
 | 
					 | 
				
			||||||
			ea = sa + (rank_density >> dbw_cap_adj) - 1;
 | 
								ea = sa + (rank_density >> dbw_cap_adj) - 1;
 | 
				
			||||||
			if (i&1) {
 | 
								if (dimm_params[dimm_number].n_ranks > (i % cs_per_dimm)) {
 | 
				
			||||||
				if ((dimm_params[i/2].n_ranks == 1)) {
 | 
									sa += (i % cs_per_dimm) * (rank_density >> dbw_cap_adj);
 | 
				
			||||||
					/* Odd chip select, single-rank dimm */
 | 
									ea += (i % cs_per_dimm) * (rank_density >> dbw_cap_adj);
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
				sa = 0;
 | 
									sa = 0;
 | 
				
			||||||
				ea = 0;
 | 
									ea = 0;
 | 
				
			||||||
				} else {
 | 
					 | 
				
			||||||
					/* Odd chip select, dual-rank DIMM */
 | 
					 | 
				
			||||||
					sa += rank_density >> dbw_cap_adj;
 | 
					 | 
				
			||||||
					ea += rank_density >> dbw_cap_adj;
 | 
					 | 
				
			||||||
				}
 | 
					 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1329,10 +1378,12 @@ compute_fsl_memctl_config_regs(const memctl_options_t *popts,
 | 
				
			||||||
			);
 | 
								);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		debug("FSLDDR: cs[%d]_bnds = 0x%08x\n", i, ddr->cs[i].bnds);
 | 
							debug("FSLDDR: cs[%d]_bnds = 0x%08x\n", i, ddr->cs[i].bnds);
 | 
				
			||||||
		set_csn_config(i, ddr, popts, dimm_params);
 | 
							set_csn_config(dimm_number, i, ddr, popts, dimm_params);
 | 
				
			||||||
		set_csn_config_2(i, ddr);
 | 
							set_csn_config_2(i, ddr);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						set_ddr_eor(ddr, popts);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if !defined(CONFIG_FSL_DDR1)
 | 
					#if !defined(CONFIG_FSL_DDR1)
 | 
				
			||||||
	set_timing_cfg_0(ddr);
 | 
						set_timing_cfg_0(ddr);
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -1361,8 +1412,7 @@ compute_fsl_memctl_config_regs(const memctl_options_t *popts,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	set_ddr_sr_cntr(ddr, sr_it);
 | 
						set_ddr_sr_cntr(ddr, sr_it);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	set_ddr_sdram_rcw_1(ddr);
 | 
						set_ddr_sdram_rcw(ddr, common_dimm);
 | 
				
			||||||
	set_ddr_sdram_rcw_2(ddr);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return check_fsl_memctl_config_regs(ddr);
 | 
						return check_fsl_memctl_config_regs(ddr);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -73,6 +73,7 @@ extern unsigned int populate_memctl_options(int all_DIMMs_registered,
 | 
				
			||||||
				memctl_options_t *popts,
 | 
									memctl_options_t *popts,
 | 
				
			||||||
				dimm_params_t *pdimm,
 | 
									dimm_params_t *pdimm,
 | 
				
			||||||
				unsigned int ctrl_num);
 | 
									unsigned int ctrl_num);
 | 
				
			||||||
 | 
					extern void check_interleaving_options(fsl_ddr_info_t *pinfo);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern unsigned int mclk_to_picos(unsigned int mclk);
 | 
					extern unsigned int mclk_to_picos(unsigned int mclk);
 | 
				
			||||||
extern unsigned int get_memory_clk_period_ps(void);
 | 
					extern unsigned int get_memory_clk_period_ps(void);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -90,6 +90,7 @@ ddr_compute_dimm_parameters(const ddr3_spd_eeprom_t *spd,
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unsigned int retval;
 | 
						unsigned int retval;
 | 
				
			||||||
	unsigned int mtb_ps;
 | 
						unsigned int mtb_ps;
 | 
				
			||||||
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (spd->mem_type) {
 | 
						if (spd->mem_type) {
 | 
				
			||||||
		if (spd->mem_type != SPD_MEMTYPE_DDR3) {
 | 
							if (spd->mem_type != SPD_MEMTYPE_DDR3) {
 | 
				
			||||||
| 
						 | 
					@ -131,8 +132,11 @@ ddr_compute_dimm_parameters(const ddr3_spd_eeprom_t *spd,
 | 
				
			||||||
	case 0x01:	/* RDIMM */
 | 
						case 0x01:	/* RDIMM */
 | 
				
			||||||
	case 0x05:	/* Mini-RDIMM */
 | 
						case 0x05:	/* Mini-RDIMM */
 | 
				
			||||||
		pdimm->registered_dimm = 1; /* register buffered */
 | 
							pdimm->registered_dimm = 1; /* register buffered */
 | 
				
			||||||
 | 
							for (i = 0; i < 16; i += 2) {
 | 
				
			||||||
 | 
								pdimm->rcw[i] = spd->mod_section.registered.rcw[i/2] & 0x0F;
 | 
				
			||||||
 | 
								pdimm->rcw[i+1] = (spd->mod_section.registered.rcw[i/2] >> 4) & 0x0F;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
 | 
					 | 
				
			||||||
	case 0x02:	/* UDIMM */
 | 
						case 0x02:	/* UDIMM */
 | 
				
			||||||
	case 0x03:	/* SO-DIMM */
 | 
						case 0x03:	/* SO-DIMM */
 | 
				
			||||||
	case 0x04:	/* Micro-DIMM */
 | 
						case 0x04:	/* Micro-DIMM */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -76,7 +76,7 @@ compute_lowest_common_dimm_parameters(const dimm_params_t *dimm_params,
 | 
				
			||||||
				      common_timing_params_t *outpdimm,
 | 
									      common_timing_params_t *outpdimm,
 | 
				
			||||||
				      unsigned int number_of_dimms)
 | 
									      unsigned int number_of_dimms)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unsigned int i;
 | 
						unsigned int i, j;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	unsigned int tCKmin_X_ps = 0;
 | 
						unsigned int tCKmin_X_ps = 0;
 | 
				
			||||||
	unsigned int tCKmax_ps = 0xFFFFFFFF;
 | 
						unsigned int tCKmax_ps = 0xFFFFFFFF;
 | 
				
			||||||
| 
						 | 
					@ -98,7 +98,7 @@ compute_lowest_common_dimm_parameters(const dimm_params_t *dimm_params,
 | 
				
			||||||
	unsigned int tDQSQ_max_ps = 0;
 | 
						unsigned int tDQSQ_max_ps = 0;
 | 
				
			||||||
	unsigned int tQHS_ps = 0;
 | 
						unsigned int tQHS_ps = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	unsigned int temp1, temp2;
 | 
						unsigned int temp1, temp2, temp3;
 | 
				
			||||||
	unsigned int additive_latency = 0;
 | 
						unsigned int additive_latency = 0;
 | 
				
			||||||
#if !defined(CONFIG_FSL_DDR3)
 | 
					#if !defined(CONFIG_FSL_DDR3)
 | 
				
			||||||
	const unsigned int mclk_ps = get_memory_clk_period_ps();
 | 
						const unsigned int mclk_ps = get_memory_clk_period_ps();
 | 
				
			||||||
| 
						 | 
					@ -118,6 +118,18 @@ compute_lowest_common_dimm_parameters(const dimm_params_t *dimm_params,
 | 
				
			||||||
			temp1++;
 | 
								temp1++;
 | 
				
			||||||
			continue;
 | 
								continue;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							if (dimm_params[i].n_ranks == 4 && i != 0) {
 | 
				
			||||||
 | 
								printf("Found Quad-rank DIMM in wrong bank, ignored."
 | 
				
			||||||
 | 
									" Software may not run as expected.\n");
 | 
				
			||||||
 | 
								temp1++;
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							if (dimm_params[i].n_ranks == 4 && \
 | 
				
			||||||
 | 
							  CONFIG_CHIP_SELECTS_PER_CTRL/CONFIG_DIMM_SLOTS_PER_CTLR < 4) {
 | 
				
			||||||
 | 
								printf("Found Quad-rank DIMM, not able to support.");
 | 
				
			||||||
 | 
								temp1++;
 | 
				
			||||||
 | 
								continue;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		/*
 | 
							/*
 | 
				
			||||||
		 * Find minimum tCKmax_ps to find fastest slow speed,
 | 
							 * Find minimum tCKmax_ps to find fastest slow speed,
 | 
				
			||||||
| 
						 | 
					@ -219,6 +231,20 @@ compute_lowest_common_dimm_parameters(const dimm_params_t *dimm_params,
 | 
				
			||||||
				"DIMMs detected!\n");
 | 
									"DIMMs detected!\n");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						temp1 = 0;
 | 
				
			||||||
 | 
						if (outpdimm->all_DIMMs_registered)
 | 
				
			||||||
 | 
							for (j = 0; j < 16; j++) {
 | 
				
			||||||
 | 
								outpdimm->rcw[j] = dimm_params[0].rcw[j];
 | 
				
			||||||
 | 
								for (i = 1; i < number_of_dimms; i++)
 | 
				
			||||||
 | 
									if (dimm_params[i].rcw[j] != dimm_params[0].rcw[j]) {
 | 
				
			||||||
 | 
										temp3 = 1;
 | 
				
			||||||
 | 
										break;
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (temp1 != 0)
 | 
				
			||||||
 | 
							printf("ERROR: Mix different RDIMM detected!\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(CONFIG_FSL_DDR3)
 | 
					#if defined(CONFIG_FSL_DDR3)
 | 
				
			||||||
	if (compute_cas_latency_ddr3(dimm_params, outpdimm, number_of_dimms))
 | 
						if (compute_cas_latency_ddr3(dimm_params, outpdimm, number_of_dimms))
 | 
				
			||||||
		return 1;
 | 
							return 1;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -100,8 +100,8 @@ const char * step_to_string(unsigned int step) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int step_assign_addresses(fsl_ddr_info_t *pinfo,
 | 
					int step_assign_addresses(fsl_ddr_info_t *pinfo,
 | 
				
			||||||
			  unsigned int dbw_cap_adj[],
 | 
								  unsigned int dbw_cap_adj[],
 | 
				
			||||||
			  unsigned int *memctl_interleaving,
 | 
								  unsigned int *all_memctl_interleaving,
 | 
				
			||||||
			  unsigned int *rank_interleaving)
 | 
								  unsigned int *all_ctlr_rank_interleaving)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int i, j;
 | 
						int i, j;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -152,30 +152,30 @@ int step_assign_addresses(fsl_ddr_info_t *pinfo,
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
					 | 
				
			||||||
	 * Check if all controllers are configured for memory
 | 
					 | 
				
			||||||
	 * controller interleaving.
 | 
					 | 
				
			||||||
	 */
 | 
					 | 
				
			||||||
	j = 0;
 | 
						j = 0;
 | 
				
			||||||
	for (i = 0; i < CONFIG_NUM_DDR_CONTROLLERS; i++) {
 | 
						for (i = 0; i < CONFIG_NUM_DDR_CONTROLLERS; i++)
 | 
				
			||||||
		if (pinfo->memctl_opts[i].memctl_interleaving) {
 | 
							if (pinfo->memctl_opts[i].memctl_interleaving)
 | 
				
			||||||
			j++;
 | 
								j++;
 | 
				
			||||||
		}
 | 
						/*
 | 
				
			||||||
	}
 | 
						 * Not support less than all memory controllers interleaving
 | 
				
			||||||
	if (j == 2)
 | 
						 * if more than two controllers
 | 
				
			||||||
		*memctl_interleaving = 1;
 | 
						 */
 | 
				
			||||||
 | 
						if (j == CONFIG_NUM_DDR_CONTROLLERS)
 | 
				
			||||||
 | 
							*all_memctl_interleaving = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Check that all controllers are rank interleaving. */
 | 
						/* Check that all controllers are rank interleaving. */
 | 
				
			||||||
	j = 0;
 | 
						j = 0;
 | 
				
			||||||
	for (i = 0; i < CONFIG_NUM_DDR_CONTROLLERS; i++) {
 | 
						for (i = 0; i < CONFIG_NUM_DDR_CONTROLLERS; i++)
 | 
				
			||||||
		if (pinfo->memctl_opts[i].ba_intlv_ctl) {
 | 
							if (pinfo->memctl_opts[i].ba_intlv_ctl)
 | 
				
			||||||
			j++;
 | 
								j++;
 | 
				
			||||||
		}
 | 
						/*
 | 
				
			||||||
	}
 | 
						 * All memory controllers must be populated to qualify for
 | 
				
			||||||
	if (j == 2)
 | 
						 * all controller rank interleaving
 | 
				
			||||||
		*rank_interleaving = 1;
 | 
						 */
 | 
				
			||||||
 | 
						 if (j == CONFIG_NUM_DDR_CONTROLLERS)
 | 
				
			||||||
 | 
							*all_ctlr_rank_interleaving = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (*memctl_interleaving) {
 | 
						if (*all_memctl_interleaving) {
 | 
				
			||||||
		unsigned long long addr, total_mem_per_ctlr = 0;
 | 
							unsigned long long addr, total_mem_per_ctlr = 0;
 | 
				
			||||||
		/*
 | 
							/*
 | 
				
			||||||
		 * If interleaving between memory controllers,
 | 
							 * If interleaving between memory controllers,
 | 
				
			||||||
| 
						 | 
					@ -316,7 +316,7 @@ fsl_ddr_compute(fsl_ddr_info_t *pinfo, unsigned int start_step)
 | 
				
			||||||
					&pinfo->memctl_opts[i],
 | 
										&pinfo->memctl_opts[i],
 | 
				
			||||||
					pinfo->dimm_params[i], i);
 | 
										pinfo->dimm_params[i], i);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							check_interleaving_options(pinfo);
 | 
				
			||||||
	case STEP_ASSIGN_ADDRESSES:
 | 
						case STEP_ASSIGN_ADDRESSES:
 | 
				
			||||||
		/* STEP 5:  Assign addresses to chip selects */
 | 
							/* STEP 5:  Assign addresses to chip selects */
 | 
				
			||||||
		step_assign_addresses(pinfo,
 | 
							step_assign_addresses(pinfo,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -8,6 +8,7 @@
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include <common.h>
 | 
					#include <common.h>
 | 
				
			||||||
 | 
					#include <hwconfig.h>
 | 
				
			||||||
#include <asm/fsl_ddr_sdram.h>
 | 
					#include <asm/fsl_ddr_sdram.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "ddr.h"
 | 
					#include "ddr.h"
 | 
				
			||||||
| 
						 | 
					@ -23,7 +24,6 @@ unsigned int populate_memctl_options(int all_DIMMs_registered,
 | 
				
			||||||
			unsigned int ctrl_num)
 | 
								unsigned int ctrl_num)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unsigned int i;
 | 
						unsigned int i;
 | 
				
			||||||
	const char *p;
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Chip select options. */
 | 
						/* Chip select options. */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -204,6 +204,7 @@ unsigned int populate_memctl_options(int all_DIMMs_registered,
 | 
				
			||||||
	 * meet the tQDSS under different loading.
 | 
						 * meet the tQDSS under different loading.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	popts->wrlvl_en = 1;
 | 
						popts->wrlvl_en = 1;
 | 
				
			||||||
 | 
						popts->zq_en = 1;
 | 
				
			||||||
	popts->wrlvl_override = 0;
 | 
						popts->wrlvl_override = 0;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -212,78 +213,128 @@ unsigned int populate_memctl_options(int all_DIMMs_registered,
 | 
				
			||||||
	 * Please refer to doc/README.fsl-ddr for the detail.
 | 
						 * Please refer to doc/README.fsl-ddr for the detail.
 | 
				
			||||||
	 *
 | 
						 *
 | 
				
			||||||
	 * If memory controller interleaving is enabled, then the data
 | 
						 * If memory controller interleaving is enabled, then the data
 | 
				
			||||||
	 * bus widths must be programmed identically for the 2 memory
 | 
						 * bus widths must be programmed identically for all memory controllers.
 | 
				
			||||||
	 * controllers.
 | 
					 | 
				
			||||||
	 *
 | 
						 *
 | 
				
			||||||
	 * XXX: Attempt to set both controllers to the same chip select
 | 
						 * XXX: Attempt to set all controllers to the same chip select
 | 
				
			||||||
	 * interleaving mode. It will do a best effort to get the
 | 
						 * interleaving mode. It will do a best effort to get the
 | 
				
			||||||
	 * requested ranks interleaved together such that the result
 | 
						 * requested ranks interleaved together such that the result
 | 
				
			||||||
	 * should be a subset of the requested configuration.
 | 
						 * should be a subset of the requested configuration.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
#if (CONFIG_NUM_DDR_CONTROLLERS > 1)
 | 
					#if (CONFIG_NUM_DDR_CONTROLLERS > 1)
 | 
				
			||||||
	if ((p = getenv("memctl_intlv_ctl")) != NULL) {
 | 
						if (hwconfig_sub("fsl_ddr", "ctlr_intlv")) {
 | 
				
			||||||
		if (pdimm[0].n_ranks == 0) {
 | 
							if (pdimm[0].n_ranks == 0) {
 | 
				
			||||||
			printf("There is no rank on CS0. Because only rank on "
 | 
								printf("There is no rank on CS0 for controller %d. Because only"
 | 
				
			||||||
				"CS0 and ranks chip-select interleaved with CS0"
 | 
									" rank on CS0 and ranks chip-select interleaved with CS0"
 | 
				
			||||||
				" are controller interleaved, force non memory "
 | 
									" are controller interleaved, force non memory "
 | 
				
			||||||
				"controller interleaving\n");
 | 
									"controller interleaving\n", ctrl_num);
 | 
				
			||||||
			popts->memctl_interleaving = 0;
 | 
								popts->memctl_interleaving = 0;
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
			popts->memctl_interleaving = 1;
 | 
								popts->memctl_interleaving = 1;
 | 
				
			||||||
			if (strcmp(p, "cacheline") == 0)
 | 
								/*
 | 
				
			||||||
 | 
								 * test null first. if CONFIG_HWCONFIG is not defined
 | 
				
			||||||
 | 
								 * hwconfig_arg_cmp returns non-zero
 | 
				
			||||||
 | 
								 */
 | 
				
			||||||
 | 
								if (hwconfig_subarg_cmp("fsl_ddr", "ctlr_intlv", "null")) {
 | 
				
			||||||
 | 
									popts->memctl_interleaving = 0;
 | 
				
			||||||
 | 
									debug("memory controller interleaving disabled.\n");
 | 
				
			||||||
 | 
								} else if (hwconfig_subarg_cmp("fsl_ddr", "ctlr_intlv", "cacheline"))
 | 
				
			||||||
				popts->memctl_interleaving_mode =
 | 
									popts->memctl_interleaving_mode =
 | 
				
			||||||
					FSL_DDR_CACHE_LINE_INTERLEAVING;
 | 
										FSL_DDR_CACHE_LINE_INTERLEAVING;
 | 
				
			||||||
			else if (strcmp(p, "page") == 0)
 | 
								else if (hwconfig_subarg_cmp("fsl_ddr", "ctlr_intlv", "page"))
 | 
				
			||||||
				popts->memctl_interleaving_mode =
 | 
									popts->memctl_interleaving_mode =
 | 
				
			||||||
					FSL_DDR_PAGE_INTERLEAVING;
 | 
										FSL_DDR_PAGE_INTERLEAVING;
 | 
				
			||||||
			else if (strcmp(p, "bank") == 0)
 | 
								else if (hwconfig_subarg_cmp("fsl_ddr", "ctlr_intlv", "bank"))
 | 
				
			||||||
				popts->memctl_interleaving_mode =
 | 
									popts->memctl_interleaving_mode =
 | 
				
			||||||
					FSL_DDR_BANK_INTERLEAVING;
 | 
										FSL_DDR_BANK_INTERLEAVING;
 | 
				
			||||||
			else if (strcmp(p, "superbank") == 0)
 | 
								else if (hwconfig_subarg_cmp("fsl_ddr", "ctlr_intlv", "superbank"))
 | 
				
			||||||
				popts->memctl_interleaving_mode =
 | 
									popts->memctl_interleaving_mode =
 | 
				
			||||||
					FSL_DDR_SUPERBANK_INTERLEAVING;
 | 
										FSL_DDR_SUPERBANK_INTERLEAVING;
 | 
				
			||||||
			else
 | 
								else {
 | 
				
			||||||
				popts->memctl_interleaving_mode =
 | 
									popts->memctl_interleaving = 0;
 | 
				
			||||||
						simple_strtoul(p, NULL, 0);
 | 
									printf("hwconfig has unrecognized parameter for ctlr_intlv.\n");
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
						if ((hwconfig_sub("fsl_ddr", "bank_intlv")) &&
 | 
				
			||||||
	if( ((p = getenv("ba_intlv_ctl")) != NULL) &&
 | 
					 | 
				
			||||||
		(CONFIG_CHIP_SELECTS_PER_CTRL > 1)) {
 | 
							(CONFIG_CHIP_SELECTS_PER_CTRL > 1)) {
 | 
				
			||||||
		if (strcmp(p, "cs0_cs1") == 0)
 | 
							/* test null first. if CONFIG_HWCONFIG is not defined,
 | 
				
			||||||
 | 
							 * hwconfig_arg_cmp returns non-zero */
 | 
				
			||||||
 | 
							if (hwconfig_subarg_cmp("fsl_ddr", "bank_intlv", "null"))
 | 
				
			||||||
 | 
								debug("bank interleaving disabled.\n");
 | 
				
			||||||
 | 
							else if (hwconfig_subarg_cmp("fsl_ddr", "bank_intlv", "cs0_cs1"))
 | 
				
			||||||
			popts->ba_intlv_ctl = FSL_DDR_CS0_CS1;
 | 
								popts->ba_intlv_ctl = FSL_DDR_CS0_CS1;
 | 
				
			||||||
		else if (strcmp(p, "cs2_cs3") == 0)
 | 
							else if (hwconfig_subarg_cmp("fsl_ddr", "bank_intlv", "cs2_cs3"))
 | 
				
			||||||
			popts->ba_intlv_ctl = FSL_DDR_CS2_CS3;
 | 
								popts->ba_intlv_ctl = FSL_DDR_CS2_CS3;
 | 
				
			||||||
		else if (strcmp(p, "cs0_cs1_and_cs2_cs3") == 0)
 | 
							else if (hwconfig_subarg_cmp("fsl_ddr", "bank_intlv", "cs0_cs1_and_cs2_cs3"))
 | 
				
			||||||
			popts->ba_intlv_ctl = FSL_DDR_CS0_CS1_AND_CS2_CS3;
 | 
								popts->ba_intlv_ctl = FSL_DDR_CS0_CS1_AND_CS2_CS3;
 | 
				
			||||||
		else if (strcmp(p, "cs0_cs1_cs2_cs3") == 0)
 | 
							else if (hwconfig_subarg_cmp("fsl_ddr", "bank_intlv", "cs0_cs1_cs2_cs3"))
 | 
				
			||||||
			popts->ba_intlv_ctl = FSL_DDR_CS0_CS1_CS2_CS3;
 | 
								popts->ba_intlv_ctl = FSL_DDR_CS0_CS1_CS2_CS3;
 | 
				
			||||||
		else
 | 
							else
 | 
				
			||||||
			popts->ba_intlv_ctl = simple_strtoul(p, NULL, 0);
 | 
								printf("hwconfig has unrecognized parameter for bank_intlv.\n");
 | 
				
			||||||
 | 
					 | 
				
			||||||
		switch (popts->ba_intlv_ctl & FSL_DDR_CS0_CS1_CS2_CS3) {
 | 
							switch (popts->ba_intlv_ctl & FSL_DDR_CS0_CS1_CS2_CS3) {
 | 
				
			||||||
		case FSL_DDR_CS0_CS1_CS2_CS3:
 | 
							case FSL_DDR_CS0_CS1_CS2_CS3:
 | 
				
			||||||
		case FSL_DDR_CS0_CS1:
 | 
					#if (CONFIG_DIMM_SLOTS_PER_CTLR == 1)
 | 
				
			||||||
			if (pdimm[0].n_ranks != 2) {
 | 
								if (pdimm[0].n_ranks < 4) {
 | 
				
			||||||
				popts->ba_intlv_ctl = 0;
 | 
									popts->ba_intlv_ctl = 0;
 | 
				
			||||||
				printf("Not enough bank(chip-select) for "
 | 
									printf("Not enough bank(chip-select) for "
 | 
				
			||||||
					"CS0+CS1, force non-interleaving!\n");
 | 
										"CS0+CS1+CS2+CS3 on controller %d, "
 | 
				
			||||||
 | 
										"force non-interleaving!\n", ctrl_num);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					#elif (CONFIG_DIMM_SLOTS_PER_CTLR == 2)
 | 
				
			||||||
 | 
								if ((pdimm[0].n_ranks < 2) && (pdimm[1].n_ranks < 2)) {
 | 
				
			||||||
 | 
									popts->ba_intlv_ctl = 0;
 | 
				
			||||||
 | 
									printf("Not enough bank(chip-select) for "
 | 
				
			||||||
 | 
										"CS0+CS1+CS2+CS3 on controller %d, "
 | 
				
			||||||
 | 
										"force non-interleaving!\n", ctrl_num);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								if (pdimm[0].capacity != pdimm[1].capacity) {
 | 
				
			||||||
 | 
									popts->ba_intlv_ctl = 0;
 | 
				
			||||||
 | 
									printf("Not identical DIMM size for "
 | 
				
			||||||
 | 
										"CS0+CS1+CS2+CS3 on controller %d, "
 | 
				
			||||||
 | 
										"force non-interleaving!\n", ctrl_num);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case FSL_DDR_CS0_CS1:
 | 
				
			||||||
 | 
								if (pdimm[0].n_ranks < 2) {
 | 
				
			||||||
 | 
									popts->ba_intlv_ctl = 0;
 | 
				
			||||||
 | 
									printf("Not enough bank(chip-select) for "
 | 
				
			||||||
 | 
										"CS0+CS1 on controller %d, "
 | 
				
			||||||
 | 
										"force non-interleaving!\n", ctrl_num);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case FSL_DDR_CS2_CS3:
 | 
							case FSL_DDR_CS2_CS3:
 | 
				
			||||||
			if (pdimm[1].n_ranks !=2){
 | 
					#if (CONFIG_DIMM_SLOTS_PER_CTLR == 1)
 | 
				
			||||||
 | 
								if (pdimm[0].n_ranks < 4) {
 | 
				
			||||||
				popts->ba_intlv_ctl = 0;
 | 
									popts->ba_intlv_ctl = 0;
 | 
				
			||||||
				printf("Not enough bank(CS) for CS2+CS3, "
 | 
									printf("Not enough bank(chip-select) for CS2+CS3 "
 | 
				
			||||||
					"force non-interleaving!\n");
 | 
										"on controller %d, force non-interleaving!\n", ctrl_num);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					#elif (CONFIG_DIMM_SLOTS_PER_CTLR == 2)
 | 
				
			||||||
 | 
								if (pdimm[1].n_ranks < 2) {
 | 
				
			||||||
 | 
									popts->ba_intlv_ctl = 0;
 | 
				
			||||||
 | 
									printf("Not enough bank(chip-select) for CS2+CS3 "
 | 
				
			||||||
 | 
										"on controller %d, force non-interleaving!\n", ctrl_num);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		case FSL_DDR_CS0_CS1_AND_CS2_CS3:
 | 
							case FSL_DDR_CS0_CS1_AND_CS2_CS3:
 | 
				
			||||||
			if ((pdimm[0].n_ranks != 2)||(pdimm[1].n_ranks != 2)) {
 | 
					#if (CONFIG_DIMM_SLOTS_PER_CTLR == 1)
 | 
				
			||||||
 | 
								if (pdimm[0].n_ranks < 4) {
 | 
				
			||||||
				popts->ba_intlv_ctl = 0;
 | 
									popts->ba_intlv_ctl = 0;
 | 
				
			||||||
				printf("Not enough bank(CS) for CS0+CS1 or "
 | 
									printf("Not enough bank(CS) for CS0+CS1 and "
 | 
				
			||||||
					"CS2+CS3, force non-interleaving!\n");
 | 
										"CS2+CS3 on controller %d, "
 | 
				
			||||||
 | 
										"force non-interleaving!\n", ctrl_num);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
					#elif (CONFIG_DIMM_SLOTS_PER_CTLR == 2)
 | 
				
			||||||
 | 
								if ((pdimm[0].n_ranks < 2) || (pdimm[1].n_ranks < 2)) {
 | 
				
			||||||
 | 
									popts->ba_intlv_ctl = 0;
 | 
				
			||||||
 | 
									printf("Not enough bank(CS) for CS0+CS1 and "
 | 
				
			||||||
 | 
										"CS2+CS3 on controller %d, "
 | 
				
			||||||
 | 
										"force non-interleaving!\n", ctrl_num);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
			break;
 | 
								break;
 | 
				
			||||||
		default:
 | 
							default:
 | 
				
			||||||
			popts->ba_intlv_ctl = 0;
 | 
								popts->ba_intlv_ctl = 0;
 | 
				
			||||||
| 
						 | 
					@ -291,7 +342,48 @@ unsigned int populate_memctl_options(int all_DIMMs_registered,
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (hwconfig_sub("fsl_ddr", "addr_hash")) {
 | 
				
			||||||
 | 
							if (hwconfig_subarg_cmp("fsl_ddr", "addr_hash", "null"))
 | 
				
			||||||
 | 
								popts->addr_hash = 0;
 | 
				
			||||||
 | 
							else if (hwconfig_subarg_cmp("fsl_ddr", "addr_hash", "true"))
 | 
				
			||||||
 | 
								popts->addr_hash = 1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (pdimm[0].n_ranks == 4)
 | 
				
			||||||
 | 
							popts->quad_rank_present = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fsl_ddr_board_options(popts, pdimm, ctrl_num);
 | 
						fsl_ddr_board_options(popts, pdimm, ctrl_num);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void check_interleaving_options(fsl_ddr_info_t *pinfo)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int i, j, check_n_ranks, intlv_fixed = 0;
 | 
				
			||||||
 | 
						unsigned long long check_rank_density;
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * Check if all controllers are configured for memory
 | 
				
			||||||
 | 
						 * controller interleaving. Identical dimms are recommended. At least
 | 
				
			||||||
 | 
						 * the size should be checked.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						j = 0;
 | 
				
			||||||
 | 
						check_n_ranks = pinfo->dimm_params[0][0].n_ranks;
 | 
				
			||||||
 | 
						check_rank_density = pinfo->dimm_params[0][0].rank_density;
 | 
				
			||||||
 | 
						for (i = 0; i < CONFIG_NUM_DDR_CONTROLLERS; i++) {
 | 
				
			||||||
 | 
							if ((pinfo->memctl_opts[i].memctl_interleaving) && \
 | 
				
			||||||
 | 
							    (check_rank_density == pinfo->dimm_params[i][0].rank_density) && \
 | 
				
			||||||
 | 
							    (check_n_ranks == pinfo->dimm_params[i][0].n_ranks)) {
 | 
				
			||||||
 | 
								j++;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (j != CONFIG_NUM_DDR_CONTROLLERS) {
 | 
				
			||||||
 | 
							for (i = 0; i < CONFIG_NUM_DDR_CONTROLLERS; i++)
 | 
				
			||||||
 | 
								if (pinfo->memctl_opts[i].memctl_interleaving) {
 | 
				
			||||||
 | 
									pinfo->memctl_opts[i].memctl_interleaving = 0;
 | 
				
			||||||
 | 
									intlv_fixed = 1;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							if (intlv_fixed)
 | 
				
			||||||
 | 
								printf("Not all DIMMs are identical in size. "
 | 
				
			||||||
 | 
									"Memory controller interleaving disabled.\n");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -985,7 +985,7 @@ u32 DQS_autocalibration(void)
 | 
				
			||||||
	puts(str);
 | 
						puts(str);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(DEBUG_PPC4xx_DDR_AUTOCALIBRATION)
 | 
					#if defined(DEBUG_PPC4xx_DDR_AUTOCALIBRATION)
 | 
				
			||||||
	i = getenv_r("autocalib", tmp, sizeof(tmp));
 | 
						i = getenv_f("autocalib", tmp, sizeof(tmp));
 | 
				
			||||||
	if (i < 0)
 | 
						if (i < 0)
 | 
				
			||||||
		strcpy(tmp, CONFIG_AUTOCALIB);
 | 
							strcpy(tmp, CONFIG_AUTOCALIB);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -81,6 +81,9 @@ typedef struct dimm_params_s {
 | 
				
			||||||
	unsigned int tRTP_ps;	/* byte 38, spd->trtp */
 | 
						unsigned int tRTP_ps;	/* byte 38, spd->trtp */
 | 
				
			||||||
	unsigned int tDQSQ_max_ps;	/* byte 44, spd->tdqsq */
 | 
						unsigned int tDQSQ_max_ps;	/* byte 44, spd->tdqsq */
 | 
				
			||||||
	unsigned int tQHS_ps;	/* byte 45, spd->tqhs */
 | 
						unsigned int tQHS_ps;	/* byte 45, spd->tqhs */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* DDR3 RDIMM */
 | 
				
			||||||
 | 
						unsigned char rcw[16];	/* Register Control Word 0-15 */
 | 
				
			||||||
} dimm_params_t;
 | 
					} dimm_params_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extern unsigned int ddr_compute_dimm_parameters(
 | 
					extern unsigned int ddr_compute_dimm_parameters(
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -119,6 +119,7 @@ typedef struct fsl_ddr_cfg_regs_s {
 | 
				
			||||||
	unsigned int ddr_sr_cntr;
 | 
						unsigned int ddr_sr_cntr;
 | 
				
			||||||
	unsigned int ddr_sdram_rcw_1;
 | 
						unsigned int ddr_sdram_rcw_1;
 | 
				
			||||||
	unsigned int ddr_sdram_rcw_2;
 | 
						unsigned int ddr_sdram_rcw_2;
 | 
				
			||||||
 | 
						unsigned int ddr_eor;
 | 
				
			||||||
} fsl_ddr_cfg_regs_t;
 | 
					} fsl_ddr_cfg_regs_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct memctl_options_partial_s {
 | 
					typedef struct memctl_options_partial_s {
 | 
				
			||||||
| 
						 | 
					@ -156,6 +157,7 @@ typedef struct memctl_options_s {
 | 
				
			||||||
	unsigned int memctl_interleaving;
 | 
						unsigned int memctl_interleaving;
 | 
				
			||||||
	unsigned int memctl_interleaving_mode;
 | 
						unsigned int memctl_interleaving_mode;
 | 
				
			||||||
	unsigned int ba_intlv_ctl;
 | 
						unsigned int ba_intlv_ctl;
 | 
				
			||||||
 | 
						unsigned int addr_hash;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Operational mode parameters */
 | 
						/* Operational mode parameters */
 | 
				
			||||||
	unsigned int ECC_mode;	 /* Use ECC? */
 | 
						unsigned int ECC_mode;	 /* Use ECC? */
 | 
				
			||||||
| 
						 | 
					@ -172,6 +174,7 @@ typedef struct memctl_options_s {
 | 
				
			||||||
	unsigned int OTF_burst_chop_en;
 | 
						unsigned int OTF_burst_chop_en;
 | 
				
			||||||
	/* mirrior DIMMs for DDR3 */
 | 
						/* mirrior DIMMs for DDR3 */
 | 
				
			||||||
	unsigned int mirrored_dimm;
 | 
						unsigned int mirrored_dimm;
 | 
				
			||||||
 | 
						unsigned int quad_rank_present;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Global Timing Parameters */
 | 
						/* Global Timing Parameters */
 | 
				
			||||||
	unsigned int cas_latency_override;
 | 
						unsigned int cas_latency_override;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,212 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * MPC85xx Internal Memory Map
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * Copyright 2010 Freescale Semiconductor, 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
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef __FSL_FMAN_H__
 | 
				
			||||||
 | 
					#define __FSL_FMAN_H__
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <asm/types.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct fm_bmi_common {
 | 
				
			||||||
 | 
						u32	fmbm_init;	/* BMI initialization */
 | 
				
			||||||
 | 
						u32	fmbm_cfg1;	/* BMI configuration1 */
 | 
				
			||||||
 | 
						u32	fmbm_cfg2;	/* BMI configuration2 */
 | 
				
			||||||
 | 
						u32	res0[0x5];
 | 
				
			||||||
 | 
						u32	fmbm_ievr;	/* interrupt event register */
 | 
				
			||||||
 | 
						u32	fmbm_ier;	/* interrupt enable register */
 | 
				
			||||||
 | 
						u32	fmbm_ifr;	/* interrupt force register */
 | 
				
			||||||
 | 
						u32	res1[0x5];
 | 
				
			||||||
 | 
						u32	fmbm_arb[0x8];	/* BMI arbitration */
 | 
				
			||||||
 | 
						u32	res2[0x28];
 | 
				
			||||||
 | 
						u32	fmbm_gde;	/* global debug enable */
 | 
				
			||||||
 | 
						u32	fmbm_pp[0x3f];	/* BMI port parameters */
 | 
				
			||||||
 | 
						u32	res3;
 | 
				
			||||||
 | 
						u32	fmbm_pfs[0x3f];	/* BMI port FIFO size */
 | 
				
			||||||
 | 
						u32	res4;
 | 
				
			||||||
 | 
						u32	fmbm_ppid[0x3f];/* port partition ID */
 | 
				
			||||||
 | 
					} fm_bmi_common_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct fm_qmi_common {
 | 
				
			||||||
 | 
						u32	fmqm_gc;	/* general configuration register */
 | 
				
			||||||
 | 
						u32	res0;
 | 
				
			||||||
 | 
						u32	fmqm_eie;	/* error interrupt event register */
 | 
				
			||||||
 | 
						u32	fmqm_eien;	/* error interrupt enable register */
 | 
				
			||||||
 | 
						u32	fmqm_eif;	/* error interrupt force register */
 | 
				
			||||||
 | 
						u32	fmqm_ie;	/* interrupt event register */
 | 
				
			||||||
 | 
						u32	fmqm_ien;	/* interrupt enable register */
 | 
				
			||||||
 | 
						u32	fmqm_if;	/* interrupt force register */
 | 
				
			||||||
 | 
						u32	fmqm_gs;	/* global status register */
 | 
				
			||||||
 | 
						u32	fmqm_ts;	/* task status register */
 | 
				
			||||||
 | 
						u32	fmqm_etfc;	/* enqueue total frame counter */
 | 
				
			||||||
 | 
						u32	fmqm_dtfc;	/* dequeue total frame counter */
 | 
				
			||||||
 | 
						u32	fmqm_dc0;	/* dequeue counter 0 */
 | 
				
			||||||
 | 
						u32	fmqm_dc1;	/* dequeue counter 1 */
 | 
				
			||||||
 | 
						u32	fmqm_dc2;	/* dequeue counter 2 */
 | 
				
			||||||
 | 
						u32	fmqm_dc3;	/* dequeue counter 3 */
 | 
				
			||||||
 | 
						u32	fmqm_dfnoc;	/* dequeue FQID not override counter */
 | 
				
			||||||
 | 
						u32	fmqm_dfcc;	/* dequeue FQID from context counter */
 | 
				
			||||||
 | 
						u32	fmqm_dffc;	/* dequeue FQID from FD counter */
 | 
				
			||||||
 | 
						u32	fmqm_dcc;	/* dequeue confirm counter */
 | 
				
			||||||
 | 
						u32	res1[0xc];
 | 
				
			||||||
 | 
						u32	fmqm_dtrc;	/* debug trap configuration register */
 | 
				
			||||||
 | 
						u32	fmqm_efddd;	/* enqueue frame descriptor dynamic debug */
 | 
				
			||||||
 | 
						u32	res3[0x2];
 | 
				
			||||||
 | 
						u32	res4[0xdc];	/* missing debug regs */
 | 
				
			||||||
 | 
					} fm_qmi_common_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct fm_bmi {
 | 
				
			||||||
 | 
						u8	res[1024];
 | 
				
			||||||
 | 
					} fm_bmi_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct fm_qmi {
 | 
				
			||||||
 | 
						u8	res[1024];
 | 
				
			||||||
 | 
					} fm_qmi_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct fm_parser {
 | 
				
			||||||
 | 
						u8	res[1024];
 | 
				
			||||||
 | 
					} fm_parser_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct fm_policer {
 | 
				
			||||||
 | 
						u8	res[4*1024];
 | 
				
			||||||
 | 
					} fm_policer_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct fm_keygen {
 | 
				
			||||||
 | 
						u8	res[4*1024];
 | 
				
			||||||
 | 
					} fm_keygen_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct fm_dma {
 | 
				
			||||||
 | 
						u32	fmdmsr;		/* status register */
 | 
				
			||||||
 | 
						u32	fmdmmr;		/* mode register */
 | 
				
			||||||
 | 
						u32	fmdmtr;		/* bus threshold register */
 | 
				
			||||||
 | 
						u32	fmdmhy;		/* bus hysteresis register */
 | 
				
			||||||
 | 
						u32	fmdmsetr;	/* SOS emergency threshold register */
 | 
				
			||||||
 | 
						u32	fmdmtah;	/* transfer bus address high register */
 | 
				
			||||||
 | 
						u32	fmdmtal;	/* transfer bus address low register */
 | 
				
			||||||
 | 
						u32	fmdmtcid;	/* transfer bus communication ID register */
 | 
				
			||||||
 | 
						u32	fmdmra;		/* DMA bus internal ram address register */
 | 
				
			||||||
 | 
						u32	fmdmrd;		/* DMA bus internal ram data register */
 | 
				
			||||||
 | 
						u32	res0[0xb];
 | 
				
			||||||
 | 
						u32	fmdmdcr;	/* debug counter */
 | 
				
			||||||
 | 
						u32	fmdmemsr;	/* emrgency smoother register */
 | 
				
			||||||
 | 
						u32	res1;
 | 
				
			||||||
 | 
						u32	fmdmplr[32];	/* FM DMA PID-LIODN # register */
 | 
				
			||||||
 | 
						u32	res[0x3c8];
 | 
				
			||||||
 | 
					} fm_dma_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct fm_fpm {
 | 
				
			||||||
 | 
						u32	fpmtnc;		/* TNUM control */
 | 
				
			||||||
 | 
						u32	fpmprc;		/* Port_ID control */
 | 
				
			||||||
 | 
						u32	res0;
 | 
				
			||||||
 | 
						u32	fpmflc;		/* flush control */
 | 
				
			||||||
 | 
						u32	fpmdis1;	/* dispatch thresholds1 */
 | 
				
			||||||
 | 
						u32	fpmdis2;	/* dispatch thresholds2 */
 | 
				
			||||||
 | 
						u32	fmepi;		/* error pending interrupts */
 | 
				
			||||||
 | 
						u32	fmrie;		/* rams interrupt enable */
 | 
				
			||||||
 | 
						u32	fpmfcevent[0x4];/* FMan controller event 0-3 */
 | 
				
			||||||
 | 
						u32	res1[0x4];
 | 
				
			||||||
 | 
						u32	fpmfcmask[0x4];	/* FMan controller mask 0-3 */
 | 
				
			||||||
 | 
						u32	res2[0x4];
 | 
				
			||||||
 | 
						u32	fpmtsc1;	/* timestamp control1 */
 | 
				
			||||||
 | 
						u32	fpmtsc2;	/* timestamp control2 */
 | 
				
			||||||
 | 
						u32	fpmtsp;		/* time stamp */
 | 
				
			||||||
 | 
						u32	fpmtsf;		/* time stamp fraction */
 | 
				
			||||||
 | 
						u32	fpmrcr;		/* rams control and event */
 | 
				
			||||||
 | 
						u32	res3[0x3];
 | 
				
			||||||
 | 
						u32	fpmdrd[0x4];	/* data_ram data 0-3 */
 | 
				
			||||||
 | 
						u32	res4[0xc];
 | 
				
			||||||
 | 
						u32	fpmdra;		/* data ram access */
 | 
				
			||||||
 | 
						u32	fm_ip_rev_1;	/* IP block revision 1 */
 | 
				
			||||||
 | 
						u32	fm_ip_rev_2;	/* IP block revision 2 */
 | 
				
			||||||
 | 
						u32	fmrstc;		/* reset command */
 | 
				
			||||||
 | 
						u32	fmcld;		/* classifier debug control */
 | 
				
			||||||
 | 
						u32	fmnpi;		/* normal pending interrupts */
 | 
				
			||||||
 | 
						u32	res5;
 | 
				
			||||||
 | 
						u32	fmnee;		/* event and enable */
 | 
				
			||||||
 | 
						u32	fpmcev[0x4];	/* CPU event 0-3 */
 | 
				
			||||||
 | 
						u32	res6[0x4];
 | 
				
			||||||
 | 
						u32	fmfp_ps[0x40];	/* port status */
 | 
				
			||||||
 | 
						u32	res7[0x260];
 | 
				
			||||||
 | 
						u32	fpmts[0x80];	/* task status */
 | 
				
			||||||
 | 
						u32	res8[0xa0];
 | 
				
			||||||
 | 
					} fm_fpm_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct fm_imem {
 | 
				
			||||||
 | 
						u8	res[4*1024];
 | 
				
			||||||
 | 
					} fm_imem_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct fm_soft_parser {
 | 
				
			||||||
 | 
						u8	res[4*1024];
 | 
				
			||||||
 | 
					} fm_soft_parser_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct fm_dtesc {
 | 
				
			||||||
 | 
						u8	res[4*1024];
 | 
				
			||||||
 | 
					} fm_dtsec_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct fm_mdio {
 | 
				
			||||||
 | 
						u8	res[4*1024];
 | 
				
			||||||
 | 
					} fm_mdio_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct fm_10gec {
 | 
				
			||||||
 | 
						u8	res[4*1024];
 | 
				
			||||||
 | 
					} fm_10gec_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct fm_10gec_mdio {
 | 
				
			||||||
 | 
						u8	res[4*1024];
 | 
				
			||||||
 | 
					} fm_10gec_mdio_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct fm_1588 {
 | 
				
			||||||
 | 
						u8	res[4*1024];
 | 
				
			||||||
 | 
					} fm_1588_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct ccsr_fman {
 | 
				
			||||||
 | 
						u8			muram[0x80000];
 | 
				
			||||||
 | 
						fm_bmi_common_t		fm_bmi_common;
 | 
				
			||||||
 | 
						fm_qmi_common_t		fm_qmi_common;
 | 
				
			||||||
 | 
						u8			res0[2048];
 | 
				
			||||||
 | 
						struct {
 | 
				
			||||||
 | 
							fm_bmi_t	fm_bmi;
 | 
				
			||||||
 | 
							fm_qmi_t	fm_qmi;
 | 
				
			||||||
 | 
							fm_parser_t	fm_parser;
 | 
				
			||||||
 | 
							u8		res[1024];
 | 
				
			||||||
 | 
						} port[63];
 | 
				
			||||||
 | 
						fm_policer_t		fm_policer;
 | 
				
			||||||
 | 
						fm_keygen_t		fm_keygen;
 | 
				
			||||||
 | 
						fm_dma_t		fm_dma;
 | 
				
			||||||
 | 
						fm_fpm_t		fm_fpm;
 | 
				
			||||||
 | 
						fm_imem_t		fm_imem;
 | 
				
			||||||
 | 
						u8			res1[8*1024];
 | 
				
			||||||
 | 
						fm_soft_parser_t	fm_soft_parser;
 | 
				
			||||||
 | 
						u8			res2[96*1024];
 | 
				
			||||||
 | 
						struct {
 | 
				
			||||||
 | 
							fm_dtsec_t	fm_dtesc;
 | 
				
			||||||
 | 
							fm_mdio_t	fm_mdio;
 | 
				
			||||||
 | 
						} mac[4];
 | 
				
			||||||
 | 
						u8			res3[32*1024];
 | 
				
			||||||
 | 
						fm_10gec_t		fm_10gec;
 | 
				
			||||||
 | 
						fm_10gec_mdio_t		fm_10gec_mdio;
 | 
				
			||||||
 | 
						u8			res4[48*1024];
 | 
				
			||||||
 | 
						fm_1588_t		fm_1588;
 | 
				
			||||||
 | 
						u8			res5[4*1024];
 | 
				
			||||||
 | 
					} ccsr_fman_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif /*__FSL_FMAN_H__*/
 | 
				
			||||||
| 
						 | 
					@ -1,5 +1,5 @@
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Copyright 2008-2009 Freescale Semiconductor, Inc.
 | 
					 * Copyright 2008-2010 Freescale Semiconductor, Inc.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
 * This program is free software; you can redistribute it and/or
 | 
					 * This program is free software; you can redistribute it and/or
 | 
				
			||||||
 * modify it under the terms of the GNU General Public License
 | 
					 * modify it under the terms of the GNU General Public License
 | 
				
			||||||
| 
						 | 
					@ -54,6 +54,7 @@ enum law_trgt_if {
 | 
				
			||||||
	LAW_TRGT_IF_PCIE_1 = 0x00,
 | 
						LAW_TRGT_IF_PCIE_1 = 0x00,
 | 
				
			||||||
	LAW_TRGT_IF_PCIE_2 = 0x01,
 | 
						LAW_TRGT_IF_PCIE_2 = 0x01,
 | 
				
			||||||
	LAW_TRGT_IF_PCIE_3 = 0x02,
 | 
						LAW_TRGT_IF_PCIE_3 = 0x02,
 | 
				
			||||||
 | 
						LAW_TRGT_IF_PCIE_4 = 0x03,
 | 
				
			||||||
	LAW_TRGT_IF_RIO_1 = 0x08,
 | 
						LAW_TRGT_IF_RIO_1 = 0x08,
 | 
				
			||||||
	LAW_TRGT_IF_RIO_2 = 0x09,
 | 
						LAW_TRGT_IF_RIO_2 = 0x09,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,142 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright 2009-2010 Freescale Semiconductor, 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
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef _FSL_LIODN_H_
 | 
				
			||||||
 | 
					#define _FSL_LIODN_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <asm/types.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct liodn_id_table {
 | 
				
			||||||
 | 
						const char * compat;
 | 
				
			||||||
 | 
						u32 id[2];
 | 
				
			||||||
 | 
						u8 num_ids;
 | 
				
			||||||
 | 
						phys_addr_t compat_offset;
 | 
				
			||||||
 | 
						unsigned long reg_offset;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern u32 get_ppid_liodn(int ppid_tbl_idx, int ppid);
 | 
				
			||||||
 | 
					extern void set_liodns(void);
 | 
				
			||||||
 | 
					extern void fdt_fixup_liodn(void *blob);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SET_LIODN_BASE_1(idA) \
 | 
				
			||||||
 | 
						{ .id = { idA }, .num_ids = 1, }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SET_LIODN_BASE_2(idA, idB) \
 | 
				
			||||||
 | 
						{ .id = { idA, idB }, .num_ids = 2 }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SET_LIODN_ENTRY_1(name, idA, off, compatoff) \
 | 
				
			||||||
 | 
						{ .compat = name, \
 | 
				
			||||||
 | 
						  .id = { idA }, .num_ids = 1, \
 | 
				
			||||||
 | 
						  .reg_offset = off + CONFIG_SYS_CCSRBAR, \
 | 
				
			||||||
 | 
						  .compat_offset = compatoff + CONFIG_SYS_CCSRBAR_PHYS, \
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SET_LIODN_ENTRY_2(name, idA, idB, off, compatoff) \
 | 
				
			||||||
 | 
						{ .compat = name, \
 | 
				
			||||||
 | 
						  .id = { idA, idB }, .num_ids = 2, \
 | 
				
			||||||
 | 
						  .reg_offset = off + CONFIG_SYS_CCSRBAR, \
 | 
				
			||||||
 | 
						  .compat_offset = compatoff + CONFIG_SYS_CCSRBAR_PHYS, \
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SET_GUTS_LIODN(compat, liodn, name, compatoff) \
 | 
				
			||||||
 | 
						SET_LIODN_ENTRY_1(compat, liodn, \
 | 
				
			||||||
 | 
							offsetof(ccsr_gur_t, name) + CONFIG_SYS_MPC85xx_GUTS_OFFSET, \
 | 
				
			||||||
 | 
							compatoff)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SET_USB_LIODN(usbNum, compat, liodn) \
 | 
				
			||||||
 | 
						SET_GUTS_LIODN(compat, liodn, usb##usbNum##liodnr,\
 | 
				
			||||||
 | 
							CONFIG_SYS_MPC85xx_USB##usbNum##_OFFSET)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SET_SATA_LIODN(sataNum, liodn) \
 | 
				
			||||||
 | 
						SET_GUTS_LIODN("fsl,pq-sata-v2", liodn, sata##sataNum##liodnr,\
 | 
				
			||||||
 | 
							CONFIG_SYS_MPC85xx_SATA##sataNum##_OFFSET)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SET_PCI_LIODN(pciNum, liodn) \
 | 
				
			||||||
 | 
						SET_GUTS_LIODN("fsl,p4080-pcie", liodn, pex##pciNum##liodnr,\
 | 
				
			||||||
 | 
							CONFIG_SYS_MPC85xx_PCIE##pciNum##_OFFSET)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* reg nodes for DMA start @ 0x300 */
 | 
				
			||||||
 | 
					#define SET_DMA_LIODN(dmaNum, liodn) \
 | 
				
			||||||
 | 
						SET_GUTS_LIODN("fsl,eloplus-dma", liodn, dma##dmaNum##liodnr,\
 | 
				
			||||||
 | 
							CONFIG_SYS_MPC85xx_DMA##dmaNum##_OFFSET + 0x300)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SET_SDHC_LIODN(sdhcNum, liodn) \
 | 
				
			||||||
 | 
						SET_GUTS_LIODN("fsl,esdhc", liodn, sdmmc##sdhcNum##liodnr,\
 | 
				
			||||||
 | 
							CONFIG_SYS_MPC85xx_ESDHC_OFFSET)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SET_QMAN_LIODN(liodn) \
 | 
				
			||||||
 | 
						SET_LIODN_ENTRY_1("fsl,qman", liodn, offsetof(ccsr_qman_t, liodnr) + \
 | 
				
			||||||
 | 
							CONFIG_SYS_FSL_CORENET_QMAN_OFFSET, \
 | 
				
			||||||
 | 
							CONFIG_SYS_FSL_CORENET_QMAN_OFFSET)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SET_BMAN_LIODN(liodn) \
 | 
				
			||||||
 | 
						SET_LIODN_ENTRY_1("fsl,bman", liodn, offsetof(ccsr_bman_t, liodnr) + \
 | 
				
			||||||
 | 
							CONFIG_SYS_FSL_CORENET_BMAN_OFFSET, \
 | 
				
			||||||
 | 
							CONFIG_SYS_FSL_CORENET_BMAN_OFFSET)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SET_PME_LIODN(liodn) \
 | 
				
			||||||
 | 
						SET_LIODN_ENTRY_1("fsl,pme", liodn, offsetof(ccsr_pme_t, liodnr) + \
 | 
				
			||||||
 | 
							CONFIG_SYS_FSL_CORENET_PME_OFFSET, \
 | 
				
			||||||
 | 
							CONFIG_SYS_FSL_CORENET_PME_OFFSET)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* -1 from portID due to how immap has the registers */
 | 
				
			||||||
 | 
					#define FM_PPID_RX_PORT_OFFSET(fmNum, portID) \
 | 
				
			||||||
 | 
						CONFIG_SYS_FSL_FM##fmNum##_OFFSET + \
 | 
				
			||||||
 | 
						offsetof(struct ccsr_fman, fm_bmi_common.fmbm_ppid[portID - 1])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* enetNum is 0, 1, 2... so we + 8 for 1g to get to HW Port ID */
 | 
				
			||||||
 | 
					#define SET_FMAN_RX_1G_LIODN(fmNum, enetNum, liodn) \
 | 
				
			||||||
 | 
						SET_LIODN_ENTRY_1("fsl,fman-port-1g-rx", liodn, \
 | 
				
			||||||
 | 
							FM_PPID_RX_PORT_OFFSET(fmNum, enetNum + 8), \
 | 
				
			||||||
 | 
							CONFIG_SYS_FSL_FM##fmNum##_RX##enetNum##_1G_OFFSET) \
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* enetNum is 0, 1, 2... so we + 16 for 10g to get to HW Port ID */
 | 
				
			||||||
 | 
					#define SET_FMAN_RX_10G_LIODN(fmNum, enetNum, liodn) \
 | 
				
			||||||
 | 
						SET_LIODN_ENTRY_1("fsl,fman-port-10g-rx", liodn, \
 | 
				
			||||||
 | 
							FM_PPID_RX_PORT_OFFSET(fmNum, enetNum + 16), \
 | 
				
			||||||
 | 
							CONFIG_SYS_FSL_FM##fmNum##_RX##enetNum##_10G_OFFSET) \
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SET_SEC_JQ_LIODN_ENTRY(jqNum, liodnA, liodnB) \
 | 
				
			||||||
 | 
						SET_LIODN_ENTRY_2("fsl,sec4.0-job-queue", liodnA, liodnB,\
 | 
				
			||||||
 | 
							offsetof(ccsr_sec_t, jqliodnr[jqNum].ls) + \
 | 
				
			||||||
 | 
							CONFIG_SYS_FSL_SEC_OFFSET, \
 | 
				
			||||||
 | 
							CONFIG_SYS_FSL_SEC_OFFSET + 0x1000 + 0x1000 * jqNum)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* This is a bit evil since we treat rtic param as both a string & hex value */
 | 
				
			||||||
 | 
					#define SET_SEC_RTIC_LIODN_ENTRY(rtic, liodnA) \
 | 
				
			||||||
 | 
						SET_LIODN_ENTRY_1("fsl,sec4.0-rtic-memory", \
 | 
				
			||||||
 | 
							liodnA,	\
 | 
				
			||||||
 | 
							offsetof(ccsr_sec_t, rticliodnr[0x##rtic-0xa].ls) + \
 | 
				
			||||||
 | 
							CONFIG_SYS_FSL_SEC_OFFSET, \
 | 
				
			||||||
 | 
							CONFIG_SYS_FSL_SEC_OFFSET + 0x6100 + 0x20 * (0x##rtic-0xa))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SET_SEC_DECO_LIODN_ENTRY(num, liodnA, liodnB) \
 | 
				
			||||||
 | 
						SET_LIODN_ENTRY_2(NULL, liodnA, liodnB, \
 | 
				
			||||||
 | 
							offsetof(ccsr_sec_t, decoliodnr[num].ls) + \
 | 
				
			||||||
 | 
							CONFIG_SYS_FSL_SEC_OFFSET, 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern struct liodn_id_table liodn_tbl[], liodn_bases[], sec_liodn_tbl[];
 | 
				
			||||||
 | 
					extern struct liodn_id_table fman1_liodn_tbl[], fman2_liodn_tbl[];
 | 
				
			||||||
 | 
					extern int liodn_tbl_sz, sec_liodn_tbl_sz;
 | 
				
			||||||
 | 
					extern int fman1_liodn_tbl_sz, fman2_liodn_tbl_sz;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,59 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright 2009-2010 Freescale Semiconductor, 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
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef _FSL_PORTALS_H_
 | 
				
			||||||
 | 
					#define _FSL_PORTALS_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* entries must be in order and contiguous */
 | 
				
			||||||
 | 
					enum fsl_dpaa_dev {
 | 
				
			||||||
 | 
						FSL_HW_PORTAL_SEC,
 | 
				
			||||||
 | 
					#ifdef CONFIG_SYS_DPAA_FMAN
 | 
				
			||||||
 | 
						FSL_HW_PORTAL_FMAN1,
 | 
				
			||||||
 | 
					#if (CONFIG_SYS_NUM_FMAN == 2)
 | 
				
			||||||
 | 
						FSL_HW_PORTAL_FMAN2,
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef CONFIG_SYS_DPAA_PME
 | 
				
			||||||
 | 
						FSL_HW_PORTAL_PME,
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct qportal_info {
 | 
				
			||||||
 | 
						u16	dliodn;	/* DQRR LIODN */
 | 
				
			||||||
 | 
						u16	fliodn;	/* frame data LIODN */
 | 
				
			||||||
 | 
						u16	liodn_offset;
 | 
				
			||||||
 | 
						u8	sdest;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SET_QP_INFO(dqrr, fdata, off, dest) \
 | 
				
			||||||
 | 
						{ .dliodn = dqrr, .fliodn = fdata, .liodn_offset = off, .sdest = dest }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern int get_dpaa_liodn(enum fsl_dpaa_dev dpaa_dev,
 | 
				
			||||||
 | 
								  u32 *liodns, int liodn_offset);
 | 
				
			||||||
 | 
					extern void setup_portals(void);
 | 
				
			||||||
 | 
					extern void fdt_fixup_qportals(void *blob);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern struct qportal_info qp_info[];
 | 
				
			||||||
 | 
					extern void fdt_portal(void *blob, const char *compat, const char *container,
 | 
				
			||||||
 | 
								u64 addr, u32 size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -32,8 +32,15 @@ enum srds_prtcl {
 | 
				
			||||||
	SATA2,
 | 
						SATA2,
 | 
				
			||||||
	SRIO1,
 | 
						SRIO1,
 | 
				
			||||||
	SRIO2,
 | 
						SRIO2,
 | 
				
			||||||
	SGMII_FM1,
 | 
						SGMII_FM1_DTSEC1,
 | 
				
			||||||
	SGMII_FM2,
 | 
						SGMII_FM1_DTSEC2,
 | 
				
			||||||
 | 
						SGMII_FM1_DTSEC3,
 | 
				
			||||||
 | 
						SGMII_FM1_DTSEC4,
 | 
				
			||||||
 | 
						SGMII_FM1_DTSEC5,
 | 
				
			||||||
 | 
						SGMII_FM2_DTSEC1,
 | 
				
			||||||
 | 
						SGMII_FM2_DTSEC2,
 | 
				
			||||||
 | 
						SGMII_FM2_DTSEC3,
 | 
				
			||||||
 | 
						SGMII_FM2_DTSEC4,
 | 
				
			||||||
	SGMII_TSEC1,
 | 
						SGMII_TSEC1,
 | 
				
			||||||
	SGMII_TSEC2,
 | 
						SGMII_TSEC2,
 | 
				
			||||||
	SGMII_TSEC3,
 | 
						SGMII_TSEC3,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -32,6 +32,7 @@
 | 
				
			||||||
#include <asm/fsl_dma.h>
 | 
					#include <asm/fsl_dma.h>
 | 
				
			||||||
#include <asm/fsl_i2c.h>
 | 
					#include <asm/fsl_i2c.h>
 | 
				
			||||||
#include <asm/fsl_lbc.h>
 | 
					#include <asm/fsl_lbc.h>
 | 
				
			||||||
 | 
					#include <asm/fsl_fman.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct ccsr_local {
 | 
					typedef struct ccsr_local {
 | 
				
			||||||
	u32	ccsrbarh;	/* CCSR Base Addr High */
 | 
						u32	ccsrbarh;	/* CCSR Base Addr High */
 | 
				
			||||||
| 
						 | 
					@ -172,7 +173,17 @@ typedef struct ccsr_ddr {
 | 
				
			||||||
	u32	ddr_sr_cntr;		/* self refresh counter */
 | 
						u32	ddr_sr_cntr;		/* self refresh counter */
 | 
				
			||||||
	u32	ddr_sdram_rcw_1;	/* Control Words 1 */
 | 
						u32	ddr_sdram_rcw_1;	/* Control Words 1 */
 | 
				
			||||||
	u32	ddr_sdram_rcw_2;	/* Control Words 2 */
 | 
						u32	ddr_sdram_rcw_2;	/* Control Words 2 */
 | 
				
			||||||
	u8	res8_1b[2456];
 | 
						u8	reg_1ab[8];
 | 
				
			||||||
 | 
						u32	ddr_wrlvl_cntl_2;	/* write leveling control 2 */
 | 
				
			||||||
 | 
						u32	ddr_wrlvl_cntl_3;	/* write leveling control 3 */
 | 
				
			||||||
 | 
						u8	res8_1b[104];
 | 
				
			||||||
 | 
						u32	sdram_mode_3;		/* SDRAM Mode Configuration 3 */
 | 
				
			||||||
 | 
						u32	sdram_mode_4;		/* SDRAM Mode Configuration 4 */
 | 
				
			||||||
 | 
						u32	sdram_mode_5;		/* SDRAM Mode Configuration 5 */
 | 
				
			||||||
 | 
						u32	sdram_mode_6;		/* SDRAM Mode Configuration 6 */
 | 
				
			||||||
 | 
						u32	sdram_mode_7;		/* SDRAM Mode Configuration 7 */
 | 
				
			||||||
 | 
						u32	sdram_mode_8;		/* SDRAM Mode Configuration 8 */
 | 
				
			||||||
 | 
						u8	res8_1ba[0x908];
 | 
				
			||||||
	u32	ddr_dsr1;		/* Debug Status 1 */
 | 
						u32	ddr_dsr1;		/* Debug Status 1 */
 | 
				
			||||||
	u32	ddr_dsr2;		/* Debug Status 2 */
 | 
						u32	ddr_dsr2;		/* Debug Status 2 */
 | 
				
			||||||
	u32	ddr_cdr1;		/* Control Driver 1 */
 | 
						u32	ddr_cdr1;		/* Control Driver 1 */
 | 
				
			||||||
| 
						 | 
					@ -180,7 +191,21 @@ typedef struct ccsr_ddr {
 | 
				
			||||||
	u8	res8_1c[200];
 | 
						u8	res8_1c[200];
 | 
				
			||||||
	u32	ip_rev1;		/* IP Block Revision 1 */
 | 
						u32	ip_rev1;		/* IP Block Revision 1 */
 | 
				
			||||||
	u32	ip_rev2;		/* IP Block Revision 2 */
 | 
						u32	ip_rev2;		/* IP Block Revision 2 */
 | 
				
			||||||
	u8	res8_2[512];
 | 
						u32	eor;			/* Enhanced Optimization Register */
 | 
				
			||||||
 | 
						u8	res8_2[252];
 | 
				
			||||||
 | 
						u32	mtcr;			/* Memory Test Control Register */
 | 
				
			||||||
 | 
						u8	res8_3[28];
 | 
				
			||||||
 | 
						u32	mtp1;			/* Memory Test Pattern 1 */
 | 
				
			||||||
 | 
						u32	mtp2;			/* Memory Test Pattern 2 */
 | 
				
			||||||
 | 
						u32	mtp3;			/* Memory Test Pattern 3 */
 | 
				
			||||||
 | 
						u32	mtp4;			/* Memory Test Pattern 4 */
 | 
				
			||||||
 | 
						u32	mtp5;			/* Memory Test Pattern 5 */
 | 
				
			||||||
 | 
						u32	mtp6;			/* Memory Test Pattern 6 */
 | 
				
			||||||
 | 
						u32	mtp7;			/* Memory Test Pattern 7 */
 | 
				
			||||||
 | 
						u32	mtp8;			/* Memory Test Pattern 8 */
 | 
				
			||||||
 | 
						u32	mtp9;			/* Memory Test Pattern 9 */
 | 
				
			||||||
 | 
						u32	mtp10;			/* Memory Test Pattern 10 */
 | 
				
			||||||
 | 
						u8	res8_4[184];
 | 
				
			||||||
	u32	data_err_inject_hi;	/* Data Path Err Injection Mask High */
 | 
						u32	data_err_inject_hi;	/* Data Path Err Injection Mask High */
 | 
				
			||||||
	u32	data_err_inject_lo;	/* Data Path Err Injection Mask Low */
 | 
						u32	data_err_inject_lo;	/* Data Path Err Injection Mask Low */
 | 
				
			||||||
	u32	ecc_err_inject;		/* Data Path Err Injection Mask ECC */
 | 
						u32	ecc_err_inject;		/* Data Path Err Injection Mask ECC */
 | 
				
			||||||
| 
						 | 
					@ -218,6 +243,9 @@ typedef struct ccsr_ddr {
 | 
				
			||||||
	u8	res12[184];
 | 
						u8	res12[184];
 | 
				
			||||||
} ccsr_ddr_t;
 | 
					} ccsr_ddr_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define DDR_EOR_RD_BDW_OPT_DIS	0x80000000 /* Read BDW Opt. disable */
 | 
				
			||||||
 | 
					#define DDR_EOR_ADDR_HASH_EN	0x40000000 /* Address hash enabled */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* I2C Registers */
 | 
					/* I2C Registers */
 | 
				
			||||||
typedef struct ccsr_i2c {
 | 
					typedef struct ccsr_i2c {
 | 
				
			||||||
	struct fsl_i2c	i2c[1];
 | 
						struct fsl_i2c	i2c[1];
 | 
				
			||||||
| 
						 | 
					@ -732,6 +760,8 @@ typedef struct ccsr_pic {
 | 
				
			||||||
	u32	eoi;		/* End Of IRQ */
 | 
						u32	eoi;		/* End Of IRQ */
 | 
				
			||||||
	u8	res9[3916];
 | 
						u8	res9[3916];
 | 
				
			||||||
	u32	frr;		/* Feature Reporting */
 | 
						u32	frr;		/* Feature Reporting */
 | 
				
			||||||
 | 
					#define MPC85xx_PICFRR_NCPU_MASK	0x00001f00
 | 
				
			||||||
 | 
					#define MPC85xx_PICFRR_NCPU_SHIFT	8
 | 
				
			||||||
	u8	res10[28];
 | 
						u8	res10[28];
 | 
				
			||||||
	u32	gcr;		/* Global Configuration */
 | 
						u32	gcr;		/* Global Configuration */
 | 
				
			||||||
#define MPC85xx_PICGCR_RST	0x80000000
 | 
					#define MPC85xx_PICGCR_RST	0x80000000
 | 
				
			||||||
| 
						 | 
					@ -1609,6 +1639,7 @@ typedef struct ccsr_gur {
 | 
				
			||||||
#define FSL_CORENET_DEVDISR_PCIE1	0x80000000
 | 
					#define FSL_CORENET_DEVDISR_PCIE1	0x80000000
 | 
				
			||||||
#define FSL_CORENET_DEVDISR_PCIE2	0x40000000
 | 
					#define FSL_CORENET_DEVDISR_PCIE2	0x40000000
 | 
				
			||||||
#define FSL_CORENET_DEVDISR_PCIE3	0x20000000
 | 
					#define FSL_CORENET_DEVDISR_PCIE3	0x20000000
 | 
				
			||||||
 | 
					#define FSL_CORENET_DEVDISR_PCIE4	0x10000000
 | 
				
			||||||
#define FSL_CORENET_DEVDISR_RMU		0x08000000
 | 
					#define FSL_CORENET_DEVDISR_RMU		0x08000000
 | 
				
			||||||
#define FSL_CORENET_DEVDISR_SRIO1	0x04000000
 | 
					#define FSL_CORENET_DEVDISR_SRIO1	0x04000000
 | 
				
			||||||
#define FSL_CORENET_DEVDISR_SRIO2	0x02000000
 | 
					#define FSL_CORENET_DEVDISR_SRIO2	0x02000000
 | 
				
			||||||
| 
						 | 
					@ -1618,6 +1649,8 @@ typedef struct ccsr_gur {
 | 
				
			||||||
#define FSL_CORENET_DEVDISR_DDR2	0x00080000
 | 
					#define FSL_CORENET_DEVDISR_DDR2	0x00080000
 | 
				
			||||||
#define FSL_CORENET_DEVDISR_DBG		0x00010000
 | 
					#define FSL_CORENET_DEVDISR_DBG		0x00010000
 | 
				
			||||||
#define FSL_CORENET_DEVDISR_NAL		0x00008000
 | 
					#define FSL_CORENET_DEVDISR_NAL		0x00008000
 | 
				
			||||||
 | 
					#define FSL_CORENET_DEVDISR_SATA1	0x00004000
 | 
				
			||||||
 | 
					#define FSL_CORENET_DEVDISR_SATA2	0x00002000
 | 
				
			||||||
#define FSL_CORENET_DEVDISR_ELBC	0x00001000
 | 
					#define FSL_CORENET_DEVDISR_ELBC	0x00001000
 | 
				
			||||||
#define FSL_CORENET_DEVDISR_USB1	0x00000800
 | 
					#define FSL_CORENET_DEVDISR_USB1	0x00000800
 | 
				
			||||||
#define FSL_CORENET_DEVDISR_USB2	0x00000400
 | 
					#define FSL_CORENET_DEVDISR_USB2	0x00000400
 | 
				
			||||||
| 
						 | 
					@ -1638,12 +1671,14 @@ typedef struct ccsr_gur {
 | 
				
			||||||
#define FSL_CORENET_DEVDISR2_DTSEC1_2	0x00400000
 | 
					#define FSL_CORENET_DEVDISR2_DTSEC1_2	0x00400000
 | 
				
			||||||
#define FSL_CORENET_DEVDISR2_DTSEC1_3	0x00200000
 | 
					#define FSL_CORENET_DEVDISR2_DTSEC1_3	0x00200000
 | 
				
			||||||
#define FSL_CORENET_DEVDISR2_DTSEC1_4	0x00100000
 | 
					#define FSL_CORENET_DEVDISR2_DTSEC1_4	0x00100000
 | 
				
			||||||
 | 
					#define FSL_CORENET_DEVDISR2_DTSEC1_5	0x00080000
 | 
				
			||||||
#define FSL_CORENET_DEVDISR2_FM2	0x00020000
 | 
					#define FSL_CORENET_DEVDISR2_FM2	0x00020000
 | 
				
			||||||
#define FSL_CORENET_DEVDISR2_10GEC2	0x00010000
 | 
					#define FSL_CORENET_DEVDISR2_10GEC2	0x00010000
 | 
				
			||||||
#define FSL_CORENET_DEVDISR2_DTSEC2_1	0x00008000
 | 
					#define FSL_CORENET_DEVDISR2_DTSEC2_1	0x00008000
 | 
				
			||||||
#define FSL_CORENET_DEVDISR2_DTSEC2_2	0x00004000
 | 
					#define FSL_CORENET_DEVDISR2_DTSEC2_2	0x00004000
 | 
				
			||||||
#define FSL_CORENET_DEVDISR2_DTSEC2_3	0x00002000
 | 
					#define FSL_CORENET_DEVDISR2_DTSEC2_3	0x00002000
 | 
				
			||||||
#define FSL_CORENET_DEVDISR2_DTSEC2_4	0x00001000
 | 
					#define FSL_CORENET_DEVDISR2_DTSEC2_4	0x00001000
 | 
				
			||||||
 | 
					#define FSL_CORENET_NUM_DEVDISR		2
 | 
				
			||||||
	u8	res7[8];
 | 
						u8	res7[8];
 | 
				
			||||||
	u32	powmgtcsr;	/* Power management status & control */
 | 
						u32	powmgtcsr;	/* Power management status & control */
 | 
				
			||||||
	u8	res8[12];
 | 
						u8	res8[12];
 | 
				
			||||||
| 
						 | 
					@ -1672,9 +1707,18 @@ typedef struct ccsr_gur {
 | 
				
			||||||
#define FSL_CORENET_RCWSR5_DDR_SYNC		0x00000080
 | 
					#define FSL_CORENET_RCWSR5_DDR_SYNC		0x00000080
 | 
				
			||||||
#define FSL_CORENET_RCWSR5_DDR_SYNC_SHIFT		 7
 | 
					#define FSL_CORENET_RCWSR5_DDR_SYNC_SHIFT		 7
 | 
				
			||||||
#define FSL_CORENET_RCWSR5_SRDS_EN		0x00002000
 | 
					#define FSL_CORENET_RCWSR5_SRDS_EN		0x00002000
 | 
				
			||||||
 | 
					#define FSL_CORENET_RCWSRn_SRDS_LPD_B2		0x3c000000 /* bits 162..165 */
 | 
				
			||||||
 | 
					#define FSL_CORENET_RCWSRn_SRDS_LPD_B3		0x003c0000 /* bits 170..173 */
 | 
				
			||||||
#define FSL_CORENET_RCWSR7_MCK_TO_PLAT_RAT	0x00400000
 | 
					#define FSL_CORENET_RCWSR7_MCK_TO_PLAT_RAT	0x00400000
 | 
				
			||||||
#define FSL_CORENET_RCWSR8_HOST_AGT_B1		0x00e00000
 | 
					#define FSL_CORENET_RCWSR8_HOST_AGT_B1		0x00e00000
 | 
				
			||||||
#define FSL_CORENET_RCWSR8_HOST_AGT_B2		0x00100000
 | 
					#define FSL_CORENET_RCWSR8_HOST_AGT_B2		0x00100000
 | 
				
			||||||
 | 
					#define FSL_CORENET_RCWSR11_EC1			0x00c00000 /* bits 360..361 */
 | 
				
			||||||
 | 
					#define FSL_CORENET_RCWSR11_EC1_FM1_DTSEC1	0x00000000
 | 
				
			||||||
 | 
					#define FSL_CORENET_RCWSR11_EC1_FM1_USB1	0x00800000
 | 
				
			||||||
 | 
					#define FSL_CORENET_RCWSR11_EC2			0x001c0000 /* bits 363..365 */
 | 
				
			||||||
 | 
					#define FSL_CORENET_RCWSR11_EC2_FM2_DTSEC1	0x00000000
 | 
				
			||||||
 | 
					#define FSL_CORENET_RCWSR11_EC2_FM1_DTSEC2	0x00080000
 | 
				
			||||||
 | 
					#define FSL_CORENET_RCWSR11_EC2_USB2		0x00100000
 | 
				
			||||||
	u8	res18[192];
 | 
						u8	res18[192];
 | 
				
			||||||
	u32	scratchrw[4];	/* Scratch Read/Write */
 | 
						u32	scratchrw[4];	/* Scratch Read/Write */
 | 
				
			||||||
	u8	res19[240];
 | 
						u8	res19[240];
 | 
				
			||||||
| 
						 | 
					@ -1698,10 +1742,15 @@ typedef struct ccsr_gur {
 | 
				
			||||||
	u32	sdmmc2liodnr;	/* SD/MMC 2 LIODN */
 | 
						u32	sdmmc2liodnr;	/* SD/MMC 2 LIODN */
 | 
				
			||||||
	u32	sdmmc3liodnr;	/* SD/MMC 3 LIODN */
 | 
						u32	sdmmc3liodnr;	/* SD/MMC 3 LIODN */
 | 
				
			||||||
	u32	sdmmc4liodnr;	/* SD/MMC 4 LIODN */
 | 
						u32	sdmmc4liodnr;	/* SD/MMC 4 LIODN */
 | 
				
			||||||
	u32	rmuliodnr;	/* RIO Message Unit LIODN */
 | 
						u32	rio1maintliodnr;/* RIO 1 Maintenance LIODN */
 | 
				
			||||||
	u32	rduliodnr;	/* RIO Doorbell Unit LIODN */
 | 
						u32	rio2maintliodnr;/* RIO 2 Maintenance LIODN */
 | 
				
			||||||
	u32	rpwuliodnr;	/* RIO Port Write Unit LIODN */
 | 
						u32	rio3maintliodnr;/* RIO 3 Maintenance LIODN */
 | 
				
			||||||
	u8	res22[52];
 | 
						u32	rio4maintliodnr;/* RIO 4 Maintenance LIODN */
 | 
				
			||||||
 | 
						u32	sata1liodnr;	/* SATA 1 LIODN */
 | 
				
			||||||
 | 
						u32	sata2liodnr;	/* SATA 2 LIODN */
 | 
				
			||||||
 | 
						u32	sata3liodnr;	/* SATA 3 LIODN */
 | 
				
			||||||
 | 
						u32	sata4liodnr;	/* SATA 4 LIODN */
 | 
				
			||||||
 | 
						u8	res22[32];
 | 
				
			||||||
	u32	dma1liodnr;	/* DMA 1 LIODN */
 | 
						u32	dma1liodnr;	/* DMA 1 LIODN */
 | 
				
			||||||
	u32	dma2liodnr;	/* DMA 2 LIODN */
 | 
						u32	dma2liodnr;	/* DMA 2 LIODN */
 | 
				
			||||||
	u32	dma3liodnr;	/* DMA 3 LIODN */
 | 
						u32	dma3liodnr;	/* DMA 3 LIODN */
 | 
				
			||||||
| 
						 | 
					@ -1736,6 +1785,12 @@ typedef struct ccsr_gur {
 | 
				
			||||||
	u8	res37[380];
 | 
						u8	res37[380];
 | 
				
			||||||
} ccsr_gur_t;
 | 
					} ccsr_gur_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * On p4080 we have an LIODN for msg unit (rmu) but not maintenance
 | 
				
			||||||
 | 
					 * everything after has RMan thus msg unit LIODN is used for maintenance
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					#define rmuliodnr rio1maintliodnr
 | 
				
			||||||
 | 
					
 | 
				
			||||||
typedef struct ccsr_clk {
 | 
					typedef struct ccsr_clk {
 | 
				
			||||||
	u32	clkc0csr;	/* Core 0 Clock control/status */
 | 
						u32	clkc0csr;	/* Core 0 Clock control/status */
 | 
				
			||||||
	u8	res1[0x1c];
 | 
						u8	res1[0x1c];
 | 
				
			||||||
| 
						 | 
					@ -2004,38 +2059,125 @@ enum {
 | 
				
			||||||
/* Security Engine Block (MS = Most Sig., LS = Least Sig.) */
 | 
					/* Security Engine Block (MS = Most Sig., LS = Least Sig.) */
 | 
				
			||||||
#if CONFIG_SYS_FSL_SEC_COMPAT >= 4
 | 
					#if CONFIG_SYS_FSL_SEC_COMPAT >= 4
 | 
				
			||||||
typedef struct ccsr_sec {
 | 
					typedef struct ccsr_sec {
 | 
				
			||||||
	u8	res1[0xfa0];
 | 
						u32	res0;
 | 
				
			||||||
 | 
						u32	mcfgr;		/* Master CFG Register */
 | 
				
			||||||
 | 
						u8	res1[0x8];
 | 
				
			||||||
 | 
						struct {
 | 
				
			||||||
 | 
							u32	ms;	/* Job Ring LIODN Register, MS */
 | 
				
			||||||
 | 
							u32	ls;	/* Job Ring LIODN Register, LS */
 | 
				
			||||||
 | 
						} jqliodnr[4];
 | 
				
			||||||
 | 
						u8	res2[0x30];
 | 
				
			||||||
 | 
						struct {
 | 
				
			||||||
 | 
							u32	ms;	/* RTIC LIODN Register, MS */
 | 
				
			||||||
 | 
							u32	ls;	/* RTIC LIODN Register, LS */
 | 
				
			||||||
 | 
						} rticliodnr[4];
 | 
				
			||||||
 | 
						u8	res3[0x1c];
 | 
				
			||||||
 | 
						u32	decorr;		/* DECO Request Register */
 | 
				
			||||||
 | 
						struct {
 | 
				
			||||||
 | 
							u32	ms;	/* DECO LIODN Register, MS */
 | 
				
			||||||
 | 
							u32	ls;	/* DECO LIODN Register, LS */
 | 
				
			||||||
 | 
						} decoliodnr[5];
 | 
				
			||||||
 | 
						u8	res4[0x58];
 | 
				
			||||||
 | 
						u32	dar;		/* DECO Avail Register */
 | 
				
			||||||
 | 
						u32	drr;		/* DECO Reset Register */
 | 
				
			||||||
 | 
						u8	res5[0xe78];
 | 
				
			||||||
	u32	crnr_ms;	/* CHA Revision Number Register, MS */
 | 
						u32	crnr_ms;	/* CHA Revision Number Register, MS */
 | 
				
			||||||
	u32	crnr_ls;	/* CHA Revision Number Register, LS */
 | 
						u32	crnr_ls;	/* CHA Revision Number Register, LS */
 | 
				
			||||||
	u32	ctpr_ms;	/* Compile Time Parameters Register, MS */
 | 
						u32	ctpr_ms;	/* Compile Time Parameters Register, MS */
 | 
				
			||||||
#define SEC_CTPR_MS_AXI_LIODN		0x08000000
 | 
					 | 
				
			||||||
#define SEC_CTPR_MS_QI			0x02000000
 | 
					 | 
				
			||||||
	u32	ctpr_ls;	/* Compile Time Parameters Register, LS */
 | 
						u32	ctpr_ls;	/* Compile Time Parameters Register, LS */
 | 
				
			||||||
	u8	res2[0x10];
 | 
						u8	res6[0x10];
 | 
				
			||||||
	u32	far_ms;		/* Fault Address Register, MS */
 | 
						u32	far_ms;		/* Fault Address Register, MS */
 | 
				
			||||||
	u32	far_ls;		/* Fault Address Register, LS */
 | 
						u32	far_ls;		/* Fault Address Register, LS */
 | 
				
			||||||
	u32	falr;		/* Fault Address LIODN Register */
 | 
						u32	falr;		/* Fault Address LIODN Register */
 | 
				
			||||||
	u32	fadr;		/* Fault Address Detail Register */
 | 
						u32	fadr;		/* Fault Address Detail Register */
 | 
				
			||||||
	u8	res3[0x4];
 | 
						u8	res7[0x4];
 | 
				
			||||||
	u32	csta;		/* CAAM Status Register */
 | 
						u32	csta;		/* CAAM Status Register */
 | 
				
			||||||
	u8	res4[0x8];
 | 
						u8	res8[0x8];
 | 
				
			||||||
	u32	rvid;		/* Run Time Integrity Checking Version ID Reg.*/
 | 
						u32	rvid;		/* Run Time Integrity Checking Version ID Reg.*/
 | 
				
			||||||
#define SEC_RVID_MA			0x0f000000
 | 
					 | 
				
			||||||
	u32	ccbvid;		/* CHA Cluster Block Version ID Register */
 | 
						u32	ccbvid;		/* CHA Cluster Block Version ID Register */
 | 
				
			||||||
	u32	chavid_ms;	/* CHA Version ID Register, MS */
 | 
						u32	chavid_ms;	/* CHA Version ID Register, MS */
 | 
				
			||||||
	u32	chavid_ls;	/* CHA Version ID Register, LS */
 | 
						u32	chavid_ls;	/* CHA Version ID Register, LS */
 | 
				
			||||||
	u32	chanum_ms;	/* CHA Number Register, MS */
 | 
						u32	chanum_ms;	/* CHA Number Register, MS */
 | 
				
			||||||
 | 
						u32	chanum_ls;	/* CHA Number Register, LS */
 | 
				
			||||||
 | 
						u32	secvid_ms;	/* SEC Version ID Register, MS */
 | 
				
			||||||
 | 
						u32	secvid_ls;	/* SEC Version ID Register, LS */
 | 
				
			||||||
 | 
						u8	res9[0x6020];
 | 
				
			||||||
 | 
						u32	qilcr_ms;	/* Queue Interface LIODN CFG Register, MS */
 | 
				
			||||||
 | 
						u32	qilcr_ls;	/* Queue Interface LIODN CFG Register, LS */
 | 
				
			||||||
 | 
						u8	res10[0x8fd8];
 | 
				
			||||||
 | 
					} ccsr_sec_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define SEC_CTPR_MS_AXI_LIODN		0x08000000
 | 
				
			||||||
 | 
					#define SEC_CTPR_MS_QI			0x02000000
 | 
				
			||||||
 | 
					#define SEC_RVID_MA			0x0f000000
 | 
				
			||||||
#define SEC_CHANUM_MS_JQNUM_MASK	0xf0000000
 | 
					#define SEC_CHANUM_MS_JQNUM_MASK	0xf0000000
 | 
				
			||||||
#define SEC_CHANUM_MS_JQNUM_SHIFT	28
 | 
					#define SEC_CHANUM_MS_JQNUM_SHIFT	28
 | 
				
			||||||
#define SEC_CHANUM_MS_DECONUM_MASK	0x0f000000
 | 
					#define SEC_CHANUM_MS_DECONUM_MASK	0x0f000000
 | 
				
			||||||
#define SEC_CHANUM_MS_DECONUM_SHIFT	24
 | 
					#define SEC_CHANUM_MS_DECONUM_SHIFT	24
 | 
				
			||||||
	u32	chanum_ls;	/* CHA Number Register, LS */
 | 
					 | 
				
			||||||
	u32	caamvid_ms;	/* CAAM Version ID Register, MS */
 | 
					 | 
				
			||||||
	u32	caamvid_ls;	/* CAAM Version ID Register, LS */
 | 
					 | 
				
			||||||
	u8	res5[0xf000];
 | 
					 | 
				
			||||||
} ccsr_sec_t;
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct ccsr_qman {
 | 
				
			||||||
 | 
						struct {
 | 
				
			||||||
 | 
							u32	qcsp_lio_cfg;	/* 0x0 - SW Portal n LIO cfg */
 | 
				
			||||||
 | 
							u32	qcsp_io_cfg;	/* 0x4 - SW Portal n IO cfg */
 | 
				
			||||||
 | 
							u32	res;
 | 
				
			||||||
 | 
							u32	qcsp_dd_cfg;	/* 0xc - SW Portal n Dynamic Debug cfg */
 | 
				
			||||||
 | 
						} qcsp[32];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Not actually reserved, but irrelevant to u-boot */
 | 
				
			||||||
 | 
						u8	res[0xbf8 - 0x200];
 | 
				
			||||||
 | 
						u32	ip_rev_1;
 | 
				
			||||||
 | 
						u32	ip_rev_2;
 | 
				
			||||||
 | 
						u32	fqd_bare;	/* FQD Extended Base Addr Register */
 | 
				
			||||||
 | 
						u32	fqd_bar;	/* FQD Base Addr Register */
 | 
				
			||||||
 | 
						u8	res1[0x8];
 | 
				
			||||||
 | 
						u32	fqd_ar;		/* FQD Attributes Register */
 | 
				
			||||||
 | 
						u8	res2[0xc];
 | 
				
			||||||
 | 
						u32	pfdr_bare;	/* PFDR Extended Base Addr Register */
 | 
				
			||||||
 | 
						u32	pfdr_bar;	/* PFDR Base Addr Register */
 | 
				
			||||||
 | 
						u8	res3[0x8];
 | 
				
			||||||
 | 
						u32	pfdr_ar;	/* PFDR Attributes Register */
 | 
				
			||||||
 | 
						u8	res4[0x4c];
 | 
				
			||||||
 | 
						u32	qcsp_bare;	/* QCSP Extended Base Addr Register */
 | 
				
			||||||
 | 
						u32	qcsp_bar;	/* QCSP Base Addr Register */
 | 
				
			||||||
 | 
						u8	res5[0x78];
 | 
				
			||||||
 | 
						u32	ci_sched_cfg;	/* Initiator Scheduling Configuration */
 | 
				
			||||||
 | 
						u32	srcidr;		/* Source ID Register */
 | 
				
			||||||
 | 
						u32	liodnr;		/* LIODN Register */
 | 
				
			||||||
 | 
						u8	res6[4];
 | 
				
			||||||
 | 
						u32	ci_rlm_cfg;	/* Initiator Read Latency Monitor Cfg */
 | 
				
			||||||
 | 
						u32	ci_rlm_avg;	/* Initiator Read Latency Monitor Avg */
 | 
				
			||||||
 | 
						u8	res7[0x2e8];
 | 
				
			||||||
 | 
					} ccsr_qman_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct ccsr_bman {
 | 
				
			||||||
 | 
						/* Not actually reserved, but irrelevant to u-boot */
 | 
				
			||||||
 | 
						u8	res[0xbf8];
 | 
				
			||||||
 | 
						u32	ip_rev_1;
 | 
				
			||||||
 | 
						u32	ip_rev_2;
 | 
				
			||||||
 | 
						u32	fbpr_bare;	/* FBPR Extended Base Addr Register */
 | 
				
			||||||
 | 
						u32	fbpr_bar;	/* FBPR Base Addr Register */
 | 
				
			||||||
 | 
						u8	res1[0x8];
 | 
				
			||||||
 | 
						u32	fbpr_ar;	/* FBPR Attributes Register */
 | 
				
			||||||
 | 
						u8	res2[0xf0];
 | 
				
			||||||
 | 
						u32	srcidr;		/* Source ID Register */
 | 
				
			||||||
 | 
						u32	liodnr;		/* LIODN Register */
 | 
				
			||||||
 | 
						u8	res7[0x2f4];
 | 
				
			||||||
 | 
					} ccsr_bman_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct ccsr_pme {
 | 
				
			||||||
 | 
						u8	res0[0x804];
 | 
				
			||||||
 | 
						u32	liodnbr;	/* LIODN Base Register */
 | 
				
			||||||
 | 
						u8	res1[0x1f8];
 | 
				
			||||||
 | 
						u32	srcidr;		/* Source ID Register */
 | 
				
			||||||
 | 
						u8	res2[8];
 | 
				
			||||||
 | 
						u32	liodnr;		/* LIODN Register */
 | 
				
			||||||
 | 
						u8	res3[0x1e8];
 | 
				
			||||||
 | 
						u32	pm_ip_rev_1;	/* PME IP Block Revision Reg 1*/
 | 
				
			||||||
 | 
						u32	pm_ip_rev_2;	/* PME IP Block Revision Reg 1*/
 | 
				
			||||||
 | 
						u8	res4[0x400];
 | 
				
			||||||
 | 
					} ccsr_pme_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_FSL_CORENET
 | 
					#ifdef CONFIG_FSL_CORENET
 | 
				
			||||||
#define CONFIG_SYS_FSL_CORENET_CCM_OFFSET	0x0000
 | 
					#define CONFIG_SYS_FSL_CORENET_CCM_OFFSET	0x0000
 | 
				
			||||||
#define CONFIG_SYS_MPC85xx_DDR_OFFSET		0x8000
 | 
					#define CONFIG_SYS_MPC85xx_DDR_OFFSET		0x8000
 | 
				
			||||||
| 
						 | 
					@ -2044,16 +2186,41 @@ typedef struct ccsr_sec {
 | 
				
			||||||
#define CONFIG_SYS_FSL_CORENET_RCPM_OFFSET	0xE2000
 | 
					#define CONFIG_SYS_FSL_CORENET_RCPM_OFFSET	0xE2000
 | 
				
			||||||
#define CONFIG_SYS_FSL_CORENET_SERDES_OFFSET	0xEA000
 | 
					#define CONFIG_SYS_FSL_CORENET_SERDES_OFFSET	0xEA000
 | 
				
			||||||
#define CONFIG_SYS_FSL_CPC_OFFSET		0x10000
 | 
					#define CONFIG_SYS_FSL_CPC_OFFSET		0x10000
 | 
				
			||||||
#define CONFIG_SYS_MPC85xx_DMA_OFFSET		0x100000
 | 
					#define CONFIG_SYS_MPC85xx_DMA1_OFFSET		0x100000
 | 
				
			||||||
 | 
					#define CONFIG_SYS_MPC85xx_DMA2_OFFSET		0x101000
 | 
				
			||||||
 | 
					#define CONFIG_SYS_MPC85xx_DMA_OFFSET		CONFIG_SYS_MPC85xx_DMA1_OFFSET
 | 
				
			||||||
#define CONFIG_SYS_MPC85xx_ESPI_OFFSET		0x110000
 | 
					#define CONFIG_SYS_MPC85xx_ESPI_OFFSET		0x110000
 | 
				
			||||||
#define CONFIG_SYS_MPC85xx_ESDHC_OFFSET		0x114000
 | 
					#define CONFIG_SYS_MPC85xx_ESDHC_OFFSET		0x114000
 | 
				
			||||||
#define CONFIG_SYS_MPC85xx_LBC_OFFSET		0x124000
 | 
					#define CONFIG_SYS_MPC85xx_LBC_OFFSET		0x124000
 | 
				
			||||||
#define CONFIG_SYS_MPC85xx_GPIO_OFFSET		0x130000
 | 
					#define CONFIG_SYS_MPC85xx_GPIO_OFFSET		0x130000
 | 
				
			||||||
#define CONFIG_SYS_MPC85xx_USB_OFFSET		0x210000
 | 
					#define CONFIG_SYS_MPC85xx_PCIE1_OFFSET		0x200000
 | 
				
			||||||
 | 
					#define CONFIG_SYS_MPC85xx_PCIE2_OFFSET		0x201000
 | 
				
			||||||
 | 
					#define CONFIG_SYS_MPC85xx_PCIE3_OFFSET		0x202000
 | 
				
			||||||
 | 
					#define CONFIG_SYS_MPC85xx_PCIE4_OFFSET		0x203000
 | 
				
			||||||
 | 
					#define CONFIG_SYS_MPC85xx_USB1_OFFSET		0x210000
 | 
				
			||||||
 | 
					#define CONFIG_SYS_MPC85xx_USB2_OFFSET		0x211000
 | 
				
			||||||
 | 
					#define CONFIG_SYS_MPC85xx_USB_OFFSET		CONFIG_SYS_MPC85xx_USB1_OFFSET
 | 
				
			||||||
 | 
					#define CONFIG_SYS_MPC85xx_SATA1_OFFSET		0x220000
 | 
				
			||||||
 | 
					#define CONFIG_SYS_MPC85xx_SATA2_OFFSET		0x221000
 | 
				
			||||||
#define CONFIG_SYS_FSL_SEC_OFFSET		0x300000
 | 
					#define CONFIG_SYS_FSL_SEC_OFFSET		0x300000
 | 
				
			||||||
 | 
					#define CONFIG_SYS_FSL_CORENET_PME_OFFSET	0x316000
 | 
				
			||||||
#define CONFIG_SYS_FSL_CORENET_QMAN_OFFSET	0x318000
 | 
					#define CONFIG_SYS_FSL_CORENET_QMAN_OFFSET	0x318000
 | 
				
			||||||
#define CONFIG_SYS_FSL_CORENET_BMAN_OFFSET	0x31a000
 | 
					#define CONFIG_SYS_FSL_CORENET_BMAN_OFFSET	0x31a000
 | 
				
			||||||
#define CONFIG_SYS_TSEC1_OFFSET			0x4e0000 /* FM1@DTSEC0 */
 | 
					#define CONFIG_SYS_FSL_FM1_OFFSET		0x400000
 | 
				
			||||||
 | 
					#define CONFIG_SYS_FSL_FM1_RX0_1G_OFFSET	0x488000
 | 
				
			||||||
 | 
					#define CONFIG_SYS_FSL_FM1_RX1_1G_OFFSET	0x489000
 | 
				
			||||||
 | 
					#define CONFIG_SYS_FSL_FM1_RX2_1G_OFFSET	0x48a000
 | 
				
			||||||
 | 
					#define CONFIG_SYS_FSL_FM1_RX3_1G_OFFSET	0x48b000
 | 
				
			||||||
 | 
					#define CONFIG_SYS_FSL_FM1_RX4_1G_OFFSET	0x48c000
 | 
				
			||||||
 | 
					#define CONFIG_SYS_FSL_FM1_RX0_10G_OFFSET	0x490000
 | 
				
			||||||
 | 
					#define CONFIG_SYS_FSL_FM1_DTSEC1_OFFSET	0x4e0000
 | 
				
			||||||
 | 
					#define CONFIG_SYS_FSL_FM2_OFFSET		0x500000
 | 
				
			||||||
 | 
					#define CONFIG_SYS_FSL_FM2_RX0_1G_OFFSET	0x588000
 | 
				
			||||||
 | 
					#define CONFIG_SYS_FSL_FM2_RX1_1G_OFFSET	0x589000
 | 
				
			||||||
 | 
					#define CONFIG_SYS_FSL_FM2_RX2_1G_OFFSET	0x58a000
 | 
				
			||||||
 | 
					#define CONFIG_SYS_FSL_FM2_RX3_1G_OFFSET	0x58b000
 | 
				
			||||||
 | 
					#define CONFIG_SYS_FSL_FM2_RX4_1G_OFFSET	0x58c000
 | 
				
			||||||
 | 
					#define CONFIG_SYS_FSL_FM2_RX0_10G_OFFSET	0x590000
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
#define CONFIG_SYS_MPC85xx_ECM_OFFSET		0x0000
 | 
					#define CONFIG_SYS_MPC85xx_ECM_OFFSET		0x0000
 | 
				
			||||||
#define CONFIG_SYS_MPC85xx_DDR_OFFSET		0x2000
 | 
					#define CONFIG_SYS_MPC85xx_DDR_OFFSET		0x2000
 | 
				
			||||||
| 
						 | 
					@ -2098,6 +2265,8 @@ typedef struct ccsr_sec {
 | 
				
			||||||
	(CONFIG_SYS_IMMR + CONFIG_SYS_FSL_CORENET_QMAN_OFFSET)
 | 
						(CONFIG_SYS_IMMR + CONFIG_SYS_FSL_CORENET_QMAN_OFFSET)
 | 
				
			||||||
#define CONFIG_SYS_FSL_CORENET_BMAN_ADDR \
 | 
					#define CONFIG_SYS_FSL_CORENET_BMAN_ADDR \
 | 
				
			||||||
	(CONFIG_SYS_IMMR + CONFIG_SYS_FSL_CORENET_BMAN_OFFSET)
 | 
						(CONFIG_SYS_IMMR + CONFIG_SYS_FSL_CORENET_BMAN_OFFSET)
 | 
				
			||||||
 | 
					#define CONFIG_SYS_FSL_CORENET_PME_ADDR \
 | 
				
			||||||
 | 
						(CONFIG_SYS_IMMR + CONFIG_SYS_FSL_CORENET_PME_OFFSET)
 | 
				
			||||||
#define CONFIG_SYS_MPC85xx_GUTS_ADDR \
 | 
					#define CONFIG_SYS_MPC85xx_GUTS_ADDR \
 | 
				
			||||||
	(CONFIG_SYS_IMMR + CONFIG_SYS_MPC85xx_GUTS_OFFSET)
 | 
						(CONFIG_SYS_IMMR + CONFIG_SYS_MPC85xx_GUTS_OFFSET)
 | 
				
			||||||
#define CONFIG_SYS_FSL_CORENET_CCM_ADDR \
 | 
					#define CONFIG_SYS_FSL_CORENET_CCM_ADDR \
 | 
				
			||||||
| 
						 | 
					@ -2146,6 +2315,12 @@ typedef struct ccsr_sec {
 | 
				
			||||||
	(CONFIG_SYS_IMMR + CONFIG_SYS_MPC85xx_USB_OFFSET)
 | 
						(CONFIG_SYS_IMMR + CONFIG_SYS_MPC85xx_USB_OFFSET)
 | 
				
			||||||
#define CONFIG_SYS_FSL_SEC_ADDR \
 | 
					#define CONFIG_SYS_FSL_SEC_ADDR \
 | 
				
			||||||
	(CONFIG_SYS_IMMR + CONFIG_SYS_FSL_SEC_OFFSET)
 | 
						(CONFIG_SYS_IMMR + CONFIG_SYS_FSL_SEC_OFFSET)
 | 
				
			||||||
 | 
					#define CONFIG_SYS_FSL_FM1_ADDR \
 | 
				
			||||||
 | 
						(CONFIG_SYS_IMMR + CONFIG_SYS_FSL_FM1_OFFSET)
 | 
				
			||||||
 | 
					#define CONFIG_SYS_FSL_FM1_DTSEC1_ADDR \
 | 
				
			||||||
 | 
						(CONFIG_SYS_IMMR + CONFIG_SYS_FSL_FM1_DTSEC1_OFFSET)
 | 
				
			||||||
 | 
					#define CONFIG_SYS_FSL_FM2_ADDR \
 | 
				
			||||||
 | 
						(CONFIG_SYS_IMMR + CONFIG_SYS_FSL_FM2_OFFSET)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define CONFIG_SYS_PCI1_ADDR \
 | 
					#define CONFIG_SYS_PCI1_ADDR \
 | 
				
			||||||
	(CONFIG_SYS_IMMR + CONFIG_SYS_MPC85xx_PCI1_OFFSET)
 | 
						(CONFIG_SYS_IMMR + CONFIG_SYS_MPC85xx_PCI1_OFFSET)
 | 
				
			||||||
| 
						 | 
					@ -2157,6 +2332,8 @@ typedef struct ccsr_sec {
 | 
				
			||||||
	(CONFIG_SYS_IMMR + CONFIG_SYS_MPC85xx_PCIE2_OFFSET)
 | 
						(CONFIG_SYS_IMMR + CONFIG_SYS_MPC85xx_PCIE2_OFFSET)
 | 
				
			||||||
#define CONFIG_SYS_PCIE3_ADDR \
 | 
					#define CONFIG_SYS_PCIE3_ADDR \
 | 
				
			||||||
	(CONFIG_SYS_IMMR + CONFIG_SYS_MPC85xx_PCIE3_OFFSET)
 | 
						(CONFIG_SYS_IMMR + CONFIG_SYS_MPC85xx_PCIE3_OFFSET)
 | 
				
			||||||
 | 
					#define CONFIG_SYS_PCIE4_ADDR \
 | 
				
			||||||
 | 
						(CONFIG_SYS_IMMR + CONFIG_SYS_MPC85xx_PCIE4_OFFSET)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define TSEC_BASE_ADDR		(CONFIG_SYS_IMMR + CONFIG_SYS_TSEC1_OFFSET)
 | 
					#define TSEC_BASE_ADDR		(CONFIG_SYS_IMMR + CONFIG_SYS_TSEC1_OFFSET)
 | 
				
			||||||
#define MDIO_BASE_ADDR		(CONFIG_SYS_IMMR + CONFIG_SYS_MDIO1_OFFSET)
 | 
					#define MDIO_BASE_ADDR		(CONFIG_SYS_IMMR + CONFIG_SYS_MDIO1_OFFSET)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -495,6 +495,7 @@
 | 
				
			||||||
#define   L1CSR1_ICFI		0x00000002	/* Instruction Cache Flash Invalidate */
 | 
					#define   L1CSR1_ICFI		0x00000002	/* Instruction Cache Flash Invalidate */
 | 
				
			||||||
#define   L1CSR1_ICE		0x00000001	/* Instruction Cache Enable */
 | 
					#define   L1CSR1_ICE		0x00000001	/* Instruction Cache Enable */
 | 
				
			||||||
#define SPRN_L1CSR2	0x25e	/* L1 Data Cache Control and Status Register 2 */
 | 
					#define SPRN_L1CSR2	0x25e	/* L1 Data Cache Control and Status Register 2 */
 | 
				
			||||||
 | 
					#define   L1CSR2_DCWS		0x40000000	/* Data Cache Write Shadow */
 | 
				
			||||||
#define SPRN_L2CSR0	0x3f9	/* L2 Data Cache Control and Status Register 0 */
 | 
					#define SPRN_L2CSR0	0x3f9	/* L2 Data Cache Control and Status Register 0 */
 | 
				
			||||||
#define   L2CSR0_L2E		0x80000000	/* L2 Cache Enable */
 | 
					#define   L2CSR0_L2E		0x80000000	/* L2 Cache Enable */
 | 
				
			||||||
#define   L2CSR0_L2PE		0x40000000	/* L2 Cache Parity/ECC Enable */
 | 
					#define   L2CSR0_L2PE		0x40000000	/* L2 Cache Parity/ECC Enable */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -169,7 +169,7 @@ typedef int (init_fnc_t) (void);
 | 
				
			||||||
static int init_baudrate (void)
 | 
					static int init_baudrate (void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char tmp[64];	/* long enough for environment variables */
 | 
						char tmp[64];	/* long enough for environment variables */
 | 
				
			||||||
	int i = getenv_r ("baudrate", tmp, sizeof (tmp));
 | 
						int i = getenv_f("baudrate", tmp, sizeof (tmp));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	gd->baudrate = (i > 0)
 | 
						gd->baudrate = (i > 0)
 | 
				
			||||||
			? (int) simple_strtoul (tmp, NULL, 10)
 | 
								? (int) simple_strtoul (tmp, NULL, 10)
 | 
				
			||||||
| 
						 | 
					@ -442,7 +442,7 @@ void board_init_f (ulong bootflag)
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * reserve protected RAM
 | 
						 * reserve protected RAM
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	i = getenv_r ("pram", (char *)tmp, sizeof (tmp));
 | 
						i = getenv_f("pram", (char *)tmp, sizeof (tmp));
 | 
				
			||||||
	reg = (i > 0) ? simple_strtoul ((const char *)tmp, NULL, 10) : CONFIG_PRAM;
 | 
						reg = (i > 0) ? simple_strtoul ((const char *)tmp, NULL, 10) : CONFIG_PRAM;
 | 
				
			||||||
	addr -= (reg << 10);		/* size is in kB */
 | 
						addr -= (reg << 10);		/* size is in kB */
 | 
				
			||||||
	debug ("Reserving %ldk for protected RAM at %08lx\n", reg, addr);
 | 
						debug ("Reserving %ldk for protected RAM at %08lx\n", reg, addr);
 | 
				
			||||||
| 
						 | 
					@ -790,7 +790,7 @@ void board_init_r (gd_t *id, ulong dest_addr)
 | 
				
			||||||
	 * Fill in missing fields of bd_info.
 | 
						 * Fill in missing fields of bd_info.
 | 
				
			||||||
	 * We do this here, where we have "normal" access to the
 | 
						 * We do this here, where we have "normal" access to the
 | 
				
			||||||
	 * environment; we used to do this still running from ROM,
 | 
						 * environment; we used to do this still running from ROM,
 | 
				
			||||||
	 * where had to use getenv_r(), which can be pretty slow when
 | 
						 * where had to use getenv_f(), which can be pretty slow when
 | 
				
			||||||
	 * the environment is in EEPROM.
 | 
						 * the environment is in EEPROM.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -88,7 +88,7 @@ ulong monitor_flash_len;
 | 
				
			||||||
static int init_baudrate(void)
 | 
					static int init_baudrate(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char tmp[64];		/* long enough for environment variables */
 | 
						char tmp[64];		/* long enough for environment variables */
 | 
				
			||||||
	int i = getenv_r("baudrate", tmp, sizeof(tmp));
 | 
						int i = getenv_f("baudrate", tmp, sizeof(tmp));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	gd->baudrate = (i > 0)
 | 
						gd->baudrate = (i > 0)
 | 
				
			||||||
	    ? (int)simple_strtoul(tmp, NULL, 10)
 | 
						    ? (int)simple_strtoul(tmp, NULL, 10)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -248,7 +248,7 @@ void mv6436x_eth_initialize (bd_t * bis)
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		temp = getenv_r (s, buf, sizeof (buf));
 | 
							temp = getenv_f(s, buf, sizeof (buf));
 | 
				
			||||||
		s = (temp > 0) ? buf : NULL;
 | 
							s = (temp > 0) ? buf : NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef DEBUG
 | 
					#ifdef DEBUG
 | 
				
			||||||
| 
						 | 
					@ -351,7 +351,7 @@ void mv6436x_eth_initialize (bd_t * bis)
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		temp = getenv_r (s, buf, sizeof (buf));
 | 
							temp = getenv_f(s, buf, sizeof (buf));
 | 
				
			||||||
		s = (temp > 0) ? buf : NULL;
 | 
							s = (temp > 0) ? buf : NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef DEBUG
 | 
					#ifdef DEBUG
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -248,7 +248,7 @@ void mv6446x_eth_initialize (bd_t * bis)
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		temp = getenv_r (s, buf, sizeof (buf));
 | 
							temp = getenv_f(s, buf, sizeof (buf));
 | 
				
			||||||
		s = (temp > 0) ? buf : NULL;
 | 
							s = (temp > 0) ? buf : NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef DEBUG
 | 
					#ifdef DEBUG
 | 
				
			||||||
| 
						 | 
					@ -350,7 +350,7 @@ void mv6446x_eth_initialize (bd_t * bis)
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		temp = getenv_r (s, buf, sizeof (buf));
 | 
							temp = getenv_f(s, buf, sizeof (buf));
 | 
				
			||||||
		s = (temp > 0) ? buf : NULL;
 | 
							s = (temp > 0) ? buf : NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef DEBUG
 | 
					#ifdef DEBUG
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -34,7 +34,7 @@ int checkboard(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char tmp[64];
 | 
						char tmp[64];
 | 
				
			||||||
	char *s, *e;
 | 
						char *s, *e;
 | 
				
			||||||
	int i = getenv_r("serial", tmp, sizeof(tmp));
 | 
						int i = getenv_f("serial", tmp, sizeof(tmp));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (i < 0) {
 | 
						if (i < 0) {
 | 
				
			||||||
		printf("Avnet Virtex4 FX12 with no serial #");
 | 
							printf("Avnet Virtex4 FX12 with no serial #");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -245,7 +245,7 @@ int testdram (void)
 | 
				
			||||||
	uint *pend = (uint *) L1_MEMSIZE;
 | 
						uint *pend = (uint *) L1_MEMSIZE;
 | 
				
			||||||
	uint *p;
 | 
						uint *p;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (getenv_r("booted",NULL,0) <= 0)
 | 
						if (getenv_f("booted",NULL,0) <= 0)
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
		printf ("testdram..");
 | 
							printf ("testdram..");
 | 
				
			||||||
	/*AA*/
 | 
						/*AA*/
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -183,7 +183,7 @@ int misc_init_r (void)
 | 
				
			||||||
int checkboard (void)
 | 
					int checkboard (void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char str[64];
 | 
						char str[64];
 | 
				
			||||||
	int i = getenv_r ("serial#", str, sizeof(str));
 | 
						int i = getenv_f("serial#", str, sizeof(str));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	puts ("Board: ");
 | 
						puts ("Board: ");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -62,7 +62,7 @@ int board_early_init_f (void)
 | 
				
			||||||
int checkboard (void)
 | 
					int checkboard (void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char str[64];
 | 
						char str[64];
 | 
				
			||||||
	int i = getenv_r ("serial#", str, sizeof (str));
 | 
						int i = getenv_f("serial#", str, sizeof (str));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	puts ("Board: ");
 | 
						puts ("Board: ");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -404,7 +404,7 @@ int misc_init_r(void)
 | 
				
			||||||
int checkboard (void)
 | 
					int checkboard (void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char str[64];
 | 
						char str[64];
 | 
				
			||||||
	int i = getenv_r ("serial#", str, sizeof(str));
 | 
						int i = getenv_f("serial#", str, sizeof(str));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	puts ("Board: ");
 | 
						puts ("Board: ");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -151,7 +151,7 @@ int checkboard (void)
 | 
				
			||||||
	int index;
 | 
						int index;
 | 
				
			||||||
	int len;
 | 
						int len;
 | 
				
			||||||
	char str[64];
 | 
						char str[64];
 | 
				
			||||||
	int i = getenv_r ("serial#", str, sizeof (str));
 | 
						int i = getenv_f("serial#", str, sizeof (str));
 | 
				
			||||||
	const unsigned char *fpga;
 | 
						const unsigned char *fpga;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	puts ("Board: ");
 | 
						puts ("Board: ");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -173,7 +173,7 @@ int misc_init_r (void)
 | 
				
			||||||
int checkboard (void)
 | 
					int checkboard (void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char str[64];
 | 
						char str[64];
 | 
				
			||||||
	int i = getenv_r ("serial#", str, sizeof(str));
 | 
						int i = getenv_f("serial#", str, sizeof(str));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	puts ("Board: ");
 | 
						puts ("Board: ");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -157,7 +157,7 @@ int checkboard (void)
 | 
				
			||||||
	int index;
 | 
						int index;
 | 
				
			||||||
	int len;
 | 
						int len;
 | 
				
			||||||
	char str[64];
 | 
						char str[64];
 | 
				
			||||||
	int i = getenv_r ("serial#", str, sizeof (str));
 | 
						int i = getenv_f("serial#", str, sizeof (str));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	puts ("Board: ");
 | 
						puts ("Board: ");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -96,7 +96,7 @@ int checkboard (void)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	puts ("Board: ");
 | 
						puts ("Board: ");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (getenv_r("serial#", str, sizeof(str))  == -1) {
 | 
						if (getenv_f("serial#", str, sizeof(str))  == -1) {
 | 
				
			||||||
		puts ("### No HW ID - assuming CMS700");
 | 
							puts ("### No HW ID - assuming CMS700");
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		puts(str);
 | 
							puts(str);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -94,7 +94,7 @@ int misc_init_r (void)
 | 
				
			||||||
int checkboard (void)
 | 
					int checkboard (void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char str[64];
 | 
						char str[64];
 | 
				
			||||||
	int i = getenv_r ("serial#", str, sizeof(str));
 | 
						int i = getenv_f("serial#", str, sizeof(str));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	puts ("Board: ");
 | 
						puts ("Board: ");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -416,7 +416,7 @@ int checkboard(void)
 | 
				
			||||||
	int len;
 | 
						int len;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	char str[64];
 | 
						char str[64];
 | 
				
			||||||
	int i = getenv_r("serial#", str, sizeof(str));
 | 
						int i = getenv_f("serial#", str, sizeof(str));
 | 
				
			||||||
	unsigned short ver;
 | 
						unsigned short ver;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	puts("Board: ");
 | 
						puts("Board: ");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -248,7 +248,7 @@ void mv6436x_eth_initialize (bd_t * bis)
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		temp = getenv_r (s, buf, sizeof (buf));
 | 
							temp = getenv_f(s, buf, sizeof (buf));
 | 
				
			||||||
		s = (temp > 0) ? buf : NULL;
 | 
							s = (temp > 0) ? buf : NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef DEBUG
 | 
					#ifdef DEBUG
 | 
				
			||||||
| 
						 | 
					@ -352,7 +352,7 @@ void mv6436x_eth_initialize (bd_t * bis)
 | 
				
			||||||
			return;
 | 
								return;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		temp = getenv_r (s, buf, sizeof (buf));
 | 
							temp = getenv_f(s, buf, sizeof (buf));
 | 
				
			||||||
		s = (temp > 0) ? buf : NULL;
 | 
							s = (temp > 0) ? buf : NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef DEBUG
 | 
					#ifdef DEBUG
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -153,7 +153,7 @@ int checkboard (void)
 | 
				
			||||||
	int index;
 | 
						int index;
 | 
				
			||||||
	int len;
 | 
						int len;
 | 
				
			||||||
	char str[64];
 | 
						char str[64];
 | 
				
			||||||
	int i = getenv_r ("serial#", str, sizeof (str));
 | 
						int i = getenv_f("serial#", str, sizeof (str));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	puts ("Board: ");
 | 
						puts ("Board: ");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -168,7 +168,7 @@ int checkboard (void)
 | 
				
			||||||
	int index;
 | 
						int index;
 | 
				
			||||||
	int len;
 | 
						int len;
 | 
				
			||||||
	char str[64];
 | 
						char str[64];
 | 
				
			||||||
	int i = getenv_r ("serial#", str, sizeof (str));
 | 
						int i = getenv_f("serial#", str, sizeof (str));
 | 
				
			||||||
	int fpga;
 | 
						int fpga;
 | 
				
			||||||
	unsigned short val;
 | 
						unsigned short val;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -86,7 +86,7 @@ int misc_init_r (void)
 | 
				
			||||||
int checkboard (void)
 | 
					int checkboard (void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char str[64];
 | 
						char str[64];
 | 
				
			||||||
	int i = getenv_r ("serial#", str, sizeof(str));
 | 
						int i = getenv_f("serial#", str, sizeof(str));
 | 
				
			||||||
	unsigned char trans[16] = {0x0,0x8,0x4,0xc,0x2,0xa,0x6,0xe,
 | 
						unsigned char trans[16] = {0x0,0x8,0x4,0xc,0x2,0xa,0x6,0xe,
 | 
				
			||||||
				   0x1,0x9,0x5,0xd,0x3,0xb,0x7,0xf};
 | 
									   0x1,0x9,0x5,0xd,0x3,0xb,0x7,0xf};
 | 
				
			||||||
	unsigned char id1, id2, rev;
 | 
						unsigned char id1, id2, rev;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -163,7 +163,7 @@ int checkboard (void)
 | 
				
			||||||
	int index;
 | 
						int index;
 | 
				
			||||||
	int len;
 | 
						int len;
 | 
				
			||||||
	char str[64];
 | 
						char str[64];
 | 
				
			||||||
	int i = getenv_r ("serial#", str, sizeof (str));
 | 
						int i = getenv_f("serial#", str, sizeof (str));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	puts ("Board: ");
 | 
						puts ("Board: ");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -350,7 +350,7 @@ int checkboard(void)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	puts("Board: DU440");
 | 
						puts("Board: DU440");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (getenv_r("serial#", serno, sizeof(serno)) > 0) {
 | 
						if (getenv_f("serial#", serno, sizeof(serno)) > 0) {
 | 
				
			||||||
		puts(", serial# ");
 | 
							puts(", serial# ");
 | 
				
			||||||
		puts(serno);
 | 
							puts(serno);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -650,7 +650,7 @@ int misc_init_r (void)
 | 
				
			||||||
int checkboard (void)
 | 
					int checkboard (void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char str[64];
 | 
						char str[64];
 | 
				
			||||||
	int i = getenv_r ("serial#", str, sizeof(str));
 | 
						int i = getenv_f("serial#", str, sizeof(str));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	puts ("Board: ");
 | 
						puts ("Board: ");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -660,7 +660,7 @@ int checkboard (void)
 | 
				
			||||||
		puts(str);
 | 
							puts(str);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (getenv_r("bd_type", str, sizeof(str)) != -1) {
 | 
						if (getenv_f("bd_type", str, sizeof(str)) != -1) {
 | 
				
			||||||
		printf(" (%s", str);
 | 
							printf(" (%s", str);
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		puts(" (Missing bd_type!");
 | 
							puts(" (Missing bd_type!");
 | 
				
			||||||
| 
						 | 
					@ -780,7 +780,7 @@ void video_get_info_str (int line_number, char *info)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char str[64];
 | 
						char str[64];
 | 
				
			||||||
	char str2[64];
 | 
						char str2[64];
 | 
				
			||||||
	int i = getenv_r("serial#", str2, sizeof(str));
 | 
						int i = getenv_f("serial#", str2, sizeof(str));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (line_number == 1) {
 | 
						if (line_number == 1) {
 | 
				
			||||||
		sprintf(str, " Board: ");
 | 
							sprintf(str, " Board: ");
 | 
				
			||||||
| 
						 | 
					@ -791,7 +791,7 @@ void video_get_info_str (int line_number, char *info)
 | 
				
			||||||
			strcat(str, str2);
 | 
								strcat(str, str2);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		if (getenv_r("bd_type", str2, sizeof(str2)) != -1) {
 | 
							if (getenv_f("bd_type", str2, sizeof(str2)) != -1) {
 | 
				
			||||||
			strcat(str, " (");
 | 
								strcat(str, " (");
 | 
				
			||||||
			strcat(str, str2);
 | 
								strcat(str, str2);
 | 
				
			||||||
		} else {
 | 
							} else {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -196,7 +196,7 @@ int misc_init_r (void)
 | 
				
			||||||
int checkboard (void)
 | 
					int checkboard (void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char str[64];
 | 
						char str[64];
 | 
				
			||||||
	int i = getenv_r ("serial#", str, sizeof(str));
 | 
						int i = getenv_f("serial#", str, sizeof(str));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	puts ("Board: ");
 | 
						puts ("Board: ");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -206,7 +206,7 @@ int checkboard (void)
 | 
				
			||||||
		puts(str);
 | 
							puts(str);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (getenv_r("bd_type", str, sizeof(str)) != -1) {
 | 
						if (getenv_f("bd_type", str, sizeof(str)) != -1) {
 | 
				
			||||||
		printf(" (%s", str);
 | 
							printf(" (%s", str);
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		puts(" (Missing bd_type!");
 | 
							puts(" (Missing bd_type!");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -184,7 +184,7 @@ int checkboard(void)
 | 
				
			||||||
		puts("Board: EtherCAN/2 Gateway");
 | 
							puts("Board: EtherCAN/2 Gateway");
 | 
				
			||||||
		break;
 | 
							break;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if (getenv_r("serial#", str, sizeof(str)) > 0) {
 | 
						if (getenv_f("serial#", str, sizeof(str)) > 0) {
 | 
				
			||||||
		puts(", serial# ");
 | 
							puts(", serial# ");
 | 
				
			||||||
		puts(str);
 | 
							puts(str);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -68,7 +68,7 @@ int board_early_init_f (void)
 | 
				
			||||||
int checkboard (void)
 | 
					int checkboard (void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char str[64];
 | 
						char str[64];
 | 
				
			||||||
	int i = getenv_r ("serial#", str, sizeof (str));
 | 
						int i = getenv_f("serial#", str, sizeof (str));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	puts ("Board: ");
 | 
						puts ("Board: ");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -258,7 +258,7 @@ int checkboard(void)
 | 
				
			||||||
	char str[32];
 | 
						char str[32];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	puts("Board: esd ARM9 HMI Panel - OTC570");
 | 
						puts("Board: esd ARM9 HMI Panel - OTC570");
 | 
				
			||||||
	if (getenv_r("serial#", str, sizeof(str)) > 0) {
 | 
						if (getenv_f("serial#", str, sizeof(str)) > 0) {
 | 
				
			||||||
		puts(", serial# ");
 | 
							puts(", serial# ");
 | 
				
			||||||
		puts(str);
 | 
							puts(str);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -308,7 +308,7 @@ int misc_init_r(void)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	printf("USART0: ");
 | 
						printf("USART0: ");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (getenv_r("usart0", str, sizeof(str)) == -1) {
 | 
						if (getenv_f("usart0", str, sizeof(str)) == -1) {
 | 
				
			||||||
		printf("No entry - assuming 1-wire\n");
 | 
							printf("No entry - assuming 1-wire\n");
 | 
				
			||||||
		/* CTS pin, works as mode select pin (0 = 1-wire; 1 = RS485) */
 | 
							/* CTS pin, works as mode select pin (0 = 1-wire; 1 = RS485) */
 | 
				
			||||||
		at91_set_pio_output(AT91_PIO_PORTA, 29, 0);
 | 
							at91_set_pio_output(AT91_PIO_PORTA, 29, 0);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -298,7 +298,7 @@ int misc_init_r (void)
 | 
				
			||||||
int checkboard (void)
 | 
					int checkboard (void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char str[64];
 | 
						char str[64];
 | 
				
			||||||
	int i = getenv_r ("serial#", str, sizeof(str));
 | 
						int i = getenv_f("serial#", str, sizeof(str));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	puts ("Board: ");
 | 
						puts ("Board: ");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -240,7 +240,7 @@ int misc_init_r(void)
 | 
				
			||||||
int checkboard(void)
 | 
					int checkboard(void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char str[64];
 | 
						char str[64];
 | 
				
			||||||
	int i = getenv_r("serial#", str, sizeof(str));
 | 
						int i = getenv_f("serial#", str, sizeof(str));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	puts("Board: ");
 | 
						puts("Board: ");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -123,7 +123,7 @@ int checkboard (void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	ulong val;
 | 
						ulong val;
 | 
				
			||||||
	char str[64];
 | 
						char str[64];
 | 
				
			||||||
	int i = getenv_r("serial#", str, sizeof(str));
 | 
						int i = getenv_f("serial#", str, sizeof(str));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	puts ("Board: ");
 | 
						puts ("Board: ");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -271,7 +271,7 @@ int misc_init_r (void)
 | 
				
			||||||
int checkboard (void)
 | 
					int checkboard (void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char str[64];
 | 
						char str[64];
 | 
				
			||||||
	int i = getenv_r ("serial#", str, sizeof(str));
 | 
						int i = getenv_f("serial#", str, sizeof(str));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	puts ("Board: ");
 | 
						puts ("Board: ");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -281,7 +281,7 @@ int checkboard (void)
 | 
				
			||||||
		puts(str);
 | 
							puts(str);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (getenv_r("bd_type", str, sizeof(str)) != -1) {
 | 
						if (getenv_f("bd_type", str, sizeof(str)) != -1) {
 | 
				
			||||||
		printf(" (%s)", str);
 | 
							printf(" (%s)", str);
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		puts(" (Missing bd_type!)");
 | 
							puts(" (Missing bd_type!)");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -121,7 +121,7 @@ int misc_init_r (void)
 | 
				
			||||||
int checkboard (void)
 | 
					int checkboard (void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char str[64];
 | 
						char str[64];
 | 
				
			||||||
	int i = getenv_r ("serial#", str, sizeof(str));
 | 
						int i = getenv_f("serial#", str, sizeof(str));
 | 
				
			||||||
	int flashcnt;
 | 
						int flashcnt;
 | 
				
			||||||
	int delay;
 | 
						int delay;
 | 
				
			||||||
	u8 *led_reg = (u8 *)(CAN_BA + 0x1000);
 | 
						u8 *led_reg = (u8 *)(CAN_BA + 0x1000);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -173,7 +173,7 @@ int misc_init_r (void)
 | 
				
			||||||
int checkboard (void)
 | 
					int checkboard (void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char str[64];
 | 
						char str[64];
 | 
				
			||||||
	int i = getenv_r ("serial#", str, sizeof(str));
 | 
						int i = getenv_f("serial#", str, sizeof(str));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	puts ("Board: ");
 | 
						puts ("Board: ");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -708,7 +708,7 @@ gt6426x_eth_initialize(bd_t *bis)
 | 
				
			||||||
				return;
 | 
									return;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		temp = getenv_r (s, buf, sizeof(buf));
 | 
							temp = getenv_f(s, buf, sizeof(buf));
 | 
				
			||||||
		s = (temp > 0) ? buf : NULL;
 | 
							s = (temp > 0) ? buf : NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef DEBUG
 | 
					#ifdef DEBUG
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -46,6 +46,7 @@ COBJS-$(CONFIG_MPC8536DS)	+= ics307_clk.o
 | 
				
			||||||
COBJS-$(CONFIG_MPC8572DS)	+= ics307_clk.o
 | 
					COBJS-$(CONFIG_MPC8572DS)	+= ics307_clk.o
 | 
				
			||||||
COBJS-$(CONFIG_P1022DS)		+= ics307_clk.o
 | 
					COBJS-$(CONFIG_P1022DS)		+= ics307_clk.o
 | 
				
			||||||
COBJS-$(CONFIG_P2020DS)		+= ics307_clk.o
 | 
					COBJS-$(CONFIG_P2020DS)		+= ics307_clk.o
 | 
				
			||||||
 | 
					COBJS-$(CONFIG_P4080DS)		+= ics307_clk.o
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SRCS	:= $(SOBJS:.o=.S) $(COBJS-y:.o=.c)
 | 
					SRCS	:= $(SOBJS:.o=.S) $(COBJS-y:.o=.c)
 | 
				
			||||||
OBJS	:= $(addprefix $(obj),$(COBJS-y))
 | 
					OBJS	:= $(addprefix $(obj),$(COBJS-y))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,55 @@
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Copyright 2007-2009 Freescale Semiconductor, Inc.
 | 
				
			||||||
 | 
					# (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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					LIB	= $(obj)lib$(BOARD).a
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					COBJS-y	+= $(BOARD).o
 | 
				
			||||||
 | 
					COBJS-$(CONFIG_DDR_SPD)	+= ddr.o
 | 
				
			||||||
 | 
					COBJS-$(CONFIG_PCI)	+= pci.o
 | 
				
			||||||
 | 
					COBJS-y	+= law.o
 | 
				
			||||||
 | 
					COBJS-y	+= tlb.o
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					SRCS	:= $(SOBJS:.o=.S) $(COBJS-y:.o=.c)
 | 
				
			||||||
 | 
					OBJS	:= $(addprefix $(obj),$(COBJS-y))
 | 
				
			||||||
 | 
					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
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#########################################################################
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,30 @@
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# Copyright 2007-2009 Freescale Semiconductor, 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
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					# P4080DS board
 | 
				
			||||||
 | 
					#
 | 
				
			||||||
 | 
					ifndef TEXT_BASE
 | 
				
			||||||
 | 
					TEXT_BASE = 0xeff80000
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RESET_VECTOR_ADDRESS = 0xeffffffc
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,259 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright 2009-2010 Freescale Semiconductor, 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 <common.h>
 | 
				
			||||||
 | 
					#include <command.h>
 | 
				
			||||||
 | 
					#include <netdev.h>
 | 
				
			||||||
 | 
					#include <asm/mmu.h>
 | 
				
			||||||
 | 
					#include <asm/processor.h>
 | 
				
			||||||
 | 
					#include <asm/cache.h>
 | 
				
			||||||
 | 
					#include <asm/immap_85xx.h>
 | 
				
			||||||
 | 
					#include <asm/fsl_law.h>
 | 
				
			||||||
 | 
					#include <asm/fsl_ddr_sdram.h>
 | 
				
			||||||
 | 
					#include <asm/fsl_serdes.h>
 | 
				
			||||||
 | 
					#include <asm/fsl_portals.h>
 | 
				
			||||||
 | 
					#include <asm/fsl_liodn.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					extern void pci_of_setup(void *blob, bd_t *bd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "../common/ngpixis.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					DECLARE_GLOBAL_DATA_PTR;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void cpu_mp_lmb_reserve(struct lmb *lmb);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int checkboard (void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						u8 sw;
 | 
				
			||||||
 | 
						struct cpu_type *cpu = gd->cpu;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						printf("Board: %sDS, ", cpu->name);
 | 
				
			||||||
 | 
						printf("Sys ID: 0x%02x, Sys Ver: 0x%02x, FPGA Ver: 0x%02x, ",
 | 
				
			||||||
 | 
							in_8(&pixis->id), in_8(&pixis->arch), in_8(&pixis->scver));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						sw = in_8(&PIXIS_SW(PIXIS_LBMAP_SWITCH));
 | 
				
			||||||
 | 
						sw = (sw & PIXIS_LBMAP_MASK) >> PIXIS_LBMAP_SHIFT;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (sw < 0x8)
 | 
				
			||||||
 | 
							printf("vBank: %d\n", sw);
 | 
				
			||||||
 | 
						else if (sw == 0x8)
 | 
				
			||||||
 | 
							puts("Promjet\n");
 | 
				
			||||||
 | 
						else if (sw == 0x9)
 | 
				
			||||||
 | 
							puts("NAND\n");
 | 
				
			||||||
 | 
						else
 | 
				
			||||||
 | 
							printf("invalid setting of SW%u\n", PIXIS_LBMAP_SWITCH);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_PHYS_64BIT
 | 
				
			||||||
 | 
						puts("36-bit Addressing\n");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Display the actual SERDES reference clocks as configured by the
 | 
				
			||||||
 | 
						 * dip switches on the board.  Note that the SWx registers could
 | 
				
			||||||
 | 
						 * technically be set to force the reference clocks to match the
 | 
				
			||||||
 | 
						 * values that the SERDES expects (or vice versa).  For now, however,
 | 
				
			||||||
 | 
						 * we just display both values and hope the user notices when they
 | 
				
			||||||
 | 
						 * don't match.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						puts("SERDES Reference Clocks: ");
 | 
				
			||||||
 | 
						sw = in_8(&PIXIS_SW(3));
 | 
				
			||||||
 | 
						printf("Bank1=%uMHz ", (sw & 0x40) ? 125 : 100);
 | 
				
			||||||
 | 
						printf("Bank2=%sMHz ", (sw & 0x20) ? "156.25" : "125");
 | 
				
			||||||
 | 
						printf("Bank3=%sMHz\n", (sw & 0x10) ? "156.25" : "125");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int board_early_init_f(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * P4080 DS board only uses the DDR1_MCK0/3 and DDR2_MCK0/3
 | 
				
			||||||
 | 
						 * disable the DDR1_MCK1/2/4/5 and DDR2_MCK1/2/4/5 to reduce
 | 
				
			||||||
 | 
						 * the noise introduced by these unterminated and unused clock pairs.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						setbits_be32(&gur->ddrclkdr, 0x001B001B);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int board_early_init_r(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						const unsigned int flashbase = CONFIG_SYS_FLASH_BASE;
 | 
				
			||||||
 | 
						const u8 flash_esel = find_tlb_idx((void *)flashbase, 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * Remap Boot flash + PROMJET region to caching-inhibited
 | 
				
			||||||
 | 
						 * so that flash can be erased properly.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Flush d-cache and invalidate i-cache of any FLASH data */
 | 
				
			||||||
 | 
						flush_dcache();
 | 
				
			||||||
 | 
						invalidate_icache();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* invalidate existing TLB entry for flash + promjet */
 | 
				
			||||||
 | 
						disable_tlb(flash_esel);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						set_tlb(1, flashbase, CONFIG_SYS_FLASH_BASE_PHYS,	/* tlb, epn, rpn */
 | 
				
			||||||
 | 
								MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,	/* perms, wimge */
 | 
				
			||||||
 | 
								0, flash_esel, BOOKE_PAGESZ_256M, 1);	/* ts, esel, tsize, iprot */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						set_liodns();
 | 
				
			||||||
 | 
						setup_portals();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_SRIO1
 | 
				
			||||||
 | 
						if (is_serdes_configured(SRIO1)) {
 | 
				
			||||||
 | 
							set_next_law(CONFIG_SYS_RIO1_MEM_PHYS, LAW_SIZE_256M,
 | 
				
			||||||
 | 
									LAW_TRGT_IF_RIO_1);
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							printf ("    SRIO1: disabled\n");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						setbits_be32(&gur->devdisr, FSL_CORENET_DEVDISR_SRIO1); /* disable */
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_SRIO2
 | 
				
			||||||
 | 
						if (is_serdes_configured(SRIO2)) {
 | 
				
			||||||
 | 
							set_next_law(CONFIG_SYS_RIO2_MEM_PHYS, LAW_SIZE_256M,
 | 
				
			||||||
 | 
									LAW_TRGT_IF_RIO_2);
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							printf ("    SRIO2: disabled\n");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						setbits_be32(&gur->devdisr, FSL_CORENET_DEVDISR_SRIO2); /* disable */
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const char *serdes_clock_to_string(u32 clock)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						switch(clock) {
 | 
				
			||||||
 | 
						case SRDS_PLLCR0_RFCK_SEL_100:
 | 
				
			||||||
 | 
							return "100";
 | 
				
			||||||
 | 
						case SRDS_PLLCR0_RFCK_SEL_125:
 | 
				
			||||||
 | 
							return "125";
 | 
				
			||||||
 | 
						case SRDS_PLLCR0_RFCK_SEL_156_25:
 | 
				
			||||||
 | 
							return "156.25";
 | 
				
			||||||
 | 
						default:
 | 
				
			||||||
 | 
							return "???";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define NUM_SRDS_BANKS	3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int misc_init_r(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						serdes_corenet_t *srds_regs = (void *)CONFIG_SYS_FSL_CORENET_SERDES_ADDR;
 | 
				
			||||||
 | 
						u32 actual[NUM_SRDS_BANKS];
 | 
				
			||||||
 | 
						unsigned int i;
 | 
				
			||||||
 | 
						u8 sw3;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Warn if the expected SERDES reference clocks don't match the
 | 
				
			||||||
 | 
						 * actual reference clocks.  This needs to be done after calling
 | 
				
			||||||
 | 
						 * p4080_erratum_serdes8(), since that function may modify the clocks.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						sw3 = in_8(&PIXIS_SW(3));
 | 
				
			||||||
 | 
						actual[0] = (sw3 & 0x40) ?
 | 
				
			||||||
 | 
							SRDS_PLLCR0_RFCK_SEL_125 : SRDS_PLLCR0_RFCK_SEL_100;
 | 
				
			||||||
 | 
						actual[1] = (sw3 & 0x20) ?
 | 
				
			||||||
 | 
							SRDS_PLLCR0_RFCK_SEL_156_25 : SRDS_PLLCR0_RFCK_SEL_125;
 | 
				
			||||||
 | 
						actual[2] = (sw3 & 0x10) ?
 | 
				
			||||||
 | 
							SRDS_PLLCR0_RFCK_SEL_156_25 : SRDS_PLLCR0_RFCK_SEL_125;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (i = 0; i < NUM_SRDS_BANKS; i++) {
 | 
				
			||||||
 | 
							u32 expected = srds_regs->bank[i].pllcr0 & SRDS_PLLCR0_RFCK_SEL_MASK;
 | 
				
			||||||
 | 
							if (expected != actual[i]) {
 | 
				
			||||||
 | 
								printf("Warning: SERDES bank %u expects reference clock"
 | 
				
			||||||
 | 
								       " %sMHz, but actual is %sMHz\n", i + 1,
 | 
				
			||||||
 | 
								       serdes_clock_to_string(expected),
 | 
				
			||||||
 | 
								       serdes_clock_to_string(actual[i]));
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					phys_size_t initdram(int board_type)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						phys_size_t dram_size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						puts("Initializing....\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						dram_size = fsl_ddr_sdram();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						setup_ddr_tlbs(dram_size / 0x100000);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						puts("    DDR: ");
 | 
				
			||||||
 | 
						return dram_size;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_MP
 | 
				
			||||||
 | 
					void board_lmb_reserve(struct lmb *lmb)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						cpu_mp_lmb_reserve(lmb);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ft_srio_setup(void *blob)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					#ifdef CONFIG_SRIO1
 | 
				
			||||||
 | 
						if (!is_serdes_configured(SRIO1)) {
 | 
				
			||||||
 | 
							fdt_del_node_and_alias(blob, "rio0");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						fdt_del_node_and_alias(blob, "rio0");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#ifdef CONFIG_SRIO2
 | 
				
			||||||
 | 
						if (!is_serdes_configured(SRIO2)) {
 | 
				
			||||||
 | 
							fdt_del_node_and_alias(blob, "rio1");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						fdt_del_node_and_alias(blob, "rio1");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void ft_board_setup(void *blob, bd_t *bd)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						phys_addr_t base;
 | 
				
			||||||
 | 
						phys_size_t size;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ft_cpu_setup(blob, bd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ft_srio_setup(blob);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						base = getenv_bootm_low();
 | 
				
			||||||
 | 
						size = getenv_bootm_size();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fdt_fixup_memory(blob, (u64)base, (u64)size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_PCI
 | 
				
			||||||
 | 
						pci_of_setup(blob, bd);
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						fdt_fixup_liodn(blob);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int board_eth_init(bd_t *bis)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return pci_eth_init(bis);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,176 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright 2009-2010 Freescale Semiconductor, Inc.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * This program is free software; you can redistribute it and/or
 | 
				
			||||||
 | 
					 * modify it under the terms of the GNU General Public License
 | 
				
			||||||
 | 
					 * Version 2 as published by the Free Software Foundation.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <common.h>
 | 
				
			||||||
 | 
					#include <i2c.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <asm/fsl_ddr_sdram.h>
 | 
				
			||||||
 | 
					#include <asm/fsl_ddr_dimm_params.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void get_spd(ddr3_spd_eeprom_t *spd, unsigned char i2c_address)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ret = i2c_read(i2c_address, 0, 1, (uchar *)spd, sizeof(ddr3_spd_eeprom_t));
 | 
				
			||||||
 | 
						if (ret) {
 | 
				
			||||||
 | 
							debug("DDR: failed to read SPD from address %u\n", i2c_address);
 | 
				
			||||||
 | 
							memset(spd, 0, sizeof(ddr3_spd_eeprom_t));
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					unsigned int fsl_ddr_get_mem_data_rate(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return get_ddr_freq(0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void fsl_ddr_get_spd(ddr3_spd_eeprom_t *ctrl_dimms_spd,
 | 
				
			||||||
 | 
							      unsigned int ctrl_num)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						unsigned int i;
 | 
				
			||||||
 | 
						unsigned int i2c_address = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (i = 0; i < CONFIG_DIMM_SLOTS_PER_CTLR; i++) {
 | 
				
			||||||
 | 
							if (ctrl_num == 0 && i == 0)
 | 
				
			||||||
 | 
								i2c_address = SPD_EEPROM_ADDRESS1;
 | 
				
			||||||
 | 
							else if (ctrl_num == 1 && i == 0)
 | 
				
			||||||
 | 
								i2c_address = SPD_EEPROM_ADDRESS2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							get_spd(&(ctrl_dimms_spd[i]), i2c_address);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					typedef struct {
 | 
				
			||||||
 | 
						u32 datarate_mhz_low;
 | 
				
			||||||
 | 
						u32 datarate_mhz_high;
 | 
				
			||||||
 | 
						u32 n_ranks;
 | 
				
			||||||
 | 
						u32 clk_adjust;
 | 
				
			||||||
 | 
						u32 cpo;
 | 
				
			||||||
 | 
						u32 write_data_delay;
 | 
				
			||||||
 | 
						u32 force_2T;
 | 
				
			||||||
 | 
					} board_specific_parameters_t;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* ranges for parameters:
 | 
				
			||||||
 | 
					 *  wr_data_delay = 0-6
 | 
				
			||||||
 | 
					 *  clk adjust = 0-8
 | 
				
			||||||
 | 
					 *  cpo 2-0x1E (30)
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/* XXX: these values need to be checked for all interleaving modes.  */
 | 
				
			||||||
 | 
					/* XXX: No reliable dual-rank 800 MHz setting has been found.  It may
 | 
				
			||||||
 | 
					 *      seem reliable, but errors will appear when memory intensive
 | 
				
			||||||
 | 
					 *      program is run. */
 | 
				
			||||||
 | 
					/* XXX: Single rank at 800 MHz is OK.  */
 | 
				
			||||||
 | 
					const board_specific_parameters_t board_specific_parameters[][20] = {
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
						/* 	memory controller 0 			*/
 | 
				
			||||||
 | 
						/*	  lo|  hi|  num|  clk| cpo|wrdata|2T	*/
 | 
				
			||||||
 | 
						/*	 mhz| mhz|ranks|adjst|    | delay|	*/
 | 
				
			||||||
 | 
							{  0, 333,    2,    6,   7,    3,  0},
 | 
				
			||||||
 | 
							{334, 400,    2,    6,   9,    3,  0},
 | 
				
			||||||
 | 
							{401, 549,    2,    6,  11,    3,  0},
 | 
				
			||||||
 | 
							{550, 680,    2,    1,  10,    5,  0},
 | 
				
			||||||
 | 
							{681, 850,    2,    1,  12,    5,  0},
 | 
				
			||||||
 | 
							{851, 1050,   2,    1,  12,    5,  0},
 | 
				
			||||||
 | 
							{1051, 1250,  2,    1,  15,    4,  0},
 | 
				
			||||||
 | 
							{1251, 1350,  2,    1,  15,    4,  0},
 | 
				
			||||||
 | 
							{  0, 333,    1,    6,   7,    3,  0},
 | 
				
			||||||
 | 
							{334, 400,    1,    6,   9,    3,  0},
 | 
				
			||||||
 | 
							{401, 549,    1,    6,  11,    3,  0},
 | 
				
			||||||
 | 
							{550, 680,    1,    1,  10,    5,  0},
 | 
				
			||||||
 | 
							{681, 850,    1,    1,  12,    5,  0}
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
						/*	memory controller 1			*/
 | 
				
			||||||
 | 
						/*	  lo|  hi|  num|  clk| cpo|wrdata|2T	*/
 | 
				
			||||||
 | 
						/*	 mhz| mhz|ranks|adjst|    | delay|	*/
 | 
				
			||||||
 | 
							{  0, 333,    2,     6,  7,    3,  0},
 | 
				
			||||||
 | 
							{334, 400,    2,     6,  9,    3,  0},
 | 
				
			||||||
 | 
							{401, 549,    2,     6, 11,    3,  0},
 | 
				
			||||||
 | 
							{550, 680,    2,     1, 11,    6,  0},
 | 
				
			||||||
 | 
							{681, 850,    2,     1, 13,    6,  0},
 | 
				
			||||||
 | 
							{851, 1050,   2,     1, 13,    6,  0},
 | 
				
			||||||
 | 
							{1051, 1250,  2,     1, 15,    4,  0},
 | 
				
			||||||
 | 
							{1251, 1350,  2,     1, 15,    4,  0},
 | 
				
			||||||
 | 
							{  0, 333,    1,     6,  7,    3,  0},
 | 
				
			||||||
 | 
							{334, 400,    1,     6,  9,    3,  0},
 | 
				
			||||||
 | 
							{401, 549,    1,     6, 11,    3,  0},
 | 
				
			||||||
 | 
							{550, 680,    1,     1, 11,    6,  0},
 | 
				
			||||||
 | 
							{681, 850,    1,     1, 13,    6,  0}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void fsl_ddr_board_options(memctl_options_t *popts,
 | 
				
			||||||
 | 
									dimm_params_t *pdimm,
 | 
				
			||||||
 | 
									unsigned int ctrl_num)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						const board_specific_parameters_t *pbsp =
 | 
				
			||||||
 | 
									&(board_specific_parameters[ctrl_num][0]);
 | 
				
			||||||
 | 
						u32 num_params = sizeof(board_specific_parameters[ctrl_num]) /
 | 
				
			||||||
 | 
									sizeof(board_specific_parameters[0][0]);
 | 
				
			||||||
 | 
						u32 i;
 | 
				
			||||||
 | 
						ulong ddr_freq;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* set odt_rd_cfg and odt_wr_cfg. If the there is only one dimm in
 | 
				
			||||||
 | 
						 * that controller, set odt_wr_cfg to 4 for CS0, and 0 to CS1. If
 | 
				
			||||||
 | 
						 * there are two dimms in the controller, set odt_rd_cfg to 3 and
 | 
				
			||||||
 | 
						 * odt_wr_cfg to 3 for the even CS, 0 for the odd CS.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						for (i = 0; i < CONFIG_CHIP_SELECTS_PER_CTRL; i++) {
 | 
				
			||||||
 | 
							if (i&1) {	/* odd CS */
 | 
				
			||||||
 | 
								popts->cs_local_opts[i].odt_rd_cfg = 0;
 | 
				
			||||||
 | 
								popts->cs_local_opts[i].odt_wr_cfg = 1;
 | 
				
			||||||
 | 
							} else {	/* even CS */
 | 
				
			||||||
 | 
								if (CONFIG_DIMM_SLOTS_PER_CTLR == 1) {
 | 
				
			||||||
 | 
									popts->cs_local_opts[i].odt_rd_cfg = 0;
 | 
				
			||||||
 | 
									popts->cs_local_opts[i].odt_wr_cfg = 1;
 | 
				
			||||||
 | 
								} else if (CONFIG_DIMM_SLOTS_PER_CTLR == 2) {
 | 
				
			||||||
 | 
								popts->cs_local_opts[i].odt_rd_cfg = 3;
 | 
				
			||||||
 | 
								popts->cs_local_opts[i].odt_wr_cfg = 3;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Get clk_adjust, cpo, write_data_delay,2T, according to the board ddr
 | 
				
			||||||
 | 
						 * freqency and n_banks specified in board_specific_parameters table.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						ddr_freq = get_ddr_freq(0) / 1000000;
 | 
				
			||||||
 | 
						for (i = 0; i < num_params; i++) {
 | 
				
			||||||
 | 
							if (ddr_freq >= pbsp->datarate_mhz_low &&
 | 
				
			||||||
 | 
							    ddr_freq <= pbsp->datarate_mhz_high &&
 | 
				
			||||||
 | 
							    pdimm->n_ranks == pbsp->n_ranks) {
 | 
				
			||||||
 | 
								popts->cpo_override = 0xff; /* force auto CPO calibration */
 | 
				
			||||||
 | 
								popts->write_data_delay = 2;
 | 
				
			||||||
 | 
								popts->clk_adjust = 5; /* Force value to be 5/8 clock cycle */
 | 
				
			||||||
 | 
								popts->twoT_en = pbsp->force_2T;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							pbsp++;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * Factors to consider for half-strength driver enable:
 | 
				
			||||||
 | 
						 *	- number of DIMMs installed
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						popts->half_strength_driver_enable = 0;
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * Write leveling override
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						popts->wrlvl_override = 1;
 | 
				
			||||||
 | 
						popts->wrlvl_sample = 0xa;
 | 
				
			||||||
 | 
						popts->wrlvl_start = 0x7;
 | 
				
			||||||
 | 
						/*
 | 
				
			||||||
 | 
						 * Rtt and Rtt_WR override
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						popts->rtt_override = 1;
 | 
				
			||||||
 | 
						popts->rtt_override_value = DDR3_RTT_120_OHM;
 | 
				
			||||||
 | 
						popts->rtt_wr_override_value = 0; /* Rtt_WR= dynamic ODT off */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Enable ZQ calibration */
 | 
				
			||||||
 | 
						popts->zq_en = 1;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,40 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright 2008-2010 Freescale Semiconductor, Inc.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * (C) Copyright 2000
 | 
				
			||||||
 | 
					 * 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 <common.h>
 | 
				
			||||||
 | 
					#include <asm/fsl_law.h>
 | 
				
			||||||
 | 
					#include <asm/mmu.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct law_entry law_table[] = {
 | 
				
			||||||
 | 
						SET_LAW(CONFIG_SYS_FLASH_BASE_PHYS, LAW_SIZE_256M, LAW_TRGT_IF_LBC),
 | 
				
			||||||
 | 
						SET_LAW(CONFIG_SYS_BMAN_MEM_PHYS, LAW_SIZE_2M, LAW_TRGT_IF_BMAN),
 | 
				
			||||||
 | 
						SET_LAW(CONFIG_SYS_QMAN_MEM_PHYS, LAW_SIZE_2M, LAW_TRGT_IF_QMAN),
 | 
				
			||||||
 | 
						SET_LAW(PIXIS_BASE_PHYS, LAW_SIZE_4K, LAW_TRGT_IF_LBC),
 | 
				
			||||||
 | 
					#ifdef CONFIG_SYS_DCSRBAR_PHYS
 | 
				
			||||||
 | 
						SET_LAW(CONFIG_SYS_DCSRBAR_PHYS, LAW_SIZE_4M, LAW_TRGT_IF_DCSR),
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int num_law_entries = ARRAY_SIZE(law_table);
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,127 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright 2007-2010 Freescale Semiconductor, 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 <common.h>
 | 
				
			||||||
 | 
					#include <command.h>
 | 
				
			||||||
 | 
					#include <pci.h>
 | 
				
			||||||
 | 
					#include <asm/fsl_pci.h>
 | 
				
			||||||
 | 
					#include <libfdt.h>
 | 
				
			||||||
 | 
					#include <fdt_support.h>
 | 
				
			||||||
 | 
					#include <asm/fsl_serdes.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_PCIE1
 | 
				
			||||||
 | 
					static struct pci_controller pcie1_hose;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_PCIE2
 | 
				
			||||||
 | 
					static struct pci_controller pcie2_hose;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_PCIE3
 | 
				
			||||||
 | 
					static struct pci_controller pcie3_hose;
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void pci_init_board(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						volatile ccsr_gur_t *gur = (void *)(CONFIG_SYS_MPC85xx_GUTS_ADDR);
 | 
				
			||||||
 | 
						struct fsl_pci_info pci_info[3];
 | 
				
			||||||
 | 
						u32 devdisr;
 | 
				
			||||||
 | 
						int first_free_busno = 0;
 | 
				
			||||||
 | 
						int num = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						int pcie_ep, pcie_configured;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						devdisr = in_be32(&gur->devdisr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						debug ("   pci_init_board: devdisr=%x\n", devdisr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_PCIE1
 | 
				
			||||||
 | 
						pcie_configured = is_serdes_configured(PCIE1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (pcie_configured && !(devdisr & FSL_CORENET_DEVDISR_PCIE1)) {
 | 
				
			||||||
 | 
							set_next_law(CONFIG_SYS_PCIE1_MEM_PHYS, LAW_SIZE_512M,
 | 
				
			||||||
 | 
									LAW_TRGT_IF_PCIE_1);
 | 
				
			||||||
 | 
							set_next_law(CONFIG_SYS_PCIE1_IO_PHYS, LAW_SIZE_64K,
 | 
				
			||||||
 | 
									LAW_TRGT_IF_PCIE_1);
 | 
				
			||||||
 | 
							SET_STD_PCIE_INFO(pci_info[num], 1);
 | 
				
			||||||
 | 
							pcie_ep = fsl_setup_hose(&pcie1_hose, pci_info[num].regs);
 | 
				
			||||||
 | 
							printf("    PCIE1 connected to Slot 1 as %s (base addr %lx)\n",
 | 
				
			||||||
 | 
									pcie_ep ? "End Point" : "Root Complex",
 | 
				
			||||||
 | 
									pci_info[num].regs);
 | 
				
			||||||
 | 
							first_free_busno = fsl_pci_init_port(&pci_info[num++],
 | 
				
			||||||
 | 
									&pcie1_hose, first_free_busno);
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							printf ("    PCIE1: disabled\n");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						setbits_be32(&gur->devdisr, FSL_CORENET_DEVDISR_PCIE1); /* disable */
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_PCIE2
 | 
				
			||||||
 | 
						pcie_configured = is_serdes_configured(PCIE2);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (pcie_configured && !(devdisr & FSL_CORENET_DEVDISR_PCIE2)) {
 | 
				
			||||||
 | 
							set_next_law(CONFIG_SYS_PCIE2_MEM_PHYS, LAW_SIZE_512M,
 | 
				
			||||||
 | 
									LAW_TRGT_IF_PCIE_2);
 | 
				
			||||||
 | 
							set_next_law(CONFIG_SYS_PCIE2_IO_PHYS, LAW_SIZE_64K,
 | 
				
			||||||
 | 
									LAW_TRGT_IF_PCIE_2);
 | 
				
			||||||
 | 
							SET_STD_PCIE_INFO(pci_info[num], 2);
 | 
				
			||||||
 | 
							pcie_ep = fsl_setup_hose(&pcie2_hose, pci_info[num].regs);
 | 
				
			||||||
 | 
							printf("    PCIE2 connected to Slot 3 as %s (base addr %lx)\n",
 | 
				
			||||||
 | 
									pcie_ep ? "End Point" : "Root Complex",
 | 
				
			||||||
 | 
									pci_info[num].regs);
 | 
				
			||||||
 | 
							first_free_busno = fsl_pci_init_port(&pci_info[num++],
 | 
				
			||||||
 | 
									&pcie2_hose, first_free_busno);
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							printf ("    PCIE2: disabled\n");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						setbits_be32(&gur->devdisr, FSL_CORENET_DEVDISR_PCIE2); /* disable */
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef CONFIG_PCIE3
 | 
				
			||||||
 | 
						pcie_configured = is_serdes_configured(PCIE3);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (pcie_configured && !(devdisr & FSL_CORENET_DEVDISR_PCIE3)) {
 | 
				
			||||||
 | 
							set_next_law(CONFIG_SYS_PCIE3_MEM_PHYS, LAW_SIZE_512M,
 | 
				
			||||||
 | 
									LAW_TRGT_IF_PCIE_3);
 | 
				
			||||||
 | 
							set_next_law(CONFIG_SYS_PCIE3_IO_PHYS, LAW_SIZE_64K,
 | 
				
			||||||
 | 
									LAW_TRGT_IF_PCIE_3);
 | 
				
			||||||
 | 
							SET_STD_PCIE_INFO(pci_info[num], 3);
 | 
				
			||||||
 | 
							pcie_ep = fsl_setup_hose(&pcie3_hose, pci_info[num].regs);
 | 
				
			||||||
 | 
							printf("    PCIE3 connected to Slot 2 as %s (base addr %lx)\n",
 | 
				
			||||||
 | 
									pcie_ep ? "End Point" : "Root Complex",
 | 
				
			||||||
 | 
									pci_info[num].regs);
 | 
				
			||||||
 | 
							first_free_busno = fsl_pci_init_port(&pci_info[num++],
 | 
				
			||||||
 | 
									&pcie3_hose, first_free_busno);
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							printf ("    PCIE3: disabled\n");
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
						setbits_be32(&gur->devdisr, FSL_CORENET_DEVDISR_PCIE3); /* disable */
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void pci_of_setup(void *blob, bd_t *bd)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						FT_FSL_PCI_SETUP;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,112 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright 2008-2010 Freescale Semiconductor, Inc.
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * (C) Copyright 2000
 | 
				
			||||||
 | 
					 * 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 <common.h>
 | 
				
			||||||
 | 
					#include <asm/mmu.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct fsl_e_tlb_entry tlb_table[] = {
 | 
				
			||||||
 | 
						/* TLB 0 - for temp stack in cache */
 | 
				
			||||||
 | 
						SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR,
 | 
				
			||||||
 | 
							      CONFIG_SYS_INIT_RAM_ADDR_PHYS,
 | 
				
			||||||
 | 
							      MAS3_SX|MAS3_SW|MAS3_SR, 0,
 | 
				
			||||||
 | 
							      0, 0, BOOKE_PAGESZ_4K, 0),
 | 
				
			||||||
 | 
						SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR + 4 * 1024,
 | 
				
			||||||
 | 
							      CONFIG_SYS_INIT_RAM_ADDR_PHYS + 4 * 1024,
 | 
				
			||||||
 | 
							      MAS3_SX|MAS3_SW|MAS3_SR, 0,
 | 
				
			||||||
 | 
							      0, 0, BOOKE_PAGESZ_4K, 0),
 | 
				
			||||||
 | 
						SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR + 8 * 1024,
 | 
				
			||||||
 | 
							      CONFIG_SYS_INIT_RAM_ADDR_PHYS + 8 * 1024,
 | 
				
			||||||
 | 
							      MAS3_SX|MAS3_SW|MAS3_SR, 0,
 | 
				
			||||||
 | 
							      0, 0, BOOKE_PAGESZ_4K, 0),
 | 
				
			||||||
 | 
						SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR + 12 * 1024,
 | 
				
			||||||
 | 
							      CONFIG_SYS_INIT_RAM_ADDR_PHYS + 12 * 1024,
 | 
				
			||||||
 | 
							      MAS3_SX|MAS3_SW|MAS3_SR, 0,
 | 
				
			||||||
 | 
							      0, 0, BOOKE_PAGESZ_4K, 0),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						SET_TLB_ENTRY(0, PIXIS_BASE, PIXIS_BASE_PHYS,
 | 
				
			||||||
 | 
							      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
 | 
				
			||||||
 | 
							      0, 0, BOOKE_PAGESZ_4K, 0),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* TLB 1 */
 | 
				
			||||||
 | 
						/* *I*** - Covers boot page */
 | 
				
			||||||
 | 
						SET_TLB_ENTRY(1, 0xfffff000, 0xfffff000,
 | 
				
			||||||
 | 
							      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
 | 
				
			||||||
 | 
							      0, 0, BOOKE_PAGESZ_4K, 1),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* *I*G* - CCSRBAR */
 | 
				
			||||||
 | 
						SET_TLB_ENTRY(1, CONFIG_SYS_CCSRBAR, CONFIG_SYS_CCSRBAR_PHYS,
 | 
				
			||||||
 | 
							      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
 | 
				
			||||||
 | 
							      0, 1, BOOKE_PAGESZ_16M, 1),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* *I*G* - Flash, localbus */
 | 
				
			||||||
 | 
						/* This will be changed to *I*G* after relocation to RAM. */
 | 
				
			||||||
 | 
						SET_TLB_ENTRY(1, CONFIG_SYS_FLASH_BASE, CONFIG_SYS_FLASH_BASE_PHYS,
 | 
				
			||||||
 | 
							      MAS3_SX|MAS3_SR, MAS2_W|MAS2_G,
 | 
				
			||||||
 | 
							      0, 2, BOOKE_PAGESZ_256M, 1),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* *I*G* - PCI */
 | 
				
			||||||
 | 
						SET_TLB_ENTRY(1, CONFIG_SYS_PCIE1_MEM_VIRT, CONFIG_SYS_PCIE1_MEM_PHYS,
 | 
				
			||||||
 | 
							      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
 | 
				
			||||||
 | 
							      0, 3, BOOKE_PAGESZ_1G, 1),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* *I*G* - PCI */
 | 
				
			||||||
 | 
						SET_TLB_ENTRY(1, CONFIG_SYS_PCIE1_MEM_VIRT + 0x40000000,
 | 
				
			||||||
 | 
							      CONFIG_SYS_PCIE1_MEM_PHYS + 0x40000000,
 | 
				
			||||||
 | 
							      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
 | 
				
			||||||
 | 
							      0, 4, BOOKE_PAGESZ_256M, 1),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						SET_TLB_ENTRY(1, CONFIG_SYS_PCIE1_MEM_VIRT + 0x50000000,
 | 
				
			||||||
 | 
							      CONFIG_SYS_PCIE1_MEM_PHYS + 0x50000000,
 | 
				
			||||||
 | 
							      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
 | 
				
			||||||
 | 
							      0, 5, BOOKE_PAGESZ_256M, 1),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* *I*G* - PCI I/O */
 | 
				
			||||||
 | 
						SET_TLB_ENTRY(1, CONFIG_SYS_PCIE1_IO_VIRT, CONFIG_SYS_PCIE1_IO_PHYS,
 | 
				
			||||||
 | 
							      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
 | 
				
			||||||
 | 
							      0, 6, BOOKE_PAGESZ_256K, 1),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Bman/Qman */
 | 
				
			||||||
 | 
						SET_TLB_ENTRY(1, CONFIG_SYS_BMAN_MEM_BASE, CONFIG_SYS_BMAN_MEM_PHYS,
 | 
				
			||||||
 | 
							      MAS3_SX|MAS3_SW|MAS3_SR, 0,
 | 
				
			||||||
 | 
							      0, 9, BOOKE_PAGESZ_1M, 1),
 | 
				
			||||||
 | 
						SET_TLB_ENTRY(1, CONFIG_SYS_BMAN_MEM_BASE + 0x00100000,
 | 
				
			||||||
 | 
							      CONFIG_SYS_BMAN_MEM_PHYS + 0x00100000,
 | 
				
			||||||
 | 
							      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
 | 
				
			||||||
 | 
							      0, 10, BOOKE_PAGESZ_1M, 1),
 | 
				
			||||||
 | 
						SET_TLB_ENTRY(1, CONFIG_SYS_QMAN_MEM_BASE, CONFIG_SYS_QMAN_MEM_PHYS,
 | 
				
			||||||
 | 
							      MAS3_SX|MAS3_SW|MAS3_SR, 0,
 | 
				
			||||||
 | 
							      0, 11, BOOKE_PAGESZ_1M, 1),
 | 
				
			||||||
 | 
						SET_TLB_ENTRY(1, CONFIG_SYS_QMAN_MEM_BASE + 0x00100000,
 | 
				
			||||||
 | 
							      CONFIG_SYS_QMAN_MEM_PHYS + 0x00100000,
 | 
				
			||||||
 | 
							      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
 | 
				
			||||||
 | 
							      0, 12, BOOKE_PAGESZ_1M, 1),
 | 
				
			||||||
 | 
					#ifdef CONFIG_SYS_DCSRBAR_PHYS
 | 
				
			||||||
 | 
						SET_TLB_ENTRY(1, CONFIG_SYS_DCSRBAR, CONFIG_SYS_DCSRBAR_PHYS,
 | 
				
			||||||
 | 
							      MAS3_SX|MAS3_SW|MAS3_SR, MAS2_I|MAS2_G,
 | 
				
			||||||
 | 
							      0, 13, BOOKE_PAGESZ_4M, 1),
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int num_tlb_entries = ARRAY_SIZE(tlb_table);
 | 
				
			||||||
| 
						 | 
					@ -60,6 +60,8 @@ int checkboard(void)
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const char *board_hwconfig = "foo:bar=baz";
 | 
				
			||||||
 | 
					const char *cpu_hwconfig = "foo:bar=baz";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
phys_size_t
 | 
					phys_size_t
 | 
				
			||||||
initdram(int board_type)
 | 
					initdram(int board_type)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -12,7 +12,7 @@
 | 
				
			||||||
#include <asm/fsl_ddr_sdram.h>
 | 
					#include <asm/fsl_ddr_sdram.h>
 | 
				
			||||||
#include <asm/fsl_ddr_dimm_params.h>
 | 
					#include <asm/fsl_ddr_dimm_params.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void get_spd(ddr3_spd_eeprom_t *spd, unsigned char i2c_address)
 | 
					static void get_spd(generic_spd_eeprom_t *spd, unsigned char i2c_address)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	i2c_read(i2c_address, 0, 1, (uchar *)spd, sizeof(ddr3_spd_eeprom_t));
 | 
						i2c_read(i2c_address, 0, 1, (uchar *)spd, sizeof(ddr3_spd_eeprom_t));
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -22,7 +22,7 @@ unsigned int fsl_ddr_get_mem_data_rate(void)
 | 
				
			||||||
	return get_ddr_freq(0);
 | 
						return get_ddr_freq(0);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void fsl_ddr_get_spd(ddr3_spd_eeprom_t *ctrl_dimms_spd,
 | 
					void fsl_ddr_get_spd(generic_spd_eeprom_t *ctrl_dimms_spd,
 | 
				
			||||||
		      unsigned int ctrl_num)
 | 
							      unsigned int ctrl_num)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	unsigned int i;
 | 
						unsigned int i;
 | 
				
			||||||
| 
						 | 
					@ -51,27 +51,26 @@ typedef struct {
 | 
				
			||||||
 *  cpo 2-0x1E (30)
 | 
					 *  cpo 2-0x1E (30)
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
/* XXX: these values need to be checked for all interleaving modes.  */
 | 
					 | 
				
			||||||
/* XXX: No reliable dual-rank 800 MHz setting has been found.  It may
 | 
					 | 
				
			||||||
 *      seem reliable, but errors will appear when memory intensive
 | 
					 | 
				
			||||||
 *      program is run. */
 | 
					 | 
				
			||||||
/* XXX: Single rank at 800 MHz is OK.  */
 | 
					 | 
				
			||||||
const board_specific_parameters_t board_specific_parameters[][20] = {
 | 
					const board_specific_parameters_t board_specific_parameters[][20] = {
 | 
				
			||||||
	{
 | 
						{
 | 
				
			||||||
	/* 	memory controller 0 			*/
 | 
						/* 	memory controller 0 			*/
 | 
				
			||||||
	/*	  lo|  hi|  num|  clk| cpo|wrdata|2T	*/
 | 
						/*	  lo|  hi|  num|  clk| cpo|wrdata|2T	*/
 | 
				
			||||||
	/*	 mhz| mhz|ranks|adjst|    | delay|	*/
 | 
						/*	 mhz| mhz|ranks|adjst|    | delay|	*/
 | 
				
			||||||
		{  0, 333,    2,    6,   7,    3,  0},
 | 
					#ifdef CONFIG_FSL_DDR2
 | 
				
			||||||
		{334, 400,    2,    6,   9,    3,  0},
 | 
							{  0, 333,    2,    4,   0x1f,    2,  0},
 | 
				
			||||||
		{401, 549,    2,    6,  11,    3,  0},
 | 
							{334, 400,    2,    4,   0x1f,    2,  0},
 | 
				
			||||||
		{550, 680,    2,    1,  10,    5,  0},
 | 
							{401, 549,    2,    4,   0x1f,    2,  0},
 | 
				
			||||||
		{681, 850,    2,    1,  12,    5,  1},
 | 
							{550, 680,    2,    4,   0x1f,    3,  0},
 | 
				
			||||||
		{  0, 333,    1,    6,   7,    3,  0},
 | 
							{681, 850,    2,    4,   0x1f,    4,  0},
 | 
				
			||||||
		{334, 400,    1,    6,   9,    3,  0},
 | 
							{  0, 333,    1,    4,   0x1f,    2,  0},
 | 
				
			||||||
		{401, 549,    1,    6,  11,    3,  0},
 | 
							{334, 400,    1,    4,   0x1f,    2,  0},
 | 
				
			||||||
		{550, 680,    1,    1,  10,    5,  0},
 | 
							{401, 549,    1,    4,   0x1f,    2,  0},
 | 
				
			||||||
		{681, 850,    1,    1,  12,    5,  0}
 | 
							{550, 680,    1,    4,   0x1f,    3,  0},
 | 
				
			||||||
 | 
							{681, 850,    1,    4,   0x1f,    4,  0}
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
							{  0, 850,    2,    4,   0x1f,    4,  0},
 | 
				
			||||||
 | 
							{  0, 850,    1,    4,   0x1f,    4,  0}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
	},
 | 
						},
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -92,18 +91,8 @@ void fsl_ddr_board_options(memctl_options_t *popts,
 | 
				
			||||||
	 * odt_wr_cfg to 3 for the even CS, 0 for the odd CS.
 | 
						 * odt_wr_cfg to 3 for the even CS, 0 for the odd CS.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	for (i = 0; i < CONFIG_CHIP_SELECTS_PER_CTRL; i++) {
 | 
						for (i = 0; i < CONFIG_CHIP_SELECTS_PER_CTRL; i++) {
 | 
				
			||||||
		if (i&1) {	/* odd CS */
 | 
					 | 
				
			||||||
			popts->cs_local_opts[i].odt_rd_cfg = 0;
 | 
								popts->cs_local_opts[i].odt_rd_cfg = 0;
 | 
				
			||||||
			popts->cs_local_opts[i].odt_wr_cfg = 0;
 | 
								popts->cs_local_opts[i].odt_wr_cfg = 1;
 | 
				
			||||||
		} else {	/* even CS */
 | 
					 | 
				
			||||||
			if (CONFIG_DIMM_SLOTS_PER_CTLR == 1) {
 | 
					 | 
				
			||||||
				popts->cs_local_opts[i].odt_rd_cfg = 0;
 | 
					 | 
				
			||||||
				popts->cs_local_opts[i].odt_wr_cfg = 4;
 | 
					 | 
				
			||||||
			} else if (CONFIG_DIMM_SLOTS_PER_CTLR == 2) {
 | 
					 | 
				
			||||||
				popts->cs_local_opts[i].odt_rd_cfg = 3;
 | 
					 | 
				
			||||||
				popts->cs_local_opts[i].odt_wr_cfg = 3;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Get clk_adjust, cpo, write_data_delay,2T, according to the board ddr
 | 
						/* Get clk_adjust, cpo, write_data_delay,2T, according to the board ddr
 | 
				
			||||||
| 
						 | 
					@ -127,4 +116,13 @@ void fsl_ddr_board_options(memctl_options_t *popts,
 | 
				
			||||||
	 *	- number of DIMMs installed
 | 
						 *	- number of DIMMs installed
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	popts->half_strength_driver_enable = 0;
 | 
						popts->half_strength_driver_enable = 0;
 | 
				
			||||||
 | 
						popts->wrlvl_en = 1;
 | 
				
			||||||
 | 
						/* Write leveling override */
 | 
				
			||||||
 | 
						popts->wrlvl_override = 1;
 | 
				
			||||||
 | 
						popts->wrlvl_sample = 0xa;
 | 
				
			||||||
 | 
						popts->wrlvl_start = 0x7;
 | 
				
			||||||
 | 
						/* Rtt and Rtt_WR override */
 | 
				
			||||||
 | 
						popts->rtt_override = 1;
 | 
				
			||||||
 | 
						popts->rtt_override_value = DDR3_RTT_120_OHM;
 | 
				
			||||||
 | 
						popts->rtt_wr_override_value = 0; /* Rtt_WR= dynamic ODT off */
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -69,13 +69,16 @@ int checkboard(void)
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const char *board_hwconfig = "foo:bar=baz";
 | 
				
			||||||
 | 
					const char *cpu_hwconfig = "foo:bar=baz";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
phys_size_t initdram(int board_type)
 | 
					phys_size_t initdram(int board_type)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	phys_size_t dram_size = 0;
 | 
						phys_size_t dram_size = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	puts("Initializing....");
 | 
						puts("Initializing....");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef CONFIG_SPD_EEPROM
 | 
					#ifdef CONFIG_DDR_SPD
 | 
				
			||||||
	dram_size = fsl_ddr_sdram();
 | 
						dram_size = fsl_ddr_sdram();
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
	dram_size = fixed_sdram();
 | 
						dram_size = fixed_sdram();
 | 
				
			||||||
| 
						 | 
					@ -94,7 +97,7 @@ phys_size_t initdram(int board_type)
 | 
				
			||||||
	return dram_size;
 | 
						return dram_size;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if !defined(CONFIG_SPD_EEPROM)
 | 
					#if !defined(CONFIG_DDR_SPD)
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Fixed sdram init -- doesn't use serial presence detect.
 | 
					 * Fixed sdram init -- doesn't use serial presence detect.
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,19 +28,19 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct fsl_e_tlb_entry tlb_table[] = {
 | 
					struct fsl_e_tlb_entry tlb_table[] = {
 | 
				
			||||||
	/* TLB 0 - for temp stack in cache */
 | 
						/* TLB 0 - for temp stack in cache */
 | 
				
			||||||
	SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR, CONFIG_SYS_INIT_RAM_ADDR,
 | 
						SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR, CONFIG_SYS_INIT_RAM_ADDR_PHYS,
 | 
				
			||||||
		      MAS3_SX|MAS3_SW|MAS3_SR, 0,
 | 
							      MAS3_SX|MAS3_SW|MAS3_SR, 0,
 | 
				
			||||||
		      0, 0, BOOKE_PAGESZ_4K, 0),
 | 
							      0, 0, BOOKE_PAGESZ_4K, 0),
 | 
				
			||||||
	SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR + 4 * 1024,
 | 
						SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR + 4 * 1024,
 | 
				
			||||||
		      CONFIG_SYS_INIT_RAM_ADDR + 4 * 1024,
 | 
							      CONFIG_SYS_INIT_RAM_ADDR_PHYS + 4 * 1024,
 | 
				
			||||||
		      MAS3_SX|MAS3_SW|MAS3_SR, 0,
 | 
							      MAS3_SX|MAS3_SW|MAS3_SR, 0,
 | 
				
			||||||
		      0, 0, BOOKE_PAGESZ_4K, 0),
 | 
							      0, 0, BOOKE_PAGESZ_4K, 0),
 | 
				
			||||||
	SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR + 8 * 1024,
 | 
						SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR + 8 * 1024,
 | 
				
			||||||
		      CONFIG_SYS_INIT_RAM_ADDR + 8 * 1024,
 | 
							      CONFIG_SYS_INIT_RAM_ADDR_PHYS + 8 * 1024,
 | 
				
			||||||
		      MAS3_SX|MAS3_SW|MAS3_SR, 0,
 | 
							      MAS3_SX|MAS3_SW|MAS3_SR, 0,
 | 
				
			||||||
		      0, 0, BOOKE_PAGESZ_4K, 0),
 | 
							      0, 0, BOOKE_PAGESZ_4K, 0),
 | 
				
			||||||
	SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR + 12 * 1024,
 | 
						SET_TLB_ENTRY(0, CONFIG_SYS_INIT_RAM_ADDR + 12 * 1024,
 | 
				
			||||||
		      CONFIG_SYS_INIT_RAM_ADDR + 12 * 1024,
 | 
							      CONFIG_SYS_INIT_RAM_ADDR_PHYS + 12 * 1024,
 | 
				
			||||||
		      MAS3_SX|MAS3_SW|MAS3_SR, 0,
 | 
							      MAS3_SX|MAS3_SW|MAS3_SR, 0,
 | 
				
			||||||
		      0, 0, BOOKE_PAGESZ_4K, 0),
 | 
							      0, 0, BOOKE_PAGESZ_4K, 0),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -91,7 +91,7 @@ int misc_init_r (void)
 | 
				
			||||||
int checkboard (void)
 | 
					int checkboard (void)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char str[64];
 | 
						char str[64];
 | 
				
			||||||
	int i = getenv_r ("serial#", str, sizeof(str));
 | 
						int i = getenv_f("serial#", str, sizeof(str));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	puts ("Board: ");
 | 
						puts ("Board: ");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -132,7 +132,7 @@ int checkboard (void)
 | 
				
			||||||
	char buf[64];
 | 
						char buf[64];
 | 
				
			||||||
	int i;
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	i = getenv_r ("board_id", buf, sizeof (buf));
 | 
						i = getenv_f("board_id", buf, sizeof (buf));
 | 
				
			||||||
	s = (i > 0) ? buf : NULL;
 | 
						s = (i > 0) ? buf : NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (s) {
 | 
						if (s) {
 | 
				
			||||||
| 
						 | 
					@ -141,7 +141,7 @@ int checkboard (void)
 | 
				
			||||||
		printf ("<unknown> ");
 | 
							printf ("<unknown> ");
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	i = getenv_r ("serial#", buf, sizeof (buf));
 | 
						i = getenv_f("serial#", buf, sizeof (buf));
 | 
				
			||||||
	s = (i > 0) ? buf : NULL;
 | 
						s = (i > 0) ? buf : NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (s) {
 | 
						if (s) {
 | 
				
			||||||
| 
						 | 
					@ -276,7 +276,7 @@ int last_stage_init (void)
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Read the environment to see what to do with the beeper
 | 
						 * Read the environment to see what to do with the beeper
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	i = getenv_r ("beeper", buf, sizeof (buf));
 | 
						i = getenv_f("beeper", buf, sizeof (buf));
 | 
				
			||||||
	if (i > 0) {
 | 
						if (i > 0) {
 | 
				
			||||||
		do_beeper (buf);
 | 
							do_beeper (buf);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -187,7 +187,7 @@ int misc_init_f (void)
 | 
				
			||||||
	char tmp[10];
 | 
						char tmp[10];
 | 
				
			||||||
	int i, br;
 | 
						int i, br;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	i = getenv_r("brightness", tmp, sizeof(tmp));
 | 
						i = getenv_f("brightness", tmp, sizeof(tmp));
 | 
				
			||||||
	br = (i > 0)
 | 
						br = (i > 0)
 | 
				
			||||||
		? (int) simple_strtoul (tmp, NULL, 10)
 | 
							? (int) simple_strtoul (tmp, NULL, 10)
 | 
				
			||||||
		: CONFIG_SYS_BRIGHTNESS;
 | 
							: CONFIG_SYS_BRIGHTNESS;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -114,7 +114,7 @@ int checkboard (void)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	puts ("Board: ");
 | 
						puts ("Board: ");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	i = getenv_r ("serial#", (char *)buf, sizeof (buf));
 | 
						i = getenv_f("serial#", (char *)buf, sizeof (buf));
 | 
				
			||||||
	s = (i > 0) ? buf : NULL;
 | 
						s = (i > 0) ? buf : NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!s || strncmp ((char *)s, "IP860", 5)) {
 | 
						if (!s || strncmp ((char *)s, "IP860", 5)) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -314,7 +314,7 @@ void lcd_logo (bd_t * bd)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	n = getenv_r ("lcd", tmp, sizeof (tmp));
 | 
						n = getenv_f("lcd", tmp, sizeof (tmp));
 | 
				
			||||||
	if (n > 0) {
 | 
						if (n > 0) {
 | 
				
			||||||
		if (!strcmp ("tft", tmp))
 | 
							if (!strcmp ("tft", tmp))
 | 
				
			||||||
			tft = 1;
 | 
								tft = 1;
 | 
				
			||||||
| 
						 | 
					@ -342,7 +342,7 @@ void lcd_logo (bd_t * bd)
 | 
				
			||||||
			((S1D_VALUE *) fb_info.RegAddr)[s1dReg / sizeof(S1D_VALUE)] =
 | 
								((S1D_VALUE *) fb_info.RegAddr)[s1dReg / sizeof(S1D_VALUE)] =
 | 
				
			||||||
				s1dValue;
 | 
									s1dValue;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		n = getenv_r ("contrast", tmp, sizeof (tmp));
 | 
							n = getenv_f("contrast", tmp, sizeof (tmp));
 | 
				
			||||||
		((S1D_VALUE *) fb_info.RegAddr)[0xB3] =
 | 
							((S1D_VALUE *) fb_info.RegAddr)[0xB3] =
 | 
				
			||||||
			(n > 0) ? (uchar) simple_strtoul (tmp, NULL, 10) * 255 / 100 : 0xA0;
 | 
								(n > 0) ? (uchar) simple_strtoul (tmp, NULL, 10) * 255 / 100 : 0xA0;
 | 
				
			||||||
		switch (bd->bi_busfreq) {
 | 
							switch (bd->bi_busfreq) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -284,13 +284,13 @@ void set_backup_values(int overwrite)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	memcpy(back.signature,"MPL\0",4);
 | 
						memcpy(back.signature,"MPL\0",4);
 | 
				
			||||||
	i = getenv_r("serial#",back.serial_name,16);
 | 
						i = getenv_f("serial#",back.serial_name,16);
 | 
				
			||||||
	if(i < 0) {
 | 
						if(i < 0) {
 | 
				
			||||||
		puts("Not possible to write Backup\n");
 | 
							puts("Not possible to write Backup\n");
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	back.serial_name[16]=0;
 | 
						back.serial_name[16]=0;
 | 
				
			||||||
	i = getenv_r("ethaddr",back.eth_addr,20);
 | 
						i = getenv_f("ethaddr",back.eth_addr,20);
 | 
				
			||||||
	if(i < 0) {
 | 
						if(i < 0) {
 | 
				
			||||||
		puts("Not possible to write Backup\n");
 | 
							puts("Not possible to write Backup\n");
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -29,7 +29,7 @@ int testdram (void)
 | 
				
			||||||
	unsigned char s[32];
 | 
						unsigned char s[32];
 | 
				
			||||||
	int i;
 | 
						int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	i = getenv_r ("testmem", s, 32);
 | 
						i = getenv_f("testmem", s, 32);
 | 
				
			||||||
	if (i != 0) {
 | 
						if (i != 0) {
 | 
				
			||||||
		i = (int) simple_strtoul (s, NULL, 10);
 | 
							i = (int) simple_strtoul (s, NULL, 10);
 | 
				
			||||||
		if ((i > 0) && (i < 0xf)) {
 | 
							if ((i > 0) && (i < 0xf)) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -589,7 +589,7 @@ int checkboard (void)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	puts ("Board: ");
 | 
						puts ("Board: ");
 | 
				
			||||||
	get_pcbrev_var(&bc,&var);
 | 
						get_pcbrev_var(&bc,&var);
 | 
				
			||||||
	i = getenv_r ("serial#", (char *)s, 32);
 | 
						i = getenv_f("serial#", (char *)s, 32);
 | 
				
			||||||
	if ((i == 0) || strncmp ((char *)s, BOARD_NAME,sizeof(BOARD_NAME))) {
 | 
						if ((i == 0) || strncmp ((char *)s, BOARD_NAME,sizeof(BOARD_NAME))) {
 | 
				
			||||||
		get_backup_values (b);
 | 
							get_backup_values (b);
 | 
				
			||||||
		if (strncmp (b->signature, "MPL\0", 4) != 0) {
 | 
							if (strncmp (b->signature, "MPL\0", 4) != 0) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
Some files were not shown because too many files have changed in this diff Show More
		Loading…
	
		Reference in New Issue