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>master
parent
2da2d9a476
commit
7b64fef33c
@ -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
|
@ -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> |
@ -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 */ |
@ -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 */ |
@ -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 */ |
@ -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 */ |
@ -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 */ |
@ -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 */ |
@ -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 */ |
@ -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__ */ |
@ -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__ */ |
@ -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 */ |
@ -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 */ |
@ -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 */ |
@ -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 */ |
@ -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 */ |
@ -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 */ |
@ -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__ */ |
@ -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 */ |
@ -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__ */ |
@ -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 */ |
@ -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__ */ |
@ -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 |
||||
|
||||
#########################################################################
|
@ -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); |
||||
} |
@ -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(); |
||||
} |
||||
} |
@ -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; |
||||
} |
@ -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); |
||||
} |
@ -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 |
Loading…
Reference in new issue