Add AVR32 architecture support
authorWolfgang Denk <wd@pollux.denx.de>
Tue, 24 Oct 2006 12:21:16 +0000 (14:21 +0200)
committerWolfgang Denk <wd@pollux.denx.de>
Tue, 24 Oct 2006 12:21:16 +0000 (14:21 +0200)
Patch by Haavard Skinnemoen, 6 Sep 2006 16:23:02 +0200

This patch adds common infrastructure code for the Atmel AVR32
architecture. See doc/README.AVR32 for details.

Signed-off-by: Haavard Skinnemoen <hskinnemoen@atmel.com>
33 files changed:
MAINTAINERS
Makefile
README
avr32_config.mk [new file with mode: 0644]
doc/README.AVR32 [new file with mode: 0644]
examples/Makefile
examples/stubs.c
include/asm-avr32/addrspace.h [new file with mode: 0644]
include/asm-avr32/bitops.h [new file with mode: 0644]
include/asm-avr32/byteorder.h [new file with mode: 0644]
include/asm-avr32/cacheflush.h [new file with mode: 0644]
include/asm-avr32/div64.h [new file with mode: 0644]
include/asm-avr32/dma-mapping.h [new file with mode: 0644]
include/asm-avr32/errno.h [new file with mode: 0644]
include/asm-avr32/global_data.h [new file with mode: 0644]
include/asm-avr32/initcalls.h [new file with mode: 0644]
include/asm-avr32/io.h [new file with mode: 0644]
include/asm-avr32/posix_types.h [new file with mode: 0644]
include/asm-avr32/processor.h [new file with mode: 0644]
include/asm-avr32/ptrace.h [new file with mode: 0644]
include/asm-avr32/sdram.h [new file with mode: 0644]
include/asm-avr32/sections.h [new file with mode: 0644]
include/asm-avr32/setup.h [new file with mode: 0644]
include/asm-avr32/string.h [new file with mode: 0644]
include/asm-avr32/sysreg.h [new file with mode: 0644]
include/asm-avr32/types.h [new file with mode: 0644]
include/asm-avr32/u-boot.h [new file with mode: 0644]
lib_avr32/Makefile [new file with mode: 0644]
lib_avr32/avr32_linux.c [new file with mode: 0644]
lib_avr32/board.c [new file with mode: 0644]
lib_avr32/div64.c [new file with mode: 0644]
lib_avr32/interrupts.c [new file with mode: 0644]
lib_avr32/memset.S [new file with mode: 0644]

index 42627196f8653f5389d7229e2ef60bae09690266..d7ef203e5513dea284926888da08dcc306993f3e 100644 (file)
@@ -554,6 +554,13 @@ Zachary P. Landau <zachary.landau@labxtechnologies.com>
 
        r5200                   mcf52x2
 
+#########################################################################
+# AVR32 Systems:                                                       #
+#                                                                      #
+# Maintainer Name, Email Address                                       #
+#      Board                   CPU                                     #
+#########################################################################
+
 #########################################################################
 # End of MAINTAINERS list                                              #
 #########################################################################
index 92034947962ad328dbf1fdba3042f4868aaa5017..5260a612ff3ebc749bebf27bb341520880b651da 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -152,6 +152,9 @@ endif
 ifeq ($(ARCH),blackfin)
 CROSS_COMPILE = bfin-elf-
 endif
+ifeq ($(ARCH),avr32)
+CROSS_COMPILE = avr32-
+endif
 endif
 endif
 
@@ -2099,6 +2102,10 @@ pb1000_config            :       unconfig
        @echo "#define CONFIG_PB1000 1" >>$(obj)include/config.h
        @$(MKCONFIG) -a pb1x00 mips mips pb1x00
 
+#========================================================================
+# AVR32
+#========================================================================
+
 #########################################################################
 ## MIPS64 5Kc
 #########################################################################
diff --git a/README b/README
index a0949f0d9b19374c8fc7c174bff33295e5f93bf6..8405a9b0cd134cf681a465204ba6946e95a05e90 100644 (file)
--- a/README
+++ b/README
@@ -156,6 +156,7 @@ Directory Hierarchy:
 - examples     Example code for standalone applications, etc.
 - include      Header Files
 - lib_arm      Files generic to ARM     architecture
+- lib_avr32    Files generic to AVR32   architecture
 - lib_generic  Files generic to all     architectures
 - lib_i386     Files generic to i386    architecture
 - lib_m68k     Files generic to m68k    architecture
@@ -2722,9 +2723,9 @@ defines the following image properties:
   4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks,
   LynxOS, pSOS, QNX, RTEMS, ARTOS;
   Currently supported: Linux, NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS).
-* Target CPU Architecture (Provisions for Alpha, ARM, Intel x86,
+* Target CPU Architecture (Provisions for Alpha, ARM, AVR32, Intel x86,
   IA64, MIPS, NIOS, PowerPC, IBM S390, SuperH, Sparc, Sparc 64 Bit;
-  Currently supported: ARM, Intel x86, MIPS, NIOS, PowerPC).
+  Currently supported: ARM, AVR32, Intel x86, MIPS, NIOS, PowerPC).
 * Compression Type (uncompressed, gzip, bzip2)
 * Load Address
 * Entry Point
diff --git a/avr32_config.mk b/avr32_config.mk
new file mode 100644 (file)
index 0000000..0b92053
--- /dev/null
@@ -0,0 +1,25 @@
+#
+# (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
+#
+
+PLATFORM_RELFLAGS      += -ffixed-r5 -mno-pic -mrelax
+PLATFORM_LDFLAGS       += --relax
diff --git a/doc/README.AVR32 b/doc/README.AVR32
new file mode 100644 (file)
index 0000000..abec872
--- /dev/null
@@ -0,0 +1,33 @@
+From: Haavard Skinnemoen <hskinnemoen@atmel.com>
+Date: Wed, 30 Aug 2006 17:01:46 +0200
+Subject: [PATCH] AVR32 architecture support
+
+This patch adds common infrastructure code for the Atmel AVR32
+architecture.
+
+AVR32 is a new high-performance 32-bit RISC microprocessor core,
+designed for cost-sensitive embedded applications, with particular
+emphasis on low power consumption and high code density. The AVR32
+architecture is not binary compatible with earlier 8-bit AVR
+architectures.
+
+The AVR32 architecture, including the instruction set, is described
+by the AVR32 Architecture Manual, available from
+
+http://www.atmel.com/dyn/resources/prod_documents/doc32000.pdf
+
+A GNU toolchain with support for AVR32 is included with the ATSTK1000
+BSP, which can be downloaded as an ISO image from
+
+http://www.atmel.com/dyn/products/tools_card.asp?tool_id=3918
+
+Alternatively, you can build it yourself by following the
+Getting Started guide at avr32linux.org, which also provides links
+to the necessary sources and patches you need to download:
+
+http://avr32linux.org/twiki/bin/view/Main/GettingStarted
+
+The AVR32 ports of u-boot, the Linux kernel, the GNU toolchain and
+other associated software are actively supported by Atmel Corporation.
+
+Signed-off-by: Haavard Skinnemoen <hskinnemoen@atmel.com>
index 680fe75d921ac5dcf1c6da7a685721f970ffeac4..423a79b2dd5a547c1a2e5db5d780e277aa86895f 100644 (file)
@@ -57,6 +57,10 @@ ifeq ($(ARCH),blackfin)
 LOAD_ADDR = 0x1000
 endif
 
+ifeq ($(ARCH),avr32)
+LOAD_ADDR = 0x00000000
+endif
+
 include $(TOPDIR)/config.mk
 
 ELF    = hello_world
index 1caa575747992c613ad8e7b9d24f697561b43934..ffd314e6b35c9985799b7ca8b5489484ec85d9fc 100644 (file)
@@ -138,6 +138,19 @@ gd_t *global_data;
 "      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");
 #else
 #error stubs definition missing for this architecture
 #endif
