ppc4xx: Updates to Korat-specific code

This patch contains updates for changes for the Korat PPC440EPx board.
These changes include:

(1) Support for "permanent" and "upgradable" copies of U-Boot, as
described in the new "doc/README.korat" file;

(2) a new memory map for the registers in the board's CPLD;

(3) a revised format for manufacturer's data in serial EEPROM; and

(4) changes to track updates to U-Boot for the Sequoia board.

Signed-off-by: Larry Johnson <lrj@acm.org>
This commit is contained in:
Larry Johnson 2008-03-17 11:10:35 -05:00 committed by Stefan Roese
parent f766cdf89b
commit 6433fa202a
6 changed files with 464 additions and 76 deletions

View file

@ -24,14 +24,24 @@
# Korat (PPC440EPx) board # Korat (PPC440EPx) board
# #
TEXT_BASE = 0xFFFA0000
PLATFORM_CPPFLAGS += -DCONFIG_440=1 PLATFORM_CPPFLAGS += -DCONFIG_440=1
ifeq ($(debug),1) ifeq ($(debug),1)
PLATFORM_CPPFLAGS += -DDEBUG PLATFORM_CPPFLAGS += -DDEBUG
endif endif
ifeq ($(dbcr),1) ifeq ($(emul),1)
PLATFORM_CPPFLAGS += -DCFG_INIT_DBCR=0x8cff0000 PLATFORM_CPPFLAGS += -fno-schedule-insns -fno-schedule-insns2
endif
ifeq ($(dbcr),1)
PLATFORM_CPPFLAGS += -DCFG_INIT_DBCR=0x8CFF0000
endif
ifeq ($(perm),1)
PLATFORM_CPPFLAGS += -DCONFIG_KORAT_PERMANENT
TEXT_BASE = 0xFFFA0000
else
TEXT_BASE = 0xF7F60000
LDSCRIPT := $(TOPDIR)/board/$(BOARDDIR)/u-boot-F7FC.lds
endif endif

View file

@ -43,7 +43,7 @@ tlbtab:
* BOOT_CS (FLASH) must be first. Before relocation SA_I can be off to use the * BOOT_CS (FLASH) must be first. Before relocation SA_I can be off to use the
* speed up boot process. It is patched after relocation to enable SA_I * speed up boot process. It is patched after relocation to enable SA_I
*/ */
tlbentry( CFG_BOOT_BASE_ADDR, SZ_256M, CFG_BOOT_BASE_ADDR, 1, AC_R|AC_W|AC_X|SA_G ) tlbentry( 0xF0000000, SZ_256M, 0xF0000000, 1, AC_R|AC_W|AC_X|SA_G )
/* /*
* TLB entries for SDRAM are not needed on this platform. They are * TLB entries for SDRAM are not needed on this platform. They are
@ -52,24 +52,32 @@ tlbtab:
#ifdef CFG_INIT_RAM_DCACHE #ifdef CFG_INIT_RAM_DCACHE
/* TLB-entry for init-ram in dcache (SA_I must be turned off!) */ /* TLB-entry for init-ram in dcache (SA_I must be turned off!) */
tlbentry( CFG_INIT_RAM_ADDR, SZ_64K, CFG_INIT_RAM_ADDR, 0, AC_R|AC_W|AC_X|SA_G ) tlbentry( CFG_INIT_RAM_ADDR, SZ_64K, CFG_INIT_RAM_ADDR, 0,
AC_R|AC_W|AC_X|SA_G )
#endif #endif
/* TLB-entry for PCI Memory */ /* TLB-entry for PCI Memory */
tlbentry( CFG_PCI_MEMBASE, SZ_256M, CFG_PCI_MEMBASE, 1, AC_R|AC_W|SA_G|SA_I ) tlbentry( CFG_PCI_MEMBASE + 0x00000000, SZ_256M,
tlbentry( CFG_PCI_MEMBASE1, SZ_256M, CFG_PCI_MEMBASE1, 1, AC_R|AC_W|SA_G|SA_I ) CFG_PCI_MEMBASE + 0x00000000, 1, AC_R|AC_W|SA_G|SA_I )
tlbentry( CFG_PCI_MEMBASE2, SZ_256M, CFG_PCI_MEMBASE2, 1, AC_R|AC_W|SA_G|SA_I )
tlbentry( CFG_PCI_MEMBASE3, SZ_256M, CFG_PCI_MEMBASE3, 1, AC_R|AC_W|SA_G|SA_I ) tlbentry( CFG_PCI_MEMBASE + 0x10000000, SZ_256M,
CFG_PCI_MEMBASE + 0x10000000, 1, AC_R|AC_W|SA_G|SA_I )
tlbentry( CFG_PCI_MEMBASE + 0x20000000, SZ_256M,
CFG_PCI_MEMBASE + 0x20000000, 1, AC_R|AC_W|SA_G|SA_I )
tlbentry( CFG_PCI_MEMBASE + 0x30000000, SZ_256M,
CFG_PCI_MEMBASE + 0x30000000, 1, AC_R|AC_W|SA_G|SA_I )
/* TLB-entry for EBC */ /* TLB-entry for EBC */
tlbentry( CFG_CPLD_BASE, SZ_1K, CFG_CPLD_BASE, 1, AC_R|AC_W|SA_G|SA_I ) tlbentry( CFG_CPLD_BASE, SZ_1K, CFG_CPLD_BASE, 1, AC_R|AC_W|SA_G|SA_I )
/* TLB-entry for Internal Registers & OCM */ /* TLB-entry for Internal Registers & OCM */
/* I wonder why this must be executable -- lrj@acm.org 2007-10-08 */ /* I wonder why this must be executable -- lrj@acm.org 2007-10-08 */
tlbentry( 0xE0000000, SZ_16M, 0xE0000000, 0, AC_R|AC_W|AC_X|SA_I ) tlbentry( 0xE0000000, SZ_16M, 0xE0000000, 0, AC_R|AC_W|AC_X|SA_I )
/*TLB-entry PCI registers*/ /*TLB-entry PCI registers*/
tlbentry( 0xEEC00000, SZ_1K, 0xEEC00000, 1, AC_R|AC_W|SA_G|SA_I ) tlbentry( 0xEEC00000, SZ_1K, 0xEEC00000, 1, AC_R|AC_W|SA_G|SA_I )
/* TLB-entry for peripherals */ /* TLB-entry for peripherals */
tlbentry( 0xEF000000, SZ_16M, 0xEF000000, 1, AC_R|AC_W|SA_G|SA_I) tlbentry( 0xEF000000, SZ_16M, 0xEF000000, 1, AC_R|AC_W|SA_G|SA_I)
@ -78,3 +86,10 @@ tlbtab:
tlbentry(0xE8000000, SZ_64K, 0xE8000000, 1, AC_R|AC_W|SA_G|SA_I) tlbentry(0xE8000000, SZ_64K, 0xE8000000, 1, AC_R|AC_W|SA_G|SA_I)
tlbtab_end tlbtab_end
#if defined(CONFIG_KORAT_PERMANENT)
.globl korat_branch_absolute
korat_branch_absolute:
mtlr r3
blr
#endif

