diff options
Diffstat (limited to 'board/prodrive')
| -rw-r--r-- | board/prodrive/p3p440/Makefile | 47 | ||||
| -rw-r--r-- | board/prodrive/p3p440/config.mk | 44 | ||||
| -rw-r--r-- | board/prodrive/p3p440/init.S | 99 | ||||
| -rw-r--r-- | board/prodrive/p3p440/p3p440.c | 275 | ||||
| -rw-r--r-- | board/prodrive/p3p440/p3p440.h | 40 | ||||
| -rw-r--r-- | board/prodrive/p3p440/u-boot.lds | 156 | 
6 files changed, 661 insertions, 0 deletions
| diff --git a/board/prodrive/p3p440/Makefile b/board/prodrive/p3p440/Makefile new file mode 100644 index 000000000..47116d367 --- /dev/null +++ b/board/prodrive/p3p440/Makefile @@ -0,0 +1,47 @@ +# +# (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 +# + +include $(TOPDIR)/config.mk + +LIB	= lib$(BOARD).a + +OBJS	= $(BOARD).o +SOBJS	= init.o + +$(LIB):	$(OBJS) $(SOBJS) +	$(AR) crv $@ $(OBJS) + +clean: +	rm -f $(SOBJS) $(OBJS) + +distclean:	clean +	rm -f $(LIB) core *.bak .depend + +######################################################################### + +.depend:	Makefile $(SOBJS:.o=.S) $(OBJS:.o=.c) +		$(CC) -M $(CFLAGS) $(SOBJS:.o=.S) $(OBJS:.o=.c) > $@ + +sinclude .depend + +######################################################################### diff --git a/board/prodrive/p3p440/config.mk b/board/prodrive/p3p440/config.mk new file mode 100644 index 000000000..e5722dd36 --- /dev/null +++ b/board/prodrive/p3p440/config.mk @@ -0,0 +1,44 @@ +# +# (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 +# + +# +# esd ADCIOP boards +# + +#TEXT_BASE = 0xFFFE0000 + +ifeq ($(ramsym),1) +TEXT_BASE = 0x07FD0000 +else +TEXT_BASE = 0xFFFC0000 +endif + +PLATFORM_CPPFLAGS += -DCONFIG_440=1 + +ifeq ($(debug),1) +PLATFORM_CPPFLAGS += -DDEBUG +endif + +ifeq ($(dbcr),1) +PLATFORM_CPPFLAGS += -DCFG_INIT_DBCR=0x8cff0000 +endif diff --git a/board/prodrive/p3p440/init.S b/board/prodrive/p3p440/init.S new file mode 100644 index 000000000..ee6b7066e --- /dev/null +++ b/board/prodrive/p3p440/init.S @@ -0,0 +1,99 @@ +/* + * (C) Copyright 2005 + * Stefan Roese, DENX Software Engineering, sr@denx.de. + * + * Copyright (C) 2002 Scott McNutt <smcnutt@artesyncp.com> + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <ppc_asm.tmpl> +#include <config.h> + +/* General */ +#define TLB_VALID   0x00000200 + +/* Supported page sizes */ + +#define SZ_1K	    0x00000000 +#define SZ_4K	    0x00000010 +#define SZ_16K	    0x00000020 +#define SZ_64K	    0x00000030 +#define SZ_256K	    0x00000040 +#define SZ_1M	    0x00000050 +#define SZ_16M	    0x00000070 +#define SZ_256M	    0x00000090 + +/* Storage attributes */ +#define SA_W	    0x00000800	    /* Write-through */ +#define SA_I	    0x00000400	    /* Caching inhibited */ +#define SA_M	    0x00000200	    /* Memory coherence */ +#define SA_G	    0x00000100	    /* Guarded */ +#define SA_E	    0x00000080	    /* Endian */ + +/* Access control */ +#define AC_X	    0x00000024	    /* Execute */ +#define AC_W	    0x00000012	    /* Write */ +#define AC_R	    0x00000009	    /* Read */ + +/* Some handy macros */ + +#define EPN(e)		((e) & 0xfffffc00) +#define TLB0(epn,sz)	( (EPN((epn)) | (sz) | TLB_VALID ) ) +#define TLB1(rpn,erpn)	( ((rpn)&0xfffffc00) | (erpn) ) +#define TLB2(a)		( (a)&0x00000fbf ) + +#define tlbtab_start\ +	mflr    r1  ;\ +	bl 0f	    ; + +#define tlbtab_end\ +	.long 0, 0, 0	;   \ +0:	mflr    r0	;   \ +	mtlr    r1	;   \ +	blr		; + +#define tlbentry(epn,sz,rpn,erpn,attr)\ +	.long TLB0(epn,sz),TLB1(rpn,erpn),TLB2(attr) + + +/************************************************************************** + * TLB TABLE + * + * This table is used by the cpu boot code to setup the initial tlb + * entries. Rather than make broad assumptions in the cpu source tree, + * this table lets each board set things up however they like. + * + *  Pointer to the table is returned in r1 + * + *************************************************************************/ + +    .section .bootpg,"ax" +    .globl tlbtab + +tlbtab: +    tlbtab_start +    tlbentry( 0xf0000000, SZ_256M, 0xf0000000, 1, AC_R|AC_W|AC_X|SA_G|SA_I) +    tlbentry( CFG_PERIPHERAL_BASE, SZ_256M, 0x40000000, 1, AC_R|AC_W|SA_G|SA_I) +    tlbentry( CFG_ISRAM_BASE, SZ_4K, 0x80000000, 0, AC_R|AC_W|AC_X ) +    tlbentry( CFG_ISRAM_BASE + 0x1000, SZ_4K, 0x80001000, 0, AC_R|AC_W|AC_X ) +    tlbentry( CFG_SDRAM_BASE, SZ_256M, 0x00000000, 0, AC_R|AC_W|AC_X|SA_G|SA_I ) +    tlbentry( CFG_PCI_BASE, SZ_256M, 0x00000000, 2, AC_R|AC_W|SA_G|SA_I ) +    tlbentry( CFG_PCI_MEMBASE, SZ_256M, 0x00000000, 3, AC_R|AC_W|SA_G|SA_I ) +    tlbtab_end diff --git a/board/prodrive/p3p440/p3p440.c b/board/prodrive/p3p440/p3p440.c new file mode 100644 index 000000000..cc4c9dda9 --- /dev/null +++ b/board/prodrive/p3p440/p3p440.c @@ -0,0 +1,275 @@ +/* + * (C) Copyright 2005 + * Stefan Roese, DENX Software Engineering, sr@denx.de. + * + * Copyright (C) 2002 Scott McNutt <smcnutt@artesyncp.com> + * + * See file CREDITS for list of people who contributed to this + * project. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, + * MA 02111-1307 USA + */ + +#include <common.h> +#include <asm/processor.h> +#include <command.h> + +#include "p3p440.h" + +void set_led(int color) +{ +	switch (color) { +	case LED_OFF: +		out32(GPIO0_OR,  in32(GPIO0_OR) & ~CFG_LED_GREEN & ~CFG_LED_RED); +		break; + +	case LED_GREEN: +		out32(GPIO0_OR,  (in32(GPIO0_OR) | CFG_LED_GREEN) & ~CFG_LED_RED); +		break; + +	case LED_RED: +		out32(GPIO0_OR,  (in32(GPIO0_OR) | CFG_LED_RED) & ~CFG_LED_GREEN); +		break; + +	case LED_ORANGE: +		out32(GPIO0_OR,  in32(GPIO0_OR) | CFG_LED_GREEN | CFG_LED_RED); +		break; +	} +} + +static int is_monarch(void) +{ +	out32(GPIO0_OR,  in32(GPIO0_OR) & ~CFG_GPIO_RDY); +	udelay(1000); + +	if (in32(GPIO0_IR) & CFG_MONARCH_IO) +		return 0; +	else +		return 1; +} + +static void wait_for_pci_ready(void) +{ +	/* +	 * Configure EREADY_IO as input +	 */ +	out32(GPIO0_TCR, in32(GPIO0_TCR) & ~CFG_EREADY_IO); +	udelay(1000); + +	for (;;) { +		if (in32(GPIO0_IR) & CFG_EREADY_IO) +			return; +        } + +} + +int board_early_init_f(void) +{ +	uint reg; + +	/*-------------------------------------------------------------------- +	 * Setup the external bus controller/chip selects +	 *-------------------------------------------------------------------*/ +	mtdcr(ebccfga, xbcfg); +	reg = mfdcr(ebccfgd); +	mtdcr(ebccfgd, reg | 0x04000000);	/* Set ATC */ + +	/*-------------------------------------------------------------------- +	 * Setup pin multiplexing (GPIO/IRQ...) +	 *-------------------------------------------------------------------*/ +	mtdcr(cpc0_gpio, 0x03F01F80); + +	out32(GPIO0_ODR, 0x00000000);	/* no open drain pins      */ +	out32(GPIO0_TCR, CFG_GPIO_RDY | CFG_EREADY_IO | CFG_LED_RED | CFG_LED_GREEN); +	out32(GPIO0_OR,  CFG_GPIO_RDY); + +	/*-------------------------------------------------------------------- +	 * Setup the interrupt controller polarities, triggers, etc. +	 *-------------------------------------------------------------------*/ +	mtdcr(uic0sr, 0xffffffff);	/* clear all */ +	mtdcr(uic0er, 0x00000000);	/* disable all */ +	mtdcr(uic0cr, 0x00000001);	/* UIC1 crit is critical */ +	mtdcr(uic0pr, 0xfffffe13);	/* per ref-board manual */ +	mtdcr(uic0tr, 0x01c00008);	/* per ref-board manual */ +	mtdcr(uic0vr, 0x00000001);	/* int31 highest, base=0x000 */ +	mtdcr(uic0sr, 0xffffffff);	/* clear all */ + +	mtdcr(uic1sr, 0xffffffff);	/* clear all */ +	mtdcr(uic1er, 0x00000000);	/* disable all */ +	mtdcr(uic1cr, 0x00000000);	/* all non-critical */ +	mtdcr(uic1pr, 0xffffe0ff);	/* per ref-board manual */ +	mtdcr(uic1tr, 0x00ffc000);	/* per ref-board manual */ +	mtdcr(uic1vr, 0x00000001);	/* int31 highest, base=0x000 */ +	mtdcr(uic1sr, 0xffffffff);	/* clear all */ + +	return 0; +} + +int checkboard(void) +{ +	sys_info_t sysinfo; +	char *s = getenv("serial#"); +	char buf[32]; + +	get_sys_info(&sysinfo); + +	printf("Board: P3P440"); +	if (s != NULL) { +		puts(", serial# "); +		puts(s); +	} + +	if (is_monarch()) { +		puts(", Monarch"); +	} else { +		puts(", None-Monarch"); +	} + +	putc('\n'); + +	printf("       at %s MHz (VCO=%lu, PLB=%lu, OPB=%lu, EBC=%lu MHz)\n", +	       strmhz(buf, sysinfo.freqProcessor), +	       sysinfo.freqVCOMhz / 1000000, +	       sysinfo.freqPLB / 1000000, +	       sysinfo.freqOPB / 1000000, +	       sysinfo.freqEPB / 1000000); + +	return (0); +} + +int misc_init_r (void) +{ +	DECLARE_GLOBAL_DATA_PTR; + +	/* +	 * Adjust flash start and offset to detected values +	 */ +	gd->bd->bi_flashstart = 0 - gd->bd->bi_flashsize; +	gd->bd->bi_flashoffset = 0; + +	/* +	 * Check if only one FLASH bank is available +	 */ +	if (gd->bd->bi_flashsize != CFG_MAX_FLASH_BANKS * (0 - CFG_FLASH0)) { +		mtebc(pb1cr, 0);			/* disable cs */ +		mtebc(pb1ap, 0); +		mtebc(pb2cr, 0);			/* disable cs */ +		mtebc(pb2ap, 0); +		mtebc(pb3cr, 0);			/* disable cs */ +		mtebc(pb3ap, 0); +	} + +	return 0; +} + +/************************************************************************* + *  pci_pre_init + * + *  This routine is called just prior to registering the hose and gives + *  the board the opportunity to check things. Returning a value of zero + *  indicates that things are bad & PCI initialization should be aborted. + * + *	Different boards may wish to customize the pci controller structure + *	(add regions, override default access routines, etc) or perform + *	certain pre-initialization actions. + * + ************************************************************************/ +#if defined(CONFIG_PCI) && defined(CFG_PCI_PRE_INIT) +int pci_pre_init(struct pci_controller *hose) +{ +	unsigned long strap; + +	/*--------------------------------------------------------------------------+ +	 *	The P3P440 board is always configured as the host & requires the +	 *	PCI arbiter to be disabled because it's an PMC module. +	 *--------------------------------------------------------------------------*/ +	strap = mfdcr(cpc0_strp1); +	if (strap & 0x00100000) { +		printf("PCI: CPC0_STRP1[PAE] set.\n"); +		return 0; +	} + +	return 1; +} +#endif				/* defined(CONFIG_PCI) && defined(CFG_PCI_PRE_INIT) */ + +/************************************************************************* + *  pci_target_init + * + *	The bootstrap configuration provides default settings for the pci + *	inbound map (PIM). But the bootstrap config choices are limited and + *	may not be sufficient for a given board. + * + ************************************************************************/ +#if defined(CONFIG_PCI) && defined(CFG_PCI_TARGET_INIT) +void pci_target_init(struct pci_controller *hose) +{ +	DECLARE_GLOBAL_DATA_PTR; + +	/*--------------------------------------------------------------------------+ +	 * Disable everything +	 *--------------------------------------------------------------------------*/ +	out32r(PCIX0_PIM0SA, 0);	/* disable */ +	out32r(PCIX0_PIM1SA, 0);	/* disable */ +	out32r(PCIX0_PIM2SA, 0);	/* disable */ +	out32r(PCIX0_EROMBA, 0);	/* disable expansion rom */ + +	/*--------------------------------------------------------------------------+ +	 * Map all of SDRAM to PCI address 0x0000_0000. Note that the 440 strapping +	 * options to not support sizes such as 128/256 MB. +	 *--------------------------------------------------------------------------*/ +	out32r(PCIX0_PIM0LAL, CFG_SDRAM_BASE); +	out32r(PCIX0_PIM0LAH, 0); +	out32r(PCIX0_PIM0SA, ~(gd->ram_size - 1) | 1); + +	out32r(PCIX0_BAR0, 0); + +	/*--------------------------------------------------------------------------+ +	 * Program the board's subsystem id/vendor id +	 *--------------------------------------------------------------------------*/ +	out16r(PCIX0_SBSYSVID, CFG_PCI_SUBSYS_VENDORID); +	out16r(PCIX0_SBSYSID, CFG_PCI_SUBSYS_DEVICEID); + +	out16r(PCIX0_CMD, in16r(PCIX0_CMD) | PCI_COMMAND_MEMORY); +} +#endif				/* defined(CONFIG_PCI) && defined(CFG_PCI_TARGET_INIT) */ + +/************************************************************************* + *  is_pci_host + * + *	This routine is called to determine if a pci scan should be + *	performed. With various hardware environments (especially cPCI and + *	PPMC) it's insufficient to depend on the state of the arbiter enable + *	bit in the strap register, or generic host/adapter assumptions. + * + *	Rather than hard-code a bad assumption in the general 440 code, the + *	440 pci code requires the board to decide at runtime. + * + *	Return 0 for adapter mode, non-zero for host (monarch) mode. + * + * + ************************************************************************/ +#if defined(CONFIG_PCI) +int is_pci_host(struct pci_controller *hose) +{ +	if (is_monarch()) { +		wait_for_pci_ready(); +		return 1;		/* return 1 for host controller */ +	} else { +		return 0;		/* return 0 for adapter controller */ +	} +} +#endif				/* defined(CONFIG_PCI) */ diff --git a/board/prodrive/p3p440/p3p440.h b/board/prodrive/p3p440/p3p440.h new file mode 100644 index 000000000..e4e87d1f5 --- /dev/null +++ b/board/prodrive/p3p440/p3p440.h @@ -0,0 +1,40 @@ +/* + * (C) Copyright 2005 + * Stefan Roese, DENX Software Engineering, sr@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 + */ + +#ifndef __P3P440_H__ +#define __P3P440_H__ + +#define CFG_GPIO_RDY	(0x80000000 >> 11) +#define CFG_MONARCH_IO	(0x80000000 >> 18) +#define CFG_EREADY_IO	(0x80000000 >> 20) +#define CFG_LED_GREEN	(0x80000000 >> 21) +#define CFG_LED_RED	(0x80000000 >> 22) + +#define LED_OFF		1 +#define LED_GREEN	2 +#define LED_RED		3 +#define LED_ORANGE	4 + +long int fixed_sdram(void); + +#endif /* __P3P440_H__ */ diff --git a/board/prodrive/p3p440/u-boot.lds b/board/prodrive/p3p440/u-boot.lds new file mode 100644 index 000000000..a2184e4c9 --- /dev/null +++ b/board/prodrive/p3p440/u-boot.lds @@ -0,0 +1,156 @@ +/* + * (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 0xFFFFFFFC : +  { +    *(.resetvec) +  } = 0xffff + +  .bootpg 0xFFFFF000 : +  { +    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) +    board/prodrive/p3p440/init.o	(.text) +    cpu/ppc4xx/kgdb.o	(.text) +    cpu/ppc4xx/traps.o	(.text) +    cpu/ppc4xx/interrupts.o	(.text) +    cpu/ppc4xx/serial.o	(.text) +    cpu/ppc4xx/cpu_init.o	(.text) +    cpu/ppc4xx/speed.o	(.text) +    common/dlmalloc.o	(.text) +    lib_generic/crc32.o		(.text) +    lib_ppc/extable.o	(.text) +    lib_generic/zlib.o		(.text) + +/*    . = env_offset;*/ +/*    common/environment.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       : +  { +   *(.sbss) *(.scommon) +   *(.dynbss) +   *(.bss) +   *(COMMON) +  } +  _end = . ; +  PROVIDE (end = .); +} |