diff --git a/include/asm-avr32/addrspace.h b/include/asm-avr32/addrspace.h
new file mode 100644 (file)
index 0000000..b2ba1ee
--- /dev/null
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2006 Atmel Corporation
+ *
+ * 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 __ASM_AVR32_ADDRSPACE_H
+#define __ASM_AVR32_ADDRSPACE_H
+
+/* Memory segments when segmentation is enabled */
+#define P0SEG          0x00000000
+#define P1SEG          0x80000000
+#define P2SEG          0xa0000000
+#define P3SEG          0xc0000000
+#define P4SEG          0xe0000000
+
+/* Returns the privileged segment base of a given address */
+#define PXSEG(a)       (((unsigned long)(a)) & 0xe0000000)
+
+/* Returns the physical address of a PnSEG (n=1,2) address */
+#define PHYSADDR(a)    (((unsigned long)(a)) & 0x1fffffff)
+
+/*
+ * Map an address to a certain privileged segment
+ */
+#define P1SEGADDR(a) ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P1SEG))
+#define P2SEGADDR(a) ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P2SEG))
+#define P3SEGADDR(a) ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P3SEG))
+#define P4SEGADDR(a) ((__typeof__(a))(((unsigned long)(a) & 0x1fffffff) | P4SEG))
+
+#endif /* __ASM_AVR32_ADDRSPACE_H */
diff --git a/include/asm-avr32/bitops.h b/include/asm-avr32/bitops.h
new file mode 100644 (file)
index 0000000..f15fd46
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) 2006 Atmel Corporation
+ *
+ * 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 __ASM_AVR32_BITOPS_H
+#define __ASM_AVR32_BITOPS_H
+
+#endif /* __ASM_AVR32_BITOPS_H */
diff --git a/include/asm-avr32/byteorder.h b/include/asm-avr32/byteorder.h
new file mode 100644 (file)
index 0000000..2fe867e
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2006 Atmel Corporation
+ *
+ * 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 __ASM_AVR32_BYTEORDER_H
+#define __ASM_AVR32_BYTEORDER_H
+
+#include <asm/types.h>
+
+#define __arch__swab32(x) __builtin_bswap_32(x)
+#define __arch__swab16(x) __builtin_bswap_16(x)
+
+#if !defined(__STRICT_ANSI__) || defined(__KERNEL__)
+# define __BYTEORDER_HAS_U64__
+# define __SWAB_64_THRU_32__
+#endif
+
+#include <linux/byteorder/big_endian.h>
+
+#endif /* __ASM_AVR32_BYTEORDER_H */
diff --git a/include/asm-avr32/cacheflush.h b/include/asm-avr32/cacheflush.h
new file mode 100644 (file)
index 0000000..929f68e
--- /dev/null
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2006 Atmel Corporation
+ *
+ * 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 __ASM_AVR32_CACHEFLUSH_H
+#define __ASM_AVR32_CACHEFLUSH_H
+
+/*
+ * Invalidate any cacheline containing virtual address vaddr without
+ * writing anything back to memory.
+ *
+ * Note that this function may corrupt unrelated data structures when
+ * applied on buffers that are not cacheline aligned in both ends.
+ */
+static inline void dcache_invalidate_line(volatile void *vaddr)
+{
+       asm volatile("cache %0[0], 0x0b" : : "r"(vaddr) : "memory");
+}
+
+/*
+ * Make sure any cacheline containing virtual address vaddr is written
+ * to memory.
+ */
+static inline void dcache_clean_line(volatile void *vaddr)
+{
+       asm volatile("cache %0[0], 0x0c" : : "r"(vaddr) : "memory");
+}
+
+/*
+ * Make sure any cacheline containing virtual address vaddr is written
+ * to memory and then invalidate it.
+ */
+static inline void dcache_flush_line(volatile void *vaddr)
+{
+       asm volatile("cache %0[0], 0x0d" : : "r"(vaddr) : "memory");
+}
+
+/*
+ * Invalidate any instruction cacheline containing virtual address
+ * vaddr.
+ */
+static inline void icache_invalidate_line(volatile void *vaddr)
+{
+       asm volatile("cache %0[0], 0x01" : : "r"(vaddr) : "memory");
+}
+
+/*
+ * Applies the above functions on all lines that are touched by the
+ * specified virtual address range.
+ */
+void dcache_invalidate_range(volatile void *start, size_t len);
+void dcache_clean_range(volatile void *start, size_t len);
+void dcache_flush_range(volatile void *start, size_t len);
+void icache_invalidate_range(volatile void *start, size_t len);
+
+static inline void dcache_flush_unlocked(void)
+{
+       asm volatile("cache %0[5], 0x08" : : "r"(0) : "memory");
+}
+
+/*
+ * Make sure any pending writes are completed before continuing.
+ */
+#define sync_write_buffer() asm volatile("sync 0" : : : "memory")
+
+#endif /* __ASM_AVR32_CACHEFLUSH_H */
diff --git a/include/asm-avr32/div64.h b/include/asm-avr32/div64.h
new file mode 100644 (file)
index 0000000..2e0ba83
--- /dev/null
@@ -0,0 +1,39 @@
+#ifndef _ASM_GENERIC_DIV64_H
+#define _ASM_GENERIC_DIV64_H
+/*
+ * Copyright (C) 2003 Bernardo Innocenti <bernie@develer.com>
+ * Based on former asm-ppc/div64.h and asm-m68knommu/div64.h
+ *
+ * The semantics of do_div() are:
+ *
+ * uint32_t do_div(uint64_t *n, uint32_t base)
+ * {
+ *     uint32_t remainder = *n % base;
+ *     *n = *n / base;
+ *     return remainder;
+ * }
+ *
+ * NOTE: macro parameter n is evaluated multiple times,
+ *       beware of side effects!
+ */
+
+#include <linux/types.h>
+
+extern uint32_t __div64_32(uint64_t *dividend, uint32_t divisor);
+
+/* The unnecessary pointer compare is there
+ * to check for type safety (n must be 64bit)
+ */
+# define do_div(n,base) ({                             \
+       uint32_t __base = (base);                       \
+       uint32_t __rem;                                 \
+       (void)(((typeof((n)) *)0) == ((uint64_t *)0));  \
+       if (((n) >> 32) == 0) {                 \
+               __rem = (uint32_t)(n) % __base;         \
+               (n) = (uint32_t)(n) / __base;           \
+       } else                                          \
+               __rem = __div64_32(&(n), __base);       \
+       __rem;                                          \
+ })
+
+#endif /* _ASM_GENERIC_DIV64_H */
diff --git a/include/asm-avr32/dma-mapping.h b/include/asm-avr32/dma-mapping.h
new file mode 100644 (file)
index 0000000..3b46fa3
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) 2006 Atmel Corporation
+ *
+ * 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 __ASM_AVR32_DMA_MAPPING_H
+#define __ASM_AVR32_DMA_MAPPING_H
+
+#include <asm/io.h>
+#include <asm/cacheflush.h>
+
+enum dma_data_direction {
+       DMA_BIDIRECTIONAL       = 0,
+       DMA_TO_DEVICE           = 1,
+       DMA_FROM_DEVICE         = 2,
+};
+extern void *dma_alloc_coherent(size_t len, unsigned long *handle);
+
+static inline unsigned long dma_map_single(volatile void *vaddr, size_t len,
+                                          enum dma_data_direction dir)
+{
+       extern void __bad_dma_data_direction(void);
+
+       switch (dir) {
+       case DMA_BIDIRECTIONAL:
+               dcache_flush_range(vaddr, len);
+               break;
+       case DMA_TO_DEVICE:
+               dcache_clean_range(vaddr, len);
+               break;
+       case DMA_FROM_DEVICE:
+               dcache_invalidate_range(vaddr, len);
+               break;
+       default:
+               /* This will cause a linker error */
+               __bad_dma_data_direction();
+       }
+
+       return virt_to_phys(vaddr);
+}
+
+static inline void dma_unmap_single(volatile void *vaddr, size_t len,
+                                   unsigned long paddr)
+{
+
+}
+
+#endif /* __ASM_AVR32_DMA_MAPPING_H */
diff --git a/include/asm-avr32/errno.h b/include/asm-avr32/errno.h
new file mode 100644 (file)
index 0000000..ea3506f
--- /dev/null
@@ -0,0 +1,132 @@
+#ifndef _ASM_AVR32_ERRNO_H
+#define _ASM_AVR32_ERRNO_H
+
+#define        EPERM            1      /* Operation not permitted */
+#define        ENOENT           2      /* No such file or directory */
+#define        ESRCH            3      /* No such process */
+#define        EINTR            4      /* Interrupted system call */
+#define        EIO              5      /* I/O error */
+#define        ENXIO            6      /* No such device or address */
+#define        E2BIG            7      /* Argument list too long */
+#define        ENOEXEC          8      /* Exec format error */
+#define        EBADF            9      /* Bad file number */
+#define        ECHILD          10      /* No child processes */
+#define        EAGAIN          11      /* Try again */
+#define        ENOMEM          12      /* Out of memory */
+#define        EACCES          13      /* Permission denied */
+#define        EFAULT          14      /* Bad address */
+#define        ENOTBLK         15      /* Block device required */
+#define        EBUSY           16      /* Device or resource busy */
+#define        EEXIST          17      /* File exists */
+#define        EXDEV           18      /* Cross-device link */
+#define        ENODEV          19      /* No such device */
+#define        ENOTDIR         20      /* Not a directory */
+#define        EISDIR          21      /* Is a directory */
+#define        EINVAL          22      /* Invalid argument */
+#define        ENFILE          23      /* File table overflow */
+#define        EMFILE          24      /* Too many open files */
+#define        ENOTTY          25      /* Not a typewriter */
+#define        ETXTBSY         26      /* Text file busy */
+#define        EFBIG           27      /* File too large */
+#define        ENOSPC          28      /* No space left on device */
+#define        ESPIPE          29      /* Illegal seek */
+#define        EROFS           30      /* Read-only file system */
+#define        EMLINK          31      /* Too many links */
+#define        EPIPE           32      /* Broken pipe */
+#define        EDOM            33      /* Math argument out of domain of func */
+#define        ERANGE          34      /* Math result not representable */
+#define        EDEADLK         35      /* Resource deadlock would occur */
+#define        ENAMETOOLONG    36      /* File name too long */
+#define        ENOLCK          37      /* No record locks available */
+#define        ENOSYS          38      /* Function not implemented */
+#define        ENOTEMPTY       39      /* Directory not empty */
+#define        ELOOP           40      /* Too many symbolic links encountered */
+#define        EWOULDBLOCK     EAGAIN  /* Operation would block */
+#define        ENOMSG          42      /* No message of desired type */
+#define        EIDRM           43      /* Identifier removed */
+#define        ECHRNG          44      /* Channel number out of range */
+#define        EL2NSYNC        45      /* Level 2 not synchronized */
+#define        EL3HLT          46      /* Level 3 halted */
+#define        EL3RST          47      /* Level 3 reset */
+#define        ELNRNG          48      /* Link number out of range */
+#define        EUNATCH         49      /* Protocol driver not attached */
+#define        ENOCSI          50      /* No CSI structure available */
+#define        EL2HLT          51      /* Level 2 halted */
+#define        EBADE           52      /* Invalid exchange */
+#define        EBADR           53      /* Invalid request descriptor */
+#define        EXFULL          54      /* Exchange full */
+#define        ENOANO          55      /* No anode */
+#define        EBADRQC         56      /* Invalid request code */
+#define        EBADSLT         57      /* Invalid slot */
+
+#define        EDEADLOCK       EDEADLK
+
+#define        EBFONT          59      /* Bad font file format */
+#define        ENOSTR          60      /* Device not a stream */
+#define        ENODATA         61      /* No data available */
+#define        ETIME           62      /* Timer expired */
+#define        ENOSR           63      /* Out of streams resources */
+#define        ENONET          64      /* Machine is not on the network */
+#define        ENOPKG          65      /* Package not installed */
+#define        EREMOTE         66      /* Object is remote */
+#define        ENOLINK         67      /* Link has been severed */
+#define        EADV            68      /* Advertise error */
+#define        ESRMNT          69      /* Srmount error */
+#define        ECOMM           70      /* Communication error on send */
+#define        EPROTO          71      /* Protocol error */
+#define        EMULTIHOP       72      /* Multihop attempted */
+#define        EDOTDOT         73      /* RFS specific error */
+#define        EBADMSG         74      /* Not a data message */
+#define        EOVERFLOW       75      /* Value too large for defined data type */
+#define        ENOTUNIQ        76      /* Name not unique on network */
+#define        EBADFD          77      /* File descriptor in bad state */
+#define        EREMCHG         78      /* Remote address changed */
+#define        ELIBACC         79      /* Can not access a needed shared library */
+#define        ELIBBAD         80      /* Accessing a corrupted shared library */
+#define        ELIBSCN         81      /* .lib section in a.out corrupted */
+#define        ELIBMAX         82      /* Attempting to link in too many shared libraries */
+#define        ELIBEXEC        83      /* Cannot exec a shared library directly */
+#define        EILSEQ          84      /* Illegal byte sequence */
+#define        ERESTART        85      /* Interrupted system call should be restarted */
+#define        ESTRPIPE        86      /* Streams pipe error */
+#define        EUSERS          87      /* Too many users */
+#define        ENOTSOCK        88      /* Socket operation on non-socket */
+#define        EDESTADDRREQ    89      /* Destination address required */
+#define        EMSGSIZE        90      /* Message too long */
+#define        EPROTOTYPE      91      /* Protocol wrong type for socket */
+#define        ENOPROTOOPT     92      /* Protocol not available */
+#define        EPROTONOSUPPORT 93      /* Protocol not supported */
+#define        ESOCKTNOSUPPORT 94      /* Socket type not supported */
+#define        EOPNOTSUPP      95      /* Operation not supported on transport endpoint */
+#define        EPFNOSUPPORT    96      /* Protocol family not supported */
+#define        EAFNOSUPPORT    97      /* Address family not supported by protocol */
+#define        EADDRINUSE      98      /* Address already in use */
+#define        EADDRNOTAVAIL   99      /* Cannot assign requested address */
+#define        ENETDOWN        100     /* Network is down */
+#define        ENETUNREACH     101     /* Network is unreachable */
+#define        ENETRESET       102     /* Network dropped connection because of reset */
+#define        ECONNABORTED    103     /* Software caused connection abort */
+#define        ECONNRESET      104     /* Connection reset by peer */
+#define        ENOBUFS         105     /* No buffer space available */
+#define        EISCONN         106     /* Transport endpoint is already connected */
+#define        ENOTCONN        107     /* Transport endpoint is not connected */
+#define        ESHUTDOWN       108     /* Cannot send after transport endpoint shutdown */
+#define        ETOOMANYREFS    109     /* Too many references: cannot splice */
+#define        ETIMEDOUT       110     /* Connection timed out */
+#define        ECONNREFUSED    111     /* Connection refused */
+#define        EHOSTDOWN       112     /* Host is down */
+#define        EHOSTUNREACH    113     /* No route to host */
+#define        EALREADY        114     /* Operation already in progress */
+#define        EINPROGRESS     115     /* Operation now in progress */
+#define        ESTALE          116     /* Stale NFS file handle */
+#define        EUCLEAN         117     /* Structure needs cleaning */
+#define        ENOTNAM         118     /* Not a XENIX named type file */
+#define        ENAVAIL         119     /* No XENIX semaphores available */
+#define        EISNAM          120     /* Is a named type file */
+#define        EREMOTEIO       121     /* Remote I/O error */
+#define        EDQUOT          122     /* Quota exceeded */
+
+#define        ENOMEDIUM       123     /* No medium found */
+#define        EMEDIUMTYPE     124     /* Wrong medium type */
+
+#endif /* _ASM_AVR32_ERRNO_H */
diff --git a/include/asm-avr32/global_data.h b/include/asm-avr32/global_data.h
new file mode 100644 (file)
index 0000000..01d836c
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Copyright (C) 2004-2006 Atmel Corporation
+ *
+ * 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 __ASM_GLOBAL_DATA_H__
+#define __ASM_GLOBAL_DATA_H__
+
+/*
+ * The following data structure is placed in some memory wich is
+ * available very early after boot (like DPRAM on MPC8xx/MPC82xx, or
+ * some locked parts of the data cache) to allow for a minimum set of
+ * global variables during system initialization (until we have set
+ * up the memory controller so that we can use RAM).
+ *
+ * Keep it *SMALL* and remember to set CFG_GBL_DATA_SIZE > sizeof(gd_t)
+ */
+
+typedef        struct  global_data {
+       bd_t            *bd;
+       unsigned long   flags;
+       const struct device     *console_uart;
+       const struct device     *sm;
+       unsigned long   baudrate;
+       unsigned long   sdram_size;
+       unsigned long   have_console;   /* serial_init() was called */
+       unsigned long   reloc_off;      /* Relocation Offset */
+       unsigned long   env_addr;       /* Address of env struct */
+       unsigned long   env_valid;      /* Checksum of env valid? */
+       unsigned long   cpu_hz;         /* cpu core clock frequency */
+       void            **jt;           /* jump table */
+} gd_t;
+
+/*
+ * Global Data Flags
+ */
+#define GD_FLG_RELOC   0x00001         /* Code was relocated to RAM     */
+#define GD_FLG_DEVINIT 0x00002         /* Devices have been initialized */
+#define GD_FLG_SILENT  0x00004         /* Silent mode                   */
+
+#define DECLARE_GLOBAL_DATA_PTR register gd_t *gd asm("r5")
+
+#endif /* __ASM_GLOBAL_DATA_H__ */
diff --git a/include/asm-avr32/initcalls.h b/include/asm-avr32/initcalls.h
new file mode 100644 (file)
index 0000000..7ba25cd
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2005, 2006 Atmel Corporation
+ *
+ * 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 __ASM_AVR32_INITCALLS_H__
+#define __ASM_AVR32_INITCALLS_H__
+
+#include <config.h>
+
+extern int cpu_init(void);
+extern int timer_init(void);
+extern void board_init_memories(void);
+extern void board_init_pio(void);
+extern void board_init_info(void);
+
+#endif /* __ASM_AVR32_INITCALLS_H__ */
diff --git a/include/asm-avr32/io.h b/include/asm-avr32/io.h
new file mode 100644 (file)
index 0000000..e86c456
--- /dev/null
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2006 Atmel Corporation
+ *
+ * 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 __ASM_AVR32_IO_H
+#define __ASM_AVR32_IO_H
+
+#ifdef __KERNEL__
+
+/*
+ * Generic IO read/write.  These perform native-endian accesses.  Note
+ * that some architectures will want to re-define __raw_{read,write}w.
+ */
+extern void __raw_writesb(unsigned int addr, const void *data, int bytelen);
+extern void __raw_writesw(unsigned int addr, const void *data, int wordlen);
+extern void __raw_writesl(unsigned int addr, const void *data, int longlen);
+
+extern void __raw_readsb(unsigned int addr, void *data, int bytelen);
+extern void __raw_readsw(unsigned int addr, void *data, int wordlen);
+extern void __raw_readsl(unsigned int addr, void *data, int longlen);
+
+#define __raw_writeb(v,a)       (*(volatile unsigned char  *)(a) = (v))
+#define __raw_writew(v,a)       (*(volatile unsigned short *)(a) = (v))
+#define __raw_writel(v,a)       (*(volatile unsigned int   *)(a) = (v))
+
+#define __raw_readb(a)          (*(volatile unsigned char  *)(a))
+#define __raw_readw(a)          (*(volatile unsigned short *)(a))
+#define __raw_readl(a)          (*(volatile unsigned int   *)(a))
+
+/* As long as I/O is only performed in P4 (or possibly P3), we're safe */
+#define writeb(v,a)            __raw_writeb(v,a)
+#define writew(v,a)            __raw_writew(v,a)
+#define writel(v,a)            __raw_writel(v,a)
+
+#define readb(a)               __raw_readb(a)
+#define readw(a)               __raw_readw(a)
+#define readl(a)               __raw_readl(a)
+
+/*
+ * Bad read/write accesses...
+ */
+extern void __readwrite_bug(const char *fn);
+
+#define IO_SPACE_LIMIT 0xffffffff
+
+/*
+ * All I/O is memory mapped, so these macros doesn't make very much sense
+ */
+#define outb(v,p)              __raw_writeb(v, p)
+#define outw(v,p)              __raw_writew(cpu_to_le16(v),p)
+#define outl(v,p)              __raw_writel(cpu_to_le32(v),p)
+
+#define inb(p) ({ unsigned int __v = __raw_readb(p); __v; })
+#define inw(p) ({ unsigned int __v = __le16_to_cpu(__raw_readw(p)); __v; })
+#define inl(p) ({ unsigned int __v = __le32_to_cpu(__raw_readl(p)); __v; })
+
+#include <asm/addrspace.h>
+
+/* virt_to_phys will only work when address is in P1 or P2 */
+static __inline__ unsigned long virt_to_phys(volatile void *address)
+{
+       return PHYSADDR(address);
+}
+
+static __inline__ void * phys_to_virt(unsigned long address)
+{
+       return (void *)P1SEGADDR(address);
+}
+
+#define cached(addr) ((void *)P1SEGADDR(addr))
+#define uncached(addr) ((void *)P2SEGADDR(addr))
+
+#endif /* __KERNEL__ */
+
+#endif /* __ASM_AVR32_IO_H */
diff --git a/include/asm-avr32/posix_types.h b/include/asm-avr32/posix_types.h
new file mode 100644 (file)
index 0000000..edf1bc1
--- /dev/null
@@ -0,0 +1,144 @@
+/*
+ * Copyright (C) 2006 Atmel Corporation
+ *
+ * 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 __ASM_AVR32_POSIX_TYPES_H
+#define __ASM_AVR32_POSIX_TYPES_H
+
+/*
+ * This file is generally used by user-level software, so you need to
+ * be a little careful about namespace pollution etc.  Also, we cannot
+ * assume GCC is being used.
+ */
+
+typedef unsigned long  __kernel_dev_t;
+typedef unsigned long  __kernel_ino_t;
+typedef unsigned short __kernel_mode_t;
+typedef unsigned short __kernel_nlink_t;
+typedef long           __kernel_off_t;
+typedef int            __kernel_pid_t;
+typedef unsigned short __kernel_ipc_pid_t;
+typedef unsigned int   __kernel_uid_t;
+typedef unsigned int   __kernel_gid_t;
+typedef unsigned long  __kernel_size_t;
+typedef int            __kernel_ssize_t;
+typedef int            __kernel_ptrdiff_t;
+typedef long           __kernel_time_t;
+typedef long           __kernel_suseconds_t;
+typedef long           __kernel_clock_t;
+typedef int            __kernel_timer_t;
+typedef int            __kernel_clockid_t;
+typedef int            __kernel_daddr_t;
+typedef char *         __kernel_caddr_t;
+typedef unsigned short __kernel_uid16_t;
+typedef unsigned short __kernel_gid16_t;
+typedef unsigned int   __kernel_uid32_t;
+typedef unsigned int   __kernel_gid32_t;
+
+typedef unsigned short __kernel_old_uid_t;
+typedef unsigned short __kernel_old_gid_t;
+typedef unsigned short __kernel_old_dev_t;
+
+#ifdef __GNUC__
+typedef long long      __kernel_loff_t;
+#endif
+
+typedef struct {
+#if defined(__KERNEL__) || defined(__USE_ALL)
+       int     val[2];
+#else /* !defined(__KERNEL__) && !defined(__USE_ALL) */
+       int     __val[2];
+#endif /* !defined(__KERNEL__) && !defined(__USE_ALL) */
+} __kernel_fsid_t;
+
+#if defined(__KERNEL__)
+
+#undef  __FD_SET
+static __inline__ void __FD_SET(unsigned long __fd, __kernel_fd_set *__fdsetp)
+{
+       unsigned long __tmp = __fd / __NFDBITS;
+       unsigned long __rem = __fd % __NFDBITS;
+       __fdsetp->fds_bits[__tmp] |= (1UL<<__rem);
+}
+
+#undef  __FD_CLR
+static __inline__ void __FD_CLR(unsigned long __fd, __kernel_fd_set *__fdsetp)
+{
+       unsigned long __tmp = __fd / __NFDBITS;
+       unsigned long __rem = __fd % __NFDBITS;
+       __fdsetp->fds_bits[__tmp] &= ~(1UL<<__rem);
+}
+
+
+#undef  __FD_ISSET
+static __inline__ int __FD_ISSET(unsigned long __fd, const __kernel_fd_set *__p)
+{
+       unsigned long __tmp = __fd / __NFDBITS;
+       unsigned long __rem = __fd % __NFDBITS;
+       return (__p->fds_bits[__tmp] & (1UL<<__rem)) != 0;
+}
+
+/*
+ * This will unroll the loop for the normal constant case (8 ints,
+ * for a 256-bit fd_set)
+ */
+#undef  __FD_ZERO
+static __inline__ void __FD_ZERO(__kernel_fd_set *__p)
+{
+       unsigned long *__tmp = __p->fds_bits;
+       int __i;
+
+       if (__builtin_constant_p(__FDSET_LONGS)) {
+               switch (__FDSET_LONGS) {
+               case 16:
+                       __tmp[ 0] = 0; __tmp[ 1] = 0;
+                       __tmp[ 2] = 0; __tmp[ 3] = 0;
+                       __tmp[ 4] = 0; __tmp[ 5] = 0;
+                       __tmp[ 6] = 0; __tmp[ 7] = 0;
+                       __tmp[ 8] = 0; __tmp[ 9] = 0;
+                       __tmp[10] = 0; __tmp[11] = 0;
+                       __tmp[12] = 0; __tmp[13] = 0;
+                       __tmp[14] = 0; __tmp[15] = 0;
+                       return;
+
+               case 8:
+                       __tmp[ 0] = 0; __tmp[ 1] = 0;
+                       __tmp[ 2] = 0; __tmp[ 3] = 0;
+                       __tmp[ 4] = 0; __tmp[ 5] = 0;
+                       __tmp[ 6] = 0; __tmp[ 7] = 0;
+                       return;
+
+               case 4:
+                       __tmp[ 0] = 0; __tmp[ 1] = 0;
+                       __tmp[ 2] = 0; __tmp[ 3] = 0;
+                       return;
+               }
+       }
+       __i = __FDSET_LONGS;
+       while (__i) {
+               __i--;
+               *__tmp = 0;
+               __tmp++;
+       }
+}
+
+#endif /* defined(__KERNEL__) */
+
+#endif /* __ASM_AVR32_POSIX_TYPES_H */
diff --git a/include/asm-avr32/processor.h b/include/asm-avr32/processor.h
new file mode 100644 (file)
index 0000000..cc59dfa
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+ * Copyright (C) 2006 Atmel Corporation
+ *
+ * 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 __ASM_AVR32_PROCESSOR_H
+#define __ASM_AVR32_PROCESSOR_H
+
+#ifndef __ASSEMBLY__
+
+#define current_text_addr() ({ void *pc; __asm__("mov %0,pc" : "=r"(pc)); pc; })
+
+struct avr32_cpuinfo {
+       unsigned long loops_per_jiffy;
+};
+
+extern struct avr32_cpuinfo boot_cpu_data;
+
+#ifdef CONFIG_SMP
+extern struct avr32_cpuinfo cpu_data[];
+#define current_cpu_data cpu_data[smp_processor_id()]
+#else
+#define cpu_data (&boot_cpu_data)
+#define current_cpu_data boot_cpu_data
+#endif
+
+/* TODO: Make configurable (2GB will serve as a reasonable default) */
+#define TASK_SIZE      0x80000000
+
+/* This decides where the kernel will search for a free chunk of vm
+ * space during mmap's
+ */
+#define TASK_UNMAPPED_BASE     (TASK_SIZE / 3)
+
+#define cpu_relax()            barrier()
+#define cpu_sync_pipeline()    asm volatile("sub pc, -2" : : : "memory")
+
+/* This struct contains the CPU context as stored by switch_to() */
+struct thread_struct {
+       unsigned long pc;
+       unsigned long ksp;      /* Kernel stack pointer */
+       unsigned long r7;
+       unsigned long r6;
+       unsigned long r5;
+       unsigned long r4;
+       unsigned long r3;
+       unsigned long r2;
+       unsigned long r1;
+       unsigned long r0;
+};
+
+#define INIT_THREAD {                                          \
+       .ksp = sizeof(init_stack) + (long)&init_stack,          \
+}
+
+/*
+ * Do necessary setup to start up a newly executed thread.
+ */
+#define start_thread(regs, new_pc, new_sp)      \
+       set_fs(USER_DS);                         \
+       regs->sr = 0;           /* User mode. */ \
+       regs->gr[REG_PC] = new_pc;               \
+       regs->gr[REG_SP] = new_sp
+
+struct task_struct;
+
+/* Free all resources held by a thread */
+extern void release_thread(struct task_struct *);
+
+/* Create a kernel thread without removing it from tasklists */
+extern int kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
+
+/* Prepare to copy thread state - unlazy all lazy status */
+#define prepare_to_copy(tsk) do { } while(0)
+
+/* Return saved PC of a blocked thread */
+#define thread_saved_pc(tsk)    (tsk->thread.pc)
+
+#endif /* __ASSEMBLY__ */
+
+#endif /* __ASM_AVR32_PROCESSOR_H */
diff --git a/include/asm-avr32/ptrace.h b/include/asm-avr32/ptrace.h
new file mode 100644 (file)
index 0000000..c770ba0
--- /dev/null
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2006 Atmel Corporation
+ *
+ * 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 __ASM_AVR32_PTRACE_H
+#define __ASM_AVR32_PTRACE_H
+
+/*
+ * Status Register bits
+ */
+#define SR_H           0x40000000
+#define SR_R           0x20000000
+#define SR_J           0x10000000
+#define SR_DM          0x08000000
+#define SR_D           0x04000000
+#define MODE_NMI       0x01c00000
+#define MODE_EXCEPTION 0x01800000
+#define MODE_INT3      0x01400000
+#define MODE_INT2      0x01000000
+#define MODE_INT1      0x00c00000
+#define MODE_INT0      0x00800000
+#define MODE_SUPERVISOR        0x00400000
+#define MODE_USER      0x00000000
+#define MODE_MASK      0x01c00000
+#define SR_EM          0x00200000
+#define SR_I3M         0x00100000
+#define SR_I2M         0x00080000
+#define SR_I1M         0x00040000
+#define SR_I0M         0x00020000
+#define SR_GM          0x00010000
+
+#define MODE_SHIFT     22
+#define SR_EM_BIT      21
+#define SR_I3M_BIT     20
+#define SR_I2M_BIT     19
+#define SR_I1M_BIT     18
+#define SR_I0M_BIT     17
+#define SR_GM_BIT      16
+
+/* The user-visible part */
+#define SR_Q           0x00000010
+#define SR_V           0x00000008
+#define SR_N           0x00000004
+#define SR_Z           0x00000002
+#define SR_C           0x00000001
+
+/*
+ * The order is defined by the stdsp instruction. r0 is stored first, so it
+ * gets the highest address.
+ *
+ * Registers 0-12 are general-purpose registers (r12 is normally used for
+ * the function return value).
+ * Register 13 is the stack pointer
+ * Register 14 is the link register
+ * Register 15 is the program counter
+ */
+#define FRAME_SIZE_FULL 72
+#define REG_R12_ORIG   68
+#define REG_R0         64
+#define REG_R1         60
+#define REG_R2         56
+#define REG_R3         52
+#define REG_R4         48
+#define REG_R5         44
+#define REG_R6         40
+#define REG_R7         36
+#define REG_R8         32
+#define REG_R9         28
+#define REG_R10                34
+#define REG_R11                20
+#define REG_R12                16
+#define REG_SP         12
+#define REG_LR          8
+
+#define FRAME_SIZE_MIN  8
+#define REG_PC          4
+#define REG_SR          0
+
+#ifndef __ASSEMBLY__
+struct pt_regs {
+       /* These are always saved */
+       unsigned long sr;
+       unsigned long pc;
+
+       /* These are sometimes saved */
+       unsigned long lr;
+       unsigned long sp;
+       unsigned long r12;
+       unsigned long r11;
+       unsigned long r10;
+       unsigned long r9;
+       unsigned long r8;
+       unsigned long r7;
+       unsigned long r6;
+       unsigned long r5;
+       unsigned long r4;
+       unsigned long r3;
+       unsigned long r2;
+       unsigned long r1;
+       unsigned long r0;
+
+       /* Only saved on system call */
+       unsigned long r12_orig;
+};
+
+#ifdef __KERNEL__
+# define user_mode(regs) (((regs)->sr & MODE_MASK) == MODE_USER)
+# define instruction_pointer(regs) ((regs)->pc)
+extern void show_regs (struct pt_regs *);
+
+static __inline__ int valid_user_regs(struct pt_regs *regs)
+{
+       /*
+        * Some of the Java bits might be acceptable if/when we
+        * implement some support for that stuff...
+        */
+       if ((regs->sr & 0xffff0000) == 0)
+               return 1;
+
+       /*
+        * Force status register flags to be sane and report this
+        * illegal behaviour...
+        */
+       regs->sr &= 0x0000ffff;
+       return 0;
+}
+#endif
+
+#endif /* ! __ASSEMBLY__ */
+
+#endif /* __ASM_AVR32_PTRACE_H */
diff --git a/include/asm-avr32/sdram.h b/include/asm-avr32/sdram.h
new file mode 100644 (file)
index 0000000..5057eef
--- /dev/null
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2006 Atmel Corporation
+ *
+ * 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 __ASM_AVR32_SDRAM_H
+#define __ASM_AVR32_SDRAM_H
+
+struct sdram_info {
+       unsigned long phys_addr;
+       unsigned int row_bits, col_bits, bank_bits;
+       unsigned int cas, twr, trc, trp, trcd, tras, txsr;
+};
+
+extern unsigned long sdram_init(const struct sdram_info *info);
+
+#endif /* __ASM_AVR32_SDRAM_H */
diff --git a/include/asm-avr32/sections.h b/include/asm-avr32/sections.h
new file mode 100644 (file)
index 0000000..75373ab
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2006 Atmel Corporation
+ *
+ * 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 __ASM_AVR32_SECTIONS_H
+#define __ASM_AVR32_SECTIONS_H
+
+/* References to section boundaries */
+
+extern char _text[], _etext[];
+extern char __flashprog_start[], __flashprog_end[];
+extern char _data[], __data_lma[], _edata[], __edata_lma[];
+extern char __got_start[], __got_lma[], __got_end[];
+extern char _end[];
+
+/*
+ * Everything in .flashprog will be locked in the icache so it doesn't
+ * get disturbed when executing flash commands.
+ */
+#define __flashprog __attribute__((section(".flashprog"), __noinline__))
+
+#endif /* __ASM_AVR32_SECTIONS_H */
diff --git a/include/asm-avr32/setup.h b/include/asm-avr32/setup.h
new file mode 100644 (file)
index 0000000..e6ef8d6
--- /dev/null
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) 2004-2006 Atmel Corporation
+ *
+ * Based on linux/include/asm-arm/setup.h
+ *   Copyright (C) 1997-1999 Russel King
+ *
+ * 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 __ASM_AVR32_SETUP_H__
+#define __ASM_AVR32_SETUP_H__
+
+#define COMMAND_LINE_SIZE 256
+
+/* Magic number indicating that a tag table is present */
+#define ATAG_MAGIC     0xa2a25441
+
+#ifndef __ASSEMBLY__
+
+/*
+ * Generic memory range, used by several tags.
+ *
+ *   addr is always physical.
+ *   size is measured in bytes.
+ *   next is for use by the OS, e.g. for grouping regions into
+ *       linked lists.
+ */
+struct tag_mem_range {
+       u32                     addr;
+       u32                     size;
+       struct tag_mem_range *  next;
+};
+
+/* The list ends with an ATAG_NONE node. */
+#define ATAG_NONE      0x00000000
+
+struct tag_header {
+       u32 size;
+       u32 tag;
+};
+
+/* The list must start with an ATAG_CORE node */
+#define ATAG_CORE      0x54410001
+
+struct tag_core {
+       u32 flags;
+       u32 pagesize;
+       u32 rootdev;
+};
+
+/* it is allowed to have multiple ATAG_MEM nodes */
+#define ATAG_MEM       0x54410002
+/* ATAG_MEM uses tag_mem_range */
+
+/* command line: \0 terminated string */
+#define ATAG_CMDLINE   0x54410003
+
+struct tag_cmdline {
+       char    cmdline[1];     /* this is the minimum size */
+};
+
+/* Ramdisk image (may be compressed) */
+#define ATAG_RDIMG     0x54410004
+/* ATAG_RDIMG uses tag_mem_range */
+
+/* Information about various clocks present in the system */
+#define ATAG_CLOCK     0x54410005
+
+struct tag_clock {
+       u32     clock_id;       /* Which clock are we talking about? */
+       u32     clock_flags;    /* Special features */
+       u64     clock_hz;       /* Clock speed in Hz */
+};
+
+/* The clock types we know about */
+#define ACLOCK_BOOTCPU 0       /* The CPU we're booting from */
+#define ACLOCK_HSB     1       /* Deprecated */
+
+/* Memory reserved for the system (e.g. the bootloader) */
+#define ATAG_RSVD_MEM  0x54410006
+/* ATAG_RSVD_MEM uses tag_mem_range */
+
+/* Ethernet information */
+
+#define ATAG_ETHERNET  0x54410007
+
+struct tag_ethernet {
+       u8      mac_index;
+       u8      mii_phy_addr;
+       u8      hw_address[6];
+};
+
+#define AETH_INVALID_PHY       0xff
+
+struct tag {
+       struct tag_header hdr;
+       union {
+               struct tag_core core;
+               struct tag_mem_range mem_range;
+               struct tag_cmdline cmdline;
+               struct tag_clock clock;
+               struct tag_ethernet ethernet;
+       } u;
+};
+
+struct tagtable {
+       u32     tag;
+       int     (*parse)(struct tag *);
+};
+
+#define __tag __attribute_used__ __attribute__((__section__(".taglist")))
+#define __tagtable(tag, fn)                                            \
+       static struct tagtable __tagtable_##fn __tag = { tag, fn }
+
+#define tag_member_present(tag,member)                                 \
+       ((unsigned long)(&((struct tag *)0L)->member + 1)               \
+        <= (tag)->hdr.size * 4)
+
+#define tag_next(t)    ((struct tag *)((u32 *)(t) + (t)->hdr.size))
+#define tag_size(type) ((sizeof(struct tag_header) + sizeof(struct type)) >> 2)
+
+#define for_each_tag(t,base)                                           \
+       for (t = base; t->hdr.size; t = tag_next(t))
+
+#endif /* !__ASSEMBLY__ */
+
+#endif /* __ASM_AVR32_SETUP_H__ */
diff --git a/include/asm-avr32/string.h b/include/asm-avr32/string.h
new file mode 100644 (file)
index 0000000..8b05d1a
--- /dev/null
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2006 Atmel Corporation
+ *
+ * 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 __ASM_AVR32_STRING_H
+#define __ASM_AVR32_STRING_H
+
+#define __HAVE_ARCH_MEMSET
+extern void *memset(void *s, int c, size_t n);
+
+#endif /* __ASM_AVR32_STRING_H */
diff --git a/include/asm-avr32/sysreg.h b/include/asm-avr32/sysreg.h
new file mode 100644 (file)
index 0000000..72ad49e
--- /dev/null
@@ -0,0 +1,279 @@
+/*
+ * System registers for AVR32
+ */
+#ifndef __ASM_AVR32_SYSREG_H__
+#define __ASM_AVR32_SYSREG_H__
+
+/* system register offsets */
+#define SYSREG_SR                      0x0000
+#define SYSREG_EVBA                    0x0004
+#define SYSREG_ACBA                    0x0008
+#define SYSREG_CPUCR                   0x000c
+#define SYSREG_ECR                     0x0010
+#define SYSREG_RSR_SUP                 0x0014
+#define SYSREG_RSR_INT0                        0x0018
+#define SYSREG_RSR_INT1                        0x001c
+#define SYSREG_RSR_INT2                        0x0020
+#define SYSREG_RSR_INT3                        0x0024
+#define SYSREG_RSR_EX                  0x0028
+#define SYSREG_RSR_NMI                 0x002c
+#define SYSREG_RSR_DBG                 0x0030
+#define SYSREG_RAR_SUP                 0x0034
+#define SYSREG_RAR_INT0                        0x0038
+#define SYSREG_RAR_INT1                        0x003c
+#define SYSREG_RAR_INT2                        0x0040
+#define SYSREG_RAR_INT3                        0x0044
+#define SYSREG_RAR_EX                  0x0048
+#define SYSREG_RAR_NMI                 0x004c
+#define SYSREG_RAR_DBG                 0x0050
+#define SYSREG_JECR                    0x0054
+#define SYSREG_JOSP                    0x0058
+#define SYSREG_JAVA_LV0                        0x005c
+#define SYSREG_JAVA_LV1                        0x0060
+#define SYSREG_JAVA_LV2                        0x0064
+#define SYSREG_JAVA_LV3                        0x0068
+#define SYSREG_JAVA_LV4                        0x006c
+#define SYSREG_JAVA_LV5                        0x0070
+#define SYSREG_JAVA_LV6                        0x0074
+#define SYSREG_JAVA_LV7                        0x0078
+#define SYSREG_JTBA                    0x007c
+#define SYSREG_JBCR                    0x0080
+#define SYSREG_CONFIG0                 0x0100
+#define SYSREG_CONFIG1                 0x0104
+#define SYSREG_COUNT                   0x0108
+#define SYSREG_COMPARE                 0x010c
+#define SYSREG_TLBEHI                  0x0110
+#define SYSREG_TLBELO                  0x0114
+#define SYSREG_PTBR                    0x0118
+#define SYSREG_TLBEAR                  0x011c
+#define SYSREG_MMUCR                   0x0120
+#define SYSREG_TLBARLO                 0x0124
+#define SYSREG_TLBARHI                 0x0128
+#define SYSREG_PCCNT                   0x012c
+#define SYSREG_PCNT0                   0x0130
+#define SYSREG_PCNT1                   0x0134
+#define SYSREG_PCCR                    0x0138
+#define SYSREG_BEAR                    0x013c
+#define SYSREG_SABAL                   0x0300
+#define SYSREG_SABAH                   0x0304
+#define SYSREG_SABD                    0x0308
+
+/* Bitfields in SR */
+#define SYSREG_SR_C_OFFSET             0
+#define SYSREG_SR_C_SIZE               1
+#define SYSREG_Z_OFFSET                        1
+#define SYSREG_Z_SIZE                  1
+#define SYSREG_SR_N_OFFSET             2
+#define SYSREG_SR_N_SIZE               1
+#define SYSREG_SR_V_OFFSET             3
+#define SYSREG_SR_V_SIZE               1
+#define SYSREG_Q_OFFSET                        4
+#define SYSREG_Q_SIZE                  1
+#define SYSREG_L_OFFSET                        5
+#define SYSREG_L_SIZE                  1
+#define SYSREG_T_OFFSET                        14
+#define SYSREG_T_SIZE                  1
+#define SYSREG_SR_R_OFFSET             15
+#define SYSREG_SR_R_SIZE               1
+#define SYSREG_GM_OFFSET               16
+#define SYSREG_GM_SIZE                 1
+#define SYSREG_I0M_OFFSET              17
+#define SYSREG_I0M_SIZE                        1
+#define SYSREG_I1M_OFFSET              18
+#define SYSREG_I1M_SIZE                        1
+#define SYSREG_I2M_OFFSET              19
+#define SYSREG_I2M_SIZE                        1
+#define SYSREG_I3M_OFFSET              20
+#define SYSREG_I3M_SIZE                        1
+#define SYSREG_EM_OFFSET               21
+#define SYSREG_EM_SIZE                 1
+#define SYSREG_M0_OFFSET               22
+#define SYSREG_M0_SIZE                 1
+#define SYSREG_M1_OFFSET               23
+#define SYSREG_M1_SIZE                 1
+#define SYSREG_M2_OFFSET               24
+#define SYSREG_M2_SIZE                 1
+#define SYSREG_SR_D_OFFSET             26
+#define SYSREG_SR_D_SIZE               1
+#define SYSREG_DM_OFFSET               27
+#define SYSREG_DM_SIZE                 1
+#define SYSREG_SR_J_OFFSET             28
+#define SYSREG_SR_J_SIZE               1
+#define SYSREG_H_OFFSET                        29
+#define SYSREG_H_SIZE                  1
+
+/* Bitfields in CPUCR */
+#define SYSREG_BI_OFFSET               0
+#define SYSREG_BI_SIZE                 1
+#define SYSREG_BE_OFFSET               1
+#define SYSREG_BE_SIZE                 1
+#define SYSREG_FE_OFFSET               2
+#define SYSREG_FE_SIZE                 1
+#define SYSREG_RE_OFFSET               3
+#define SYSREG_RE_SIZE                 1
+#define SYSREG_IBE_OFFSET              4
+#define SYSREG_IBE_SIZE                        1
+#define SYSREG_IEE_OFFSET              5
+#define SYSREG_IEE_SIZE                        1
+
+/* Bitfields in ECR */
+#define SYSREG_ECR_OFFSET              0
+#define SYSREG_ECR_SIZE                        32
+
+/* Bitfields in CONFIG0 */
+#define SYSREG_CONFIG0_R_OFFSET                0
+#define SYSREG_CONFIG0_R_SIZE          1
+#define SYSREG_CONFIG0_D_OFFSET                1
+#define SYSREG_CONFIG0_D_SIZE          1
+#define SYSREG_CONFIG0_S_OFFSET                2
+#define SYSREG_CONFIG0_S_SIZE          1
+#define SYSREG_O_OFFSET                        3
+#define SYSREG_O_SIZE                  1
+#define SYSREG_P_OFFSET                        4
+#define SYSREG_P_SIZE                  1
+#define SYSREG_CONFIG0_J_OFFSET                5
+#define SYSREG_CONFIG0_J_SIZE          1
+#define SYSREG_F_OFFSET                        6
+#define SYSREG_F_SIZE                  1
+#define SYSREG_MMUT_OFFSET             7
+#define SYSREG_MMUT_SIZE               3
+#define SYSREG_AR_OFFSET               10
+#define SYSREG_AR_SIZE                 3
+#define SYSREG_AT_OFFSET               13
+#define SYSREG_AT_SIZE                 3
+#define SYSREG_PROCESSORREVISION_OFFSET        16
+#define SYSREG_PROCESSORREVISION_SIZE  8
+#define SYSREG_PROCESSORID_OFFSET      24
+#define SYSREG_PROCESSORID_SIZE                8
+
+/* Bitfields in CONFIG1 */
+#define SYSREG_DASS_OFFSET             0
+#define SYSREG_DASS_SIZE               3
+#define SYSREG_DLSZ_OFFSET             3
+#define SYSREG_DLSZ_SIZE               3
+#define SYSREG_DSET_OFFSET             6
+#define SYSREG_DSET_SIZE               4
+#define SYSREG_IASS_OFFSET             10
+#define SYSREG_IASS_SIZE               3
+#define SYSREG_ILSZ_OFFSET             13
+#define SYSREG_ILSZ_SIZE               3
+#define SYSREG_ISET_OFFSET             16
+#define SYSREG_ISET_SIZE               4
+#define SYSREG_DMMUSZ_OFFSET           20
+#define SYSREG_DMMUSZ_SIZE             6
+#define SYSREG_IMMUSZ_OFFSET           26
+#define SYSREG_IMMUSZ_SIZE             6
+
+/* Bitfields in TLBEHI */
+#define SYSREG_ASID_OFFSET             0
+#define SYSREG_ASID_SIZE               8
+#define SYSREG_TLBEHI_I_OFFSET         8
+#define SYSREG_TLBEHI_I_SIZE           1
+#define SYSREG_TLBEHI_V_OFFSET         9
+#define SYSREG_TLBEHI_V_SIZE           1
+#define SYSREG_VPN_OFFSET              10
+#define SYSREG_VPN_SIZE                        22
+
+/* Bitfields in TLBELO */
+#define SYSREG_W_OFFSET                        0
+#define SYSREG_W_SIZE                  1
+#define SYSREG_TLBELO_D_OFFSET         1
+#define SYSREG_TLBELO_D_SIZE           1
+#define SYSREG_SZ_OFFSET               2
+#define SYSREG_SZ_SIZE                 2
+#define SYSREG_AP_OFFSET               4
+#define SYSREG_AP_SIZE                 3
+#define SYSREG_B_OFFSET                        7
+#define SYSREG_B_SIZE                  1
+#define SYSREG_G_OFFSET                        8
+#define SYSREG_G_SIZE                  1
+#define SYSREG_TLBELO_C_OFFSET         9
+#define SYSREG_TLBELO_C_SIZE           1
+#define SYSREG_PFN_OFFSET              10
+#define SYSREG_PFN_SIZE                        22
+
+/* Bitfields in MMUCR */
+#define SYSREG_E_OFFSET                        0
+#define SYSREG_E_SIZE                  1
+#define SYSREG_M_OFFSET                        1
+#define SYSREG_M_SIZE                  1
+#define SYSREG_MMUCR_I_OFFSET          2
+#define SYSREG_MMUCR_I_SIZE            1
+#define SYSREG_MMUCR_N_OFFSET          3
+#define SYSREG_MMUCR_N_SIZE            1
+#define SYSREG_MMUCR_S_OFFSET          4
+#define SYSREG_MMUCR_S_SIZE            1
+#define SYSREG_DLA_OFFSET              8
+#define SYSREG_DLA_SIZE                        6
+#define SYSREG_DRP_OFFSET              14
+#define SYSREG_DRP_SIZE                        6
+#define SYSREG_ILA_OFFSET              20
+#define SYSREG_ILA_SIZE                        6
+#define SYSREG_IRP_OFFSET              26
+#define SYSREG_IRP_SIZE                        6
+
+/* Bitfields in PCCR */
+#define SYSREG_PCCR_R_OFFSET           1
+#define SYSREG_PCCR_R_SIZE             1
+#define SYSREG_PCCR_C_OFFSET           2
+#define SYSREG_PCCR_C_SIZE             1
+#define SYSREG_PCCR_S_OFFSET           3
+#define SYSREG_PCCR_S_SIZE             1
+#define SYSREG_IEC_OFFSET              4
+#define SYSREG_IEC_SIZE                        1
+#define SYSREG_IE0_OFFSET              5
+#define SYSREG_IE0_SIZE                        1
+#define SYSREG_IE1_OFFSET              6
+#define SYSREG_IE1_SIZE                        1
+#define SYSREG_FC_OFFSET               8
+#define SYSREG_FC_SIZE                 1
+#define SYSREG_F0_OFFSET               9
+#define SYSREG_F0_SIZE                 1
+#define SYSREG_F1_OFFSET               10
+#define SYSREG_F1_SIZE                 1
+#define SYSREG_CONF0_OFFSET            12
+#define SYSREG_CONF0_SIZE              6
+#define SYSREG_CONF1_OFFSET            18
+#define SYSREG_CONF1_SIZE              6
+
+/* Constants for ECR */
+#define ECR_UNRECOVERABLE              0
+#define ECR_TLB_MULTIPLE               1
+#define ECR_BUS_ERROR_WRITE            2
+#define ECR_BUS_ERROR_READ             3
+#define ECR_NMI                                4
+#define ECR_ADDR_ALIGN_X               5
+#define ECR_PROTECTION_X               6
+#define ECR_DEBUG                      7
+#define ECR_ILLEGAL_OPCODE             8
+#define ECR_UNIMPL_INSTRUCTION         9
+#define ECR_PRIVILEGE_VIOLATION                10
+#define ECR_FPE                                11
+#define ECR_COPROC_ABSENT              12
+#define ECR_ADDR_ALIGN_R               13
+#define ECR_ADDR_ALIGN_W               14
+#define ECR_PROTECTION_R               15
+#define ECR_PROTECTION_W               16
+#define ECR_DTLB_MODIFIED              17
+#define ECR_TLB_MISS_X                 20
+#define ECR_TLB_MISS_R                 24
+#define ECR_TLB_MISS_W                 28
+
+/* Bit manipulation macros */
+#define SYSREG_BIT(name)               (1 << SYSREG_##name##_OFFSET)
+#define SYSREG_BF(name,value)                          \
+       (((value) & ((1 << SYSREG_##name##_SIZE) - 1))  \
+        << SYSREG_##name##_OFFSET)
+#define SYSREG_BFEXT(name,value)                       \
+       (((value) >> SYSREG_##name##_OFFSET)            \
+        & ((1 << SYSREG_##name##_SIZE) - 1))
+#define SYSREG_BFINS(name,value,old)                   \
+       (((old) & ~(((1 << SYSREG_##name##_SIZE) - 1)   \
+                   << SYSREG_##name##_OFFSET))         \
+        | SYSREG_BF(name,value))
+
+/* Register access macros */
+#define sysreg_read(reg)               __builtin_mfsr(SYSREG_##reg)
+#define sysreg_write(reg, value)       __builtin_mtsr(SYSREG_##reg, value)
+
+#endif /* __ASM_AVR32_SYSREG_H__ */
diff --git a/include/asm-avr32/types.h b/include/asm-avr32/types.h
new file mode 100644 (file)
index 0000000..e6c65d9
--- /dev/null
@@ -0,0 +1,84 @@
+/*
+ * Copyright (C) 2006 Atmel Corporation
+ *
+ * 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 __ASM_AVR32_TYPES_H
+#define __ASM_AVR32_TYPES_H
+
+#ifndef __ASSEMBLY__
+
+typedef unsigned short umode_t;
+
+/*
+ * __xx is ok: it doesn't pollute the POSIX namespace. Use these in the
+ * header files exported to user space
+ */
+typedef __signed__ char __s8;
+typedef unsigned char __u8;
+
+typedef __signed__ short __s16;
+typedef unsigned short __u16;
+
+typedef __signed__ int __s32;
+typedef unsigned int __u32;
+
+#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
+typedef __signed__ long long __s64;
+typedef unsigned long long __u64;
+#endif
+
+#endif /* __ASSEMBLY__ */
+
+/*
+ * These aren't exported outside the kernel to avoid name space clashes
+ */
+#ifdef __KERNEL__
+
+#define BITS_PER_LONG 32
+
+#ifndef __ASSEMBLY__
+
+typedef __signed__ char s8;
+typedef unsigned char u8;
+
+typedef __signed__ short s16;
+typedef unsigned short u16;
+
+typedef __signed__ int s32;
+typedef unsigned int u32;
+
+typedef __signed__ long long s64;
+typedef unsigned long long u64;
+
+/* Dma addresses are 32-bits wide.  */
+
+typedef u32 dma_addr_t;
+
+#ifdef CONFIG_LBD
+typedef u64 sector_t;
+#define HAVE_SECTOR_T
+#endif
+
+#endif /* __ASSEMBLY__ */
+
+#endif /* __KERNEL__ */
+
+
+#endif /* __ASM_AVR32_TYPES_H */
diff --git a/include/asm-avr32/u-boot.h b/include/asm-avr32/u-boot.h
new file mode 100644 (file)
index 0000000..71dfcaf
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * Copyright (C) 2004-2006 Atmel Corporation
+ *
+ * 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 __ASM_U_BOOT_H__
+#define __ASM_U_BOOT_H__ 1
+
+typedef struct bd_info {
+       unsigned long           bi_baudrate;
+       unsigned long           bi_ip_addr;
+       unsigned char           bi_enetaddr[6];
+       unsigned char           bi_phy_id[4];
+       struct environment_s    *bi_env;
+       unsigned long           bi_board_number;
+       void                    *bi_boot_params;
+       struct {
+               unsigned long   start;
+               unsigned long   size;
+       }                       bi_dram[CONFIG_NR_DRAM_BANKS];
+       unsigned long           bi_flashstart;
+       unsigned long           bi_flashsize;
+       unsigned long           bi_flashoffset;
+} bd_t;
+
+#define bi_memstart bi_dram[0].start
+#define bi_memsize bi_dram[0].size
+
+/**
+ *  container_of - cast a member of a structure out to the containing structure
+ *
+ *    @ptr:        the pointer to the member.
+ *    @type:       the type of the container struct this is embedded in.
+ *    @member:     the name of the member within the struct.
+ */
+#define container_of(ptr, type, member) ({                      \
+       const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
+       (type *)( (char *)__mptr - offsetof(type,member) );})
+
+#endif /* __ASM_U_BOOT_H__ */
diff --git a/lib_avr32/Makefile b/lib_avr32/Makefile
new file mode 100644 (file)
index 0000000..5b6300b
--- /dev/null
@@ -0,0 +1,47 @@
+#
+# (C) Copyright 2002-2006
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# (C) Copyright 2004-2006 Atmel Corporation
+#
+# See file CREDITS for list of people who contributed to this
+# project.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA
+#
+
+include $(TOPDIR)/config.mk
+
+LIB    = $(obj)lib$(ARCH).a
+
+SOBJS  = memset.o
+
+COBJS  = board.o interrupts.o avr32_linux.o div64.o
+
+SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(SOBJS) $(COBJS))
+
+$(LIB):        $(obj).depend $(OBJS)
+       $(AR) crv $@ $(OBJS)
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/lib_avr32/avr32_linux.c b/lib_avr32/avr32_linux.c
new file mode 100644 (file)
index 0000000..d128dfb
--- /dev/null
@@ -0,0 +1,315 @@
+/*
+ * Copyright (C) 2004-2006 Atmel Corporation
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+#include <common.h>
+#include <command.h>
+#include <image.h>
+#include <zlib.h>
+#include <asm/byteorder.h>
+#include <asm/addrspace.h>
+#include <asm/io.h>
+#include <asm/setup.h>
+#include <asm/arch/platform.h>
+
+DECLARE_GLOBAL_DATA_PTR;
+
+extern int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]);
+
+/* CPU-specific hook to allow flushing of caches, etc. */
+extern void prepare_to_boot(void);
+
+#ifdef CONFIG_SHOW_BOOT_PROGRESS
+# include <status_led.h>
+# define SHOW_BOOT_PROGRESS(arg) show_boot_progress(arg)
+#else
+# define SHOW_BOOT_PROGRESS(arg)
+#endif
+
+extern image_header_t header;          /* from cmd_bootm.c */
+
+static struct tag *setup_start_tag(struct tag *params)
+{
+       params->hdr.tag = ATAG_CORE;
+       params->hdr.size = tag_size(tag_core);
+
+       params->u.core.flags = 0;
+       params->u.core.pagesize = 4096;
+       params->u.core.rootdev = 0;
+
+       return tag_next(params);
+}
+
+static struct tag *setup_memory_tags(struct tag *params)
+{
+       bd_t *bd = gd->bd;
+       int i;
+
+       for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
+               params->hdr.tag = ATAG_MEM;
+               params->hdr.size = tag_size(tag_mem_range);
+
+               params->u.mem_range.addr = bd->bi_dram[i].start;
+               params->u.mem_range.size = bd->bi_dram[i].size;
+
+               params = tag_next(params);
+       }
+
+       return params;
+}
+
+static struct tag *setup_commandline_tag(struct tag *params, char *cmdline)
+{
+       if (!cmdline)
+               return params;
+
+       /* eat leading white space */
+       while (*cmdline == ' ') cmdline++;
+
+       /*
+        * Don't include tags for empty command lines; let the kernel
+        * use its default command line.
+        */
+       if (*cmdline == '\0')
+               return params;
+
+       params->hdr.tag = ATAG_CMDLINE;
+       params->hdr.size =
+               (sizeof (struct tag_header) + strlen(cmdline) + 1 + 3) >> 2;
+       strcpy(params->u.cmdline.cmdline, cmdline);
+
+       return tag_next(params);
+}
+
+static struct tag *setup_ramdisk_tag(struct tag *params,
+                                    unsigned long rd_start,
+                                    unsigned long rd_end)
+{
+       if (rd_start == rd_end)
+               return params;
+
+       params->hdr.tag = ATAG_RDIMG;
+       params->hdr.size = tag_size(tag_mem_range);
+
+       params->u.mem_range.addr = rd_start;
+       params->u.mem_range.size = rd_end - rd_start;
+
+       return tag_next(params);
+}
+
+static struct tag *setup_clock_tags(struct tag *params)
+{
+       params->hdr.tag = ATAG_CLOCK;
+       params->hdr.size = tag_size(tag_clock);
+       params->u.clock.clock_id = ACLOCK_BOOTCPU;
+       params->u.clock.clock_flags = 0;
+       params->u.clock.clock_hz = gd->cpu_hz;
+
+#ifdef CONFIG_AT32AP7000
+       /*
+        * New kernels don't need this, but we should be backwards
+        * compatible for a while...
+        */
+       params = tag_next(params);
+
+       params->hdr.tag = ATAG_CLOCK;
+       params->hdr.size = tag_size(tag_clock);
+       params->u.clock.clock_id = ACLOCK_HSB;
+       params->u.clock.clock_flags = 0;
+       params->u.clock.clock_hz = pm_get_clock_freq(CLOCK_HSB);
+#endif
+
+       return tag_next(params);
+}
+
+static struct tag *setup_ethernet_tag(struct tag *params,
+                                     char *addr, int index)
+{
+       char *s, *e;
+       int i;
+
+       params->hdr.tag = ATAG_ETHERNET;
+       params->hdr.size = tag_size(tag_ethernet);
+
+       params->u.ethernet.mac_index = index;
+       params->u.ethernet.mii_phy_addr = gd->bd->bi_phy_id[index];
+
+       s = addr;
+       for (i = 0; i < 6; i++) {
+               params->u.ethernet.hw_address[i] = simple_strtoul(s, &e, 16);
+               s = e + 1;
+       }
+
+       return tag_next(params);
+}
+
+static struct tag *setup_ethernet_tags(struct tag *params)
+{
+       char name[16] = "ethaddr";
+       char *addr;
+       int i = 0;
+
+       do {
+               addr = getenv(name);
+               if (addr)
+                       params = setup_ethernet_tag(params, addr, i);
+               sprintf(name, "eth%daddr", ++i);
+       } while (i < 4);
+
+       return params;
+}
+
+static void setup_end_tag(struct tag *params)
+{
+       params->hdr.tag = ATAG_NONE;
+       params->hdr.size = 0;
+}
+
+void do_bootm_linux(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
+                   unsigned long addr, unsigned long *len_ptr, int verify)
+{
+       unsigned long data, len = 0;
+       unsigned long initrd_start, initrd_end;
+       unsigned long image_start, image_end;
+       unsigned long checksum;
+       void (*theKernel)(int magic, void *tagtable);
+       image_header_t *hdr;
+       struct tag *params, *params_start;
+       char *commandline = getenv("bootargs");
+
+       hdr = (image_header_t *)addr;
+       image_start = addr;
+       image_end = addr + hdr->ih_size;
+
+       theKernel = (void *)ntohl(hdr->ih_ep);
+
+       /*
+        * Check if there is an initrd image
+        */
+       if (argc >= 3) {
+               SHOW_BOOT_PROGRESS(9);
+
+               addr = simple_strtoul(argv[2], NULL, 16);
+
+               printf("## Loading RAMDISK image at %08lx ...\n", addr);
+
+               memcpy(&header, (char *)addr, sizeof(header));
+               hdr = &header;
+
+               if (ntohl(hdr->ih_magic) != IH_MAGIC) {
+                       puts("Bad Magic Number\n");
+                       SHOW_BOOT_PROGRESS(-10);
+                       do_reset(cmdtp, flag, argc, argv);
+               }
+
+               data = (unsigned long)hdr;
+               len = sizeof(*hdr);
+               checksum = ntohl(hdr->ih_hcrc);
+               hdr->ih_hcrc = 0;
+
+               if (crc32(0, (unsigned char *)data, len) != checksum) {
+                       puts("Bad Header Checksum\n");
+                       SHOW_BOOT_PROGRESS(-11);
+                       do_reset(cmdtp, flag, argc, argv);
+               }
+
+               SHOW_BOOT_PROGRESS(10);
+
+               print_image_hdr(hdr);
+
+               data = addr + sizeof(header);
+               len = ntohl(hdr->ih_size);
+
+               if (verify) {
+                       unsigned long csum = 0;
+
+                       puts("   Verifying Checksum ... ");
+                       csum = crc32(0, (unsigned char *)data, len);
+                       if (csum != ntohl(hdr->ih_dcrc)) {
+                               puts("Bad Data CRC\n");
+                               SHOW_BOOT_PROGRESS(-12);
+                               do_reset(cmdtp, flag, argc, argv);
+                       }
+                       puts("OK\n");
+               }
+
+               SHOW_BOOT_PROGRESS(11);
+
+               if ((hdr->ih_os != IH_OS_LINUX) ||
+                   (hdr->ih_arch != IH_CPU_AVR32) ||
+                   (hdr->ih_type != IH_TYPE_RAMDISK)) {
+                       puts("Not a Linux/AVR32 RAMDISK image\n");
+                       SHOW_BOOT_PROGRESS(-13);
+                       do_reset(cmdtp, flag, argc, argv);
+               }
+       } else if ((hdr->ih_type == IH_TYPE_MULTI) && (len_ptr[1])) {
+               ulong tail = ntohl (len_ptr[0]) % 4;
+               int i;
+
+               SHOW_BOOT_PROGRESS (13);
+
+               /* skip kernel length and terminator */
+               data = (ulong) (&len_ptr[2]);
+               /* skip any additional image length fields */
+               for (i = 1; len_ptr[i]; ++i)
+                       data += 4;
+               /* add kernel length, and align */
+               data += ntohl (len_ptr[0]);
+               if (tail) {
+                       data += 4 - tail;
+               }
+
+               len = ntohl (len_ptr[1]);
+       } else {
+               /* no initrd image */
+               SHOW_BOOT_PROGRESS(14);
+               len = data = 0;
+       }
+
+       if (data) {
+               initrd_start = data;
+               initrd_end = initrd_start + len;
+       } else {
+               initrd_start = 0;
+               initrd_end = 0;
+       }
+
+       SHOW_BOOT_PROGRESS(15);
+
+       params = params_start = (struct tag *)gd->bd->bi_boot_params;
+       params = setup_start_tag(params);
+       params = setup_memory_tags(params);
+       if (initrd_start) {
+               params = setup_ramdisk_tag(params,
+                                          PHYSADDR(initrd_start),
+                                          PHYSADDR(initrd_end));
+       }
+       params = setup_commandline_tag(params, commandline);
+       params = setup_clock_tags(params);
+       params = setup_ethernet_tags(params);
+       setup_end_tag(params);
+
+       printf("\nStarting kernel at %p (params at %p)...\n\n",
+              theKernel, params_start);
+
+       prepare_to_boot();
+
+       theKernel(ATAG_MAGIC, params_start);
+}
diff --git a/lib_avr32/board.c b/lib_avr32/board.c
new file mode 100644 (file)
index 0000000..02c106b
--- /dev/null
@@ -0,0 +1,175 @@
+/*
+ * Copyright (C) 2004-2006 Atmel Corporation
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+#include <common.h>
+#include <command.h>
+#include <malloc.h>
+#include <devices.h>
+#include <version.h>
+#include <net.h>
+
+#include <asm/initcalls.h>
+#include <asm/sections.h>
+
+#ifndef CONFIG_IDENT_STRING
+#define CONFIG_IDENT_STRING ""
+#endif
+
+DECLARE_GLOBAL_DATA_PTR;
+
+const char version_string[] =
+       U_BOOT_VERSION " (" __DATE__ " - " __TIME__ ") " CONFIG_IDENT_STRING;
+
+unsigned long monitor_flash_len;
+
+/*
+ * Begin and end of memory area for malloc(), and current "brk"
+ */
+static unsigned long mem_malloc_start = 0;
+static unsigned long mem_malloc_end = 0;
+static unsigned long mem_malloc_brk = 0;
+
+/* The malloc area is wherever the board wants it to be */
+static void mem_malloc_init(void)
+{
+       mem_malloc_start = CFG_MALLOC_START;
+       mem_malloc_end = CFG_MALLOC_END;
+       mem_malloc_brk = mem_malloc_start;
+
+       printf("malloc: Using memory from 0x%08lx to 0x%08lx\n",
+              mem_malloc_start, mem_malloc_end);
+
+       memset ((void *)mem_malloc_start, 0,
+               mem_malloc_end - mem_malloc_start);
+}
+
+void *sbrk(ptrdiff_t increment)
+{
+       unsigned long old = mem_malloc_brk;
+       unsigned long new = old + increment;
+
+       if ((new < mem_malloc_start) || (new > mem_malloc_end))
+               return NULL;
+
+       mem_malloc_brk = new;
+       return ((void *)old);
+}
+
+static int init_baudrate(void)
+{
+       char tmp[64];
+       int i;
+
+       i = getenv_r("baudrate", tmp, sizeof(tmp));
+       if (i > 0) {
+               gd->baudrate = simple_strtoul(tmp, NULL, 10);
+       } else {
+               gd->baudrate = CONFIG_BAUDRATE;
+       }
+       return 0;
+}
+
+
+static int display_banner (void)
+{
+       printf ("\n\n%s\n\n", version_string);
+       printf ("U-Boot code: %p -> %p  data: %p -> %p\n",
+               _text, _etext, _data, _end);
+       return 0;
+}
+
+void hang(void)
+{
+       for (;;) ;
+}
+
+static int display_dram_config (void)
+{
+       int i;
+
+       puts ("DRAM Configuration:\n");
+
+       for (i = 0; i < CONFIG_NR_DRAM_BANKS; i++) {
+               printf ("Bank #%d: %08lx ", i, gd->bd->bi_dram[i].start);
+               print_size (gd->bd->bi_dram[i].size, "\n");
+       }
+
+       return 0;
+}
+
+static void display_flash_config (void)
+{
+       puts ("Flash: ");
+       print_size(gd->bd->bi_flashsize, " ");
+       printf("at address 0x%08lx\n", gd->bd->bi_flashstart);
+}
+
+void start_u_boot (void)
+{
+       gd_t gd_data;
+
+       /* Initialize the global data pointer */
+       memset(&gd_data, 0, sizeof(gd_data));
+       gd = &gd_data;
+
+       monitor_flash_len = _edata - _text;
+
+       /* Perform initialization sequence */
+       cpu_init();
+       timer_init();
+       env_init();
+       init_baudrate();
+       serial_init();
+       console_init_f();
+       display_banner();
+
+       board_init_memories();
+       mem_malloc_init();
+
+       gd->bd = malloc(sizeof(bd_t));
+       memset(gd->bd, 0, sizeof(bd_t));
+       gd->bd->bi_baudrate = gd->baudrate;
+       gd->bd->bi_dram[0].start = CFG_SDRAM_BASE;
+       gd->bd->bi_dram[0].size = gd->sdram_size;
+
+       board_init_info();
+       flash_init();
+
+       if (gd->bd->bi_flashsize)
+               display_flash_config();
+       if (gd->bd->bi_dram[0].size)
+               display_dram_config();
+
+       gd->bd->bi_boot_params = malloc(CFG_BOOTPARAMS_LEN);
+       if (!gd->bd->bi_boot_params)
+               puts("WARNING: Cannot allocate space for boot parameters\n");
+
+       /* initialize environment */
+       env_relocate();
+
+       devices_init();
+       jumptable_init();
+       console_init_r();
+
+       for (;;) {
+               main_loop();
+       }
+}
diff --git a/lib_avr32/div64.c b/lib_avr32/div64.c
new file mode 100644 (file)
index 0000000..99726e3
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) 2003 Bernardo Innocenti <bernie@develer.com>
+ *
+ * Based on former do_div() implementation from asm-parisc/div64.h:
+ *     Copyright (C) 1999 Hewlett-Packard Co
+ *     Copyright (C) 1999 David Mosberger-Tang <davidm@hpl.hp.com>
+ *
+ *
+ * Generic C version of 64bit/32bit division and modulo, with
+ * 64bit result and 32bit remainder.
+ *
+ * The fast case for (n>>32 == 0) is handled inline by do_div().
+ *
+ * Code generated for this function might be very inefficient
+ * for some CPUs. __div64_32() can be overridden by linking arch-specific
+ * assembly versions such as arch/ppc/lib/div64.S and arch/sh/lib/div64.S.
+ */
+
+#include <linux/types.h>
+
+#include <asm/div64.h>
+
+uint32_t __div64_32(uint64_t *n, uint32_t base)
+{
+       uint64_t rem = *n;
+       uint64_t b = base;
+       uint64_t res, d = 1;
+       uint32_t high = rem >> 32;
+
+       /* Reduce the thing a bit first */
+       res = 0;
+       if (high >= base) {
+               high /= base;
+               res = (uint64_t) high << 32;
+               rem -= (uint64_t) (high*base) << 32;
+       }
+
+       while ((int64_t)b > 0 && b < rem) {
+               b = b+b;
+               d = d+d;
+       }
+
+       do {
+               if (rem >= b) {
+                       rem -= b;
+                       res += d;
+               }
+               b >>= 1;
+               d >>= 1;
+       } while (d);
+
+       *n = res;
+       return rem;
+}
diff --git a/lib_avr32/interrupts.c b/lib_avr32/interrupts.c
new file mode 100644 (file)
index 0000000..ce538f3
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2006 Atmel Corporation
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+#include <common.h>
+
+#include <asm/sysreg.h>
+
+void enable_interrupts(void)
+{
+       asm volatile("csrf      %0" : : "n"(SYSREG_GM_OFFSET));
+}
+
+int disable_interrupts(void)
+{
+       unsigned long sr;
+
+       sr = sysreg_read(SR);
+       asm volatile("ssrf      %0" : : "n"(SYSREG_GM_OFFSET));
+
+       return SYSREG_BFEXT(GM, sr);
+}
diff --git a/lib_avr32/memset.S b/lib_avr32/memset.S
new file mode 100644 (file)
index 0000000..dc3b09b
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2004-2006 Atmel Corporation
+ *
+ * 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
+ */
+
+       /*
+        * r12: void *b
+        * r11: int c
+        * r10: size_t len
+        *
+        * Returns b in r12
+        */
+       .text
+
+       .global memset
+       .type   memset, @function
+       .align  2
+memset:
+       mov     r9, r12
+       mov     r8, r12
+       or      r11, r11, r11 << 8
+       andl    r9, 3, COH
+       brne    1f
+
+2:     or      r11, r11, r11 << 16
+       sub     r10, 4
+       brlt    5f
+
+       /* Let's do some real work */
+4:     st.w    r8++, r11
+       sub     r10, 4
+       brge    4b
+
+       /*
+        * When we get here, we've got less than 4 bytes to set. r10
+        * might be negative.
+        */
+5:     sub     r10, -4
+       reteq   r12
+
+       /* Fastpath ends here, exactly 32 bytes from memset */
+
+       /* Handle unaligned count or pointer */
+       bld     r10, 1
+       brcc    6f
+       st.b    r8++, r11
+       st.b    r8++, r11
+       bld     r10, 0
+       retcc   r12
+6:     st.b    r8++, r11
+       mov     pc, lr
+
+       /* Handle unaligned pointer */
+1:     sub     r10, 4
+       brlt    5b
+       add     r10, r9
+       lsl     r9, 1
+       add     pc, r9
+       st.b    r8++, r11
+       st.b    r8++, r11
+       st.b    r8++, r11
+       rjmp    2b
+
+       .size   memset, . - memset