View file

@ -2,12 +2,12 @@
* (C) Copyright 2007-2008 * (C) Copyright 2007-2008
* Larry Johnson, lrj@acm.org * Larry Johnson, lrj@acm.org
* *
* (C) Copyright 2006-2008 * (C) Copyright 2006-2007
* Stefan Roese, DENX Software Engineering, sr@denx.de. * Stefan Roese, DENX Software Engineering, sr@denx.de.
* *
* (C) Copyright 2006 * (C) Copyright 2006
* Jacqueline Pira-Ferriol, AMCC/IBM, jpira-ferriol@fr.ibm.com * Jacqueline Pira-Ferriol, AMCC/IBM, jpira-ferriol@fr.ibm.com
* Alain Saurel, AMCC/IBM, alain.saurel@fr.ibm.com * Alain Saurel, AMCC/IBM, alain.saurel@fr.ibm.com
* *
* 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 as * modify it under the terms of the GNU General Public License as
@ -39,12 +39,45 @@ extern flash_info_t flash_info[CFG_MAX_FLASH_BANKS]; /* info for FLASH chips */
ulong flash_get_size(ulong base, int banknum); ulong flash_get_size(ulong base, int banknum);
#if defined(CONFIG_KORAT_PERMANENT)
void korat_buzzer(int const on)
{
if (on) {
out_8((u8 *) CFG_CPLD_BASE + 0x05,
in_8((u8 *) CFG_CPLD_BASE + 0x05) | 0x80);
} else {
out_8((u8 *) CFG_CPLD_BASE + 0x05,
in_8((u8 *) CFG_CPLD_BASE + 0x05) & ~0x80);
}
}
#endif
int board_early_init_f(void) int board_early_init_f(void)
{ {
u32 sdr0_pfc1, sdr0_pfc2; uint32_t sdr0_pfc1, sdr0_pfc2;
u32 reg; uint32_t reg;
int eth; int eth;
#if defined(CONFIG_KORAT_PERMANENT)
unsigned mscount;
extern void korat_branch_absolute(uint32_t addr);
for (mscount = 0; mscount < CFG_KORAT_MAN_RESET_MS; ++mscount) {
udelay(1000);
if (gpio_read_in_bit(CFG_GPIO_RESET_PRESSED_)) {
/* This call does not return. */
korat_branch_absolute(
CFG_FLASH1_TOP - 2 * CFG_ENV_SECT_SIZE - 4);
}
}
korat_buzzer(1);
while (!gpio_read_in_bit(CFG_GPIO_RESET_PRESSED_))
udelay(1000);
korat_buzzer(0);
#endif
mtdcr(ebccfga, xbcfg); mtdcr(ebccfga, xbcfg);
mtdcr(ebccfgd, 0xb8400000); mtdcr(ebccfgd, 0xb8400000);
@ -75,8 +108,11 @@ int board_early_init_f(void)
mtdcr(uic2vr, 0x00000000); /* int31 highest, base=0x000 */ mtdcr(uic2vr, 0x00000000); /* int31 highest, base=0x000 */
mtdcr(uic2sr, 0xffffffff); /* clear all */ mtdcr(uic2sr, 0xffffffff); /* clear all */
/* take sim card reader and CF controller out of reset */ /*
out_8((u8 *) CFG_CPLD_BASE + 0x04, 0x80); * Take sim card reader and CF controller out of reset. Also enable PHY
* auto-detect until board-specific PHY resets are available.
*/
out_8((u8 *) CFG_CPLD_BASE + 0x02, 0xC0);
/* Configure the two Ethernet PHYs. For each PHY, configure for fiber /* Configure the two Ethernet PHYs. For each PHY, configure for fiber
* if the SFP module is present, and for copper if it is not present. * if the SFP module is present, and for copper if it is not present.
@ -85,8 +121,8 @@ int board_early_init_f(void)
if (gpio_read_in_bit(CFG_GPIO_SFP0_PRESENT_ + eth)) { if (gpio_read_in_bit(CFG_GPIO_SFP0_PRESENT_ + eth)) {
/* SFP module not present: configure PHY for copper. */ /* SFP module not present: configure PHY for copper. */
/* Set PHY to autonegotate 10 MB, 100MB, or 1 GB */ /* Set PHY to autonegotate 10 MB, 100MB, or 1 GB */
out_8((u8 *) CFG_CPLD_BASE + 0x06, out_8((u8 *) CFG_CPLD_BASE + 0x03,
in_8((u8 *) CFG_CPLD_BASE + 0x06) | in_8((u8 *) CFG_CPLD_BASE + 0x03) |
0x06 << (4 * eth)); 0x06 << (4 * eth));
} else { } else {
/* SFP module present: configure PHY for fiber and /* SFP module present: configure PHY for fiber and
@ -99,10 +135,18 @@ int board_early_init_f(void)
gpio_write_bit(CFG_GPIO_PHY0_EN, 1); gpio_write_bit(CFG_GPIO_PHY0_EN, 1);
gpio_write_bit(CFG_GPIO_PHY1_EN, 1); gpio_write_bit(CFG_GPIO_PHY1_EN, 1);
/* select Ethernet pins */ /* Wait 1 ms, then enable Fiber signal detect to PHYs. */
udelay(1000);
out_8((u8 *) CFG_CPLD_BASE + 0x03,
in_8((u8 *) CFG_CPLD_BASE + 0x03) | 0x88);
/* select Ethernet (and optionally IIC1) pins */
mfsdr(SDR0_PFC1, sdr0_pfc1); mfsdr(SDR0_PFC1, sdr0_pfc1);
sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_SELECT_MASK) | sdr0_pfc1 = (sdr0_pfc1 & ~SDR0_PFC1_SELECT_MASK) |
SDR0_PFC1_SELECT_CONFIG_4; SDR0_PFC1_SELECT_CONFIG_4;
#ifdef CONFIG_I2C_MULTI_BUS
sdr0_pfc1 |= ((sdr0_pfc1 & ~SDR0_PFC1_SIS_MASK) | SDR0_PFC1_SIS_IIC1_SEL);
#endif
mfsdr(SDR0_PFC2, sdr0_pfc2); mfsdr(SDR0_PFC2, sdr0_pfc2);
sdr0_pfc2 = (sdr0_pfc2 & ~SDR0_PFC2_SELECT_MASK) | sdr0_pfc2 = (sdr0_pfc2 & ~SDR0_PFC2_SELECT_MASK) |
SDR0_PFC2_SELECT_CONFIG_4; SDR0_PFC2_SELECT_CONFIG_4;
@ -116,6 +160,58 @@ int board_early_init_f(void)
return 0; return 0;
} }
/*
* The boot flash on CS0 normally has its write-enable pin disabled, and so will
* not respond to CFI commands. This routine therefore fills in the flash
* information for the boot flash. (The flash at CS1 operates normally.)
*/
ulong board_flash_get_legacy (ulong base, int banknum, flash_info_t * info)
{
uint32_t addr;
int i;
if (1 != banknum)
return 0;
info->size = CFG_FLASH0_SIZE;
info->sector_count = CFG_FLASH0_SIZE / 0x20000;
info->flash_id = 0x01000000;
info->portwidth = 2;
info->chipwidth = 2;
info->buffer_size = 32;
info->erase_blk_tout = 16384;
info->write_tout = 2;
info->buffer_write_tout = 5;
info->vendor = 2;
info->cmd_reset = 0x00F0;
info->interface = 2;
info->legacy_unlock = 0;
info->manufacturer_id = 1;
info->device_id = 0x007E;
#if CFG_FLASH0_SIZE == 0x01000000
info->device_id2 = 0x2101;
#elif CFG_FLASH0_SIZE == 0x04000000
info->device_id2 = 0x2301;
#else
#error Unable to set device_id2 for current CFG_FLASH0_SIZE
#endif
info->ext_addr = 0x0040;
info->cfi_version = 0x3133;
info->cfi_offset = 0x0055;
info->addr_unlock1 = 0x00000555;
info->addr_unlock2 = 0x000002AA;
info->name = "CFI conformant";
for (i = 0, addr = -info->size;
i < info->sector_count;
++i, addr += 0x20000) {
info->start[i] = addr;
info->protect[i] = 0x00;
}
return 1;
}
static int man_data_read(unsigned int addr) static int man_data_read(unsigned int addr)
{ {
/* /*
@ -189,12 +285,20 @@ static void set_serial_number(void)
* If the environmental variable "serial#" is not set, try to set it * If the environmental variable "serial#" is not set, try to set it
* from the manufacturer's information serial EEPROM. * from the manufacturer's information serial EEPROM.
*/ */
char s[MAN_SERIAL_NO_LENGTH + 1]; char s[MAN_INFO_LENGTH + MAN_MAC_ADDR_LENGTH + 2];
if (0 == getenv("serial#") && if (getenv("serial#"))
0 != man_data_read_field(s, MAN_SERIAL_NO_FIELD, return;
MAN_SERIAL_NO_LENGTH))
setenv("serial#", s); if (!man_data_read_field(s, MAN_INFO_FIELD, MAN_INFO_LENGTH))
return;
s[MAN_INFO_LENGTH] = '-';
if (!man_data_read_field(s + MAN_INFO_LENGTH + 1, MAN_MAC_ADDR_FIELD,
MAN_MAC_ADDR_LENGTH))
return;
setenv("serial#", s);
} }
static void set_mac_addresses(void) static void set_mac_addresses(void)
@ -204,45 +308,58 @@ static void set_mac_addresses(void)
* set, try to set them from the manufacturer's information serial * set, try to set them from the manufacturer's information serial
* EEPROM. * EEPROM.
*/ */
char s[MAN_MAC_ADDR_LENGTH + 1];
#if MAN_MAC_ADDR_LENGTH % 2 != 0
#error MAN_MAC_ADDR_LENGTH must be an even number
#endif
char s[(3 * MAN_MAC_ADDR_LENGTH) / 2];
char *src;
char *dst;
if (0 != getenv("ethaddr") && 0 != getenv("eth1addr")) if (0 != getenv("ethaddr") && 0 != getenv("eth1addr"))
return; return;
if (0 == man_data_read_field(s, MAN_MAC_ADDR_FIELD, if (0 == man_data_read_field(s + (MAN_MAC_ADDR_LENGTH / 2) - 1,
MAN_MAC_ADDR_LENGTH)) MAN_MAC_ADDR_FIELD, MAN_MAC_ADDR_LENGTH))
return; return;
for (src = s + (MAN_MAC_ADDR_LENGTH / 2) - 1, dst = s; src != dst;) {
*dst++ = *src++;
*dst++ = *src++;
*dst++ = ':';
}
if (0 == getenv("ethaddr")) if (0 == getenv("ethaddr"))
setenv("ethaddr", s); setenv("ethaddr", s);
if (0 == getenv("eth1addr")) { if (0 == getenv("eth1addr")) {
++s[MAN_MAC_ADDR_LENGTH - 1]; ++s[((3 * MAN_MAC_ADDR_LENGTH) / 2) - 2];
setenv("eth1addr", s); setenv("eth1addr", s);
} }
} }
int misc_init_r(void) int misc_init_r(void)
{ {
uint pbcr; uint32_t pbcr;
int size_val = 0; int size_val;
u32 reg; uint32_t reg;
unsigned long usb2d0cr = 0; unsigned long usb2d0cr = 0;
unsigned long usb2phy0cr, usb2h0cr = 0; unsigned long usb2phy0cr, usb2h0cr = 0;
unsigned long sdr0_pfc1; unsigned long sdr0_pfc1;
char *act = getenv("usbact"); uint32_t const flash1_size = gd->bd->bi_flashsize - CFG_FLASH0_SIZE;
char const *const act = getenv("usbact");
/* Re-do flash sizing to get full correct info */ /*
* Re-do FLASH1 sizing and adjust flash start and offset.
/* adjust flash start and offset */ */
gd->bd->bi_flashstart = 0 - gd->bd->bi_flashsize; gd->bd->bi_flashstart = CFG_FLASH1_TOP - flash1_size;
gd->bd->bi_flashoffset = 0; gd->bd->bi_flashoffset = 0;
mtdcr(ebccfga, pb0cr); mtdcr(ebccfga, pb1cr);
pbcr = mfdcr(ebccfgd); pbcr = mfdcr(ebccfgd);
size_val = ffs(gd->bd->bi_flashsize) - 21; size_val = ffs(flash1_size) - 21;
pbcr = (pbcr & 0x0001ffff) | gd->bd->bi_flashstart | (size_val << 17); pbcr = (pbcr & 0x0001ffff) | gd->bd->bi_flashstart | (size_val << 17);
mtdcr(ebccfga, pb0cr); mtdcr(ebccfga, pb1cr);
mtdcr(ebccfgd, pbcr); mtdcr(ebccfgd, pbcr);
/* /*
@ -250,14 +367,37 @@ int misc_init_r(void)
*/ */
flash_get_size(gd->bd->bi_flashstart, 0); flash_get_size(gd->bd->bi_flashstart, 0);
/* Monitor protection ON by default */ /*
(void)flash_protect(FLAG_PROTECT_SET, -CFG_MONITOR_LEN, 0xffffffff, * Re-do FLASH1 sizing and adjust flash offset to reserve space for
&flash_info[0]); * environment
*/
gd->bd->bi_flashoffset =
CFG_ENV_ADDR_REDUND + CFG_ENV_SECT_SIZE - CFG_FLASH1_ADDR;
mtdcr(ebccfga, pb1cr);
pbcr = mfdcr(ebccfgd);
size_val = ffs(gd->bd->bi_flashsize - CFG_FLASH0_SIZE) - 21;
pbcr = (pbcr & 0x0001ffff) | gd->bd->bi_flashstart | (size_val << 17);
mtdcr(ebccfga, pb1cr);
mtdcr(ebccfgd, pbcr);
/* Monitor protection ON by default */
#if defined(CONFIG_KORAT_PERMANENT)
(void)flash_protect(FLAG_PROTECT_SET, CFG_MONITOR_BASE,
CFG_MONITOR_BASE + CFG_MONITOR_LEN - 1,
flash_info + 1);
#else
(void)flash_protect(FLAG_PROTECT_SET, CFG_MONITOR_BASE,
CFG_MONITOR_BASE + CFG_MONITOR_LEN - 1,
flash_info);
#endif
/* Env protection ON by default */ /* Env protection ON by default */
(void)flash_protect(FLAG_PROTECT_SET, CFG_ENV_ADDR,
CFG_ENV_ADDR + CFG_ENV_SECT_SIZE - 1,
flash_info);
(void)flash_protect(FLAG_PROTECT_SET, CFG_ENV_ADDR_REDUND, (void)flash_protect(FLAG_PROTECT_SET, CFG_ENV_ADDR_REDUND,
CFG_ENV_ADDR_REDUND + 2 * CFG_ENV_SECT_SIZE - 1, CFG_ENV_ADDR_REDUND + CFG_ENV_SECT_SIZE - 1,
&flash_info[0]); flash_info);
/* /*
* USB suff... * USB suff...
@ -393,6 +533,8 @@ int misc_init_r(void)
set_serial_number(); set_serial_number();
set_mac_addresses(); set_mac_addresses();
gpio_write_bit(CFG_GPIO_ATMEGA_RESET_, 1);
return 0; return 0;
} }
@ -402,10 +544,10 @@ int checkboard(void)
u8 const rev = in_8((u8 *) CFG_CPLD_BASE + 0); u8 const rev = in_8((u8 *) CFG_CPLD_BASE + 0);
printf("Board: Korat, Rev. %X", rev); printf("Board: Korat, Rev. %X", rev);
if (s != NULL) if (s)
printf(", serial# %s", s); printf(", serial# %s", s);
printf(", Ethernet PHY 0: "); printf(".\n Ethernet PHY 0: ");
if (gpio_read_out_bit(CFG_GPIO_PHY0_FIBER_SEL)) if (gpio_read_out_bit(CFG_GPIO_PHY0_FIBER_SEL))
printf("fiber"); printf("fiber");
else else
@ -418,7 +560,10 @@ int checkboard(void)
printf("copper"); printf("copper");
printf(".\n"); printf(".\n");
return (0); #if defined(CONFIG_KORAT_PERMANENT)
printf(" Executing permanent copy of U-Boot.\n");
#endif
return 0;
} }
#if defined(CFG_DRAM_TEST) #if defined(CFG_DRAM_TEST)
@ -529,23 +674,26 @@ void pci_target_init(struct pci_controller *hose)
/* /*
* PowerPC440EPX PCI Master configuration. * PowerPC440EPX PCI Master configuration.
* Map one 1Gig range of PLB/processor addresses to PCI memory space. * Map one 1Gig range of PLB/processor addresses to PCI memory space.
* PLB address 0xA0000000-0xDFFFFFFF * PLB address 0x80000000-0xBFFFFFFF
* ==> PCI address 0xA0000000-0xDFFFFFFF * ==> PCI address 0x80000000-0xBFFFFFFF
* Use byte reversed out routines to handle endianess. * Use byte reversed out routines to handle endianess.
* Make this region non-prefetchable. * Make this region non-prefetchable.
*/ */
out32r(PCIX0_PMM0MA, 0x00000000); /* PMM0 Mask/Attribute */ out32r(PCIX0_PMM0MA, 0x00000000); /* PMM0 Mask/Attribute */
/* - disabled b4 setting */ /* - disabled b4 setting */
out32r(PCIX0_PMM0LA, CFG_PCI_MEMBASE); /* PMM0 Local Address */ out32r(PCIX0_PMM0LA, CFG_PCI_MEMBASE); /* PMM0 Local Address */
out32r(PCIX0_PMM0PCILA, CFG_PCI_MEMBASE); /* PMM0 PCI Low Address */ out32r(PCIX0_PMM0PCILA,
CFG_PCI_MEMBASE); /* PMM0 PCI Low Address */
out32r(PCIX0_PMM0PCIHA, 0x00000000); /* PMM0 PCI High Address */ out32r(PCIX0_PMM0PCIHA, 0x00000000); /* PMM0 PCI High Address */
out32r(PCIX0_PMM0MA, 0xE0000001); /* 512M + No prefetching, */ out32r(PCIX0_PMM0MA, 0xE0000001); /* 512M + No prefetching, */
/* and enable region */ /* and enable region */
out32r(PCIX0_PMM1MA, 0x00000000); /* PMM0 Mask/Attribute */ out32r(PCIX0_PMM1MA, 0x00000000); /* PMM0 Mask/Attribute */
/* - disabled b4 setting */ /* - disabled b4 setting */
out32r(PCIX0_PMM1LA, CFG_PCI_MEMBASE2); /* PMM0 Local Address */ out32r(PCIX0_PMM1LA,
out32r(PCIX0_PMM1PCILA, CFG_PCI_MEMBASE2); /* PMM0 PCI Low Address */ CFG_PCI_MEMBASE + 0x20000000); /* PMM0 Local Address */
out32r(PCIX0_PMM1PCILA,
CFG_PCI_MEMBASE + 0x20000000); /* PMM0 PCI Low Address */
out32r(PCIX0_PMM1PCIHA, 0x00000000); /* PMM0 PCI High Address */ out32r(PCIX0_PMM1PCIHA, 0x00000000); /* PMM0 PCI High Address */
out32r(PCIX0_PMM1MA, 0xE0000001); /* 512M + No prefetching, */ out32r(PCIX0_PMM1MA, 0xE0000001); /* 512M + No prefetching, */
/* and enable region */ /* and enable region */

143
board/korat/u-boot-F7FC.lds Normal file
View file

@ -0,0 +1,143 @@
/*
* (C) Copyright 2002
* 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
*/
OUTPUT_ARCH(powerpc)
SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/local/lib); SEARCH_DIR(/usr/local/powerpc-any-elf/lib);
/* Do we need any of these for elf?
__DYNAMIC = 0; */
SECTIONS
{
.resetvec 0xF7FBFFFC :
{
*(.resetvec)
} = 0xffff
.bootpg 0xF7FBF000 :
{
cpu/ppc4xx/start.o (.bootpg)
} = 0xffff
/* Read-only sections, merged into text segment: */
. = + SIZEOF_HEADERS;
.interp : { *(.interp) }
.hash : { *(.hash) }
.dynsym : { *(.dynsym) }
.dynstr : { *(.dynstr) }
.rel.text : { *(.rel.text) }
.rela.text : { *(.rela.text) }
.rel.data : { *(.rel.data) }
.rela.data : { *(.rela.data) }
.rel.rodata : { *(.rel.rodata) }
.rela.rodata : { *(.rela.rodata) }
.rel.got : { *(.rel.got) }
.rela.got : { *(.rela.got) }
.rel.ctors : { *(.rel.ctors) }
.rela.ctors : { *(.rela.ctors) }
.rel.dtors : { *(.rel.dtors) }
.rela.dtors : { *(.rela.dtors) }
.rel.bss : { *(.rel.bss) }
.rela.bss : { *(.rela.bss) }
.rel.plt : { *(.rel.plt) }
.rela.plt : { *(.rela.plt) }
.init : { *(.init) }
.plt : { *(.plt) }
.text :
{
/* WARNING - the following is hand-optimized to fit within */
/* the sector layout of our flash chips! XXX FIXME XXX */
cpu/ppc4xx/start.o (.text)
*(.text)
*(.fixup)
*(.got1)
}
_etext = .;
PROVIDE (etext = .);
.rodata :
{
*(.rodata)
*(.rodata1)
*(.rodata.str1.4)
}
.fini : { *(.fini) } =0
.ctors : { *(.ctors) }
.dtors : { *(.dtors) }
/* Read-write section, merged into data segment: */
. = (. + 0x00FF) & 0xFFFFFF00;
_erotext = .;
PROVIDE (erotext = .);
.reloc :
{
*(.got)
_GOT2_TABLE_ = .;
*(.got2)
_FIXUP_TABLE_ = .;
*(.fixup)
}
__got2_entries = (_FIXUP_TABLE_ - _GOT2_TABLE_) >>2;
__fixup_entries = (. - _FIXUP_TABLE_)>>2;
.data :
{
*(.data)
*(.data1)
*(.sdata)
*(.sdata2)
*(.dynamic)
CONSTRUCTORS
}
_edata = .;
PROVIDE (edata = .);
. = .;
__u_boot_cmd_start = .;
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;
. = .;
__start___ex_table = .;
__ex_table : { *(__ex_table) }
__stop___ex_table = .;
. = ALIGN(256);
__init_begin = .;
.text.init : { *(.text.init) }
.data.init : { *(.data.init) }
. = ALIGN(256);
__init_end = .;
__bss_start = .;
.bss (NOLOAD) :
{
*(.sbss) *(.scommon)
*(.dynbss)
*(.bss)
*(COMMON)
}
_end = . ;
PROVIDE (end = .);
}

51
doc/README.korat Normal file
View file

@ -0,0 +1,51 @@
The Korat board has two NOR flashes, FLASH0 and FLASH1, which are connected to
chip select 0 and 1, respectively. FLASH0 contains 16 MiB, and is mapped to
addresses 0xFF000000 - 0xFFFFFFFF as U-Boot Flash Bank #2. FLASH1 contains
from 16 to 128 MiB, and is mapped to 0xF?000000 - 0xF7FFFFFF as U-Boot Flash
Bank #1 (with the starting address depending on the flash size detected at
runtime). The write-enable pin on FLASH0 is disabled, so the contents of FLASH0
cannot be modified in the field. This also prevents FLASH0 from executing
commands to return chip information, so its configuration is hard-coded in
U-Boot.
There are two versions of U-Boot for Korat: "permanent" and "upgradable". The
permanent U-Boot is pre-programmed at the top of FLASH0, e.g., at addresses
0xFFFA0000 - 0xFFFFFFFF for the current 384 KiB size. The upgradable U-Boot is
located 256 KiB from the top of FLASH1, e.g. at addresses 0xF7F6000 - 0xF7FC0000
for the current 384 KiB size. FLASH1 addresses 0xF7FE0000 - 0xF7FF0000 are
used for the U-Boot environmental parameters, and addresses 0xF7FC0000 -
0xF7FDFFFF are used for the redundant copy of the parameters. These locations
are used by both versions of U-Boot.
On booting, the permanent U-Boot in FLASH0 begins executing. After performing
minimal setup, it monitors the state of the board's Reset switch (GPIO47). If
the switch is sensed as open before a timeout period, then U-Boot branches to
address 0xF7FBFFFC. This causes the upgradable U-Boot to execute from the
beginning. If the switch remains closed thoughout the timeout period, the
permanent U-Boot activates the on-board buzzer until the switch is sensed as
opened. It then continues to execute without branching to FLASH1. The effect
of this is that normally the Korat board boots its upgradable U-Boot, but, if
this has been corrupted, the user can boot the permanent U-Boot, which can then
be used to erase and reload FLASH1 as needed.
Note that it is not necessary for the permanent U-Boot to have all the latest
features, but only that it have sufficient functionality (working "tftp",
"erase", "cp.b", etc.) to repair FLASH1. Also, the permanent U-Boot makes no
assumptions about the size of FLASH1 or the size of the upgradable U-Boot: it is
sufficient that the upgradable U-Boot can be started by a branch to 0xF7FBFFFC.
The build sequence:
make korat_config
make all perm=1
builds the permanent U-Boot by selecting loader file "u-boot.lds" and defining
preprocessor symbol "CONFIG_KORAT_PERMANENT". The default build:
make korat_config
make all
creates the upgradable U-Boot but selecting loader file "u-boot-F7FC.lds" and
leaving preprocessor symbol "CONFIG_KORAT_PERMANENT" undefined.
2008-02-22, Larry Johnson <lrj@acm.org>

