Merge branch 'master' of /home/wd/git/u-boot/master/
authorWolfgang Denk <wd@denx.de>
Wed, 22 Jul 2009 22:48:20 +0000 (00:48 +0200)
committerWolfgang Denk <wd@denx.de>
Wed, 22 Jul 2009 22:48:20 +0000 (00:48 +0200)
132 files changed:
.gitignore
Makefile
api_examples/.gitignore [deleted file]
api_examples/Makefile [deleted file]
api_examples/crt0.S [deleted file]
api_examples/demo.c [deleted file]
api_examples/glue.c [deleted file]
api_examples/glue.h [deleted file]
api_examples/libgenwrap.c [deleted file]
arm_config.mk [deleted file]
avr32_config.mk [deleted file]
blackfin_config.mk [deleted file]
board/keymile/common/common.c
board/keymile/common/common.h
board/keymile/km8xx/km8xx.c
board/keymile/kmeter1/kmeter1.c
board/keymile/mgcoge/mgcoge.c
common/cmd_bootm.c
config.mk
drivers/block/fsl_sata.c
drivers/block/fsl_sata.h
examples/.gitignore [deleted file]
examples/82559_eeprom.c [deleted file]
examples/Makefile [deleted file]
examples/README.smc91111_eeprom [deleted file]
examples/api/.gitignore [new file with mode: 0644]
examples/api/Makefile [new file with mode: 0644]
examples/api/crt0.S [new file with mode: 0644]
examples/api/demo.c [new file with mode: 0644]
examples/api/glue.c [new file with mode: 0644]
examples/api/glue.h [new file with mode: 0644]
examples/api/libgenwrap.c [new file with mode: 0644]
examples/eepro100_eeprom.c [deleted file]
examples/hello_world.c [deleted file]
examples/interrupt.c [deleted file]
examples/mem_to_mem_idma2intr.c [deleted file]
examples/mips.lds [deleted file]
examples/nios.lds [deleted file]
examples/nios2.lds [deleted file]
examples/ppc_longjmp.S [deleted file]
examples/ppc_setjmp.S [deleted file]
examples/sched.c [deleted file]
examples/smc91111_eeprom.c [deleted file]
examples/smc911x_eeprom.c [deleted file]
examples/sparc.lds [deleted file]
examples/standalone/.gitignore [new file with mode: 0644]
examples/standalone/82559_eeprom.c [new file with mode: 0644]
examples/standalone/Makefile [new file with mode: 0644]
examples/standalone/README.smc91111_eeprom [new file with mode: 0644]
examples/standalone/eepro100_eeprom.c [new file with mode: 0644]
examples/standalone/hello_world.c [new file with mode: 0644]
examples/standalone/interrupt.c [new file with mode: 0644]
examples/standalone/mem_to_mem_idma2intr.c [new file with mode: 0644]
examples/standalone/mips.lds [new file with mode: 0644]
examples/standalone/nios.lds [new file with mode: 0644]
examples/standalone/nios2.lds [new file with mode: 0644]
examples/standalone/ppc_longjmp.S [new file with mode: 0644]
examples/standalone/ppc_setjmp.S [new file with mode: 0644]
examples/standalone/sched.c [new file with mode: 0644]
examples/standalone/smc91111_eeprom.c [new file with mode: 0644]
examples/standalone/smc911x_eeprom.c [new file with mode: 0644]
examples/standalone/sparc.lds [new file with mode: 0644]
examples/standalone/stubs.c [new file with mode: 0644]
examples/standalone/test_burst.c [new file with mode: 0644]
examples/standalone/test_burst.h [new file with mode: 0644]
examples/standalone/test_burst_lib.S [new file with mode: 0644]
examples/standalone/timer.c [new file with mode: 0644]
examples/standalone/x86-testapp.c [new file with mode: 0644]
examples/stubs.c [deleted file]
examples/test_burst.c [deleted file]
examples/test_burst.h [deleted file]
examples/test_burst_lib.S [deleted file]
examples/timer.c [deleted file]
examples/x86-testapp.c [deleted file]
i386_config.mk [deleted file]
include/asm-arm/unaligned.h [new file with mode: 0644]
include/common.h
include/configs/afeb9260.h
include/configs/at91cap9adk.h
include/configs/at91rm9200ek.h
include/configs/at91sam9260ek.h
include/configs/at91sam9261ek.h
include/configs/at91sam9263ek.h
include/configs/at91sam9m10g45ek.h
include/configs/at91sam9rlek.h
include/configs/keymile-common.h
include/configs/km8xx.h
include/configs/kmeter1.h
include/configs/mgcoge.h
include/configs/pm9261.h
include/configs/pm9263.h
include/configs/qemu-mips.h
include/i2c.h
include/lzma/LzmaDec.h [new file with mode: 0644]
include/lzma/LzmaDecode.h [deleted file]
include/lzma/LzmaTools.h
include/lzma/LzmaTypes.h
lib_arm/config.mk [new file with mode: 0644]
lib_avr32/config.mk [new file with mode: 0644]
lib_blackfin/config.mk [new file with mode: 0644]
lib_generic/lzma/LGPL.txt [deleted file]
lib_generic/lzma/LzmaDec.c [new file with mode: 0644]
lib_generic/lzma/LzmaDec.h [new file with mode: 0644]
lib_generic/lzma/LzmaDecode.c [deleted file]
lib_generic/lzma/LzmaDecode.h [deleted file]
lib_generic/lzma/LzmaTools.c
lib_generic/lzma/LzmaTools.h
lib_generic/lzma/LzmaTypes.h [deleted file]
lib_generic/lzma/Makefile
lib_generic/lzma/README.txt
lib_generic/lzma/Types.h [new file with mode: 0644]
lib_generic/lzma/history.txt
lib_generic/lzma/import_lzmasdk.sh
lib_generic/lzma/license.txt [new file with mode: 0644]
lib_generic/lzma/lzma.txt
lib_i386/config.mk [new file with mode: 0644]
lib_m68k/config.mk [new file with mode: 0644]
lib_microblaze/config.mk [new file with mode: 0644]
lib_mips/config.mk [new file with mode: 0644]
lib_nios/config.mk [new file with mode: 0644]
lib_nios2/config.mk [new file with mode: 0644]
lib_ppc/config.mk [new file with mode: 0644]
lib_sh/config.mk [new file with mode: 0644]
lib_sparc/config.mk [new file with mode: 0644]
m68k_config.mk [deleted file]
microblaze_config.mk [deleted file]
mips_config.mk [deleted file]
nios2_config.mk [deleted file]
nios_config.mk [deleted file]
ppc_config.mk [deleted file]
sh_config.mk [deleted file]
sparc_config.mk [deleted file]

index e13fc96322f72db3945e150e6beb2bd37ee2e7da..8ccd42a9968784b953e0027ddbbe7666e78679ca 100644 (file)
@@ -54,6 +54,7 @@ series
 cscope.*
 
 # tags files
+/tags
 /ctags
 /etags
 
index 4fe32328cbed5c4d52c2aac7164c70f5c4173d15..25a62541d1be50da422866b14f2975a2bb356bee 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -140,8 +140,8 @@ endif
 # The "tools" are needed early, so put this first
 # Don't include stuff already done in $(LIBS)
 SUBDIRS        = tools \
-         examples \
-         api_examples
+         examples/standalone \
+         examples/api
 
 .PHONY : $(SUBDIRS)
 
@@ -3592,11 +3592,16 @@ grsim_leon2_config : unconfig
 #########################################################################
 
 clean:
-       @rm -f $(obj)examples/82559_eeprom $(obj)examples/eepro100_eeprom \
-              $(obj)examples/hello_world  $(obj)examples/interrupt       \
-              $(obj)examples/mem_to_mem_idma2intr                        \
-              $(obj)examples/sched        $(obj)examples/smc91111_eeprom \
-              $(obj)examples/test_burst   $(obj)examples/timer
+       @rm -f $(obj)examples/standalone/82559_eeprom                     \
+              $(obj)examples/standalone/eepro100_eeprom                  \
+              $(obj)examples/standalone/hello_world                      \
+              $(obj)examples/standalone/interrupt                        \
+              $(obj)examples/standalone/mem_to_mem_idma2intr             \
+              $(obj)examples/standalone/sched                            \
+              $(obj)examples/standalone/smc91111_eeprom                  \
+              $(obj)examples/standalone/test_burst                       \
+              $(obj)examples/standalone/timer
+       @rm -f $(obj)examples/api/demo{,.bin}
        @rm -f $(obj)tools/bmp_logo        $(obj)tools/easylogo/easylogo  \
               $(obj)tools/env/{fw_printenv,fw_setenv}                    \
               $(obj)tools/envcrc                                         \
@@ -3613,7 +3618,7 @@ clean:
        @rm -f $(obj)include/bmp_logo.h
        @rm -f $(obj)nand_spl/{u-boot-spl,u-boot-spl.map,System.map}
        @rm -f $(obj)onenand_ipl/onenand-{ipl,ipl.bin,ipl-2k.bin,ipl-4k.bin,ipl.map}
-       @rm -f $(obj)api_examples/demo $(TIMESTAMP_FILE) $(VERSION_FILE)
+       @rm -f $(TIMESTAMP_FILE) $(VERSION_FILE)
        @find $(OBJTREE) -type f \
                \( -name 'core' -o -name '*.bak' -o -name '*~' \
                -o -name '*.o'  -o -name '*.a' -o -name '*.exe' \) -print \
diff --git a/api_examples/.gitignore b/api_examples/.gitignore
deleted file mode 100644 (file)
index d7b18dc..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-demo
-demo.bin
diff --git a/api_examples/Makefile b/api_examples/Makefile
deleted file mode 100644 (file)
index 2a30bef..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-#
-# (C) Copyright 2007 Semihalf
-#
-# 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 Foundatio; 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
-#
-
-ifeq ($(ARCH),ppc)
-LOAD_ADDR = 0x40000
-endif
-ifeq ($(ARCH),arm)
-LOAD_ADDR = 0x1000000
-endif
-
-include $(TOPDIR)/config.mk
-
-# Resulting ELF and binary exectuables will be named demo and demo.bin
-OUTPUT-$(CONFIG_API) = $(obj)demo
-OUTPUT = $(OUTPUT-y)
-
-# Source files located in the api_examples directory
-SOBJ_FILES-$(CONFIG_API) += crt0.o
-COBJ_FILES-$(CONFIG_API) += demo.o
-COBJ_FILES-$(CONFIG_API) += glue.o
-COBJ_FILES-$(CONFIG_API) += libgenwrap.o
-
-# Source files which exist outside the api_examples directory
-EXT_COBJ_FILES-$(CONFIG_API) += lib_generic/crc32.o
-EXT_COBJ_FILES-$(CONFIG_API) += lib_generic/ctype.o
-EXT_COBJ_FILES-$(CONFIG_API) += lib_generic/string.o
-EXT_COBJ_FILES-$(CONFIG_API) += lib_generic/vsprintf.o
-ifeq ($(ARCH),ppc)
-EXT_SOBJ_FILES-$(CONFIG_API) += lib_ppc/ppcstring.o
-endif
-
-# Create a list of source files so their dependencies can be auto-generated
-SRCS   += $(addprefix $(SRCTREE)/,$(EXT_COBJ_FILES-y:.o=.c))
-SRCS   += $(addprefix $(SRCTREE)/,$(EXT_SOBJ_FILES-y:.o=.S))
-SRCS   += $(addprefix $(SRCTREE)/api_examples/,$(COBJ_FILES-y:.o=.c))
-SRCS   += $(addprefix $(SRCTREE)/api_examples/,$(SOBJ_FILES-y:.o=.S))
-
-# Create a list of object files to be compiled
-OBJS   += $(addprefix $(obj),$(SOBJ_FILES-y))
-OBJS   += $(addprefix $(obj),$(COBJ_FILES-y))
-OBJS   += $(addprefix $(obj),$(notdir $(EXT_COBJ_FILES-y)))
-OBJS   += $(addprefix $(obj),$(notdir $(EXT_SOBJ_FILES-y)))
-
-gcclibdir := $(shell dirname `$(CC) -print-libgcc-file-name`)
-
-CPPFLAGS += -I..
-
-all:   $(obj).depend $(OUTPUT)
-
-#########################################################################
-
-$(OUTPUT):     $(OBJS)
-               $(LD) -Ttext $(LOAD_ADDR) -o $@ $^ -L$(gcclibdir) -lgcc
-               $(OBJCOPY) -O binary $@ $(OUTPUT).bin 2>/dev/null
-
-# Rule to build generic library C files
-$(obj)%.o: $(SRCTREE)/lib_generic/%.c
-       $(CC) -g $(CFLAGS) -c -o $@ $<
-
-# Rule to build architecture-specific library assembly files
-$(obj)%.o: $(SRCTREE)/lib_$(ARCH)/%.S
-       $(CC) -g $(CFLAGS) -c -o $@ $<
-
-#########################################################################
-
-# defines $(obj).depend target
-include $(SRCTREE)/rules.mk
-
-sinclude $(obj).depend
-
-#########################################################################
diff --git a/api_examples/crt0.S b/api_examples/crt0.S
deleted file mode 100644 (file)
index 6daf127..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * (C) Copyright 2007 Semihalf
- *
- * Written by: Rafal Jaworowski <raj@semihalf.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
- *
- */
-
-#if defined(CONFIG_PPC)
-
-       .text
-       .globl _start
-_start:
-       lis     %r11, search_hint@ha
-       addi    %r11, %r11, search_hint@l
-       stw     %r1, 0(%r11)
-       b       main
-
-
-       .globl syscall
-syscall:
-       lis     %r11, syscall_ptr@ha
-       addi    %r11, %r11, syscall_ptr@l
-       lwz     %r11, 0(%r11)
-       mtctr   %r11
-       bctr
-
-#elif defined(CONFIG_ARM)
-
-       .text
-       .globl _start
-_start:
-       ldr     ip, =search_hint
-       str     sp, [ip]
-       b       main
-
-
-       .globl syscall
-syscall:
-       ldr     ip, =syscall_ptr
-       ldr     pc, [ip]
-
-#else
-#error No support for this arch!
-#endif
-
-       .globl syscall_ptr
-syscall_ptr:
-       .align  4
-       .long   0
-
-       .globl search_hint
-search_hint:
-       .long   0
diff --git a/api_examples/demo.c b/api_examples/demo.c
deleted file mode 100644 (file)
index df9c4bd..0000000
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
- * (C) Copyright 2007-2008 Semihalf
- *
- * Written by: Rafal Jaworowski <raj@semihalf.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 <linux/types.h>
-#include <api_public.h>
-
-#include "glue.h"
-
-#define errf(fmt, args...) do { printf("ERROR @ %s(): ", __func__); printf(fmt, ##args); } while (0)
-
-#define BUF_SZ         2048
-#define WAIT_SECS      5
-
-void   test_dump_buf(void *, int);
-void   test_dump_di(int);
-void   test_dump_si(struct sys_info *);
-void   test_dump_sig(struct api_signature *);
-
-static char buf[BUF_SZ];
-
-int main(int argc, char *argv[])
-{
-       int rv = 0, h, i, j, devs_no;
-       struct api_signature *sig = NULL;
-       ulong start, now;
-       struct device_info *di;
-       lbasize_t rlen;
-
-       if (!api_search_sig(&sig))
-               return -1;
-
-       syscall_ptr = sig->syscall;
-       if (syscall_ptr == NULL)
-               return -2;
-
-       if (sig->version > API_SIG_VERSION)
-               return -3;
-
-       printf("API signature found @%x\n", (unsigned int)sig);
-       test_dump_sig(sig);
-
-       printf("\n*** Consumer API test ***\n");
-       printf("syscall ptr 0x%08x@%08x\n", (unsigned int)syscall_ptr,
-               (unsigned int)&syscall_ptr);
-
-       /* console activities */
-       ub_putc('B');
-
-       printf("*** Press any key to continue ***\n");
-       printf("got char 0x%x\n", ub_getc());
-
-       /* system info */
-       test_dump_si(ub_get_sys_info());
-
-       /* timing */
-       printf("\n*** Timing - wait a couple of secs ***\n");
-       start = ub_get_timer(0);
-       printf("\ntime: start %lu\n\n", start);
-       for (i = 0; i < WAIT_SECS; i++)
-               for (j = 0; j < 1000; j++)
-                       ub_udelay(1000);        /* wait 1 ms */
-
-       /* this is the number of milliseconds that passed from ub_get_timer(0) */
-       now = ub_get_timer(start);
-       printf("\ntime: now %lu\n\n", now);
-
-       /* enumerate devices */
-       printf("\n*** Enumerate devices ***\n");
-       devs_no = ub_dev_enum();
-
-       printf("Number of devices found: %d\n", devs_no);
-       if (devs_no == 0)
-               return -1;
-
-       printf("\n*** Show devices ***\n");
-       for (i = 0; i < devs_no; i++) {
-               test_dump_di(i);
-               printf("\n");
-       }
-
-       printf("\n*** Operations on devices ***\n");
-
-       /* test opening a device already opened */
-       h = 0;
-       if ((rv = ub_dev_open(h)) != 0) {
-               errf("open device %d error %d\n", h, rv);
-               return -1;
-       }
-       if ((rv = ub_dev_open(h)) != 0)
-               errf("open device %d error %d\n", h, rv);
-
-       ub_dev_close(h);
-
-       /* test storage */
-       printf("Trying storage devices...\n");
-       for (i = 0; i < devs_no; i++) {
-               di = ub_dev_get(i);
-
-               if (di->type & DEV_TYP_STOR)
-                       break;
-
-       }
-       if (i == devs_no)
-               printf("No storage devices available\n");
-       else {
-               memset(buf, 0, BUF_SZ);
-
-               if ((rv = ub_dev_open(i)) != 0)
-                       errf("open device %d error %d\n", i, rv);
-
-               else if ((rv = ub_dev_read(i, buf, 1, 0, &rlen)) != 0)
-                       errf("could not read from device %d, error %d\n", i, rv);
-               else {
-                       printf("Sector 0 dump (512B):\n");
-                       test_dump_buf(buf, 512);
-               }
-
-               ub_dev_close(i);
-       }
-
-       /* test networking */
-       printf("Trying network devices...\n");
-       for (i = 0; i < devs_no; i++) {
-               di = ub_dev_get(i);
-
-               if (di->type == DEV_TYP_NET)
-                       break;
-
-       }
-       if (i == devs_no)
-               printf("No network devices available\n");
-       else {
-               if ((rv = ub_dev_open(i)) != 0)
-                       errf("open device %d error %d\n", i, rv);
-               else if ((rv = ub_dev_send(i, &buf, 2048)) != 0)
-                       errf("could not send to device %d, error %d\n", i, rv);
-
-               ub_dev_close(i);
-       }
-
-       if (ub_dev_close(h) != 0)
-               errf("could not close device %d\n", h);
-
-       printf("\n*** Env vars ***\n");
-
-       printf("ethact = %s\n", ub_env_get("ethact"));
-       printf("old fileaddr = %s\n", ub_env_get("fileaddr"));
-       ub_env_set("fileaddr", "deadbeef");
-       printf("new fileaddr = %s\n", ub_env_get("fileaddr"));
-
-       const char *env = NULL;
-
-       while ((env = ub_env_enum(env)) != NULL)
-               printf("%s = %s\n", env, ub_env_get(env));
-
-       /* reset */
-       printf("\n*** Resetting board ***\n");
-       ub_reset();
-       printf("\nHmm, reset returned...?!\n");
-
-       return rv;
-}
-
-void test_dump_sig(struct api_signature *sig)
-{
-       printf("signature:\n");
-       printf("  version\t= %d\n", sig->version);
-       printf("  checksum\t= 0x%08x\n", sig->checksum);
-       printf("  sc entry\t= 0x%08x\n", (unsigned int)sig->syscall);
-}
-
-void test_dump_si(struct sys_info *si)
-{
-       int i;
-
-       printf("sys info:\n");
-       printf("  clkbus\t= 0x%08x\n", (unsigned int)si->clk_bus);
-       printf("  clkcpu\t= 0x%08x\n", (unsigned int)si->clk_cpu);
-       printf("  bar\t\t= 0x%08x\n", (unsigned int)si->bar);
-
-       printf("---\n");
-       for (i = 0; i < si->mr_no; i++) {
-               if (si->mr[i].flags == 0)
-                       break;
-
-               printf("  start\t= 0x%08lx\n", si->mr[i].start);
-               printf("  size\t= 0x%08lx\n", si->mr[i].size);
-
-               switch(si->mr[i].flags & 0x000F) {
-                       case MR_ATTR_FLASH:
-                               printf("  type FLASH\n");
-                               break;
-                       case MR_ATTR_DRAM:
-                               printf("  type DRAM\n");
-                               break;
-                       case MR_ATTR_SRAM:
-                               printf("  type SRAM\n");
-                               break;
-                       default:
-                               printf("  type UNKNOWN\n");
-               }
-               printf("---\n");
-       }
-}
-
-static char *test_stor_typ(int type)
-{
-       if (type & DT_STOR_IDE)
-               return "IDE";
-
-       if (type & DT_STOR_MMC)
-               return "MMC";
-
-       if (type & DT_STOR_SATA)
-               return "SATA";
-
-       if (type & DT_STOR_SCSI)
-               return "SCSI";
-
-       if (type & DT_STOR_USB)
-               return "USB";
-
-       return "Unknown";
-}
-
-void test_dump_buf(void *buf, int len)
-{
-       int i;
-       int line_counter = 0;
-       int sep_flag = 0;
-       int addr = 0;
-
-       printf("%07x:\t", addr);
-
-       for (i = 0; i < len; i++) {
-               if (line_counter++ > 15) {
-                       line_counter = 0;
-                       sep_flag = 0;
-                       addr += 16;
-                       i--;
-                       printf("\n%07x:\t", addr);
-                       continue;
-               }
-
-               if (sep_flag++ > 1) {
-                       sep_flag = 1;
-                       printf(" ");
-               }
-
-               printf("%02x", *((char *)buf++));
-       }
-
-       printf("\n");
-}
-
-void test_dump_di(int handle)
-{
-       int i;
-       struct device_info *di = ub_dev_get(handle);
-
-       printf("device info (%d):\n", handle);
-       printf("  cookie\t= 0x%08x\n", (uint32_t)di->cookie);
-       printf("  type\t\t= 0x%08x\n", di->type);
-
-       if (di->type == DEV_TYP_NET) {
-               printf("  hwaddr\t= ");
-               for (i = 0; i < 6; i++)
-                       printf("%02x ", di->di_net.hwaddr[i]);
-
-               printf("\n");
-
-       } else if (di->type & DEV_TYP_STOR) {
-               printf("  type\t\t= %s\n", test_stor_typ(di->type));
-               printf("  blk size\t\t= %d\n", (unsigned int)di->di_stor.block_size);
-               printf("  blk count\t\t= %d\n", (unsigned int)di->di_stor.block_count);
-       }
-}
diff --git a/api_examples/glue.c b/api_examples/glue.c
deleted file mode 100644 (file)
index eff6a7e..0000000
+++ /dev/null
@@ -1,404 +0,0 @@
-/*
- * (C) Copyright 2007-2008 Semihalf, Rafal Jaworowski <raj@semihalf.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 <linux/types.h>
-#include <api_public.h>
-
-#include "glue.h"
-
-static int valid_sig(struct api_signature *sig)
-{
-       uint32_t checksum;
-       struct api_signature s;
-
-       if (sig == NULL)
-               return 0;
-       /*
-        * Clear the checksum field (in the local copy) so as to calculate the
-        * CRC with the same initial contents as at the time when the sig was
-        * produced
-        */
-       s = *sig;
-       s.checksum = 0;
-
-       checksum = crc32(0, (unsigned char *)&s, sizeof(struct api_signature));
-
-       if (checksum != sig->checksum)
-               return 0;
-
-       return 1;
-}
-
-/*
- * Searches for the U-Boot API signature
- *
- * returns 1/0 depending on found/not found result
- */
-int api_search_sig(struct api_signature **sig)
-{
-       unsigned char *sp;
-       uint32_t search_start = 0;
-       uint32_t search_end = 0;
-
-       if (sig == NULL)
-               return 0;
-
-       if (search_hint == 0)
-               search_hint = 255 * 1024 * 1024;
-
-       search_start = search_hint & ~0x000fffff;
-       search_end = search_start + API_SEARCH_LEN - API_SIG_MAGLEN;
-
-       sp = (unsigned char *)search_start;
-       while ((sp + API_SIG_MAGLEN) < (unsigned char *)search_end) {
-               if (!memcmp(sp, API_SIG_MAGIC, API_SIG_MAGLEN)) {
-                       *sig = (struct api_signature *)sp;
-                       if (valid_sig(*sig))
-                               return 1;
-               }
-               sp += API_SIG_MAGLEN;
-       }
-
-       *sig = NULL;
-       return 0;
-}
-
-/****************************************
- *
- * console
- *
- ****************************************/
-
-int ub_getc(void)
-{
-       int c;
-
-       if (!syscall(API_GETC, NULL, (uint32_t)&c))
-               return -1;
-
-       return c;
-}
-
-int ub_tstc(void)
-{
-       int t;
-
-       if (!syscall(API_TSTC, NULL, (uint32_t)&t))
-               return -1;
-
-       return t;
-}
-
-void ub_putc(char c)
-{
-       syscall(API_PUTC, NULL, (uint32_t)&c);
-}
-
-void ub_puts(const char *s)
-{
-       syscall(API_PUTS, NULL, (uint32_t)s);
-}
-
-/****************************************
- *
- * system
- *
- ****************************************/
-
-void ub_reset(void)
-{
-       syscall(API_RESET, NULL);
-}
-
-static struct mem_region mr[UB_MAX_MR];
-static struct sys_info si;
-
-struct sys_info * ub_get_sys_info(void)
-{
-       int err = 0;
-
-       memset(&si, 0, sizeof(struct sys_info));
-       si.mr = mr;
-       si.mr_no = UB_MAX_MR;
-       memset(&mr, 0, sizeof(mr));
-
-       if (!syscall(API_GET_SYS_INFO, &err, (u_int32_t)&si))
-               return NULL;
-
-       return ((err) ? NULL : &si);
-}
-
-/****************************************
- *
- * timing
- *
- ****************************************/
-
-void ub_udelay(unsigned long usec)
-{
-       syscall(API_UDELAY, NULL, &usec);
-}
-
-unsigned long ub_get_timer(unsigned long base)
-{
-       unsigned long cur;
-
-       if (!syscall(API_GET_TIMER, NULL, &cur, &base))
-               return 0;
-
-       return cur;
-}
-
-
-/****************************************************************************
- *
- * devices
- *
- * Devices are identified by handles: numbers 0, 1, 2, ..., UB_MAX_DEV-1
- *
- ***************************************************************************/
-
-static struct device_info devices[UB_MAX_DEV];
-
-struct device_info * ub_dev_get(int i)
-{
-       return ((i < 0 || i >= UB_MAX_DEV) ? NULL : &devices[i]);
-}
-
-/*
- * Enumerates the devices: fills out device_info elements in the devices[]
- * array.
- *
- * returns:            number of devices found
- */
-int ub_dev_enum(void)
-{
-       struct device_info *di;
-       int n = 0;
-
-       memset(&devices, 0, sizeof(struct device_info) * UB_MAX_DEV);
-       di = &devices[0];
-
-       if (!syscall(API_DEV_ENUM, NULL, di))
-               return 0;
-
-       while (di->cookie != NULL) {
-
-               if (++n >= UB_MAX_DEV)
-                       break;
-
-               /* take another device_info */
-               di++;
-
-               /* pass on the previous cookie */
-               di->cookie = devices[n - 1].cookie;
-
-               if (!syscall(API_DEV_ENUM, NULL, di))
-                       return 0;
-       }
-
-       return n;
-}
-
-/*
- * handle:     0-based id of the device
- *
- * returns:    0 when OK, err otherwise
- */
-int ub_dev_open(int handle)
-{
-       struct device_info *di;
-       int err = 0;
-
-       if (handle < 0 || handle >= UB_MAX_DEV)
-               return API_EINVAL;
-
-       di = &devices[handle];
-
-       if (!syscall(API_DEV_OPEN, &err, di))
-               return -1;
-
-       return err;
-}
-
-int ub_dev_close(int handle)
-{
-       struct device_info *di;
-
-       if (handle < 0 || handle >= UB_MAX_DEV)
-               return API_EINVAL;
-
-       di = &devices[handle];
-       if (!syscall(API_DEV_CLOSE, NULL, di))
-               return -1;
-
-       return 0;
-}
-
-/*
- *
- * Validates device for read/write, it has to:
- *
- * - have sane handle
- * - be opened
- *
- * returns:    0/1 accordingly
- */
-static int dev_valid(int handle)
-{
-       if (handle < 0 || handle >= UB_MAX_DEV)
-               return 0;
-
-       if (devices[handle].state != DEV_STA_OPEN)
-               return 0;
-
-       return 1;
-}
-
-static int dev_stor_valid(int handle)
-{
-       if (!dev_valid(handle))
-               return 0;
-
-       if (!(devices[handle].type & DEV_TYP_STOR))
-               return 0;
-
-       return 1;
-}
-
-int ub_dev_read(int handle, void *buf, lbasize_t len, lbastart_t start,
-               lbasize_t *rlen)
-{
-       struct device_info *di;
-       lbasize_t act_len;
-       int err = 0;
-
-       if (!dev_stor_valid(handle))
-               return API_ENODEV;
-
-       di = &devices[handle];
-       if (!syscall(API_DEV_READ, &err, di, buf, &len, &start, &act_len))
-               return API_ESYSC;
-
-       if (!err && rlen)
-               *rlen = act_len;
-
-       return err;
-}
-
-static int dev_net_valid(int handle)
-{
-       if (!dev_valid(handle))
-               return 0;
-
-       if (devices[handle].type != DEV_TYP_NET)
-               return 0;
-
-       return 1;
-}
-
-int ub_dev_recv(int handle, void *buf, int len, int *rlen)
-{
-       struct device_info *di;
-       int err = 0, act_len;
-
-       if (!dev_net_valid(handle))
-               return API_ENODEV;
-
-       di = &devices[handle];
-       if (!syscall(API_DEV_READ, &err, di, buf, &len, &act_len))
-               return API_ESYSC;
-
-       if (!err && rlen)
-               *rlen = act_len;
-
-        return (err);
-}
-
-int ub_dev_send(int handle, void *buf, int len)
-{
-       struct device_info *di;
-       int err = 0;
-
-       if (!dev_net_valid(handle))
-               return API_ENODEV;
-
-       di = &devices[handle];
-       if (!syscall(API_DEV_WRITE, &err, di, buf, &len))
-               return API_ESYSC;
-
-       return err;
-}
-
-/****************************************
- *
- * env vars
- *
- ****************************************/
-
-char * ub_env_get(const char *name)
-{
-       char *value;
-
-       if (!syscall(API_ENV_GET, NULL, (uint32_t)name, (uint32_t)&value))
-               return NULL;
-
-       return value;
-}
-
-void ub_env_set(const char *name, char *value)
-{
-       syscall(API_ENV_SET, NULL, (uint32_t)name, (uint32_t)value);
-}
-
-static char env_name[256];
-
-const char * ub_env_enum(const char *last)
-{
-       const char *env, *str;
-       int i;
-
-       env = NULL;
-
-       /*
-        * It's OK to pass only the name piece as last (and not the whole
-        * 'name=val' string), since the API_ENUM_ENV call uses envmatch()
-        * internally, which handles such case
-        */
-       if (!syscall(API_ENV_ENUM, NULL, (uint32_t)last, (uint32_t)&env))
-               return NULL;
-
-       if (!env)
-               /* no more env. variables to enumerate */
-               return NULL;
-
-       /* next enumerated env var */
-       memset(env_name, 0, 256);
-       for (i = 0, str = env; *str != '=' && *str != '\0';)
-               env_name[i++] = *str++;
-
-       env_name[i] = '\0';
-
-       return env_name;
-}
diff --git a/api_examples/glue.h b/api_examples/glue.h
deleted file mode 100644 (file)
index 6bf47d0..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * (C) Copyright 2007 Semihalf
- *
- * Written by: Rafal Jaworowski <raj@semihalf.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
- *
- */
-
-/*
- * This is the header file for conveniency wrapper routines (API glue)
- */
-
-#ifndef _API_GLUE_H_
-#define _API_GLUE_H_
-
-#define API_SEARCH_LEN         (3 * 1024 * 1024)       /* 3MB search range */
-
-#define UB_MAX_MR      5       /* max mem regions number */
-#define UB_MAX_DEV     6       /* max devices number */
-
-extern void *syscall_ptr;
-extern uint32_t search_hint;
-
-int    syscall(int, int *, ...);
-int    api_search_sig(struct api_signature **sig);
-
-/*
- * The ub_ library calls are part of the application, not U-Boot code!  They
- * are front-end wrappers that are used by the consumer application: they
- * prepare arguments for particular syscall and jump to the low level
- * syscall()
- */
-
-/* console */
-int    ub_getc(void);
-int    ub_tstc(void);
-void   ub_putc(char c);
-void   ub_puts(const char *s);
-
-/* system */
-void                   ub_reset(void);
-struct sys_info *      ub_get_sys_info(void);
-
-/* time */
-void           ub_udelay(unsigned long);
-unsigned long  ub_get_timer(unsigned long);
-
-/* env vars */
-char *         ub_env_get(const char *name);
-void           ub_env_set(const char *name, char *value);
-const char *   ub_env_enum(const char *last);
-
-/* devices */
-int                    ub_dev_enum(void);
-int                    ub_dev_open(int handle);
-int                    ub_dev_close(int handle);
-int                    ub_dev_read(int handle, void *buf, lbasize_t len,
-                               lbastart_t start, lbasize_t *rlen);
-int                    ub_dev_send(int handle, void *buf, int len);
-int                    ub_dev_recv(int handle, void *buf, int len, int *rlen);
-struct device_info *   ub_dev_get(int);
-
-#endif /* _API_GLUE_H_ */
diff --git a/api_examples/libgenwrap.c b/api_examples/libgenwrap.c
deleted file mode 100644 (file)
index 2b62bad..0000000
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * (C) Copyright 2007 Semihalf
- *
- * Written by: Rafal Jaworowski <raj@semihalf.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
- *
- *
- * This is is a set of wrappers/stubs that allow to use certain routines from
- * U-Boot's lib_generic in the standalone app. This way way we can re-use
- * existing code e.g. operations on strings and similar.
- *
- */
-
-#include <common.h>
-#include <linux/types.h>
-#include <api_public.h>
-
-#include "glue.h"
-
-/*
- * printf() and vprintf() are stolen from u-boot/common/console.c
- */
-void printf (const char *fmt, ...)
-{
-       va_list args;
-       uint i;
-       char printbuffer[256];
-
-       va_start (args, fmt);
-
-       /* For this to work, printbuffer must be larger than
-        * anything we ever want to print.
-        */
-       i = vsprintf (printbuffer, fmt, args);
-       va_end (args);
-
-       /* Print the string */
-       ub_puts (printbuffer);
-}
-
-void vprintf (const char *fmt, va_list args)
-{
-       uint i;
-       char printbuffer[256];
-
-       /* For this to work, printbuffer must be larger than
-        * anything we ever want to print.
-        */
-       i = vsprintf (printbuffer, fmt, args);
-
-       /* Print the string */
-       ub_puts (printbuffer);
-}
-
-void putc (const char c)
-{
-       ub_putc(c);
-}
-
-void udelay(unsigned long usec)
-{
-       ub_udelay(usec);
-}
-
-void do_reset (void)
-{
-       ub_reset();
-}
-
-void *malloc (size_t len)
-{
-       return NULL;
-}
-
-void hang (void)
-{
-       while (1) ;
-}
diff --git a/arm_config.mk b/arm_config.mk
deleted file mode 100644 (file)
index a13603e..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-#
-# (C) Copyright 2000-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
-#
-
-CROSS_COMPILE ?= arm-linux-
-
-PLATFORM_CPPFLAGS += -DCONFIG_ARM -D__ARM__
-
-LDSCRIPT := $(SRCTREE)/cpu/$(CPU)/u-boot.lds
diff --git a/avr32_config.mk b/avr32_config.mk
deleted file mode 100644 (file)
index c258b4b..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-#
-# (C) Copyright 2000-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
-#
-
-CROSS_COMPILE ?= avr32-linux-
-
-PLATFORM_RELFLAGS      += -ffixed-r5 -fPIC -mno-init-got -mrelax
-PLATFORM_LDFLAGS       += --relax
diff --git a/blackfin_config.mk b/blackfin_config.mk
deleted file mode 100644 (file)
index 0dd2ac6..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-#
-# (C) Copyright 2000-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
-#
-
-CROSS_COMPILE ?= bfin-uclinux-
-
-CONFIG_BFIN_CPU := $(strip $(subst ",,$(CONFIG_BFIN_CPU)))
-CONFIG_BFIN_BOOT_MODE := $(strip $(subst ",,$(CONFIG_BFIN_BOOT_MODE)))
-CONFIG_ENV_OFFSET := $(strip $(subst ",,$(CONFIG_ENV_OFFSET)))
-CONFIG_ENV_SIZE := $(strip $(subst ",,$(CONFIG_ENV_SIZE)))
-
-PLATFORM_RELFLAGS += -ffixed-P5 -fomit-frame-pointer -mno-fdpic
-PLATFORM_CPPFLAGS += -DCONFIG_BLACKFIN
-
-LDFLAGS += --gc-sections
-PLATFORM_RELFLAGS += -ffunction-sections -fdata-sections
-
-ifneq (,$(CONFIG_BFIN_CPU))
-PLATFORM_RELFLAGS += -mcpu=$(CONFIG_BFIN_CPU)
-endif
-
-ifneq ($(CONFIG_BFIN_BOOT_MODE),BFIN_BOOT_BYPASS)
-ALL += $(obj)u-boot.ldr
-endif
-
-SYM_PREFIX = _
-
-LDR_FLAGS-y :=
-LDR_FLAGS-$(CONFIG_BFIN_BOOTROM_USES_EVT1) += -J
-
-LDR_FLAGS += --bmode $(subst BFIN_BOOT_,,$(CONFIG_BFIN_BOOT_MODE))
-LDR_FLAGS += --use-vmas
-LDR_FLAGS += --initcode $(obj)cpu/$(CPU)/initcode.o
-ifneq ($(CONFIG_BFIN_BOOT_MODE),BFIN_BOOT_UART)
-ifneq ($(ENV_IS_EMBEDDED_CUSTOM),ENV_IS_EMBEDDED_CUSTOM)
-LDR_FLAGS += --punchit $$(($(CONFIG_ENV_OFFSET))):$$(($(CONFIG_ENV_SIZE))):$(obj)env-ldr.o
-endif
-endif
-ifneq (,$(findstring s,$(MAKEFLAGS)))
-LDR_FLAGS += --quiet
-endif
-
-LDR_FLAGS += $(LDR_FLAGS-y)
-
-ifeq ($(wildcard $(TOPDIR)/board/$(BOARD)/u-boot.lds*),)
-LDSCRIPT = $(obj)lib_$(ARCH)/u-boot.lds
-endif
index b2bd7fd8433450b7d983c84f360632cca04ad77d..259462360ce6ba4d41970c8ca5fecc792888fc95 100644 (file)
@@ -203,8 +203,9 @@ static int ivm_check_crc (unsigned char *buf, int block)
        crceeprom = (buf[CONFIG_SYS_IVM_EEPROM_PAGE_LEN - 1] + \
                        buf[CONFIG_SYS_IVM_EEPROM_PAGE_LEN - 2] * 256);
        if (crc != crceeprom) {
-               printf ("Error CRC Block: %d EEprom: calculated: %lx EEprom: %lx\n",
-                       block, crc, crceeprom);
+               if (block == 0)
+                       printf ("Error CRC Block: %d EEprom: calculated: \
+                       %lx EEprom: %lx\n", block, crc, crceeprom);
                return -1;
        }
        return 0;
@@ -287,7 +288,7 @@ int ivm_analyze_eeprom (unsigned char *buf, int len)
        GET_STRING("IVM_CustomerProductID", IVM_POS_CUSTOMER_PROD_ID, 32)
 
        if (ivm_check_crc (&buf[CONFIG_SYS_IVM_EEPROM_PAGE_LEN * 2], 2) != 0)
-               return -2;
+               return 0;
        ivm_analyze_block2 (&buf[CONFIG_SYS_IVM_EEPROM_PAGE_LEN * 2], CONFIG_SYS_IVM_EEPROM_PAGE_LEN);
 
        return 0;
@@ -527,6 +528,34 @@ int fdt_set_node_and_value (void *blob,
        }
        return ret;
 }
+int fdt_get_node_and_value (void *blob,
+                               char *nodename,
+                               char *propname,
+                               void **var)
+{
+       int len;
+       int nodeoffset = 0;
+
+       nodeoffset = fdt_path_offset (blob, nodename);
+       if (nodeoffset >= 0) {
+               *var = (void *)fdt_getprop (blob, nodeoffset, propname, &len);
+               if (len == 0) {
+                       /* no value */
+                       printf ("%s no value\n", __FUNCTION__);
+                       return -1;
+               } else if (len > 0) {
+                       return len;
+               } else {
+                       printf ("libfdt fdt_getprop(): %s\n",
+                               fdt_strerror(len));
+                       return -2;
+               }
+       } else {
+               printf("%s: cannot find %s node err:%s\n", __FUNCTION__,
+                       nodename, fdt_strerror (nodeoffset));
+               return -3;
+       }
+}
 #endif
 
 int ethernet_present (void)
index d3d681424f51b5a59c0337b3e2c20f94dd19b5b8..a38c72772ce75f4659c50378c8d16c4098ec2b6c 100644 (file)
@@ -17,4 +17,14 @@ int ivm_read_eeprom (void);
 #ifdef CONFIG_KEYMILE_HDLC_ENET
 int keymile_hdlc_enet_initialize (bd_t *bis);
 #endif
+
+int fdt_set_node_and_value (void *blob,
+                       char *nodename,
+                       char *regname,
+                       void *var,
+                       int size);
+int fdt_get_node_and_value (void *blob,
+                               char *nodename,
+                               char *propname,
+                               void **var);
 #endif /* __KEYMILE_COMMON_H */
index 7c5817977784564f080e75b84c757cfb840a262d..ec883a40447f9b55e2c25fce6c495ee087401ab0 100644 (file)
@@ -159,12 +159,6 @@ int hush_init_var (void)
 }
 
 #if defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT)
-extern int fdt_set_node_and_value (void *blob,
-                               char *nodename,
-                               char *regname,
-                               void *var,
-                               int size);
-
 /*
  * update "memory" property in the blob
  */
@@ -172,33 +166,53 @@ void ft_blob_update (void *blob, bd_t *bd)
 {
        ulong brg_data[1] = {0};
        ulong memory_data[2] = {0};
-       ulong flash_data[4] = {0};
+       ulong *flash_data = NULL;
        ulong flash_reg[3] = {0};
-       uchar enetaddr[6];
+       flash_info_t    *info;
+       int     len;
+       int     i = 0;
 
        memory_data[0] = cpu_to_be32 (bd->bi_memstart);
        memory_data[1] = cpu_to_be32 (bd->bi_memsize);
        fdt_set_node_and_value (blob, "/memory", "reg", memory_data,
                                sizeof (memory_data));
 
-       flash_data[2] = cpu_to_be32 (bd->bi_flashstart);
-       flash_data[3] = cpu_to_be32 (bd->bi_flashsize);
+       len = fdt_get_node_and_value (blob, "/localbus", "ranges",
+                                       (void *)&flash_data);
+
+       if (flash_data == NULL) {
+               printf ("%s: error /localbus/ranges entry\n", __FUNCTION__);
+               return;
+       }
+
+       /* update Flash addr, size */
+       while ( i < (len / 4)) {
+               switch (flash_data[i]) {
+               case 0:
+                       info = flash_get_info(CONFIG_SYS_FLASH_BASE);
+                       flash_data[i + 1] = 0;
+                       flash_data[i + 2] = cpu_to_be32 (CONFIG_SYS_FLASH_BASE);
+                       flash_data[i + 3] = cpu_to_be32 (info->size);
+                       break;
+               default:
+                       break;
+               }
+               i += 4;
+       }
        fdt_set_node_and_value (blob, "/localbus", "ranges", flash_data,
-                               sizeof (flash_data));
+                               len);
 
        flash_reg[2] = cpu_to_be32 (bd->bi_flashsize);
        fdt_set_node_and_value (blob, "/localbus/flash@0,0", "reg", flash_reg,
                                sizeof (flash_reg));
-
        /* BRG */
        brg_data[0] = cpu_to_be32 (bd->bi_busfreq);
        fdt_set_node_and_value (blob, "/soc/cpm", "brg-frequency", brg_data,
                                sizeof (brg_data));
 
        /* MAC adr */
-       eth_getenv_enetaddr("ethaddr", enetaddr);
        fdt_set_node_and_value (blob, "/soc/cpm/ethernet", "mac-address",
-                               enetaddr, sizeof (u8) * 6);
+                               bd->bi_enetaddr, sizeof (u8) * 6);
 }
 
 void ft_board_setup(void *blob, bd_t *bd)
index 3d1b94154898872d00f36dd8b094b02348d31118..8cac2c4662915ae587e8c47cbf9658231803f067 100644 (file)
@@ -187,9 +187,60 @@ int checkboard (void)
 }
 
 #if defined(CONFIG_OF_BOARD_SETUP)
+/*
+ * update "/localbus/ranges" property in the blob
+ */
+void ft_blob_update (void *blob, bd_t *bd)
+{
+       ulong   *flash_data = NULL;
+       flash_info_t    *info;
+       ulong   flash_reg[6] = {0};
+       int     len;
+       int     size = 0;
+       int     i = 0;
+
+       len = fdt_get_node_and_value (blob, "/localbus", "ranges",
+                                       (void *)&flash_data);
+
+       if (flash_data == NULL) {
+               printf ("%s: error /localbus/ranges entry\n", __FUNCTION__);
+               return;
+       }
+
+       /* update Flash addr, size */
+       while ( i < (len / 4)) {
+               switch (flash_data[i]) {
+               case 0:
+                       info = flash_get_info(CONFIG_SYS_FLASH_BASE);
+                       size = info->size;
+                       info = flash_get_info(CONFIG_SYS_FLASH_BASE_1);
+                       size += info->size;
+                       flash_data[i + 1] = 0;
+                       flash_data[i + 2] = cpu_to_be32 (CONFIG_SYS_FLASH_BASE);
+                       flash_data[i + 3] = cpu_to_be32 (size);
+                       break;
+               default:
+                       break;
+               }
+               i += 4;
+       }
+       fdt_set_node_and_value (blob, "/localbus", "ranges", flash_data,
+                               len);
+
+       info = flash_get_info(CONFIG_SYS_FLASH_BASE);
+       flash_reg[2] = cpu_to_be32 (size);
+       flash_reg[4] = flash_reg[2];
+       info = flash_get_info(CONFIG_SYS_FLASH_BASE_1);
+       flash_reg[5] = cpu_to_be32 (info->size);
+       fdt_set_node_and_value (blob, "/localbus/flash@f0000000,0", "reg", flash_reg,
+                               sizeof (flash_reg));
+}
+
+
 void ft_board_setup (void *blob, bd_t *bd)
 {
        ft_cpu_setup (blob, bd);
+       ft_blob_update (blob, bd);
 }
 #endif
 
index 67722e708d7f413ba1cc082ee719825809e5d4a0..d24a4b57698ca1d20a2611d2c727459f6899f365 100644 (file)
@@ -312,42 +312,71 @@ int hush_init_var (void)
 }
 
 #if defined(CONFIG_OF_BOARD_SETUP) && defined(CONFIG_OF_LIBFDT)
-extern int fdt_set_node_and_value (void *blob,
-                               char *nodename,
-                               char *regname,
-                               void *var,
-                               int size);
-
 /*
  * update "memory" property in the blob
  */
 void ft_blob_update (void *blob, bd_t *bd)
 {
        ulong memory_data[2] = {0};
-       ulong flash_data[8] = {0};
+       ulong *flash_data = NULL;
+       ulong   flash_reg[6] = {0};
        flash_info_t    *info;
-       uchar enetaddr[6];
+       int     len;
+       int     size;
+       int     i = 0;
 
        memory_data[0] = cpu_to_be32 (bd->bi_memstart);
        memory_data[1] = cpu_to_be32 (bd->bi_memsize);
        fdt_set_node_and_value (blob, "/memory", "reg", memory_data,
                                sizeof (memory_data));
 
+       len = fdt_get_node_and_value (blob, "/localbus", "ranges",
+                                       (void *)&flash_data);
+
+       if (flash_data == NULL) {
+               printf ("%s: error /localbus/ranges entry\n", __FUNCTION__);
+               return;
+       }
+
        /* update Flash addr, size */
-       info = flash_get_info(CONFIG_SYS_FLASH_BASE);
-       flash_data[2] = cpu_to_be32 (CONFIG_SYS_FLASH_BASE);
-       flash_data[3] = cpu_to_be32 (info->size);
-       flash_data[4] = cpu_to_be32 (5);
-       flash_data[5] = cpu_to_be32 (0);
-       info = flash_get_info(CONFIG_SYS_FLASH_BASE_1);
-       flash_data[6] = cpu_to_be32 (CONFIG_SYS_FLASH_BASE_1);
-       flash_data[7] = cpu_to_be32 (info->size);
+       while ( i < (len / 4)) {
+               switch (flash_data[i]) {
+               case 0:
+                       info = flash_get_info(CONFIG_SYS_FLASH_BASE);
+                       flash_data[i + 1] = 0;
+                       flash_data[i + 2] = cpu_to_be32 (CONFIG_SYS_FLASH_BASE);
+                       flash_data[i + 3] = cpu_to_be32 (info->size);
+                       break;
+               case 5:
+                       info = flash_get_info(CONFIG_SYS_FLASH_BASE_1);
+                       size = info->size;
+                       info = flash_get_info(CONFIG_SYS_FLASH_BASE_2);
+                       size += info->size;
+                       flash_data[i + 1] = 0;
+                       flash_data[i + 2] = cpu_to_be32 (CONFIG_SYS_FLASH_BASE_1);
+                       flash_data[i + 3] = cpu_to_be32 (size);
+                       break;
+               default:
+                       break;
+               }
+               i += 4;
+       }
        fdt_set_node_and_value (blob, "/localbus", "ranges", flash_data,
-                               sizeof (flash_data));
+                               len);
+
+       info = flash_get_info(CONFIG_SYS_FLASH_BASE_1);
+       flash_reg[0] = cpu_to_be32 (5);
+       flash_reg[2] = cpu_to_be32 (info->size);
+       flash_reg[3] = flash_reg[0];
+       flash_reg[4] = flash_reg[2];
+       info = flash_get_info(CONFIG_SYS_FLASH_BASE_2);
+       flash_reg[5] = cpu_to_be32 (info->size);
+       fdt_set_node_and_value (blob, "/localbus/flash@5,0", "reg", flash_reg,
+                               sizeof (flash_reg));
+
        /* MAC addr */
-       eth_getenv_enetaddr("ethaddr", enetaddr);
        fdt_set_node_and_value (blob, "/soc/cpm/ethernet", "mac-address",
-                               enetaddr, sizeof (u8) * 6);
+                               bd->bi_enetaddr, sizeof (u8) * 6);
 }
 
 void ft_board_setup (void *blob, bd_t *bd)
index 367d5a7a94cc3c6bbfec8e61ba9e5a3f4629dfdc..5d5dd338e30a68a71e05a64323dd7336efd76db7 100644 (file)
@@ -52,9 +52,8 @@
 #endif
 
 #ifdef CONFIG_LZMA
-#define _7ZIP_BYTE_DEFINED /* Byte already defined by zlib */
 #include <lzma/LzmaTypes.h>
-#include <lzma/LzmaDecode.h>
+#include <lzma/LzmaDec.h>
 #include <lzma/LzmaTools.h>
 #endif /* CONFIG_LZMA */
 
@@ -390,7 +389,7 @@ static int bootm_load_os(image_info_t os, ulong *load_end, int boot_progress)
                int ret = lzmaBuffToBuffDecompress(
                        (unsigned char *)load, &unc_len,
                        (unsigned char *)image_start, image_len);
-               if (ret != LZMA_RESULT_OK) {
+               if (ret != SZ_OK) {
                        printf ("LZMA: uncompress or overwrite error %d "
                                "- must RESET board to recover\n", ret);
                        show_boot_progress (-6);
index a9973a493ca1e9358811710ea73519d84fe353b2..fd56621fefe1602a21562291276152c47f8246c2 100644 (file)
--- a/config.mk
+++ b/config.mk
@@ -83,7 +83,7 @@ RANLIB        = $(CROSS_COMPILE)RANLIB
 sinclude $(OBJTREE)/include/autoconf.mk
 
 ifdef  ARCH
-sinclude $(TOPDIR)/$(ARCH)_config.mk   # include architecture dependend rules
+sinclude $(TOPDIR)/lib_$(ARCH)/config.mk       # include architecture dependend rules
 endif
 ifdef  CPU
 sinclude $(TOPDIR)/cpu/$(CPU)/config.mk        # include  CPU  specific rules
index 2009d1ecdac095cdb2aa7b497833ac21d1909a9c..abcda6fb5fd6852a3bf775383df95666f3cf562b 100644 (file)
@@ -81,7 +81,7 @@ void dprint_buffer(unsigned char *buf, int len)
        printf("\n\r");
 }
 
-static void fsl_sata_dump_sfis(struct sfis *s)
+static void fsl_sata_dump_sfis(struct sata_fis_d2h *s)
 {
        printf("Status FIS dump:\n\r");
        printf("fis_type:               %02x\n\r", s->fis_type);
@@ -347,7 +347,7 @@ static void fsl_sata_dump_regs(fsl_sata_reg_t *reg)
        printf("SYSPR:          %08x\n\r", in_be32(&reg->syspr));
 }
 
-static int fsl_ata_exec_ata_cmd(struct fsl_sata *sata, struct cfis *cfis,
+static int fsl_ata_exec_ata_cmd(struct fsl_sata *sata, struct sata_fis_h2d *cfis,
                                int is_ncq, int tag, u8 *buffer, u32 len)
 {
        cmd_hdr_entry_t *cmd_hdr;
@@ -483,7 +483,7 @@ static int fsl_ata_exec_ata_cmd(struct fsl_sata *sata, struct cfis *cfis,
 
        if (val32) {
                u32 der;
-               fsl_sata_dump_sfis((struct sfis *)cmd_desc->sfis);
+               fsl_sata_dump_sfis((struct sata_fis_d2h *)cmd_desc->sfis);
                printf("CE at device\n\r");
                fsl_sata_dump_regs(reg);
                der = in_le32(&reg->der);
@@ -498,13 +498,13 @@ static int fsl_ata_exec_ata_cmd(struct fsl_sata *sata, struct cfis *cfis,
        return len;
 }
 
-static int fsl_ata_exec_reset_cmd(struct fsl_sata *sata, struct cfis *cfis,
+static int fsl_ata_exec_reset_cmd(struct fsl_sata *sata, struct sata_fis_h2d *cfis,
                                 int tag, u8 *buffer, u32 len)
 {
        return 0;
 }
 
-static int fsl_sata_exec_cmd(struct fsl_sata *sata, struct cfis *cfis,
+static int fsl_sata_exec_cmd(struct fsl_sata *sata, struct sata_fis_h2d *cfis,
                 enum cmd_type command_type, int tag, u8 *buffer, u32 len)
 {
        int rc;
@@ -539,11 +539,9 @@ static int fsl_sata_exec_cmd(struct fsl_sata *sata, struct cfis *cfis,
 static void fsl_sata_identify(int dev, u16 *id)
 {
        fsl_sata_t *sata = (fsl_sata_t *)sata_dev_desc[dev].priv;
-       struct sata_fis_h2d h2d;
-       struct cfis *cfis;
+       struct sata_fis_h2d h2d, *cfis = &h2d;
 
-       cfis = (struct cfis *)&h2d;
-       memset((void *)cfis, 0, sizeof(struct cfis));
+       memset(cfis, 0, sizeof(struct sata_fis_h2d));
 
        cfis->fis_type = SATA_FIS_TYPE_REGISTER_H2D;
        cfis->pm_port_c = 0x80; /* is command */
@@ -566,12 +564,10 @@ static void fsl_sata_xfer_mode(int dev, u16 *id)
 static void fsl_sata_set_features(int dev)
 {
        fsl_sata_t *sata = (fsl_sata_t *)sata_dev_desc[dev].priv;
-       struct sata_fis_h2d h2d;
-       struct cfis *cfis;
+       struct sata_fis_h2d h2d, *cfis = &h2d;
        u8 udma_cap;
 
-       cfis = (struct cfis *)&h2d;
-       memset((void *)cfis, 0, sizeof(struct cfis));
+       memset(cfis, 0, sizeof(struct sata_fis_h2d));
 
        cfis->fis_type = SATA_FIS_TYPE_REGISTER_H2D;
        cfis->pm_port_c = 0x80; /* is command */
@@ -597,14 +593,12 @@ static void fsl_sata_set_features(int dev)
 static u32 fsl_sata_rw_cmd(int dev, u32 start, u32 blkcnt, u8 *buffer, int is_write)
 {
        fsl_sata_t *sata = (fsl_sata_t *)sata_dev_desc[dev].priv;
-       struct sata_fis_h2d h2d;
-       struct cfis *cfis;
+       struct sata_fis_h2d h2d, *cfis = &h2d;
        u32 block;
 
        block = start;
-       cfis = (struct cfis *)&h2d;
 
-       memset((void *)cfis, 0, sizeof(struct cfis));
+       memset(cfis, 0, sizeof(struct sata_fis_h2d));
 
        cfis->fis_type = SATA_FIS_TYPE_REGISTER_H2D;
        cfis->pm_port_c = 0x80; /* is command */
@@ -624,12 +618,9 @@ static u32 fsl_sata_rw_cmd(int dev, u32 start, u32 blkcnt, u8 *buffer, int is_wr
 void fsl_sata_flush_cache(int dev)
 {
        fsl_sata_t *sata = (fsl_sata_t *)sata_dev_desc[dev].priv;
-       struct sata_fis_h2d h2d;
-       struct cfis *cfis;
+       struct sata_fis_h2d h2d, *cfis = &h2d;
 
-       cfis = (struct cfis *)&h2d;
-
-       memset((void *)cfis, 0, sizeof(struct cfis));
+       memset(cfis, 0, sizeof(struct sata_fis_h2d));
 
        cfis->fis_type = SATA_FIS_TYPE_REGISTER_H2D;
        cfis->pm_port_c = 0x80; /* is command */
@@ -641,14 +632,12 @@ void fsl_sata_flush_cache(int dev)
 static u32 fsl_sata_rw_cmd_ext(int dev, u32 start, u32 blkcnt, u8 *buffer, int is_write)
 {
        fsl_sata_t *sata = (fsl_sata_t *)sata_dev_desc[dev].priv;
-       struct sata_fis_h2d h2d;
-       struct cfis *cfis;
+       struct sata_fis_h2d h2d, *cfis = &h2d;
        u64 block;
 
        block = (u64)start;
-       cfis = (struct cfis *)&h2d;
 
-       memset((void *)cfis, 0, sizeof(struct cfis));
+       memset(cfis, 0, sizeof(struct sata_fis_h2d));
 
        cfis->fis_type = SATA_FIS_TYPE_REGISTER_H2D;
        cfis->pm_port_c = 0x80; /* is command */
@@ -673,8 +662,7 @@ static u32 fsl_sata_rw_cmd_ext(int dev, u32 start, u32 blkcnt, u8 *buffer, int i
 u32 fsl_sata_rw_ncq_cmd(int dev, u32 start, u32 blkcnt, u8 *buffer, int is_write)
 {
        fsl_sata_t *sata = (fsl_sata_t *)sata_dev_desc[dev].priv;
-       struct sata_fis_h2d h2d;
-       struct cfis *cfis;
+       struct sata_fis_h2d h2d, *cfis = &h2d;
        int ncq_channel;
        u64 block;
 
@@ -684,9 +672,8 @@ u32 fsl_sata_rw_ncq_cmd(int dev, u32 start, u32 blkcnt, u8 *buffer, int is_write
        }
 
        block = (u64)start;
-       cfis = (struct cfis *)&h2d;
 
-       memset((void *)cfis, 0, sizeof(struct cfis));
+       memset(cfis, 0, sizeof(struct sata_fis_h2d));
 
        cfis->fis_type = SATA_FIS_TYPE_REGISTER_H2D;
        cfis->pm_port_c = 0x80; /* is command */
@@ -718,12 +705,9 @@ u32 fsl_sata_rw_ncq_cmd(int dev, u32 start, u32 blkcnt, u8 *buffer, int is_write
 void fsl_sata_flush_cache_ext(int dev)
 {
        fsl_sata_t *sata = (fsl_sata_t *)sata_dev_desc[dev].priv;
-       struct sata_fis_h2d h2d;
-       struct cfis *cfis;
-
-       cfis = (struct cfis *)&h2d;
+       struct sata_fis_h2d h2d, *cfis = &h2d;
 
-       memset((void *)cfis, 0, sizeof(struct cfis));
+       memset(cfis, 0, sizeof(struct sata_fis_h2d));
 
        cfis->fis_type = SATA_FIS_TYPE_REGISTER_H2D;
        cfis->pm_port_c = 0x80; /* is command */
index 874c0dc740cc65fcd810317980e3cc3c3f2a8223..18e88fa4ad042b34cae9a93c6db5f63413bab6bd 100644 (file)
@@ -288,52 +288,6 @@ typedef struct cmd_desc {
 #define SATA_HC_CMD_DESC_SIZE          sizeof(struct cmd_desc)
 #define SATA_HC_CMD_DESC_ALIGN         4
 
-/*
-* CFIS - Command FIS, which is H2D register FIS, the struct defination
-* of Non-Queued command is different than NCQ command. see them is sata2.h
-*/
-typedef struct cfis {
-       u8 fis_type;
-       u8 pm_port_c;
-       u8 command;
-       u8 features;
-       u8 lba_low;
-       u8 lba_mid;
-       u8 lba_high;
-       u8 device;
-       u8 lba_low_exp;
-       u8 lba_mid_exp;
-       u8 lba_high_exp;
-       u8 features_exp;
-       u8 sector_count;
-       u8 sector_count_exp;
-       u8 res1;
-       u8 control;
-       u8 res2[4];
-} __attribute__ ((packed)) cfis_t;
-
-/*
-* SFIS - Status FIS, which is D2H register FIS.
-*/
-typedef struct sfis {
-       u8 fis_type;
-       u8 pm_port_i;
-       u8 status;
-       u8 error;
-       u8 lba_low;
-       u8 lba_mid;
-       u8 lba_high;
-       u8 device;
-       u8 lba_low_exp;
-       u8 lba_mid_exp;
-       u8 lba_high_exp;
-       u8 res1;
-       u8 sector_count;
-       u8 sector_count_exp;
-       u8 res2[2];
-       u8 res3[4];
-} __attribute__ ((packed)) sfis_t;
-
 /*
  * SATA device driver info
  */
diff --git a/examples/.gitignore b/examples/.gitignore
deleted file mode 100644 (file)
index 0d1864c..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-/82559_eeprom
-/hello_world
-/interrupt
-/mem_to_mem_idma2intr
-/test_burst
-/timer
-/sched
-/smc91111_eeprom
-/smc911x_eeprom
-*.bin
-*.srec
diff --git a/examples/82559_eeprom.c b/examples/82559_eeprom.c
deleted file mode 100644 (file)
index 5e2eee9..0000000
+++ /dev/null
@@ -1,357 +0,0 @@
-
-/*
- * Copyright 1998-2001 by Donald Becker.
- * This software may be used and distributed according to the terms of
- * the GNU General Public License (GPL), incorporated herein by reference.
- * Contact the author for use under other terms.
- *
- * This program must be compiled with "-O"!
- * See the bottom of this file for the suggested compile-command.
- *
- * The author may be reached as becker@scyld.com, or C/O
- *  Scyld Computing Corporation
- *  410 Severn Ave., Suite 210
- *  Annapolis MD 21403
- *
- * Common-sense licensing statement: Using any portion of this program in
- * your own program means that you must give credit to the original author
- * and release the resulting code under the GPL.
- */
-
-#define _PPC_STRING_H_         /* avoid unnecessary str/mem functions */
-
-#include <common.h>
-#include <exports.h>
-#include <asm/io.h>
-
-
-/* Default EEPROM for i82559 */
-static unsigned short default_eeprom[64] = {
-       0x0100, 0x0302, 0x0504, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-       0xffff, 0xffff, 0x40c0, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff,
-       0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-       0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-       0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-       0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-       0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-       0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff
-};
-
-static unsigned short eeprom[256];
-
-static int eeprom_size = 64;
-static int eeprom_addr_size = 6;
-
-static int debug = 0;
-
-static inline unsigned short swap16(unsigned short x)
-{
-       return (((x & 0xff) << 8) | ((x & 0xff00) >> 8));
-}
-
-
-void * memcpy(void * dest,const void *src,size_t count)
-{
-       char *tmp = (char *) dest, *s = (char *) src;
-
-       while (count--)
-               *tmp++ = *s++;
-
-       return dest;
-}
-
-
-/* The EEPROM commands include the alway-set leading bit. */
-#define EE_WRITE_CMD   (5)
-#define EE_READ_CMD            (6)
-#define EE_ERASE_CMD   (7)
-
-/* Serial EEPROM section. */
-#define EE_SHIFT_CLK   0x01    /* EEPROM shift clock. */
-#define EE_CS                  0x02    /* EEPROM chip select. */
-#define EE_DATA_WRITE  0x04    /* EEPROM chip data in. */
-#define EE_DATA_READ   0x08    /* EEPROM chip data out. */
-#define EE_ENB                 (0x4800 | EE_CS)
-#define EE_WRITE_0             0x4802
-#define EE_WRITE_1             0x4806
-#define EE_OFFSET              14
-
-/* Delay between EEPROM clock transitions. */
-#define eeprom_delay(ee_addr)  inw(ee_addr)
-
-/* Wait for the EEPROM to finish the previous operation. */
-static int eeprom_busy_poll(long ee_ioaddr)
-{
-       int i;
-       outw(EE_ENB, ee_ioaddr);
-       for (i = 0; i < 10000; i++)                     /* Typical 2000 ticks */
-               if (inw(ee_ioaddr) & EE_DATA_READ)
-                       break;
-       return i;
-}
-
-/* This executes a generic EEPROM command, typically a write or write enable.
-   It returns the data output from the EEPROM, and thus may also be used for
-   reads. */
-static int do_eeprom_cmd(long ioaddr, int cmd, int cmd_len)
-{
-       unsigned retval = 0;
-       long ee_addr = ioaddr + EE_OFFSET;
-
-       if (debug > 1)
-               printf(" EEPROM op 0x%x: ", cmd);
-
-       outw(EE_ENB | EE_SHIFT_CLK, ee_addr);
-
-       /* Shift the command bits out. */
-       do {
-               short dataval = (cmd & (1 << cmd_len)) ? EE_WRITE_1 : EE_WRITE_0;
-               outw(dataval, ee_addr);
-               eeprom_delay(ee_addr);
-               if (debug > 2)
-                       printf("%X", inw(ee_addr) & 15);
-               outw(dataval | EE_SHIFT_CLK, ee_addr);
-               eeprom_delay(ee_addr);
-               retval = (retval << 1) | ((inw(ee_addr) & EE_DATA_READ) ? 1 : 0);
-       } while (--cmd_len >= 0);
-#if 0
-       outw(EE_ENB, ee_addr);
-#endif
-       /* Terminate the EEPROM access. */
-       outw(EE_ENB & ~EE_CS, ee_addr);
-       if (debug > 1)
-               printf(" EEPROM result is 0x%5.5x.\n", retval);
-       return retval;
-}
-
-static int read_eeprom(long ioaddr, int location, int addr_len)
-{
-       return do_eeprom_cmd(ioaddr, ((EE_READ_CMD << addr_len) | location)
-               << 16 , 3 + addr_len + 16) & 0xffff;
-}
-
-static void write_eeprom(long ioaddr, int index, int value, int addr_len)
-{
-       long ee_ioaddr = ioaddr + EE_OFFSET;
-       int i;
-
-       /* Poll for previous op finished. */
-       eeprom_busy_poll(ee_ioaddr);                    /* Typical 0 ticks */
-       /* Enable programming modes. */
-       do_eeprom_cmd(ioaddr, (0x4f << (addr_len-4)), 3 + addr_len);
-       /* Do the actual write. */
-       do_eeprom_cmd(ioaddr,
-                                 (((EE_WRITE_CMD<<addr_len) | index)<<16) | (value & 0xffff),
-                                 3 + addr_len + 16);
-       /* Poll for write finished. */
-       i = eeprom_busy_poll(ee_ioaddr);                        /* Typical 2000 ticks */
-       if (debug)
-               printf(" Write finished after %d ticks.\n", i);
-       /* Disable programming. This command is not instantaneous, so we check
-          for busy before the next op. */
-       do_eeprom_cmd(ioaddr, (0x40 << (addr_len-4)), 3 + addr_len);
-       eeprom_busy_poll(ee_ioaddr);
-}
-
-static int reset_eeprom(unsigned long ioaddr, unsigned char *hwaddr)
-{
-       unsigned short checksum = 0;
-       int size_test;
-       int i;
-
-       printf("Resetting i82559 EEPROM @ 0x%08lx ... ", ioaddr);
-
-       size_test = do_eeprom_cmd(ioaddr, (EE_READ_CMD << 8) << 16, 27);
-       eeprom_addr_size = (size_test & 0xffe0000) == 0xffe0000 ? 8 : 6;
-       eeprom_size = 1 << eeprom_addr_size;
-
-       memcpy(eeprom, default_eeprom, sizeof default_eeprom);
-
-       for (i = 0; i < 3; i++)
-               eeprom[i] = (hwaddr[i*2+1]<<8) + hwaddr[i*2];
-
-       /* Recalculate the checksum. */
-       for (i = 0; i < eeprom_size - 1; i++)
-               checksum += eeprom[i];
-       eeprom[i] = 0xBABA - checksum;
-
-       for (i = 0; i < eeprom_size; i++)
-               write_eeprom(ioaddr, i, eeprom[i], eeprom_addr_size);
-
-       for (i = 0; i < eeprom_size; i++)
-               if (read_eeprom(ioaddr, i, eeprom_addr_size) != eeprom[i]) {
-                       printf("failed\n");
-                       return 1;
-               }
-
-       printf("done\n");
-       return 0;
-}
-
-static unsigned int hatoi(char *p, char **errp)
-{
-       unsigned int res = 0;
-
-       while (1) {
-               switch (*p) {
-               case 'a':
-               case 'b':
-               case 'c':
-               case 'd':
-               case 'e':
-               case 'f':
-                       res |= (*p - 'a' + 10);
-                       break;
-               case 'A':
-               case 'B':
-               case 'C':
-               case 'D':
-               case 'E':
-               case 'F':
-                       res |= (*p - 'A' + 10);
-                       break;
-               case '0':
-               case '1':
-               case '2':
-               case '3':
-               case '4':
-               case '5':
-               case '6':
-               case '7':
-               case '8':
-               case '9':
-                       res |= (*p - '0');
-                       break;
-               default:
-                       if (errp) {
-                               *errp = p;
-                       }
-               return res;
-               }
-               p++;
-               if (*p == 0) {
-                       break;
-               }
-               res <<= 4;
-       }
-
-       if (errp) {
-               *errp = NULL;
-       }
-
-       return res;
-}
-
-static unsigned char *gethwaddr(char *in, unsigned char *out)
-{
-       char tmp[3];
-       int i;
-       char *err;
-
-       for (i=0;i<6;i++) {
-               if (in[i*3+2] == 0 && i == 5) {
-                       out[i] = hatoi(&in[i*3], &err);
-                       if (err) {
-                               return NULL;
-                       }
-               } else if (in[i*3+2] == ':' && i < 5) {
-                       tmp[0] = in[i*3];
-                       tmp[1] = in[i*3+1];
-                       tmp[2] = 0;
-                       out[i] = hatoi(tmp, &err);
-                       if (err) {
-                               return NULL;
-                       }
-               } else {
-                       return NULL;
-               }
-       }
-
-       return out;
-}
-
-static u32
-read_config_dword(int bus, int dev, int func, int reg)
-{
-       u32 res;
-
-       outl(0x80000000|(bus&0xff)<<16|(dev&0x1f)<<11|(func&7)<<8|(reg&0xfc),
-            0xcf8);
-       res = inl(0xcfc);
-       outl(0, 0xcf8);
-       return res;
-}
-
-static u16
-read_config_word(int bus, int dev, int func, int reg)
-{
-       u32 res;
-
-       outl(0x80000000|(bus&0xff)<<16|(dev&0x1f)<<11|(func&7)<<8|(reg&0xfc),
-            0xcf8);
-       res = inw(0xcfc + (reg & 2));
-       outl(0, 0xcf8);
-       return res;
-}
-
-static void
-write_config_word(int bus, int dev, int func, int reg, u16 data)
-{
-
-       outl(0x80000000|(bus&0xff)<<16|(dev&0x1f)<<11|(func&7)<<8|(reg&0xfc),
-            0xcf8);
-       outw(data, 0xcfc + (reg & 2));
-       outl(0, 0xcf8);
-}
-
-
-int main (int argc, char *argv[])
-{
-       unsigned char *eth_addr;
-       uchar buf[6];
-       int instance;
-
-       app_startup(argv);
-       if (argc != 2) {
-               printf ("call with base Ethernet address\n");
-               return 1;
-       }
-
-
-       eth_addr = gethwaddr(argv[1], buf);
-       if (NULL == eth_addr) {
-               printf ("Can not parse ethernet address\n");
-               return 1;
-       }
-       if (eth_addr[5] & 0x01) {
-               printf("Base Ethernet address must be even\n");
-       }
-
-
-       for (instance = 0; instance < 2; instance ++)  {
-               unsigned int io_addr;
-               unsigned char mac[6];
-               int bar1 = read_config_dword(0, 6+instance, 0, 0x14);
-               if (! (bar1 & 1)) {
-                       printf("ETH%d is disabled %x\n", instance, bar1);
-               } else {
-                       printf("ETH%d IO=0x%04x\n", instance, bar1 & ~3);
-               }
-               io_addr = (bar1 & (~3L));
-
-
-               write_config_word(0, 6+instance, 0, 4,
-                                 read_config_word(0, 6+instance, 0, 4) | 1);
-               printf("ETH%d CMD %04x\n", instance,
-                          read_config_word(0, 6+instance, 0, 4));
-
-               memcpy(mac, eth_addr, 6);
-               mac[5] += instance;
-
-               printf("got io=%04x, ha=%02x:%02x:%02x:%02x:%02x:%02x\n",
-                          io_addr, mac[0], mac[1], mac[2],
-                          mac[3], mac[4], mac[5]);
-               reset_eeprom(io_addr, mac);
-       }
-       return 0;
-}
diff --git a/examples/Makefile b/examples/Makefile
deleted file mode 100644 (file)
index dbcfa92..0000000
+++ /dev/null
@@ -1,198 +0,0 @@
-#
-# (C) Copyright 2000-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
-#
-
-ifeq ($(ARCH),ppc)
-LOAD_ADDR = 0x40000
-endif
-
-ifeq ($(ARCH),i386)
-LOAD_ADDR = 0x40000
-endif
-
-ifeq ($(ARCH),arm)
-ifeq ($(BOARD),omap2420h4)
-LOAD_ADDR = 0x80300000
-else
-ifeq ($(CPU),omap3)
-LOAD_ADDR = 0x80300000
-else
-LOAD_ADDR = 0xc100000
-endif
-endif
-endif
-
-ifeq ($(ARCH),mips)
-LOAD_ADDR = 0x80200000 -T mips.lds
-endif
-
-ifeq ($(ARCH),nios)
-LOAD_ADDR = 0x00800000 -L $(gcclibdir)/m32 -T nios.lds
-endif
-
-ifeq ($(ARCH),nios2)
-LOAD_ADDR = 0x02000000 -L $(gcclibdir) -T nios2.lds
-endif
-
-ifeq ($(ARCH),m68k)
-LOAD_ADDR = 0x20000  -L $(clibdir)
-endif
-
-ifeq ($(ARCH),microblaze)
-LOAD_ADDR = 0x80F00000
-endif
-
-ifeq ($(ARCH),blackfin)
-LOAD_ADDR = 0x1000
-endif
-
-ifeq ($(ARCH),avr32)
-LOAD_ADDR = 0x00000000
-endif
-
-ifeq ($(ARCH),sh)
-LOAD_ADDR = 0x8C000000
-ifeq ($(CPU),sh2)
-BIG_ENDIAN=y
-endif
-endif
-
-ifeq ($(ARCH),sparc)
-LOAD_ADDR = 0x00000000 -L $(gcclibdir) -T sparc.lds
-endif
-
-include $(TOPDIR)/config.mk
-
-ELF    = hello_world
-SREC   = hello_world.srec
-BIN    = hello_world.bin
-
-ifeq ($(CPU),mpc8xx)
-ELF    += test_burst
-SREC   += test_burst.srec
-BIN    += test_burst.bin
-endif
-
-ifeq ($(ARCH),i386)
-ELF    += 82559_eeprom
-SREC   += 82559_eeprom.srec
-BIN    += 82559_eeprom.bin
-endif
-
-ifeq ($(ARCH),ppc)
-ELF    += sched
-SREC   += sched.srec
-BIN    += sched.bin
-endif
-
-ifeq ($(ARCH),blackfin)
-BFIN_BIN = smc91111_eeprom smc911x_eeprom
-ELF    += $(BFIN_BIN)
-SREC   += $(addsuffix .srec,$(BFIN_BIN))
-BIN    += $(addsuffix .bin,$(BFIN_BIN))
-endif
-
-# The following example is pretty 8xx specific...
-ifeq ($(CPU),mpc8xx)
-ELF    += timer
-SREC   += timer.srec
-BIN    += timer.bin
-endif
-
-# The following example is 8260 specific...
-ifeq ($(CPU),mpc8260)
-ELF    += mem_to_mem_idma2intr
-SREC   += mem_to_mem_idma2intr.srec
-BIN    += mem_to_mem_idma2intr.bin
-endif
-
-# Demo for 52xx IRQs
-ifeq ($(CPU),mpc5xxx)
-ELF    += interrupt
-SREC   += interrupt.srec
-BIN    += interrupt.bin
-endif
-
-# Utility for resetting i82559 EEPROM
-ifeq ($(BOARD),oxc)
-ELF    += eepro100_eeprom
-SREC   += eepro100_eeprom.srec
-BIN    += eepro100_eeprom.bin
-endif
-
-ifeq ($(BIG_ENDIAN),y)
-EX_LDFLAGS += -EB
-endif
-
-COBJS  := $(SREC:.srec=.o)
-
-LIB    = $(obj)libstubs.a
-LIBAOBJS=
-ifeq ($(ARCH),ppc)
-LIBAOBJS+= $(ARCH)_longjmp.o $(ARCH)_setjmp.o
-endif
-ifeq ($(CPU),mpc8xx)
-LIBAOBJS+= test_burst_lib.o
-endif
-LIBCOBJS= stubs.o
-
-LIBOBJS        = $(addprefix $(obj),$(LIBAOBJS) $(LIBCOBJS))
-
-SRCS   := $(COBJS:.o=.c) $(LIBCOBJS:.o=.c) $(if $(LIBAOBJS),$(LIBAOBJS:.o=.S))
-OBJS   := $(addprefix $(obj),$(COBJS))
-ELF    := $(addprefix $(obj),$(ELF))
-BIN    := $(addprefix $(obj),$(BIN))
-SREC   := $(addprefix $(obj),$(SREC))
-
-gcclibdir := $(shell dirname `$(CC) -print-libgcc-file-name`)
-clibdir := $(shell dirname `$(CC) $(CFLAGS) -print-file-name=libc.a`)
-
-CPPFLAGS += -I..
-
-all:   $(obj).depend $(OBJS) $(LIB) $(SREC) $(BIN) $(ELF)
-
-#########################################################################
-$(LIB):        $(obj).depend $(LIBOBJS)
-               $(AR) $(ARFLAGS) $@ $(LIBOBJS)
-
-$(ELF):
-$(obj)%:       $(obj)%.o $(LIB)
-               $(LD) -g $(EX_LDFLAGS) -Ttext $(LOAD_ADDR) \
-                       -o $@ -e $(SYM_PREFIX)$(notdir $(<:.o=)) $< $(LIB) \
-                       -L$(gcclibdir) -lgcc
-
-$(SREC):
-$(obj)%.srec:  $(obj)%
-               $(OBJCOPY) -O srec $< $@ 2>/dev/null
-
-$(BIN):
-$(obj)%.bin:   $(obj)%
-               $(OBJCOPY) -O binary $< $@ 2>/dev/null
-
-#########################################################################
-
-# defines $(obj).depend target
-include $(SRCTREE)/rules.mk
-
-sinclude $(obj).depend
-
-#########################################################################
diff --git a/examples/README.smc91111_eeprom b/examples/README.smc91111_eeprom
deleted file mode 100644 (file)
index 28e7e69..0000000
+++ /dev/null
@@ -1,246 +0,0 @@
-This is the readme for the Das U-Boot standalone program smc91111
-
-The main purpose of this is to manage MAC addresses on platforms
-which include the SMC91111 integrated 10/100 MAC Phy, with attached
-EEPROMs.
-
-
-Contents:
-------------------------
-1. Ensuring U-boot's MAC address can be set in hardware
-2. Running the smc91111_eeprom program
-3. Setting MAC addresses
-4. Other things you can do with this
-5. Things to be done.
-
-
-1. Ensuring U-boot's MAC address can be set in hardware
---------------------------------------------------------------------------
-
-On the Internet - MAC addresses are very important. Short for Media
-Access Control address, a hardware address that uniquely identifies
-each node of a network. When things are not unique - bad things
-can happen.  This is why U-Boot makes it difficult to change MAC
-addresses.
-
-To find out who has a MAC address, or to purchase MAC addresses, goto
-the IEEE, at:
-http://standards.ieee.org/regauth/oui/index.shtml
-
-To change your MAC address, there can not be a MAC address predefined in
-U-Boot. To ensure that this does not occur, check your
-include/configs/<board_name>.h file, and check to see that the following
-settings are _not_ or commented out there.
-
-#define HARDCODE_MAC                   1
-#define CONFIG_ETHADDR                 02:80:ad:20:31:b8
-
-The purpose of HARDCODE_MAC is to hardcode the MAC address in software,
-(not what we want), or to preset it to 02:80:ad:20:31:b8 (not what we
-want either).
-
-You can check this in a running U-Boot, by doing a power cycle, then
-before U-Boot tries to do any networking, running the 'printenv' command
-
-  BOOT> printenv
-
-  ethaddr=02:80:ad:20:31:b8
-
-If you see the 'ethaddr' variable show up, like the above, you need to
-recompile U-Boot, with the above settings commented out of the
-include/configs/<board_name>.h file.
-
-2. Running the smc91111_eeprom program
----------------------------------------------------------------------
-
-After Uboot is compiled, there should be three files of interest:
--rwxr-xr-x    1                8806 2004-10-11 14:00 smc91111_eeprom       <- ELF
--rwxr-xr-x    1                3440 2004-10-11 14:00 smc91111_eeprom.bin   <- BIN
--rwxr-xr-x    1                9524 2004-10-11 14:00 smc91111_eeprom.srec  <- SREC
-
-if there is not, check the examples/Makefile, and ensure there is something
-like for your architecture:
-
-   ifeq ($(ARCH),blackfin)
-   SREC          += smc91111_eeprom.srec
-   BIN   += smc91111_eeprom.bin smc91111_eeprom
-   endif
-
-To load the files: there are two methods: a) serial or b) network. Since
-it is not a good idea to start doing things on the network before the
-MAC address is set, this example will do things over serial.
-
-a) Loading the elf file via the serial port
---------------------------------------------
-Loading the elf is very easy - just ensure that the location
-you specify things to load as is not the load address specified
-in the Makefile.
-
-BOOT> loadb 0x1000000
-
-## Ready for binary (kermit) download to 0x01000000 at 57600 bps...
-
-(type CNTL-\ then C)
-(Back at local machine)
-----------------------------------------------------
-Kermit>send ~/u-boot_1.1.1/examples/smc91111_eeprom
-Kermit>connect
-
-Connecting to /dev/ttyS0, speed 57600
- Escape character: Ctrl-\ (ASCII 28, FS): enabled
-Type the escape character followed by C to get back,
-or followed by ? to see other options.
-----------------------------------------------------
-## Total Size     = 0x00002266 = 8806 Bytes
-## Start Addr     = 0x01000000
-
-BOOT> bootelf 0x1000000
-
-Loading .text @ 0x00001000 (3440 bytes)
-## Starting application at 0x000010d8 ...
-
-SMC91111>
-
-b) Loading the binary file via the serial port
------------------------------------------------
-For many toolchains, the entry point is not the load point.
-The Load point is a hard coded address from the
-examples/Makefile. The entry point can be found by doing something
-like:
-
-  u-boot_1.1.1/examples> bfin-elf-objdump -d smc91111_eeprom |less
-
-  smc91111_eeprom:     file format elf32-bfin
-
-  Disassembly of section .text:
-
-  00001000 <smc91111_eeprom-0xd8>:
-      1000:
-  000010d8 <smc91111_eeprom>:
-
-You can see that the entry point (or the address that should be
-jumped to is 0x10d8). This is also the same as the entry point
-of the elf file.
-
-Now we load it to the actual load location:
-
-BOOT> loadb 0x1000
-
-## Ready for binary (kermit) download to 0x00001000 at 57600 bps...
-
-(Back at pinky.dsl-only.net)
-----------------------------------------------------
-Kermit>send /tftpboot/eeprom.bin
-Kermit>connect
-
-Connecting to /dev/ttyS0, speed 57600
- Escape character: Ctrl-\ (ASCII 28, FS): enabled
-Type the escape character followed by C to get back,
-or followed by ? to see other options.
-----------------------------------------------------
-## Total Size     = 0x00000d70 = 3440 Bytes
-## Start Addr     = 0x00001000
-
-BOOT> go 0x10D8
-
-## Starting application at 0x000010D8 ...
-
-SMC91111>
-
-3. Setting MAC addresses
---------------------------------------------------------------------------
-
-The MAC address can be stored in four locations:
-
--Boot environmental variable in Flash <- can not change, without
-                                         re-flashing U-boot.
-U-Boot environental variable          <- can not change, without
-                                         resetting board/U-Boot
-LAN91C111 Registers                   <- volitle
-LAN91C111 EEPROM                      <- Non Volitle
-
-If you have not activated the network, and do not have a hardcoded
-or pre-assigned MAC address in U-boot, the environmental variables
-should be blank, and allow you to set things one time.
-
-To set the EEPROM MAC address to 12:34:56:78:9A:BC
-
-SMC91111> W E 20 3412
-
-Writing EEPROM register 20 with 3412
-SMC91111> W E 21 7856
-
-Writing EEPROM register 21 with 7856
-SMC91111> W E 22 BC9A
-
-Writing EEPROM register 22 with bc9a
-EEPROM contents copied to MAC
-SMC91111> P
-
-Current MAC Address in SMSC91111 12:34:56:78:9a:bc
-Current MAC Address in EEPROM   12:34:56:78:9a:bc
-
-(CNTRL-C to exit)
-SMC91111> ## Application terminated, rc = 0x0
-
-BOOT> reset
-U-Boot 1.1.1 (gcc version: 3.3.3)
-Release Version Beta released on Oct 10 2004 - 00:34:35
-Blackfin support by LG Soft India
-For further information please check this link http://www.blackfin.uclinux.org
-BOOT> ping 192.168.0.4
-
-Using MAC Address 12:34:56:78:9A:BC
-host 192.168.0.4 is alive
-
-
-4. Other things that you can do
---------------------------------------------------------------------------
-After the stand alone application is running, there are a few options:
- - P : Print the MAC
- - D : Dump the LAN91C111 EEPROM contents
- - M : Dump the LAN91C111 MAC contents
- - C : Copies the MAC address from the EEPROM to the LAN91C111
- - W : Write a register in the EEPROM or in the MAC
-
-SMC91111> P
-
-Current MAC Address in SMSC91111 12:34:56:78:9a:bc
-Current MAC Address in EEPROM   12:34:56:78:9a:bc
-
-SMC91111> D
-
-IOS2-0   000     001     002     003     004     005     006     007
-CONFIG 00:ffff 04:ffff 08:ffff 0c:ffff 10:ffff 14:ffff 18:ffff 1c:ffff
-BASE   01:ffff 05:ffff 09:ffff 0d:ffff 11:ffff 15:ffff 19:ffff 1d:ffff
-       02:ffff 06:ffff 0a:ffff 0e:0020 12:ffff 16:ffff 1a:ffff 1e:ffff
-       03:ffff 07:ffff 0b:ffff 0f:ffff 13:ffff 17:ffff 1b:ffff 1f:ffff
-
-20:3412 21:7856 22:bc9a 23:ffff 24:ffff 25:ffff 26:ffff 27:ffff
-28:ffff 29:ffff 2a:ffff 2b:ffff 2c:ffff 2d:ffff 2e:ffff 2f:ffff
-30:ffff 31:ffff 32:ffff 33:ffff 34:ffff 35:ffff 36:ffff 37:ffff
-38:ffff 39:ffff 3a:ffff 3b:ffff 3c:ffff 3d:ffff 3e:ffff 3f:ffff
-
-SMC91111> M
-
-    Bank0 Bank1 Bank2 Bank3
-00  0000  a0b1 3332  0000
-02  0000  1801 8000  0000
-04  0000  3412 8080  0000
-06  0000  7856 003f  0000
-08  0404  bc9a 02df  3332
-0a  0000  ffff 02df  3391
-0c  0000  1214 0004  001f
-0e  3300  3301 3302  3303
-
-SMC91111> C
-
-EEPROM contents copied to MAC
-
-SMC91111> W E 2A ABCD
-
-Writing EEPROM register 2a with abcd
-
-SMC91111> W M 14 FF00
-
-Writing MAC register bank 1, reg 04 with ff00
diff --git a/examples/api/.gitignore b/examples/api/.gitignore
new file mode 100644 (file)
index 0000000..d7b18dc
--- /dev/null
@@ -0,0 +1,2 @@
+demo
+demo.bin
diff --git a/examples/api/Makefile b/examples/api/Makefile
new file mode 100644 (file)
index 0000000..2d05a01
--- /dev/null
@@ -0,0 +1,90 @@
+#
+# (C) Copyright 2007 Semihalf
+#
+# 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 Foundatio; 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
+#
+
+ifeq ($(ARCH),ppc)
+LOAD_ADDR = 0x40000
+endif
+ifeq ($(ARCH),arm)
+LOAD_ADDR = 0x1000000
+endif
+
+include $(TOPDIR)/config.mk
+
+# Resulting ELF and binary exectuables will be named demo and demo.bin
+OUTPUT-$(CONFIG_API) = $(obj)demo
+OUTPUT = $(OUTPUT-y)
+
+# Source files located in the examples/api directory
+SOBJ_FILES-$(CONFIG_API) += crt0.o
+COBJ_FILES-$(CONFIG_API) += demo.o
+COBJ_FILES-$(CONFIG_API) += glue.o
+COBJ_FILES-$(CONFIG_API) += libgenwrap.o
+
+# Source files which exist outside the examples/api directory
+EXT_COBJ_FILES-$(CONFIG_API) += lib_generic/crc32.o
+EXT_COBJ_FILES-$(CONFIG_API) += lib_generic/ctype.o
+EXT_COBJ_FILES-$(CONFIG_API) += lib_generic/string.o
+EXT_COBJ_FILES-$(CONFIG_API) += lib_generic/vsprintf.o
+ifeq ($(ARCH),ppc)
+EXT_SOBJ_FILES-$(CONFIG_API) += lib_ppc/ppcstring.o
+endif
+
+# Create a list of source files so their dependencies can be auto-generated
+SRCS   += $(addprefix $(SRCTREE)/,$(EXT_COBJ_FILES-y:.o=.c))
+SRCS   += $(addprefix $(SRCTREE)/,$(EXT_SOBJ_FILES-y:.o=.S))
+SRCS   += $(addprefix $(SRCTREE)/examples/api/,$(COBJ_FILES-y:.o=.c))
+SRCS   += $(addprefix $(SRCTREE)/examples/api/,$(SOBJ_FILES-y:.o=.S))
+
+# Create a list of object files to be compiled
+OBJS   += $(addprefix $(obj),$(SOBJ_FILES-y))
+OBJS   += $(addprefix $(obj),$(COBJ_FILES-y))
+OBJS   += $(addprefix $(obj),$(notdir $(EXT_COBJ_FILES-y)))
+OBJS   += $(addprefix $(obj),$(notdir $(EXT_SOBJ_FILES-y)))
+
+gcclibdir := $(shell dirname `$(CC) -print-libgcc-file-name`)
+
+CPPFLAGS += -I..
+
+all:   $(obj).depend $(OUTPUT)
+
+#########################################################################
+
+$(OUTPUT):     $(OBJS)
+               $(LD) -Ttext $(LOAD_ADDR) -o $@ $^ -L$(gcclibdir) -lgcc
+               $(OBJCOPY) -O binary $@ $(OUTPUT).bin 2>/dev/null
+
+# Rule to build generic library C files
+$(obj)%.o: $(SRCTREE)/lib_generic/%.c
+       $(CC) -g $(CFLAGS) -c -o $@ $<
+
+# Rule to build architecture-specific library assembly files
+$(obj)%.o: $(SRCTREE)/lib_$(ARCH)/%.S
+       $(CC) -g $(CFLAGS) -c -o $@ $<
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/examples/api/crt0.S b/examples/api/crt0.S
new file mode 100644 (file)
index 0000000..6daf127
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+ * (C) Copyright 2007 Semihalf
+ *
+ * Written by: Rafal Jaworowski <raj@semihalf.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
+ *
+ */
+
+#if defined(CONFIG_PPC)
+
+       .text
+       .globl _start
+_start:
+       lis     %r11, search_hint@ha
+       addi    %r11, %r11, search_hint@l
+       stw     %r1, 0(%r11)
+       b       main
+
+
+       .globl syscall
+syscall:
+       lis     %r11, syscall_ptr@ha
+       addi    %r11, %r11, syscall_ptr@l
+       lwz     %r11, 0(%r11)
+       mtctr   %r11
+       bctr
+
+#elif defined(CONFIG_ARM)
+
+       .text
+       .globl _start
+_start:
+       ldr     ip, =search_hint
+       str     sp, [ip]
+       b       main
+
+
+       .globl syscall
+syscall:
+       ldr     ip, =syscall_ptr
+       ldr     pc, [ip]
+
+#else
+#error No support for this arch!
+#endif
+
+       .globl syscall_ptr
+syscall_ptr:
+       .align  4
+       .long   0
+
+       .globl search_hint
+search_hint:
+       .long   0
diff --git a/examples/api/demo.c b/examples/api/demo.c
new file mode 100644 (file)
index 0000000..df9c4bd
--- /dev/null
@@ -0,0 +1,300 @@
+/*
+ * (C) Copyright 2007-2008 Semihalf
+ *
+ * Written by: Rafal Jaworowski <raj@semihalf.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 <linux/types.h>
+#include <api_public.h>
+
+#include "glue.h"
+
+#define errf(fmt, args...) do { printf("ERROR @ %s(): ", __func__); printf(fmt, ##args); } while (0)
+
+#define BUF_SZ         2048
+#define WAIT_SECS      5
+
+void   test_dump_buf(void *, int);
+void   test_dump_di(int);
+void   test_dump_si(struct sys_info *);
+void   test_dump_sig(struct api_signature *);
+
+static char buf[BUF_SZ];
+
+int main(int argc, char *argv[])
+{
+       int rv = 0, h, i, j, devs_no;
+       struct api_signature *sig = NULL;
+       ulong start, now;
+       struct device_info *di;
+       lbasize_t rlen;
+
+       if (!api_search_sig(&sig))
+               return -1;
+
+       syscall_ptr = sig->syscall;
+       if (syscall_ptr == NULL)
+               return -2;
+
+       if (sig->version > API_SIG_VERSION)
+               return -3;
+
+       printf("API signature found @%x\n", (unsigned int)sig);
+       test_dump_sig(sig);
+
+       printf("\n*** Consumer API test ***\n");
+       printf("syscall ptr 0x%08x@%08x\n", (unsigned int)syscall_ptr,
+               (unsigned int)&syscall_ptr);
+
+       /* console activities */
+       ub_putc('B');
+
+       printf("*** Press any key to continue ***\n");
+       printf("got char 0x%x\n", ub_getc());
+
+       /* system info */
+       test_dump_si(ub_get_sys_info());
+
+       /* timing */
+       printf("\n*** Timing - wait a couple of secs ***\n");
+       start = ub_get_timer(0);
+       printf("\ntime: start %lu\n\n", start);
+       for (i = 0; i < WAIT_SECS; i++)
+               for (j = 0; j < 1000; j++)
+                       ub_udelay(1000);        /* wait 1 ms */
+
+       /* this is the number of milliseconds that passed from ub_get_timer(0) */
+       now = ub_get_timer(start);
+       printf("\ntime: now %lu\n\n", now);
+
+       /* enumerate devices */
+       printf("\n*** Enumerate devices ***\n");
+       devs_no = ub_dev_enum();
+
+       printf("Number of devices found: %d\n", devs_no);
+       if (devs_no == 0)
+               return -1;
+
+       printf("\n*** Show devices ***\n");
+       for (i = 0; i < devs_no; i++) {
+               test_dump_di(i);
+               printf("\n");
+       }
+
+       printf("\n*** Operations on devices ***\n");
+
+       /* test opening a device already opened */
+       h = 0;
+       if ((rv = ub_dev_open(h)) != 0) {
+               errf("open device %d error %d\n", h, rv);
+               return -1;
+       }
+       if ((rv = ub_dev_open(h)) != 0)
+               errf("open device %d error %d\n", h, rv);
+
+       ub_dev_close(h);
+
+       /* test storage */
+       printf("Trying storage devices...\n");
+       for (i = 0; i < devs_no; i++) {
+               di = ub_dev_get(i);
+
+               if (di->type & DEV_TYP_STOR)
+                       break;
+
+       }
+       if (i == devs_no)
+               printf("No storage devices available\n");
+       else {
+               memset(buf, 0, BUF_SZ);
+
+               if ((rv = ub_dev_open(i)) != 0)
+                       errf("open device %d error %d\n", i, rv);
+
+               else if ((rv = ub_dev_read(i, buf, 1, 0, &rlen)) != 0)
+                       errf("could not read from device %d, error %d\n", i, rv);
+               else {
+                       printf("Sector 0 dump (512B):\n");
+                       test_dump_buf(buf, 512);
+               }
+
+               ub_dev_close(i);
+       }
+
+       /* test networking */
+       printf("Trying network devices...\n");
+       for (i = 0; i < devs_no; i++) {
+               di = ub_dev_get(i);
+
+               if (di->type == DEV_TYP_NET)
+                       break;
+
+       }
+       if (i == devs_no)
+               printf("No network devices available\n");
+       else {
+               if ((rv = ub_dev_open(i)) != 0)
+                       errf("open device %d error %d\n", i, rv);
+               else if ((rv = ub_dev_send(i, &buf, 2048)) != 0)
+                       errf("could not send to device %d, error %d\n", i, rv);
+
+               ub_dev_close(i);
+       }
+
+       if (ub_dev_close(h) != 0)
+               errf("could not close device %d\n", h);
+
+       printf("\n*** Env vars ***\n");
+
+       printf("ethact = %s\n", ub_env_get("ethact"));
+       printf("old fileaddr = %s\n", ub_env_get("fileaddr"));
+       ub_env_set("fileaddr", "deadbeef");
+       printf("new fileaddr = %s\n", ub_env_get("fileaddr"));
+
+       const char *env = NULL;
+
+       while ((env = ub_env_enum(env)) != NULL)
+               printf("%s = %s\n", env, ub_env_get(env));
+
+       /* reset */
+       printf("\n*** Resetting board ***\n");
+       ub_reset();
+       printf("\nHmm, reset returned...?!\n");
+
+       return rv;
+}
+
+void test_dump_sig(struct api_signature *sig)
+{
+       printf("signature:\n");
+       printf("  version\t= %d\n", sig->version);
+       printf("  checksum\t= 0x%08x\n", sig->checksum);
+       printf("  sc entry\t= 0x%08x\n", (unsigned int)sig->syscall);
+}
+
+void test_dump_si(struct sys_info *si)
+{
+       int i;
+
+       printf("sys info:\n");
+       printf("  clkbus\t= 0x%08x\n", (unsigned int)si->clk_bus);
+       printf("  clkcpu\t= 0x%08x\n", (unsigned int)si->clk_cpu);
+       printf("  bar\t\t= 0x%08x\n", (unsigned int)si->bar);
+
+       printf("---\n");
+       for (i = 0; i < si->mr_no; i++) {
+               if (si->mr[i].flags == 0)
+                       break;
+
+               printf("  start\t= 0x%08lx\n", si->mr[i].start);
+               printf("  size\t= 0x%08lx\n", si->mr[i].size);
+
+               switch(si->mr[i].flags & 0x000F) {
+                       case MR_ATTR_FLASH:
+                               printf("  type FLASH\n");
+                               break;
+                       case MR_ATTR_DRAM:
+                               printf("  type DRAM\n");
+                               break;
+                       case MR_ATTR_SRAM:
+                               printf("  type SRAM\n");
+                               break;
+                       default:
+                               printf("  type UNKNOWN\n");
+               }
+               printf("---\n");
+       }
+}
+
+static char *test_stor_typ(int type)
+{
+       if (type & DT_STOR_IDE)
+               return "IDE";
+
+       if (type & DT_STOR_MMC)
+               return "MMC";
+
+       if (type & DT_STOR_SATA)
+               return "SATA";
+
+       if (type & DT_STOR_SCSI)
+               return "SCSI";
+
+       if (type & DT_STOR_USB)
+               return "USB";
+
+       return "Unknown";
+}
+
+void test_dump_buf(void *buf, int len)
+{
+       int i;
+       int line_counter = 0;
+       int sep_flag = 0;
+       int addr = 0;
+
+       printf("%07x:\t", addr);
+
+       for (i = 0; i < len; i++) {
+               if (line_counter++ > 15) {
+                       line_counter = 0;
+                       sep_flag = 0;
+                       addr += 16;
+                       i--;
+                       printf("\n%07x:\t", addr);
+                       continue;
+               }
+
+               if (sep_flag++ > 1) {
+                       sep_flag = 1;
+                       printf(" ");
+               }
+
+               printf("%02x", *((char *)buf++));
+       }
+
+       printf("\n");
+}
+
+void test_dump_di(int handle)
+{
+       int i;
+       struct device_info *di = ub_dev_get(handle);
+
+       printf("device info (%d):\n", handle);
+       printf("  cookie\t= 0x%08x\n", (uint32_t)di->cookie);
+       printf("  type\t\t= 0x%08x\n", di->type);
+
+       if (di->type == DEV_TYP_NET) {
+               printf("  hwaddr\t= ");
+               for (i = 0; i < 6; i++)
+                       printf("%02x ", di->di_net.hwaddr[i]);
+
+               printf("\n");
+
+       } else if (di->type & DEV_TYP_STOR) {
+               printf("  type\t\t= %s\n", test_stor_typ(di->type));
+               printf("  blk size\t\t= %d\n", (unsigned int)di->di_stor.block_size);
+               printf("  blk count\t\t= %d\n", (unsigned int)di->di_stor.block_count);
+       }
+}
diff --git a/examples/api/glue.c b/examples/api/glue.c
new file mode 100644 (file)
index 0000000..eff6a7e
--- /dev/null
@@ -0,0 +1,404 @@
+/*
+ * (C) Copyright 2007-2008 Semihalf, Rafal Jaworowski <raj@semihalf.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 <linux/types.h>
+#include <api_public.h>
+
+#include "glue.h"
+
+static int valid_sig(struct api_signature *sig)
+{
+       uint32_t checksum;
+       struct api_signature s;
+
+       if (sig == NULL)
+               return 0;
+       /*
+        * Clear the checksum field (in the local copy) so as to calculate the
+        * CRC with the same initial contents as at the time when the sig was
+        * produced
+        */
+       s = *sig;
+       s.checksum = 0;
+
+       checksum = crc32(0, (unsigned char *)&s, sizeof(struct api_signature));
+
+       if (checksum != sig->checksum)
+               return 0;
+
+       return 1;
+}
+
+/*
+ * Searches for the U-Boot API signature
+ *
+ * returns 1/0 depending on found/not found result
+ */
+int api_search_sig(struct api_signature **sig)
+{
+       unsigned char *sp;
+       uint32_t search_start = 0;
+       uint32_t search_end = 0;
+
+       if (sig == NULL)
+               return 0;
+
+       if (search_hint == 0)
+               search_hint = 255 * 1024 * 1024;
+
+       search_start = search_hint & ~0x000fffff;
+       search_end = search_start + API_SEARCH_LEN - API_SIG_MAGLEN;
+
+       sp = (unsigned char *)search_start;
+       while ((sp + API_SIG_MAGLEN) < (unsigned char *)search_end) {
+               if (!memcmp(sp, API_SIG_MAGIC, API_SIG_MAGLEN)) {
+                       *sig = (struct api_signature *)sp;
+                       if (valid_sig(*sig))
+                               return 1;
+               }
+               sp += API_SIG_MAGLEN;
+       }
+
+       *sig = NULL;
+       return 0;
+}
+
+/****************************************
+ *
+ * console
+ *
+ ****************************************/
+
+int ub_getc(void)
+{
+       int c;
+
+       if (!syscall(API_GETC, NULL, (uint32_t)&c))
+               return -1;
+
+       return c;
+}
+
+int ub_tstc(void)
+{
+       int t;
+
+       if (!syscall(API_TSTC, NULL, (uint32_t)&t))
+               return -1;
+
+       return t;
+}
+
+void ub_putc(char c)
+{
+       syscall(API_PUTC, NULL, (uint32_t)&c);
+}
+
+void ub_puts(const char *s)
+{
+       syscall(API_PUTS, NULL, (uint32_t)s);
+}
+
+/****************************************
+ *
+ * system
+ *
+ ****************************************/
+
+void ub_reset(void)
+{
+       syscall(API_RESET, NULL);
+}
+
+static struct mem_region mr[UB_MAX_MR];
+static struct sys_info si;
+
+struct sys_info * ub_get_sys_info(void)
+{
+       int err = 0;
+
+       memset(&si, 0, sizeof(struct sys_info));
+       si.mr = mr;
+       si.mr_no = UB_MAX_MR;
+       memset(&mr, 0, sizeof(mr));
+
+       if (!syscall(API_GET_SYS_INFO, &err, (u_int32_t)&si))
+               return NULL;
+
+       return ((err) ? NULL : &si);
+}
+
+/****************************************
+ *
+ * timing
+ *
+ ****************************************/
+
+void ub_udelay(unsigned long usec)
+{
+       syscall(API_UDELAY, NULL, &usec);
+}
+
+unsigned long ub_get_timer(unsigned long base)
+{
+       unsigned long cur;
+
+       if (!syscall(API_GET_TIMER, NULL, &cur, &base))
+               return 0;
+
+       return cur;
+}
+
+
+/****************************************************************************
+ *
+ * devices
+ *
+ * Devices are identified by handles: numbers 0, 1, 2, ..., UB_MAX_DEV-1
+ *
+ ***************************************************************************/
+
+static struct device_info devices[UB_MAX_DEV];
+
+struct device_info * ub_dev_get(int i)
+{
+       return ((i < 0 || i >= UB_MAX_DEV) ? NULL : &devices[i]);
+}
+
+/*
+ * Enumerates the devices: fills out device_info elements in the devices[]
+ * array.
+ *
+ * returns:            number of devices found
+ */
+int ub_dev_enum(void)
+{
+       struct device_info *di;
+       int n = 0;
+
+       memset(&devices, 0, sizeof(struct device_info) * UB_MAX_DEV);
+       di = &devices[0];
+
+       if (!syscall(API_DEV_ENUM, NULL, di))
+               return 0;
+
+       while (di->cookie != NULL) {
+
+               if (++n >= UB_MAX_DEV)
+                       break;
+
+               /* take another device_info */
+               di++;
+
+               /* pass on the previous cookie */
+               di->cookie = devices[n - 1].cookie;
+
+               if (!syscall(API_DEV_ENUM, NULL, di))
+                       return 0;
+       }
+
+       return n;
+}
+
+/*
+ * handle:     0-based id of the device
+ *
+ * returns:    0 when OK, err otherwise
+ */
+int ub_dev_open(int handle)
+{
+       struct device_info *di;
+       int err = 0;
+
+       if (handle < 0 || handle >= UB_MAX_DEV)
+               return API_EINVAL;
+
+       di = &devices[handle];
+
+       if (!syscall(API_DEV_OPEN, &err, di))
+               return -1;
+
+       return err;
+}
+
+int ub_dev_close(int handle)
+{
+       struct device_info *di;
+
+       if (handle < 0 || handle >= UB_MAX_DEV)
+               return API_EINVAL;
+
+       di = &devices[handle];
+       if (!syscall(API_DEV_CLOSE, NULL, di))
+               return -1;
+
+       return 0;
+}
+
+/*
+ *
+ * Validates device for read/write, it has to:
+ *
+ * - have sane handle
+ * - be opened
+ *
+ * returns:    0/1 accordingly
+ */
+static int dev_valid(int handle)
+{
+       if (handle < 0 || handle >= UB_MAX_DEV)
+               return 0;
+
+       if (devices[handle].state != DEV_STA_OPEN)
+               return 0;
+
+       return 1;
+}
+
+static int dev_stor_valid(int handle)
+{
+       if (!dev_valid(handle))
+               return 0;
+
+       if (!(devices[handle].type & DEV_TYP_STOR))
+               return 0;
+
+       return 1;
+}
+
+int ub_dev_read(int handle, void *buf, lbasize_t len, lbastart_t start,
+               lbasize_t *rlen)
+{
+       struct device_info *di;
+       lbasize_t act_len;
+       int err = 0;
+
+       if (!dev_stor_valid(handle))
+               return API_ENODEV;
+
+       di = &devices[handle];
+       if (!syscall(API_DEV_READ, &err, di, buf, &len, &start, &act_len))
+               return API_ESYSC;
+
+       if (!err && rlen)
+               *rlen = act_len;
+
+       return err;
+}
+
+static int dev_net_valid(int handle)
+{
+       if (!dev_valid(handle))
+               return 0;
+
+       if (devices[handle].type != DEV_TYP_NET)
+               return 0;
+
+       return 1;
+}
+
+int ub_dev_recv(int handle, void *buf, int len, int *rlen)
+{
+       struct device_info *di;
+       int err = 0, act_len;
+
+       if (!dev_net_valid(handle))
+               return API_ENODEV;
+
+       di = &devices[handle];
+       if (!syscall(API_DEV_READ, &err, di, buf, &len, &act_len))
+               return API_ESYSC;
+
+       if (!err && rlen)
+               *rlen = act_len;
+
+        return (err);
+}
+
+int ub_dev_send(int handle, void *buf, int len)
+{
+       struct device_info *di;
+       int err = 0;
+
+       if (!dev_net_valid(handle))
+               return API_ENODEV;
+
+       di = &devices[handle];
+       if (!syscall(API_DEV_WRITE, &err, di, buf, &len))
+               return API_ESYSC;
+
+       return err;
+}
+
+/****************************************
+ *
+ * env vars
+ *
+ ****************************************/
+
+char * ub_env_get(const char *name)
+{
+       char *value;
+
+       if (!syscall(API_ENV_GET, NULL, (uint32_t)name, (uint32_t)&value))
+               return NULL;
+
+       return value;
+}
+
+void ub_env_set(const char *name, char *value)
+{
+       syscall(API_ENV_SET, NULL, (uint32_t)name, (uint32_t)value);
+}
+
+static char env_name[256];
+
+const char * ub_env_enum(const char *last)
+{
+       const char *env, *str;
+       int i;
+
+       env = NULL;
+
+       /*
+        * It's OK to pass only the name piece as last (and not the whole
+        * 'name=val' string), since the API_ENUM_ENV call uses envmatch()
+        * internally, which handles such case
+        */
+       if (!syscall(API_ENV_ENUM, NULL, (uint32_t)last, (uint32_t)&env))
+               return NULL;
+
+       if (!env)
+               /* no more env. variables to enumerate */
+               return NULL;
+
+       /* next enumerated env var */
+       memset(env_name, 0, 256);
+       for (i = 0, str = env; *str != '=' && *str != '\0';)
+               env_name[i++] = *str++;
+
+       env_name[i] = '\0';
+
+       return env_name;
+}
diff --git a/examples/api/glue.h b/examples/api/glue.h
new file mode 100644 (file)
index 0000000..6bf47d0
--- /dev/null
@@ -0,0 +1,80 @@
+/*
+ * (C) Copyright 2007 Semihalf
+ *
+ * Written by: Rafal Jaworowski <raj@semihalf.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
+ *
+ */
+
+/*
+ * This is the header file for conveniency wrapper routines (API glue)
+ */
+
+#ifndef _API_GLUE_H_
+#define _API_GLUE_H_
+
+#define API_SEARCH_LEN         (3 * 1024 * 1024)       /* 3MB search range */
+
+#define UB_MAX_MR      5       /* max mem regions number */
+#define UB_MAX_DEV     6       /* max devices number */
+
+extern void *syscall_ptr;
+extern uint32_t search_hint;
+
+int    syscall(int, int *, ...);
+int    api_search_sig(struct api_signature **sig);
+
+/*
+ * The ub_ library calls are part of the application, not U-Boot code!  They
+ * are front-end wrappers that are used by the consumer application: they
+ * prepare arguments for particular syscall and jump to the low level
+ * syscall()
+ */
+
+/* console */
+int    ub_getc(void);
+int    ub_tstc(void);
+void   ub_putc(char c);
+void   ub_puts(const char *s);
+
+/* system */
+void                   ub_reset(void);
+struct sys_info *      ub_get_sys_info(void);
+
+/* time */
+void           ub_udelay(unsigned long);
+unsigned long  ub_get_timer(unsigned long);
+
+/* env vars */
+char *         ub_env_get(const char *name);
+void           ub_env_set(const char *name, char *value);
+const char *   ub_env_enum(const char *last);
+
+/* devices */
+int                    ub_dev_enum(void);
+int                    ub_dev_open(int handle);
+int                    ub_dev_close(int handle);
+int                    ub_dev_read(int handle, void *buf, lbasize_t len,
+                               lbastart_t start, lbasize_t *rlen);
+int                    ub_dev_send(int handle, void *buf, int len);
+int                    ub_dev_recv(int handle, void *buf, int len, int *rlen);
+struct device_info *   ub_dev_get(int);
+
+#endif /* _API_GLUE_H_ */
diff --git a/examples/api/libgenwrap.c b/examples/api/libgenwrap.c
new file mode 100644 (file)
index 0000000..2b62bad
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ * (C) Copyright 2007 Semihalf
+ *
+ * Written by: Rafal Jaworowski <raj@semihalf.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
+ *
+ *
+ * This is is a set of wrappers/stubs that allow to use certain routines from
+ * U-Boot's lib_generic in the standalone app. This way way we can re-use
+ * existing code e.g. operations on strings and similar.
+ *
+ */
+
+#include <common.h>
+#include <linux/types.h>
+#include <api_public.h>
+
+#include "glue.h"
+
+/*
+ * printf() and vprintf() are stolen from u-boot/common/console.c
+ */
+void printf (const char *fmt, ...)
+{
+       va_list args;
+       uint i;
+       char printbuffer[256];
+
+       va_start (args, fmt);
+
+       /* For this to work, printbuffer must be larger than
+        * anything we ever want to print.
+        */
+       i = vsprintf (printbuffer, fmt, args);
+       va_end (args);
+
+       /* Print the string */
+       ub_puts (printbuffer);
+}
+
+void vprintf (const char *fmt, va_list args)
+{
+       uint i;
+       char printbuffer[256];
+
+       /* For this to work, printbuffer must be larger than
+        * anything we ever want to print.
+        */
+       i = vsprintf (printbuffer, fmt, args);
+
+       /* Print the string */
+       ub_puts (printbuffer);
+}
+
+void putc (const char c)
+{
+       ub_putc(c);
+}
+
+void udelay(unsigned long usec)
+{
+       ub_udelay(usec);
+}
+
+void do_reset (void)
+{
+       ub_reset();
+}
+
+void *malloc (size_t len)
+{
+       return NULL;
+}
+
+void hang (void)
+{
+       while (1) ;
+}
diff --git a/examples/eepro100_eeprom.c b/examples/eepro100_eeprom.c
deleted file mode 100644 (file)
index 2b15d05..0000000
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- * Copyright 1998-2001 by Donald Becker.
- * This software may be used and distributed according to the terms of
- * the GNU General Public License (GPL), incorporated herein by reference.
- * Contact the author for use under other terms.
- *
- * This program must be compiled with "-O"!
- * See the bottom of this file for the suggested compile-command.
- *
- * The author may be reached as becker@scyld.com, or C/O
- *  Scyld Computing Corporation
- *  410 Severn Ave., Suite 210
- *  Annapolis MD 21403
- *
- * Common-sense licensing statement: Using any portion of this program in
- * your own program means that you must give credit to the original author
- * and release the resulting code under the GPL.
- */
-
-/* avoid unnecessary memcpy function */
-#define __HAVE_ARCH_MEMCPY
-#define _PPC_STRING_H_
-
-#include <common.h>
-#include <exports.h>
-
-static int reset_eeprom(unsigned long ioaddr, unsigned char *hwaddr);
-
-int eepro100_eeprom(int argc, char *argv[])
-{
-       int ret = 0;
-
-       unsigned char hwaddr1[6] = { 0x00, 0x00, 0x02, 0x03, 0x04, 0x05 };
-       unsigned char hwaddr2[6] = { 0x00, 0x00, 0x02, 0x03, 0x04, 0x06 };
-
-       app_startup(argv);
-
-#if defined(CONFIG_OXC)
-       ret |= reset_eeprom(0x80000000, hwaddr1);
-       ret |= reset_eeprom(0x81000000, hwaddr2);
-#endif
-
-       return ret;
-}
-
-/* Default EEPROM for i82559 */
-static unsigned short default_eeprom[64] = {
-       0x0100, 0x0302, 0x0504, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-       0xffff, 0xffff, 0x40c0, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff,
-       0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-       0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-       0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-       0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-       0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
-       0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff
-};
-
-static unsigned short eeprom[256];
-
-static int eeprom_size = 64;
-static int eeprom_addr_size = 6;
-
-static int debug = 0;
-
-static inline unsigned short swap16(unsigned short x)
-{
-       return (((x & 0xff) << 8) | ((x & 0xff00) >> 8));
-}
-
-static inline void outw(short data, long addr)
-{
-       *(volatile short *)(addr) = swap16(data);
-}
-
-static inline short inw(long addr)
-{
-       return swap16(*(volatile short *)(addr));
-}
-
-static inline void *memcpy(void *dst, const void *src, unsigned int len)
-{
-       char *ret = dst;
-       while (len-- > 0) {
-               *ret++ = *((char *)src);
-               src++;
-       }
-       return (void *)ret;
-}
-
-/* The EEPROM commands include the alway-set leading bit. */
-#define EE_WRITE_CMD   (5)
-#define EE_READ_CMD            (6)
-#define EE_ERASE_CMD   (7)
-
-/* Serial EEPROM section. */
-#define EE_SHIFT_CLK   0x01    /* EEPROM shift clock. */
-#define EE_CS                  0x02    /* EEPROM chip select. */
-#define EE_DATA_WRITE  0x04    /* EEPROM chip data in. */
-#define EE_DATA_READ   0x08    /* EEPROM chip data out. */
-#define EE_ENB                 (0x4800 | EE_CS)
-#define EE_WRITE_0             0x4802
-#define EE_WRITE_1             0x4806
-#define EE_OFFSET              14
-
-/* Delay between EEPROM clock transitions. */
-#define eeprom_delay(ee_addr)  inw(ee_addr)
-
-/* Wait for the EEPROM to finish the previous operation. */
-static int eeprom_busy_poll(long ee_ioaddr)
-{
-       int i;
-       outw(EE_ENB, ee_ioaddr);
-       for (i = 0; i < 10000; i++)                     /* Typical 2000 ticks */
-               if (inw(ee_ioaddr) & EE_DATA_READ)
-                       break;
-       return i;
-}
-
-/* This executes a generic EEPROM command, typically a write or write enable.
-   It returns the data output from the EEPROM, and thus may also be used for
-   reads. */
-static int do_eeprom_cmd(long ioaddr, int cmd, int cmd_len)
-{
-       unsigned retval = 0;
-       long ee_addr = ioaddr + EE_OFFSET;
-
-       if (debug > 1)
-               printf(" EEPROM op 0x%x: ", cmd);
-
-       outw(EE_ENB | EE_SHIFT_CLK, ee_addr);
-
-       /* Shift the command bits out. */
-       do {
-               short dataval = (cmd & (1 << cmd_len)) ? EE_WRITE_1 : EE_WRITE_0;
-               outw(dataval, ee_addr);
-               eeprom_delay(ee_addr);
-               if (debug > 2)
-                       printf("%X", inw(ee_addr) & 15);
-               outw(dataval | EE_SHIFT_CLK, ee_addr);
-               eeprom_delay(ee_addr);
-               retval = (retval << 1) | ((inw(ee_addr) & EE_DATA_READ) ? 1 : 0);
-       } while (--cmd_len >= 0);
-#if 0
-       outw(EE_ENB, ee_addr);
-#endif
-       /* Terminate the EEPROM access. */
-       outw(EE_ENB & ~EE_CS, ee_addr);
-       if (debug > 1)
-               printf(" EEPROM result is 0x%5.5x.\n", retval);
-       return retval;
-}
-
-static int read_eeprom(long ioaddr, int location, int addr_len)
-{
-       return do_eeprom_cmd(ioaddr, ((EE_READ_CMD << addr_len) | location)
-               << 16 , 3 + addr_len + 16) & 0xffff;
-}
-
-static void write_eeprom(long ioaddr, int index, int value, int addr_len)
-{
-       long ee_ioaddr = ioaddr + EE_OFFSET;
-       int i;
-
-       /* Poll for previous op finished. */
-       eeprom_busy_poll(ee_ioaddr);                    /* Typical 0 ticks */
-       /* Enable programming modes. */
-       do_eeprom_cmd(ioaddr, (0x4f << (addr_len-4)), 3 + addr_len);
-       /* Do the actual write. */
-       do_eeprom_cmd(ioaddr,
-                                 (((EE_WRITE_CMD<<addr_len) | index)<<16) | (value & 0xffff),
-                                 3 + addr_len + 16);
-       /* Poll for write finished. */
-       i = eeprom_busy_poll(ee_ioaddr);                        /* Typical 2000 ticks */
-       if (debug)
-               printf(" Write finished after %d ticks.\n", i);
-       /* Disable programming. This command is not instantaneous, so we check
-          for busy before the next op. */
-       do_eeprom_cmd(ioaddr, (0x40 << (addr_len-4)), 3 + addr_len);
-       eeprom_busy_poll(ee_ioaddr);
-}
-
-static int reset_eeprom(unsigned long ioaddr, unsigned char *hwaddr)
-{
-       unsigned short checksum = 0;
-       int size_test;
-       int i;
-
-       printf("Resetting i82559 EEPROM @ 0x%08lX ... ", ioaddr);
-
-       size_test = do_eeprom_cmd(ioaddr, (EE_READ_CMD << 8) << 16, 27);
-       eeprom_addr_size = (size_test & 0xffe0000) == 0xffe0000 ? 8 : 6;
-       eeprom_size = 1 << eeprom_addr_size;
-
-       memcpy(eeprom, default_eeprom, sizeof default_eeprom);
-
-       for (i = 0; i < 3; i++)
-               eeprom[i] = (hwaddr[i*2+1]<<8) + hwaddr[i*2];
-
-       /* Recalculate the checksum. */
-       for (i = 0; i < eeprom_size - 1; i++)
-               checksum += eeprom[i];
-       eeprom[i] = 0xBABA - checksum;
-
-       for (i = 0; i < eeprom_size; i++)
-               write_eeprom(ioaddr, i, eeprom[i], eeprom_addr_size);
-
-       for (i = 0; i < eeprom_size; i++)
-               if (read_eeprom(ioaddr, i, eeprom_addr_size) != eeprom[i]) {
-                       printf("failed\n");
-                       return 1;
-               }
-
-       printf("done\n");
-       return 0;
-}
diff --git a/examples/hello_world.c b/examples/hello_world.c
deleted file mode 100644 (file)
index 9317f6d..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * (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 <exports.h>
-
-int hello_world (int argc, char *argv[])
-{
-       int i;
-
-       /* Print the ABI version */
-       app_startup(argv);
-       printf ("Example expects ABI version %d\n", XF_VERSION);
-       printf ("Actual U-Boot ABI version %d\n", (int)get_version());
-
-       printf ("Hello World\n");
-
-       printf ("argc = %d\n", argc);
-
-       for (i=0; i<=argc; ++i) {
-               printf ("argv[%d] = \"%s\"\n",
-                       i,
-                       argv[i] ? argv[i] : "<NULL>");
-       }
-
-       printf ("Hit any key to exit ... ");
-       while (!tstc())
-               ;
-       /* consume input */
-       (void) getc();
-
-       printf ("\n\n");
-       return (0);
-}
diff --git a/examples/interrupt.c b/examples/interrupt.c
deleted file mode 100644 (file)
index f3061d1..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * (C) Copyright 2006
- * Detlev Zundel, DENX Software Engineering, dzu@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
- *
- * This is a very simple standalone application demonstrating
- * catching IRQs on the MPC52xx architecture.
- *
- * The interrupt to be intercepted can be specified as an argument
- * to the application.  Specifying nothing will intercept IRQ1 on the
- * MPC5200 platform.  On the CR825 carrier board from MicroSys this
- * maps to the ABORT switch :)
- *
- * Note that the specified vector is only a logical number specified
- * by the respective header file.
- */
-
-#include <common.h>
-#include <exports.h>
-#include <config.h>
-
-#if defined(CONFIG_MPC5xxx)
-#define DFL_IRQ MPC5XXX_IRQ1
-#else
-#define DFL_IRQ 0
-#endif
-
-static void irq_handler (void *arg);
-
-int interrupt (int argc, char *argv[])
-{
-       int c, irq = -1;
-
-       app_startup (argv);
-
-       if (argc > 1)
-               irq = simple_strtoul (argv[1], NULL, 0);
-       if ((irq < 0) || (irq > NR_IRQS))
-               irq = DFL_IRQ;
-
-       printf ("Installing handler for irq vector %d and doing busy wait\n",
-               irq);
-       printf ("Press 'q' to quit\n");
-
-       /* Install interrupt handler */
-       install_hdlr (irq, irq_handler, NULL);
-       while ((c = getc ()) != 'q') {
-               printf ("Ok, ok, I am still alive!\n");
-       }
-
-       free_hdlr (irq);
-       printf ("\nInterrupt handler has been uninstalled\n");
-
-       return (0);
-}
-
-/*
- * Handler for interrupt
- */
-static void irq_handler (void *arg)
-{
-       /* just for demonstration */
-       printf ("+");
-}
diff --git a/examples/mem_to_mem_idma2intr.c b/examples/mem_to_mem_idma2intr.c
deleted file mode 100644 (file)
index 15779d0..0000000
+++ /dev/null
@@ -1,384 +0,0 @@
-/* The dpalloc function used and implemented in this file was derieved
- * from PPCBoot/U-Boot file "cpu/mpc8260/commproc.c".
- */
-
-/* Author: Arun Dharankar <ADharankar@ATTBI.Com>
- * This example is meant to only demonstrate how the IDMA could be used.
- */
-
-/*
- * This file is based on "arch/ppc/8260_io/commproc.c" - here is it's
- * copyright notice:
- *
- * General Purpose functions for the global management of the
- * 8260 Communication Processor Module.
- * Copyright (c) 1999 Dan Malek (dmalek@jlc.net)
- * Copyright (c) 2000 MontaVista Software, Inc (source@mvista.com)
- *  2.3.99 Updates
- *
- * In addition to the individual control of the communication
- * channels, there are a few functions that globally affect the
- * communication processor.
- *
- * Buffer descriptors must be allocated from the dual ported memory
- * space.  The allocator for that is here.  When the communication
- * process is reset, we reclaim the memory available.  There is
- * currently no deallocator for this memory.
- */
-
-
-#include <common.h>
-#include <exports.h>
-
-DECLARE_GLOBAL_DATA_PTR;
-
-#define STANDALONE
-
-#ifndef STANDALONE                     /* Linked into/Part of  PPCBoot */
-#include <command.h>
-#include <watchdog.h>
-#else                                  /* Standalone app of PPCBoot */
-#define WATCHDOG_RESET() {                                             \
-                       *(ushort *)(CONFIG_SYS_IMMR + 0x1000E) = 0x556c;        \
-                       *(ushort *)(CONFIG_SYS_IMMR + 0x1000E) = 0xaa39;        \
-               }
-#endif /* STANDALONE */
-
-static int debug = 1;
-
-#define DEBUG(fmt, args...)     {                                      \
-       if(debug != 0) {                                                \
-               printf("[%s %d %s]: ",__FILE__,__LINE__,__FUNCTION__);  \
-               printf(fmt, ##args);                                    \
-       }                                                               \
-}
-
-#define CPM_CR_IDMA1_SBLOCK  (0x14)
-#define CPM_CR_IDMA2_SBLOCK  (0x15)
-#define CPM_CR_IDMA3_SBLOCK  (0x16)
-#define CPM_CR_IDMA4_SBLOCK  (0x17)
-#define CPM_CR_IDMA1_PAGE    (0x07)
-#define CPM_CR_IDMA2_PAGE    (0x08)
-#define CPM_CR_IDMA3_PAGE    (0x09)
-#define CPM_CR_IDMA4_PAGE    (0x0a)
-#define PROFF_IDMA1_BASE     ((uint)0x87fe)
-#define PROFF_IDMA2_BASE     ((uint)0x88fe)
-#define PROFF_IDMA3_BASE     ((uint)0x89fe)
-#define PROFF_IDMA4_BASE     ((uint)0x8afe)
-
-#define CPM_CR_INIT_TRX     ((ushort)0x0000)
-#define CPM_CR_FLG  ((ushort)0x0001)
-
-#define mk_cr_cmd(PG, SBC, MCN, OP) \
-    ((PG << 26) | (SBC << 21) | (MCN << 6) | OP)
-
-
-#pragma pack(1)
-typedef struct ibdbits {
-       unsigned b_valid:1;
-       unsigned b_resv1:1;
-       unsigned b_wrap:1;
-       unsigned b_interrupt:1;
-       unsigned b_last:1;
-       unsigned b_resv2:1;
-       unsigned b_cm:1;
-       unsigned b_resv3:2;
-       unsigned b_sdn:1;
-       unsigned b_ddn:1;
-       unsigned b_dgbl:1;
-       unsigned b_dbo:2;
-       unsigned b_resv4:1;
-       unsigned b_ddtb:1;
-       unsigned b_resv5:2;
-       unsigned b_sgbl:1;
-       unsigned b_sbo:2;
-       unsigned b_resv6:1;
-       unsigned b_sdtb:1;
-       unsigned b_resv7:9;
-} ibdbits_t;
-
-#pragma pack(1)
-typedef union ibdbitsu {
-       ibdbits_t b;
-       uint i;
-} ibdbitsu_t;
-
-#pragma pack(1)
-typedef struct idma_buf_desc {
-       ibdbitsu_t ibd_bits;            /* Status and Control */
-       uint ibd_datlen;                /* Data length in buffer */
-       uint ibd_sbuf;                  /* Source buffer addr in host mem */
-       uint ibd_dbuf;                  /* Destination buffer addr in host mem */
-} ibd_t;
-
-
-#pragma pack(1)
-typedef struct dcmbits {
-       unsigned b_fb:1;
-       unsigned b_lp:1;
-       unsigned b_resv1:3;
-       unsigned b_tc2:1;
-       unsigned b_resv2:1;
-       unsigned b_wrap:3;
-       unsigned b_sinc:1;
-       unsigned b_dinc:1;
-       unsigned b_erm:1;
-       unsigned b_dt:1;
-       unsigned b_sd:2;
-} dcmbits_t;
-
-#pragma pack(1)
-typedef union dcmbitsu {
-       dcmbits_t b;
-       ushort i;
-} dcmbitsu_t;
-
-#pragma pack(1)
-typedef struct pram_idma {
-       ushort pi_ibase;
-       dcmbitsu_t pi_dcmbits;
-       ushort pi_ibdptr;
-       ushort pi_dprbuf;
-       ushort pi_bufinv;               /* internal to CPM */
-       ushort pi_ssmax;
-       ushort pi_dprinptr;             /* internal to CPM */
-       ushort pi_sts;
-       ushort pi_dproutptr;            /* internal to CPM */
-       ushort pi_seob;
-       ushort pi_deob;
-       ushort pi_dts;
-       ushort pi_retadd;
-       ushort pi_resv1;                /* internal to CPM */
-       uint pi_bdcnt;
-       uint pi_sptr;
-       uint pi_dptr;
-       uint pi_istate;
-} pram_idma_t;
-
-
-volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
-volatile ibd_t *bdf;
-volatile pram_idma_t *piptr;
-
-volatile int dmadone;
-volatile int *dmadonep = &dmadone;
-void dmadone_handler (void *);
-
-int idma_init (void);
-void idma_start (int, int, int, uint, uint, int);
-uint dpalloc (uint, uint);
-
-
-uint dpinit_done = 0;
-
-
-#ifdef STANDALONE
-int ctrlc (void)
-{
-       if (tstc()) {
-               switch (getc ()) {
-               case 0x03:              /* ^C - Control C */
-                       return 1;
-               default:
-                       break;
-               }
-       }
-       return 0;
-}
-void * memset(void * s,int c,size_t count)
-{
-       char *xs = (char *) s;
-       while (count--)
-               *xs++ = c;
-       return s;
-}
-int memcmp(const void * cs,const void * ct,size_t count)
-{
-       const unsigned char *su1, *su2;
-       int res = 0;
-       for( su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)
-               if ((res = *su1 - *su2) != 0)
-                       break;
-       return res;
-}
-#endif /* STANDALONE */
-
-#ifdef STANDALONE
-int mem_to_mem_idma2intr (int argc, char *argv[])
-#else
-int do_idma (bd_t * bd, int argc, char *argv[])
-#endif /* STANDALONE */
-{
-       int i;
-
-       app_startup(argv);
-       dpinit_done = 0;
-
-       idma_init ();
-
-       DEBUG ("Installing dma handler\n");
-       install_hdlr (7, dmadone_handler, (void *) bdf);
-
-       memset ((void *) 0x100000, 'a', 512);
-       memset ((void *) 0x200000, 'b', 512);
-
-       for (i = 0; i < 32; i++) {
-               printf ("Startin IDMA, iteration=%d\n", i);
-               idma_start (1, 1, 512, 0x100000, 0x200000, 3);
-       }
-
-       DEBUG ("Uninstalling dma handler\n");
-       free_hdlr (7);
-
-       return 0;
-}
-
-void
-idma_start (int sinc, int dinc, int sz, uint sbuf, uint dbuf, int ttype)
-{
-       /* ttype is for M-M, M-P, P-M or P-P: not used for now */
-
-       piptr->pi_istate = 0;   /* manual says: clear it before every START_IDMA */
-       piptr->pi_dcmbits.b.b_resv1 = 0;
-
-       if (sinc == 1)
-               piptr->pi_dcmbits.b.b_sinc = 1;
-       else
-               piptr->pi_dcmbits.b.b_sinc = 0;
-
-       if (dinc == 1)
-               piptr->pi_dcmbits.b.b_dinc = 1;
-       else
-               piptr->pi_dcmbits.b.b_dinc = 0;
-
-       piptr->pi_dcmbits.b.b_erm = 0;
-       piptr->pi_dcmbits.b.b_sd = 0x00;        /* M-M */
-
-       bdf->ibd_sbuf = sbuf;
-       bdf->ibd_dbuf = dbuf;
-       bdf->ibd_bits.b.b_cm = 0;
-       bdf->ibd_bits.b.b_interrupt = 1;
-       bdf->ibd_bits.b.b_wrap = 1;
-       bdf->ibd_bits.b.b_last = 1;
-       bdf->ibd_bits.b.b_sdn = 0;
-       bdf->ibd_bits.b.b_ddn = 0;
-       bdf->ibd_bits.b.b_dgbl = 0;
-       bdf->ibd_bits.b.b_ddtb = 0;
-       bdf->ibd_bits.b.b_sgbl = 0;
-       bdf->ibd_bits.b.b_sdtb = 0;
-       bdf->ibd_bits.b.b_dbo = 1;
-       bdf->ibd_bits.b.b_sbo = 1;
-       bdf->ibd_bits.b.b_valid = 1;
-       bdf->ibd_datlen = 512;
-
-       *dmadonep = 0;
-
-       immap->im_sdma.sdma_idmr2 = (uchar) 0xf;
-
-       immap->im_cpm.cp_cpcr = mk_cr_cmd (CPM_CR_IDMA2_PAGE,
-                                          CPM_CR_IDMA2_SBLOCK, 0x0,
-                                          0x9) | 0x00010000;
-
-       while (*dmadonep != 1) {
-               if (ctrlc ()) {
-                       DEBUG ("\nInterrupted waiting for DMA interrupt.\n");
-                       goto done;
-               }
-               printf ("Waiting for DMA interrupt (dmadone=%d b_valid = %d)...\n",
-                       dmadone, bdf->ibd_bits.b.b_valid);
-               udelay (1000000);
-       }
-       printf ("DMA complete notification received!\n");
-
-  done:
-       DEBUG ("memcmp(0x%08x, 0x%08x, 512) = %d\n",
-               sbuf, dbuf, memcmp ((void *) sbuf, (void *) dbuf, 512));
-
-       return;
-}
-
-#define MAX_INT_BUFSZ  64
-#define DCM_WRAP        0      /* MUST be consistant with MAX_INT_BUFSZ */
-
-int idma_init (void)
-{
-       uint memaddr;
-
-       immap->im_cpm.cp_rccr &= ~0x00F3FFFF;
-       immap->im_cpm.cp_rccr |= 0x00A00A00;
-
-       memaddr = dpalloc (sizeof (pram_idma_t), 64);
-
-       *(volatile ushort *) &immap->im_dprambase[PROFF_IDMA2_BASE] = memaddr;
-       piptr = (volatile pram_idma_t *) ((uint) (immap) + memaddr);
-
-       piptr->pi_resv1 = 0;            /* manual says: clear it */
-       piptr->pi_dcmbits.b.b_fb = 0;
-       piptr->pi_dcmbits.b.b_lp = 1;
-       piptr->pi_dcmbits.b.b_erm = 0;
-       piptr->pi_dcmbits.b.b_dt = 0;
-
-       memaddr = (uint) dpalloc (sizeof (ibd_t), 64);
-       piptr->pi_ibase = piptr->pi_ibdptr = (volatile short) memaddr;
-       bdf = (volatile ibd_t *) ((uint) (immap) + memaddr);
-       bdf->ibd_bits.b.b_valid = 0;
-
-       memaddr = (uint) dpalloc (64, 64);
-       piptr->pi_dprbuf = (volatile ushort) memaddr;
-       piptr->pi_dcmbits.b.b_wrap = 4;
-       piptr->pi_ssmax = 32;
-
-       piptr->pi_sts = piptr->pi_ssmax;
-       piptr->pi_dts = piptr->pi_ssmax;
-
-       return 1;
-}
-
-void dmadone_handler (void *arg)
-{
-       immap->im_sdma.sdma_idmr2 = (uchar) 0x0;
-
-       *dmadonep = 1;
-
-       return;
-}
-
-
-static uint dpbase = 0;
-
-uint dpalloc (uint size, uint align)
-{
-       volatile immap_t *immr = (immap_t *) CONFIG_SYS_IMMR;
-       uint retloc;
-       uint align_mask, off;
-       uint savebase;
-
-       /* Pointer to initial global data area */
-
-       if (dpinit_done == 0) {
-               dpbase = gd->dp_alloc_base;
-               dpinit_done = 1;
-       }
-
-       align_mask = align - 1;
-       savebase = dpbase;
-
-       if ((off = (dpbase & align_mask)) != 0)
-               dpbase += (align - off);
-
-       if ((off = size & align_mask) != 0)
-               size += align - off;
-
-       if ((dpbase + size) >= gd->dp_alloc_top) {
-               dpbase = savebase;
-               printf ("dpalloc: ran out of dual port ram!");
-               return 0;
-       }
-
-       retloc = dpbase;
-       dpbase += size;
-
-       memset ((void *) &immr->im_dprambase[retloc], 0, size);
-
-       return (retloc);
-}
diff --git a/examples/mips.lds b/examples/mips.lds
deleted file mode 100644 (file)
index 717b201..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * (C) Copyright 2003
- * Wolfgang Denk 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_FORMAT("elf32-bigmips", "elf32-bigmips", "elf32-bigmips")
-*/
-OUTPUT_FORMAT("elf32-tradbigmips", "elf32-tradbigmips", "elf32-tradbigmips")
-OUTPUT_ARCH(mips)
-SECTIONS
-{
-       .text       :
-       {
-         *(.text)
-       }
-
-       . = ALIGN(4);
-       .rodata  : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
-
-       . = ALIGN(4);
-       .data  : { *(.data) }
-
-       . = .;
-       _gp = ALIGN(16) + 0x7ff0;
-
-       .got : {
-         __got_start = .;
-         *(.got)
-         __got_end = .;
-       }
-
-       .sdata  : { *(.sdata) }
-
-       . = ALIGN(4);
-       __bss_start = .;
-       .sbss (NOLOAD) : { *(.sbss) }
-       .bss (NOLOAD)  : { *(.bss) . = ALIGN(4); }
-
-       _end = .;
-}
diff --git a/examples/nios.lds b/examples/nios.lds
deleted file mode 100644 (file)
index 4c1080b..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * (C) Copyright 2003, Psyent Corporation <www.psyent.com>
- * Scott McNutt <smcnutt@psyent.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
- */
-
-
-OUTPUT_FORMAT("elf32-nios")
-OUTPUT_ARCH(nios)
-ENTRY(_start)
-
-SECTIONS
-{
-       .text :
-       {
-         *(.text)
-       }
-       __text_end = .;
-
-       . = ALIGN(4);
-       .rodata :
-       {
-               *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
-       }
-       __rodata_end = .;
-
-       . = ALIGN(4);
-       .data :
-       {
-               *(.data)
-       }
-       . = ALIGN(4);
-       __data_end = .;
-
-       __bss_start = .;
-       . = ALIGN(4);
-       .bss (NOLOAD) :
-       {
-               *(.bss)
-       }
-       . = ALIGN(4);
-       __bss_end = .;
-       _end = .;
-}
diff --git a/examples/nios2.lds b/examples/nios2.lds
deleted file mode 100644 (file)
index a3e5ea8..0000000
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * (C) Copyright 2004, Psyent Corporation <www.psyent.com>
- * Scott McNutt <smcnutt@psyent.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
- */
-
-
-OUTPUT_FORMAT("elf32-littlenios2")
-OUTPUT_ARCH(nios2)
-ENTRY(_start)
-
-SECTIONS
-{
-       .text :
-       {
-         *(.text)
-         *(.text.*)
-         *(.gnu.linkonce.t*)
-         *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
-         *(.gnu.linkonce.r*)
-       }
-       . = ALIGN (4);
-       _etext = .;
-       PROVIDE (etext = .);
-
-       /* INIT DATA sections - "Small" data (see the gcc -G option)
-        * is always gp-relative. Here we make all init data sections
-        * adjacent to simplify the startup code -- and provide
-        * the global pointer for gp-relative access.
-        */
-       _data = .;
-       .data :
-       {
-         *(.data)
-         *(.data.*)
-         *(.gnu.linkonce.d*)
-       }
-
-       . = ALIGN(16);
-       _gp = .;                        /* Global pointer addr */
-       PROVIDE (gp = .);
-
-       .sdata :
-       {
-         *(.sdata)
-         *(.sdata.*)
-         *(.gnu.linkonce.s.*)
-       }
-       . = ALIGN(4);
-
-       _edata = .;
-       PROVIDE (edata = .);
-
-       /* UNINIT DATA - Small uninitialized data is first so it's
-        * adjacent to sdata and can be referenced via gp. The normal
-        * bss follows. We keep it adjacent to simplify init code.
-        */
-       __bss_start = .;
-       .sbss (NOLOAD) :
-       {
-         *(.sbss)
-         *(.sbss.*)
-         *(.gnu.linkonce.sb.*)
-         *(.scommon)
-       }
-       . = ALIGN(4);
-       .bss (NOLOAD) :
-       {
-         *(.bss)
-         *(.bss.*)
-         *(.dynbss)
-         *(COMMON)
-         *(.scommon)
-       }
-       . = ALIGN(4);
-       _end = .;
-       PROVIDE (end = .);
-
-       /* CMD TABLE - uboot command sections
-        */
-       . = .;
-       __uboot_cmd_start = .;
-       .u_boot_cmd :
-       {
-         *(.u_boot_cmd)
-       }
-       . = ALIGN(4);
-       __u_boot_cmd_end = .;
-
-       /* DEBUG -- symbol table, string table, etc. etc.
-        */
-       .stab 0 : { *(.stab) }
-       .stabstr 0 : { *(.stabstr) }
-       .stab.excl 0 : { *(.stab.excl) }
-       .stab.exclstr 0 : { *(.stab.exclstr) }
-       .stab.index 0 : { *(.stab.index) }
-       .stab.indexstr 0 : { *(.stab.indexstr) }
-       .comment 0 : { *(.comment) }
-       .debug          0 : { *(.debug) }
-       .line           0 : { *(.line) }
-       .debug_srcinfo  0 : { *(.debug_srcinfo) }
-       .debug_sfnames  0 : { *(.debug_sfnames) }
-       .debug_aranges  0 : { *(.debug_aranges) }
-       .debug_pubnames 0 : { *(.debug_pubnames) }
-       .debug_info     0 : { *(.debug_info) }
-       .debug_abbrev   0 : { *(.debug_abbrev) }
-       .debug_line     0 : { *(.debug_line) }
-       .debug_frame    0 : { *(.debug_frame) }
-       .debug_str      0 : { *(.debug_str) }
-       .debug_loc      0 : { *(.debug_loc) }
-       .debug_macinfo  0 : { *(.debug_macinfo) }
-       .debug_weaknames 0 : { *(.debug_weaknames) }
-       .debug_funcnames 0 : { *(.debug_funcnames) }
-       .debug_typenames 0 : { *(.debug_typenames) }
-       .debug_varnames  0 : { *(.debug_varnames) }
-}
diff --git a/examples/ppc_longjmp.S b/examples/ppc_longjmp.S
deleted file mode 100644 (file)
index 5ca6f6f..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-/* longjmp for PowerPC.
-   Copyright (C) 1995, 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library 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
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#include <ppc_asm.tmpl>
-
-# define JB_GPR1   0  /* Also known as the stack pointer */
-# define JB_GPR2   1
-# define JB_LR     2  /* The address we will return to */
-# define JB_GPRS   3  /* GPRs 14 through 31 are saved, 18 in total */
-# define JB_CR     21 /* Condition code registers. */
-# define JB_FPRS   22 /* FPRs 14 through 31 are saved, 18*2 words total */
-# define JB_SIZE   (58*4)
-
-#define FP(x...) x
-#define FP(x...) x
-
-.globl      ppc_longjmp;
-
-ppc_longjmp:
-       lwz r1,(JB_GPR1*4)(r3)
-       lwz r2,(JB_GPR2*4)(r3)
-       lwz r0,(JB_LR*4)(r3)
-       lwz r14,((JB_GPRS+0)*4)(r3)
-FP(    lfd 14,((JB_FPRS+0*2)*4)(r3))
-       lwz r15,((JB_GPRS+1)*4)(r3)
-FP(    lfd 15,((JB_FPRS+1*2)*4)(r3))
-       lwz r16,((JB_GPRS+2)*4)(r3)
-FP(    lfd 16,((JB_FPRS+2*2)*4)(r3))
-       lwz r17,((JB_GPRS+3)*4)(r3)
-FP(    lfd 17,((JB_FPRS+3*2)*4)(r3))
-       lwz r18,((JB_GPRS+4)*4)(r3)
-FP(    lfd 18,((JB_FPRS+4*2)*4)(r3))
-       lwz r19,((JB_GPRS+5)*4)(r3)
-FP(    lfd 19,((JB_FPRS+5*2)*4)(r3))
-       lwz r20,((JB_GPRS+6)*4)(r3)
-FP(    lfd 20,((JB_FPRS+6*2)*4)(r3))
-       mtlr r0
-       lwz r21,((JB_GPRS+7)*4)(r3)
-FP(    lfd 21,((JB_FPRS+7*2)*4)(r3))
-       lwz r22,((JB_GPRS+8)*4)(r3)
-FP(    lfd 22,((JB_FPRS+8*2)*4)(r3))
-       lwz r0,(JB_CR*4)(r3)
-       lwz r23,((JB_GPRS+9)*4)(r3)
-FP(    lfd 23,((JB_FPRS+9*2)*4)(r3))
-       lwz r24,((JB_GPRS+10)*4)(r3)
-FP(    lfd 24,((JB_FPRS+10*2)*4)(r3))
-       lwz r25,((JB_GPRS+11)*4)(r3)
-FP(    lfd 25,((JB_FPRS+11*2)*4)(r3))
-       mtcrf 0xFF,r0
-       lwz r26,((JB_GPRS+12)*4)(r3)
-FP(    lfd 26,((JB_FPRS+12*2)*4)(r3))
-       lwz r27,((JB_GPRS+13)*4)(r3)
-FP(    lfd 27,((JB_FPRS+13*2)*4)(r3))
-       lwz r28,((JB_GPRS+14)*4)(r3)
-FP(    lfd 28,((JB_FPRS+14*2)*4)(r3))
-       lwz r29,((JB_GPRS+15)*4)(r3)
-FP(    lfd 29,((JB_FPRS+15*2)*4)(r3))
-       lwz r30,((JB_GPRS+16)*4)(r3)
-FP(    lfd 30,((JB_FPRS+16*2)*4)(r3))
-       lwz r31,((JB_GPRS+17)*4)(r3)
-FP(    lfd 31,((JB_FPRS+17*2)*4)(r3))
-       mr r3,r4
-       blr
diff --git a/examples/ppc_setjmp.S b/examples/ppc_setjmp.S
deleted file mode 100644 (file)
index 421abfd..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-/* setjmp for PowerPC.
-   Copyright (C) 1995, 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library 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
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#include <ppc_asm.tmpl>
-
-# define JB_GPR1   0  /* Also known as the stack pointer */
-# define JB_GPR2   1
-# define JB_LR     2  /* The address we will return to */
-# define JB_GPRS   3  /* GPRs 14 through 31 are saved, 18 in total */
-# define JB_CR     21 /* Condition code registers. */
-# define JB_FPRS   22 /* FPRs 14 through 31 are saved, 18*2 words total */
-# define JB_SIZE   (58*4)
-
-#define FP(x...) x
-
-.globl      setctxsp;
-setctxsp:
-       mr  r1, r3
-       blr
-
-.globl      ppc_setjmp;
-ppc_setjmp:
-       stw  r1,(JB_GPR1*4)(3)
-       mflr r0
-       stw  r2,(JB_GPR2*4)(3)
-       stw  r14,((JB_GPRS+0)*4)(3)
-FP(    stfd 14,((JB_FPRS+0*2)*4)(3))
-       stw  r0,(JB_LR*4)(3)
-       stw  r15,((JB_GPRS+1)*4)(3)
-FP(    stfd 15,((JB_FPRS+1*2)*4)(3))
-       mfcr r0
-       stw  r16,((JB_GPRS+2)*4)(3)
-FP(    stfd 16,((JB_FPRS+2*2)*4)(3))
-       stw  r0,(JB_CR*4)(3)
-       stw  r17,((JB_GPRS+3)*4)(3)
-FP(    stfd 17,((JB_FPRS+3*2)*4)(3))
-       stw  r18,((JB_GPRS+4)*4)(3)
-FP(    stfd 18,((JB_FPRS+4*2)*4)(3))
-       stw  r19,((JB_GPRS+5)*4)(3)
-FP(    stfd 19,((JB_FPRS+5*2)*4)(3))
-       stw  r20,((JB_GPRS+6)*4)(3)
-FP(    stfd 20,((JB_FPRS+6*2)*4)(3))
-       stw  r21,((JB_GPRS+7)*4)(3)
-FP(    stfd 21,((JB_FPRS+7*2)*4)(3))
-       stw  r22,((JB_GPRS+8)*4)(3)
-FP(    stfd 22,((JB_FPRS+8*2)*4)(3))
-       stw  r23,((JB_GPRS+9)*4)(3)
-FP(    stfd 23,((JB_FPRS+9*2)*4)(3))
-       stw  r24,((JB_GPRS+10)*4)(3)
-FP(    stfd 24,((JB_FPRS+10*2)*4)(3))
-       stw  r25,((JB_GPRS+11)*4)(3)
-FP(    stfd 25,((JB_FPRS+11*2)*4)(3))
-       stw  r26,((JB_GPRS+12)*4)(3)
-FP(    stfd 26,((JB_FPRS+12*2)*4)(3))
-       stw  r27,((JB_GPRS+13)*4)(3)
-FP(    stfd 27,((JB_FPRS+13*2)*4)(3))
-       stw  r28,((JB_GPRS+14)*4)(3)
-FP(    stfd 28,((JB_FPRS+14*2)*4)(3))
-       stw  r29,((JB_GPRS+15)*4)(3)
-FP(    stfd 29,((JB_FPRS+15*2)*4)(3))
-       stw  r30,((JB_GPRS+16)*4)(3)
-FP(    stfd 30,((JB_FPRS+16*2)*4)(3))
-       stw  r31,((JB_GPRS+17)*4)(3)
-FP(    stfd 31,((JB_FPRS+17*2)*4)(3))
-
-       li 3, 0
-       blr
diff --git a/examples/sched.c b/examples/sched.c
deleted file mode 100644 (file)
index b32766f..0000000
+++ /dev/null
@@ -1,369 +0,0 @@
-/*
- * 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 <exports.h>
-
-/*
- * Author: Arun Dharankar <ADharankar@ATTBI.Com>
- *
- * A very simple thread/schedular model:
- *   - only one master thread, and no parent child relation maintained
- *   - parent thread cannot be stopped or deleted
- *   - no permissions or credentials
- *   - no elaborate safety checks
- *   - cooperative multi threading
- *   - Simple round-robin scheduleing with no priorities
- *   - no metering/statistics collection
- *
- * Basic idea of implementing this is to allow more than one tests to
- * execute "simultaneously".
- *
- * This may be modified such thread_yield may be called in syscalls, and
- * timer interrupts.
- */
-
-
-#define MAX_THREADS 8
-
-#define CTX_SIZE 512
-#define STK_SIZE 8*1024
-
-#define STATE_EMPTY 0
-#define STATE_RUNNABLE 1
-#define STATE_STOPPED 2
-#define STATE_TERMINATED 2
-
-#define MASTER_THREAD 0
-
-#define RC_FAILURE     (-1)
-#define        RC_SUCCESS      (0)
-
-typedef        vu_char *jmp_ctx;
-unsigned long setctxsp (vu_char *sp);
-int ppc_setjmp(jmp_ctx env);
-void ppc_longjmp(jmp_ctx env, int val);
-#define setjmp ppc_setjmp
-#define longjmp        ppc_longjmp
-
-struct lthread {
-       int state;
-       int retval;
-       char stack[STK_SIZE];
-       uchar context[CTX_SIZE];
-       int (*func) (void *);
-       void *arg;
-};
-static volatile struct lthread lthreads[MAX_THREADS];
-static volatile int current_tid = MASTER_THREAD;
-
-
-static uchar dbg = 0;
-
-#define PDEBUG(fmt, args...)    {                                      \
-       if(dbg != 0) {                                                  \
-               printf("[%s %d %s]: ",__FILE__,__LINE__,__FUNCTION__);\
-               printf(fmt, ##args);                            \
-               printf("\n");                                   \
-       }                                                               \
-}
-
-static int testthread (void *);
-static void sched_init (void);
-static int thread_create (int (*func) (void *), void *arg);
-static int thread_start (int id);
-static void thread_yield (void);
-static int thread_delete (int id);
-static int thread_join (int *ret);
-
-#if 0                                                  /* not used yet */
-static int thread_stop (int id);
-#endif                                                 /* not used yet */
-
-/* An example of schedular test */
-
-#define NUMTHREADS 7
-int sched (int ac, char *av[])
-{
-       int i, j;
-       int tid[NUMTHREADS];
-       int names[NUMTHREADS];
-
-       app_startup(av);
-
-       sched_init ();
-
-       for (i = 0; i < NUMTHREADS; i++) {
-               names[i] = i;
-               j = thread_create (testthread, (void *) &names[i]);
-               if (j == RC_FAILURE)
-                       printf ("schedtest: Failed to create thread %d\n", i);
-               if (j > 0) {
-                       printf ("schedtest: Created thread with id %d, name %d\n",
-                                               j, i);
-                       tid[i] = j;
-               }
-       }
-       printf ("schedtest: Threads created\n");
-
-       printf ("sched_test: function=0x%08x\n", (unsigned)testthread);
-       for (i = 0; i < NUMTHREADS; i++) {
-               printf ("schedtest: Setting thread %d runnable\n", tid[i]);
-               thread_start (tid[i]);
-               thread_yield ();
-       }
-       printf ("schedtest: Started %d threads\n", NUMTHREADS);
-
-       while (1) {
-               printf ("schedtest: Waiting for threads to complete\n");
-               if (tstc () && getc () == 0x3) {
-                       printf ("schedtest: Aborting threads...\n");
-                       for (i = 0; i < NUMTHREADS; i++) {
-                               printf ("schedtest: Deleting thread %d\n", tid[i]);
-                               thread_delete (tid[i]);
-                       }
-                       return RC_SUCCESS;
-               }
-               j = -1;
-               i = thread_join (&j);
-               if (i == RC_FAILURE) {
-                       printf ("schedtest: No threads pending, "
-                                               "exiting schedular test\n");
-                       return RC_SUCCESS;
-               }
-               printf ("schedtest: thread is %d returned %d\n", i, j);
-               thread_yield ();
-       }
-
-       return RC_SUCCESS;
-}
-
-static int testthread (void *name)
-{
-       int i;
-
-       printf ("testthread: Begin executing thread, myname %d, &i=0x%08x\n",
-               *(int *) name, (unsigned)&i);
-
-       printf ("Thread %02d, i=%d\n", *(int *) name, i);
-
-       for (i = 0; i < 0xffff * (*(int *) name + 1); i++) {
-               if (tstc () && getc () == 0x3) {
-                       printf ("testthread: myname %d terminating.\n",
-                                               *(int *) name);
-                       return *(int *) name + 1;
-               }
-
-               if (i % 100 == 0)
-                       thread_yield ();
-       }
-
-       printf ("testthread: returning %d, i=0x%x\n",
-                               *(int *) name + 1, i);
-
-       return *(int *) name + 1;
-}
-
-
-static void sched_init (void)
-{
-       int i;
-
-       for (i = MASTER_THREAD + 1; i < MAX_THREADS; i++)
-               lthreads[i].state = STATE_EMPTY;
-
-       current_tid = MASTER_THREAD;
-       lthreads[current_tid].state = STATE_RUNNABLE;
-       PDEBUG ("sched_init: master context = 0x%08x",
-               (unsigned)lthreads[current_tid].context);
-       return;
-}
-
-static void thread_yield (void)
-{
-       static int i;
-
-       PDEBUG ("thread_yield: current tid=%d", current_tid);
-
-#define SWITCH(new)                                                    \
-       if(lthreads[new].state == STATE_RUNNABLE) {                     \
-               PDEBUG("thread_yield: %d match, ctx=0x%08x",            \
-                       new,                                            \
-                       (unsigned)lthreads[current_tid].context);       \
-               if(setjmp(lthreads[current_tid].context) == 0) {        \
-                       current_tid = new;                              \
-                       PDEBUG("thread_yield: tid %d returns 0",        \
-                               new);                                   \
-                       longjmp(lthreads[new].context, 1);              \
-               } else {                                                \
-                       PDEBUG("thread_yield: tid %d returns 1",        \
-                               new);                                   \
-                       return;                                         \
-               }                                                       \
-       }
-
-       for (i = current_tid + 1; i < MAX_THREADS; i++) {
-               SWITCH (i);
-       }
-
-       if (current_tid != 0) {
-               for (i = 0; i <= current_tid; i++) {
-                       SWITCH (i);
-               }
-       }
-
-       PDEBUG ("thread_yield: returning from thread_yield");
-       return;
-}
-
-static int thread_create (int (*func) (void *), void *arg)
-{
-       int i;
-
-       for (i = MASTER_THREAD + 1; i < MAX_THREADS; i++) {
-               if (lthreads[i].state == STATE_EMPTY) {
-                       lthreads[i].state = STATE_STOPPED;
-                       lthreads[i].func = func;
-                       lthreads[i].arg = arg;
-                       PDEBUG ("thread_create: returns new tid %d", i);
-                       return i;
-               }
-       }
-
-       PDEBUG ("thread_create: returns failure");
-       return RC_FAILURE;
-}
-
-static int thread_delete (int id)
-{
-       if (id <= MASTER_THREAD || id > MAX_THREADS)
-               return RC_FAILURE;
-
-       if (current_tid == id)
-               return RC_FAILURE;
-
-       lthreads[id].state = STATE_EMPTY;
-       return RC_SUCCESS;
-}
-
-static void thread_launcher (void)
-{
-       PDEBUG ("thread_launcher: invoking func=0x%08x",
-                  (unsigned)lthreads[current_tid].func);
-
-       lthreads[current_tid].retval =
-                       lthreads[current_tid].func (lthreads[current_tid].arg);
-
-       PDEBUG ("thread_launcher: tid %d terminated", current_tid);
-
-       lthreads[current_tid].state = STATE_TERMINATED;
-       thread_yield ();
-       printf ("thread_launcher: should NEVER get here!\n");
-
-       return;
-}
-
-static int thread_start (int id)
-{
-       PDEBUG ("thread_start: id=%d", id);
-       if (id <= MASTER_THREAD || id > MAX_THREADS) {
-               return RC_FAILURE;
-       }
-
-       if (lthreads[id].state != STATE_STOPPED)
-               return RC_FAILURE;
-
-       if (setjmp (lthreads[current_tid].context) == 0) {
-               lthreads[id].state = STATE_RUNNABLE;
-               current_tid = id;
-               PDEBUG ("thread_start: to be stack=0%08x",
-                       (unsigned)lthreads[id].stack);
-               setctxsp ((vu_char *)&lthreads[id].stack[STK_SIZE]);
-               thread_launcher ();
-       }
-
-       PDEBUG ("thread_start: Thread id=%d started, parent returns", id);
-
-       return RC_SUCCESS;
-}
-
-#if 0  /* not used so far */
-static int thread_stop (int id)
-{
-       if (id <= MASTER_THREAD || id >= MAX_THREADS)
-               return RC_FAILURE;
-
-       if (current_tid == id)
-               return RC_FAILURE;
-
-       lthreads[id].state = STATE_STOPPED;
-       return RC_SUCCESS;
-}
-#endif /* not used so far */
-
-static int thread_join (int *ret)
-{
-       int i, j = 0;
-
-       PDEBUG ("thread_join: *ret = %d", *ret);
-
-       if (!(*ret == -1 || *ret > MASTER_THREAD || *ret < MAX_THREADS)) {
-               PDEBUG ("thread_join: invalid tid %d", *ret);
-               return RC_FAILURE;
-       }
-
-       if (*ret == -1) {
-               PDEBUG ("Checking for tid = -1");
-               while (1) {
-                       /* PDEBUG("thread_join: start while-loopn"); */
-                       j = 0;
-                       for (i = MASTER_THREAD + 1; i < MAX_THREADS; i++) {
-                               if (lthreads[i].state == STATE_TERMINATED) {
-                                       *ret = lthreads[i].retval;
-                                       lthreads[i].state = STATE_EMPTY;
-                                       /* PDEBUG("thread_join: returning retval %d of tid %d",
-                                          ret, i); */
-                                       return RC_SUCCESS;
-                               }
-
-                               if (lthreads[i].state != STATE_EMPTY) {
-                                       PDEBUG ("thread_join: %d used slots tid %d state=%d",
-                                                  j, i, lthreads[i].state);
-                                       j++;
-                               }
-                       }
-                       if (j == 0) {
-                               PDEBUG ("thread_join: all slots empty!");
-                               return RC_FAILURE;
-                       }
-                       /*  PDEBUG("thread_join: yielding"); */
-                       thread_yield ();
-                       /*  PDEBUG("thread_join: back from yield"); */
-               }
-       }
-
-       if (lthreads[*ret].state == STATE_TERMINATED) {
-               i = *ret;
-               *ret = lthreads[*ret].retval;
-               lthreads[*ret].state = STATE_EMPTY;
-               PDEBUG ("thread_join: returing %d for tid %d", *ret, i);
-               return RC_SUCCESS;
-       }
-
-       PDEBUG ("thread_join: thread %d is not terminated!", *ret);
-       return RC_FAILURE;
-}
diff --git a/examples/smc91111_eeprom.c b/examples/smc91111_eeprom.c
deleted file mode 100644 (file)
index 39e5306..0000000
+++ /dev/null
@@ -1,395 +0,0 @@
-/*
- * (C) Copyright 2004
- * Robin Getz rgetz@blacfin.uclinux.org
- *
- * 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
- *
- * Heavily borrowed from the following peoples GPL'ed software:
- *  - Wolfgang Denk, DENX Software Engineering, wd@denx.de
- *       Das U-boot
- *  - Ladislav Michl ladis@linux-mips.org
- *       A rejected patch on the U-Boot mailing list
- */
-
-#include <common.h>
-#include <exports.h>
-#include "../drivers/net/smc91111.h"
-
-#ifdef CONFIG_DRIVER_SMC91111
-
-#ifndef SMC91111_EEPROM_INIT
-# define SMC91111_EEPROM_INIT()
-#endif
-
-#define SMC_BASE_ADDRESS CONFIG_SMC91111_BASE
-#define EEPROM         0x1
-#define MAC            0x2
-#define UNKNOWN                0x4
-
-void dump_reg (void);
-void dump_eeprom (void);
-int write_eeprom_reg (int, int);
-void copy_from_eeprom (void);
-void print_MAC (void);
-int read_eeprom_reg (int);
-void print_macaddr (void);
-
-int smc91111_eeprom (int argc, char *argv[])
-{
-       int c, i, j, done, line, reg, value, start, what;
-       char input[50];
-
-       /* Print the ABI version */
-       app_startup (argv);
-       if (XF_VERSION != (int) get_version ()) {
-               printf ("Expects ABI version %d\n", XF_VERSION);
-               printf ("Actual U-Boot ABI version %d\n",
-                       (int) get_version ());
-               printf ("Can't run\n\n");
-               return (0);
-       }
-
-       SMC91111_EEPROM_INIT();
-
-       if ((SMC_inw (BANK_SELECT) & 0xFF00) != 0x3300) {
-               printf ("Can't find SMSC91111\n");
-               return (0);
-       }
-
-       done = 0;
-       what = UNKNOWN;
-       printf ("\n");
-       while (!done) {
-               /* print the prompt */
-               printf ("SMC91111> ");
-               line = 0;
-               i = 0;
-               start = 1;
-               while (!line) {
-                       /* Wait for a keystroke */
-                       while (!tstc ());
-
-                       c = getc ();
-                       /* Make Uppercase */
-                       if (c >= 'Z')
-                               c -= ('a' - 'A');
-                       /* printf(" |%02x| ",c); */
-
-                       switch (c) {
-                       case '\r':      /* Enter                */
-                       case '\n':
-                               input[i] = 0;
-                               puts ("\r\n");
-                               line = 1;
-                               break;
-                       case '\0':      /* nul                  */
-                               continue;
-
-                       case 0x03:      /* ^C - break           */
-                               input[0] = 0;
-                               i = 0;
-                               line = 1;
-                               done = 1;
-                               break;
-
-                       case 0x5F:
-                       case 0x08:      /* ^H  - backspace      */
-                       case 0x7F:      /* DEL - backspace      */
-                               if (i > 0) {
-                                       puts ("\b \b");
-                                       i--;
-                               }
-                               break;
-                       default:
-                               if (start) {
-                                       if ((c == 'W') || (c == 'D')
-                                           || (c == 'M') || (c == 'C')
-                                           || (c == 'P')) {
-                                               putc (c);
-                                               input[i] = c;
-                                               if (i <= 45)
-                                                       i++;
-                                               start = 0;
-                                       }
-                               } else {
-                                       if ((c >= '0' && c <= '9')
-                                           || (c >= 'A' && c <= 'F')
-                                           || (c == 'E') || (c == 'M')
-                                           || (c == ' ')) {
-                                               putc (c);
-                                               input[i] = c;
-                                               if (i <= 45)
-                                                       i++;
-                                               break;
-                                       }
-                               }
-                               break;
-                       }
-               }
-
-               for (; i < 49; i++)
-                       input[i] = 0;
-
-               switch (input[0]) {
-               case ('W'):
-                       /* Line should be w reg value */
-                       i = 0;
-                       reg = 0;
-                       value = 0;
-                       /* Skip to the next space or end) */
-                       while ((input[i] != ' ') && (input[i] != 0))
-                               i++;
-
-                       if (input[i] != 0)
-                               i++;
-
-                       /* Are we writing to EEPROM or MAC */
-                       switch (input[i]) {
-                       case ('E'):
-                               what = EEPROM;
-                               break;
-                       case ('M'):
-                               what = MAC;
-                               break;
-                       default:
-                               what = UNKNOWN;
-                               break;
-                       }
-
-                       /* skip to the next space or end */
-                       while ((input[i] != ' ') && (input[i] != 0))
-                               i++;
-                       if (input[i] != 0)
-                               i++;
-
-                       /* Find register to write into */
-                       j = 0;
-                       while ((input[i] != ' ') && (input[i] != 0)) {
-                               j = input[i] - 0x30;
-                               if (j >= 0xA) {
-                                       j -= 0x07;
-                               }
-                               reg = (reg * 0x10) + j;
-                               i++;
-                       }
-
-                       while ((input[i] != ' ') && (input[i] != 0))
-                               i++;
-
-                       if (input[i] != 0)
-                               i++;
-                       else
-                               what = UNKNOWN;
-
-                       /* Get the value to write */
-                       j = 0;
-                       while ((input[i] != ' ') && (input[i] != 0)) {
-                               j = input[i] - 0x30;
-                               if (j >= 0xA) {
-                                       j -= 0x07;
-                               }
-                               value = (value * 0x10) + j;
-                               i++;
-                       }
-
-                       switch (what) {
-                       case 1:
-                               printf ("Writing EEPROM register %02x with %04x\n", reg, value);
-                               write_eeprom_reg (value, reg);
-                               break;
-                       case 2:
-                               printf ("Writing MAC register bank %i, reg %02x with %04x\n", reg >> 4, reg & 0xE, value);
-                               SMC_SELECT_BANK (reg >> 4);
-                               SMC_outw (value, reg & 0xE);
-                               break;
-                       default:
-                               printf ("Wrong\n");
-                               break;
-                       }
-                       break;
-               case ('D'):
-                       dump_eeprom ();
-                       break;
-               case ('M'):
-                       dump_reg ();
-                       break;
-               case ('C'):
-                       copy_from_eeprom ();
-                       break;
-               case ('P'):
-                       print_macaddr ();
-                       break;
-               default:
-                       break;
-               }
-
-       }
-
-       return (0);
-}
-
-void copy_from_eeprom (void)
-{
-       int i;
-
-       SMC_SELECT_BANK (1);
-       SMC_outw ((SMC_inw (CTL_REG) & !CTL_EEPROM_SELECT) | CTL_RELOAD,
-                 CTL_REG);
-       i = 100;
-       while ((SMC_inw (CTL_REG) & CTL_RELOAD) && --i)
-               udelay (100);
-       if (i == 0) {
-               printf ("Timeout Refreshing EEPROM registers\n");
-       } else {
-               printf ("EEPROM contents copied to MAC\n");
-       }
-
-}
-
-void print_macaddr (void)
-{
-       int i, j, k, mac[6];
-
-       printf ("Current MAC Address in SMSC91111 ");
-       SMC_SELECT_BANK (1);
-       for (i = 0; i < 5; i++) {
-               printf ("%02x:", SMC_inb (ADDR0_REG + i));
-       }
-
-       printf ("%02x\n", SMC_inb (ADDR0_REG + 5));
-
-       i = 0;
-       for (j = 0x20; j < 0x23; j++) {
-               k = read_eeprom_reg (j);
-               mac[i] = k & 0xFF;
-               i++;
-               mac[i] = k >> 8;
-               i++;
-       }
-
-       printf ("Current MAC Address in EEPROM    ");
-       for (i = 0; i < 5; i++)
-               printf ("%02x:", mac[i]);
-       printf ("%02x\n", mac[5]);
-
-}
-void dump_eeprom (void)
-{
-       int j, k;
-
-       printf ("IOS2-0    ");
-       for (j = 0; j < 8; j++) {
-               printf ("%03x     ", j);
-       }
-       printf ("\n");
-
-       for (k = 0; k < 4; k++) {
-               if (k == 0)
-                       printf ("CONFIG ");
-               if (k == 1)
-                       printf ("BASE   ");
-               if ((k == 2) || (k == 3))
-                       printf ("       ");
-               for (j = 0; j < 0x20; j += 4) {
-                       printf ("%02x:%04x ", j + k, read_eeprom_reg (j + k));
-               }
-               printf ("\n");
-       }
-
-       for (j = 0x20; j < 0x40; j++) {
-               if ((j & 0x07) == 0)
-                       printf ("\n");
-               printf ("%02x:%04x ", j, read_eeprom_reg (j));
-       }
-       printf ("\n");
-
-}
-
-int read_eeprom_reg (int reg)
-{
-       int timeout;
-
-       SMC_SELECT_BANK (2);
-       SMC_outw (reg, PTR_REG);
-
-       SMC_SELECT_BANK (1);
-       SMC_outw (SMC_inw (CTL_REG) | CTL_EEPROM_SELECT | CTL_RELOAD,
-                 CTL_REG);
-       timeout = 100;
-       while ((SMC_inw (CTL_REG) & CTL_RELOAD) && --timeout)
-               udelay (100);
-       if (timeout == 0) {
-               printf ("Timeout Reading EEPROM register %02x\n", reg);
-               return 0;
-       }
-
-       return SMC_inw (GP_REG);
-
-}
-
-int write_eeprom_reg (int value, int reg)
-{
-       int timeout;
-
-       SMC_SELECT_BANK (2);
-       SMC_outw (reg, PTR_REG);
-
-       SMC_SELECT_BANK (1);
-       SMC_outw (value, GP_REG);
-       SMC_outw (SMC_inw (CTL_REG) | CTL_EEPROM_SELECT | CTL_STORE, CTL_REG);
-       timeout = 100;
-       while ((SMC_inw (CTL_REG) & CTL_STORE) && --timeout)
-               udelay (100);
-       if (timeout == 0) {
-               printf ("Timeout Writing EEPROM register %02x\n", reg);
-               return 0;
-       }
-
-       return 1;
-
-}
-
-void dump_reg (void)
-{
-       int i, j;
-
-       printf ("    ");
-       for (j = 0; j < 4; j++) {
-               printf ("Bank%i ", j);
-       }
-       printf ("\n");
-       for (i = 0; i < 0xF; i += 2) {
-               printf ("%02x  ", i);
-               for (j = 0; j < 4; j++) {
-                       SMC_SELECT_BANK (j);
-                       printf ("%04x  ", SMC_inw (i));
-               }
-               printf ("\n");
-       }
-}
-
-#else
-
-int smc91111_eeprom (int argc, char *argv[])
-{
-       printf("Not supported for this board\n");
-       return 1;
-}
-
-#endif
diff --git a/examples/smc911x_eeprom.c b/examples/smc911x_eeprom.c
deleted file mode 100644 (file)
index bf22f0a..0000000
+++ /dev/null
@@ -1,383 +0,0 @@
-/*
- * smc911x_eeprom.c - EEPROM interface to SMC911x parts.
- * Only tested on SMSC9118 though ...
- *
- * Copyright 2004-2008 Analog Devices Inc.
- *
- * Licensed under the GPL-2 or later.
- *
- * Based on smc91111_eeprom.c which:
- * Heavily borrowed from the following peoples GPL'ed software:
- *  - Wolfgang Denk, DENX Software Engineering, wd@denx.de
- *       Das U-boot
- *  - Ladislav Michl ladis@linux-mips.org
- *       A rejected patch on the U-Boot mailing list
- */
-
-#include <common.h>
-#include <exports.h>
-
-#ifdef CONFIG_DRIVER_SMC911X
-
-#include "../drivers/net/smc911x.h"
-
-/**
- *     smsc_ctrlc - detect press of CTRL+C (common ctrlc() isnt exported!?)
- */
-static int smsc_ctrlc(void)
-{
-       return (tstc() && getc() == 0x03);
-}
-
-/**
- *     usage - dump usage information
- */
-static void usage(void)
-{
-       puts(
-               "MAC/EEPROM Commands:\n"
-               " P : Print the MAC addresses\n"
-               " D : Dump the EEPROM contents\n"
-               " M : Dump the MAC contents\n"
-               " C : Copy the MAC address from the EEPROM to the MAC\n"
-               " W : Write a register in the EEPROM or in the MAC\n"
-               " Q : Quit\n"
-               "\n"
-               "Some commands take arguments:\n"
-               " W <E|M> <register> <value>\n"
-               "    E: EEPROM   M: MAC\n"
-       );
-}
-
-/**
- *     dump_regs - dump the MAC registers
- *
- * Registers 0x00 - 0x50 are FIFOs.  The 0x50+ are the control registers
- * and they're all 32bits long.  0xB8+ are reserved, so don't bother.
- */
-static void dump_regs(void)
-{
-       u8 i, j = 0;
-       for (i = 0x50; i < 0xB8; i += sizeof(u32))
-               printf("%02x: 0x%08x %c", i,
-                       smc911x_reg_read(CONFIG_DRIVER_SMC911X_BASE + i),
-                       (j++ % 2 ? '\n' : ' '));
-}
-
-/**
- *     do_eeprom_cmd - handle eeprom communication
- */
-static int do_eeprom_cmd(int cmd, u8 reg)
-{
-       if (smc911x_reg_read(E2P_CMD) & E2P_CMD_EPC_BUSY) {
-               printf("eeprom_cmd: busy at start (E2P_CMD = 0x%08x)\n",
-                       smc911x_reg_read(E2P_CMD));
-               return -1;
-       }
-
-       smc911x_reg_write(E2P_CMD, E2P_CMD_EPC_BUSY | cmd | reg);
-
-       while (smc911x_reg_read(E2P_CMD) & E2P_CMD_EPC_BUSY)
-               if (smsc_ctrlc()) {
-                       printf("eeprom_cmd: timeout (E2P_CMD = 0x%08x)\n",
-                               smc911x_reg_read(E2P_CMD));
-                       return -1;
-               }
-
-       return 0;
-}
-
-/**
- *     read_eeprom_reg - read specified register in EEPROM
- */
-static u8 read_eeprom_reg(u8 reg)
-{
-       int ret = do_eeprom_cmd(E2P_CMD_EPC_CMD_READ, reg);
-       return (ret ? : smc911x_reg_read(E2P_DATA));
-}
-
-/**
- *     write_eeprom_reg - write specified value into specified register in EEPROM
- */
-static int write_eeprom_reg(u8 value, u8 reg)
-{
-       int ret;
-
-       /* enable erasing/writing */
-       ret = do_eeprom_cmd(E2P_CMD_EPC_CMD_EWEN, reg);
-       if (ret)
-               goto done;
-
-       /* erase the eeprom reg */
-       ret = do_eeprom_cmd(E2P_CMD_EPC_CMD_ERASE, reg);
-       if (ret)
-               goto done;
-
-       /* write the eeprom reg */
-       smc911x_reg_write(E2P_DATA, value);
-       ret = do_eeprom_cmd(E2P_CMD_EPC_CMD_WRITE, reg);
-       if (ret)
-               goto done;
-
-       /* disable erasing/writing */
-       ret = do_eeprom_cmd(E2P_CMD_EPC_CMD_EWDS, reg);
-
- done:
-       return ret;
-}
-
-/**
- *     skip_space - find first non-whitespace in given pointer
- */
-static char *skip_space(char *buf)
-{
-       while (buf[0] == ' ' || buf[0] == '\t')
-               ++buf;
-       return buf;
-}
-
-/**
- *     write_stuff - handle writing of MAC registers / eeprom
- */
-static void write_stuff(char *line)
-{
-       char dest;
-       char *endp;
-       u8 reg;
-       u32 value;
-
-       /* Skip over the "W " part of the command */
-       line = skip_space(line + 1);
-
-       /* Figure out destination */
-       switch (line[0]) {
-       case 'E':
-       case 'M':
-               dest = line[0];
-               break;
-       default:
-       invalid_usage:
-               printf("ERROR: Invalid write usage\n");
-               usage();
-               return;
-       }
-
-       /* Get the register to write */
-       line = skip_space(line + 1);
-       reg = simple_strtoul(line, &endp, 16);
-       if (line == endp)
-               goto invalid_usage;
-
-       /* Get the value to write */
-       line = skip_space(endp);
-       value = simple_strtoul(line, &endp, 16);
-       if (line == endp)
-               goto invalid_usage;
-
-       /* Check for trailing cruft */
-       line = skip_space(endp);
-       if (line[0])
-               goto invalid_usage;
-
-       /* Finally, execute the command */
-       if (dest == 'E') {
-               printf("Writing EEPROM register %02x with %02x\n", reg, value);
-               write_eeprom_reg(value, reg);
-       } else {
-               printf("Writing MAC register %02x with %08x\n", reg, value);
-               smc911x_reg_write(CONFIG_DRIVER_SMC911X_BASE + reg, value);
-       }
-}
-
-/**
- *     copy_from_eeprom - copy MAC address in eeprom to address registers
- */
-static void copy_from_eeprom(void)
-{
-       ulong addrl =
-               read_eeprom_reg(0x01) |
-               read_eeprom_reg(0x02) << 8 |
-               read_eeprom_reg(0x03) << 16 |
-               read_eeprom_reg(0x04) << 24;
-       ulong addrh =
-               read_eeprom_reg(0x05) |
-               read_eeprom_reg(0x06) << 8;
-       smc911x_set_mac_csr(ADDRL, addrl);
-       smc911x_set_mac_csr(ADDRH, addrh);
-       puts("EEPROM contents copied to MAC\n");
-}
-
-/**
- *     print_macaddr - print MAC address registers and MAC address in eeprom
- */
-static void print_macaddr(void)
-{
-       puts("Current MAC Address in MAC:     ");
-       ulong addrl = smc911x_get_mac_csr(ADDRL);
-       ulong addrh = smc911x_get_mac_csr(ADDRH);
-       printf("%02x:%02x:%02x:%02x:%02x:%02x\n",
-               (u8)(addrl), (u8)(addrl >> 8), (u8)(addrl >> 16),
-               (u8)(addrl >> 24), (u8)(addrh), (u8)(addrh >> 8));
-
-       puts("Current MAC Address in EEPROM:  ");
-       int i;
-       for (i = 1; i < 6; ++i)
-               printf("%02x:", read_eeprom_reg(i));
-       printf("%02x\n", read_eeprom_reg(i));
-}
-
-/**
- *     dump_eeprom - dump the whole content of the EEPROM
- */
-static void dump_eeprom(void)
-{
-       int i;
-       puts("EEPROM:\n");
-       for (i = 0; i < 7; ++i)
-               printf("%02x: 0x%02x\n", i, read_eeprom_reg(i));
-}
-
-/**
- *     smc911x_init - get the MAC/EEPROM up and ready for use
- */
-static int smc911x_init(void)
-{
-       /* See if there is anything there */
-       if (!smc911x_detect_chip())
-               return 1;
-
-       smc911x_reset();
-
-       /* Make sure we set EEDIO/EECLK to the EEPROM */
-       if (smc911x_reg_read(GPIO_CFG) & GPIO_CFG_EEPR_EN) {
-               while (smc911x_reg_read(E2P_CMD) & E2P_CMD_EPC_BUSY)
-                       if (smsc_ctrlc()) {
-                               printf("init: timeout (E2P_CMD = 0x%08x)\n",
-                                       smc911x_reg_read(E2P_CMD));
-                               return 1;
-                       }
-               smc911x_reg_write(GPIO_CFG, smc911x_reg_read(GPIO_CFG) & ~GPIO_CFG_EEPR_EN);
-       }
-
-       return 0;
-}
-
-/**
- *     getline - consume a line of input and handle some escape sequences
- */
-static char *getline(void)
-{
-       static char buffer[100];
-       char c;
-       size_t i;
-
-       i = 0;
-       while (1) {
-               buffer[i] = '\0';
-               while (!tstc())
-                       continue;
-
-               c = getc();
-               /* Convert to uppercase */
-               if (c >= 'a' && c <= 'z')
-                       c -= ('a' - 'A');
-
-               switch (c) {
-               case '\r':      /* Enter/Return key */
-               case '\n':
-                       puts("\n");
-                       return buffer;
-
-               case 0x03:      /* ^C - break */
-                       return NULL;
-
-               case 0x5F:
-               case 0x08:      /* ^H  - backspace */
-               case 0x7F:      /* DEL - backspace */
-                       if (i) {
-                               puts("\b \b");
-                               i--;
-                       }
-                       break;
-
-               default:
-                       /* Ignore control characters */
-                       if (c < 0x20)
-                               break;
-                       /* Queue up all other characters */
-                       buffer[i++] = c;
-                       printf("%c", c);
-                       break;
-               }
-       }
-}
-
-/**
- *     smc911x_eeprom - our application's main() function
- */
-int smc911x_eeprom(int argc, char *argv[])
-{
-       /* Print the ABI version */
-       app_startup(argv);
-       if (XF_VERSION != get_version()) {
-               printf("Expects ABI version %d\n", XF_VERSION);
-               printf("Actual U-Boot ABI version %lu\n", get_version());
-               printf("Can't run\n\n");
-               return 1;
-       }
-
-       /* Initialize the MAC/EEPROM somewhat */
-       puts("\n");
-       if (smc911x_init())
-               return 1;
-
-       /* Dump helpful usage information */
-       puts("\n");
-       usage();
-       puts("\n");
-
-       while (1) {
-               char *line;
-
-               /* Send the prompt and wait for a line */
-               puts("eeprom> ");
-               line = getline();
-
-               /* Got a ctrl+c */
-               if (!line)
-                       return 0;
-
-               /* Eat leading space */
-               line = skip_space(line);
-
-               /* Empty line, try again */
-               if (!line[0])
-                       continue;
-
-               /* Only accept 1 letter commands */
-               if (line[0] && line[1] && line[1] != ' ' && line[1] != '\t')
-                       goto unknown_cmd;
-
-               /* Now parse the command */
-               switch (line[0]) {
-               case 'W': write_stuff(line);  break;
-               case 'D': dump_eeprom();      break;
-               case 'M': dump_regs();        break;
-               case 'C': copy_from_eeprom(); break;
-               case 'P': print_macaddr();    break;
-               unknown_cmd:
-               default:  puts("ERROR: Unknown command!\n\n");
-               case '?':
-               case 'H': usage();            break;
-               case 'Q': return 0;
-               }
-       }
-}
-
-#else
-int smc911x_eeprom(int argc, char *argv[])
-{
-       puts("Not supported for this board\n");
-       return 1;
-}
-#endif
diff --git a/examples/sparc.lds b/examples/sparc.lds
deleted file mode 100644 (file)
index 9733daa..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * (C) Copyright 2003, Psyent Corporation <www.psyent.com>
- * Scott McNutt <smcnutt@psyent.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
- */
-
-
-OUTPUT_FORMAT("elf32-sparc", "elf32-sparc", "elf32-sparc")
-OUTPUT_ARCH(sparc)
-ENTRY(_start)
-
-SECTIONS
-{
-       .text :
-       {
-         *(.text)
-       }
-       __text_end = .;
-
-       . = ALIGN(4);
-       .rodata :
-       {
-               *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
-       }
-       __rodata_end = .;
-
-       . = ALIGN(4);
-       .data :
-       {
-               *(.data)
-       }
-       . = ALIGN(4);
-       __data_end = .;
-
-       __bss_start = .;
-       . = ALIGN(4);
-       .bss :
-       {
-               *(.bss)
-       }
-       . = ALIGN(4);
-       __bss_end = .;
-       _end = .;
-}
diff --git a/examples/standalone/.gitignore b/examples/standalone/.gitignore
new file mode 100644 (file)
index 0000000..0d1864c
--- /dev/null
@@ -0,0 +1,11 @@
+/82559_eeprom
+/hello_world
+/interrupt
+/mem_to_mem_idma2intr
+/test_burst
+/timer
+/sched
+/smc91111_eeprom
+/smc911x_eeprom
+*.bin
+*.srec
diff --git a/examples/standalone/82559_eeprom.c b/examples/standalone/82559_eeprom.c
new file mode 100644 (file)
index 0000000..5e2eee9
--- /dev/null
@@ -0,0 +1,357 @@
+
+/*
+ * Copyright 1998-2001 by Donald Becker.
+ * This software may be used and distributed according to the terms of
+ * the GNU General Public License (GPL), incorporated herein by reference.
+ * Contact the author for use under other terms.
+ *
+ * This program must be compiled with "-O"!
+ * See the bottom of this file for the suggested compile-command.
+ *
+ * The author may be reached as becker@scyld.com, or C/O
+ *  Scyld Computing Corporation
+ *  410 Severn Ave., Suite 210
+ *  Annapolis MD 21403
+ *
+ * Common-sense licensing statement: Using any portion of this program in
+ * your own program means that you must give credit to the original author
+ * and release the resulting code under the GPL.
+ */
+
+#define _PPC_STRING_H_         /* avoid unnecessary str/mem functions */
+
+#include <common.h>
+#include <exports.h>
+#include <asm/io.h>
+
+
+/* Default EEPROM for i82559 */
+static unsigned short default_eeprom[64] = {
+       0x0100, 0x0302, 0x0504, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+       0xffff, 0xffff, 0x40c0, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff,
+       0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+       0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+       0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+       0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+       0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+       0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff
+};
+
+static unsigned short eeprom[256];
+
+static int eeprom_size = 64;
+static int eeprom_addr_size = 6;
+
+static int debug = 0;
+
+static inline unsigned short swap16(unsigned short x)
+{
+       return (((x & 0xff) << 8) | ((x & 0xff00) >> 8));
+}
+
+
+void * memcpy(void * dest,const void *src,size_t count)
+{
+       char *tmp = (char *) dest, *s = (char *) src;
+
+       while (count--)
+               *tmp++ = *s++;
+
+       return dest;
+}
+
+
+/* The EEPROM commands include the alway-set leading bit. */
+#define EE_WRITE_CMD   (5)
+#define EE_READ_CMD            (6)
+#define EE_ERASE_CMD   (7)
+
+/* Serial EEPROM section. */
+#define EE_SHIFT_CLK   0x01    /* EEPROM shift clock. */
+#define EE_CS                  0x02    /* EEPROM chip select. */
+#define EE_DATA_WRITE  0x04    /* EEPROM chip data in. */
+#define EE_DATA_READ   0x08    /* EEPROM chip data out. */
+#define EE_ENB                 (0x4800 | EE_CS)
+#define EE_WRITE_0             0x4802
+#define EE_WRITE_1             0x4806
+#define EE_OFFSET              14
+
+/* Delay between EEPROM clock transitions. */
+#define eeprom_delay(ee_addr)  inw(ee_addr)
+
+/* Wait for the EEPROM to finish the previous operation. */
+static int eeprom_busy_poll(long ee_ioaddr)
+{
+       int i;
+       outw(EE_ENB, ee_ioaddr);
+       for (i = 0; i < 10000; i++)                     /* Typical 2000 ticks */
+               if (inw(ee_ioaddr) & EE_DATA_READ)
+                       break;
+       return i;
+}
+
+/* This executes a generic EEPROM command, typically a write or write enable.
+   It returns the data output from the EEPROM, and thus may also be used for
+   reads. */
+static int do_eeprom_cmd(long ioaddr, int cmd, int cmd_len)
+{
+       unsigned retval = 0;
+       long ee_addr = ioaddr + EE_OFFSET;
+
+       if (debug > 1)
+               printf(" EEPROM op 0x%x: ", cmd);
+
+       outw(EE_ENB | EE_SHIFT_CLK, ee_addr);
+
+       /* Shift the command bits out. */
+       do {
+               short dataval = (cmd & (1 << cmd_len)) ? EE_WRITE_1 : EE_WRITE_0;
+               outw(dataval, ee_addr);
+               eeprom_delay(ee_addr);
+               if (debug > 2)
+                       printf("%X", inw(ee_addr) & 15);
+               outw(dataval | EE_SHIFT_CLK, ee_addr);
+               eeprom_delay(ee_addr);
+               retval = (retval << 1) | ((inw(ee_addr) & EE_DATA_READ) ? 1 : 0);
+       } while (--cmd_len >= 0);
+#if 0
+       outw(EE_ENB, ee_addr);
+#endif
+       /* Terminate the EEPROM access. */
+       outw(EE_ENB & ~EE_CS, ee_addr);
+       if (debug > 1)
+               printf(" EEPROM result is 0x%5.5x.\n", retval);
+       return retval;
+}
+
+static int read_eeprom(long ioaddr, int location, int addr_len)
+{
+       return do_eeprom_cmd(ioaddr, ((EE_READ_CMD << addr_len) | location)
+               << 16 , 3 + addr_len + 16) & 0xffff;
+}
+
+static void write_eeprom(long ioaddr, int index, int value, int addr_len)
+{
+       long ee_ioaddr = ioaddr + EE_OFFSET;
+       int i;
+
+       /* Poll for previous op finished. */
+       eeprom_busy_poll(ee_ioaddr);                    /* Typical 0 ticks */
+       /* Enable programming modes. */
+       do_eeprom_cmd(ioaddr, (0x4f << (addr_len-4)), 3 + addr_len);
+       /* Do the actual write. */
+       do_eeprom_cmd(ioaddr,
+                                 (((EE_WRITE_CMD<<addr_len) | index)<<16) | (value & 0xffff),
+                                 3 + addr_len + 16);
+       /* Poll for write finished. */
+       i = eeprom_busy_poll(ee_ioaddr);                        /* Typical 2000 ticks */
+       if (debug)
+               printf(" Write finished after %d ticks.\n", i);
+       /* Disable programming. This command is not instantaneous, so we check
+          for busy before the next op. */
+       do_eeprom_cmd(ioaddr, (0x40 << (addr_len-4)), 3 + addr_len);
+       eeprom_busy_poll(ee_ioaddr);
+}
+
+static int reset_eeprom(unsigned long ioaddr, unsigned char *hwaddr)
+{
+       unsigned short checksum = 0;
+       int size_test;
+       int i;
+
+       printf("Resetting i82559 EEPROM @ 0x%08lx ... ", ioaddr);
+
+       size_test = do_eeprom_cmd(ioaddr, (EE_READ_CMD << 8) << 16, 27);
+       eeprom_addr_size = (size_test & 0xffe0000) == 0xffe0000 ? 8 : 6;
+       eeprom_size = 1 << eeprom_addr_size;
+
+       memcpy(eeprom, default_eeprom, sizeof default_eeprom);
+
+       for (i = 0; i < 3; i++)
+               eeprom[i] = (hwaddr[i*2+1]<<8) + hwaddr[i*2];
+
+       /* Recalculate the checksum. */
+       for (i = 0; i < eeprom_size - 1; i++)
+               checksum += eeprom[i];
+       eeprom[i] = 0xBABA - checksum;
+
+       for (i = 0; i < eeprom_size; i++)
+               write_eeprom(ioaddr, i, eeprom[i], eeprom_addr_size);
+
+       for (i = 0; i < eeprom_size; i++)
+               if (read_eeprom(ioaddr, i, eeprom_addr_size) != eeprom[i]) {
+                       printf("failed\n");
+                       return 1;
+               }
+
+       printf("done\n");
+       return 0;
+}
+
+static unsigned int hatoi(char *p, char **errp)
+{
+       unsigned int res = 0;
+
+       while (1) {
+               switch (*p) {
+               case 'a':
+               case 'b':
+               case 'c':
+               case 'd':
+               case 'e':
+               case 'f':
+                       res |= (*p - 'a' + 10);
+                       break;
+               case 'A':
+               case 'B':
+               case 'C':
+               case 'D':
+               case 'E':
+               case 'F':
+                       res |= (*p - 'A' + 10);
+                       break;
+               case '0':
+               case '1':
+               case '2':
+               case '3':
+               case '4':
+               case '5':
+               case '6':
+               case '7':
+               case '8':
+               case '9':
+                       res |= (*p - '0');
+                       break;
+               default:
+                       if (errp) {
+                               *errp = p;
+                       }
+               return res;
+               }
+               p++;
+               if (*p == 0) {
+                       break;
+               }
+               res <<= 4;
+       }
+
+       if (errp) {
+               *errp = NULL;
+       }
+
+       return res;
+}
+
+static unsigned char *gethwaddr(char *in, unsigned char *out)
+{
+       char tmp[3];
+       int i;
+       char *err;
+
+       for (i=0;i<6;i++) {
+               if (in[i*3+2] == 0 && i == 5) {
+                       out[i] = hatoi(&in[i*3], &err);
+                       if (err) {
+                               return NULL;
+                       }
+               } else if (in[i*3+2] == ':' && i < 5) {
+                       tmp[0] = in[i*3];
+                       tmp[1] = in[i*3+1];
+                       tmp[2] = 0;
+                       out[i] = hatoi(tmp, &err);
+                       if (err) {
+                               return NULL;
+                       }
+               } else {
+                       return NULL;
+               }
+       }
+
+       return out;
+}
+
+static u32
+read_config_dword(int bus, int dev, int func, int reg)
+{
+       u32 res;
+
+       outl(0x80000000|(bus&0xff)<<16|(dev&0x1f)<<11|(func&7)<<8|(reg&0xfc),
+            0xcf8);
+       res = inl(0xcfc);
+       outl(0, 0xcf8);
+       return res;
+}
+
+static u16
+read_config_word(int bus, int dev, int func, int reg)
+{
+       u32 res;
+
+       outl(0x80000000|(bus&0xff)<<16|(dev&0x1f)<<11|(func&7)<<8|(reg&0xfc),
+            0xcf8);
+       res = inw(0xcfc + (reg & 2));
+       outl(0, 0xcf8);
+       return res;
+}
+
+static void
+write_config_word(int bus, int dev, int func, int reg, u16 data)
+{
+
+       outl(0x80000000|(bus&0xff)<<16|(dev&0x1f)<<11|(func&7)<<8|(reg&0xfc),
+            0xcf8);
+       outw(data, 0xcfc + (reg & 2));
+       outl(0, 0xcf8);
+}
+
+
+int main (int argc, char *argv[])
+{
+       unsigned char *eth_addr;
+       uchar buf[6];
+       int instance;
+
+       app_startup(argv);
+       if (argc != 2) {
+               printf ("call with base Ethernet address\n");
+               return 1;
+       }
+
+
+       eth_addr = gethwaddr(argv[1], buf);
+       if (NULL == eth_addr) {
+               printf ("Can not parse ethernet address\n");
+               return 1;
+       }
+       if (eth_addr[5] & 0x01) {
+               printf("Base Ethernet address must be even\n");
+       }
+
+
+       for (instance = 0; instance < 2; instance ++)  {
+               unsigned int io_addr;
+               unsigned char mac[6];
+               int bar1 = read_config_dword(0, 6+instance, 0, 0x14);
+               if (! (bar1 & 1)) {
+                       printf("ETH%d is disabled %x\n", instance, bar1);
+               } else {
+                       printf("ETH%d IO=0x%04x\n", instance, bar1 & ~3);
+               }
+               io_addr = (bar1 & (~3L));
+
+
+               write_config_word(0, 6+instance, 0, 4,
+                                 read_config_word(0, 6+instance, 0, 4) | 1);
+               printf("ETH%d CMD %04x\n", instance,
+                          read_config_word(0, 6+instance, 0, 4));
+
+               memcpy(mac, eth_addr, 6);
+               mac[5] += instance;
+
+               printf("got io=%04x, ha=%02x:%02x:%02x:%02x:%02x:%02x\n",
+                          io_addr, mac[0], mac[1], mac[2],
+                          mac[3], mac[4], mac[5]);
+               reset_eeprom(io_addr, mac);
+       }
+       return 0;
+}
diff --git a/examples/standalone/Makefile b/examples/standalone/Makefile
new file mode 100644 (file)
index 0000000..dbcfa92
--- /dev/null
@@ -0,0 +1,198 @@
+#
+# (C) Copyright 2000-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
+#
+
+ifeq ($(ARCH),ppc)
+LOAD_ADDR = 0x40000
+endif
+
+ifeq ($(ARCH),i386)
+LOAD_ADDR = 0x40000
+endif
+
+ifeq ($(ARCH),arm)
+ifeq ($(BOARD),omap2420h4)
+LOAD_ADDR = 0x80300000
+else
+ifeq ($(CPU),omap3)
+LOAD_ADDR = 0x80300000
+else
+LOAD_ADDR = 0xc100000
+endif
+endif
+endif
+
+ifeq ($(ARCH),mips)
+LOAD_ADDR = 0x80200000 -T mips.lds
+endif
+
+ifeq ($(ARCH),nios)
+LOAD_ADDR = 0x00800000 -L $(gcclibdir)/m32 -T nios.lds
+endif
+
+ifeq ($(ARCH),nios2)
+LOAD_ADDR = 0x02000000 -L $(gcclibdir) -T nios2.lds
+endif
+
+ifeq ($(ARCH),m68k)
+LOAD_ADDR = 0x20000  -L $(clibdir)
+endif
+
+ifeq ($(ARCH),microblaze)
+LOAD_ADDR = 0x80F00000
+endif
+
+ifeq ($(ARCH),blackfin)
+LOAD_ADDR = 0x1000
+endif
+
+ifeq ($(ARCH),avr32)
+LOAD_ADDR = 0x00000000
+endif
+
+ifeq ($(ARCH),sh)
+LOAD_ADDR = 0x8C000000
+ifeq ($(CPU),sh2)
+BIG_ENDIAN=y
+endif
+endif
+
+ifeq ($(ARCH),sparc)
+LOAD_ADDR = 0x00000000 -L $(gcclibdir) -T sparc.lds
+endif
+
+include $(TOPDIR)/config.mk
+
+ELF    = hello_world
+SREC   = hello_world.srec
+BIN    = hello_world.bin
+
+ifeq ($(CPU),mpc8xx)
+ELF    += test_burst
+SREC   += test_burst.srec
+BIN    += test_burst.bin
+endif
+
+ifeq ($(ARCH),i386)
+ELF    += 82559_eeprom
+SREC   += 82559_eeprom.srec
+BIN    += 82559_eeprom.bin
+endif
+
+ifeq ($(ARCH),ppc)
+ELF    += sched
+SREC   += sched.srec
+BIN    += sched.bin
+endif
+
+ifeq ($(ARCH),blackfin)
+BFIN_BIN = smc91111_eeprom smc911x_eeprom
+ELF    += $(BFIN_BIN)
+SREC   += $(addsuffix .srec,$(BFIN_BIN))
+BIN    += $(addsuffix .bin,$(BFIN_BIN))
+endif
+
+# The following example is pretty 8xx specific...
+ifeq ($(CPU),mpc8xx)
+ELF    += timer
+SREC   += timer.srec
+BIN    += timer.bin
+endif
+
+# The following example is 8260 specific...
+ifeq ($(CPU),mpc8260)
+ELF    += mem_to_mem_idma2intr
+SREC   += mem_to_mem_idma2intr.srec
+BIN    += mem_to_mem_idma2intr.bin
+endif
+
+# Demo for 52xx IRQs
+ifeq ($(CPU),mpc5xxx)
+ELF    += interrupt
+SREC   += interrupt.srec
+BIN    += interrupt.bin
+endif
+
+# Utility for resetting i82559 EEPROM
+ifeq ($(BOARD),oxc)
+ELF    += eepro100_eeprom
+SREC   += eepro100_eeprom.srec
+BIN    += eepro100_eeprom.bin
+endif
+
+ifeq ($(BIG_ENDIAN),y)
+EX_LDFLAGS += -EB
+endif
+
+COBJS  := $(SREC:.srec=.o)
+
+LIB    = $(obj)libstubs.a
+LIBAOBJS=
+ifeq ($(ARCH),ppc)
+LIBAOBJS+= $(ARCH)_longjmp.o $(ARCH)_setjmp.o
+endif
+ifeq ($(CPU),mpc8xx)
+LIBAOBJS+= test_burst_lib.o
+endif
+LIBCOBJS= stubs.o
+
+LIBOBJS        = $(addprefix $(obj),$(LIBAOBJS) $(LIBCOBJS))
+
+SRCS   := $(COBJS:.o=.c) $(LIBCOBJS:.o=.c) $(if $(LIBAOBJS),$(LIBAOBJS:.o=.S))
+OBJS   := $(addprefix $(obj),$(COBJS))
+ELF    := $(addprefix $(obj),$(ELF))
+BIN    := $(addprefix $(obj),$(BIN))
+SREC   := $(addprefix $(obj),$(SREC))
+
+gcclibdir := $(shell dirname `$(CC) -print-libgcc-file-name`)
+clibdir := $(shell dirname `$(CC) $(CFLAGS) -print-file-name=libc.a`)
+
+CPPFLAGS += -I..
+
+all:   $(obj).depend $(OBJS) $(LIB) $(SREC) $(BIN) $(ELF)
+
+#########################################################################
+$(LIB):        $(obj).depend $(LIBOBJS)
+               $(AR) $(ARFLAGS) $@ $(LIBOBJS)
+
+$(ELF):
+$(obj)%:       $(obj)%.o $(LIB)
+               $(LD) -g $(EX_LDFLAGS) -Ttext $(LOAD_ADDR) \
+                       -o $@ -e $(SYM_PREFIX)$(notdir $(<:.o=)) $< $(LIB) \
+                       -L$(gcclibdir) -lgcc
+
+$(SREC):
+$(obj)%.srec:  $(obj)%
+               $(OBJCOPY) -O srec $< $@ 2>/dev/null
+
+$(BIN):
+$(obj)%.bin:   $(obj)%
+               $(OBJCOPY) -O binary $< $@ 2>/dev/null
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/examples/standalone/README.smc91111_eeprom b/examples/standalone/README.smc91111_eeprom
new file mode 100644 (file)
index 0000000..28e7e69
--- /dev/null
@@ -0,0 +1,246 @@
+This is the readme for the Das U-Boot standalone program smc91111
+
+The main purpose of this is to manage MAC addresses on platforms
+which include the SMC91111 integrated 10/100 MAC Phy, with attached
+EEPROMs.
+
+
+Contents:
+------------------------
+1. Ensuring U-boot's MAC address can be set in hardware
+2. Running the smc91111_eeprom program
+3. Setting MAC addresses
+4. Other things you can do with this
+5. Things to be done.
+
+
+1. Ensuring U-boot's MAC address can be set in hardware
+--------------------------------------------------------------------------
+
+On the Internet - MAC addresses are very important. Short for Media
+Access Control address, a hardware address that uniquely identifies
+each node of a network. When things are not unique - bad things
+can happen.  This is why U-Boot makes it difficult to change MAC
+addresses.
+
+To find out who has a MAC address, or to purchase MAC addresses, goto
+the IEEE, at:
+http://standards.ieee.org/regauth/oui/index.shtml
+
+To change your MAC address, there can not be a MAC address predefined in
+U-Boot. To ensure that this does not occur, check your
+include/configs/<board_name>.h file, and check to see that the following
+settings are _not_ or commented out there.
+
+#define HARDCODE_MAC                   1
+#define CONFIG_ETHADDR                 02:80:ad:20:31:b8
+
+The purpose of HARDCODE_MAC is to hardcode the MAC address in software,
+(not what we want), or to preset it to 02:80:ad:20:31:b8 (not what we
+want either).
+
+You can check this in a running U-Boot, by doing a power cycle, then
+before U-Boot tries to do any networking, running the 'printenv' command
+
+  BOOT> printenv
+
+  ethaddr=02:80:ad:20:31:b8
+
+If you see the 'ethaddr' variable show up, like the above, you need to
+recompile U-Boot, with the above settings commented out of the
+include/configs/<board_name>.h file.
+
+2. Running the smc91111_eeprom program
+---------------------------------------------------------------------
+
+After Uboot is compiled, there should be three files of interest:
+-rwxr-xr-x    1                8806 2004-10-11 14:00 smc91111_eeprom       <- ELF
+-rwxr-xr-x    1                3440 2004-10-11 14:00 smc91111_eeprom.bin   <- BIN
+-rwxr-xr-x    1                9524 2004-10-11 14:00 smc91111_eeprom.srec  <- SREC
+
+if there is not, check the examples/Makefile, and ensure there is something
+like for your architecture:
+
+   ifeq ($(ARCH),blackfin)
+   SREC          += smc91111_eeprom.srec
+   BIN   += smc91111_eeprom.bin smc91111_eeprom
+   endif
+
+To load the files: there are two methods: a) serial or b) network. Since
+it is not a good idea to start doing things on the network before the
+MAC address is set, this example will do things over serial.
+
+a) Loading the elf file via the serial port
+--------------------------------------------
+Loading the elf is very easy - just ensure that the location
+you specify things to load as is not the load address specified
+in the Makefile.
+
+BOOT> loadb 0x1000000
+
+## Ready for binary (kermit) download to 0x01000000 at 57600 bps...
+
+(type CNTL-\ then C)
+(Back at local machine)
+----------------------------------------------------
+Kermit>send ~/u-boot_1.1.1/examples/smc91111_eeprom
+Kermit>connect
+
+Connecting to /dev/ttyS0, speed 57600
+ Escape character: Ctrl-\ (ASCII 28, FS): enabled
+Type the escape character followed by C to get back,
+or followed by ? to see other options.
+----------------------------------------------------
+## Total Size     = 0x00002266 = 8806 Bytes
+## Start Addr     = 0x01000000
+
+BOOT> bootelf 0x1000000
+
+Loading .text @ 0x00001000 (3440 bytes)
+## Starting application at 0x000010d8 ...
+
+SMC91111>
+
+b) Loading the binary file via the serial port
+-----------------------------------------------
+For many toolchains, the entry point is not the load point.
+The Load point is a hard coded address from the
+examples/Makefile. The entry point can be found by doing something
+like:
+
+  u-boot_1.1.1/examples> bfin-elf-objdump -d smc91111_eeprom |less
+
+  smc91111_eeprom:     file format elf32-bfin
+
+  Disassembly of section .text:
+
+  00001000 <smc91111_eeprom-0xd8>:
+      1000:
+  000010d8 <smc91111_eeprom>:
+
+You can see that the entry point (or the address that should be
+jumped to is 0x10d8). This is also the same as the entry point
+of the elf file.
+
+Now we load it to the actual load location:
+
+BOOT> loadb 0x1000
+
+## Ready for binary (kermit) download to 0x00001000 at 57600 bps...
+
+(Back at pinky.dsl-only.net)
+----------------------------------------------------
+Kermit>send /tftpboot/eeprom.bin
+Kermit>connect
+
+Connecting to /dev/ttyS0, speed 57600
+ Escape character: Ctrl-\ (ASCII 28, FS): enabled
+Type the escape character followed by C to get back,
+or followed by ? to see other options.
+----------------------------------------------------
+## Total Size     = 0x00000d70 = 3440 Bytes
+## Start Addr     = 0x00001000
+
+BOOT> go 0x10D8
+
+## Starting application at 0x000010D8 ...
+
+SMC91111>
+
+3. Setting MAC addresses
+--------------------------------------------------------------------------
+
+The MAC address can be stored in four locations:
+
+-Boot environmental variable in Flash <- can not change, without
+                                         re-flashing U-boot.
+U-Boot environental variable          <- can not change, without
+                                         resetting board/U-Boot
+LAN91C111 Registers                   <- volitle
+LAN91C111 EEPROM                      <- Non Volitle
+
+If you have not activated the network, and do not have a hardcoded
+or pre-assigned MAC address in U-boot, the environmental variables
+should be blank, and allow you to set things one time.
+
+To set the EEPROM MAC address to 12:34:56:78:9A:BC
+
+SMC91111> W E 20 3412
+
+Writing EEPROM register 20 with 3412
+SMC91111> W E 21 7856
+
+Writing EEPROM register 21 with 7856
+SMC91111> W E 22 BC9A
+
+Writing EEPROM register 22 with bc9a
+EEPROM contents copied to MAC
+SMC91111> P
+
+Current MAC Address in SMSC91111 12:34:56:78:9a:bc
+Current MAC Address in EEPROM   12:34:56:78:9a:bc
+
+(CNTRL-C to exit)
+SMC91111> ## Application terminated, rc = 0x0
+
+BOOT> reset
+U-Boot 1.1.1 (gcc version: 3.3.3)
+Release Version Beta released on Oct 10 2004 - 00:34:35
+Blackfin support by LG Soft India
+For further information please check this link http://www.blackfin.uclinux.org
+BOOT> ping 192.168.0.4
+
+Using MAC Address 12:34:56:78:9A:BC
+host 192.168.0.4 is alive
+
+
+4. Other things that you can do
+--------------------------------------------------------------------------
+After the stand alone application is running, there are a few options:
+ - P : Print the MAC
+ - D : Dump the LAN91C111 EEPROM contents
+ - M : Dump the LAN91C111 MAC contents
+ - C : Copies the MAC address from the EEPROM to the LAN91C111
+ - W : Write a register in the EEPROM or in the MAC
+
+SMC91111> P
+
+Current MAC Address in SMSC91111 12:34:56:78:9a:bc
+Current MAC Address in EEPROM   12:34:56:78:9a:bc
+
+SMC91111> D
+
+IOS2-0   000     001     002     003     004     005     006     007
+CONFIG 00:ffff 04:ffff 08:ffff 0c:ffff 10:ffff 14:ffff 18:ffff 1c:ffff
+BASE   01:ffff 05:ffff 09:ffff 0d:ffff 11:ffff 15:ffff 19:ffff 1d:ffff
+       02:ffff 06:ffff 0a:ffff 0e:0020 12:ffff 16:ffff 1a:ffff 1e:ffff
+       03:ffff 07:ffff 0b:ffff 0f:ffff 13:ffff 17:ffff 1b:ffff 1f:ffff
+
+20:3412 21:7856 22:bc9a 23:ffff 24:ffff 25:ffff 26:ffff 27:ffff
+28:ffff 29:ffff 2a:ffff 2b:ffff 2c:ffff 2d:ffff 2e:ffff 2f:ffff
+30:ffff 31:ffff 32:ffff 33:ffff 34:ffff 35:ffff 36:ffff 37:ffff
+38:ffff 39:ffff 3a:ffff 3b:ffff 3c:ffff 3d:ffff 3e:ffff 3f:ffff
+
+SMC91111> M
+
+    Bank0 Bank1 Bank2 Bank3
+00  0000  a0b1 3332  0000
+02  0000  1801 8000  0000
+04  0000  3412 8080  0000
+06  0000  7856 003f  0000
+08  0404  bc9a 02df  3332
+0a  0000  ffff 02df  3391
+0c  0000  1214 0004  001f
+0e  3300  3301 3302  3303
+
+SMC91111> C
+
+EEPROM contents copied to MAC
+
+SMC91111> W E 2A ABCD
+
+Writing EEPROM register 2a with abcd
+
+SMC91111> W M 14 FF00
+
+Writing MAC register bank 1, reg 04 with ff00
diff --git a/examples/standalone/eepro100_eeprom.c b/examples/standalone/eepro100_eeprom.c
new file mode 100644 (file)
index 0000000..2b15d05
--- /dev/null
@@ -0,0 +1,215 @@
+/*
+ * Copyright 1998-2001 by Donald Becker.
+ * This software may be used and distributed according to the terms of
+ * the GNU General Public License (GPL), incorporated herein by reference.
+ * Contact the author for use under other terms.
+ *
+ * This program must be compiled with "-O"!
+ * See the bottom of this file for the suggested compile-command.
+ *
+ * The author may be reached as becker@scyld.com, or C/O
+ *  Scyld Computing Corporation
+ *  410 Severn Ave., Suite 210
+ *  Annapolis MD 21403
+ *
+ * Common-sense licensing statement: Using any portion of this program in
+ * your own program means that you must give credit to the original author
+ * and release the resulting code under the GPL.
+ */
+
+/* avoid unnecessary memcpy function */
+#define __HAVE_ARCH_MEMCPY
+#define _PPC_STRING_H_
+
+#include <common.h>
+#include <exports.h>
+
+static int reset_eeprom(unsigned long ioaddr, unsigned char *hwaddr);
+
+int eepro100_eeprom(int argc, char *argv[])
+{
+       int ret = 0;
+
+       unsigned char hwaddr1[6] = { 0x00, 0x00, 0x02, 0x03, 0x04, 0x05 };
+       unsigned char hwaddr2[6] = { 0x00, 0x00, 0x02, 0x03, 0x04, 0x06 };
+
+       app_startup(argv);
+
+#if defined(CONFIG_OXC)
+       ret |= reset_eeprom(0x80000000, hwaddr1);
+       ret |= reset_eeprom(0x81000000, hwaddr2);
+#endif
+
+       return ret;
+}
+
+/* Default EEPROM for i82559 */
+static unsigned short default_eeprom[64] = {
+       0x0100, 0x0302, 0x0504, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+       0xffff, 0xffff, 0x40c0, 0x0000, 0x0000, 0xffff, 0xffff, 0xffff,
+       0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+       0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+       0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+       0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+       0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,
+       0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff
+};
+
+static unsigned short eeprom[256];
+
+static int eeprom_size = 64;
+static int eeprom_addr_size = 6;
+
+static int debug = 0;
+
+static inline unsigned short swap16(unsigned short x)
+{
+       return (((x & 0xff) << 8) | ((x & 0xff00) >> 8));
+}
+
+static inline void outw(short data, long addr)
+{
+       *(volatile short *)(addr) = swap16(data);
+}
+
+static inline short inw(long addr)
+{
+       return swap16(*(volatile short *)(addr));
+}
+
+static inline void *memcpy(void *dst, const void *src, unsigned int len)
+{
+       char *ret = dst;
+       while (len-- > 0) {
+               *ret++ = *((char *)src);
+               src++;
+       }
+       return (void *)ret;
+}
+
+/* The EEPROM commands include the alway-set leading bit. */
+#define EE_WRITE_CMD   (5)
+#define EE_READ_CMD            (6)
+#define EE_ERASE_CMD   (7)
+
+/* Serial EEPROM section. */
+#define EE_SHIFT_CLK   0x01    /* EEPROM shift clock. */
+#define EE_CS                  0x02    /* EEPROM chip select. */
+#define EE_DATA_WRITE  0x04    /* EEPROM chip data in. */
+#define EE_DATA_READ   0x08    /* EEPROM chip data out. */
+#define EE_ENB                 (0x4800 | EE_CS)
+#define EE_WRITE_0             0x4802
+#define EE_WRITE_1             0x4806
+#define EE_OFFSET              14
+
+/* Delay between EEPROM clock transitions. */
+#define eeprom_delay(ee_addr)  inw(ee_addr)
+
+/* Wait for the EEPROM to finish the previous operation. */
+static int eeprom_busy_poll(long ee_ioaddr)
+{
+       int i;
+       outw(EE_ENB, ee_ioaddr);
+       for (i = 0; i < 10000; i++)                     /* Typical 2000 ticks */
+               if (inw(ee_ioaddr) & EE_DATA_READ)
+                       break;
+       return i;
+}
+
+/* This executes a generic EEPROM command, typically a write or write enable.
+   It returns the data output from the EEPROM, and thus may also be used for
+   reads. */
+static int do_eeprom_cmd(long ioaddr, int cmd, int cmd_len)
+{
+       unsigned retval = 0;
+       long ee_addr = ioaddr + EE_OFFSET;
+
+       if (debug > 1)
+               printf(" EEPROM op 0x%x: ", cmd);
+
+       outw(EE_ENB | EE_SHIFT_CLK, ee_addr);
+
+       /* Shift the command bits out. */
+       do {
+               short dataval = (cmd & (1 << cmd_len)) ? EE_WRITE_1 : EE_WRITE_0;
+               outw(dataval, ee_addr);
+               eeprom_delay(ee_addr);
+               if (debug > 2)
+                       printf("%X", inw(ee_addr) & 15);
+               outw(dataval | EE_SHIFT_CLK, ee_addr);
+               eeprom_delay(ee_addr);
+               retval = (retval << 1) | ((inw(ee_addr) & EE_DATA_READ) ? 1 : 0);
+       } while (--cmd_len >= 0);
+#if 0
+       outw(EE_ENB, ee_addr);
+#endif
+       /* Terminate the EEPROM access. */
+       outw(EE_ENB & ~EE_CS, ee_addr);
+       if (debug > 1)
+               printf(" EEPROM result is 0x%5.5x.\n", retval);
+       return retval;
+}
+
+static int read_eeprom(long ioaddr, int location, int addr_len)
+{
+       return do_eeprom_cmd(ioaddr, ((EE_READ_CMD << addr_len) | location)
+               << 16 , 3 + addr_len + 16) & 0xffff;
+}
+
+static void write_eeprom(long ioaddr, int index, int value, int addr_len)
+{
+       long ee_ioaddr = ioaddr + EE_OFFSET;
+       int i;
+
+       /* Poll for previous op finished. */
+       eeprom_busy_poll(ee_ioaddr);                    /* Typical 0 ticks */
+       /* Enable programming modes. */
+       do_eeprom_cmd(ioaddr, (0x4f << (addr_len-4)), 3 + addr_len);
+       /* Do the actual write. */
+       do_eeprom_cmd(ioaddr,
+                                 (((EE_WRITE_CMD<<addr_len) | index)<<16) | (value & 0xffff),
+                                 3 + addr_len + 16);
+       /* Poll for write finished. */
+       i = eeprom_busy_poll(ee_ioaddr);                        /* Typical 2000 ticks */
+       if (debug)
+               printf(" Write finished after %d ticks.\n", i);
+       /* Disable programming. This command is not instantaneous, so we check
+          for busy before the next op. */
+       do_eeprom_cmd(ioaddr, (0x40 << (addr_len-4)), 3 + addr_len);
+       eeprom_busy_poll(ee_ioaddr);
+}
+
+static int reset_eeprom(unsigned long ioaddr, unsigned char *hwaddr)
+{
+       unsigned short checksum = 0;
+       int size_test;
+       int i;
+
+       printf("Resetting i82559 EEPROM @ 0x%08lX ... ", ioaddr);
+
+       size_test = do_eeprom_cmd(ioaddr, (EE_READ_CMD << 8) << 16, 27);
+       eeprom_addr_size = (size_test & 0xffe0000) == 0xffe0000 ? 8 : 6;
+       eeprom_size = 1 << eeprom_addr_size;
+
+       memcpy(eeprom, default_eeprom, sizeof default_eeprom);
+
+       for (i = 0; i < 3; i++)
+               eeprom[i] = (hwaddr[i*2+1]<<8) + hwaddr[i*2];
+
+       /* Recalculate the checksum. */
+       for (i = 0; i < eeprom_size - 1; i++)
+               checksum += eeprom[i];
+       eeprom[i] = 0xBABA - checksum;
+
+       for (i = 0; i < eeprom_size; i++)
+               write_eeprom(ioaddr, i, eeprom[i], eeprom_addr_size);
+
+       for (i = 0; i < eeprom_size; i++)
+               if (read_eeprom(ioaddr, i, eeprom_addr_size) != eeprom[i]) {
+                       printf("failed\n");
+                       return 1;
+               }
+
+       printf("done\n");
+       return 0;
+}
diff --git a/examples/standalone/hello_world.c b/examples/standalone/hello_world.c
new file mode 100644 (file)
index 0000000..9317f6d
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * (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 <exports.h>
+
+int hello_world (int argc, char *argv[])
+{
+       int i;
+
+       /* Print the ABI version */
+       app_startup(argv);
+       printf ("Example expects ABI version %d\n", XF_VERSION);
+       printf ("Actual U-Boot ABI version %d\n", (int)get_version());
+
+       printf ("Hello World\n");
+
+       printf ("argc = %d\n", argc);
+
+       for (i=0; i<=argc; ++i) {
+               printf ("argv[%d] = \"%s\"\n",
+                       i,
+                       argv[i] ? argv[i] : "<NULL>");
+       }
+
+       printf ("Hit any key to exit ... ");
+       while (!tstc())
+               ;
+       /* consume input */
+       (void) getc();
+
+       printf ("\n\n");
+       return (0);
+}
diff --git a/examples/standalone/interrupt.c b/examples/standalone/interrupt.c
new file mode 100644 (file)
index 0000000..f3061d1
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * (C) Copyright 2006
+ * Detlev Zundel, DENX Software Engineering, dzu@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
+ *
+ * This is a very simple standalone application demonstrating
+ * catching IRQs on the MPC52xx architecture.
+ *
+ * The interrupt to be intercepted can be specified as an argument
+ * to the application.  Specifying nothing will intercept IRQ1 on the
+ * MPC5200 platform.  On the CR825 carrier board from MicroSys this
+ * maps to the ABORT switch :)
+ *
+ * Note that the specified vector is only a logical number specified
+ * by the respective header file.
+ */
+
+#include <common.h>
+#include <exports.h>
+#include <config.h>
+
+#if defined(CONFIG_MPC5xxx)
+#define DFL_IRQ MPC5XXX_IRQ1
+#else
+#define DFL_IRQ 0
+#endif
+
+static void irq_handler (void *arg);
+
+int interrupt (int argc, char *argv[])
+{
+       int c, irq = -1;
+
+       app_startup (argv);
+
+       if (argc > 1)
+               irq = simple_strtoul (argv[1], NULL, 0);
+       if ((irq < 0) || (irq > NR_IRQS))
+               irq = DFL_IRQ;
+
+       printf ("Installing handler for irq vector %d and doing busy wait\n",
+               irq);
+       printf ("Press 'q' to quit\n");
+
+       /* Install interrupt handler */
+       install_hdlr (irq, irq_handler, NULL);
+       while ((c = getc ()) != 'q') {
+               printf ("Ok, ok, I am still alive!\n");
+       }
+
+       free_hdlr (irq);
+       printf ("\nInterrupt handler has been uninstalled\n");
+
+       return (0);
+}
+
+/*
+ * Handler for interrupt
+ */
+static void irq_handler (void *arg)
+{
+       /* just for demonstration */
+       printf ("+");
+}
diff --git a/examples/standalone/mem_to_mem_idma2intr.c b/examples/standalone/mem_to_mem_idma2intr.c
new file mode 100644 (file)
index 0000000..15779d0
--- /dev/null
@@ -0,0 +1,384 @@
+/* The dpalloc function used and implemented in this file was derieved
+ * from PPCBoot/U-Boot file "cpu/mpc8260/commproc.c".
+ */
+
+/* Author: Arun Dharankar <ADharankar@ATTBI.Com>
+ * This example is meant to only demonstrate how the IDMA could be used.
+ */
+
+/*
+ * This file is based on "arch/ppc/8260_io/commproc.c" - here is it's
+ * copyright notice:
+ *
+ * General Purpose functions for the global management of the
+ * 8260 Communication Processor Module.
+ * Copyright (c) 1999 Dan Malek (dmalek@jlc.net)
+ * Copyright (c) 2000 MontaVista Software, Inc (source@mvista.com)
+ *  2.3.99 Updates
+ *
+ * In addition to the individual control of the communication
+ * channels, there are a few functions that globally affect the
+ * communication processor.
+ *
+ * Buffer descriptors must be allocated from the dual ported memory
+ * space.  The allocator for that is here.  When the communication
+ * process is reset, we reclaim the memory available.  There is
+ * currently no deallocator for this memory.
+ */
+
+
+#include <common.h>
+#include <exports.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#define STANDALONE
+
+#ifndef STANDALONE                     /* Linked into/Part of  PPCBoot */
+#include <command.h>
+#include <watchdog.h>
+#else                                  /* Standalone app of PPCBoot */
+#define WATCHDOG_RESET() {                                             \
+                       *(ushort *)(CONFIG_SYS_IMMR + 0x1000E) = 0x556c;        \
+                       *(ushort *)(CONFIG_SYS_IMMR + 0x1000E) = 0xaa39;        \
+               }
+#endif /* STANDALONE */
+
+static int debug = 1;
+
+#define DEBUG(fmt, args...)     {                                      \
+       if(debug != 0) {                                                \
+               printf("[%s %d %s]: ",__FILE__,__LINE__,__FUNCTION__);  \
+               printf(fmt, ##args);                                    \
+       }                                                               \
+}
+
+#define CPM_CR_IDMA1_SBLOCK  (0x14)
+#define CPM_CR_IDMA2_SBLOCK  (0x15)
+#define CPM_CR_IDMA3_SBLOCK  (0x16)
+#define CPM_CR_IDMA4_SBLOCK  (0x17)
+#define CPM_CR_IDMA1_PAGE    (0x07)
+#define CPM_CR_IDMA2_PAGE    (0x08)
+#define CPM_CR_IDMA3_PAGE    (0x09)
+#define CPM_CR_IDMA4_PAGE    (0x0a)
+#define PROFF_IDMA1_BASE     ((uint)0x87fe)
+#define PROFF_IDMA2_BASE     ((uint)0x88fe)
+#define PROFF_IDMA3_BASE     ((uint)0x89fe)
+#define PROFF_IDMA4_BASE     ((uint)0x8afe)
+
+#define CPM_CR_INIT_TRX     ((ushort)0x0000)
+#define CPM_CR_FLG  ((ushort)0x0001)
+
+#define mk_cr_cmd(PG, SBC, MCN, OP) \
+    ((PG << 26) | (SBC << 21) | (MCN << 6) | OP)
+
+
+#pragma pack(1)
+typedef struct ibdbits {
+       unsigned b_valid:1;
+       unsigned b_resv1:1;
+       unsigned b_wrap:1;
+       unsigned b_interrupt:1;
+       unsigned b_last:1;
+       unsigned b_resv2:1;
+       unsigned b_cm:1;
+       unsigned b_resv3:2;
+       unsigned b_sdn:1;
+       unsigned b_ddn:1;
+       unsigned b_dgbl:1;
+       unsigned b_dbo:2;
+       unsigned b_resv4:1;
+       unsigned b_ddtb:1;
+       unsigned b_resv5:2;
+       unsigned b_sgbl:1;
+       unsigned b_sbo:2;
+       unsigned b_resv6:1;
+       unsigned b_sdtb:1;
+       unsigned b_resv7:9;
+} ibdbits_t;
+
+#pragma pack(1)
+typedef union ibdbitsu {
+       ibdbits_t b;
+       uint i;
+} ibdbitsu_t;
+
+#pragma pack(1)
+typedef struct idma_buf_desc {
+       ibdbitsu_t ibd_bits;            /* Status and Control */
+       uint ibd_datlen;                /* Data length in buffer */
+       uint ibd_sbuf;                  /* Source buffer addr in host mem */
+       uint ibd_dbuf;                  /* Destination buffer addr in host mem */
+} ibd_t;
+
+
+#pragma pack(1)
+typedef struct dcmbits {
+       unsigned b_fb:1;
+       unsigned b_lp:1;
+       unsigned b_resv1:3;
+       unsigned b_tc2:1;
+       unsigned b_resv2:1;
+       unsigned b_wrap:3;
+       unsigned b_sinc:1;
+       unsigned b_dinc:1;
+       unsigned b_erm:1;
+       unsigned b_dt:1;
+       unsigned b_sd:2;
+} dcmbits_t;
+
+#pragma pack(1)
+typedef union dcmbitsu {
+       dcmbits_t b;
+       ushort i;
+} dcmbitsu_t;
+
+#pragma pack(1)
+typedef struct pram_idma {
+       ushort pi_ibase;
+       dcmbitsu_t pi_dcmbits;
+       ushort pi_ibdptr;
+       ushort pi_dprbuf;
+       ushort pi_bufinv;               /* internal to CPM */
+       ushort pi_ssmax;
+       ushort pi_dprinptr;             /* internal to CPM */
+       ushort pi_sts;
+       ushort pi_dproutptr;            /* internal to CPM */
+       ushort pi_seob;
+       ushort pi_deob;
+       ushort pi_dts;
+       ushort pi_retadd;
+       ushort pi_resv1;                /* internal to CPM */
+       uint pi_bdcnt;
+       uint pi_sptr;
+       uint pi_dptr;
+       uint pi_istate;
+} pram_idma_t;
+
+
+volatile immap_t *immap = (immap_t *) CONFIG_SYS_IMMR;
+volatile ibd_t *bdf;
+volatile pram_idma_t *piptr;
+
+volatile int dmadone;
+volatile int *dmadonep = &dmadone;
+void dmadone_handler (void *);
+
+int idma_init (void);
+void idma_start (int, int, int, uint, uint, int);
+uint dpalloc (uint, uint);
+
+
+uint dpinit_done = 0;
+
+
+#ifdef STANDALONE
+int ctrlc (void)
+{
+       if (tstc()) {
+               switch (getc ()) {
+               case 0x03:              /* ^C - Control C */
+                       return 1;
+               default:
+                       break;
+               }
+       }
+       return 0;
+}
+void * memset(void * s,int c,size_t count)
+{
+       char *xs = (char *) s;
+       while (count--)
+               *xs++ = c;
+       return s;
+}
+int memcmp(const void * cs,const void * ct,size_t count)
+{
+       const unsigned char *su1, *su2;
+       int res = 0;
+       for( su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)
+               if ((res = *su1 - *su2) != 0)
+                       break;
+       return res;
+}
+#endif /* STANDALONE */
+
+#ifdef STANDALONE
+int mem_to_mem_idma2intr (int argc, char *argv[])
+#else
+int do_idma (bd_t * bd, int argc, char *argv[])
+#endif /* STANDALONE */
+{
+       int i;
+
+       app_startup(argv);
+       dpinit_done = 0;
+
+       idma_init ();
+
+       DEBUG ("Installing dma handler\n");
+       install_hdlr (7, dmadone_handler, (void *) bdf);
+
+       memset ((void *) 0x100000, 'a', 512);
+       memset ((void *) 0x200000, 'b', 512);
+
+       for (i = 0; i < 32; i++) {
+               printf ("Startin IDMA, iteration=%d\n", i);
+               idma_start (1, 1, 512, 0x100000, 0x200000, 3);
+       }
+
+       DEBUG ("Uninstalling dma handler\n");
+       free_hdlr (7);
+
+       return 0;
+}
+
+void
+idma_start (int sinc, int dinc, int sz, uint sbuf, uint dbuf, int ttype)
+{
+       /* ttype is for M-M, M-P, P-M or P-P: not used for now */
+
+       piptr->pi_istate = 0;   /* manual says: clear it before every START_IDMA */
+       piptr->pi_dcmbits.b.b_resv1 = 0;
+
+       if (sinc == 1)
+               piptr->pi_dcmbits.b.b_sinc = 1;
+       else
+               piptr->pi_dcmbits.b.b_sinc = 0;
+
+       if (dinc == 1)
+               piptr->pi_dcmbits.b.b_dinc = 1;
+       else
+               piptr->pi_dcmbits.b.b_dinc = 0;
+
+       piptr->pi_dcmbits.b.b_erm = 0;
+       piptr->pi_dcmbits.b.b_sd = 0x00;        /* M-M */
+
+       bdf->ibd_sbuf = sbuf;
+       bdf->ibd_dbuf = dbuf;
+       bdf->ibd_bits.b.b_cm = 0;
+       bdf->ibd_bits.b.b_interrupt = 1;
+       bdf->ibd_bits.b.b_wrap = 1;
+       bdf->ibd_bits.b.b_last = 1;
+       bdf->ibd_bits.b.b_sdn = 0;
+       bdf->ibd_bits.b.b_ddn = 0;
+       bdf->ibd_bits.b.b_dgbl = 0;
+       bdf->ibd_bits.b.b_ddtb = 0;
+       bdf->ibd_bits.b.b_sgbl = 0;
+       bdf->ibd_bits.b.b_sdtb = 0;
+       bdf->ibd_bits.b.b_dbo = 1;
+       bdf->ibd_bits.b.b_sbo = 1;
+       bdf->ibd_bits.b.b_valid = 1;
+       bdf->ibd_datlen = 512;
+
+       *dmadonep = 0;
+
+       immap->im_sdma.sdma_idmr2 = (uchar) 0xf;
+
+       immap->im_cpm.cp_cpcr = mk_cr_cmd (CPM_CR_IDMA2_PAGE,
+                                          CPM_CR_IDMA2_SBLOCK, 0x0,
+                                          0x9) | 0x00010000;
+
+       while (*dmadonep != 1) {
+               if (ctrlc ()) {
+                       DEBUG ("\nInterrupted waiting for DMA interrupt.\n");
+                       goto done;
+               }
+               printf ("Waiting for DMA interrupt (dmadone=%d b_valid = %d)...\n",
+                       dmadone, bdf->ibd_bits.b.b_valid);
+               udelay (1000000);
+       }
+       printf ("DMA complete notification received!\n");
+
+  done:
+       DEBUG ("memcmp(0x%08x, 0x%08x, 512) = %d\n",
+               sbuf, dbuf, memcmp ((void *) sbuf, (void *) dbuf, 512));
+
+       return;
+}
+
+#define MAX_INT_BUFSZ  64
+#define DCM_WRAP        0      /* MUST be consistant with MAX_INT_BUFSZ */
+
+int idma_init (void)
+{
+       uint memaddr;
+
+       immap->im_cpm.cp_rccr &= ~0x00F3FFFF;
+       immap->im_cpm.cp_rccr |= 0x00A00A00;
+
+       memaddr = dpalloc (sizeof (pram_idma_t), 64);
+
+       *(volatile ushort *) &immap->im_dprambase[PROFF_IDMA2_BASE] = memaddr;
+       piptr = (volatile pram_idma_t *) ((uint) (immap) + memaddr);
+
+       piptr->pi_resv1 = 0;            /* manual says: clear it */
+       piptr->pi_dcmbits.b.b_fb = 0;
+       piptr->pi_dcmbits.b.b_lp = 1;
+       piptr->pi_dcmbits.b.b_erm = 0;
+       piptr->pi_dcmbits.b.b_dt = 0;
+
+       memaddr = (uint) dpalloc (sizeof (ibd_t), 64);
+       piptr->pi_ibase = piptr->pi_ibdptr = (volatile short) memaddr;
+       bdf = (volatile ibd_t *) ((uint) (immap) + memaddr);
+       bdf->ibd_bits.b.b_valid = 0;
+
+       memaddr = (uint) dpalloc (64, 64);
+       piptr->pi_dprbuf = (volatile ushort) memaddr;
+       piptr->pi_dcmbits.b.b_wrap = 4;
+       piptr->pi_ssmax = 32;
+
+       piptr->pi_sts = piptr->pi_ssmax;
+       piptr->pi_dts = piptr->pi_ssmax;
+
+       return 1;
+}
+
+void dmadone_handler (void *arg)
+{
+       immap->im_sdma.sdma_idmr2 = (uchar) 0x0;
+
+       *dmadonep = 1;
+
+       return;
+}
+
+
+static uint dpbase = 0;
+
+uint dpalloc (uint size, uint align)
+{
+       volatile immap_t *immr = (immap_t *) CONFIG_SYS_IMMR;
+       uint retloc;
+       uint align_mask, off;
+       uint savebase;
+
+       /* Pointer to initial global data area */
+
+       if (dpinit_done == 0) {
+               dpbase = gd->dp_alloc_base;
+               dpinit_done = 1;
+       }
+
+       align_mask = align - 1;
+       savebase = dpbase;
+
+       if ((off = (dpbase & align_mask)) != 0)
+               dpbase += (align - off);
+
+       if ((off = size & align_mask) != 0)
+               size += align - off;
+
+       if ((dpbase + size) >= gd->dp_alloc_top) {
+               dpbase = savebase;
+               printf ("dpalloc: ran out of dual port ram!");
+               return 0;
+       }
+
+       retloc = dpbase;
+       dpbase += size;
+
+       memset ((void *) &immr->im_dprambase[retloc], 0, size);
+
+       return (retloc);
+}
diff --git a/examples/standalone/mips.lds b/examples/standalone/mips.lds
new file mode 100644 (file)
index 0000000..717b201
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * (C) Copyright 2003
+ * Wolfgang Denk 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_FORMAT("elf32-bigmips", "elf32-bigmips", "elf32-bigmips")
+*/
+OUTPUT_FORMAT("elf32-tradbigmips", "elf32-tradbigmips", "elf32-tradbigmips")
+OUTPUT_ARCH(mips)
+SECTIONS
+{
+       .text       :
+       {
+         *(.text)
+       }
+
+       . = ALIGN(4);
+       .rodata  : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
+
+       . = ALIGN(4);
+       .data  : { *(.data) }
+
+       . = .;
+       _gp = ALIGN(16) + 0x7ff0;
+
+       .got : {
+         __got_start = .;
+         *(.got)
+         __got_end = .;
+       }
+
+       .sdata  : { *(.sdata) }
+
+       . = ALIGN(4);
+       __bss_start = .;
+       .sbss (NOLOAD) : { *(.sbss) }
+       .bss (NOLOAD)  : { *(.bss) . = ALIGN(4); }
+
+       _end = .;
+}
diff --git a/examples/standalone/nios.lds b/examples/standalone/nios.lds
new file mode 100644 (file)
index 0000000..4c1080b
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * (C) Copyright 2003, Psyent Corporation <www.psyent.com>
+ * Scott McNutt <smcnutt@psyent.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
+ */
+
+
+OUTPUT_FORMAT("elf32-nios")
+OUTPUT_ARCH(nios)
+ENTRY(_start)
+
+SECTIONS
+{
+       .text :
+       {
+         *(.text)
+       }
+       __text_end = .;
+
+       . = ALIGN(4);
+       .rodata :
+       {
+               *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
+       }
+       __rodata_end = .;
+
+       . = ALIGN(4);
+       .data :
+       {
+               *(.data)
+       }
+       . = ALIGN(4);
+       __data_end = .;
+
+       __bss_start = .;
+       . = ALIGN(4);
+       .bss (NOLOAD) :
+       {
+               *(.bss)
+       }
+       . = ALIGN(4);
+       __bss_end = .;
+       _end = .;
+}
diff --git a/examples/standalone/nios2.lds b/examples/standalone/nios2.lds
new file mode 100644 (file)
index 0000000..a3e5ea8
--- /dev/null
@@ -0,0 +1,133 @@
+/*
+ * (C) Copyright 2004, Psyent Corporation <www.psyent.com>
+ * Scott McNutt <smcnutt@psyent.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
+ */
+
+
+OUTPUT_FORMAT("elf32-littlenios2")
+OUTPUT_ARCH(nios2)
+ENTRY(_start)
+
+SECTIONS
+{
+       .text :
+       {
+         *(.text)
+         *(.text.*)
+         *(.gnu.linkonce.t*)
+         *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
+         *(.gnu.linkonce.r*)
+       }
+       . = ALIGN (4);
+       _etext = .;
+       PROVIDE (etext = .);
+
+       /* INIT DATA sections - "Small" data (see the gcc -G option)
+        * is always gp-relative. Here we make all init data sections
+        * adjacent to simplify the startup code -- and provide
+        * the global pointer for gp-relative access.
+        */
+       _data = .;
+       .data :
+       {
+         *(.data)
+         *(.data.*)
+         *(.gnu.linkonce.d*)
+       }
+
+       . = ALIGN(16);
+       _gp = .;                        /* Global pointer addr */
+       PROVIDE (gp = .);
+
+       .sdata :
+       {
+         *(.sdata)
+         *(.sdata.*)
+         *(.gnu.linkonce.s.*)
+       }
+       . = ALIGN(4);
+
+       _edata = .;
+       PROVIDE (edata = .);
+
+       /* UNINIT DATA - Small uninitialized data is first so it's
+        * adjacent to sdata and can be referenced via gp. The normal
+        * bss follows. We keep it adjacent to simplify init code.
+        */
+       __bss_start = .;
+       .sbss (NOLOAD) :
+       {
+         *(.sbss)
+         *(.sbss.*)
+         *(.gnu.linkonce.sb.*)
+         *(.scommon)
+       }
+       . = ALIGN(4);
+       .bss (NOLOAD) :
+       {
+         *(.bss)
+         *(.bss.*)
+         *(.dynbss)
+         *(COMMON)
+         *(.scommon)
+       }
+       . = ALIGN(4);
+       _end = .;
+       PROVIDE (end = .);
+
+       /* CMD TABLE - uboot command sections
+        */
+       . = .;
+       __uboot_cmd_start = .;
+       .u_boot_cmd :
+       {
+         *(.u_boot_cmd)
+       }
+       . = ALIGN(4);
+       __u_boot_cmd_end = .;
+
+       /* DEBUG -- symbol table, string table, etc. etc.
+        */
+       .stab 0 : { *(.stab) }
+       .stabstr 0 : { *(.stabstr) }
+       .stab.excl 0 : { *(.stab.excl) }
+       .stab.exclstr 0 : { *(.stab.exclstr) }
+       .stab.index 0 : { *(.stab.index) }
+       .stab.indexstr 0 : { *(.stab.indexstr) }
+       .comment 0 : { *(.comment) }
+       .debug          0 : { *(.debug) }
+       .line           0 : { *(.line) }
+       .debug_srcinfo  0 : { *(.debug_srcinfo) }
+       .debug_sfnames  0 : { *(.debug_sfnames) }
+       .debug_aranges  0 : { *(.debug_aranges) }
+       .debug_pubnames 0 : { *(.debug_pubnames) }
+       .debug_info     0 : { *(.debug_info) }
+       .debug_abbrev   0 : { *(.debug_abbrev) }
+       .debug_line     0 : { *(.debug_line) }
+       .debug_frame    0 : { *(.debug_frame) }
+       .debug_str      0 : { *(.debug_str) }
+       .debug_loc      0 : { *(.debug_loc) }
+       .debug_macinfo  0 : { *(.debug_macinfo) }
+       .debug_weaknames 0 : { *(.debug_weaknames) }
+       .debug_funcnames 0 : { *(.debug_funcnames) }
+       .debug_typenames 0 : { *(.debug_typenames) }
+       .debug_varnames  0 : { *(.debug_varnames) }
+}
diff --git a/examples/standalone/ppc_longjmp.S b/examples/standalone/ppc_longjmp.S
new file mode 100644 (file)
index 0000000..5ca6f6f
--- /dev/null
@@ -0,0 +1,79 @@
+/* longjmp for PowerPC.
+   Copyright (C) 1995, 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <ppc_asm.tmpl>
+
+# define JB_GPR1   0  /* Also known as the stack pointer */
+# define JB_GPR2   1
+# define JB_LR     2  /* The address we will return to */
+# define JB_GPRS   3  /* GPRs 14 through 31 are saved, 18 in total */
+# define JB_CR     21 /* Condition code registers. */
+# define JB_FPRS   22 /* FPRs 14 through 31 are saved, 18*2 words total */
+# define JB_SIZE   (58*4)
+
+#define FP(x...) x
+#define FP(x...) x
+
+.globl      ppc_longjmp;
+
+ppc_longjmp:
+       lwz r1,(JB_GPR1*4)(r3)
+       lwz r2,(JB_GPR2*4)(r3)
+       lwz r0,(JB_LR*4)(r3)
+       lwz r14,((JB_GPRS+0)*4)(r3)
+FP(    lfd 14,((JB_FPRS+0*2)*4)(r3))
+       lwz r15,((JB_GPRS+1)*4)(r3)
+FP(    lfd 15,((JB_FPRS+1*2)*4)(r3))
+       lwz r16,((JB_GPRS+2)*4)(r3)
+FP(    lfd 16,((JB_FPRS+2*2)*4)(r3))
+       lwz r17,((JB_GPRS+3)*4)(r3)
+FP(    lfd 17,((JB_FPRS+3*2)*4)(r3))
+       lwz r18,((JB_GPRS+4)*4)(r3)
+FP(    lfd 18,((JB_FPRS+4*2)*4)(r3))
+       lwz r19,((JB_GPRS+5)*4)(r3)
+FP(    lfd 19,((JB_FPRS+5*2)*4)(r3))
+       lwz r20,((JB_GPRS+6)*4)(r3)
+FP(    lfd 20,((JB_FPRS+6*2)*4)(r3))
+       mtlr r0
+       lwz r21,((JB_GPRS+7)*4)(r3)
+FP(    lfd 21,((JB_FPRS+7*2)*4)(r3))
+       lwz r22,((JB_GPRS+8)*4)(r3)
+FP(    lfd 22,((JB_FPRS+8*2)*4)(r3))
+       lwz r0,(JB_CR*4)(r3)
+       lwz r23,((JB_GPRS+9)*4)(r3)
+FP(    lfd 23,((JB_FPRS+9*2)*4)(r3))
+       lwz r24,((JB_GPRS+10)*4)(r3)
+FP(    lfd 24,((JB_FPRS+10*2)*4)(r3))
+       lwz r25,((JB_GPRS+11)*4)(r3)
+FP(    lfd 25,((JB_FPRS+11*2)*4)(r3))
+       mtcrf 0xFF,r0
+       lwz r26,((JB_GPRS+12)*4)(r3)
+FP(    lfd 26,((JB_FPRS+12*2)*4)(r3))
+       lwz r27,((JB_GPRS+13)*4)(r3)
+FP(    lfd 27,((JB_FPRS+13*2)*4)(r3))
+       lwz r28,((JB_GPRS+14)*4)(r3)
+FP(    lfd 28,((JB_FPRS+14*2)*4)(r3))
+       lwz r29,((JB_GPRS+15)*4)(r3)
+FP(    lfd 29,((JB_FPRS+15*2)*4)(r3))
+       lwz r30,((JB_GPRS+16)*4)(r3)
+FP(    lfd 30,((JB_FPRS+16*2)*4)(r3))
+       lwz r31,((JB_GPRS+17)*4)(r3)
+FP(    lfd 31,((JB_FPRS+17*2)*4)(r3))
+       mr r3,r4
+       blr
diff --git a/examples/standalone/ppc_setjmp.S b/examples/standalone/ppc_setjmp.S
new file mode 100644 (file)
index 0000000..421abfd
--- /dev/null
@@ -0,0 +1,83 @@
+/* setjmp for PowerPC.
+   Copyright (C) 1995, 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library 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
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, write to the Free
+   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+   02111-1307 USA.  */
+
+#include <ppc_asm.tmpl>
+
+# define JB_GPR1   0  /* Also known as the stack pointer */
+# define JB_GPR2   1
+# define JB_LR     2  /* The address we will return to */
+# define JB_GPRS   3  /* GPRs 14 through 31 are saved, 18 in total */
+# define JB_CR     21 /* Condition code registers. */
+# define JB_FPRS   22 /* FPRs 14 through 31 are saved, 18*2 words total */
+# define JB_SIZE   (58*4)
+
+#define FP(x...) x
+
+.globl      setctxsp;
+setctxsp:
+       mr  r1, r3
+       blr
+
+.globl      ppc_setjmp;
+ppc_setjmp:
+       stw  r1,(JB_GPR1*4)(3)
+       mflr r0
+       stw  r2,(JB_GPR2*4)(3)
+       stw  r14,((JB_GPRS+0)*4)(3)
+FP(    stfd 14,((JB_FPRS+0*2)*4)(3))
+       stw  r0,(JB_LR*4)(3)
+       stw  r15,((JB_GPRS+1)*4)(3)
+FP(    stfd 15,((JB_FPRS+1*2)*4)(3))
+       mfcr r0
+       stw  r16,((JB_GPRS+2)*4)(3)
+FP(    stfd 16,((JB_FPRS+2*2)*4)(3))
+       stw  r0,(JB_CR*4)(3)
+       stw  r17,((JB_GPRS+3)*4)(3)
+FP(    stfd 17,((JB_FPRS+3*2)*4)(3))
+       stw  r18,((JB_GPRS+4)*4)(3)
+FP(    stfd 18,((JB_FPRS+4*2)*4)(3))
+       stw  r19,((JB_GPRS+5)*4)(3)
+FP(    stfd 19,((JB_FPRS+5*2)*4)(3))
+       stw  r20,((JB_GPRS+6)*4)(3)
+FP(    stfd 20,((JB_FPRS+6*2)*4)(3))
+       stw  r21,((JB_GPRS+7)*4)(3)
+FP(    stfd 21,((JB_FPRS+7*2)*4)(3))
+       stw  r22,((JB_GPRS+8)*4)(3)
+FP(    stfd 22,((JB_FPRS+8*2)*4)(3))
+       stw  r23,((JB_GPRS+9)*4)(3)
+FP(    stfd 23,((JB_FPRS+9*2)*4)(3))
+       stw  r24,((JB_GPRS+10)*4)(3)
+FP(    stfd 24,((JB_FPRS+10*2)*4)(3))
+       stw  r25,((JB_GPRS+11)*4)(3)
+FP(    stfd 25,((JB_FPRS+11*2)*4)(3))
+       stw  r26,((JB_GPRS+12)*4)(3)
+FP(    stfd 26,((JB_FPRS+12*2)*4)(3))
+       stw  r27,((JB_GPRS+13)*4)(3)
+FP(    stfd 27,((JB_FPRS+13*2)*4)(3))
+       stw  r28,((JB_GPRS+14)*4)(3)
+FP(    stfd 28,((JB_FPRS+14*2)*4)(3))
+       stw  r29,((JB_GPRS+15)*4)(3)
+FP(    stfd 29,((JB_FPRS+15*2)*4)(3))
+       stw  r30,((JB_GPRS+16)*4)(3)
+FP(    stfd 30,((JB_FPRS+16*2)*4)(3))
+       stw  r31,((JB_GPRS+17)*4)(3)
+FP(    stfd 31,((JB_FPRS+17*2)*4)(3))
+
+       li 3, 0
+       blr
diff --git a/examples/standalone/sched.c b/examples/standalone/sched.c
new file mode 100644 (file)
index 0000000..b32766f
--- /dev/null
@@ -0,0 +1,369 @@
+/*
+ * 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 <exports.h>
+
+/*
+ * Author: Arun Dharankar <ADharankar@ATTBI.Com>
+ *
+ * A very simple thread/schedular model:
+ *   - only one master thread, and no parent child relation maintained
+ *   - parent thread cannot be stopped or deleted
+ *   - no permissions or credentials
+ *   - no elaborate safety checks
+ *   - cooperative multi threading
+ *   - Simple round-robin scheduleing with no priorities
+ *   - no metering/statistics collection
+ *
+ * Basic idea of implementing this is to allow more than one tests to
+ * execute "simultaneously".
+ *
+ * This may be modified such thread_yield may be called in syscalls, and
+ * timer interrupts.
+ */
+
+
+#define MAX_THREADS 8
+
+#define CTX_SIZE 512
+#define STK_SIZE 8*1024
+
+#define STATE_EMPTY 0
+#define STATE_RUNNABLE 1
+#define STATE_STOPPED 2
+#define STATE_TERMINATED 2
+
+#define MASTER_THREAD 0
+
+#define RC_FAILURE     (-1)
+#define        RC_SUCCESS      (0)
+
+typedef        vu_char *jmp_ctx;
+unsigned long setctxsp (vu_char *sp);
+int ppc_setjmp(jmp_ctx env);
+void ppc_longjmp(jmp_ctx env, int val);
+#define setjmp ppc_setjmp
+#define longjmp        ppc_longjmp
+
+struct lthread {
+       int state;
+       int retval;
+       char stack[STK_SIZE];
+       uchar context[CTX_SIZE];
+       int (*func) (void *);
+       void *arg;
+};
+static volatile struct lthread lthreads[MAX_THREADS];
+static volatile int current_tid = MASTER_THREAD;
+
+
+static uchar dbg = 0;
+
+#define PDEBUG(fmt, args...)    {                                      \
+       if(dbg != 0) {                                                  \
+               printf("[%s %d %s]: ",__FILE__,__LINE__,__FUNCTION__);\
+               printf(fmt, ##args);                            \
+               printf("\n");                                   \
+       }                                                               \
+}
+
+static int testthread (void *);
+static void sched_init (void);
+static int thread_create (int (*func) (void *), void *arg);
+static int thread_start (int id);
+static void thread_yield (void);
+static int thread_delete (int id);
+static int thread_join (int *ret);
+
+#if 0                                                  /* not used yet */
+static int thread_stop (int id);
+#endif                                                 /* not used yet */
+
+/* An example of schedular test */
+
+#define NUMTHREADS 7
+int sched (int ac, char *av[])
+{
+       int i, j;
+       int tid[NUMTHREADS];
+       int names[NUMTHREADS];
+
+       app_startup(av);
+
+       sched_init ();
+
+       for (i = 0; i < NUMTHREADS; i++) {
+               names[i] = i;
+               j = thread_create (testthread, (void *) &names[i]);
+               if (j == RC_FAILURE)
+                       printf ("schedtest: Failed to create thread %d\n", i);
+               if (j > 0) {
+                       printf ("schedtest: Created thread with id %d, name %d\n",
+                                               j, i);
+                       tid[i] = j;
+               }
+       }
+       printf ("schedtest: Threads created\n");
+
+       printf ("sched_test: function=0x%08x\n", (unsigned)testthread);
+       for (i = 0; i < NUMTHREADS; i++) {
+               printf ("schedtest: Setting thread %d runnable\n", tid[i]);
+               thread_start (tid[i]);
+               thread_yield ();
+       }
+       printf ("schedtest: Started %d threads\n", NUMTHREADS);
+
+       while (1) {
+               printf ("schedtest: Waiting for threads to complete\n");
+               if (tstc () && getc () == 0x3) {
+                       printf ("schedtest: Aborting threads...\n");
+                       for (i = 0; i < NUMTHREADS; i++) {
+                               printf ("schedtest: Deleting thread %d\n", tid[i]);
+                               thread_delete (tid[i]);
+                       }
+                       return RC_SUCCESS;
+               }
+               j = -1;
+               i = thread_join (&j);
+               if (i == RC_FAILURE) {
+                       printf ("schedtest: No threads pending, "
+                                               "exiting schedular test\n");
+                       return RC_SUCCESS;
+               }
+               printf ("schedtest: thread is %d returned %d\n", i, j);
+               thread_yield ();
+       }
+
+       return RC_SUCCESS;
+}
+
+static int testthread (void *name)
+{
+       int i;
+
+       printf ("testthread: Begin executing thread, myname %d, &i=0x%08x\n",
+               *(int *) name, (unsigned)&i);
+
+       printf ("Thread %02d, i=%d\n", *(int *) name, i);
+
+       for (i = 0; i < 0xffff * (*(int *) name + 1); i++) {
+               if (tstc () && getc () == 0x3) {
+                       printf ("testthread: myname %d terminating.\n",
+                                               *(int *) name);
+                       return *(int *) name + 1;
+               }
+
+               if (i % 100 == 0)
+                       thread_yield ();
+       }
+
+       printf ("testthread: returning %d, i=0x%x\n",
+                               *(int *) name + 1, i);
+
+       return *(int *) name + 1;
+}
+
+
+static void sched_init (void)
+{
+       int i;
+
+       for (i = MASTER_THREAD + 1; i < MAX_THREADS; i++)
+               lthreads[i].state = STATE_EMPTY;
+
+       current_tid = MASTER_THREAD;
+       lthreads[current_tid].state = STATE_RUNNABLE;
+       PDEBUG ("sched_init: master context = 0x%08x",
+               (unsigned)lthreads[current_tid].context);
+       return;
+}
+
+static void thread_yield (void)
+{
+       static int i;
+
+       PDEBUG ("thread_yield: current tid=%d", current_tid);
+
+#define SWITCH(new)                                                    \
+       if(lthreads[new].state == STATE_RUNNABLE) {                     \
+               PDEBUG("thread_yield: %d match, ctx=0x%08x",            \
+                       new,                                            \
+                       (unsigned)lthreads[current_tid].context);       \
+               if(setjmp(lthreads[current_tid].context) == 0) {        \
+                       current_tid = new;                              \
+                       PDEBUG("thread_yield: tid %d returns 0",        \
+                               new);                                   \
+                       longjmp(lthreads[new].context, 1);              \
+               } else {                                                \
+                       PDEBUG("thread_yield: tid %d returns 1",        \
+                               new);                                   \
+                       return;                                         \
+               }                                                       \
+       }
+
+       for (i = current_tid + 1; i < MAX_THREADS; i++) {
+               SWITCH (i);
+       }
+
+       if (current_tid != 0) {
+               for (i = 0; i <= current_tid; i++) {
+                       SWITCH (i);
+               }
+       }
+
+       PDEBUG ("thread_yield: returning from thread_yield");
+       return;
+}
+
+static int thread_create (int (*func) (void *), void *arg)
+{
+       int i;
+
+       for (i = MASTER_THREAD + 1; i < MAX_THREADS; i++) {
+               if (lthreads[i].state == STATE_EMPTY) {
+                       lthreads[i].state = STATE_STOPPED;
+                       lthreads[i].func = func;
+                       lthreads[i].arg = arg;
+                       PDEBUG ("thread_create: returns new tid %d", i);
+                       return i;
+               }
+       }
+
+       PDEBUG ("thread_create: returns failure");
+       return RC_FAILURE;
+}
+
+static int thread_delete (int id)
+{
+       if (id <= MASTER_THREAD || id > MAX_THREADS)
+               return RC_FAILURE;
+
+       if (current_tid == id)
+               return RC_FAILURE;
+
+       lthreads[id].state = STATE_EMPTY;
+       return RC_SUCCESS;
+}
+
+static void thread_launcher (void)
+{
+       PDEBUG ("thread_launcher: invoking func=0x%08x",
+                  (unsigned)lthreads[current_tid].func);
+
+       lthreads[current_tid].retval =
+                       lthreads[current_tid].func (lthreads[current_tid].arg);
+
+       PDEBUG ("thread_launcher: tid %d terminated", current_tid);
+
+       lthreads[current_tid].state = STATE_TERMINATED;
+       thread_yield ();
+       printf ("thread_launcher: should NEVER get here!\n");
+
+       return;
+}
+
+static int thread_start (int id)
+{
+       PDEBUG ("thread_start: id=%d", id);
+       if (id <= MASTER_THREAD || id > MAX_THREADS) {
+               return RC_FAILURE;
+       }
+
+       if (lthreads[id].state != STATE_STOPPED)
+               return RC_FAILURE;
+
+       if (setjmp (lthreads[current_tid].context) == 0) {
+               lthreads[id].state = STATE_RUNNABLE;
+               current_tid = id;
+               PDEBUG ("thread_start: to be stack=0%08x",
+                       (unsigned)lthreads[id].stack);
+               setctxsp ((vu_char *)&lthreads[id].stack[STK_SIZE]);
+               thread_launcher ();
+       }
+
+       PDEBUG ("thread_start: Thread id=%d started, parent returns", id);
+
+       return RC_SUCCESS;
+}
+
+#if 0  /* not used so far */
+static int thread_stop (int id)
+{
+       if (id <= MASTER_THREAD || id >= MAX_THREADS)
+               return RC_FAILURE;
+
+       if (current_tid == id)
+               return RC_FAILURE;
+
+       lthreads[id].state = STATE_STOPPED;
+       return RC_SUCCESS;
+}
+#endif /* not used so far */
+
+static int thread_join (int *ret)
+{
+       int i, j = 0;
+
+       PDEBUG ("thread_join: *ret = %d", *ret);
+
+       if (!(*ret == -1 || *ret > MASTER_THREAD || *ret < MAX_THREADS)) {
+               PDEBUG ("thread_join: invalid tid %d", *ret);
+               return RC_FAILURE;
+       }
+
+       if (*ret == -1) {
+               PDEBUG ("Checking for tid = -1");
+               while (1) {
+                       /* PDEBUG("thread_join: start while-loopn"); */
+                       j = 0;
+                       for (i = MASTER_THREAD + 1; i < MAX_THREADS; i++) {
+                               if (lthreads[i].state == STATE_TERMINATED) {
+                                       *ret = lthreads[i].retval;
+                                       lthreads[i].state = STATE_EMPTY;
+                                       /* PDEBUG("thread_join: returning retval %d of tid %d",
+                                          ret, i); */
+                                       return RC_SUCCESS;
+                               }
+
+                               if (lthreads[i].state != STATE_EMPTY) {
+                                       PDEBUG ("thread_join: %d used slots tid %d state=%d",
+                                                  j, i, lthreads[i].state);
+                                       j++;
+                               }
+                       }
+                       if (j == 0) {
+                               PDEBUG ("thread_join: all slots empty!");
+                               return RC_FAILURE;
+                       }
+                       /*  PDEBUG("thread_join: yielding"); */
+                       thread_yield ();
+                       /*  PDEBUG("thread_join: back from yield"); */
+               }
+       }
+
+       if (lthreads[*ret].state == STATE_TERMINATED) {
+               i = *ret;
+               *ret = lthreads[*ret].retval;
+               lthreads[*ret].state = STATE_EMPTY;
+               PDEBUG ("thread_join: returing %d for tid %d", *ret, i);
+               return RC_SUCCESS;
+       }
+
+       PDEBUG ("thread_join: thread %d is not terminated!", *ret);
+       return RC_FAILURE;
+}
diff --git a/examples/standalone/smc91111_eeprom.c b/examples/standalone/smc91111_eeprom.c
new file mode 100644 (file)
index 0000000..39e5306
--- /dev/null
@@ -0,0 +1,395 @@
+/*
+ * (C) Copyright 2004
+ * Robin Getz rgetz@blacfin.uclinux.org
+ *
+ * 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
+ *
+ * Heavily borrowed from the following peoples GPL'ed software:
+ *  - Wolfgang Denk, DENX Software Engineering, wd@denx.de
+ *       Das U-boot
+ *  - Ladislav Michl ladis@linux-mips.org
+ *       A rejected patch on the U-Boot mailing list
+ */
+
+#include <common.h>
+#include <exports.h>
+#include "../drivers/net/smc91111.h"
+
+#ifdef CONFIG_DRIVER_SMC91111
+
+#ifndef SMC91111_EEPROM_INIT
+# define SMC91111_EEPROM_INIT()
+#endif
+
+#define SMC_BASE_ADDRESS CONFIG_SMC91111_BASE
+#define EEPROM         0x1
+#define MAC            0x2
+#define UNKNOWN                0x4
+
+void dump_reg (void);
+void dump_eeprom (void);
+int write_eeprom_reg (int, int);
+void copy_from_eeprom (void);
+void print_MAC (void);
+int read_eeprom_reg (int);
+void print_macaddr (void);
+
+int smc91111_eeprom (int argc, char *argv[])
+{
+       int c, i, j, done, line, reg, value, start, what;
+       char input[50];
+
+       /* Print the ABI version */
+       app_startup (argv);
+       if (XF_VERSION != (int) get_version ()) {
+               printf ("Expects ABI version %d\n", XF_VERSION);
+               printf ("Actual U-Boot ABI version %d\n",
+                       (int) get_version ());
+               printf ("Can't run\n\n");
+               return (0);
+       }
+
+       SMC91111_EEPROM_INIT();
+
+       if ((SMC_inw (BANK_SELECT) & 0xFF00) != 0x3300) {
+               printf ("Can't find SMSC91111\n");
+               return (0);
+       }
+
+       done = 0;
+       what = UNKNOWN;
+       printf ("\n");
+       while (!done) {
+               /* print the prompt */
+               printf ("SMC91111> ");
+               line = 0;
+               i = 0;
+               start = 1;
+               while (!line) {
+                       /* Wait for a keystroke */
+                       while (!tstc ());
+
+                       c = getc ();
+                       /* Make Uppercase */
+                       if (c >= 'Z')
+                               c -= ('a' - 'A');
+                       /* printf(" |%02x| ",c); */
+
+                       switch (c) {
+                       case '\r':      /* Enter                */
+                       case '\n':
+                               input[i] = 0;
+                               puts ("\r\n");
+                               line = 1;
+                               break;
+                       case '\0':      /* nul                  */
+                               continue;
+
+                       case 0x03:      /* ^C - break           */
+                               input[0] = 0;
+                               i = 0;
+                               line = 1;
+                               done = 1;
+                               break;
+
+                       case 0x5F:
+                       case 0x08:      /* ^H  - backspace      */
+                       case 0x7F:      /* DEL - backspace      */
+                               if (i > 0) {
+                                       puts ("\b \b");
+                                       i--;
+                               }
+                               break;
+                       default:
+                               if (start) {
+                                       if ((c == 'W') || (c == 'D')
+                                           || (c == 'M') || (c == 'C')
+                                           || (c == 'P')) {
+                                               putc (c);
+                                               input[i] = c;
+                                               if (i <= 45)
+                                                       i++;
+                                               start = 0;
+                                       }
+                               } else {
+                                       if ((c >= '0' && c <= '9')
+                                           || (c >= 'A' && c <= 'F')
+                                           || (c == 'E') || (c == 'M')
+                                           || (c == ' ')) {
+                                               putc (c);
+                                               input[i] = c;
+                                               if (i <= 45)
+                                                       i++;
+                                               break;
+                                       }
+                               }
+                               break;
+                       }
+               }
+
+               for (; i < 49; i++)
+                       input[i] = 0;
+
+               switch (input[0]) {
+               case ('W'):
+                       /* Line should be w reg value */
+                       i = 0;
+                       reg = 0;
+                       value = 0;
+                       /* Skip to the next space or end) */
+                       while ((input[i] != ' ') && (input[i] != 0))
+                               i++;
+
+                       if (input[i] != 0)
+                               i++;
+
+                       /* Are we writing to EEPROM or MAC */
+                       switch (input[i]) {
+                       case ('E'):
+                               what = EEPROM;
+                               break;
+                       case ('M'):
+                               what = MAC;
+                               break;
+                       default:
+                               what = UNKNOWN;
+                               break;
+                       }
+
+                       /* skip to the next space or end */
+                       while ((input[i] != ' ') && (input[i] != 0))
+                               i++;
+                       if (input[i] != 0)
+                               i++;
+
+                       /* Find register to write into */
+                       j = 0;
+                       while ((input[i] != ' ') && (input[i] != 0)) {
+                               j = input[i] - 0x30;
+                               if (j >= 0xA) {
+                                       j -= 0x07;
+                               }
+                               reg = (reg * 0x10) + j;
+                               i++;
+                       }
+
+                       while ((input[i] != ' ') && (input[i] != 0))
+                               i++;
+
+                       if (input[i] != 0)
+                               i++;
+                       else
+                               what = UNKNOWN;
+
+                       /* Get the value to write */
+                       j = 0;
+                       while ((input[i] != ' ') && (input[i] != 0)) {
+                               j = input[i] - 0x30;
+                               if (j >= 0xA) {
+                                       j -= 0x07;
+                               }
+                               value = (value * 0x10) + j;
+                               i++;
+                       }
+
+                       switch (what) {
+                       case 1:
+                               printf ("Writing EEPROM register %02x with %04x\n", reg, value);
+                               write_eeprom_reg (value, reg);
+                               break;
+                       case 2:
+                               printf ("Writing MAC register bank %i, reg %02x with %04x\n", reg >> 4, reg & 0xE, value);
+                               SMC_SELECT_BANK (reg >> 4);
+                               SMC_outw (value, reg & 0xE);
+                               break;
+                       default:
+                               printf ("Wrong\n");
+                               break;
+                       }
+                       break;
+               case ('D'):
+                       dump_eeprom ();
+                       break;
+               case ('M'):
+                       dump_reg ();
+                       break;
+               case ('C'):
+                       copy_from_eeprom ();
+                       break;
+               case ('P'):
+                       print_macaddr ();
+                       break;
+               default:
+                       break;
+               }
+
+       }
+
+       return (0);
+}
+
+void copy_from_eeprom (void)
+{
+       int i;
+
+       SMC_SELECT_BANK (1);
+       SMC_outw ((SMC_inw (CTL_REG) & !CTL_EEPROM_SELECT) | CTL_RELOAD,
+                 CTL_REG);
+       i = 100;
+       while ((SMC_inw (CTL_REG) & CTL_RELOAD) && --i)
+               udelay (100);
+       if (i == 0) {
+               printf ("Timeout Refreshing EEPROM registers\n");
+       } else {
+               printf ("EEPROM contents copied to MAC\n");
+       }
+
+}
+
+void print_macaddr (void)
+{
+       int i, j, k, mac[6];
+
+       printf ("Current MAC Address in SMSC91111 ");
+       SMC_SELECT_BANK (1);
+       for (i = 0; i < 5; i++) {
+               printf ("%02x:", SMC_inb (ADDR0_REG + i));
+       }
+
+       printf ("%02x\n", SMC_inb (ADDR0_REG + 5));
+
+       i = 0;
+       for (j = 0x20; j < 0x23; j++) {
+               k = read_eeprom_reg (j);
+               mac[i] = k & 0xFF;
+               i++;
+               mac[i] = k >> 8;
+               i++;
+       }
+
+       printf ("Current MAC Address in EEPROM    ");
+       for (i = 0; i < 5; i++)
+               printf ("%02x:", mac[i]);
+       printf ("%02x\n", mac[5]);
+
+}
+void dump_eeprom (void)
+{
+       int j, k;
+
+       printf ("IOS2-0    ");
+       for (j = 0; j < 8; j++) {
+               printf ("%03x     ", j);
+       }
+       printf ("\n");
+
+       for (k = 0; k < 4; k++) {
+               if (k == 0)
+                       printf ("CONFIG ");
+               if (k == 1)
+                       printf ("BASE   ");
+               if ((k == 2) || (k == 3))
+                       printf ("       ");
+               for (j = 0; j < 0x20; j += 4) {
+                       printf ("%02x:%04x ", j + k, read_eeprom_reg (j + k));
+               }
+               printf ("\n");
+       }
+
+       for (j = 0x20; j < 0x40; j++) {
+               if ((j & 0x07) == 0)
+                       printf ("\n");
+               printf ("%02x:%04x ", j, read_eeprom_reg (j));
+       }
+       printf ("\n");
+
+}
+
+int read_eeprom_reg (int reg)
+{
+       int timeout;
+
+       SMC_SELECT_BANK (2);
+       SMC_outw (reg, PTR_REG);
+
+       SMC_SELECT_BANK (1);
+       SMC_outw (SMC_inw (CTL_REG) | CTL_EEPROM_SELECT | CTL_RELOAD,
+                 CTL_REG);
+       timeout = 100;
+       while ((SMC_inw (CTL_REG) & CTL_RELOAD) && --timeout)
+               udelay (100);
+       if (timeout == 0) {
+               printf ("Timeout Reading EEPROM register %02x\n", reg);
+               return 0;
+       }
+
+       return SMC_inw (GP_REG);
+
+}
+
+int write_eeprom_reg (int value, int reg)
+{
+       int timeout;
+
+       SMC_SELECT_BANK (2);
+       SMC_outw (reg, PTR_REG);
+
+       SMC_SELECT_BANK (1);
+       SMC_outw (value, GP_REG);
+       SMC_outw (SMC_inw (CTL_REG) | CTL_EEPROM_SELECT | CTL_STORE, CTL_REG);
+       timeout = 100;
+       while ((SMC_inw (CTL_REG) & CTL_STORE) && --timeout)
+               udelay (100);
+       if (timeout == 0) {
+               printf ("Timeout Writing EEPROM register %02x\n", reg);
+               return 0;
+       }
+
+       return 1;
+
+}
+
+void dump_reg (void)
+{
+       int i, j;
+
+       printf ("    ");
+       for (j = 0; j < 4; j++) {
+               printf ("Bank%i ", j);
+       }
+       printf ("\n");
+       for (i = 0; i < 0xF; i += 2) {
+               printf ("%02x  ", i);
+               for (j = 0; j < 4; j++) {
+                       SMC_SELECT_BANK (j);
+                       printf ("%04x  ", SMC_inw (i));
+               }
+               printf ("\n");
+       }
+}
+
+#else
+
+int smc91111_eeprom (int argc, char *argv[])
+{
+       printf("Not supported for this board\n");
+       return 1;
+}
+
+#endif
diff --git a/examples/standalone/smc911x_eeprom.c b/examples/standalone/smc911x_eeprom.c
new file mode 100644 (file)
index 0000000..bf22f0a
--- /dev/null
@@ -0,0 +1,383 @@
+/*
+ * smc911x_eeprom.c - EEPROM interface to SMC911x parts.
+ * Only tested on SMSC9118 though ...
+ *
+ * Copyright 2004-2008 Analog Devices Inc.
+ *
+ * Licensed under the GPL-2 or later.
+ *
+ * Based on smc91111_eeprom.c which:
+ * Heavily borrowed from the following peoples GPL'ed software:
+ *  - Wolfgang Denk, DENX Software Engineering, wd@denx.de
+ *       Das U-boot
+ *  - Ladislav Michl ladis@linux-mips.org
+ *       A rejected patch on the U-Boot mailing list
+ */
+
+#include <common.h>
+#include <exports.h>
+
+#ifdef CONFIG_DRIVER_SMC911X
+
+#include "../drivers/net/smc911x.h"
+
+/**
+ *     smsc_ctrlc - detect press of CTRL+C (common ctrlc() isnt exported!?)
+ */
+static int smsc_ctrlc(void)
+{
+       return (tstc() && getc() == 0x03);
+}
+
+/**
+ *     usage - dump usage information
+ */
+static void usage(void)
+{
+       puts(
+               "MAC/EEPROM Commands:\n"
+               " P : Print the MAC addresses\n"
+               " D : Dump the EEPROM contents\n"
+               " M : Dump the MAC contents\n"
+               " C : Copy the MAC address from the EEPROM to the MAC\n"
+               " W : Write a register in the EEPROM or in the MAC\n"
+               " Q : Quit\n"
+               "\n"
+               "Some commands take arguments:\n"
+               " W <E|M> <register> <value>\n"
+               "    E: EEPROM   M: MAC\n"
+       );
+}
+
+/**
+ *     dump_regs - dump the MAC registers
+ *
+ * Registers 0x00 - 0x50 are FIFOs.  The 0x50+ are the control registers
+ * and they're all 32bits long.  0xB8+ are reserved, so don't bother.
+ */
+static void dump_regs(void)
+{
+       u8 i, j = 0;
+       for (i = 0x50; i < 0xB8; i += sizeof(u32))
+               printf("%02x: 0x%08x %c", i,
+                       smc911x_reg_read(CONFIG_DRIVER_SMC911X_BASE + i),
+                       (j++ % 2 ? '\n' : ' '));
+}
+
+/**
+ *     do_eeprom_cmd - handle eeprom communication
+ */
+static int do_eeprom_cmd(int cmd, u8 reg)
+{
+       if (smc911x_reg_read(E2P_CMD) & E2P_CMD_EPC_BUSY) {
+               printf("eeprom_cmd: busy at start (E2P_CMD = 0x%08x)\n",
+                       smc911x_reg_read(E2P_CMD));
+               return -1;
+       }
+
+       smc911x_reg_write(E2P_CMD, E2P_CMD_EPC_BUSY | cmd | reg);
+
+       while (smc911x_reg_read(E2P_CMD) & E2P_CMD_EPC_BUSY)
+               if (smsc_ctrlc()) {
+                       printf("eeprom_cmd: timeout (E2P_CMD = 0x%08x)\n",
+                               smc911x_reg_read(E2P_CMD));
+                       return -1;
+               }
+
+       return 0;
+}
+
+/**
+ *     read_eeprom_reg - read specified register in EEPROM
+ */
+static u8 read_eeprom_reg(u8 reg)
+{
+       int ret = do_eeprom_cmd(E2P_CMD_EPC_CMD_READ, reg);
+       return (ret ? : smc911x_reg_read(E2P_DATA));
+}
+
+/**
+ *     write_eeprom_reg - write specified value into specified register in EEPROM
+ */
+static int write_eeprom_reg(u8 value, u8 reg)
+{
+       int ret;
+
+       /* enable erasing/writing */
+       ret = do_eeprom_cmd(E2P_CMD_EPC_CMD_EWEN, reg);
+       if (ret)
+               goto done;
+
+       /* erase the eeprom reg */
+       ret = do_eeprom_cmd(E2P_CMD_EPC_CMD_ERASE, reg);
+       if (ret)
+               goto done;
+
+       /* write the eeprom reg */
+       smc911x_reg_write(E2P_DATA, value);
+       ret = do_eeprom_cmd(E2P_CMD_EPC_CMD_WRITE, reg);
+       if (ret)
+               goto done;
+
+       /* disable erasing/writing */
+       ret = do_eeprom_cmd(E2P_CMD_EPC_CMD_EWDS, reg);
+
+ done:
+       return ret;
+}
+
+/**
+ *     skip_space - find first non-whitespace in given pointer
+ */
+static char *skip_space(char *buf)
+{
+       while (buf[0] == ' ' || buf[0] == '\t')
+               ++buf;
+       return buf;
+}
+
+/**
+ *     write_stuff - handle writing of MAC registers / eeprom
+ */
+static void write_stuff(char *line)
+{
+       char dest;
+       char *endp;
+       u8 reg;
+       u32 value;
+
+       /* Skip over the "W " part of the command */
+       line = skip_space(line + 1);
+
+       /* Figure out destination */
+       switch (line[0]) {
+       case 'E':
+       case 'M':
+               dest = line[0];
+               break;
+       default:
+       invalid_usage:
+               printf("ERROR: Invalid write usage\n");
+               usage();
+               return;
+       }
+
+       /* Get the register to write */
+       line = skip_space(line + 1);
+       reg = simple_strtoul(line, &endp, 16);
+       if (line == endp)
+               goto invalid_usage;
+
+       /* Get the value to write */
+       line = skip_space(endp);
+       value = simple_strtoul(line, &endp, 16);
+       if (line == endp)
+               goto invalid_usage;
+
+       /* Check for trailing cruft */
+       line = skip_space(endp);
+       if (line[0])
+               goto invalid_usage;
+
+       /* Finally, execute the command */
+       if (dest == 'E') {
+               printf("Writing EEPROM register %02x with %02x\n", reg, value);
+               write_eeprom_reg(value, reg);
+       } else {
+               printf("Writing MAC register %02x with %08x\n", reg, value);
+               smc911x_reg_write(CONFIG_DRIVER_SMC911X_BASE + reg, value);
+       }
+}
+
+/**
+ *     copy_from_eeprom - copy MAC address in eeprom to address registers
+ */
+static void copy_from_eeprom(void)
+{
+       ulong addrl =
+               read_eeprom_reg(0x01) |
+               read_eeprom_reg(0x02) << 8 |
+               read_eeprom_reg(0x03) << 16 |
+               read_eeprom_reg(0x04) << 24;
+       ulong addrh =
+               read_eeprom_reg(0x05) |
+               read_eeprom_reg(0x06) << 8;
+       smc911x_set_mac_csr(ADDRL, addrl);
+       smc911x_set_mac_csr(ADDRH, addrh);
+       puts("EEPROM contents copied to MAC\n");
+}
+
+/**
+ *     print_macaddr - print MAC address registers and MAC address in eeprom
+ */
+static void print_macaddr(void)
+{
+       puts("Current MAC Address in MAC:     ");
+       ulong addrl = smc911x_get_mac_csr(ADDRL);
+       ulong addrh = smc911x_get_mac_csr(ADDRH);
+       printf("%02x:%02x:%02x:%02x:%02x:%02x\n",
+               (u8)(addrl), (u8)(addrl >> 8), (u8)(addrl >> 16),
+               (u8)(addrl >> 24), (u8)(addrh), (u8)(addrh >> 8));
+
+       puts("Current MAC Address in EEPROM:  ");
+       int i;
+       for (i = 1; i < 6; ++i)
+               printf("%02x:", read_eeprom_reg(i));
+       printf("%02x\n", read_eeprom_reg(i));
+}
+
+/**
+ *     dump_eeprom - dump the whole content of the EEPROM
+ */
+static void dump_eeprom(void)
+{
+       int i;
+       puts("EEPROM:\n");
+       for (i = 0; i < 7; ++i)
+               printf("%02x: 0x%02x\n", i, read_eeprom_reg(i));
+}
+
+/**
+ *     smc911x_init - get the MAC/EEPROM up and ready for use
+ */
+static int smc911x_init(void)
+{
+       /* See if there is anything there */
+       if (!smc911x_detect_chip())
+               return 1;
+
+       smc911x_reset();
+
+       /* Make sure we set EEDIO/EECLK to the EEPROM */
+       if (smc911x_reg_read(GPIO_CFG) & GPIO_CFG_EEPR_EN) {
+               while (smc911x_reg_read(E2P_CMD) & E2P_CMD_EPC_BUSY)
+                       if (smsc_ctrlc()) {
+                               printf("init: timeout (E2P_CMD = 0x%08x)\n",
+                                       smc911x_reg_read(E2P_CMD));
+                               return 1;
+                       }
+               smc911x_reg_write(GPIO_CFG, smc911x_reg_read(GPIO_CFG) & ~GPIO_CFG_EEPR_EN);
+       }
+
+       return 0;
+}
+
+/**
+ *     getline - consume a line of input and handle some escape sequences
+ */
+static char *getline(void)
+{
+       static char buffer[100];
+       char c;
+       size_t i;
+
+       i = 0;
+       while (1) {
+               buffer[i] = '\0';
+               while (!tstc())
+                       continue;
+
+               c = getc();
+               /* Convert to uppercase */
+               if (c >= 'a' && c <= 'z')
+                       c -= ('a' - 'A');
+
+               switch (c) {
+               case '\r':      /* Enter/Return key */
+               case '\n':
+                       puts("\n");
+                       return buffer;
+
+               case 0x03:      /* ^C - break */
+                       return NULL;
+
+               case 0x5F:
+               case 0x08:      /* ^H  - backspace */
+               case 0x7F:      /* DEL - backspace */
+                       if (i) {
+                               puts("\b \b");
+                               i--;
+                       }
+                       break;
+
+               default:
+                       /* Ignore control characters */
+                       if (c < 0x20)
+                               break;
+                       /* Queue up all other characters */
+                       buffer[i++] = c;
+                       printf("%c", c);
+                       break;
+               }
+       }
+}
+
+/**
+ *     smc911x_eeprom - our application's main() function
+ */
+int smc911x_eeprom(int argc, char *argv[])
+{
+       /* Print the ABI version */
+       app_startup(argv);
+       if (XF_VERSION != get_version()) {
+               printf("Expects ABI version %d\n", XF_VERSION);
+               printf("Actual U-Boot ABI version %lu\n", get_version());
+               printf("Can't run\n\n");
+               return 1;
+       }
+
+       /* Initialize the MAC/EEPROM somewhat */
+       puts("\n");
+       if (smc911x_init())
+               return 1;
+
+       /* Dump helpful usage information */
+       puts("\n");
+       usage();
+       puts("\n");
+
+       while (1) {
+               char *line;
+
+               /* Send the prompt and wait for a line */
+               puts("eeprom> ");
+               line = getline();
+
+               /* Got a ctrl+c */
+               if (!line)
+                       return 0;
+
+               /* Eat leading space */
+               line = skip_space(line);
+
+               /* Empty line, try again */
+               if (!line[0])
+                       continue;
+
+               /* Only accept 1 letter commands */
+               if (line[0] && line[1] && line[1] != ' ' && line[1] != '\t')
+                       goto unknown_cmd;
+
+               /* Now parse the command */
+               switch (line[0]) {
+               case 'W': write_stuff(line);  break;
+               case 'D': dump_eeprom();      break;
+               case 'M': dump_regs();        break;
+               case 'C': copy_from_eeprom(); break;
+               case 'P': print_macaddr();    break;
+               unknown_cmd:
+               default:  puts("ERROR: Unknown command!\n\n");
+               case '?':
+               case 'H': usage();            break;
+               case 'Q': return 0;
+               }
+       }
+}
+
+#else
+int smc911x_eeprom(int argc, char *argv[])
+{
+       puts("Not supported for this board\n");
+       return 1;
+}
+#endif
diff --git a/examples/standalone/sparc.lds b/examples/standalone/sparc.lds
new file mode 100644 (file)
index 0000000..9733daa
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * (C) Copyright 2003, Psyent Corporation <www.psyent.com>
+ * Scott McNutt <smcnutt@psyent.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
+ */
+
+
+OUTPUT_FORMAT("elf32-sparc", "elf32-sparc", "elf32-sparc")
+OUTPUT_ARCH(sparc)
+ENTRY(_start)
+
+SECTIONS
+{
+       .text :
+       {
+         *(.text)
+       }
+       __text_end = .;
+
+       . = ALIGN(4);
+       .rodata :
+       {
+               *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
+       }
+       __rodata_end = .;
+
+       . = ALIGN(4);
+       .data :
+       {
+               *(.data)
+       }
+       . = ALIGN(4);
+       __data_end = .;
+
+       __bss_start = .;
+       . = ALIGN(4);
+       .bss :
+       {
+               *(.bss)
+       }
+       . = ALIGN(4);
+       __bss_end = .;
+       _end = .;
+}
diff --git a/examples/standalone/stubs.c b/examples/standalone/stubs.c
new file mode 100644 (file)
index 0000000..a8cb954
--- /dev/null
@@ -0,0 +1,225 @@
+#include <exports.h>
+
+#ifndef GCC_VERSION
+#define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__)
+#endif /* GCC_VERSION */
+
+#if defined(CONFIG_I386)
+/*
+ * x86 does not have a dedicated register to store the pointer to
+ * the global_data. Thus the jump table address is stored in a
+ * global variable, but such approach does not allow for execution
+ * from flash memory. The global_data address is passed as argv[-1]
+ * to the application program.
+ */
+static void **jt;
+gd_t *global_data;
+
+#define EXPORT_FUNC(x) \
+       asm volatile (                  \
+"      .globl " #x "\n"                \
+#x ":\n"                               \
+"      movl    %0, %%eax\n"            \
+"      movl    jt, %%ecx\n"            \
+"      jmp     *(%%ecx, %%eax)\n"      \
+       : : "i"(XF_ ## x * sizeof(void *)) : "eax", "ecx");
+#elif defined(CONFIG_PPC)
+/*
+ * r2 holds the pointer to the global_data, r11 is a call-clobbered
+ * register
+ */
+#define EXPORT_FUNC(x) \
+       asm volatile (                  \
+"      .globl " #x "\n"                \
+#x ":\n"                               \
+"      lwz     %%r11, %0(%%r2)\n"      \
+"      lwz     %%r11, %1(%%r11)\n"     \
+"      mtctr   %%r11\n"                \
+"      bctr\n"                         \
+       : : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x * sizeof(void *)) : "r11");
+#elif defined(CONFIG_ARM)
+/*
+ * r8 holds the pointer to the global_data, ip is a call-clobbered
+ * register
+ */
+#define EXPORT_FUNC(x) \
+       asm volatile (                  \
+"      .globl " #x "\n"                \
+#x ":\n"                               \
+"      ldr     ip, [r8, %0]\n"         \
+"      ldr     pc, [ip, %1]\n"         \
+       : : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x * sizeof(void *)) : "ip");
+#elif defined(CONFIG_MIPS)
+/*
+ * k0 ($26) holds the pointer to the global_data; t9 ($25) is a call-
+ * clobbered register that is also used to set gp ($26). Note that the
+ * jr instruction also executes the instruction immediately following
+ * it; however, GCC/mips generates an additional `nop' after each asm
+ * statement
+ */
+#define EXPORT_FUNC(x) \
+       asm volatile (                  \
+"      .globl " #x "\n"                \
+#x ":\n"                               \
+"      lw      $25, %0($26)\n"         \
+"      lw      $25, %1($25)\n"         \
+"      jr      $25\n"                  \
+       : : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x * sizeof(void *)) : "t9");
+#elif defined(CONFIG_NIOS)
+/*
+ * %g7 holds the pointer to the global_data. %g0 is call clobbered.
+ */
+#define EXPORT_FUNC(x) \
+       asm volatile (                  \
+"      .globl " #x "\n"                \
+#x ":\n"                               \
+"      pfx     %%hi(%0)\n"             \
+"      movi    %%g0, %%lo(%0)\n"       \
+"      add     %%g0, %%g7\n"           \
+"      ld      %%g0, [%%g0]\n"         \
+"      pfx     %1\n"                   \
+"      ld      %%g0, [%%g0]\n"         \
+"      jmp     %%g0\n"                 \
+"      nop     \n"                     \
+       : : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x) : "r0");
+#elif defined(CONFIG_NIOS2)
+/*
+ * r15 holds the pointer to the global_data, r8 is call-clobbered
+ */
+#define EXPORT_FUNC(x) \
+       asm volatile (                  \
+"      .globl " #x "\n"                \
+#x ":\n"                               \
+"      movhi   r8, %%hi(%0)\n"         \
+"      ori     r8, r0, %%lo(%0)\n"     \
+"      add     r8, r8, r15\n"          \
+"      ldw     r8, 0(r8)\n"            \
+"      ldw     r8, %1(r8)\n"           \
+"      jmp     r8\n"                   \
+       : : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x * sizeof(void *)) : "r15");
+#elif defined(CONFIG_M68K)
+/*
+ * d7 holds the pointer to the global_data, a0 is a call-clobbered
+ * register
+ */
+#define EXPORT_FUNC(x) \
+       asm volatile (                  \
+"      .globl " #x "\n"                \
+#x ":\n"                               \
+"      move.l  %%d7, %%a0\n"           \
+"      adda.l  %0, %%a0\n"             \
+"      move.l  (%%a0), %%a0\n"         \
+"      adda.l  %1, %%a0\n"             \
+"      move.l  (%%a0), %%a0\n"         \
+"      jmp     (%%a0)\n"                       \
+       : : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x * sizeof(void *)) : "a0");
+#elif defined(CONFIG_MICROBLAZE)
+/*
+ * r31 holds the pointer to the global_data. r5 is a call-clobbered.
+ */
+#define EXPORT_FUNC(x)                         \
+       asm volatile (                          \
+"      .globl " #x "\n"                        \
+#x ":\n"                                       \
+"      lwi     r5, r31, %0\n"                  \
+"      lwi     r5, r5, %1\n"                   \
+"      bra     r5\n"                           \
+       : : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x * sizeof(void *)) : "r5");
+#elif defined(CONFIG_BLACKFIN)
+/*
+ * P5 holds the pointer to the global_data, P0 is a call-clobbered
+ * register
+ */
+#define EXPORT_FUNC(x)                 \
+       asm volatile (                  \
+"      .globl _" #x "\n_"              \
+#x ":\n"                               \
+"      P0 = [P5 + %0]\n"               \
+"      P0 = [P0 + %1]\n"               \
+"      JUMP (P0)\n"                    \
+       : : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x * sizeof(void *)) : "P0");
+#elif defined(CONFIG_AVR32)
+/*
+ * r6 holds the pointer to the global_data. r8 is call clobbered.
+ */
+#define EXPORT_FUNC(x)                                 \
+       asm volatile(                                   \
+               "       .globl\t" #x "\n"               \
+               #x ":\n"                                \
+               "       ld.w    r8, r6[%0]\n"           \
+               "       ld.w    pc, r8[%1]\n"           \
+               :                                       \
+               : "i"(offsetof(gd_t, jt)), "i"(XF_ ##x) \
+               : "r8");
+#elif defined(CONFIG_SH)
+/*
+ * r13 holds the pointer to the global_data. r1 is a call clobbered.
+ */
+#define EXPORT_FUNC(x)                                 \
+       asm volatile (                                  \
+               "       .align  2\n"                    \
+               "       .globl " #x "\n"                \
+               #x ":\n"                                \
+               "       mov     r13, r1\n"              \
+               "       add     %0, r1\n"               \
+               "       mov.l @r1, r2\n"        \
+               "       add     %1, r2\n"               \
+               "       mov.l @r2, r1\n"        \
+               "       jmp     @r1\n"                  \
+               "       nop\n"                          \
+               "       nop\n"                          \
+               : : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x * sizeof(void *)) : "r1", "r2");
+#elif defined(CONFIG_SPARC)
+/*
+ * g7 holds the pointer to the global_data. g1 is call clobbered.
+ */
+#define EXPORT_FUNC(x)                                 \
+       asm volatile(                                   \
+"      .globl\t" #x "\n"                               \
+#x ":\n"                                               \
+"      set %0, %%g1\n"                                 \
+"      or %%g1, %%g7, %%g1\n"                          \
+"      ld [%%g1], %%g1\n"                              \
+"      ld [%%g1 + %1], %%g1\n"                         \
+"      call %%g1\n"                                    \
+"      nop\n"                                          \
+       : : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x) : "g1" );
+
+#else
+#error stubs definition missing for this architecture
+#endif
+
+/* This function is necessary to prevent the compiler from
+ * generating prologue/epilogue, preparing stack frame etc.
+ * The stub functions are special, they do not use the stack
+ * frame passed to them, but pass it intact to the actual
+ * implementation. On the other hand, asm() statements with
+ * arguments can be used only inside the functions (gcc limitation)
+ */
+#if GCC_VERSION < 3004
+static
+#endif /* GCC_VERSION */
+void __attribute__((unused)) dummy(void)
+{
+#include <_exports.h>
+}
+
+extern unsigned long __bss_start, _end;
+
+void app_startup(char **argv)
+{
+       unsigned char * cp = (unsigned char *) &__bss_start;
+
+       /* Zero out BSS */
+       while (cp < (unsigned char *)&_end) {
+               *cp++ = 0;
+       }
+
+#if defined(CONFIG_I386)
+       /* x86 does not have a dedicated register for passing global_data */
+       global_data = (gd_t *)argv[-1];
+       jt = global_data->jt;
+#endif
+}
+
+#undef EXPORT_FUNC
diff --git a/examples/standalone/test_burst.c b/examples/standalone/test_burst.c
new file mode 100644 (file)
index 0000000..7109c09
--- /dev/null
@@ -0,0 +1,319 @@
+/*
+ * (C) Copyright 2005
+ * 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
+ *
+ * The test exercises SDRAM accesses in burst mode
+ */
+
+#include <common.h>
+#include <exports.h>
+
+#include <commproc.h>
+#include <asm/mmu.h>
+#include <asm/processor.h>
+
+#include <serial.h>
+#include <watchdog.h>
+
+#include "test_burst.h"
+
+/* 8 MB test region of physical RAM */
+#define TEST_PADDR     0x00800000
+/* The uncached virtual region */
+#define TEST_VADDR_NC  0x00800000
+/* The cached virtual region */
+#define TEST_VADDR_C   0x01000000
+/* When an error is detected, the address where the error has been found,
+   and also the current and the expected data will be written to
+   the following flash address
+*/
+#define TEST_FLASH_ADDR        0x40100000
+
+/* Define GPIO ports to signal start of burst transfers and errors */
+#ifdef CONFIG_LWMON
+/* Use PD.8 to signal start of burst transfers */
+#define GPIO1_DAT      (((volatile immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pddat)
+#define GPIO1_BIT      0x0080
+/* Configure PD.8 as general purpose output */
+#define GPIO1_INIT \
+       ((volatile immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pdpar &= ~GPIO1_BIT; \
+       ((volatile immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pddir |=  GPIO1_BIT;
+/* Use PD.9 to signal error */
+#define GPIO2_DAT      (((volatile immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pddat)
+#define GPIO2_BIT      0x0040
+/* Configure PD.9 as general purpose output */
+#define GPIO2_INIT \
+       ((volatile immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pdpar &= ~GPIO2_BIT; \
+       ((volatile immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pddir |=  GPIO2_BIT;
+#endif /* CONFIG_LWMON */
+
+
+static void test_prepare (void);
+static int test_burst_start (unsigned long size, unsigned long pattern);
+static void test_map_8M (unsigned long paddr, unsigned long vaddr, int cached);
+static int test_mmu_is_on(void);
+static void test_desc(unsigned long size);
+static void test_error(char * step, volatile void * addr, unsigned long val, unsigned long pattern);
+static void signal_init(void);
+static void signal_start(void);
+static void signal_error(void);
+static void test_usage(void);
+
+static unsigned long test_pattern [] = {
+       0x00000000,
+       0xffffffff,
+       0x55555555,
+       0xaaaaaaaa,
+};
+
+
+int test_burst (int argc, char *argv[])
+{
+       unsigned long size = CACHE_LINE_SIZE;
+       unsigned int pass = 0;
+       int res = 0;
+       int i, j;
+
+       if (argc == 3) {
+               char * d;
+               for (size = 0, d = argv[1]; *d >= '0' && *d <= '9'; d++) {
+                       size *= 10;
+                       size += *d - '0';
+               }
+               if (size == 0 || *d) {
+                       test_usage();
+                       return 1;
+               }
+               for (d = argv[2]; *d >= '0' && *d <= '9'; d++) {
+                       pass *= 10;
+                       pass += *d - '0';
+               }
+               if (*d) {
+                       test_usage();
+                       return 1;
+               }
+       } else if (argc > 3) {
+               test_usage();
+               return 1;
+       }
+
+       size +=  (CACHE_LINE_SIZE - 1);
+       size &= ~(CACHE_LINE_SIZE - 1);
+
+       if (!test_mmu_is_on()) {
+               test_prepare();
+       }
+
+       test_desc(size);
+
+       for (j = 0; !pass || j < pass; j++) {
+               for (i = 0; i < sizeof(test_pattern) / sizeof(test_pattern[0]);
+                    i++) {
+                       res = test_burst_start(size, test_pattern[i]);
+                       if (res != 0) {
+                               goto Done;
+                       }
+               }
+
+               printf ("Iteration #%d passed\n", j + 1);
+
+               if (tstc() && 0x03 == getc())
+                       break;
+       }
+Done:
+       return res;
+}
+
+static void test_prepare (void)
+{
+       printf ("\n");
+
+       caches_init();
+       disable_interrupts();
+       mmu_init();
+
+       printf ("Interrupts are disabled\n");
+       printf ("I-Cache is ON\n");
+       printf ("D-Cache is ON\n");
+       printf ("MMU is ON\n");
+
+       printf ("\n");
+
+       test_map_8M (TEST_PADDR, TEST_VADDR_NC, 0);
+       test_map_8M (TEST_PADDR, TEST_VADDR_C,  1);
+
+       test_map_8M (TEST_FLASH_ADDR & 0xFF800000, TEST_FLASH_ADDR & 0xFF800000, 0);
+
+       /* Configure GPIO ports */
+       signal_init();
+}
+
+static int test_burst_start (unsigned long size, unsigned long pattern)
+{
+       volatile unsigned long * vaddr_c = (unsigned long *)TEST_VADDR_C;
+       volatile unsigned long * vaddr_nc = (unsigned long *)TEST_VADDR_NC;
+       int i, n;
+       int res = 1;
+
+       printf ("Test pattern %08lx ...", pattern);
+
+       n = size / 4;
+
+       for (i = 0; i < n; i ++) {
+               vaddr_c [i] = pattern;
+       }
+       signal_start();
+       flush_dcache_range((unsigned long)vaddr_c, (unsigned long)(vaddr_c + n) - 1);
+
+       for (i = 0; i < n; i ++) {
+               register unsigned long tmp = vaddr_nc [i];
+               if (tmp != pattern) {
+                       test_error("2a", vaddr_nc + i, tmp, pattern);
+                       goto Done;
+               }
+       }
+
+       for (i = 0; i < n; i ++) {
+               register unsigned long tmp = vaddr_c [i];
+               if (tmp != pattern) {
+                       test_error("2b", vaddr_c + i, tmp, pattern);
+                       goto Done;
+               }
+       }
+
+       for (i = 0; i < n; i ++) {
+               vaddr_nc [i] = pattern;
+       }
+
+       for (i = 0; i < n; i ++) {
+               register unsigned long tmp = vaddr_nc [i];
+               if (tmp != pattern) {
+                       test_error("3a", vaddr_nc + i, tmp, pattern);
+                       goto Done;
+               }
+       }
+
+       signal_start();
+       for (i = 0; i < n; i ++) {
+               register unsigned long tmp = vaddr_c [i];
+               if (tmp != pattern) {
+                       test_error("3b", vaddr_c + i, tmp, pattern);
+                       goto Done;
+               }
+       }
+
+       res = 0;
+Done:
+       printf(" %s\n", res == 0 ? "OK" : "");
+
+       return res;
+}
+
+static void test_map_8M (unsigned long paddr, unsigned long vaddr, int cached)
+{
+       mtspr (MD_EPN, (vaddr & 0xFFFFFC00) | MI_EVALID);
+       mtspr (MD_TWC, MI_PS8MEG | MI_SVALID);
+       mtspr (MD_RPN, (paddr & 0xFFFFF000) | MI_BOOTINIT | (cached ? 0 : 2));
+       mtspr (MD_AP, MI_Kp);
+}
+
+static int test_mmu_is_on(void)
+{
+       unsigned long msr;
+
+       asm volatile("mfmsr %0" : "=r" (msr) :);
+
+       return msr & MSR_DR;
+}
+
+static void test_desc(unsigned long size)
+{
+       printf(
+       "The following tests will be conducted:\n"
+       "1)  Map %ld-byte region of physical RAM at 0x%08x\n"
+       "    into two virtual regions:\n"
+       "    one cached at 0x%08x and\n"
+       "    the the other uncached at 0x%08x.\n",
+       size, TEST_PADDR, TEST_VADDR_NC, TEST_VADDR_C);
+
+       puts(
+       "2)  Fill the cached region with a pattern, and flush the cache\n"
+       "2a) Check the uncached region to match the pattern\n"
+       "2b) Check the cached region to match the pattern\n"
+       "3)  Fill the uncached region with a pattern\n"
+       "3a) Check the cached region to match the pattern\n"
+       "3b) Check the uncached region to match the pattern\n"
+       "2b) Change the patterns and go to step 2\n"
+       "\n"
+       );
+}
+
+static void test_error(
+       char * step, volatile void * addr, unsigned long val, unsigned long pattern)
+{
+       volatile unsigned long * p = (void *)TEST_FLASH_ADDR;
+
+       signal_error();
+
+       p[0] = (unsigned long)addr;
+       p[1] = val;
+       p[2] = pattern;
+
+       printf ("\nError at step %s, addr %08lx: read %08lx, pattern %08lx",
+               step, (unsigned long)addr, val, pattern);
+}
+
+static void signal_init(void)
+{
+#if defined(GPIO1_INIT)
+       GPIO1_INIT;
+#endif
+#if defined(GPIO2_INIT)
+       GPIO2_INIT;
+#endif
+}
+
+static void signal_start(void)
+{
+#if defined(GPIO1_INIT)
+       if (GPIO1_DAT & GPIO1_BIT) {
+               GPIO1_DAT &= ~GPIO1_BIT;
+       } else {
+               GPIO1_DAT |= GPIO1_BIT;
+       }
+#endif
+}
+
+static void signal_error(void)
+{
+#if defined(GPIO2_INIT)
+       if (GPIO2_DAT & GPIO2_BIT) {
+               GPIO2_DAT &= ~GPIO2_BIT;
+       } else {
+               GPIO2_DAT |= GPIO2_BIT;
+       }
+#endif
+}
+
+static void test_usage(void)
+{
+       printf("Usage: go 0x40004 [size] [count]\n");
+}
diff --git a/examples/standalone/test_burst.h b/examples/standalone/test_burst.h
new file mode 100644 (file)
index 0000000..f85928c
--- /dev/null
@@ -0,0 +1,38 @@
+/*
+ * (C) Copyright 2005
+ * 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
+ */
+
+#ifndef _TEST_BURST_H
+#define _TEST_BURST_H
+
+/* Cache line size */
+#define CACHE_LINE_SIZE                16
+/* Binary logarithm of the cache line size */
+#define LG_CACHE_LINE_SIZE     4
+
+#ifndef __ASSEMBLY__
+extern void mmu_init(void);
+extern void caches_init(void);
+extern void flush_dcache_range(unsigned long start, unsigned long stop);
+#endif
+
+#endif /* _TEST_BURST_H */
diff --git a/examples/standalone/test_burst_lib.S b/examples/standalone/test_burst_lib.S
new file mode 100644 (file)
index 0000000..aef4e32
--- /dev/null
@@ -0,0 +1,170 @@
+/*
+ * (C) Copyright 2005
+ * 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 <config.h>
+
+#include <ppc_asm.tmpl>
+#include <ppc_defs.h>
+#include <asm/cache.h>
+#include <asm/mmu.h>
+#include "test_burst.h"
+
+       .text
+/*
+ *     void mmu_init(void);
+ *
+ *     This function turns the MMU on
+ *
+ *     Three 8 MByte regions are mapped 1:1, uncached
+ *     - SDRAM lower 8 MByte
+ *     - SDRAM higher 8 MByte
+ *     - IMMR
+ */
+       .global mmu_init
+mmu_init:
+       tlbia                   /* Invalidate all TLB entries */
+       li      r8, 0
+       mtspr   MI_CTR, r8      /* Set instruction control to zero */
+       lis     r8, MD_RESETVAL@h
+       mtspr   MD_CTR, r8      /* Set data TLB control */
+
+       /* Now map the lower 8 Meg into the TLBs.  For this quick hack,
+        * we can load the instruction and data TLB registers with the
+        * same values.
+        */
+       li      r8, MI_EVALID           /* Create EPN for address 0 */
+       mtspr   MI_EPN, r8
+       mtspr   MD_EPN, r8
+       li      r8, MI_PS8MEG           /* Set 8M byte page */
+       ori     r8, r8, MI_SVALID       /* Make it valid */
+       mtspr   MI_TWC, r8
+       mtspr   MD_TWC, r8
+       li      r8, MI_BOOTINIT|0x2     /* Create RPN for address 0 */
+       mtspr   MI_RPN, r8              /* Store TLB entry */
+       mtspr   MD_RPN, r8
+       lis     r8, MI_Kp@h             /* Set the protection mode */
+       mtspr   MI_AP, r8
+       mtspr   MD_AP, r8
+
+       /* Now map the higher 8 Meg into the TLBs.  For this quick hack,
+        * we can load the instruction and data TLB registers with the
+        * same values.
+        */
+       lwz     r9,20(r2)               /* gd->ram_size */
+       addis   r9,r9,-0x80
+
+       mr      r8, r9                  /* Higher 8 Meg in SDRAM */
+       ori     r8, r8, MI_EVALID       /* Mark page valid */
+       mtspr   MI_EPN, r8
+       mtspr   MD_EPN, r8
+       li      r8, MI_PS8MEG           /* Set 8M byte page */
+       ori     r8, r8, MI_SVALID       /* Make it valid */
+       mtspr   MI_TWC, r8
+       mtspr   MD_TWC, r8
+       mr      r8, r9
+       ori     r8, r8, MI_BOOTINIT|0x2
+       mtspr   MI_RPN, r8              /* Store TLB entry */
+       mtspr   MD_RPN, r8
+       lis     r8, MI_Kp@h             /* Set the protection mode */
+       mtspr   MI_AP, r8
+       mtspr   MD_AP, r8
+
+       /* Map another 8 MByte at the IMMR to get the processor
+        * internal registers (among other things).
+        */
+       mfspr   r9, 638                 /* Get current IMMR */
+       andis.  r9, r9, 0xff80          /* Get 8Mbyte boundary */
+
+       mr      r8, r9                  /* Create vaddr for TLB */
+       ori     r8, r8, MD_EVALID       /* Mark it valid */
+       mtspr   MD_EPN, r8
+       li      r8, MD_PS8MEG           /* Set 8M byte page */
+       ori     r8, r8, MD_SVALID       /* Make it valid */
+       mtspr   MD_TWC, r8
+       mr      r8, r9                  /* Create paddr for TLB */
+       ori     r8, r8, MI_BOOTINIT|0x2 /* Inhibit cache -- Cort */
+       mtspr   MD_RPN, r8
+
+       /* We now have the lower and higher 8 Meg mapped into TLB entries,
+        * and the caches ready to work.
+        */
+       mfmsr   r0
+       ori     r0,r0,MSR_DR|MSR_IR
+       mtspr   SRR1,r0
+       mflr    r0
+       mtspr   SRR0,r0
+       SYNC
+       rfi     /* enables MMU */
+
+/*
+ *     void caches_init(void);
+ */
+       .globl  caches_init
+caches_init:
+       sync
+
+       mfspr   r3, IC_CST              /* Clear error bits */
+       mfspr   r3, DC_CST
+
+       lis     r3, IDC_UNALL@h         /* Unlock all */
+       mtspr   IC_CST, r3
+       mtspr   DC_CST, r3
+
+       lis     r3, IDC_INVALL@h        /* Invalidate all */
+       mtspr   IC_CST, r3
+       mtspr   DC_CST, r3
+
+       lis     r3, IDC_ENABLE@h        /* Enable all */
+       mtspr   IC_CST, r3
+       mtspr   DC_CST, r3
+
+       blr
+
+/*
+ *     void flush_dcache_range(unsigned long start, unsigned long stop);
+ */
+       .global flush_dcache_range
+flush_dcache_range:
+       li      r5,CACHE_LINE_SIZE-1
+       andc    r3,r3,r5
+       subf    r4,r3,r4
+       add     r4,r4,r5
+       srwi.   r4,r4,LG_CACHE_LINE_SIZE
+       beqlr
+       mtctr   r4
+
+1:     dcbf    0,r3
+       addi    r3,r3,CACHE_LINE_SIZE
+       bdnz    1b
+       sync                            /* wait for dcbf's to get to ram */
+       blr
+
+/*
+ *     void disable_interrupts(void);
+ */
+       .global disable_interrupts
+disable_interrupts:
+       mfmsr   r0
+       rlwinm  r0,r0,0,17,15
+       mtmsr   r0
+       blr
diff --git a/examples/standalone/timer.c b/examples/standalone/timer.c
new file mode 100644 (file)
index 0000000..6628b21
--- /dev/null
@@ -0,0 +1,349 @@
+/*
+ * (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 <commproc.h>
+#include <mpc8xx_irq.h>
+#include <exports.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+#undef DEBUG
+
+#define        TIMER_PERIOD    1000000         /* 1 second clock */
+
+static void timer_handler (void *arg);
+
+
+/* Access functions for the Machine State Register */
+static __inline__ unsigned long get_msr(void)
+{
+    unsigned long msr;
+
+    asm volatile("mfmsr %0" : "=r" (msr) :);
+    return msr;
+}
+
+static __inline__ void set_msr(unsigned long msr)
+{
+    asm volatile("mtmsr %0" : : "r" (msr));
+}
+
+/*
+ * Definitions to access the CPM Timer registers
+ * See 8xx_immap.h for Internal Memory Map layout,
+ * and commproc.h for CPM Interrupt vectors (aka "IRQ"s)
+ */
+
+typedef struct tid_8xx_cpmtimer_s {
+  int           cpm_vec;       /* CPM Interrupt Vector for this timer  */
+  ushort       *tgcrp;         /* Pointer to Timer Global Config Reg.  */
+  ushort       *tmrp;          /* Pointer to Timer Mode Register       */
+  ushort       *trrp;          /* Pointer to Timer Reference Register  */
+  ushort       *tcrp;          /* Pointer to Timer Capture Register    */
+  ushort       *tcnp;          /* Pointer to Timer Counter Register    */
+  ushort       *terp;          /* Pointer to Timer Event Register      */
+} tid_8xx_cpmtimer_t;
+
+#ifndef CLOCKRATE
+#  define CLOCKRATE 64
+#endif
+
+#define        CPMT_CLOCK_DIV          16
+#define        CPMT_MAX_PRESCALER      256
+#define CPMT_MAX_REFERENCE     65535   /* max. unsigned short */
+
+#define        CPMT_MAX_TICKS          (CPMT_MAX_REFERENCE * CPMT_MAX_PRESCALER)
+#define        CPMT_MAX_TICKS_WITH_DIV (CPMT_MAX_REFERENCE * CPMT_MAX_PRESCALER * CPMT_CLOCK_DIV)
+#define        CPMT_MAX_INTERVAL       (CPMT_MAX_TICKS_WITH_DIV / CLOCKRATE)
+
+/* For now: always use max. prescaler value */
+#define        CPMT_PRESCALER          (CPMT_MAX_PRESCALER)
+
+/* CPM Timer Event Register Bits */
+#define        CPMT_EVENT_CAP          0x0001  /* Capture Event                */
+#define        CPMT_EVENT_REF          0x0002  /* Reference Counter Event      */
+
+/* CPM Timer Global Config Register */
+#define        CPMT_GCR_RST            0x0001  /* Reset  Timer                 */
+#define        CPMT_GCR_STP            0x0002  /* Stop   Timer                 */
+#define        CPMT_GCR_FRZ            0x0004  /* Freeze Timer                 */
+#define        CPMT_GCR_GM_CAS         0x0008  /* Gate Mode / Cascade Timers   */
+#define        CPMT_GCR_MASK           (CPMT_GCR_RST|CPMT_GCR_STP|CPMT_GCR_FRZ|CPMT_GCR_GM_CAS)
+
+/* CPM Timer Mode register */
+#define        CPMT_MR_GE              0x0001  /* Gate Enable                  */
+#define        CPMT_MR_ICLK_CASC       0x0000  /* Clock internally cascaded    */
+#define        CPMT_MR_ICLK_CLK        0x0002  /* Clock = system clock         */
+#define        CPMT_MR_ICLK_CLKDIV     0x0004  /* Clock = system clock / 16    */
+#define        CPMT_MR_ICLK_TIN        0x0006  /* Clock = TINx signal          */
+#define        CPMT_MR_FRR             0x0008  /* Free Run / Restart           */
+#define        CPMT_MR_ORI             0x0010  /* Out. Reference Interrupt En. */
+#define        CPMT_MR_OM              0x0020  /* Output Mode                  */
+#define        CPMT_MR_CE_DIS          0x0000  /* Capture/Interrupt disabled   */
+#define        CPMT_MR_CE_RISE         0x0040  /* Capt./Interr. on rising  TIN */
+#define CPMT_MR_CE_FALL                0x0080  /* Capt./Interr. on falling TIN */
+#define        CPMT_MR_CE_ANY          0x00C0  /* Capt./Interr. on any TIN edge*/
+
+
+/*
+ * which CPM timer to use - index starts at 0 (= timer 1)
+ */
+#define        TID_TIMER_ID    0       /* use CPM timer 1              */
+
+void setPeriod (tid_8xx_cpmtimer_t *hwp, ulong interval);
+
+static char *usage = "\n[q, b, e, ?] ";
+
+int timer (int argc, char *argv[])
+{
+       cpmtimer8xx_t *cpmtimerp;       /* Pointer to the CPM Timer structure   */
+       tid_8xx_cpmtimer_t hw;
+       tid_8xx_cpmtimer_t *hwp = &hw;
+       int c;
+       int running;
+
+       app_startup(argv);
+
+       /* Pointer to CPM Timer structure */
+       cpmtimerp = &((immap_t *) gd->bd->bi_immr_base)->im_cpmtimer;
+
+       printf ("TIMERS=0x%x\n", (unsigned) cpmtimerp);
+
+       /* Initialize pointers depending on which timer we use */
+       switch (TID_TIMER_ID) {
+       case 0:
+               hwp->tmrp = &(cpmtimerp->cpmt_tmr1);
+               hwp->trrp = &(cpmtimerp->cpmt_trr1);
+               hwp->tcrp = &(cpmtimerp->cpmt_tcr1);
+               hwp->tcnp = &(cpmtimerp->cpmt_tcn1);
+               hwp->terp = &(cpmtimerp->cpmt_ter1);
+               hwp->cpm_vec = CPMVEC_TIMER1;
+               break;
+       case 1:
+               hwp->tmrp = &(cpmtimerp->cpmt_tmr2);
+               hwp->trrp = &(cpmtimerp->cpmt_trr2);
+               hwp->tcrp = &(cpmtimerp->cpmt_tcr2);
+               hwp->tcnp = &(cpmtimerp->cpmt_tcn2);
+               hwp->terp = &(cpmtimerp->cpmt_ter2);
+               hwp->cpm_vec = CPMVEC_TIMER2;
+               break;
+       case 2:
+               hwp->tmrp = &(cpmtimerp->cpmt_tmr3);
+               hwp->trrp = &(cpmtimerp->cpmt_trr3);
+               hwp->tcrp = &(cpmtimerp->cpmt_tcr3);
+               hwp->tcnp = &(cpmtimerp->cpmt_tcn3);
+               hwp->terp = &(cpmtimerp->cpmt_ter3);
+               hwp->cpm_vec = CPMVEC_TIMER3;
+               break;
+       case 3:
+               hwp->tmrp = &(cpmtimerp->cpmt_tmr4);
+               hwp->trrp = &(cpmtimerp->cpmt_trr4);
+               hwp->tcrp = &(cpmtimerp->cpmt_tcr4);
+               hwp->tcnp = &(cpmtimerp->cpmt_tcn4);
+               hwp->terp = &(cpmtimerp->cpmt_ter4);
+               hwp->cpm_vec = CPMVEC_TIMER4;
+               break;
+       }
+
+       hwp->tgcrp = &cpmtimerp->cpmt_tgcr;
+
+       printf ("Using timer %d\n"
+                       "tgcr @ 0x%x, tmr @ 0x%x, trr @ 0x%x,"
+                       " tcr @ 0x%x, tcn @ 0x%x, ter @ 0x%x\n",
+                       TID_TIMER_ID + 1,
+                       (unsigned) hwp->tgcrp,
+                       (unsigned) hwp->tmrp,
+                       (unsigned) hwp->trrp,
+                       (unsigned) hwp->tcrp,
+                       (unsigned) hwp->tcnp,
+                       (unsigned) hwp->terp
+                       );
+
+       /* reset timer    */
+       *hwp->tgcrp &= ~(CPMT_GCR_MASK << TID_TIMER_ID);
+
+       /* clear all events */
+       *hwp->terp = (CPMT_EVENT_CAP | CPMT_EVENT_REF);
+
+       printf (usage);
+       running = 0;
+       while ((c = getc()) != 'q') {
+           if (c == 'b') {
+
+               setPeriod (hwp, TIMER_PERIOD);  /* Set period and start ticking */
+
+               /* Install interrupt handler (enable timer in CIMR) */
+               install_hdlr (hwp->cpm_vec, timer_handler, hwp);
+
+               printf ("Enabling timer\n");
+
+               /* enable timer */
+               *hwp->tgcrp |= (CPMT_GCR_RST << TID_TIMER_ID);
+               running = 1;
+
+#ifdef DEBUG
+               printf ("tgcr=0x%x, tmr=0x%x, trr=0x%x,"
+                       " tcr=0x%x, tcn=0x%x, ter=0x%x\n",
+                               *hwp->tgcrp, *hwp->tmrp, *hwp->trrp,
+                               *hwp->tcrp,  *hwp->tcnp, *hwp->terp
+                               );
+#endif
+           } else if (c == 'e') {
+
+               printf ("Stopping timer\n");
+
+               *hwp->tgcrp &= ~(CPMT_GCR_MASK << TID_TIMER_ID);
+               running = 0;
+
+#ifdef DEBUG
+               printf ("tgcr=0x%x, tmr=0x%x, trr=0x%x,"
+                       " tcr=0x%x, tcn=0x%x, ter=0x%x\n",
+                               *hwp->tgcrp, *hwp->tmrp, *hwp->trrp,
+                               *hwp->tcrp,  *hwp->tcnp, *hwp->terp
+                       );
+#endif
+               /* Uninstall interrupt handler */
+               free_hdlr (hwp->cpm_vec);
+
+           } else if (c == '?') {
+#ifdef DEBUG
+               cpic8xx_t *cpm_icp = &((immap_t *) gd->bd->bi_immr_base)->im_cpic;
+               sysconf8xx_t *siup = &((immap_t *) gd->bd->bi_immr_base)->im_siu_conf;
+#endif
+
+               printf ("\ntgcr=0x%x, tmr=0x%x, trr=0x%x,"
+                       " tcr=0x%x, tcn=0x%x, ter=0x%x\n",
+                               *hwp->tgcrp, *hwp->tmrp, *hwp->trrp,
+                               *hwp->tcrp,  *hwp->tcnp, *hwp->terp
+                       );
+#ifdef DEBUG
+               printf ("SIUMCR=0x%08lx, SYPCR=0x%08lx,"
+                       " SIMASK=0x%08lx, SIPEND=0x%08lx\n",
+                               siup->sc_siumcr,
+                               siup->sc_sypcr,
+                               siup->sc_simask,
+                               siup->sc_sipend
+                       );
+
+               printf ("CIMR=0x%08lx, CICR=0x%08lx, CIPR=0x%08lx\n",
+                       cpm_icp->cpic_cimr,
+                       cpm_icp->cpic_cicr,
+                       cpm_icp->cpic_cipr
+                       );
+#endif
+           } else {
+               printf ("\nEnter: q - quit, b - start timer, e - stop timer, ? - get status\n");
+           }
+           printf (usage);
+       }
+       if (running) {
+               printf ("Stopping timer\n");
+               *hwp->tgcrp &= ~(CPMT_GCR_MASK << TID_TIMER_ID);
+               free_hdlr (hwp->cpm_vec);
+       }
+
+       return (0);
+}
+
+
+/* Set period in microseconds and start.
+ * Truncate to maximum period if more than this is requested - but warn about it.
+ */
+
+void setPeriod (tid_8xx_cpmtimer_t *hwp, ulong interval)
+{
+       unsigned short prescaler;
+       unsigned long ticks;
+
+       printf ("Set interval %ld us\n", interval);
+
+       /* Warn if requesting longer period than possible */
+       if (interval > CPMT_MAX_INTERVAL) {
+               printf ("Truncate interval %ld to maximum (%d)\n",
+                               interval, CPMT_MAX_INTERVAL);
+               interval = CPMT_MAX_INTERVAL;
+       }
+       /*
+        * Check if we want to use clock divider:
+        * Since the reference counter can be incremented only in integer steps,
+        * we try to keep it as big as possible to allow the resulting period to be
+        * as precise as possible.
+        */
+       /* prescaler, enable interrupt, restart after ref count is reached */
+       prescaler = (ushort) ((CPMT_PRESCALER - 1) << 8) |
+                       CPMT_MR_ORI |
+                       CPMT_MR_FRR;
+
+       ticks = ((ulong) CLOCKRATE * interval);
+
+       if (ticks > CPMT_MAX_TICKS) {
+               ticks /= CPMT_CLOCK_DIV;
+               prescaler |= CPMT_MR_ICLK_CLKDIV;       /* use system clock divided by 16 */
+       } else {
+               prescaler |= CPMT_MR_ICLK_CLK;  /* use system clock without divider */
+       }
+
+#ifdef DEBUG
+       printf ("clock/%d, prescale factor %d, reference %ld, ticks %ld\n",
+                       (ticks > CPMT_MAX_TICKS) ? CPMT_CLOCK_DIV : 1,
+                       CPMT_PRESCALER,
+                       (ticks / CPMT_PRESCALER),
+                       ticks
+                       );
+#endif
+
+       /* set prescaler register */
+       *hwp->tmrp = prescaler;
+
+       /* clear timer counter */
+       *hwp->tcnp = 0;
+
+       /* set reference register */
+       *hwp->trrp = (unsigned short) (ticks / CPMT_PRESCALER);
+
+#ifdef DEBUG
+       printf ("tgcr=0x%x, tmr=0x%x, trr=0x%x,"
+               " tcr=0x%x, tcn=0x%x, ter=0x%x\n",
+                       *hwp->tgcrp, *hwp->tmrp, *hwp->trrp,
+                       *hwp->tcrp,  *hwp->tcnp, *hwp->terp
+               );
+#endif
+}
+
+/*
+ * Handler for CPMVEC_TIMER1 interrupt
+ */
+static
+void timer_handler (void *arg)
+{
+       tid_8xx_cpmtimer_t *hwp = (tid_8xx_cpmtimer_t *)arg;
+
+       /* printf ("** TER1=%04x ** ", *hwp->terp); */
+
+       /* just for demonstration */
+       printf (".");
+
+       /* clear all possible events: Ref. and Cap. */
+       *hwp->terp = (CPMT_EVENT_CAP | CPMT_EVENT_REF);
+}
diff --git a/examples/standalone/x86-testapp.c b/examples/standalone/x86-testapp.c
new file mode 100644 (file)
index 0000000..e8603d9
--- /dev/null
@@ -0,0 +1,87 @@
+#include <stddef.h>
+#include <stdio.h>
+#include <string.h>
+
+void *func[8], **pfunc;
+
+typedef struct xxx xxx_t;
+struct xxx {
+       int dummy;
+       void **pfunc;
+} q;
+
+#define XF_strcpy 3
+#define XF_printf 4
+
+#define LABEL(x)                                       \
+asm volatile (                                         \
+
+#if defined(__i386__)
+#define EXPORT_FUNC(x)                                 \
+asm volatile (                                         \
+"      .globl mon_" #x "\n"                            \
+"mon_" #x ":\n"                                                \
+"      movl    %0, %%eax\n"                            \
+"      movl    pfunc, %%ecx\n"                         \
+"      jmp     *(%%ecx,%%eax)\n"                       \
+       : : "i"(XF_ ## x * sizeof(void *)) : "eax", "ecx");
+#elif defined(__powerpc__)
+#define EXPORT_FUNC(x)                                 \
+asm volatile (                                         \
+"      .globl mon_" #x "\n"                            \
+"mon_" #x ":\n"                                                \
+"      lwz     %%r11, %0(%%r2)\n"                      \
+"      lwz     %%r11, %1(%%r11)\n"                     \
+"      mtctr   %%r11\n"                                \
+"      bctr\n"                                 \
+       : : "i"(offsetof(xxx_t, pfunc)), "i"(XF_ ## x * sizeof(void *)) : "r11", "r2");
+#elif defined(__arm__)
+#define EXPORT_FUNC(x)                                 \
+asm volatile (                                         \
+"      .globl mon_" #x "\n"                            \
+"mon_" #x ":\n"                                                \
+"      ldr     ip, [r8, %0]\n"                         \
+"      ldr     pc, [ip, %1]\n"                         \
+       : : "i"(offsetof(xxx_t, pfunc)), "i"(XF_ ## x * sizeof(void *)) : "ip");
+#elif defined(__mips__)
+#define EXPORT_FUNC(x)                                 \
+asm volatile (                                         \
+"      .globl mon_" #x "\n"                            \
+"mon_" #x ":\n"                                                \
+"      lw      $25, %0($26)\n"                         \
+"      lw      $25, %1($25)\n"                         \
+"      jr      $25\n"                                  \
+       : : "i"(offsetof(xxx_t, pfunc)), "i"(XF_ ## x * sizeof(void *)) : "t9");
+#else
+#error [No stub code for this arch]
+#endif
+
+void dummy(void)
+{
+EXPORT_FUNC(printf)
+EXPORT_FUNC(strcpy)
+}
+
+int main(void)
+{
+#if defined(__i386__)
+       xxx_t *pq;
+#elif defined(__powerpc__)
+       register volatile xxx_t *pq asm("r2");
+#elif defined(__arm__)
+       register volatile xxx_t *pq asm("r8");
+#elif defined(__mips__)
+       register volatile xxx_t *pq asm("k0");
+#endif
+       char buf[32];
+
+       func[XF_strcpy] = strcpy;
+       func[XF_printf] = printf;
+       pq = &q;
+       pq->pfunc = pfunc = func;
+
+       mon_strcpy(buf, "test");
+       mon_printf("hi %s %d z\n", buf, 444);
+
+       return 0;
+}
diff --git a/examples/stubs.c b/examples/stubs.c
deleted file mode 100644 (file)
index a8cb954..0000000
+++ /dev/null
@@ -1,225 +0,0 @@
-#include <exports.h>
-
-#ifndef GCC_VERSION
-#define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__)
-#endif /* GCC_VERSION */
-
-#if defined(CONFIG_I386)
-/*
- * x86 does not have a dedicated register to store the pointer to
- * the global_data. Thus the jump table address is stored in a
- * global variable, but such approach does not allow for execution
- * from flash memory. The global_data address is passed as argv[-1]
- * to the application program.
- */
-static void **jt;
-gd_t *global_data;
-
-#define EXPORT_FUNC(x) \
-       asm volatile (                  \
-"      .globl " #x "\n"                \
-#x ":\n"                               \
-"      movl    %0, %%eax\n"            \
-"      movl    jt, %%ecx\n"            \
-"      jmp     *(%%ecx, %%eax)\n"      \
-       : : "i"(XF_ ## x * sizeof(void *)) : "eax", "ecx");
-#elif defined(CONFIG_PPC)
-/*
- * r2 holds the pointer to the global_data, r11 is a call-clobbered
- * register
- */
-#define EXPORT_FUNC(x) \
-       asm volatile (                  \
-"      .globl " #x "\n"                \
-#x ":\n"                               \
-"      lwz     %%r11, %0(%%r2)\n"      \
-"      lwz     %%r11, %1(%%r11)\n"     \
-"      mtctr   %%r11\n"                \
-"      bctr\n"                         \
-       : : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x * sizeof(void *)) : "r11");
-#elif defined(CONFIG_ARM)
-/*
- * r8 holds the pointer to the global_data, ip is a call-clobbered
- * register
- */
-#define EXPORT_FUNC(x) \
-       asm volatile (                  \
-"      .globl " #x "\n"                \
-#x ":\n"                               \
-"      ldr     ip, [r8, %0]\n"         \
-"      ldr     pc, [ip, %1]\n"         \
-       : : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x * sizeof(void *)) : "ip");
-#elif defined(CONFIG_MIPS)
-/*
- * k0 ($26) holds the pointer to the global_data; t9 ($25) is a call-
- * clobbered register that is also used to set gp ($26). Note that the
- * jr instruction also executes the instruction immediately following
- * it; however, GCC/mips generates an additional `nop' after each asm
- * statement
- */
-#define EXPORT_FUNC(x) \
-       asm volatile (                  \
-"      .globl " #x "\n"                \
-#x ":\n"                               \
-"      lw      $25, %0($26)\n"         \
-"      lw      $25, %1($25)\n"         \
-"      jr      $25\n"                  \
-       : : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x * sizeof(void *)) : "t9");
-#elif defined(CONFIG_NIOS)
-/*
- * %g7 holds the pointer to the global_data. %g0 is call clobbered.
- */
-#define EXPORT_FUNC(x) \
-       asm volatile (                  \
-"      .globl " #x "\n"                \
-#x ":\n"                               \
-"      pfx     %%hi(%0)\n"             \
-"      movi    %%g0, %%lo(%0)\n"       \
-"      add     %%g0, %%g7\n"           \
-"      ld      %%g0, [%%g0]\n"         \
-"      pfx     %1\n"                   \
-"      ld      %%g0, [%%g0]\n"         \
-"      jmp     %%g0\n"                 \
-"      nop     \n"                     \
-       : : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x) : "r0");
-#elif defined(CONFIG_NIOS2)
-/*
- * r15 holds the pointer to the global_data, r8 is call-clobbered
- */
-#define EXPORT_FUNC(x) \
-       asm volatile (                  \
-"      .globl " #x "\n"                \
-#x ":\n"                               \
-"      movhi   r8, %%hi(%0)\n"         \
-"      ori     r8, r0, %%lo(%0)\n"     \
-"      add     r8, r8, r15\n"          \
-"      ldw     r8, 0(r8)\n"            \
-"      ldw     r8, %1(r8)\n"           \
-"      jmp     r8\n"                   \
-       : : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x * sizeof(void *)) : "r15");
-#elif defined(CONFIG_M68K)
-/*
- * d7 holds the pointer to the global_data, a0 is a call-clobbered
- * register
- */
-#define EXPORT_FUNC(x) \
-       asm volatile (                  \
-"      .globl " #x "\n"                \
-#x ":\n"                               \
-"      move.l  %%d7, %%a0\n"           \
-"      adda.l  %0, %%a0\n"             \
-"      move.l  (%%a0), %%a0\n"         \
-"      adda.l  %1, %%a0\n"             \
-"      move.l  (%%a0), %%a0\n"         \
-"      jmp     (%%a0)\n"                       \
-       : : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x * sizeof(void *)) : "a0");
-#elif defined(CONFIG_MICROBLAZE)
-/*
- * r31 holds the pointer to the global_data. r5 is a call-clobbered.
- */
-#define EXPORT_FUNC(x)                         \
-       asm volatile (                          \
-"      .globl " #x "\n"                        \
-#x ":\n"                                       \
-"      lwi     r5, r31, %0\n"                  \
-"      lwi     r5, r5, %1\n"                   \
-"      bra     r5\n"                           \
-       : : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x * sizeof(void *)) : "r5");
-#elif defined(CONFIG_BLACKFIN)
-/*
- * P5 holds the pointer to the global_data, P0 is a call-clobbered
- * register
- */
-#define EXPORT_FUNC(x)                 \
-       asm volatile (                  \
-"      .globl _" #x "\n_"              \
-#x ":\n"                               \
-"      P0 = [P5 + %0]\n"               \
-"      P0 = [P0 + %1]\n"               \
-"      JUMP (P0)\n"                    \
-       : : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x * sizeof(void *)) : "P0");
-#elif defined(CONFIG_AVR32)
-/*
- * r6 holds the pointer to the global_data. r8 is call clobbered.
- */
-#define EXPORT_FUNC(x)                                 \
-       asm volatile(                                   \
-               "       .globl\t" #x "\n"               \
-               #x ":\n"                                \
-               "       ld.w    r8, r6[%0]\n"           \
-               "       ld.w    pc, r8[%1]\n"           \
-               :                                       \
-               : "i"(offsetof(gd_t, jt)), "i"(XF_ ##x) \
-               : "r8");
-#elif defined(CONFIG_SH)
-/*
- * r13 holds the pointer to the global_data. r1 is a call clobbered.
- */
-#define EXPORT_FUNC(x)                                 \
-       asm volatile (                                  \
-               "       .align  2\n"                    \
-               "       .globl " #x "\n"                \
-               #x ":\n"                                \
-               "       mov     r13, r1\n"              \
-               "       add     %0, r1\n"               \
-               "       mov.l @r1, r2\n"        \
-               "       add     %1, r2\n"               \
-               "       mov.l @r2, r1\n"        \
-               "       jmp     @r1\n"                  \
-               "       nop\n"                          \
-               "       nop\n"                          \
-               : : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x * sizeof(void *)) : "r1", "r2");
-#elif defined(CONFIG_SPARC)
-/*
- * g7 holds the pointer to the global_data. g1 is call clobbered.
- */
-#define EXPORT_FUNC(x)                                 \
-       asm volatile(                                   \
-"      .globl\t" #x "\n"                               \
-#x ":\n"                                               \
-"      set %0, %%g1\n"                                 \
-"      or %%g1, %%g7, %%g1\n"                          \
-"      ld [%%g1], %%g1\n"                              \
-"      ld [%%g1 + %1], %%g1\n"                         \
-"      call %%g1\n"                                    \
-"      nop\n"                                          \
-       : : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x) : "g1" );
-
-#else
-#error stubs definition missing for this architecture
-#endif
-
-/* This function is necessary to prevent the compiler from
- * generating prologue/epilogue, preparing stack frame etc.
- * The stub functions are special, they do not use the stack
- * frame passed to them, but pass it intact to the actual
- * implementation. On the other hand, asm() statements with
- * arguments can be used only inside the functions (gcc limitation)
- */
-#if GCC_VERSION < 3004
-static
-#endif /* GCC_VERSION */
-void __attribute__((unused)) dummy(void)
-{
-#include <_exports.h>
-}
-
-extern unsigned long __bss_start, _end;
-
-void app_startup(char **argv)
-{
-       unsigned char * cp = (unsigned char *) &__bss_start;
-
-       /* Zero out BSS */
-       while (cp < (unsigned char *)&_end) {
-               *cp++ = 0;
-       }
-
-#if defined(CONFIG_I386)
-       /* x86 does not have a dedicated register for passing global_data */
-       global_data = (gd_t *)argv[-1];
-       jt = global_data->jt;
-#endif
-}
-
-#undef EXPORT_FUNC
diff --git a/examples/test_burst.c b/examples/test_burst.c
deleted file mode 100644 (file)
index 7109c09..0000000
+++ /dev/null
@@ -1,319 +0,0 @@
-/*
- * (C) Copyright 2005
- * 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
- *
- * The test exercises SDRAM accesses in burst mode
- */
-
-#include <common.h>
-#include <exports.h>
-
-#include <commproc.h>
-#include <asm/mmu.h>
-#include <asm/processor.h>
-
-#include <serial.h>
-#include <watchdog.h>
-
-#include "test_burst.h"
-
-/* 8 MB test region of physical RAM */
-#define TEST_PADDR     0x00800000
-/* The uncached virtual region */
-#define TEST_VADDR_NC  0x00800000
-/* The cached virtual region */
-#define TEST_VADDR_C   0x01000000
-/* When an error is detected, the address where the error has been found,
-   and also the current and the expected data will be written to
-   the following flash address
-*/
-#define TEST_FLASH_ADDR        0x40100000
-
-/* Define GPIO ports to signal start of burst transfers and errors */
-#ifdef CONFIG_LWMON
-/* Use PD.8 to signal start of burst transfers */
-#define GPIO1_DAT      (((volatile immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pddat)
-#define GPIO1_BIT      0x0080
-/* Configure PD.8 as general purpose output */
-#define GPIO1_INIT \
-       ((volatile immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pdpar &= ~GPIO1_BIT; \
-       ((volatile immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pddir |=  GPIO1_BIT;
-/* Use PD.9 to signal error */
-#define GPIO2_DAT      (((volatile immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pddat)
-#define GPIO2_BIT      0x0040
-/* Configure PD.9 as general purpose output */
-#define GPIO2_INIT \
-       ((volatile immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pdpar &= ~GPIO2_BIT; \
-       ((volatile immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pddir |=  GPIO2_BIT;
-#endif /* CONFIG_LWMON */
-
-
-static void test_prepare (void);
-static int test_burst_start (unsigned long size, unsigned long pattern);
-static void test_map_8M (unsigned long paddr, unsigned long vaddr, int cached);
-static int test_mmu_is_on(void);
-static void test_desc(unsigned long size);
-static void test_error(char * step, volatile void * addr, unsigned long val, unsigned long pattern);
-static void signal_init(void);
-static void signal_start(void);
-static void signal_error(void);
-static void test_usage(void);
-
-static unsigned long test_pattern [] = {
-       0x00000000,
-       0xffffffff,
-       0x55555555,
-       0xaaaaaaaa,
-};
-
-
-int test_burst (int argc, char *argv[])
-{
-       unsigned long size = CACHE_LINE_SIZE;
-       unsigned int pass = 0;
-       int res = 0;
-       int i, j;
-
-       if (argc == 3) {
-               char * d;
-               for (size = 0, d = argv[1]; *d >= '0' && *d <= '9'; d++) {
-                       size *= 10;
-                       size += *d - '0';
-               }
-               if (size == 0 || *d) {
-                       test_usage();
-                       return 1;
-               }
-               for (d = argv[2]; *d >= '0' && *d <= '9'; d++) {
-                       pass *= 10;
-                       pass += *d - '0';
-               }
-               if (*d) {
-                       test_usage();
-                       return 1;
-               }
-       } else if (argc > 3) {
-               test_usage();
-               return 1;
-       }
-
-       size +=  (CACHE_LINE_SIZE - 1);
-       size &= ~(CACHE_LINE_SIZE - 1);
-
-       if (!test_mmu_is_on()) {
-               test_prepare();
-       }
-
-       test_desc(size);
-
-       for (j = 0; !pass || j < pass; j++) {
-               for (i = 0; i < sizeof(test_pattern) / sizeof(test_pattern[0]);
-                    i++) {
-                       res = test_burst_start(size, test_pattern[i]);
-                       if (res != 0) {
-                               goto Done;
-                       }
-               }
-
-               printf ("Iteration #%d passed\n", j + 1);
-
-               if (tstc() && 0x03 == getc())
-                       break;
-       }
-Done:
-       return res;
-}
-
-static void test_prepare (void)
-{
-       printf ("\n");
-
-       caches_init();
-       disable_interrupts();
-       mmu_init();
-
-       printf ("Interrupts are disabled\n");
-       printf ("I-Cache is ON\n");
-       printf ("D-Cache is ON\n");
-       printf ("MMU is ON\n");
-
-       printf ("\n");
-
-       test_map_8M (TEST_PADDR, TEST_VADDR_NC, 0);
-       test_map_8M (TEST_PADDR, TEST_VADDR_C,  1);
-
-       test_map_8M (TEST_FLASH_ADDR & 0xFF800000, TEST_FLASH_ADDR & 0xFF800000, 0);
-
-       /* Configure GPIO ports */
-       signal_init();
-}
-
-static int test_burst_start (unsigned long size, unsigned long pattern)
-{
-       volatile unsigned long * vaddr_c = (unsigned long *)TEST_VADDR_C;
-       volatile unsigned long * vaddr_nc = (unsigned long *)TEST_VADDR_NC;
-       int i, n;
-       int res = 1;
-
-       printf ("Test pattern %08lx ...", pattern);
-
-       n = size / 4;
-
-       for (i = 0; i < n; i ++) {
-               vaddr_c [i] = pattern;
-       }
-       signal_start();
-       flush_dcache_range((unsigned long)vaddr_c, (unsigned long)(vaddr_c + n) - 1);
-
-       for (i = 0; i < n; i ++) {
-               register unsigned long tmp = vaddr_nc [i];
-               if (tmp != pattern) {
-                       test_error("2a", vaddr_nc + i, tmp, pattern);
-                       goto Done;
-               }
-       }
-
-       for (i = 0; i < n; i ++) {
-               register unsigned long tmp = vaddr_c [i];
-               if (tmp != pattern) {
-                       test_error("2b", vaddr_c + i, tmp, pattern);
-                       goto Done;
-               }
-       }
-
-       for (i = 0; i < n; i ++) {
-               vaddr_nc [i] = pattern;
-       }
-
-       for (i = 0; i < n; i ++) {
-               register unsigned long tmp = vaddr_nc [i];
-               if (tmp != pattern) {
-                       test_error("3a", vaddr_nc + i, tmp, pattern);
-                       goto Done;
-               }
-       }
-
-       signal_start();
-       for (i = 0; i < n; i ++) {
-               register unsigned long tmp = vaddr_c [i];
-               if (tmp != pattern) {
-                       test_error("3b", vaddr_c + i, tmp, pattern);
-                       goto Done;
-               }
-       }
-
-       res = 0;
-Done:
-       printf(" %s\n", res == 0 ? "OK" : "");
-
-       return res;
-}
-
-static void test_map_8M (unsigned long paddr, unsigned long vaddr, int cached)
-{
-       mtspr (MD_EPN, (vaddr & 0xFFFFFC00) | MI_EVALID);
-       mtspr (MD_TWC, MI_PS8MEG | MI_SVALID);
-       mtspr (MD_RPN, (paddr & 0xFFFFF000) | MI_BOOTINIT | (cached ? 0 : 2));
-       mtspr (MD_AP, MI_Kp);
-}
-
-static int test_mmu_is_on(void)
-{
-       unsigned long msr;
-
-       asm volatile("mfmsr %0" : "=r" (msr) :);
-
-       return msr & MSR_DR;
-}
-
-static void test_desc(unsigned long size)
-{
-       printf(
-       "The following tests will be conducted:\n"
-       "1)  Map %ld-byte region of physical RAM at 0x%08x\n"
-       "    into two virtual regions:\n"
-       "    one cached at 0x%08x and\n"
-       "    the the other uncached at 0x%08x.\n",
-       size, TEST_PADDR, TEST_VADDR_NC, TEST_VADDR_C);
-
-       puts(
-       "2)  Fill the cached region with a pattern, and flush the cache\n"
-       "2a) Check the uncached region to match the pattern\n"
-       "2b) Check the cached region to match the pattern\n"
-       "3)  Fill the uncached region with a pattern\n"
-       "3a) Check the cached region to match the pattern\n"
-       "3b) Check the uncached region to match the pattern\n"
-       "2b) Change the patterns and go to step 2\n"
-       "\n"
-       );
-}
-
-static void test_error(
-       char * step, volatile void * addr, unsigned long val, unsigned long pattern)
-{
-       volatile unsigned long * p = (void *)TEST_FLASH_ADDR;
-
-       signal_error();
-
-       p[0] = (unsigned long)addr;
-       p[1] = val;
-       p[2] = pattern;
-
-       printf ("\nError at step %s, addr %08lx: read %08lx, pattern %08lx",
-               step, (unsigned long)addr, val, pattern);
-}
-
-static void signal_init(void)
-{
-#if defined(GPIO1_INIT)
-       GPIO1_INIT;
-#endif
-#if defined(GPIO2_INIT)
-       GPIO2_INIT;
-#endif
-}
-
-static void signal_start(void)
-{
-#if defined(GPIO1_INIT)
-       if (GPIO1_DAT & GPIO1_BIT) {
-               GPIO1_DAT &= ~GPIO1_BIT;
-       } else {
-               GPIO1_DAT |= GPIO1_BIT;
-       }
-#endif
-}
-
-static void signal_error(void)
-{
-#if defined(GPIO2_INIT)
-       if (GPIO2_DAT & GPIO2_BIT) {
-               GPIO2_DAT &= ~GPIO2_BIT;
-       } else {
-               GPIO2_DAT |= GPIO2_BIT;
-       }
-#endif
-}
-
-static void test_usage(void)
-{
-       printf("Usage: go 0x40004 [size] [count]\n");
-}
diff --git a/examples/test_burst.h b/examples/test_burst.h
deleted file mode 100644 (file)
index f85928c..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * (C) Copyright 2005
- * 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
- */
-
-#ifndef _TEST_BURST_H
-#define _TEST_BURST_H
-
-/* Cache line size */
-#define CACHE_LINE_SIZE                16
-/* Binary logarithm of the cache line size */
-#define LG_CACHE_LINE_SIZE     4
-
-#ifndef __ASSEMBLY__
-extern void mmu_init(void);
-extern void caches_init(void);
-extern void flush_dcache_range(unsigned long start, unsigned long stop);
-#endif
-
-#endif /* _TEST_BURST_H */
diff --git a/examples/test_burst_lib.S b/examples/test_burst_lib.S
deleted file mode 100644 (file)
index aef4e32..0000000
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * (C) Copyright 2005
- * 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 <config.h>
-
-#include <ppc_asm.tmpl>
-#include <ppc_defs.h>
-#include <asm/cache.h>
-#include <asm/mmu.h>
-#include "test_burst.h"
-
-       .text
-/*
- *     void mmu_init(void);
- *
- *     This function turns the MMU on
- *
- *     Three 8 MByte regions are mapped 1:1, uncached
- *     - SDRAM lower 8 MByte
- *     - SDRAM higher 8 MByte
- *     - IMMR
- */
-       .global mmu_init
-mmu_init:
-       tlbia                   /* Invalidate all TLB entries */
-       li      r8, 0
-       mtspr   MI_CTR, r8      /* Set instruction control to zero */
-       lis     r8, MD_RESETVAL@h
-       mtspr   MD_CTR, r8      /* Set data TLB control */
-
-       /* Now map the lower 8 Meg into the TLBs.  For this quick hack,
-        * we can load the instruction and data TLB registers with the
-        * same values.
-        */
-       li      r8, MI_EVALID           /* Create EPN for address 0 */
-       mtspr   MI_EPN, r8
-       mtspr   MD_EPN, r8
-       li      r8, MI_PS8MEG           /* Set 8M byte page */
-       ori     r8, r8, MI_SVALID       /* Make it valid */
-       mtspr   MI_TWC, r8
-       mtspr   MD_TWC, r8
-       li      r8, MI_BOOTINIT|0x2     /* Create RPN for address 0 */
-       mtspr   MI_RPN, r8              /* Store TLB entry */
-       mtspr   MD_RPN, r8
-       lis     r8, MI_Kp@h             /* Set the protection mode */
-       mtspr   MI_AP, r8
-       mtspr   MD_AP, r8
-
-       /* Now map the higher 8 Meg into the TLBs.  For this quick hack,
-        * we can load the instruction and data TLB registers with the
-        * same values.
-        */
-       lwz     r9,20(r2)               /* gd->ram_size */
-       addis   r9,r9,-0x80
-
-       mr      r8, r9                  /* Higher 8 Meg in SDRAM */
-       ori     r8, r8, MI_EVALID       /* Mark page valid */
-       mtspr   MI_EPN, r8
-       mtspr   MD_EPN, r8
-       li      r8, MI_PS8MEG           /* Set 8M byte page */
-       ori     r8, r8, MI_SVALID       /* Make it valid */
-       mtspr   MI_TWC, r8
-       mtspr   MD_TWC, r8
-       mr      r8, r9
-       ori     r8, r8, MI_BOOTINIT|0x2
-       mtspr   MI_RPN, r8              /* Store TLB entry */
-       mtspr   MD_RPN, r8
-       lis     r8, MI_Kp@h             /* Set the protection mode */
-       mtspr   MI_AP, r8
-       mtspr   MD_AP, r8
-
-       /* Map another 8 MByte at the IMMR to get the processor
-        * internal registers (among other things).
-        */
-       mfspr   r9, 638                 /* Get current IMMR */
-       andis.  r9, r9, 0xff80          /* Get 8Mbyte boundary */
-
-       mr      r8, r9                  /* Create vaddr for TLB */
-       ori     r8, r8, MD_EVALID       /* Mark it valid */
-       mtspr   MD_EPN, r8
-       li      r8, MD_PS8MEG           /* Set 8M byte page */
-       ori     r8, r8, MD_SVALID       /* Make it valid */
-       mtspr   MD_TWC, r8
-       mr      r8, r9                  /* Create paddr for TLB */
-       ori     r8, r8, MI_BOOTINIT|0x2 /* Inhibit cache -- Cort */
-       mtspr   MD_RPN, r8
-
-       /* We now have the lower and higher 8 Meg mapped into TLB entries,
-        * and the caches ready to work.
-        */
-       mfmsr   r0
-       ori     r0,r0,MSR_DR|MSR_IR
-       mtspr   SRR1,r0
-       mflr    r0
-       mtspr   SRR0,r0
-       SYNC
-       rfi     /* enables MMU */
-
-/*
- *     void caches_init(void);
- */
-       .globl  caches_init
-caches_init:
-       sync
-
-       mfspr   r3, IC_CST              /* Clear error bits */
-       mfspr   r3, DC_CST
-
-       lis     r3, IDC_UNALL@h         /* Unlock all */
-       mtspr   IC_CST, r3
-       mtspr   DC_CST, r3
-
-       lis     r3, IDC_INVALL@h        /* Invalidate all */
-       mtspr   IC_CST, r3
-       mtspr   DC_CST, r3
-
-       lis     r3, IDC_ENABLE@h        /* Enable all */
-       mtspr   IC_CST, r3
-       mtspr   DC_CST, r3
-
-       blr
-
-/*
- *     void flush_dcache_range(unsigned long start, unsigned long stop);
- */
-       .global flush_dcache_range
-flush_dcache_range:
-       li      r5,CACHE_LINE_SIZE-1
-       andc    r3,r3,r5
-       subf    r4,r3,r4
-       add     r4,r4,r5
-       srwi.   r4,r4,LG_CACHE_LINE_SIZE
-       beqlr
-       mtctr   r4
-
-1:     dcbf    0,r3
-       addi    r3,r3,CACHE_LINE_SIZE
-       bdnz    1b
-       sync                            /* wait for dcbf's to get to ram */
-       blr
-
-/*
- *     void disable_interrupts(void);
- */
-       .global disable_interrupts
-disable_interrupts:
-       mfmsr   r0
-       rlwinm  r0,r0,0,17,15
-       mtmsr   r0
-       blr
diff --git a/examples/timer.c b/examples/timer.c
deleted file mode 100644 (file)
index 6628b21..0000000
+++ /dev/null
@@ -1,349 +0,0 @@
-/*
- * (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 <commproc.h>
-#include <mpc8xx_irq.h>
-#include <exports.h>
-
-DECLARE_GLOBAL_DATA_PTR;
-
-#undef DEBUG
-
-#define        TIMER_PERIOD    1000000         /* 1 second clock */
-
-static void timer_handler (void *arg);
-
-
-/* Access functions for the Machine State Register */
-static __inline__ unsigned long get_msr(void)
-{
-    unsigned long msr;
-
-    asm volatile("mfmsr %0" : "=r" (msr) :);
-    return msr;
-}
-
-static __inline__ void set_msr(unsigned long msr)
-{
-    asm volatile("mtmsr %0" : : "r" (msr));
-}
-
-/*
- * Definitions to access the CPM Timer registers
- * See 8xx_immap.h for Internal Memory Map layout,
- * and commproc.h for CPM Interrupt vectors (aka "IRQ"s)
- */
-
-typedef struct tid_8xx_cpmtimer_s {
-  int           cpm_vec;       /* CPM Interrupt Vector for this timer  */
-  ushort       *tgcrp;         /* Pointer to Timer Global Config Reg.  */
-  ushort       *tmrp;          /* Pointer to Timer Mode Register       */
-  ushort       *trrp;          /* Pointer to Timer Reference Register  */
-  ushort       *tcrp;          /* Pointer to Timer Capture Register    */
-  ushort       *tcnp;          /* Pointer to Timer Counter Register    */
-  ushort       *terp;          /* Pointer to Timer Event Register      */
-} tid_8xx_cpmtimer_t;
-
-#ifndef CLOCKRATE
-#  define CLOCKRATE 64
-#endif
-
-#define        CPMT_CLOCK_DIV          16
-#define        CPMT_MAX_PRESCALER      256
-#define CPMT_MAX_REFERENCE     65535   /* max. unsigned short */
-
-#define        CPMT_MAX_TICKS          (CPMT_MAX_REFERENCE * CPMT_MAX_PRESCALER)
-#define        CPMT_MAX_TICKS_WITH_DIV (CPMT_MAX_REFERENCE * CPMT_MAX_PRESCALER * CPMT_CLOCK_DIV)
-#define        CPMT_MAX_INTERVAL       (CPMT_MAX_TICKS_WITH_DIV / CLOCKRATE)
-
-/* For now: always use max. prescaler value */
-#define        CPMT_PRESCALER          (CPMT_MAX_PRESCALER)
-
-/* CPM Timer Event Register Bits */
-#define        CPMT_EVENT_CAP          0x0001  /* Capture Event                */
-#define        CPMT_EVENT_REF          0x0002  /* Reference Counter Event      */
-
-/* CPM Timer Global Config Register */
-#define        CPMT_GCR_RST            0x0001  /* Reset  Timer                 */
-#define        CPMT_GCR_STP            0x0002  /* Stop   Timer                 */
-#define        CPMT_GCR_FRZ            0x0004  /* Freeze Timer                 */
-#define        CPMT_GCR_GM_CAS         0x0008  /* Gate Mode / Cascade Timers   */
-#define        CPMT_GCR_MASK           (CPMT_GCR_RST|CPMT_GCR_STP|CPMT_GCR_FRZ|CPMT_GCR_GM_CAS)
-
-/* CPM Timer Mode register */
-#define        CPMT_MR_GE              0x0001  /* Gate Enable                  */
-#define        CPMT_MR_ICLK_CASC       0x0000  /* Clock internally cascaded    */
-#define        CPMT_MR_ICLK_CLK        0x0002  /* Clock = system clock         */
-#define        CPMT_MR_ICLK_CLKDIV     0x0004  /* Clock = system clock / 16    */
-#define        CPMT_MR_ICLK_TIN        0x0006  /* Clock = TINx signal          */
-#define        CPMT_MR_FRR             0x0008  /* Free Run / Restart           */
-#define        CPMT_MR_ORI             0x0010  /* Out. Reference Interrupt En. */
-#define        CPMT_MR_OM              0x0020  /* Output Mode                  */
-#define        CPMT_MR_CE_DIS          0x0000  /* Capture/Interrupt disabled   */
-#define        CPMT_MR_CE_RISE         0x0040  /* Capt./Interr. on rising  TIN */
-#define CPMT_MR_CE_FALL                0x0080  /* Capt./Interr. on falling TIN */
-#define        CPMT_MR_CE_ANY          0x00C0  /* Capt./Interr. on any TIN edge*/
-
-
-/*
- * which CPM timer to use - index starts at 0 (= timer 1)
- */
-#define        TID_TIMER_ID    0       /* use CPM timer 1              */
-
-void setPeriod (tid_8xx_cpmtimer_t *hwp, ulong interval);
-
-static char *usage = "\n[q, b, e, ?] ";
-
-int timer (int argc, char *argv[])
-{
-       cpmtimer8xx_t *cpmtimerp;       /* Pointer to the CPM Timer structure   */
-       tid_8xx_cpmtimer_t hw;
-       tid_8xx_cpmtimer_t *hwp = &hw;
-       int c;
-       int running;
-
-       app_startup(argv);
-
-       /* Pointer to CPM Timer structure */
-       cpmtimerp = &((immap_t *) gd->bd->bi_immr_base)->im_cpmtimer;
-
-       printf ("TIMERS=0x%x\n", (unsigned) cpmtimerp);
-
-       /* Initialize pointers depending on which timer we use */
-       switch (TID_TIMER_ID) {
-       case 0:
-               hwp->tmrp = &(cpmtimerp->cpmt_tmr1);
-               hwp->trrp = &(cpmtimerp->cpmt_trr1);
-               hwp->tcrp = &(cpmtimerp->cpmt_tcr1);
-               hwp->tcnp = &(cpmtimerp->cpmt_tcn1);
-               hwp->terp = &(cpmtimerp->cpmt_ter1);
-               hwp->cpm_vec = CPMVEC_TIMER1;
-               break;
-       case 1:
-               hwp->tmrp = &(cpmtimerp->cpmt_tmr2);
-               hwp->trrp = &(cpmtimerp->cpmt_trr2);
-               hwp->tcrp = &(cpmtimerp->cpmt_tcr2);
-               hwp->tcnp = &(cpmtimerp->cpmt_tcn2);
-               hwp->terp = &(cpmtimerp->cpmt_ter2);
-               hwp->cpm_vec = CPMVEC_TIMER2;
-               break;
-       case 2:
-               hwp->tmrp = &(cpmtimerp->cpmt_tmr3);
-               hwp->trrp = &(cpmtimerp->cpmt_trr3);
-               hwp->tcrp = &(cpmtimerp->cpmt_tcr3);
-               hwp->tcnp = &(cpmtimerp->cpmt_tcn3);
-               hwp->terp = &(cpmtimerp->cpmt_ter3);
-               hwp->cpm_vec = CPMVEC_TIMER3;
-               break;
-       case 3:
-               hwp->tmrp = &(cpmtimerp->cpmt_tmr4);
-               hwp->trrp = &(cpmtimerp->cpmt_trr4);
-               hwp->tcrp = &(cpmtimerp->cpmt_tcr4);
-               hwp->tcnp = &(cpmtimerp->cpmt_tcn4);
-               hwp->terp = &(cpmtimerp->cpmt_ter4);
-               hwp->cpm_vec = CPMVEC_TIMER4;
-               break;
-       }
-
-       hwp->tgcrp = &cpmtimerp->cpmt_tgcr;
-
-       printf ("Using timer %d\n"
-                       "tgcr @ 0x%x, tmr @ 0x%x, trr @ 0x%x,"
-                       " tcr @ 0x%x, tcn @ 0x%x, ter @ 0x%x\n",
-                       TID_TIMER_ID + 1,
-                       (unsigned) hwp->tgcrp,
-                       (unsigned) hwp->tmrp,
-                       (unsigned) hwp->trrp,
-                       (unsigned) hwp->tcrp,
-                       (unsigned) hwp->tcnp,
-                       (unsigned) hwp->terp
-                       );
-
-       /* reset timer    */
-       *hwp->tgcrp &= ~(CPMT_GCR_MASK << TID_TIMER_ID);
-
-       /* clear all events */
-       *hwp->terp = (CPMT_EVENT_CAP | CPMT_EVENT_REF);
-
-       printf (usage);
-       running = 0;
-       while ((c = getc()) != 'q') {
-           if (c == 'b') {
-
-               setPeriod (hwp, TIMER_PERIOD);  /* Set period and start ticking */
-
-               /* Install interrupt handler (enable timer in CIMR) */
-               install_hdlr (hwp->cpm_vec, timer_handler, hwp);
-
-               printf ("Enabling timer\n");
-
-               /* enable timer */
-               *hwp->tgcrp |= (CPMT_GCR_RST << TID_TIMER_ID);
-               running = 1;
-
-#ifdef DEBUG
-               printf ("tgcr=0x%x, tmr=0x%x, trr=0x%x,"
-                       " tcr=0x%x, tcn=0x%x, ter=0x%x\n",
-                               *hwp->tgcrp, *hwp->tmrp, *hwp->trrp,
-                               *hwp->tcrp,  *hwp->tcnp, *hwp->terp
-                               );
-#endif
-           } else if (c == 'e') {
-
-               printf ("Stopping timer\n");
-
-               *hwp->tgcrp &= ~(CPMT_GCR_MASK << TID_TIMER_ID);
-               running = 0;
-
-#ifdef DEBUG
-               printf ("tgcr=0x%x, tmr=0x%x, trr=0x%x,"
-                       " tcr=0x%x, tcn=0x%x, ter=0x%x\n",
-                               *hwp->tgcrp, *hwp->tmrp, *hwp->trrp,
-                               *hwp->tcrp,  *hwp->tcnp, *hwp->terp
-                       );
-#endif
-               /* Uninstall interrupt handler */
-               free_hdlr (hwp->cpm_vec);
-
-           } else if (c == '?') {
-#ifdef DEBUG
-               cpic8xx_t *cpm_icp = &((immap_t *) gd->bd->bi_immr_base)->im_cpic;
-               sysconf8xx_t *siup = &((immap_t *) gd->bd->bi_immr_base)->im_siu_conf;
-#endif
-
-               printf ("\ntgcr=0x%x, tmr=0x%x, trr=0x%x,"
-                       " tcr=0x%x, tcn=0x%x, ter=0x%x\n",
-                               *hwp->tgcrp, *hwp->tmrp, *hwp->trrp,
-                               *hwp->tcrp,  *hwp->tcnp, *hwp->terp
-                       );
-#ifdef DEBUG
-               printf ("SIUMCR=0x%08lx, SYPCR=0x%08lx,"
-                       " SIMASK=0x%08lx, SIPEND=0x%08lx\n",
-                               siup->sc_siumcr,
-                               siup->sc_sypcr,
-                               siup->sc_simask,
-                               siup->sc_sipend
-                       );
-
-               printf ("CIMR=0x%08lx, CICR=0x%08lx, CIPR=0x%08lx\n",
-                       cpm_icp->cpic_cimr,
-                       cpm_icp->cpic_cicr,
-                       cpm_icp->cpic_cipr
-                       );
-#endif
-           } else {
-               printf ("\nEnter: q - quit, b - start timer, e - stop timer, ? - get status\n");
-           }
-           printf (usage);
-       }
-       if (running) {
-               printf ("Stopping timer\n");
-               *hwp->tgcrp &= ~(CPMT_GCR_MASK << TID_TIMER_ID);
-               free_hdlr (hwp->cpm_vec);
-       }
-
-       return (0);
-}
-
-
-/* Set period in microseconds and start.
- * Truncate to maximum period if more than this is requested - but warn about it.
- */
-
-void setPeriod (tid_8xx_cpmtimer_t *hwp, ulong interval)
-{
-       unsigned short prescaler;
-       unsigned long ticks;
-
-       printf ("Set interval %ld us\n", interval);
-
-       /* Warn if requesting longer period than possible */
-       if (interval > CPMT_MAX_INTERVAL) {
-               printf ("Truncate interval %ld to maximum (%d)\n",
-                               interval, CPMT_MAX_INTERVAL);
-               interval = CPMT_MAX_INTERVAL;
-       }
-       /*
-        * Check if we want to use clock divider:
-        * Since the reference counter can be incremented only in integer steps,
-        * we try to keep it as big as possible to allow the resulting period to be
-        * as precise as possible.
-        */
-       /* prescaler, enable interrupt, restart after ref count is reached */
-       prescaler = (ushort) ((CPMT_PRESCALER - 1) << 8) |
-                       CPMT_MR_ORI |
-                       CPMT_MR_FRR;
-
-       ticks = ((ulong) CLOCKRATE * interval);
-
-       if (ticks > CPMT_MAX_TICKS) {
-               ticks /= CPMT_CLOCK_DIV;
-               prescaler |= CPMT_MR_ICLK_CLKDIV;       /* use system clock divided by 16 */
-       } else {
-               prescaler |= CPMT_MR_ICLK_CLK;  /* use system clock without divider */
-       }
-
-#ifdef DEBUG
-       printf ("clock/%d, prescale factor %d, reference %ld, ticks %ld\n",
-                       (ticks > CPMT_MAX_TICKS) ? CPMT_CLOCK_DIV : 1,
-                       CPMT_PRESCALER,
-                       (ticks / CPMT_PRESCALER),
-                       ticks
-                       );
-#endif
-
-       /* set prescaler register */
-       *hwp->tmrp = prescaler;
-
-       /* clear timer counter */
-       *hwp->tcnp = 0;
-
-       /* set reference register */
-       *hwp->trrp = (unsigned short) (ticks / CPMT_PRESCALER);
-
-#ifdef DEBUG
-       printf ("tgcr=0x%x, tmr=0x%x, trr=0x%x,"
-               " tcr=0x%x, tcn=0x%x, ter=0x%x\n",
-                       *hwp->tgcrp, *hwp->tmrp, *hwp->trrp,
-                       *hwp->tcrp,  *hwp->tcnp, *hwp->terp
-               );
-#endif
-}
-
-/*
- * Handler for CPMVEC_TIMER1 interrupt
- */
-static
-void timer_handler (void *arg)
-{
-       tid_8xx_cpmtimer_t *hwp = (tid_8xx_cpmtimer_t *)arg;
-
-       /* printf ("** TER1=%04x ** ", *hwp->terp); */
-
-       /* just for demonstration */
-       printf (".");
-
-       /* clear all possible events: Ref. and Cap. */
-       *hwp->terp = (CPMT_EVENT_CAP | CPMT_EVENT_REF);
-}
diff --git a/examples/x86-testapp.c b/examples/x86-testapp.c
deleted file mode 100644 (file)
index e8603d9..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-#include <stddef.h>
-#include <stdio.h>
-#include <string.h>
-
-void *func[8], **pfunc;
-
-typedef struct xxx xxx_t;
-struct xxx {
-       int dummy;
-       void **pfunc;
-} q;
-
-#define XF_strcpy 3
-#define XF_printf 4
-
-#define LABEL(x)                                       \
-asm volatile (                                         \
-
-#if defined(__i386__)
-#define EXPORT_FUNC(x)                                 \
-asm volatile (                                         \
-"      .globl mon_" #x "\n"                            \
-"mon_" #x ":\n"                                                \
-"      movl    %0, %%eax\n"                            \
-"      movl    pfunc, %%ecx\n"                         \
-"      jmp     *(%%ecx,%%eax)\n"                       \
-       : : "i"(XF_ ## x * sizeof(void *)) : "eax", "ecx");
-#elif defined(__powerpc__)
-#define EXPORT_FUNC(x)                                 \
-asm volatile (                                         \
-"      .globl mon_" #x "\n"                            \
-"mon_" #x ":\n"                                                \
-"      lwz     %%r11, %0(%%r2)\n"                      \
-"      lwz     %%r11, %1(%%r11)\n"                     \
-"      mtctr   %%r11\n"                                \
-"      bctr\n"                                 \
-       : : "i"(offsetof(xxx_t, pfunc)), "i"(XF_ ## x * sizeof(void *)) : "r11", "r2");
-#elif defined(__arm__)
-#define EXPORT_FUNC(x)                                 \
-asm volatile (                                         \
-"      .globl mon_" #x "\n"                            \
-"mon_" #x ":\n"                                                \
-"      ldr     ip, [r8, %0]\n"                         \
-"      ldr     pc, [ip, %1]\n"                         \
-       : : "i"(offsetof(xxx_t, pfunc)), "i"(XF_ ## x * sizeof(void *)) : "ip");
-#elif defined(__mips__)
-#define EXPORT_FUNC(x)                                 \
-asm volatile (                                         \
-"      .globl mon_" #x "\n"                            \
-"mon_" #x ":\n"                                                \
-"      lw      $25, %0($26)\n"                         \
-"      lw      $25, %1($25)\n"                         \
-"      jr      $25\n"                                  \
-       : : "i"(offsetof(xxx_t, pfunc)), "i"(XF_ ## x * sizeof(void *)) : "t9");
-#else
-#error [No stub code for this arch]
-#endif
-
-void dummy(void)
-{
-EXPORT_FUNC(printf)
-EXPORT_FUNC(strcpy)
-}
-
-int main(void)
-{
-#if defined(__i386__)
-       xxx_t *pq;
-#elif defined(__powerpc__)
-       register volatile xxx_t *pq asm("r2");
-#elif defined(__arm__)
-       register volatile xxx_t *pq asm("r8");
-#elif defined(__mips__)
-       register volatile xxx_t *pq asm("k0");
-#endif
-       char buf[32];
-
-       func[XF_strcpy] = strcpy;
-       func[XF_printf] = printf;
-       pq = &q;
-       pq->pfunc = pfunc = func;
-
-       mon_strcpy(buf, "test");
-       mon_printf("hi %s %d z\n", buf, 444);
-
-       return 0;
-}
diff --git a/i386_config.mk b/i386_config.mk
deleted file mode 100644 (file)
index 5fe36d5..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# (C) Copyright 2000-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
-#
-
-CROSS_COMPILE ?= i386-linux-
-
-PLATFORM_CPPFLAGS += -DCONFIG_I386 -D__I386__
diff --git a/include/asm-arm/unaligned.h b/include/asm-arm/unaligned.h
new file mode 100644 (file)
index 0000000..d644df7
--- /dev/null
@@ -0,0 +1,18 @@
+#ifndef _ASM_ARM_UNALIGNED_H
+#define _ASM_ARM_UNALIGNED_H
+
+#include <linux/unaligned/access_ok.h>
+#include <linux/unaligned/generic.h>
+
+/*
+ * Select endianness
+ */
+#ifndef __ARMEB__
+#define get_unaligned  __get_unaligned_le
+#define put_unaligned  __put_unaligned_le
+#else
+#define get_unaligned  __get_unaligned_be
+#define put_unaligned  __put_unaligned_be
+#endif
+
+#endif /* _ASM_ARM_UNALIGNED_H */
index a6c7c07692bb57240ffc48d50cc57ccc91114450..6e689b23371274ad85fab59177b8c8c6bf2f2171 100644 (file)
@@ -697,6 +697,7 @@ void show_boot_progress(int val);
 
 #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
 
+#define ROUND(a,b)             (((a) + (b)) & ~((b) - 1))
 #define DIV_ROUND(n,d)         (((n) + ((d)/2)) / (d))
 #define DIV_ROUND_UP(n,d)      (((n) + (d) - 1) / (d))
 #define roundup(x, y)          ((((x) + ((y) - 1)) / (y)) * (y))
index 8a1c4f592e5d662129ffdd5428fb54d3eb4b34ab..74677d87545b733bc03489a7c43374eac8b57690 100644 (file)
 #define CONFIG_SYS_LONGHELP            1
 #define CONFIG_CMDLINE_EDITING 1
 
-#define ROUND(A, B)            (((A) + (B)) & ~((B) - 1))
 /*
  * Size of malloc() pool
  */
index df7366120b96a14c8b5cf65285dc459116d7c6a6..0ef3554216dba8cca9f2cfbb9c0c56787fe11ae1 100644 (file)
 #define CONFIG_SYS_LONGHELP            1
 #define CONFIG_CMDLINE_EDITING 1
 
-#define ROUND(A, B)            (((A) + (B)) & ~((B) - 1))
 /*
  * Size of malloc() pool
  */
index c898c730467d3c928065a5447d13a42ce813ef41..58ec94a848d2ed9043dd33c98d32e8b0890008ed 100644 (file)
@@ -311,7 +311,6 @@ struct bd_info_ext {
  */
 #define CONFIG_SYS_HZ_CLOCK (AT91C_MASTER_CLOCK / 2)
 
-#define ROUND(A, B)            (((A) + (B)) & ~((B) - 1))
 /*
  * Size of malloc() pool
  */
index 7eef9a38ef509066a4550085fce8000f836f7ae7..6cee59368ceb194c55a9ff0c56463c86f7f2037f 100644 (file)
 #define CONFIG_SYS_LONGHELP            1
 #define CONFIG_CMDLINE_EDITING 1
 
-#define ROUND(A, B)            (((A) + (B)) & ~((B) - 1))
 /*
  * Size of malloc() pool
  */
index 028a04f32361539636280aea7f7a863158403844..3d108ab6265b96384565f5e9a6013efbc96eb163 100644 (file)
 #define CONFIG_SYS_LONGHELP            1
 #define CONFIG_CMDLINE_EDITING 1
 
-#define ROUND(A, B)            (((A) + (B)) & ~((B) - 1))
 /*
  * Size of malloc() pool
  */
index 9539d18f6f44f1724910e7a03171112960341158..32f3f62c1dd9a4d9a65db73c68c1ad52e77318c8 100644 (file)
 #define CONFIG_SYS_HUSH_PARSER
 #define CONFIG_SYS_PROMPT_HUSH_PS2     "> "
 
-#define ROUND(A, B)            (((A) + (B)) & ~((B) - 1))
 /*
  * Size of malloc() pool
  */
index af97afe2b1c2ed0305275e3ffd425814ecd818f3..4b46c31dbd5c8639b55acc0ed6f977965f7d19ce 100644 (file)
 #define CONFIG_SYS_HUSH_PARSER
 #define CONFIG_SYS_PROMPT_HUSH_PS2     "> "
 
-#define ROUND(A, B)            (((A) + (B)) & ~((B) - 1))
 /*
  * Size of malloc() pool
  */
index bc2a32bed9c647339288c6463bae7028ad93c46a..916730454f1f2fb7656945952f5c8460514a24b3 100644 (file)
 #define CONFIG_SYS_LONGHELP            1
 #define CONFIG_CMDLINE_EDITING 1
 
-#define ROUND(A, B)            (((A) + (B)) & ~((B) - 1))
 /*
  * Size of malloc() pool
  */
index 0fcf692d18b3d9ff639ab60b2e2b0e002a8ea264..0cc1b3b59ce4992287081beb951fee4a45ed180c 100644 (file)
@@ -45,6 +45,7 @@
 #define CONFIG_CMD_I2C
 #define CONFIG_CMD_JFFS2
 #define CONFIG_JFFS2_CMDLINE
+#define CONFIG_CMD_MTDPARTS
 
 #undef CONFIG_WATCHDOG                 /* disable platform specific watchdog */
 
@@ -97,7 +98,7 @@
 #define CONFIG_SYS_SLOT_ID_MASK                (0x3f)  /* mask for slot ID bits */
 
 #define CONFIG_I2C_MULTI_BUS   1
-#define CONFIG_SYS_MAX_I2C_BUS         2
+#define CONFIG_SYS_MAX_I2C_BUS         1
 #define CONFIG_SYS_I2C_INIT_BOARD      1
 #define CONFIG_I2C_MUX         1
 
 #define CONFIG_BOOTP_GATEWAY
 #define CONFIG_BOOTP_HOSTNAME
 
+#define CONFIG_ENV_SIZE                0x04000 /* Size of Environment */
+
+#define CONFIG_SYS_MALLOC_LEN  (1024 * 1024)   /* Reserved for malloc */
+
+#define CONFIG_SYS_64BIT_VSPRINTF      /* needed for UBI/UBIFS */
+
+/* UBI Support for all Keymile boards */
+#define CONFIG_CMD_UBI
+#define CONFIG_RBTREE
+#define CONFIG_MTD_PARTITIONS
+#define CONFIG_FLASH_CFI_MTD
+#define CONFIG_MTD_DEVICE
+#define CONFIG_MTD_CONCAT
+
 /* define this to use the keymile's io muxing feature */
 /*#define CONFIG_IO_MUXING */
 
index c305b896908ce7742b1e7f5021b58d9461af6e37..b5552d217ce007a57f30b1871e7e584bdf5754ce 100644 (file)
 #define CONFIG_SYS_FLASH_BASE          0xf0000000
 #define CONFIG_SYS_MONITOR_LEN         (384 << 10) /* 384 kB for Monitor */
 #define CONFIG_SYS_MONITOR_BASE        CONFIG_SYS_FLASH_BASE
-#define CONFIG_SYS_MALLOC_LEN          (256 << 10) /* 256 kB for malloc() */
 
 /*
  * For booting Linux, the board info and command line data
 
 #define CONFIG_ENV_IS_IN_FLASH 1
 #define CONFIG_ENV_OFFSET      CONFIG_SYS_MONITOR_LEN
-#define CONFIG_ENV_SIZE                0x04000 /* Total Size of Environment Sector */
 #define CONFIG_ENV_SECT_SIZE   0x20000 /* Total Size of Environment Sector */
 
 /* Address and size of Redundant Environment Sector    */
index 41dbd0d241861731de6baf781d6120bda6263ca8..7e16c56f2bcb2edc6f8edfb5a169d834aa0a9dbe 100644 (file)
 #endif
 
 #define CONFIG_SYS_MONITOR_LEN         (384 * 1024) /* Reserve 384 kB for Mon */
-#define CONFIG_SYS_MALLOC_LEN          (128 * 1024) /* Reserved for malloc */
 
 /*
  * Initial RAM Base Address Setup
 #define CONFIG_ENV_IS_IN_FLASH 1
 #define CONFIG_ENV_ADDR                (CONFIG_SYS_MONITOR_BASE + CONFIG_SYS_MONITOR_LEN)
 #define CONFIG_ENV_SECT_SIZE   0x20000 /* 128K(one sector) for env */
-#define CONFIG_ENV_SIZE                0x20000
 #define CONFIG_ENV_OFFSET      (CONFIG_SYS_MONITOR_LEN)
 
 /* Address and size of Redundant Environment Sector    */
 #define CONFIG_SYS_I2C_SLAVE   0x7F
 #define CONFIG_SYS_I2C_OFFSET  0x3000
 #define CONFIG_I2C_MULTI_BUS   1
-#define CONFIG_SYS_MAX_I2C_BUS         2
 #define CONFIG_I2C_MUX         1
 
 /* EEprom support */
 #define CONFIG_SYS_DTT_MAX_TEMP        70
 #define CONFIG_SYS_DTT_LOW_TEMP        -30
 #define CONFIG_SYS_DTT_HYSTERESIS      3
-#define CONFIG_SYS_DTT_BUS_NUM         (2)
+#define CONFIG_SYS_DTT_BUS_NUM         (CONFIG_SYS_MAX_I2C_BUS)
 
 #if defined(CONFIG_PCI)
 #define CONFIG_CMD_PCI
 
 #define CONFIG_PRAM    512     /* protected RAM [KBytes] */
 
-#define MTDIDS_DEFAULT         "nor0=app"
+#define MTDIDS_DEFAULT         "nor2=app"
 #define MTDPARTS_DEFAULT \
        "mtdparts=app:256k(u-boot),128k(env),128k(envred),"     \
        "1536k(esw0),8704k(rootfs0),1536k(esw1),2432k(rootfs1),640k(var),768k(cfg)"
index cc42101853568d0eefce51987cea77847150cfad..ea14948c4651c45b93b05de5484ea5bb27777f9c 100644 (file)
        "addcon=setenv bootargs ${bootargs} "                           \
                "console=ttyCPM0,${baudrate}\0"                         \
        "mtdids=nor0=boot,nor1=app \0"                                  \
-       "mtdparts=mtdparts=boot:384k(u-boot),128k(env),128k(envred),"   \
-               "3456k(free);app:3m(esw0),10m(rootfs0),3m(esw1),"       \
-               "10m(rootfs1),1m(var),5m(cfg) \0"                       \
        "partition=nor1,5 \0"                                           \
        "new_env=prot off FE060000 FE09FFFF; era FE060000 FE09FFFF \0"  \
        "EEprom_ivm=pca9544a:70:4 \0"                                   \
-       "mtdparts=" MK_STR(MTDPARTS_DEFAULT) "\0"                               \
+       "mtdparts=" MK_STR(MTDPARTS_DEFAULT) "\0"                       \
+       "unlock=yes\0"                                                  \
        ""
 
 #define CONFIG_SYS_SDRAM_BASE          0x00000000
 #define CONFIG_SYS_FLASH_SIZE          32
 #define CONFIG_SYS_FLASH_CFI
 #define CONFIG_FLASH_CFI_DRIVER
-#define CONFIG_SYS_MAX_FLASH_BANKS     2       /* max num of flash banks       */
+#define CONFIG_SYS_MAX_FLASH_BANKS     3       /* max num of flash banks       */
 #define CONFIG_SYS_MAX_FLASH_SECT      512     /* max num of sects on one chip */
 
 #define CONFIG_SYS_FLASH_BASE_1        0x50000000
-#define CONFIG_SYS_FLASH_SIZE_1        64
+#define CONFIG_SYS_FLASH_SIZE_1        32
+#define CONFIG_SYS_FLASH_BASE_2        0x52000000
+#define CONFIG_SYS_FLASH_SIZE_2        32
 
-#define CONFIG_SYS_FLASH_BANKS_LIST { CONFIG_SYS_FLASH_BASE, CONFIG_SYS_FLASH_BASE_1 }
+#define CONFIG_SYS_FLASH_BANKS_LIST { CONFIG_SYS_FLASH_BASE, \
+                                       CONFIG_SYS_FLASH_BASE_1, \
+                                       CONFIG_SYS_FLASH_BASE_2 }
 
 #define CONFIG_SYS_MONITOR_BASE        TEXT_BASE
 #if (CONFIG_SYS_MONITOR_BASE < CONFIG_SYS_FLASH_BASE)
 #define BOOTFLAG_COLD          0x01    /* Normal Power-On: Boot from FLASH */
 #define BOOTFLAG_WARM          0x02    /* Software reboot                  */
 
-#define CONFIG_SYS_MALLOC_LEN          (4096 << 10)    /* Reserve 4 MB for malloc()    */
 #define CONFIG_SYS_BOOTMAPSZ           (8 << 20)       /* Initial Memory map for Linux */
 
 #define CONFIG_SYS_CACHELINE_SIZE      32      /* For MPC8260 CPUs */
 #define CONFIG_SYS_BR5_PRELIM  ((CONFIG_SYS_FLASH_BASE_1 & BRx_BA_MSK) |\
                         BRx_PS_16 | BRx_MS_GPCM_P | BRx_V)
 
-#define CONFIG_SYS_OR5_PRELIM  (MEG_TO_AM(CONFIG_SYS_FLASH_SIZE_1) |\
-                        ORxG_CSNT | ORxG_ACS_DIV2 |\
-                        ORxG_SCY_5_CLK | ORxG_TRLX )
+#define CONFIG_SYS_OR5_PRELIM  (MEG_TO_AM(CONFIG_SYS_FLASH_SIZE_1 + \
+                                CONFIG_SYS_FLASH_SIZE_2) |\
+                                ORxG_CSNT | ORxG_ACS_DIV2 |\
+                                ORxG_SCY_5_CLK | ORxG_TRLX )
 
 #define        CONFIG_SYS_RESET_ADDRESS 0xFDFFFFFC     /* "bad" address                */
 
index 315d7f8779181b2a396adbe112eaf9e8cc0ed0f0..203a14c8d06187c7a9e9ed6c0c5640b14617bf0b 100644 (file)
 #define CONFIG_SYS_LONGHELP            1
 #define CONFIG_CMDLINE_EDITING 1
 
-#define ROUND(A, B)            (((A) + (B)) & ~((B) - 1))
 /*
  * Size of malloc() pool
  */
index f8197b1f84b3cef47dbf7132575a52fedad3a6d6..a6ff28c39670de78eaca37d9a2ab90e6aa5317b1 100644 (file)
 #define CONFIG_SYS_LONGHELP            1
 #define CONFIG_CMDLINE_EDITING         1
 
-#define ROUND(A, B)                    (((A) + (B)) & ~((B) - 1))
 /*
  * Size of malloc() pool
  */
index 844446205b9b550de989eacd15514e1bd8bcc183..cbacdf98cb9dc1a1cbb4f06ffd2258f9c64ed280 100644 (file)
 
 #undef CONFIG_MEMSIZE_IN_BYTES
 
+#define CONFIG_LZMA
+
 /*-----------------------------------------------------------------------
  * Cache Configuration
  */
index 668e754e2a804d325c0dc915237ff6a222af0787..b75476980bf2292cdc01658f4821f18c5687084e 100644 (file)
@@ -47,7 +47,9 @@
 #define I2C_RXTX_LEN   128     /* maximum tx/rx buffer length */
 
 #if defined(CONFIG_I2C_MULTI_BUS)
+#if !defined(CONFIG_SYS_MAX_I2C_BUS)
 #define CONFIG_SYS_MAX_I2C_BUS         2
+#endif
 #define I2C_GET_BUS()          i2c_get_bus_num()
 #define I2C_SET_BUS(a)         i2c_set_bus_num(a)
 #else
diff --git a/include/lzma/LzmaDec.h b/include/lzma/LzmaDec.h
new file mode 100644 (file)
index 0000000..967cdd1
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Fake include for LzmaDec.h
+ *
+ * Copyright (C) 2007-2009 Industrie Dial Face S.p.A.
+ * Luigi 'Comio' Mantellini (luigi.mantellini@idf-hit.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
+ */
+
+#ifndef __LZMADEC_H__FAKE__
+#define __LZMADEC_H__FAKE__
+
+#include "../../lib_generic/lzma/LzmaDec.h"
+
+#endif
diff --git a/include/lzma/LzmaDecode.h b/include/lzma/LzmaDecode.h
deleted file mode 100644 (file)
index 8fdb2c0..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Fake include for LzmaDecode.h
- *
- * Copyright (C) 2007-2008 Industrie Dial Face S.p.A.
- * Luigi 'Comio' Mantellini (luigi.mantellini@idf-hit.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
- */
-
-#ifndef __LZMADECODE_H__FAKE__
-#define __LZMADECODE_H__FAKE__
-
-#include "../../lib_generic/lzma/LzmaDecode.h"
-
-#endif
index 7c5eea113c1c93dcebbd36599287fcec0f78584a..87943c0332fdade973e4702217540be491484ca4 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Fake include for LzmaTools.h
  *
- * Copyright (C) 2007-2008 Industrie Dial Face S.p.A.
+ * Copyright (C) 2007-2009 Industrie Dial Face S.p.A.
  * Luigi 'Comio' Mantellini (luigi.mantellini@idf-hit.com)
  *
  * See file CREDITS for list of people who contributed to this
index 02daa59174d09df8cef52717c2f836c6e5b91f32..86160a42b2579964b79ccaad0cc8efc6e3f6abed 100644 (file)
@@ -1,7 +1,7 @@
 /*
- * Fake include for LzmaTypes.h
+ * Fake include for Types.h
  *
- * Copyright (C) 2007-2008 Industrie Dial Face S.p.A.
+ * Copyright (C) 2007-2009 Industrie Dial Face S.p.A.
  * Luigi 'Comio' Mantellini (luigi.mantellini@idf-hit.com)
  *
  * See file CREDITS for list of people who contributed to this
  * MA 02111-1307 USA
  */
 
-#ifndef __LZMATYPES_H__FAKE__
-#define __LZMATYPES_H__FAKE__
+#ifndef __TYPES_H__FAKE__
+#define __TYPES_H__FAKE__
 
-#include "../../lib_generic/lzma/LzmaTypes.h"
+/*
+ *This avoids the collition with zlib.h Byte definition
+ */
+#define Byte LZByte
+
+#include "../../lib_generic/lzma/Types.h"
 
 #endif
diff --git a/lib_arm/config.mk b/lib_arm/config.mk
new file mode 100644 (file)
index 0000000..a13603e
--- /dev/null
@@ -0,0 +1,28 @@
+#
+# (C) Copyright 2000-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
+#
+
+CROSS_COMPILE ?= arm-linux-
+
+PLATFORM_CPPFLAGS += -DCONFIG_ARM -D__ARM__
+
+LDSCRIPT := $(SRCTREE)/cpu/$(CPU)/u-boot.lds
diff --git a/lib_avr32/config.mk b/lib_avr32/config.mk
new file mode 100644 (file)
index 0000000..c258b4b
--- /dev/null
@@ -0,0 +1,27 @@
+#
+# (C) Copyright 2000-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
+#
+
+CROSS_COMPILE ?= avr32-linux-
+
+PLATFORM_RELFLAGS      += -ffixed-r5 -fPIC -mno-init-got -mrelax
+PLATFORM_LDFLAGS       += --relax
diff --git a/lib_blackfin/config.mk b/lib_blackfin/config.mk
new file mode 100644 (file)
index 0000000..0dd2ac6
--- /dev/null
@@ -0,0 +1,66 @@
+#
+# (C) Copyright 2000-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
+#
+
+CROSS_COMPILE ?= bfin-uclinux-
+
+CONFIG_BFIN_CPU := $(strip $(subst ",,$(CONFIG_BFIN_CPU)))
+CONFIG_BFIN_BOOT_MODE := $(strip $(subst ",,$(CONFIG_BFIN_BOOT_MODE)))
+CONFIG_ENV_OFFSET := $(strip $(subst ",,$(CONFIG_ENV_OFFSET)))
+CONFIG_ENV_SIZE := $(strip $(subst ",,$(CONFIG_ENV_SIZE)))
+
+PLATFORM_RELFLAGS += -ffixed-P5 -fomit-frame-pointer -mno-fdpic
+PLATFORM_CPPFLAGS += -DCONFIG_BLACKFIN
+
+LDFLAGS += --gc-sections
+PLATFORM_RELFLAGS += -ffunction-sections -fdata-sections
+
+ifneq (,$(CONFIG_BFIN_CPU))
+PLATFORM_RELFLAGS += -mcpu=$(CONFIG_BFIN_CPU)
+endif
+
+ifneq ($(CONFIG_BFIN_BOOT_MODE),BFIN_BOOT_BYPASS)
+ALL += $(obj)u-boot.ldr
+endif
+
+SYM_PREFIX = _
+
+LDR_FLAGS-y :=
+LDR_FLAGS-$(CONFIG_BFIN_BOOTROM_USES_EVT1) += -J
+
+LDR_FLAGS += --bmode $(subst BFIN_BOOT_,,$(CONFIG_BFIN_BOOT_MODE))
+LDR_FLAGS += --use-vmas
+LDR_FLAGS += --initcode $(obj)cpu/$(CPU)/initcode.o
+ifneq ($(CONFIG_BFIN_BOOT_MODE),BFIN_BOOT_UART)
+ifneq ($(ENV_IS_EMBEDDED_CUSTOM),ENV_IS_EMBEDDED_CUSTOM)
+LDR_FLAGS += --punchit $$(($(CONFIG_ENV_OFFSET))):$$(($(CONFIG_ENV_SIZE))):$(obj)env-ldr.o
+endif
+endif
+ifneq (,$(findstring s,$(MAKEFLAGS)))
+LDR_FLAGS += --quiet
+endif
+
+LDR_FLAGS += $(LDR_FLAGS-y)
+
+ifeq ($(wildcard $(TOPDIR)/board/$(BOARD)/u-boot.lds*),)
+LDSCRIPT = $(obj)lib_$(ARCH)/u-boot.lds
+endif
diff --git a/lib_generic/lzma/LGPL.txt b/lib_generic/lzma/LGPL.txt
deleted file mode 100644 (file)
index 9e76f5b..0000000
+++ /dev/null
@@ -1,502 +0,0 @@
-      GNU LESSER GENERAL PUBLIC LICENSE
-          Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
-     59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
-         Preamble
-
-  The licenses for most software are designed to take away your
-freedom to share and change it.  By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
-  This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it.  You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
-  When we speak of free software, we are referring to freedom of use,
-not price.  Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
-  To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights.  These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
-  For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you.  You must make sure that they, too, receive or can get the source
-code.  If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it.  And you must show them these terms so they know their rights.
-
-  We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
-  To protect each distributor, we want to make it very clear that
-there is no warranty for the free library.  Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-\f
-  Finally, software patents pose a constant threat to the existence of
-any free program.  We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder.  Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
-  Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License.  This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License.  We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
-  When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library.  The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom.  The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
-  We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License.  It also provides other free software developers Less
-of an advantage over competing non-free programs.  These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries.  However, the Lesser license provides advantages in certain
-special circumstances.
-
-  For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard.  To achieve this, non-free programs must be
-allowed to use the library.  A more frequent case is that a free
-library does the same job as widely used non-free libraries.  In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
-  In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
-  Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
-  The precise terms and conditions for copying, distribution and
-modification follow.  Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library".  The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-\f
-      GNU LESSER GENERAL PUBLIC LICENSE
-   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-  0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
-  A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
-  The "Library", below, refers to any such software library or work
-which has been distributed under these terms.  A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language.  (Hereinafter, translation is
-included without limitation in the term "modification".)
-
-  "Source code" for a work means the preferred form of the work for
-making modifications to it.  For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
-  Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope.  The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it).  Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
-  1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
-  You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-\f
-  2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
-    a) The modified work must itself be a software library.
-
-    b) You must cause the files modified to carry prominent notices
-    stating that you changed the files and the date of any change.
-
-    c) You must cause the whole of the work to be licensed at no
-    charge to all third parties under the terms of this License.
-
-    d) If a facility in the modified Library refers to a function or a
-    table of data to be supplied by an application program that uses
-    the facility, other than as an argument passed when the facility
-    is invoked, then you must make a good faith effort to ensure that,
-    in the event an application does not supply such function or
-    table, the facility still operates, and performs whatever part of
-    its purpose remains meaningful.
-
-    (For example, a function in a library to compute square roots has
-    a purpose that is entirely well-defined independent of the
-    application.  Therefore, Subsection 2d requires that any
-    application-supplied function or table used by this function must
-    be optional: if the application does not supply it, the square
-    root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole.  If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works.  But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
-  3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library.  To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License.  (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.)  Do not make any other change in
-these notices.
-\f
-  Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
-  This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
-  4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
-  If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
-  5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library".  Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
-  However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library".  The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
-  When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library.  The
-threshold for this to be true is not precisely defined by law.
-
-  If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work.  (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
-  Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-\f
-  6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
-  You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License.  You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License.  Also, you must do one
-of these things:
-
-    a) Accompany the work with the complete corresponding
-    machine-readable source code for the Library including whatever
-    changes were used in the work (which must be distributed under
-    Sections 1 and 2 above); and, if the work is an executable linked
-    with the Library, with the complete machine-readable "work that
-    uses the Library", as object code and/or source code, so that the
-    user can modify the Library and then relink to produce a modified
-    executable containing the modified Library.  (It is understood
-    that the user who changes the contents of definitions files in the
-    Library will not necessarily be able to recompile the application
-    to use the modified definitions.)
-
-    b) Use a suitable shared library mechanism for linking with the
-    Library.  A suitable mechanism is one that (1) uses at run time a
-    copy of the library already present on the user's computer system,
-    rather than copying library functions into the executable, and (2)
-    will operate properly with a modified version of the library, if
-    the user installs one, as long as the modified version is
-    interface-compatible with the version that the work was made with.
-
-    c) Accompany the work with a written offer, valid for at
-    least three years, to give the same user the materials
-    specified in Subsection 6a, above, for a charge no more
-    than the cost of performing this distribution.
-
-    d) If distribution of the work is made by offering access to copy
-    from a designated place, offer equivalent access to copy the above
-    specified materials from the same place.
-
-    e) Verify that the user has already received a copy of these
-    materials or that you have already sent this user a copy.
-
-  For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it.  However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
-  It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system.  Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-\f
-  7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
-    a) Accompany the combined library with a copy of the same work
-    based on the Library, uncombined with any other library
-    facilities.  This must be distributed under the terms of the
-    Sections above.
-
-    b) Give prominent notice with the combined library of the fact
-    that part of it is a work based on the Library, and explaining
-    where to find the accompanying uncombined form of the same work.
-
-  8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License.  Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License.  However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
-  9. You are not required to accept this License, since you have not
-signed it.  However, nothing else grants you permission to modify or
-distribute the Library or its derivative works.  These actions are
-prohibited by law if you do not accept this License.  Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
-  10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-\f
-  11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License.  If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices.  Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
-  12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded.  In such case, this License incorporates the limitation as if
-written in the body of this License.
-
-  13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation.  If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-\f
-  14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission.  For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this.  Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
-         NO WARRANTY
-
-  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
-        END OF TERMS AND CONDITIONS
-\f
-          How to Apply These Terms to Your New Libraries
-
-  If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change.  You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
-  To apply these terms, attach the following notices to the library.  It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
-    <one line to give the library's name and a brief idea of what it does.>
-    Copyright (C) <year>  <name of author>
-
-    This library is free software; you can redistribute it and/or
-    modify it under the terms of the GNU Lesser General Public
-    License as published by the Free Software Foundation; either
-    version 2.1 of the License, or (at your option) any later version.
-
-    This library 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
-    Lesser General Public License for more details.
-
-    You should have received a copy of the GNU Lesser General Public
-    License along with this library; if not, write to the Free Software
-    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary.  Here is a sample; alter the names:
-
-  Yoyodyne, Inc., hereby disclaims all copyright interest in the
-  library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
-  <signature of Ty Coon>, 1 April 1990
-  Ty Coon, President of Vice
-
-That's all there is to it!
diff --git a/lib_generic/lzma/LzmaDec.c b/lib_generic/lzma/LzmaDec.c
new file mode 100644 (file)
index 0000000..89d934a
--- /dev/null
@@ -0,0 +1,1007 @@
+/* LzmaDec.c -- LZMA Decoder
+2008-11-06 : Igor Pavlov : Public domain */
+
+#include "LzmaDec.h"
+
+#include <string.h>
+
+#define kNumTopBits 24
+#define kTopValue ((UInt32)1 << kNumTopBits)
+
+#define kNumBitModelTotalBits 11
+#define kBitModelTotal (1 << kNumBitModelTotalBits)
+#define kNumMoveBits 5
+
+#define RC_INIT_SIZE 5
+
+#define NORMALIZE if (range < kTopValue) { range <<= 8; code = (code << 8) | (*buf++); }
+
+#define IF_BIT_0(p) ttt = *(p); NORMALIZE; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound)
+#define UPDATE_0(p) range = bound; *(p) = (CLzmaProb)(ttt + ((kBitModelTotal - ttt) >> kNumMoveBits));
+#define UPDATE_1(p) range -= bound; code -= bound; *(p) = (CLzmaProb)(ttt - (ttt >> kNumMoveBits));
+#define GET_BIT2(p, i, A0, A1) IF_BIT_0(p) \
+  { UPDATE_0(p); i = (i + i); A0; } else \
+  { UPDATE_1(p); i = (i + i) + 1; A1; }
+#define GET_BIT(p, i) GET_BIT2(p, i, ; , ;)
+
+#define TREE_GET_BIT(probs, i) { GET_BIT((probs + i), i); }
+#define TREE_DECODE(probs, limit, i) \
+  { i = 1; do { TREE_GET_BIT(probs, i); } while (i < limit); i -= limit; }
+
+/* #define _LZMA_SIZE_OPT */
+
+#ifdef _LZMA_SIZE_OPT
+#define TREE_6_DECODE(probs, i) TREE_DECODE(probs, (1 << 6), i)
+#else
+#define TREE_6_DECODE(probs, i) \
+  { i = 1; \
+  TREE_GET_BIT(probs, i); \
+  TREE_GET_BIT(probs, i); \
+  TREE_GET_BIT(probs, i); \
+  TREE_GET_BIT(probs, i); \
+  TREE_GET_BIT(probs, i); \
+  TREE_GET_BIT(probs, i); \
+  i -= 0x40; }
+#endif
+
+#define NORMALIZE_CHECK if (range < kTopValue) { if (buf >= bufLimit) return DUMMY_ERROR; range <<= 8; code = (code << 8) | (*buf++); }
+
+#define IF_BIT_0_CHECK(p) ttt = *(p); NORMALIZE_CHECK; bound = (range >> kNumBitModelTotalBits) * ttt; if (code < bound)
+#define UPDATE_0_CHECK range = bound;
+#define UPDATE_1_CHECK range -= bound; code -= bound;
+#define GET_BIT2_CHECK(p, i, A0, A1) IF_BIT_0_CHECK(p) \
+  { UPDATE_0_CHECK; i = (i + i); A0; } else \
+  { UPDATE_1_CHECK; i = (i + i) + 1; A1; }
+#define GET_BIT_CHECK(p, i) GET_BIT2_CHECK(p, i, ; , ;)
+#define TREE_DECODE_CHECK(probs, limit, i) \
+  { i = 1; do { GET_BIT_CHECK(probs + i, i) } while (i < limit); i -= limit; }
+
+
+#define kNumPosBitsMax 4
+#define kNumPosStatesMax (1 << kNumPosBitsMax)
+
+#define kLenNumLowBits 3
+#define kLenNumLowSymbols (1 << kLenNumLowBits)
+#define kLenNumMidBits 3
+#define kLenNumMidSymbols (1 << kLenNumMidBits)
+#define kLenNumHighBits 8
+#define kLenNumHighSymbols (1 << kLenNumHighBits)
+
+#define LenChoice 0
+#define LenChoice2 (LenChoice + 1)
+#define LenLow (LenChoice2 + 1)
+#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits))
+#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits))
+#define kNumLenProbs (LenHigh + kLenNumHighSymbols)
+
+
+#define kNumStates 12
+#define kNumLitStates 7
+
+#define kStartPosModelIndex 4
+#define kEndPosModelIndex 14
+#define kNumFullDistances (1 << (kEndPosModelIndex >> 1))
+
+#define kNumPosSlotBits 6
+#define kNumLenToPosStates 4
+
+#define kNumAlignBits 4
+#define kAlignTableSize (1 << kNumAlignBits)
+
+#define kMatchMinLen 2
+#define kMatchSpecLenStart (kMatchMinLen + kLenNumLowSymbols + kLenNumMidSymbols + kLenNumHighSymbols)
+
+#define IsMatch 0
+#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax))
+#define IsRepG0 (IsRep + kNumStates)
+#define IsRepG1 (IsRepG0 + kNumStates)
+#define IsRepG2 (IsRepG1 + kNumStates)
+#define IsRep0Long (IsRepG2 + kNumStates)
+#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax))
+#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits))
+#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex)
+#define LenCoder (Align + kAlignTableSize)
+#define RepLenCoder (LenCoder + kNumLenProbs)
+#define Literal (RepLenCoder + kNumLenProbs)
+
+#define LZMA_BASE_SIZE 1846
+#define LZMA_LIT_SIZE 768
+
+#define LzmaProps_GetNumProbs(p) ((UInt32)LZMA_BASE_SIZE + (LZMA_LIT_SIZE << ((p)->lc + (p)->lp)))
+
+#if Literal != LZMA_BASE_SIZE
+StopCompilingDueBUG
+#endif
+
+static const Byte kLiteralNextStates[kNumStates * 2] =
+{
+  0, 0, 0, 0, 1, 2, 3,  4,  5,  6,  4,  5,
+  7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10
+};
+
+#define LZMA_DIC_MIN (1 << 12)
+
+/* First LZMA-symbol is always decoded.
+And it decodes new LZMA-symbols while (buf < bufLimit), but "buf" is without last normalization
+Out:
+  Result:
+    SZ_OK - OK
+    SZ_ERROR_DATA - Error
+  p->remainLen:
+    < kMatchSpecLenStart : normal remain
+    = kMatchSpecLenStart : finished
+    = kMatchSpecLenStart + 1 : Flush marker
+    = kMatchSpecLenStart + 2 : State Init Marker
+*/
+
+static int MY_FAST_CALL LzmaDec_DecodeReal(CLzmaDec *p, SizeT limit, const Byte *bufLimit)
+{
+  CLzmaProb *probs = p->probs;
+
+  unsigned state = p->state;
+  UInt32 rep0 = p->reps[0], rep1 = p->reps[1], rep2 = p->reps[2], rep3 = p->reps[3];
+  unsigned pbMask = ((unsigned)1 << (p->prop.pb)) - 1;
+  unsigned lpMask = ((unsigned)1 << (p->prop.lp)) - 1;
+  unsigned lc = p->prop.lc;
+
+  Byte *dic = p->dic;
+  SizeT dicBufSize = p->dicBufSize;
+  SizeT dicPos = p->dicPos;
+
+  UInt32 processedPos = p->processedPos;
+  UInt32 checkDicSize = p->checkDicSize;
+  unsigned len = 0;
+
+  const Byte *buf = p->buf;
+  UInt32 range = p->range;
+  UInt32 code = p->code;
+
+  do
+  {
+    CLzmaProb *prob;
+    UInt32 bound;
+    unsigned ttt;
+    unsigned posState = processedPos & pbMask;
+
+    prob = probs + IsMatch + (state << kNumPosBitsMax) + posState;
+    IF_BIT_0(prob)
+    {
+      unsigned symbol;
+      UPDATE_0(prob);
+      prob = probs + Literal;
+      if (checkDicSize != 0 || processedPos != 0)
+        prob += (LZMA_LIT_SIZE * (((processedPos & lpMask) << lc) +
+        (dic[(dicPos == 0 ? dicBufSize : dicPos) - 1] >> (8 - lc))));
+
+      if (state < kNumLitStates)
+      {
+        symbol = 1;
+        do { GET_BIT(prob + symbol, symbol) } while (symbol < 0x100);
+      }
+      else
+      {
+        unsigned matchByte = p->dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];
+        unsigned offs = 0x100;
+        symbol = 1;
+        do
+        {
+          unsigned bit;
+          CLzmaProb *probLit;
+          matchByte <<= 1;
+          bit = (matchByte & offs);
+          probLit = prob + offs + bit + symbol;
+          GET_BIT2(probLit, symbol, offs &= ~bit, offs &= bit)
+        }
+        while (symbol < 0x100);
+      }
+      dic[dicPos++] = (Byte)symbol;
+      processedPos++;
+
+      state = kLiteralNextStates[state];
+      /* if (state < 4) state = 0; else if (state < 10) state -= 3; else state -= 6; */
+      continue;
+    }
+    else
+    {
+      UPDATE_1(prob);
+      prob = probs + IsRep + state;
+      IF_BIT_0(prob)
+      {
+        UPDATE_0(prob);
+        state += kNumStates;
+        prob = probs + LenCoder;
+      }
+      else
+      {
+        UPDATE_1(prob);
+        if (checkDicSize == 0 && processedPos == 0)
+          return SZ_ERROR_DATA;
+        prob = probs + IsRepG0 + state;
+        IF_BIT_0(prob)
+        {
+          UPDATE_0(prob);
+          prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState;
+          IF_BIT_0(prob)
+          {
+            UPDATE_0(prob);
+            dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];
+            dicPos++;
+            processedPos++;
+            state = state < kNumLitStates ? 9 : 11;
+            continue;
+          }
+          UPDATE_1(prob);
+        }
+        else
+        {
+          UInt32 distance;
+          UPDATE_1(prob);
+          prob = probs + IsRepG1 + state;
+          IF_BIT_0(prob)
+          {
+            UPDATE_0(prob);
+            distance = rep1;
+          }
+          else
+          {
+            UPDATE_1(prob);
+            prob = probs + IsRepG2 + state;
+            IF_BIT_0(prob)
+            {
+              UPDATE_0(prob);
+              distance = rep2;
+            }
+            else
+            {
+              UPDATE_1(prob);
+              distance = rep3;
+              rep3 = rep2;
+            }
+            rep2 = rep1;
+          }
+          rep1 = rep0;
+          rep0 = distance;
+        }
+        state = state < kNumLitStates ? 8 : 11;
+        prob = probs + RepLenCoder;
+      }
+      {
+        unsigned limit, offset;
+        CLzmaProb *probLen = prob + LenChoice;
+        IF_BIT_0(probLen)
+        {
+          UPDATE_0(probLen);
+          probLen = prob + LenLow + (posState << kLenNumLowBits);
+          offset = 0;
+          limit = (1 << kLenNumLowBits);
+        }
+        else
+        {
+          UPDATE_1(probLen);
+          probLen = prob + LenChoice2;
+          IF_BIT_0(probLen)
+          {
+            UPDATE_0(probLen);
+            probLen = prob + LenMid + (posState << kLenNumMidBits);
+            offset = kLenNumLowSymbols;
+            limit = (1 << kLenNumMidBits);
+          }
+          else
+          {
+            UPDATE_1(probLen);
+            probLen = prob + LenHigh;
+            offset = kLenNumLowSymbols + kLenNumMidSymbols;
+            limit = (1 << kLenNumHighBits);
+          }
+        }
+        TREE_DECODE(probLen, limit, len);
+        len += offset;
+      }
+
+      if (state >= kNumStates)
+      {
+        UInt32 distance;
+        prob = probs + PosSlot +
+            ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) << kNumPosSlotBits);
+        TREE_6_DECODE(prob, distance);
+        if (distance >= kStartPosModelIndex)
+        {
+          unsigned posSlot = (unsigned)distance;
+          int numDirectBits = (int)(((distance >> 1) - 1));
+          distance = (2 | (distance & 1));
+          if (posSlot < kEndPosModelIndex)
+          {
+            distance <<= numDirectBits;
+            prob = probs + SpecPos + distance - posSlot - 1;
+            {
+              UInt32 mask = 1;
+              unsigned i = 1;
+              do
+              {
+                GET_BIT2(prob + i, i, ; , distance |= mask);
+                mask <<= 1;
+              }
+              while (--numDirectBits != 0);
+            }
+          }
+          else
+          {
+            numDirectBits -= kNumAlignBits;
+            do
+            {
+              NORMALIZE
+              range >>= 1;
+
+              {
+                UInt32 t;
+                code -= range;
+                t = (0 - ((UInt32)code >> 31)); /* (UInt32)((Int32)code >> 31) */
+                distance = (distance << 1) + (t + 1);
+                code += range & t;
+              }
+              /*
+              distance <<= 1;
+              if (code >= range)
+              {
+                code -= range;
+                distance |= 1;
+              }
+              */
+            }
+            while (--numDirectBits != 0);
+            prob = probs + Align;
+            distance <<= kNumAlignBits;
+            {
+              unsigned i = 1;
+              GET_BIT2(prob + i, i, ; , distance |= 1);
+              GET_BIT2(prob + i, i, ; , distance |= 2);
+              GET_BIT2(prob + i, i, ; , distance |= 4);
+              GET_BIT2(prob + i, i, ; , distance |= 8);
+            }
+            if (distance == (UInt32)0xFFFFFFFF)
+            {
+              len += kMatchSpecLenStart;
+              state -= kNumStates;
+              break;
+            }
+          }
+        }
+        rep3 = rep2;
+        rep2 = rep1;
+        rep1 = rep0;
+        rep0 = distance + 1;
+        if (checkDicSize == 0)
+        {
+          if (distance >= processedPos)
+            return SZ_ERROR_DATA;
+        }
+        else if (distance >= checkDicSize)
+          return SZ_ERROR_DATA;
+        state = (state < kNumStates + kNumLitStates) ? kNumLitStates : kNumLitStates + 3;
+        /* state = kLiteralNextStates[state]; */
+      }
+
+      len += kMatchMinLen;
+
+      if (limit == dicPos)
+        return SZ_ERROR_DATA;
+      {
+        SizeT rem = limit - dicPos;
+        unsigned curLen = ((rem < len) ? (unsigned)rem : len);
+        SizeT pos = (dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0);
+
+        processedPos += curLen;
+
+        len -= curLen;
+        if (pos + curLen <= dicBufSize)
+        {
+          Byte *dest = dic + dicPos;
+          ptrdiff_t src = (ptrdiff_t)pos - (ptrdiff_t)dicPos;
+          const Byte *lim = dest + curLen;
+          dicPos += curLen;
+          do
+            *(dest) = (Byte)*(dest + src);
+          while (++dest != lim);
+        }
+        else
+        {
+          do
+          {
+            dic[dicPos++] = dic[pos];
+            if (++pos == dicBufSize)
+              pos = 0;
+          }
+          while (--curLen != 0);
+        }
+      }
+    }
+  }
+  while (dicPos < limit && buf < bufLimit);
+  NORMALIZE;
+  p->buf = buf;
+  p->range = range;
+  p->code = code;
+  p->remainLen = len;
+  p->dicPos = dicPos;
+  p->processedPos = processedPos;
+  p->reps[0] = rep0;
+  p->reps[1] = rep1;
+  p->reps[2] = rep2;
+  p->reps[3] = rep3;
+  p->state = state;
+
+  return SZ_OK;
+}
+
+static void MY_FAST_CALL LzmaDec_WriteRem(CLzmaDec *p, SizeT limit)
+{
+  if (p->remainLen != 0 && p->remainLen < kMatchSpecLenStart)
+  {
+    Byte *dic = p->dic;
+    SizeT dicPos = p->dicPos;
+    SizeT dicBufSize = p->dicBufSize;
+    unsigned len = p->remainLen;
+    UInt32 rep0 = p->reps[0];
+    if (limit - dicPos < len)
+      len = (unsigned)(limit - dicPos);
+
+    if (p->checkDicSize == 0 && p->prop.dicSize - p->processedPos <= len)
+      p->checkDicSize = p->prop.dicSize;
+
+    p->processedPos += len;
+    p->remainLen -= len;
+    while (len-- != 0)
+    {
+      dic[dicPos] = dic[(dicPos - rep0) + ((dicPos < rep0) ? dicBufSize : 0)];
+      dicPos++;
+    }
+    p->dicPos = dicPos;
+  }
+}
+
+static int MY_FAST_CALL LzmaDec_DecodeReal2(CLzmaDec *p, SizeT limit, const Byte *bufLimit)
+{
+  do
+  {
+    SizeT limit2 = limit;
+    if (p->checkDicSize == 0)
+    {
+      UInt32 rem = p->prop.dicSize - p->processedPos;
+      if (limit - p->dicPos > rem)
+        limit2 = p->dicPos + rem;
+    }
+    RINOK(LzmaDec_DecodeReal(p, limit2, bufLimit));
+    if (p->processedPos >= p->prop.dicSize)
+      p->checkDicSize = p->prop.dicSize;
+    LzmaDec_WriteRem(p, limit);
+  }
+  while (p->dicPos < limit && p->buf < bufLimit && p->remainLen < kMatchSpecLenStart);
+
+  if (p->remainLen > kMatchSpecLenStart)
+  {
+    p->remainLen = kMatchSpecLenStart;
+  }
+  return 0;
+}
+
+typedef enum
+{
+  DUMMY_ERROR, /* unexpected end of input stream */
+  DUMMY_LIT,
+  DUMMY_MATCH,
+  DUMMY_REP
+} ELzmaDummy;
+
+static ELzmaDummy LzmaDec_TryDummy(const CLzmaDec *p, const Byte *buf, SizeT inSize)
+{
+  UInt32 range = p->range;
+  UInt32 code = p->code;
+  const Byte *bufLimit = buf + inSize;
+  CLzmaProb *probs = p->probs;
+  unsigned state = p->state;
+  ELzmaDummy res;
+
+  {
+    CLzmaProb *prob;
+    UInt32 bound;
+    unsigned ttt;
+    unsigned posState = (p->processedPos) & ((1 << p->prop.pb) - 1);
+
+    prob = probs + IsMatch + (state << kNumPosBitsMax) + posState;
+    IF_BIT_0_CHECK(prob)
+    {
+      UPDATE_0_CHECK
+
+      /* if (bufLimit - buf >= 7) return DUMMY_LIT; */
+
+      prob = probs + Literal;
+      if (p->checkDicSize != 0 || p->processedPos != 0)
+        prob += (LZMA_LIT_SIZE *
+          ((((p->processedPos) & ((1 << (p->prop.lp)) - 1)) << p->prop.lc) +
+          (p->dic[(p->dicPos == 0 ? p->dicBufSize : p->dicPos) - 1] >> (8 - p->prop.lc))));
+
+      if (state < kNumLitStates)
+      {
+        unsigned symbol = 1;
+        do { GET_BIT_CHECK(prob + symbol, symbol) } while (symbol < 0x100);
+      }
+      else
+      {
+        unsigned matchByte = p->dic[p->dicPos - p->reps[0] +
+            ((p->dicPos < p->reps[0]) ? p->dicBufSize : 0)];
+        unsigned offs = 0x100;
+        unsigned symbol = 1;
+        do
+        {
+          unsigned bit;
+          CLzmaProb *probLit;
+          matchByte <<= 1;
+          bit = (matchByte & offs);
+          probLit = prob + offs + bit + symbol;
+          GET_BIT2_CHECK(probLit, symbol, offs &= ~bit, offs &= bit)
+        }
+        while (symbol < 0x100);
+      }
+      res = DUMMY_LIT;
+    }
+    else
+    {
+      unsigned len;
+      UPDATE_1_CHECK;
+
+      prob = probs + IsRep + state;
+      IF_BIT_0_CHECK(prob)
+      {
+        UPDATE_0_CHECK;
+        state = 0;
+        prob = probs + LenCoder;
+        res = DUMMY_MATCH;
+      }
+      else
+      {
+        UPDATE_1_CHECK;
+        res = DUMMY_REP;
+        prob = probs + IsRepG0 + state;
+        IF_BIT_0_CHECK(prob)
+        {
+          UPDATE_0_CHECK;
+          prob = probs + IsRep0Long + (state << kNumPosBitsMax) + posState;
+          IF_BIT_0_CHECK(prob)
+          {
+            UPDATE_0_CHECK;
+            NORMALIZE_CHECK;
+            return DUMMY_REP;
+          }
+          else
+          {
+            UPDATE_1_CHECK;
+          }
+        }
+        else
+        {
+          UPDATE_1_CHECK;
+          prob = probs + IsRepG1 + state;
+          IF_BIT_0_CHECK(prob)
+          {
+            UPDATE_0_CHECK;
+          }
+          else
+          {
+            UPDATE_1_CHECK;
+            prob = probs + IsRepG2 + state;
+            IF_BIT_0_CHECK(prob)
+            {
+              UPDATE_0_CHECK;
+            }
+            else
+            {
+              UPDATE_1_CHECK;
+            }
+          }
+        }
+        state = kNumStates;
+        prob = probs + RepLenCoder;
+      }
+      {
+        unsigned limit, offset;
+        CLzmaProb *probLen = prob + LenChoice;
+        IF_BIT_0_CHECK(probLen)
+        {
+          UPDATE_0_CHECK;
+          probLen = prob + LenLow + (posState << kLenNumLowBits);
+          offset = 0;
+          limit = 1 << kLenNumLowBits;
+        }
+        else
+        {
+          UPDATE_1_CHECK;
+          probLen = prob + LenChoice2;
+          IF_BIT_0_CHECK(probLen)
+          {
+            UPDATE_0_CHECK;
+            probLen = prob + LenMid + (posState << kLenNumMidBits);
+            offset = kLenNumLowSymbols;
+            limit = 1 << kLenNumMidBits;
+          }
+          else
+          {
+            UPDATE_1_CHECK;
+            probLen = prob + LenHigh;
+            offset = kLenNumLowSymbols + kLenNumMidSymbols;
+            limit = 1 << kLenNumHighBits;
+          }
+        }
+        TREE_DECODE_CHECK(probLen, limit, len);
+        len += offset;
+      }
+
+      if (state < 4)
+      {
+        unsigned posSlot;
+        prob = probs + PosSlot +
+            ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) <<
+            kNumPosSlotBits);
+        TREE_DECODE_CHECK(prob, 1 << kNumPosSlotBits, posSlot);
+        if (posSlot >= kStartPosModelIndex)
+        {
+          int numDirectBits = ((posSlot >> 1) - 1);
+
+          /* if (bufLimit - buf >= 8) return DUMMY_MATCH; */
+
+          if (posSlot < kEndPosModelIndex)
+          {
+            prob = probs + SpecPos + ((2 | (posSlot & 1)) << numDirectBits) - posSlot - 1;
+          }
+          else
+          {
+            numDirectBits -= kNumAlignBits;
+            do
+            {
+              NORMALIZE_CHECK
+              range >>= 1;
+              code -= range & (((code - range) >> 31) - 1);
+              /* if (code >= range) code -= range; */
+            }
+            while (--numDirectBits != 0);
+            prob = probs + Align;
+            numDirectBits = kNumAlignBits;
+          }
+          {
+            unsigned i = 1;
+            do
+            {
+              GET_BIT_CHECK(prob + i, i);
+            }
+            while (--numDirectBits != 0);
+          }
+        }
+      }
+    }
+  }
+  NORMALIZE_CHECK;
+  return res;
+}
+
+
+static void LzmaDec_InitRc(CLzmaDec *p, const Byte *data)
+{
+  p->code = ((UInt32)data[1] << 24) | ((UInt32)data[2] << 16) | ((UInt32)data[3] << 8) | ((UInt32)data[4]);
+  p->range = 0xFFFFFFFF;
+  p->needFlush = 0;
+}
+
+void LzmaDec_InitDicAndState(CLzmaDec *p, Bool initDic, Bool initState)
+{
+  p->needFlush = 1;
+  p->remainLen = 0;
+  p->tempBufSize = 0;
+
+  if (initDic)
+  {
+    p->processedPos = 0;
+    p->checkDicSize = 0;
+    p->needInitState = 1;
+  }
+  if (initState)
+    p->needInitState = 1;
+}
+
+void LzmaDec_Init(CLzmaDec *p)
+{
+  p->dicPos = 0;
+  LzmaDec_InitDicAndState(p, True, True);
+}
+
+static void LzmaDec_InitStateReal(CLzmaDec *p)
+{
+  UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (p->prop.lc + p->prop.lp));
+  UInt32 i;
+  CLzmaProb *probs = p->probs;
+  for (i = 0; i < numProbs; i++)
+    probs[i] = kBitModelTotal >> 1;
+  p->reps[0] = p->reps[1] = p->reps[2] = p->reps[3] = 1;
+  p->state = 0;
+  p->needInitState = 0;
+}
+
+SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit, const Byte *src, SizeT *srcLen,
+    ELzmaFinishMode finishMode, ELzmaStatus *status)
+{
+  SizeT inSize = *srcLen;
+  (*srcLen) = 0;
+  LzmaDec_WriteRem(p, dicLimit);
+
+  *status = LZMA_STATUS_NOT_SPECIFIED;
+
+  while (p->remainLen != kMatchSpecLenStart)
+  {
+      int checkEndMarkNow;
+
+      if (p->needFlush != 0)
+      {
+        for (; inSize > 0 && p->tempBufSize < RC_INIT_SIZE; (*srcLen)++, inSize--)
+          p->tempBuf[p->tempBufSize++] = *src++;
+        if (p->tempBufSize < RC_INIT_SIZE)
+        {
+          *status = LZMA_STATUS_NEEDS_MORE_INPUT;
+          return SZ_OK;
+        }
+        if (p->tempBuf[0] != 0)
+          return SZ_ERROR_DATA;
+
+        LzmaDec_InitRc(p, p->tempBuf);
+        p->tempBufSize = 0;
+      }
+
+      checkEndMarkNow = 0;
+      if (p->dicPos >= dicLimit)
+      {
+        if (p->remainLen == 0 && p->code == 0)
+        {
+          *status = LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK;
+          return SZ_OK;
+        }
+        if (finishMode == LZMA_FINISH_ANY)
+        {
+          *status = LZMA_STATUS_NOT_FINISHED;
+          return SZ_OK;
+        }
+        if (p->remainLen != 0)
+        {
+          *status = LZMA_STATUS_NOT_FINISHED;
+          return SZ_ERROR_DATA;
+        }
+        checkEndMarkNow = 1;
+      }
+
+      if (p->needInitState)
+        LzmaDec_InitStateReal(p);
+
+      if (p->tempBufSize == 0)
+      {
+        SizeT processed;
+        const Byte *bufLimit;
+        if (inSize < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow)
+        {
+          int dummyRes = LzmaDec_TryDummy(p, src, inSize);
+          if (dummyRes == DUMMY_ERROR)
+          {
+            memcpy(p->tempBuf, src, inSize);
+            p->tempBufSize = (unsigned)inSize;
+            (*srcLen) += inSize;
+            *status = LZMA_STATUS_NEEDS_MORE_INPUT;
+            return SZ_OK;
+          }
+          if (checkEndMarkNow && dummyRes != DUMMY_MATCH)
+          {
+            *status = LZMA_STATUS_NOT_FINISHED;
+            return SZ_ERROR_DATA;
+          }
+          bufLimit = src;
+        }
+        else
+          bufLimit = src + inSize - LZMA_REQUIRED_INPUT_MAX;
+        p->buf = src;
+        if (LzmaDec_DecodeReal2(p, dicLimit, bufLimit) != 0)
+          return SZ_ERROR_DATA;
+        processed = (SizeT)(p->buf - src);
+        (*srcLen) += processed;
+        src += processed;
+        inSize -= processed;
+      }
+      else
+      {
+        unsigned rem = p->tempBufSize, lookAhead = 0;
+        while (rem < LZMA_REQUIRED_INPUT_MAX && lookAhead < inSize)
+          p->tempBuf[rem++] = src[lookAhead++];
+        p->tempBufSize = rem;
+        if (rem < LZMA_REQUIRED_INPUT_MAX || checkEndMarkNow)
+        {
+          int dummyRes = LzmaDec_TryDummy(p, p->tempBuf, rem);
+          if (dummyRes == DUMMY_ERROR)
+          {
+            (*srcLen) += lookAhead;
+            *status = LZMA_STATUS_NEEDS_MORE_INPUT;
+            return SZ_OK;
+          }
+          if (checkEndMarkNow && dummyRes != DUMMY_MATCH)
+          {
+            *status = LZMA_STATUS_NOT_FINISHED;
+            return SZ_ERROR_DATA;
+          }
+        }
+        p->buf = p->tempBuf;
+        if (LzmaDec_DecodeReal2(p, dicLimit, p->buf) != 0)
+          return SZ_ERROR_DATA;
+        lookAhead -= (rem - (unsigned)(p->buf - p->tempBuf));
+        (*srcLen) += lookAhead;
+        src += lookAhead;
+        inSize -= lookAhead;
+        p->tempBufSize = 0;
+      }
+  }
+  if (p->code == 0)
+    *status = LZMA_STATUS_FINISHED_WITH_MARK;
+  return (p->code == 0) ? SZ_OK : SZ_ERROR_DATA;
+}
+
+SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status)
+{
+  SizeT outSize = *destLen;
+  SizeT inSize = *srcLen;
+  *srcLen = *destLen = 0;
+  for (;;)
+  {
+    SizeT inSizeCur = inSize, outSizeCur, dicPos;
+    ELzmaFinishMode curFinishMode;
+    SRes res;
+    if (p->dicPos == p->dicBufSize)
+      p->dicPos = 0;
+    dicPos = p->dicPos;
+    if (outSize > p->dicBufSize - dicPos)
+    {
+      outSizeCur = p->dicBufSize;
+      curFinishMode = LZMA_FINISH_ANY;
+    }
+    else
+    {
+      outSizeCur = dicPos + outSize;
+      curFinishMode = finishMode;
+    }
+
+    res = LzmaDec_DecodeToDic(p, outSizeCur, src, &inSizeCur, curFinishMode, status);
+    src += inSizeCur;
+    inSize -= inSizeCur;
+    *srcLen += inSizeCur;
+    outSizeCur = p->dicPos - dicPos;
+    memcpy(dest, p->dic + dicPos, outSizeCur);
+    dest += outSizeCur;
+    outSize -= outSizeCur;
+    *destLen += outSizeCur;
+    if (res != 0)
+      return res;
+    if (outSizeCur == 0 || outSize == 0)
+      return SZ_OK;
+  }
+}
+
+void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc)
+{
+  alloc->Free(alloc, p->probs);
+  p->probs = 0;
+}
+
+static void LzmaDec_FreeDict(CLzmaDec *p, ISzAlloc *alloc)
+{
+  alloc->Free(alloc, p->dic);
+  p->dic = 0;
+}
+
+void LzmaDec_Free(CLzmaDec *p, ISzAlloc *alloc)
+{
+  LzmaDec_FreeProbs(p, alloc);
+  LzmaDec_FreeDict(p, alloc);
+}
+
+SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size)
+{
+  UInt32 dicSize;
+  Byte d;
+
+  if (size < LZMA_PROPS_SIZE)
+    return SZ_ERROR_UNSUPPORTED;
+  else
+    dicSize = data[1] | ((UInt32)data[2] << 8) | ((UInt32)data[3] << 16) | ((UInt32)data[4] << 24);
+
+  if (dicSize < LZMA_DIC_MIN)
+    dicSize = LZMA_DIC_MIN;
+  p->dicSize = dicSize;
+
+  d = data[0];
+  if (d >= (9 * 5 * 5))
+    return SZ_ERROR_UNSUPPORTED;
+
+  p->lc = d % 9;
+  d /= 9;
+  p->pb = d / 5;
+  p->lp = d % 5;
+
+  return SZ_OK;
+}
+
+static SRes LzmaDec_AllocateProbs2(CLzmaDec *p, const CLzmaProps *propNew, ISzAlloc *alloc)
+{
+  UInt32 numProbs = LzmaProps_GetNumProbs(propNew);
+  if (p->probs == 0 || numProbs != p->numProbs)
+  {
+    LzmaDec_FreeProbs(p, alloc);
+    p->probs = (CLzmaProb *)alloc->Alloc(alloc, numProbs * sizeof(CLzmaProb));
+    p->numProbs = numProbs;
+    if (p->probs == 0)
+      return SZ_ERROR_MEM;
+  }
+  return SZ_OK;
+}
+
+SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)
+{
+  CLzmaProps propNew;
+  RINOK(LzmaProps_Decode(&propNew, props, propsSize));
+  RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc));
+  p->prop = propNew;
+  return SZ_OK;
+}
+
+SRes LzmaDec_Allocate(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc)
+{
+  CLzmaProps propNew;
+  SizeT dicBufSize;
+  RINOK(LzmaProps_Decode(&propNew, props, propsSize));
+  RINOK(LzmaDec_AllocateProbs2(p, &propNew, alloc));
+  dicBufSize = propNew.dicSize;
+  if (p->dic == 0 || dicBufSize != p->dicBufSize)
+  {
+    LzmaDec_FreeDict(p, alloc);
+    p->dic = (Byte *)alloc->Alloc(alloc, dicBufSize);
+    if (p->dic == 0)
+    {
+      LzmaDec_FreeProbs(p, alloc);
+      return SZ_ERROR_MEM;
+    }
+  }
+  p->dicBufSize = dicBufSize;
+  p->prop = propNew;
+  return SZ_OK;
+}
+
+SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
+    const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,
+    ELzmaStatus *status, ISzAlloc *alloc)
+{
+  CLzmaDec p;
+  SRes res;
+  SizeT inSize = *srcLen;
+  SizeT outSize = *destLen;
+  *srcLen = *destLen = 0;
+  if (inSize < RC_INIT_SIZE)
+    return SZ_ERROR_INPUT_EOF;
+
+  LzmaDec_Construct(&p);
+  res = LzmaDec_AllocateProbs(&p, propData, propSize, alloc);
+  if (res != 0)
+    return res;
+  p.dic = dest;
+  p.dicBufSize = outSize;
+
+  LzmaDec_Init(&p);
+
+  *srcLen = inSize;
+  res = LzmaDec_DecodeToDic(&p, outSize, src, srcLen, finishMode, status);
+
+  if (res == SZ_OK && *status == LZMA_STATUS_NEEDS_MORE_INPUT)
+    res = SZ_ERROR_INPUT_EOF;
+
+  (*destLen) = p.dicPos;
+  LzmaDec_FreeProbs(&p, alloc);
+  return res;
+}
diff --git a/lib_generic/lzma/LzmaDec.h b/lib_generic/lzma/LzmaDec.h
new file mode 100644 (file)
index 0000000..7fba87f
--- /dev/null
@@ -0,0 +1,223 @@
+/* LzmaDec.h -- LZMA Decoder
+2008-10-04 : Igor Pavlov : Public domain */
+
+#ifndef __LZMADEC_H
+#define __LZMADEC_H
+
+#include "Types.h"
+
+/* #define _LZMA_PROB32 */
+/* _LZMA_PROB32 can increase the speed on some CPUs,
+   but memory usage for CLzmaDec::probs will be doubled in that case */
+
+#ifdef _LZMA_PROB32
+#define CLzmaProb UInt32
+#else
+#define CLzmaProb UInt16
+#endif
+
+
+/* ---------- LZMA Properties ---------- */
+
+#define LZMA_PROPS_SIZE 5
+
+typedef struct _CLzmaProps
+{
+  unsigned lc, lp, pb;
+  UInt32 dicSize;
+} CLzmaProps;
+
+/* LzmaProps_Decode - decodes properties
+Returns:
+  SZ_OK
+  SZ_ERROR_UNSUPPORTED - Unsupported properties
+*/
+
+SRes LzmaProps_Decode(CLzmaProps *p, const Byte *data, unsigned size);
+
+
+/* ---------- LZMA Decoder state ---------- */
+
+/* LZMA_REQUIRED_INPUT_MAX = number of required input bytes for worst case.
+   Num bits = log2((2^11 / 31) ^ 22) + 26 < 134 + 26 = 160; */
+
+#define LZMA_REQUIRED_INPUT_MAX 20
+
+typedef struct
+{
+  CLzmaProps prop;
+  CLzmaProb *probs;
+  Byte *dic;
+  const Byte *buf;
+  UInt32 range, code;
+  SizeT dicPos;
+  SizeT dicBufSize;
+  UInt32 processedPos;
+  UInt32 checkDicSize;
+  unsigned state;
+  UInt32 reps[4];
+  unsigned remainLen;
+  int needFlush;
+  int needInitState;
+  UInt32 numProbs;
+  unsigned tempBufSize;
+  Byte tempBuf[LZMA_REQUIRED_INPUT_MAX];
+} CLzmaDec;
+
+#define LzmaDec_Construct(p) { (p)->dic = 0; (p)->probs = 0; }
+
+void LzmaDec_Init(CLzmaDec *p);
+
+/* There are two types of LZMA streams:
+     0) Stream with end mark. That end mark adds about 6 bytes to compressed size.
+     1) Stream without end mark. You must know exact uncompressed size to decompress such stream. */
+
+typedef enum
+{
+  LZMA_FINISH_ANY,   /* finish at any point */
+  LZMA_FINISH_END    /* block must be finished at the end */
+} ELzmaFinishMode;
+
+/* ELzmaFinishMode has meaning only if the decoding reaches output limit !!!
+
+   You must use LZMA_FINISH_END, when you know that current output buffer
+   covers last bytes of block. In other cases you must use LZMA_FINISH_ANY.
+
+   If LZMA decoder sees end marker before reaching output limit, it returns SZ_OK,
+   and output value of destLen will be less than output buffer size limit.
+   You can check status result also.
+
+   You can use multiple checks to test data integrity after full decompression:
+     1) Check Result and "status" variable.
+     2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize.
+     3) Check that output(srcLen) = compressedSize, if you know real compressedSize.
+        You must use correct finish mode in that case. */
+
+typedef enum
+{
+  LZMA_STATUS_NOT_SPECIFIED,               /* use main error code instead */
+  LZMA_STATUS_FINISHED_WITH_MARK,          /* stream was finished with end mark. */
+  LZMA_STATUS_NOT_FINISHED,                /* stream was not finished */
+  LZMA_STATUS_NEEDS_MORE_INPUT,            /* you must provide more input bytes */
+  LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK  /* there is probability that stream was finished without end mark */
+} ELzmaStatus;
+
+/* ELzmaStatus is used only as output value for function call */
+
+
+/* ---------- Interfaces ---------- */
+
+/* There are 3 levels of interfaces:
+     1) Dictionary Interface
+     2) Buffer Interface
+     3) One Call Interface
+   You can select any of these interfaces, but don't mix functions from different
+   groups for same object. */
+
+
+/* There are two variants to allocate state for Dictionary Interface:
+     1) LzmaDec_Allocate / LzmaDec_Free
+     2) LzmaDec_AllocateProbs / LzmaDec_FreeProbs
+   You can use variant 2, if you set dictionary buffer manually.
+   For Buffer Interface you must always use variant 1.
+
+LzmaDec_Allocate* can return:
+  SZ_OK
+  SZ_ERROR_MEM         - Memory allocation error
+  SZ_ERROR_UNSUPPORTED - Unsupported properties
+*/
+
+SRes LzmaDec_AllocateProbs(CLzmaDec *p, const Byte *props, unsigned propsSize, ISzAlloc *alloc);
+void LzmaDec_FreeProbs(CLzmaDec *p, ISzAlloc *alloc);
+
+SRes LzmaDec_Allocate(CLzmaDec *state, const Byte *prop, unsigned propsSize, ISzAlloc *alloc);
+void LzmaDec_Free(CLzmaDec *state, ISzAlloc *alloc);
+
+/* ---------- Dictionary Interface ---------- */
+
+/* You can use it, if you want to eliminate the overhead for data copying from
+   dictionary to some other external buffer.
+   You must work with CLzmaDec variables directly in this interface.
+
+   STEPS:
+     LzmaDec_Constr()
+     LzmaDec_Allocate()
+     for (each new stream)
+     {
+       LzmaDec_Init()
+       while (it needs more decompression)
+       {
+         LzmaDec_DecodeToDic()
+         use data from CLzmaDec::dic and update CLzmaDec::dicPos
+       }
+     }
+     LzmaDec_Free()
+*/
+
+/* LzmaDec_DecodeToDic
+
+   The decoding to internal dictionary buffer (CLzmaDec::dic).
+   You must manually update CLzmaDec::dicPos, if it reaches CLzmaDec::dicBufSize !!!
+
+finishMode:
+  It has meaning only if the decoding reaches output limit (dicLimit).
+  LZMA_FINISH_ANY - Decode just dicLimit bytes.
+  LZMA_FINISH_END - Stream must be finished after dicLimit.
+
+Returns:
+  SZ_OK
+    status:
+      LZMA_STATUS_FINISHED_WITH_MARK
+      LZMA_STATUS_NOT_FINISHED
+      LZMA_STATUS_NEEDS_MORE_INPUT
+      LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK
+  SZ_ERROR_DATA - Data error
+*/
+
+SRes LzmaDec_DecodeToDic(CLzmaDec *p, SizeT dicLimit,
+    const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
+
+
+/* ---------- Buffer Interface ---------- */
+
+/* It's zlib-like interface.
+   See LzmaDec_DecodeToDic description for information about STEPS and return results,
+   but you must use LzmaDec_DecodeToBuf instead of LzmaDec_DecodeToDic and you don't need
+   to work with CLzmaDec variables manually.
+
+finishMode:
+  It has meaning only if the decoding reaches output limit (*destLen).
+  LZMA_FINISH_ANY - Decode just destLen bytes.
+  LZMA_FINISH_END - Stream must be finished after (*destLen).
+*/
+
+SRes LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen,
+    const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode, ELzmaStatus *status);
+
+
+/* ---------- One Call Interface ---------- */
+
+/* LzmaDecode
+
+finishMode:
+  It has meaning only if the decoding reaches output limit (*destLen).
+  LZMA_FINISH_ANY - Decode just destLen bytes.
+  LZMA_FINISH_END - Stream must be finished after (*destLen).
+
+Returns:
+  SZ_OK
+    status:
+      LZMA_STATUS_FINISHED_WITH_MARK
+      LZMA_STATUS_NOT_FINISHED
+      LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK
+  SZ_ERROR_DATA - Data error
+  SZ_ERROR_MEM  - Memory allocation error
+  SZ_ERROR_UNSUPPORTED - Unsupported properties
+  SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src).
+*/
+
+SRes LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
+    const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,
+    ELzmaStatus *status, ISzAlloc *alloc);
+
+#endif
diff --git a/lib_generic/lzma/LzmaDecode.c b/lib_generic/lzma/LzmaDecode.c
deleted file mode 100644 (file)
index 3470e55..0000000
+++ /dev/null
@@ -1,584 +0,0 @@
-/*
-  LzmaDecode.c
-  LZMA Decoder (optimized for Speed version)
-
-  LZMA SDK 4.40 Copyright (c) 1999-2006 Igor Pavlov (2006-05-01)
-  http://www.7-zip.org/
-
-  LZMA SDK is licensed under two licenses:
-  1) GNU Lesser General Public License (GNU LGPL)
-  2) Common Public License (CPL)
-  It means that you can select one of these two licenses and
-  follow rules of that license.
-
-  SPECIAL EXCEPTION:
-  Igor Pavlov, as the author of this Code, expressly permits you to
-  statically or dynamically link your Code (or bind by name) to the
-  interfaces of this file without subjecting your linked Code to the
-  terms of the CPL or GNU LGPL. Any modifications or additions
-  to this file, however, are subject to the LGPL or CPL terms.
-*/
-
-#include "LzmaDecode.h"
-
-#define kNumTopBits 24
-#define kTopValue ((UInt32)1 << kNumTopBits)
-
-#define kNumBitModelTotalBits 11
-#define kBitModelTotal (1 << kNumBitModelTotalBits)
-#define kNumMoveBits 5
-
-#define RC_READ_BYTE (*Buffer++)
-
-#define RC_INIT2 Code = 0; Range = 0xFFFFFFFF; \
-  { int i; for(i = 0; i < 5; i++) { RC_TEST; Code = (Code << 8) | RC_READ_BYTE; }}
-
-#ifdef _LZMA_IN_CB
-
-#define RC_TEST { if (Buffer == BufferLim) \
-  { SizeT size; int result = InCallback->Read(InCallback, &Buffer, &size); if (result != LZMA_RESULT_OK) return result; \
-  BufferLim = Buffer + size; if (size == 0) return LZMA_RESULT_DATA_ERROR; }}
-
-#define RC_INIT Buffer = BufferLim = 0; RC_INIT2
-
-#else
-
-#define RC_TEST { if (Buffer == BufferLim) return LZMA_RESULT_DATA_ERROR; }
-
-#define RC_INIT(buffer, bufferSize) Buffer = buffer; BufferLim = buffer + bufferSize; RC_INIT2
-
-#endif
-
-#define RC_NORMALIZE if (Range < kTopValue) { RC_TEST; Range <<= 8; Code = (Code << 8) | RC_READ_BYTE; }
-
-#define IfBit0(p) RC_NORMALIZE; bound = (Range >> kNumBitModelTotalBits) * *(p); if (Code < bound)
-#define UpdateBit0(p) Range = bound; *(p) += (kBitModelTotal - *(p)) >> kNumMoveBits;
-#define UpdateBit1(p) Range -= bound; Code -= bound; *(p) -= (*(p)) >> kNumMoveBits;
-
-#define RC_GET_BIT2(p, mi, A0, A1) IfBit0(p) \
-  { UpdateBit0(p); mi <<= 1; A0; } else \
-  { UpdateBit1(p); mi = (mi + mi) + 1; A1; }
-
-#define RC_GET_BIT(p, mi) RC_GET_BIT2(p, mi, ; , ;)
-
-#define RangeDecoderBitTreeDecode(probs, numLevels, res) \
-  { int i = numLevels; res = 1; \
-  do { CProb *p = probs + res; RC_GET_BIT(p, res) } while(--i != 0); \
-  res -= (1 << numLevels); }
-
-
-#define kNumPosBitsMax 4
-#define kNumPosStatesMax (1 << kNumPosBitsMax)
-
-#define kLenNumLowBits 3
-#define kLenNumLowSymbols (1 << kLenNumLowBits)
-#define kLenNumMidBits 3
-#define kLenNumMidSymbols (1 << kLenNumMidBits)
-#define kLenNumHighBits 8
-#define kLenNumHighSymbols (1 << kLenNumHighBits)
-
-#define LenChoice 0
-#define LenChoice2 (LenChoice + 1)
-#define LenLow (LenChoice2 + 1)
-#define LenMid (LenLow + (kNumPosStatesMax << kLenNumLowBits))
-#define LenHigh (LenMid + (kNumPosStatesMax << kLenNumMidBits))
-#define kNumLenProbs (LenHigh + kLenNumHighSymbols)
-
-
-#define kNumStates 12
-#define kNumLitStates 7
-
-#define kStartPosModelIndex 4
-#define kEndPosModelIndex 14
-#define kNumFullDistances (1 << (kEndPosModelIndex >> 1))
-
-#define kNumPosSlotBits 6
-#define kNumLenToPosStates 4
-
-#define kNumAlignBits 4
-#define kAlignTableSize (1 << kNumAlignBits)
-
-#define kMatchMinLen 2
-
-#define IsMatch 0
-#define IsRep (IsMatch + (kNumStates << kNumPosBitsMax))
-#define IsRepG0 (IsRep + kNumStates)
-#define IsRepG1 (IsRepG0 + kNumStates)
-#define IsRepG2 (IsRepG1 + kNumStates)
-#define IsRep0Long (IsRepG2 + kNumStates)
-#define PosSlot (IsRep0Long + (kNumStates << kNumPosBitsMax))
-#define SpecPos (PosSlot + (kNumLenToPosStates << kNumPosSlotBits))
-#define Align (SpecPos + kNumFullDistances - kEndPosModelIndex)
-#define LenCoder (Align + kAlignTableSize)
-#define RepLenCoder (LenCoder + kNumLenProbs)
-#define Literal (RepLenCoder + kNumLenProbs)
-
-#if Literal != LZMA_BASE_SIZE
-StopCompilingDueBUG
-#endif
-
-int LzmaDecodeProperties(CLzmaProperties *propsRes, const unsigned char *propsData, int size)
-{
-  unsigned char prop0;
-  if (size < LZMA_PROPERTIES_SIZE)
-    return LZMA_RESULT_DATA_ERROR;
-  prop0 = propsData[0];
-  if (prop0 >= (9 * 5 * 5))
-    return LZMA_RESULT_DATA_ERROR;
-  {
-    for (propsRes->pb = 0; prop0 >= (9 * 5); propsRes->pb++, prop0 -= (9 * 5));
-    for (propsRes->lp = 0; prop0 >= 9; propsRes->lp++, prop0 -= 9);
-    propsRes->lc = prop0;
-    /*
-    unsigned char remainder = (unsigned char)(prop0 / 9);
-    propsRes->lc = prop0 % 9;
-    propsRes->pb = remainder / 5;
-    propsRes->lp = remainder % 5;
-    */
-  }
-
-  #ifdef _LZMA_OUT_READ
-  {
-    int i;
-    propsRes->DictionarySize = 0;
-    for (i = 0; i < 4; i++)
-      propsRes->DictionarySize += (UInt32)(propsData[1 + i]) << (i * 8);
-    if (propsRes->DictionarySize == 0)
-      propsRes->DictionarySize = 1;
-  }
-  #endif
-  return LZMA_RESULT_OK;
-}
-
-#define kLzmaStreamWasFinishedId (-1)
-
-int LzmaDecode(CLzmaDecoderState *vs,
-    #ifdef _LZMA_IN_CB
-    ILzmaInCallback *InCallback,
-    #else
-    const unsigned char *inStream, SizeT inSize, SizeT *inSizeProcessed,
-    #endif
-    unsigned char *outStream, SizeT outSize, SizeT *outSizeProcessed)
-{
-  CProb *p = vs->Probs;
-  SizeT nowPos = 0;
-  Byte previousByte = 0;
-  UInt32 posStateMask = (1 << (vs->Properties.pb)) - 1;
-  UInt32 literalPosMask = (1 << (vs->Properties.lp)) - 1;
-  int lc = vs->Properties.lc;
-
-  #ifdef _LZMA_OUT_READ
-
-  UInt32 Range = vs->Range;
-  UInt32 Code = vs->Code;
-  #ifdef _LZMA_IN_CB
-  const Byte *Buffer = vs->Buffer;
-  const Byte *BufferLim = vs->BufferLim;
-  #else
-  const Byte *Buffer = inStream;
-  const Byte *BufferLim = inStream + inSize;
-  #endif
-  int state = vs->State;
-  UInt32 rep0 = vs->Reps[0], rep1 = vs->Reps[1], rep2 = vs->Reps[2], rep3 = vs->Reps[3];
-  int len = vs->RemainLen;
-  UInt32 globalPos = vs->GlobalPos;
-  UInt32 distanceLimit = vs->DistanceLimit;
-
-  Byte *dictionary = vs->Dictionary;
-  UInt32 dictionarySize = vs->Properties.DictionarySize;
-  UInt32 dictionaryPos = vs->DictionaryPos;
-
-  Byte tempDictionary[4];
-
-  #ifndef _LZMA_IN_CB
-  *inSizeProcessed = 0;
-  #endif
-  *outSizeProcessed = 0;
-  if (len == kLzmaStreamWasFinishedId)
-    return LZMA_RESULT_OK;
-
-  if (dictionarySize == 0)
-  {
-    dictionary = tempDictionary;
-    dictionarySize = 1;
-    tempDictionary[0] = vs->TempDictionary[0];
-  }
-
-  if (len == kLzmaNeedInitId)
-  {
-    {
-      UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (lc + vs->Properties.lp));
-      UInt32 i;
-      for (i = 0; i < numProbs; i++)
-        p[i] = kBitModelTotal >> 1;
-      rep0 = rep1 = rep2 = rep3 = 1;
-      state = 0;
-      globalPos = 0;
-      distanceLimit = 0;
-      dictionaryPos = 0;
-      dictionary[dictionarySize - 1] = 0;
-      #ifdef _LZMA_IN_CB
-      RC_INIT;
-      #else
-      RC_INIT(inStream, inSize);
-      #endif
-    }
-    len = 0;
-  }
-  while(len != 0 && nowPos < outSize)
-  {
-    UInt32 pos = dictionaryPos - rep0;
-    if (pos >= dictionarySize)
-      pos += dictionarySize;
-    outStream[nowPos++] = dictionary[dictionaryPos] = dictionary[pos];
-    if (++dictionaryPos == dictionarySize)
-      dictionaryPos = 0;
-    len--;
-  }
-  if (dictionaryPos == 0)
-    previousByte = dictionary[dictionarySize - 1];
-  else
-    previousByte = dictionary[dictionaryPos - 1];
-
-  #else /* if !_LZMA_OUT_READ */
-
-  int state = 0;
-  UInt32 rep0 = 1, rep1 = 1, rep2 = 1, rep3 = 1;
-  int len = 0;
-  const Byte *Buffer;
-  const Byte *BufferLim;
-  UInt32 Range;
-  UInt32 Code;
-
-  #ifndef _LZMA_IN_CB
-  *inSizeProcessed = 0;
-  #endif
-  *outSizeProcessed = 0;
-
-  {
-    UInt32 i;
-    UInt32 numProbs = Literal + ((UInt32)LZMA_LIT_SIZE << (lc + vs->Properties.lp));
-    for (i = 0; i < numProbs; i++)
-      p[i] = kBitModelTotal >> 1;
-  }
-
-  #ifdef _LZMA_IN_CB
-  RC_INIT;
-  #else
-  RC_INIT(inStream, inSize);
-  #endif
-
-  #endif /* _LZMA_OUT_READ */
-
-  while(nowPos < outSize)
-  {
-    CProb *prob;
-    UInt32 bound;
-    int posState = (int)(
-        (nowPos
-        #ifdef _LZMA_OUT_READ
-        + globalPos
-        #endif
-        )
-        & posStateMask);
-
-    prob = p + IsMatch + (state << kNumPosBitsMax) + posState;
-    IfBit0(prob)
-    {
-      int symbol = 1;
-      UpdateBit0(prob)
-      prob = p + Literal + (LZMA_LIT_SIZE *
-        (((
-        (nowPos
-        #ifdef _LZMA_OUT_READ
-        + globalPos
-        #endif
-        )
-        & literalPosMask) << lc) + (previousByte >> (8 - lc))));
-
-      if (state >= kNumLitStates)
-      {
-        int matchByte;
-        #ifdef _LZMA_OUT_READ
-        UInt32 pos = dictionaryPos - rep0;
-        if (pos >= dictionarySize)
-          pos += dictionarySize;
-        matchByte = dictionary[pos];
-        #else
-        matchByte = outStream[nowPos - rep0];
-        #endif
-        do
-        {
-          int bit;
-          CProb *probLit;
-          matchByte <<= 1;
-          bit = (matchByte & 0x100);
-          probLit = prob + 0x100 + bit + symbol;
-          RC_GET_BIT2(probLit, symbol, if (bit != 0) break, if (bit == 0) break)
-        }
-        while (symbol < 0x100);
-      }
-      while (symbol < 0x100)
-      {
-        CProb *probLit = prob + symbol;
-        RC_GET_BIT(probLit, symbol)
-      }
-      previousByte = (Byte)symbol;
-
-      outStream[nowPos++] = previousByte;
-      #ifdef _LZMA_OUT_READ
-      if (distanceLimit < dictionarySize)
-        distanceLimit++;
-
-      dictionary[dictionaryPos] = previousByte;
-      if (++dictionaryPos == dictionarySize)
-        dictionaryPos = 0;
-      #endif
-      if (state < 4) state = 0;
-      else if (state < 10) state -= 3;
-      else state -= 6;
-    }
-    else
-    {
-      UpdateBit1(prob);
-      prob = p + IsRep + state;
-      IfBit0(prob)
-      {
-        UpdateBit0(prob);
-        rep3 = rep2;
-        rep2 = rep1;
-        rep1 = rep0;
-        state = state < kNumLitStates ? 0 : 3;
-        prob = p + LenCoder;
-      }
-      else
-      {
-        UpdateBit1(prob);
-        prob = p + IsRepG0 + state;
-        IfBit0(prob)
-        {
-          UpdateBit0(prob);
-          prob = p + IsRep0Long + (state << kNumPosBitsMax) + posState;
-          IfBit0(prob)
-          {
-            #ifdef _LZMA_OUT_READ
-            UInt32 pos;
-            #endif
-            UpdateBit0(prob);
-
-            #ifdef _LZMA_OUT_READ
-            if (distanceLimit == 0)
-            #else
-            if (nowPos == 0)
-            #endif
-              return LZMA_RESULT_DATA_ERROR;
-
-            state = state < kNumLitStates ? 9 : 11;
-            #ifdef _LZMA_OUT_READ
-            pos = dictionaryPos - rep0;
-            if (pos >= dictionarySize)
-              pos += dictionarySize;
-            previousByte = dictionary[pos];
-            dictionary[dictionaryPos] = previousByte;
-            if (++dictionaryPos == dictionarySize)
-              dictionaryPos = 0;
-            #else
-            previousByte = outStream[nowPos - rep0];
-            #endif
-            outStream[nowPos++] = previousByte;
-            #ifdef _LZMA_OUT_READ
-            if (distanceLimit < dictionarySize)
-              distanceLimit++;
-            #endif
-
-            continue;
-          }
-          else
-          {
-            UpdateBit1(prob);
-          }
-        }
-        else
-        {
-          UInt32 distance;
-          UpdateBit1(prob);
-          prob = p + IsRepG1 + state;
-          IfBit0(prob)
-          {
-            UpdateBit0(prob);
-            distance = rep1;
-          }
-          else
-          {
-            UpdateBit1(prob);
-            prob = p + IsRepG2 + state;
-            IfBit0(prob)
-            {
-              UpdateBit0(prob);
-              distance = rep2;
-            }
-            else
-            {
-              UpdateBit1(prob);
-              distance = rep3;
-              rep3 = rep2;
-            }
-            rep2 = rep1;
-          }
-          rep1 = rep0;
-          rep0 = distance;
-        }
-        state = state < kNumLitStates ? 8 : 11;
-        prob = p + RepLenCoder;
-      }
-      {
-        int numBits, offset;
-        CProb *probLen = prob + LenChoice;
-        IfBit0(probLen)
-        {
-          UpdateBit0(probLen);
-          probLen = prob + LenLow + (posState << kLenNumLowBits);
-          offset = 0;
-          numBits = kLenNumLowBits;
-        }
-        else
-        {
-          UpdateBit1(probLen);
-          probLen = prob + LenChoice2;
-          IfBit0(probLen)
-          {
-            UpdateBit0(probLen);
-            probLen = prob + LenMid + (posState << kLenNumMidBits);
-            offset = kLenNumLowSymbols;
-            numBits = kLenNumMidBits;
-          }
-          else
-          {
-            UpdateBit1(probLen);
-            probLen = prob + LenHigh;
-            offset = kLenNumLowSymbols + kLenNumMidSymbols;
-            numBits = kLenNumHighBits;
-          }
-        }
-        RangeDecoderBitTreeDecode(probLen, numBits, len);
-        len += offset;
-      }
-
-      if (state < 4)
-      {
-        int posSlot;
-        state += kNumLitStates;
-        prob = p + PosSlot +
-            ((len < kNumLenToPosStates ? len : kNumLenToPosStates - 1) <<
-            kNumPosSlotBits);
-        RangeDecoderBitTreeDecode(prob, kNumPosSlotBits, posSlot);
-        if (posSlot >= kStartPosModelIndex)
-        {
-          int numDirectBits = ((posSlot >> 1) - 1);
-          rep0 = (2 | ((UInt32)posSlot & 1));
-          if (posSlot < kEndPosModelIndex)
-          {
-            rep0 <<= numDirectBits;
-            prob = p + SpecPos + rep0 - posSlot - 1;
-          }
-          else
-          {
-            numDirectBits -= kNumAlignBits;
-            do
-            {
-              RC_NORMALIZE
-              Range >>= 1;
-              rep0 <<= 1;
-              if (Code >= Range)
-              {
-                Code -= Range;
-                rep0 |= 1;
-              }
-            }
-            while (--numDirectBits != 0);
-            prob = p + Align;
-            rep0 <<= kNumAlignBits;
-            numDirectBits = kNumAlignBits;
-          }
-          {
-            int i = 1;
-            int mi = 1;
-            do
-            {
-              CProb *prob3 = prob + mi;
-              RC_GET_BIT2(prob3, mi, ; , rep0 |= i);
-              i <<= 1;
-            }
-            while(--numDirectBits != 0);
-          }
-        }
-        else
-          rep0 = posSlot;
-        if (++rep0 == (UInt32)(0))
-        {
-          /* it's for stream version */
-          len = kLzmaStreamWasFinishedId;
-          break;
-        }
-      }
-
-      len += kMatchMinLen;
-      #ifdef _LZMA_OUT_READ
-      if (rep0 > distanceLimit)
-      #else
-      if (rep0 > nowPos)
-      #endif
-        return LZMA_RESULT_DATA_ERROR;
-
-      #ifdef _LZMA_OUT_READ
-      if (dictionarySize - distanceLimit > (UInt32)len)
-        distanceLimit += len;
-      else
-        distanceLimit = dictionarySize;
-      #endif
-
-      do
-      {
-        #ifdef _LZMA_OUT_READ
-        UInt32 pos = dictionaryPos - rep0;
-        if (pos >= dictionarySize)
-          pos += dictionarySize;
-        previousByte = dictionary[pos];
-        dictionary[dictionaryPos] = previousByte;
-        if (++dictionaryPos == dictionarySize)
-          dictionaryPos = 0;
-        #else
-        previousByte = outStream[nowPos - rep0];
-        #endif
-        len--;
-        outStream[nowPos++] = previousByte;
-      }
-      while(len != 0 && nowPos < outSize);
-    }
-  }
-  RC_NORMALIZE;
-
-  #ifdef _LZMA_OUT_READ
-  vs->Range = Range;
-  vs->Code = Code;
-  vs->DictionaryPos = dictionaryPos;
-  vs->GlobalPos = globalPos + (UInt32)nowPos;
-  vs->DistanceLimit = distanceLimit;
-  vs->Reps[0] = rep0;
-  vs->Reps[1] = rep1;
-  vs->Reps[2] = rep2;
-  vs->Reps[3] = rep3;
-  vs->State = state;
-  vs->RemainLen = len;
-  vs->TempDictionary[0] = tempDictionary[0];
-  #endif
-
-  #ifdef _LZMA_IN_CB
-  vs->Buffer = Buffer;
-  vs->BufferLim = BufferLim;
-  #else
-  *inSizeProcessed = (SizeT)(Buffer - inStream);
-  #endif
-  *outSizeProcessed = nowPos;
-  return LZMA_RESULT_OK;
-}
diff --git a/lib_generic/lzma/LzmaDecode.h b/lib_generic/lzma/LzmaDecode.h
deleted file mode 100644 (file)
index bd75525..0000000
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
-  LzmaDecode.h
-  LZMA Decoder interface
-
-  LZMA SDK 4.40 Copyright (c) 1999-2006 Igor Pavlov (2006-05-01)
-  http://www.7-zip.org/
-
-  LZMA SDK is licensed under two licenses:
-  1) GNU Lesser General Public License (GNU LGPL)
-  2) Common Public License (CPL)
-  It means that you can select one of these two licenses and
-  follow rules of that license.
-
-  SPECIAL EXCEPTION:
-  Igor Pavlov, as the author of this code, expressly permits you to
-  statically or dynamically link your code (or bind by name) to the
-  interfaces of this file without subjecting your linked code to the
-  terms of the CPL or GNU LGPL. Any modifications or additions
-  to this file, however, are subject to the LGPL or CPL terms.
-*/
-
-#ifndef __LZMADECODE_H
-#define __LZMADECODE_H
-
-#include "LzmaTypes.h"
-
-/* #define _LZMA_IN_CB */
-/* Use callback for input data */
-
-/* #define _LZMA_OUT_READ */
-/* Use read function for output data */
-
-/* #define _LZMA_PROB32 */
-/* It can increase speed on some 32-bit CPUs,
-   but memory usage will be doubled in that case */
-
-/* #define _LZMA_LOC_OPT */
-/* Enable local speed optimizations inside code */
-
-#ifdef _LZMA_PROB32
-#define CProb UInt32
-#else
-#define CProb UInt16
-#endif
-
-#define LZMA_RESULT_OK 0
-#define LZMA_RESULT_DATA_ERROR 1
-
-#ifdef _LZMA_IN_CB
-typedef struct _ILzmaInCallback
-{
-  int (*Read)(void *object, const unsigned char **buffer, SizeT *bufferSize);
-} ILzmaInCallback;
-#endif
-
-#define LZMA_BASE_SIZE 1846
-#define LZMA_LIT_SIZE 768
-
-#define LZMA_PROPERTIES_SIZE 5
-
-typedef struct _CLzmaProperties
-{
-  int lc;
-  int lp;
-  int pb;
-  #ifdef _LZMA_OUT_READ
-  UInt32 DictionarySize;
-  #endif
-}CLzmaProperties;
-
-int LzmaDecodeProperties(CLzmaProperties *propsRes, const unsigned char *propsData, int size);
-
-#define LzmaGetNumProbs(Properties) (LZMA_BASE_SIZE + (LZMA_LIT_SIZE << ((Properties)->lc + (Properties)->lp)))
-
-#define kLzmaNeedInitId (-2)
-
-typedef struct _CLzmaDecoderState
-{
-  CLzmaProperties Properties;
-  CProb *Probs;
-
-  #ifdef _LZMA_IN_CB
-  const unsigned char *Buffer;
-  const unsigned char *BufferLim;
-  #endif
-
-  #ifdef _LZMA_OUT_READ
-  unsigned char *Dictionary;
-  UInt32 Range;
-  UInt32 Code;
-  UInt32 DictionaryPos;
-  UInt32 GlobalPos;
-  UInt32 DistanceLimit;
-  UInt32 Reps[4];
-  int State;
-  int RemainLen;
-  unsigned char TempDictionary[4];
-  #endif
-} CLzmaDecoderState;
-
-#ifdef _LZMA_OUT_READ
-#define LzmaDecoderInit(vs) { (vs)->RemainLen = kLzmaNeedInitId; }
-#endif
-
-int LzmaDecode(CLzmaDecoderState *vs,
-    #ifdef _LZMA_IN_CB
-    ILzmaInCallback *inCallback,
-    #else
-    const unsigned char *inStream, SizeT inSize, SizeT *inSizeProcessed,
-    #endif
-    unsigned char *outStream, SizeT outSize, SizeT *outSizeProcessed);
-
-#endif
index 5ac42e5aed215d4059150e04fd277ceb09721cde..c2a91e528dc8cd7178d170b772337575896d8845 100644 (file)
@@ -1,7 +1,7 @@
 /*
- * Usefuls routines based on the LzmaTest.c file from LZMA SDK 4.57
+ * Usefuls routines based on the LzmaTest.c file from LZMA SDK 4.65
  *
- * Copyright (C) 2007-2008 Industrie Dial Face S.p.A.
+ * Copyright (C) 2007-2009 Industrie Dial Face S.p.A.
  * Luigi 'Comio' Mantellini (luigi.mantellini@idf-hit.com)
  *
  * Copyright (C) 1999-2005 Igor Pavlov
 #ifdef CONFIG_LZMA
 
 #define LZMA_PROPERTIES_OFFSET 0
-#define LZMA_SIZE_OFFSET       LZMA_PROPERTIES_SIZE
+#define LZMA_SIZE_OFFSET       LZMA_PROPS_SIZE
 #define LZMA_DATA_OFFSET       LZMA_SIZE_OFFSET+sizeof(uint64_t)
 
 #include "LzmaTools.h"
-#include "LzmaDecode.h"
+#include "LzmaDec.h"
 
 #include <linux/string.h>
 #include <malloc.h>
 
+static void *SzAlloc(void *p, size_t size) { p = p; return malloc(size); }
+static void SzFree(void *p, void *address) { p = p; free(address); }
+
 int lzmaBuffToBuffDecompress (unsigned char *outStream, SizeT *uncompressedSize,
-                             unsigned char *inStream,  SizeT  length)
+                  unsigned char *inStream,  SizeT  length)
 {
-       int res = LZMA_RESULT_DATA_ERROR;
-       int i;
-
-       SizeT outSizeFull = 0xFFFFFFFF; /* 4GBytes limit */
-       SizeT inProcessed;
-       SizeT outProcessed;
-       SizeT outSize;
-       SizeT outSizeHigh;
-       CLzmaDecoderState state;  /* it's about 24-80 bytes structure, if int is 32-bit */
-       unsigned char properties[LZMA_PROPERTIES_SIZE];
-       SizeT compressedSize = (SizeT)(length - LZMA_DATA_OFFSET);
-
-       debug ("LZMA: Image address............... 0x%lx\n", inStream);
-       debug ("LZMA: Properties address.......... 0x%lx\n", inStream + LZMA_PROPERTIES_OFFSET);
-       debug ("LZMA: Uncompressed size address... 0x%lx\n", inStream + LZMA_SIZE_OFFSET);
-       debug ("LZMA: Compressed data address..... 0x%lx\n", inStream + LZMA_DATA_OFFSET);
-       debug ("LZMA: Destination address......... 0x%lx\n", outStream);
-
-       memcpy(properties, inStream + LZMA_PROPERTIES_OFFSET, LZMA_PROPERTIES_SIZE);
-
-       memset(&state, 0, sizeof(state));
-       res = LzmaDecodeProperties(&state.Properties,
-                                properties,
-                                LZMA_PROPERTIES_SIZE);
-       if (res != LZMA_RESULT_OK) {
-               return res;
-       }
-
-       outSize = 0;
-       outSizeHigh = 0;
-       /* Read the uncompressed size */
-       for (i = 0; i < 8; i++) {
-               unsigned char b = inStream[LZMA_SIZE_OFFSET + i];
-               if (i < 4) {
-                       outSize     += (UInt32)(b) << (i * 8);
-               } else {
-                       outSizeHigh += (UInt32)(b) << ((i - 4) * 8);
-               }
-       }
-
-       outSizeFull = (SizeT)outSize;
-       if (sizeof(SizeT) >= 8) {
-               /*
-                * SizeT is a 64 bit uint => We can manage files larger than 4GB!
-                *
-                */
-               outSizeFull |= (((SizeT)outSizeHigh << 16) << 16);
-       } else if (outSizeHigh != 0 || (UInt32)(SizeT)outSize != outSize) {
-               /*
-                * SizeT is a 32 bit uint => We cannot manage files larger than
-                * 4GB!
-                *
-                */
-               debug ("LZMA: 64bit support not enabled.\n");
-               return LZMA_RESULT_DATA_ERROR;
-       }
-
-       debug ("LZMA: Uncompresed size............ 0x%lx\n", outSizeFull);
-       debug ("LZMA: Compresed size.............. 0x%lx\n", compressedSize);
-       debug ("LZMA: Dynamic memory needed....... 0x%lx", LzmaGetNumProbs(&state.Properties) * sizeof(CProb));
-
-       state.Probs = (CProb *)malloc(LzmaGetNumProbs(&state.Properties) * sizeof(CProb));
-
-       if (state.Probs == 0
-           || (outStream == 0 && outSizeFull != 0)
-           || (inStream == 0 && compressedSize != 0)) {
-               free(state.Probs);
-               debug ("\n");
-               return LZMA_RESULT_DATA_ERROR;
-       }
-
-       debug (" allocated.\n");
-
-       /* Decompress */
-
-       res = LzmaDecode(&state,
-               inStream + LZMA_DATA_OFFSET, compressedSize, &inProcessed,
-               outStream, outSizeFull,  &outProcessed);
-       if (res != LZMA_RESULT_OK)  {
-               return res;
-       }
-
-       *uncompressedSize = outProcessed;
-       free(state.Probs);
-       return res;
+    int res = SZ_ERROR_DATA;
+    int i;
+    ISzAlloc g_Alloc;
+
+    SizeT outSizeFull = 0xFFFFFFFF; /* 4GBytes limit */
+    SizeT inProcessed;
+    SizeT outProcessed;
+    SizeT outSize;
+    SizeT outSizeHigh;
+    ELzmaStatus state;
+    SizeT compressedSize = (SizeT)(length - LZMA_PROPS_SIZE);
+
+    debug ("LZMA: Image address............... 0x%lx\n", inStream);
+    debug ("LZMA: Properties address.......... 0x%lx\n", inStream + LZMA_PROPERTIES_OFFSET);
+    debug ("LZMA: Uncompressed size address... 0x%lx\n", inStream + LZMA_SIZE_OFFSET);
+    debug ("LZMA: Compressed data address..... 0x%lx\n", inStream + LZMA_DATA_OFFSET);
+    debug ("LZMA: Destination address......... 0x%lx\n", outStream);
+
+    memset(&state, 0, sizeof(state));
+
+    outSize = 0;
+    outSizeHigh = 0;
+    /* Read the uncompressed size */
+    for (i = 0; i < 8; i++) {
+        unsigned char b = inStream[LZMA_SIZE_OFFSET + i];
+            if (i < 4) {
+                outSize     += (UInt32)(b) << (i * 8);
+        } else {
+                outSizeHigh += (UInt32)(b) << ((i - 4) * 8);
+        }
+    }
+
+    outSizeFull = (SizeT)outSize;
+    if (sizeof(SizeT) >= 8) {
+        /*
+         * SizeT is a 64 bit uint => We can manage files larger than 4GB!
+         *
+         */
+            outSizeFull |= (((SizeT)outSizeHigh << 16) << 16);
+    } else if (outSizeHigh != 0 || (UInt32)(SizeT)outSize != outSize) {
+        /*
+         * SizeT is a 32 bit uint => We cannot manage files larger than
+         * 4GB!
+         *
+         */
+        debug ("LZMA: 64bit support not enabled.\n");
+        return SZ_ERROR_DATA;
+    }
+
+    debug ("LZMA: Uncompresed size............ 0x%lx\n", outSizeFull);
+    debug ("LZMA: Compresed size.............. 0x%lx\n", compressedSize);
+
+    g_Alloc.Alloc = SzAlloc;
+    g_Alloc.Free = SzFree;
+
+    /* Decompress */
+    outProcessed = outSizeFull;
+    res = LzmaDecode(
+        outStream, &outProcessed,
+        inStream + LZMA_DATA_OFFSET, &compressedSize,
+        inStream, LZMA_PROPS_SIZE, LZMA_FINISH_ANY, &state, &g_Alloc);
+    *uncompressedSize = outProcessed;
+    if (res != SZ_OK)  {
+        return res;
+    }
+
+    return res;
 }
 
 #endif
index c91fb899cb0f174a93643102ffc023943f60ee11..2db80fc0f47049366f7b4c792e12d25291652ae1 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Usefuls routines based on the LzmaTest.c file from LZMA SDK 4.57
+ * Usefuls routines based on the LzmaTest.c file from LZMA SDK 4.65
  *
  * Copyright (C) 2007-2008 Industrie Dial Face S.p.A.
  * Luigi 'Comio' Mantellini (luigi.mantellini@idf-hit.com)
@@ -28,7 +28,7 @@
 #ifndef __LZMA_TOOL_H__
 #define __LZMA_TOOL_H__
 
-#include "LzmaTypes.h"
+#include <lzma/LzmaTypes.h>
 
 extern int lzmaBuffToBuffDecompress (unsigned char *outStream, SizeT *uncompressedSize,
                              unsigned char *inStream,  SizeT  length);
diff --git a/lib_generic/lzma/LzmaTypes.h b/lib_generic/lzma/LzmaTypes.h
deleted file mode 100644 (file)
index 83f96f4..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
-LzmaTypes.h
-
-Types for LZMA Decoder
-
-This file written and distributed to public domain by Igor Pavlov.
-This file is part of LZMA SDK 4.40 (2006-05-01)
-*/
-
-#ifndef __LZMATYPES_H
-#define __LZMATYPES_H
-
-#ifndef _7ZIP_BYTE_DEFINED
-#define _7ZIP_BYTE_DEFINED
-typedef unsigned char Byte;
-#endif
-
-#ifndef _7ZIP_UINT16_DEFINED
-#define _7ZIP_UINT16_DEFINED
-typedef unsigned short UInt16;
-#endif
-
-#ifndef _7ZIP_UINT32_DEFINED
-#define _7ZIP_UINT32_DEFINED
-#ifdef _LZMA_UINT32_IS_ULONG
-typedef unsigned long UInt32;
-#else
-typedef unsigned int UInt32;
-#endif
-#endif
-
-/* #define _LZMA_NO_SYSTEM_SIZE_T */
-/* You can use it, if you don't want <stddef.h> */
-
-#ifndef _7ZIP_SIZET_DEFINED
-#define _7ZIP_SIZET_DEFINED
-#ifdef _LZMA_NO_SYSTEM_SIZE_T
-typedef UInt32 SizeT;
-#else
-#include <stddef.h>
-typedef size_t SizeT;
-#endif
-#endif
-
-#endif
index 3400cd929f548be3773815aad0abc151a5582e3c..2916f215b03f5f1dd4dca3a5f135ec36ab4e30c5 100644 (file)
@@ -30,7 +30,9 @@ LIB   = $(obj)liblzma.a
 
 SOBJS  =
 
-COBJS-$(CONFIG_LZMA) += LzmaDecode.o LzmaTools.o
+CFLAGS += -D_LZMA_PROB32 -I$(TOPDIR)/include/linux
+
+COBJS-$(CONFIG_LZMA) += LzmaDec.o LzmaTools.o
 
 COBJS  = $(COBJS-y)
 SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
index fdb3086f477b6090aded9a3788558fc72a9b2f38..23a9be2827343283bcbf54cc79ddd3b0332a14ea 100644 (file)
@@ -7,14 +7,14 @@ Author:         Igor Pavlov
 The import is made using the import_lzmasdk.sh script that:
 
 * untars the lzmaXYY.tar.bz2 file (from the download web page)
-* copies the files LzmaDecode.h, LzmaTypes.h, LzmaDecode.c, history.txt,
-  LGPL.txt, and lzma.txt from source archive into the lib_lzma directory (pwd).
+* copies the files LzmaDec.h, Types.h, LzmaDec.c, history.txt,
+  and lzma.txt from source archive into the lib_lzma directory (pwd).
 
 Example:
 
- ./import_lzmasdk.sh ~/lzma457.tar.bz2
+ . import_lzmasdk.sh ~/lzma465.tar.bz2
 
-Notice: The files from lzma sdk are not _modified_ by this script!
+Notice: The files from lzma sdk are _not modified_ by this script!
 
 The files LzmaTools.{c,h} are provided to export the lzmaBuffToBuffDecompress()
 function that wraps the complex LzmaDecode() function from the LZMA SDK. The
diff --git a/lib_generic/lzma/Types.h b/lib_generic/lzma/Types.h
new file mode 100644 (file)
index 0000000..1af5cfc
--- /dev/null
@@ -0,0 +1,208 @@
+/* Types.h -- Basic types
+2008-11-23 : Igor Pavlov : Public domain */
+
+#ifndef __7Z_TYPES_H
+#define __7Z_TYPES_H
+
+#include <stddef.h>
+
+#ifdef _WIN32
+#include <windows.h>
+#endif
+
+#define SZ_OK 0
+
+#define SZ_ERROR_DATA 1
+#define SZ_ERROR_MEM 2
+#define SZ_ERROR_CRC 3
+#define SZ_ERROR_UNSUPPORTED 4
+#define SZ_ERROR_PARAM 5
+#define SZ_ERROR_INPUT_EOF 6
+#define SZ_ERROR_OUTPUT_EOF 7
+#define SZ_ERROR_READ 8
+#define SZ_ERROR_WRITE 9
+#define SZ_ERROR_PROGRESS 10
+#define SZ_ERROR_FAIL 11
+#define SZ_ERROR_THREAD 12
+
+#define SZ_ERROR_ARCHIVE 16
+#define SZ_ERROR_NO_ARCHIVE 17
+
+typedef int SRes;
+
+#ifdef _WIN32
+typedef DWORD WRes;
+#else
+typedef int WRes;
+#endif
+
+#ifndef RINOK
+#define RINOK(x) { int __result__ = (x); if (__result__ != 0) return __result__; }
+#endif
+
+typedef unsigned char Byte;
+typedef short Int16;
+typedef unsigned short UInt16;
+
+#ifdef _LZMA_UINT32_IS_ULONG
+typedef long Int32;
+typedef unsigned long UInt32;
+#else
+typedef int Int32;
+typedef unsigned int UInt32;
+#endif
+
+#ifdef _SZ_NO_INT_64
+
+/* define _SZ_NO_INT_64, if your compiler doesn't support 64-bit integers.
+   NOTES: Some code will work incorrectly in that case! */
+
+typedef long Int64;
+typedef unsigned long UInt64;
+
+#else
+
+#if defined(_MSC_VER) || defined(__BORLANDC__)
+typedef __int64 Int64;
+typedef unsigned __int64 UInt64;
+#else
+typedef long long int Int64;
+typedef unsigned long long int UInt64;
+#endif
+
+#endif
+
+#ifdef _LZMA_NO_SYSTEM_SIZE_T
+typedef UInt32 SizeT;
+#else
+typedef size_t SizeT;
+#endif
+
+typedef int Bool;
+#define True 1
+#define False 0
+
+
+#ifdef _MSC_VER
+
+#if _MSC_VER >= 1300
+#define MY_NO_INLINE __declspec(noinline)
+#else
+#define MY_NO_INLINE
+#endif
+
+#define MY_CDECL __cdecl
+#define MY_STD_CALL __stdcall
+#define MY_FAST_CALL MY_NO_INLINE __fastcall
+
+#else
+
+#define MY_CDECL
+#define MY_STD_CALL
+#define MY_FAST_CALL
+
+#endif
+
+
+/* The following interfaces use first parameter as pointer to structure */
+
+typedef struct
+{
+  SRes (*Read)(void *p, void *buf, size_t *size);
+    /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream.
+       (output(*size) < input(*size)) is allowed */
+} ISeqInStream;
+
+/* it can return SZ_ERROR_INPUT_EOF */
+SRes SeqInStream_Read(ISeqInStream *stream, void *buf, size_t size);
+SRes SeqInStream_Read2(ISeqInStream *stream, void *buf, size_t size, SRes errorType);
+SRes SeqInStream_ReadByte(ISeqInStream *stream, Byte *buf);
+
+typedef struct
+{
+  size_t (*Write)(void *p, const void *buf, size_t size);
+    /* Returns: result - the number of actually written bytes.
+       (result < size) means error */
+} ISeqOutStream;
+
+typedef enum
+{
+  SZ_SEEK_SET = 0,
+  SZ_SEEK_CUR = 1,
+  SZ_SEEK_END = 2
+} ESzSeek;
+
+typedef struct
+{
+  SRes (*Read)(void *p, void *buf, size_t *size);  /* same as ISeqInStream::Read */
+  SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin);
+} ISeekInStream;
+
+typedef struct
+{
+  SRes (*Look)(void *p, void **buf, size_t *size);
+    /* if (input(*size) != 0 && output(*size) == 0) means end_of_stream.
+       (output(*size) > input(*size)) is not allowed
+       (output(*size) < input(*size)) is allowed */
+  SRes (*Skip)(void *p, size_t offset);
+    /* offset must be <= output(*size) of Look */
+
+  SRes (*Read)(void *p, void *buf, size_t *size);
+    /* reads directly (without buffer). It's same as ISeqInStream::Read */
+  SRes (*Seek)(void *p, Int64 *pos, ESzSeek origin);
+} ILookInStream;
+
+SRes LookInStream_LookRead(ILookInStream *stream, void *buf, size_t *size);
+SRes LookInStream_SeekTo(ILookInStream *stream, UInt64 offset);
+
+/* reads via ILookInStream::Read */
+SRes LookInStream_Read2(ILookInStream *stream, void *buf, size_t size, SRes errorType);
+SRes LookInStream_Read(ILookInStream *stream, void *buf, size_t size);
+
+#define LookToRead_BUF_SIZE (1 << 14)
+
+typedef struct
+{
+  ILookInStream s;
+  ISeekInStream *realStream;
+  size_t pos;
+  size_t size;
+  Byte buf[LookToRead_BUF_SIZE];
+} CLookToRead;
+
+void LookToRead_CreateVTable(CLookToRead *p, int lookahead);
+void LookToRead_Init(CLookToRead *p);
+
+typedef struct
+{
+  ISeqInStream s;
+  ILookInStream *realStream;
+} CSecToLook;
+
+void SecToLook_CreateVTable(CSecToLook *p);
+
+typedef struct
+{
+  ISeqInStream s;
+  ILookInStream *realStream;
+} CSecToRead;
+
+void SecToRead_CreateVTable(CSecToRead *p);
+
+typedef struct
+{
+  SRes (*Progress)(void *p, UInt64 inSize, UInt64 outSize);
+    /* Returns: result. (result != SZ_OK) means break.
+       Value (UInt64)(Int64)-1 for size means unknown value. */
+} ICompressProgress;
+
+typedef struct
+{
+  void *(*Alloc)(void *p, size_t size);
+  void (*Free)(void *p, void *address); /* address can be 0 */
+} ISzAlloc;
+
+#define IAlloc_Alloc(p, size) (p)->Alloc((p), size)
+#define IAlloc_Free(p, a) (p)->Free((p), a)
+
+#endif
index dad18581e41be8e03651de02d59093dec14485b8..624fb1d4b1db6bd9f37443b8d851e51307918204 100644 (file)
 HISTORY of the LZMA SDK
 -----------------------
 
-  4.57          2007-12-12
-  -------------------------
-    - Speed optimizations in Ã‘++ LZMA Decoder.
-    - Small changes for more compatibility with some C/C++ compilers.
+4.65           2009-02-03
+-------------------------
+- Some minor fixes
 
 
-  4.49 beta     2007-07-05
-  -------------------------
-    - .7z ANSI-C Decoder:
-        - now it supports BCJ and BCJ2 filters
-        - now it supports files larger than 4 GB.
-        - now it supports "Last Write Time" field for files.
-    - C++ code for .7z archives compressing/decompressing from 7-zip
-      was included to LZMA SDK.
+4.63           2008-12-31
+-------------------------
+- Some minor fixes
 
 
-  4.43          2006-06-04
-  -------------------------
-    - Small changes for more compatibility with some C/C++ compilers.
+4.61 beta      2008-11-23
+-------------------------
+- The bug in ANSI-C LZMA Decoder was fixed:
+    If encoded stream was corrupted, decoder could access memory
+    outside of allocated range.
+- Some changes in ANSI-C 7z Decoder interfaces.
+- LZMA SDK is placed in the public domain.
 
 
-  4.42          2006-05-15
-  -------------------------
-    - Small changes in .h files in ANSI-C version.
+4.60 beta      2008-08-19
+-------------------------
+- Some minor fixes.
 
 
-  4.39 beta     2006-04-14
-  -------------------------
-    - Bug in versions 4.33b:4.38b was fixed:
-      C++ version of LZMA encoder could not correctly compress
-      files larger than 2 GB with HC4 match finder (-mfhc4).
+4.59 beta      2008-08-13
+-------------------------
+- The bug was fixed:
+    LZMA Encoder in fast compression mode could access memory outside of
+    allocated range in some rare cases.
 
 
-  4.37 beta     2005-04-06
-  -------------------------
-    - Fixes in C++ code: code could no be compiled if _NO_EXCEPTIONS was defined.
+4.58 beta      2008-05-05
+-------------------------
+- ANSI-C LZMA Decoder was rewritten for speed optimizations.
+- ANSI-C LZMA Encoder was included to LZMA SDK.
+- C++ LZMA code now is just wrapper over ANSI-C code.
 
 
-  4.35 beta     2005-03-02
-  -------------------------
-    - Bug was fixed in C++ version of LZMA Decoder:
-       If encoded stream was corrupted, decoder could access memory
-       outside of allocated range.
+4.57           2007-12-12
+-------------------------
+- Speed optimizations in Ã‘++ LZMA Decoder.
+- Small changes for more compatibility with some C/C++ compilers.
 
 
-  4.34 beta     2006-02-27
-  -------------------------
-    - Compressing speed and memory requirements for compressing were increased
-    - LZMA now can use only these match finders: HC4, BT2, BT3, BT4
+4.49 beta      2007-07-05
+-------------------------
+- .7z ANSI-C Decoder:
+     - now it supports BCJ and BCJ2 filters
+     - now it supports files larger than 4 GB.
+     - now it supports "Last Write Time" field for files.
+- C++ code for .7z archives compressing/decompressing from 7-zip
+  was included to LZMA SDK.
 
 
-  4.32          2005-12-09
-  -------------------------
-    - Java version of LZMA SDK was included
+4.43           2006-06-04
+-------------------------
+- Small changes for more compatibility with some C/C++ compilers.
 
 
-  4.30          2005-11-20
-  -------------------------
-    - Compression ratio was improved in -a2 mode
-    - Speed optimizations for compressing in -a2 mode
-    - -fb switch now supports values up to 273
-    - Bug in 7z_C (7zIn.c) was fixed:
-      It used Alloc/Free functions from different memory pools.
-      So if program used two memory pools, it worked incorrectly.
-    - 7z_C: .7z format supporting was improved
-    - LZMA# SDK (C#.NET version) was included
+4.42           2006-05-15
+-------------------------
+- Small changes in .h files in ANSI-C version.
 
 
-  4.27 (Updated) 2005-09-21
-  -------------------------
-   - Some GUIDs/interfaces in C++ were changed.
-     IStream.h:
-       ISequentialInStream::Read now works as old ReadPart
-       ISequentialOutStream::Write now works as old WritePart
+4.39 beta      2006-04-14
+-------------------------
+- The bug in versions 4.33b:4.38b was fixed:
+  C++ version of LZMA encoder could not correctly compress
+  files larger than 2 GB with HC4 match finder (-mfhc4).
 
 
-  4.27          2005-08-07
-  -------------------------
-    - Bug in LzmaDecodeSize.c was fixed:
-       if _LZMA_IN_CB and _LZMA_OUT_READ were defined,
-       decompressing worked incorrectly.
+4.37 beta      2005-04-06
+-------------------------
+- Fixes in C++ code: code could no be compiled if _NO_EXCEPTIONS was defined.
 
 
-  4.26          2005-08-05
-  -------------------------
-    - Fixes in 7z_C code and LzmaTest.c:
-      previous versions could work incorrectly,
-      if malloc(0) returns 0
+4.35 beta      2005-03-02
+-------------------------
+- The bug was fixed in C++ version of LZMA Decoder:
+    If encoded stream was corrupted, decoder could access memory
+    outside of allocated range.
 
 
-  4.23          2005-06-29
-  -------------------------
-    - Small fixes in C++ code
+4.34 beta      2006-02-27
+-------------------------
+- Compressing speed and memory requirements for compressing were increased
+- LZMA now can use only these match finders: HC4, BT2, BT3, BT4
 
 
-  4.22          2005-06-10
-  -------------------------
-    - Small fixes
+4.32           2005-12-09
+-------------------------
+- Java version of LZMA SDK was included
 
 
-  4.21          2005-06-08
-  -------------------------
-    - Interfaces for ANSI-C LZMA Decoder (LzmaDecode.c) were changed
-    - New additional version of ANSI-C LZMA Decoder with zlib-like interface:
-       - LzmaStateDecode.h
-       - LzmaStateDecode.c
-       - LzmaStateTest.c
-    - ANSI-C LZMA Decoder now can decompress files larger than 4 GB
+4.30           2005-11-20
+-------------------------
+- Compression ratio was improved in -a2 mode
+- Speed optimizations for compressing in -a2 mode
+- -fb switch now supports values up to 273
+- The bug in 7z_C (7zIn.c) was fixed:
+  It used Alloc/Free functions from different memory pools.
+  So if program used two memory pools, it worked incorrectly.
+- 7z_C: .7z format supporting was improved
+- LZMA# SDK (C#.NET version) was included
 
 
-  4.17          2005-04-18
-  -------------------------
-    - New example for RAM->RAM compressing/decompressing:
-      LZMA + BCJ (filter for x86 code):
-       - LzmaRam.h
-       - LzmaRam.cpp
-       - LzmaRamDecode.h
-       - LzmaRamDecode.c
-       - -f86 switch for lzma.exe
+4.27 (Updated) 2005-09-21
+-------------------------
+- Some GUIDs/interfaces in C++ were changed.
+ IStream.h:
+   ISequentialInStream::Read now works as old ReadPart
+   ISequentialOutStream::Write now works as old WritePart
 
 
-  4.16          2005-03-29
-  -------------------------
-    - Bug was fixed in LzmaDecode.c (ANSI-C LZMA Decoder):
-       If _LZMA_OUT_READ was defined, and if encoded stream was corrupted,
-       decoder could access memory outside of allocated range.
-    - Speed optimization of ANSI-C LZMA Decoder (now it's about 20% faster).
-      Old version of LZMA Decoder now is in file LzmaDecodeSize.c.
-      LzmaDecodeSize.c can provide slightly smaller code than LzmaDecode.c
-    - Small speed optimization in LZMA C++ code
-    - filter for SPARC's code was added
-    - Simplified version of .7z ANSI-C Decoder was included
+4.27           2005-08-07
+-------------------------
+- The bug in LzmaDecodeSize.c was fixed:
+   if _LZMA_IN_CB and _LZMA_OUT_READ were defined,
+   decompressing worked incorrectly.
 
 
-  4.06          2004-09-05
-  -------------------------
-    - Bug in v4.05 was fixed:
-       LZMA-Encoder didn't release output stream in some cases.
+4.26           2005-08-05
+-------------------------
+- Fixes in 7z_C code and LzmaTest.c:
+  previous versions could work incorrectly,
+  if malloc(0) returns 0
 
 
-  4.05          2004-08-25
-  -------------------------
-    - Source code of filters for x86, IA-64, ARM, ARM-Thumb
-      and PowerPC code was included to SDK
-    - Some internal minor changes
+4.23           2005-06-29
+-------------------------
+- Small fixes in C++ code
 
 
-  4.04          2004-07-28
-  -------------------------
-    - More compatibility with some C++ compilers
+4.22           2005-06-10
+-------------------------
+- Small fixes
 
 
-  4.03          2004-06-18
-  -------------------------
-    - "Benchmark" command was added. It measures compressing
-      and decompressing speed and shows rating values.
-      Also it checks hardware errors.
+4.21           2005-06-08
+-------------------------
+- Interfaces for ANSI-C LZMA Decoder (LzmaDecode.c) were changed
+- New additional version of ANSI-C LZMA Decoder with zlib-like interface:
+    - LzmaStateDecode.h
+    - LzmaStateDecode.c
+    - LzmaStateTest.c
+- ANSI-C LZMA Decoder now can decompress files larger than 4 GB
 
 
-  4.02          2004-06-10
-  -------------------------
-    - C++ LZMA Encoder/Decoder code now is more portable
-      and it can be compiled by GCC on Linux.
+4.17           2005-04-18
+-------------------------
+- New example for RAM->RAM compressing/decompressing:
+  LZMA + BCJ (filter for x86 code):
+    - LzmaRam.h
+    - LzmaRam.cpp
+    - LzmaRamDecode.h
+    - LzmaRamDecode.c
+    - -f86 switch for lzma.exe
 
 
-  4.01          2004-02-15
-  -------------------------
-    - Some detection of data corruption was enabled.
-       LzmaDecode.c / RangeDecoderReadByte
-       .....
-       {
-         rd->ExtraBytes = 1;
-         return 0xFF;
-       }
+4.16           2005-03-29
+-------------------------
+- The bug was fixed in LzmaDecode.c (ANSI-C LZMA Decoder):
+   If _LZMA_OUT_READ was defined, and if encoded stream was corrupted,
+   decoder could access memory outside of allocated range.
+- Speed optimization of ANSI-C LZMA Decoder (now it's about 20% faster).
+  Old version of LZMA Decoder now is in file LzmaDecodeSize.c.
+  LzmaDecodeSize.c can provide slightly smaller code than LzmaDecode.c
+- Small speed optimization in LZMA C++ code
+- filter for SPARC's code was added
+- Simplified version of .7z ANSI-C Decoder was included
 
 
-  4.00          2004-02-13
-  -------------------------
-    - Original version of LZMA SDK
+4.06           2004-09-05
+-------------------------
+- The bug in v4.05 was fixed:
+    LZMA-Encoder didn't release output stream in some cases.
+
+
+4.05           2004-08-25
+-------------------------
+- Source code of filters for x86, IA-64, ARM, ARM-Thumb
+  and PowerPC code was included to SDK
+- Some internal minor changes
+
+
+4.04           2004-07-28
+-------------------------
+- More compatibility with some C++ compilers
+
+
+4.03           2004-06-18
+-------------------------
+- "Benchmark" command was added. It measures compressing
+  and decompressing speed and shows rating values.
+  Also it checks hardware errors.
+
+
+4.02           2004-06-10
+-------------------------
+- C++ LZMA Encoder/Decoder code now is more portable
+  and it can be compiled by GCC on Linux.
+
+
+4.01           2004-02-15
+-------------------------
+- Some detection of data corruption was enabled.
+    LzmaDecode.c / RangeDecoderReadByte
+    .....
+    {
+      rd->ExtraBytes = 1;
+      return 0xFF;
+    }
+
+
+4.00           2004-02-13
+-------------------------
+- Original version of LZMA SDK
 
 
 
 HISTORY of the LZMA
 -------------------
-  2001-2007:  Improvements to LZMA compressing/decompressing code,
-             keeping compatibility with original LZMA format
+  2001-2008:  Improvements to LZMA compressing/decompressing code,
+              keeping compatibility with original LZMA format
   1996-2001:  Development of LZMA compression format
 
   Some milestones:
index 5212e4849ca460a524ae58ac64d8d875642c9626..1e0f6863aab778bbc1cfe2f4ce9fa3a0963ae96d 100644 (file)
@@ -17,14 +17,12 @@ fi
 
 BASENAME=`basename $1 .tar.bz2`
 TMPDIR=/tmp/tmp_lib_$BASENAME
-FILES="C/Compress/Lzma/LzmaDecode.h
-      C/Compress/Lzma/LzmaTypes.h
-      C/Compress/Lzma/LzmaDecode.c
+FILES="C/LzmaDec.h
+      C/Types.h
+      C/LzmaDec.c
       history.txt
-      LGPL.txt
       lzma.txt"
 
-
 mkdir -p $TMPDIR
 echo "Untar $1 -> $TMPDIR"
 tar -jxf $1 -C $TMPDIR
diff --git a/lib_generic/lzma/license.txt b/lib_generic/lzma/license.txt
new file mode 100644 (file)
index 0000000..48b9820
--- /dev/null
@@ -0,0 +1,3 @@
+               License
+
+LZMA SDK is placed in the public domain.
index 5f1a0c994c44d60fc2930c99719c60a1cfe034cd..aa20f9dc5ce902f594db59e505aec9801136d675 100644 (file)
@@ -1,8 +1,6 @@
-LZMA SDK 4.57
+LZMA SDK 4.65
 -------------
 
-LZMA SDK   Copyright (C) 1999-2007 Igor Pavlov
-
 LZMA SDK provides the documentation, samples, header files, libraries,
 and tools you need to develop applications that use LZMA compression.
 
@@ -20,70 +18,7 @@ decompressing.
 LICENSE
 -------
 
-LZMA SDK is available under any of the following licenses:
-
-1) GNU Lesser General Public License (GNU LGPL)
-2) Common Public License (CPL)
-3) Simplified license for unmodified code (read SPECIAL EXCEPTION)
-4) Proprietary license
-
-It means that you can select one of these four options and follow rules of that license.
-
-
-1,2) GNU LGPL and CPL licenses are pretty similar and both these
-licenses are classified as
- - "Free software licenses" at http://www.gnu.org/
- - "OSI-approved" at http://www.opensource.org/
-
-
-3) SPECIAL EXCEPTION
-
-Igor Pavlov, as the author of this code, expressly permits you
-to statically or dynamically link your code (or bind by name)
-to the files from LZMA SDK without subjecting your linked
-code to the terms of the CPL or GNU LGPL.
-Any modifications or additions to files from LZMA SDK, however,
-are subject to the GNU LGPL or CPL terms.
-
-SPECIAL EXCEPTION allows you to use LZMA SDK in applications with closed code,
-while you keep LZMA SDK code unmodified.
-
-
-SPECIAL EXCEPTION #2: Igor Pavlov, as the author of this code, expressly permits
-you to use this code under the same terms and conditions contained in the License
-Agreement you have for any previous version of LZMA SDK developed by Igor Pavlov.
-
-SPECIAL EXCEPTION #2 allows owners of proprietary licenses to use latest version
-of LZMA SDK as update for previous versions.
-
-
-SPECIAL EXCEPTION #3: Igor Pavlov, as the author of this code, expressly permits
-you to use code of the following files:
-BranchTypes.h, LzmaTypes.h, LzmaTest.c, LzmaStateTest.c, LzmaAlone.cpp,
-LzmaAlone.cs, LzmaAlone.java
-as public domain code.
-
-
-4) Proprietary license
-
-LZMA SDK also can be available under a proprietary license which
-can include:
-
-1) Right to modify code without subjecting modified code to the
-terms of the CPL or GNU LGPL
-2) Technical support for code
-
-To request such proprietary license or any additional consultations,
-send email message from that page:
-http://www.7-zip.org/support.html
-
-
-You should have received a copy of the GNU Lesser General Public
-License along with this library; if not, write to the Free Software
-Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-You should have received a copy of the Common Public License
-along with this library.
+LZMA SDK is written and placed in the public domain by Igor Pavlov.
 
 
 LZMA SDK Contents
@@ -91,87 +26,71 @@ LZMA SDK Contents
 
 LZMA SDK includes:
 
-  - C++ source code of LZMA compressing and decompressing
-  - ANSI-C compatible source code for LZMA decompressing
-  - C# source code for LZMA compressing and decompressing
-  - Java source code for LZMA compressing and decompressing
+  - ANSI-C/C++/C#/Java source code for LZMA compressing and decompressing
   - Compiled file->file LZMA compressing/decompressing program for Windows system
 
-ANSI-C LZMA decompression code was ported from original C++ sources to C.
-Also it was simplified and optimized for code size.
-But it is fully compatible with LZMA from 7-Zip.
-
 
 UNIX/Linux version
 ------------------
-To compile C++ version of file->file LZMA, go to directory
-C/7zip/Compress/LZMA_Alone
-and type "make" or "make clean all" to recompile all.
+To compile C++ version of file->file LZMA encoding, go to directory
+C++/7zip/Compress/LZMA_Alone
+and call make to recompile it:
+  make -f makefile.gcc clean all
 
 In some UNIX/Linux versions you must compile LZMA with static libraries.
-To compile with static libraries, change string in makefile
-LIB = -lm
-to string
+To compile with static libraries, you can use
 LIB = -lm -static
 
 
 Files
 ---------------------
-C       - C source code
-CPP     - CPP source code
-CS      - C# source code
-Java    - Java source code
-lzma.txt - LZMA SDK description (this file)
+lzma.txt     - LZMA SDK description (this file)
 7zFormat.txt - 7z Format description
-7zC.txt  - 7z ANSI-C Decoder description (this file)
+7zC.txt      - 7z ANSI-C Decoder description
 methods.txt  - Compression method IDs for .7z
-LGPL.txt - GNU Lesser General Public License
-CPL.html - Common Public License
-lzma.exe - Compiled file->file LZMA encoder/decoder for Windows
-history.txt - history of the LZMA SDK
+lzma.exe     - Compiled file->file LZMA encoder/decoder for Windows
+history.txt  - history of the LZMA SDK
 
 
 Source code structure
 ---------------------
 
-C  - C files
-    Compress - files related to compression/decompression
-      Lz     - files related to LZ (Lempel-Ziv) compression algorithm
-      Lzma   - ANSI-C compatible LZMA decompressor
+C/  - C files
+        7zCrc*.*   - CRC code
+        Alloc.*    - Memory allocation functions
+        Bra*.*     - Filters for x86, IA-64, ARM, ARM-Thumb, PowerPC and SPARC code
+        LzFind.*   - Match finder for LZ (LZMA) encoders
+        LzFindMt.* - Match finder for LZ (LZMA) encoders for multithreading encoding
+        LzHash.h   - Additional file for LZ match finder
+        LzmaDec.*  - LZMA decoding
+        LzmaEnc.*  - LZMA encoding
+        LzmaLib.*  - LZMA Library for DLL calling
+        Types.h    - Basic types for another .c files
+       Threads.*  - The code for multithreading.
 
-       LzmaDecode.h  - interface for LZMA decoding on ANSI-C
-       LzmaDecode.c      - LZMA decoding on ANSI-C (new fastest version)
-       LzmaDecodeSize.c  - LZMA decoding on ANSI-C (old size-optimized version)
-       LzmaTest.c        - test application that decodes LZMA encoded file
-       LzmaTypes.h       - basic types for LZMA Decoder
-       LzmaStateDecode.h - interface for LZMA decoding (State version)
-       LzmaStateDecode.c - LZMA decoding on ANSI-C (State version)
-       LzmaStateTest.c   - test application (State version)
+    LzmaLib  - LZMA Library (.DLL for Windows)
 
-      Branch      - Filters for x86, IA-64, ARM, ARM-Thumb, PowerPC and SPARC code
+    LzmaUtil - LZMA Utility (file->file LZMA encoder/decoder).
 
     Archive - files related to archiving
-      7z_C     - 7z ANSI-C Decoder
-
+      7z     - 7z ANSI-C Decoder
 
-CPP -- CPP files
+CPP/ -- CPP files
 
   Common  - common files for C++ projects
   Windows - common files for Windows related code
-  7zip   - files related to 7-Zip Project
+
+  7zip    - files related to 7-Zip Project
 
     Common   - common files for 7-Zip
 
     Compress - files related to compression/decompression
 
-      LZ     - files related to LZ (Lempel-Ziv) compression algorithm
-
-      Copy        - Copy coder
+      Copy         - Copy coder
       RangeCoder   - Range Coder (special code of compression/decompression)
-      LZMA        - LZMA compression/decompression on C++
+      LZMA         - LZMA compression/decompression on C++
       LZMA_Alone   - file->file LZMA compression/decompression
-
-      Branch      - Filters for x86, IA-64, ARM, ARM-Thumb, PowerPC and SPARC code
+      Branch       - Filters for x86, IA-64, ARM, ARM-Thumb, PowerPC and SPARC code
 
     Archive - files related to archiving
 
@@ -180,67 +99,61 @@ CPP -- CPP files
 
     Bundles    - Modules that are bundles of other modules
 
-      Alone7z          - 7zr.exe: Standalone version of 7z.exe that supports only 7z/LZMA/BCJ/BCJ2
-      Format7zR                - 7zr.dll: Reduced version of 7za.dll: extracting/compressing to 7z/LZMA/BCJ/BCJ2
-      Format7zExtractR - 7zxr.dll: Reduced version of 7zxa.dll: extracting from 7z/LZMA/BCJ/BCJ2.
+      Alone7z           - 7zr.exe: Standalone version of 7z.exe that supports only 7z/LZMA/BCJ/BCJ2
+      Format7zR         - 7zr.dll: Reduced version of 7za.dll: extracting/compressing to 7z/LZMA/BCJ/BCJ2
+      Format7zExtractR  - 7zxr.dll: Reduced version of 7zxa.dll: extracting from 7z/LZMA/BCJ/BCJ2.
 
-    UI       - User Interface files
+    UI        - User Interface files
 
-      Client7z - Test application for 7za.dll, 7zr.dll, 7zxr.dll
+      Client7z - Test application for 7za.dll,  7zr.dll, 7zxr.dll
       Common   - Common UI files
       Console  - Code for console archiver
 
 
 
-CS - C# files
+CS/ - C# files
   7zip
     Common   - some common files for 7-Zip
     Compress - files related to compression/decompression
       LZ     - files related to LZ (Lempel-Ziv) compression algorithm
-      LZMA        - LZMA compression/decompression
+      LZMA         - LZMA compression/decompression
       LzmaAlone    - file->file LZMA compression/decompression
       RangeCoder   - Range Coder (special code of compression/decompression)
 
-Java  - Java files
+Java/  - Java files
   SevenZip
     Compression    - files related to compression/decompression
-      LZ          - files related to LZ (Lempel-Ziv) compression algorithm
-      LZMA        - LZMA compression/decompression
+      LZ           - files related to LZ (Lempel-Ziv) compression algorithm
+      LZMA         - LZMA compression/decompression
       RangeCoder   - Range Coder (special code of compression/decompression)
 
-C/C++ source code of LZMA SDK is part of 7-Zip project.
-
-You can find ANSI-C LZMA decompressing code at folder
-  C/7zip/Compress/Lzma
-7-Zip doesn't use that ANSI-C LZMA code and that code was developed
-specially for this SDK. And files from C/7zip/Compress/Lzma do not need
-files from other directories of SDK for compiling.
 
+C/C++ source code of LZMA SDK is part of 7-Zip project.
 7-Zip source code can be downloaded from 7-Zip's SourceForge page:
 
   http://sourceforge.net/projects/sevenzip/
 
 
+
 LZMA features
 -------------
   - Variable dictionary size (up to 1 GB)
-  - Estimated compressing speed: about 1 MB/s on 1 GHz CPU
+  - Estimated compressing speed: about 2 MB/s on 2 GHz CPU
   - Estimated decompressing speed:
-      - 8-12 MB/s on 1 GHz Intel Pentium 3 or AMD Athlon
-      - 500-1000 KB/s on 100 MHz ARM, MIPS, PowerPC or other simple RISC
-  - Small memory requirements for decompressing (8-32 KB + DictionarySize)
-  - Small code size for decompressing: 2-8 KB (depending from
-    speed optimizations)
+      - 20-30 MB/s on 2 GHz Core 2 or AMD Athlon 64
+      - 1-2 MB/s on 200 MHz ARM, MIPS, PowerPC or other simple RISC
+  - Small memory requirements for decompressing (16 KB + DictionarySize)
+  - Small code size for decompressing: 5-8 KB
 
 LZMA decoder uses only integer operations and can be
 implemented in any modern 32-bit CPU (or on 16-bit CPU with some conditions).
 
-Some critical operations that affect to speed of LZMA decompression:
+Some critical operations that affect the speed of LZMA decompression:
   1) 32*16 bit integer multiply
   2) Misspredicted branches (penalty mostly depends from pipeline length)
   3) 32-bit shift and arithmetic operations
 
-Speed of LZMA decompressing mostly depends from CPU speed.
+The speed of LZMA decompressing mostly depends from CPU speed.
 Memory speed has no big meaning. But if your CPU has small data cache,
 overall weight of memory speed will slightly increase.
 
@@ -251,7 +164,7 @@ How To Use
 Using LZMA encoder/decoder executable
 --------------------------------------
 
-Usage: LZMA <e|d> inputFile outputFile [<switches>...]
+Usage:  LZMA <e|d> inputFile outputFile [<switches>...]
 
   e: encode file
 
@@ -260,11 +173,11 @@ Usage:    LZMA <e|d> inputFile outputFile [<switches>...]
   b: Benchmark. There are two tests: compressing and decompressing
      with LZMA method. Benchmark shows rating in MIPS (million
      instructions per second). Rating value is calculated from
-     measured speed and it is normalized with AMD Athlon 64 X2 CPU
-     results. Also Benchmark checks possible hardware errors (RAM
+     measured speed and it is normalized with Intel's Core 2 results.
+     Also Benchmark checks possible hardware errors (RAM
      errors in most cases). Benchmark uses these settings:
-     (-a1, -d21, -fb32, -mfbt4). You can change only -d. Also you
-     can change number of iterations. Example for 30 iterations:
+     (-a1, -d21, -fb32, -mfbt4). You can change only -d parameter.
+     Also you can change the number of iterations. Example for 30 iterations:
        LZMA b 30
      Default number of iterations is 10.
 
@@ -272,52 +185,52 @@ Usage:    LZMA <e|d> inputFile outputFile [<switches>...]
 
 
   -a{N}:  set compression mode 0 = fast, 1 = normal
-         default: 1 (normal)
+          default: 1 (normal)
 
   d{N}:   Sets Dictionary size - [0, 30], default: 23 (8MB)
-         The maximum value for dictionary size is 1 GB = 2^30 bytes.
-         Dictionary size is calculated as DictionarySize = 2^N bytes.
-         For decompressing file compressed by LZMA method with dictionary
-         size D = 2^N you need about D bytes of memory (RAM).
+          The maximum value for dictionary size is 1 GB = 2^30 bytes.
+          Dictionary size is calculated as DictionarySize = 2^N bytes.
+          For decompressing file compressed by LZMA method with dictionary
+          size D = 2^N you need about D bytes of memory (RAM).
 
   -fb{N}: set number of fast bytes - [5, 273], default: 128
-         Usually big number gives a little bit better compression ratio
-         and slower compression process.
+          Usually big number gives a little bit better compression ratio
+          and slower compression process.
 
   -lc{N}: set number of literal context bits - [0, 8], default: 3
-         Sometimes lc=4 gives gain for big files.
+          Sometimes lc=4 gives gain for big files.
 
   -lp{N}: set number of literal pos bits - [0, 4], default: 0
-         lp switch is intended for periodical data when period is
-         equal 2^N. For example, for 32-bit (4 bytes)
-         periodical data you can use lp=2. Often it's better to set lc0,
-         if you change lp switch.
+          lp switch is intended for periodical data when period is
+          equal 2^N. For example, for 32-bit (4 bytes)
+          periodical data you can use lp=2. Often it's better to set lc0,
+          if you change lp switch.
 
   -pb{N}: set number of pos bits - [0, 4], default: 2
-         pb switch is intended for periodical data
-         when period is equal 2^N.
+          pb switch is intended for periodical data
+          when period is equal 2^N.
 
   -mf{MF_ID}: set Match Finder. Default: bt4.
-             Algorithms from hc* group doesn't provide good compression
-             ratio, but they often works pretty fast in combination with
-             fast mode (-a0).
+              Algorithms from hc* group doesn't provide good compression
+              ratio, but they often works pretty fast in combination with
+              fast mode (-a0).
 
-             Memory requirements depend from dictionary size
-             (parameter "d" in table below).
+              Memory requirements depend from dictionary size
+              (parameter "d" in table below).
 
-              MF_ID     Memory                   Description
+               MF_ID     Memory                   Description
 
-               bt2    d *  9.5 + 4MB  Binary Tree with 2 bytes hashing.
-               bt3    d * 11.5 + 4MB  Binary Tree with 3 bytes hashing.
-               bt4    d * 11.5 + 4MB  Binary Tree with 4 bytes hashing.
-               hc4    d *  7.5 + 4MB  Hash Chain with 4 bytes hashing.
+                bt2    d *  9.5 + 4MB  Binary Tree with 2 bytes hashing.
+                bt3    d * 11.5 + 4MB  Binary Tree with 3 bytes hashing.
+                bt4    d * 11.5 + 4MB  Binary Tree with 4 bytes hashing.
+                hc4    d *  7.5 + 4MB  Hash Chain with 4 bytes hashing.
 
   -eos:   write End Of Stream marker. By default LZMA doesn't write
-         eos marker, since LZMA decoder knows uncompressed size
-         stored in .lzma file header.
+          eos marker, since LZMA decoder knows uncompressed size
+          stored in .lzma file header.
 
-  -si:   Read data from stdin (it will write End Of Stream marker).
-  -so:   Write data to stdout
+  -si:    Read data from stdin (it will write End Of Stream marker).
+  -so:    Write data to stdout
 
 
 Examples:
@@ -345,32 +258,29 @@ Compression ratio hints
 Recommendations
 ---------------
 
-To increase compression ratio for LZMA compressing it's desirable
+To increase the compression ratio for LZMA compressing it's desirable
 to have aligned data (if it's possible) and also it's desirable to locate
 data in such order, where code is grouped in one place and data is
 grouped in other place (it's better than such mixing: code, data, code,
 data, ...).
 
 
-Using Filters
--------------
-You can increase compression ratio for some data types, using
+Filters
+-------
+You can increase the compression ratio for some data types, using
 special filters before compressing. For example, it's possible to
-increase compression ratio on 5-10% for code for those CPU ISAs:
+increase the compression ratio on 5-10% for code for those CPU ISAs:
 x86, IA-64, ARM, ARM-Thumb, PowerPC, SPARC.
 
-You can find C/C++ source code of such filters in folder "7zip/Compress/Branch"
+You can find C source code of such filters in C/Bra*.* files
 
-You can check compression ratio gain of these filters with such
+You can check the compression ratio gain of these filters with such
 7-Zip commands (example for ARM code):
 No filter:
   7z a a1.7z a.bin -m0=lzma
 
 With filter for little-endian ARM code:
-  7z a a2.7z a.bin -m0=bc_arm -m1=lzma
-
-With filter for big-endian ARM code (using additional Swap4 filter):
-  7z a a3.7z a.bin -m0=swap4 -m1=bc_arm -m2=lzma
+  7z a a2.7z a.bin -m0=arm -m1=lzma
 
 It works in such manner:
 Compressing    = Filter_encoding + LZMA_encoding
@@ -383,8 +293,7 @@ since compression ratio with filtering is higher.
 
 These filters convert CALL (calling procedure) instructions
 from relative offsets to absolute addresses, so such data becomes more
-compressible. Source code of these CALL filters is pretty simple
-(about 20 lines of C++), so you can convert it from C++ version yourself.
+compressible.
 
 For some ISAs (for example, for MIPS) it's impossible to get gain from such filter.
 
@@ -392,272 +301,294 @@ For some ISAs (for example, for MIPS) it's impossible to get gain from such filt
 LZMA compressed file format
 ---------------------------
 Offset Size Description
-  0    1   Special LZMA properties for compressed data
-  1    4   Dictionary size (little endian)
-  5    8   Uncompressed size (little endian). -1 means unknown size
- 13        Compressed data
+  0     1   Special LZMA properties (lc,lp, pb in encoded form)
+  1     4   Dictionary size (little endian)
+  5     8   Uncompressed size (little endian). -1 means unknown size
+ 13         Compressed data
 
 
 ANSI-C LZMA Decoder
 ~~~~~~~~~~~~~~~~~~~
 
-To compile ANSI-C LZMA Decoder you can use one of the following files sets:
-1) LzmaDecode.h + LzmaDecode.c + LzmaTest.c  (fastest version)
-2) LzmaDecode.h + LzmaDecodeSize.c + LzmaTest.c  (old size-optimized version)
-3) LzmaStateDecode.h + LzmaStateDecode.c + LzmaStateTest.c  (zlib-like interface)
+Please note that interfaces for ANSI-C code were changed in LZMA SDK 4.58.
+If you want to use old interfaces you can download previous version of LZMA SDK
+from sourceforge.net site.
+
+To use ANSI-C LZMA Decoder you need the following files:
+1) LzmaDec.h + LzmaDec.c + Types.h
+LzmaUtil/LzmaUtil.c is example application that uses these files.
 
 
 Memory requirements for LZMA decoding
 -------------------------------------
 
-LZMA decoder doesn't allocate memory itself, so you must
-allocate memory and send it to LZMA.
-
 Stack usage of LZMA decoding function for local variables is not
-larger than 200 bytes.
+larger than 200-400 bytes.
+
+LZMA Decoder uses dictionary buffer and internal state structure.
+Internal state structure consumes
+  state_size = (4 + (1.5 << (lc + lp))) KB
+by default (lc=3, lp=0), state_size = 16 KB.
+
 
 How To decompress data
 ----------------------
 
-LZMA Decoder (ANSI-C version) now supports 5 interfaces:
+LZMA Decoder (ANSI-C version) now supports 2 interfaces:
 1) Single-call Decompressing
-2) Single-call Decompressing with input stream callback
-3) Multi-call Decompressing with output buffer
-4) Multi-call Decompressing with input callback and output buffer
-5) Multi-call State Decompressing (zlib-like interface)
-
-Variant-5 is similar to Variant-4, but Variant-5 doesn't use callback functions.
-
-Decompressing steps
--------------------
-
-1) read LZMA properties (5 bytes):
-   unsigned char properties[LZMA_PROPERTIES_SIZE];
-
-2) read uncompressed size (8 bytes, little-endian)
+2) Multi-call State Decompressing (zlib-like interface)
 
-3) Decode properties:
+You must use external allocator:
+Example:
+void *SzAlloc(void *p, size_t size) { p = p; return malloc(size); }
+void SzFree(void *p, void *address) { p = p; free(address); }
+ISzAlloc alloc = { SzAlloc, SzFree };
 
-  CLzmaDecoderState state;  /* it's 24-140 bytes structure, if int is 32-bit */
+You can use p = p; operator to disable compiler warnings.
 
-  if (LzmaDecodeProperties(&state.Properties, properties, LZMA_PROPERTIES_SIZE) != LZMA_RESULT_OK)
-    return PrintError(rs, "Incorrect stream properties");
 
-4) Allocate memory block for internal Structures:
-
-  state.Probs = (CProb *)malloc(LzmaGetNumProbs(&state.Properties) * sizeof(CProb));
-  if (state.Probs == 0)
-    return PrintError(rs, kCantAllocateMessage);
-
-  LZMA decoder uses array of CProb variables as internal structure.
-  By default, CProb is unsigned_short. But you can define _LZMA_PROB32 to make
-  it unsigned_int. It can increase speed on some 32-bit CPUs, but memory
-  usage will be doubled in that case.
-
-
-5) Main Decompressing
-
-You must use one of the following interfaces:
-
-5.1 Single-call Decompressing
------------------------------
+Single-call Decompressing
+-------------------------
 When to use: RAM->RAM decompressing
-Compile files: LzmaDecode.h, LzmaDecode.c
+Compile files: LzmaDec.h + LzmaDec.c + Types.h
 Compile defines: no defines
 Memory Requirements:
   - Input buffer: compressed size
   - Output buffer: uncompressed size
-  - LZMA Internal Structures (~16 KB for default settings)
+  - LZMA Internal Structures: state_size (16 KB for default settings)
 
 Interface:
-  int res = LzmaDecode(&state,
-      inStream, compressedSize, &inProcessed,
-      outStream, outSize, &outProcessed);
+  int LzmaDecode(Byte *dest, SizeT *destLen, const Byte *src, SizeT *srcLen,
+      const Byte *propData, unsigned propSize, ELzmaFinishMode finishMode,
+      ELzmaStatus *status, ISzAlloc *alloc);
+  In:
+    dest     - output data
+    destLen  - output data size
+    src      - input data
+    srcLen   - input data size
+    propData - LZMA properties  (5 bytes)
+    propSize - size of propData buffer (5 bytes)
+    finishMode - It has meaning only if the decoding reaches output limit (*destLen).
+        LZMA_FINISH_ANY - Decode just destLen bytes.
+        LZMA_FINISH_END - Stream must be finished after (*destLen).
+                           You can use LZMA_FINISH_END, when you know that
+                           current output buffer covers last bytes of stream.
+    alloc    - Memory allocator.
+
+  Out:
+    destLen  - processed output size
+    srcLen   - processed input size
+
+  Output:
+    SZ_OK
+      status:
+        LZMA_STATUS_FINISHED_WITH_MARK
+        LZMA_STATUS_NOT_FINISHED
+        LZMA_STATUS_MAYBE_FINISHED_WITHOUT_MARK
+    SZ_ERROR_DATA - Data error
+    SZ_ERROR_MEM  - Memory allocation error
+    SZ_ERROR_UNSUPPORTED - Unsupported properties
+    SZ_ERROR_INPUT_EOF - It needs more bytes in input buffer (src).
+
+  If LZMA decoder sees end_marker before reaching output limit, it returns OK result,
+  and output value of destLen will be less than output buffer size limit.
+
+  You can use multiple checks to test data integrity after full decompression:
+    1) Check Result and "status" variable.
+    2) Check that output(destLen) = uncompressedSize, if you know real uncompressedSize.
+    3) Check that output(srcLen) = compressedSize, if you know real compressedSize.
+       You must use correct finish mode in that case. */
+
+
+Multi-call State Decompressing (zlib-like interface)
+----------------------------------------------------
 
+When to use: file->file decompressing
+Compile files: LzmaDec.h + LzmaDec.c + Types.h
 
-5.2 Single-call Decompressing with input stream callback
---------------------------------------------------------
-When to use: File->RAM or Flash->RAM decompressing.
-Compile files: LzmaDecode.h, LzmaDecode.c
-Compile defines: _LZMA_IN_CB
 Memory Requirements:
-  - Buffer for input stream: any size (for example, 16 KB)
-  - Output buffer: uncompressed size
-  - LZMA Internal Structures (~16 KB for default settings)
+ - Buffer for input stream: any size (for example, 16 KB)
+ - Buffer for output stream: any size (for example, 16 KB)
+ - LZMA Internal Structures: state_size (16 KB for default settings)
+ - LZMA dictionary (dictionary size is encoded in LZMA properties header)
 
-Interface:
-  typedef struct _CBuffer
-  {
-    ILzmaInCallback InCallback;
-    FILE *File;
-    unsigned char Buffer[kInBufferSize];
-  } CBuffer;
+1) read LZMA properties (5 bytes) and uncompressed size (8 bytes, little-endian) to header:
+   unsigned char header[LZMA_PROPS_SIZE + 8];
+   ReadFile(inFile, header, sizeof(header)
 
-  int LzmaReadCompressed(void *object, const unsigned char **buffer, SizeT *size)
+2) Allocate CLzmaDec structures (state + dictionary) using LZMA properties
+
+  CLzmaDec state;
+  LzmaDec_Constr(&state);
+  res = LzmaDec_Allocate(&state, header, LZMA_PROPS_SIZE, &g_Alloc);
+  if (res != SZ_OK)
+    return res;
+
+3) Init LzmaDec structure before any new LZMA stream. And call LzmaDec_DecodeToBuf in loop
+
+  LzmaDec_Init(&state);
+  for (;;)
   {
-    CBuffer *bo = (CBuffer *)object;
-    *buffer = bo->Buffer;
-    *size = MyReadFile(bo->File, bo->Buffer, kInBufferSize);
-    return LZMA_RESULT_OK;
+    ...
+    int res = LzmaDec_DecodeToBuf(CLzmaDec *p, Byte *dest, SizeT *destLen,
+       const Byte *src, SizeT *srcLen, ELzmaFinishMode finishMode);
+    ...
   }
 
-  CBuffer g_InBuffer;
 
-  g_InBuffer.File = inFile;
-  g_InBuffer.InCallback.Read = LzmaReadCompressed;
-  int res = LzmaDecode(&state,
-      &g_InBuffer.InCallback,
-      outStream, outSize, &outProcessed);
+4) Free all allocated structures
+  LzmaDec_Free(&state, &g_Alloc);
+
+For full code example, look at C/LzmaUtil/LzmaUtil.c code.
+
+
+How To compress data
+--------------------
 
+Compile files: LzmaEnc.h + LzmaEnc.c + Types.h +
+LzFind.c + LzFind.h + LzFindMt.c + LzFindMt.h + LzHash.h
 
-5.3 Multi-call decompressing with output buffer
------------------------------------------------
-When to use: RAM->File decompressing
-Compile files: LzmaDecode.h, LzmaDecode.c
-Compile defines: _LZMA_OUT_READ
 Memory Requirements:
- - Input buffer: compressed size
- - Buffer for output stream: any size (for example, 16 KB)
- - LZMA Internal Structures (~16 KB for default settings)
- - LZMA dictionary (dictionary size is encoded in stream properties)
+  - (dictSize * 11.5 + 6 MB) + state_size
 
-Interface:
+Lzma Encoder can use two memory allocators:
+1) alloc - for small arrays.
+2) allocBig - for big arrays.
 
-  state.Dictionary = (unsigned char *)malloc(state.Properties.DictionarySize);
+For example, you can use Large RAM Pages (2 MB) in allocBig allocator for
+better compression speed. Note that Windows has bad implementation for
+Large RAM Pages.
+It's OK to use same allocator for alloc and allocBig.
 
-  LzmaDecoderInit(&state);
-  do
-  {
-    LzmaDecode(&state,
-      inBuffer, inAvail, &inProcessed,
-      g_OutBuffer, outAvail, &outProcessed);
-    inAvail -= inProcessed;
-    inBuffer += inProcessed;
-  }
-  while you need more bytes
 
-  see LzmaTest.c for more details.
+Single-call Compression with callbacks
+--------------------------------------
 
+Check C/LzmaUtil/LzmaUtil.c as example,
 
-5.4 Multi-call decompressing with input callback and output buffer
-------------------------------------------------------------------
-When to use: File->File decompressing
-Compile files: LzmaDecode.h, LzmaDecode.c
-Compile defines: _LZMA_IN_CB, _LZMA_OUT_READ
-Memory Requirements:
- - Buffer for input stream: any size (for example, 16 KB)
- - Buffer for output stream: any size (for example, 16 KB)
- - LZMA Internal Structures (~16 KB for default settings)
- - LZMA dictionary (dictionary size is encoded in stream properties)
+When to use: file->file decompressing
 
-Interface:
+1) you must implement callback structures for interfaces:
+ISeqInStream
+ISeqOutStream
+ICompressProgress
+ISzAlloc
 
-  state.Dictionary = (unsigned char *)malloc(state.Properties.DictionarySize);
+static void *SzAlloc(void *p, size_t size) { p = p; return MyAlloc(size); }
+static void SzFree(void *p, void *address) {  p = p; MyFree(address); }
+static ISzAlloc g_Alloc = { SzAlloc, SzFree };
 
-  LzmaDecoderInit(&state);
-  do
-  {
-    LzmaDecode(&state,
-      &bo.InCallback,
-      g_OutBuffer, outAvail, &outProcessed);
-  }
-  while you need more bytes
+  CFileSeqInStream inStream;
+  CFileSeqOutStream outStream;
 
-  see LzmaTest.c for more details:
+  inStream.funcTable.Read = MyRead;
+  inStream.file = inFile;
+  outStream.funcTable.Write = MyWrite;
+  outStream.file = outFile;
 
 
-5.5 Multi-call State Decompressing (zlib-like interface)
-------------------------------------------------------------------
-When to use: file->file decompressing
-Compile files: LzmaStateDecode.h, LzmaStateDecode.c
-Compile defines:
-Memory Requirements:
- - Buffer for input stream: any size (for example, 16 KB)
- - Buffer for output stream: any size (for example, 16 KB)
- - LZMA Internal Structures (~16 KB for default settings)
- - LZMA dictionary (dictionary size is encoded in stream properties)
+2) Create CLzmaEncHandle object;
 
-Interface:
+  CLzmaEncHandle enc;
 
-  state.Dictionary = (unsigned char *)malloc(state.Properties.DictionarySize);
+  enc = LzmaEnc_Create(&g_Alloc);
+  if (enc == 0)
+    return SZ_ERROR_MEM;
 
 
-  LzmaDecoderInit(&state);
-  do
-  {
-    res = LzmaDecode(&state,
-      inBuffer, inAvail, &inProcessed,
-      g_OutBuffer, outAvail, &outProcessed,
-      finishDecoding);
-    inAvail -= inProcessed;
-    inBuffer += inProcessed;
-  }
-  while you need more bytes
+3) initialize CLzmaEncProps properties;
 
-  see LzmaStateTest.c for more details:
+  LzmaEncProps_Init(&props);
 
+  Then you can change some properties in that structure.
 
-6) Free all allocated blocks
+4) Send LZMA properties to LZMA Encoder
 
+  res = LzmaEnc_SetProps(enc, &props);
 
-Note
-----
-LzmaDecodeSize.c is size-optimized version of LzmaDecode.c.
-But compiled code of LzmaDecodeSize.c can be larger than
-compiled code of LzmaDecode.c. So it's better to use
-LzmaDecode.c in most cases.
+5) Write encoded properties to header
 
+    Byte header[LZMA_PROPS_SIZE + 8];
+    size_t headerSize = LZMA_PROPS_SIZE;
+    UInt64 fileSize;
+    int i;
 
-EXIT codes
------------
+    res = LzmaEnc_WriteProperties(enc, header, &headerSize);
+    fileSize = MyGetFileLength(inFile);
+    for (i = 0; i < 8; i++)
+      header[headerSize++] = (Byte)(fileSize >> (8 * i));
+    MyWriteFileAndCheck(outFile, header, headerSize)
 
-LZMA decoder can return one of the following codes:
+6) Call encoding function:
+      res = LzmaEnc_Encode(enc, &outStream.funcTable, &inStream.funcTable,
+        NULL, &g_Alloc, &g_Alloc);
 
-#define LZMA_RESULT_OK 0
-#define LZMA_RESULT_DATA_ERROR 1
+7) Destroy LZMA Encoder Object
+  LzmaEnc_Destroy(enc, &g_Alloc, &g_Alloc);
 
-If you use callback function for input data and you return some
-error code, LZMA Decoder also returns that code.
 
+If callback function return some error code, LzmaEnc_Encode also returns that code.
 
 
-LZMA Defines
-------------
+Single-call RAM->RAM Compression
+--------------------------------
 
-_LZMA_IN_CB    - Use callback for input data
+Single-call RAM->RAM Compression is similar to Compression with callbacks,
+but you provide pointers to buffers instead of pointers to stream callbacks:
 
-_LZMA_OUT_READ - Use read function for output data
+HRes LzmaEncode(Byte *dest, SizeT *destLen, const Byte *src, SizeT srcLen,
+    CLzmaEncProps *props, Byte *propsEncoded, SizeT *propsSize, int writeEndMark,
+    ICompressProgress *progress, ISzAlloc *alloc, ISzAlloc *allocBig);
 
-_LZMA_LOC_OPT  - Enable local speed optimizations inside code.
-                _LZMA_LOC_OPT is only for LzmaDecodeSize.c (size-optimized version).
-                _LZMA_LOC_OPT doesn't affect LzmaDecode.c (speed-optimized version)
-                and LzmaStateDecode.c
+Return code:
+  SZ_OK               - OK
+  SZ_ERROR_MEM        - Memory allocation error
+  SZ_ERROR_PARAM      - Incorrect paramater
+  SZ_ERROR_OUTPUT_EOF - output buffer overflow
+  SZ_ERROR_THREAD     - errors in multithreading functions (only for Mt version)
 
-_LZMA_PROB32   - It can increase speed on some 32-bit CPUs,
-                but memory usage will be doubled in that case
 
-_LZMA_UINT32_IS_ULONG  - Define it if int is 16-bit on your compiler
-                        and long is 32-bit.
 
-_LZMA_SYSTEM_SIZE_T  - Define it if you want to use system's size_t.
-                      You can use it to enable 64-bit sizes supporting
+LZMA Defines
+------------
+
+_LZMA_SIZE_OPT - Enable some optimizations in LZMA Decoder to get smaller executable code.
+
+_LZMA_PROB32   - It can increase the speed on some 32-bit CPUs, but memory usage for
+                 some structures will be doubled in that case.
 
+_LZMA_UINT32_IS_ULONG  - Define it if int is 16-bit on your compiler and long is 32-bit.
+
+_LZMA_NO_SYSTEM_SIZE_T  - Define it if you don't want to use size_t type.
 
 
 C++ LZMA Encoder/Decoder
 ~~~~~~~~~~~~~~~~~~~~~~~~
 C++ LZMA code use COM-like interfaces. So if you want to use it,
 you can study basics of COM/OLE.
+C++ LZMA code is just wrapper over ANSI-C code.
 
-By default, LZMA Encoder contains all Match Finders.
-But for compressing it's enough to have just one of them.
-So for reducing size of compressing code you can define:
-  #define COMPRESS_MF_BT
-  #define COMPRESS_MF_BT4
-and it will use only bt4 match finder.
 
+C++ Notes
+~~~~~~~~~~~~~~~~~~~~~~~~
+If you use some C++ code folders in 7-Zip (for example, C++ code for .7z handling),
+you must check that you correctly work with "new" operator.
+7-Zip can be compiled with MSVC 6.0 that doesn't throw "exception" from "new" operator.
+So 7-Zip uses "CPP\Common\NewHandler.cpp" that redefines "new" operator:
+operator new(size_t size)
+{
+  void *p = ::malloc(size);
+  if (p == 0)
+    throw CNewException();
+  return p;
+}
+If you use MSCV that throws exception for "new" operator, you can compile without
+"NewHandler.cpp". So standard exception will be used. Actually some code of
+7-Zip catches any exception in internal code and converts it to HRESULT code.
+So you don't need to catch CNewException, if you call COM interfaces of 7-Zip.
 
 ---
 
 http://www.7-zip.org
+http://www.7-zip.org/sdk.html
 http://www.7-zip.org/support.html
diff --git a/lib_i386/config.mk b/lib_i386/config.mk
new file mode 100644 (file)
index 0000000..5fe36d5
--- /dev/null
@@ -0,0 +1,26 @@
+#
+# (C) Copyright 2000-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
+#
+
+CROSS_COMPILE ?= i386-linux-
+
+PLATFORM_CPPFLAGS += -DCONFIG_I386 -D__I386__
diff --git a/lib_m68k/config.mk b/lib_m68k/config.mk
new file mode 100644 (file)
index 0000000..f41d1b3
--- /dev/null
@@ -0,0 +1,27 @@
+#
+# (C) Copyright 2000-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
+#
+
+CROSS_COMPILE ?= m68k-elf-
+
+PLATFORM_CPPFLAGS += -DCONFIG_M68K -D__M68K__
+PLATFORM_LDFLAGS  += -n
diff --git a/lib_microblaze/config.mk b/lib_microblaze/config.mk
new file mode 100644 (file)
index 0000000..68e7e21
--- /dev/null
@@ -0,0 +1,29 @@
+#
+# (C) Copyright 2007-2008 Michal Simek
+# Michal SIMEK <monstr@monstr.eu>
+#
+# (C) Copyright 2004 Atmark Techno, Inc.
+# Yasushi SHOJI <yashi@atmark-techno.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
+#
+
+CROSS_COMPILE ?= mb-
+
+PLATFORM_CPPFLAGS += -ffixed-r31 -D__microblaze__
diff --git a/lib_mips/config.mk b/lib_mips/config.mk
new file mode 100644 (file)
index 0000000..c785677
--- /dev/null
@@ -0,0 +1,50 @@
+#
+# (C) Copyright 2003
+# 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
+#
+
+CROSS_COMPILE ?= mips_4KC-
+
+PLATFORM_CPPFLAGS += -DCONFIG_MIPS -D__MIPS__
+
+#
+# From Linux arch/mips/Makefile
+#
+# GCC uses -G 0 -mabicalls -fpic as default.  We don't want PIC in the kernel
+# code since it only slows down the whole thing.  At some point we might make
+# use of global pointer optimizations but their use of $28 conflicts with
+# the current pointer optimization.
+#
+# The DECStation requires an ECOFF kernel for remote booting, other MIPS
+# machines may also.  Since BFD is incredibly buggy with respect to
+# crossformat linking we rely on the elf2ecoff tool for format conversion.
+#
+# cflags-y                     += -G 0 -mno-abicalls -fno-pic -pipe
+# cflags-y                     += -msoft-float
+# LDFLAGS_vmlinux              += -G 0 -static -n -nostdlib
+# MODFLAGS                     += -mlong-calls
+#
+# On the other hand, we want PIC in the U-Boot code to relocate it from ROM
+# to RAM. $28 is always used as gp.
+#
+PLATFORM_CPPFLAGS              += -G 0 -mabicalls -fpic
+PLATFORM_CPPFLAGS              += -msoft-float
+PLATFORM_LDFLAGS               += -G 0 -static -n -nostdlib
diff --git a/lib_nios/config.mk b/lib_nios/config.mk
new file mode 100644 (file)
index 0000000..3ed7170
--- /dev/null
@@ -0,0 +1,27 @@
+#
+# (C) Copyright 2003
+# Psyent Corporation <www.psyent.com>
+# Scott McNutt <smcnutt@psyent.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
+#
+
+CROSS_COMPILE ?= nios-elf-
+
+PLATFORM_CPPFLAGS += -m32 -DCONFIG_NIOS -D__NIOS__ -ffixed-g7 -gstabs
diff --git a/lib_nios2/config.mk b/lib_nios2/config.mk
new file mode 100644 (file)
index 0000000..59931c2
--- /dev/null
@@ -0,0 +1,28 @@
+#
+# (C) Copyright 2004
+# Psyent Corporation <www.psyent.com>
+# Scott McNutt <smcnutt@psyent.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
+#
+
+CROSS_COMPILE ?= nios2-elf-
+
+PLATFORM_CPPFLAGS += -DCONFIG_NIOS2 -D__NIOS2__
+PLATFORM_CPPFLAGS += -ffixed-r15 -G0
diff --git a/lib_ppc/config.mk b/lib_ppc/config.mk
new file mode 100644 (file)
index 0000000..d91ef7f
--- /dev/null
@@ -0,0 +1,41 @@
+#
+# (C) Copyright 2000-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
+#
+
+CROSS_COMPILE ?= ppc_8xx-
+
+PLATFORM_CPPFLAGS += -DCONFIG_PPC -D__powerpc__
+PLATFORM_LDFLAGS  += -n
+
+#
+# When cross-compiling on NetBSD, we have to define __PPC__ or else we
+# will pick up a va_list declaration that is incompatible with the
+# actual argument lists emitted by the compiler.
+#
+# [Tested on NetBSD/i386 1.5 + cross-powerpc-netbsd-1.3]
+
+ifeq ($(CROSS_COMPILE),powerpc-netbsd-)
+PLATFORM_CPPFLAGS+= -D__PPC__
+endif
+ifeq ($(CROSS_COMPILE),powerpc-openbsd-)
+PLATFORM_CPPFLAGS+= -D__PPC__
+endif
diff --git a/lib_sh/config.mk b/lib_sh/config.mk
new file mode 100644 (file)
index 0000000..67d7e9e
--- /dev/null
@@ -0,0 +1,29 @@
+#
+# (C) Copyright 2000-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
+#
+
+CROSS_COMPILE ?= sh4-linux-
+
+PLATFORM_CPPFLAGS += -DCONFIG_SH -D__SH__
+PLATFORM_LDFLAGS += -e $(TEXT_BASE) --defsym reloc_dst=$(TEXT_BASE)
+
+LDSCRIPT := $(SRCTREE)/cpu/$(CPU)/u-boot.lds
diff --git a/lib_sparc/config.mk b/lib_sparc/config.mk
new file mode 100644 (file)
index 0000000..07b528c
--- /dev/null
@@ -0,0 +1,26 @@
+#
+# (C) Copyright 2007
+# Daniel Hellstrom, Gaisler Research, daniel@gaisler.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
+#
+
+CROSS_COMPILE ?= sparc-elf-
+
+PLATFORM_CPPFLAGS += -DCONFIG_SPARC -D__sparc__
diff --git a/m68k_config.mk b/m68k_config.mk
deleted file mode 100644 (file)
index f41d1b3..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-#
-# (C) Copyright 2000-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
-#
-
-CROSS_COMPILE ?= m68k-elf-
-
-PLATFORM_CPPFLAGS += -DCONFIG_M68K -D__M68K__
-PLATFORM_LDFLAGS  += -n
diff --git a/microblaze_config.mk b/microblaze_config.mk
deleted file mode 100644 (file)
index 68e7e21..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-#
-# (C) Copyright 2007-2008 Michal Simek
-# Michal SIMEK <monstr@monstr.eu>
-#
-# (C) Copyright 2004 Atmark Techno, Inc.
-# Yasushi SHOJI <yashi@atmark-techno.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
-#
-
-CROSS_COMPILE ?= mb-
-
-PLATFORM_CPPFLAGS += -ffixed-r31 -D__microblaze__
diff --git a/mips_config.mk b/mips_config.mk
deleted file mode 100644 (file)
index c785677..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-#
-# (C) Copyright 2003
-# 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
-#
-
-CROSS_COMPILE ?= mips_4KC-
-
-PLATFORM_CPPFLAGS += -DCONFIG_MIPS -D__MIPS__
-
-#
-# From Linux arch/mips/Makefile
-#
-# GCC uses -G 0 -mabicalls -fpic as default.  We don't want PIC in the kernel
-# code since it only slows down the whole thing.  At some point we might make
-# use of global pointer optimizations but their use of $28 conflicts with
-# the current pointer optimization.
-#
-# The DECStation requires an ECOFF kernel for remote booting, other MIPS
-# machines may also.  Since BFD is incredibly buggy with respect to
-# crossformat linking we rely on the elf2ecoff tool for format conversion.
-#
-# cflags-y                     += -G 0 -mno-abicalls -fno-pic -pipe
-# cflags-y                     += -msoft-float
-# LDFLAGS_vmlinux              += -G 0 -static -n -nostdlib
-# MODFLAGS                     += -mlong-calls
-#
-# On the other hand, we want PIC in the U-Boot code to relocate it from ROM
-# to RAM. $28 is always used as gp.
-#
-PLATFORM_CPPFLAGS              += -G 0 -mabicalls -fpic
-PLATFORM_CPPFLAGS              += -msoft-float
-PLATFORM_LDFLAGS               += -G 0 -static -n -nostdlib
diff --git a/nios2_config.mk b/nios2_config.mk
deleted file mode 100644 (file)
index 59931c2..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-#
-# (C) Copyright 2004
-# Psyent Corporation <www.psyent.com>
-# Scott McNutt <smcnutt@psyent.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
-#
-
-CROSS_COMPILE ?= nios2-elf-
-
-PLATFORM_CPPFLAGS += -DCONFIG_NIOS2 -D__NIOS2__
-PLATFORM_CPPFLAGS += -ffixed-r15 -G0
diff --git a/nios_config.mk b/nios_config.mk
deleted file mode 100644 (file)
index 3ed7170..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-#
-# (C) Copyright 2003
-# Psyent Corporation <www.psyent.com>
-# Scott McNutt <smcnutt@psyent.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
-#
-
-CROSS_COMPILE ?= nios-elf-
-
-PLATFORM_CPPFLAGS += -m32 -DCONFIG_NIOS -D__NIOS__ -ffixed-g7 -gstabs
diff --git a/ppc_config.mk b/ppc_config.mk
deleted file mode 100644 (file)
index d91ef7f..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-#
-# (C) Copyright 2000-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
-#
-
-CROSS_COMPILE ?= ppc_8xx-
-
-PLATFORM_CPPFLAGS += -DCONFIG_PPC -D__powerpc__
-PLATFORM_LDFLAGS  += -n
-
-#
-# When cross-compiling on NetBSD, we have to define __PPC__ or else we
-# will pick up a va_list declaration that is incompatible with the
-# actual argument lists emitted by the compiler.
-#
-# [Tested on NetBSD/i386 1.5 + cross-powerpc-netbsd-1.3]
-
-ifeq ($(CROSS_COMPILE),powerpc-netbsd-)
-PLATFORM_CPPFLAGS+= -D__PPC__
-endif
-ifeq ($(CROSS_COMPILE),powerpc-openbsd-)
-PLATFORM_CPPFLAGS+= -D__PPC__
-endif
diff --git a/sh_config.mk b/sh_config.mk
deleted file mode 100644 (file)
index 67d7e9e..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-#
-# (C) Copyright 2000-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
-#
-
-CROSS_COMPILE ?= sh4-linux-
-
-PLATFORM_CPPFLAGS += -DCONFIG_SH -D__SH__
-PLATFORM_LDFLAGS += -e $(TEXT_BASE) --defsym reloc_dst=$(TEXT_BASE)
-
-LDSCRIPT := $(SRCTREE)/cpu/$(CPU)/u-boot.lds
diff --git a/sparc_config.mk b/sparc_config.mk
deleted file mode 100644 (file)
index 07b528c..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-#
-# (C) Copyright 2007
-# Daniel Hellstrom, Gaisler Research, daniel@gaisler.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
-#
-
-CROSS_COMPILE ?= sparc-elf-
-
-PLATFORM_CPPFLAGS += -DCONFIG_SPARC -D__sparc__