View file

@ -45,10 +45,10 @@
* Manufacturer's information serial EEPROM parameters * Manufacturer's information serial EEPROM parameters
*/ */
#define MAN_DATA_EEPROM_ADDR 0x53 /* EEPROM I2C address */ #define MAN_DATA_EEPROM_ADDR 0x53 /* EEPROM I2C address */
#define MAN_SERIAL_NO_FIELD 2 #define MAN_INFO_FIELD 2
#define MAN_SERIAL_NO_LENGTH 13 #define MAN_INFO_LENGTH 9
#define MAN_MAC_ADDR_FIELD 3 #define MAN_MAC_ADDR_FIELD 3
#define MAN_MAC_ADDR_LENGTH 17 #define MAN_MAC_ADDR_LENGTH 12
/* /*
* Base addresses -- Note these are effective addresses where the actual * Base addresses -- Note these are effective addresses where the actual
@ -57,17 +57,18 @@
#define CFG_MONITOR_LEN (384 * 1024) /* Reserve 384 kiB for Monitor */ #define CFG_MONITOR_LEN (384 * 1024) /* Reserve 384 kiB for Monitor */
#define CFG_MALLOC_LEN (256 * 1024) /* Reserve 256 kiB for malloc() */ #define CFG_MALLOC_LEN (256 * 1024) /* Reserve 256 kiB for malloc() */
#define CFG_BOOT_BASE_ADDR 0xf0000000
#define CFG_SDRAM_BASE 0x00000000 /* _must_ be 0 */ #define CFG_SDRAM_BASE 0x00000000 /* _must_ be 0 */
#define CFG_FLASH_BASE 0xfc000000 /* start of FLASH */ #define CFG_FLASH0_SIZE 0x01000000
#define CFG_FLASH0_ADDR (-CFG_FLASH0_SIZE)
#define CFG_FLASH1_TOP 0xF8000000
#define CFG_FLASH1_MAX_SIZE 0x08000000
#define CFG_FLASH1_ADDR (CFG_FLASH1_TOP - CFG_FLASH1_MAX_SIZE)
#define CFG_FLASH_BASE CFG_FLASH1_ADDR /* start of FLASH */
#define CFG_MONITOR_BASE TEXT_BASE #define CFG_MONITOR_BASE TEXT_BASE
#define CFG_OCM_BASE 0xe0010000 /* ocm */ #define CFG_OCM_BASE 0xe0010000 /* ocm */
#define CFG_OCM_DATA_ADDR CFG_OCM_BASE #define CFG_OCM_DATA_ADDR CFG_OCM_BASE
#define CFG_PCI_BASE 0xe0000000 /* Internal PCI regs */ #define CFG_PCI_BASE 0xe0000000 /* Internal PCI regs */
#define CFG_PCI_MEMBASE 0x80000000 /* mapped pci memory */ #define CFG_PCI_MEMBASE 0x80000000 /* mapped pci memory */
#define CFG_PCI_MEMBASE1 CFG_PCI_MEMBASE + 0x10000000
#define CFG_PCI_MEMBASE2 CFG_PCI_MEMBASE1 + 0x10000000
#define CFG_PCI_MEMBASE3 CFG_PCI_MEMBASE2 + 0x10000000
/* Don't change either of these */ /* Don't change either of these */
#define CFG_PERIPHERAL_BASE 0xef600000 /* internal peripherals */ #define CFG_PERIPHERAL_BASE 0xef600000 /* internal peripherals */
@ -108,13 +109,14 @@
/* /*
* FLASH related * FLASH related
*/ */
#define CFG_FLASH_CFI /* The flash is CFI compatible */ #define CFG_FLASH_CFI /* The flash is CFI compatible */
#define CFG_FLASH_CFI_DRIVER /* Use common CFI driver */ #define CFG_FLASH_CFI_DRIVER /* Use common CFI driver */
#define CONFIG_FLASH_CFI_LEGACY /* Allow hard-coded config for FLASH0 */
#define CFG_FLASH_BANKS_LIST { CFG_FLASH_BASE } #define CFG_FLASH_BANKS_LIST { CFG_FLASH1_ADDR, CFG_FLASH0_ADDR }
#define CFG_MAX_FLASH_BANKS 1 /* max number of memory banks */ #define CFG_MAX_FLASH_BANKS 2 /* max number of memory banks */
#define CFG_MAX_FLASH_SECT 512 /* max number of sectors on one chip */ #define CFG_MAX_FLASH_SECT 1024 /* max number of sectors on one chip */
#define CFG_FLASH_ERASE_TOUT 120000 /* Timeout for Flash Erase (in ms) */ #define CFG_FLASH_ERASE_TOUT 120000 /* Timeout for Flash Erase (in ms) */
#define CFG_FLASH_WRITE_TOUT 500 /* Timeout for Flash Write (in ms) */ #define CFG_FLASH_WRITE_TOUT 500 /* Timeout for Flash Write (in ms) */
@ -126,12 +128,12 @@
#define CFG_FLASH_QUIET_TEST 1 /* don't warn upon unknown flash */ #define CFG_FLASH_QUIET_TEST 1 /* don't warn upon unknown flash */
#define CFG_ENV_SECT_SIZE 0x20000 /* size of one complete sector */ #define CFG_ENV_SECT_SIZE 0x20000 /* size of one complete sector */
#define CFG_ENV_ADDR ((-CFG_MONITOR_LEN)-CFG_ENV_SECT_SIZE) #define CFG_ENV_ADDR (CFG_FLASH1_TOP - CFG_ENV_SECT_SIZE)
#define CFG_ENV_SIZE 0x2000 /* Total Size of Environment Sector */ #define CFG_ENV_SIZE 0x2000 /* Total Size of Environment Sector */
/* Address and size of Redundant Environment Sector */ /* Address and size of Redundant Environment Sector */
#define CFG_ENV_ADDR_REDUND (CFG_ENV_ADDR-CFG_ENV_SECT_SIZE) #define CFG_ENV_ADDR_REDUND (CFG_ENV_ADDR - CFG_ENV_SECT_SIZE)
#define CFG_ENV_SIZE_REDUND (CFG_ENV_SIZE) #define CFG_ENV_SIZE_REDUND CFG_ENV_SIZE
/* /*
* DDR SDRAM * DDR SDRAM
@ -182,6 +184,7 @@
#define CFG_BOOTFILE "bootfile=/tftpboot/korat/uImage\0" #define CFG_BOOTFILE "bootfile=/tftpboot/korat/uImage\0"
#define CFG_ROOTPATH "rootpath=/opt/eldk/ppc_4xxFP\0" #define CFG_ROOTPATH "rootpath=/opt/eldk/ppc_4xxFP\0"
/* Note: kernel_addr and ramdisk_addr assume that FLASH1 is 64 MiB. */
#define CONFIG_EXTRA_ENV_SETTINGS \ #define CONFIG_EXTRA_ENV_SETTINGS \
CFG_BOOTFILE \ CFG_BOOTFILE \
CFG_ROOTPATH \ CFG_ROOTPATH \
@ -199,8 +202,8 @@
"bootm ${kernel_addr} ${ramdisk_addr}\0" \ "bootm ${kernel_addr} ${ramdisk_addr}\0" \
"net_nfs=tftp 200000 ${bootfile};run nfsargs addip addtty;" \ "net_nfs=tftp 200000 ${bootfile};run nfsargs addip addtty;" \
"bootm\0" \ "bootm\0" \
"kernel_addr=FC000000\0" \ "kernel_addr=F4000000\0" \
"ramdisk_addr=FC180000\0" \ "ramdisk_addr=F4400000\0" \
"load=tftp 200000 /tftpboot/${hostname}/u-boot.bin\0" \ "load=tftp 200000 /tftpboot/${hostname}/u-boot.bin\0" \
"update=protect off FFFA0000 FFFFFFFF;era FFFA0000 FFFFFFFF;" \ "update=protect off FFFA0000 FFFFFFFF;era FFFA0000 FFFFFFFF;" \
"cp.b 200000 FFFA0000 60000\0" \ "cp.b 200000 FFFA0000 60000\0" \
@ -218,7 +221,7 @@
#define CONFIG_PHY_ADDR 2 /* PHY address, See schematics */ #define CONFIG_PHY_ADDR 2 /* PHY address, See schematics */
#define CONFIG_PHY_DYNAMIC_ANEG 1 #define CONFIG_PHY_DYNAMIC_ANEG 1
#define CONFIG_PHY_RESET 1 /* reset phy upon startup */ #undef CONFIG_PHY_RESET /* Don't do software PHY reset */
#define CONFIG_PHY_GIGE 1 /* Include GbE speed/duplex detection */ #define CONFIG_PHY_GIGE 1 /* Include GbE speed/duplex detection */
#define CONFIG_HAS_ETH0 #define CONFIG_HAS_ETH0
@ -323,6 +326,11 @@
#define CONFIG_ZERO_BOOTDELAY_CHECK /* check for keypress on bootdelay==0 */ #define CONFIG_ZERO_BOOTDELAY_CHECK /* check for keypress on bootdelay==0 */
#define CONFIG_VERSION_VARIABLE 1 /* include version env variable */ #define CONFIG_VERSION_VARIABLE 1 /* include version env variable */
/*
* Korat-specific options
*/
#define CFG_KORAT_MAN_RESET_MS 10000 /* timeout for manufacturer reset */
/* /*
* PCI stuff * PCI stuff
*/ */
@ -352,12 +360,23 @@
*/ */
/* Memory Bank 0 (NOR-FLASH) initialization */ /* Memory Bank 0 (NOR-FLASH) initialization */
#if CFG_FLASH0_SIZE == 0x01000000
#define CFG_EBC_PB0AP 0x04017300 #define CFG_EBC_PB0AP 0x04017300
#define CFG_EBC_PB0CR (CFG_FLASH_BASE | 0x000DA000) #define CFG_EBC_PB0CR (CFG_FLASH0_ADDR | 0x0009A000)
#elif CFG_FLASH0_SIZE == 0x04000000
#define CFG_EBC_PB0AP 0x04017300
#define CFG_EBC_PB0CR (CFG_FLASH0_ADDR | 0x000DA000)
#else
#error Unable to configure chip select for current CFG_FLASH0_SIZE
#endif
/* Memory Bank 1 (NOR-FLASH) initialization */ /* Memory Bank 1 (NOR-FLASH) initialization */
#if CFG_FLASH1_MAX_SIZE == 0x08000000
#define CFG_EBC_PB1AP 0x04017300 #define CFG_EBC_PB1AP 0x04017300
#define CFG_EBC_PB1CR (0xF8000000 | 0x000DA000) #define CFG_EBC_PB1CR (CFG_FLASH1_ADDR | 0x000FA000)
#else
#error Unable to configure chip select for current CFG_FLASH1_MAX_SIZE
#endif
/* Memory Bank 2 (CPLD) initialization */ /* Memory Bank 2 (CPLD) initialization */
#define CFG_EBC_PB2AP 0x04017300 #define CFG_EBC_PB2AP 0x04017300
@ -428,6 +447,7 @@
* GPIO63 xxxx x x (reserved for trace port) * GPIO63 xxxx x x (reserved for trace port)
*/ */
#define CFG_GPIO_ATMEGA_RESET_ 12
#define CFG_GPIO_ATMEGA_SS_ 13 #define CFG_GPIO_ATMEGA_SS_ 13
#define CFG_GPIO_PHY0_FIBER_SEL 27 #define CFG_GPIO_PHY0_FIBER_SEL 27
#define CFG_GPIO_PHY1_FIBER_SEL 28 #define CFG_GPIO_PHY1_FIBER_SEL 28
@ -437,6 +457,7 @@
#define CFG_GPIO_SFP1_TX_EN_ 33 #define CFG_GPIO_SFP1_TX_EN_ 33
#define CFG_GPIO_PHY0_EN 45 #define CFG_GPIO_PHY0_EN 45
#define CFG_GPIO_PHY1_EN 46 #define CFG_GPIO_PHY1_EN 46
#define CFG_GPIO_RESET_PRESSED_ 47
/* /*
* PPC440 GPIO Configuration * PPC440 GPIO Configuration