[PATCH] CRIS update: new subarchitecture v32

New CRIS sub architecture named v32.

From: Dave Jones <davej@redhat.com>

	Fix swapped kmalloc args

Signed-off-by: Mikael Starvik <starvik@axis.com>
Signed-off-by: Dave Jones <davej@redhat.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
Mikael Starvik 2005-07-27 11:44:44 -07:00 committed by Linus Torvalds
parent 5d01e6ce78
commit 51533b615e
193 changed files with 52861 additions and 0 deletions

296
arch/cris/arch-v32/Kconfig Normal file
View file

@ -0,0 +1,296 @@
config ETRAX_DRAM_VIRTUAL_BASE
hex
depends on ETRAX_ARCH_V32
default "c0000000"
config ETRAX_LED1G
string "First green LED bit"
depends on ETRAX_ARCH_V32
default "PA3"
help
Bit to use for the first green LED (network LED).
Most Axis products use bit A3 here.
config ETRAX_LED1R
string "First red LED bit"
depends on ETRAX_ARCH_V32
default "PA4"
help
Bit to use for the first red LED (network LED).
Most Axis products use bit A4 here.
config ETRAX_LED2G
string "Second green LED bit"
depends on ETRAX_ARCH_V32
default "PA5"
help
Bit to use for the first green LED (status LED).
Most Axis products use bit A5 here.
config ETRAX_LED2R
string "Second red LED bit"
depends on ETRAX_ARCH_V32
default "PA6"
help
Bit to use for the first red LED (network LED).
Most Axis products use bit A6 here.
config ETRAX_LED3G
string "Third green LED bit"
depends on ETRAX_ARCH_V32
default "PA7"
help
Bit to use for the first green LED (drive/power LED).
Most Axis products use bit A7 here.
config ETRAX_LED3R
string "Third red LED bit"
depends on ETRAX_ARCH_V32
default "PA7"
help
Bit to use for the first red LED (drive/power LED).
Most Axis products use bit A7 here.
choice
prompt "Product debug-port"
depends on ETRAX_ARCH_V32
default ETRAX_DEBUG_PORT0
config ETRAX_DEBUG_PORT0
bool "Serial-0"
help
Choose a serial port for the ETRAX debug console. Default to
port 0.
config ETRAX_DEBUG_PORT1
bool "Serial-1"
help
Use serial port 1 for the console.
config ETRAX_DEBUG_PORT2
bool "Serial-2"
help
Use serial port 2 for the console.
config ETRAX_DEBUG_PORT3
bool "Serial-3"
help
Use serial port 3 for the console.
config ETRAX_DEBUG_PORT_NULL
bool "disabled"
help
Disable serial-port debugging.
endchoice
choice
prompt "Kernel GDB port"
depends on ETRAX_KGDB
default ETRAX_KGDB_PORT0
help
Choose a serial port for kernel debugging. NOTE: This port should
not be enabled under Drivers for built-in interfaces (as it has its
own initialization code) and should not be the same as the debug port.
config ETRAX_KGDB_PORT0
bool "Serial-0"
help
Use serial port 0 for kernel debugging.
config ETRAX_KGDB_PORT1
bool "Serial-1"
help
Use serial port 1 for kernel debugging.
config ETRAX_KGDB_PORT2
bool "Serial-2"
help
Use serial port 2 for kernel debugging.
config ETRAX_KGDB_PORT3
bool "Serial-3"
help
Use serial port 3 for kernel debugging.
endchoice
config ETRAX_MEM_GRP1_CONFIG
hex "MEM_GRP1_CONFIG"
depends on ETRAX_ARCH_V32
default "4044a"
help
Waitstates for flash. The default value is suitable for the
standard flashes used in axis products (120 ns).
config ETRAX_MEM_GRP2_CONFIG
hex "MEM_GRP2_CONFIG"
depends on ETRAX_ARCH_V32
default "0"
help
Waitstates for SRAM. 0 is a good choice for most Axis products.
config ETRAX_MEM_GRP3_CONFIG
hex "MEM_GRP3_CONFIG"
depends on ETRAX_ARCH_V32
default "0"
help
Waitstates for CSP0-3. 0 is a good choice for most Axis products.
It may need to be changed if external devices such as extra
register-mapped LEDs are used.
config ETRAX_MEM_GRP4_CONFIG
hex "MEM_GRP4_CONFIG"
depends on ETRAX_ARCH_V32
default "0"
help
Waitstates for CSP4-6. 0 is a good choice for most Axis products.
config ETRAX_SDRAM_GRP0_CONFIG
hex "SDRAM_GRP0_CONFIG"
depends on ETRAX_ARCH_V32
default "336"
help
SDRAM configuration for group 0. The value depends on the
hardware configuration. The default value is suitable
for 32 MB organized as two 16 bits chips (e.g. Axis
part number 18550) connected as one 32 bit device (i.e. in
the same group).
config ETRAX_SDRAM_GRP1_CONFIG
hex "SDRAM_GRP1_CONFIG"
depends on ETRAX_ARCH_V32
default "0"
help
SDRAM configuration for group 1. The defult value is 0
because group 1 is not used in the default configuration,
described in the help for SDRAM_GRP0_CONFIG.
config ETRAX_SDRAM_TIMING
hex "SDRAM_TIMING"
depends on ETRAX_ARCH_V32
default "104a"
help
SDRAM timing parameters. The default value is ok for
most hardwares but large SDRAMs may require a faster
refresh (a.k.a 8K refresh). The default value implies
100MHz clock and SDR mode.
config ETRAX_SDRAM_COMMAND
hex "SDRAM_COMMAND"
depends on ETRAX_ARCH_V32
default "0"
help
SDRAM command. Should be 0 unless you really know what
you are doing (may be != 0 for unusual address line
mappings such as in a MCM)..
config ETRAX_DEF_GIO_PA_OE
hex "GIO_PA_OE"
depends on ETRAX_ARCH_V32
default "1c"
help
Configures the direction of general port A bits. 1 is out, 0 is in.
This is often totally different depending on the product used.
There are some guidelines though - if you know that only LED's are
connected to port PA, then they are usually connected to bits 2-4
and you can therefore use 1c. On other boards which don't have the
LED's at the general ports, these bits are used for all kinds of
stuff. If you don't know what to use, it is always safe to put all
as inputs, although floating inputs isn't good.
config ETRAX_DEF_GIO_PA_OUT
hex "GIO_PA_OUT"
depends on ETRAX_ARCH_V32
default "00"
help
Configures the initial data for the general port A bits. Most
products should use 00 here.
config ETRAX_DEF_GIO_PB_OE
hex "GIO_PB_OE"
depends on ETRAX_ARCH_V32
default "00000"
help
Configures the direction of general port B bits. 1 is out, 0 is in.
This is often totally different depending on the product used.
There are some guidelines though - if you know that only LED's are
connected to port PA, then they are usually connected to bits 2-4
and you can therefore use 1c. On other boards which don't have the
LED's at the general ports, these bits are used for all kinds of
stuff. If you don't know what to use, it is always safe to put all
as inputs, although floating inputs isn't good.
config ETRAX_DEF_GIO_PB_OUT
hex "GIO_PB_OUT"
depends on ETRAX_ARCH_V32
default "00000"
help
Configures the initial data for the general port B bits. Most
products should use 00000 here.
config ETRAX_DEF_GIO_PC_OE
hex "GIO_PC_OE"
depends on ETRAX_ARCH_V32
default "00000"
help
Configures the direction of general port C bits. 1 is out, 0 is in.
This is often totally different depending on the product used.
There are some guidelines though - if you know that only LED's are
connected to port PA, then they are usually connected to bits 2-4
and you can therefore use 1c. On other boards which don't have the
LED's at the general ports, these bits are used for all kinds of
stuff. If you don't know what to use, it is always safe to put all
as inputs, although floating inputs isn't good.
config ETRAX_DEF_GIO_PC_OUT
hex "GIO_PC_OUT"
depends on ETRAX_ARCH_V32
default "00000"
help
Configures the initial data for the general port C bits. Most
products should use 00000 here.
config ETRAX_DEF_GIO_PD_OE
hex "GIO_PD_OE"
depends on ETRAX_ARCH_V32
default "00000"
help
Configures the direction of general port D bits. 1 is out, 0 is in.
This is often totally different depending on the product used.
There are some guidelines though - if you know that only LED's are
connected to port PA, then they are usually connected to bits 2-4
and you can therefore use 1c. On other boards which don't have the
LED's at the general ports, these bits are used for all kinds of
stuff. If you don't know what to use, it is always safe to put all
as inputs, although floating inputs isn't good.
config ETRAX_DEF_GIO_PD_OUT
hex "GIO_PD_OUT"
depends on ETRAX_ARCH_V32
default "00000"
help
Configures the initial data for the general port D bits. Most
products should use 00000 here.
config ETRAX_DEF_GIO_PE_OE
hex "GIO_PE_OE"
depends on ETRAX_ARCH_V32
default "00000"
help
Configures the direction of general port E bits. 1 is out, 0 is in.
This is often totally different depending on the product used.
There are some guidelines though - if you know that only LED's are
connected to port PA, then they are usually connected to bits 2-4
and you can therefore use 1c. On other boards which don't have the
LED's at the general ports, these bits are used for all kinds of
stuff. If you don't know what to use, it is always safe to put all
as inputs, although floating inputs isn't good.
config ETRAX_DEF_GIO_PE_OUT
hex "GIO_PE_OUT"
depends on ETRAX_ARCH_V32
default "00000"
help
Configures the initial data for the general port E bits. Most
products should use 00000 here.

View file

@ -0,0 +1,14 @@
#
# arch/cris/arch-v32/boot/Makefile
#
target = $(target_boot_dir)
src = $(src_boot_dir)
zImage: compressed/vmlinuz
compressed/vmlinuz: $(objtree)/vmlinux
@$(MAKE) -f $(src)/compressed/Makefile $(objtree)/vmlinuz
clean:
rm -f zImage tools/build compressed/vmlinux.out
@$(MAKE) -f $(src)/compressed/Makefile clean

View file

@ -0,0 +1,41 @@
#
# lx25/arch/cris/arch-v32/boot/compressed/Makefile
#
# create a compressed vmlinux image from the original vmlinux files and romfs
#
target = $(target_compressed_dir)
src = $(src_compressed_dir)
CC = gcc-cris -mlinux -march=v32 -I $(TOPDIR)/include
CFLAGS = -O2
LD = gcc-cris -mlinux -march=v32 -nostdlib
OBJCOPY = objcopy-cris
OBJCOPYFLAGS = -O binary --remove-section=.bss
OBJECTS = $(target)/head.o $(target)/misc.o
# files to compress
SYSTEM = $(objtree)/vmlinux.bin
all: vmlinuz
$(target)/decompress.bin: $(OBJECTS)
$(LD) -T $(src)/decompress.ld -o $(target)/decompress.o $(OBJECTS)
$(OBJCOPY) $(OBJCOPYFLAGS) $(target)/decompress.o $(target)/decompress.bin
$(objtree)/vmlinuz: $(target) piggy.img $(target)/decompress.bin
cat $(target)/decompress.bin piggy.img > $(objtree)/vmlinuz
rm -f piggy.img
cp $(objtree)/vmlinuz $(src)
$(target)/head.o: $(src)/head.S
$(CC) -D__ASSEMBLY__ -c $< -o $@
# gzip the kernel image
piggy.img: $(SYSTEM)
cat $(SYSTEM) | gzip -f -9 > piggy.img
clean:
rm -f piggy.img $(objtree)/vmlinuz vmlinuz.o decompress.o decompress.bin $(OBJECTS)

View file

@ -0,0 +1,25 @@
Creation of the self-extracting compressed kernel image (vmlinuz)
-----------------------------------------------------------------
$Id: README,v 1.1 2003/08/21 09:37:03 johana Exp $
This can be slightly confusing because it's a process with many steps.
The kernel object built by the arch/etrax100/Makefile, vmlinux, is split
by that makefile into text and data binary files, vmlinux.text and
vmlinux.data.
Those files together with a ROM filesystem can be catted together and
burned into a flash or executed directly at the DRAM origin.
They can also be catted together and compressed with gzip, which is what
happens in this makefile. Together they make up piggy.img.
The decompressor is built into the file decompress.o. It is turned into
the binary file decompress.bin, which is catted together with piggy.img
into the file vmlinuz. It can be executed in an arbitrary place in flash.
Be careful - it assumes some things about free locations in DRAM. It
assumes the DRAM starts at 0x40000000 and that it is at least 8 MB,
so it puts its code at 0x40700000, and initial stack at 0x40800000.
-Bjorn

View file

@ -0,0 +1,30 @@
/*#OUTPUT_FORMAT(elf32-us-cris) */
OUTPUT_ARCH (crisv32)
MEMORY
{
dram : ORIGIN = 0x40700000,
LENGTH = 0x00100000
}
SECTIONS
{
.text :
{
_stext = . ;
*(.text)
*(.rodata)
*(.rodata.*)
_etext = . ;
} > dram
.data :
{
*(.data)
_edata = . ;
} > dram
.bss :
{
*(.bss)
_end = ALIGN( 0x10 ) ;
} > dram
}

View file

@ -0,0 +1,193 @@
/*
* Code that sets up the DRAM registers, calls the
* decompressor to unpack the piggybacked kernel, and jumps.
*
* Copyright (C) 1999 - 2003, Axis Communications AB
*/
#include <linux/config.h>
#define ASSEMBLER_MACROS_ONLY
#include <asm/arch/hwregs/asm/reg_map_asm.h>
#include <asm/arch/hwregs/asm/gio_defs_asm.h>
#include <asm/arch/hwregs/asm/config_defs_asm.h>
#define RAM_INIT_MAGIC 0x56902387
#define COMMAND_LINE_MAGIC 0x87109563
;; Exported symbols
.globl input_data
.text
start:
di
;; Start clocks for used blocks.
move.d REG_ADDR(config, regi_config, rw_clk_ctrl), $r1
move.d [$r1], $r0
or.d REG_STATE(config, rw_clk_ctrl, cpu, yes) | \
REG_STATE(config, rw_clk_ctrl, bif, yes) | \
REG_STATE(config, rw_clk_ctrl, fix_io, yes), $r0
move.d $r0, [$r1]
;; If booting from NAND flash we first have to copy some
;; data from NAND flash to internal RAM to get the code
;; that initializes the SDRAM. Lets copy 20 KB. This
;; code executes at 0x38010000 if booting from NAND and
;; we are guaranted that at least 0x200 bytes are good so
;; lets start from there. The first 8192 bytes in the nand
;; flash is spliced with zeroes and is thus 16384 bytes.
move.d 0x38010200, $r10
move.d 0x14200, $r11 ; Start offset in NAND flash 0x10200 + 16384
move.d 0x5000, $r12 ; Length of copy
;; Before this code the tools add a partitiontable so the PC
;; has an offset from the linked address.
offset1:
lapcq ., $r13 ; get PC
add.d first_copy_complete-offset1, $r13
#include "../../lib/nand_init.S"
first_copy_complete:
;; Initialze the DRAM registers.
cmp.d RAM_INIT_MAGIC, $r8 ; Already initialized?
beq dram_init_finished
nop
#include "../../lib/dram_init.S"
dram_init_finished:
lapcq ., $r13 ; get PC
add.d second_copy_complete-dram_init_finished, $r13
move.d REG_ADDR(config, regi_config, r_bootsel), $r0
move.d [$r0], $r0
and.d REG_MASK(config, r_bootsel, boot_mode), $r0
cmp.d REG_STATE(config, r_bootsel, boot_mode, nand), $r0
bne second_copy_complete ; No NAND boot
nop
;; Copy 2MB from NAND flash to SDRAM (at 2-4MB into the SDRAM)
move.d 0x40204000, $r10
move.d 0x8000, $r11
move.d 0x200000, $r12
ba copy_nand_to_ram
nop
second_copy_complete:
;; Initiate the PA port.
move.d CONFIG_ETRAX_DEF_GIO_PA_OUT, $r0
move.d REG_ADDR(gio, regi_gio, rw_pa_dout), $r1
move.d $r0, [$r1]
move.d CONFIG_ETRAX_DEF_GIO_PA_OE, $r0
move.d REG_ADDR(gio, regi_gio, rw_pa_oe), $r1
move.d $r0, [$r1]
;; Setup the stack to a suitably high address.
;; We assume 8 MB is the minimum DRAM and put
;; the SP at the top for now.
move.d 0x40800000, $sp
;; Figure out where the compressed piggyback image is
;; in the flash (since we wont try to copy it to DRAM
;; before unpacking). It is at _edata, but in flash.
;; Use (_edata - herami) as offset to the current PC.
move.d REG_ADDR(config, regi_config, r_bootsel), $r0
move.d [$r0], $r0
and.d REG_MASK(config, r_bootsel, boot_mode), $r0
cmp.d REG_STATE(config, r_bootsel, boot_mode, nand), $r0
beq hereami2
nop
hereami:
lapcq ., $r5 ; get PC
and.d 0x7fffffff, $r5 ; strip any non-cache bit
move.d $r5, $r0 ; save for later - flash address of 'herami'
add.d _edata, $r5
sub.d hereami, $r5 ; r5 = flash address of '_edata'
move.d hereami, $r1 ; destination
ba 2f
nop
hereami2:
lapcq ., $r5 ; get PC
and.d 0x00ffffff, $r5 ; strip any non-cache bit
move.d $r5, $r6
or.d 0x40200000, $r6
move.d $r6, $r0 ; save for later - flash address of 'herami'
add.d _edata, $r5
sub.d hereami2, $r5 ; r5 = flash address of '_edata'
add.d 0x40200000, $r5
move.d hereami2, $r1 ; destination
2:
;; Copy text+data to DRAM
move.d _edata, $r2 ; end destination
1: move.w [$r0+], $r3
move.w $r3, [$r1+]
cmp.d $r2, $r1
bcs 1b
nop
move.d input_data, $r0 ; for the decompressor
move.d $r5, [$r0] ; for the decompressor
;; Clear the decompressors BSS (between _edata and _end)
moveq 0, $r0
move.d _edata, $r1
move.d _end, $r2
1: move.w $r0, [$r1+]
cmp.d $r2, $r1
bcs 1b
nop
;; Save command line magic and address.
move.d _cmd_line_magic, $r12
move.d $r10, [$r12]
move.d _cmd_line_addr, $r12
move.d $r11, [$r12]
;; Do the decompression and save compressed size in _inptr
jsr decompress_kernel
nop
;; Restore command line magic and address.
move.d _cmd_line_magic, $r10
move.d [$r10], $r10
move.d _cmd_line_addr, $r11
move.d [$r11], $r11
;; Put start address of root partition in r9 so the kernel can use it
;; when mounting from flash
move.d input_data, $r0
move.d [$r0], $r9 ; flash address of compressed kernel
move.d inptr, $r0
add.d [$r0], $r9 ; size of compressed kernel
cmp.d 0x40200000, $r9
blo enter_kernel
nop
sub.d 0x40200000, $r9
add.d 0x4000, $r9
enter_kernel:
;; Enter the decompressed kernel
move.d RAM_INIT_MAGIC, $r8 ; Tell kernel that DRAM is initialized
jump 0x40004000 ; kernel is linked to this address
nop
.data
input_data:
.dword 0 ; used by the decompressor
_cmd_line_magic:
.dword 0
_cmd_line_addr:
.dword 0
is_nand_boot:
.dword 0
#include "../../lib/hw_settings.S"

View file

@ -0,0 +1,318 @@
/*
* misc.c
*
* $Id: misc.c,v 1.8 2005/04/24 18:34:29 starvik Exp $
*
* This is a collection of several routines from gzip-1.0.3
* adapted for Linux.
*
* malloc by Hannu Savolainen 1993 and Matthias Urlichs 1994
* puts by Nick Holloway 1993, better puts by Martin Mares 1995
* adoptation for Linux/CRIS Axis Communications AB, 1999
*
*/
/* where the piggybacked kernel image expects itself to live.
* it is the same address we use when we network load an uncompressed
* image into DRAM, and it is the address the kernel is linked to live
* at by vmlinux.lds.S
*/
#define KERNEL_LOAD_ADR 0x40004000
#include <linux/config.h>
#include <linux/types.h>
#include <asm/arch/hwregs/reg_rdwr.h>
#include <asm/arch/hwregs/reg_map.h>
#include <asm/arch/hwregs/ser_defs.h>
/*
* gzip declarations
*/
#define OF(args) args
#define STATIC static
void* memset(void* s, int c, size_t n);
void* memcpy(void* __dest, __const void* __src,
size_t __n);
#define memzero(s, n) memset ((s), 0, (n))
typedef unsigned char uch;
typedef unsigned short ush;
typedef unsigned long ulg;
#define WSIZE 0x8000 /* Window size must be at least 32k, */
/* and a power of two */
static uch *inbuf; /* input buffer */
static uch window[WSIZE]; /* Sliding window buffer */
unsigned inptr = 0; /* index of next byte to be processed in inbuf
* After decompression it will contain the
* compressed size, and head.S will read it.
*/
static unsigned outcnt = 0; /* bytes in output buffer */
/* gzip flag byte */
#define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */
#define CONTINUATION 0x02 /* bit 1 set: continuation of multi-part gzip file */
#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */
#define ORIG_NAME 0x08 /* bit 3 set: original file name present */
#define COMMENT 0x10 /* bit 4 set: file comment present */
#define ENCRYPTED 0x20 /* bit 5 set: file is encrypted */
#define RESERVED 0xC0 /* bit 6,7: reserved */
#define get_byte() inbuf[inptr++]
/* Diagnostic functions */
#ifdef DEBUG
# define Assert(cond,msg) {if(!(cond)) error(msg);}
# define Trace(x) fprintf x
# define Tracev(x) {if (verbose) fprintf x ;}
# define Tracevv(x) {if (verbose>1) fprintf x ;}
# define Tracec(c,x) {if (verbose && (c)) fprintf x ;}
# define Tracecv(c,x) {if (verbose>1 && (c)) fprintf x ;}
#else
# define Assert(cond,msg)
# define Trace(x)
# define Tracev(x)
# define Tracevv(x)
# define Tracec(c,x)
# define Tracecv(c,x)
#endif
static int fill_inbuf(void);
static void flush_window(void);
static void error(char *m);
static void gzip_mark(void **);
static void gzip_release(void **);
extern char *input_data; /* lives in head.S */
static long bytes_out = 0;
static uch *output_data;
static unsigned long output_ptr = 0;
static void *malloc(int size);
static void free(void *where);
static void error(char *m);
static void gzip_mark(void **);
static void gzip_release(void **);
static void puts(const char *);
/* the "heap" is put directly after the BSS ends, at end */
extern int _end;
static long free_mem_ptr = (long)&_end;
#include "../../../../../lib/inflate.c"
static void *malloc(int size)
{
void *p;
if (size <0) error("Malloc error");
free_mem_ptr = (free_mem_ptr + 3) & ~3; /* Align */
p = (void *)free_mem_ptr;
free_mem_ptr += size;
return p;
}
static void free(void *where)
{ /* Don't care */
}
static void gzip_mark(void **ptr)
{
*ptr = (void *) free_mem_ptr;
}
static void gzip_release(void **ptr)
{
free_mem_ptr = (long) *ptr;
}
/* decompressor info and error messages to serial console */
static inline void
serout(const char *s, reg_scope_instances regi_ser)
{
reg_ser_rs_stat_din rs;
reg_ser_rw_dout dout = {.data = *s};
do {
rs = REG_RD(ser, regi_ser, rs_stat_din);
}
while (!rs.tr_rdy);/* Wait for tranceiver. */
REG_WR(ser, regi_ser, rw_dout, dout);
}
static void
puts(const char *s)
{
#ifndef CONFIG_ETRAX_DEBUG_PORT_NULL
while (*s) {
#ifdef CONFIG_ETRAX_DEBUG_PORT0
serout(s, regi_ser0);
#endif
#ifdef CONFIG_ETRAX_DEBUG_PORT1
serout(s, regi_ser1);
#endif
#ifdef CONFIG_ETRAX_DEBUG_PORT2
serout(s, regi_ser2);
#endif
#ifdef CONFIG_ETRAX_DEBUG_PORT3
serout(s, regi_ser3);
#endif
*s++;
}
/* CONFIG_ETRAX_DEBUG_PORT_NULL */
#endif
}
void*
memset(void* s, int c, size_t n)
{
int i;
char *ss = (char*)s;
for (i=0;i<n;i++) ss[i] = c;
}
void*
memcpy(void* __dest, __const void* __src,
size_t __n)
{
int i;
char *d = (char *)__dest, *s = (char *)__src;
for (i=0;i<__n;i++) d[i] = s[i];
}
/* ===========================================================================
* Write the output window window[0..outcnt-1] and update crc and bytes_out.
* (Used for the decompressed data only.)
*/
static void
flush_window()
{
ulg c = crc; /* temporary variable */
unsigned n;
uch *in, *out, ch;
in = window;
out = &output_data[output_ptr];
for (n = 0; n < outcnt; n++) {
ch = *out++ = *in++;
c = crc_32_tab[((int)c ^ ch) & 0xff] ^ (c >> 8);
}
crc = c;
bytes_out += (ulg)outcnt;
output_ptr += (ulg)outcnt;
outcnt = 0;
}
static void
error(char *x)
{
puts("\n\n");
puts(x);
puts("\n\n -- System halted\n");
while(1); /* Halt */
}
void
setup_normal_output_buffer()
{
output_data = (char *)KERNEL_LOAD_ADR;
}
static inline void
serial_setup(reg_scope_instances regi_ser)
{
reg_ser_rw_xoff xoff;
reg_ser_rw_tr_ctrl tr_ctrl;
reg_ser_rw_rec_ctrl rec_ctrl;
reg_ser_rw_tr_baud_div tr_baud;
reg_ser_rw_rec_baud_div rec_baud;
/* Turn off XOFF. */
xoff = REG_RD(ser, regi_ser, rw_xoff);
xoff.chr = 0;
xoff.automatic = regk_ser_no;
REG_WR(ser, regi_ser, rw_xoff, xoff);
/* Set baudrate and stopbits. */
tr_ctrl = REG_RD(ser, regi_ser, rw_tr_ctrl);
rec_ctrl = REG_RD(ser, regi_ser, rw_rec_ctrl);
tr_baud = REG_RD(ser, regi_ser, rw_tr_baud_div);
rec_baud = REG_RD(ser, regi_ser, rw_rec_baud_div);
tr_ctrl.stop_bits = 1; /* 2 stop bits. */
/*
* The baudrate setup is a bit fishy, but in the end the tranceiver is
* set to 4800 and the receiver to 115200. The magic value is
* 29.493 MHz.
*/
tr_ctrl.base_freq = regk_ser_f29_493;
rec_ctrl.base_freq = regk_ser_f29_493;
tr_baud.div = (29493000 / 8) / 4800;
rec_baud.div = (29493000 / 8) / 115200;
REG_WR(ser, regi_ser, rw_tr_ctrl, tr_ctrl);
REG_WR(ser, regi_ser, rw_tr_baud_div, tr_baud);
REG_WR(ser, regi_ser, rw_rec_ctrl, rec_ctrl);
REG_WR(ser, regi_ser, rw_rec_baud_div, rec_baud);
}
void
decompress_kernel()
{
char revision;
/* input_data is set in head.S */
inbuf = input_data;
#ifdef CONFIG_ETRAX_DEBUG_PORT0
serial_setup(regi_ser0);
#endif
#ifdef CONFIG_ETRAX_DEBUG_PORT1
serial_setup(regi_ser1);
#endif
#ifdef CONFIG_ETRAX_DEBUG_PORT2
serial_setup(regi_ser2);
#endif
#ifdef CONFIG_ETRAX_DEBUG_PORT3
serial_setup(regi_ser3);
#endif
setup_normal_output_buffer();
makecrc();
__asm__ volatile ("move $vr,%0" : "=rm" (revision));
if (revision < 32)
{
puts("You need an ETRAX FS to run Linux 2.6/crisv32.\n");
while(1);
}
puts("Uncompressing Linux...\n");
gunzip();
puts("Done. Now booting the kernel.\n");
}

View file

@ -0,0 +1,36 @@
#
# Makefile for rescue code
#
target = $(target_rescue_dir)
src = $(src_rescue_dir)
CC = gcc-cris -mlinux -march=v32 $(LINUXINCLUDE)
CFLAGS = -O2
LD = gcc-cris -mlinux -march=v32 -nostdlib
OBJCOPY = objcopy-cris
OBJCOPYFLAGS = -O binary --remove-section=.bss
all: $(target)/rescue.bin
rescue: rescue.bin
# do nothing
$(target)/rescue.bin: $(target) $(target)/head.o
$(LD) -T $(src)/rescue.ld -o $(target)/rescue.o $(target)/head.o
$(OBJCOPY) $(OBJCOPYFLAGS) $(target)/rescue.o $(target)/rescue.bin
cp -p $(target)/rescue.bin $(objtree)
$(target):
mkdir -p $(target)
$(target)/head.o: $(src)/head.S
$(CC) -D__ASSEMBLY__ -c $< -o $*.o
clean:
rm -f $(target)/*.o $(target)/*.bin
fastdep:
modules:
modules-install:

View file

@ -0,0 +1,39 @@
/* $Id: head.S,v 1.4 2004/11/01 16:10:28 starvik Exp $
*
* This used to be the rescue code but now that is handled by the
* RedBoot based RFL instead. Nothing to see here, move along.
*/
#include <linux/config.h>
#include <asm/arch/hwregs/reg_map_asm.h>
#include <asm/arch/hwregs/config_defs_asm.h>
.text
;; Start clocks for used blocks.
move.d REG_ADDR(config, regi_config, rw_clk_ctrl), $r1
move.d [$r1], $r0
or.d REG_STATE(config, rw_clk_ctrl, cpu, yes) | \
REG_STATE(config, rw_clk_ctrl, bif, yes) | \
REG_STATE(config, rw_clk_ctrl, fix_io, yes), $r0
move.d $r0, [$r1]
;; Copy 68KB NAND flash to Internal RAM (if NAND boot)
move.d 0x38004000, $r10
move.d 0x8000, $r11
move.d 0x11000, $r12
move.d copy_complete, $r13
and.d 0x000fffff, $r13
or.d 0x38000000, $r13
#include "../../lib/nand_init.S"
;; No NAND found
move.d CONFIG_ETRAX_PTABLE_SECTOR, $r10
jump $r10 ; Jump to decompresser
nop
copy_complete:
move.d 0x38000000 + CONFIG_ETRAX_PTABLE_SECTOR, $r10
jump $r10 ; Jump to decompresser
nop

View file

@ -0,0 +1,20 @@
MEMORY
{
flash : ORIGIN = 0x00000000,
LENGTH = 0x00100000
}
SECTIONS
{
.text :
{
stext = . ;
*(.text)
etext = . ;
} > flash
.data :
{
*(.data)
edata = . ;
} > flash
}

View file

@ -0,0 +1,625 @@
config ETRAX_ETHERNET
bool "Ethernet support"
depends on ETRAX_ARCH_V32
select NET_ETHERNET
help
This option enables the ETRAX FS built-in 10/100Mbit Ethernet
controller.
config ETRAX_ETHERNET_HW_CSUM
bool "Hardware accelerated ethernet checksum and scatter/gather"
depends on ETRAX_ETHERNET
depends on ETRAX_STREAMCOPROC
default y
help
Hardware acceleration of checksumming and scatter/gather
config ETRAX_ETHERNET_IFACE0
depends on ETRAX_ETHERNET
bool "Enable network interface 0"
config ETRAX_ETHERNET_IFACE1
depends on ETRAX_ETHERNET
bool "Enable network interface 1 (uses DMA6 and DMA7)"
choice
prompt "Network LED behavior"
depends on ETRAX_ETHERNET
default ETRAX_NETWORK_LED_ON_WHEN_ACTIVITY
config ETRAX_NETWORK_LED_ON_WHEN_LINK
bool "LED_on_when_link"
help
Selecting LED_on_when_link will light the LED when there is a
connection and will flash off when there is activity.
Selecting LED_on_when_activity will light the LED only when
there is activity.
This setting will also affect the behaviour of other activity LEDs
e.g. Bluetooth.
config ETRAX_NETWORK_LED_ON_WHEN_ACTIVITY
bool "LED_on_when_activity"
help
Selecting LED_on_when_link will light the LED when there is a
connection and will flash off when there is activity.
Selecting LED_on_when_activity will light the LED only when
there is activity.
This setting will also affect the behaviour of other activity LEDs
e.g. Bluetooth.
endchoice
config ETRAXFS_SERIAL
bool "Serial-port support"
depends on ETRAX_ARCH_V32
help
Enables the ETRAX FS serial driver for ser0 (ttyS0)
You probably want this enabled.
config ETRAX_SERIAL_PORT0
bool "Serial port 0 enabled"
depends on ETRAXFS_SERIAL
help
Enables the ETRAX FS serial driver for ser0 (ttyS0)
Normally you want this on. You can control what DMA channels to use
if you do not need DMA to something else.
ser0 can use dma4 or dma6 for output and dma5 or dma7 for input.
choice
prompt "Ser0 DMA in channel "
depends on ETRAX_SERIAL_PORT0
default ETRAX_SERIAL_PORT0_NO_DMA_IN
help
What DMA channel to use for ser0.
config ETRAX_SERIAL_PORT0_NO_DMA_IN
bool "Ser0 uses no DMA for input"
help
Do not use DMA for ser0 input.
config ETRAX_SERIAL_PORT0_DMA7_IN
bool "Ser0 uses DMA7 for input"
depends on ETRAX_SERIAL_PORT0
help
Enables the DMA7 input channel for ser0 (ttyS0).
If you do not enable DMA, an interrupt for each character will be
used when receiveing data.
Normally you want to use DMA, unless you use the DMA channel for
something else.
endchoice
choice
prompt "Ser0 DMA out channel"
depends on ETRAX_SERIAL_PORT0
default ETRAX_SERIAL_PORT0_NO_DMA_OUT
config ETRAX_SERIAL_PORT0_NO_DMA_OUT
bool "Ser0 uses no DMA for output"
help
Do not use DMA for ser0 output.
config ETRAX_SERIAL_PORT0_DMA6_OUT
bool "Ser0 uses DMA6 for output"
depends on ETRAX_SERIAL_PORT0
help
Enables the DMA6 output channel for ser0 (ttyS0).
If you do not enable DMA, an interrupt for each character will be
used when transmitting data.
Normally you want to use DMA, unless you use the DMA channel for
something else.
endchoice
config ETRAX_SER0_DTR_BIT
string "Ser 0 DTR bit (empty = not used)"
depends on ETRAX_SERIAL_PORT0
config ETRAX_SER0_RI_BIT
string "Ser 0 RI bit (empty = not used)"
depends on ETRAX_SERIAL_PORT0
config ETRAX_SER0_DSR_BIT
string "Ser 0 DSR bit (empty = not used)"
depends on ETRAX_SERIAL_PORT0
config ETRAX_SER0_CD_BIT
string "Ser 0 CD bit (empty = not used)"
depends on ETRAX_SERIAL_PORT0
config ETRAX_SERIAL_PORT1
bool "Serial port 1 enabled"
depends on ETRAXFS_SERIAL
help
Enables the ETRAX FS serial driver for ser1 (ttyS1).
choice
prompt "Ser1 DMA in channel "
depends on ETRAX_SERIAL_PORT1
default ETRAX_SERIAL_PORT1_NO_DMA_IN
help
What DMA channel to use for ser1.
config ETRAX_SERIAL_PORT1_NO_DMA_IN
bool "Ser1 uses no DMA for input"
help
Do not use DMA for ser1 input.
config ETRAX_SERIAL_PORT1_DMA5_IN
bool "Ser1 uses DMA5 for input"
depends on ETRAX_SERIAL_PORT1
help
Enables the DMA5 input channel for ser1 (ttyS1).
If you do not enable DMA, an interrupt for each character will be
used when receiveing data.
Normally you want this on, unless you use the DMA channel for
something else.
endchoice
choice
prompt "Ser1 DMA out channel "
depends on ETRAX_SERIAL_PORT1
default ETRAX_SERIAL_PORT1_NO_DMA_OUT
help
What DMA channel to use for ser1.
config ETRAX_SERIAL_PORT1_NO_DMA_OUT
bool "Ser1 uses no DMA for output"
help
Do not use DMA for ser1 output.
config ETRAX_SERIAL_PORT1_DMA4_OUT
bool "Ser1 uses DMA4 for output"
depends on ETRAX_SERIAL_PORT1
help
Enables the DMA4 output channel for ser1 (ttyS1).
If you do not enable DMA, an interrupt for each character will be
used when transmitting data.
Normally you want this on, unless you use the DMA channel for
something else.
endchoice
config ETRAX_SER1_DTR_BIT
string "Ser 1 DTR bit (empty = not used)"
depends on ETRAX_SERIAL_PORT1
config ETRAX_SER1_RI_BIT
string "Ser 1 RI bit (empty = not used)"
depends on ETRAX_SERIAL_PORT1
config ETRAX_SER1_DSR_BIT
string "Ser 1 DSR bit (empty = not used)"
depends on ETRAX_SERIAL_PORT1
config ETRAX_SER1_CD_BIT
string "Ser 1 CD bit (empty = not used)"
depends on ETRAX_SERIAL_PORT1
config ETRAX_SERIAL_PORT2
bool "Serial port 2 enabled"
depends on ETRAXFS_SERIAL
help
Enables the ETRAX FS serial driver for ser2 (ttyS2).
choice
prompt "Ser2 DMA in channel "
depends on ETRAX_SERIAL_PORT2
default ETRAX_SERIAL_PORT2_NO_DMA_IN
help
What DMA channel to use for ser2.
config ETRAX_SERIAL_PORT2_NO_DMA_IN
bool "Ser2 uses no DMA for input"
help
Do not use DMA for ser2 input.
config ETRAX_SERIAL_PORT2_DMA3_IN
bool "Ser2 uses DMA3 for input"
depends on ETRAX_SERIAL_PORT2
help
Enables the DMA3 input channel for ser2 (ttyS2).
If you do not enable DMA, an interrupt for each character will be
used when receiveing data.
Normally you want to use DMA, unless you use the DMA channel for
something else.
endchoice
choice
prompt "Ser2 DMA out channel"
depends on ETRAX_SERIAL_PORT2
default ETRAX_SERIAL_PORT2_NO_DMA_OUT
config ETRAX_SERIAL_PORT2_NO_DMA_OUT
bool "Ser2 uses no DMA for output"
help
Do not use DMA for ser2 output.
config ETRAX_SERIAL_PORT2_DMA2_OUT
bool "Ser2 uses DMA2 for output"
depends on ETRAX_SERIAL_PORT2
help
Enables the DMA2 output channel for ser2 (ttyS2).
If you do not enable DMA, an interrupt for each character will be
used when transmitting data.
Normally you want to use DMA, unless you use the DMA channel for
something else.
endchoice
config ETRAX_SER2_DTR_BIT
string "Ser 2 DTR bit (empty = not used)"
depends on ETRAX_SERIAL_PORT2
config ETRAX_SER2_RI_BIT
string "Ser 2 RI bit (empty = not used)"
depends on ETRAX_SERIAL_PORT2
config ETRAX_SER2_DSR_BIT
string "Ser 2 DSR bit (empty = not used)"
depends on ETRAX_SERIAL_PORT2
config ETRAX_SER2_CD_BIT
string "Ser 2 CD bit (empty = not used)"
depends on ETRAX_SERIAL_PORT2
config ETRAX_SERIAL_PORT3
bool "Serial port 3 enabled"
depends on ETRAXFS_SERIAL
help
Enables the ETRAX FS serial driver for ser3 (ttyS3).
choice
prompt "Ser3 DMA in channel "
depends on ETRAX_SERIAL_PORT3
default ETRAX_SERIAL_PORT3_NO_DMA_IN
help
What DMA channel to use for ser3.
config ETRAX_SERIAL_PORT3_NO_DMA_IN
bool "Ser3 uses no DMA for input"
help
Do not use DMA for ser3 input.
config ETRAX_SERIAL_PORT3_DMA9_IN
bool "Ser3 uses DMA9 for input"
depends on ETRAX_SERIAL_PORT3
help
Enables the DMA9 input channel for ser3 (ttyS3).
If you do not enable DMA, an interrupt for each character will be
used when receiveing data.
Normally you want to use DMA, unless you use the DMA channel for
something else.
endchoice
choice
prompt "Ser3 DMA out channel"
depends on ETRAX_SERIAL_PORT3
default ETRAX_SERIAL_PORT3_NO_DMA_OUT
config ETRAX_SERIAL_PORT3_NO_DMA_OUT
bool "Ser3 uses no DMA for output"
help
Do not use DMA for ser3 output.
config ETRAX_SERIAL_PORT3_DMA8_OUT
bool "Ser3 uses DMA8 for output"
depends on ETRAX_SERIAL_PORT3
help
Enables the DMA8 output channel for ser3 (ttyS3).
If you do not enable DMA, an interrupt for each character will be
used when transmitting data.
Normally you want to use DMA, unless you use the DMA channel for
something else.
endchoice
config ETRAX_SER3_DTR_BIT
string "Ser 3 DTR bit (empty = not used)"
depends on ETRAX_SERIAL_PORT3
config ETRAX_SER3_RI_BIT
string "Ser 3 RI bit (empty = not used)"
depends on ETRAX_SERIAL_PORT3
config ETRAX_SER3_DSR_BIT
string "Ser 3 DSR bit (empty = not used)"
depends on ETRAX_SERIAL_PORT3
config ETRAX_SER3_CD_BIT
string "Ser 3 CD bit (empty = not used)"
depends on ETRAX_SERIAL_PORT3
config ETRAX_RS485
bool "RS-485 support"
depends on ETRAX_SERIAL
help
Enables support for RS-485 serial communication. For a primer on
RS-485, see <http://www.hw.cz/english/docs/rs485/rs485.html>.
config ETRAX_RS485_DISABLE_RECEIVER
bool "Disable serial receiver"
depends on ETRAX_RS485
help
It is necessary to disable the serial receiver to avoid serial
loopback. Not all products are able to do this in software only.
Axis 2400/2401 must disable receiver.
config ETRAX_AXISFLASHMAP
bool "Axis flash-map support"
depends on ETRAX_ARCH_V32
select MTD
select MTD_CFI
select MTD_CFI_AMDSTD
select MTD_OBSOLETE_CHIPS
select MTD_AMDSTD
select MTD_CHAR
select MTD_BLOCK
select MTD_PARTITIONS
select MTD_CONCAT
select MTD_COMPLEX_MAPPINGS
help
This option enables MTD mapping of flash devices. Needed to use
flash memories. If unsure, say Y.
config ETRAX_SYNCHRONOUS_SERIAL
bool "Synchronous serial-port support"
depends on ETRAX_ARCH_V32
help
Enables the ETRAX FS synchronous serial driver.
config ETRAX_SYNCHRONOUS_SERIAL_PORT0
bool "Synchronous serial port 0 enabled"
depends on ETRAX_SYNCHRONOUS_SERIAL
help
Enabled synchronous serial port 0.
config ETRAX_SYNCHRONOUS_SERIAL0_DMA
bool "Enable DMA on synchronous serial port 0."
depends on ETRAX_SYNCHRONOUS_SERIAL_PORT0
help
A synchronous serial port can run in manual or DMA mode.
Selecting this option will make it run in DMA mode.
config ETRAX_SYNCHRONOUS_SERIAL_PORT1
bool "Synchronous serial port 1 enabled"
depends on ETRAX_SYNCHRONOUS_SERIAL
help
Enabled synchronous serial port 1.
config ETRAX_SYNCHRONOUS_SERIAL1_DMA
bool "Enable DMA on synchronous serial port 1."
depends on ETRAX_SYNCHRONOUS_SERIAL_PORT1
help
A synchronous serial port can run in manual or DMA mode.
Selecting this option will make it run in DMA mode.
config ETRAX_PTABLE_SECTOR
int "Byte-offset of partition table sector"
depends on ETRAX_AXISFLASHMAP
default "65536"
help
Byte-offset of the partition table in the first flash chip.
The default value is 64kB and should not be changed unless
you know exactly what you are doing. The only valid reason
for changing this is when the flash block size is bigger
than 64kB (e.g. when using two parallel 16 bit flashes).
config ETRAX_NANDFLASH
bool "NAND flash support"
depends on ETRAX_ARCH_V32
select MTD_NAND
select MTD_NAND_IDS
help
This option enables MTD mapping of NAND flash devices. Needed to use
NAND flash memories. If unsure, say Y.
config ETRAX_I2C
bool "I2C driver"
depends on ETRAX_ARCH_V32
help
This option enabled the I2C driver used by e.g. the RTC driver.
config ETRAX_I2C_DATA_PORT
string "I2C data pin"
depends on ETRAX_I2C
help
The pin to use for I2C data.
config ETRAX_I2C_CLK_PORT
string "I2C clock pin"
depends on ETRAX_I2C
help
The pin to use for I2C clock.
config ETRAX_RTC
bool "Real Time Clock support"
depends on ETRAX_ARCH_V32
help
Enabled RTC support.
choice
prompt "RTC chip"
depends on ETRAX_RTC
default ETRAX_PCF8563
config ETRAX_PCF8563
bool "PCF8563"
help
Philips PCF8563 RTC
endchoice
config ETRAX_GPIO
bool "GPIO support"
depends on ETRAX_ARCH_V32
---help---
Enables the ETRAX general port device (major 120, minors 0-4).
You can use this driver to access the general port bits. It supports
these ioctl's:
#include <linux/etraxgpio.h>
fd = open("/dev/gpioa", O_RDWR); // or /dev/gpiob
ioctl(fd, _IO(ETRAXGPIO_IOCTYPE, IO_SETBITS), bits_to_set);
ioctl(fd, _IO(ETRAXGPIO_IOCTYPE, IO_CLRBITS), bits_to_clear);
err = ioctl(fd, _IO(ETRAXGPIO_IOCTYPE, IO_READ_INBITS), &val);
Remember that you need to setup the port directions appropriately in
the General configuration.
config ETRAX_PA_BUTTON_BITMASK
hex "PA-buttons bitmask"
depends on ETRAX_GPIO
default "0x02"
help
This is a bitmask (8 bits) with information about what bits on PA
that are used for buttons.
Most products has a so called TEST button on PA1, if that is true
use 0x02 here.
Use 00 if there are no buttons on PA.
If the bitmask is <> 00 a button driver will be included in the gpio
driver. ETRAX general I/O support must be enabled.
config ETRAX_PA_CHANGEABLE_DIR
hex "PA user changeable dir mask"
depends on ETRAX_GPIO
default "0x00"
help
This is a bitmask (8 bits) with information of what bits in PA that a
user can change direction on using ioctl's.
Bit set = changeable.
You probably want 0x00 here, but it depends on your hardware.
config ETRAX_PA_CHANGEABLE_BITS
hex "PA user changeable bits mask"
depends on ETRAX_GPIO
default "0x00"
help
This is a bitmask (8 bits) with information of what bits in PA
that a user can change the value on using ioctl's.
Bit set = changeable.
config ETRAX_PB_CHANGEABLE_DIR
hex "PB user changeable dir mask"
depends on ETRAX_GPIO
default "0x00000"
help
This is a bitmask (18 bits) with information of what bits in PB
that a user can change direction on using ioctl's.
Bit set = changeable.
You probably want 0x00000 here, but it depends on your hardware.
config ETRAX_PB_CHANGEABLE_BITS
hex "PB user changeable bits mask"
depends on ETRAX_GPIO
default "0x00000"
help
This is a bitmask (18 bits) with information of what bits in PB
that a user can change the value on using ioctl's.
Bit set = changeable.
config ETRAX_PC_CHANGEABLE_DIR
hex "PC user changeable dir mask"
depends on ETRAX_GPIO
default "0x00000"
help
This is a bitmask (18 bits) with information of what bits in PC
that a user can change direction on using ioctl's.
Bit set = changeable.
You probably want 0x00000 here, but it depends on your hardware.
config ETRAX_PC_CHANGEABLE_BITS
hex "PC user changeable bits mask"
depends on ETRAX_GPIO
default "0x00000"
help
This is a bitmask (18 bits) with information of what bits in PC
that a user can change the value on using ioctl's.
Bit set = changeable.
config ETRAX_PD_CHANGEABLE_DIR
hex "PD user changeable dir mask"
depends on ETRAX_GPIO
default "0x00000"
help
This is a bitmask (18 bits) with information of what bits in PD
that a user can change direction on using ioctl's.
Bit set = changeable.
You probably want 0x00000 here, but it depends on your hardware.
config ETRAX_PD_CHANGEABLE_BITS
hex "PD user changeable bits mask"
depends on ETRAX_GPIO
default "0x00000"
help
This is a bitmask (18 bits) with information of what bits in PD
that a user can change the value on using ioctl's.
Bit set = changeable.
config ETRAX_PE_CHANGEABLE_DIR
hex "PE user changeable dir mask"
depends on ETRAX_GPIO
default "0x00000"
help
This is a bitmask (18 bits) with information of what bits in PE
that a user can change direction on using ioctl's.
Bit set = changeable.
You probably want 0x00000 here, but it depends on your hardware.
config ETRAX_PE_CHANGEABLE_BITS
hex "PE user changeable bits mask"
depends on ETRAX_GPIO
default "0x00000"
help
This is a bitmask (18 bits) with information of what bits in PE
that a user can change the value on using ioctl's.
Bit set = changeable.
config ETRAX_IDE
bool "ATA/IDE support"
depends on ETRAX_ARCH_V32
select IDE
select BLK_DEV_IDE
select BLK_DEV_IDEDISK
select BLK_DEV_IDECD
select BLK_DEV_IDEDMA
help
Enables the ETRAX IDE driver.
config ETRAX_CARDBUS
bool "Cardbus support"
depends on ETRAX_ARCH_V32
select PCCARD
select CARDBUS
select HOTPLUG
select PCCARD_NONSTATIC
help
Enabled the ETRAX Carbus driver.
config PCI
bool
depends on ETRAX_CARDBUS
default y
config ETRAX_IOP_FW_LOAD
tristate "IO-processor hotplug firmware loading support"
depends on ETRAX_ARCH_V32
select FW_LOADER
help
Enables IO-processor hotplug firmware loading support.
config ETRAX_STREAMCOPROC
tristate "Stream co-processor driver enabled"
depends on ETRAX_ARCH_V32
help
This option enables a driver for the stream co-processor
for cryptographic operations.

View file

@ -0,0 +1,13 @@
#
# Makefile for Etrax-specific drivers
#
obj-$(CONFIG_ETRAX_STREAMCOPROC) += cryptocop.o
obj-$(CONFIG_ETRAX_AXISFLASHMAP) += axisflashmap.o
obj-$(CONFIG_ETRAX_NANDFLASH) += nandflash.o
obj-$(CONFIG_ETRAX_GPIO) += gpio.o
obj-$(CONFIG_ETRAX_IOP_FW_LOAD) += iop_fw_load.o
obj-$(CONFIG_ETRAX_PCF8563) += pcf8563.o
obj-$(CONFIG_ETRAX_I2C) += i2c.o
obj-$(CONFIG_ETRAX_SYNCHRONOUS_SERIAL) += sync_serial.o
obj-$(CONFIG_PCI) += pci/

View file

@ -0,0 +1,455 @@
/*
* Physical mapping layer for MTD using the Axis partitiontable format
*
* Copyright (c) 2001, 2002, 2003 Axis Communications AB
*
* This file is under the GPL.
*
* First partition is always sector 0 regardless of if we find a partitiontable
* or not. In the start of the next sector, there can be a partitiontable that
* tells us what other partitions to define. If there isn't, we use a default
* partition split defined below.
*
* Copy of os/lx25/arch/cris/arch-v10/drivers/axisflashmap.c 1.5
* with minor changes.
*
*/
#include <linux/module.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/config.h>
#include <linux/init.h>
#include <linux/mtd/concat.h>
#include <linux/mtd/map.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/mtdram.h>
#include <linux/mtd/partitions.h>
#include <asm/arch/hwregs/config_defs.h>
#include <asm/axisflashmap.h>
#include <asm/mmu.h>
#define MEM_CSE0_SIZE (0x04000000)
#define MEM_CSE1_SIZE (0x04000000)
#define FLASH_UNCACHED_ADDR KSEG_E
#define FLASH_CACHED_ADDR KSEG_F
#if CONFIG_ETRAX_FLASH_BUSWIDTH==1
#define flash_data __u8
#elif CONFIG_ETRAX_FLASH_BUSWIDTH==2
#define flash_data __u16
#elif CONFIG_ETRAX_FLASH_BUSWIDTH==4
#define flash_data __u16
#endif
/* From head.S */
extern unsigned long romfs_start, romfs_length, romfs_in_flash;
/* The master mtd for the entire flash. */
struct mtd_info* axisflash_mtd = NULL;
/* Map driver functions. */
static map_word flash_read(struct map_info *map, unsigned long ofs)
{
map_word tmp;
tmp.x[0] = *(flash_data *)(map->map_priv_1 + ofs);
return tmp;
}
static void flash_copy_from(struct map_info *map, void *to,
unsigned long from, ssize_t len)
{
memcpy(to, (void *)(map->map_priv_1 + from), len);
}
static void flash_write(struct map_info *map, map_word d, unsigned long adr)
{
*(flash_data *)(map->map_priv_1 + adr) = (flash_data)d.x[0];
}
/*
* The map for chip select e0.
*
* We run into tricky coherence situations if we mix cached with uncached
* accesses to we only use the uncached version here.
*
* The size field is the total size where the flash chips may be mapped on the
* chip select. MTD probes should find all devices there and it does not matter
* if there are unmapped gaps or aliases (mirrors of flash devices). The MTD
* probes will ignore them.
*
* The start address in map_priv_1 is in virtual memory so we cannot use
* MEM_CSE0_START but must rely on that FLASH_UNCACHED_ADDR is the start
* address of cse0.
*/
static struct map_info map_cse0 = {
.name = "cse0",
.size = MEM_CSE0_SIZE,
.bankwidth = CONFIG_ETRAX_FLASH_BUSWIDTH,
.read = flash_read,
.copy_from = flash_copy_from,
.write = flash_write,
.map_priv_1 = FLASH_UNCACHED_ADDR
};
/*
* The map for chip select e1.
*
* If there was a gap between cse0 and cse1, map_priv_1 would get the wrong
* address, but there isn't.
*/
static struct map_info map_cse1 = {
.name = "cse1",
.size = MEM_CSE1_SIZE,
.bankwidth = CONFIG_ETRAX_FLASH_BUSWIDTH,
.read = flash_read,
.copy_from = flash_copy_from,
.write = flash_write,
.map_priv_1 = FLASH_UNCACHED_ADDR + MEM_CSE0_SIZE
};
/* If no partition-table was found, we use this default-set. */
#define MAX_PARTITIONS 7
#define NUM_DEFAULT_PARTITIONS 3
/*
* Default flash size is 2MB. CONFIG_ETRAX_PTABLE_SECTOR is most likely the
* size of one flash block and "filesystem"-partition needs 5 blocks to be able
* to use JFFS.
*/
static struct mtd_partition axis_default_partitions[NUM_DEFAULT_PARTITIONS] = {
{
.name = "boot firmware",
.size = CONFIG_ETRAX_PTABLE_SECTOR,
.offset = 0
},
{
.name = "kernel",
.size = 0x200000 - (6 * CONFIG_ETRAX_PTABLE_SECTOR),
.offset = CONFIG_ETRAX_PTABLE_SECTOR
},
{
.name = "filesystem",
.size = 5 * CONFIG_ETRAX_PTABLE_SECTOR,
.offset = 0x200000 - (5 * CONFIG_ETRAX_PTABLE_SECTOR)
}
};
/* Initialize the ones normally used. */
static struct mtd_partition axis_partitions[MAX_PARTITIONS] = {
{
.name = "part0",
.size = CONFIG_ETRAX_PTABLE_SECTOR,
.offset = 0
},
{
.name = "part1",
.size = 0,
.offset = 0
},
{
.name = "part2",
.size = 0,
.offset = 0
},
{
.name = "part3",
.size = 0,
.offset = 0
},
{
.name = "part4",
.size = 0,
.offset = 0
},
{
.name = "part5",
.size = 0,
.offset = 0
},
{
.name = "part6",
.size = 0,
.offset = 0
},
};
/*
* Probe a chip select for AMD-compatible (JEDEC) or CFI-compatible flash
* chips in that order (because the amd_flash-driver is faster).
*/
static struct mtd_info *probe_cs(struct map_info *map_cs)
{
struct mtd_info *mtd_cs = NULL;
printk(KERN_INFO
"%s: Probing a 0x%08lx bytes large window at 0x%08lx.\n",
map_cs->name, map_cs->size, map_cs->map_priv_1);
#ifdef CONFIG_MTD_AMDSTD
mtd_cs = do_map_probe("amd_flash", map_cs);
#endif
#ifdef CONFIG_MTD_CFI
if (!mtd_cs) {
mtd_cs = do_map_probe("cfi_probe", map_cs);
}
#endif
return mtd_cs;
}
/*
* Probe each chip select individually for flash chips. If there are chips on
* both cse0 and cse1, the mtd_info structs will be concatenated to one struct
* so that MTD partitions can cross chip boundries.
*
* The only known restriction to how you can mount your chips is that each
* chip select must hold similar flash chips. But you need external hardware
* to do that anyway and you can put totally different chips on cse0 and cse1
* so it isn't really much of a restriction.
*/
extern struct mtd_info* __init crisv32_nand_flash_probe (void);
static struct mtd_info *flash_probe(void)
{
struct mtd_info *mtd_cse0;
struct mtd_info *mtd_cse1;
struct mtd_info *mtd_nand = NULL;
struct mtd_info *mtd_total;
struct mtd_info *mtds[3];
int count = 0;
if ((mtd_cse0 = probe_cs(&map_cse0)) != NULL)
mtds[count++] = mtd_cse0;
if ((mtd_cse1 = probe_cs(&map_cse1)) != NULL)
mtds[count++] = mtd_cse1;
#ifdef CONFIG_ETRAX_NANDFLASH
if ((mtd_nand = crisv32_nand_flash_probe()) != NULL)
mtds[count++] = mtd_nand;
#endif
if (!mtd_cse0 && !mtd_cse1 && !mtd_nand) {
/* No chip found. */
return NULL;
}
if (count > 1) {
#ifdef CONFIG_MTD_CONCAT
/* Since the concatenation layer adds a small overhead we
* could try to figure out if the chips in cse0 and cse1 are
* identical and reprobe the whole cse0+cse1 window. But since
* flash chips are slow, the overhead is relatively small.
* So we use the MTD concatenation layer instead of further
* complicating the probing procedure.
*/
mtd_total = mtd_concat_create(mtds,
count,
"cse0+cse1+nand");
#else
printk(KERN_ERR "%s and %s: Cannot concatenate due to kernel "
"(mis)configuration!\n", map_cse0.name, map_cse1.name);
mtd_toal = NULL;
#endif
if (!mtd_total) {
printk(KERN_ERR "%s and %s: Concatenation failed!\n",
map_cse0.name, map_cse1.name);
/* The best we can do now is to only use what we found
* at cse0.
*/
mtd_total = mtd_cse0;
map_destroy(mtd_cse1);
}
} else {
mtd_total = mtd_cse0? mtd_cse0 : mtd_cse1 ? mtd_cse1 : mtd_nand;
}
return mtd_total;
}
extern unsigned long crisv32_nand_boot;
extern unsigned long crisv32_nand_cramfs_offset;
/*
* Probe the flash chip(s) and, if it succeeds, read the partition-table
* and register the partitions with MTD.
*/
static int __init init_axis_flash(void)
{
struct mtd_info *mymtd;
int err = 0;
int pidx = 0;
struct partitiontable_head *ptable_head = NULL;
struct partitiontable_entry *ptable;
int use_default_ptable = 1; /* Until proven otherwise. */
const char *pmsg = KERN_INFO " /dev/flash%d at 0x%08x, size 0x%08x\n";
static char page[512];
size_t len;
#ifndef CONFIG_ETRAXFS_SIM
mymtd = flash_probe();
mymtd->read(mymtd, CONFIG_ETRAX_PTABLE_SECTOR, 512, &len, page);
ptable_head = (struct partitiontable_head *)(page + PARTITION_TABLE_OFFSET);
if (!mymtd) {
/* There's no reason to use this module if no flash chip can
* be identified. Make sure that's understood.
*/
printk(KERN_INFO "axisflashmap: Found no flash chip.\n");
} else {
printk(KERN_INFO "%s: 0x%08x bytes of flash memory.\n",
mymtd->name, mymtd->size);
axisflash_mtd = mymtd;
}
if (mymtd) {
mymtd->owner = THIS_MODULE;
}
pidx++; /* First partition is always set to the default. */
if (ptable_head && (ptable_head->magic == PARTITION_TABLE_MAGIC)
&& (ptable_head->size <
(MAX_PARTITIONS * sizeof(struct partitiontable_entry) +
PARTITIONTABLE_END_MARKER_SIZE))
&& (*(unsigned long*)((void*)ptable_head + sizeof(*ptable_head) +
ptable_head->size -
PARTITIONTABLE_END_MARKER_SIZE)
== PARTITIONTABLE_END_MARKER)) {
/* Looks like a start, sane length and end of a
* partition table, lets check csum etc.
*/
int ptable_ok = 0;
struct partitiontable_entry *max_addr =
(struct partitiontable_entry *)
((unsigned long)ptable_head + sizeof(*ptable_head) +
ptable_head->size);
unsigned long offset = CONFIG_ETRAX_PTABLE_SECTOR;
unsigned char *p;
unsigned long csum = 0;
ptable = (struct partitiontable_entry *)
((unsigned long)ptable_head + sizeof(*ptable_head));
/* Lets be PARANOID, and check the checksum. */
p = (unsigned char*) ptable;
while (p <= (unsigned char*)max_addr) {
csum += *p++;
csum += *p++;
csum += *p++;
csum += *p++;
}
ptable_ok = (csum == ptable_head->checksum);
/* Read the entries and use/show the info. */
printk(KERN_INFO " Found a%s partition table at 0x%p-0x%p.\n",
(ptable_ok ? " valid" : "n invalid"), ptable_head,
max_addr);
/* We have found a working bootblock. Now read the
* partition table. Scan the table. It ends when
* there is 0xffffffff, that is, empty flash.
*/
while (ptable_ok
&& ptable->offset != 0xffffffff
&& ptable < max_addr
&& pidx < MAX_PARTITIONS) {
axis_partitions[pidx].offset = offset + ptable->offset + (crisv32_nand_boot ? 16384 : 0);
axis_partitions[pidx].size = ptable->size;
printk(pmsg, pidx, axis_partitions[pidx].offset,
axis_partitions[pidx].size);
pidx++;
ptable++;
}
use_default_ptable = !ptable_ok;
}
if (romfs_in_flash) {
/* Add an overlapping device for the root partition (romfs). */
axis_partitions[pidx].name = "romfs";
if (crisv32_nand_boot) {
char* data = kmalloc(1024, GFP_KERNEL);
int len;
int offset = crisv32_nand_cramfs_offset & ~(1024-1);
char* tmp;
mymtd->read(mymtd, offset, 1024, &len, data);
tmp = &data[crisv32_nand_cramfs_offset % 512];
axis_partitions[pidx].size = *(unsigned*)(tmp + 4);
axis_partitions[pidx].offset = crisv32_nand_cramfs_offset;
kfree(data);
} else {
axis_partitions[pidx].size = romfs_length;
axis_partitions[pidx].offset = romfs_start - FLASH_CACHED_ADDR;
}
axis_partitions[pidx].mask_flags |= MTD_WRITEABLE;
printk(KERN_INFO
" Adding readonly flash partition for romfs image:\n");
printk(pmsg, pidx, axis_partitions[pidx].offset,
axis_partitions[pidx].size);
pidx++;
}
if (mymtd) {
if (use_default_ptable) {
printk(KERN_INFO " Using default partition table.\n");
err = add_mtd_partitions(mymtd, axis_default_partitions,
NUM_DEFAULT_PARTITIONS);
} else {
err = add_mtd_partitions(mymtd, axis_partitions, pidx);
}
if (err) {
panic("axisflashmap could not add MTD partitions!\n");
}
}
/* CONFIG_EXTRAXFS_SIM */
#endif
if (!romfs_in_flash) {
/* Create an RAM device for the root partition (romfs). */
#if !defined(CONFIG_MTD_MTDRAM) || (CONFIG_MTDRAM_TOTAL_SIZE != 0) || (CONFIG_MTDRAM_ABS_POS != 0)
/* No use trying to boot this kernel from RAM. Panic! */
printk(KERN_EMERG "axisflashmap: Cannot create an MTD RAM "
"device due to kernel (mis)configuration!\n");
panic("This kernel cannot boot from RAM!\n");
#else
struct mtd_info *mtd_ram;
mtd_ram = (struct mtd_info *)kmalloc(sizeof(struct mtd_info),
GFP_KERNEL);
if (!mtd_ram) {
panic("axisflashmap couldn't allocate memory for "
"mtd_info!\n");
}
printk(KERN_INFO " Adding RAM partition for romfs image:\n");
printk(pmsg, pidx, romfs_start, romfs_length);
err = mtdram_init_device(mtd_ram, (void*)romfs_start,
romfs_length, "romfs");
if (err) {
panic("axisflashmap could not initialize MTD RAM "
"device!\n");
}
#endif
}
return err;
}
/* This adds the above to the kernels init-call chain. */
module_init(init_axis_flash);
EXPORT_SYMBOL(axisflash_mtd);

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,766 @@
/* $Id: gpio.c,v 1.16 2005/06/19 17:06:49 starvik Exp $
*
* ETRAX CRISv32 general port I/O device
*
* Copyright (c) 1999, 2000, 2001, 2002, 2003 Axis Communications AB
*
* Authors: Bjorn Wesen (initial version)
* Ola Knutsson (LED handling)
* Johan Adolfsson (read/set directions, write, port G,
* port to ETRAX FS.
*
* $Log: gpio.c,v $
* Revision 1.16 2005/06/19 17:06:49 starvik
* Merge of Linux 2.6.12.
*
* Revision 1.15 2005/05/25 08:22:20 starvik
* Changed GPIO port order to fit packages/devices/axis-2.4.
*
* Revision 1.14 2005/04/24 18:35:08 starvik
* Updated with final register headers.
*
* Revision 1.13 2005/03/15 15:43:00 starvik
* dev_id needs to be supplied for shared IRQs.
*
* Revision 1.12 2005/03/10 17:12:00 starvik
* Protect alarm list with spinlock.
*
* Revision 1.11 2005/01/05 06:08:59 starvik
* No need to do local_irq_disable after local_irq_save.
*
* Revision 1.10 2004/11/19 08:38:31 starvik
* Removed old crap.
*
* Revision 1.9 2004/05/14 07:58:02 starvik
* Merge of changes from 2.4
*
* Revision 1.8 2003/09/11 07:29:50 starvik
* Merge of Linux 2.6.0-test5
*
* Revision 1.7 2003/07/10 13:25:46 starvik
* Compiles for 2.5.74
* Lindented ethernet.c
*
* Revision 1.6 2003/07/04 08:27:46 starvik
* Merge of Linux 2.5.74
*
* Revision 1.5 2003/06/10 08:26:37 johana
* Etrax -> ETRAX CRISv32
*
* Revision 1.4 2003/06/05 14:22:48 johana
* Initialise some_alarms.
*
* Revision 1.3 2003/06/05 10:15:46 johana
* New INTR_VECT macros.
* Enable interrupts in global config.
*
* Revision 1.2 2003/06/03 15:52:50 johana
* Initial CRIS v32 version.
*
* Revision 1.1 2003/06/03 08:53:15 johana
* Copy of os/lx25/arch/cris/arch-v10/drivers/gpio.c version 1.7.
*
*/
#include <linux/config.h>
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/slab.h>
#include <linux/ioport.h>
#include <linux/errno.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/string.h>
#include <linux/poll.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/spinlock.h>
#include <asm/etraxgpio.h>
#include <asm/arch/hwregs/reg_map.h>
#include <asm/arch/hwregs/reg_rdwr.h>
#include <asm/arch/hwregs/gio_defs.h>
#include <asm/arch/hwregs/intr_vect_defs.h>
#include <asm/io.h>
#include <asm/system.h>
#include <asm/irq.h>
/* The following gio ports on ETRAX FS is available:
* pa 8 bits, supports interrupts off, hi, low, set, posedge, negedge anyedge
* pb 18 bits
* pc 18 bits
* pd 18 bits
* pe 18 bits
* each port has a rw_px_dout, r_px_din and rw_px_oe register.
*/
#define GPIO_MAJOR 120 /* experimental MAJOR number */
#define D(x)
#if 0
static int dp_cnt;
#define DP(x) do { dp_cnt++; if (dp_cnt % 1000 == 0) x; }while(0)
#else
#define DP(x)
#endif
static char gpio_name[] = "etrax gpio";
#if 0
static wait_queue_head_t *gpio_wq;
#endif
static int gpio_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg);
static ssize_t gpio_write(struct file * file, const char * buf, size_t count,
loff_t *off);
static int gpio_open(struct inode *inode, struct file *filp);
static int gpio_release(struct inode *inode, struct file *filp);
static unsigned int gpio_poll(struct file *filp, struct poll_table_struct *wait);
/* private data per open() of this driver */
struct gpio_private {
struct gpio_private *next;
/* The IO_CFG_WRITE_MODE_VALUE only support 8 bits: */
unsigned char clk_mask;
unsigned char data_mask;
unsigned char write_msb;
unsigned char pad1;
/* These fields are generic */
unsigned long highalarm, lowalarm;
wait_queue_head_t alarm_wq;
int minor;
};
/* linked list of alarms to check for */
static struct gpio_private *alarmlist = 0;
static int gpio_some_alarms = 0; /* Set if someone uses alarm */
static unsigned long gpio_pa_high_alarms = 0;
static unsigned long gpio_pa_low_alarms = 0;
static DEFINE_SPINLOCK(alarm_lock);
#define NUM_PORTS (GPIO_MINOR_LAST+1)
#define GIO_REG_RD_ADDR(reg) (volatile unsigned long*) (regi_gio + REG_RD_ADDR_gio_##reg )
#define GIO_REG_WR_ADDR(reg) (volatile unsigned long*) (regi_gio + REG_RD_ADDR_gio_##reg )
unsigned long led_dummy;
static volatile unsigned long *data_out[NUM_PORTS] = {
GIO_REG_WR_ADDR(rw_pa_dout),
GIO_REG_WR_ADDR(rw_pb_dout),
&led_dummy,
GIO_REG_WR_ADDR(rw_pc_dout),
GIO_REG_WR_ADDR(rw_pd_dout),
GIO_REG_WR_ADDR(rw_pe_dout),
};
static volatile unsigned long *data_in[NUM_PORTS] = {
GIO_REG_RD_ADDR(r_pa_din),
GIO_REG_RD_ADDR(r_pb_din),
&led_dummy,
GIO_REG_RD_ADDR(r_pc_din),
GIO_REG_RD_ADDR(r_pd_din),
GIO_REG_RD_ADDR(r_pe_din),
};
static unsigned long changeable_dir[NUM_PORTS] = {
CONFIG_ETRAX_PA_CHANGEABLE_DIR,
CONFIG_ETRAX_PB_CHANGEABLE_DIR,
0,
CONFIG_ETRAX_PC_CHANGEABLE_DIR,
CONFIG_ETRAX_PD_CHANGEABLE_DIR,
CONFIG_ETRAX_PE_CHANGEABLE_DIR,
};
static unsigned long changeable_bits[NUM_PORTS] = {
CONFIG_ETRAX_PA_CHANGEABLE_BITS,
CONFIG_ETRAX_PB_CHANGEABLE_BITS,
0,
CONFIG_ETRAX_PC_CHANGEABLE_BITS,
CONFIG_ETRAX_PD_CHANGEABLE_BITS,
CONFIG_ETRAX_PE_CHANGEABLE_BITS,
};
static volatile unsigned long *dir_oe[NUM_PORTS] = {
GIO_REG_WR_ADDR(rw_pa_oe),
GIO_REG_WR_ADDR(rw_pb_oe),
&led_dummy,
GIO_REG_WR_ADDR(rw_pc_oe),
GIO_REG_WR_ADDR(rw_pd_oe),
GIO_REG_WR_ADDR(rw_pe_oe),
};
static unsigned int
gpio_poll(struct file *file,
poll_table *wait)
{
unsigned int mask = 0;
struct gpio_private *priv = (struct gpio_private *)file->private_data;
unsigned long data;
poll_wait(file, &priv->alarm_wq, wait);
if (priv->minor == GPIO_MINOR_A) {
reg_gio_rw_intr_cfg intr_cfg;
unsigned long tmp;
unsigned long flags;
local_irq_save(flags);
data = REG_TYPE_CONV(unsigned long, reg_gio_r_pa_din, REG_RD(gio, regi_gio, r_pa_din));
/* PA has support for interrupt
* lets activate high for those low and with highalarm set
*/
intr_cfg = REG_RD(gio, regi_gio, rw_intr_cfg);
tmp = ~data & priv->highalarm & 0xFF;
if (tmp & (1 << 0)) {
intr_cfg.pa0 = regk_gio_hi;
}
if (tmp & (1 << 1)) {
intr_cfg.pa1 = regk_gio_hi;
}
if (tmp & (1 << 2)) {
intr_cfg.pa2 = regk_gio_hi;
}
if (tmp & (1 << 3)) {
intr_cfg.pa3 = regk_gio_hi;
}
if (tmp & (1 << 4)) {
intr_cfg.pa4 = regk_gio_hi;
}
if (tmp & (1 << 5)) {
intr_cfg.pa5 = regk_gio_hi;
}
if (tmp & (1 << 6)) {
intr_cfg.pa6 = regk_gio_hi;
}
if (tmp & (1 << 7)) {
intr_cfg.pa7 = regk_gio_hi;
}
/*
* lets activate low for those high and with lowalarm set
*/
tmp = data & priv->lowalarm & 0xFF;
if (tmp & (1 << 0)) {
intr_cfg.pa0 = regk_gio_lo;
}
if (tmp & (1 << 1)) {
intr_cfg.pa1 = regk_gio_lo;
}
if (tmp & (1 << 2)) {
intr_cfg.pa2 = regk_gio_lo;
}
if (tmp & (1 << 3)) {
intr_cfg.pa3 = regk_gio_lo;
}
if (tmp & (1 << 4)) {
intr_cfg.pa4 = regk_gio_lo;
}
if (tmp & (1 << 5)) {
intr_cfg.pa5 = regk_gio_lo;
}
if (tmp & (1 << 6)) {
intr_cfg.pa6 = regk_gio_lo;
}
if (tmp & (1 << 7)) {
intr_cfg.pa7 = regk_gio_lo;
}
REG_WR(gio, regi_gio, rw_intr_cfg, intr_cfg);
local_irq_restore(flags);
} else if (priv->minor <= GPIO_MINOR_E)
data = *data_in[priv->minor];
else
return 0;
if ((data & priv->highalarm) ||
(~data & priv->lowalarm)) {
mask = POLLIN|POLLRDNORM;
}
DP(printk("gpio_poll ready: mask 0x%08X\n", mask));
return mask;
}
int etrax_gpio_wake_up_check(void)
{
struct gpio_private *priv = alarmlist;
unsigned long data = 0;
int ret = 0;
while (priv) {
data = *data_in[priv->minor];
if ((data & priv->highalarm) ||
(~data & priv->lowalarm)) {
DP(printk("etrax_gpio_wake_up_check %i\n",priv->minor));
wake_up_interruptible(&priv->alarm_wq);
ret = 1;
}
priv = priv->next;
}
return ret;
}
static irqreturn_t
gpio_poll_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
if (gpio_some_alarms) {
return IRQ_RETVAL(etrax_gpio_wake_up_check());
}
return IRQ_NONE;
}
static irqreturn_t
gpio_pa_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
reg_gio_rw_intr_mask intr_mask;
reg_gio_r_masked_intr masked_intr;
reg_gio_rw_ack_intr ack_intr;
unsigned long tmp;
unsigned long tmp2;
/* Find what PA interrupts are active */
masked_intr = REG_RD(gio, regi_gio, r_masked_intr);
tmp = REG_TYPE_CONV(unsigned long, reg_gio_r_masked_intr, masked_intr);
/* Find those that we have enabled */
spin_lock(&alarm_lock);
tmp &= (gpio_pa_high_alarms | gpio_pa_low_alarms);
spin_unlock(&alarm_lock);
/* Ack them */
ack_intr = REG_TYPE_CONV(reg_gio_rw_ack_intr, unsigned long, tmp);
REG_WR(gio, regi_gio, rw_ack_intr, ack_intr);
/* Disable those interrupts.. */
intr_mask = REG_RD(gio, regi_gio, rw_intr_mask);
tmp2 = REG_TYPE_CONV(unsigned long, reg_gio_rw_intr_mask, intr_mask);
tmp2 &= ~tmp;
intr_mask = REG_TYPE_CONV(reg_gio_rw_intr_mask, unsigned long, tmp2);
REG_WR(gio, regi_gio, rw_intr_mask, intr_mask);
if (gpio_some_alarms) {
return IRQ_RETVAL(etrax_gpio_wake_up_check());
}
return IRQ_NONE;
}
static ssize_t gpio_write(struct file * file, const char * buf, size_t count,
loff_t *off)
{
struct gpio_private *priv = (struct gpio_private *)file->private_data;
unsigned char data, clk_mask, data_mask, write_msb;
unsigned long flags;
unsigned long shadow;
volatile unsigned long *port;
ssize_t retval = count;
/* Only bits 0-7 may be used for write operations but allow all
devices except leds... */
if (priv->minor == GPIO_MINOR_LEDS) {
return -EFAULT;
}
if (!access_ok(VERIFY_READ, buf, count)) {
return -EFAULT;
}
clk_mask = priv->clk_mask;
data_mask = priv->data_mask;
/* It must have been configured using the IO_CFG_WRITE_MODE */
/* Perhaps a better error code? */
if (clk_mask == 0 || data_mask == 0) {
return -EPERM;
}
write_msb = priv->write_msb;
D(printk("gpio_write: %lu to data 0x%02X clk 0x%02X msb: %i\n",count, data_mask, clk_mask, write_msb));
port = data_out[priv->minor];
while (count--) {
int i;
data = *buf++;
if (priv->write_msb) {
for (i = 7; i >= 0;i--) {
local_irq_save(flags);
shadow = *port;
*port = shadow &= ~clk_mask;
if (data & 1<<i)
*port = shadow |= data_mask;
else
*port = shadow &= ~data_mask;
/* For FPGA: min 5.0ns (DCC) before CCLK high */
*port = shadow |= clk_mask;
local_irq_restore(flags);
}
} else {
for (i = 0; i <= 7;i++) {
local_irq_save(flags);
shadow = *port;
*port = shadow &= ~clk_mask;
if (data & 1<<i)
*port = shadow |= data_mask;
else
*port = shadow &= ~data_mask;
/* For FPGA: min 5.0ns (DCC) before CCLK high */
*port = shadow |= clk_mask;
local_irq_restore(flags);
}
}
}
return retval;
}
static int
gpio_open(struct inode *inode, struct file *filp)
{
struct gpio_private *priv;
int p = MINOR(inode->i_rdev);
if (p > GPIO_MINOR_LAST)
return -EINVAL;
priv = (struct gpio_private *)kmalloc(sizeof(struct gpio_private),
GFP_KERNEL);
if (!priv)
return -ENOMEM;
priv->minor = p;
/* initialize the io/alarm struct and link it into our alarmlist */
priv->next = alarmlist;
alarmlist = priv;
priv->clk_mask = 0;
priv->data_mask = 0;
priv->highalarm = 0;
priv->lowalarm = 0;
init_waitqueue_head(&priv->alarm_wq);
filp->private_data = (void *)priv;
return 0;
}
static int
gpio_release(struct inode *inode, struct file *filp)
{
struct gpio_private *p = alarmlist;
struct gpio_private *todel = (struct gpio_private *)filp->private_data;
/* local copies while updating them: */
unsigned long a_high, a_low;
unsigned long some_alarms;
/* unlink from alarmlist and free the private structure */
if (p == todel) {
alarmlist = todel->next;
} else {
while (p->next != todel)
p = p->next;
p->next = todel->next;
}
kfree(todel);
/* Check if there are still any alarms set */
p = alarmlist;
some_alarms = 0;
a_high = 0;
a_low = 0;
while (p) {
if (p->minor == GPIO_MINOR_A) {
a_high |= p->highalarm;
a_low |= p->lowalarm;
}
if (p->highalarm | p->lowalarm) {
some_alarms = 1;
}
p = p->next;
}
spin_lock(&alarm_lock);
gpio_some_alarms = some_alarms;
gpio_pa_high_alarms = a_high;
gpio_pa_low_alarms = a_low;
spin_unlock(&alarm_lock);
return 0;
}
/* Main device API. ioctl's to read/set/clear bits, as well as to
* set alarms to wait for using a subsequent select().
*/
unsigned long inline setget_input(struct gpio_private *priv, unsigned long arg)
{
/* Set direction 0=unchanged 1=input,
* return mask with 1=input
*/
unsigned long flags;
unsigned long dir_shadow;
local_irq_save(flags);
dir_shadow = *dir_oe[priv->minor];
dir_shadow &= ~(arg & changeable_dir[priv->minor]);
*dir_oe[priv->minor] = dir_shadow;
local_irq_restore(flags);
if (priv->minor == GPIO_MINOR_A)
dir_shadow ^= 0xFF; /* Only 8 bits */
else
dir_shadow ^= 0x3FFFF; /* Only 18 bits */
return dir_shadow;
} /* setget_input */
unsigned long inline setget_output(struct gpio_private *priv, unsigned long arg)
{
unsigned long flags;
unsigned long dir_shadow;
local_irq_save(flags);
dir_shadow = *dir_oe[priv->minor];
dir_shadow |= (arg & changeable_dir[priv->minor]);
*dir_oe[priv->minor] = dir_shadow;
local_irq_restore(flags);
return dir_shadow;
} /* setget_output */
static int
gpio_leds_ioctl(unsigned int cmd, unsigned long arg);
static int
gpio_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg)
{
unsigned long flags;
unsigned long val;
unsigned long shadow;
struct gpio_private *priv = (struct gpio_private *)file->private_data;
if (_IOC_TYPE(cmd) != ETRAXGPIO_IOCTYPE) {
return -EINVAL;
}
switch (_IOC_NR(cmd)) {
case IO_READBITS: /* Use IO_READ_INBITS and IO_READ_OUTBITS instead */
// read the port
return *data_in[priv->minor];
break;
case IO_SETBITS:
local_irq_save(flags);
if (arg & 0x04)
printk("GPIO SET 2\n");
// set changeable bits with a 1 in arg
shadow = *data_out[priv->minor];
shadow |= (arg & changeable_bits[priv->minor]);
*data_out[priv->minor] = shadow;
local_irq_restore(flags);
break;
case IO_CLRBITS:
local_irq_save(flags);
if (arg & 0x04)
printk("GPIO CLR 2\n");
// clear changeable bits with a 1 in arg
shadow = *data_out[priv->minor];
shadow &= ~(arg & changeable_bits[priv->minor]);
*data_out[priv->minor] = shadow;
local_irq_restore(flags);
break;
case IO_HIGHALARM:
// set alarm when bits with 1 in arg go high
priv->highalarm |= arg;
spin_lock(&alarm_lock);
gpio_some_alarms = 1;
if (priv->minor == GPIO_MINOR_A) {
gpio_pa_high_alarms |= arg;
}
spin_unlock(&alarm_lock);
break;
case IO_LOWALARM:
// set alarm when bits with 1 in arg go low
priv->lowalarm |= arg;
spin_lock(&alarm_lock);
gpio_some_alarms = 1;
if (priv->minor == GPIO_MINOR_A) {
gpio_pa_low_alarms |= arg;
}
spin_unlock(&alarm_lock);
break;
case IO_CLRALARM:
// clear alarm for bits with 1 in arg
priv->highalarm &= ~arg;
priv->lowalarm &= ~arg;
spin_lock(&alarm_lock);
if (priv->minor == GPIO_MINOR_A) {
if (gpio_pa_high_alarms & arg ||
gpio_pa_low_alarms & arg) {
/* Must update the gpio_pa_*alarms masks */
}
}
spin_unlock(&alarm_lock);
break;
case IO_READDIR: /* Use IO_SETGET_INPUT/OUTPUT instead! */
/* Read direction 0=input 1=output */
return *dir_oe[priv->minor];
case IO_SETINPUT: /* Use IO_SETGET_INPUT instead! */
/* Set direction 0=unchanged 1=input,
* return mask with 1=input
*/
return setget_input(priv, arg);
break;
case IO_SETOUTPUT: /* Use IO_SETGET_OUTPUT instead! */
/* Set direction 0=unchanged 1=output,
* return mask with 1=output
*/
return setget_output(priv, arg);
case IO_CFG_WRITE_MODE:
{
unsigned long dir_shadow;
dir_shadow = *dir_oe[priv->minor];
priv->clk_mask = arg & 0xFF;
priv->data_mask = (arg >> 8) & 0xFF;
priv->write_msb = (arg >> 16) & 0x01;
/* Check if we're allowed to change the bits and
* the direction is correct
*/
if (!((priv->clk_mask & changeable_bits[priv->minor]) &&
(priv->data_mask & changeable_bits[priv->minor]) &&
(priv->clk_mask & dir_shadow) &&
(priv->data_mask & dir_shadow)))
{
priv->clk_mask = 0;
priv->data_mask = 0;
return -EPERM;
}
break;
}
case IO_READ_INBITS:
/* *arg is result of reading the input pins */
val = *data_in[priv->minor];
if (copy_to_user((unsigned long*)arg, &val, sizeof(val)))
return -EFAULT;
return 0;
break;
case IO_READ_OUTBITS:
/* *arg is result of reading the output shadow */
val = *data_out[priv->minor];
if (copy_to_user((unsigned long*)arg, &val, sizeof(val)))
return -EFAULT;
break;
case IO_SETGET_INPUT:
/* bits set in *arg is set to input,
* *arg updated with current input pins.
*/
if (copy_from_user(&val, (unsigned long*)arg, sizeof(val)))
return -EFAULT;
val = setget_input(priv, val);
if (copy_to_user((unsigned long*)arg, &val, sizeof(val)))
return -EFAULT;
break;
case IO_SETGET_OUTPUT:
/* bits set in *arg is set to output,
* *arg updated with current output pins.
*/
if (copy_from_user(&val, (unsigned long*)arg, sizeof(val)))
return -EFAULT;
val = setget_output(priv, val);
if (copy_to_user((unsigned long*)arg, &val, sizeof(val)))
return -EFAULT;
break;
default:
if (priv->minor == GPIO_MINOR_LEDS)
return gpio_leds_ioctl(cmd, arg);
else
return -EINVAL;
} /* switch */
return 0;
}
static int
gpio_leds_ioctl(unsigned int cmd, unsigned long arg)
{
unsigned char green;
unsigned char red;
switch (_IOC_NR(cmd)) {
case IO_LEDACTIVE_SET:
green = ((unsigned char) arg) & 1;
red = (((unsigned char) arg) >> 1) & 1;
LED_ACTIVE_SET_G(green);
LED_ACTIVE_SET_R(red);
break;
default:
return -EINVAL;
} /* switch */
return 0;
}
struct file_operations gpio_fops = {
.owner = THIS_MODULE,
.poll = gpio_poll,
.ioctl = gpio_ioctl,
.write = gpio_write,
.open = gpio_open,
.release = gpio_release,
};
/* main driver initialization routine, called from mem.c */
static __init int
gpio_init(void)
{
int res;
reg_intr_vect_rw_mask intr_mask;
/* do the formalities */
res = register_chrdev(GPIO_MAJOR, gpio_name, &gpio_fops);
if (res < 0) {
printk(KERN_ERR "gpio: couldn't get a major number.\n");
return res;
}
/* Clear all leds */
LED_NETWORK_SET(0);
LED_ACTIVE_SET(0);
LED_DISK_READ(0);
LED_DISK_WRITE(0);
printk("ETRAX FS GPIO driver v2.5, (c) 2003-2005 Axis Communications AB\n");
/* We call etrax_gpio_wake_up_check() from timer interrupt and
* from cpu_idle() in kernel/process.c
* The check in cpu_idle() reduces latency from ~15 ms to ~6 ms
* in some tests.
*/
if (request_irq(TIMER_INTR_VECT, gpio_poll_timer_interrupt,
SA_SHIRQ | SA_INTERRUPT,"gpio poll", &alarmlist)) {
printk("err: timer0 irq for gpio\n");
}
if (request_irq(GEN_IO_INTR_VECT, gpio_pa_interrupt,
SA_SHIRQ | SA_INTERRUPT,"gpio PA", &alarmlist)) {
printk("err: PA irq for gpio\n");
}
/* enable the gio and timer irq in global config */
intr_mask = REG_RD(intr_vect, regi_irq, rw_mask);
intr_mask.timer = 1;
intr_mask.gen_io = 1;
REG_WR(intr_vect, regi_irq, rw_mask, intr_mask);
return res;
}
/* this makes sure that gpio_init is called during kernel boot */
module_init(gpio_init);

View file

@ -0,0 +1,611 @@
/*!***************************************************************************
*!
*! FILE NAME : i2c.c
*!
*! DESCRIPTION: implements an interface for IIC/I2C, both directly from other
*! kernel modules (i2c_writereg/readreg) and from userspace using
*! ioctl()'s
*!
*! Nov 30 1998 Torbjorn Eliasson Initial version.
*! Bjorn Wesen Elinux kernel version.
*! Jan 14 2000 Johan Adolfsson Fixed PB shadow register stuff -
*! don't use PB_I2C if DS1302 uses same bits,
*! use PB.
*| June 23 2003 Pieter Grimmerink Added 'i2c_sendnack'. i2c_readreg now
*| generates nack on last received byte,
*| instead of ack.
*| i2c_getack changed data level while clock
*| was high, causing DS75 to see a stop condition
*!
*! ---------------------------------------------------------------------------
*!
*! (C) Copyright 1999-2002 Axis Communications AB, LUND, SWEDEN
*!
*!***************************************************************************/
/* $Id: i2c.c,v 1.2 2005/05/09 15:29:49 starvik Exp $ */
/****************** INCLUDE FILES SECTION ***********************************/
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/slab.h>
#include <linux/errno.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/string.h>
#include <linux/init.h>
#include <linux/config.h>
#include <asm/etraxi2c.h>
#include <asm/system.h>
#include <asm/io.h>
#include <asm/delay.h>
#include "i2c.h"
/****************** I2C DEFINITION SECTION *************************/
#define D(x)
#define I2C_MAJOR 123 /* LOCAL/EXPERIMENTAL */
static const char i2c_name[] = "i2c";
#define CLOCK_LOW_TIME 8
#define CLOCK_HIGH_TIME 8
#define START_CONDITION_HOLD_TIME 8
#define STOP_CONDITION_HOLD_TIME 8
#define ENABLE_OUTPUT 0x01
#define ENABLE_INPUT 0x00
#define I2C_CLOCK_HIGH 1
#define I2C_CLOCK_LOW 0
#define I2C_DATA_HIGH 1
#define I2C_DATA_LOW 0
#define i2c_enable()
#define i2c_disable()
/* enable or disable output-enable, to select output or input on the i2c bus */
#define i2c_dir_out() crisv32_io_set_dir(&cris_i2c_data, crisv32_io_dir_out)
#define i2c_dir_in() crisv32_io_set_dir(&cris_i2c_data, crisv32_io_dir_in)
/* control the i2c clock and data signals */
#define i2c_clk(x) crisv32_io_set(&cris_i2c_clk, x)
#define i2c_data(x) crisv32_io_set(&cris_i2c_data, x)
/* read a bit from the i2c interface */
#define i2c_getbit() crisv32_io_rd(&cris_i2c_data)
#define i2c_delay(usecs) udelay(usecs)
/****************** VARIABLE SECTION ************************************/
static struct crisv32_iopin cris_i2c_clk;
static struct crisv32_iopin cris_i2c_data;
/****************** FUNCTION DEFINITION SECTION *************************/
/* generate i2c start condition */
void
i2c_start(void)
{
/*
* SCL=1 SDA=1
*/
i2c_dir_out();
i2c_delay(CLOCK_HIGH_TIME/6);
i2c_data(I2C_DATA_HIGH);
i2c_clk(I2C_CLOCK_HIGH);
i2c_delay(CLOCK_HIGH_TIME);
/*
* SCL=1 SDA=0
*/
i2c_data(I2C_DATA_LOW);
i2c_delay(START_CONDITION_HOLD_TIME);
/*
* SCL=0 SDA=0
*/
i2c_clk(I2C_CLOCK_LOW);
i2c_delay(CLOCK_LOW_TIME);
}
/* generate i2c stop condition */
void
i2c_stop(void)
{
i2c_dir_out();
/*
* SCL=0 SDA=0
*/
i2c_clk(I2C_CLOCK_LOW);
i2c_data(I2C_DATA_LOW);
i2c_delay(CLOCK_LOW_TIME*2);
/*
* SCL=1 SDA=0
*/
i2c_clk(I2C_CLOCK_HIGH);
i2c_delay(CLOCK_HIGH_TIME*2);
/*
* SCL=1 SDA=1
*/
i2c_data(I2C_DATA_HIGH);
i2c_delay(STOP_CONDITION_HOLD_TIME);
i2c_dir_in();
}
/* write a byte to the i2c interface */
void
i2c_outbyte(unsigned char x)
{
int i;
i2c_dir_out();
for (i = 0; i < 8; i++) {
if (x & 0x80) {
i2c_data(I2C_DATA_HIGH);
} else {
i2c_data(I2C_DATA_LOW);
}
i2c_delay(CLOCK_LOW_TIME/2);
i2c_clk(I2C_CLOCK_HIGH);
i2c_delay(CLOCK_HIGH_TIME);
i2c_clk(I2C_CLOCK_LOW);
i2c_delay(CLOCK_LOW_TIME/2);
x <<= 1;
}
i2c_data(I2C_DATA_LOW);
i2c_delay(CLOCK_LOW_TIME/2);
/*
* enable input
*/
i2c_dir_in();
}
/* read a byte from the i2c interface */
unsigned char
i2c_inbyte(void)
{
unsigned char aBitByte = 0;
int i;
/* Switch off I2C to get bit */
i2c_disable();
i2c_dir_in();
i2c_delay(CLOCK_HIGH_TIME/2);
/* Get bit */
aBitByte |= i2c_getbit();
/* Enable I2C */
i2c_enable();
i2c_delay(CLOCK_LOW_TIME/2);
for (i = 1; i < 8; i++) {
aBitByte <<= 1;
/* Clock pulse */
i2c_clk(I2C_CLOCK_HIGH);
i2c_delay(CLOCK_HIGH_TIME);
i2c_clk(I2C_CLOCK_LOW);
i2c_delay(CLOCK_LOW_TIME);
/* Switch off I2C to get bit */
i2c_disable();
i2c_dir_in();
i2c_delay(CLOCK_HIGH_TIME/2);
/* Get bit */
aBitByte |= i2c_getbit();
/* Enable I2C */
i2c_enable();
i2c_delay(CLOCK_LOW_TIME/2);
}
i2c_clk(I2C_CLOCK_HIGH);
i2c_delay(CLOCK_HIGH_TIME);
/*
* we leave the clock low, getbyte is usually followed
* by sendack/nack, they assume the clock to be low
*/
i2c_clk(I2C_CLOCK_LOW);
return aBitByte;
}
/*#---------------------------------------------------------------------------
*#
*# FUNCTION NAME: i2c_getack
*#
*# DESCRIPTION : checks if ack was received from ic2
*#
*#--------------------------------------------------------------------------*/
int
i2c_getack(void)
{
int ack = 1;
/*
* enable output
*/
i2c_dir_out();
/*
* Release data bus by setting
* data high
*/
i2c_data(I2C_DATA_HIGH);
/*
* enable input
*/
i2c_dir_in();
i2c_delay(CLOCK_HIGH_TIME/4);
/*
* generate ACK clock pulse
*/
i2c_clk(I2C_CLOCK_HIGH);
/*
* Use PORT PB instead of I2C
* for input. (I2C not working)
*/
i2c_clk(1);
i2c_data(1);
/*
* switch off I2C
*/
i2c_data(1);
i2c_disable();
i2c_dir_in();
/*
* now wait for ack
*/
i2c_delay(CLOCK_HIGH_TIME/2);
/*
* check for ack
*/
if(i2c_getbit())
ack = 0;
i2c_delay(CLOCK_HIGH_TIME/2);
if(!ack){
if(!i2c_getbit()) /* receiver pulld SDA low */
ack = 1;
i2c_delay(CLOCK_HIGH_TIME/2);
}
/*
* our clock is high now, make sure data is low
* before we enable our output. If we keep data high
* and enable output, we would generate a stop condition.
*/
i2c_data(I2C_DATA_LOW);
/*
* end clock pulse
*/
i2c_enable();
i2c_dir_out();
i2c_clk(I2C_CLOCK_LOW);
i2c_delay(CLOCK_HIGH_TIME/4);
/*
* enable output
*/
i2c_dir_out();
/*
* remove ACK clock pulse
*/
i2c_data(I2C_DATA_HIGH);
i2c_delay(CLOCK_LOW_TIME/2);
return ack;
}
/*#---------------------------------------------------------------------------
*#
*# FUNCTION NAME: I2C::sendAck
*#
*# DESCRIPTION : Send ACK on received data
*#
*#--------------------------------------------------------------------------*/
void
i2c_sendack(void)
{
/*
* enable output
*/
i2c_delay(CLOCK_LOW_TIME);
i2c_dir_out();
/*
* set ack pulse high
*/
i2c_data(I2C_DATA_LOW);
/*
* generate clock pulse
*/
i2c_delay(CLOCK_HIGH_TIME/6);
i2c_clk(I2C_CLOCK_HIGH);
i2c_delay(CLOCK_HIGH_TIME);
i2c_clk(I2C_CLOCK_LOW);
i2c_delay(CLOCK_LOW_TIME/6);
/*
* reset data out
*/
i2c_data(I2C_DATA_HIGH);
i2c_delay(CLOCK_LOW_TIME);
i2c_dir_in();
}
/*#---------------------------------------------------------------------------
*#
*# FUNCTION NAME: i2c_sendnack
*#
*# DESCRIPTION : Sends NACK on received data
*#
*#--------------------------------------------------------------------------*/
void
i2c_sendnack(void)
{
/*
* enable output
*/
i2c_delay(CLOCK_LOW_TIME);
i2c_dir_out();
/*
* set data high
*/
i2c_data(I2C_DATA_HIGH);
/*
* generate clock pulse
*/
i2c_delay(CLOCK_HIGH_TIME/6);
i2c_clk(I2C_CLOCK_HIGH);
i2c_delay(CLOCK_HIGH_TIME);
i2c_clk(I2C_CLOCK_LOW);
i2c_delay(CLOCK_LOW_TIME);
i2c_dir_in();
}
/*#---------------------------------------------------------------------------
*#
*# FUNCTION NAME: i2c_writereg
*#
*# DESCRIPTION : Writes a value to an I2C device
*#
*#--------------------------------------------------------------------------*/
int
i2c_writereg(unsigned char theSlave, unsigned char theReg,
unsigned char theValue)
{
int error, cntr = 3;
unsigned long flags;
do {
error = 0;
/*
* we don't like to be interrupted
*/
local_irq_save(flags);
i2c_start();
/*
* send slave address
*/
i2c_outbyte((theSlave & 0xfe));
/*
* wait for ack
*/
if(!i2c_getack())
error = 1;
/*
* now select register
*/
i2c_dir_out();
i2c_outbyte(theReg);
/*
* now it's time to wait for ack
*/
if(!i2c_getack())
error |= 2;
/*
* send register register data
*/
i2c_outbyte(theValue);
/*
* now it's time to wait for ack
*/
if(!i2c_getack())
error |= 4;
/*
* end byte stream
*/
i2c_stop();
/*
* enable interrupt again
*/
local_irq_restore(flags);
} while(error && cntr--);
i2c_delay(CLOCK_LOW_TIME);
return -error;
}
/*#---------------------------------------------------------------------------
*#
*# FUNCTION NAME: i2c_readreg
*#
*# DESCRIPTION : Reads a value from the decoder registers.
*#
*#--------------------------------------------------------------------------*/
unsigned char
i2c_readreg(unsigned char theSlave, unsigned char theReg)
{
unsigned char b = 0;
int error, cntr = 3;
unsigned long flags;
do {
error = 0;
/*
* we don't like to be interrupted
*/
local_irq_save(flags);
/*
* generate start condition
*/
i2c_start();
/*
* send slave address
*/
i2c_outbyte((theSlave & 0xfe));
/*
* wait for ack
*/
if(!i2c_getack())
error = 1;
/*
* now select register
*/
i2c_dir_out();
i2c_outbyte(theReg);
/*
* now it's time to wait for ack
*/
if(!i2c_getack())
error = 1;
/*
* repeat start condition
*/
i2c_delay(CLOCK_LOW_TIME);
i2c_start();
/*
* send slave address
*/
i2c_outbyte(theSlave | 0x01);
/*
* wait for ack
*/
if(!i2c_getack())
error = 1;
/*
* fetch register
*/
b = i2c_inbyte();
/*
* last received byte needs to be nacked
* instead of acked
*/
i2c_sendnack();
/*
* end sequence
*/
i2c_stop();
/*
* enable interrupt again
*/
local_irq_restore(flags);
} while(error && cntr--);
return b;
}
static int
i2c_open(struct inode *inode, struct file *filp)
{
return 0;
}
static int
i2c_release(struct inode *inode, struct file *filp)
{
return 0;
}
/* Main device API. ioctl's to write or read to/from i2c registers.
*/
static int
i2c_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg)
{
if(_IOC_TYPE(cmd) != ETRAXI2C_IOCTYPE) {
return -EINVAL;
}
switch (_IOC_NR(cmd)) {
case I2C_WRITEREG:
/* write to an i2c slave */
D(printk("i2cw %d %d %d\n",
I2C_ARGSLAVE(arg),
I2C_ARGREG(arg),
I2C_ARGVALUE(arg)));
return i2c_writereg(I2C_ARGSLAVE(arg),
I2C_ARGREG(arg),
I2C_ARGVALUE(arg));
case I2C_READREG:
{
unsigned char val;
/* read from an i2c slave */
D(printk("i2cr %d %d ",
I2C_ARGSLAVE(arg),
I2C_ARGREG(arg)));
val = i2c_readreg(I2C_ARGSLAVE(arg), I2C_ARGREG(arg));
D(printk("= %d\n", val));
return val;
}
default:
return -EINVAL;
}
return 0;
}
static struct file_operations i2c_fops = {
owner: THIS_MODULE,
ioctl: i2c_ioctl,
open: i2c_open,
release: i2c_release,
};
int __init
i2c_init(void)
{
int res;
/* Setup and enable the Port B I2C interface */
crisv32_io_get_name(&cris_i2c_data, CONFIG_ETRAX_I2C_DATA_PORT);
crisv32_io_get_name(&cris_i2c_clk, CONFIG_ETRAX_I2C_CLK_PORT);
/* register char device */
res = register_chrdev(I2C_MAJOR, i2c_name, &i2c_fops);
if(res < 0) {
printk(KERN_ERR "i2c: couldn't get a major number.\n");
return res;
}
printk(KERN_INFO "I2C driver v2.2, (c) 1999-2001 Axis Communications AB\n");
return 0;
}
/* this makes sure that i2c_init is called during boot */
module_init(i2c_init);
/****************** END OF FILE i2c.c ********************************/

View file

@ -0,0 +1,15 @@
#include <linux/init.h>
/* High level I2C actions */
int __init i2c_init(void);
int i2c_writereg(unsigned char theSlave, unsigned char theReg, unsigned char theValue);
unsigned char i2c_readreg(unsigned char theSlave, unsigned char theReg);
/* Low level I2C */
void i2c_start(void);
void i2c_stop(void);
void i2c_outbyte(unsigned char x);
unsigned char i2c_inbyte(void);
int i2c_getack(void);
void i2c_sendack(void);

View file

@ -0,0 +1,219 @@
/* $Id: iop_fw_load.c,v 1.4 2005/04/07 09:27:46 larsv Exp $
*
* Firmware loader for ETRAX FS IO-Processor
*
* Copyright (C) 2004 Axis Communications AB
*/
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/device.h>
#include <linux/firmware.h>
#include <asm/arch/hwregs/reg_map.h>
#include <asm/arch/hwregs/iop/iop_reg_space.h>
#include <asm/arch/hwregs/iop/iop_mpu_macros.h>
#include <asm/arch/hwregs/iop/iop_mpu_defs.h>
#include <asm/arch/hwregs/iop/iop_spu_defs.h>
#include <asm/arch/hwregs/iop/iop_sw_cpu_defs.h>
#define IOP_TIMEOUT 100
static struct device iop_spu_device[2] = {
{ .bus_id = "iop-spu0", },
{ .bus_id = "iop-spu1", },
};
static struct device iop_mpu_device = {
.bus_id = "iop-mpu",
};
static int wait_mpu_idle(void)
{
reg_iop_mpu_r_stat mpu_stat;
unsigned int timeout = IOP_TIMEOUT;
do {
mpu_stat = REG_RD(iop_mpu, regi_iop_mpu, r_stat);
} while (mpu_stat.instr_reg_busy == regk_iop_mpu_yes && --timeout > 0);
if (timeout == 0) {
printk(KERN_ERR "Timeout waiting for MPU to be idle\n");
return -EBUSY;
}
return 0;
}
int iop_fw_load_spu(const unsigned char *fw_name, unsigned int spu_inst)
{
reg_iop_sw_cpu_rw_mc_ctrl mc_ctrl = {
.wr_spu0_mem = regk_iop_sw_cpu_no,
.wr_spu1_mem = regk_iop_sw_cpu_no,
.size = 4,
.cmd = regk_iop_sw_cpu_reg_copy,
.keep_owner = regk_iop_sw_cpu_yes
};
reg_iop_spu_rw_ctrl spu_ctrl = {
.en = regk_iop_spu_no,
.fsm = regk_iop_spu_no,
};
reg_iop_sw_cpu_r_mc_stat mc_stat;
const struct firmware *fw_entry;
u32 *data;
unsigned int timeout;
int retval, i;
if (spu_inst > 1)
return -ENODEV;
/* get firmware */
retval = request_firmware(&fw_entry,
fw_name,
&iop_spu_device[spu_inst]);
if (retval != 0)
{
printk(KERN_ERR
"iop_load_spu: Failed to load firmware \"%s\"\n",
fw_name);
return retval;
}
data = (u32 *) fw_entry->data;
/* acquire ownership of memory controller */
switch (spu_inst) {
case 0:
mc_ctrl.wr_spu0_mem = regk_iop_sw_cpu_yes;
REG_WR(iop_spu, regi_iop_spu0, rw_ctrl, spu_ctrl);
break;
case 1:
mc_ctrl.wr_spu1_mem = regk_iop_sw_cpu_yes;
REG_WR(iop_spu, regi_iop_spu1, rw_ctrl, spu_ctrl);
break;
}
timeout = IOP_TIMEOUT;
do {
REG_WR(iop_sw_cpu, regi_iop_sw_cpu, rw_mc_ctrl, mc_ctrl);
mc_stat = REG_RD(iop_sw_cpu, regi_iop_sw_cpu, r_mc_stat);
} while (mc_stat.owned_by_cpu == regk_iop_sw_cpu_no && --timeout > 0);
if (timeout == 0) {
printk(KERN_ERR "Timeout waiting to acquire MC\n");
retval = -EBUSY;
goto out;
}
/* write to SPU memory */
for (i = 0; i < (fw_entry->size/4); i++) {
switch (spu_inst) {
case 0:
REG_WR_INT(iop_spu, regi_iop_spu0, rw_seq_pc, (i*4));
break;
case 1:
REG_WR_INT(iop_spu, regi_iop_spu1, rw_seq_pc, (i*4));
break;
}
REG_WR_INT(iop_sw_cpu, regi_iop_sw_cpu, rw_mc_data, *data);
data++;
}
/* release ownership of memory controller */
(void) REG_RD(iop_sw_cpu, regi_iop_sw_cpu, rs_mc_data);
out:
release_firmware(fw_entry);
return retval;
}
int iop_fw_load_mpu(unsigned char *fw_name)
{
const unsigned int start_addr = 0;
reg_iop_mpu_rw_ctrl mpu_ctrl;
const struct firmware *fw_entry;
u32 *data;
int retval, i;
/* get firmware */
retval = request_firmware(&fw_entry, fw_name, &iop_mpu_device);
if (retval != 0)
{
printk(KERN_ERR
"iop_load_spu: Failed to load firmware \"%s\"\n",
fw_name);
return retval;
}
data = (u32 *) fw_entry->data;
/* disable MPU */
mpu_ctrl.en = regk_iop_mpu_no;
REG_WR(iop_mpu, regi_iop_mpu, rw_ctrl, mpu_ctrl);
/* put start address in R0 */
REG_WR_VECT(iop_mpu, regi_iop_mpu, rw_r, 0, start_addr);
/* write to memory by executing 'SWX i, 4, R0' for each word */
if ((retval = wait_mpu_idle()) != 0)
goto out;
REG_WR(iop_mpu, regi_iop_mpu, rw_instr, MPU_SWX_IIR_INSTR(0, 4, 0));
for (i = 0; i < (fw_entry->size / 4); i++) {
REG_WR_INT(iop_mpu, regi_iop_mpu, rw_immediate, *data);
if ((retval = wait_mpu_idle()) != 0)
goto out;
data++;
}
out:
release_firmware(fw_entry);
return retval;
}
int iop_start_mpu(unsigned int start_addr)
{
reg_iop_mpu_rw_ctrl mpu_ctrl = { .en = regk_iop_mpu_yes };
int retval;
/* disable MPU */
if ((retval = wait_mpu_idle()) != 0)
goto out;
REG_WR(iop_mpu, regi_iop_mpu, rw_instr, MPU_HALT());
if ((retval = wait_mpu_idle()) != 0)
goto out;
/* set PC and wait for it to bite */
if ((retval = wait_mpu_idle()) != 0)
goto out;
REG_WR_INT(iop_mpu, regi_iop_mpu, rw_instr, MPU_BA_I(start_addr));
if ((retval = wait_mpu_idle()) != 0)
goto out;
/* make sure the MPU starts executing with interrupts disabled */
REG_WR(iop_mpu, regi_iop_mpu, rw_instr, MPU_DI());
if ((retval = wait_mpu_idle()) != 0)
goto out;
/* enable MPU */
REG_WR(iop_mpu, regi_iop_mpu, rw_ctrl, mpu_ctrl);
out:
return retval;
}
static int __init iop_fw_load_init(void)
{
device_initialize(&iop_spu_device[0]);
kobject_set_name(&iop_spu_device[0].kobj, "iop-spu0");
kobject_add(&iop_spu_device[0].kobj);
device_initialize(&iop_spu_device[1]);
kobject_set_name(&iop_spu_device[1].kobj, "iop-spu1");
kobject_add(&iop_spu_device[1].kobj);
device_initialize(&iop_mpu_device);
kobject_set_name(&iop_mpu_device.kobj, "iop-mpu");
kobject_add(&iop_mpu_device.kobj);
return 0;
}
static void __exit iop_fw_load_exit(void)
{
}
module_init(iop_fw_load_init);
module_exit(iop_fw_load_exit);
MODULE_DESCRIPTION("ETRAX FS IO-Processor Firmware Loader");
MODULE_LICENSE("GPL");
EXPORT_SYMBOL(iop_fw_load_spu);
EXPORT_SYMBOL(iop_fw_load_mpu);
EXPORT_SYMBOL(iop_start_mpu);

View file

@ -0,0 +1,157 @@
/*
* arch/cris/arch-v32/drivers/nandflash.c
*
* Copyright (c) 2004
*
* Derived from drivers/mtd/nand/spia.c
* Copyright (C) 2000 Steven J. Hill (sjhill@realitydiluted.com)
*
* $Id: nandflash.c,v 1.3 2005/06/01 10:57:12 starvik Exp $
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
*/
#include <linux/version.h>
#include <linux/slab.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/nand.h>
#include <linux/mtd/partitions.h>
#include <asm/arch/memmap.h>
#include <asm/arch/hwregs/reg_map.h>
#include <asm/arch/hwregs/reg_rdwr.h>
#include <asm/arch/hwregs/gio_defs.h>
#include <asm/arch/hwregs/bif_core_defs.h>
#include <asm/io.h>
#define CE_BIT 4
#define CLE_BIT 5
#define ALE_BIT 6
#define BY_BIT 7
static struct mtd_info *crisv32_mtd = NULL;
/*
* hardware specific access to control-lines
*/
static void crisv32_hwcontrol(struct mtd_info *mtd, int cmd)
{
unsigned long flags;
reg_gio_rw_pa_dout dout = REG_RD(gio, regi_gio, rw_pa_dout);
local_irq_save(flags);
switch(cmd){
case NAND_CTL_SETCLE:
dout.data |= (1<<CLE_BIT);
break;
case NAND_CTL_CLRCLE:
dout.data &= ~(1<<CLE_BIT);
break;
case NAND_CTL_SETALE:
dout.data |= (1<<ALE_BIT);
break;
case NAND_CTL_CLRALE:
dout.data &= ~(1<<ALE_BIT);
break;
case NAND_CTL_SETNCE:
dout.data |= (1<<CE_BIT);
break;
case NAND_CTL_CLRNCE:
dout.data &= ~(1<<CE_BIT);
break;
}
REG_WR(gio, regi_gio, rw_pa_dout, dout);
local_irq_restore(flags);
}
/*
* read device ready pin
*/
int crisv32_device_ready(struct mtd_info *mtd)
{
reg_gio_r_pa_din din = REG_RD(gio, regi_gio, r_pa_din);
return ((din.data & (1 << BY_BIT)) >> BY_BIT);
}
/*
* Main initialization routine
*/
struct mtd_info* __init crisv32_nand_flash_probe (void)
{
void __iomem *read_cs;
void __iomem *write_cs;
reg_bif_core_rw_grp3_cfg bif_cfg = REG_RD(bif_core, regi_bif_core, rw_grp3_cfg);
reg_gio_rw_pa_oe pa_oe = REG_RD(gio, regi_gio, rw_pa_oe);
struct nand_chip *this;
int err = 0;
/* Allocate memory for MTD device structure and private data */
crisv32_mtd = kmalloc (sizeof(struct mtd_info) + sizeof (struct nand_chip),
GFP_KERNEL);
if (!crisv32_mtd) {
printk ("Unable to allocate CRISv32 NAND MTD device structure.\n");
err = -ENOMEM;
return NULL;
}
read_cs = ioremap(MEM_CSP0_START | MEM_NON_CACHEABLE, 8192);
write_cs = ioremap(MEM_CSP1_START | MEM_NON_CACHEABLE, 8192);
if (!read_cs || !write_cs) {
printk("CRISv32 NAND ioremap failed\n");
err = -EIO;
goto out_mtd;
}
/* Get pointer to private data */
this = (struct nand_chip *) (&crisv32_mtd[1]);
pa_oe.oe |= 1 << CE_BIT;
pa_oe.oe |= 1 << ALE_BIT;
pa_oe.oe |= 1 << CLE_BIT;
pa_oe.oe &= ~ (1 << BY_BIT);
REG_WR(gio, regi_gio, rw_pa_oe, pa_oe);
bif_cfg.gated_csp0 = regk_bif_core_rd;
bif_cfg.gated_csp1 = regk_bif_core_wr;
REG_WR(bif_core, regi_bif_core, rw_grp3_cfg, bif_cfg);
/* Initialize structures */
memset((char *) crisv32_mtd, 0, sizeof(struct mtd_info));
memset((char *) this, 0, sizeof(struct nand_chip));
/* Link the private data with the MTD structure */
crisv32_mtd->priv = this;
/* Set address of NAND IO lines */
this->IO_ADDR_R = read_cs;
this->IO_ADDR_W = write_cs;
this->hwcontrol = crisv32_hwcontrol;
this->dev_ready = crisv32_device_ready;
/* 20 us command delay time */
this->chip_delay = 20;
this->eccmode = NAND_ECC_SOFT;
/* Enable the following for a flash based bad block table */
this->options = NAND_USE_FLASH_BBT;
/* Scan to find existance of the device */
if (nand_scan (crisv32_mtd, 1)) {
err = -ENXIO;
goto out_ior;
}
return crisv32_mtd;
out_ior:
iounmap((void *)read_cs);
iounmap((void *)write_cs);
out_mtd:
kfree (crisv32_mtd);
return NULL;
}

View file

@ -0,0 +1,341 @@
/*
* PCF8563 RTC
*
* From Phillips' datasheet:
*
* The PCF8563 is a CMOS real-time clock/calendar optimized for low power
* consumption. A programmable clock output, interupt output and voltage
* low detector are also provided. All address and data are transferred
* serially via two-line bidirectional I2C-bus. Maximum bus speed is
* 400 kbits/s. The built-in word address register is incremented
* automatically after each written or read byte.
*
* Copyright (c) 2002-2003, Axis Communications AB
* All rights reserved.
*
* Author: Tobias Anderberg <tobiasa@axis.com>.
*
*/
#include <linux/config.h>
#include <linux/version.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/types.h>
#include <linux/sched.h>
#include <linux/init.h>
#include <linux/fs.h>
#include <linux/ioctl.h>
#include <linux/delay.h>
#include <linux/bcd.h>
#include <asm/uaccess.h>
#include <asm/system.h>
#include <asm/io.h>
#include <asm/rtc.h>
#include "i2c.h"
#define PCF8563_MAJOR 121 /* Local major number. */
#define DEVICE_NAME "rtc" /* Name which is registered in /proc/devices. */
#define PCF8563_NAME "PCF8563"
#define DRIVER_VERSION "$Revision: 1.1 $"
/* Two simple wrapper macros, saves a few keystrokes. */
#define rtc_read(x) i2c_readreg(RTC_I2C_READ, x)
#define rtc_write(x,y) i2c_writereg(RTC_I2C_WRITE, x, y)
static const unsigned char days_in_month[] =
{ 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
int pcf8563_ioctl(struct inode *, struct file *, unsigned int, unsigned long);
int pcf8563_open(struct inode *, struct file *);
int pcf8563_release(struct inode *, struct file *);
static struct file_operations pcf8563_fops = {
owner: THIS_MODULE,
ioctl: pcf8563_ioctl,
open: pcf8563_open,
release: pcf8563_release,
};
unsigned char
pcf8563_readreg(int reg)
{
unsigned char res = rtc_read(reg);
/* The PCF8563 does not return 0 for unimplemented bits */
switch (reg) {
case RTC_SECONDS:
case RTC_MINUTES:
res &= 0x7F;
break;
case RTC_HOURS:
case RTC_DAY_OF_MONTH:
res &= 0x3F;
break;
case RTC_WEEKDAY:
res &= 0x07;
break;
case RTC_MONTH:
res &= 0x1F;
break;
case RTC_CONTROL1:
res &= 0xA8;
break;
case RTC_CONTROL2:
res &= 0x1F;
break;
case RTC_CLOCKOUT_FREQ:
case RTC_TIMER_CONTROL:
res &= 0x83;
break;
}
return res;
}
void
pcf8563_writereg(int reg, unsigned char val)
{
#ifdef CONFIG_ETRAX_RTC_READONLY
if (reg == RTC_CONTROL1 || (reg >= RTC_SECONDS && reg <= RTC_YEAR))
return;
#endif
rtc_write(reg, val);
}
void
get_rtc_time(struct rtc_time *tm)
{
tm->tm_sec = rtc_read(RTC_SECONDS);
tm->tm_min = rtc_read(RTC_MINUTES);
tm->tm_hour = rtc_read(RTC_HOURS);
tm->tm_mday = rtc_read(RTC_DAY_OF_MONTH);
tm->tm_wday = rtc_read(RTC_WEEKDAY);
tm->tm_mon = rtc_read(RTC_MONTH);
tm->tm_year = rtc_read(RTC_YEAR);
if (tm->tm_sec & 0x80)
printk(KERN_WARNING "%s: RTC Voltage Low - reliable date/time "
"information is no longer guaranteed!\n", PCF8563_NAME);
tm->tm_year = BCD_TO_BIN(tm->tm_year) + ((tm->tm_mon & 0x80) ? 100 : 0);
tm->tm_sec &= 0x7F;
tm->tm_min &= 0x7F;
tm->tm_hour &= 0x3F;
tm->tm_mday &= 0x3F;
tm->tm_wday &= 0x07; /* Not coded in BCD. */
tm->tm_mon &= 0x1F;
BCD_TO_BIN(tm->tm_sec);
BCD_TO_BIN(tm->tm_min);
BCD_TO_BIN(tm->tm_hour);
BCD_TO_BIN(tm->tm_mday);
BCD_TO_BIN(tm->tm_mon);
tm->tm_mon--; /* Month is 1..12 in RTC but 0..11 in linux */
}
int __init
pcf8563_init(void)
{
/* Initiate the i2c protocol. */
i2c_init();
/*
* First of all we need to reset the chip. This is done by
* clearing control1, control2 and clk freq and resetting
* all alarms.
*/
if (rtc_write(RTC_CONTROL1, 0x00) < 0)
goto err;
if (rtc_write(RTC_CONTROL2, 0x00) < 0)
goto err;
if (rtc_write(RTC_CLOCKOUT_FREQ, 0x00) < 0)
goto err;
if (rtc_write(RTC_TIMER_CONTROL, 0x03) < 0)
goto err;
/* Reset the alarms. */
if (rtc_write(RTC_MINUTE_ALARM, 0x80) < 0)
goto err;
if (rtc_write(RTC_HOUR_ALARM, 0x80) < 0)
goto err;
if (rtc_write(RTC_DAY_ALARM, 0x80) < 0)
goto err;
if (rtc_write(RTC_WEEKDAY_ALARM, 0x80) < 0)
goto err;
if (register_chrdev(PCF8563_MAJOR, DEVICE_NAME, &pcf8563_fops) < 0) {
printk(KERN_INFO "%s: Unable to get major numer %d for RTC device.\n",
PCF8563_NAME, PCF8563_MAJOR);
return -1;
}
printk(KERN_INFO "%s Real-Time Clock Driver, %s\n", PCF8563_NAME, DRIVER_VERSION);
/* Check for low voltage, and warn about it.. */
if (rtc_read(RTC_SECONDS) & 0x80)
printk(KERN_WARNING "%s: RTC Voltage Low - reliable date/time "
"information is no longer guaranteed!\n", PCF8563_NAME);
return 0;
err:
printk(KERN_INFO "%s: Error initializing chip.\n", PCF8563_NAME);
return -1;
}
void __exit
pcf8563_exit(void)
{
if (unregister_chrdev(PCF8563_MAJOR, DEVICE_NAME) < 0) {
printk(KERN_INFO "%s: Unable to unregister device.\n", PCF8563_NAME);
}
}
/*
* ioctl calls for this driver. Why return -ENOTTY upon error? Because
* POSIX says so!
*/
int
pcf8563_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
{
/* Some sanity checks. */
if (_IOC_TYPE(cmd) != RTC_MAGIC)
return -ENOTTY;
if (_IOC_NR(cmd) > RTC_MAX_IOCTL)
return -ENOTTY;
switch (cmd) {
case RTC_RD_TIME:
{
struct rtc_time tm;
memset(&tm, 0, sizeof (struct rtc_time));
get_rtc_time(&tm);
if (copy_to_user((struct rtc_time *) arg, &tm, sizeof tm)) {
return -EFAULT;
}
return 0;
}
case RTC_SET_TIME:
{
#ifdef CONFIG_ETRAX_RTC_READONLY
return -EPERM;
#else
int leap;
int year;
int century;
struct rtc_time tm;
if (!capable(CAP_SYS_TIME))
return -EPERM;
if (copy_from_user(&tm, (struct rtc_time *) arg, sizeof tm))
return -EFAULT;
/* Convert from struct tm to struct rtc_time. */
tm.tm_year += 1900;
tm.tm_mon += 1;
/*
* Check if tm.tm_year is a leap year. A year is a leap
* year if it is divisible by 4 but not 100, except
* that years divisible by 400 _are_ leap years.
*/
year = tm.tm_year;
leap = (tm.tm_mon == 2) && ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0);
/* Perform some sanity checks. */
if ((tm.tm_year < 1970) ||
(tm.tm_mon > 12) ||
(tm.tm_mday == 0) ||
(tm.tm_mday > days_in_month[tm.tm_mon] + leap) ||
(tm.tm_wday >= 7) ||
(tm.tm_hour >= 24) ||
(tm.tm_min >= 60) ||
(tm.tm_sec >= 60))
return -EINVAL;
century = (tm.tm_year >= 2000) ? 0x80 : 0;
tm.tm_year = tm.tm_year % 100;
BIN_TO_BCD(tm.tm_year);
BIN_TO_BCD(tm.tm_mday);
BIN_TO_BCD(tm.tm_hour);
BIN_TO_BCD(tm.tm_min);
BIN_TO_BCD(tm.tm_sec);
tm.tm_mon |= century;
rtc_write(RTC_YEAR, tm.tm_year);
rtc_write(RTC_MONTH, tm.tm_mon);
rtc_write(RTC_WEEKDAY, tm.tm_wday); /* Not coded in BCD. */
rtc_write(RTC_DAY_OF_MONTH, tm.tm_mday);
rtc_write(RTC_HOURS, tm.tm_hour);
rtc_write(RTC_MINUTES, tm.tm_min);
rtc_write(RTC_SECONDS, tm.tm_sec);
return 0;
#endif /* !CONFIG_ETRAX_RTC_READONLY */
}
case RTC_VLOW_RD:
{
int vl_bit = 0;
if (rtc_read(RTC_SECONDS) & 0x80) {
vl_bit = 1;
printk(KERN_WARNING "%s: RTC Voltage Low - reliable "
"date/time information is no longer guaranteed!\n",
PCF8563_NAME);
}
if (copy_to_user((int *) arg, &vl_bit, sizeof(int)))
return -EFAULT;
return 0;
}
case RTC_VLOW_SET:
{
/* Clear the VL bit in the seconds register */
int ret = rtc_read(RTC_SECONDS);
rtc_write(RTC_SECONDS, (ret & 0x7F));
return 0;
}
default:
return -ENOTTY;
}
return 0;
}
int
pcf8563_open(struct inode *inode, struct file *filp)
{
MOD_INC_USE_COUNT;
return 0;
}
int
pcf8563_release(struct inode *inode, struct file *filp)
{
MOD_DEC_USE_COUNT;
return 0;
}
module_init(pcf8563_init);
module_exit(pcf8563_exit);

View file

@ -0,0 +1,5 @@
#
# Makefile for Etrax cardbus driver
#
obj-$(CONFIG_ETRAX_CARDBUS) += bios.o dma.o

View file

@ -0,0 +1,131 @@
#include <linux/pci.h>
#include <linux/kernel.h>
#include <asm/arch/hwregs/intr_vect.h>
void __devinit pcibios_fixup_bus(struct pci_bus *b)
{
}
char * __devinit pcibios_setup(char *str)
{
return NULL;
}
void pcibios_set_master(struct pci_dev *dev)
{
u8 lat;
pci_read_config_byte(dev, PCI_LATENCY_TIMER, &lat);
printk(KERN_DEBUG "PCI: Setting latency timer of device %s to %d\n", pci_name(dev), lat);
pci_write_config_byte(dev, PCI_LATENCY_TIMER, lat);
}
int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
enum pci_mmap_state mmap_state, int write_combine)
{
unsigned long prot;
/* Leave vm_pgoff as-is, the PCI space address is the physical
* address on this platform.
*/
vma->vm_flags |= (VM_SHM | VM_LOCKED | VM_IO);
prot = pgprot_val(vma->vm_page_prot);
vma->vm_page_prot = __pgprot(prot);
/* Write-combine setting is ignored, it is changed via the mtrr
* interfaces on this platform.
*/
if (remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
vma->vm_end - vma->vm_start,
vma->vm_page_prot))
return -EAGAIN;
return 0;
}
void
pcibios_align_resource(void *data, struct resource *res,
unsigned long size, unsigned long align)
{
if (res->flags & IORESOURCE_IO) {
unsigned long start = res->start;
if (start & 0x300) {
start = (start + 0x3ff) & ~0x3ff;
res->start = start;
}
}
}
int pcibios_enable_resources(struct pci_dev *dev, int mask)
{
u16 cmd, old_cmd;
int idx;
struct resource *r;
pci_read_config_word(dev, PCI_COMMAND, &cmd);
old_cmd = cmd;
for(idx=0; idx<6; idx++) {
/* Only set up the requested stuff */
if (!(mask & (1<<idx)))
continue;
r = &dev->resource[idx];
if (!r->start && r->end) {
printk(KERN_ERR "PCI: Device %s not available because of resource collisions\n", pci_name(dev));
return -EINVAL;
}
if (r->flags & IORESOURCE_IO)
cmd |= PCI_COMMAND_IO;
if (r->flags & IORESOURCE_MEM)
cmd |= PCI_COMMAND_MEMORY;
}
if (dev->resource[PCI_ROM_RESOURCE].start)
cmd |= PCI_COMMAND_MEMORY;
if (cmd != old_cmd) {
printk("PCI: Enabling device %s (%04x -> %04x)\n", pci_name(dev), old_cmd, cmd);
pci_write_config_word(dev, PCI_COMMAND, cmd);
}
return 0;
}
int pcibios_enable_irq(struct pci_dev *dev)
{
dev->irq = EXT_INTR_VECT;
return 0;
}
int pcibios_enable_device(struct pci_dev *dev, int mask)
{
int err;
if ((err = pcibios_enable_resources(dev, mask)) < 0)
return err;
return pcibios_enable_irq(dev);
}
int pcibios_assign_resources(void)
{
struct pci_dev *dev = NULL;
int idx;
struct resource *r;
while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) {
int class = dev->class >> 8;
/* Don't touch classless devices and host bridges */
if (!class || class == PCI_CLASS_BRIDGE_HOST)
continue;
for(idx=0; idx<6; idx++) {
r = &dev->resource[idx];
if (!r->start && r->end)
pci_assign_resource(dev, idx);
}
}
return 0;
}
EXPORT_SYMBOL(pcibios_assign_resources);

View file

@ -0,0 +1,149 @@
/*
* Dynamic DMA mapping support.
*
* On cris there is no hardware dynamic DMA address translation,
* so consistent alloc/free are merely page allocation/freeing.
* The rest of the dynamic DMA mapping interface is implemented
* in asm/pci.h.
*
* Borrowed from i386.
*/
#include <linux/types.h>
#include <linux/mm.h>
#include <linux/string.h>
#include <linux/pci.h>
#include <asm/io.h>
struct dma_coherent_mem {
void *virt_base;
u32 device_base;
int size;
int flags;
unsigned long *bitmap;
};
void *dma_alloc_coherent(struct device *dev, size_t size,
dma_addr_t *dma_handle, unsigned int __nocast gfp)
{
void *ret;
struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL;
int order = get_order(size);
/* ignore region specifiers */
gfp &= ~(__GFP_DMA | __GFP_HIGHMEM);
if (mem) {
int page = bitmap_find_free_region(mem->bitmap, mem->size,
order);
if (page >= 0) {
*dma_handle = mem->device_base + (page << PAGE_SHIFT);
ret = mem->virt_base + (page << PAGE_SHIFT);
memset(ret, 0, size);
return ret;
}
if (mem->flags & DMA_MEMORY_EXCLUSIVE)
return NULL;
}
if (dev == NULL || (dev->coherent_dma_mask < 0xffffffff))
gfp |= GFP_DMA;
ret = (void *)__get_free_pages(gfp, order);
if (ret != NULL) {
memset(ret, 0, size);
*dma_handle = virt_to_phys(ret);
}
return ret;
}
void dma_free_coherent(struct device *dev, size_t size,
void *vaddr, dma_addr_t dma_handle)
{
struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL;
int order = get_order(size);
if (mem && vaddr >= mem->virt_base && vaddr < (mem->virt_base + (mem->size << PAGE_SHIFT))) {
int page = (vaddr - mem->virt_base) >> PAGE_SHIFT;
bitmap_release_region(mem->bitmap, page, order);
} else
free_pages((unsigned long)vaddr, order);
}
int dma_declare_coherent_memory(struct device *dev, dma_addr_t bus_addr,
dma_addr_t device_addr, size_t size, int flags)
{
void __iomem *mem_base;
int pages = size >> PAGE_SHIFT;
int bitmap_size = (pages + 31)/32;
if ((flags & (DMA_MEMORY_MAP | DMA_MEMORY_IO)) == 0)
goto out;
if (!size)
goto out;
if (dev->dma_mem)
goto out;
/* FIXME: this routine just ignores DMA_MEMORY_INCLUDES_CHILDREN */
mem_base = ioremap(bus_addr, size);
if (!mem_base)
goto out;
dev->dma_mem = kmalloc(sizeof(struct dma_coherent_mem), GFP_KERNEL);
if (!dev->dma_mem)
goto out;
memset(dev->dma_mem, 0, sizeof(struct dma_coherent_mem));
dev->dma_mem->bitmap = kmalloc(bitmap_size, GFP_KERNEL);
if (!dev->dma_mem->bitmap)
goto free1_out;
memset(dev->dma_mem->bitmap, 0, bitmap_size);
dev->dma_mem->virt_base = mem_base;
dev->dma_mem->device_base = device_addr;
dev->dma_mem->size = pages;
dev->dma_mem->flags = flags;
if (flags & DMA_MEMORY_MAP)
return DMA_MEMORY_MAP;
return DMA_MEMORY_IO;
free1_out:
kfree(dev->dma_mem->bitmap);
out:
return 0;
}
EXPORT_SYMBOL(dma_declare_coherent_memory);
void dma_release_declared_memory(struct device *dev)
{
struct dma_coherent_mem *mem = dev->dma_mem;
if(!mem)
return;
dev->dma_mem = NULL;
iounmap(mem->virt_base);
kfree(mem->bitmap);
kfree(mem);
}
EXPORT_SYMBOL(dma_release_declared_memory);
void *dma_mark_declared_memory_occupied(struct device *dev,
dma_addr_t device_addr, size_t size)
{
struct dma_coherent_mem *mem = dev->dma_mem;
int pages = (size + (device_addr & ~PAGE_MASK) + PAGE_SIZE - 1) >> PAGE_SHIFT;
int pos, err;
if (!mem)
return ERR_PTR(-EINVAL);
pos = (device_addr - mem->device_base) >> PAGE_SHIFT;
err = bitmap_allocate_region(mem->bitmap, pos, get_order(pages));
if (err != 0)
return ERR_PTR(err);
return mem->virt_base + (pos << PAGE_SHIFT);
}
EXPORT_SYMBOL(dma_mark_declared_memory_occupied);

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,21 @@
# $Id: Makefile,v 1.11 2004/12/17 10:16:13 starvik Exp $
#
# Makefile for the linux kernel.
#
extra-y := head.o
obj-y := entry.o traps.o irq.o debugport.o dma.o pinmux.o \
process.o ptrace.o setup.o signal.o traps.o time.o \
arbiter.o io.o
obj-$(CONFIG_ETRAXFS_SIM) += vcs_hook.o
obj-$(CONFIG_SMP) += smp.o
obj-$(CONFIG_ETRAX_KGDB) += kgdb.o kgdb_asm.o
obj-$(CONFIG_ETRAX_FAST_TIMER) += fasttimer.o
obj-$(CONFIG_MODULES) += crisksyms.o
clean:

View file

@ -0,0 +1,297 @@
/*
* Memory arbiter functions. Allocates bandwith through the
* arbiter and sets up arbiter breakpoints.
*
* The algorithm first assigns slots to the clients that has specified
* bandwith (e.g. ethernet) and then the remaining slots are divided
* on all the active clients.
*
* Copyright (c) 2004, 2005 Axis Communications AB.
*/
#include <linux/config.h>
#include <asm/arch/hwregs/reg_map.h>
#include <asm/arch/hwregs/reg_rdwr.h>
#include <asm/arch/hwregs/marb_defs.h>
#include <asm/arch/arbiter.h>
#include <asm/arch/hwregs/intr_vect.h>
#include <linux/interrupt.h>
#include <linux/signal.h>
#include <linux/errno.h>
#include <linux/spinlock.h>
#include <asm/io.h>
struct crisv32_watch_entry
{
unsigned long instance;
watch_callback* cb;
unsigned long start;
unsigned long end;
int used;
};
#define NUMBER_OF_BP 4
#define NBR_OF_CLIENTS 14
#define NBR_OF_SLOTS 64
#define SDRAM_BANDWIDTH 100000000 /* Some kind of expected value */
#define INTMEM_BANDWIDTH 400000000
#define NBR_OF_REGIONS 2
static struct crisv32_watch_entry watches[NUMBER_OF_BP] =
{
{regi_marb_bp0},
{regi_marb_bp1},
{regi_marb_bp2},
{regi_marb_bp3}
};
static int requested_slots[NBR_OF_REGIONS][NBR_OF_CLIENTS];
static int active_clients[NBR_OF_REGIONS][NBR_OF_CLIENTS];
static int max_bandwidth[NBR_OF_REGIONS] = {SDRAM_BANDWIDTH, INTMEM_BANDWIDTH};
DEFINE_SPINLOCK(arbiter_lock);
static irqreturn_t
crisv32_arbiter_irq(int irq, void* dev_id, struct pt_regs* regs);
static void crisv32_arbiter_config(int region)
{
int slot;
int client;
int interval = 0;
int val[NBR_OF_SLOTS];
for (slot = 0; slot < NBR_OF_SLOTS; slot++)
val[slot] = NBR_OF_CLIENTS + 1;
for (client = 0; client < NBR_OF_CLIENTS; client++)
{
int pos;
if (!requested_slots[region][client])
continue;
interval = NBR_OF_SLOTS / requested_slots[region][client];
pos = 0;
while (pos < NBR_OF_SLOTS)
{
if (val[pos] != NBR_OF_CLIENTS + 1)
pos++;
else
{
val[pos] = client;
pos += interval;
}
}
}
client = 0;
for (slot = 0; slot < NBR_OF_SLOTS; slot++)
{
if (val[slot] == NBR_OF_CLIENTS + 1)
{
int first = client;
while(!active_clients[region][client]) {
client = (client + 1) % NBR_OF_CLIENTS;
if (client == first)
break;
}
val[slot] = client;
client = (client + 1) % NBR_OF_CLIENTS;
}
if (region == EXT_REGION)
REG_WR_INT_VECT(marb, regi_marb, rw_ext_slots, slot, val[slot]);
else if (region == INT_REGION)
REG_WR_INT_VECT(marb, regi_marb, rw_int_slots, slot, val[slot]);
}
}
extern char _stext, _etext;
static void crisv32_arbiter_init(void)
{
static int initialized = 0;
if (initialized)
return;
initialized = 1;
/* CPU caches are active. */
active_clients[EXT_REGION][10] = active_clients[EXT_REGION][11] = 1;
crisv32_arbiter_config(EXT_REGION);
crisv32_arbiter_config(INT_REGION);
if (request_irq(MEMARB_INTR_VECT, crisv32_arbiter_irq, SA_INTERRUPT,
"arbiter", NULL))
printk(KERN_ERR "Couldn't allocate arbiter IRQ\n");
#ifndef CONFIG_ETRAX_KGDB
/* Global watch for writes to kernel text segment. */
crisv32_arbiter_watch(virt_to_phys(&_stext), &_etext - &_stext,
arbiter_all_clients, arbiter_all_write, NULL);
#endif
}
int crisv32_arbiter_allocate_bandwith(int client, int region,
unsigned long bandwidth)
{
int i;
int total_assigned = 0;
int total_clients = 0;
int req;
crisv32_arbiter_init();
for (i = 0; i < NBR_OF_CLIENTS; i++)
{
total_assigned += requested_slots[region][i];
total_clients += active_clients[region][i];
}
req = NBR_OF_SLOTS / (max_bandwidth[region] / bandwidth);
if (total_assigned + total_clients + req + 1 > NBR_OF_SLOTS)
return -ENOMEM;
active_clients[region][client] = 1;
requested_slots[region][client] = req;
crisv32_arbiter_config(region);
return 0;
}
int crisv32_arbiter_watch(unsigned long start, unsigned long size,
unsigned long clients, unsigned long accesses,
watch_callback* cb)
{
int i;
crisv32_arbiter_init();
if (start > 0x80000000) {
printk("Arbiter: %lX doesn't look like a physical address", start);
return -EFAULT;
}
spin_lock(&arbiter_lock);
for (i = 0; i < NUMBER_OF_BP; i++) {
if (!watches[i].used) {
reg_marb_rw_intr_mask intr_mask = REG_RD(marb, regi_marb, rw_intr_mask);
watches[i].used = 1;
watches[i].start = start;
watches[i].end = start + size;
watches[i].cb = cb;
REG_WR_INT(marb_bp, watches[i].instance, rw_first_addr, watches[i].start);
REG_WR_INT(marb_bp, watches[i].instance, rw_last_addr, watches[i].end);
REG_WR_INT(marb_bp, watches[i].instance, rw_op, accesses);
REG_WR_INT(marb_bp, watches[i].instance, rw_clients, clients);
if (i == 0)
intr_mask.bp0 = regk_marb_yes;
else if (i == 1)
intr_mask.bp1 = regk_marb_yes;
else if (i == 2)
intr_mask.bp2 = regk_marb_yes;
else if (i == 3)
intr_mask.bp3 = regk_marb_yes;
REG_WR(marb, regi_marb, rw_intr_mask, intr_mask);
spin_unlock(&arbiter_lock);
return i;
}
}
spin_unlock(&arbiter_lock);
return -ENOMEM;
}
int crisv32_arbiter_unwatch(int id)
{
reg_marb_rw_intr_mask intr_mask = REG_RD(marb, regi_marb, rw_intr_mask);
crisv32_arbiter_init();
spin_lock(&arbiter_lock);
if ((id < 0) || (id >= NUMBER_OF_BP) || (!watches[id].used)) {
spin_unlock(&arbiter_lock);
return -EINVAL;
}
memset(&watches[id], 0, sizeof(struct crisv32_watch_entry));
if (id == 0)
intr_mask.bp0 = regk_marb_no;
else if (id == 1)
intr_mask.bp2 = regk_marb_no;
else if (id == 2)
intr_mask.bp2 = regk_marb_no;
else if (id == 3)
intr_mask.bp3 = regk_marb_no;
REG_WR(marb, regi_marb, rw_intr_mask, intr_mask);
spin_unlock(&arbiter_lock);
return 0;
}
extern void show_registers(struct pt_regs *regs);
static irqreturn_t
crisv32_arbiter_irq(int irq, void* dev_id, struct pt_regs* regs)
{
reg_marb_r_masked_intr masked_intr = REG_RD(marb, regi_marb, r_masked_intr);
reg_marb_bp_r_brk_clients r_clients;
reg_marb_bp_r_brk_addr r_addr;
reg_marb_bp_r_brk_op r_op;
reg_marb_bp_r_brk_first_client r_first;
reg_marb_bp_r_brk_size r_size;
reg_marb_bp_rw_ack ack = {0};
reg_marb_rw_ack_intr ack_intr = {.bp0=1,.bp1=1,.bp2=1,.bp3=1};
struct crisv32_watch_entry* watch;
if (masked_intr.bp0) {
watch = &watches[0];
ack_intr.bp0 = regk_marb_yes;
} else if (masked_intr.bp1) {
watch = &watches[1];
ack_intr.bp1 = regk_marb_yes;
} else if (masked_intr.bp2) {
watch = &watches[2];
ack_intr.bp2 = regk_marb_yes;
} else if (masked_intr.bp3) {
watch = &watches[3];
ack_intr.bp3 = regk_marb_yes;
} else {
return IRQ_NONE;
}
/* Retrieve all useful information and print it. */
r_clients = REG_RD(marb_bp, watch->instance, r_brk_clients);
r_addr = REG_RD(marb_bp, watch->instance, r_brk_addr);
r_op = REG_RD(marb_bp, watch->instance, r_brk_op);
r_first = REG_RD(marb_bp, watch->instance, r_brk_first_client);
r_size = REG_RD(marb_bp, watch->instance, r_brk_size);
printk("Arbiter IRQ\n");
printk("Clients %X addr %X op %X first %X size %X\n",
REG_TYPE_CONV(int, reg_marb_bp_r_brk_clients, r_clients),
REG_TYPE_CONV(int, reg_marb_bp_r_brk_addr, r_addr),
REG_TYPE_CONV(int, reg_marb_bp_r_brk_op, r_op),
REG_TYPE_CONV(int, reg_marb_bp_r_brk_first_client, r_first),
REG_TYPE_CONV(int, reg_marb_bp_r_brk_size, r_size));
REG_WR(marb_bp, watch->instance, rw_ack, ack);
REG_WR(marb, regi_marb, rw_ack_intr, ack_intr);
printk("IRQ occured at %lX\n", regs->erp);
if (watch->cb)
watch->cb();
return IRQ_HANDLED;
}

View file

@ -0,0 +1,49 @@
#include <linux/sched.h>
#include <asm/thread_info.h>
/*
* Generate definitions needed by assembly language modules.
* This code generates raw asm output which is post-processed to extract
* and format the required data.
*/
#define DEFINE(sym, val) \
asm volatile("\n->" #sym " %0 " #val : : "i" (val))
#define BLANK() asm volatile("\n->" : : )
int main(void)
{
#define ENTRY(entry) DEFINE(PT_ ## entry, offsetof(struct pt_regs, entry))
ENTRY(orig_r10);
ENTRY(r13);
ENTRY(r12);
ENTRY(r11);
ENTRY(r10);
ENTRY(r9);
ENTRY(acr);
ENTRY(srs);
ENTRY(mof);
ENTRY(ccs);
ENTRY(srp);
BLANK();
#undef ENTRY
#define ENTRY(entry) DEFINE(TI_ ## entry, offsetof(struct thread_info, entry))
ENTRY(task);
ENTRY(flags);
ENTRY(preempt_count);
BLANK();
#undef ENTRY
#define ENTRY(entry) DEFINE(THREAD_ ## entry, offsetof(struct thread_struct, entry))
ENTRY(ksp);
ENTRY(usp);
ENTRY(ccs);
BLANK();
#undef ENTRY
#define ENTRY(entry) DEFINE(TASK_ ## entry, offsetof(struct task_struct, entry))
ENTRY(pid);
BLANK();
DEFINE(LCLONE_VM, CLONE_VM);
DEFINE(LCLONE_UNTRACED, CLONE_UNTRACED);
return 0;
}

View file

@ -0,0 +1,24 @@
#include <linux/config.h>
#include <linux/module.h>
#include <linux/irq.h>
#include <asm/arch/dma.h>
#include <asm/arch/intmem.h>
#include <asm/arch/pinmux.h>
/* Functions for allocating DMA channels */
EXPORT_SYMBOL(crisv32_request_dma);
EXPORT_SYMBOL(crisv32_free_dma);
/* Functions for handling internal RAM */
EXPORT_SYMBOL(crisv32_intmem_alloc);
EXPORT_SYMBOL(crisv32_intmem_free);
EXPORT_SYMBOL(crisv32_intmem_phys_to_virt);
EXPORT_SYMBOL(crisv32_intmem_virt_to_phys);
/* Functions for handling pinmux */
EXPORT_SYMBOL(crisv32_pinmux_alloc);
EXPORT_SYMBOL(crisv32_pinmux_dealloc);
/* Functions masking/unmasking interrupts */
EXPORT_SYMBOL(mask_irq);
EXPORT_SYMBOL(unmask_irq);

View file

@ -0,0 +1,461 @@
/*
* Copyright (C) 2003, Axis Communications AB.
*/
#include <linux/config.h>
#include <linux/console.h>
#include <linux/init.h>
#include <linux/major.h>
#include <linux/delay.h>
#include <linux/tty.h>
#include <asm/system.h>
#include <asm/io.h>
#include <asm/arch/hwregs/ser_defs.h>
#include <asm/arch/hwregs/dma_defs.h>
#include <asm/arch/pinmux.h>
#include <asm/irq.h>
#include <asm/arch/hwregs/intr_vect_defs.h>
struct dbg_port
{
unsigned char nbr;
unsigned long instance;
unsigned int started;
unsigned long baudrate;
unsigned char parity;
unsigned int bits;
};
struct dbg_port ports[] =
{
{
0,
regi_ser0,
0,
115200,
'N',
8
},
{
1,
regi_ser1,
0,
115200,
'N',
8
},
{
2,
regi_ser2,
0,
115200,
'N',
8
},
{
3,
regi_ser3,
0,
115200,
'N',
8
}
};
static struct dbg_port *port =
#if defined(CONFIG_ETRAX_DEBUG_PORT0)
&ports[0];
#elif defined(CONFIG_ETRAX_DEBUG_PORT1)
&ports[1];
#elif defined(CONFIG_ETRAX_DEBUG_PORT2)
&ports[2];
#elif defined(CONFIG_ETRAX_DEBUG_PORT3)
&ports[3];
#else
NULL;
#endif
#ifdef CONFIG_ETRAX_KGDB
static struct dbg_port *kgdb_port =
#if defined(CONFIG_ETRAX_KGDB_PORT0)
&ports[0];
#elif defined(CONFIG_ETRAX_KGDB_PORT1)
&ports[1];
#elif defined(CONFIG_ETRAX_KGDB_PORT2)
&ports[2];
#elif defined(CONFIG_ETRAX_KGDB_PORT3)
&ports[3];
#else
NULL;
#endif
#endif
#ifdef CONFIG_ETRAXFS_SIM
extern void print_str( const char *str );
static char buffer[1024];
static char msg[] = "Debug: ";
static int buffer_pos = sizeof(msg) - 1;
#endif
extern struct tty_driver *serial_driver;
static void
start_port(struct dbg_port* p)
{
if (!p)
return;
if (p->started)
return;
p->started = 1;
if (p->nbr == 1)
crisv32_pinmux_alloc_fixed(pinmux_ser1);
else if (p->nbr == 2)
crisv32_pinmux_alloc_fixed(pinmux_ser2);
else if (p->nbr == 3)
crisv32_pinmux_alloc_fixed(pinmux_ser3);
/* Set up serial port registers */
reg_ser_rw_tr_ctrl tr_ctrl = {0};
reg_ser_rw_tr_dma_en tr_dma_en = {0};
reg_ser_rw_rec_ctrl rec_ctrl = {0};
reg_ser_rw_tr_baud_div tr_baud_div = {0};
reg_ser_rw_rec_baud_div rec_baud_div = {0};
tr_ctrl.base_freq = rec_ctrl.base_freq = regk_ser_f29_493;
tr_dma_en.en = rec_ctrl.dma_mode = regk_ser_no;
tr_baud_div.div = rec_baud_div.div = 29493000 / p->baudrate / 8;
tr_ctrl.en = rec_ctrl.en = 1;
if (p->parity == 'O')
{
tr_ctrl.par_en = regk_ser_yes;
tr_ctrl.par = regk_ser_odd;
rec_ctrl.par_en = regk_ser_yes;
rec_ctrl.par = regk_ser_odd;
}
else if (p->parity == 'E')
{
tr_ctrl.par_en = regk_ser_yes;
tr_ctrl.par = regk_ser_even;
rec_ctrl.par_en = regk_ser_yes;
rec_ctrl.par = regk_ser_odd;
}
if (p->bits == 7)
{
tr_ctrl.data_bits = regk_ser_bits7;
rec_ctrl.data_bits = regk_ser_bits7;
}
REG_WR (ser, p->instance, rw_tr_baud_div, tr_baud_div);
REG_WR (ser, p->instance, rw_rec_baud_div, rec_baud_div);
REG_WR (ser, p->instance, rw_tr_dma_en, tr_dma_en);
REG_WR (ser, p->instance, rw_tr_ctrl, tr_ctrl);
REG_WR (ser, p->instance, rw_rec_ctrl, rec_ctrl);
}
/* No debug */
#ifdef CONFIG_ETRAX_DEBUG_PORT_NULL
static void
console_write(struct console *co, const char *buf, unsigned int len)
{
return;
}
/* Target debug */
#elif !defined(CONFIG_ETRAXFS_SIM)
static void
console_write_direct(struct console *co, const char *buf, unsigned int len)
{
int i;
reg_ser_r_stat_din stat;
reg_ser_rw_tr_dma_en tr_dma_en, old;
/* Switch to manual mode */
tr_dma_en = old = REG_RD (ser, port->instance, rw_tr_dma_en);
if (tr_dma_en.en == regk_ser_yes) {
tr_dma_en.en = regk_ser_no;
REG_WR(ser, port->instance, rw_tr_dma_en, tr_dma_en);
}
/* Send data */
for (i = 0; i < len; i++) {
/* LF -> CRLF */
if (buf[i] == '\n') {
do {
stat = REG_RD (ser, port->instance, r_stat_din);
} while (!stat.tr_rdy);
REG_WR_INT (ser, port->instance, rw_dout, '\r');
}
/* Wait until transmitter is ready and send.*/
do {
stat = REG_RD (ser, port->instance, r_stat_din);
} while (!stat.tr_rdy);
REG_WR_INT (ser, port->instance, rw_dout, buf[i]);
}
/* Restore mode */
if (tr_dma_en.en != old.en)
REG_WR(ser, port->instance, rw_tr_dma_en, old);
}
static void
console_write(struct console *co, const char *buf, unsigned int len)
{
if (!port)
return;
console_write_direct(co, buf, len);
}
#else
/* VCS debug */
static void
console_write(struct console *co, const char *buf, unsigned int len)
{
char* pos;
pos = memchr(buf, '\n', len);
if (pos) {
int l = ++pos - buf;
memcpy(buffer + buffer_pos, buf, l);
memcpy(buffer, msg, sizeof(msg) - 1);
buffer[buffer_pos + l] = '\0';
print_str(buffer);
buffer_pos = sizeof(msg) - 1;
if (pos - buf != len) {
memcpy(buffer + buffer_pos, pos, len - l);
buffer_pos += len - l;
}
} else {
memcpy(buffer + buffer_pos, buf, len);
buffer_pos += len;
}
}
#endif
int raw_printk(const char *fmt, ...)
{
static char buf[1024];
int printed_len;
va_list args;
va_start(args, fmt);
printed_len = vsnprintf(buf, sizeof(buf), fmt, args);
va_end(args);
console_write(NULL, buf, strlen(buf));
return printed_len;
}
void
stupid_debug(char* buf)
{
console_write(NULL, buf, strlen(buf));
}
#ifdef CONFIG_ETRAX_KGDB
/* Use polling to get a single character from the kernel debug port */
int
getDebugChar(void)
{
reg_ser_rs_status_data stat;
reg_ser_rw_ack_intr ack_intr = { 0 };
do {
stat = REG_RD(ser, kgdb_instance, rs_status_data);
} while (!stat.data_avail);
/* Ack the data_avail interrupt. */
ack_intr.data_avail = 1;
REG_WR(ser, kgdb_instance, rw_ack_intr, ack_intr);
return stat.data;
}
/* Use polling to put a single character to the kernel debug port */
void
putDebugChar(int val)
{
reg_ser_r_status_data stat;
do {
stat = REG_RD (ser, kgdb_instance, r_status_data);
} while (!stat.tr_ready);
REG_WR (ser, kgdb_instance, rw_data_out, REG_TYPE_CONV(reg_ser_rw_data_out, int, val));
}
#endif /* CONFIG_ETRAX_KGDB */
static int __init
console_setup(struct console *co, char *options)
{
char* s;
if (options) {
port = &ports[co->index];
port->baudrate = 115200;
port->parity = 'N';
port->bits = 8;
port->baudrate = simple_strtoul(options, NULL, 10);
s = options;
while(*s >= '0' && *s <= '9')
s++;
if (*s) port->parity = *s++;
if (*s) port->bits = *s++ - '0';
port->started = 0;
start_port(port);
}
return 0;
}
/* This is a dummy serial device that throws away anything written to it.
* This is used when no debug output is wanted.
*/
static struct tty_driver dummy_driver;
static int dummy_open(struct tty_struct *tty, struct file * filp)
{
return 0;
}
static void dummy_close(struct tty_struct *tty, struct file * filp)
{
}
static int dummy_write(struct tty_struct * tty,
const unsigned char *buf, int count)
{
return count;
}
static int
dummy_write_room(struct tty_struct *tty)
{
return 8192;
}
void __init
init_dummy_console(void)
{
memset(&dummy_driver, 0, sizeof(struct tty_driver));
dummy_driver.driver_name = "serial";
dummy_driver.name = "ttyS";
dummy_driver.major = TTY_MAJOR;
dummy_driver.minor_start = 68;
dummy_driver.num = 1; /* etrax100 has 4 serial ports */
dummy_driver.type = TTY_DRIVER_TYPE_SERIAL;
dummy_driver.subtype = SERIAL_TYPE_NORMAL;
dummy_driver.init_termios = tty_std_termios;
dummy_driver.init_termios.c_cflag =
B115200 | CS8 | CREAD | HUPCL | CLOCAL; /* is normally B9600 default... */
dummy_driver.flags = TTY_DRIVER_REAL_RAW | TTY_DRIVER_NO_DEVFS;
dummy_driver.open = dummy_open;
dummy_driver.close = dummy_close;
dummy_driver.write = dummy_write;
dummy_driver.write_room = dummy_write_room;
if (tty_register_driver(&dummy_driver))
panic("Couldn't register dummy serial driver\n");
}
static struct tty_driver*
crisv32_console_device(struct console* co, int *index)
{
if (port)
*index = port->nbr;
return port ? serial_driver : &dummy_driver;
}
static struct console sercons = {
name : "ttyS",
write: console_write,
read : NULL,
device : crisv32_console_device,
unblank : NULL,
setup : console_setup,
flags : CON_PRINTBUFFER,
index : -1,
cflag : 0,
next : NULL
};
static struct console sercons0 = {
name : "ttyS",
write: console_write,
read : NULL,
device : crisv32_console_device,
unblank : NULL,
setup : console_setup,
flags : CON_PRINTBUFFER,
index : 0,
cflag : 0,
next : NULL
};
static struct console sercons1 = {
name : "ttyS",
write: console_write,
read : NULL,
device : crisv32_console_device,
unblank : NULL,
setup : console_setup,
flags : CON_PRINTBUFFER,
index : 1,
cflag : 0,
next : NULL
};
static struct console sercons2 = {
name : "ttyS",
write: console_write,
read : NULL,
device : crisv32_console_device,
unblank : NULL,
setup : console_setup,
flags : CON_PRINTBUFFER,
index : 2,
cflag : 0,
next : NULL
};
static struct console sercons3 = {
name : "ttyS",
write: console_write,
read : NULL,
device : crisv32_console_device,
unblank : NULL,
setup : console_setup,
flags : CON_PRINTBUFFER,
index : 3,
cflag : 0,
next : NULL
};
/* Register console for printk's, etc. */
int __init
init_etrax_debug(void)
{
static int first = 1;
if (!first) {
unregister_console(&sercons);
register_console(&sercons0);
register_console(&sercons1);
register_console(&sercons2);
register_console(&sercons3);
init_dummy_console();
return 0;
}
first = 0;
register_console(&sercons);
start_port(port);
#ifdef CONFIG_ETRAX_KGDB
start_port(kgdb_port);
#endif /* CONFIG_ETRAX_KGDB */
return 0;
}
__initcall(init_etrax_debug);

View file

@ -0,0 +1,224 @@
/* Wrapper for DMA channel allocator that starts clocks etc */
#include <linux/kernel.h>
#include <linux/spinlock.h>
#include <asm/dma.h>
#include <asm/arch/hwregs/reg_map.h>
#include <asm/arch/hwregs/reg_rdwr.h>
#include <asm/arch/hwregs/marb_defs.h>
#include <asm/arch/hwregs/config_defs.h>
#include <asm/arch/hwregs/strmux_defs.h>
#include <linux/errno.h>
#include <asm/system.h>
#include <asm/arch/arbiter.h>
static char used_dma_channels[MAX_DMA_CHANNELS];
static const char * used_dma_channels_users[MAX_DMA_CHANNELS];
static DEFINE_SPINLOCK(dma_lock);
int crisv32_request_dma(unsigned int dmanr, const char * device_id,
unsigned options, unsigned int bandwidth,
enum dma_owner owner)
{
unsigned long flags;
reg_config_rw_clk_ctrl clk_ctrl;
reg_strmux_rw_cfg strmux_cfg;
if (crisv32_arbiter_allocate_bandwith(dmanr,
options & DMA_INT_MEM ? INT_REGION : EXT_REGION,
bandwidth))
return -ENOMEM;
spin_lock_irqsave(&dma_lock, flags);
if (used_dma_channels[dmanr]) {
spin_unlock_irqrestore(&dma_lock, flags);
if (options & DMA_VERBOSE_ON_ERROR) {
printk("Failed to request DMA %i for %s, already allocated by %s\n", dmanr, device_id, used_dma_channels_users[dmanr]);
}
if (options & DMA_PANIC_ON_ERROR)
panic("request_dma error!");
return -EBUSY;
}
clk_ctrl = REG_RD(config, regi_config, rw_clk_ctrl);
strmux_cfg = REG_RD(strmux, regi_strmux, rw_cfg);
switch(dmanr)
{
case 0:
case 1:
clk_ctrl.dma01_eth0 = 1;
break;
case 2:
case 3:
clk_ctrl.dma23 = 1;
break;
case 4:
case 5:
clk_ctrl.dma45 = 1;
break;
case 6:
case 7:
clk_ctrl.dma67 = 1;
break;
case 8:
case 9:
clk_ctrl.dma89_strcop = 1;
break;
#if MAX_DMA_CHANNELS-1 != 9
#error Check dma.c
#endif
default:
spin_unlock_irqrestore(&dma_lock, flags);
if (options & DMA_VERBOSE_ON_ERROR) {
printk("Failed to request DMA %i for %s, only 0-%i valid)\n", dmanr, device_id, MAX_DMA_CHANNELS-1);
}
if (options & DMA_PANIC_ON_ERROR)
panic("request_dma error!");
return -EINVAL;
}
switch(owner)
{
case dma_eth0:
if (dmanr == 0)
strmux_cfg.dma0 = regk_strmux_eth0;
else if (dmanr == 1)
strmux_cfg.dma1 = regk_strmux_eth0;
else
panic("Invalid DMA channel for eth0\n");
break;
case dma_eth1:
if (dmanr == 6)
strmux_cfg.dma6 = regk_strmux_eth1;
else if (dmanr == 7)
strmux_cfg.dma7 = regk_strmux_eth1;
else
panic("Invalid DMA channel for eth1\n");
break;
case dma_iop0:
if (dmanr == 2)
strmux_cfg.dma2 = regk_strmux_iop0;
else if (dmanr == 3)
strmux_cfg.dma3 = regk_strmux_iop0;
else
panic("Invalid DMA channel for iop0\n");
break;
case dma_iop1:
if (dmanr == 4)
strmux_cfg.dma4 = regk_strmux_iop1;
else if (dmanr == 5)
strmux_cfg.dma5 = regk_strmux_iop1;
else
panic("Invalid DMA channel for iop1\n");
break;
case dma_ser0:
if (dmanr == 6)
strmux_cfg.dma6 = regk_strmux_ser0;
else if (dmanr == 7)
strmux_cfg.dma7 = regk_strmux_ser0;
else
panic("Invalid DMA channel for ser0\n");
break;
case dma_ser1:
if (dmanr == 4)
strmux_cfg.dma4 = regk_strmux_ser1;
else if (dmanr == 5)
strmux_cfg.dma5 = regk_strmux_ser1;
else
panic("Invalid DMA channel for ser1\n");
break;
case dma_ser2:
if (dmanr == 2)
strmux_cfg.dma2 = regk_strmux_ser2;
else if (dmanr == 3)
strmux_cfg.dma3 = regk_strmux_ser2;
else
panic("Invalid DMA channel for ser2\n");
break;
case dma_ser3:
if (dmanr == 8)
strmux_cfg.dma8 = regk_strmux_ser3;
else if (dmanr == 9)
strmux_cfg.dma9 = regk_strmux_ser3;
else
panic("Invalid DMA channel for ser3\n");
break;
case dma_sser0:
if (dmanr == 4)
strmux_cfg.dma4 = regk_strmux_sser0;
else if (dmanr == 5)
strmux_cfg.dma5 = regk_strmux_sser0;
else
panic("Invalid DMA channel for sser0\n");
break;
case dma_sser1:
if (dmanr == 6)
strmux_cfg.dma6 = regk_strmux_sser1;
else if (dmanr == 7)
strmux_cfg.dma7 = regk_strmux_sser1;
else
panic("Invalid DMA channel for sser1\n");
break;
case dma_ata:
if (dmanr == 2)
strmux_cfg.dma2 = regk_strmux_ata;
else if (dmanr == 3)
strmux_cfg.dma3 = regk_strmux_ata;
else
panic("Invalid DMA channel for ata\n");
break;
case dma_strp:
if (dmanr == 8)
strmux_cfg.dma8 = regk_strmux_strcop;
else if (dmanr == 9)
strmux_cfg.dma9 = regk_strmux_strcop;
else
panic("Invalid DMA channel for strp\n");
break;
case dma_ext0:
if (dmanr == 6)
strmux_cfg.dma6 = regk_strmux_ext0;
else
panic("Invalid DMA channel for ext0\n");
break;
case dma_ext1:
if (dmanr == 7)
strmux_cfg.dma7 = regk_strmux_ext1;
else
panic("Invalid DMA channel for ext1\n");
break;
case dma_ext2:
if (dmanr == 2)
strmux_cfg.dma2 = regk_strmux_ext2;
else if (dmanr == 8)
strmux_cfg.dma8 = regk_strmux_ext2;
else
panic("Invalid DMA channel for ext2\n");
break;
case dma_ext3:
if (dmanr == 3)
strmux_cfg.dma3 = regk_strmux_ext3;
else if (dmanr == 9)
strmux_cfg.dma9 = regk_strmux_ext2;
else
panic("Invalid DMA channel for ext2\n");
break;
}
used_dma_channels[dmanr] = 1;
used_dma_channels_users[dmanr] = device_id;
REG_WR(config, regi_config, rw_clk_ctrl, clk_ctrl);
REG_WR(strmux, regi_strmux, rw_cfg, strmux_cfg);
spin_unlock_irqrestore(&dma_lock,flags);
return 0;
}
void crisv32_free_dma(unsigned int dmanr)
{
spin_lock(&dma_lock);
used_dma_channels[dmanr] = 0;
spin_unlock(&dma_lock);
}

View file

@ -0,0 +1,820 @@
/*
* Copyright (C) 2000-2003 Axis Communications AB
*
* Authors: Bjorn Wesen (bjornw@axis.com)
* Tobias Anderberg (tobiasa@axis.com), CRISv32 port.
*
* Code for the system-call and fault low-level handling routines.
*
* NOTE: This code handles signal-recognition, which happens every time
* after a timer-interrupt and after each system call.
*
* Stack layout in 'ret_from_system_call':
* ptrace needs to have all regs on the stack.
* if the order here is changed, it needs to be
* updated in fork.c:copy_process, signal.c:do_signal,
* ptrace.c and ptrace.h
*
*/
#include <linux/config.h>
#include <linux/linkage.h>
#include <linux/sys.h>
#include <asm/unistd.h>
#include <asm/errno.h>
#include <asm/thread_info.h>
#include <asm/arch/offset.h>
#include <asm/arch/hwregs/asm/reg_map_asm.h>
#include <asm/arch/hwregs/asm/intr_vect_defs_asm.h>
;; Exported functions.
.globl system_call
.globl ret_from_intr
.globl ret_from_fork
.globl resume
.globl multiple_interrupt
.globl nmi_interrupt
.globl spurious_interrupt
.globl do_sigtrap
.globl gdb_handle_exception
.globl sys_call_table
; Check if preemptive kernel scheduling should be done.
#ifdef CONFIG_PREEMPT
_resume_kernel:
di
; Load current task struct.
movs.w -8192, $r0 ; THREAD_SIZE = 8192
and.d $sp, $r0
addoq +TI_preempt_count, $r0, $acr
move.d [$acr], $r10 ; Preemption disabled?
bne _Rexit
nop
_need_resched:
addoq +TI_flags, $r0, $acr
move.d [$acr], $r10
btstq TIF_NEED_RESCHED, $r10 ; Check if need_resched is set.
bpl _Rexit
nop
; Do preemptive kernel scheduling.
jsr preempt_schedule_irq
nop
; Load new task struct.
movs.w -8192, $r0 ; THREAD_SIZE = 8192.
and.d $sp, $r0
; One more time with new task.
ba _need_resched
nop
#else
#define _resume_kernel _Rexit
#endif
; Called at exit from fork. schedule_tail must be called to drop
; spinlock if CONFIG_PREEMPT.
ret_from_fork:
jsr schedule_tail
nop
ba ret_from_sys_call
nop
ret_from_intr:
;; Check for resched if preemptive kernel, or if we're going back to
;; user-mode. This test matches the user_regs(regs) macro. Don't simply
;; test CCS since that doesn't necessarily reflect what mode we'll
;; return into.
addoq +PT_ccs, $sp, $acr
move.d [$acr], $r0
btstq 16, $r0 ; User-mode flag.
bpl _resume_kernel
; Note that di below is in delay slot.
_resume_userspace:
di ; So need_resched and sigpending don't change.
movs.w -8192, $r0 ; THREAD_SIZE == 8192
and.d $sp, $r0
addoq +TI_flags, $r0, $acr ; current->work
move.d [$acr], $r10
and.d _TIF_WORK_MASK, $r10 ; Work to be done on return?
bne _work_pending
nop
ba _Rexit
nop
;; The system_call is called by a BREAK instruction, which looks pretty
;; much like any other exception.
;;
;; System calls can't be made from interrupts but we still stack ERP
;; to have a complete stack frame.
;;
;; In r9 we have the wanted syscall number. Arguments come in r10,r11,r12,
;; r13,mof,srp
;;
;; This function looks on the _surface_ like spaghetti programming, but it's
;; really designed so that the fast-path does not force cache-loading of
;; non-used instructions. Only the non-common cases cause the outlined code
;; to run..
system_call:
;; Stack-frame similar to the irq heads, which is reversed in
;; ret_from_sys_call.
subq 12, $sp ; Skip EXS, EDA.
move $erp, [$sp]
subq 4, $sp
move $srp, [$sp]
subq 4, $sp
move $ccs, [$sp]
subq 4, $sp
ei ; Allow IRQs while handling system call
move $spc, [$sp]
subq 4, $sp
move $mof, [$sp]
subq 4, $sp
move $srs, [$sp]
subq 4, $sp
move.d $acr, [$sp]
subq 14*4, $sp ; Make room for R0-R13.
movem $r13, [$sp] ; Push R0-R13
subq 4, $sp
move.d $r10, [$sp] ; Push orig_r10.
; Set S-bit when kernel debugging to keep hardware breakpoints active.
#ifdef CONFIG_ETRAX_KGDB
move $ccs, $r0
or.d (1<<9), $r0
move $r0, $ccs
#endif
movs.w -ENOSYS, $r0
addoq +PT_r10, $sp, $acr
move.d $r0, [$acr]
;; Check if this process is syscall-traced.
movs.w -8192, $r0 ; THREAD_SIZE == 8192
and.d $sp, $r0
addoq +TI_flags, $r0, $acr
move.d [$acr], $r0
btstq TIF_SYSCALL_TRACE, $r0
bmi _syscall_trace_entry
nop
_syscall_traced:
;; Check for sanity in the requested syscall number.
cmpu.w NR_syscalls, $r9
bhs ret_from_sys_call
lslq 2, $r9 ; Multiply by 4, in the delay slot.
;; The location on the stack for the register structure is passed as a
;; seventh argument. Some system calls need this.
move.d $sp, $r0
subq 4, $sp
move.d $r0, [$sp]
;; The registers carrying parameters (R10-R13) are intact. The optional
;; fifth and sixth parameters is in MOF and SRP respectivly. Put them
;; back on the stack.
subq 4, $sp
move $srp, [$sp]
subq 4, $sp
move $mof, [$sp]
;; Actually to the system call.
addo.d +sys_call_table, $r9, $acr
move.d [$acr], $acr
jsr $acr
nop
addq 3*4, $sp ; Pop the mof, srp and regs parameters.
addoq +PT_r10, $sp, $acr
move.d $r10, [$acr] ; Save the return value.
moveq 1, $r9 ; "Parameter" to ret_from_sys_call to
; show it was a sys call.
;; Fall through into ret_from_sys_call to return.
ret_from_sys_call:
;; R9 is a parameter:
;; >= 1 from syscall
;; 0 from irq
;; Get the current task-struct pointer.
movs.w -8192, $r0 ; THREAD_SIZE == 8192
and.d $sp, $r0
di ; Make sure need_resched and sigpending don't change.
addoq +TI_flags, $r0, $acr
move.d [$acr], $r1
and.d _TIF_ALLWORK_MASK, $r1
bne _syscall_exit_work
nop
_Rexit:
;; This epilogue MUST match the prologues in multiple_interrupt, irq.h
;; and ptregs.h.
addq 4, $sp ; Skip orig_r10.
movem [$sp+], $r13 ; Registers R0-R13.
move.d [$sp+], $acr
move [$sp], $srs
addq 4, $sp
move [$sp+], $mof
move [$sp+], $spc
move [$sp+], $ccs
move [$sp+], $srp
move [$sp+], $erp
addq 8, $sp ; Skip EXS, EDA.
jump $erp
rfe ; Restore condition code stack in delay-slot.
;; We get here after doing a syscall if extra work might need to be done
;; perform syscall exit tracing if needed.
_syscall_exit_work:
;; R0 contains current at this point and irq's are disabled.
addoq +TI_flags, $r0, $acr
move.d [$acr], $r1
btstq TIF_SYSCALL_TRACE, $r1
bpl _work_pending
nop
ei
move.d $r9, $r1 ; Preserve R9.
jsr do_syscall_trace
nop
move.d $r1, $r9
ba _resume_userspace
nop
_work_pending:
addoq +TI_flags, $r0, $acr
move.d [$acr], $r10
btstq TIF_NEED_RESCHED, $r10 ; Need resched?
bpl _work_notifysig ; No, must be signal/notify.
nop
_work_resched:
move.d $r9, $r1 ; Preserve R9.
jsr schedule
nop
move.d $r1, $r9
di
addoq +TI_flags, $r0, $acr
move.d [$acr], $r1
and.d _TIF_WORK_MASK, $r1 ; Ignore sycall trace counter.
beq _Rexit
nop
btstq TIF_NEED_RESCHED, $r1
bmi _work_resched ; current->work.need_resched.
nop
_work_notifysig:
;; Deal with pending signals and notify-resume requests.
addoq +TI_flags, $r0, $acr
move.d [$acr], $r13 ; The thread_info_flags parameter.
move.d $r9, $r10 ; do_notify_resume syscall/irq param.
moveq 0, $r11 ; oldset param - 0 in this case.
move.d $sp, $r12 ; The regs param.
jsr do_notify_resume
nop
ba _Rexit
nop
;; We get here as a sidetrack when we've entered a syscall with the
;; trace-bit set. We need to call do_syscall_trace and then continue
;; with the call.
_syscall_trace_entry:
;; PT_r10 in the frame contains -ENOSYS as required, at this point.
jsr do_syscall_trace
nop
;; Now re-enter the syscall code to do the syscall itself. We need to
;; restore R9 here to contain the wanted syscall, and the other
;; parameter-bearing registers.
addoq +PT_r9, $sp, $acr
move.d [$acr], $r9
addoq +PT_orig_r10, $sp, $acr
move.d [$acr], $r10 ; PT_r10 is already -ENOSYS.
addoq +PT_r11, $sp, $acr
move.d [$acr], $r11
addoq +PT_r12, $sp, $acr
move.d [$acr], $r12
addoq +PT_r13, $sp, $acr
move.d [$acr], $r13
addoq +PT_mof, $sp, $acr
move [$acr], $mof
addoq +PT_srp, $sp, $acr
move [$acr], $srp
ba _syscall_traced
nop
;; Resume performs the actual task-switching, by switching stack
;; pointers. Input arguments are:
;;
;; R10 = prev
;; R11 = next
;; R12 = thread offset in task struct.
;;
;; Returns old current in R10.
resume:
subq 4, $sp
move $srp, [$sp] ; Keep old/new PC on the stack.
add.d $r12, $r10 ; R10 = current tasks tss.
addoq +THREAD_ccs, $r10, $acr
move $ccs, [$acr] ; Save IRQ enable state.
di
addoq +THREAD_usp, $r10, $acr
move $usp, [$acr] ; Save user-mode stackpointer.
;; See copy_thread for the reason why register R9 is saved.
subq 10*4, $sp
movem $r9, [$sp] ; Save non-scratch registers and R9.
addoq +THREAD_ksp, $r10, $acr
move.d $sp, [$acr] ; Save kernel SP for old task.
move.d $sp, $r10 ; Return last running task in R10.
and.d -8192, $r10 ; Get thread_info from stackpointer.
addoq +TI_task, $r10, $acr
move.d [$acr], $r10 ; Get task.
add.d $r12, $r11 ; Find the new tasks tss.
addoq +THREAD_ksp, $r11, $acr
move.d [$acr], $sp ; Switch to new stackframe.
movem [$sp+], $r9 ; Restore non-scratch registers and R9.
addoq +THREAD_usp, $r11, $acr
move [$acr], $usp ; Restore user-mode stackpointer.
addoq +THREAD_ccs, $r11, $acr
move [$acr], $ccs ; Restore IRQ enable status.
move.d [$sp+], $acr
jump $acr ; Restore PC.
nop
nmi_interrupt:
;; If we receive a watchdog interrupt while it is not expected, then set
;; up a canonical frame and dump register contents before dying.
;; This prologue MUST match the one in irq.h and the struct in ptregs.h!
subq 12, $sp ; Skip EXS, EDA.
move $nrp, [$sp]
subq 4, $sp
move $srp, [$sp]
subq 4, $sp
move $ccs, [$sp]
subq 4, $sp
move $spc, [$sp]
subq 4, $sp
move $mof, [$sp]
subq 4, $sp
move $srs, [$sp]
subq 4, $sp
move.d $acr, [$sp]
subq 14*4, $sp ; Make room for R0-R13.
movem $r13, [$sp] ; Push R0-R13.
subq 4, $sp
move.d $r10, [$sp] ; Push orig_r10.
move.d REG_ADDR(intr_vect, regi_irq, r_nmi), $r0
move.d [$r0], $r0
btstq REG_BIT(intr_vect, r_nmi, watchdog), $r0
bpl 1f
nop
jsr handle_watchdog_bite ; In time.c.
move.d $sp, $r10 ; Pointer to registers
1: btstq REG_BIT(intr_vect, r_nmi, ext), $r0
bpl 1f
nop
jsr handle_nmi
move.d $sp, $r10 ; Pointer to registers
1: addq 4, $sp ; Skip orig_r10
movem [$sp+], $r13
move.d [$sp+], $acr
move [$sp], $srs
addq 4, $sp
move [$sp+], $mof
move [$sp+], $spc
move [$sp+], $ccs
move [$sp+], $srp
move [$sp+], $nrp
addq 8, $sp ; Skip EXS, EDA.
jump $nrp
rfn
.comm cause_of_death, 4 ;; Don't declare this anywhere.
spurious_interrupt:
di
jump hard_reset_now
nop
;; This handles the case when multiple interrupts arrive at the same
;; time. Jump to the first set interrupt bit in a priotiry fashion. The
;; hardware will call the unserved interrupts after the handler
;; finishes.
multiple_interrupt:
;; This prologue MUST match the one in irq.h and the struct in ptregs.h!
subq 12, $sp ; Skip EXS, EDA.
move $erp, [$sp]
subq 4, $sp
move $srp, [$sp]
subq 4, $sp
move $ccs, [$sp]
subq 4, $sp
move $spc, [$sp]
subq 4, $sp
move $mof, [$sp]
subq 4, $sp
move $srs, [$sp]
subq 4, $sp
move.d $acr, [$sp]
subq 14*4, $sp ; Make room for R0-R13.
movem $r13, [$sp] ; Push R0-R13.
subq 4, $sp
move.d $r10, [$sp] ; Push orig_r10.
; Set S-bit when kernel debugging to keep hardware breakpoints active.
#ifdef CONFIG_ETRAX_KGDB
move $ccs, $r0
or.d (1<<9), $r0
move $r0, $ccs
#endif
jsr crisv32_do_multiple
move.d $sp, $r10
jump ret_from_intr
nop
do_sigtrap:
;; Sigtraps the process that executed the BREAK instruction. Creates a
;; frame that Rexit expects.
subq 4, $sp
move $eda, [$sp]
subq 4, $sp
move $exs, [$sp]
subq 4, $sp
move $erp, [$sp]
subq 4, $sp
move $srp, [$sp]
subq 4, $sp
move $ccs, [$sp]
subq 4, $sp
move $spc, [$sp]
subq 4, $sp
move $mof, [$sp]
subq 4, $sp
move $srs, [$sp]
subq 4, $sp
move.d $acr, [$sp]
di ; Need to disable irq's at this point.
subq 14*4, $sp ; Make room for r0-r13.
movem $r13, [$sp] ; Push the r0-r13 registers.
subq 4, $sp
move.d $r10, [$sp] ; Push orig_r10.
movs.w -8192, $r9 ; THREAD_SIZE == 8192
and.d $sp, $r9
;; thread_info as first parameter
move.d $r9, $r10
moveq 5, $r11 ; SIGTRAP as second argument.
jsr ugdb_trap_user
nop
jump ret_from_intr ; Use the return routine for interrupts.
nop
gdb_handle_exception:
subq 4, $sp
move.d $r0, [$sp]
#ifdef CONFIG_ETRAX_KGDB
move $ccs, $r0 ; U-flag not affected by previous insns.
btstq 16, $r0 ; Test the U-flag.
bmi _ugdb_handle_exception ; Go to user mode debugging.
nop ; Empty delay-slot (cannot pop R0 here).
ba kgdb_handle_exception ; Go to kernel debugging.
move.d [$sp+], $r0 ; Restore R0 in delay slot.
#endif
_ugdb_handle_exception:
ba do_sigtrap ; SIGTRAP the offending process.
move.d [$sp+], $r0 ; Restore R0 in delay slot.
.data
.section .rodata,"a"
sys_call_table:
.long sys_restart_syscall ; 0 - old "setup()" system call, used
; for restarting.
.long sys_exit
.long sys_fork
.long sys_read
.long sys_write
.long sys_open /* 5 */
.long sys_close
.long sys_waitpid
.long sys_creat
.long sys_link
.long sys_unlink /* 10 */
.long sys_execve
.long sys_chdir
.long sys_time
.long sys_mknod
.long sys_chmod /* 15 */
.long sys_lchown16
.long sys_ni_syscall /* old break syscall holder */
.long sys_stat
.long sys_lseek
.long sys_getpid /* 20 */
.long sys_mount
.long sys_oldumount
.long sys_setuid16
.long sys_getuid16
.long sys_stime /* 25 */
.long sys_ptrace
.long sys_alarm
.long sys_fstat
.long sys_pause
.long sys_utime /* 30 */
.long sys_ni_syscall /* old stty syscall holder */
.long sys_ni_syscall /* old gtty syscall holder */
.long sys_access
.long sys_nice
.long sys_ni_syscall /* 35 old ftime syscall holder */
.long sys_sync
.long sys_kill
.long sys_rename
.long sys_mkdir
.long sys_rmdir /* 40 */
.long sys_dup
.long sys_pipe
.long sys_times
.long sys_ni_syscall /* old prof syscall holder */
.long sys_brk /* 45 */
.long sys_setgid16
.long sys_getgid16
.long sys_signal
.long sys_geteuid16
.long sys_getegid16 /* 50 */
.long sys_acct
.long sys_umount /* recycled never used phys( */
.long sys_ni_syscall /* old lock syscall holder */
.long sys_ioctl
.long sys_fcntl /* 55 */
.long sys_ni_syscall /* old mpx syscall holder */
.long sys_setpgid
.long sys_ni_syscall /* old ulimit syscall holder */
.long sys_ni_syscall /* old sys_olduname holder */
.long sys_umask /* 60 */
.long sys_chroot
.long sys_ustat
.long sys_dup2
.long sys_getppid
.long sys_getpgrp /* 65 */
.long sys_setsid
.long sys_sigaction
.long sys_sgetmask
.long sys_ssetmask
.long sys_setreuid16 /* 70 */
.long sys_setregid16
.long sys_sigsuspend
.long sys_sigpending
.long sys_sethostname
.long sys_setrlimit /* 75 */
.long sys_old_getrlimit
.long sys_getrusage
.long sys_gettimeofday
.long sys_settimeofday
.long sys_getgroups16 /* 80 */
.long sys_setgroups16
.long sys_select /* was old_select in Linux/E100 */
.long sys_symlink
.long sys_lstat
.long sys_readlink /* 85 */
.long sys_uselib
.long sys_swapon
.long sys_reboot
.long old_readdir
.long old_mmap /* 90 */
.long sys_munmap
.long sys_truncate
.long sys_ftruncate
.long sys_fchmod
.long sys_fchown16 /* 95 */
.long sys_getpriority
.long sys_setpriority
.long sys_ni_syscall /* old profil syscall holder */
.long sys_statfs
.long sys_fstatfs /* 100 */
.long sys_ni_syscall /* sys_ioperm in i386 */
.long sys_socketcall
.long sys_syslog
.long sys_setitimer
.long sys_getitimer /* 105 */
.long sys_newstat
.long sys_newlstat
.long sys_newfstat
.long sys_ni_syscall /* old sys_uname holder */
.long sys_ni_syscall /* sys_iopl in i386 */
.long sys_vhangup
.long sys_ni_syscall /* old "idle" system call */
.long sys_ni_syscall /* vm86old in i386 */
.long sys_wait4
.long sys_swapoff /* 115 */
.long sys_sysinfo
.long sys_ipc
.long sys_fsync
.long sys_sigreturn
.long sys_clone /* 120 */
.long sys_setdomainname
.long sys_newuname
.long sys_ni_syscall /* sys_modify_ldt */
.long sys_adjtimex
.long sys_mprotect /* 125 */
.long sys_sigprocmask
.long sys_ni_syscall /* old "create_module" */
.long sys_init_module
.long sys_delete_module
.long sys_ni_syscall /* 130: old "get_kernel_syms" */
.long sys_quotactl
.long sys_getpgid
.long sys_fchdir
.long sys_bdflush
.long sys_sysfs /* 135 */
.long sys_personality
.long sys_ni_syscall /* for afs_syscall */
.long sys_setfsuid16
.long sys_setfsgid16
.long sys_llseek /* 140 */
.long sys_getdents
.long sys_select
.long sys_flock
.long sys_msync
.long sys_readv /* 145 */
.long sys_writev
.long sys_getsid
.long sys_fdatasync
.long sys_sysctl
.long sys_mlock /* 150 */
.long sys_munlock
.long sys_mlockall
.long sys_munlockall
.long sys_sched_setparam
.long sys_sched_getparam /* 155 */
.long sys_sched_setscheduler
.long sys_sched_getscheduler
.long sys_sched_yield
.long sys_sched_get_priority_max
.long sys_sched_get_priority_min /* 160 */
.long sys_sched_rr_get_interval
.long sys_nanosleep
.long sys_mremap
.long sys_setresuid16
.long sys_getresuid16 /* 165 */
.long sys_ni_syscall /* sys_vm86 */
.long sys_ni_syscall /* Old sys_query_module */
.long sys_poll
.long sys_nfsservctl
.long sys_setresgid16 /* 170 */
.long sys_getresgid16
.long sys_prctl
.long sys_rt_sigreturn
.long sys_rt_sigaction
.long sys_rt_sigprocmask /* 175 */
.long sys_rt_sigpending
.long sys_rt_sigtimedwait
.long sys_rt_sigqueueinfo
.long sys_rt_sigsuspend
.long sys_pread64 /* 180 */
.long sys_pwrite64
.long sys_chown16
.long sys_getcwd
.long sys_capget
.long sys_capset /* 185 */
.long sys_sigaltstack
.long sys_sendfile
.long sys_ni_syscall /* streams1 */
.long sys_ni_syscall /* streams2 */
.long sys_vfork /* 190 */
.long sys_getrlimit
.long sys_mmap2
.long sys_truncate64
.long sys_ftruncate64
.long sys_stat64 /* 195 */
.long sys_lstat64
.long sys_fstat64
.long sys_lchown
.long sys_getuid
.long sys_getgid /* 200 */
.long sys_geteuid
.long sys_getegid
.long sys_setreuid
.long sys_setregid
.long sys_getgroups /* 205 */
.long sys_setgroups
.long sys_fchown
.long sys_setresuid
.long sys_getresuid
.long sys_setresgid /* 210 */
.long sys_getresgid
.long sys_chown
.long sys_setuid
.long sys_setgid
.long sys_setfsuid /* 215 */
.long sys_setfsgid
.long sys_pivot_root
.long sys_mincore
.long sys_madvise
.long sys_getdents64 /* 220 */
.long sys_fcntl64
.long sys_ni_syscall /* reserved for TUX */
.long sys_ni_syscall
.long sys_gettid
.long sys_readahead /* 225 */
.long sys_setxattr
.long sys_lsetxattr
.long sys_fsetxattr
.long sys_getxattr
.long sys_lgetxattr /* 230 */
.long sys_fgetxattr
.long sys_listxattr
.long sys_llistxattr
.long sys_flistxattr
.long sys_removexattr /* 235 */
.long sys_lremovexattr
.long sys_fremovexattr
.long sys_tkill
.long sys_sendfile64
.long sys_futex /* 240 */
.long sys_sched_setaffinity
.long sys_sched_getaffinity
.long sys_ni_syscall /* sys_set_thread_area */
.long sys_ni_syscall /* sys_get_thread_area */
.long sys_io_setup /* 245 */
.long sys_io_destroy
.long sys_io_getevents
.long sys_io_submit
.long sys_io_cancel
.long sys_fadvise64 /* 250 */
.long sys_ni_syscall
.long sys_exit_group
.long sys_lookup_dcookie
.long sys_epoll_create
.long sys_epoll_ctl /* 255 */
.long sys_epoll_wait
.long sys_remap_file_pages
.long sys_set_tid_address
.long sys_timer_create
.long sys_timer_settime /* 260 */
.long sys_timer_gettime
.long sys_timer_getoverrun
.long sys_timer_delete
.long sys_clock_settime
.long sys_clock_gettime /* 265 */
.long sys_clock_getres
.long sys_clock_nanosleep
.long sys_statfs64
.long sys_fstatfs64
.long sys_tgkill /* 270 */
.long sys_utimes
.long sys_fadvise64_64
.long sys_ni_syscall /* sys_vserver */
.long sys_ni_syscall /* sys_mbind */
.long sys_ni_syscall /* 275 sys_get_mempolicy */
.long sys_ni_syscall /* sys_set_mempolicy */
.long sys_mq_open
.long sys_mq_unlink
.long sys_mq_timedsend
.long sys_mq_timedreceive /* 280 */
.long sys_mq_notify
.long sys_mq_getsetattr
.long sys_ni_syscall /* reserved for kexec */
.long sys_waitid
/*
* NOTE!! This doesn't have to be exact - we just have
* to make sure we have _enough_ of the "sys_ni_syscall"
* entries. Don't panic if you notice that this hasn't
* been shrunk every time we add a new system call.
*/
.rept NR_syscalls - (.-sys_call_table) / 4
.long sys_ni_syscall
.endr

View file

@ -0,0 +1,996 @@
/* $Id: fasttimer.c,v 1.11 2005/01/04 11:15:46 starvik Exp $
* linux/arch/cris/kernel/fasttimer.c
*
* Fast timers for ETRAX FS
* This may be useful in other OS than Linux so use 2 space indentation...
*
* $Log: fasttimer.c,v $
* Revision 1.11 2005/01/04 11:15:46 starvik
* Don't share timer IRQ.
*
* Revision 1.10 2004/12/07 09:19:38 starvik
* Corrected includes.
* Use correct interrupt macros.
*
* Revision 1.9 2004/05/14 10:18:58 starvik
* Export fast_timer_list
*
* Revision 1.8 2004/05/14 07:58:03 starvik
* Merge of changes from 2.4
*
* Revision 1.7 2003/07/10 12:06:14 starvik
* Return IRQ_NONE if irq wasn't handled
*
* Revision 1.6 2003/07/04 08:27:49 starvik
* Merge of Linux 2.5.74
*
* Revision 1.5 2003/06/05 10:16:22 johana
* New INTR_VECT macros.
*
* Revision 1.4 2003/06/03 08:49:45 johana
* Fixed typo.
*
* Revision 1.3 2003/06/02 12:51:27 johana
* Now compiles.
* Commented some include files that probably can be removed.
*
* Revision 1.2 2003/06/02 12:09:41 johana
* Ported to ETRAX FS using the trig interrupt instead of timer1.
*
* Revision 1.3 2002/12/12 08:26:32 starvik
* Don't use C-comments inside CVS comments
*
* Revision 1.2 2002/12/11 15:42:02 starvik
* Extracted v10 (ETRAX 100LX) specific stuff from arch/cris/kernel/
*
* Revision 1.1 2002/11/18 07:58:06 starvik
* Fast timers (from Linux 2.4)
*
* Revision 1.5 2002/10/15 06:21:39 starvik
* Added call to init_waitqueue_head
*
* Revision 1.4 2002/05/28 17:47:59 johana
* Added del_fast_timer()
*
* Revision 1.3 2002/05/28 16:16:07 johana
* Handle empty fast_timer_list
*
* Revision 1.2 2002/05/27 15:38:42 johana
* Made it compile without warnings on Linux 2.4.
* (includes, wait_queue, PROC_FS and snprintf)
*
* Revision 1.1 2002/05/27 15:32:25 johana
* arch/etrax100/kernel/fasttimer.c v1.8 from the elinux tree.
*
* Revision 1.8 2001/11/27 13:50:40 pkj
* Disable interrupts while stopping the timer and while modifying the
* list of active timers in timer1_handler() as it may be interrupted
* by other interrupts (e.g., the serial interrupt) which may add fast
* timers.
*
* Revision 1.7 2001/11/22 11:50:32 pkj
* * Only store information about the last 16 timers.
* * proc_fasttimer_read() now uses an allocated buffer, since it
* requires more space than just a page even for only writing the
* last 16 timers. The buffer is only allocated on request, so
* unless /proc/fasttimer is read, it is never allocated.
* * Renamed fast_timer_started to fast_timers_started to match
* fast_timers_added and fast_timers_expired.
* * Some clean-up.
*
* Revision 1.6 2000/12/13 14:02:08 johana
* Removed volatile for fast_timer_list
*
* Revision 1.5 2000/12/13 13:55:35 johana
* Added DEBUG_LOG, added som cli() and cleanup
*
* Revision 1.4 2000/12/05 13:48:50 johana
* Added range check when writing proc file, modified timer int handling
*
* Revision 1.3 2000/11/23 10:10:20 johana
* More debug/logging possibilities.
* Moved GET_JIFFIES_USEC() to timex.h and time.c
*
* Revision 1.2 2000/11/01 13:41:04 johana
* Clean up and bugfixes.
* Created new do_gettimeofday_fast() that gets a timeval struct
* with time based on jiffies and *R_TIMER0_DATA, uses a table
* for fast conversion of timer value to microseconds.
* (Much faster the standard do_gettimeofday() and we don't really
* wan't to use the true time - we wan't the "uptime" so timers don't screw up
* when we change the time.
* TODO: Add efficient support for continuous timers as well.
*
* Revision 1.1 2000/10/26 15:49:16 johana
* Added fasttimer, highresolution timers.
*
* Copyright (C) 2000,2001 2002, 2003 Axis Communications AB, Lund, Sweden
*/
#include <linux/errno.h>
#include <linux/sched.h>
#include <linux/kernel.h>
#include <linux/param.h>
#include <linux/string.h>
#include <linux/vmalloc.h>
#include <linux/interrupt.h>
#include <linux/time.h>
#include <linux/delay.h>
#include <asm/irq.h>
#include <asm/system.h>
#include <linux/config.h>
#include <linux/version.h>
#include <asm/arch/hwregs/reg_map.h>
#include <asm/arch/hwregs/reg_rdwr.h>
#include <asm/arch/hwregs/timer_defs.h>
#include <asm/fasttimer.h>
#include <linux/proc_fs.h>
/*
* timer0 is running at 100MHz and generating jiffies timer ticks
* at 100 or 1000 HZ.
* fasttimer gives an API that gives timers that expire "between" the jiffies
* giving microsecond resolution (10 ns).
* fasttimer uses reg_timer_rw_trig register to get interrupt when
* r_time reaches a certain value.
*/
#define DEBUG_LOG_INCLUDED
#define FAST_TIMER_LOG
//#define FAST_TIMER_TEST
#define FAST_TIMER_SANITY_CHECKS
#ifdef FAST_TIMER_SANITY_CHECKS
#define SANITYCHECK(x) x
static int sanity_failed = 0;
#else
#define SANITYCHECK(x)
#endif
#define D1(x)
#define D2(x)
#define DP(x)
#define __INLINE__ inline
static int fast_timer_running = 0;
static int fast_timers_added = 0;
static int fast_timers_started = 0;
static int fast_timers_expired = 0;
static int fast_timers_deleted = 0;
static int fast_timer_is_init = 0;
static int fast_timer_ints = 0;
struct fast_timer *fast_timer_list = NULL;
#ifdef DEBUG_LOG_INCLUDED
#define DEBUG_LOG_MAX 128
static const char * debug_log_string[DEBUG_LOG_MAX];
static unsigned long debug_log_value[DEBUG_LOG_MAX];
static int debug_log_cnt = 0;
static int debug_log_cnt_wrapped = 0;
#define DEBUG_LOG(string, value) \
{ \
unsigned long log_flags; \
local_irq_save(log_flags); \
debug_log_string[debug_log_cnt] = (string); \
debug_log_value[debug_log_cnt] = (unsigned long)(value); \
if (++debug_log_cnt >= DEBUG_LOG_MAX) \
{ \
debug_log_cnt = debug_log_cnt % DEBUG_LOG_MAX; \
debug_log_cnt_wrapped = 1; \
} \
local_irq_restore(log_flags); \
}
#else
#define DEBUG_LOG(string, value)
#endif
#define NUM_TIMER_STATS 16
#ifdef FAST_TIMER_LOG
struct fast_timer timer_added_log[NUM_TIMER_STATS];
struct fast_timer timer_started_log[NUM_TIMER_STATS];
struct fast_timer timer_expired_log[NUM_TIMER_STATS];
#endif
int timer_div_settings[NUM_TIMER_STATS];
int timer_delay_settings[NUM_TIMER_STATS];
static void
timer_trig_handler(void);
/* Not true gettimeofday, only checks the jiffies (uptime) + useconds */
void __INLINE__ do_gettimeofday_fast(struct timeval *tv)
{
unsigned long sec = jiffies;
unsigned long usec = GET_JIFFIES_USEC();
usec += (sec % HZ) * (1000000 / HZ);
sec = sec / HZ;
if (usec > 1000000)
{
usec -= 1000000;
sec++;
}
tv->tv_sec = sec;
tv->tv_usec = usec;
}
int __INLINE__ timeval_cmp(struct timeval *t0, struct timeval *t1)
{
if (t0->tv_sec < t1->tv_sec)
{
return -1;
}
else if (t0->tv_sec > t1->tv_sec)
{
return 1;
}
if (t0->tv_usec < t1->tv_usec)
{
return -1;
}
else if (t0->tv_usec > t1->tv_usec)
{
return 1;
}
return 0;
}
/* Called with ints off */
void __INLINE__ start_timer_trig(unsigned long delay_us)
{
reg_timer_rw_ack_intr ack_intr = { 0 };
reg_timer_rw_intr_mask intr_mask;
reg_timer_rw_trig trig;
reg_timer_rw_trig_cfg trig_cfg = { 0 };
reg_timer_r_time r_time;
r_time = REG_RD(timer, regi_timer, r_time);
D1(printk("start_timer_trig : %d us freq: %i div: %i\n",
delay_us, freq_index, div));
/* Clear trig irq */
intr_mask = REG_RD(timer, regi_timer, rw_intr_mask);
intr_mask.trig = 0;
REG_WR(timer, regi_timer, rw_intr_mask, intr_mask);
/* Set timer values */
/* r_time is 100MHz (10 ns resolution) */
trig = r_time + delay_us*(1000/10);
timer_div_settings[fast_timers_started % NUM_TIMER_STATS] = trig;
timer_delay_settings[fast_timers_started % NUM_TIMER_STATS] = delay_us;
/* Ack interrupt */
ack_intr.trig = 1;
REG_WR(timer, regi_timer, rw_ack_intr, ack_intr);
/* Start timer */
REG_WR(timer, regi_timer, rw_trig, trig);
trig_cfg.tmr = regk_timer_time;
REG_WR(timer, regi_timer, rw_trig_cfg, trig_cfg);
/* Check if we have already passed the trig time */
r_time = REG_RD(timer, regi_timer, r_time);
if (r_time < trig) {
/* No, Enable trig irq */
intr_mask = REG_RD(timer, regi_timer, rw_intr_mask);
intr_mask.trig = 1;
REG_WR(timer, regi_timer, rw_intr_mask, intr_mask);
fast_timers_started++;
fast_timer_running = 1;
}
else
{
/* We have passed the time, disable trig point, ack intr */
trig_cfg.tmr = regk_timer_off;
REG_WR(timer, regi_timer, rw_trig_cfg, trig_cfg);
REG_WR(timer, regi_timer, rw_ack_intr, ack_intr);
/* call the int routine directly */
timer_trig_handler();
}
}
/* In version 1.4 this function takes 27 - 50 us */
void start_one_shot_timer(struct fast_timer *t,
fast_timer_function_type *function,
unsigned long data,
unsigned long delay_us,
const char *name)
{
unsigned long flags;
struct fast_timer *tmp;
D1(printk("sft %s %d us\n", name, delay_us));
local_irq_save(flags);
do_gettimeofday_fast(&t->tv_set);
tmp = fast_timer_list;
SANITYCHECK({ /* Check so this is not in the list already... */
while (tmp != NULL)
{
if (tmp == t)
{
printk("timer name: %s data: 0x%08lX already in list!\n", name, data);
sanity_failed++;
return;
}
else
{
tmp = tmp->next;
}
}
tmp = fast_timer_list;
});
t->delay_us = delay_us;
t->function = function;
t->data = data;
t->name = name;
t->tv_expires.tv_usec = t->tv_set.tv_usec + delay_us % 1000000;
t->tv_expires.tv_sec = t->tv_set.tv_sec + delay_us / 1000000;
if (t->tv_expires.tv_usec > 1000000)
{
t->tv_expires.tv_usec -= 1000000;
t->tv_expires.tv_sec++;
}
#ifdef FAST_TIMER_LOG
timer_added_log[fast_timers_added % NUM_TIMER_STATS] = *t;
#endif
fast_timers_added++;
/* Check if this should timeout before anything else */
if (tmp == NULL || timeval_cmp(&t->tv_expires, &tmp->tv_expires) < 0)
{
/* Put first in list and modify the timer value */
t->prev = NULL;
t->next = fast_timer_list;
if (fast_timer_list)
{
fast_timer_list->prev = t;
}
fast_timer_list = t;
#ifdef FAST_TIMER_LOG
timer_started_log[fast_timers_started % NUM_TIMER_STATS] = *t;
#endif
start_timer_trig(delay_us);
} else {
/* Put in correct place in list */
while (tmp->next &&
timeval_cmp(&t->tv_expires, &tmp->next->tv_expires) > 0)
{
tmp = tmp->next;
}
/* Insert t after tmp */
t->prev = tmp;
t->next = tmp->next;
if (tmp->next)
{
tmp->next->prev = t;
}
tmp->next = t;
}
D2(printk("start_one_shot_timer: %d us done\n", delay_us));
local_irq_restore(flags);
} /* start_one_shot_timer */
static inline int fast_timer_pending (const struct fast_timer * t)
{
return (t->next != NULL) || (t->prev != NULL) || (t == fast_timer_list);
}
static inline int detach_fast_timer (struct fast_timer *t)
{
struct fast_timer *next, *prev;
if (!fast_timer_pending(t))
return 0;
next = t->next;
prev = t->prev;
if (next)
next->prev = prev;
if (prev)
prev->next = next;
else
fast_timer_list = next;
fast_timers_deleted++;
return 1;
}
int del_fast_timer(struct fast_timer * t)
{
unsigned long flags;
int ret;
local_irq_save(flags);
ret = detach_fast_timer(t);
t->next = t->prev = NULL;
local_irq_restore(flags);
return ret;
} /* del_fast_timer */
/* Interrupt routines or functions called in interrupt context */
/* Timer interrupt handler for trig interrupts */
static irqreturn_t
timer_trig_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
reg_timer_r_masked_intr masked_intr;
/* Check if the timer interrupt is for us (a trig int) */
masked_intr = REG_RD(timer, regi_timer, r_masked_intr);
if (!masked_intr.trig)
return IRQ_NONE;
timer_trig_handler();
return IRQ_HANDLED;
}
static void timer_trig_handler(void)
{
reg_timer_rw_ack_intr ack_intr = { 0 };
reg_timer_rw_intr_mask intr_mask;
reg_timer_rw_trig_cfg trig_cfg = { 0 };
struct fast_timer *t;
unsigned long flags;
local_irq_save(flags);
/* Clear timer trig interrupt */
intr_mask = REG_RD(timer, regi_timer, rw_intr_mask);
intr_mask.trig = 0;
REG_WR(timer, regi_timer, rw_intr_mask, intr_mask);
/* First stop timer, then ack interrupt */
/* Stop timer */
trig_cfg.tmr = regk_timer_off;
REG_WR(timer, regi_timer, rw_trig_cfg, trig_cfg);
/* Ack interrupt */
ack_intr.trig = 1;
REG_WR(timer, regi_timer, rw_ack_intr, ack_intr);
fast_timer_running = 0;
fast_timer_ints++;
local_irq_restore(flags);
t = fast_timer_list;
while (t)
{
struct timeval tv;
/* Has it really expired? */
do_gettimeofday_fast(&tv);
D1(printk("t: %is %06ius\n", tv.tv_sec, tv.tv_usec));
if (timeval_cmp(&t->tv_expires, &tv) <= 0)
{
/* Yes it has expired */
#ifdef FAST_TIMER_LOG
timer_expired_log[fast_timers_expired % NUM_TIMER_STATS] = *t;
#endif
fast_timers_expired++;
/* Remove this timer before call, since it may reuse the timer */
local_irq_save(flags);
if (t->prev)
{
t->prev->next = t->next;
}
else
{
fast_timer_list = t->next;
}
if (t->next)
{
t->next->prev = t->prev;
}
t->prev = NULL;
t->next = NULL;
local_irq_restore(flags);
if (t->function != NULL)
{
t->function(t->data);
}
else
{
DEBUG_LOG("!trimertrig %i function==NULL!\n", fast_timer_ints);
}
}
else
{
/* Timer is to early, let's set it again using the normal routines */
D1(printk(".\n"));
}
local_irq_save(flags);
if ((t = fast_timer_list) != NULL)
{
/* Start next timer.. */
long us;
struct timeval tv;
do_gettimeofday_fast(&tv);
us = ((t->tv_expires.tv_sec - tv.tv_sec) * 1000000 +
t->tv_expires.tv_usec - tv.tv_usec);
if (us > 0)
{
if (!fast_timer_running)
{
#ifdef FAST_TIMER_LOG
timer_started_log[fast_timers_started % NUM_TIMER_STATS] = *t;
#endif
start_timer_trig(us);
}
local_irq_restore(flags);
break;
}
else
{
/* Timer already expired, let's handle it better late than never.
* The normal loop handles it
*/
D1(printk("e! %d\n", us));
}
}
local_irq_restore(flags);
}
if (!t)
{
D1(printk("ttrig stop!\n"));
}
}
static void wake_up_func(unsigned long data)
{
#ifdef DECLARE_WAITQUEUE
wait_queue_head_t *sleep_wait_p = (wait_queue_head_t*)data;
#else
struct wait_queue **sleep_wait_p = (struct wait_queue **)data;
#endif
wake_up(sleep_wait_p);
}
/* Useful API */
void schedule_usleep(unsigned long us)
{
struct fast_timer t;
#ifdef DECLARE_WAITQUEUE
wait_queue_head_t sleep_wait;
init_waitqueue_head(&sleep_wait);
{
DECLARE_WAITQUEUE(wait, current);
#else
struct wait_queue *sleep_wait = NULL;
struct wait_queue wait = { current, NULL };
#endif
D1(printk("schedule_usleep(%d)\n", us));
add_wait_queue(&sleep_wait, &wait);
set_current_state(TASK_INTERRUPTIBLE);
start_one_shot_timer(&t, wake_up_func, (unsigned long)&sleep_wait, us,
"usleep");
schedule();
set_current_state(TASK_RUNNING);
remove_wait_queue(&sleep_wait, &wait);
D1(printk("done schedule_usleep(%d)\n", us));
#ifdef DECLARE_WAITQUEUE
}
#endif
}
#ifdef CONFIG_PROC_FS
static int proc_fasttimer_read(char *buf, char **start, off_t offset, int len
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
,int *eof, void *data_unused
#else
,int unused
#endif
);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
static struct proc_dir_entry *fasttimer_proc_entry;
#else
static struct proc_dir_entry fasttimer_proc_entry =
{
0, 9, "fasttimer",
S_IFREG | S_IRUGO, 1, 0, 0,
0, NULL /* ops -- default to array */,
&proc_fasttimer_read /* get_info */,
};
#endif
#endif /* CONFIG_PROC_FS */
#ifdef CONFIG_PROC_FS
/* This value is very much based on testing */
#define BIG_BUF_SIZE (500 + NUM_TIMER_STATS * 300)
static int proc_fasttimer_read(char *buf, char **start, off_t offset, int len
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
,int *eof, void *data_unused
#else
,int unused
#endif
)
{
unsigned long flags;
int i = 0;
int num_to_show;
struct timeval tv;
struct fast_timer *t, *nextt;
static char *bigbuf = NULL;
static unsigned long used;
if (!bigbuf && !(bigbuf = vmalloc(BIG_BUF_SIZE)))
{
used = 0;
bigbuf[0] = '\0';
return 0;
}
if (!offset || !used)
{
do_gettimeofday_fast(&tv);
used = 0;
used += sprintf(bigbuf + used, "Fast timers added: %i\n",
fast_timers_added);
used += sprintf(bigbuf + used, "Fast timers started: %i\n",
fast_timers_started);
used += sprintf(bigbuf + used, "Fast timer interrupts: %i\n",
fast_timer_ints);
used += sprintf(bigbuf + used, "Fast timers expired: %i\n",
fast_timers_expired);
used += sprintf(bigbuf + used, "Fast timers deleted: %i\n",
fast_timers_deleted);
used += sprintf(bigbuf + used, "Fast timer running: %s\n",
fast_timer_running ? "yes" : "no");
used += sprintf(bigbuf + used, "Current time: %lu.%06lu\n",
(unsigned long)tv.tv_sec,
(unsigned long)tv.tv_usec);
#ifdef FAST_TIMER_SANITY_CHECKS
used += sprintf(bigbuf + used, "Sanity failed: %i\n",
sanity_failed);
#endif
used += sprintf(bigbuf + used, "\n");
#ifdef DEBUG_LOG_INCLUDED
{
int end_i = debug_log_cnt;
i = 0;
if (debug_log_cnt_wrapped)
{
i = debug_log_cnt;
}
while ((i != end_i || (debug_log_cnt_wrapped && !used)) &&
used+100 < BIG_BUF_SIZE)
{
used += sprintf(bigbuf + used, debug_log_string[i],
debug_log_value[i]);
i = (i+1) % DEBUG_LOG_MAX;
}
}
used += sprintf(bigbuf + used, "\n");
#endif
num_to_show = (fast_timers_started < NUM_TIMER_STATS ? fast_timers_started:
NUM_TIMER_STATS);
used += sprintf(bigbuf + used, "Timers started: %i\n", fast_timers_started);
for (i = 0; i < num_to_show && (used+100 < BIG_BUF_SIZE) ; i++)
{
int cur = (fast_timers_started - i - 1) % NUM_TIMER_STATS;
#if 1 //ndef FAST_TIMER_LOG
used += sprintf(bigbuf + used, "div: %i delay: %i"
"\n",
timer_div_settings[cur],
timer_delay_settings[cur]
);
#endif
#ifdef FAST_TIMER_LOG
t = &timer_started_log[cur];
used += sprintf(bigbuf + used, "%-14s s: %6lu.%06lu e: %6lu.%06lu "
"d: %6li us data: 0x%08lX"
"\n",
t->name,
(unsigned long)t->tv_set.tv_sec,
(unsigned long)t->tv_set.tv_usec,
(unsigned long)t->tv_expires.tv_sec,
(unsigned long)t->tv_expires.tv_usec,
t->delay_us,
t->data
);
#endif
}
used += sprintf(bigbuf + used, "\n");
#ifdef FAST_TIMER_LOG
num_to_show = (fast_timers_added < NUM_TIMER_STATS ? fast_timers_added:
NUM_TIMER_STATS);
used += sprintf(bigbuf + used, "Timers added: %i\n", fast_timers_added);
for (i = 0; i < num_to_show && (used+100 < BIG_BUF_SIZE); i++)
{
t = &timer_added_log[(fast_timers_added - i - 1) % NUM_TIMER_STATS];
used += sprintf(bigbuf + used, "%-14s s: %6lu.%06lu e: %6lu.%06lu "
"d: %6li us data: 0x%08lX"
"\n",
t->name,
(unsigned long)t->tv_set.tv_sec,
(unsigned long)t->tv_set.tv_usec,
(unsigned long)t->tv_expires.tv_sec,
(unsigned long)t->tv_expires.tv_usec,
t->delay_us,
t->data
);
}
used += sprintf(bigbuf + used, "\n");
num_to_show = (fast_timers_expired < NUM_TIMER_STATS ? fast_timers_expired:
NUM_TIMER_STATS);
used += sprintf(bigbuf + used, "Timers expired: %i\n", fast_timers_expired);
for (i = 0; i < num_to_show && (used+100 < BIG_BUF_SIZE); i++)
{
t = &timer_expired_log[(fast_timers_expired - i - 1) % NUM_TIMER_STATS];
used += sprintf(bigbuf + used, "%-14s s: %6lu.%06lu e: %6lu.%06lu "
"d: %6li us data: 0x%08lX"
"\n",
t->name,
(unsigned long)t->tv_set.tv_sec,
(unsigned long)t->tv_set.tv_usec,
(unsigned long)t->tv_expires.tv_sec,
(unsigned long)t->tv_expires.tv_usec,
t->delay_us,
t->data
);
}
used += sprintf(bigbuf + used, "\n");
#endif
used += sprintf(bigbuf + used, "Active timers:\n");
local_irq_save(flags);
local_irq_save(flags);
t = fast_timer_list;
while (t != NULL && (used+100 < BIG_BUF_SIZE))
{
nextt = t->next;
local_irq_restore(flags);
used += sprintf(bigbuf + used, "%-14s s: %6lu.%06lu e: %6lu.%06lu "
"d: %6li us data: 0x%08lX"
/* " func: 0x%08lX" */
"\n",
t->name,
(unsigned long)t->tv_set.tv_sec,
(unsigned long)t->tv_set.tv_usec,
(unsigned long)t->tv_expires.tv_sec,
(unsigned long)t->tv_expires.tv_usec,
t->delay_us,
t->data
/* , t->function */
);
local_irq_disable();
if (t->next != nextt)
{
printk("timer removed!\n");
}
t = nextt;
}
local_irq_restore(flags);
}
if (used - offset < len)
{
len = used - offset;
}
memcpy(buf, bigbuf + offset, len);
*start = buf;
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
*eof = 1;
#endif
return len;
}
#endif /* PROC_FS */
#ifdef FAST_TIMER_TEST
static volatile unsigned long i = 0;
static volatile int num_test_timeout = 0;
static struct fast_timer tr[10];
static int exp_num[10];
static struct timeval tv_exp[100];
static void test_timeout(unsigned long data)
{
do_gettimeofday_fast(&tv_exp[data]);
exp_num[data] = num_test_timeout;
num_test_timeout++;
}
static void test_timeout1(unsigned long data)
{
do_gettimeofday_fast(&tv_exp[data]);
exp_num[data] = num_test_timeout;
if (data < 7)
{
start_one_shot_timer(&tr[i], test_timeout1, i, 1000, "timeout1");
i++;
}
num_test_timeout++;
}
DP(
static char buf0[2000];
static char buf1[2000];
static char buf2[2000];
static char buf3[2000];
static char buf4[2000];
);
static char buf5[6000];
static int j_u[1000];
static void fast_timer_test(void)
{
int prev_num;
int j;
struct timeval tv, tv0, tv1, tv2;
printk("fast_timer_test() start\n");
do_gettimeofday_fast(&tv);
for (j = 0; j < 1000; j++)
{
j_u[j] = GET_JIFFIES_USEC();
}
for (j = 0; j < 100; j++)
{
do_gettimeofday_fast(&tv_exp[j]);
}
printk("fast_timer_test() %is %06i\n", tv.tv_sec, tv.tv_usec);
for (j = 0; j < 1000; j++)
{
printk("%i %i %i %i %i\n",j_u[j], j_u[j+1], j_u[j+2], j_u[j+3], j_u[j+4]);
j += 4;
}
for (j = 0; j < 100; j++)
{
printk("%i.%i %i.%i %i.%i %i.%i %i.%i\n",
tv_exp[j].tv_sec,tv_exp[j].tv_usec,
tv_exp[j+1].tv_sec,tv_exp[j+1].tv_usec,
tv_exp[j+2].tv_sec,tv_exp[j+2].tv_usec,
tv_exp[j+3].tv_sec,tv_exp[j+3].tv_usec,
tv_exp[j+4].tv_sec,tv_exp[j+4].tv_usec);
j += 4;
}
do_gettimeofday_fast(&tv0);
start_one_shot_timer(&tr[i], test_timeout, i, 50000, "test0");
DP(proc_fasttimer_read(buf0, NULL, 0, 0, 0));
i++;
start_one_shot_timer(&tr[i], test_timeout, i, 70000, "test1");
DP(proc_fasttimer_read(buf1, NULL, 0, 0, 0));
i++;
start_one_shot_timer(&tr[i], test_timeout, i, 40000, "test2");
DP(proc_fasttimer_read(buf2, NULL, 0, 0, 0));
i++;
start_one_shot_timer(&tr[i], test_timeout, i, 60000, "test3");
DP(proc_fasttimer_read(buf3, NULL, 0, 0, 0));
i++;
start_one_shot_timer(&tr[i], test_timeout1, i, 55000, "test4xx");
DP(proc_fasttimer_read(buf4, NULL, 0, 0, 0));
i++;
do_gettimeofday_fast(&tv1);
proc_fasttimer_read(buf5, NULL, 0, 0, 0);
prev_num = num_test_timeout;
while (num_test_timeout < i)
{
if (num_test_timeout != prev_num)
{
prev_num = num_test_timeout;
}
}
do_gettimeofday_fast(&tv2);
printk("Timers started %is %06i\n", tv0.tv_sec, tv0.tv_usec);
printk("Timers started at %is %06i\n", tv1.tv_sec, tv1.tv_usec);
printk("Timers done %is %06i\n", tv2.tv_sec, tv2.tv_usec);
DP(printk("buf0:\n");
printk(buf0);
printk("buf1:\n");
printk(buf1);
printk("buf2:\n");
printk(buf2);
printk("buf3:\n");
printk(buf3);
printk("buf4:\n");
printk(buf4);
);
printk("buf5:\n");
printk(buf5);
printk("timers set:\n");
for(j = 0; j<i; j++)
{
struct fast_timer *t = &tr[j];
printk("%-10s set: %6is %06ius exp: %6is %06ius "
"data: 0x%08X func: 0x%08X\n",
t->name,
t->tv_set.tv_sec,
t->tv_set.tv_usec,
t->tv_expires.tv_sec,
t->tv_expires.tv_usec,
t->data,
t->function
);
printk(" del: %6ius did exp: %6is %06ius as #%i error: %6li\n",
t->delay_us,
tv_exp[j].tv_sec,
tv_exp[j].tv_usec,
exp_num[j],
(tv_exp[j].tv_sec - t->tv_expires.tv_sec)*1000000 + tv_exp[j].tv_usec - t->tv_expires.tv_usec);
}
proc_fasttimer_read(buf5, NULL, 0, 0, 0);
printk("buf5 after all done:\n");
printk(buf5);
printk("fast_timer_test() done\n");
}
#endif
void fast_timer_init(void)
{
/* For some reason, request_irq() hangs when called froom time_init() */
if (!fast_timer_is_init)
{
printk("fast_timer_init()\n");
#ifdef CONFIG_PROC_FS
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,2,0)
if ((fasttimer_proc_entry = create_proc_entry( "fasttimer", 0, 0 )))
fasttimer_proc_entry->read_proc = proc_fasttimer_read;
#else
proc_register_dynamic(&proc_root, &fasttimer_proc_entry);
#endif
#endif /* PROC_FS */
if(request_irq(TIMER_INTR_VECT, timer_trig_interrupt, SA_INTERRUPT,
"fast timer int", NULL))
{
printk("err: timer1 irq\n");
}
fast_timer_is_init = 1;
#ifdef FAST_TIMER_TEST
printk("do test\n");
fast_timer_test();
#endif
}
}

View file

@ -0,0 +1,448 @@
/*
* CRISv32 kernel startup code.
*
* Copyright (C) 2003, Axis Communications AB
*/
#include <linux/config.h>
#define ASSEMBLER_MACROS_ONLY
/*
* The macros found in mmu_defs_asm.h uses the ## concatenation operator, so
* -traditional must not be used when assembling this file.
*/
#include <asm/arch/hwregs/reg_rdwr.h>
#include <asm/arch/hwregs/asm/mmu_defs_asm.h>
#include <asm/arch/hwregs/asm/reg_map_asm.h>
#include <asm/arch/hwregs/asm/config_defs_asm.h>
#include <asm/arch/hwregs/asm/bif_core_defs_asm.h>
#define CRAMFS_MAGIC 0x28cd3d45
#define RAM_INIT_MAGIC 0x56902387
#define COMMAND_LINE_MAGIC 0x87109563
;; NOTE: R8 and R9 carry information from the decompressor (if the
;; kernel was compressed). They must not be used in the code below
;; until they are read!
;; Exported symbols.
.global etrax_irv
.global romfs_start
.global romfs_length
.global romfs_in_flash
.global swapper_pg_dir
.global crisv32_nand_boot
.global crisv32_nand_cramfs_offset
;; Dummy section to make it bootable with current VCS simulator
#ifdef CONFIG_ETRAXFS_SIM
.section ".boot", "ax"
ba tstart
nop
#endif
.text
tstart:
;; This is the entry point of the kernel. The CPU is currently in
;; supervisor mode.
;;
;; 0x00000000 if flash.
;; 0x40004000 if DRAM.
;;
di
;; Start clocks for used blocks.
move.d REG_ADDR(config, regi_config, rw_clk_ctrl), $r1
move.d [$r1], $r0
or.d REG_STATE(config, rw_clk_ctrl, cpu, yes) | \
REG_STATE(config, rw_clk_ctrl, bif, yes) | \
REG_STATE(config, rw_clk_ctrl, fix_io, yes), $r0
move.d $r0, [$r1]
;; Set up waitstates etc
move.d REG_ADDR(bif_core, regi_bif_core, rw_grp1_cfg), $r0
move.d CONFIG_ETRAX_MEM_GRP1_CONFIG, $r1
move.d $r1, [$r0]
move.d REG_ADDR(bif_core, regi_bif_core, rw_grp2_cfg), $r0
move.d CONFIG_ETRAX_MEM_GRP2_CONFIG, $r1
move.d $r1, [$r0]
move.d REG_ADDR(bif_core, regi_bif_core, rw_grp3_cfg), $r0
move.d CONFIG_ETRAX_MEM_GRP3_CONFIG, $r1
move.d $r1, [$r0]
move.d REG_ADDR(bif_core, regi_bif_core, rw_grp4_cfg), $r0
move.d CONFIG_ETRAX_MEM_GRP4_CONFIG, $r1
move.d $r1, [$r0]
#ifdef CONFIG_ETRAXFS_SIM
;; Set up minimal flash waitstates
move.d 0, $r10
move.d REG_ADDR(bif_core, regi_bif_core, rw_grp1_cfg), $r11
move.d $r10, [$r11]
#endif
;; Setup and enable the MMU. Use same configuration for both the data
;; and the instruction MMU.
;;
;; Note; 3 cycles is needed for a bank-select to take effect. Further;
;; bank 1 is the instruction MMU, bank 2 is the data MMU.
#ifndef CONFIG_ETRAXFS_SIM
move.d REG_FIELD(mmu, rw_mm_kbase_hi, base_e, 8) \
| REG_FIELD(mmu, rw_mm_kbase_hi, base_c, 4) \
| REG_FIELD(mmu, rw_mm_kbase_hi, base_b, 0xb), $r0
#else
;; Map the virtual DRAM to the RW eprom area at address 0.
;; Also map 0xa for the hook calls,
move.d REG_FIELD(mmu, rw_mm_kbase_hi, base_e, 8) \
| REG_FIELD(mmu, rw_mm_kbase_hi, base_c, 0) \
| REG_FIELD(mmu, rw_mm_kbase_hi, base_b, 0xb) \
| REG_FIELD(mmu, rw_mm_kbase_hi, base_a, 0xa), $r0
#endif
;; Temporary map of 0x40 -> 0x40 and 0x00 -> 0x00.
move.d REG_FIELD(mmu, rw_mm_kbase_lo, base_4, 4) \
| REG_FIELD(mmu, rw_mm_kbase_lo, base_0, 0), $r1
;; Enable certain page protections and setup linear mapping
;; for f,e,c,b,4,0.
#ifndef CONFIG_ETRAXFS_SIM
move.d REG_STATE(mmu, rw_mm_cfg, we, on) \
| REG_STATE(mmu, rw_mm_cfg, acc, on) \
| REG_STATE(mmu, rw_mm_cfg, ex, on) \
| REG_STATE(mmu, rw_mm_cfg, inv, on) \
| REG_STATE(mmu, rw_mm_cfg, seg_f, linear) \
| REG_STATE(mmu, rw_mm_cfg, seg_e, linear) \
| REG_STATE(mmu, rw_mm_cfg, seg_d, page) \
| REG_STATE(mmu, rw_mm_cfg, seg_c, linear) \
| REG_STATE(mmu, rw_mm_cfg, seg_b, linear) \
| REG_STATE(mmu, rw_mm_cfg, seg_a, page) \
| REG_STATE(mmu, rw_mm_cfg, seg_9, page) \
| REG_STATE(mmu, rw_mm_cfg, seg_8, page) \
| REG_STATE(mmu, rw_mm_cfg, seg_7, page) \
| REG_STATE(mmu, rw_mm_cfg, seg_6, page) \
| REG_STATE(mmu, rw_mm_cfg, seg_5, page) \
| REG_STATE(mmu, rw_mm_cfg, seg_4, linear) \
| REG_STATE(mmu, rw_mm_cfg, seg_3, page) \
| REG_STATE(mmu, rw_mm_cfg, seg_2, page) \
| REG_STATE(mmu, rw_mm_cfg, seg_1, page) \
| REG_STATE(mmu, rw_mm_cfg, seg_0, linear), $r2
#else
move.d REG_STATE(mmu, rw_mm_cfg, we, on) \
| REG_STATE(mmu, rw_mm_cfg, acc, on) \
| REG_STATE(mmu, rw_mm_cfg, ex, on) \
| REG_STATE(mmu, rw_mm_cfg, inv, on) \
| REG_STATE(mmu, rw_mm_cfg, seg_f, linear) \
| REG_STATE(mmu, rw_mm_cfg, seg_e, linear) \
| REG_STATE(mmu, rw_mm_cfg, seg_d, page) \
| REG_STATE(mmu, rw_mm_cfg, seg_c, linear) \
| REG_STATE(mmu, rw_mm_cfg, seg_b, linear) \
| REG_STATE(mmu, rw_mm_cfg, seg_a, linear) \
| REG_STATE(mmu, rw_mm_cfg, seg_9, page) \
| REG_STATE(mmu, rw_mm_cfg, seg_8, page) \
| REG_STATE(mmu, rw_mm_cfg, seg_7, page) \
| REG_STATE(mmu, rw_mm_cfg, seg_6, page) \
| REG_STATE(mmu, rw_mm_cfg, seg_5, page) \
| REG_STATE(mmu, rw_mm_cfg, seg_4, linear) \
| REG_STATE(mmu, rw_mm_cfg, seg_3, page) \
| REG_STATE(mmu, rw_mm_cfg, seg_2, page) \
| REG_STATE(mmu, rw_mm_cfg, seg_1, page) \
| REG_STATE(mmu, rw_mm_cfg, seg_0, linear), $r2
#endif
;; Update instruction MMU.
move 1, $srs
nop
nop
nop
move $r0, $s2 ; kbase_hi.
move $r1, $s1 ; kbase_lo.
move $r2, $s0 ; mm_cfg, virtual memory configuration.
;; Update data MMU.
move 2, $srs
nop
nop
nop
move $r0, $s2 ; kbase_hi.
move $r1, $s1 ; kbase_lo
move $r2, $s0 ; mm_cfg, virtual memory configuration.
;; Enable data and instruction MMU.
move 0, $srs
moveq 0xf, $r0 ; IMMU, DMMU, DCache, Icache on
nop
nop
nop
move $r0, $s0
nop
nop
nop
#ifdef CONFIG_SMP
;; Read CPU ID
move 0, $srs
nop
nop
nop
move $s10, $r0
cmpq 0, $r0
beq master_cpu
nop
slave_cpu:
; A slave waits for cpu_now_booting to be equal to CPU ID.
move.d cpu_now_booting, $r1
slave_wait:
cmp.d [$r1], $r0
bne slave_wait
nop
; Time to boot-up. Get stack location provided by master CPU.
move.d smp_init_current_idle_thread, $r1
move.d [$r1], $sp
add.d 8192, $sp
move.d ebp_start, $r0 ; Defined in linker-script.
move $r0, $ebp
jsr smp_callin
nop
master_cpu:
#endif
#ifndef CONFIG_ETRAXFS_SIM
;; Check if starting from DRAM or flash.
lapcq ., $r0
and.d 0x7fffffff, $r0 ; Mask off the non-cache bit.
cmp.d 0x10000, $r0 ; Arbitrary, something above this code.
blo _inflash0
nop
#endif
jump _inram ; Jump to cached RAM.
nop
;; Jumpgate.
_inflash0:
jump _inflash
nop
;; Put the following in a section so that storage for it can be
;; reclaimed after init is finished.
.section ".init.text", "ax"
_inflash:
;; Initialize DRAM.
cmp.d RAM_INIT_MAGIC, $r8 ; Already initialized?
beq _dram_initialized
nop
#include "../lib/dram_init.S"
_dram_initialized:
;; Copy the text and data section to DRAM. This depends on that the
;; variables used below are correctly set up by the linker script.
;; The calculated value stored in R4 is used below.
moveq 0, $r0 ; Source.
move.d text_start, $r1 ; Destination.
move.d __vmlinux_end, $r2
move.d $r2, $r4
sub.d $r1, $r4
1: move.w [$r0+], $r3
move.w $r3, [$r1+]
cmp.d $r2, $r1
blo 1b
nop
;; Keep CRAMFS in flash.
moveq 0, $r0
move.d romfs_length, $r1
move.d $r0, [$r1]
move.d [$r4], $r0 ; cramfs_super.magic
cmp.d CRAMFS_MAGIC, $r0
bne 1f
nop
addoq +4, $r4, $acr
move.d [$acr], $r0
move.d romfs_length, $r1
move.d $r0, [$r1]
add.d 0xf0000000, $r4 ; Add cached flash start in virtual memory.
move.d romfs_start, $r1
move.d $r4, [$r1]
1: moveq 1, $r0
move.d romfs_in_flash, $r1
move.d $r0, [$r1]
jump _start_it ; Jump to cached code.
nop
_inram:
;; Check if booting from NAND flash (in that case we just remember the offset
;; into the flash where cramfs should be).
move.d REG_ADDR(config, regi_config, r_bootsel), $r0
move.d [$r0], $r0
and.d REG_MASK(config, r_bootsel, boot_mode), $r0
cmp.d REG_STATE(config, r_bootsel, boot_mode, nand), $r0
bne move_cramfs
moveq 1,$r0
move.d crisv32_nand_boot, $r1
move.d $r0, [$r1]
move.d crisv32_nand_cramfs_offset, $r1
move.d $r9, [$r1]
moveq 1, $r0
move.d romfs_in_flash, $r1
move.d $r0, [$r1]
jump _start_it
nop
move_cramfs:
;; Move the cramfs after BSS.
moveq 0, $r0
move.d romfs_length, $r1
move.d $r0, [$r1]
#ifndef CONFIG_ETRAXFS_SIM
;; The kernel could have been unpacked to DRAM by the loader, but
;; the cramfs image could still be inte the flash immediately
;; following the compressed kernel image. The loaded passes the address
;; of the bute succeeding the last compressed byte in the flash in
;; register R9 when starting the kernel.
cmp.d 0x0ffffff8, $r9
bhs _no_romfs_in_flash ; R9 points outside the flash area.
nop
#else
ba _no_romfs_in_flash
nop
#endif
move.d [$r9], $r0 ; cramfs_super.magic
cmp.d CRAMFS_MAGIC, $r0
bne _no_romfs_in_flash
nop
addoq +4, $r9, $acr
move.d [$acr], $r0
move.d romfs_length, $r1
move.d $r0, [$r1]
add.d 0xf0000000, $r9 ; Add cached flash start in virtual memory.
move.d romfs_start, $r1
move.d $r9, [$r1]
moveq 1, $r0
move.d romfs_in_flash, $r1
move.d $r0, [$r1]
jump _start_it ; Jump to cached code.
nop
_no_romfs_in_flash:
;; Look for cramfs.
#ifndef CONFIG_ETRAXFS_SIM
move.d __vmlinux_end, $r0
#else
move.d __end, $r0
#endif
move.d [$r0], $r1
cmp.d CRAMFS_MAGIC, $r1
bne 2f
nop
addoq +4, $r0, $acr
move.d [$acr], $r2
move.d _end, $r1
move.d romfs_start, $r3
move.d $r1, [$r3]
move.d romfs_length, $r3
move.d $r2, [$r3]
#ifndef CONFIG_ETRAXFS_SIM
add.d $r2, $r0
add.d $r2, $r1
lsrq 1, $r2 ; Size is in bytes, we copy words.
addq 1, $r2
1:
move.w [$r0], $r3
move.w $r3, [$r1]
subq 2, $r0
subq 2, $r1
subq 1, $r2
bne 1b
nop
#endif
2:
moveq 0, $r0
move.d romfs_in_flash, $r1
move.d $r0, [$r1]
jump _start_it ; Jump to cached code.
nop
_start_it:
;; Check if kernel command line is supplied
cmp.d COMMAND_LINE_MAGIC, $r10
bne no_command_line
nop
move.d 256, $r13
move.d cris_command_line, $r10
or.d 0x80000000, $r11 ; Make it virtual
1:
move.b [$r11+], $r12
move.b $r12, [$r10+]
subq 1, $r13
bne 1b
nop
no_command_line:
;; The kernel stack contains a task structure for each task. This
;; the initial kernel stack is in the same page as the init_task,
;; but starts at the top of the page, i.e. + 8192 bytes.
move.d init_thread_union + 8192, $sp
move.d ebp_start, $r0 ; Defined in linker-script.
move $r0, $ebp
move.d etrax_irv, $r1 ; Set the exception base register and pointer.
move.d $r0, [$r1]
#ifndef CONFIG_ETRAXFS_SIM
;; Clear the BSS region from _bss_start to _end.
move.d __bss_start, $r0
move.d _end, $r1
1: clear.d [$r0+]
cmp.d $r1, $r0
blo 1b
nop
#endif
#ifdef CONFIG_ETRAXFS_SIM
/* Set the watchdog timeout to something big. Will be removed when */
/* watchdog can be disabled with command line option */
move.d 0x7fffffff, $r10
jsr CPU_WATCHDOG_TIMEOUT
nop
#endif
; Initialize registers to increase determinism
move.d __bss_start, $r0
movem [$r0], $r13
jump start_kernel ; Jump to start_kernel() in init/main.c.
nop
.data
etrax_irv:
.dword 0
romfs_start:
.dword 0
romfs_length:
.dword 0
romfs_in_flash:
.dword 0
crisv32_nand_boot:
.dword 0
crisv32_nand_cramfs_offset:
.dword 0
swapper_pg_dir = 0xc0002000
.section ".init.data", "aw"
#include "../lib/hw_settings.S"

View file

@ -0,0 +1,154 @@
/*
* Helper functions for I/O pins.
*
* Copyright (c) 2004 Axis Communications AB.
*/
#include <linux/config.h>
#include <linux/types.h>
#include <linux/errno.h>
#include <linux/init.h>
#include <linux/string.h>
#include <linux/ctype.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <asm/io.h>
#include <asm/arch/pinmux.h>
#include <asm/arch/hwregs/gio_defs.h>
struct crisv32_ioport crisv32_ioports[] =
{
{
(unsigned long*)REG_ADDR(gio, regi_gio, rw_pa_oe),
(unsigned long*)REG_ADDR(gio, regi_gio, rw_pa_dout),
(unsigned long*)REG_ADDR(gio, regi_gio, r_pa_din),
8
},
{
(unsigned long*)REG_ADDR(gio, regi_gio, rw_pb_oe),
(unsigned long*)REG_ADDR(gio, regi_gio, rw_pb_dout),
(unsigned long*)REG_ADDR(gio, regi_gio, r_pb_din),
18
},
{
(unsigned long*)REG_ADDR(gio, regi_gio, rw_pc_oe),
(unsigned long*)REG_ADDR(gio, regi_gio, rw_pc_dout),
(unsigned long*)REG_ADDR(gio, regi_gio, r_pc_din),
18
},
{
(unsigned long*)REG_ADDR(gio, regi_gio, rw_pd_oe),
(unsigned long*)REG_ADDR(gio, regi_gio, rw_pd_dout),
(unsigned long*)REG_ADDR(gio, regi_gio, r_pd_din),
18
},
{
(unsigned long*)REG_ADDR(gio, regi_gio, rw_pe_oe),
(unsigned long*)REG_ADDR(gio, regi_gio, rw_pe_dout),
(unsigned long*)REG_ADDR(gio, regi_gio, r_pe_din),
18
}
};
#define NBR_OF_PORTS sizeof(crisv32_ioports)/sizeof(struct crisv32_ioport)
struct crisv32_iopin crisv32_led1_green;
struct crisv32_iopin crisv32_led1_red;
struct crisv32_iopin crisv32_led2_green;
struct crisv32_iopin crisv32_led2_red;
struct crisv32_iopin crisv32_led3_green;
struct crisv32_iopin crisv32_led3_red;
/* Dummy port used when green LED and red LED is on the same bit */
static unsigned long io_dummy;
static struct crisv32_ioport dummy_port =
{
&io_dummy,
&io_dummy,
&io_dummy,
18
};
static struct crisv32_iopin dummy_led =
{
&dummy_port,
0
};
static int __init crisv32_io_init(void)
{
int ret = 0;
/* Initialize LEDs */
ret += crisv32_io_get_name(&crisv32_led1_green, CONFIG_ETRAX_LED1G);
ret += crisv32_io_get_name(&crisv32_led1_red, CONFIG_ETRAX_LED1R);
ret += crisv32_io_get_name(&crisv32_led2_green, CONFIG_ETRAX_LED2G);
ret += crisv32_io_get_name(&crisv32_led2_red, CONFIG_ETRAX_LED2R);
ret += crisv32_io_get_name(&crisv32_led3_green, CONFIG_ETRAX_LED3G);
ret += crisv32_io_get_name(&crisv32_led3_red, CONFIG_ETRAX_LED3R);
crisv32_io_set_dir(&crisv32_led1_green, crisv32_io_dir_out);
crisv32_io_set_dir(&crisv32_led1_red, crisv32_io_dir_out);
crisv32_io_set_dir(&crisv32_led2_green, crisv32_io_dir_out);
crisv32_io_set_dir(&crisv32_led2_red, crisv32_io_dir_out);
crisv32_io_set_dir(&crisv32_led3_green, crisv32_io_dir_out);
crisv32_io_set_dir(&crisv32_led3_red, crisv32_io_dir_out);
if (!strcmp(CONFIG_ETRAX_LED1G, CONFIG_ETRAX_LED1R))
crisv32_led1_red = dummy_led;
if (!strcmp(CONFIG_ETRAX_LED2G, CONFIG_ETRAX_LED2R))
crisv32_led2_red = dummy_led;
return ret;
}
__initcall(crisv32_io_init);
int crisv32_io_get(struct crisv32_iopin* iopin,
unsigned int port, unsigned int pin)
{
if (port > NBR_OF_PORTS)
return -EINVAL;
if (port > crisv32_ioports[port].pin_count)
return -EINVAL;
iopin->bit = 1 << pin;
iopin->port = &crisv32_ioports[port];
if (crisv32_pinmux_alloc(port, pin, pin, pinmux_gpio))
return -EIO;
return 0;
}
int crisv32_io_get_name(struct crisv32_iopin* iopin,
char* name)
{
int port;
int pin;
if (toupper(*name) == 'P')
name++;
if (toupper(*name) < 'A' || toupper(*name) > 'E')
return -EINVAL;
port = toupper(*name) - 'A';
name++;
pin = simple_strtoul(name, NULL, 10);
if (pin < 0 || pin > crisv32_ioports[port].pin_count)
return -EINVAL;
iopin->bit = 1 << pin;
iopin->port = &crisv32_ioports[port];
if (crisv32_pinmux_alloc(port, pin, pin, pinmux_gpio))
return -EIO;
return 0;
}
#ifdef CONFIG_PCI
/* PCI I/O access stuff */
struct cris_io_operations* cris_iops = NULL;
EXPORT_SYMBOL(cris_iops);
#endif

View file

@ -0,0 +1,413 @@
/*
* Copyright (C) 2003, Axis Communications AB.
*/
#include <asm/irq.h>
#include <linux/irq.h>
#include <linux/interrupt.h>
#include <linux/smp.h>
#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/errno.h>
#include <linux/init.h>
#include <linux/profile.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/threads.h>
#include <linux/spinlock.h>
#include <linux/kernel_stat.h>
#include <asm/arch/hwregs/reg_map.h>
#include <asm/arch/hwregs/reg_rdwr.h>
#include <asm/arch/hwregs/intr_vect.h>
#include <asm/arch/hwregs/intr_vect_defs.h>
#define CPU_FIXED -1
/* IRQ masks (refer to comment for crisv32_do_multiple) */
#define TIMER_MASK (1 << (TIMER_INTR_VECT - FIRST_IRQ))
#ifdef CONFIG_ETRAX_KGDB
#if defined(CONFIG_ETRAX_KGDB_PORT0)
#define IGNOREMASK (1 << (SER0_INTR_VECT - FIRST_IRQ))
#elif defined(CONFIG_ETRAX_KGDB_PORT1)
#define IGNOREMASK (1 << (SER1_INTR_VECT - FIRST_IRQ))
#elif defined(CONFIG_ETRAX_KGB_PORT2)
#define IGNOREMASK (1 << (SER2_INTR_VECT - FIRST_IRQ))
#elif defined(CONFIG_ETRAX_KGDB_PORT3)
#define IGNOREMASK (1 << (SER3_INTR_VECT - FIRST_IRQ))
#endif
#endif
DEFINE_SPINLOCK(irq_lock);
struct cris_irq_allocation
{
int cpu; /* The CPU to which the IRQ is currently allocated. */
cpumask_t mask; /* The CPUs to which the IRQ may be allocated. */
};
struct cris_irq_allocation irq_allocations[NR_IRQS] =
{[0 ... NR_IRQS - 1] = {0, CPU_MASK_ALL}};
static unsigned long irq_regs[NR_CPUS] =
{
regi_irq,
#ifdef CONFIG_SMP
regi_irq2,
#endif
};
unsigned long cpu_irq_counters[NR_CPUS];
unsigned long irq_counters[NR_REAL_IRQS];
/* From irq.c. */
extern void weird_irq(void);
/* From entry.S. */
extern void system_call(void);
extern void nmi_interrupt(void);
extern void multiple_interrupt(void);
extern void gdb_handle_exception(void);
extern void i_mmu_refill(void);
extern void i_mmu_invalid(void);
extern void i_mmu_access(void);
extern void i_mmu_execute(void);
extern void d_mmu_refill(void);
extern void d_mmu_invalid(void);
extern void d_mmu_access(void);
extern void d_mmu_write(void);
/* From kgdb.c. */
extern void kgdb_init(void);
extern void breakpoint(void);
/*
* Build the IRQ handler stubs using macros from irq.h. First argument is the
* IRQ number, the second argument is the corresponding bit in
* intr_rw_vect_mask found in asm/arch/hwregs/intr_vect_defs.h.
*/
BUILD_IRQ(0x31, (1 << 0)) /* memarb */
BUILD_IRQ(0x32, (1 << 1)) /* gen_io */
BUILD_IRQ(0x33, (1 << 2)) /* iop0 */
BUILD_IRQ(0x34, (1 << 3)) /* iop1 */
BUILD_IRQ(0x35, (1 << 4)) /* iop2 */
BUILD_IRQ(0x36, (1 << 5)) /* iop3 */
BUILD_IRQ(0x37, (1 << 6)) /* dma0 */
BUILD_IRQ(0x38, (1 << 7)) /* dma1 */
BUILD_IRQ(0x39, (1 << 8)) /* dma2 */
BUILD_IRQ(0x3a, (1 << 9)) /* dma3 */
BUILD_IRQ(0x3b, (1 << 10)) /* dma4 */
BUILD_IRQ(0x3c, (1 << 11)) /* dma5 */
BUILD_IRQ(0x3d, (1 << 12)) /* dma6 */
BUILD_IRQ(0x3e, (1 << 13)) /* dma7 */
BUILD_IRQ(0x3f, (1 << 14)) /* dma8 */
BUILD_IRQ(0x40, (1 << 15)) /* dma9 */
BUILD_IRQ(0x41, (1 << 16)) /* ata */
BUILD_IRQ(0x42, (1 << 17)) /* sser0 */
BUILD_IRQ(0x43, (1 << 18)) /* sser1 */
BUILD_IRQ(0x44, (1 << 19)) /* ser0 */
BUILD_IRQ(0x45, (1 << 20)) /* ser1 */
BUILD_IRQ(0x46, (1 << 21)) /* ser2 */
BUILD_IRQ(0x47, (1 << 22)) /* ser3 */
BUILD_IRQ(0x48, (1 << 23))
BUILD_IRQ(0x49, (1 << 24)) /* eth0 */
BUILD_IRQ(0x4a, (1 << 25)) /* eth1 */
BUILD_TIMER_IRQ(0x4b, (1 << 26))/* timer */
BUILD_IRQ(0x4c, (1 << 27)) /* bif_arb */
BUILD_IRQ(0x4d, (1 << 28)) /* bif_dma */
BUILD_IRQ(0x4e, (1 << 29)) /* ext */
BUILD_IRQ(0x4f, (1 << 29)) /* ipi */
/* Pointers to the low-level handlers. */
static void (*interrupt[NR_IRQS])(void) = {
IRQ0x31_interrupt, IRQ0x32_interrupt, IRQ0x33_interrupt,
IRQ0x34_interrupt, IRQ0x35_interrupt, IRQ0x36_interrupt,
IRQ0x37_interrupt, IRQ0x38_interrupt, IRQ0x39_interrupt,
IRQ0x3a_interrupt, IRQ0x3b_interrupt, IRQ0x3c_interrupt,
IRQ0x3d_interrupt, IRQ0x3e_interrupt, IRQ0x3f_interrupt,
IRQ0x40_interrupt, IRQ0x41_interrupt, IRQ0x42_interrupt,
IRQ0x43_interrupt, IRQ0x44_interrupt, IRQ0x45_interrupt,
IRQ0x46_interrupt, IRQ0x47_interrupt, IRQ0x48_interrupt,
IRQ0x49_interrupt, IRQ0x4a_interrupt, IRQ0x4b_interrupt,
IRQ0x4c_interrupt, IRQ0x4d_interrupt, IRQ0x4e_interrupt,
IRQ0x4f_interrupt
};
void
block_irq(int irq, int cpu)
{
int intr_mask;
unsigned long flags;
spin_lock_irqsave(&irq_lock, flags);
intr_mask = REG_RD_INT(intr_vect, irq_regs[cpu], rw_mask);
/* Remember; 1 let thru, 0 block. */
intr_mask &= ~(1 << (irq - FIRST_IRQ));
REG_WR_INT(intr_vect, irq_regs[cpu], rw_mask, intr_mask);
spin_unlock_irqrestore(&irq_lock, flags);
}
void
unblock_irq(int irq, int cpu)
{
int intr_mask;
unsigned long flags;
spin_lock_irqsave(&irq_lock, flags);
intr_mask = REG_RD_INT(intr_vect, irq_regs[cpu], rw_mask);
/* Remember; 1 let thru, 0 block. */
intr_mask |= (1 << (irq - FIRST_IRQ));
REG_WR_INT(intr_vect, irq_regs[cpu], rw_mask, intr_mask);
spin_unlock_irqrestore(&irq_lock, flags);
}
/* Find out which CPU the irq should be allocated to. */
static int irq_cpu(int irq)
{
int cpu;
unsigned long flags;
spin_lock_irqsave(&irq_lock, flags);
cpu = irq_allocations[irq - FIRST_IRQ].cpu;
/* Fixed interrupts stay on the local CPU. */
if (cpu == CPU_FIXED)
{
spin_unlock_irqrestore(&irq_lock, flags);
return smp_processor_id();
}
/* Let the interrupt stay if possible */
if (cpu_isset(cpu, irq_allocations[irq - FIRST_IRQ].mask))
goto out;
/* IRQ must be moved to another CPU. */
cpu = first_cpu(irq_allocations[irq - FIRST_IRQ].mask);
irq_allocations[irq - FIRST_IRQ].cpu = cpu;
out:
spin_unlock_irqrestore(&irq_lock, flags);
return cpu;
}
void
mask_irq(int irq)
{
int cpu;
for (cpu = 0; cpu < NR_CPUS; cpu++)
block_irq(irq, cpu);
}
void
unmask_irq(int irq)
{
unblock_irq(irq, irq_cpu(irq));
}
static unsigned int startup_crisv32_irq(unsigned int irq)
{
unmask_irq(irq);
return 0;
}
static void shutdown_crisv32_irq(unsigned int irq)
{
mask_irq(irq);
}
static void enable_crisv32_irq(unsigned int irq)
{
unmask_irq(irq);
}
static void disable_crisv32_irq(unsigned int irq)
{
mask_irq(irq);
}
static void ack_crisv32_irq(unsigned int irq)
{
}
static void end_crisv32_irq(unsigned int irq)
{
}
void set_affinity_crisv32_irq(unsigned int irq, cpumask_t dest)
{
unsigned long flags;
spin_lock_irqsave(&irq_lock, flags);
irq_allocations[irq - FIRST_IRQ].mask = dest;
spin_unlock_irqrestore(&irq_lock, flags);
}
static struct hw_interrupt_type crisv32_irq_type = {
.typename = "CRISv32",
.startup = startup_crisv32_irq,
.shutdown = shutdown_crisv32_irq,
.enable = enable_crisv32_irq,
.disable = disable_crisv32_irq,
.ack = ack_crisv32_irq,
.end = end_crisv32_irq,
.set_affinity = set_affinity_crisv32_irq
};
void
set_exception_vector(int n, irqvectptr addr)
{
etrax_irv->v[n] = (irqvectptr) addr;
}
extern void do_IRQ(int irq, struct pt_regs * regs);
void
crisv32_do_IRQ(int irq, int block, struct pt_regs* regs)
{
/* Interrupts that may not be moved to another CPU and
* are SA_INTERRUPT may skip blocking. This is currently
* only valid for the timer IRQ and the IPI and is used
* for the timer interrupt to avoid watchdog starvation.
*/
if (!block) {
do_IRQ(irq, regs);
return;
}
block_irq(irq, smp_processor_id());
do_IRQ(irq, regs);
unblock_irq(irq, irq_cpu(irq));
}
/* If multiple interrupts occur simultaneously we get a multiple
* interrupt from the CPU and software has to sort out which
* interrupts that happened. There are two special cases here:
*
* 1. Timer interrupts may never be blocked because of the
* watchdog (refer to comment in include/asr/arch/irq.h)
* 2. GDB serial port IRQs are unhandled here and will be handled
* as a single IRQ when it strikes again because the GDB
* stubb wants to save the registers in its own fashion.
*/
void
crisv32_do_multiple(struct pt_regs* regs)
{
int cpu;
int mask;
int masked;
int bit;
cpu = smp_processor_id();
/* An extra irq_enter here to prevent softIRQs to run after
* each do_IRQ. This will decrease the interrupt latency.
*/
irq_enter();
/* Get which IRQs that happend. */
masked = REG_RD_INT(intr_vect, irq_regs[cpu], r_masked_vect);
/* Calculate new IRQ mask with these IRQs disabled. */
mask = REG_RD_INT(intr_vect, irq_regs[cpu], rw_mask);
mask &= ~masked;
/* Timer IRQ is never masked */
if (masked & TIMER_MASK)
mask |= TIMER_MASK;
/* Block all the IRQs */
REG_WR_INT(intr_vect, irq_regs[cpu], rw_mask, mask);
/* Check for timer IRQ and handle it special. */
if (masked & TIMER_MASK) {
masked &= ~TIMER_MASK;
do_IRQ(TIMER_INTR_VECT, regs);
}
#ifdef IGNORE_MASK
/* Remove IRQs that can't be handled as multiple. */
masked &= ~IGNORE_MASK;
#endif
/* Handle the rest of the IRQs. */
for (bit = 0; bit < 32; bit++)
{
if (masked & (1 << bit))
do_IRQ(bit + FIRST_IRQ, regs);
}
/* Unblock all the IRQs. */
mask = REG_RD_INT(intr_vect, irq_regs[cpu], rw_mask);
mask |= masked;
REG_WR_INT(intr_vect, irq_regs[cpu], rw_mask, mask);
/* This irq_exit() will trigger the soft IRQs. */
irq_exit();
}
/*
* This is called by start_kernel. It fixes the IRQ masks and setup the
* interrupt vector table to point to bad_interrupt pointers.
*/
void __init
init_IRQ(void)
{
int i;
int j;
reg_intr_vect_rw_mask vect_mask = {0};
/* Clear all interrupts masks. */
REG_WR(intr_vect, regi_irq, rw_mask, vect_mask);
for (i = 0; i < 256; i++)
etrax_irv->v[i] = weird_irq;
/* Point all IRQ's to bad handlers. */
for (i = FIRST_IRQ, j = 0; j < NR_IRQS; i++, j++) {
irq_desc[j].handler = &crisv32_irq_type;
set_exception_vector(i, interrupt[j]);
}
/* Mark Timer and IPI IRQs as CPU local */
irq_allocations[TIMER_INTR_VECT - FIRST_IRQ].cpu = CPU_FIXED;
irq_desc[TIMER_INTR_VECT].status |= IRQ_PER_CPU;
irq_allocations[IPI_INTR_VECT - FIRST_IRQ].cpu = CPU_FIXED;
irq_desc[IPI_INTR_VECT].status |= IRQ_PER_CPU;
set_exception_vector(0x00, nmi_interrupt);
set_exception_vector(0x30, multiple_interrupt);
/* Set up handler for various MMU bus faults. */
set_exception_vector(0x04, i_mmu_refill);
set_exception_vector(0x05, i_mmu_invalid);
set_exception_vector(0x06, i_mmu_access);
set_exception_vector(0x07, i_mmu_execute);
set_exception_vector(0x08, d_mmu_refill);
set_exception_vector(0x09, d_mmu_invalid);
set_exception_vector(0x0a, d_mmu_access);
set_exception_vector(0x0b, d_mmu_write);
/* The system-call trap is reached by "break 13". */
set_exception_vector(0x1d, system_call);
/* Exception handlers for debugging, both user-mode and kernel-mode. */
/* Break 8. */
set_exception_vector(0x18, gdb_handle_exception);
/* Hardware single step. */
set_exception_vector(0x3, gdb_handle_exception);
/* Hardware breakpoint. */
set_exception_vector(0xc, gdb_handle_exception);
#ifdef CONFIG_ETRAX_KGDB
kgdb_init();
/* Everything is set up; now trap the kernel. */
breakpoint();
#endif
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,552 @@
/*
* Copyright (C) 2004 Axis Communications AB
*
* Code for handling break 8, hardware breakpoint, single step, and serial
* port exceptions for kernel debugging purposes.
*/
#include <linux/config.h>
#include <asm/arch/hwregs/intr_vect.h>
;; Exported functions.
.globl kgdb_handle_exception
kgdb_handle_exception:
;; Create a register image of the caller.
;;
;; First of all, save the ACR on the stack since we need it for address calculations.
;; We put it into the register struct later.
subq 4, $sp
move.d $acr, [$sp]
;; Now we are free to use ACR all we want.
;; If we were running this handler with interrupts on, we would have to be careful
;; to save and restore CCS manually, but since we aren't we treat it like every other
;; register.
move.d reg, $acr
move.d $r0, [$acr] ; Save R0 (start of register struct)
addq 4, $acr
move.d $r1, [$acr] ; Save R1
addq 4, $acr
move.d $r2, [$acr] ; Save R2
addq 4, $acr
move.d $r3, [$acr] ; Save R3
addq 4, $acr
move.d $r4, [$acr] ; Save R4
addq 4, $acr
move.d $r5, [$acr] ; Save R5
addq 4, $acr
move.d $r6, [$acr] ; Save R6
addq 4, $acr
move.d $r7, [$acr] ; Save R7
addq 4, $acr
move.d $r8, [$acr] ; Save R8
addq 4, $acr
move.d $r9, [$acr] ; Save R9
addq 4, $acr
move.d $r10, [$acr] ; Save R10
addq 4, $acr
move.d $r11, [$acr] ; Save R11
addq 4, $acr
move.d $r12, [$acr] ; Save R12
addq 4, $acr
move.d $r13, [$acr] ; Save R13
addq 4, $acr
move.d $sp, [$acr] ; Save SP (R14)
addq 4, $acr
;; The ACR register is already saved on the stack, so pop it from there.
move.d [$sp],$r0
move.d $r0, [$acr]
addq 4, $acr
move $bz, [$acr]
addq 1, $acr
move $vr, [$acr]
addq 1, $acr
move $pid, [$acr]
addq 4, $acr
move $srs, [$acr]
addq 1, $acr
move $wz, [$acr]
addq 2, $acr
move $exs, [$acr]
addq 4, $acr
move $eda, [$acr]
addq 4, $acr
move $mof, [$acr]
addq 4, $acr
move $dz, [$acr]
addq 4, $acr
move $ebp, [$acr]
addq 4, $acr
move $erp, [$acr]
addq 4, $acr
move $srp, [$acr]
addq 4, $acr
move $nrp, [$acr]
addq 4, $acr
move $ccs, [$acr]
addq 4, $acr
move $usp, [$acr]
addq 4, $acr
move $spc, [$acr]
addq 4, $acr
;; Skip the pseudo-PC.
addq 4, $acr
;; Save the support registers in bank 0 - 3.
clear.d $r1 ; Bank counter
move.d sreg, $acr
;; Bank 0
move $r1, $srs
nop
nop
nop
move $s0, $r0
move.d $r0, [$acr]
addq 4, $acr
move $s1, $r0
move.d $r0, [$acr]
addq 4, $acr
move $s2, $r0
move.d $r0, [$acr]
addq 4, $acr
move $s3, $r0
move.d $r0, [$acr]
addq 4, $acr
move $s4, $r0
move.d $r0, [$acr]
addq 4, $acr
move $s5, $r0
move.d $r0, [$acr]
addq 4, $acr
move $s6, $r0
move.d $r0, [$acr]
addq 4, $acr
move $s7, $r0
move.d $r0, [$acr]
addq 4, $acr
move $s8, $r0
move.d $r0, [$acr]
addq 4, $acr
move $s9, $r0
move.d $r0, [$acr]
addq 4, $acr
move $s10, $r0
move.d $r0, [$acr]
addq 4, $acr
move $s11, $r0
move.d $r0, [$acr]
addq 4, $acr
move $s12, $r0
move.d $r0, [$acr]
addq 4, $acr
;; Nothing in S13 - S15, bank 0
clear.d [$acr]
addq 4, $acr
clear.d [$acr]
addq 4, $acr
clear.d [$acr]
addq 4, $acr
;; Bank 1 and bank 2 have the same layout, hence the loop.
addq 1, $r1
1:
move $r1, $srs
nop
nop
nop
move $s0, $r0
move.d $r0, [$acr]
addq 4, $acr
move $s1, $r0
move.d $r0, [$acr]
addq 4, $acr
move $s2, $r0
move.d $r0, [$acr]
addq 4, $acr
move $s3, $r0
move.d $r0, [$acr]
addq 4, $acr
move $s4, $r0
move.d $r0, [$acr]
addq 4, $acr
move $s5, $r0
move.d $r0, [$acr]
addq 4, $acr
move $s6, $r0
move.d $r0, [$acr]
addq 4, $acr
;; Nothing in S7 - S15, bank 1 and 2
clear.d [$acr]
addq 4, $acr
clear.d [$acr]
addq 4, $acr
clear.d [$acr]
addq 4, $acr
clear.d [$acr]
addq 4, $acr
clear.d [$acr]
addq 4, $acr
clear.d [$acr]
addq 4, $acr
clear.d [$acr]
addq 4, $acr
clear.d [$acr]
addq 4, $acr
clear.d [$acr]
addq 4, $acr
addq 1, $r1
cmpq 3, $r1
bne 1b
nop
;; Bank 3
move $r1, $srs
nop
nop
nop
move $s0, $r0
move.d $r0, [$acr]
addq 4, $acr
move $s1, $r0
move.d $r0, [$acr]
addq 4, $acr
move $s2, $r0
move.d $r0, [$acr]
addq 4, $acr
move $s3, $r0
move.d $r0, [$acr]
addq 4, $acr
move $s4, $r0
move.d $r0, [$acr]
addq 4, $acr
move $s5, $r0
move.d $r0, [$acr]
addq 4, $acr
move $s6, $r0
move.d $r0, [$acr]
addq 4, $acr
move $s7, $r0
move.d $r0, [$acr]
addq 4, $acr
move $s8, $r0
move.d $r0, [$acr]
addq 4, $acr
move $s9, $r0
move.d $r0, [$acr]
addq 4, $acr
move $s10, $r0
move.d $r0, [$acr]
addq 4, $acr
move $s11, $r0
move.d $r0, [$acr]
addq 4, $acr
move $s12, $r0
move.d $r0, [$acr]
addq 4, $acr
move $s13, $r0
move.d $r0, [$acr]
addq 4, $acr
move $s14, $r0
move.d $r0, [$acr]
addq 4, $acr
;; Nothing in S15, bank 3
clear.d [$acr]
addq 4, $acr
;; Check what got us here: get IDX field of EXS.
move $exs, $r10
and.d 0xff00, $r10
lsrq 8, $r10
#if defined(CONFIG_ETRAX_KGDB_PORT0)
cmp.d SER0_INTR_VECT, $r10 ; IRQ for serial port 0
beq sigint
nop
#elif defined(CONFIG_ETRAX_KGDB_PORT1)
cmp.d SER1_INTR_VECT, $r10 ; IRQ for serial port 1
beq sigint
nop
#elif defined(CONFIG_ETRAX_KGDB_PORT2)
cmp.d SER2_INTR_VECT, $r10 ; IRQ for serial port 2
beq sigint
nop
#elif defined(CONFIG_ETRAX_KGDB_PORT3)
cmp.d SER3_INTR_VECT, $r10 ; IRQ for serial port 3
beq sigint
nop
#endif
;; Multiple interrupt must be due to serial break.
cmp.d 0x30, $r10 ; Multiple interrupt
beq sigint
nop
;; Neither of those? Then it's a sigtrap.
ba handle_comm
moveq 5, $r10 ; Set SIGTRAP (delay slot)
sigint:
;; Serial interrupt; get character
jsr getDebugChar
nop ; Delay slot
cmp.b 3, $r10 ; \003 (Ctrl-C)?
bne return ; No, get out of here
nop
moveq 2, $r10 ; Set SIGINT
;;
;; Handle the communication
;;
handle_comm:
move.d internal_stack+1020, $sp ; Use the internal stack which grows upwards
jsr handle_exception ; Interactive routine
nop
;;
;; Return to the caller
;;
return:
;; First of all, write the support registers.
clear.d $r1 ; Bank counter
move.d sreg, $acr
;; Bank 0
move $r1, $srs
nop
nop
nop
move.d [$acr], $r0
move $r0, $s0
addq 4, $acr
move.d [$acr], $r0
move $r0, $s1
addq 4, $acr
move.d [$acr], $r0
move $r0, $s2
addq 4, $acr
move.d [$acr], $r0
move $r0, $s3
addq 4, $acr
move.d [$acr], $r0
move $r0, $s4
addq 4, $acr
move.d [$acr], $r0
move $r0, $s5
addq 4, $acr
;; Nothing in S6 - S7, bank 0.
addq 4, $acr
addq 4, $acr
move.d [$acr], $r0
move $r0, $s8
addq 4, $acr
move.d [$acr], $r0
move $r0, $s9
addq 4, $acr
move.d [$acr], $r0
move $r0, $s10
addq 4, $acr
move.d [$acr], $r0
move $r0, $s11
addq 4, $acr
move.d [$acr], $r0
move $r0, $s12
addq 4, $acr
;; Nothing in S13 - S15, bank 0
addq 4, $acr
addq 4, $acr
addq 4, $acr
;; Bank 1 and bank 2 have the same layout, hence the loop.
addq 1, $r1
2:
move $r1, $srs
nop
nop
nop
move.d [$acr], $r0
move $r0, $s0
addq 4, $acr
move.d [$acr], $r0
move $r0, $s1
addq 4, $acr
move.d [$acr], $r0
move $r0, $s2
addq 4, $acr
;; S3 (MM_CAUSE) is read-only.
addq 4, $acr
move.d [$acr], $r0
move $r0, $s4
addq 4, $acr
;; FIXME: Actually write S5/S6? (Affects MM_CAUSE.)
addq 4, $acr
addq 4, $acr
;; Nothing in S7 - S15, bank 1 and 2
addq 4, $acr
addq 4, $acr
addq 4, $acr
addq 4, $acr
addq 4, $acr
addq 4, $acr
addq 4, $acr
addq 4, $acr
addq 4, $acr
addq 1, $r1
cmpq 3, $r1
bne 2b
nop
;; Bank 3
move $r1, $srs
nop
nop
nop
move.d [$acr], $r0
move $r0, $s0
addq 4, $acr
move.d [$acr], $r0
move $r0, $s1
addq 4, $acr
move.d [$acr], $r0
move $r0, $s2
addq 4, $acr
move.d [$acr], $r0
move $r0, $s3
addq 4, $acr
move.d [$acr], $r0
move $r0, $s4
addq 4, $acr
move.d [$acr], $r0
move $r0, $s5
addq 4, $acr
move.d [$acr], $r0
move $r0, $s6
addq 4, $acr
move.d [$acr], $r0
move $r0, $s7
addq 4, $acr
move.d [$acr], $r0
move $r0, $s8
addq 4, $acr
move.d [$acr], $r0
move $r0, $s9
addq 4, $acr
move.d [$acr], $r0
move $r0, $s10
addq 4, $acr
move.d [$acr], $r0
move $r0, $s11
addq 4, $acr
move.d [$acr], $r0
move $r0, $s12
addq 4, $acr
move.d [$acr], $r0
move $r0, $s13
addq 4, $acr
move.d [$acr], $r0
move $r0, $s14
addq 4, $acr
;; Nothing in S15, bank 3
addq 4, $acr
;; Now, move on to the regular register restoration process.
move.d reg, $acr ; Reset ACR to point at the beginning of the register image
move.d [$acr], $r0 ; Restore R0
addq 4, $acr
move.d [$acr], $r1 ; Restore R1
addq 4, $acr
move.d [$acr], $r2 ; Restore R2
addq 4, $acr
move.d [$acr], $r3 ; Restore R3
addq 4, $acr
move.d [$acr], $r4 ; Restore R4
addq 4, $acr
move.d [$acr], $r5 ; Restore R5
addq 4, $acr
move.d [$acr], $r6 ; Restore R6
addq 4, $acr
move.d [$acr], $r7 ; Restore R7
addq 4, $acr
move.d [$acr], $r8 ; Restore R8
addq 4, $acr
move.d [$acr], $r9 ; Restore R9
addq 4, $acr
move.d [$acr], $r10 ; Restore R10
addq 4, $acr
move.d [$acr], $r11 ; Restore R11
addq 4, $acr
move.d [$acr], $r12 ; Restore R12
addq 4, $acr
move.d [$acr], $r13 ; Restore R13
;;
;; We restore all registers, even though some of them probably haven't changed.
;;
addq 4, $acr
move.d [$acr], $sp ; Restore SP (R14)
;; ACR cannot be restored just yet.
addq 8, $acr
;; Skip BZ, VR.
addq 2, $acr
move [$acr], $pid ; Restore PID
addq 4, $acr
move [$acr], $srs ; Restore SRS
nop
nop
nop
addq 1, $acr
;; Skip WZ.
addq 2, $acr
move [$acr], $exs ; Restore EXS.
addq 4, $acr
move [$acr], $eda ; Restore EDA.
addq 4, $acr
move [$acr], $mof ; Restore MOF.
;; Skip DZ.
addq 8, $acr
move [$acr], $ebp ; Restore EBP.
addq 4, $acr
move [$acr], $erp ; Restore ERP.
addq 4, $acr
move [$acr], $srp ; Restore SRP.
addq 4, $acr
move [$acr], $nrp ; Restore NRP.
addq 4, $acr
move [$acr], $ccs ; Restore CCS like an ordinary register.
addq 4, $acr
move [$acr], $usp ; Restore USP
addq 4, $acr
move [$acr], $spc ; Restore SPC
; No restoration of pseudo-PC of course.
move.d reg, $acr ; Reset ACR to point at the beginning of the register image
add.d 15*4, $acr
move.d [$acr], $acr ; Finally, restore ACR.
rete ; Same as jump ERP
rfe ; Shifts CCS

View file

@ -0,0 +1,229 @@
/*
* Allocator for I/O pins. All pins are allocated to GPIO at bootup.
* Unassigned pins and GPIO pins can be allocated to a fixed interface
* or the I/O processor instead.
*
* Copyright (c) 2004 Axis Communications AB.
*/
#include <linux/init.h>
#include <linux/errno.h>
#include <linux/kernel.h>
#include <linux/string.h>
#include <linux/spinlock.h>
#include <asm/arch/hwregs/reg_map.h>
#include <asm/arch/hwregs/reg_rdwr.h>
#include <asm/arch/pinmux.h>
#include <asm/arch/hwregs/pinmux_defs.h>
#undef DEBUG
#define PORT_PINS 18
#define PORTS 4
static char pins[PORTS][PORT_PINS];
static DEFINE_SPINLOCK(pinmux_lock);
static void crisv32_pinmux_set(int port);
int
crisv32_pinmux_init(void)
{
static int initialized = 0;
if (!initialized) {
reg_pinmux_rw_pa pa = REG_RD(pinmux, regi_pinmux, rw_pa);
initialized = 1;
pa.pa0 = pa.pa1 = pa.pa2 = pa.pa3 =
pa.pa4 = pa.pa5 = pa.pa6 = pa.pa7 = regk_pinmux_yes;
REG_WR(pinmux, regi_pinmux, rw_pa, pa);
crisv32_pinmux_alloc(PORT_B, 0, PORT_PINS - 1, pinmux_gpio);
crisv32_pinmux_alloc(PORT_C, 0, PORT_PINS - 1, pinmux_gpio);
crisv32_pinmux_alloc(PORT_D, 0, PORT_PINS - 1, pinmux_gpio);
crisv32_pinmux_alloc(PORT_E, 0, PORT_PINS - 1, pinmux_gpio);
}
return 0;
}
int
crisv32_pinmux_alloc(int port, int first_pin, int last_pin, enum pin_mode mode)
{
int i;
unsigned long flags;
crisv32_pinmux_init();
if (port > PORTS)
return -EINVAL;
spin_lock_irqsave(&pinmux_lock, flags);
for (i = first_pin; i <= last_pin; i++)
{
if ((pins[port][i] != pinmux_none) && (pins[port][i] != pinmux_gpio) &&
(pins[port][i] != mode))
{
spin_unlock_irqrestore(&pinmux_lock, flags);
#ifdef DEBUG
panic("Pinmux alloc failed!\n");
#endif
return -EPERM;
}
}
for (i = first_pin; i <= last_pin; i++)
pins[port][i] = mode;
crisv32_pinmux_set(port);
spin_unlock_irqrestore(&pinmux_lock, flags);
return 0;
}
int
crisv32_pinmux_alloc_fixed(enum fixed_function function)
{
int ret = -EINVAL;
char saved[sizeof pins];
unsigned long flags;
spin_lock_irqsave(&pinmux_lock, flags);
/* Save internal data for recovery */
memcpy(saved, pins, sizeof pins);
reg_pinmux_rw_hwprot hwprot = REG_RD(pinmux, regi_pinmux, rw_hwprot);
switch(function)
{
case pinmux_ser1:
ret = crisv32_pinmux_alloc(PORT_C, 4, 7, pinmux_fixed);
hwprot.ser1 = regk_pinmux_yes;
break;
case pinmux_ser2:
ret = crisv32_pinmux_alloc(PORT_C, 8, 11, pinmux_fixed);
hwprot.ser2 = regk_pinmux_yes;
break;
case pinmux_ser3:
ret = crisv32_pinmux_alloc(PORT_C, 12, 15, pinmux_fixed);
hwprot.ser3 = regk_pinmux_yes;
break;
case pinmux_sser0:
ret = crisv32_pinmux_alloc(PORT_C, 0, 3, pinmux_fixed);
ret |= crisv32_pinmux_alloc(PORT_C, 16, 16, pinmux_fixed);
hwprot.sser0 = regk_pinmux_yes;
break;
case pinmux_sser1:
ret = crisv32_pinmux_alloc(PORT_D, 0, 4, pinmux_fixed);
hwprot.sser1 = regk_pinmux_yes;
break;
case pinmux_ata0:
ret = crisv32_pinmux_alloc(PORT_D, 5, 7, pinmux_fixed);
ret |= crisv32_pinmux_alloc(PORT_D, 15, 17, pinmux_fixed);
hwprot.ata0 = regk_pinmux_yes;
break;
case pinmux_ata1:
ret = crisv32_pinmux_alloc(PORT_D, 0, 4, pinmux_fixed);
ret |= crisv32_pinmux_alloc(PORT_E, 17, 17, pinmux_fixed);
hwprot.ata1 = regk_pinmux_yes;
break;
case pinmux_ata2:
ret = crisv32_pinmux_alloc(PORT_C, 11, 15, pinmux_fixed);
ret |= crisv32_pinmux_alloc(PORT_E, 3, 3, pinmux_fixed);
hwprot.ata2 = regk_pinmux_yes;
break;
case pinmux_ata3:
ret = crisv32_pinmux_alloc(PORT_C, 8, 10, pinmux_fixed);
ret |= crisv32_pinmux_alloc(PORT_C, 0, 2, pinmux_fixed);
hwprot.ata2 = regk_pinmux_yes;
break;
case pinmux_ata:
ret = crisv32_pinmux_alloc(PORT_B, 0, 15, pinmux_fixed);
ret |= crisv32_pinmux_alloc(PORT_D, 8, 15, pinmux_fixed);
hwprot.ata = regk_pinmux_yes;
break;
case pinmux_eth1:
ret = crisv32_pinmux_alloc(PORT_E, 0, 17, pinmux_fixed);
hwprot.eth1 = regk_pinmux_yes;
hwprot.eth1_mgm = regk_pinmux_yes;
break;
case pinmux_timer:
ret = crisv32_pinmux_alloc(PORT_C, 16, 16, pinmux_fixed);
hwprot.timer = regk_pinmux_yes;
spin_unlock_irqrestore(&pinmux_lock, flags);
return ret;
}
if (!ret)
REG_WR(pinmux, regi_pinmux, rw_hwprot, hwprot);
else
memcpy(pins, saved, sizeof pins);
spin_unlock_irqrestore(&pinmux_lock, flags);
return ret;
}
void
crisv32_pinmux_set(int port)
{
int i;
int gpio_val = 0;
int iop_val = 0;
for (i = 0; i < PORT_PINS; i++)
{
if (pins[port][i] == pinmux_gpio)
gpio_val |= (1 << i);
else if (pins[port][i] == pinmux_iop)
iop_val |= (1 << i);
}
REG_WRITE(int, regi_pinmux + REG_RD_ADDR_pinmux_rw_pb_gio + 8*port, gpio_val);
REG_WRITE(int, regi_pinmux + REG_RD_ADDR_pinmux_rw_pb_iop + 8*port, iop_val);
#ifdef DEBUG
crisv32_pinmux_dump();
#endif
}
int
crisv32_pinmux_dealloc(int port, int first_pin, int last_pin)
{
int i;
unsigned long flags;
crisv32_pinmux_init();
if (port > PORTS)
return -EINVAL;
spin_lock_irqsave(&pinmux_lock, flags);
for (i = first_pin; i <= last_pin; i++)
pins[port][i] = pinmux_none;
crisv32_pinmux_set(port);
spin_unlock_irqrestore(&pinmux_lock, flags);
return 0;
}
void
crisv32_pinmux_dump(void)
{
int i, j;
crisv32_pinmux_init();
for (i = 0; i < PORTS; i++)
{
printk("Port %c\n", 'B'+i);
for (j = 0; j < PORT_PINS; j++)
printk(" Pin %d = %d\n", j, pins[i][j]);
}
}
__initcall(crisv32_pinmux_init);

View file

@ -0,0 +1,270 @@
/*
* Copyright (C) 2000-2003 Axis Communications AB
*
* Authors: Bjorn Wesen (bjornw@axis.com)
* Mikael Starvik (starvik@axis.com)
* Tobias Anderberg (tobiasa@axis.com), CRISv32 port.
*
* This file handles the architecture-dependent parts of process handling..
*/
#include <linux/config.h>
#include <linux/sched.h>
#include <linux/err.h>
#include <linux/fs.h>
#include <linux/slab.h>
#include <asm/arch/hwregs/reg_rdwr.h>
#include <asm/arch/hwregs/reg_map.h>
#include <asm/arch/hwregs/timer_defs.h>
#include <asm/arch/hwregs/intr_vect_defs.h>
extern void stop_watchdog(void);
#ifdef CONFIG_ETRAX_GPIO
extern void etrax_gpio_wake_up_check(void); /* Defined in drivers/gpio.c. */
#endif
extern int cris_hlt_counter;
/* We use this if we don't have any better idle routine. */
void default_idle(void)
{
local_irq_disable();
if (!need_resched() && !cris_hlt_counter) {
/* Halt until exception. */
__asm__ volatile("ei \n\t"
"halt ");
}
local_irq_enable();
}
/*
* Free current thread data structures etc..
*/
extern void deconfigure_bp(long pid);
void exit_thread(void)
{
deconfigure_bp(current->pid);
}
/*
* If the watchdog is enabled, disable interrupts and enter an infinite loop.
* The watchdog will reset the CPU after 0.1s. If the watchdog isn't enabled
* then enable it and wait.
*/
extern void arch_enable_nmi(void);
void
hard_reset_now(void)
{
/*
* Don't declare this variable elsewhere. We don't want any other
* code to know about it than the watchdog handler in entry.S and
* this code, implementing hard reset through the watchdog.
*/
#if defined(CONFIG_ETRAX_WATCHDOG)
extern int cause_of_death;
#endif
printk("*** HARD RESET ***\n");
local_irq_disable();
#if defined(CONFIG_ETRAX_WATCHDOG)
cause_of_death = 0xbedead;
#else
{
reg_timer_rw_wd_ctrl wd_ctrl = {0};
stop_watchdog();
wd_ctrl.key = 16; /* Arbitrary key. */
wd_ctrl.cnt = 1; /* Minimum time. */
wd_ctrl.cmd = regk_timer_start;
arch_enable_nmi();
REG_WR(timer, regi_timer, rw_wd_ctrl, wd_ctrl);
}
#endif
while (1)
; /* Wait for reset. */
}
/*
* Return saved PC of a blocked thread.
*/
unsigned long thread_saved_pc(struct task_struct *t)
{
return (unsigned long)user_regs(t->thread_info)->erp;
}
static void
kernel_thread_helper(void* dummy, int (*fn)(void *), void * arg)
{
fn(arg);
do_exit(-1); /* Should never be called, return bad exit value. */
}
/* Create a kernel thread. */
int
kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
{
struct pt_regs regs;
memset(&regs, 0, sizeof(regs));
/* Don't use r10 since that is set to 0 in copy_thread. */
regs.r11 = (unsigned long) fn;
regs.r12 = (unsigned long) arg;
regs.erp = (unsigned long) kernel_thread_helper;
regs.ccs = 1 << (I_CCS_BITNR + CCS_SHIFT);
/* Create the new process. */
return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, &regs, 0, NULL, NULL);
}
/*
* Setup the child's kernel stack with a pt_regs and call switch_stack() on it.
* It will be unnested during _resume and _ret_from_sys_call when the new thread
* is scheduled.
*
* Also setup the thread switching structure which is used to keep
* thread-specific data during _resumes.
*/
extern asmlinkage void ret_from_fork(void);
int
copy_thread(int nr, unsigned long clone_flags, unsigned long usp,
unsigned long unused,
struct task_struct *p, struct pt_regs *regs)
{
struct pt_regs *childregs;
struct switch_stack *swstack;
/*
* Put the pt_regs structure at the end of the new kernel stack page and
* fix it up. Note: the task_struct doubles as the kernel stack for the
* task.
*/
childregs = user_regs(p->thread_info);
*childregs = *regs; /* Struct copy of pt_regs. */
p->set_child_tid = p->clear_child_tid = NULL;
childregs->r10 = 0; /* Child returns 0 after a fork/clone. */
/* Set a new TLS ?
* The TLS is in $mof beacuse it is the 5th argument to sys_clone.
*/
if (p->mm && (clone_flags & CLONE_SETTLS)) {
p->thread_info->tls = regs->mof;
}
/* Put the switch stack right below the pt_regs. */
swstack = ((struct switch_stack *) childregs) - 1;
/* Paramater to ret_from_sys_call. 0 is don't restart the syscall. */
swstack->r9 = 0;
/*
* We want to return into ret_from_sys_call after the _resume.
* ret_from_fork will call ret_from_sys_call.
*/
swstack->return_ip = (unsigned long) ret_from_fork;
/* Fix the user-mode and kernel-mode stackpointer. */
p->thread.usp = usp;
p->thread.ksp = (unsigned long) swstack;
return 0;
}
/*
* Be aware of the "magic" 7th argument in the four system-calls below.
* They need the latest stackframe, which is put as the 7th argument by
* entry.S. The previous arguments are dummies or actually used, but need
* to be defined to reach the 7th argument.
*
* N.B.: Another method to get the stackframe is to use current_regs(). But
* it returns the latest stack-frame stacked when going from _user mode_ and
* some of these (at least sys_clone) are called from kernel-mode sometimes
* (for example during kernel_thread, above) and thus cannot use it. Thus,
* to be sure not to get any surprises, we use the method for the other calls
* as well.
*/
asmlinkage int
sys_fork(long r10, long r11, long r12, long r13, long mof, long srp,
struct pt_regs *regs)
{
return do_fork(SIGCHLD, rdusp(), regs, 0, NULL, NULL);
}
/* FIXME: Is parent_tid/child_tid really third/fourth argument? Update lib? */
asmlinkage int
sys_clone(unsigned long newusp, unsigned long flags, int *parent_tid, int *child_tid,
unsigned long tls, long srp, struct pt_regs *regs)
{
if (!newusp)
newusp = rdusp();
return do_fork(flags, newusp, regs, 0, parent_tid, child_tid);
}
/*
* vfork is a system call in i386 because of register-pressure - maybe
* we can remove it and handle it in libc but we put it here until then.
*/
asmlinkage int
sys_vfork(long r10, long r11, long r12, long r13, long mof, long srp,
struct pt_regs *regs)
{
return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, rdusp(), regs, 0, NULL, NULL);
}
/* sys_execve() executes a new program. */
asmlinkage int
sys_execve(const char *fname, char **argv, char **envp, long r13, long mof, long srp,
struct pt_regs *regs)
{
int error;
char *filename;
filename = getname(fname);
error = PTR_ERR(filename);
if (IS_ERR(filename))
goto out;
error = do_execve(filename, argv, envp, regs);
putname(filename);
out:
return error;
}
unsigned long
get_wchan(struct task_struct *p)
{
/* TODO */
return 0;
}
#undef last_sched
#undef first_sched
void show_regs(struct pt_regs * regs)
{
unsigned long usp = rdusp();
printk("ERP: %08lx SRP: %08lx CCS: %08lx USP: %08lx MOF: %08lx\n",
regs->erp, regs->srp, regs->ccs, usp, regs->mof);
printk(" r0: %08lx r1: %08lx r2: %08lx r3: %08lx\n",
regs->r0, regs->r1, regs->r2, regs->r3);
printk(" r4: %08lx r5: %08lx r6: %08lx r7: %08lx\n",
regs->r4, regs->r5, regs->r6, regs->r7);
printk(" r8: %08lx r9: %08lx r10: %08lx r11: %08lx\n",
regs->r8, regs->r9, regs->r10, regs->r11);
printk("r12: %08lx r13: %08lx oR10: %08lx\n",
regs->r12, regs->r13, regs->orig_r10);
}

View file

@ -0,0 +1,597 @@
/*
* Copyright (C) 2000-2003, Axis Communications AB.
*/
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/mm.h>
#include <linux/smp.h>
#include <linux/smp_lock.h>
#include <linux/errno.h>
#include <linux/ptrace.h>
#include <linux/user.h>
#include <linux/signal.h>
#include <linux/security.h>
#include <asm/uaccess.h>
#include <asm/page.h>
#include <asm/pgtable.h>
#include <asm/system.h>
#include <asm/processor.h>
#include <asm/arch/hwregs/supp_reg.h>
/*
* Determines which bits in CCS the user has access to.
* 1 = access, 0 = no access.
*/
#define CCS_MASK 0x00087c00 /* SXNZVC */
#define SBIT_USER (1 << (S_CCS_BITNR + CCS_SHIFT))
static int put_debugreg(long pid, unsigned int regno, long data);
static long get_debugreg(long pid, unsigned int regno);
static unsigned long get_pseudo_pc(struct task_struct *child);
void deconfigure_bp(long pid);
extern unsigned long cris_signal_return_page;
/*
* Get contents of register REGNO in task TASK.
*/
long get_reg(struct task_struct *task, unsigned int regno)
{
/* USP is a special case, it's not in the pt_regs struct but
* in the tasks thread struct
*/
unsigned long ret;
if (regno <= PT_EDA)
ret = ((unsigned long *)user_regs(task->thread_info))[regno];
else if (regno == PT_USP)
ret = task->thread.usp;
else if (regno == PT_PPC)
ret = get_pseudo_pc(task);
else if (regno <= PT_MAX)
ret = get_debugreg(task->pid, regno);
else
ret = 0;
return ret;
}
/*
* Write contents of register REGNO in task TASK.
*/
int put_reg(struct task_struct *task, unsigned int regno, unsigned long data)
{
if (regno <= PT_EDA)
((unsigned long *)user_regs(task->thread_info))[regno] = data;
else if (regno == PT_USP)
task->thread.usp = data;
else if (regno == PT_PPC) {
/* Write pseudo-PC to ERP only if changed. */
if (data != get_pseudo_pc(task))
((unsigned long *)user_regs(task->thread_info))[PT_ERP] = data;
} else if (regno <= PT_MAX)
return put_debugreg(task->pid, regno, data);
else
return -1;
return 0;
}
/*
* Called by kernel/ptrace.c when detaching.
*
* Make sure the single step bit is not set.
*/
void
ptrace_disable(struct task_struct *child)
{
unsigned long tmp;
/* Deconfigure SPC and S-bit. */
tmp = get_reg(child, PT_CCS) & ~SBIT_USER;
put_reg(child, PT_CCS, tmp);
put_reg(child, PT_SPC, 0);
/* Deconfigure any watchpoints associated with the child. */
deconfigure_bp(child->pid);
}
asmlinkage int
sys_ptrace(long request, long pid, long addr, long data)
{
struct task_struct *child;
int ret;
unsigned long __user *datap = (unsigned long __user *)data;
lock_kernel();
ret = -EPERM;
if (request == PTRACE_TRACEME) {
/* are we already being traced? */
if (current->ptrace & PT_PTRACED)
goto out;
ret = security_ptrace(current->parent, current);
if (ret)
goto out;
/* set the ptrace bit in the process flags. */
current->ptrace |= PT_PTRACED;
ret = 0;
goto out;
}
ret = -ESRCH;
read_lock(&tasklist_lock);
child = find_task_by_pid(pid);
if (child)
get_task_struct(child);
read_unlock(&tasklist_lock);
if (!child)
goto out;
ret = -EPERM;
if (pid == 1) /* Leave the init process alone! */
goto out_tsk;
if (request == PTRACE_ATTACH) {
ret = ptrace_attach(child);
goto out_tsk;
}
ret = ptrace_check_attach(child, request == PTRACE_KILL);
if (ret < 0)
goto out_tsk;
switch (request) {
/* Read word at location address. */
case PTRACE_PEEKTEXT:
case PTRACE_PEEKDATA: {
unsigned long tmp;
int copied;
ret = -EIO;
/* The signal trampoline page is outside the normal user-addressable
* space but still accessible. This is hack to make it possible to
* access the signal handler code in GDB.
*/
if ((addr & PAGE_MASK) == cris_signal_return_page) {
/* The trampoline page is globally mapped, no page table to traverse.*/
tmp = *(unsigned long*)addr;
} else {
copied = access_process_vm(child, addr, &tmp, sizeof(tmp), 0);
if (copied != sizeof(tmp))
break;
}
ret = put_user(tmp,datap);
break;
}
/* Read the word at location address in the USER area. */
case PTRACE_PEEKUSR: {
unsigned long tmp;
ret = -EIO;
if ((addr & 3) || addr < 0 || addr > PT_MAX << 2)
break;
tmp = get_reg(child, addr >> 2);
ret = put_user(tmp, datap);
break;
}
/* Write the word at location address. */
case PTRACE_POKETEXT:
case PTRACE_POKEDATA:
ret = 0;
if (access_process_vm(child, addr, &data, sizeof(data), 1) == sizeof(data))
break;
ret = -EIO;
break;
/* Write the word at location address in the USER area. */
case PTRACE_POKEUSR:
ret = -EIO;
if ((addr & 3) || addr < 0 || addr > PT_MAX << 2)
break;
addr >>= 2;
if (addr == PT_CCS) {
/* don't allow the tracing process to change stuff like
* interrupt enable, kernel/user bit, dma enables etc.
*/
data &= CCS_MASK;
data |= get_reg(child, PT_CCS) & ~CCS_MASK;
}
if (put_reg(child, addr, data))
break;
ret = 0;
break;
case PTRACE_SYSCALL:
case PTRACE_CONT:
ret = -EIO;
if (!valid_signal(data))
break;
/* Continue means no single-step. */
put_reg(child, PT_SPC, 0);
if (!get_debugreg(child->pid, PT_BP_CTRL)) {
unsigned long tmp;
/* If no h/w bp configured, disable S bit. */
tmp = get_reg(child, PT_CCS) & ~SBIT_USER;
put_reg(child, PT_CCS, tmp);
}
if (request == PTRACE_SYSCALL) {
set_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
}
else {
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
}
child->exit_code = data;
/* TODO: make sure any pending breakpoint is killed */
wake_up_process(child);
ret = 0;
break;
/* Make the child exit by sending it a sigkill. */
case PTRACE_KILL:
ret = 0;
if (child->exit_state == EXIT_ZOMBIE)
break;
child->exit_code = SIGKILL;
/* Deconfigure single-step and h/w bp. */
ptrace_disable(child);
/* TODO: make sure any pending breakpoint is killed */
wake_up_process(child);
break;
/* Set the trap flag. */
case PTRACE_SINGLESTEP: {
unsigned long tmp;
ret = -EIO;
/* Set up SPC if not set already (in which case we have
no other choice but to trust it). */
if (!get_reg(child, PT_SPC)) {
/* In case we're stopped in a delay slot. */
tmp = get_reg(child, PT_ERP) & ~1;
put_reg(child, PT_SPC, tmp);
}
tmp = get_reg(child, PT_CCS) | SBIT_USER;
put_reg(child, PT_CCS, tmp);
if (!valid_signal(data))
break;
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
/* TODO: set some clever breakpoint mechanism... */
child->exit_code = data;
wake_up_process(child);
ret = 0;
break;
}
case PTRACE_DETACH:
ret = ptrace_detach(child, data);
break;
/* Get all GP registers from the child. */
case PTRACE_GETREGS: {
int i;
unsigned long tmp;
for (i = 0; i <= PT_MAX; i++) {
tmp = get_reg(child, i);
if (put_user(tmp, datap)) {
ret = -EFAULT;
goto out_tsk;
}
datap++;
}
ret = 0;
break;
}
/* Set all GP registers in the child. */
case PTRACE_SETREGS: {
int i;
unsigned long tmp;
for (i = 0; i <= PT_MAX; i++) {
if (get_user(tmp, datap)) {
ret = -EFAULT;
goto out_tsk;
}
if (i == PT_CCS) {
tmp &= CCS_MASK;
tmp |= get_reg(child, PT_CCS) & ~CCS_MASK;
}
put_reg(child, i, tmp);
datap++;
}
ret = 0;
break;
}
default:
ret = ptrace_request(child, request, addr, data);
break;
}
out_tsk:
put_task_struct(child);
out:
unlock_kernel();
return ret;
}
void do_syscall_trace(void)
{
if (!test_thread_flag(TIF_SYSCALL_TRACE))
return;
if (!(current->ptrace & PT_PTRACED))
return;
/* the 0x80 provides a way for the tracing parent to distinguish
between a syscall stop and SIGTRAP delivery */
ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD)
? 0x80 : 0));
/*
* This isn't the same as continuing with a signal, but it will do for
* normal use.
*/
if (current->exit_code) {
send_sig(current->exit_code, current, 1);
current->exit_code = 0;
}
}
/* Returns the size of an instruction that has a delay slot. */
static int insn_size(struct task_struct *child, unsigned long pc)
{
unsigned long opcode;
int copied;
int opsize = 0;
/* Read the opcode at pc (do what PTRACE_PEEKTEXT would do). */
copied = access_process_vm(child, pc, &opcode, sizeof(opcode), 0);
if (copied != sizeof(opcode))
return 0;
switch ((opcode & 0x0f00) >> 8) {
case 0x0:
case 0x9:
case 0xb:
opsize = 2;
break;
case 0xe:
case 0xf:
opsize = 6;
break;
case 0xd:
/* Could be 4 or 6; check more bits. */
if ((opcode & 0xff) == 0xff)
opsize = 4;
else
opsize = 6;
break;
default:
panic("ERROR: Couldn't find size of opcode 0x%lx at 0x%lx\n",
opcode, pc);
}
return opsize;
}
static unsigned long get_pseudo_pc(struct task_struct *child)
{
/* Default value for PC is ERP. */
unsigned long pc = get_reg(child, PT_ERP);
if (pc & 0x1) {
unsigned long spc = get_reg(child, PT_SPC);
/* Delay slot bit set. Report as stopped on proper
instruction. */
if (spc) {
/* Rely on SPC if set. FIXME: We might want to check
that EXS indicates we stopped due to a single-step
exception. */
pc = spc;
} else {
/* Calculate the PC from the size of the instruction
that the delay slot we're in belongs to. */
pc += insn_size(child, pc & ~1) - 1;
}
}
return pc;
}
static long bp_owner = 0;
/* Reachable from exit_thread in signal.c, so not static. */
void deconfigure_bp(long pid)
{
int bp;
/* Only deconfigure if the pid is the owner. */
if (bp_owner != pid)
return;
for (bp = 0; bp < 6; bp++) {
unsigned long tmp;
/* Deconfigure start and end address (also gets rid of ownership). */
put_debugreg(pid, PT_BP + 3 + (bp * 2), 0);
put_debugreg(pid, PT_BP + 4 + (bp * 2), 0);
/* Deconfigure relevant bits in control register. */
tmp = get_debugreg(pid, PT_BP_CTRL) & ~(3 << (2 + (bp * 4)));
put_debugreg(pid, PT_BP_CTRL, tmp);
}
/* No owner now. */
bp_owner = 0;
}
static int put_debugreg(long pid, unsigned int regno, long data)
{
int ret = 0;
register int old_srs;
#ifdef CONFIG_ETRAX_KGDB
/* Ignore write, but pretend it was ok if value is 0
(we don't want POKEUSR/SETREGS failing unnessecarily). */
return (data == 0) ? ret : -1;
#endif
/* Simple owner management. */
if (!bp_owner)
bp_owner = pid;
else if (bp_owner != pid) {
/* Ignore write, but pretend it was ok if value is 0
(we don't want POKEUSR/SETREGS failing unnessecarily). */
return (data == 0) ? ret : -1;
}
/* Remember old SRS. */
SPEC_REG_RD(SPEC_REG_SRS, old_srs);
/* Switch to BP bank. */
SUPP_BANK_SEL(BANK_BP);
switch (regno - PT_BP) {
case 0:
SUPP_REG_WR(0, data); break;
case 1:
case 2:
if (data)
ret = -1;
break;
case 3:
SUPP_REG_WR(3, data); break;
case 4:
SUPP_REG_WR(4, data); break;
case 5:
SUPP_REG_WR(5, data); break;
case 6:
SUPP_REG_WR(6, data); break;
case 7:
SUPP_REG_WR(7, data); break;
case 8:
SUPP_REG_WR(8, data); break;
case 9:
SUPP_REG_WR(9, data); break;
case 10:
SUPP_REG_WR(10, data); break;
case 11:
SUPP_REG_WR(11, data); break;
case 12:
SUPP_REG_WR(12, data); break;
case 13:
SUPP_REG_WR(13, data); break;
case 14:
SUPP_REG_WR(14, data); break;
default:
ret = -1;
break;
}
/* Restore SRS. */
SPEC_REG_WR(SPEC_REG_SRS, old_srs);
/* Just for show. */
NOP();
NOP();
NOP();
return ret;
}
static long get_debugreg(long pid, unsigned int regno)
{
register int old_srs;
register long data;
if (pid != bp_owner) {
return 0;
}
/* Remember old SRS. */
SPEC_REG_RD(SPEC_REG_SRS, old_srs);
/* Switch to BP bank. */
SUPP_BANK_SEL(BANK_BP);
switch (regno - PT_BP) {
case 0:
SUPP_REG_RD(0, data); break;
case 1:
case 2:
/* error return value? */
data = 0;
break;
case 3:
SUPP_REG_RD(3, data); break;
case 4:
SUPP_REG_RD(4, data); break;
case 5:
SUPP_REG_RD(5, data); break;
case 6:
SUPP_REG_RD(6, data); break;
case 7:
SUPP_REG_RD(7, data); break;
case 8:
SUPP_REG_RD(8, data); break;
case 9:
SUPP_REG_RD(9, data); break;
case 10:
SUPP_REG_RD(10, data); break;
case 11:
SUPP_REG_RD(11, data); break;
case 12:
SUPP_REG_RD(12, data); break;
case 13:
SUPP_REG_RD(13, data); break;
case 14:
SUPP_REG_RD(14, data); break;
default:
/* error return value? */
data = 0;
}
/* Restore SRS. */
SPEC_REG_WR(SPEC_REG_SRS, old_srs);
/* Just for show. */
NOP();
NOP();
NOP();
return data;
}

View file

@ -0,0 +1,118 @@
/*
* Display CPU info in /proc/cpuinfo.
*
* Copyright (C) 2003, Axis Communications AB.
*/
#include <linux/config.h>
#include <linux/seq_file.h>
#include <linux/proc_fs.h>
#include <linux/delay.h>
#include <linux/param.h>
#ifdef CONFIG_PROC_FS
#define HAS_FPU 0x0001
#define HAS_MMU 0x0002
#define HAS_ETHERNET100 0x0004
#define HAS_TOKENRING 0x0008
#define HAS_SCSI 0x0010
#define HAS_ATA 0x0020
#define HAS_USB 0x0040
#define HAS_IRQ_BUG 0x0080
#define HAS_MMU_BUG 0x0100
struct cpu_info {
char *cpu_model;
unsigned short rev;
unsigned short cache_size;
unsigned short flags;
};
/* Some of these model are here for historical reasons only. */
static struct cpu_info cpinfo[] = {
{"ETRAX 1", 0, 0, 0},
{"ETRAX 2", 1, 0, 0},
{"ETRAX 3", 2, 0, 0},
{"ETRAX 4", 3, 0, 0},
{"Simulator", 7, 8, HAS_ETHERNET100 | HAS_SCSI | HAS_ATA},
{"ETRAX 100", 8, 8, HAS_ETHERNET100 | HAS_SCSI | HAS_ATA | HAS_IRQ_BUG},
{"ETRAX 100", 9, 8, HAS_ETHERNET100 | HAS_SCSI | HAS_ATA},
{"ETRAX 100LX", 10, 8, HAS_ETHERNET100 | HAS_SCSI | HAS_ATA | HAS_USB
| HAS_MMU | HAS_MMU_BUG},
{"ETRAX 100LX v2", 11, 8, HAS_ETHERNET100 | HAS_SCSI | HAS_ATA | HAS_USB
| HAS_MMU},
{"ETRAX FS", 32, 32, HAS_ETHERNET100 | HAS_ATA | HAS_MMU},
{"Unknown", 0, 0, 0}
};
int
show_cpuinfo(struct seq_file *m, void *v)
{
int i;
int cpu = (int)v - 1;
int entries;
unsigned long revision;
struct cpu_info *info;
entries = sizeof cpinfo / sizeof(struct cpu_info);
info = &cpinfo[entries - 1];
#ifdef CONFIG_SMP
if (!cpu_online(cpu))
return 0;
#endif
revision = rdvr();
for (i = 0; i < entries; i++) {
if (cpinfo[i].rev == revision) {
info = &cpinfo[i];
break;
}
}
return seq_printf(m,
"processor\t: %d\n"
"cpu\t\t: CRIS\n"
"cpu revision\t: %lu\n"
"cpu model\t: %s\n"
"cache size\t: %d KB\n"
"fpu\t\t: %s\n"
"mmu\t\t: %s\n"
"mmu DMA bug\t: %s\n"
"ethernet\t: %s Mbps\n"
"token ring\t: %s\n"
"scsi\t\t: %s\n"
"ata\t\t: %s\n"
"usb\t\t: %s\n"
"bogomips\t: %lu.%02lu\n\n",
cpu,
revision,
info->cpu_model,
info->cache_size,
info->flags & HAS_FPU ? "yes" : "no",
info->flags & HAS_MMU ? "yes" : "no",
info->flags & HAS_MMU_BUG ? "yes" : "no",
info->flags & HAS_ETHERNET100 ? "10/100" : "10",
info->flags & HAS_TOKENRING ? "4/16 Mbps" : "no",
info->flags & HAS_SCSI ? "yes" : "no",
info->flags & HAS_ATA ? "yes" : "no",
info->flags & HAS_USB ? "yes" : "no",
(loops_per_jiffy * HZ + 500) / 500000,
((loops_per_jiffy * HZ + 500) / 5000) % 100);
}
#endif /* CONFIG_PROC_FS */
void
show_etrax_copyright(void)
{
printk(KERN_INFO
"Linux/CRISv32 port on ETRAX FS (C) 2003, 2004 Axis Communications AB\n");
}

View file

@ -0,0 +1,708 @@
/*
* Copyright (C) 2003, Axis Communications AB.
*/
#include <linux/sched.h>
#include <linux/mm.h>
#include <linux/kernel.h>
#include <linux/signal.h>
#include <linux/errno.h>
#include <linux/wait.h>
#include <linux/ptrace.h>
#include <linux/unistd.h>
#include <linux/stddef.h>
#include <linux/syscalls.h>
#include <linux/vmalloc.h>
#include <asm/io.h>
#include <asm/processor.h>
#include <asm/ucontext.h>
#include <asm/uaccess.h>
#include <asm/arch/ptrace.h>
#include <asm/arch/hwregs/cpu_vect.h>
extern unsigned long cris_signal_return_page;
/* Flag to check if a signal is blockable. */
#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
/*
* A syscall in CRIS is really a "break 13" instruction, which is 2
* bytes. The registers is manipulated so upon return the instruction
* will be executed again.
*
* This relies on that PC points to the instruction after the break call.
*/
#define RESTART_CRIS_SYS(regs) regs->r10 = regs->orig_r10; regs->erp -= 2;
/* Signal frames. */
struct signal_frame {
struct sigcontext sc;
unsigned long extramask[_NSIG_WORDS - 1];
unsigned char retcode[8]; /* Trampoline code. */
};
struct rt_signal_frame {
struct siginfo *pinfo;
void *puc;
struct siginfo info;
struct ucontext uc;
unsigned char retcode[8]; /* Trampoline code. */
};
int do_signal(int restart, sigset_t *oldset, struct pt_regs *regs);
void keep_debug_flags(unsigned long oldccs, unsigned long oldspc,
struct pt_regs *regs);
/*
* Swap in the new signal mask, and wait for a signal. Define some
* dummy arguments to be able to reach the regs argument.
*/
int
sys_sigsuspend(old_sigset_t mask, long r11, long r12, long r13, long mof,
long srp, struct pt_regs *regs)
{
sigset_t saveset;
mask &= _BLOCKABLE;
spin_lock_irq(&current->sighand->siglock);
saveset = current->blocked;
siginitset(&current->blocked, mask);
recalc_sigpending();
spin_unlock_irq(&current->sighand->siglock);
regs->r10 = -EINTR;
while (1) {
current->state = TASK_INTERRUPTIBLE;
schedule();
if (do_signal(0, &saveset, regs)) {
/*
* This point is reached twice: once to call
* the signal handler, then again to return
* from the sigsuspend system call. When
* calling the signal handler, R10 hold the
* signal number as set by do_signal(). The
* sigsuspend call will always return with
* the restored value above; -EINTR.
*/
return regs->r10;
}
}
}
/* Define some dummy arguments to be able to reach the regs argument. */
int
sys_rt_sigsuspend(sigset_t *unewset, size_t sigsetsize, long r12, long r13,
long mof, long srp, struct pt_regs *regs)
{
sigset_t saveset;
sigset_t newset;
if (sigsetsize != sizeof(sigset_t))
return -EINVAL;
if (copy_from_user(&newset, unewset, sizeof(newset)))
return -EFAULT;
sigdelsetmask(&newset, ~_BLOCKABLE);
spin_lock_irq(&current->sighand->siglock);
saveset = current->blocked;
current->blocked = newset;
recalc_sigpending();
spin_unlock_irq(&current->sighand->siglock);
regs->r10 = -EINTR;
while (1) {
current->state = TASK_INTERRUPTIBLE;
schedule();
if (do_signal(0, &saveset, regs)) {
/* See comment in function above. */
return regs->r10;
}
}
}
int
sys_sigaction(int signal, const struct old_sigaction *act,
struct old_sigaction *oact)
{
int retval;
struct k_sigaction newk;
struct k_sigaction oldk;
if (act) {
old_sigset_t mask;
if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
__get_user(newk.sa.sa_handler, &act->sa_handler) ||
__get_user(newk.sa.sa_restorer, &act->sa_restorer))
return -EFAULT;
__get_user(newk.sa.sa_flags, &act->sa_flags);
__get_user(mask, &act->sa_mask);
siginitset(&newk.sa.sa_mask, mask);
}
retval = do_sigaction(signal, act ? &newk : NULL, oact ? &oldk : NULL);
if (!retval && oact) {
if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
__put_user(oldk.sa.sa_handler, &oact->sa_handler) ||
__put_user(oldk.sa.sa_restorer, &oact->sa_restorer))
return -EFAULT;
__put_user(oldk.sa.sa_flags, &oact->sa_flags);
__put_user(oldk.sa.sa_mask.sig[0], &oact->sa_mask);
}
return retval;
}
int
sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss)
{
return do_sigaltstack(uss, uoss, rdusp());
}
static int
restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc)
{
unsigned int err = 0;
unsigned long old_usp;
/* Always make any pending restarted system calls return -EINTR */
current_thread_info()->restart_block.fn = do_no_restart_syscall;
/*
* Restore the registers from &sc->regs. sc is already checked
* for VERIFY_READ since the signal_frame was previously
* checked in sys_sigreturn().
*/
if (__copy_from_user(regs, sc, sizeof(struct pt_regs)))
goto badframe;
/* Make that the user-mode flag is set. */
regs->ccs |= (1 << (U_CCS_BITNR + CCS_SHIFT));
/* Restore the old USP. */
err |= __get_user(old_usp, &sc->usp);
wrusp(old_usp);
return err;
badframe:
return 1;
}
/* Define some dummy arguments to be able to reach the regs argument. */
asmlinkage int
sys_sigreturn(long r10, long r11, long r12, long r13, long mof, long srp,
struct pt_regs *regs)
{
sigset_t set;
struct signal_frame __user *frame;
unsigned long oldspc = regs->spc;
unsigned long oldccs = regs->ccs;
frame = (struct signal_frame *) rdusp();
/*
* Since the signal is stacked on a dword boundary, the frame
* should be dword aligned here as well. It it's not, then the
* user is trying some funny business.
*/
if (((long)frame) & 3)
goto badframe;
if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
goto badframe;
if (__get_user(set.sig[0], &frame->sc.oldmask) ||
(_NSIG_WORDS > 1 && __copy_from_user(&set.sig[1],
frame->extramask,
sizeof(frame->extramask))))
goto badframe;
sigdelsetmask(&set, ~_BLOCKABLE);
spin_lock_irq(&current->sighand->siglock);
current->blocked = set;
recalc_sigpending();
spin_unlock_irq(&current->sighand->siglock);
if (restore_sigcontext(regs, &frame->sc))
goto badframe;
keep_debug_flags(oldccs, oldspc, regs);
return regs->r10;
badframe:
force_sig(SIGSEGV, current);
return 0;
}
/* Define some dummy variables to be able to reach the regs argument. */
asmlinkage int
sys_rt_sigreturn(long r10, long r11, long r12, long r13, long mof, long srp,
struct pt_regs *regs)
{
sigset_t set;
struct rt_signal_frame __user *frame;
unsigned long oldspc = regs->spc;
unsigned long oldccs = regs->ccs;
frame = (struct rt_signal_frame *) rdusp();
/*
* Since the signal is stacked on a dword boundary, the frame
* should be dword aligned here as well. It it's not, then the
* user is trying some funny business.
*/
if (((long)frame) & 3)
goto badframe;
if (!access_ok(VERIFY_READ, frame, sizeof(*frame)))
goto badframe;
if (__copy_from_user(&set, &frame->uc.uc_sigmask, sizeof(set)))
goto badframe;
sigdelsetmask(&set, ~_BLOCKABLE);
spin_lock_irq(&current->sighand->siglock);
current->blocked = set;
recalc_sigpending();
spin_unlock_irq(&current->sighand->siglock);
if (restore_sigcontext(regs, &frame->uc.uc_mcontext))
goto badframe;
if (do_sigaltstack(&frame->uc.uc_stack, NULL, rdusp()) == -EFAULT)
goto badframe;
keep_debug_flags(oldccs, oldspc, regs);
return regs->r10;
badframe:
force_sig(SIGSEGV, current);
return 0;
}
/* Setup a signal frame. */
static int
setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
unsigned long mask)
{
int err;
unsigned long usp;
err = 0;
usp = rdusp();
/*
* Copy the registers. They are located first in sc, so it's
* possible to use sc directly.
*/
err |= __copy_to_user(sc, regs, sizeof(struct pt_regs));
err |= __put_user(mask, &sc->oldmask);
err |= __put_user(usp, &sc->usp);
return err;
}
/* Figure out where to put the new signal frame - usually on the stack. */
static inline void __user *
get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
{
unsigned long sp;
sp = rdusp();
/* This is the X/Open sanctioned signal stack switching. */
if (ka->sa.sa_flags & SA_ONSTACK) {
if (!on_sig_stack(sp))
sp = current->sas_ss_sp + current->sas_ss_size;
}
/* Make sure the frame is dword-aligned. */
sp &= ~3;
return (void __user *)(sp - frame_size);
}
/* Grab and setup a signal frame.
*
* Basically a lot of state-info is stacked, and arranged for the
* user-mode program to return to the kernel using either a trampiline
* which performs the syscall sigreturn(), or a provided user-mode
* trampoline.
*/
static void
setup_frame(int sig, struct k_sigaction *ka, sigset_t *set,
struct pt_regs * regs)
{
int err;
unsigned long return_ip;
struct signal_frame __user *frame;
err = 0;
frame = get_sigframe(ka, regs, sizeof(*frame));
if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
goto give_sigsegv;
err |= setup_sigcontext(&frame->sc, regs, set->sig[0]);
if (err)
goto give_sigsegv;
if (_NSIG_WORDS > 1) {
err |= __copy_to_user(frame->extramask, &set->sig[1],
sizeof(frame->extramask));
}
if (err)
goto give_sigsegv;
/*
* Set up to return from user-space. If provided, use a stub
* already located in user-space.
*/
if (ka->sa.sa_flags & SA_RESTORER) {
return_ip = (unsigned long)ka->sa.sa_restorer;
} else {
/* Trampoline - the desired return ip is in the signal return page. */
return_ip = cris_signal_return_page;
/*
* This is movu.w __NR_sigreturn, r9; break 13;
*
* WE DO NOT USE IT ANY MORE! It's only left here for historical
* reasons and because gdb uses it as a signature to notice
* signal handler stack frames.
*/
err |= __put_user(0x9c5f, (short __user*)(frame->retcode+0));
err |= __put_user(__NR_sigreturn, (short __user*)(frame->retcode+2));
err |= __put_user(0xe93d, (short __user*)(frame->retcode+4));
}
if (err)
goto give_sigsegv;
/*
* Set up registers for signal handler.
*
* Where the code enters now.
* Where the code enter later.
* First argument, signo.
*/
regs->erp = (unsigned long) ka->sa.sa_handler;
regs->srp = return_ip;
regs->r10 = sig;
/* Actually move the USP to reflect the stacked frame. */
wrusp((unsigned long)frame);
return;
give_sigsegv:
if (sig == SIGSEGV)
ka->sa.sa_handler = SIG_DFL;
force_sig(SIGSEGV, current);
}
static void
setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
sigset_t *set, struct pt_regs * regs)
{
int err;
unsigned long return_ip;
struct rt_signal_frame __user *frame;
err = 0;
frame = get_sigframe(ka, regs, sizeof(*frame));
if (!access_ok(VERIFY_WRITE, frame, sizeof(*frame)))
goto give_sigsegv;
/* TODO: what is the current->exec_domain stuff and invmap ? */
err |= __put_user(&frame->info, &frame->pinfo);
err |= __put_user(&frame->uc, &frame->puc);
err |= copy_siginfo_to_user(&frame->info, info);
if (err)
goto give_sigsegv;
/* Clear all the bits of the ucontext we don't use. */
err |= __clear_user(&frame->uc, offsetof(struct ucontext, uc_mcontext));
err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, set->sig[0]);
err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
if (err)
goto give_sigsegv;
/*
* Set up to return from user-space. If provided, use a stub
* already located in user-space.
*/
if (ka->sa.sa_flags & SA_RESTORER) {
return_ip = (unsigned long) ka->sa.sa_restorer;
} else {
/* Trampoline - the desired return ip is in the signal return page. */
return_ip = cris_signal_return_page + 6;
/*
* This is movu.w __NR_rt_sigreturn, r9; break 13;
*
* WE DO NOT USE IT ANY MORE! It's only left here for historical
* reasons and because gdb uses it as a signature to notice
* signal handler stack frames.
*/
err |= __put_user(0x9c5f, (short __user*)(frame->retcode+0));
err |= __put_user(__NR_rt_sigreturn,
(short __user*)(frame->retcode+2));
err |= __put_user(0xe93d, (short __user*)(frame->retcode+4));
}
if (err)
goto give_sigsegv;
/*
* Set up registers for signal handler.
*
* Where the code enters now.
* Where the code enters later.
* First argument is signo.
* Second argument is (siginfo_t *).
* Third argument is unused.
*/
regs->erp = (unsigned long) ka->sa.sa_handler;
regs->srp = return_ip;
regs->r10 = sig;
regs->r11 = (unsigned long) &frame->info;
regs->r12 = 0;
/* Actually move the usp to reflect the stacked frame. */
wrusp((unsigned long)frame);
return;
give_sigsegv:
if (sig == SIGSEGV)
ka->sa.sa_handler = SIG_DFL;
force_sig(SIGSEGV, current);
}
/* Invoke a singal handler to, well, handle the signal. */
extern inline void
handle_signal(int canrestart, unsigned long sig,
siginfo_t *info, struct k_sigaction *ka,
sigset_t *oldset, struct pt_regs * regs)
{
/* Check if this got called from a system call. */
if (canrestart) {
/* If so, check system call restarting. */
switch (regs->r10) {
case -ERESTART_RESTARTBLOCK:
case -ERESTARTNOHAND:
/*
* This means that the syscall should
* only be restarted if there was no
* handler for the signal, and since
* this point isn't reached unless
* there is a handler, there's no need
* to restart.
*/
regs->r10 = -EINTR;
break;
case -ERESTARTSYS:
/*
* This means restart the syscall if
* there is no handler, or the handler
* was registered with SA_RESTART.
*/
if (!(ka->sa.sa_flags & SA_RESTART)) {
regs->r10 = -EINTR;
break;
}
/* Fall through. */
case -ERESTARTNOINTR:
/*
* This means that the syscall should
* be called again after the signal
* handler returns.
*/
RESTART_CRIS_SYS(regs);
break;
}
}
/* Set up the stack frame. */
if (ka->sa.sa_flags & SA_SIGINFO)
setup_rt_frame(sig, ka, info, oldset, regs);
else
setup_frame(sig, ka, oldset, regs);
if (ka->sa.sa_flags & SA_ONESHOT)
ka->sa.sa_handler = SIG_DFL;
if (!(ka->sa.sa_flags & SA_NODEFER)) {
spin_lock_irq(&current->sighand->siglock);
sigorsets(&current->blocked,&current->blocked,&ka->sa.sa_mask);
sigaddset(&current->blocked,sig);
recalc_sigpending();
spin_unlock_irq(&current->sighand->siglock);
}
}
/*
* Note that 'init' is a special process: it doesn't get signals it doesn't
* want to handle. Thus you cannot kill init even with a SIGKILL even by
* mistake.
*
* Also note that the regs structure given here as an argument, is the latest
* pushed pt_regs. It may or may not be the same as the first pushed registers
* when the initial usermode->kernelmode transition took place. Therefore
* we can use user_mode(regs) to see if we came directly from kernel or user
* mode below.
*/
int
do_signal(int canrestart, sigset_t *oldset, struct pt_regs *regs)
{
int signr;
siginfo_t info;
struct k_sigaction ka;
/*
* The common case should go fast, which is why this point is
* reached from kernel-mode. If that's the case, just return
* without doing anything.
*/
if (!user_mode(regs))
return 1;
if (!oldset)
oldset = &current->blocked;
signr = get_signal_to_deliver(&info, &ka, regs, NULL);
if (signr > 0) {
/* Deliver the signal. */
handle_signal(canrestart, signr, &info, &ka, oldset, regs);
return 1;
}
/* Got here from a system call? */
if (canrestart) {
/* Restart the system call - no handlers present. */
if (regs->r10 == -ERESTARTNOHAND ||
regs->r10 == -ERESTARTSYS ||
regs->r10 == -ERESTARTNOINTR) {
RESTART_CRIS_SYS(regs);
}
if (regs->r10 == -ERESTART_RESTARTBLOCK){
regs->r10 = __NR_restart_syscall;
regs->erp -= 2;
}
}
return 0;
}
asmlinkage void
ugdb_trap_user(struct thread_info *ti, int sig)
{
if (((user_regs(ti)->exs & 0xff00) >> 8) != SINGLE_STEP_INTR_VECT) {
/* Zero single-step PC if the reason we stopped wasn't a single
step exception. This is to avoid relying on it when it isn't
reliable. */
user_regs(ti)->spc = 0;
}
/* FIXME: Filter out false h/w breakpoint hits (i.e. EDA
not withing any configured h/w breakpoint range). Synchronize with
what already exists for kernel debugging. */
if (((user_regs(ti)->exs & 0xff00) >> 8) == BREAK_8_INTR_VECT) {
/* Break 8: subtract 2 from ERP unless in a delay slot. */
if (!(user_regs(ti)->erp & 0x1))
user_regs(ti)->erp -= 2;
}
sys_kill(ti->task->pid, sig);
}
void
keep_debug_flags(unsigned long oldccs, unsigned long oldspc,
struct pt_regs *regs)
{
if (oldccs & (1 << Q_CCS_BITNR)) {
/* Pending single step due to single-stepping the break 13
in the signal trampoline: keep the Q flag. */
regs->ccs |= (1 << Q_CCS_BITNR);
/* S flag should be set - complain if it's not. */
if (!(oldccs & (1 << (S_CCS_BITNR + CCS_SHIFT)))) {
printk("Q flag but no S flag?");
}
regs->ccs |= (1 << (S_CCS_BITNR + CCS_SHIFT));
/* Assume the SPC is valid and interesting. */
regs->spc = oldspc;
} else if (oldccs & (1 << (S_CCS_BITNR + CCS_SHIFT))) {
/* If a h/w bp was set in the signal handler we need
to keep the S flag. */
regs->ccs |= (1 << (S_CCS_BITNR + CCS_SHIFT));
/* Don't keep the old SPC though; if we got here due to
a single-step, the Q flag should have been set. */
} else if (regs->spc) {
/* If we were single-stepping *before* the signal was taken,
we don't want to restore that state now, because GDB will
have forgotten all about it. */
regs->spc = 0;
regs->ccs &= ~(1 << (S_CCS_BITNR + CCS_SHIFT));
}
}
/* Set up the trampolines on the signal return page. */
int __init
cris_init_signal(void)
{
u16* data = (u16*)kmalloc(PAGE_SIZE, GFP_KERNEL);
/* This is movu.w __NR_sigreturn, r9; break 13; */
data[0] = 0x9c5f;
data[1] = __NR_sigreturn;
data[2] = 0xe93d;
/* This is movu.w __NR_rt_sigreturn, r9; break 13; */
data[3] = 0x9c5f;
data[4] = __NR_rt_sigreturn;
data[5] = 0xe93d;
/* Map to userspace with appropriate permissions (no write access...) */
cris_signal_return_page = (unsigned long)
__ioremap_prot(virt_to_phys(data), PAGE_SIZE, PAGE_SIGNAL_TRAMPOLINE);
return 0;
}
__initcall(cris_init_signal);

View file

@ -0,0 +1,348 @@
#include <asm/delay.h>
#include <asm/arch/irq.h>
#include <asm/arch/hwregs/intr_vect.h>
#include <asm/arch/hwregs/intr_vect_defs.h>
#include <asm/tlbflush.h>
#include <asm/mmu_context.h>
#include <asm/arch/hwregs/mmu_defs_asm.h>
#include <asm/arch/hwregs/supp_reg.h>
#include <asm/atomic.h>
#include <linux/err.h>
#include <linux/init.h>
#include <linux/timex.h>
#include <linux/sched.h>
#include <linux/kernel.h>
#include <linux/cpumask.h>
#include <linux/interrupt.h>
#define IPI_SCHEDULE 1
#define IPI_CALL 2
#define IPI_FLUSH_TLB 4
#define FLUSH_ALL (void*)0xffffffff
/* Vector of locks used for various atomic operations */
spinlock_t cris_atomic_locks[] = { [0 ... LOCK_COUNT - 1] = SPIN_LOCK_UNLOCKED};
/* CPU masks */
cpumask_t cpu_online_map = CPU_MASK_NONE;
cpumask_t phys_cpu_present_map = CPU_MASK_NONE;
/* Variables used during SMP boot */
volatile int cpu_now_booting = 0;
volatile struct thread_info *smp_init_current_idle_thread;
/* Variables used during IPI */
static DEFINE_SPINLOCK(call_lock);
static DEFINE_SPINLOCK(tlbstate_lock);
struct call_data_struct {
void (*func) (void *info);
void *info;
int wait;
};
static struct call_data_struct * call_data;
static struct mm_struct* flush_mm;
static struct vm_area_struct* flush_vma;
static unsigned long flush_addr;
extern int setup_irq(int, struct irqaction *);
/* Mode registers */
static unsigned long irq_regs[NR_CPUS] =
{
regi_irq,
regi_irq2
};
static irqreturn_t crisv32_ipi_interrupt(int irq, void *dev_id, struct pt_regs *regs);
static int send_ipi(int vector, int wait, cpumask_t cpu_mask);
static struct irqaction irq_ipi = { crisv32_ipi_interrupt, SA_INTERRUPT,
CPU_MASK_NONE, "ipi", NULL, NULL};
extern void cris_mmu_init(void);
extern void cris_timer_init(void);
/* SMP initialization */
void __init smp_prepare_cpus(unsigned int max_cpus)
{
int i;
/* From now on we can expect IPIs so set them up */
setup_irq(IPI_INTR_VECT, &irq_ipi);
/* Mark all possible CPUs as present */
for (i = 0; i < max_cpus; i++)
cpu_set(i, phys_cpu_present_map);
}
void __devinit smp_prepare_boot_cpu(void)
{
/* PGD pointer has moved after per_cpu initialization so
* update the MMU.
*/
pgd_t **pgd;
pgd = (pgd_t**)&per_cpu(current_pgd, smp_processor_id());
SUPP_BANK_SEL(1);
SUPP_REG_WR(RW_MM_TLB_PGD, pgd);
SUPP_BANK_SEL(2);
SUPP_REG_WR(RW_MM_TLB_PGD, pgd);
cpu_set(0, cpu_online_map);
cpu_set(0, phys_cpu_present_map);
}
void __init smp_cpus_done(unsigned int max_cpus)
{
}
/* Bring one cpu online.*/
static int __init
smp_boot_one_cpu(int cpuid)
{
unsigned timeout;
struct task_struct *idle;
idle = fork_idle(cpuid);
if (IS_ERR(idle))
panic("SMP: fork failed for CPU:%d", cpuid);
idle->thread_info->cpu = cpuid;
/* Information to the CPU that is about to boot */
smp_init_current_idle_thread = idle->thread_info;
cpu_now_booting = cpuid;
/* Wait for CPU to come online */
for (timeout = 0; timeout < 10000; timeout++) {
if(cpu_online(cpuid)) {
cpu_now_booting = 0;
smp_init_current_idle_thread = NULL;
return 0; /* CPU online */
}
udelay(100);
barrier();
}
put_task_struct(idle);
idle = NULL;
printk(KERN_CRIT "SMP: CPU:%d is stuck.\n", cpuid);
return -1;
}
/* Secondary CPUs starts uing C here. Here we need to setup CPU
* specific stuff such as the local timer and the MMU. */
void __init smp_callin(void)
{
extern void cpu_idle(void);
int cpu = cpu_now_booting;
reg_intr_vect_rw_mask vect_mask = {0};
/* Initialise the idle task for this CPU */
atomic_inc(&init_mm.mm_count);
current->active_mm = &init_mm;
/* Set up MMU */
cris_mmu_init();
__flush_tlb_all();
/* Setup local timer. */
cris_timer_init();
/* Enable IRQ and idle */
REG_WR(intr_vect, irq_regs[cpu], rw_mask, vect_mask);
unmask_irq(IPI_INTR_VECT);
unmask_irq(TIMER_INTR_VECT);
local_irq_enable();
cpu_set(cpu, cpu_online_map);
cpu_idle();
}
/* Stop execution on this CPU.*/
void stop_this_cpu(void* dummy)
{
local_irq_disable();
asm volatile("halt");
}
/* Other calls */
void smp_send_stop(void)
{
smp_call_function(stop_this_cpu, NULL, 1, 0);
}
int setup_profiling_timer(unsigned int multiplier)
{
return -EINVAL;
}
/* cache_decay_ticks is used by the scheduler to decide if a process
* is "hot" on one CPU. A higher value means a higher penalty to move
* a process to another CPU. Our cache is rather small so we report
* 1 tick.
*/
unsigned long cache_decay_ticks = 1;
int __devinit __cpu_up(unsigned int cpu)
{
smp_boot_one_cpu(cpu);
return cpu_online(cpu) ? 0 : -ENOSYS;
}
void smp_send_reschedule(int cpu)
{
cpumask_t cpu_mask = CPU_MASK_NONE;
cpu_set(cpu, cpu_mask);
send_ipi(IPI_SCHEDULE, 0, cpu_mask);
}
/* TLB flushing
*
* Flush needs to be done on the local CPU and on any other CPU that
* may have the same mapping. The mm->cpu_vm_mask is used to keep track
* of which CPUs that a specific process has been executed on.
*/
void flush_tlb_common(struct mm_struct* mm, struct vm_area_struct* vma, unsigned long addr)
{
unsigned long flags;
cpumask_t cpu_mask;
spin_lock_irqsave(&tlbstate_lock, flags);
cpu_mask = (mm == FLUSH_ALL ? CPU_MASK_ALL : mm->cpu_vm_mask);
cpu_clear(smp_processor_id(), cpu_mask);
flush_mm = mm;
flush_vma = vma;
flush_addr = addr;
send_ipi(IPI_FLUSH_TLB, 1, cpu_mask);
spin_unlock_irqrestore(&tlbstate_lock, flags);
}
void flush_tlb_all(void)
{
__flush_tlb_all();
flush_tlb_common(FLUSH_ALL, FLUSH_ALL, 0);
}
void flush_tlb_mm(struct mm_struct *mm)
{
__flush_tlb_mm(mm);
flush_tlb_common(mm, FLUSH_ALL, 0);
/* No more mappings in other CPUs */
cpus_clear(mm->cpu_vm_mask);
cpu_set(smp_processor_id(), mm->cpu_vm_mask);
}
void flush_tlb_page(struct vm_area_struct *vma,
unsigned long addr)
{
__flush_tlb_page(vma, addr);
flush_tlb_common(vma->vm_mm, vma, addr);
}
/* Inter processor interrupts
*
* The IPIs are used for:
* * Force a schedule on a CPU
* * FLush TLB on other CPUs
* * Call a function on other CPUs
*/
int send_ipi(int vector, int wait, cpumask_t cpu_mask)
{
int i = 0;
reg_intr_vect_rw_ipi ipi = REG_RD(intr_vect, irq_regs[i], rw_ipi);
int ret = 0;
/* Calculate CPUs to send to. */
cpus_and(cpu_mask, cpu_mask, cpu_online_map);
/* Send the IPI. */
for_each_cpu_mask(i, cpu_mask)
{
ipi.vector |= vector;
REG_WR(intr_vect, irq_regs[i], rw_ipi, ipi);
}
/* Wait for IPI to finish on other CPUS */
if (wait) {
for_each_cpu_mask(i, cpu_mask) {
int j;
for (j = 0 ; j < 1000; j++) {
ipi = REG_RD(intr_vect, irq_regs[i], rw_ipi);
if (!ipi.vector)
break;
udelay(100);
}
/* Timeout? */
if (ipi.vector) {
printk("SMP call timeout from %d to %d\n", smp_processor_id(), i);
ret = -ETIMEDOUT;
dump_stack();
}
}
}
return ret;
}
/*
* You must not call this function with disabled interrupts or from a
* hardware interrupt handler or from a bottom half handler.
*/
int smp_call_function(void (*func)(void *info), void *info,
int nonatomic, int wait)
{
cpumask_t cpu_mask = CPU_MASK_ALL;
struct call_data_struct data;
int ret;
cpu_clear(smp_processor_id(), cpu_mask);
WARN_ON(irqs_disabled());
data.func = func;
data.info = info;
data.wait = wait;
spin_lock(&call_lock);
call_data = &data;
ret = send_ipi(IPI_CALL, wait, cpu_mask);
spin_unlock(&call_lock);
return ret;
}
irqreturn_t crisv32_ipi_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
void (*func) (void *info) = call_data->func;
void *info = call_data->info;
reg_intr_vect_rw_ipi ipi;
ipi = REG_RD(intr_vect, irq_regs[smp_processor_id()], rw_ipi);
if (ipi.vector & IPI_CALL) {
func(info);
}
if (ipi.vector & IPI_FLUSH_TLB) {
if (flush_mm == FLUSH_ALL)
__flush_tlb_all();
else if (flush_vma == FLUSH_ALL)
__flush_tlb_mm(flush_mm);
else
__flush_tlb_page(flush_vma, flush_addr);
}
ipi.vector = 0;
REG_WR(intr_vect, irq_regs[smp_processor_id()], rw_ipi, ipi);
return IRQ_HANDLED;
}

View file

@ -0,0 +1,341 @@
/* $Id: time.c,v 1.19 2005/04/29 05:40:09 starvik Exp $
*
* linux/arch/cris/arch-v32/kernel/time.c
*
* Copyright (C) 2003 Axis Communications AB
*
*/
#include <linux/config.h>
#include <linux/timex.h>
#include <linux/time.h>
#include <linux/jiffies.h>
#include <linux/interrupt.h>
#include <linux/swap.h>
#include <linux/sched.h>
#include <linux/init.h>
#include <linux/threads.h>
#include <asm/types.h>
#include <asm/signal.h>
#include <asm/io.h>
#include <asm/delay.h>
#include <asm/rtc.h>
#include <asm/irq.h>
#include <asm/arch/hwregs/reg_map.h>
#include <asm/arch/hwregs/reg_rdwr.h>
#include <asm/arch/hwregs/timer_defs.h>
#include <asm/arch/hwregs/intr_vect_defs.h>
/* Watchdog defines */
#define ETRAX_WD_KEY_MASK 0x7F /* key is 7 bit */
#define ETRAX_WD_HZ 763 /* watchdog counts at 763 Hz */
#define ETRAX_WD_CNT ((2*ETRAX_WD_HZ)/HZ + 1) /* Number of 763 counts before watchdog bites */
unsigned long timer_regs[NR_CPUS] =
{
regi_timer,
#ifdef CONFIG_SMP
regi_timer2
#endif
};
extern void update_xtime_from_cmos(void);
extern int set_rtc_mmss(unsigned long nowtime);
extern int setup_irq(int, struct irqaction *);
extern int have_rtc;
unsigned long get_ns_in_jiffie(void)
{
reg_timer_r_tmr0_data data;
unsigned long ns;
data = REG_RD(timer, regi_timer, r_tmr0_data);
ns = (TIMER0_DIV - data) * 10;
return ns;
}
unsigned long do_slow_gettimeoffset(void)
{
unsigned long count;
unsigned long usec_count = 0;
static unsigned long count_p = TIMER0_DIV;/* for the first call after boot */
static unsigned long jiffies_p = 0;
/*
* cache volatile jiffies temporarily; we have IRQs turned off.
*/
unsigned long jiffies_t;
/* The timer interrupt comes from Etrax timer 0. In order to get
* better precision, we check the current value. It might have
* underflowed already though.
*/
count = REG_RD(timer, regi_timer, r_tmr0_data);
jiffies_t = jiffies;
/*
* avoiding timer inconsistencies (they are rare, but they happen)...
* there are one problem that must be avoided here:
* 1. the timer counter underflows
*/
if( jiffies_t == jiffies_p ) {
if( count > count_p ) {
/* Timer wrapped, use new count and prescale
* increase the time corresponding to one jiffie
*/
usec_count = 1000000/HZ;
}
} else
jiffies_p = jiffies_t;
count_p = count;
/* Convert timer value to usec */
/* 100 MHz timer, divide by 100 to get usec */
usec_count += (TIMER0_DIV - count) / 100;
return usec_count;
}
/* From timer MDS describing the hardware watchdog:
* 4.3.1 Watchdog Operation
* The watchdog timer is an 8-bit timer with a configurable start value.
* Once started the whatchdog counts downwards with a frequency of 763 Hz
* (100/131072 MHz). When the watchdog counts down to 1, it generates an
* NMI (Non Maskable Interrupt), and when it counts down to 0, it resets the
* chip.
*/
/* This gives us 1.3 ms to do something useful when the NMI comes */
/* right now, starting the watchdog is the same as resetting it */
#define start_watchdog reset_watchdog
#if defined(CONFIG_ETRAX_WATCHDOG)
static short int watchdog_key = 42; /* arbitrary 7 bit number */
#endif
/* number of pages to consider "out of memory". it is normal that the memory
* is used though, so put this really low.
*/
#define WATCHDOG_MIN_FREE_PAGES 8
void
reset_watchdog(void)
{
#if defined(CONFIG_ETRAX_WATCHDOG)
reg_timer_rw_wd_ctrl wd_ctrl = { 0 };
/* only keep watchdog happy as long as we have memory left! */
if(nr_free_pages() > WATCHDOG_MIN_FREE_PAGES) {
/* reset the watchdog with the inverse of the old key */
watchdog_key ^= ETRAX_WD_KEY_MASK; /* invert key, which is 7 bits */
wd_ctrl.cnt = ETRAX_WD_CNT;
wd_ctrl.cmd = regk_timer_start;
wd_ctrl.key = watchdog_key;
REG_WR(timer, regi_timer, rw_wd_ctrl, wd_ctrl);
}
#endif
}
/* stop the watchdog - we still need the correct key */
void
stop_watchdog(void)
{
#if defined(CONFIG_ETRAX_WATCHDOG)
reg_timer_rw_wd_ctrl wd_ctrl = { 0 };
watchdog_key ^= ETRAX_WD_KEY_MASK; /* invert key, which is 7 bits */
wd_ctrl.cnt = ETRAX_WD_CNT;
wd_ctrl.cmd = regk_timer_stop;
wd_ctrl.key = watchdog_key;
REG_WR(timer, regi_timer, rw_wd_ctrl, wd_ctrl);
#endif
}
extern void show_registers(struct pt_regs *regs);
void
handle_watchdog_bite(struct pt_regs* regs)
{
#if defined(CONFIG_ETRAX_WATCHDOG)
extern int cause_of_death;
raw_printk("Watchdog bite\n");
/* Check if forced restart or unexpected watchdog */
if (cause_of_death == 0xbedead) {
while(1);
}
/* Unexpected watchdog, stop the watchdog and dump registers*/
stop_watchdog();
raw_printk("Oops: bitten by watchdog\n");
show_registers(regs);
#ifndef CONFIG_ETRAX_WATCHDOG_NICE_DOGGY
reset_watchdog();
#endif
while(1) /* nothing */;
#endif
}
/* last time the cmos clock got updated */
static long last_rtc_update = 0;
/*
* timer_interrupt() needs to keep up the real-time clock,
* as well as call the "do_timer()" routine every clocktick
*/
//static unsigned short myjiff; /* used by our debug routine print_timestamp */
extern void cris_do_profile(struct pt_regs *regs);
static inline irqreturn_t
timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
int cpu = smp_processor_id();
reg_timer_r_masked_intr masked_intr;
reg_timer_rw_ack_intr ack_intr = { 0 };
/* Check if the timer interrupt is for us (a tmr0 int) */
masked_intr = REG_RD(timer, timer_regs[cpu], r_masked_intr);
if (!masked_intr.tmr0)
return IRQ_NONE;
/* acknowledge the timer irq */
ack_intr.tmr0 = 1;
REG_WR(timer, timer_regs[cpu], rw_ack_intr, ack_intr);
/* reset watchdog otherwise it resets us! */
reset_watchdog();
/* Update statistics. */
update_process_times(user_mode(regs));
cris_do_profile(regs); /* Save profiling information */
/* The master CPU is responsible for the time keeping. */
if (cpu != 0)
return IRQ_HANDLED;
/* call the real timer interrupt handler */
do_timer(regs);
/*
* If we have an externally synchronized Linux clock, then update
* CMOS clock accordingly every ~11 minutes. Set_rtc_mmss() has to be
* called as close as possible to 500 ms before the new second starts.
*
* The division here is not time critical since it will run once in
* 11 minutes
*/
if ((time_status & STA_UNSYNC) == 0 &&
xtime.tv_sec > last_rtc_update + 660 &&
(xtime.tv_nsec / 1000) >= 500000 - (tick_nsec / 1000) / 2 &&
(xtime.tv_nsec / 1000) <= 500000 + (tick_nsec / 1000) / 2) {
if (set_rtc_mmss(xtime.tv_sec) == 0)
last_rtc_update = xtime.tv_sec;
else
last_rtc_update = xtime.tv_sec - 600; /* do it again in 60 s */
}
return IRQ_HANDLED;
}
/* timer is SA_SHIRQ so drivers can add stuff to the timer irq chain
* it needs to be SA_INTERRUPT to make the jiffies update work properly
*/
static struct irqaction irq_timer = { timer_interrupt, SA_SHIRQ | SA_INTERRUPT,
CPU_MASK_NONE, "timer", NULL, NULL};
void __init
cris_timer_init(void)
{
int cpu = smp_processor_id();
reg_timer_rw_tmr0_ctrl tmr0_ctrl = { 0 };
reg_timer_rw_tmr0_div tmr0_div = TIMER0_DIV;
reg_timer_rw_intr_mask timer_intr_mask;
/* Setup the etrax timers
* Base frequency is 100MHz, divider 1000000 -> 100 HZ
* We use timer0, so timer1 is free.
* The trig timer is used by the fasttimer API if enabled.
*/
tmr0_ctrl.op = regk_timer_ld;
tmr0_ctrl.freq = regk_timer_f100;
REG_WR(timer, timer_regs[cpu], rw_tmr0_div, tmr0_div);
REG_WR(timer, timer_regs[cpu], rw_tmr0_ctrl, tmr0_ctrl); /* Load */
tmr0_ctrl.op = regk_timer_run;
REG_WR(timer, timer_regs[cpu], rw_tmr0_ctrl, tmr0_ctrl); /* Start */
/* enable the timer irq */
timer_intr_mask = REG_RD(timer, timer_regs[cpu], rw_intr_mask);
timer_intr_mask.tmr0 = 1;
REG_WR(timer, timer_regs[cpu], rw_intr_mask, timer_intr_mask);
}
void __init
time_init(void)
{
reg_intr_vect_rw_mask intr_mask;
/* probe for the RTC and read it if it exists
* Before the RTC can be probed the loops_per_usec variable needs
* to be initialized to make usleep work. A better value for
* loops_per_usec is calculated by the kernel later once the
* clock has started.
*/
loops_per_usec = 50;
if(RTC_INIT() < 0) {
/* no RTC, start at 1980 */
xtime.tv_sec = 0;
xtime.tv_nsec = 0;
have_rtc = 0;
} else {
/* get the current time */
have_rtc = 1;
update_xtime_from_cmos();
}
/*
* Initialize wall_to_monotonic such that adding it to xtime will yield zero, the
* tv_nsec field must be normalized (i.e., 0 <= nsec < NSEC_PER_SEC).
*/
set_normalized_timespec(&wall_to_monotonic, -xtime.tv_sec, -xtime.tv_nsec);
/* Start CPU local timer */
cris_timer_init();
/* enable the timer irq in global config */
intr_mask = REG_RD(intr_vect, regi_irq, rw_mask);
intr_mask.timer = 1;
REG_WR(intr_vect, regi_irq, rw_mask, intr_mask);
/* now actually register the timer irq handler that calls timer_interrupt() */
setup_irq(TIMER_INTR_VECT, &irq_timer);
/* enable watchdog if we should use one */
#if defined(CONFIG_ETRAX_WATCHDOG)
printk("Enabling watchdog...\n");
start_watchdog();
/* If we use the hardware watchdog, we want to trap it as an NMI
and dump registers before it resets us. For this to happen, we
must set the "m" NMI enable flag (which once set, is unset only
when an NMI is taken).
The same goes for the external NMI, but that doesn't have any
driver or infrastructure support yet. */
{
unsigned long flags;
local_save_flags(flags);
flags |= (1<<30); /* NMI M flag is at bit 30 */
local_irq_restore(flags);
}
#endif
}

View file

@ -0,0 +1,160 @@
/*
* Copyright (C) 2003, Axis Communications AB.
*/
#include <linux/config.h>
#include <linux/ptrace.h>
#include <asm/uaccess.h>
#include <asm/arch/hwregs/supp_reg.h>
extern void reset_watchdog(void);
extern void stop_watchdog(void);
extern int raw_printk(const char *fmt, ...);
void
show_registers(struct pt_regs *regs)
{
/*
* It's possible to use either the USP register or current->thread.usp.
* USP might not correspond to the current proccess for all cases this
* function is called, and current->thread.usp isn't up to date for the
* current proccess. Experience shows that using USP is the way to go.
*/
unsigned long usp;
unsigned long d_mmu_cause;
unsigned long i_mmu_cause;
usp = rdusp();
raw_printk("CPU: %d\n", smp_processor_id());
raw_printk("ERP: %08lx SRP: %08lx CCS: %08lx USP: %08lx MOF: %08lx\n",
regs->erp, regs->srp, regs->ccs, usp, regs->mof);
raw_printk(" r0: %08lx r1: %08lx r2: %08lx r3: %08lx\n",
regs->r0, regs->r1, regs->r2, regs->r3);
raw_printk(" r4: %08lx r5: %08lx r6: %08lx r7: %08lx\n",
regs->r4, regs->r5, regs->r6, regs->r7);
raw_printk(" r8: %08lx r9: %08lx r10: %08lx r11: %08lx\n",
regs->r8, regs->r9, regs->r10, regs->r11);
raw_printk("r12: %08lx r13: %08lx oR10: %08lx acr: %08lx\n",
regs->r12, regs->r13, regs->orig_r10, regs->acr);
raw_printk("sp: %08lx\n", regs);
SUPP_BANK_SEL(BANK_IM);
SUPP_REG_RD(RW_MM_CAUSE, i_mmu_cause);
SUPP_BANK_SEL(BANK_DM);
SUPP_REG_RD(RW_MM_CAUSE, d_mmu_cause);
raw_printk(" Data MMU Cause: %08lx\n", d_mmu_cause);
raw_printk("Instruction MMU Cause: %08lx\n", i_mmu_cause);
raw_printk("Process %s (pid: %d, stackpage: %08lx)\n",
current->comm, current->pid, (unsigned long) current);
/* Show additional info if in kernel-mode. */
if (!user_mode(regs)) {
int i;
unsigned char c;
show_stack(NULL, (unsigned long *) usp);
/*
* If the previous stack-dump wasn't a kernel one, dump the
* kernel stack now.
*/
if (usp != 0)
show_stack(NULL, NULL);
raw_printk("\nCode: ");
if (regs->erp < PAGE_OFFSET)
goto bad_value;
/*
* Quite often the value at regs->erp doesn't point to the
* interesting instruction, which often is the previous
* instruction. So dump at an offset large enough that the
* instruction decoding should be in sync at the interesting
* point, but small enough to fit on a row. The regs->erp
* location is pointed out in a ksymoops-friendly way by
* wrapping the byte for that address in parenthesis.
*/
for (i = -12; i < 12; i++) {
if (__get_user(c, &((unsigned char *) regs->erp)[i])) {
bad_value:
raw_printk(" Bad IP value.");
break;
}
if (i == 0)
raw_printk("(%02x) ", c);
else
raw_printk("%02x ", c);
}
raw_printk("\n");
}
}
/*
* This gets called from entry.S when the watchdog has bitten. Show something
* similiar to an Oops dump, and if the kernel if configured to be a nice doggy;
* halt instead of reboot.
*/
void
watchdog_bite_hook(struct pt_regs *regs)
{
#ifdef CONFIG_ETRAX_WATCHDOG_NICE_DOGGY
local_irq_disable();
stop_watchdog();
show_registers(regs);
while (1)
; /* Do nothing. */
#else
show_registers(regs);
#endif
}
/* This is normally the Oops function. */
void
die_if_kernel(const char *str, struct pt_regs *regs, long err)
{
if (user_mode(regs))
return;
#ifdef CONFIG_ETRAX_WATCHDOG_NICE_DOGGY
/*
* This printout might take too long and could trigger
* the watchdog normally. If NICE_DOGGY is set, simply
* stop the watchdog during the printout.
*/
stop_watchdog();
#endif
raw_printk("%s: %04lx\n", str, err & 0xffff);
show_registers(regs);
#ifdef CONFIG_ETRAX_WATCHDOG_NICE_DOGGY
reset_watchdog();
#endif
do_exit(SIGSEGV);
}
void arch_enable_nmi(void)
{
unsigned long flags;
local_save_flags(flags);
flags |= (1<<30); /* NMI M flag is at bit 30 */
local_irq_restore(flags);
}

View file

@ -0,0 +1,96 @@
// $Id: vcs_hook.c,v 1.2 2003/08/12 12:01:06 starvik Exp $
//
// Call simulator hook. This is the part running in the
// simulated program.
//
#include "vcs_hook.h"
#include <stdarg.h>
#include <asm/arch-v32/hwregs/reg_map.h>
#include <asm/arch-v32/hwregs/intr_vect_defs.h>
#define HOOK_TRIG_ADDR 0xb7000000 /* hook cvlog model reg address */
#define HOOK_MEM_BASE_ADDR 0xa0000000 /* csp4 (shared mem) base addr */
#define HOOK_DATA(offset) ((unsigned*) HOOK_MEM_BASE_ADDR)[offset]
#define VHOOK_DATA(offset) ((volatile unsigned*) HOOK_MEM_BASE_ADDR)[offset]
#define HOOK_TRIG(funcid) do { *((unsigned *) HOOK_TRIG_ADDR) = funcid; } while(0)
#define HOOK_DATA_BYTE(offset) ((unsigned char*) HOOK_MEM_BASE_ADDR)[offset]
// ------------------------------------------------------------------ hook_call
int hook_call( unsigned id, unsigned pcnt, ...) {
va_list ap;
unsigned i;
unsigned ret;
#ifdef USING_SOS
PREEMPT_OFF_SAVE();
#endif
// pass parameters
HOOK_DATA(0) = id;
/* Have to make hook_print_str a special case since we call with a
parameter of byte type. Should perhaps be a separate
hook_call. */
if (id == hook_print_str) {
int i;
char *str;
HOOK_DATA(1) = pcnt;
va_start(ap, pcnt);
str = (char*)va_arg(ap,unsigned);
for (i=0; i!=pcnt; i++) {
HOOK_DATA_BYTE(8+i) = str[i];
}
HOOK_DATA_BYTE(8+i) = 0; /* null byte */
}
else {
va_start(ap, pcnt);
for( i = 1; i <= pcnt; i++ ) HOOK_DATA(i) = va_arg(ap,unsigned);
va_end(ap);
}
// read from mem to make sure data has propagated to memory before trigging
*((volatile unsigned*) HOOK_MEM_BASE_ADDR);
// trigger hook
HOOK_TRIG(id);
// wait for call to finish
while( VHOOK_DATA(0) > 0 ) {}
// extract return value
ret = VHOOK_DATA(1);
#ifdef USING_SOS
PREEMPT_RESTORE();
#endif
return ret;
}
unsigned
hook_buf(unsigned i)
{
return (HOOK_DATA(i));
}
void print_str( const char *str ) {
int i;
for (i=1; str[i]; i++); /* find null at end of string */
hook_call(hook_print_str, i, str);
}
// --------------------------------------------------------------- CPU_KICK_DOG
void CPU_KICK_DOG(void) {
(void) hook_call( hook_kick_dog, 0 );
}
// ------------------------------------------------------- CPU_WATCHDOG_TIMEOUT
void CPU_WATCHDOG_TIMEOUT( unsigned t ) {
(void) hook_call( hook_dog_timeout, 1, t );
}

View file

@ -0,0 +1,42 @@
// $Id: vcs_hook.h,v 1.1 2003/08/12 12:01:06 starvik Exp $
//
// Call simulator hook functions
#ifndef HOOK_H
#define HOOK_H
int hook_call( unsigned id, unsigned pcnt, ...);
enum hook_ids {
hook_debug_on = 1,
hook_debug_off,
hook_stop_sim_ok,
hook_stop_sim_fail,
hook_alloc_shared,
hook_ptr_shared,
hook_free_shared,
hook_file2shared,
hook_cmp_shared,
hook_print_params,
hook_sim_time,
hook_stop_sim,
hook_kick_dog,
hook_dog_timeout,
hook_rand,
hook_srand,
hook_rand_range,
hook_print_str,
hook_print_hex,
hook_cmp_offset_shared,
hook_fill_random_shared,
hook_alloc_random_data,
hook_calloc_random_data,
hook_print_int,
hook_print_uint,
hook_fputc,
hook_init_fd,
hook_sbrk
};
#endif

View file

@ -0,0 +1,6 @@
#
# Makefile for Etrax-specific library files..
#
lib-y = checksum.o checksumcopy.o string.o usercopy.o memset.o csumcpfruser.o spinlock.o

View file

@ -0,0 +1,111 @@
/*
* A fast checksum routine using movem
* Copyright (c) 1998-2001, 2003 Axis Communications AB
*
* csum_partial(const unsigned char * buff, int len, unsigned int sum)
*/
.globl csum_partial
csum_partial:
;; r10 - src
;; r11 - length
;; r12 - checksum
;; check for breakeven length between movem and normal word looping versions
;; we also do _NOT_ want to compute a checksum over more than the
;; actual length when length < 40
cmpu.w 80,$r11
blo _word_loop
nop
;; need to save the registers we use below in the movem loop
;; this overhead is why we have a check above for breakeven length
;; only r0 - r8 have to be saved, the other ones are clobber-able
;; according to the ABI
subq 9*4,$sp
subq 10*4,$r11 ; update length for the first loop
movem $r8,[$sp]
;; do a movem checksum
_mloop: movem [$r10+],$r9 ; read 10 longwords
;; perform dword checksumming on the 10 longwords
add.d $r0,$r12
addc $r1,$r12
addc $r2,$r12
addc $r3,$r12
addc $r4,$r12
addc $r5,$r12
addc $r6,$r12
addc $r7,$r12
addc $r8,$r12
addc $r9,$r12
;; fold the carry into the checksum, to avoid having to loop the carry
;; back into the top
addc 0,$r12
addc 0,$r12 ; do it again, since we might have generated a carry
subq 10*4,$r11
bge _mloop
nop
addq 10*4,$r11 ; compensate for last loop underflowing length
movem [$sp+],$r8 ; restore regs
_word_loop:
;; only fold if there is anything to fold.
cmpq 0,$r12
beq _no_fold
;; fold 32-bit checksum into a 16-bit checksum, to avoid carries below.
;; r9 and r13 can be used as temporaries.
moveq -1,$r9 ; put 0xffff in r9, faster than move.d 0xffff,r9
lsrq 16,$r9
move.d $r12,$r13
lsrq 16,$r13 ; r13 = checksum >> 16
and.d $r9,$r12 ; checksum = checksum & 0xffff
add.d $r13,$r12 ; checksum += r13
move.d $r12,$r13 ; do the same again, maybe we got a carry last add
lsrq 16,$r13
and.d $r9,$r12
add.d $r13,$r12
_no_fold:
cmpq 2,$r11
blt _no_words
nop
;; checksum the rest of the words
subq 2,$r11
_wloop: subq 2,$r11
bge _wloop
addu.w [$r10+],$r12
addq 2,$r11
_no_words:
;; see if we have one odd byte more
cmpq 1,$r11
beq _do_byte
nop
ret
move.d $r12,$r10
_do_byte:
;; copy and checksum the last byte
addu.b [$r10],$r12
ret
move.d $r12,$r10

View file

@ -0,0 +1,120 @@
/*
* A fast checksum+copy routine using movem
* Copyright (c) 1998, 2001, 2003 Axis Communications AB
*
* Authors: Bjorn Wesen
*
* csum_partial_copy_nocheck(const char *src, char *dst,
* int len, unsigned int sum)
*/
.globl csum_partial_copy_nocheck
csum_partial_copy_nocheck:
;; r10 - src
;; r11 - dst
;; r12 - length
;; r13 - checksum
;; check for breakeven length between movem and normal word looping versions
;; we also do _NOT_ want to compute a checksum over more than the
;; actual length when length < 40
cmpu.w 80,$r12
blo _word_loop
nop
;; need to save the registers we use below in the movem loop
;; this overhead is why we have a check above for breakeven length
;; only r0 - r8 have to be saved, the other ones are clobber-able
;; according to the ABI
subq 9*4,$sp
subq 10*4,$r12 ; update length for the first loop
movem $r8,[$sp]
;; do a movem copy and checksum
1: ;; A failing userspace access (the read) will have this as PC.
_mloop: movem [$r10+],$r9 ; read 10 longwords
movem $r9,[$r11+] ; write 10 longwords
;; perform dword checksumming on the 10 longwords
add.d $r0,$r13
addc $r1,$r13
addc $r2,$r13
addc $r3,$r13
addc $r4,$r13
addc $r5,$r13
addc $r6,$r13
addc $r7,$r13
addc $r8,$r13
addc $r9,$r13
;; fold the carry into the checksum, to avoid having to loop the carry
;; back into the top
addc 0,$r13
addc 0,$r13 ; do it again, since we might have generated a carry
subq 10*4,$r12
bge _mloop
nop
addq 10*4,$r12 ; compensate for last loop underflowing length
movem [$sp+],$r8 ; restore regs
_word_loop:
;; only fold if there is anything to fold.
cmpq 0,$r13
beq _no_fold
;; fold 32-bit checksum into a 16-bit checksum, to avoid carries below
;; r9 can be used as temporary.
move.d $r13,$r9
lsrq 16,$r9 ; r0 = checksum >> 16
and.d 0xffff,$r13 ; checksum = checksum & 0xffff
add.d $r9,$r13 ; checksum += r0
move.d $r13,$r9 ; do the same again, maybe we got a carry last add
lsrq 16,$r9
and.d 0xffff,$r13
add.d $r9,$r13
_no_fold:
cmpq 2,$r12
blt _no_words
nop
;; copy and checksum the rest of the words
subq 2,$r12
2: ;; A failing userspace access for the read below will have this as PC.
_wloop: move.w [$r10+],$r9
addu.w $r9,$r13
subq 2,$r12
bge _wloop
move.w $r9,[$r11+]
addq 2,$r12
_no_words:
;; see if we have one odd byte more
cmpq 1,$r12
beq _do_byte
nop
ret
move.d $r13,$r10
_do_byte:
;; copy and checksum the last byte
3: ;; A failing userspace access for the read below will have this as PC.
move.b [$r10],$r9
addu.b $r9,$r13
move.b $r9,[$r11]
ret
move.d $r13,$r10

View file

@ -0,0 +1,69 @@
/*
* Add-on to transform csum_partial_copy_nocheck in checksumcopy.S into
* csum_partial_copy_from_user by adding exception records.
*
* Copyright (C) 2001, 2003 Axis Communications AB.
*
* Author: Hans-Peter Nilsson.
*/
#include <asm/errno.h>
/* Same function body, but a different name. If we just added exception
records to _csum_partial_copy_nocheck and made it generic, we wouldn't
know a user fault from a kernel fault and we would have overhead in
each kernel caller for the error-pointer argument.
unsigned int csum_partial_copy_from_user
(const char *src, char *dst, int len, unsigned int sum, int *errptr);
Note that the errptr argument is only set if we encounter an error.
It is conveniently located on the stack, so the normal function body
does not have to handle it. */
#define csum_partial_copy_nocheck csum_partial_copy_from_user
/* There are local labels numbered 1, 2 and 3 present to mark the
different from-user accesses. */
#include "checksumcopy.S"
.section .fixup,"ax"
;; Here from the movem loop; restore stack.
4:
movem [$sp+],$r8
;; r12 is already decremented. Add back chunk_size-2.
addq 40-2,$r12
;; Here from the word loop; r12 is off by 2; add it back.
5:
addq 2,$r12
;; Here from a failing single byte.
6:
;; Signal in *errptr that we had a failing access.
move.d [$sp],$acr
moveq -EFAULT,$r9
subq 4,$sp
move.d $r9,[$acr]
;; Clear the rest of the destination area using memset. Preserve the
;; checksum for the readable bytes.
move.d $r13,[$sp]
subq 4,$sp
move.d $r11,$r10
move $srp,[$sp]
jsr memset
clear.d $r11
move [$sp+],$srp
ret
move.d [$sp+],$r10
.previous
.section __ex_table,"a"
.dword 1b,4b
.dword 2b,5b
.dword 3b,6b
.previous

View file

@ -0,0 +1,120 @@
/* $Id: dram_init.S,v 1.4 2005/04/24 18:48:32 starvik Exp $
*
* DRAM/SDRAM initialization - alter with care
* This file is intended to be included from other assembler files
*
* Note: This file may not modify r8 or r9 because they are used to
* carry information from the decompresser to the kernel
*
* Copyright (C) 2000-2003 Axis Communications AB
*
* Authors: Mikael Starvik (starvik@axis.com)
*/
/* Just to be certain the config file is included, we include it here
* explicitely instead of depending on it being included in the file that
* uses this code.
*/
#include <linux/config.h>
#include <asm/arch/hwregs/asm/reg_map_asm.h>
#include <asm/arch/hwregs/asm/bif_core_defs_asm.h>
;; WARNING! The registers r8 and r9 are used as parameters carrying
;; information from the decompressor (if the kernel was compressed).
;; They should not be used in the code below.
; Refer to BIF MDS for a description of SDRAM initialization
; Bank configuration
move.d REG_ADDR(bif_core, regi_bif_core, rw_sdram_cfg_grp0), $r0
move.d CONFIG_ETRAX_SDRAM_GRP0_CONFIG, $r1
move.d $r1, [$r0]
move.d REG_ADDR(bif_core, regi_bif_core, rw_sdram_cfg_grp1), $r0
move.d CONFIG_ETRAX_SDRAM_GRP1_CONFIG, $r1
move.d $r1, [$r0]
; Calculate value of mrs_data
; CAS latency = 2 && bus_width = 32 => 0x40
; CAS latency = 3 && bus_width = 32 => 0x60
; CAS latency = 2 && bus_width = 16 => 0x20
; CAS latency = 3 && bus_width = 16 => 0x30
; Check if value is already supplied in kernel config
move.d CONFIG_ETRAX_SDRAM_COMMAND, $r2
bne _set_timing
nop
move.d 0x40, $r4 ; Assume 32 bits and CAS latency = 2
move.d CONFIG_ETRAX_SDRAM_TIMING, $r1
and.d 0x07, $r1 ; Get CAS latency
cmpq 2, $r1 ; CL = 2 ?
beq _bw_check
nop
move.d 0x60, $r4
_bw_check:
; Assume that group 0 width is equal to group 1. This assumption
; is wrong for a group 1 only hardware (such as the grand old
; StorPoint+).
move.d CONFIG_ETRAX_SDRAM_GRP0_CONFIG, $r1
and.d 0x200, $r1 ; DRAM width is bit 9
beq _set_timing
lslq 2, $r4 ; mrs_data starts at bit 2
lsrq 1, $r4 ; 16 bits. Shift down value.
; Set timing parameters (refresh off to avoid Guinness TR 83)
_set_timing:
move.d CONFIG_ETRAX_SDRAM_TIMING, $r1
and.d ~(3 << reg_bif_core_rw_sdram_timing___ref___lsb), $r1
move.d REG_ADDR(bif_core, regi_bif_core, rw_sdram_timing), $r0
move.d $r1, [$r0]
; Issue NOP command
move.d REG_ADDR(bif_core, regi_bif_core, rw_sdram_cmd), $r5
moveq regk_bif_core_nop, $r1
move.d $r1, [$r5]
; Wait 200us
move.d 10000, $r2
1: bne 1b
subq 1, $r2
; Issue initialization command sequence
move.d _sdram_commands_start, $r2
and.d 0x000fffff, $r2 ; Make sure commands are read from flash
move.d _sdram_commands_end, $r3
and.d 0x000fffff, $r3
1: clear.d $r6
move.b [$r2+], $r6 ; Load command
or.d $r4, $r6 ; Add calculated mrs
move.d $r6, [$r5] ; Write rw_sdram_cmd
; Wait 80 ns between each command
move.d 4000, $r7
2: bne 2b
subq 1, $r7
cmp.d $r2, $r3 ; Last command?
bne 1b
nop
; Start refresh
move.d CONFIG_ETRAX_SDRAM_TIMING, $r1
move.d REG_ADDR(bif_core, regi_bif_core, rw_sdram_timing), $r0
move.d $r1, [$r0]
; Initialization finished
ba _sdram_commands_end
nop
_sdram_commands_start:
.byte regk_bif_core_pre ; Precharge
.byte regk_bif_core_ref ; refresh
.byte regk_bif_core_ref ; refresh
.byte regk_bif_core_ref ; refresh
.byte regk_bif_core_ref ; refresh
.byte regk_bif_core_ref ; refresh
.byte regk_bif_core_ref ; refresh
.byte regk_bif_core_ref ; refresh
.byte regk_bif_core_ref ; refresh
.byte regk_bif_core_mrs ; mrs
_sdram_commands_end:

View file

@ -0,0 +1,73 @@
/*
* $Id: hw_settings.S,v 1.3 2005/04/24 18:36:57 starvik Exp $
*
* This table is used by some tools to extract hardware parameters.
* The table should be included in the kernel and the decompressor.
* Don't forget to update the tools if you change this table.
*
* Copyright (C) 2001 Axis Communications AB
*
* Authors: Mikael Starvik (starvik@axis.com)
*/
#include <linux/config.h>
#include <asm/arch/hwregs/asm/reg_map_asm.h>
#include <asm/arch/hwregs/asm/bif_core_defs_asm.h>
#include <asm/arch/hwregs/asm/gio_defs_asm.h>
.ascii "HW_PARAM_MAGIC" ; Magic number
.dword 0xc0004000 ; Kernel start address
; Debug port
#ifdef CONFIG_ETRAX_DEBUG_PORT0
.dword 0
#elif defined(CONFIG_ETRAX_DEBUG_PORT1)
.dword 1
#elif defined(CONFIG_ETRAX_DEBUG_PORT2)
.dword 2
#elif defined(CONFIG_ETRAX_DEBUG_PORT3)
.dword 3
#else
.dword 4 ; No debug
#endif
; Register values
.dword REG_ADDR(bif_core, regi_bif_core, rw_grp1_cfg)
.dword CONFIG_ETRAX_MEM_GRP1_CONFIG
.dword REG_ADDR(bif_core, regi_bif_core, rw_grp2_cfg)
.dword CONFIG_ETRAX_MEM_GRP2_CONFIG
.dword REG_ADDR(bif_core, regi_bif_core, rw_grp3_cfg)
.dword CONFIG_ETRAX_MEM_GRP3_CONFIG
.dword REG_ADDR(bif_core, regi_bif_core, rw_grp4_cfg)
.dword CONFIG_ETRAX_MEM_GRP4_CONFIG
.dword REG_ADDR(bif_core, regi_bif_core, rw_sdram_cfg_grp0)
.dword CONFIG_ETRAX_SDRAM_GRP0_CONFIG
.dword REG_ADDR(bif_core, regi_bif_core, rw_sdram_cfg_grp1)
.dword CONFIG_ETRAX_SDRAM_GRP1_CONFIG
.dword REG_ADDR(bif_core, regi_bif_core, rw_sdram_timing)
.dword CONFIG_ETRAX_SDRAM_TIMING
.dword REG_ADDR(bif_core, regi_bif_core, rw_sdram_cmd)
.dword CONFIG_ETRAX_SDRAM_COMMAND
.dword REG_ADDR(gio, regi_gio, rw_pa_dout)
.dword CONFIG_ETRAX_DEF_GIO_PA_OUT
.dword REG_ADDR(gio, regi_gio, rw_pa_oe)
.dword CONFIG_ETRAX_DEF_GIO_PA_OE
.dword REG_ADDR(gio, regi_gio, rw_pb_dout)
.dword CONFIG_ETRAX_DEF_GIO_PB_OUT
.dword REG_ADDR(gio, regi_gio, rw_pb_oe)
.dword CONFIG_ETRAX_DEF_GIO_PB_OE
.dword REG_ADDR(gio, regi_gio, rw_pc_dout)
.dword CONFIG_ETRAX_DEF_GIO_PC_OUT
.dword REG_ADDR(gio, regi_gio, rw_pc_oe)
.dword CONFIG_ETRAX_DEF_GIO_PC_OE
.dword REG_ADDR(gio, regi_gio, rw_pd_dout)
.dword CONFIG_ETRAX_DEF_GIO_PD_OUT
.dword REG_ADDR(gio, regi_gio, rw_pd_oe)
.dword CONFIG_ETRAX_DEF_GIO_PD_OE
.dword REG_ADDR(gio, regi_gio, rw_pe_dout)
.dword CONFIG_ETRAX_DEF_GIO_PE_OUT
.dword REG_ADDR(gio, regi_gio, rw_pe_oe)
.dword CONFIG_ETRAX_DEF_GIO_PE_OE
.dword 0 ; No more register values

View file

@ -0,0 +1,253 @@
/*#************************************************************************#*/
/*#-------------------------------------------------------------------------*/
/*# */
/*# FUNCTION NAME: memset() */
/*# */
/*# PARAMETERS: void* dst; Destination address. */
/*# int c; Value of byte to write. */
/*# int len; Number of bytes to write. */
/*# */
/*# RETURNS: dst. */
/*# */
/*# DESCRIPTION: Sets the memory dst of length len bytes to c, as standard. */
/*# Framework taken from memcpy. This routine is */
/*# very sensitive to compiler changes in register allocation. */
/*# Should really be rewritten to avoid this problem. */
/*# */
/*#-------------------------------------------------------------------------*/
/*# */
/*# HISTORY */
/*# */
/*# DATE NAME CHANGES */
/*# ---- ---- ------- */
/*# 990713 HP Tired of watching this function (or */
/*# really, the nonoptimized generic */
/*# implementation) take up 90% of simulator */
/*# output. Measurements needed. */
/*# */
/*#-------------------------------------------------------------------------*/
#include <linux/types.h>
/* No, there's no macro saying 12*4, since it is "hard" to get it into
the asm in a good way. Thus better to expose the problem everywhere.
*/
/* Assuming 1 cycle per dword written or read (ok, not really true), and
one per instruction, then 43+3*(n/48-1) <= 24+24*(n/48-1)
so n >= 45.7; n >= 0.9; we win on the first full 48-byte block to set. */
#define ZERO_BLOCK_SIZE (1*12*4)
void *memset(void *pdst,
int c,
size_t plen)
{
/* Ok. Now we want the parameters put in special registers.
Make sure the compiler is able to make something useful of this. */
register char *return_dst __asm__ ("r10") = pdst;
register int n __asm__ ("r12") = plen;
register int lc __asm__ ("r11") = c;
/* Most apps use memset sanely. Only those memsetting about 3..4
bytes or less get penalized compared to the generic implementation
- and that's not really sane use. */
/* Ugh. This is fragile at best. Check with newer GCC releases, if
they compile cascaded "x |= x << 8" sanely! */
__asm__("movu.b %0,$r13 \n\
lslq 8,$r13 \n\
move.b %0,$r13 \n\
move.d $r13,%0 \n\
lslq 16,$r13 \n\
or.d $r13,%0"
: "=r" (lc) : "0" (lc) : "r13");
{
register char *dst __asm__ ("r13") = pdst;
/* This is NONPORTABLE, but since this whole routine is */
/* grossly nonportable that doesn't matter. */
if (((unsigned long) pdst & 3) != 0
/* Oops! n=0 must be a legal call, regardless of alignment. */
&& n >= 3)
{
if ((unsigned long)dst & 1)
{
*dst = (char) lc;
n--;
dst++;
}
if ((unsigned long)dst & 2)
{
*(short *)dst = lc;
n -= 2;
dst += 2;
}
}
/* Now the fun part. For the threshold value of this, check the equation
above. */
/* Decide which copying method to use. */
if (n >= ZERO_BLOCK_SIZE)
{
/* For large copies we use 'movem' */
/* It is not optimal to tell the compiler about clobbering any
registers; that will move the saving/restoring of those registers
to the function prologue/epilogue, and make non-movem sizes
suboptimal.
This method is not foolproof; it assumes that the "asm reg"
declarations at the beginning of the function really are used
here (beware: they may be moved to temporary registers).
This way, we do not have to save/move the registers around into
temporaries; we can safely use them straight away.
If you want to check that the allocation was right; then
check the equalities in the first comment. It should say
"r13=r13, r12=r12, r11=r11" */
__asm__ volatile (" \n\
;; Check that the register asm declaration got right. \n\
;; The GCC manual says it will work, but there *has* been bugs. \n\
.ifnc %0-%1-%4,$r13-$r12-$r11 \n\
.err \n\
.endif \n\
\n\
;; Save the registers we'll clobber in the movem process \n\
;; on the stack. Don't mention them to gcc, it will only be \n\
;; upset. \n\
subq 11*4,$sp \n\
movem $r10,[$sp] \n\
\n\
move.d $r11,$r0 \n\
move.d $r11,$r1 \n\
move.d $r11,$r2 \n\
move.d $r11,$r3 \n\
move.d $r11,$r4 \n\
move.d $r11,$r5 \n\
move.d $r11,$r6 \n\
move.d $r11,$r7 \n\
move.d $r11,$r8 \n\
move.d $r11,$r9 \n\
move.d $r11,$r10 \n\
\n\
;; Now we've got this: \n\
;; r13 - dst \n\
;; r12 - n \n\
\n\
;; Update n for the first loop \n\
subq 12*4,$r12 \n\
0: \n\
subq 12*4,$r12 \n\
bge 0b \n\
movem $r11,[$r13+] \n\
\n\
addq 12*4,$r12 ;; compensate for last loop underflowing n \n\
\n\
;; Restore registers from stack \n\
movem [$sp+],$r10"
/* Outputs */ : "=r" (dst), "=r" (n)
/* Inputs */ : "0" (dst), "1" (n), "r" (lc));
}
/* Either we directly starts copying, using dword copying
in a loop, or we copy as much as possible with 'movem'
and then the last block (<44 bytes) is copied here.
This will work since 'movem' will have updated src,dst,n. */
while ( n >= 16 )
{
*((long*)dst)++ = lc;
*((long*)dst)++ = lc;
*((long*)dst)++ = lc;
*((long*)dst)++ = lc;
n -= 16;
}
/* A switch() is definitely the fastest although it takes a LOT of code.
* Particularly if you inline code this.
*/
switch (n)
{
case 0:
break;
case 1:
*(char*)dst = (char) lc;
break;
case 2:
*(short*)dst = (short) lc;
break;
case 3:
*((short*)dst)++ = (short) lc;
*(char*)dst = (char) lc;
break;
case 4:
*((long*)dst)++ = lc;
break;
case 5:
*((long*)dst)++ = lc;
*(char*)dst = (char) lc;
break;
case 6:
*((long*)dst)++ = lc;
*(short*)dst = (short) lc;
break;
case 7:
*((long*)dst)++ = lc;
*((short*)dst)++ = (short) lc;
*(char*)dst = (char) lc;
break;
case 8:
*((long*)dst)++ = lc;
*((long*)dst)++ = lc;
break;
case 9:
*((long*)dst)++ = lc;
*((long*)dst)++ = lc;
*(char*)dst = (char) lc;
break;
case 10:
*((long*)dst)++ = lc;
*((long*)dst)++ = lc;
*(short*)dst = (short) lc;
break;
case 11:
*((long*)dst)++ = lc;
*((long*)dst)++ = lc;
*((short*)dst)++ = (short) lc;
*(char*)dst = (char) lc;
break;
case 12:
*((long*)dst)++ = lc;
*((long*)dst)++ = lc;
*((long*)dst)++ = lc;
break;
case 13:
*((long*)dst)++ = lc;
*((long*)dst)++ = lc;
*((long*)dst)++ = lc;
*(char*)dst = (char) lc;
break;
case 14:
*((long*)dst)++ = lc;
*((long*)dst)++ = lc;
*((long*)dst)++ = lc;
*(short*)dst = (short) lc;
break;
case 15:
*((long*)dst)++ = lc;
*((long*)dst)++ = lc;
*((long*)dst)++ = lc;
*((short*)dst)++ = (short) lc;
*(char*)dst = (char) lc;
break;
}
}
return return_dst; /* destination pointer. */
} /* memset() */

View file

@ -0,0 +1,179 @@
##=============================================================================
##
## nand_init.S
##
## The bootrom copies data from the NAND flash to the internal RAM but
## due to a bug/feature we can only trust the 256 first bytes. So this
## code copies more data from NAND flash to internal RAM. Obvioulsy this
## code must fit in the first 256 bytes so alter with care.
##
## Some notes about the bug/feature for future reference:
## The bootrom copies the first 127 KB from NAND flash to internal
## memory. The problem is that it does a bytewise copy. NAND flashes
## does autoincrement on the address so for a 16-bite device each
## read/write increases the address by two. So the copy loop in the
## bootrom will discard every second byte. This is solved by inserting
## zeroes in every second byte in the first erase block.
##
## The bootrom also incorrectly assumes that it can read the flash
## linear with only one read command but the flash will actually
## switch between normal area and spare area if you do that so we
## can't trust more than the first 256 bytes.
##
##=============================================================================
#include <asm/arch/hwregs/asm/reg_map_asm.h>
#include <asm/arch/hwregs/asm/gio_defs_asm.h>
#include <asm/arch/hwregs/asm/pinmux_defs_asm.h>
#include <asm/arch/hwregs/asm/bif_core_defs_asm.h>
#include <asm/arch/hwregs/asm/config_defs_asm.h>
#include <linux/config.h>
;; There are 8-bit NAND flashes and 16-bit NAND flashes.
;; We need to treat them slightly different.
#if CONFIG_ETRAX_FLASH_BUSWIDTH==2
#define PAGE_SIZE 256
#else
#error 2
#define PAGE_SIZE 512
#endif
#define ERASE_BLOCK 16384
;; GPIO pins connected to NAND flash
#define CE 4
#define CLE 5
#define ALE 6
#define BY 7
;; Address space for NAND flash
#define NAND_RD_ADDR 0x90000000
#define NAND_WR_ADDR 0x94000000
#define READ_CMD 0x00
;; Readability macros
#define CSP_MASK \
REG_MASK(bif_core, rw_grp3_cfg, gated_csp0) | \
REG_MASK(bif_core, rw_grp3_cfg, gated_csp1)
#define CSP_VAL \
REG_STATE(bif_core, rw_grp3_cfg, gated_csp0, rd) | \
REG_STATE(bif_core, rw_grp3_cfg, gated_csp1, wr)
;;----------------------------------------------------------------------------
;; Macros to set/clear GPIO bits
.macro SET x
or.b (1<<\x),$r9
move.d $r9, [$r2]
.endm
.macro CLR x
and.b ~(1<<\x),$r9
move.d $r9, [$r2]
.endm
;;----------------------------------------------------------------------------
nand_boot:
;; Check if nand boot was selected
move.d REG_ADDR(config, regi_config, r_bootsel), $r0
move.d [$r0], $r0
and.d REG_MASK(config, r_bootsel, boot_mode), $r0
cmp.d REG_STATE(config, r_bootsel, boot_mode, nand), $r0
bne normal_boot ; No NAND boot
nop
copy_nand_to_ram:
;; copy_nand_to_ram
;; Arguments
;; r10 - destination
;; r11 - source offset
;; r12 - size
;; r13 - Address to jump to after completion
;; Note : r10-r12 are clobbered on return
;; Registers used:
;; r0 - NAND_RD_ADDR
;; r1 - NAND_WR_ADDR
;; r2 - reg_gio_rw_pa_dout
;; r3 - reg_gio_r_pa_din
;; r4 - tmp
;; r5 - byte counter within a page
;; r6 - reg_pinmux_rw_pa
;; r7 - reg_gio_rw_pa_oe
;; r8 - reg_bif_core_rw_grp3_cfg
;; r9 - reg_gio_rw_pa_dout shadow
move.d 0x90000000, $r0
move.d 0x94000000, $r1
move.d REG_ADDR(gio, regi_gio, rw_pa_dout), $r2
move.d REG_ADDR(gio, regi_gio, r_pa_din), $r3
move.d REG_ADDR(pinmux, regi_pinmux, rw_pa), $r6
move.d REG_ADDR(gio, regi_gio, rw_pa_oe), $r7
move.d REG_ADDR(bif_core, regi_bif_core, rw_grp3_cfg), $r8
#if CONFIG_ETRAX_FLASH_BUSWIDTH==2
lsrq 1, $r11
#endif
;; Set up GPIO
move.d [$r2], $r9
move.d [$r7], $r4
or.b (1<<ALE) | (1 << CLE) | (1<<CE), $r4
move.d $r4, [$r7]
;; Set up bif
move.d [$r8], $r4
and.d CSP_MASK, $r4
or.d CSP_VAL, $r4
move.d $r4, [$r8]
1: ;; Copy one page
CLR CE
SET CLE
moveq READ_CMD, $r4
move.b $r4, [$r1]
moveq 20, $r4
2: bne 2b
subq 1, $r4
CLR CLE
SET ALE
clear.w [$r1] ; Column address = 0
move.d $r11, $r4
lsrq 8, $r4
move.b $r4, [$r1] ; Row address
lsrq 8, $r4
move.b $r4, [$r1] ; Row adddress
moveq 20, $r4
2: bne 2b
subq 1, $r4
CLR ALE
2: move.d [$r3], $r4
and.d 1 << BY, $r4
beq 2b
movu.w PAGE_SIZE, $r5
2: ; Copy one byte/word
#if CONFIG_ETRAX_FLASH_BUSWIDTH==2
move.w [$r0], $r4
#else
move.b [$r0], $r4
#endif
subq 1, $r5
bne 2b
#if CONFIG_ETRAX_FLASH_BUSWIDTH==2
move.w $r4, [$r10+]
subu.w PAGE_SIZE*2, $r12
#else
move.b $r4, [$r10+]
subu.w PAGE_SIZE, $r12
#endif
bpl 1b
addu.w PAGE_SIZE, $r11
;; End of copy
jump $r13
nop
;; This will warn if the code above is too large. If you consider
;; to remove this you don't understand the bug/feature.
.org 256
.org ERASE_BLOCK
normal_boot:

View file

@ -0,0 +1,33 @@
;; Core of the spinlock implementation
;;
;; Copyright (C) 2004 Axis Communications AB.
;;
;; Author: Mikael Starvik
.global cris_spin_lock
.global cris_spin_trylock
.text
cris_spin_lock:
clearf p
1: test.d [$r10]
beq 1b
clearf p
ax
clear.d [$r10]
bcs 1b
clearf p
ret
nop
cris_spin_trylock:
clearf p
1: move.d [$r10], $r11
ax
clear.d [$r10]
bcs 1b
clearf p
ret
move.d $r11,$r10

View file

@ -0,0 +1,219 @@
/*#************************************************************************#*/
/*#-------------------------------------------------------------------------*/
/*# */
/*# FUNCTION NAME: memcpy() */
/*# */
/*# PARAMETERS: void* dst; Destination address. */
/*# void* src; Source address. */
/*# int len; Number of bytes to copy. */
/*# */
/*# RETURNS: dst. */
/*# */
/*# DESCRIPTION: Copies len bytes of memory from src to dst. No guarantees */
/*# about copying of overlapping memory areas. This routine is */
/*# very sensitive to compiler changes in register allocation. */
/*# Should really be rewritten to avoid this problem. */
/*# */
/*#-------------------------------------------------------------------------*/
/*# */
/*# HISTORY */
/*# */
/*# DATE NAME CHANGES */
/*# ---- ---- ------- */
/*# 941007 Kenny R Creation */
/*# 941011 Kenny R Lots of optimizations and inlining. */
/*# 941129 Ulf A Adapted for use in libc. */
/*# 950216 HP N==0 forgotten if non-aligned src/dst. */
/*# Added some optimizations. */
/*# 001025 HP Make src and dst char *. Align dst to */
/*# dword, not just word-if-both-src-and-dst- */
/*# are-misaligned. */
/*# */
/*#-------------------------------------------------------------------------*/
#include <linux/types.h>
void *memcpy(void *pdst,
const void *psrc,
size_t pn)
{
/* Ok. Now we want the parameters put in special registers.
Make sure the compiler is able to make something useful of this.
As it is now: r10 -> r13; r11 -> r11 (nop); r12 -> r12 (nop).
If gcc was allright, it really would need no temporaries, and no
stack space to save stuff on. */
register void *return_dst __asm__ ("r10") = pdst;
register char *dst __asm__ ("r13") = pdst;
register const char *src __asm__ ("r11") = psrc;
register int n __asm__ ("r12") = pn;
/* When src is aligned but not dst, this makes a few extra needless
cycles. I believe it would take as many to check that the
re-alignment was unnecessary. */
if (((unsigned long) dst & 3) != 0
/* Don't align if we wouldn't copy more than a few bytes; so we
don't have to check further for overflows. */
&& n >= 3)
{
if ((unsigned long) dst & 1)
{
n--;
*(char*)dst = *(char*)src;
src++;
dst++;
}
if ((unsigned long) dst & 2)
{
n -= 2;
*(short*)dst = *(short*)src;
src += 2;
dst += 2;
}
}
/* Decide which copying method to use. Movem is dirt cheap, so the
overheap is low enough to always use the minimum block size as the
threshold. */
if (n >= 44)
{
/* For large copies we use 'movem' */
/* It is not optimal to tell the compiler about clobbering any
registers; that will move the saving/restoring of those registers
to the function prologue/epilogue, and make non-movem sizes
suboptimal. */
__asm__ volatile (" \n\
;; Check that the register asm declaration got right. \n\
;; The GCC manual explicitly says TRT will happen. \n\
.ifnc %0-%1-%2,$r13-$r11-$r12 \n\
.err \n\
.endif \n\
\n\
;; Save the registers we'll use in the movem process \n\
\n\
;; on the stack. \n\
subq 11*4,$sp \n\
movem $r10,[$sp] \n\
\n\
;; Now we've got this: \n\
;; r11 - src \n\
;; r13 - dst \n\
;; r12 - n \n\
\n\
;; Update n for the first loop \n\
subq 44,$r12 \n\
0: \n\
movem [$r11+],$r10 \n\
subq 44,$r12 \n\
bge 0b \n\
movem $r10,[$r13+] \n\
\n\
addq 44,$r12 ;; compensate for last loop underflowing n \n\
\n\
;; Restore registers from stack \n\
movem [$sp+],$r10"
/* Outputs */ : "=r" (dst), "=r" (src), "=r" (n)
/* Inputs */ : "0" (dst), "1" (src), "2" (n));
}
/* Either we directly starts copying, using dword copying
in a loop, or we copy as much as possible with 'movem'
and then the last block (<44 bytes) is copied here.
This will work since 'movem' will have updated src,dst,n. */
while ( n >= 16 )
{
*((long*)dst)++ = *((long*)src)++;
*((long*)dst)++ = *((long*)src)++;
*((long*)dst)++ = *((long*)src)++;
*((long*)dst)++ = *((long*)src)++;
n -= 16;
}
/* A switch() is definitely the fastest although it takes a LOT of code.
* Particularly if you inline code this.
*/
switch (n)
{
case 0:
break;
case 1:
*(char*)dst = *(char*)src;
break;
case 2:
*(short*)dst = *(short*)src;
break;
case 3:
*((short*)dst)++ = *((short*)src)++;
*(char*)dst = *(char*)src;
break;
case 4:
*((long*)dst)++ = *((long*)src)++;
break;
case 5:
*((long*)dst)++ = *((long*)src)++;
*(char*)dst = *(char*)src;
break;
case 6:
*((long*)dst)++ = *((long*)src)++;
*(short*)dst = *(short*)src;
break;
case 7:
*((long*)dst)++ = *((long*)src)++;
*((short*)dst)++ = *((short*)src)++;
*(char*)dst = *(char*)src;
break;
case 8:
*((long*)dst)++ = *((long*)src)++;
*((long*)dst)++ = *((long*)src)++;
break;
case 9:
*((long*)dst)++ = *((long*)src)++;
*((long*)dst)++ = *((long*)src)++;
*(char*)dst = *(char*)src;
break;
case 10:
*((long*)dst)++ = *((long*)src)++;
*((long*)dst)++ = *((long*)src)++;
*(short*)dst = *(short*)src;
break;
case 11:
*((long*)dst)++ = *((long*)src)++;
*((long*)dst)++ = *((long*)src)++;
*((short*)dst)++ = *((short*)src)++;
*(char*)dst = *(char*)src;
break;
case 12:
*((long*)dst)++ = *((long*)src)++;
*((long*)dst)++ = *((long*)src)++;
*((long*)dst)++ = *((long*)src)++;
break;
case 13:
*((long*)dst)++ = *((long*)src)++;
*((long*)dst)++ = *((long*)src)++;
*((long*)dst)++ = *((long*)src)++;
*(char*)dst = *(char*)src;
break;
case 14:
*((long*)dst)++ = *((long*)src)++;
*((long*)dst)++ = *((long*)src)++;
*((long*)dst)++ = *((long*)src)++;
*(short*)dst = *(short*)src;
break;
case 15:
*((long*)dst)++ = *((long*)src)++;
*((long*)dst)++ = *((long*)src)++;
*((long*)dst)++ = *((long*)src)++;
*((short*)dst)++ = *((short*)src)++;
*(char*)dst = *(char*)src;
break;
}
return return_dst; /* destination pointer. */
} /* memcpy() */

View file

@ -0,0 +1,470 @@
/*
* User address space access functions.
* The non-inlined parts of asm-cris/uaccess.h are here.
*
* Copyright (C) 2000, 2003 Axis Communications AB.
*
* Written by Hans-Peter Nilsson.
* Pieces used from memcpy, originally by Kenny Ranerup long time ago.
*/
#include <asm/uaccess.h>
/* Asm:s have been tweaked (within the domain of correctness) to give
satisfactory results for "gcc version 3.2.1 Axis release R53/1.53-v32".
Check regularly...
Note that for CRISv32, the PC saved at a bus-fault is the address
*at* the faulting instruction, with a special case for instructions
in delay slots: then it's the address of the branch. Note also that
in contrast to v10, a postincrement in the instruction is *not*
performed at a bus-fault; the register is seen having the original
value in fault handlers. */
/* Copy to userspace. This is based on the memcpy used for
kernel-to-kernel copying; see "string.c". */
unsigned long
__copy_user (void __user *pdst, const void *psrc, unsigned long pn)
{
/* We want the parameters put in special registers.
Make sure the compiler is able to make something useful of this.
As it is now: r10 -> r13; r11 -> r11 (nop); r12 -> r12 (nop).
FIXME: Comment for old gcc version. Check.
If gcc was allright, it really would need no temporaries, and no
stack space to save stuff on. */
register char *dst __asm__ ("r13") = pdst;
register const char *src __asm__ ("r11") = psrc;
register int n __asm__ ("r12") = pn;
register int retn __asm__ ("r10") = 0;
/* When src is aligned but not dst, this makes a few extra needless
cycles. I believe it would take as many to check that the
re-alignment was unnecessary. */
if (((unsigned long) dst & 3) != 0
/* Don't align if we wouldn't copy more than a few bytes; so we
don't have to check further for overflows. */
&& n >= 3)
{
if ((unsigned long) dst & 1)
{
__asm_copy_to_user_1 (dst, src, retn);
n--;
}
if ((unsigned long) dst & 2)
{
__asm_copy_to_user_2 (dst, src, retn);
n -= 2;
}
}
/* Movem is dirt cheap. The overheap is low enough to always use the
minimum possible block size as the threshold. */
if (n >= 44)
{
/* For large copies we use 'movem'. */
/* It is not optimal to tell the compiler about clobbering any
registers; that will move the saving/restoring of those registers
to the function prologue/epilogue, and make non-movem sizes
suboptimal. */
__asm__ volatile ("\
;; Check that the register asm declaration got right. \n\
;; The GCC manual explicitly says TRT will happen. \n\
.ifnc %0%1%2%3,$r13$r11$r12$r10 \n\
.err \n\
.endif \n\
\n\
;; Save the registers we'll use in the movem process \n\
;; on the stack. \n\
subq 11*4,$sp \n\
movem $r10,[$sp] \n\
\n\
;; Now we've got this: \n\
;; r11 - src \n\
;; r13 - dst \n\
;; r12 - n \n\
\n\
;; Update n for the first loop \n\
subq 44,$r12 \n\
0: \n\
movem [$r11+],$r10 \n\
subq 44,$r12 \n\
1: bge 0b \n\
movem $r10,[$r13+] \n\
3: \n\
addq 44,$r12 ;; compensate for last loop underflowing n \n\
\n\
;; Restore registers from stack \n\
movem [$sp+],$r10 \n\
2: \n\
.section .fixup,\"ax\" \n\
4: \n\
; When failing on any of the 1..44 bytes in a chunk, we adjust back the \n\
; source pointer and just drop through to the by-16 and by-4 loops to \n\
; get the correct number of failing bytes. This necessarily means a \n\
; few extra exceptions, but invalid user pointers shouldn't happen in \n\
; time-critical code anyway. \n\
jump 3b \n\
subq 44,$r11 \n\
\n\
.previous \n\
.section __ex_table,\"a\" \n\
.dword 1b,4b \n\
.previous"
/* Outputs */ : "=r" (dst), "=r" (src), "=r" (n), "=r" (retn)
/* Inputs */ : "0" (dst), "1" (src), "2" (n), "3" (retn));
}
while (n >= 16)
{
__asm_copy_to_user_16 (dst, src, retn);
n -= 16;
}
/* Having a separate by-four loops cuts down on cache footprint.
FIXME: Test with and without; increasing switch to be 0..15. */
while (n >= 4)
{
__asm_copy_to_user_4 (dst, src, retn);
n -= 4;
}
switch (n)
{
case 0:
break;
case 1:
__asm_copy_to_user_1 (dst, src, retn);
break;
case 2:
__asm_copy_to_user_2 (dst, src, retn);
break;
case 3:
__asm_copy_to_user_3 (dst, src, retn);
break;
}
return retn;
}
/* Copy from user to kernel, zeroing the bytes that were inaccessible in
userland. The return-value is the number of bytes that were
inaccessible. */
unsigned long
__copy_user_zeroing (void __user *pdst, const void *psrc, unsigned long pn)
{
/* We want the parameters put in special registers.
Make sure the compiler is able to make something useful of this.
As it is now: r10 -> r13; r11 -> r11 (nop); r12 -> r12 (nop).
FIXME: Comment for old gcc version. Check.
If gcc was allright, it really would need no temporaries, and no
stack space to save stuff on. */
register char *dst __asm__ ("r13") = pdst;
register const char *src __asm__ ("r11") = psrc;
register int n __asm__ ("r12") = pn;
register int retn __asm__ ("r10") = 0;
/* The best reason to align src is that we then know that a read-fault
was for aligned bytes; there's no 1..3 remaining good bytes to
pickle. */
if (((unsigned long) src & 3) != 0)
{
if (((unsigned long) src & 1) && n != 0)
{
__asm_copy_from_user_1 (dst, src, retn);
n--;
}
if (((unsigned long) src & 2) && n >= 2)
{
__asm_copy_from_user_2 (dst, src, retn);
n -= 2;
}
/* We only need one check after the unalignment-adjustments, because
if both adjustments were done, either both or neither reference
had an exception. */
if (retn != 0)
goto copy_exception_bytes;
}
/* Movem is dirt cheap. The overheap is low enough to always use the
minimum possible block size as the threshold. */
if (n >= 44)
{
/* It is not optimal to tell the compiler about clobbering any
registers; that will move the saving/restoring of those registers
to the function prologue/epilogue, and make non-movem sizes
suboptimal. */
__asm__ volatile ("\
.ifnc %0%1%2%3,$r13$r11$r12$r10 \n\
.err \n\
.endif \n\
\n\
;; Save the registers we'll use in the movem process \n\
;; on the stack. \n\
subq 11*4,$sp \n\
movem $r10,[$sp] \n\
\n\
;; Now we've got this: \n\
;; r11 - src \n\
;; r13 - dst \n\
;; r12 - n \n\
\n\
;; Update n for the first loop \n\
subq 44,$r12 \n\
0: \n\
movem [$r11+],$r10 \n\
\n\
subq 44,$r12 \n\
bge 0b \n\
movem $r10,[$r13+] \n\
\n\
4: \n\
addq 44,$r12 ;; compensate for last loop underflowing n \n\
\n\
;; Restore registers from stack \n\
movem [$sp+],$r10 \n\
.section .fixup,\"ax\" \n\
\n\
;; Do not jump back into the loop if we fail. For some uses, we get a \n\
;; page fault somewhere on the line. Without checking for page limits, \n\
;; we don't know where, but we need to copy accurately and keep an \n\
;; accurate count; not just clear the whole line. To do that, we fall \n\
;; down in the code below, proceeding with smaller amounts. It should \n\
;; be kept in mind that we have to cater to code like what at one time \n\
;; was in fs/super.c: \n\
;; i = size - copy_from_user((void *)page, data, size); \n\
;; which would cause repeated faults while clearing the remainder of \n\
;; the SIZE bytes at PAGE after the first fault. \n\
;; A caveat here is that we must not fall through from a failing page \n\
;; to a valid page. \n\
\n\
3: \n\
jump 4b ;; Fall through, pretending the fault didn't happen. \n\
nop \n\
\n\
.previous \n\
.section __ex_table,\"a\" \n\
.dword 0b,3b \n\
.previous"
/* Outputs */ : "=r" (dst), "=r" (src), "=r" (n), "=r" (retn)
/* Inputs */ : "0" (dst), "1" (src), "2" (n), "3" (retn));
}
/* Either we directly start copying here, using dword copying in a loop,
or we copy as much as possible with 'movem' and then the last block
(<44 bytes) is copied here. This will work since 'movem' will have
updated src, dst and n. (Except with failing src.)
Since we want to keep src accurate, we can't use
__asm_copy_from_user_N with N != (1, 2, 4); it updates dst and
retn, but not src (by design; it's value is ignored elsewhere). */
while (n >= 4)
{
__asm_copy_from_user_4 (dst, src, retn);
n -= 4;
if (retn)
goto copy_exception_bytes;
}
/* If we get here, there were no memory read faults. */
switch (n)
{
/* These copies are at least "naturally aligned" (so we don't have
to check each byte), due to the src alignment code before the
movem loop. The *_3 case *will* get the correct count for retn. */
case 0:
/* This case deliberately left in (if you have doubts check the
generated assembly code). */
break;
case 1:
__asm_copy_from_user_1 (dst, src, retn);
break;
case 2:
__asm_copy_from_user_2 (dst, src, retn);
break;
case 3:
__asm_copy_from_user_3 (dst, src, retn);
break;
}
/* If we get here, retn correctly reflects the number of failing
bytes. */
return retn;
copy_exception_bytes:
/* We already have "retn" bytes cleared, and need to clear the
remaining "n" bytes. A non-optimized simple byte-for-byte in-line
memset is preferred here, since this isn't speed-critical code and
we'd rather have this a leaf-function than calling memset. */
{
char *endp;
for (endp = dst + n; dst < endp; dst++)
*dst = 0;
}
return retn + n;
}
/* Zero userspace. */
unsigned long
__do_clear_user (void __user *pto, unsigned long pn)
{
/* We want the parameters put in special registers.
Make sure the compiler is able to make something useful of this.
As it is now: r10 -> r13; r11 -> r11 (nop); r12 -> r12 (nop).
FIXME: Comment for old gcc version. Check.
If gcc was allright, it really would need no temporaries, and no
stack space to save stuff on. */
register char *dst __asm__ ("r13") = pto;
register int n __asm__ ("r12") = pn;
register int retn __asm__ ("r10") = 0;
if (((unsigned long) dst & 3) != 0
/* Don't align if we wouldn't copy more than a few bytes. */
&& n >= 3)
{
if ((unsigned long) dst & 1)
{
__asm_clear_1 (dst, retn);
n--;
}
if ((unsigned long) dst & 2)
{
__asm_clear_2 (dst, retn);
n -= 2;
}
}
/* Decide which copying method to use.
FIXME: This number is from the "ordinary" kernel memset. */
if (n >= 48)
{
/* For large clears we use 'movem' */
/* It is not optimal to tell the compiler about clobbering any
call-saved registers; that will move the saving/restoring of
those registers to the function prologue/epilogue, and make
non-movem sizes suboptimal.
This method is not foolproof; it assumes that the "asm reg"
declarations at the beginning of the function really are used
here (beware: they may be moved to temporary registers).
This way, we do not have to save/move the registers around into
temporaries; we can safely use them straight away.
If you want to check that the allocation was right; then
check the equalities in the first comment. It should say
something like "r13=r13, r11=r11, r12=r12". */
__asm__ volatile ("\
.ifnc %0%1%2,$r13$r12$r10 \n\
.err \n\
.endif \n\
\n\
;; Save the registers we'll clobber in the movem process \n\
;; on the stack. Don't mention them to gcc, it will only be \n\
;; upset. \n\
subq 11*4,$sp \n\
movem $r10,[$sp] \n\
\n\
clear.d $r0 \n\
clear.d $r1 \n\
clear.d $r2 \n\
clear.d $r3 \n\
clear.d $r4 \n\
clear.d $r5 \n\
clear.d $r6 \n\
clear.d $r7 \n\
clear.d $r8 \n\
clear.d $r9 \n\
clear.d $r10 \n\
clear.d $r11 \n\
\n\
;; Now we've got this: \n\
;; r13 - dst \n\
;; r12 - n \n\
\n\
;; Update n for the first loop \n\
subq 12*4,$r12 \n\
0: \n\
subq 12*4,$r12 \n\
1: \n\
bge 0b \n\
movem $r11,[$r13+] \n\
\n\
addq 12*4,$r12 ;; compensate for last loop underflowing n \n\
\n\
;; Restore registers from stack \n\
movem [$sp+],$r10 \n\
2: \n\
.section .fixup,\"ax\" \n\
3: \n\
movem [$sp],$r10 \n\
addq 12*4,$r10 \n\
addq 12*4,$r13 \n\
movem $r10,[$sp] \n\
jump 0b \n\
clear.d $r10 \n\
\n\
.previous \n\
.section __ex_table,\"a\" \n\
.dword 1b,3b \n\
.previous"
/* Outputs */ : "=r" (dst), "=r" (n), "=r" (retn)
/* Inputs */ : "0" (dst), "1" (n), "2" (retn)
/* Clobber */ : "r11");
}
while (n >= 16)
{
__asm_clear_16 (dst, retn);
n -= 16;
}
/* Having a separate by-four loops cuts down on cache footprint.
FIXME: Test with and without; increasing switch to be 0..15. */
while (n >= 4)
{
__asm_clear_4 (dst, retn);
n -= 4;
}
switch (n)
{
case 0:
break;
case 1:
__asm_clear_1 (dst, retn);
break;
case 2:
__asm_clear_2 (dst, retn);
break;
case 3:
__asm_clear_3 (dst, retn);
break;
}
return retn;
}

View file

@ -0,0 +1,3 @@
# Makefile for the Linux/cris parts of the memory manager.
obj-y := mmu.o init.o tlb.o intmem.o

View file

@ -0,0 +1,174 @@
/*
* Set up paging and the MMU.
*
* Copyright (C) 2000-2003, Axis Communications AB.
*
* Authors: Bjorn Wesen <bjornw@axis.com>
* Tobias Anderberg <tobiasa@axis.com>, CRISv32 port.
*/
#include <linux/config.h>
#include <linux/mmzone.h>
#include <linux/init.h>
#include <linux/bootmem.h>
#include <linux/mm.h>
#include <linux/config.h>
#include <asm/pgtable.h>
#include <asm/page.h>
#include <asm/types.h>
#include <asm/mmu.h>
#include <asm/io.h>
#include <asm/mmu_context.h>
#include <asm/arch/hwregs/asm/mmu_defs_asm.h>
#include <asm/arch/hwregs/supp_reg.h>
extern void tlb_init(void);
/*
* The kernel is already mapped with linear mapping at kseg_c so there's no
* need to map it with a page table. However, head.S also temporarily mapped it
* at kseg_4 thus the ksegs are set up again. Also clear the TLB and do various
* other paging stuff.
*/
void __init
cris_mmu_init(void)
{
unsigned long mmu_config;
unsigned long mmu_kbase_hi;
unsigned long mmu_kbase_lo;
unsigned short mmu_page_id;
/*
* Make sure the current pgd table points to something sane, even if it
* is most probably not used until the next switch_mm.
*/
per_cpu(current_pgd, smp_processor_id()) = init_mm.pgd;
#ifdef CONFIG_SMP
{
pgd_t **pgd;
pgd = (pgd_t**)&per_cpu(current_pgd, smp_processor_id());
SUPP_BANK_SEL(1);
SUPP_REG_WR(RW_MM_TLB_PGD, pgd);
SUPP_BANK_SEL(2);
SUPP_REG_WR(RW_MM_TLB_PGD, pgd);
}
#endif
/* Initialise the TLB. Function found in tlb.c. */
tlb_init();
/* Enable exceptions and initialize the kernel segments. */
mmu_config = ( REG_STATE(mmu, rw_mm_cfg, we, on) |
REG_STATE(mmu, rw_mm_cfg, acc, on) |
REG_STATE(mmu, rw_mm_cfg, ex, on) |
REG_STATE(mmu, rw_mm_cfg, inv, on) |
REG_STATE(mmu, rw_mm_cfg, seg_f, linear) |
REG_STATE(mmu, rw_mm_cfg, seg_e, linear) |
REG_STATE(mmu, rw_mm_cfg, seg_d, page) |
REG_STATE(mmu, rw_mm_cfg, seg_c, linear) |
REG_STATE(mmu, rw_mm_cfg, seg_b, linear) |
#ifndef CONFIG_ETRAXFS_SIM
REG_STATE(mmu, rw_mm_cfg, seg_a, page) |
#else
REG_STATE(mmu, rw_mm_cfg, seg_a, linear) |
#endif
REG_STATE(mmu, rw_mm_cfg, seg_9, page) |
REG_STATE(mmu, rw_mm_cfg, seg_8, page) |
REG_STATE(mmu, rw_mm_cfg, seg_7, page) |
REG_STATE(mmu, rw_mm_cfg, seg_6, page) |
REG_STATE(mmu, rw_mm_cfg, seg_5, page) |
REG_STATE(mmu, rw_mm_cfg, seg_4, page) |
REG_STATE(mmu, rw_mm_cfg, seg_3, page) |
REG_STATE(mmu, rw_mm_cfg, seg_2, page) |
REG_STATE(mmu, rw_mm_cfg, seg_1, page) |
REG_STATE(mmu, rw_mm_cfg, seg_0, page));
mmu_kbase_hi = ( REG_FIELD(mmu, rw_mm_kbase_hi, base_f, 0x0) |
REG_FIELD(mmu, rw_mm_kbase_hi, base_e, 0x8) |
REG_FIELD(mmu, rw_mm_kbase_hi, base_d, 0x0) |
#ifndef CONFIG_ETRAXFS_SIM
REG_FIELD(mmu, rw_mm_kbase_hi, base_c, 0x4) |
#else
REG_FIELD(mmu, rw_mm_kbase_hi, base_c, 0x0) |
#endif
REG_FIELD(mmu, rw_mm_kbase_hi, base_b, 0xb) |
#ifndef CONFIG_ETRAXFS_SIM
REG_FIELD(mmu, rw_mm_kbase_hi, base_a, 0x0) |
#else
REG_FIELD(mmu, rw_mm_kbase_hi, base_a, 0xa) |
#endif
REG_FIELD(mmu, rw_mm_kbase_hi, base_9, 0x0) |
REG_FIELD(mmu, rw_mm_kbase_hi, base_8, 0x0));
mmu_kbase_lo = ( REG_FIELD(mmu, rw_mm_kbase_lo, base_7, 0x0) |
REG_FIELD(mmu, rw_mm_kbase_lo, base_6, 0x0) |
REG_FIELD(mmu, rw_mm_kbase_lo, base_5, 0x0) |
REG_FIELD(mmu, rw_mm_kbase_lo, base_4, 0x0) |
REG_FIELD(mmu, rw_mm_kbase_lo, base_3, 0x0) |
REG_FIELD(mmu, rw_mm_kbase_lo, base_2, 0x0) |
REG_FIELD(mmu, rw_mm_kbase_lo, base_1, 0x0) |
REG_FIELD(mmu, rw_mm_kbase_lo, base_0, 0x0));
mmu_page_id = REG_FIELD(mmu, rw_mm_tlb_hi, pid, 0);
/* Update the instruction MMU. */
SUPP_BANK_SEL(BANK_IM);
SUPP_REG_WR(RW_MM_CFG, mmu_config);
SUPP_REG_WR(RW_MM_KBASE_HI, mmu_kbase_hi);
SUPP_REG_WR(RW_MM_KBASE_LO, mmu_kbase_lo);
SUPP_REG_WR(RW_MM_TLB_HI, mmu_page_id);
/* Update the data MMU. */
SUPP_BANK_SEL(BANK_DM);
SUPP_REG_WR(RW_MM_CFG, mmu_config);
SUPP_REG_WR(RW_MM_KBASE_HI, mmu_kbase_hi);
SUPP_REG_WR(RW_MM_KBASE_LO, mmu_kbase_lo);
SUPP_REG_WR(RW_MM_TLB_HI, mmu_page_id);
SPEC_REG_WR(SPEC_REG_PID, 0);
/*
* The MMU has been enabled ever since head.S but just to make it
* totally obvious enable it here as well.
*/
SUPP_BANK_SEL(BANK_GC);
SUPP_REG_WR(RW_GC_CFG, 0xf); /* IMMU, DMMU, ICache, DCache on */
}
void __init
paging_init(void)
{
int i;
unsigned long zones_size[MAX_NR_ZONES];
printk("Setting up paging and the MMU.\n");
/* Clear out the init_mm.pgd that will contain the kernel's mappings. */
for(i = 0; i < PTRS_PER_PGD; i++)
swapper_pg_dir[i] = __pgd(0);
cris_mmu_init();
/*
* Initialize the bad page table and bad page to point to a couple of
* allocated pages.
*/
empty_zero_page = (unsigned long) alloc_bootmem_pages(PAGE_SIZE);
memset((void *) empty_zero_page, 0, PAGE_SIZE);
/* All pages are DMA'able in Etrax, so put all in the DMA'able zone. */
zones_size[0] = ((unsigned long) high_memory - PAGE_OFFSET) >> PAGE_SHIFT;
for (i = 1; i < MAX_NR_ZONES; i++)
zones_size[i] = 0;
/*
* Use free_area_init_node instead of free_area_init, because it is
* designed for systems where the DRAM starts at an address
* substantially higher than 0, like us (we start at PAGE_OFFSET). This
* saves space in the mem_map page array.
*/
free_area_init_node(0, &contig_page_data, zones_size, PAGE_OFFSET >> PAGE_SHIFT, 0);
mem_map = contig_page_data.node_mem_map;
}

View file

@ -0,0 +1,139 @@
/*
* Simple allocator for internal RAM in ETRAX FS
*
* Copyright (c) 2004 Axis Communications AB.
*/
#include <linux/list.h>
#include <linux/slab.h>
#include <asm/io.h>
#include <asm/arch/memmap.h>
#define STATUS_FREE 0
#define STATUS_ALLOCATED 1
struct intmem_allocation {
struct list_head entry;
unsigned int size;
unsigned offset;
char status;
};
static struct list_head intmem_allocations;
static void* intmem_virtual;
static void crisv32_intmem_init(void)
{
static int initiated = 0;
if (!initiated) {
struct intmem_allocation* alloc =
(struct intmem_allocation*)kmalloc(sizeof *alloc, GFP_KERNEL);
INIT_LIST_HEAD(&intmem_allocations);
intmem_virtual = ioremap(MEM_INTMEM_START, MEM_INTMEM_SIZE);
initiated = 1;
alloc->size = MEM_INTMEM_SIZE;
alloc->offset = 0;
alloc->status = STATUS_FREE;
list_add_tail(&alloc->entry, &intmem_allocations);
}
}
void* crisv32_intmem_alloc(unsigned size, unsigned align)
{
struct intmem_allocation* allocation;
struct intmem_allocation* tmp;
void* ret = NULL;
preempt_disable();
crisv32_intmem_init();
list_for_each_entry_safe(allocation, tmp, &intmem_allocations, entry) {
int alignment = allocation->offset % align;
alignment = alignment ? align - alignment : alignment;
if (allocation->status == STATUS_FREE &&
allocation->size >= size + alignment) {
if (allocation->size > size + alignment) {
struct intmem_allocation* alloc =
(struct intmem_allocation*)
kmalloc(sizeof *alloc, GFP_ATOMIC);
alloc->status = STATUS_FREE;
alloc->size = allocation->size - size - alignment;
alloc->offset = allocation->offset + size;
list_add(&alloc->entry, &allocation->entry);
if (alignment) {
struct intmem_allocation* tmp;
tmp = (struct intmem_allocation*)
kmalloc(sizeof *tmp, GFP_ATOMIC);
tmp->offset = allocation->offset;
tmp->size = alignment;
tmp->status = STATUS_FREE;
allocation->offset += alignment;
list_add_tail(&tmp->entry, &allocation->entry);
}
}
allocation->status = STATUS_ALLOCATED;
allocation->size = size;
ret = (void*)((int)intmem_virtual + allocation->offset);
}
}
preempt_enable();
return ret;
}
void crisv32_intmem_free(void* addr)
{
struct intmem_allocation* allocation;
struct intmem_allocation* tmp;
if (addr == NULL)
return;
preempt_disable();
crisv32_intmem_init();
list_for_each_entry_safe(allocation, tmp, &intmem_allocations, entry) {
if (allocation->offset == (int)(addr - intmem_virtual)) {
struct intmem_allocation* prev =
list_entry(allocation->entry.prev,
struct intmem_allocation, entry);
struct intmem_allocation* next =
list_entry(allocation->entry.next,
struct intmem_allocation, entry);
allocation->status = STATUS_FREE;
/* Join with prev and/or next if also free */
if (prev->status == STATUS_FREE) {
prev->size += allocation->size;
list_del(&allocation->entry);
kfree(allocation);
allocation = prev;
}
if (next->status == STATUS_FREE) {
allocation->size += next->size;
list_del(&next->entry);
kfree(next);
}
preempt_enable();
return;
}
}
preempt_enable();
}
void* crisv32_intmem_phys_to_virt(unsigned long addr)
{
return (void*)(addr - MEM_INTMEM_START+
(unsigned long)intmem_virtual);
}
unsigned long crisv32_intmem_virt_to_phys(void* addr)
{
return (unsigned long)((unsigned long )addr -
(unsigned long)intmem_virtual + MEM_INTMEM_START);
}

141
arch/cris/arch-v32/mm/mmu.S Normal file
View file

@ -0,0 +1,141 @@
/*
* Copyright (C) 2003 Axis Communications AB
*
* Authors: Mikael Starvik (starvik@axis.com)
*
* Code for the fault low-level handling routines.
*
*/
#include <asm/page.h>
#include <asm/pgtable.h>
; Save all register. Must save in same order as struct pt_regs.
.macro SAVE_ALL
subq 12, $sp
move $erp, [$sp]
subq 4, $sp
move $srp, [$sp]
subq 4, $sp
move $ccs, [$sp]
subq 4, $sp
move $spc, [$sp]
subq 4, $sp
move $mof, [$sp]
subq 4, $sp
move $srs, [$sp]
subq 4, $sp
move.d $acr, [$sp]
subq 14*4, $sp
movem $r13, [$sp]
subq 4, $sp
move.d $r10, [$sp]
.endm
; Bus fault handler. Extracts relevant information and calls mm subsystem
; to handle the fault.
.macro MMU_BUS_FAULT_HANDLER handler, mmu, we, ex
.globl \handler
\handler:
SAVE_ALL
move \mmu, $srs ; Select MMU support register bank
move.d $sp, $r11 ; regs
moveq 1, $r12 ; protection fault
moveq \we, $r13 ; write exception?
orq \ex << 1, $r13 ; execute?
move $s3, $r10 ; rw_mm_cause
and.d ~8191, $r10 ; Get faulting page start address
jsr do_page_fault
nop
ba ret_from_intr
nop
.endm
; Refill handler. Three cases may occur:
; 1. PMD and PTE exists in mm subsystem but not in TLB
; 2. PMD exists but not PTE
; 3. PMD doesn't exist
; The code below handles case 1 and calls the mm subsystem for case 2 and 3.
; Do not touch this code without very good reasons and extensive testing.
; Note that the code is optimized to minimize stalls (makes the code harder
; to read).
;
; Each page is 8 KB. Each PMD holds 8192/4 PTEs (each PTE is 4 bytes) so each
; PMD holds 16 MB of virtual memory.
; Bits 0-12 : Offset within a page
; Bits 13-23 : PTE offset within a PMD
; Bits 24-31 : PMD offset within the PGD
.macro MMU_REFILL_HANDLER handler, mmu
.globl \handler
\handler:
subq 4, $sp
; (The pipeline stalls for one cycle; $sp used as address in the next cycle.)
move $srs, [$sp]
subq 4, $sp
move \mmu, $srs ; Select MMU support register bank
move.d $acr, [$sp]
subq 4, $sp
move.d $r0, [$sp]
#ifdef CONFIG_SMP
move $s7, $acr ; PGD
#else
move.d per_cpu__current_pgd, $acr ; PGD
#endif
; Look up PMD in PGD
move $s3, $r0 ; rw_mm_cause
lsrq 24, $r0 ; Get PMD index into PGD (bit 24-31)
move.d [$acr], $acr ; PGD for the current process
addi $r0.d, $acr, $acr
move $s3, $r0 ; rw_mm_cause
move.d [$acr], $acr ; Get PMD
beq 1f
; Look up PTE in PMD
lsrq PAGE_SHIFT, $r0
and.w PAGE_MASK, $acr ; Remove PMD flags
and.d 0x7ff, $r0 ; Get PTE index into PMD (bit 13-23)
addi $r0.d, $acr, $acr
move.d [$acr], $acr ; Get PTE
beq 2f
move.d [$sp+], $r0 ; Pop r0 in delayslot
; Store in TLB
move $acr, $s5
; Return
move.d [$sp+], $acr
move [$sp], $srs
addq 4, $sp
rete
rfe
1: ; PMD missing, let the mm subsystem fix it up.
move.d [$sp+], $r0 ; Pop r0
2: ; PTE missing, let the mm subsystem fix it up.
move.d [$sp+], $acr
move [$sp], $srs
addq 4, $sp
SAVE_ALL
move \mmu, $srs
move.d $sp, $r11 ; regs
clear.d $r12 ; Not a protection fault
move.w PAGE_MASK, $acr
move $s3, $r10 ; rw_mm_cause
btstq 9, $r10 ; Check if write access
smi $r13
and.w PAGE_MASK, $r10 ; Get VPN (virtual address)
jsr do_page_fault
and.w $acr, $r10
; Return
ba ret_from_intr
nop
.endm
; This is the MMU bus fault handlers.
MMU_REFILL_HANDLER i_mmu_refill, 1
MMU_BUS_FAULT_HANDLER i_mmu_invalid, 1, 0, 0
MMU_BUS_FAULT_HANDLER i_mmu_access, 1, 0, 0
MMU_BUS_FAULT_HANDLER i_mmu_execute, 1, 0, 1
MMU_REFILL_HANDLER d_mmu_refill, 2
MMU_BUS_FAULT_HANDLER d_mmu_invalid, 2, 0, 0
MMU_BUS_FAULT_HANDLER d_mmu_access, 2, 0, 0
MMU_BUS_FAULT_HANDLER d_mmu_write, 2, 1, 0

208
arch/cris/arch-v32/mm/tlb.c Normal file
View file

@ -0,0 +1,208 @@
/*
* Low level TLB handling.
*
* Copyright (C) 2000-2003, Axis Communications AB.
*
* Authors: Bjorn Wesen <bjornw@axis.com>
* Tobias Anderberg <tobiasa@axis.com>, CRISv32 port.
*/
#include <asm/tlb.h>
#include <asm/mmu_context.h>
#include <asm/arch/hwregs/asm/mmu_defs_asm.h>
#include <asm/arch/hwregs/supp_reg.h>
#define UPDATE_TLB_SEL_IDX(val) \
do { \
unsigned long tlb_sel; \
\
tlb_sel = REG_FIELD(mmu, rw_mm_tlb_sel, idx, val); \
SUPP_REG_WR(RW_MM_TLB_SEL, tlb_sel); \
} while(0)
#define UPDATE_TLB_HILO(tlb_hi, tlb_lo) \
do { \
SUPP_REG_WR(RW_MM_TLB_HI, tlb_hi); \
SUPP_REG_WR(RW_MM_TLB_LO, tlb_lo); \
} while(0)
/*
* The TLB can host up to 256 different mm contexts at the same time. The running
* context is found in the PID register. Each TLB entry contains a page_id that
* has to match the PID register to give a hit. page_id_map keeps track of which
* mm's is assigned to which page_id's, making sure it's known when to
* invalidate TLB entries.
*
* The last page_id is never running, it is used as an invalid page_id so that
* it's possible to make TLB entries that will nerver match.
*
* Note; the flushes needs to be atomic otherwise an interrupt hander that uses
* vmalloc'ed memory might cause a TLB load in the middle of a flush.
*/
/* Flush all TLB entries. */
void
__flush_tlb_all(void)
{
int i;
int mmu;
unsigned long flags;
unsigned long mmu_tlb_hi;
unsigned long mmu_tlb_sel;
/*
* Mask with 0xf so similar TLB entries aren't written in the same 4-way
* entry group.
*/
local_save_flags(flags);
local_irq_disable();
for (mmu = 1; mmu <= 2; mmu++) {
SUPP_BANK_SEL(mmu); /* Select the MMU */
for (i = 0; i < NUM_TLB_ENTRIES; i++) {
/* Store invalid entry */
mmu_tlb_sel = REG_FIELD(mmu, rw_mm_tlb_sel, idx, i);
mmu_tlb_hi = (REG_FIELD(mmu, rw_mm_tlb_hi, pid, INVALID_PAGEID)
| REG_FIELD(mmu, rw_mm_tlb_hi, vpn, i & 0xf));
SUPP_REG_WR(RW_MM_TLB_SEL, mmu_tlb_sel);
SUPP_REG_WR(RW_MM_TLB_HI, mmu_tlb_hi);
SUPP_REG_WR(RW_MM_TLB_LO, 0);
}
}
local_irq_restore(flags);
}
/* Flush an entire user address space. */
void
__flush_tlb_mm(struct mm_struct *mm)
{
int i;
int mmu;
unsigned long flags;
unsigned long page_id;
unsigned long tlb_hi;
unsigned long mmu_tlb_hi;
page_id = mm->context.page_id;
if (page_id == NO_CONTEXT)
return;
/* Mark the TLB entries that match the page_id as invalid. */
local_save_flags(flags);
local_irq_disable();
for (mmu = 1; mmu <= 2; mmu++) {
SUPP_BANK_SEL(mmu);
for (i = 0; i < NUM_TLB_ENTRIES; i++) {
UPDATE_TLB_SEL_IDX(i);
/* Get the page_id */
SUPP_REG_RD(RW_MM_TLB_HI, tlb_hi);
/* Check if the page_id match. */
if ((tlb_hi & 0xff) == page_id) {
mmu_tlb_hi = (REG_FIELD(mmu, rw_mm_tlb_hi, pid,
INVALID_PAGEID)
| REG_FIELD(mmu, rw_mm_tlb_hi, vpn,
i & 0xf));
UPDATE_TLB_HILO(mmu_tlb_hi, 0);
}
}
}
local_irq_restore(flags);
}
/* Invalidate a single page. */
void
__flush_tlb_page(struct vm_area_struct *vma, unsigned long addr)
{
int i;
int mmu;
unsigned long page_id;
unsigned long flags;
unsigned long tlb_hi;
unsigned long mmu_tlb_hi;
page_id = vma->vm_mm->context.page_id;
if (page_id == NO_CONTEXT)
return;
addr &= PAGE_MASK;
/*
* Invalidate those TLB entries that match both the mm context and the
* requested virtual address.
*/
local_save_flags(flags);
local_irq_disable();
for (mmu = 1; mmu <= 2; mmu++) {
SUPP_BANK_SEL(mmu);
for (i = 0; i < NUM_TLB_ENTRIES; i++) {
UPDATE_TLB_SEL_IDX(i);
SUPP_REG_RD(RW_MM_TLB_HI, tlb_hi);
/* Check if page_id and address matches */
if (((tlb_hi & 0xff) == page_id) &&
((tlb_hi & PAGE_MASK) == addr)) {
mmu_tlb_hi = REG_FIELD(mmu, rw_mm_tlb_hi, pid,
INVALID_PAGEID) | addr;
UPDATE_TLB_HILO(mmu_tlb_hi, 0);
}
}
}
local_irq_restore(flags);
}
/*
* Initialize the context related info for a new mm_struct
* instance.
*/
int
init_new_context(struct task_struct *tsk, struct mm_struct *mm)
{
mm->context.page_id = NO_CONTEXT;
return 0;
}
/* Called in schedule() just before actually doing the switch_to. */
void
switch_mm(struct mm_struct *prev, struct mm_struct *next,
struct task_struct *tsk)
{
int cpu = smp_processor_id();
/* Make sure there is a MMU context. */
spin_lock(&next->page_table_lock);
get_mmu_context(next);
cpu_set(cpu, next->cpu_vm_mask);
spin_unlock(&next->page_table_lock);
/*
* Remember the pgd for the fault handlers. Keep a seperate copy of it
* because current and active_mm might be invalid at points where
* there's still a need to derefer the pgd.
*/
per_cpu(current_pgd, cpu) = next->pgd;
/* Switch context in the MMU. */
if (tsk && tsk->thread_info)
{
SPEC_REG_WR(SPEC_REG_PID, next->context.page_id | tsk->thread_info->tls);
}
else
{
SPEC_REG_WR(SPEC_REG_PID, next->context.page_id);
}
}

View file

@ -0,0 +1,2 @@
/* At the time of this writing, there's no equivalent ld option. */
OUTPUT_ARCH (crisv32)

View file

@ -0,0 +1,134 @@
/* ld script to make the Linux/CRIS kernel
* Authors: Bjorn Wesen (bjornw@axis.com)
*
* It is VERY DANGEROUS to fiddle around with the symbols in this
* script. It is for example quite vital that all generated sections
* that are used are actually named here, otherwise the linker will
* put them at the end, where the init stuff is which is FREED after
* the kernel has booted.
*/
#include <linux/config.h>
#include <asm-generic/vmlinux.lds.h>
jiffies = jiffies_64;
SECTIONS
{
. = DRAM_VIRTUAL_BASE;
dram_start = .;
ebp_start = .;
/* The boot section is only necessary until the VCS top level testbench */
/* includes both flash and DRAM. */
.boot : { *(.boot) }
. = DRAM_VIRTUAL_BASE + 0x4000; /* See head.S and pages reserved at the start. */
_text = .; /* Text and read-only data. */
text_start = .; /* Lots of aliases. */
_stext = .;
__stext = .;
.text : {
*(.text)
SCHED_TEXT
LOCK_TEXT
*(.fixup)
*(.text.__*)
}
_etext = . ; /* End of text section. */
__etext = .;
. = ALIGN(4); /* Exception table. */
__start___ex_table = .;
__ex_table : { *(__ex_table) }
__stop___ex_table = .;
RODATA
. = ALIGN (4);
___data_start = . ;
__Sdata = . ;
.data : { /* Data */
*(.data)
}
__edata = . ; /* End of data section. */
_edata = . ;
. = ALIGN(8192); /* init_task and stack, must be aligned. */
.data.init_task : { *(.data.init_task) }
. = ALIGN(8192); /* Init code and data. */
__init_begin = .;
.init.text : {
_sinittext = .;
*(.init.text)
_einittext = .;
}
.init.data : { *(.init.data) }
. = ALIGN(16);
__setup_start = .;
.init.setup : { *(.init.setup) }
__setup_end = .;
__start___param = .;
__param : { *(__param) }
__stop___param = .;
.initcall.init : {
__initcall_start = .;
*(.initcall1.init);
*(.initcall2.init);
*(.initcall3.init);
*(.initcall4.init);
*(.initcall5.init);
*(.initcall6.init);
*(.initcall7.init);
__initcall_end = .;
}
.con_initcall.init : {
__con_initcall_start = .;
*(.con_initcall.init)
__con_initcall_end = .;
}
SECURITY_INIT
__per_cpu_start = .;
.data.percpu : { *(.data.percpu) }
__per_cpu_end = .;
.init.ramfs : {
__initramfs_start = .;
*(.init.ramfs)
__initramfs_end = .;
/*
* We fill to the next page, so we can discard all init
* pages without needing to consider what payload might be
* appended to the kernel image.
*/
FILL (0);
. = ALIGN (8192);
}
__vmlinux_end = .; /* Last address of the physical file. */
__init_end = .;
__data_end = . ; /* Move to _edata? */
__bss_start = .; /* BSS. */
.bss : {
*(COMMON)
*(.bss)
}
. = ALIGN (0x20);
_end = .;
__end = .;
/* Sections to be discarded */
/DISCARD/ : {
*(.text.exit)
*(.data.exit)
*(.exitcall.exit)
}
dram_end = dram_start + CONFIG_ETRAX_DRAM_SIZE*1024*1024;
}

View file

@ -0,0 +1,30 @@
#ifndef _ASM_CRIS_ARCH_ARBITER_H
#define _ASM_CRIS_ARCH_ARBITER_H
#define EXT_REGION 0
#define INT_REGION 1
typedef void (watch_callback)(void);
enum
{
arbiter_all_dmas = 0x3ff,
arbiter_cpu = 0xc00,
arbiter_all_clients = 0x3fff
};
enum
{
arbiter_all_read = 0x55,
arbiter_all_write = 0xaa,
arbiter_all_accesses = 0xff
};
int crisv32_arbiter_allocate_bandwith(int client, int region,
unsigned long bandwidth);
int crisv32_arbiter_watch(unsigned long start, unsigned long size,
unsigned long clients, unsigned long accesses,
watch_callback* cb);
int crisv32_arbiter_unwatch(int id);
#endif

View file

@ -0,0 +1,36 @@
#ifndef __ASM_CRIS_ARCH_ATOMIC__
#define __ASM_CRIS_ARCH_ATOMIC__
#include <asm/system.h>
extern void cris_spin_unlock(void *l, int val);
extern void cris_spin_lock(void *l);
extern int cris_spin_trylock(void* l);
#ifndef CONFIG_SMP
#define cris_atomic_save(addr, flags) local_irq_save(flags);
#define cris_atomic_restore(addr, flags) local_irq_restore(flags);
#else
extern spinlock_t cris_atomic_locks[];
#define LOCK_COUNT 128
#define HASH_ADDR(a) (((int)a) & 127)
#define cris_atomic_save(addr, flags) \
local_irq_save(flags); \
cris_spin_lock((void*)&cris_atomic_locks[HASH_ADDR(addr)].lock);
#define cris_atomic_restore(addr, flags) \
{ \
spinlock_t *lock = (void*)&cris_atomic_locks[HASH_ADDR(addr)]; \
__asm__ volatile ("move.d %1,%0" \
: "=m" (lock->lock) \
: "r" (1) \
: "memory"); \
local_irq_restore(flags); \
}
#endif
#endif

View file

@ -0,0 +1,64 @@
#ifndef _ASM_CRIS_ARCH_BITOPS_H
#define _ASM_CRIS_ARCH_BITOPS_H
/*
* Helper functions for the core of the ff[sz] functions. They compute the
* number of leading zeroes of a bits-in-byte, byte-in-word and
* word-in-dword-swapped number. They differ in that the first function also
* inverts all bits in the input.
*/
extern inline unsigned long
cris_swapnwbrlz(unsigned long w)
{
unsigned long res;
__asm__ __volatile__ ("swapnwbr %0\n\t"
"lz %0,%0"
: "=r" (res) : "0" (w));
return res;
}
extern inline unsigned long
cris_swapwbrlz(unsigned long w)
{
unsigned long res;
__asm__ __volatile__ ("swapwbr %0\n\t"
"lz %0,%0"
: "=r" (res) : "0" (w));
return res;
}
/*
* Find First Zero in word. Undefined if no zero exist, so the caller should
* check against ~0 first.
*/
extern inline unsigned long
ffz(unsigned long w)
{
return cris_swapnwbrlz(w);
}
/*
* Find First Set bit in word. Undefined if no 1 exist, so the caller
* should check against 0 first.
*/
extern inline unsigned long
__ffs(unsigned long w)
{
return cris_swapnwbrlz(~w);
}
/*
* Find First Bit that is set.
*/
extern inline unsigned long
kernel_ffs(unsigned long w)
{
return w ? cris_swapwbrlz (w) + 1 : 0;
}
#endif /* _ASM_CRIS_ARCH_BITOPS_H */

View file

@ -0,0 +1,20 @@
#ifndef _ASM_CRIS_ARCH_BYTEORDER_H
#define _ASM_CRIS_ARCH_BYTEORDER_H
#include <asm/types.h>
extern __inline__ __const__ __u32
___arch__swab32(__u32 x)
{
__asm__ __volatile__ ("swapwb %0" : "=r" (x) : "0" (x));
return (x);
}
extern __inline__ __const__ __u16
___arch__swab16(__u16 x)
{
__asm__ __volatile__ ("swapb %0" : "=r" (x) : "0" (x));
return (x);
}
#endif /* _ASM_CRIS_ARCH_BYTEORDER_H */

View file

@ -0,0 +1,9 @@
#ifndef _ASM_CRIS_ARCH_CACHE_H
#define _ASM_CRIS_ARCH_CACHE_H
/* A cache-line is 32 bytes. */
#define L1_CACHE_BYTES 32
#define L1_CACHE_SHIFT 5
#define L1_CACHE_SHIFT_MAX 5
#endif /* _ASM_CRIS_ARCH_CACHE_H */

View file

@ -0,0 +1,29 @@
#ifndef _ASM_CRIS_ARCH_CHECKSUM_H
#define _ASM_CRIS_ARCH_CHECKSUM_H
/*
* Check values used in TCP/UDP headers.
*
* The gain of doing this in assembler instead of C, is that C doesn't
* generate carry-additions for the 32-bit components of the
* checksum. Which means it would be necessary to split all those into
* 16-bit components and then add.
*/
extern inline unsigned int
csum_tcpudp_nofold(unsigned long saddr, unsigned long daddr,
unsigned short len, unsigned short proto, unsigned int sum)
{
int res;
__asm__ __volatile__ ("add.d %2, %0\n\t"
"addc %3, %0\n\t"
"addc %4, %0\n\t"
"addc 0, %0\n\t"
: "=r" (res)
: "0" (sum), "r" (daddr), "r" (saddr), \
"r" ((ntohs(len) << 16) + (proto << 8)));
return res;
}
#endif /* _ASM_CRIS_ARCH_CHECKSUM_H */

View file

@ -0,0 +1,272 @@
/*
* The device /dev/cryptocop is accessible using this driver using
* CRYPTOCOP_MAJOR (254) and minor number 0.
*/
#ifndef CRYPTOCOP_H
#define CRYPTOCOP_H
#include <linux/uio.h>
#define CRYPTOCOP_SESSION_ID_NONE (0)
typedef unsigned long long int cryptocop_session_id;
/* cryptocop ioctls */
#define ETRAXCRYPTOCOP_IOCTYPE (250)
#define CRYPTOCOP_IO_CREATE_SESSION _IOWR(ETRAXCRYPTOCOP_IOCTYPE, 1, struct strcop_session_op)
#define CRYPTOCOP_IO_CLOSE_SESSION _IOW(ETRAXCRYPTOCOP_IOCTYPE, 2, struct strcop_session_op)
#define CRYPTOCOP_IO_PROCESS_OP _IOWR(ETRAXCRYPTOCOP_IOCTYPE, 3, struct strcop_crypto_op)
#define CRYPTOCOP_IO_MAXNR (3)
typedef enum {
cryptocop_cipher_des = 0,
cryptocop_cipher_3des = 1,
cryptocop_cipher_aes = 2,
cryptocop_cipher_m2m = 3, /* mem2mem is essentially a NULL cipher with blocklength=1 */
cryptocop_cipher_none
} cryptocop_cipher_type;
typedef enum {
cryptocop_digest_sha1 = 0,
cryptocop_digest_md5 = 1,
cryptocop_digest_none
} cryptocop_digest_type;
typedef enum {
cryptocop_csum_le = 0,
cryptocop_csum_be = 1,
cryptocop_csum_none
} cryptocop_csum_type;
typedef enum {
cryptocop_cipher_mode_ecb = 0,
cryptocop_cipher_mode_cbc,
cryptocop_cipher_mode_none
} cryptocop_cipher_mode;
typedef enum {
cryptocop_3des_eee = 0,
cryptocop_3des_eed = 1,
cryptocop_3des_ede = 2,
cryptocop_3des_edd = 3,
cryptocop_3des_dee = 4,
cryptocop_3des_ded = 5,
cryptocop_3des_dde = 6,
cryptocop_3des_ddd = 7
} cryptocop_3des_mode;
/* Usermode accessible (ioctl) operations. */
struct strcop_session_op{
cryptocop_session_id ses_id;
cryptocop_cipher_type cipher; /* AES, DES, 3DES, m2m, none */
cryptocop_cipher_mode cmode; /* ECB, CBC, none */
cryptocop_3des_mode des3_mode;
cryptocop_digest_type digest; /* MD5, SHA1, none */
cryptocop_csum_type csum; /* BE, LE, none */
unsigned char *key;
size_t keylen;
};
#define CRYPTOCOP_CSUM_LENGTH (2)
#define CRYPTOCOP_MAX_DIGEST_LENGTH (20) /* SHA-1 20, MD5 16 */
#define CRYPTOCOP_MAX_IV_LENGTH (16) /* (3)DES==8, AES == 16 */
#define CRYPTOCOP_MAX_KEY_LENGTH (32)
struct strcop_crypto_op{
cryptocop_session_id ses_id;
/* Indata. */
unsigned char *indata;
size_t inlen; /* Total indata length. */
/* Cipher configuration. */
unsigned char do_cipher:1;
unsigned char decrypt:1; /* 1 == decrypt, 0 == encrypt */
unsigned char cipher_explicit:1;
size_t cipher_start;
size_t cipher_len;
/* cipher_iv is used if do_cipher and cipher_explicit and the cipher
mode is CBC. The length is controlled by the type of cipher,
e.g. DES/3DES 8 octets and AES 16 octets. */
unsigned char cipher_iv[CRYPTOCOP_MAX_IV_LENGTH];
/* Outdata. */
unsigned char *cipher_outdata;
size_t cipher_outlen;
/* digest configuration. */
unsigned char do_digest:1;
size_t digest_start;
size_t digest_len;
/* Outdata. The actual length is determined by the type of the digest. */
unsigned char digest[CRYPTOCOP_MAX_DIGEST_LENGTH];
/* Checksum configuration. */
unsigned char do_csum:1;
size_t csum_start;
size_t csum_len;
/* Outdata. */
unsigned char csum[CRYPTOCOP_CSUM_LENGTH];
};
#ifdef __KERNEL__
/********** The API to use from inside the kernel. ************/
#include <asm/arch/hwregs/dma.h>
typedef enum {
cryptocop_alg_csum = 0,
cryptocop_alg_mem2mem,
cryptocop_alg_md5,
cryptocop_alg_sha1,
cryptocop_alg_des,
cryptocop_alg_3des,
cryptocop_alg_aes,
cryptocop_no_alg,
} cryptocop_algorithm;
typedef u8 cryptocop_tfrm_id;
struct cryptocop_operation;
typedef void (cryptocop_callback)(struct cryptocop_operation*, void*);
struct cryptocop_transform_init {
cryptocop_algorithm alg;
/* Keydata for ciphers. */
unsigned char key[CRYPTOCOP_MAX_KEY_LENGTH];
unsigned int keylen;
cryptocop_cipher_mode cipher_mode;
cryptocop_3des_mode tdes_mode;
cryptocop_csum_type csum_mode; /* cryptocop_csum_none is not allowed when alg==cryptocop_alg_csum */
cryptocop_tfrm_id tid; /* Locally unique in session; assigned by user, checked by driver. */
struct cryptocop_transform_init *next;
};
typedef enum {
cryptocop_source_dma = 0,
cryptocop_source_des,
cryptocop_source_3des,
cryptocop_source_aes,
cryptocop_source_md5,
cryptocop_source_sha1,
cryptocop_source_csum,
cryptocop_source_none,
} cryptocop_source;
struct cryptocop_desc_cfg {
cryptocop_tfrm_id tid;
cryptocop_source src;
unsigned int last:1; /* Last use of this transform in the operation. Will push outdata when encountered. */
struct cryptocop_desc_cfg *next;
};
struct cryptocop_desc {
size_t length;
struct cryptocop_desc_cfg *cfg;
struct cryptocop_desc *next;
};
/* Flags for cryptocop_tfrm_cfg */
#define CRYPTOCOP_NO_FLAG (0x00)
#define CRYPTOCOP_ENCRYPT (0x01)
#define CRYPTOCOP_DECRYPT (0x02)
#define CRYPTOCOP_EXPLICIT_IV (0x04)
struct cryptocop_tfrm_cfg {
cryptocop_tfrm_id tid;
unsigned int flags; /* DECRYPT, ENCRYPT, EXPLICIT_IV */
/* CBC initialisation vector for cihers. */
u8 iv[CRYPTOCOP_MAX_IV_LENGTH];
/* The position in output where to write the transform output. The order
in which the driver writes the output is unspecified, hence if several
transforms write on the same positions in the output the result is
unspecified. */
size_t inject_ix;
struct cryptocop_tfrm_cfg *next;
};
struct cryptocop_dma_list_operation{
/* The consumer can provide DMA lists to send to the co-processor. 'use_dmalists' in
struct cryptocop_operation must be set for the driver to use them. outlist,
out_data_buf, inlist and in_data_buf must all be physical addresses since they will
be loaded to DMA . */
dma_descr_data *outlist; /* Out from memory to the co-processor. */
char *out_data_buf;
dma_descr_data *inlist; /* In from the co-processor to memory. */
char *in_data_buf;
cryptocop_3des_mode tdes_mode;
cryptocop_csum_type csum_mode;
};
struct cryptocop_tfrm_operation{
/* Operation configuration, if not 'use_dmalists' is set. */
struct cryptocop_tfrm_cfg *tfrm_cfg;
struct cryptocop_desc *desc;
struct iovec *indata;
size_t incount;
size_t inlen; /* Total inlength. */
struct iovec *outdata;
size_t outcount;
size_t outlen; /* Total outlength. */
};
struct cryptocop_operation {
cryptocop_callback *cb;
void *cb_data;
cryptocop_session_id sid;
/* The status of the operation when returned to consumer. */
int operation_status; /* 0, -EAGAIN */
/* Flags */
unsigned int use_dmalists:1; /* Use outlist and inlist instead of the desc/tfrm_cfg configuration. */
unsigned int in_interrupt:1; /* Set if inserting job from interrupt context. */
unsigned int fast_callback:1; /* Set if fast callback wanted, i.e. from interrupt context. */
union{
struct cryptocop_dma_list_operation list_op;
struct cryptocop_tfrm_operation tfrm_op;
};
};
int cryptocop_new_session(cryptocop_session_id *sid, struct cryptocop_transform_init *tinit, int alloc_flag);
int cryptocop_free_session(cryptocop_session_id sid);
int cryptocop_job_queue_insert_csum(struct cryptocop_operation *operation);
int cryptocop_job_queue_insert_crypto(struct cryptocop_operation *operation);
int cryptocop_job_queue_insert_user_job(struct cryptocop_operation *operation);
#endif /* __KERNEL__ */
#endif /* CRYPTOCOP_H */

View file

@ -0,0 +1,18 @@
#ifndef _ASM_CRIS_ARCH_DELAY_H
#define _ASM_CRIS_ARCH_DELAY_H
extern __inline__ void
__delay(int loops)
{
__asm__ __volatile__ (
"move.d %0, $r9\n\t"
"beq 2f\n\t"
"subq 1, $r9\n\t"
"1:\n\t"
"bne 1b\n\t"
"subq 1, $r9\n"
"2:"
: : "g" (loops) : "r9");
}
#endif /* _ASM_CRIS_ARCH_DELAY_H */

View file

@ -0,0 +1,79 @@
#ifndef _ASM_ARCH_CRIS_DMA_H
#define _ASM_ARCH_CRIS_DMA_H
/* Defines for using and allocating dma channels. */
#define MAX_DMA_CHANNELS 10
#define NETWORK_ETH0_TX_DMA_NBR 0 /* Ethernet 0 out. */
#define NETWORK_ETH0 RX_DMA_NBR 1 /* Ethernet 0 in. */
#define IO_PROC_DMA0_TX_DMA_NBR 2 /* IO processor DMA0 out. */
#define IO_PROC_DMA0_RX_DMA_NBR 3 /* IO processor DMA0 in. */
#define ATA_TX_DMA_NBR 2 /* ATA interface out. */
#define ATA_RX_DMA_NBR 3 /* ATA interface in. */
#define ASYNC_SER2_TX_DMA_NBR 2 /* Asynchronous serial port 2 out. */
#define ASYNC_SER2_RX_DMA_NBR 3 /* Asynchronous serial port 2 in. */
#define IO_PROC_DMA1_TX_DMA_NBR 4 /* IO processor DMA1 out. */
#define IO_PROC_DMA1_RX_DMA_NBR 5 /* IO processor DMA1 in. */
#define ASYNC_SER1_TX_DMA_NBR 4 /* Asynchronous serial port 1 out. */
#define ASYNC_SER1_RX_DMA_NBR 5 /* Asynchronous serial port 1 in. */
#define SYNC_SER0_TX_DMA_NBR 4 /* Synchronous serial port 0 out. */
#define SYNC_SER0_RX_DMA_NBR 5 /* Synchronous serial port 0 in. */
#define EXTDMA0_TX_DMA_NBR 6 /* External DMA 0 out. */
#define EXTDMA1_RX_DMA_NBR 7 /* External DMA 1 in. */
#define ASYNC_SER0_TX_DMA_NBR 6 /* Asynchronous serial port 0 out. */
#define ASYNC_SER0_RX_DMA_NBR 7 /* Asynchronous serial port 0 in. */
#define SYNC_SER1_TX_DMA_NBR 6 /* Synchronous serial port 1 out. */
#define SYNC_SER1_RX_DMA_NBR 7 /* Synchronous serial port 1 in. */
#define NETWORK_ETH1_TX_DMA_NBR 6 /* Ethernet 1 out. */
#define NETWORK_ETH1_RX_DMA_NBR 7 /* Ethernet 1 in. */
#define EXTDMA2_TX_DMA_NBR 8 /* External DMA 2 out. */
#define EXTDMA3_RX_DMA_NBR 9 /* External DMA 3 in. */
#define STRCOP_TX_DMA_NBR 8 /* Stream co-processor out. */
#define STRCOP_RX_DMA_NBR 9 /* Stream co-processor in. */
#define ASYNC_SER3_TX_DMA_NBR 8 /* Asynchronous serial port 3 out. */
#define ASYNC_SER3_RX_DMA_NBR 9 /* Asynchronous serial port 3 in. */
enum dma_owner
{
dma_eth0,
dma_eth1,
dma_iop0,
dma_iop1,
dma_ser0,
dma_ser1,
dma_ser2,
dma_ser3,
dma_sser0,
dma_sser1,
dma_ata,
dma_strp,
dma_ext0,
dma_ext1,
dma_ext2,
dma_ext3
};
int crisv32_request_dma(unsigned int dmanr, const char * device_id,
unsigned options, unsigned bandwidth, enum dma_owner owner);
void crisv32_free_dma(unsigned int dmanr);
/* Masks used by crisv32_request_dma options: */
#define DMA_VERBOSE_ON_ERROR 1
#define DMA_PANIC_ON_ERROR (2|DMA_VERBOSE_ON_ERROR)
#define DMA_INT_MEM 4
#endif /* _ASM_ARCH_CRIS_DMA_H */

View file

@ -0,0 +1,73 @@
#ifndef _ASM_CRIS_ELF_H
#define _ASM_CRIS_ELF_H
#define ELF_CORE_EFLAGS EF_CRIS_VARIANT_V32
/*
* This is used to ensure we don't load something for the wrong architecture.
*/
#define elf_check_arch(x) \
((x)->e_machine == EM_CRIS \
&& ((((x)->e_flags & EF_CRIS_VARIANT_MASK) == EF_CRIS_VARIANT_V32 \
|| (((x)->e_flags & EF_CRIS_VARIANT_MASK) == EF_CRIS_VARIANT_COMMON_V10_V32))))
/* CRISv32 ELF register definitions. */
#include <asm/ptrace.h>
/* Explicitly zero out registers to increase determinism. */
#define ELF_PLAT_INIT(_r, load_addr) do { \
(_r)->r13 = 0; (_r)->r12 = 0; (_r)->r11 = 0; (_r)->r10 = 0; \
(_r)->r9 = 0; (_r)->r8 = 0; (_r)->r7 = 0; (_r)->r6 = 0; \
(_r)->r5 = 0; (_r)->r4 = 0; (_r)->r3 = 0; (_r)->r2 = 0; \
(_r)->r1 = 0; (_r)->r0 = 0; (_r)->mof = 0; (_r)->srp = 0; \
(_r)->acr = 0; \
} while (0)
/*
* An executable for which elf_read_implies_exec() returns TRUE will
* have the READ_IMPLIES_EXEC personality flag set automatically.
*/
#define elf_read_implies_exec_binary(ex, have_pt_gnu_stack) (!(have_pt_gnu_stack))
/*
* This is basically a pt_regs with the additional definition
* of the stack pointer since it's needed in a core dump.
* pr_regs is a elf_gregset_t and should be filled according
* to the layout of user_regs_struct.
*/
#define ELF_CORE_COPY_REGS(pr_reg, regs) \
pr_reg[0] = regs->r0; \
pr_reg[1] = regs->r1; \
pr_reg[2] = regs->r2; \
pr_reg[3] = regs->r3; \
pr_reg[4] = regs->r4; \
pr_reg[5] = regs->r5; \
pr_reg[6] = regs->r6; \
pr_reg[7] = regs->r7; \
pr_reg[8] = regs->r8; \
pr_reg[9] = regs->r9; \
pr_reg[10] = regs->r10; \
pr_reg[11] = regs->r11; \
pr_reg[12] = regs->r12; \
pr_reg[13] = regs->r13; \
pr_reg[14] = rdusp(); /* SP */ \
pr_reg[15] = regs->acr; /* ACR */ \
pr_reg[16] = 0; /* BZ */ \
pr_reg[17] = rdvr(); /* VR */ \
pr_reg[18] = 0; /* PID */ \
pr_reg[19] = regs->srs; /* SRS */ \
pr_reg[20] = 0; /* WZ */ \
pr_reg[21] = regs->exs; /* EXS */ \
pr_reg[22] = regs->eda; /* EDA */ \
pr_reg[23] = regs->mof; /* MOF */ \
pr_reg[24] = 0; /* DZ */ \
pr_reg[25] = 0; /* EBP */ \
pr_reg[26] = regs->erp; /* ERP */ \
pr_reg[27] = regs->srp; /* SRP */ \
pr_reg[28] = 0; /* NRP */ \
pr_reg[29] = regs->ccs; /* CCS */ \
pr_reg[30] = rdusp(); /* USP */ \
pr_reg[31] = regs->spc; /* SPC */ \
#endif /* _ASM_CRIS_ELF_H */

View file

@ -0,0 +1,187 @@
# $Id: Makefile,v 1.8 2004/01/07 21:16:18 johana Exp $
# Makefile to generate or copy the latest register definitions
# and related datastructures and helpermacros.
# The offical place for these files is at:
RELEASE ?= r1_alfa5
OFFICIAL_INCDIR = /n/asic/projects/guinness/releases/$(RELEASE)/design/top/sw/include/
# which is updated on each new release.
INCL_ASMFILES =
INCL_FILES = ata_defs.h
INCL_FILES += bif_core_defs.h
INCL_ASMFILES += bif_core_defs_asm.h
INCL_FILES += bif_slave_defs.h
#INCL_FILES += bif_slave_ext_defs.h
INCL_FILES += config_defs.h
INCL_ASMFILES += config_defs_asm.h
INCL_FILES += cpu_vect.h
#INCL_FILES += cris_defs.h
#INCL_FILES += cris_supp_reg.h # In handcrafted supp_reg.h
INCL_FILES += dma.h
INCL_FILES += dma_defs.h
INCL_FILES += eth_defs.h
INCL_FILES += extmem_defs.h
INCL_FILES += gio_defs.h
INCL_ASMFILES += gio_defs_asm.h
INCL_FILES += intr_vect.h
INCL_FILES += intr_vect_defs.h
INCL_ASMFILES += intr_vect_defs_asm.h
INCL_FILES += marb_bp_defs.h
INCL_FILES += marb_defs.h
INCL_ASMFILES += mmu_defs_asm.h
#INCL_FILES += mmu_supp_reg.h # In handcrafted supp_reg.h
#INCL_FILES += par_defs.h # No useful content
INCL_FILES += pinmux_defs.h
INCL_FILES += reg_map.h
INCL_ASMFILES += reg_map_asm.h
INCL_FILES += reg_rdwr.h
INCL_FILES += ser_defs.h
#INCL_FILES += spec_reg.h # In handcrafted supp_reg.h
INCL_FILES += sser_defs.h
INCL_FILES += strcop_defs.h
#INCL_FILES += strcop.h # Where is this?
INCL_FILES += strmux_defs.h
#INCL_FILES += supp_reg.h # Handcrafted instead
INCL_FILES += timer_defs.h
REGDESC =
REGDESC += $(BASEDIR)/io/ata/rtl/ata_regs.r
REGDESC += $(BASEDIR)/io/bif/rtl/bif_core_regs.r
REGDESC += $(BASEDIR)/io/bif/rtl/bif_slave_regs.r
#REGDESC += $(BASEDIR)/io/bif/sw/bif_slave_ext_regs.r
REGDESC += $(DESIGNDIR)/top/rtl/config_regs.r
REGDESC += $(BASEDIR)/mod/dma_common/rtl/dma_regdes.r
REGDESC += $(BASEDIR)/io/eth/rtl/eth_regs.r
REGDESC += $(BASEDIR)/io/bif/mod/extmem/extmem_regs.r
REGDESC += $(DESIGNDIR)/gio/rtl/gio_regs.r
REGDESC += $(BASEDIR)/core/cpu/intr_vect/rtl/guinness/ivmask.config.r
REGDESC += $(BASEDIR)/core/memarb/rtl/guinness/marb_top.r
REGDESC += $(BASEDIR)/core/cpu/mmu/doc/mmu_regs.r
#REGDESC += $(BASEDIR)/io/par_port/rtl/par_regs.r
REGDESC += $(BASEDIR)/io/pinmux/rtl/guinness/pinmux_regs.r
REGDESC += $(BASEDIR)/io/ser/rtl/ser_regs.r
REGDESC += $(BASEDIR)/core/strcop/rtl/strcop_regs.r
REGDESC += $(BASEDIR)/io/strmux/rtl/guinness/strmux_regs.r
REGDESC += $(BASEDIR)/io/timer/rtl/timer_regs.r
#REGDESC += $(BASEDIR)/io/usb/usb1_1/rtl/usb_regs.r
BASEDIR = /n/asic/design
DESIGNDIR = /n/asic/projects/guinness/design
RDES2C = /n/asic/bin/rdes2c
RDES2C = /n/asic/design/tools/rdesc/rdes2c
RDES2INTR = /n/asic/design/tools/rdesc/rdes2intr
RDES2TXT = /n/asic/design/tools/rdesc/rdes2txt
## all - Just print help - you probably want to do 'make gen'
all: help
# Disable implicit rule that may generate deleted files from RCS/ directory.
%.r:
%.h:
## help - This help
help:
@grep '^## ' Makefile
## gen - Generate include files
gen: $(INCL_FILES) $(INCL_ASMFILES)
ata_defs.h: $(BASEDIR)/io/ata/rtl/ata_regs.r
$(RDES2C) $<
config_defs.h: $(DESIGNDIR)/top/rtl/config_regs.r
$(RDES2C) $<
config_defs_asm.h: $(DESIGNDIR)/top/rtl/config_regs.r
$(RDES2C) -asm $<
# Can't generate cpu_vect.h yet
#cpu_vect.h: $(DESIGNDIR)/top/rtl/cpu_vect.r # ????
# $(RDES2INTR) $<
cpu_vect.h: $(OFFICIAL_INCDIR)cpu_vect.h
cat $< | sed -e 's/\$$Id\:/id\:/g' >$@
dma_defs.h: $(BASEDIR)/core/dma/rtl/common/dma_regdes.r
$(RDES2C) $<
$(BASEDIR)/core/dma/sw/dma.h:
dma.h: $(BASEDIR)/core/dma/sw/dma.h
cat $< | sed -e 's/\$$Id\:/id\:/g' >$@
eth_defs.h: $(BASEDIR)/io/eth/rtl/eth_regs.r
$(RDES2C) $<
extmem_defs.h: $(BASEDIR)/io/bif/mod/extmem/extmem_regs.r
$(RDES2C) $<
gio_defs.h: $(DESIGNDIR)/gio/rtl/gio_regs.r
$(RDES2C) $<
intr_vect_defs.h: $(BASEDIR)/core/cpu/intr_vect/rtl/guinness/ivmask.config.r
$(RDES2C) $<
intr_vect_defs_asm.h: $(BASEDIR)/core/cpu/intr_vect/rtl/guinness/ivmask.config.r
$(RDES2C) -asm $<
# Can't generate intr_vect.h yet
#intr_vect.h: $(BASEDIR)/core/cpu/intr_vect/rtl/guinness/ivmask.config.r
# $(RDES2INTR) $<
intr_vect.h: $(OFFICIAL_INCDIR)intr_vect.h
cat $< | sed -e 's/\$$Id\:/id\:/g' >$@
mmu_defs_asm.h: $(BASEDIR)/core/cpu/mmu/doc/mmu_regs.r
$(RDES2C) -asm $<
par_defs.h: $(BASEDIR)/io/par_port/rtl/par_regs.r
$(RDES2C) $<
# From /n/asic/projects/guinness/design/
reg_map.h: $(DESIGNDIR)/top/rtl/global.rmap $(DESIGNDIR)/top/mod/modreg.rmap
$(RDES2C) -base 0xb0000000 $^
reg_map_asm.h: $(DESIGNDIR)/top/rtl/global.rmap $(DESIGNDIR)/top/mod/modreg.rmap
$(RDES2C) -base 0xb0000000 -asm -outfile $@ $^
reg_rdwr.h: $(DESIGNDIR)/top/sw/include/reg_rdwr.h
cat $< | sed -e 's/\$$Id\:/id\:/g' >$@
ser_defs.h: $(BASEDIR)/io/ser/rtl/ser_regs.r
$(RDES2C) $<
strcop_defs.h: $(BASEDIR)/core/strcop/rtl/strcop_regs.r
$(RDES2C) $<
strcop.h: $(BASEDIR)/core/strcop/rtl/strcop.h
cat $< | sed -e 's/\$$Id\:/id\:/g' >$@
strmux_defs.h: $(BASEDIR)/io/strmux/rtl/guinness/strmux_regs.r
$(RDES2C) $<
timer_defs.h: $(BASEDIR)/io/timer/rtl/timer_regs.r
$(RDES2C) $<
usb_defs.h: $(BASEDIR)/io/usb/usb1_1/rtl/usb_regs.r
$(RDES2C) $<
## copy - Copy files from official location
copy:
@for HFILE in $(INCL_FILES); do \
echo " $$HFILE"; \
cat $(OFFICIAL_INCDIR)$$HFILE | sed -e 's/\$$Id\:/id\:/g' > $$HFILE; \
done
@for HFILE in $(INCL_ASMFILES); do \
echo " $$HFILE"; \
cat $(OFFICIAL_INCDIR)asm/$$HFILE | sed -e 's/\$$Id\:/id\:/g' > $$HFILE; \
done
## ls_official - List official location
ls_official:
(cd $(OFFICIAL_INCDIR); ls -l *.h )
## diff_official - Diff current directory with official location
diff_official:
diff . $(OFFICIAL_INCDIR)
## doc - Generate .axw files from register description.
doc: $(REGDESC)
for RDES in $^; do \
$(RDES2TXT) $$RDES; \
done
.PHONY: axw
## %.axw - Generate the specified .axw file (doesn't work for all files
## due to inconsistent naming ir .r files.
%.axw: axw
@for RDES in $(REGDESC); do \
if echo "$$RDES" | grep $* ; then \
$(RDES2TXT) $$RDES; \
fi \
done
.PHONY: clean
## clean - Remove .h files and .axw files.
clean:
rm -rf $(INCL_FILES) *.axw

View file

@ -0,0 +1,222 @@
#ifndef __ata_defs_asm_h
#define __ata_defs_asm_h
/*
* This file is autogenerated from
* file: ../../inst/ata/rtl/ata_regs.r
* id: ata_regs.r,v 1.11 2005/02/09 08:27:36 kriskn Exp
* last modfied: Mon Apr 11 16:06:25 2005
*
* by /n/asic/design/tools/rdesc/src/rdes2c -asm --outfile asm/ata_defs_asm.h ../../inst/ata/rtl/ata_regs.r
* id: $Id: ata_defs_asm.h,v 1.1 2005/04/24 18:31:04 starvik Exp $
* Any changes here will be lost.
*
* -*- buffer-read-only: t -*-
*/
#ifndef REG_FIELD
#define REG_FIELD( scope, reg, field, value ) \
REG_FIELD_X_( value, reg_##scope##_##reg##___##field##___lsb )
#define REG_FIELD_X_( value, shift ) ((value) << shift)
#endif
#ifndef REG_STATE
#define REG_STATE( scope, reg, field, symbolic_value ) \
REG_STATE_X_( regk_##scope##_##symbolic_value, reg_##scope##_##reg##___##field##___lsb )
#define REG_STATE_X_( k, shift ) (k << shift)
#endif
#ifndef REG_MASK
#define REG_MASK( scope, reg, field ) \
REG_MASK_X_( reg_##scope##_##reg##___##field##___width, reg_##scope##_##reg##___##field##___lsb )
#define REG_MASK_X_( width, lsb ) (((1 << width)-1) << lsb)
#endif
#ifndef REG_LSB
#define REG_LSB( scope, reg, field ) reg_##scope##_##reg##___##field##___lsb
#endif
#ifndef REG_BIT
#define REG_BIT( scope, reg, field ) reg_##scope##_##reg##___##field##___bit
#endif
#ifndef REG_ADDR
#define REG_ADDR( scope, inst, reg ) REG_ADDR_X_(inst, reg_##scope##_##reg##_offset)
#define REG_ADDR_X_( inst, offs ) ((inst) + offs)
#endif
#ifndef REG_ADDR_VECT
#define REG_ADDR_VECT( scope, inst, reg, index ) \
REG_ADDR_VECT_X_(inst, reg_##scope##_##reg##_offset, index, \
STRIDE_##scope##_##reg )
#define REG_ADDR_VECT_X_( inst, offs, index, stride ) \
((inst) + offs + (index) * stride)
#endif
/* Register rw_ctrl0, scope ata, type rw */
#define reg_ata_rw_ctrl0___pio_hold___lsb 0
#define reg_ata_rw_ctrl0___pio_hold___width 6
#define reg_ata_rw_ctrl0___pio_strb___lsb 6
#define reg_ata_rw_ctrl0___pio_strb___width 6
#define reg_ata_rw_ctrl0___pio_setup___lsb 12
#define reg_ata_rw_ctrl0___pio_setup___width 6
#define reg_ata_rw_ctrl0___dma_hold___lsb 18
#define reg_ata_rw_ctrl0___dma_hold___width 6
#define reg_ata_rw_ctrl0___dma_strb___lsb 24
#define reg_ata_rw_ctrl0___dma_strb___width 6
#define reg_ata_rw_ctrl0___rst___lsb 30
#define reg_ata_rw_ctrl0___rst___width 1
#define reg_ata_rw_ctrl0___rst___bit 30
#define reg_ata_rw_ctrl0___en___lsb 31
#define reg_ata_rw_ctrl0___en___width 1
#define reg_ata_rw_ctrl0___en___bit 31
#define reg_ata_rw_ctrl0_offset 12
/* Register rw_ctrl1, scope ata, type rw */
#define reg_ata_rw_ctrl1___udma_tcyc___lsb 0
#define reg_ata_rw_ctrl1___udma_tcyc___width 4
#define reg_ata_rw_ctrl1___udma_tdvs___lsb 4
#define reg_ata_rw_ctrl1___udma_tdvs___width 4
#define reg_ata_rw_ctrl1_offset 16
/* Register rw_ctrl2, scope ata, type rw */
#define reg_ata_rw_ctrl2___data___lsb 0
#define reg_ata_rw_ctrl2___data___width 16
#define reg_ata_rw_ctrl2___dma_size___lsb 19
#define reg_ata_rw_ctrl2___dma_size___width 1
#define reg_ata_rw_ctrl2___dma_size___bit 19
#define reg_ata_rw_ctrl2___multi___lsb 20
#define reg_ata_rw_ctrl2___multi___width 1
#define reg_ata_rw_ctrl2___multi___bit 20
#define reg_ata_rw_ctrl2___hsh___lsb 21
#define reg_ata_rw_ctrl2___hsh___width 2
#define reg_ata_rw_ctrl2___trf_mode___lsb 23
#define reg_ata_rw_ctrl2___trf_mode___width 1
#define reg_ata_rw_ctrl2___trf_mode___bit 23
#define reg_ata_rw_ctrl2___rw___lsb 24
#define reg_ata_rw_ctrl2___rw___width 1
#define reg_ata_rw_ctrl2___rw___bit 24
#define reg_ata_rw_ctrl2___addr___lsb 25
#define reg_ata_rw_ctrl2___addr___width 3
#define reg_ata_rw_ctrl2___cs0___lsb 28
#define reg_ata_rw_ctrl2___cs0___width 1
#define reg_ata_rw_ctrl2___cs0___bit 28
#define reg_ata_rw_ctrl2___cs1___lsb 29
#define reg_ata_rw_ctrl2___cs1___width 1
#define reg_ata_rw_ctrl2___cs1___bit 29
#define reg_ata_rw_ctrl2___sel___lsb 30
#define reg_ata_rw_ctrl2___sel___width 2
#define reg_ata_rw_ctrl2_offset 0
/* Register rs_stat_data, scope ata, type rs */
#define reg_ata_rs_stat_data___data___lsb 0
#define reg_ata_rs_stat_data___data___width 16
#define reg_ata_rs_stat_data___dav___lsb 16
#define reg_ata_rs_stat_data___dav___width 1
#define reg_ata_rs_stat_data___dav___bit 16
#define reg_ata_rs_stat_data___busy___lsb 17
#define reg_ata_rs_stat_data___busy___width 1
#define reg_ata_rs_stat_data___busy___bit 17
#define reg_ata_rs_stat_data_offset 4
/* Register r_stat_data, scope ata, type r */
#define reg_ata_r_stat_data___data___lsb 0
#define reg_ata_r_stat_data___data___width 16
#define reg_ata_r_stat_data___dav___lsb 16
#define reg_ata_r_stat_data___dav___width 1
#define reg_ata_r_stat_data___dav___bit 16
#define reg_ata_r_stat_data___busy___lsb 17
#define reg_ata_r_stat_data___busy___width 1
#define reg_ata_r_stat_data___busy___bit 17
#define reg_ata_r_stat_data_offset 8
/* Register rw_trf_cnt, scope ata, type rw */
#define reg_ata_rw_trf_cnt___cnt___lsb 0
#define reg_ata_rw_trf_cnt___cnt___width 17
#define reg_ata_rw_trf_cnt_offset 20
/* Register r_stat_misc, scope ata, type r */
#define reg_ata_r_stat_misc___crc___lsb 0
#define reg_ata_r_stat_misc___crc___width 16
#define reg_ata_r_stat_misc_offset 24
/* Register rw_intr_mask, scope ata, type rw */
#define reg_ata_rw_intr_mask___bus0___lsb 0
#define reg_ata_rw_intr_mask___bus0___width 1
#define reg_ata_rw_intr_mask___bus0___bit 0
#define reg_ata_rw_intr_mask___bus1___lsb 1
#define reg_ata_rw_intr_mask___bus1___width 1
#define reg_ata_rw_intr_mask___bus1___bit 1
#define reg_ata_rw_intr_mask___bus2___lsb 2
#define reg_ata_rw_intr_mask___bus2___width 1
#define reg_ata_rw_intr_mask___bus2___bit 2
#define reg_ata_rw_intr_mask___bus3___lsb 3
#define reg_ata_rw_intr_mask___bus3___width 1
#define reg_ata_rw_intr_mask___bus3___bit 3
#define reg_ata_rw_intr_mask_offset 28
/* Register rw_ack_intr, scope ata, type rw */
#define reg_ata_rw_ack_intr___bus0___lsb 0
#define reg_ata_rw_ack_intr___bus0___width 1
#define reg_ata_rw_ack_intr___bus0___bit 0
#define reg_ata_rw_ack_intr___bus1___lsb 1
#define reg_ata_rw_ack_intr___bus1___width 1
#define reg_ata_rw_ack_intr___bus1___bit 1
#define reg_ata_rw_ack_intr___bus2___lsb 2
#define reg_ata_rw_ack_intr___bus2___width 1
#define reg_ata_rw_ack_intr___bus2___bit 2
#define reg_ata_rw_ack_intr___bus3___lsb 3
#define reg_ata_rw_ack_intr___bus3___width 1
#define reg_ata_rw_ack_intr___bus3___bit 3
#define reg_ata_rw_ack_intr_offset 32
/* Register r_intr, scope ata, type r */
#define reg_ata_r_intr___bus0___lsb 0
#define reg_ata_r_intr___bus0___width 1
#define reg_ata_r_intr___bus0___bit 0
#define reg_ata_r_intr___bus1___lsb 1
#define reg_ata_r_intr___bus1___width 1
#define reg_ata_r_intr___bus1___bit 1
#define reg_ata_r_intr___bus2___lsb 2
#define reg_ata_r_intr___bus2___width 1
#define reg_ata_r_intr___bus2___bit 2
#define reg_ata_r_intr___bus3___lsb 3
#define reg_ata_r_intr___bus3___width 1
#define reg_ata_r_intr___bus3___bit 3
#define reg_ata_r_intr_offset 36
/* Register r_masked_intr, scope ata, type r */
#define reg_ata_r_masked_intr___bus0___lsb 0
#define reg_ata_r_masked_intr___bus0___width 1
#define reg_ata_r_masked_intr___bus0___bit 0
#define reg_ata_r_masked_intr___bus1___lsb 1
#define reg_ata_r_masked_intr___bus1___width 1
#define reg_ata_r_masked_intr___bus1___bit 1
#define reg_ata_r_masked_intr___bus2___lsb 2
#define reg_ata_r_masked_intr___bus2___width 1
#define reg_ata_r_masked_intr___bus2___bit 2
#define reg_ata_r_masked_intr___bus3___lsb 3
#define reg_ata_r_masked_intr___bus3___width 1
#define reg_ata_r_masked_intr___bus3___bit 3
#define reg_ata_r_masked_intr_offset 40
/* Constants */
#define regk_ata_active 0x00000001
#define regk_ata_byte 0x00000001
#define regk_ata_data 0x00000001
#define regk_ata_dma 0x00000001
#define regk_ata_inactive 0x00000000
#define regk_ata_no 0x00000000
#define regk_ata_nodata 0x00000000
#define regk_ata_pio 0x00000000
#define regk_ata_rd 0x00000001
#define regk_ata_reg 0x00000000
#define regk_ata_rw_ctrl0_default 0x00000000
#define regk_ata_rw_ctrl2_default 0x00000000
#define regk_ata_rw_intr_mask_default 0x00000000
#define regk_ata_udma 0x00000002
#define regk_ata_word 0x00000000
#define regk_ata_wr 0x00000000
#define regk_ata_yes 0x00000001
#endif /* __ata_defs_asm_h */

View file

@ -0,0 +1,319 @@
#ifndef __bif_core_defs_asm_h
#define __bif_core_defs_asm_h
/*
* This file is autogenerated from
* file: ../../inst/bif/rtl/bif_core_regs.r
* id: bif_core_regs.r,v 1.17 2005/02/04 13:28:22 np Exp
* last modfied: Mon Apr 11 16:06:33 2005
*
* by /n/asic/design/tools/rdesc/src/rdes2c -asm --outfile asm/bif_core_defs_asm.h ../../inst/bif/rtl/bif_core_regs.r
* id: $Id: bif_core_defs_asm.h,v 1.1 2005/04/24 18:31:04 starvik Exp $
* Any changes here will be lost.
*
* -*- buffer-read-only: t -*-
*/
#ifndef REG_FIELD
#define REG_FIELD( scope, reg, field, value ) \
REG_FIELD_X_( value, reg_##scope##_##reg##___##field##___lsb )
#define REG_FIELD_X_( value, shift ) ((value) << shift)
#endif
#ifndef REG_STATE
#define REG_STATE( scope, reg, field, symbolic_value ) \
REG_STATE_X_( regk_##scope##_##symbolic_value, reg_##scope##_##reg##___##field##___lsb )
#define REG_STATE_X_( k, shift ) (k << shift)
#endif
#ifndef REG_MASK
#define REG_MASK( scope, reg, field ) \
REG_MASK_X_( reg_##scope##_##reg##___##field##___width, reg_##scope##_##reg##___##field##___lsb )
#define REG_MASK_X_( width, lsb ) (((1 << width)-1) << lsb)
#endif
#ifndef REG_LSB
#define REG_LSB( scope, reg, field ) reg_##scope##_##reg##___##field##___lsb
#endif
#ifndef REG_BIT
#define REG_BIT( scope, reg, field ) reg_##scope##_##reg##___##field##___bit
#endif
#ifndef REG_ADDR
#define REG_ADDR( scope, inst, reg ) REG_ADDR_X_(inst, reg_##scope##_##reg##_offset)
#define REG_ADDR_X_( inst, offs ) ((inst) + offs)
#endif
#ifndef REG_ADDR_VECT
#define REG_ADDR_VECT( scope, inst, reg, index ) \
REG_ADDR_VECT_X_(inst, reg_##scope##_##reg##_offset, index, \
STRIDE_##scope##_##reg )
#define REG_ADDR_VECT_X_( inst, offs, index, stride ) \
((inst) + offs + (index) * stride)
#endif
/* Register rw_grp1_cfg, scope bif_core, type rw */
#define reg_bif_core_rw_grp1_cfg___lw___lsb 0
#define reg_bif_core_rw_grp1_cfg___lw___width 6
#define reg_bif_core_rw_grp1_cfg___ew___lsb 6
#define reg_bif_core_rw_grp1_cfg___ew___width 3
#define reg_bif_core_rw_grp1_cfg___zw___lsb 9
#define reg_bif_core_rw_grp1_cfg___zw___width 3
#define reg_bif_core_rw_grp1_cfg___aw___lsb 12
#define reg_bif_core_rw_grp1_cfg___aw___width 2
#define reg_bif_core_rw_grp1_cfg___dw___lsb 14
#define reg_bif_core_rw_grp1_cfg___dw___width 2
#define reg_bif_core_rw_grp1_cfg___ewb___lsb 16
#define reg_bif_core_rw_grp1_cfg___ewb___width 2
#define reg_bif_core_rw_grp1_cfg___bw___lsb 18
#define reg_bif_core_rw_grp1_cfg___bw___width 1
#define reg_bif_core_rw_grp1_cfg___bw___bit 18
#define reg_bif_core_rw_grp1_cfg___wr_extend___lsb 19
#define reg_bif_core_rw_grp1_cfg___wr_extend___width 1
#define reg_bif_core_rw_grp1_cfg___wr_extend___bit 19
#define reg_bif_core_rw_grp1_cfg___erc_en___lsb 20
#define reg_bif_core_rw_grp1_cfg___erc_en___width 1
#define reg_bif_core_rw_grp1_cfg___erc_en___bit 20
#define reg_bif_core_rw_grp1_cfg___mode___lsb 21
#define reg_bif_core_rw_grp1_cfg___mode___width 1
#define reg_bif_core_rw_grp1_cfg___mode___bit 21
#define reg_bif_core_rw_grp1_cfg_offset 0
/* Register rw_grp2_cfg, scope bif_core, type rw */
#define reg_bif_core_rw_grp2_cfg___lw___lsb 0
#define reg_bif_core_rw_grp2_cfg___lw___width 6
#define reg_bif_core_rw_grp2_cfg___ew___lsb 6
#define reg_bif_core_rw_grp2_cfg___ew___width 3
#define reg_bif_core_rw_grp2_cfg___zw___lsb 9
#define reg_bif_core_rw_grp2_cfg___zw___width 3
#define reg_bif_core_rw_grp2_cfg___aw___lsb 12
#define reg_bif_core_rw_grp2_cfg___aw___width 2
#define reg_bif_core_rw_grp2_cfg___dw___lsb 14
#define reg_bif_core_rw_grp2_cfg___dw___width 2
#define reg_bif_core_rw_grp2_cfg___ewb___lsb 16
#define reg_bif_core_rw_grp2_cfg___ewb___width 2
#define reg_bif_core_rw_grp2_cfg___bw___lsb 18
#define reg_bif_core_rw_grp2_cfg___bw___width 1
#define reg_bif_core_rw_grp2_cfg___bw___bit 18
#define reg_bif_core_rw_grp2_cfg___wr_extend___lsb 19
#define reg_bif_core_rw_grp2_cfg___wr_extend___width 1
#define reg_bif_core_rw_grp2_cfg___wr_extend___bit 19
#define reg_bif_core_rw_grp2_cfg___erc_en___lsb 20
#define reg_bif_core_rw_grp2_cfg___erc_en___width 1
#define reg_bif_core_rw_grp2_cfg___erc_en___bit 20
#define reg_bif_core_rw_grp2_cfg___mode___lsb 21
#define reg_bif_core_rw_grp2_cfg___mode___width 1
#define reg_bif_core_rw_grp2_cfg___mode___bit 21
#define reg_bif_core_rw_grp2_cfg_offset 4
/* Register rw_grp3_cfg, scope bif_core, type rw */
#define reg_bif_core_rw_grp3_cfg___lw___lsb 0
#define reg_bif_core_rw_grp3_cfg___lw___width 6
#define reg_bif_core_rw_grp3_cfg___ew___lsb 6
#define reg_bif_core_rw_grp3_cfg___ew___width 3
#define reg_bif_core_rw_grp3_cfg___zw___lsb 9
#define reg_bif_core_rw_grp3_cfg___zw___width 3
#define reg_bif_core_rw_grp3_cfg___aw___lsb 12
#define reg_bif_core_rw_grp3_cfg___aw___width 2
#define reg_bif_core_rw_grp3_cfg___dw___lsb 14
#define reg_bif_core_rw_grp3_cfg___dw___width 2
#define reg_bif_core_rw_grp3_cfg___ewb___lsb 16
#define reg_bif_core_rw_grp3_cfg___ewb___width 2
#define reg_bif_core_rw_grp3_cfg___bw___lsb 18
#define reg_bif_core_rw_grp3_cfg___bw___width 1
#define reg_bif_core_rw_grp3_cfg___bw___bit 18
#define reg_bif_core_rw_grp3_cfg___wr_extend___lsb 19
#define reg_bif_core_rw_grp3_cfg___wr_extend___width 1
#define reg_bif_core_rw_grp3_cfg___wr_extend___bit 19
#define reg_bif_core_rw_grp3_cfg___erc_en___lsb 20
#define reg_bif_core_rw_grp3_cfg___erc_en___width 1
#define reg_bif_core_rw_grp3_cfg___erc_en___bit 20
#define reg_bif_core_rw_grp3_cfg___mode___lsb 21
#define reg_bif_core_rw_grp3_cfg___mode___width 1
#define reg_bif_core_rw_grp3_cfg___mode___bit 21
#define reg_bif_core_rw_grp3_cfg___gated_csp0___lsb 24
#define reg_bif_core_rw_grp3_cfg___gated_csp0___width 2
#define reg_bif_core_rw_grp3_cfg___gated_csp1___lsb 26
#define reg_bif_core_rw_grp3_cfg___gated_csp1___width 2
#define reg_bif_core_rw_grp3_cfg___gated_csp2___lsb 28
#define reg_bif_core_rw_grp3_cfg___gated_csp2___width 2
#define reg_bif_core_rw_grp3_cfg___gated_csp3___lsb 30
#define reg_bif_core_rw_grp3_cfg___gated_csp3___width 2
#define reg_bif_core_rw_grp3_cfg_offset 8
/* Register rw_grp4_cfg, scope bif_core, type rw */
#define reg_bif_core_rw_grp4_cfg___lw___lsb 0
#define reg_bif_core_rw_grp4_cfg___lw___width 6
#define reg_bif_core_rw_grp4_cfg___ew___lsb 6
#define reg_bif_core_rw_grp4_cfg___ew___width 3
#define reg_bif_core_rw_grp4_cfg___zw___lsb 9
#define reg_bif_core_rw_grp4_cfg___zw___width 3
#define reg_bif_core_rw_grp4_cfg___aw___lsb 12
#define reg_bif_core_rw_grp4_cfg___aw___width 2
#define reg_bif_core_rw_grp4_cfg___dw___lsb 14
#define reg_bif_core_rw_grp4_cfg___dw___width 2
#define reg_bif_core_rw_grp4_cfg___ewb___lsb 16
#define reg_bif_core_rw_grp4_cfg___ewb___width 2
#define reg_bif_core_rw_grp4_cfg___bw___lsb 18
#define reg_bif_core_rw_grp4_cfg___bw___width 1
#define reg_bif_core_rw_grp4_cfg___bw___bit 18
#define reg_bif_core_rw_grp4_cfg___wr_extend___lsb 19
#define reg_bif_core_rw_grp4_cfg___wr_extend___width 1
#define reg_bif_core_rw_grp4_cfg___wr_extend___bit 19
#define reg_bif_core_rw_grp4_cfg___erc_en___lsb 20
#define reg_bif_core_rw_grp4_cfg___erc_en___width 1
#define reg_bif_core_rw_grp4_cfg___erc_en___bit 20
#define reg_bif_core_rw_grp4_cfg___mode___lsb 21
#define reg_bif_core_rw_grp4_cfg___mode___width 1
#define reg_bif_core_rw_grp4_cfg___mode___bit 21
#define reg_bif_core_rw_grp4_cfg___gated_csp4___lsb 26
#define reg_bif_core_rw_grp4_cfg___gated_csp4___width 2
#define reg_bif_core_rw_grp4_cfg___gated_csp5___lsb 28
#define reg_bif_core_rw_grp4_cfg___gated_csp5___width 2
#define reg_bif_core_rw_grp4_cfg___gated_csp6___lsb 30
#define reg_bif_core_rw_grp4_cfg___gated_csp6___width 2
#define reg_bif_core_rw_grp4_cfg_offset 12
/* Register rw_sdram_cfg_grp0, scope bif_core, type rw */
#define reg_bif_core_rw_sdram_cfg_grp0___bank_sel___lsb 0
#define reg_bif_core_rw_sdram_cfg_grp0___bank_sel___width 5
#define reg_bif_core_rw_sdram_cfg_grp0___ca___lsb 5
#define reg_bif_core_rw_sdram_cfg_grp0___ca___width 3
#define reg_bif_core_rw_sdram_cfg_grp0___type___lsb 8
#define reg_bif_core_rw_sdram_cfg_grp0___type___width 1
#define reg_bif_core_rw_sdram_cfg_grp0___type___bit 8
#define reg_bif_core_rw_sdram_cfg_grp0___bw___lsb 9
#define reg_bif_core_rw_sdram_cfg_grp0___bw___width 1
#define reg_bif_core_rw_sdram_cfg_grp0___bw___bit 9
#define reg_bif_core_rw_sdram_cfg_grp0___sh___lsb 10
#define reg_bif_core_rw_sdram_cfg_grp0___sh___width 3
#define reg_bif_core_rw_sdram_cfg_grp0___wmm___lsb 13
#define reg_bif_core_rw_sdram_cfg_grp0___wmm___width 1
#define reg_bif_core_rw_sdram_cfg_grp0___wmm___bit 13
#define reg_bif_core_rw_sdram_cfg_grp0___sh16___lsb 14
#define reg_bif_core_rw_sdram_cfg_grp0___sh16___width 1
#define reg_bif_core_rw_sdram_cfg_grp0___sh16___bit 14
#define reg_bif_core_rw_sdram_cfg_grp0___grp_sel___lsb 15
#define reg_bif_core_rw_sdram_cfg_grp0___grp_sel___width 5
#define reg_bif_core_rw_sdram_cfg_grp0_offset 16
/* Register rw_sdram_cfg_grp1, scope bif_core, type rw */
#define reg_bif_core_rw_sdram_cfg_grp1___bank_sel___lsb 0
#define reg_bif_core_rw_sdram_cfg_grp1___bank_sel___width 5
#define reg_bif_core_rw_sdram_cfg_grp1___ca___lsb 5
#define reg_bif_core_rw_sdram_cfg_grp1___ca___width 3
#define reg_bif_core_rw_sdram_cfg_grp1___type___lsb 8
#define reg_bif_core_rw_sdram_cfg_grp1___type___width 1
#define reg_bif_core_rw_sdram_cfg_grp1___type___bit 8
#define reg_bif_core_rw_sdram_cfg_grp1___bw___lsb 9
#define reg_bif_core_rw_sdram_cfg_grp1___bw___width 1
#define reg_bif_core_rw_sdram_cfg_grp1___bw___bit 9
#define reg_bif_core_rw_sdram_cfg_grp1___sh___lsb 10
#define reg_bif_core_rw_sdram_cfg_grp1___sh___width 3
#define reg_bif_core_rw_sdram_cfg_grp1___wmm___lsb 13
#define reg_bif_core_rw_sdram_cfg_grp1___wmm___width 1
#define reg_bif_core_rw_sdram_cfg_grp1___wmm___bit 13
#define reg_bif_core_rw_sdram_cfg_grp1___sh16___lsb 14
#define reg_bif_core_rw_sdram_cfg_grp1___sh16___width 1
#define reg_bif_core_rw_sdram_cfg_grp1___sh16___bit 14
#define reg_bif_core_rw_sdram_cfg_grp1_offset 20
/* Register rw_sdram_timing, scope bif_core, type rw */
#define reg_bif_core_rw_sdram_timing___cl___lsb 0
#define reg_bif_core_rw_sdram_timing___cl___width 3
#define reg_bif_core_rw_sdram_timing___rcd___lsb 3
#define reg_bif_core_rw_sdram_timing___rcd___width 3
#define reg_bif_core_rw_sdram_timing___rp___lsb 6
#define reg_bif_core_rw_sdram_timing___rp___width 3
#define reg_bif_core_rw_sdram_timing___rc___lsb 9
#define reg_bif_core_rw_sdram_timing___rc___width 2
#define reg_bif_core_rw_sdram_timing___dpl___lsb 11
#define reg_bif_core_rw_sdram_timing___dpl___width 2
#define reg_bif_core_rw_sdram_timing___pde___lsb 13
#define reg_bif_core_rw_sdram_timing___pde___width 1
#define reg_bif_core_rw_sdram_timing___pde___bit 13
#define reg_bif_core_rw_sdram_timing___ref___lsb 14
#define reg_bif_core_rw_sdram_timing___ref___width 2
#define reg_bif_core_rw_sdram_timing___cpd___lsb 16
#define reg_bif_core_rw_sdram_timing___cpd___width 1
#define reg_bif_core_rw_sdram_timing___cpd___bit 16
#define reg_bif_core_rw_sdram_timing___sdcke___lsb 17
#define reg_bif_core_rw_sdram_timing___sdcke___width 1
#define reg_bif_core_rw_sdram_timing___sdcke___bit 17
#define reg_bif_core_rw_sdram_timing___sdclk___lsb 18
#define reg_bif_core_rw_sdram_timing___sdclk___width 1
#define reg_bif_core_rw_sdram_timing___sdclk___bit 18
#define reg_bif_core_rw_sdram_timing_offset 24
/* Register rw_sdram_cmd, scope bif_core, type rw */
#define reg_bif_core_rw_sdram_cmd___cmd___lsb 0
#define reg_bif_core_rw_sdram_cmd___cmd___width 3
#define reg_bif_core_rw_sdram_cmd___mrs_data___lsb 3
#define reg_bif_core_rw_sdram_cmd___mrs_data___width 15
#define reg_bif_core_rw_sdram_cmd_offset 28
/* Register rs_sdram_ref_stat, scope bif_core, type rs */
#define reg_bif_core_rs_sdram_ref_stat___ok___lsb 0
#define reg_bif_core_rs_sdram_ref_stat___ok___width 1
#define reg_bif_core_rs_sdram_ref_stat___ok___bit 0
#define reg_bif_core_rs_sdram_ref_stat_offset 32
/* Register r_sdram_ref_stat, scope bif_core, type r */
#define reg_bif_core_r_sdram_ref_stat___ok___lsb 0
#define reg_bif_core_r_sdram_ref_stat___ok___width 1
#define reg_bif_core_r_sdram_ref_stat___ok___bit 0
#define reg_bif_core_r_sdram_ref_stat_offset 36
/* Constants */
#define regk_bif_core_bank2 0x00000000
#define regk_bif_core_bank4 0x00000001
#define regk_bif_core_bit10 0x0000000a
#define regk_bif_core_bit11 0x0000000b
#define regk_bif_core_bit12 0x0000000c
#define regk_bif_core_bit13 0x0000000d
#define regk_bif_core_bit14 0x0000000e
#define regk_bif_core_bit15 0x0000000f
#define regk_bif_core_bit16 0x00000010
#define regk_bif_core_bit17 0x00000011
#define regk_bif_core_bit18 0x00000012
#define regk_bif_core_bit19 0x00000013
#define regk_bif_core_bit20 0x00000014
#define regk_bif_core_bit21 0x00000015
#define regk_bif_core_bit22 0x00000016
#define regk_bif_core_bit23 0x00000017
#define regk_bif_core_bit24 0x00000018
#define regk_bif_core_bit25 0x00000019
#define regk_bif_core_bit26 0x0000001a
#define regk_bif_core_bit27 0x0000001b
#define regk_bif_core_bit28 0x0000001c
#define regk_bif_core_bit29 0x0000001d
#define regk_bif_core_bit9 0x00000009
#define regk_bif_core_bw16 0x00000001
#define regk_bif_core_bw32 0x00000000
#define regk_bif_core_bwe 0x00000000
#define regk_bif_core_cwe 0x00000001
#define regk_bif_core_e15us 0x00000001
#define regk_bif_core_e7800ns 0x00000002
#define regk_bif_core_grp0 0x00000000
#define regk_bif_core_grp1 0x00000001
#define regk_bif_core_mrs 0x00000003
#define regk_bif_core_no 0x00000000
#define regk_bif_core_none 0x00000000
#define regk_bif_core_nop 0x00000000
#define regk_bif_core_off 0x00000000
#define regk_bif_core_pre 0x00000002
#define regk_bif_core_r_sdram_ref_stat_default 0x00000001
#define regk_bif_core_rd 0x00000002
#define regk_bif_core_ref 0x00000001
#define regk_bif_core_rs_sdram_ref_stat_default 0x00000001
#define regk_bif_core_rw_grp1_cfg_default 0x000006cf
#define regk_bif_core_rw_grp2_cfg_default 0x000006cf
#define regk_bif_core_rw_grp3_cfg_default 0x000006cf
#define regk_bif_core_rw_grp4_cfg_default 0x000006cf
#define regk_bif_core_rw_sdram_cfg_grp1_default 0x00000000
#define regk_bif_core_slf 0x00000004
#define regk_bif_core_wr 0x00000001
#define regk_bif_core_yes 0x00000001
#endif /* __bif_core_defs_asm_h */

View file

@ -0,0 +1,495 @@
#ifndef __bif_dma_defs_asm_h
#define __bif_dma_defs_asm_h
/*
* This file is autogenerated from
* file: ../../inst/bif/rtl/bif_dma_regs.r
* id: bif_dma_regs.r,v 1.6 2005/02/04 13:28:31 perz Exp
* last modfied: Mon Apr 11 16:06:33 2005
*
* by /n/asic/design/tools/rdesc/src/rdes2c -asm --outfile asm/bif_dma_defs_asm.h ../../inst/bif/rtl/bif_dma_regs.r
* id: $Id: bif_dma_defs_asm.h,v 1.1 2005/04/24 18:31:04 starvik Exp $
* Any changes here will be lost.
*
* -*- buffer-read-only: t -*-
*/
#ifndef REG_FIELD
#define REG_FIELD( scope, reg, field, value ) \
REG_FIELD_X_( value, reg_##scope##_##reg##___##field##___lsb )
#define REG_FIELD_X_( value, shift ) ((value) << shift)
#endif
#ifndef REG_STATE
#define REG_STATE( scope, reg, field, symbolic_value ) \
REG_STATE_X_( regk_##scope##_##symbolic_value, reg_##scope##_##reg##___##field##___lsb )
#define REG_STATE_X_( k, shift ) (k << shift)
#endif
#ifndef REG_MASK
#define REG_MASK( scope, reg, field ) \
REG_MASK_X_( reg_##scope##_##reg##___##field##___width, reg_##scope##_##reg##___##field##___lsb )
#define REG_MASK_X_( width, lsb ) (((1 << width)-1) << lsb)
#endif
#ifndef REG_LSB
#define REG_LSB( scope, reg, field ) reg_##scope##_##reg##___##field##___lsb
#endif
#ifndef REG_BIT
#define REG_BIT( scope, reg, field ) reg_##scope##_##reg##___##field##___bit
#endif
#ifndef REG_ADDR
#define REG_ADDR( scope, inst, reg ) REG_ADDR_X_(inst, reg_##scope##_##reg##_offset)
#define REG_ADDR_X_( inst, offs ) ((inst) + offs)
#endif
#ifndef REG_ADDR_VECT
#define REG_ADDR_VECT( scope, inst, reg, index ) \
REG_ADDR_VECT_X_(inst, reg_##scope##_##reg##_offset, index, \
STRIDE_##scope##_##reg )
#define REG_ADDR_VECT_X_( inst, offs, index, stride ) \
((inst) + offs + (index) * stride)
#endif
/* Register rw_ch0_ctrl, scope bif_dma, type rw */
#define reg_bif_dma_rw_ch0_ctrl___bw___lsb 0
#define reg_bif_dma_rw_ch0_ctrl___bw___width 2
#define reg_bif_dma_rw_ch0_ctrl___burst_len___lsb 2
#define reg_bif_dma_rw_ch0_ctrl___burst_len___width 1
#define reg_bif_dma_rw_ch0_ctrl___burst_len___bit 2
#define reg_bif_dma_rw_ch0_ctrl___cont___lsb 3
#define reg_bif_dma_rw_ch0_ctrl___cont___width 1
#define reg_bif_dma_rw_ch0_ctrl___cont___bit 3
#define reg_bif_dma_rw_ch0_ctrl___end_pad___lsb 4
#define reg_bif_dma_rw_ch0_ctrl___end_pad___width 1
#define reg_bif_dma_rw_ch0_ctrl___end_pad___bit 4
#define reg_bif_dma_rw_ch0_ctrl___cnt___lsb 5
#define reg_bif_dma_rw_ch0_ctrl___cnt___width 1
#define reg_bif_dma_rw_ch0_ctrl___cnt___bit 5
#define reg_bif_dma_rw_ch0_ctrl___dreq_pin___lsb 6
#define reg_bif_dma_rw_ch0_ctrl___dreq_pin___width 3
#define reg_bif_dma_rw_ch0_ctrl___dreq_mode___lsb 9
#define reg_bif_dma_rw_ch0_ctrl___dreq_mode___width 2
#define reg_bif_dma_rw_ch0_ctrl___tc_in_pin___lsb 11
#define reg_bif_dma_rw_ch0_ctrl___tc_in_pin___width 3
#define reg_bif_dma_rw_ch0_ctrl___tc_in_mode___lsb 14
#define reg_bif_dma_rw_ch0_ctrl___tc_in_mode___width 2
#define reg_bif_dma_rw_ch0_ctrl___bus_mode___lsb 16
#define reg_bif_dma_rw_ch0_ctrl___bus_mode___width 2
#define reg_bif_dma_rw_ch0_ctrl___rate_en___lsb 18
#define reg_bif_dma_rw_ch0_ctrl___rate_en___width 1
#define reg_bif_dma_rw_ch0_ctrl___rate_en___bit 18
#define reg_bif_dma_rw_ch0_ctrl___wr_all___lsb 19
#define reg_bif_dma_rw_ch0_ctrl___wr_all___width 1
#define reg_bif_dma_rw_ch0_ctrl___wr_all___bit 19
#define reg_bif_dma_rw_ch0_ctrl_offset 0
/* Register rw_ch0_addr, scope bif_dma, type rw */
#define reg_bif_dma_rw_ch0_addr___addr___lsb 0
#define reg_bif_dma_rw_ch0_addr___addr___width 32
#define reg_bif_dma_rw_ch0_addr_offset 4
/* Register rw_ch0_start, scope bif_dma, type rw */
#define reg_bif_dma_rw_ch0_start___run___lsb 0
#define reg_bif_dma_rw_ch0_start___run___width 1
#define reg_bif_dma_rw_ch0_start___run___bit 0
#define reg_bif_dma_rw_ch0_start_offset 8
/* Register rw_ch0_cnt, scope bif_dma, type rw */
#define reg_bif_dma_rw_ch0_cnt___start_cnt___lsb 0
#define reg_bif_dma_rw_ch0_cnt___start_cnt___width 16
#define reg_bif_dma_rw_ch0_cnt_offset 12
/* Register r_ch0_stat, scope bif_dma, type r */
#define reg_bif_dma_r_ch0_stat___cnt___lsb 0
#define reg_bif_dma_r_ch0_stat___cnt___width 16
#define reg_bif_dma_r_ch0_stat___run___lsb 31
#define reg_bif_dma_r_ch0_stat___run___width 1
#define reg_bif_dma_r_ch0_stat___run___bit 31
#define reg_bif_dma_r_ch0_stat_offset 16
/* Register rw_ch1_ctrl, scope bif_dma, type rw */
#define reg_bif_dma_rw_ch1_ctrl___bw___lsb 0
#define reg_bif_dma_rw_ch1_ctrl___bw___width 2
#define reg_bif_dma_rw_ch1_ctrl___burst_len___lsb 2
#define reg_bif_dma_rw_ch1_ctrl___burst_len___width 1
#define reg_bif_dma_rw_ch1_ctrl___burst_len___bit 2
#define reg_bif_dma_rw_ch1_ctrl___cont___lsb 3
#define reg_bif_dma_rw_ch1_ctrl___cont___width 1
#define reg_bif_dma_rw_ch1_ctrl___cont___bit 3
#define reg_bif_dma_rw_ch1_ctrl___end_discard___lsb 4
#define reg_bif_dma_rw_ch1_ctrl___end_discard___width 1
#define reg_bif_dma_rw_ch1_ctrl___end_discard___bit 4
#define reg_bif_dma_rw_ch1_ctrl___cnt___lsb 5
#define reg_bif_dma_rw_ch1_ctrl___cnt___width 1
#define reg_bif_dma_rw_ch1_ctrl___cnt___bit 5
#define reg_bif_dma_rw_ch1_ctrl___dreq_pin___lsb 6
#define reg_bif_dma_rw_ch1_ctrl___dreq_pin___width 3
#define reg_bif_dma_rw_ch1_ctrl___dreq_mode___lsb 9
#define reg_bif_dma_rw_ch1_ctrl___dreq_mode___width 2
#define reg_bif_dma_rw_ch1_ctrl___tc_in_pin___lsb 11
#define reg_bif_dma_rw_ch1_ctrl___tc_in_pin___width 3
#define reg_bif_dma_rw_ch1_ctrl___tc_in_mode___lsb 14
#define reg_bif_dma_rw_ch1_ctrl___tc_in_mode___width 2
#define reg_bif_dma_rw_ch1_ctrl___bus_mode___lsb 16
#define reg_bif_dma_rw_ch1_ctrl___bus_mode___width 2
#define reg_bif_dma_rw_ch1_ctrl___rate_en___lsb 18
#define reg_bif_dma_rw_ch1_ctrl___rate_en___width 1
#define reg_bif_dma_rw_ch1_ctrl___rate_en___bit 18
#define reg_bif_dma_rw_ch1_ctrl_offset 32
/* Register rw_ch1_addr, scope bif_dma, type rw */
#define reg_bif_dma_rw_ch1_addr___addr___lsb 0
#define reg_bif_dma_rw_ch1_addr___addr___width 32
#define reg_bif_dma_rw_ch1_addr_offset 36
/* Register rw_ch1_start, scope bif_dma, type rw */
#define reg_bif_dma_rw_ch1_start___run___lsb 0
#define reg_bif_dma_rw_ch1_start___run___width 1
#define reg_bif_dma_rw_ch1_start___run___bit 0
#define reg_bif_dma_rw_ch1_start_offset 40
/* Register rw_ch1_cnt, scope bif_dma, type rw */
#define reg_bif_dma_rw_ch1_cnt___start_cnt___lsb 0
#define reg_bif_dma_rw_ch1_cnt___start_cnt___width 16
#define reg_bif_dma_rw_ch1_cnt_offset 44
/* Register r_ch1_stat, scope bif_dma, type r */
#define reg_bif_dma_r_ch1_stat___cnt___lsb 0
#define reg_bif_dma_r_ch1_stat___cnt___width 16
#define reg_bif_dma_r_ch1_stat___run___lsb 31
#define reg_bif_dma_r_ch1_stat___run___width 1
#define reg_bif_dma_r_ch1_stat___run___bit 31
#define reg_bif_dma_r_ch1_stat_offset 48
/* Register rw_ch2_ctrl, scope bif_dma, type rw */
#define reg_bif_dma_rw_ch2_ctrl___bw___lsb 0
#define reg_bif_dma_rw_ch2_ctrl___bw___width 2
#define reg_bif_dma_rw_ch2_ctrl___burst_len___lsb 2
#define reg_bif_dma_rw_ch2_ctrl___burst_len___width 1
#define reg_bif_dma_rw_ch2_ctrl___burst_len___bit 2
#define reg_bif_dma_rw_ch2_ctrl___cont___lsb 3
#define reg_bif_dma_rw_ch2_ctrl___cont___width 1
#define reg_bif_dma_rw_ch2_ctrl___cont___bit 3
#define reg_bif_dma_rw_ch2_ctrl___end_pad___lsb 4
#define reg_bif_dma_rw_ch2_ctrl___end_pad___width 1
#define reg_bif_dma_rw_ch2_ctrl___end_pad___bit 4
#define reg_bif_dma_rw_ch2_ctrl___cnt___lsb 5
#define reg_bif_dma_rw_ch2_ctrl___cnt___width 1
#define reg_bif_dma_rw_ch2_ctrl___cnt___bit 5
#define reg_bif_dma_rw_ch2_ctrl___dreq_pin___lsb 6
#define reg_bif_dma_rw_ch2_ctrl___dreq_pin___width 3
#define reg_bif_dma_rw_ch2_ctrl___dreq_mode___lsb 9
#define reg_bif_dma_rw_ch2_ctrl___dreq_mode___width 2
#define reg_bif_dma_rw_ch2_ctrl___tc_in_pin___lsb 11
#define reg_bif_dma_rw_ch2_ctrl___tc_in_pin___width 3
#define reg_bif_dma_rw_ch2_ctrl___tc_in_mode___lsb 14
#define reg_bif_dma_rw_ch2_ctrl___tc_in_mode___width 2
#define reg_bif_dma_rw_ch2_ctrl___bus_mode___lsb 16
#define reg_bif_dma_rw_ch2_ctrl___bus_mode___width 2
#define reg_bif_dma_rw_ch2_ctrl___rate_en___lsb 18
#define reg_bif_dma_rw_ch2_ctrl___rate_en___width 1
#define reg_bif_dma_rw_ch2_ctrl___rate_en___bit 18
#define reg_bif_dma_rw_ch2_ctrl___wr_all___lsb 19
#define reg_bif_dma_rw_ch2_ctrl___wr_all___width 1
#define reg_bif_dma_rw_ch2_ctrl___wr_all___bit 19
#define reg_bif_dma_rw_ch2_ctrl_offset 64
/* Register rw_ch2_addr, scope bif_dma, type rw */
#define reg_bif_dma_rw_ch2_addr___addr___lsb 0
#define reg_bif_dma_rw_ch2_addr___addr___width 32
#define reg_bif_dma_rw_ch2_addr_offset 68
/* Register rw_ch2_start, scope bif_dma, type rw */
#define reg_bif_dma_rw_ch2_start___run___lsb 0
#define reg_bif_dma_rw_ch2_start___run___width 1
#define reg_bif_dma_rw_ch2_start___run___bit 0
#define reg_bif_dma_rw_ch2_start_offset 72
/* Register rw_ch2_cnt, scope bif_dma, type rw */
#define reg_bif_dma_rw_ch2_cnt___start_cnt___lsb 0
#define reg_bif_dma_rw_ch2_cnt___start_cnt___width 16
#define reg_bif_dma_rw_ch2_cnt_offset 76
/* Register r_ch2_stat, scope bif_dma, type r */
#define reg_bif_dma_r_ch2_stat___cnt___lsb 0
#define reg_bif_dma_r_ch2_stat___cnt___width 16
#define reg_bif_dma_r_ch2_stat___run___lsb 31
#define reg_bif_dma_r_ch2_stat___run___width 1
#define reg_bif_dma_r_ch2_stat___run___bit 31
#define reg_bif_dma_r_ch2_stat_offset 80
/* Register rw_ch3_ctrl, scope bif_dma, type rw */
#define reg_bif_dma_rw_ch3_ctrl___bw___lsb 0
#define reg_bif_dma_rw_ch3_ctrl___bw___width 2
#define reg_bif_dma_rw_ch3_ctrl___burst_len___lsb 2
#define reg_bif_dma_rw_ch3_ctrl___burst_len___width 1
#define reg_bif_dma_rw_ch3_ctrl___burst_len___bit 2
#define reg_bif_dma_rw_ch3_ctrl___cont___lsb 3
#define reg_bif_dma_rw_ch3_ctrl___cont___width 1
#define reg_bif_dma_rw_ch3_ctrl___cont___bit 3
#define reg_bif_dma_rw_ch3_ctrl___end_discard___lsb 4
#define reg_bif_dma_rw_ch3_ctrl___end_discard___width 1
#define reg_bif_dma_rw_ch3_ctrl___end_discard___bit 4
#define reg_bif_dma_rw_ch3_ctrl___cnt___lsb 5
#define reg_bif_dma_rw_ch3_ctrl___cnt___width 1
#define reg_bif_dma_rw_ch3_ctrl___cnt___bit 5
#define reg_bif_dma_rw_ch3_ctrl___dreq_pin___lsb 6
#define reg_bif_dma_rw_ch3_ctrl___dreq_pin___width 3
#define reg_bif_dma_rw_ch3_ctrl___dreq_mode___lsb 9
#define reg_bif_dma_rw_ch3_ctrl___dreq_mode___width 2
#define reg_bif_dma_rw_ch3_ctrl___tc_in_pin___lsb 11
#define reg_bif_dma_rw_ch3_ctrl___tc_in_pin___width 3
#define reg_bif_dma_rw_ch3_ctrl___tc_in_mode___lsb 14
#define reg_bif_dma_rw_ch3_ctrl___tc_in_mode___width 2
#define reg_bif_dma_rw_ch3_ctrl___bus_mode___lsb 16
#define reg_bif_dma_rw_ch3_ctrl___bus_mode___width 2
#define reg_bif_dma_rw_ch3_ctrl___rate_en___lsb 18
#define reg_bif_dma_rw_ch3_ctrl___rate_en___width 1
#define reg_bif_dma_rw_ch3_ctrl___rate_en___bit 18
#define reg_bif_dma_rw_ch3_ctrl_offset 96
/* Register rw_ch3_addr, scope bif_dma, type rw */
#define reg_bif_dma_rw_ch3_addr___addr___lsb 0
#define reg_bif_dma_rw_ch3_addr___addr___width 32
#define reg_bif_dma_rw_ch3_addr_offset 100
/* Register rw_ch3_start, scope bif_dma, type rw */
#define reg_bif_dma_rw_ch3_start___run___lsb 0
#define reg_bif_dma_rw_ch3_start___run___width 1
#define reg_bif_dma_rw_ch3_start___run___bit 0
#define reg_bif_dma_rw_ch3_start_offset 104
/* Register rw_ch3_cnt, scope bif_dma, type rw */
#define reg_bif_dma_rw_ch3_cnt___start_cnt___lsb 0
#define reg_bif_dma_rw_ch3_cnt___start_cnt___width 16
#define reg_bif_dma_rw_ch3_cnt_offset 108
/* Register r_ch3_stat, scope bif_dma, type r */
#define reg_bif_dma_r_ch3_stat___cnt___lsb 0
#define reg_bif_dma_r_ch3_stat___cnt___width 16
#define reg_bif_dma_r_ch3_stat___run___lsb 31
#define reg_bif_dma_r_ch3_stat___run___width 1
#define reg_bif_dma_r_ch3_stat___run___bit 31
#define reg_bif_dma_r_ch3_stat_offset 112
/* Register rw_intr_mask, scope bif_dma, type rw */
#define reg_bif_dma_rw_intr_mask___ext_dma0___lsb 0
#define reg_bif_dma_rw_intr_mask___ext_dma0___width 1
#define reg_bif_dma_rw_intr_mask___ext_dma0___bit 0
#define reg_bif_dma_rw_intr_mask___ext_dma1___lsb 1
#define reg_bif_dma_rw_intr_mask___ext_dma1___width 1
#define reg_bif_dma_rw_intr_mask___ext_dma1___bit 1
#define reg_bif_dma_rw_intr_mask___ext_dma2___lsb 2
#define reg_bif_dma_rw_intr_mask___ext_dma2___width 1
#define reg_bif_dma_rw_intr_mask___ext_dma2___bit 2
#define reg_bif_dma_rw_intr_mask___ext_dma3___lsb 3
#define reg_bif_dma_rw_intr_mask___ext_dma3___width 1
#define reg_bif_dma_rw_intr_mask___ext_dma3___bit 3
#define reg_bif_dma_rw_intr_mask_offset 128
/* Register rw_ack_intr, scope bif_dma, type rw */
#define reg_bif_dma_rw_ack_intr___ext_dma0___lsb 0
#define reg_bif_dma_rw_ack_intr___ext_dma0___width 1
#define reg_bif_dma_rw_ack_intr___ext_dma0___bit 0
#define reg_bif_dma_rw_ack_intr___ext_dma1___lsb 1
#define reg_bif_dma_rw_ack_intr___ext_dma1___width 1
#define reg_bif_dma_rw_ack_intr___ext_dma1___bit 1
#define reg_bif_dma_rw_ack_intr___ext_dma2___lsb 2
#define reg_bif_dma_rw_ack_intr___ext_dma2___width 1
#define reg_bif_dma_rw_ack_intr___ext_dma2___bit 2
#define reg_bif_dma_rw_ack_intr___ext_dma3___lsb 3
#define reg_bif_dma_rw_ack_intr___ext_dma3___width 1
#define reg_bif_dma_rw_ack_intr___ext_dma3___bit 3
#define reg_bif_dma_rw_ack_intr_offset 132
/* Register r_intr, scope bif_dma, type r */
#define reg_bif_dma_r_intr___ext_dma0___lsb 0
#define reg_bif_dma_r_intr___ext_dma0___width 1
#define reg_bif_dma_r_intr___ext_dma0___bit 0
#define reg_bif_dma_r_intr___ext_dma1___lsb 1
#define reg_bif_dma_r_intr___ext_dma1___width 1
#define reg_bif_dma_r_intr___ext_dma1___bit 1
#define reg_bif_dma_r_intr___ext_dma2___lsb 2
#define reg_bif_dma_r_intr___ext_dma2___width 1
#define reg_bif_dma_r_intr___ext_dma2___bit 2
#define reg_bif_dma_r_intr___ext_dma3___lsb 3
#define reg_bif_dma_r_intr___ext_dma3___width 1
#define reg_bif_dma_r_intr___ext_dma3___bit 3
#define reg_bif_dma_r_intr_offset 136
/* Register r_masked_intr, scope bif_dma, type r */
#define reg_bif_dma_r_masked_intr___ext_dma0___lsb 0
#define reg_bif_dma_r_masked_intr___ext_dma0___width 1
#define reg_bif_dma_r_masked_intr___ext_dma0___bit 0
#define reg_bif_dma_r_masked_intr___ext_dma1___lsb 1
#define reg_bif_dma_r_masked_intr___ext_dma1___width 1
#define reg_bif_dma_r_masked_intr___ext_dma1___bit 1
#define reg_bif_dma_r_masked_intr___ext_dma2___lsb 2
#define reg_bif_dma_r_masked_intr___ext_dma2___width 1
#define reg_bif_dma_r_masked_intr___ext_dma2___bit 2
#define reg_bif_dma_r_masked_intr___ext_dma3___lsb 3
#define reg_bif_dma_r_masked_intr___ext_dma3___width 1
#define reg_bif_dma_r_masked_intr___ext_dma3___bit 3
#define reg_bif_dma_r_masked_intr_offset 140
/* Register rw_pin0_cfg, scope bif_dma, type rw */
#define reg_bif_dma_rw_pin0_cfg___master_ch___lsb 0
#define reg_bif_dma_rw_pin0_cfg___master_ch___width 2
#define reg_bif_dma_rw_pin0_cfg___master_mode___lsb 2
#define reg_bif_dma_rw_pin0_cfg___master_mode___width 3
#define reg_bif_dma_rw_pin0_cfg___slave_ch___lsb 5
#define reg_bif_dma_rw_pin0_cfg___slave_ch___width 2
#define reg_bif_dma_rw_pin0_cfg___slave_mode___lsb 7
#define reg_bif_dma_rw_pin0_cfg___slave_mode___width 3
#define reg_bif_dma_rw_pin0_cfg_offset 160
/* Register rw_pin1_cfg, scope bif_dma, type rw */
#define reg_bif_dma_rw_pin1_cfg___master_ch___lsb 0
#define reg_bif_dma_rw_pin1_cfg___master_ch___width 2
#define reg_bif_dma_rw_pin1_cfg___master_mode___lsb 2
#define reg_bif_dma_rw_pin1_cfg___master_mode___width 3
#define reg_bif_dma_rw_pin1_cfg___slave_ch___lsb 5
#define reg_bif_dma_rw_pin1_cfg___slave_ch___width 2
#define reg_bif_dma_rw_pin1_cfg___slave_mode___lsb 7
#define reg_bif_dma_rw_pin1_cfg___slave_mode___width 3
#define reg_bif_dma_rw_pin1_cfg_offset 164
/* Register rw_pin2_cfg, scope bif_dma, type rw */
#define reg_bif_dma_rw_pin2_cfg___master_ch___lsb 0
#define reg_bif_dma_rw_pin2_cfg___master_ch___width 2
#define reg_bif_dma_rw_pin2_cfg___master_mode___lsb 2
#define reg_bif_dma_rw_pin2_cfg___master_mode___width 3
#define reg_bif_dma_rw_pin2_cfg___slave_ch___lsb 5
#define reg_bif_dma_rw_pin2_cfg___slave_ch___width 2
#define reg_bif_dma_rw_pin2_cfg___slave_mode___lsb 7
#define reg_bif_dma_rw_pin2_cfg___slave_mode___width 3
#define reg_bif_dma_rw_pin2_cfg_offset 168
/* Register rw_pin3_cfg, scope bif_dma, type rw */
#define reg_bif_dma_rw_pin3_cfg___master_ch___lsb 0
#define reg_bif_dma_rw_pin3_cfg___master_ch___width 2
#define reg_bif_dma_rw_pin3_cfg___master_mode___lsb 2
#define reg_bif_dma_rw_pin3_cfg___master_mode___width 3
#define reg_bif_dma_rw_pin3_cfg___slave_ch___lsb 5
#define reg_bif_dma_rw_pin3_cfg___slave_ch___width 2
#define reg_bif_dma_rw_pin3_cfg___slave_mode___lsb 7
#define reg_bif_dma_rw_pin3_cfg___slave_mode___width 3
#define reg_bif_dma_rw_pin3_cfg_offset 172
/* Register rw_pin4_cfg, scope bif_dma, type rw */
#define reg_bif_dma_rw_pin4_cfg___master_ch___lsb 0
#define reg_bif_dma_rw_pin4_cfg___master_ch___width 2
#define reg_bif_dma_rw_pin4_cfg___master_mode___lsb 2
#define reg_bif_dma_rw_pin4_cfg___master_mode___width 3
#define reg_bif_dma_rw_pin4_cfg___slave_ch___lsb 5
#define reg_bif_dma_rw_pin4_cfg___slave_ch___width 2
#define reg_bif_dma_rw_pin4_cfg___slave_mode___lsb 7
#define reg_bif_dma_rw_pin4_cfg___slave_mode___width 3
#define reg_bif_dma_rw_pin4_cfg_offset 176
/* Register rw_pin5_cfg, scope bif_dma, type rw */
#define reg_bif_dma_rw_pin5_cfg___master_ch___lsb 0
#define reg_bif_dma_rw_pin5_cfg___master_ch___width 2
#define reg_bif_dma_rw_pin5_cfg___master_mode___lsb 2
#define reg_bif_dma_rw_pin5_cfg___master_mode___width 3
#define reg_bif_dma_rw_pin5_cfg___slave_ch___lsb 5
#define reg_bif_dma_rw_pin5_cfg___slave_ch___width 2
#define reg_bif_dma_rw_pin5_cfg___slave_mode___lsb 7
#define reg_bif_dma_rw_pin5_cfg___slave_mode___width 3
#define reg_bif_dma_rw_pin5_cfg_offset 180
/* Register rw_pin6_cfg, scope bif_dma, type rw */
#define reg_bif_dma_rw_pin6_cfg___master_ch___lsb 0
#define reg_bif_dma_rw_pin6_cfg___master_ch___width 2
#define reg_bif_dma_rw_pin6_cfg___master_mode___lsb 2
#define reg_bif_dma_rw_pin6_cfg___master_mode___width 3
#define reg_bif_dma_rw_pin6_cfg___slave_ch___lsb 5
#define reg_bif_dma_rw_pin6_cfg___slave_ch___width 2
#define reg_bif_dma_rw_pin6_cfg___slave_mode___lsb 7
#define reg_bif_dma_rw_pin6_cfg___slave_mode___width 3
#define reg_bif_dma_rw_pin6_cfg_offset 184
/* Register rw_pin7_cfg, scope bif_dma, type rw */
#define reg_bif_dma_rw_pin7_cfg___master_ch___lsb 0
#define reg_bif_dma_rw_pin7_cfg___master_ch___width 2
#define reg_bif_dma_rw_pin7_cfg___master_mode___lsb 2
#define reg_bif_dma_rw_pin7_cfg___master_mode___width 3
#define reg_bif_dma_rw_pin7_cfg___slave_ch___lsb 5
#define reg_bif_dma_rw_pin7_cfg___slave_ch___width 2
#define reg_bif_dma_rw_pin7_cfg___slave_mode___lsb 7
#define reg_bif_dma_rw_pin7_cfg___slave_mode___width 3
#define reg_bif_dma_rw_pin7_cfg_offset 188
/* Register r_pin_stat, scope bif_dma, type r */
#define reg_bif_dma_r_pin_stat___pin0___lsb 0
#define reg_bif_dma_r_pin_stat___pin0___width 1
#define reg_bif_dma_r_pin_stat___pin0___bit 0
#define reg_bif_dma_r_pin_stat___pin1___lsb 1
#define reg_bif_dma_r_pin_stat___pin1___width 1
#define reg_bif_dma_r_pin_stat___pin1___bit 1
#define reg_bif_dma_r_pin_stat___pin2___lsb 2
#define reg_bif_dma_r_pin_stat___pin2___width 1
#define reg_bif_dma_r_pin_stat___pin2___bit 2
#define reg_bif_dma_r_pin_stat___pin3___lsb 3
#define reg_bif_dma_r_pin_stat___pin3___width 1
#define reg_bif_dma_r_pin_stat___pin3___bit 3
#define reg_bif_dma_r_pin_stat___pin4___lsb 4
#define reg_bif_dma_r_pin_stat___pin4___width 1
#define reg_bif_dma_r_pin_stat___pin4___bit 4
#define reg_bif_dma_r_pin_stat___pin5___lsb 5
#define reg_bif_dma_r_pin_stat___pin5___width 1
#define reg_bif_dma_r_pin_stat___pin5___bit 5
#define reg_bif_dma_r_pin_stat___pin6___lsb 6
#define reg_bif_dma_r_pin_stat___pin6___width 1
#define reg_bif_dma_r_pin_stat___pin6___bit 6
#define reg_bif_dma_r_pin_stat___pin7___lsb 7
#define reg_bif_dma_r_pin_stat___pin7___width 1
#define reg_bif_dma_r_pin_stat___pin7___bit 7
#define reg_bif_dma_r_pin_stat_offset 192
/* Constants */
#define regk_bif_dma_as_master 0x00000001
#define regk_bif_dma_as_slave 0x00000001
#define regk_bif_dma_burst1 0x00000000
#define regk_bif_dma_burst8 0x00000001
#define regk_bif_dma_bw16 0x00000001
#define regk_bif_dma_bw32 0x00000002
#define regk_bif_dma_bw8 0x00000000
#define regk_bif_dma_dack 0x00000006
#define regk_bif_dma_dack_inv 0x00000007
#define regk_bif_dma_force 0x00000001
#define regk_bif_dma_hi 0x00000003
#define regk_bif_dma_inv 0x00000003
#define regk_bif_dma_lo 0x00000002
#define regk_bif_dma_master 0x00000001
#define regk_bif_dma_no 0x00000000
#define regk_bif_dma_norm 0x00000002
#define regk_bif_dma_off 0x00000000
#define regk_bif_dma_rw_ch0_ctrl_default 0x00000000
#define regk_bif_dma_rw_ch0_start_default 0x00000000
#define regk_bif_dma_rw_ch1_ctrl_default 0x00000000
#define regk_bif_dma_rw_ch1_start_default 0x00000000
#define regk_bif_dma_rw_ch2_ctrl_default 0x00000000
#define regk_bif_dma_rw_ch2_start_default 0x00000000
#define regk_bif_dma_rw_ch3_ctrl_default 0x00000000
#define regk_bif_dma_rw_ch3_start_default 0x00000000
#define regk_bif_dma_rw_intr_mask_default 0x00000000
#define regk_bif_dma_rw_pin0_cfg_default 0x00000000
#define regk_bif_dma_rw_pin1_cfg_default 0x00000000
#define regk_bif_dma_rw_pin2_cfg_default 0x00000000
#define regk_bif_dma_rw_pin3_cfg_default 0x00000000
#define regk_bif_dma_rw_pin4_cfg_default 0x00000000
#define regk_bif_dma_rw_pin5_cfg_default 0x00000000
#define regk_bif_dma_rw_pin6_cfg_default 0x00000000
#define regk_bif_dma_rw_pin7_cfg_default 0x00000000
#define regk_bif_dma_slave 0x00000002
#define regk_bif_dma_sreq 0x00000006
#define regk_bif_dma_sreq_inv 0x00000007
#define regk_bif_dma_tc 0x00000004
#define regk_bif_dma_tc_inv 0x00000005
#define regk_bif_dma_yes 0x00000001
#endif /* __bif_dma_defs_asm_h */

View file

@ -0,0 +1,249 @@
#ifndef __bif_slave_defs_asm_h
#define __bif_slave_defs_asm_h
/*
* This file is autogenerated from
* file: ../../inst/bif/rtl/bif_slave_regs.r
* id: bif_slave_regs.r,v 1.5 2005/02/04 13:55:28 perz Exp
* last modfied: Mon Apr 11 16:06:34 2005
*
* by /n/asic/design/tools/rdesc/src/rdes2c -asm --outfile asm/bif_slave_defs_asm.h ../../inst/bif/rtl/bif_slave_regs.r
* id: $Id: bif_slave_defs_asm.h,v 1.1 2005/04/24 18:31:04 starvik Exp $
* Any changes here will be lost.
*
* -*- buffer-read-only: t -*-
*/
#ifndef REG_FIELD
#define REG_FIELD( scope, reg, field, value ) \
REG_FIELD_X_( value, reg_##scope##_##reg##___##field##___lsb )
#define REG_FIELD_X_( value, shift ) ((value) << shift)
#endif
#ifndef REG_STATE
#define REG_STATE( scope, reg, field, symbolic_value ) \
REG_STATE_X_( regk_##scope##_##symbolic_value, reg_##scope##_##reg##___##field##___lsb )
#define REG_STATE_X_( k, shift ) (k << shift)
#endif
#ifndef REG_MASK
#define REG_MASK( scope, reg, field ) \
REG_MASK_X_( reg_##scope##_##reg##___##field##___width, reg_##scope##_##reg##___##field##___lsb )
#define REG_MASK_X_( width, lsb ) (((1 << width)-1) << lsb)
#endif
#ifndef REG_LSB
#define REG_LSB( scope, reg, field ) reg_##scope##_##reg##___##field##___lsb
#endif
#ifndef REG_BIT
#define REG_BIT( scope, reg, field ) reg_##scope##_##reg##___##field##___bit
#endif
#ifndef REG_ADDR
#define REG_ADDR( scope, inst, reg ) REG_ADDR_X_(inst, reg_##scope##_##reg##_offset)
#define REG_ADDR_X_( inst, offs ) ((inst) + offs)
#endif
#ifndef REG_ADDR_VECT
#define REG_ADDR_VECT( scope, inst, reg, index ) \
REG_ADDR_VECT_X_(inst, reg_##scope##_##reg##_offset, index, \
STRIDE_##scope##_##reg )
#define REG_ADDR_VECT_X_( inst, offs, index, stride ) \
((inst) + offs + (index) * stride)
#endif
/* Register rw_slave_cfg, scope bif_slave, type rw */
#define reg_bif_slave_rw_slave_cfg___slave_id___lsb 0
#define reg_bif_slave_rw_slave_cfg___slave_id___width 3
#define reg_bif_slave_rw_slave_cfg___use_slave_id___lsb 3
#define reg_bif_slave_rw_slave_cfg___use_slave_id___width 1
#define reg_bif_slave_rw_slave_cfg___use_slave_id___bit 3
#define reg_bif_slave_rw_slave_cfg___boot_rdy___lsb 4
#define reg_bif_slave_rw_slave_cfg___boot_rdy___width 1
#define reg_bif_slave_rw_slave_cfg___boot_rdy___bit 4
#define reg_bif_slave_rw_slave_cfg___loopback___lsb 5
#define reg_bif_slave_rw_slave_cfg___loopback___width 1
#define reg_bif_slave_rw_slave_cfg___loopback___bit 5
#define reg_bif_slave_rw_slave_cfg___dis___lsb 6
#define reg_bif_slave_rw_slave_cfg___dis___width 1
#define reg_bif_slave_rw_slave_cfg___dis___bit 6
#define reg_bif_slave_rw_slave_cfg_offset 0
/* Register r_slave_mode, scope bif_slave, type r */
#define reg_bif_slave_r_slave_mode___ch0_mode___lsb 0
#define reg_bif_slave_r_slave_mode___ch0_mode___width 1
#define reg_bif_slave_r_slave_mode___ch0_mode___bit 0
#define reg_bif_slave_r_slave_mode___ch1_mode___lsb 1
#define reg_bif_slave_r_slave_mode___ch1_mode___width 1
#define reg_bif_slave_r_slave_mode___ch1_mode___bit 1
#define reg_bif_slave_r_slave_mode___ch2_mode___lsb 2
#define reg_bif_slave_r_slave_mode___ch2_mode___width 1
#define reg_bif_slave_r_slave_mode___ch2_mode___bit 2
#define reg_bif_slave_r_slave_mode___ch3_mode___lsb 3
#define reg_bif_slave_r_slave_mode___ch3_mode___width 1
#define reg_bif_slave_r_slave_mode___ch3_mode___bit 3
#define reg_bif_slave_r_slave_mode_offset 4
/* Register rw_ch0_cfg, scope bif_slave, type rw */
#define reg_bif_slave_rw_ch0_cfg___rd_hold___lsb 0
#define reg_bif_slave_rw_ch0_cfg___rd_hold___width 2
#define reg_bif_slave_rw_ch0_cfg___access_mode___lsb 2
#define reg_bif_slave_rw_ch0_cfg___access_mode___width 1
#define reg_bif_slave_rw_ch0_cfg___access_mode___bit 2
#define reg_bif_slave_rw_ch0_cfg___access_ctrl___lsb 3
#define reg_bif_slave_rw_ch0_cfg___access_ctrl___width 1
#define reg_bif_slave_rw_ch0_cfg___access_ctrl___bit 3
#define reg_bif_slave_rw_ch0_cfg___data_cs___lsb 4
#define reg_bif_slave_rw_ch0_cfg___data_cs___width 2
#define reg_bif_slave_rw_ch0_cfg_offset 16
/* Register rw_ch1_cfg, scope bif_slave, type rw */
#define reg_bif_slave_rw_ch1_cfg___rd_hold___lsb 0
#define reg_bif_slave_rw_ch1_cfg___rd_hold___width 2
#define reg_bif_slave_rw_ch1_cfg___access_mode___lsb 2
#define reg_bif_slave_rw_ch1_cfg___access_mode___width 1
#define reg_bif_slave_rw_ch1_cfg___access_mode___bit 2
#define reg_bif_slave_rw_ch1_cfg___access_ctrl___lsb 3
#define reg_bif_slave_rw_ch1_cfg___access_ctrl___width 1
#define reg_bif_slave_rw_ch1_cfg___access_ctrl___bit 3
#define reg_bif_slave_rw_ch1_cfg___data_cs___lsb 4
#define reg_bif_slave_rw_ch1_cfg___data_cs___width 2
#define reg_bif_slave_rw_ch1_cfg_offset 20
/* Register rw_ch2_cfg, scope bif_slave, type rw */
#define reg_bif_slave_rw_ch2_cfg___rd_hold___lsb 0
#define reg_bif_slave_rw_ch2_cfg___rd_hold___width 2
#define reg_bif_slave_rw_ch2_cfg___access_mode___lsb 2
#define reg_bif_slave_rw_ch2_cfg___access_mode___width 1
#define reg_bif_slave_rw_ch2_cfg___access_mode___bit 2
#define reg_bif_slave_rw_ch2_cfg___access_ctrl___lsb 3
#define reg_bif_slave_rw_ch2_cfg___access_ctrl___width 1
#define reg_bif_slave_rw_ch2_cfg___access_ctrl___bit 3
#define reg_bif_slave_rw_ch2_cfg___data_cs___lsb 4
#define reg_bif_slave_rw_ch2_cfg___data_cs___width 2
#define reg_bif_slave_rw_ch2_cfg_offset 24
/* Register rw_ch3_cfg, scope bif_slave, type rw */
#define reg_bif_slave_rw_ch3_cfg___rd_hold___lsb 0
#define reg_bif_slave_rw_ch3_cfg___rd_hold___width 2
#define reg_bif_slave_rw_ch3_cfg___access_mode___lsb 2
#define reg_bif_slave_rw_ch3_cfg___access_mode___width 1
#define reg_bif_slave_rw_ch3_cfg___access_mode___bit 2
#define reg_bif_slave_rw_ch3_cfg___access_ctrl___lsb 3
#define reg_bif_slave_rw_ch3_cfg___access_ctrl___width 1
#define reg_bif_slave_rw_ch3_cfg___access_ctrl___bit 3
#define reg_bif_slave_rw_ch3_cfg___data_cs___lsb 4
#define reg_bif_slave_rw_ch3_cfg___data_cs___width 2
#define reg_bif_slave_rw_ch3_cfg_offset 28
/* Register rw_arb_cfg, scope bif_slave, type rw */
#define reg_bif_slave_rw_arb_cfg___brin_mode___lsb 0
#define reg_bif_slave_rw_arb_cfg___brin_mode___width 1
#define reg_bif_slave_rw_arb_cfg___brin_mode___bit 0
#define reg_bif_slave_rw_arb_cfg___brout_mode___lsb 1
#define reg_bif_slave_rw_arb_cfg___brout_mode___width 3
#define reg_bif_slave_rw_arb_cfg___bg_mode___lsb 4
#define reg_bif_slave_rw_arb_cfg___bg_mode___width 3
#define reg_bif_slave_rw_arb_cfg___release___lsb 7
#define reg_bif_slave_rw_arb_cfg___release___width 2
#define reg_bif_slave_rw_arb_cfg___acquire___lsb 9
#define reg_bif_slave_rw_arb_cfg___acquire___width 1
#define reg_bif_slave_rw_arb_cfg___acquire___bit 9
#define reg_bif_slave_rw_arb_cfg___settle_time___lsb 10
#define reg_bif_slave_rw_arb_cfg___settle_time___width 2
#define reg_bif_slave_rw_arb_cfg___dram_ctrl___lsb 12
#define reg_bif_slave_rw_arb_cfg___dram_ctrl___width 1
#define reg_bif_slave_rw_arb_cfg___dram_ctrl___bit 12
#define reg_bif_slave_rw_arb_cfg_offset 32
/* Register r_arb_stat, scope bif_slave, type r */
#define reg_bif_slave_r_arb_stat___init_mode___lsb 0
#define reg_bif_slave_r_arb_stat___init_mode___width 1
#define reg_bif_slave_r_arb_stat___init_mode___bit 0
#define reg_bif_slave_r_arb_stat___mode___lsb 1
#define reg_bif_slave_r_arb_stat___mode___width 1
#define reg_bif_slave_r_arb_stat___mode___bit 1
#define reg_bif_slave_r_arb_stat___brin___lsb 2
#define reg_bif_slave_r_arb_stat___brin___width 1
#define reg_bif_slave_r_arb_stat___brin___bit 2
#define reg_bif_slave_r_arb_stat___brout___lsb 3
#define reg_bif_slave_r_arb_stat___brout___width 1
#define reg_bif_slave_r_arb_stat___brout___bit 3
#define reg_bif_slave_r_arb_stat___bg___lsb 4
#define reg_bif_slave_r_arb_stat___bg___width 1
#define reg_bif_slave_r_arb_stat___bg___bit 4
#define reg_bif_slave_r_arb_stat_offset 36
/* Register rw_intr_mask, scope bif_slave, type rw */
#define reg_bif_slave_rw_intr_mask___bus_release___lsb 0
#define reg_bif_slave_rw_intr_mask___bus_release___width 1
#define reg_bif_slave_rw_intr_mask___bus_release___bit 0
#define reg_bif_slave_rw_intr_mask___bus_acquire___lsb 1
#define reg_bif_slave_rw_intr_mask___bus_acquire___width 1
#define reg_bif_slave_rw_intr_mask___bus_acquire___bit 1
#define reg_bif_slave_rw_intr_mask_offset 64
/* Register rw_ack_intr, scope bif_slave, type rw */
#define reg_bif_slave_rw_ack_intr___bus_release___lsb 0
#define reg_bif_slave_rw_ack_intr___bus_release___width 1
#define reg_bif_slave_rw_ack_intr___bus_release___bit 0
#define reg_bif_slave_rw_ack_intr___bus_acquire___lsb 1
#define reg_bif_slave_rw_ack_intr___bus_acquire___width 1
#define reg_bif_slave_rw_ack_intr___bus_acquire___bit 1
#define reg_bif_slave_rw_ack_intr_offset 68
/* Register r_intr, scope bif_slave, type r */
#define reg_bif_slave_r_intr___bus_release___lsb 0
#define reg_bif_slave_r_intr___bus_release___width 1
#define reg_bif_slave_r_intr___bus_release___bit 0
#define reg_bif_slave_r_intr___bus_acquire___lsb 1
#define reg_bif_slave_r_intr___bus_acquire___width 1
#define reg_bif_slave_r_intr___bus_acquire___bit 1
#define reg_bif_slave_r_intr_offset 72
/* Register r_masked_intr, scope bif_slave, type r */
#define reg_bif_slave_r_masked_intr___bus_release___lsb 0
#define reg_bif_slave_r_masked_intr___bus_release___width 1
#define reg_bif_slave_r_masked_intr___bus_release___bit 0
#define reg_bif_slave_r_masked_intr___bus_acquire___lsb 1
#define reg_bif_slave_r_masked_intr___bus_acquire___width 1
#define reg_bif_slave_r_masked_intr___bus_acquire___bit 1
#define reg_bif_slave_r_masked_intr_offset 76
/* Constants */
#define regk_bif_slave_active_hi 0x00000003
#define regk_bif_slave_active_lo 0x00000002
#define regk_bif_slave_addr 0x00000000
#define regk_bif_slave_always 0x00000001
#define regk_bif_slave_at_idle 0x00000002
#define regk_bif_slave_burst_end 0x00000003
#define regk_bif_slave_dma 0x00000001
#define regk_bif_slave_hi 0x00000003
#define regk_bif_slave_inv 0x00000001
#define regk_bif_slave_lo 0x00000002
#define regk_bif_slave_local 0x00000001
#define regk_bif_slave_master 0x00000000
#define regk_bif_slave_mode_reg 0x00000001
#define regk_bif_slave_no 0x00000000
#define regk_bif_slave_norm 0x00000000
#define regk_bif_slave_on_access 0x00000000
#define regk_bif_slave_rw_arb_cfg_default 0x00000000
#define regk_bif_slave_rw_ch0_cfg_default 0x00000000
#define regk_bif_slave_rw_ch1_cfg_default 0x00000000
#define regk_bif_slave_rw_ch2_cfg_default 0x00000000
#define regk_bif_slave_rw_ch3_cfg_default 0x00000000
#define regk_bif_slave_rw_intr_mask_default 0x00000000
#define regk_bif_slave_rw_slave_cfg_default 0x00000000
#define regk_bif_slave_shared 0x00000000
#define regk_bif_slave_slave 0x00000001
#define regk_bif_slave_t0ns 0x00000003
#define regk_bif_slave_t10ns 0x00000002
#define regk_bif_slave_t20ns 0x00000003
#define regk_bif_slave_t30ns 0x00000002
#define regk_bif_slave_t40ns 0x00000001
#define regk_bif_slave_t50ns 0x00000000
#define regk_bif_slave_yes 0x00000001
#define regk_bif_slave_z 0x00000004
#endif /* __bif_slave_defs_asm_h */

View file

@ -0,0 +1,131 @@
#ifndef __config_defs_asm_h
#define __config_defs_asm_h
/*
* This file is autogenerated from
* file: ../../rtl/config_regs.r
* id: config_regs.r,v 1.23 2004/03/04 11:34:42 mikaeln Exp
* last modfied: Thu Mar 4 12:34:39 2004
*
* by /n/asic/design/tools/rdesc/src/rdes2c -asm --outfile asm/config_defs_asm.h ../../rtl/config_regs.r
* id: $Id: config_defs_asm.h,v 1.1 2005/04/24 18:31:04 starvik Exp $
* Any changes here will be lost.
*
* -*- buffer-read-only: t -*-
*/
#ifndef REG_FIELD
#define REG_FIELD( scope, reg, field, value ) \
REG_FIELD_X_( value, reg_##scope##_##reg##___##field##___lsb )
#define REG_FIELD_X_( value, shift ) ((value) << shift)
#endif
#ifndef REG_STATE
#define REG_STATE( scope, reg, field, symbolic_value ) \
REG_STATE_X_( regk_##scope##_##symbolic_value, reg_##scope##_##reg##___##field##___lsb )
#define REG_STATE_X_( k, shift ) (k << shift)
#endif
#ifndef REG_MASK
#define REG_MASK( scope, reg, field ) \
REG_MASK_X_( reg_##scope##_##reg##___##field##___width, reg_##scope##_##reg##___##field##___lsb )
#define REG_MASK_X_( width, lsb ) (((1 << width)-1) << lsb)
#endif
#ifndef REG_LSB
#define REG_LSB( scope, reg, field ) reg_##scope##_##reg##___##field##___lsb
#endif
#ifndef REG_BIT
#define REG_BIT( scope, reg, field ) reg_##scope##_##reg##___##field##___bit
#endif
#ifndef REG_ADDR
#define REG_ADDR( scope, inst, reg ) REG_ADDR_X_(inst, reg_##scope##_##reg##_offset)
#define REG_ADDR_X_( inst, offs ) ((inst) + offs)
#endif
#ifndef REG_ADDR_VECT
#define REG_ADDR_VECT( scope, inst, reg, index ) \
REG_ADDR_VECT_X_(inst, reg_##scope##_##reg##_offset, index, \
STRIDE_##scope##_##reg )
#define REG_ADDR_VECT_X_( inst, offs, index, stride ) \
((inst) + offs + (index) * stride)
#endif
/* Register r_bootsel, scope config, type r */
#define reg_config_r_bootsel___boot_mode___lsb 0
#define reg_config_r_bootsel___boot_mode___width 3
#define reg_config_r_bootsel___full_duplex___lsb 3
#define reg_config_r_bootsel___full_duplex___width 1
#define reg_config_r_bootsel___full_duplex___bit 3
#define reg_config_r_bootsel___user___lsb 4
#define reg_config_r_bootsel___user___width 1
#define reg_config_r_bootsel___user___bit 4
#define reg_config_r_bootsel___pll___lsb 5
#define reg_config_r_bootsel___pll___width 1
#define reg_config_r_bootsel___pll___bit 5
#define reg_config_r_bootsel___flash_bw___lsb 6
#define reg_config_r_bootsel___flash_bw___width 1
#define reg_config_r_bootsel___flash_bw___bit 6
#define reg_config_r_bootsel_offset 0
/* Register rw_clk_ctrl, scope config, type rw */
#define reg_config_rw_clk_ctrl___pll___lsb 0
#define reg_config_rw_clk_ctrl___pll___width 1
#define reg_config_rw_clk_ctrl___pll___bit 0
#define reg_config_rw_clk_ctrl___cpu___lsb 1
#define reg_config_rw_clk_ctrl___cpu___width 1
#define reg_config_rw_clk_ctrl___cpu___bit 1
#define reg_config_rw_clk_ctrl___iop___lsb 2
#define reg_config_rw_clk_ctrl___iop___width 1
#define reg_config_rw_clk_ctrl___iop___bit 2
#define reg_config_rw_clk_ctrl___dma01_eth0___lsb 3
#define reg_config_rw_clk_ctrl___dma01_eth0___width 1
#define reg_config_rw_clk_ctrl___dma01_eth0___bit 3
#define reg_config_rw_clk_ctrl___dma23___lsb 4
#define reg_config_rw_clk_ctrl___dma23___width 1
#define reg_config_rw_clk_ctrl___dma23___bit 4
#define reg_config_rw_clk_ctrl___dma45___lsb 5
#define reg_config_rw_clk_ctrl___dma45___width 1
#define reg_config_rw_clk_ctrl___dma45___bit 5
#define reg_config_rw_clk_ctrl___dma67___lsb 6
#define reg_config_rw_clk_ctrl___dma67___width 1
#define reg_config_rw_clk_ctrl___dma67___bit 6
#define reg_config_rw_clk_ctrl___dma89_strcop___lsb 7
#define reg_config_rw_clk_ctrl___dma89_strcop___width 1
#define reg_config_rw_clk_ctrl___dma89_strcop___bit 7
#define reg_config_rw_clk_ctrl___bif___lsb 8
#define reg_config_rw_clk_ctrl___bif___width 1
#define reg_config_rw_clk_ctrl___bif___bit 8
#define reg_config_rw_clk_ctrl___fix_io___lsb 9
#define reg_config_rw_clk_ctrl___fix_io___width 1
#define reg_config_rw_clk_ctrl___fix_io___bit 9
#define reg_config_rw_clk_ctrl_offset 4
/* Register rw_pad_ctrl, scope config, type rw */
#define reg_config_rw_pad_ctrl___usb_susp___lsb 0
#define reg_config_rw_pad_ctrl___usb_susp___width 1
#define reg_config_rw_pad_ctrl___usb_susp___bit 0
#define reg_config_rw_pad_ctrl___phyrst_n___lsb 1
#define reg_config_rw_pad_ctrl___phyrst_n___width 1
#define reg_config_rw_pad_ctrl___phyrst_n___bit 1
#define reg_config_rw_pad_ctrl_offset 8
/* Constants */
#define regk_config_bw16 0x00000000
#define regk_config_bw32 0x00000001
#define regk_config_master 0x00000005
#define regk_config_nand 0x00000003
#define regk_config_net_rx 0x00000001
#define regk_config_net_tx_rx 0x00000002
#define regk_config_no 0x00000000
#define regk_config_none 0x00000007
#define regk_config_nor 0x00000000
#define regk_config_rw_clk_ctrl_default 0x00000002
#define regk_config_rw_pad_ctrl_default 0x00000000
#define regk_config_ser 0x00000004
#define regk_config_slave 0x00000006
#define regk_config_yes 0x00000001
#endif /* __config_defs_asm_h */

View file

@ -0,0 +1,41 @@
/* Interrupt vector numbers autogenerated by /n/asic/design/tools/rdesc/src/rdes2intr version
from ../../inst/crisp/doc/cpu_vect.r
version . */
#ifndef _______INST_CRISP_DOC_CPU_VECT_R
#define _______INST_CRISP_DOC_CPU_VECT_R
#define NMI_INTR_VECT 0x00
#define RESERVED_1_INTR_VECT 0x01
#define RESERVED_2_INTR_VECT 0x02
#define SINGLE_STEP_INTR_VECT 0x03
#define INSTR_TLB_REFILL_INTR_VECT 0x04
#define INSTR_TLB_INV_INTR_VECT 0x05
#define INSTR_TLB_ACC_INTR_VECT 0x06
#define TLB_EX_INTR_VECT 0x07
#define DATA_TLB_REFILL_INTR_VECT 0x08
#define DATA_TLB_INV_INTR_VECT 0x09
#define DATA_TLB_ACC_INTR_VECT 0x0a
#define DATA_TLB_WE_INTR_VECT 0x0b
#define HW_BP_INTR_VECT 0x0c
#define RESERVED_D_INTR_VECT 0x0d
#define RESERVED_E_INTR_VECT 0x0e
#define RESERVED_F_INTR_VECT 0x0f
#define BREAK_0_INTR_VECT 0x10
#define BREAK_1_INTR_VECT 0x11
#define BREAK_2_INTR_VECT 0x12
#define BREAK_3_INTR_VECT 0x13
#define BREAK_4_INTR_VECT 0x14
#define BREAK_5_INTR_VECT 0x15
#define BREAK_6_INTR_VECT 0x16
#define BREAK_7_INTR_VECT 0x17
#define BREAK_8_INTR_VECT 0x18
#define BREAK_9_INTR_VECT 0x19
#define BREAK_10_INTR_VECT 0x1a
#define BREAK_11_INTR_VECT 0x1b
#define BREAK_12_INTR_VECT 0x1c
#define BREAK_13_INTR_VECT 0x1d
#define BREAK_14_INTR_VECT 0x1e
#define BREAK_15_INTR_VECT 0x1f
#define MULTIPLE_INTR_VECT 0x30
#endif

View file

@ -0,0 +1,114 @@
#ifndef __cris_defs_asm_h
#define __cris_defs_asm_h
/*
* This file is autogenerated from
* file: ../../inst/crisp/doc/cris.r
* id: cris.r,v 1.6 2004/05/05 07:41:12 perz Exp
* last modfied: Mon Apr 11 16:06:39 2005
*
* by /n/asic/design/tools/rdesc/src/rdes2c -asm --outfile asm/cris_defs_asm.h ../../inst/crisp/doc/cris.r
* id: $Id: cris_defs_asm.h,v 1.1 2005/04/24 18:31:04 starvik Exp $
* Any changes here will be lost.
*
* -*- buffer-read-only: t -*-
*/
#ifndef REG_FIELD
#define REG_FIELD( scope, reg, field, value ) \
REG_FIELD_X_( value, reg_##scope##_##reg##___##field##___lsb )
#define REG_FIELD_X_( value, shift ) ((value) << shift)
#endif
#ifndef REG_STATE
#define REG_STATE( scope, reg, field, symbolic_value ) \
REG_STATE_X_( regk_##scope##_##symbolic_value, reg_##scope##_##reg##___##field##___lsb )
#define REG_STATE_X_( k, shift ) (k << shift)
#endif
#ifndef REG_MASK
#define REG_MASK( scope, reg, field ) \
REG_MASK_X_( reg_##scope##_##reg##___##field##___width, reg_##scope##_##reg##___##field##___lsb )
#define REG_MASK_X_( width, lsb ) (((1 << width)-1) << lsb)
#endif
#ifndef REG_LSB
#define REG_LSB( scope, reg, field ) reg_##scope##_##reg##___##field##___lsb
#endif
#ifndef REG_BIT
#define REG_BIT( scope, reg, field ) reg_##scope##_##reg##___##field##___bit
#endif
#ifndef REG_ADDR
#define REG_ADDR( scope, inst, reg ) REG_ADDR_X_(inst, reg_##scope##_##reg##_offset)
#define REG_ADDR_X_( inst, offs ) ((inst) + offs)
#endif
#ifndef REG_ADDR_VECT
#define REG_ADDR_VECT( scope, inst, reg, index ) \
REG_ADDR_VECT_X_(inst, reg_##scope##_##reg##_offset, index, \
STRIDE_##scope##_##reg )
#define REG_ADDR_VECT_X_( inst, offs, index, stride ) \
((inst) + offs + (index) * stride)
#endif
/* Register rw_gc_cfg, scope cris, type rw */
#define reg_cris_rw_gc_cfg___ic___lsb 0
#define reg_cris_rw_gc_cfg___ic___width 1
#define reg_cris_rw_gc_cfg___ic___bit 0
#define reg_cris_rw_gc_cfg___dc___lsb 1
#define reg_cris_rw_gc_cfg___dc___width 1
#define reg_cris_rw_gc_cfg___dc___bit 1
#define reg_cris_rw_gc_cfg___im___lsb 2
#define reg_cris_rw_gc_cfg___im___width 1
#define reg_cris_rw_gc_cfg___im___bit 2
#define reg_cris_rw_gc_cfg___dm___lsb 3
#define reg_cris_rw_gc_cfg___dm___width 1
#define reg_cris_rw_gc_cfg___dm___bit 3
#define reg_cris_rw_gc_cfg___gb___lsb 4
#define reg_cris_rw_gc_cfg___gb___width 1
#define reg_cris_rw_gc_cfg___gb___bit 4
#define reg_cris_rw_gc_cfg___gk___lsb 5
#define reg_cris_rw_gc_cfg___gk___width 1
#define reg_cris_rw_gc_cfg___gk___bit 5
#define reg_cris_rw_gc_cfg___gp___lsb 6
#define reg_cris_rw_gc_cfg___gp___width 1
#define reg_cris_rw_gc_cfg___gp___bit 6
#define reg_cris_rw_gc_cfg_offset 0
/* Register rw_gc_ccs, scope cris, type rw */
#define reg_cris_rw_gc_ccs_offset 4
/* Register rw_gc_srs, scope cris, type rw */
#define reg_cris_rw_gc_srs___srs___lsb 0
#define reg_cris_rw_gc_srs___srs___width 8
#define reg_cris_rw_gc_srs_offset 8
/* Register rw_gc_nrp, scope cris, type rw */
#define reg_cris_rw_gc_nrp_offset 12
/* Register rw_gc_exs, scope cris, type rw */
#define reg_cris_rw_gc_exs_offset 16
/* Register rw_gc_eda, scope cris, type rw */
#define reg_cris_rw_gc_eda_offset 20
/* Register rw_gc_r0, scope cris, type rw */
#define reg_cris_rw_gc_r0_offset 32
/* Register rw_gc_r1, scope cris, type rw */
#define reg_cris_rw_gc_r1_offset 36
/* Register rw_gc_r2, scope cris, type rw */
#define reg_cris_rw_gc_r2_offset 40
/* Register rw_gc_r3, scope cris, type rw */
#define reg_cris_rw_gc_r3_offset 44
/* Constants */
#define regk_cris_no 0x00000000
#define regk_cris_rw_gc_cfg_default 0x00000000
#define regk_cris_yes 0x00000001
#endif /* __cris_defs_asm_h */

View file

@ -0,0 +1,10 @@
#define RW_GC_CFG 0
#define RW_GC_CCS 1
#define RW_GC_SRS 2
#define RW_GC_NRP 3
#define RW_GC_EXS 4
#define RW_GC_EDA 5
#define RW_GC_R0 8
#define RW_GC_R1 9
#define RW_GC_R2 10
#define RW_GC_R3 11

View file

@ -0,0 +1,368 @@
#ifndef __dma_defs_asm_h
#define __dma_defs_asm_h
/*
* This file is autogenerated from
* file: ../../inst/dma/inst/dma_common/rtl/dma_regdes.r
* id: dma_regdes.r,v 1.39 2005/02/10 14:07:23 janb Exp
* last modfied: Mon Apr 11 16:06:51 2005
*
* by /n/asic/design/tools/rdesc/src/rdes2c -asm --outfile asm/dma_defs_asm.h ../../inst/dma/inst/dma_common/rtl/dma_regdes.r
* id: $Id: dma_defs_asm.h,v 1.1 2005/04/24 18:31:04 starvik Exp $
* Any changes here will be lost.
*
* -*- buffer-read-only: t -*-
*/
#ifndef REG_FIELD
#define REG_FIELD( scope, reg, field, value ) \
REG_FIELD_X_( value, reg_##scope##_##reg##___##field##___lsb )
#define REG_FIELD_X_( value, shift ) ((value) << shift)
#endif
#ifndef REG_STATE
#define REG_STATE( scope, reg, field, symbolic_value ) \
REG_STATE_X_( regk_##scope##_##symbolic_value, reg_##scope##_##reg##___##field##___lsb )
#define REG_STATE_X_( k, shift ) (k << shift)
#endif
#ifndef REG_MASK
#define REG_MASK( scope, reg, field ) \
REG_MASK_X_( reg_##scope##_##reg##___##field##___width, reg_##scope##_##reg##___##field##___lsb )
#define REG_MASK_X_( width, lsb ) (((1 << width)-1) << lsb)
#endif
#ifndef REG_LSB
#define REG_LSB( scope, reg, field ) reg_##scope##_##reg##___##field##___lsb
#endif
#ifndef REG_BIT
#define REG_BIT( scope, reg, field ) reg_##scope##_##reg##___##field##___bit
#endif
#ifndef REG_ADDR
#define REG_ADDR( scope, inst, reg ) REG_ADDR_X_(inst, reg_##scope##_##reg##_offset)
#define REG_ADDR_X_( inst, offs ) ((inst) + offs)
#endif
#ifndef REG_ADDR_VECT
#define REG_ADDR_VECT( scope, inst, reg, index ) \
REG_ADDR_VECT_X_(inst, reg_##scope##_##reg##_offset, index, \
STRIDE_##scope##_##reg )
#define REG_ADDR_VECT_X_( inst, offs, index, stride ) \
((inst) + offs + (index) * stride)
#endif
/* Register rw_data, scope dma, type rw */
#define reg_dma_rw_data_offset 0
/* Register rw_data_next, scope dma, type rw */
#define reg_dma_rw_data_next_offset 4
/* Register rw_data_buf, scope dma, type rw */
#define reg_dma_rw_data_buf_offset 8
/* Register rw_data_ctrl, scope dma, type rw */
#define reg_dma_rw_data_ctrl___eol___lsb 0
#define reg_dma_rw_data_ctrl___eol___width 1
#define reg_dma_rw_data_ctrl___eol___bit 0
#define reg_dma_rw_data_ctrl___out_eop___lsb 3
#define reg_dma_rw_data_ctrl___out_eop___width 1
#define reg_dma_rw_data_ctrl___out_eop___bit 3
#define reg_dma_rw_data_ctrl___intr___lsb 4
#define reg_dma_rw_data_ctrl___intr___width 1
#define reg_dma_rw_data_ctrl___intr___bit 4
#define reg_dma_rw_data_ctrl___wait___lsb 5
#define reg_dma_rw_data_ctrl___wait___width 1
#define reg_dma_rw_data_ctrl___wait___bit 5
#define reg_dma_rw_data_ctrl_offset 12
/* Register rw_data_stat, scope dma, type rw */
#define reg_dma_rw_data_stat___in_eop___lsb 3
#define reg_dma_rw_data_stat___in_eop___width 1
#define reg_dma_rw_data_stat___in_eop___bit 3
#define reg_dma_rw_data_stat_offset 16
/* Register rw_data_md, scope dma, type rw */
#define reg_dma_rw_data_md___md___lsb 0
#define reg_dma_rw_data_md___md___width 16
#define reg_dma_rw_data_md_offset 20
/* Register rw_data_md_s, scope dma, type rw */
#define reg_dma_rw_data_md_s___md_s___lsb 0
#define reg_dma_rw_data_md_s___md_s___width 16
#define reg_dma_rw_data_md_s_offset 24
/* Register rw_data_after, scope dma, type rw */
#define reg_dma_rw_data_after_offset 28
/* Register rw_ctxt, scope dma, type rw */
#define reg_dma_rw_ctxt_offset 32
/* Register rw_ctxt_next, scope dma, type rw */
#define reg_dma_rw_ctxt_next_offset 36
/* Register rw_ctxt_ctrl, scope dma, type rw */
#define reg_dma_rw_ctxt_ctrl___eol___lsb 0
#define reg_dma_rw_ctxt_ctrl___eol___width 1
#define reg_dma_rw_ctxt_ctrl___eol___bit 0
#define reg_dma_rw_ctxt_ctrl___intr___lsb 4
#define reg_dma_rw_ctxt_ctrl___intr___width 1
#define reg_dma_rw_ctxt_ctrl___intr___bit 4
#define reg_dma_rw_ctxt_ctrl___store_mode___lsb 6
#define reg_dma_rw_ctxt_ctrl___store_mode___width 1
#define reg_dma_rw_ctxt_ctrl___store_mode___bit 6
#define reg_dma_rw_ctxt_ctrl___en___lsb 7
#define reg_dma_rw_ctxt_ctrl___en___width 1
#define reg_dma_rw_ctxt_ctrl___en___bit 7
#define reg_dma_rw_ctxt_ctrl_offset 40
/* Register rw_ctxt_stat, scope dma, type rw */
#define reg_dma_rw_ctxt_stat___dis___lsb 7
#define reg_dma_rw_ctxt_stat___dis___width 1
#define reg_dma_rw_ctxt_stat___dis___bit 7
#define reg_dma_rw_ctxt_stat_offset 44
/* Register rw_ctxt_md0, scope dma, type rw */
#define reg_dma_rw_ctxt_md0___md0___lsb 0
#define reg_dma_rw_ctxt_md0___md0___width 16
#define reg_dma_rw_ctxt_md0_offset 48
/* Register rw_ctxt_md0_s, scope dma, type rw */
#define reg_dma_rw_ctxt_md0_s___md0_s___lsb 0
#define reg_dma_rw_ctxt_md0_s___md0_s___width 16
#define reg_dma_rw_ctxt_md0_s_offset 52
/* Register rw_ctxt_md1, scope dma, type rw */
#define reg_dma_rw_ctxt_md1_offset 56
/* Register rw_ctxt_md1_s, scope dma, type rw */
#define reg_dma_rw_ctxt_md1_s_offset 60
/* Register rw_ctxt_md2, scope dma, type rw */
#define reg_dma_rw_ctxt_md2_offset 64
/* Register rw_ctxt_md2_s, scope dma, type rw */
#define reg_dma_rw_ctxt_md2_s_offset 68
/* Register rw_ctxt_md3, scope dma, type rw */
#define reg_dma_rw_ctxt_md3_offset 72
/* Register rw_ctxt_md3_s, scope dma, type rw */
#define reg_dma_rw_ctxt_md3_s_offset 76
/* Register rw_ctxt_md4, scope dma, type rw */
#define reg_dma_rw_ctxt_md4_offset 80
/* Register rw_ctxt_md4_s, scope dma, type rw */
#define reg_dma_rw_ctxt_md4_s_offset 84
/* Register rw_saved_data, scope dma, type rw */
#define reg_dma_rw_saved_data_offset 88
/* Register rw_saved_data_buf, scope dma, type rw */
#define reg_dma_rw_saved_data_buf_offset 92
/* Register rw_group, scope dma, type rw */
#define reg_dma_rw_group_offset 96
/* Register rw_group_next, scope dma, type rw */
#define reg_dma_rw_group_next_offset 100
/* Register rw_group_ctrl, scope dma, type rw */
#define reg_dma_rw_group_ctrl___eol___lsb 0
#define reg_dma_rw_group_ctrl___eol___width 1
#define reg_dma_rw_group_ctrl___eol___bit 0
#define reg_dma_rw_group_ctrl___tol___lsb 1
#define reg_dma_rw_group_ctrl___tol___width 1
#define reg_dma_rw_group_ctrl___tol___bit 1
#define reg_dma_rw_group_ctrl___bol___lsb 2
#define reg_dma_rw_group_ctrl___bol___width 1
#define reg_dma_rw_group_ctrl___bol___bit 2
#define reg_dma_rw_group_ctrl___intr___lsb 4
#define reg_dma_rw_group_ctrl___intr___width 1
#define reg_dma_rw_group_ctrl___intr___bit 4
#define reg_dma_rw_group_ctrl___en___lsb 7
#define reg_dma_rw_group_ctrl___en___width 1
#define reg_dma_rw_group_ctrl___en___bit 7
#define reg_dma_rw_group_ctrl_offset 104
/* Register rw_group_stat, scope dma, type rw */
#define reg_dma_rw_group_stat___dis___lsb 7
#define reg_dma_rw_group_stat___dis___width 1
#define reg_dma_rw_group_stat___dis___bit 7
#define reg_dma_rw_group_stat_offset 108
/* Register rw_group_md, scope dma, type rw */
#define reg_dma_rw_group_md___md___lsb 0
#define reg_dma_rw_group_md___md___width 16
#define reg_dma_rw_group_md_offset 112
/* Register rw_group_md_s, scope dma, type rw */
#define reg_dma_rw_group_md_s___md_s___lsb 0
#define reg_dma_rw_group_md_s___md_s___width 16
#define reg_dma_rw_group_md_s_offset 116
/* Register rw_group_up, scope dma, type rw */
#define reg_dma_rw_group_up_offset 120
/* Register rw_group_down, scope dma, type rw */
#define reg_dma_rw_group_down_offset 124
/* Register rw_cmd, scope dma, type rw */
#define reg_dma_rw_cmd___cont_data___lsb 0
#define reg_dma_rw_cmd___cont_data___width 1
#define reg_dma_rw_cmd___cont_data___bit 0
#define reg_dma_rw_cmd_offset 128
/* Register rw_cfg, scope dma, type rw */
#define reg_dma_rw_cfg___en___lsb 0
#define reg_dma_rw_cfg___en___width 1
#define reg_dma_rw_cfg___en___bit 0
#define reg_dma_rw_cfg___stop___lsb 1
#define reg_dma_rw_cfg___stop___width 1
#define reg_dma_rw_cfg___stop___bit 1
#define reg_dma_rw_cfg_offset 132
/* Register rw_stat, scope dma, type rw */
#define reg_dma_rw_stat___mode___lsb 0
#define reg_dma_rw_stat___mode___width 5
#define reg_dma_rw_stat___list_state___lsb 5
#define reg_dma_rw_stat___list_state___width 3
#define reg_dma_rw_stat___stream_cmd_src___lsb 8
#define reg_dma_rw_stat___stream_cmd_src___width 8
#define reg_dma_rw_stat___buf___lsb 24
#define reg_dma_rw_stat___buf___width 8
#define reg_dma_rw_stat_offset 136
/* Register rw_intr_mask, scope dma, type rw */
#define reg_dma_rw_intr_mask___group___lsb 0
#define reg_dma_rw_intr_mask___group___width 1
#define reg_dma_rw_intr_mask___group___bit 0
#define reg_dma_rw_intr_mask___ctxt___lsb 1
#define reg_dma_rw_intr_mask___ctxt___width 1
#define reg_dma_rw_intr_mask___ctxt___bit 1
#define reg_dma_rw_intr_mask___data___lsb 2
#define reg_dma_rw_intr_mask___data___width 1
#define reg_dma_rw_intr_mask___data___bit 2
#define reg_dma_rw_intr_mask___in_eop___lsb 3
#define reg_dma_rw_intr_mask___in_eop___width 1
#define reg_dma_rw_intr_mask___in_eop___bit 3
#define reg_dma_rw_intr_mask___stream_cmd___lsb 4
#define reg_dma_rw_intr_mask___stream_cmd___width 1
#define reg_dma_rw_intr_mask___stream_cmd___bit 4
#define reg_dma_rw_intr_mask_offset 140
/* Register rw_ack_intr, scope dma, type rw */
#define reg_dma_rw_ack_intr___group___lsb 0
#define reg_dma_rw_ack_intr___group___width 1
#define reg_dma_rw_ack_intr___group___bit 0
#define reg_dma_rw_ack_intr___ctxt___lsb 1
#define reg_dma_rw_ack_intr___ctxt___width 1
#define reg_dma_rw_ack_intr___ctxt___bit 1
#define reg_dma_rw_ack_intr___data___lsb 2
#define reg_dma_rw_ack_intr___data___width 1
#define reg_dma_rw_ack_intr___data___bit 2
#define reg_dma_rw_ack_intr___in_eop___lsb 3
#define reg_dma_rw_ack_intr___in_eop___width 1
#define reg_dma_rw_ack_intr___in_eop___bit 3
#define reg_dma_rw_ack_intr___stream_cmd___lsb 4
#define reg_dma_rw_ack_intr___stream_cmd___width 1
#define reg_dma_rw_ack_intr___stream_cmd___bit 4
#define reg_dma_rw_ack_intr_offset 144
/* Register r_intr, scope dma, type r */
#define reg_dma_r_intr___group___lsb 0
#define reg_dma_r_intr___group___width 1
#define reg_dma_r_intr___group___bit 0
#define reg_dma_r_intr___ctxt___lsb 1
#define reg_dma_r_intr___ctxt___width 1
#define reg_dma_r_intr___ctxt___bit 1
#define reg_dma_r_intr___data___lsb 2
#define reg_dma_r_intr___data___width 1
#define reg_dma_r_intr___data___bit 2
#define reg_dma_r_intr___in_eop___lsb 3
#define reg_dma_r_intr___in_eop___width 1
#define reg_dma_r_intr___in_eop___bit 3
#define reg_dma_r_intr___stream_cmd___lsb 4
#define reg_dma_r_intr___stream_cmd___width 1
#define reg_dma_r_intr___stream_cmd___bit 4
#define reg_dma_r_intr_offset 148
/* Register r_masked_intr, scope dma, type r */
#define reg_dma_r_masked_intr___group___lsb 0
#define reg_dma_r_masked_intr___group___width 1
#define reg_dma_r_masked_intr___group___bit 0
#define reg_dma_r_masked_intr___ctxt___lsb 1
#define reg_dma_r_masked_intr___ctxt___width 1
#define reg_dma_r_masked_intr___ctxt___bit 1
#define reg_dma_r_masked_intr___data___lsb 2
#define reg_dma_r_masked_intr___data___width 1
#define reg_dma_r_masked_intr___data___bit 2
#define reg_dma_r_masked_intr___in_eop___lsb 3
#define reg_dma_r_masked_intr___in_eop___width 1
#define reg_dma_r_masked_intr___in_eop___bit 3
#define reg_dma_r_masked_intr___stream_cmd___lsb 4
#define reg_dma_r_masked_intr___stream_cmd___width 1
#define reg_dma_r_masked_intr___stream_cmd___bit 4
#define reg_dma_r_masked_intr_offset 152
/* Register rw_stream_cmd, scope dma, type rw */
#define reg_dma_rw_stream_cmd___cmd___lsb 0
#define reg_dma_rw_stream_cmd___cmd___width 10
#define reg_dma_rw_stream_cmd___n___lsb 16
#define reg_dma_rw_stream_cmd___n___width 8
#define reg_dma_rw_stream_cmd___busy___lsb 31
#define reg_dma_rw_stream_cmd___busy___width 1
#define reg_dma_rw_stream_cmd___busy___bit 31
#define reg_dma_rw_stream_cmd_offset 156
/* Constants */
#define regk_dma_ack_pkt 0x00000100
#define regk_dma_anytime 0x00000001
#define regk_dma_array 0x00000008
#define regk_dma_burst 0x00000020
#define regk_dma_client 0x00000002
#define regk_dma_copy_next 0x00000010
#define regk_dma_copy_up 0x00000020
#define regk_dma_data_at_eol 0x00000001
#define regk_dma_dis_c 0x00000010
#define regk_dma_dis_g 0x00000020
#define regk_dma_idle 0x00000001
#define regk_dma_intern 0x00000004
#define regk_dma_load_c 0x00000200
#define regk_dma_load_c_n 0x00000280
#define regk_dma_load_c_next 0x00000240
#define regk_dma_load_d 0x00000140
#define regk_dma_load_g 0x00000300
#define regk_dma_load_g_down 0x000003c0
#define regk_dma_load_g_next 0x00000340
#define regk_dma_load_g_up 0x00000380
#define regk_dma_next_en 0x00000010
#define regk_dma_next_pkt 0x00000010
#define regk_dma_no 0x00000000
#define regk_dma_only_at_wait 0x00000000
#define regk_dma_restore 0x00000020
#define regk_dma_rst 0x00000001
#define regk_dma_running 0x00000004
#define regk_dma_rw_cfg_default 0x00000000
#define regk_dma_rw_cmd_default 0x00000000
#define regk_dma_rw_intr_mask_default 0x00000000
#define regk_dma_rw_stat_default 0x00000101
#define regk_dma_rw_stream_cmd_default 0x00000000
#define regk_dma_save_down 0x00000020
#define regk_dma_save_up 0x00000020
#define regk_dma_set_reg 0x00000050
#define regk_dma_set_w_size1 0x00000190
#define regk_dma_set_w_size2 0x000001a0
#define regk_dma_set_w_size4 0x000001c0
#define regk_dma_stopped 0x00000002
#define regk_dma_store_c 0x00000002
#define regk_dma_store_descr 0x00000000
#define regk_dma_store_g 0x00000004
#define regk_dma_store_md 0x00000001
#define regk_dma_sw 0x00000008
#define regk_dma_update_down 0x00000020
#define regk_dma_yes 0x00000001
#endif /* __dma_defs_asm_h */

View file

@ -0,0 +1,498 @@
#ifndef __eth_defs_asm_h
#define __eth_defs_asm_h
/*
* This file is autogenerated from
* file: ../../inst/eth/rtl/eth_regs.r
* id: eth_regs.r,v 1.11 2005/02/09 10:48:38 kriskn Exp
* last modfied: Mon Apr 11 16:07:03 2005
*
* by /n/asic/design/tools/rdesc/src/rdes2c -asm --outfile asm/eth_defs_asm.h ../../inst/eth/rtl/eth_regs.r
* id: $Id: eth_defs_asm.h,v 1.1 2005/04/24 18:31:04 starvik Exp $
* Any changes here will be lost.
*
* -*- buffer-read-only: t -*-
*/
#ifndef REG_FIELD
#define REG_FIELD( scope, reg, field, value ) \
REG_FIELD_X_( value, reg_##scope##_##reg##___##field##___lsb )
#define REG_FIELD_X_( value, shift ) ((value) << shift)
#endif
#ifndef REG_STATE
#define REG_STATE( scope, reg, field, symbolic_value ) \
REG_STATE_X_( regk_##scope##_##symbolic_value, reg_##scope##_##reg##___##field##___lsb )
#define REG_STATE_X_( k, shift ) (k << shift)
#endif
#ifndef REG_MASK
#define REG_MASK( scope, reg, field ) \
REG_MASK_X_( reg_##scope##_##reg##___##field##___width, reg_##scope##_##reg##___##field##___lsb )
#define REG_MASK_X_( width, lsb ) (((1 << width)-1) << lsb)
#endif
#ifndef REG_LSB
#define REG_LSB( scope, reg, field ) reg_##scope##_##reg##___##field##___lsb
#endif
#ifndef REG_BIT
#define REG_BIT( scope, reg, field ) reg_##scope##_##reg##___##field##___bit
#endif
#ifndef REG_ADDR
#define REG_ADDR( scope, inst, reg ) REG_ADDR_X_(inst, reg_##scope##_##reg##_offset)
#define REG_ADDR_X_( inst, offs ) ((inst) + offs)
#endif
#ifndef REG_ADDR_VECT
#define REG_ADDR_VECT( scope, inst, reg, index ) \
REG_ADDR_VECT_X_(inst, reg_##scope##_##reg##_offset, index, \
STRIDE_##scope##_##reg )
#define REG_ADDR_VECT_X_( inst, offs, index, stride ) \
((inst) + offs + (index) * stride)
#endif
/* Register rw_ma0_lo, scope eth, type rw */
#define reg_eth_rw_ma0_lo___addr___lsb 0
#define reg_eth_rw_ma0_lo___addr___width 32
#define reg_eth_rw_ma0_lo_offset 0
/* Register rw_ma0_hi, scope eth, type rw */
#define reg_eth_rw_ma0_hi___addr___lsb 0
#define reg_eth_rw_ma0_hi___addr___width 16
#define reg_eth_rw_ma0_hi_offset 4
/* Register rw_ma1_lo, scope eth, type rw */
#define reg_eth_rw_ma1_lo___addr___lsb 0
#define reg_eth_rw_ma1_lo___addr___width 32
#define reg_eth_rw_ma1_lo_offset 8
/* Register rw_ma1_hi, scope eth, type rw */
#define reg_eth_rw_ma1_hi___addr___lsb 0
#define reg_eth_rw_ma1_hi___addr___width 16
#define reg_eth_rw_ma1_hi_offset 12
/* Register rw_ga_lo, scope eth, type rw */
#define reg_eth_rw_ga_lo___table___lsb 0
#define reg_eth_rw_ga_lo___table___width 32
#define reg_eth_rw_ga_lo_offset 16
/* Register rw_ga_hi, scope eth, type rw */
#define reg_eth_rw_ga_hi___table___lsb 0
#define reg_eth_rw_ga_hi___table___width 32
#define reg_eth_rw_ga_hi_offset 20
/* Register rw_gen_ctrl, scope eth, type rw */
#define reg_eth_rw_gen_ctrl___en___lsb 0
#define reg_eth_rw_gen_ctrl___en___width 1
#define reg_eth_rw_gen_ctrl___en___bit 0
#define reg_eth_rw_gen_ctrl___phy___lsb 1
#define reg_eth_rw_gen_ctrl___phy___width 2
#define reg_eth_rw_gen_ctrl___protocol___lsb 3
#define reg_eth_rw_gen_ctrl___protocol___width 1
#define reg_eth_rw_gen_ctrl___protocol___bit 3
#define reg_eth_rw_gen_ctrl___loopback___lsb 4
#define reg_eth_rw_gen_ctrl___loopback___width 1
#define reg_eth_rw_gen_ctrl___loopback___bit 4
#define reg_eth_rw_gen_ctrl___flow_ctrl_dis___lsb 5
#define reg_eth_rw_gen_ctrl___flow_ctrl_dis___width 1
#define reg_eth_rw_gen_ctrl___flow_ctrl_dis___bit 5
#define reg_eth_rw_gen_ctrl_offset 24
/* Register rw_rec_ctrl, scope eth, type rw */
#define reg_eth_rw_rec_ctrl___ma0___lsb 0
#define reg_eth_rw_rec_ctrl___ma0___width 1
#define reg_eth_rw_rec_ctrl___ma0___bit 0
#define reg_eth_rw_rec_ctrl___ma1___lsb 1
#define reg_eth_rw_rec_ctrl___ma1___width 1
#define reg_eth_rw_rec_ctrl___ma1___bit 1
#define reg_eth_rw_rec_ctrl___individual___lsb 2
#define reg_eth_rw_rec_ctrl___individual___width 1
#define reg_eth_rw_rec_ctrl___individual___bit 2
#define reg_eth_rw_rec_ctrl___broadcast___lsb 3
#define reg_eth_rw_rec_ctrl___broadcast___width 1
#define reg_eth_rw_rec_ctrl___broadcast___bit 3
#define reg_eth_rw_rec_ctrl___undersize___lsb 4
#define reg_eth_rw_rec_ctrl___undersize___width 1
#define reg_eth_rw_rec_ctrl___undersize___bit 4
#define reg_eth_rw_rec_ctrl___oversize___lsb 5
#define reg_eth_rw_rec_ctrl___oversize___width 1
#define reg_eth_rw_rec_ctrl___oversize___bit 5
#define reg_eth_rw_rec_ctrl___bad_crc___lsb 6
#define reg_eth_rw_rec_ctrl___bad_crc___width 1
#define reg_eth_rw_rec_ctrl___bad_crc___bit 6
#define reg_eth_rw_rec_ctrl___duplex___lsb 7
#define reg_eth_rw_rec_ctrl___duplex___width 1
#define reg_eth_rw_rec_ctrl___duplex___bit 7
#define reg_eth_rw_rec_ctrl___max_size___lsb 8
#define reg_eth_rw_rec_ctrl___max_size___width 1
#define reg_eth_rw_rec_ctrl___max_size___bit 8
#define reg_eth_rw_rec_ctrl_offset 28
/* Register rw_tr_ctrl, scope eth, type rw */
#define reg_eth_rw_tr_ctrl___crc___lsb 0
#define reg_eth_rw_tr_ctrl___crc___width 1
#define reg_eth_rw_tr_ctrl___crc___bit 0
#define reg_eth_rw_tr_ctrl___pad___lsb 1
#define reg_eth_rw_tr_ctrl___pad___width 1
#define reg_eth_rw_tr_ctrl___pad___bit 1
#define reg_eth_rw_tr_ctrl___retry___lsb 2
#define reg_eth_rw_tr_ctrl___retry___width 1
#define reg_eth_rw_tr_ctrl___retry___bit 2
#define reg_eth_rw_tr_ctrl___ignore_col___lsb 3
#define reg_eth_rw_tr_ctrl___ignore_col___width 1
#define reg_eth_rw_tr_ctrl___ignore_col___bit 3
#define reg_eth_rw_tr_ctrl___cancel___lsb 4
#define reg_eth_rw_tr_ctrl___cancel___width 1
#define reg_eth_rw_tr_ctrl___cancel___bit 4
#define reg_eth_rw_tr_ctrl___hsh_delay___lsb 5
#define reg_eth_rw_tr_ctrl___hsh_delay___width 1
#define reg_eth_rw_tr_ctrl___hsh_delay___bit 5
#define reg_eth_rw_tr_ctrl___ignore_crs___lsb 6
#define reg_eth_rw_tr_ctrl___ignore_crs___width 1
#define reg_eth_rw_tr_ctrl___ignore_crs___bit 6
#define reg_eth_rw_tr_ctrl_offset 32
/* Register rw_clr_err, scope eth, type rw */
#define reg_eth_rw_clr_err___clr___lsb 0
#define reg_eth_rw_clr_err___clr___width 1
#define reg_eth_rw_clr_err___clr___bit 0
#define reg_eth_rw_clr_err_offset 36
/* Register rw_mgm_ctrl, scope eth, type rw */
#define reg_eth_rw_mgm_ctrl___mdio___lsb 0
#define reg_eth_rw_mgm_ctrl___mdio___width 1
#define reg_eth_rw_mgm_ctrl___mdio___bit 0
#define reg_eth_rw_mgm_ctrl___mdoe___lsb 1
#define reg_eth_rw_mgm_ctrl___mdoe___width 1
#define reg_eth_rw_mgm_ctrl___mdoe___bit 1
#define reg_eth_rw_mgm_ctrl___mdc___lsb 2
#define reg_eth_rw_mgm_ctrl___mdc___width 1
#define reg_eth_rw_mgm_ctrl___mdc___bit 2
#define reg_eth_rw_mgm_ctrl___phyclk___lsb 3
#define reg_eth_rw_mgm_ctrl___phyclk___width 1
#define reg_eth_rw_mgm_ctrl___phyclk___bit 3
#define reg_eth_rw_mgm_ctrl___txdata___lsb 4
#define reg_eth_rw_mgm_ctrl___txdata___width 4
#define reg_eth_rw_mgm_ctrl___txen___lsb 8
#define reg_eth_rw_mgm_ctrl___txen___width 1
#define reg_eth_rw_mgm_ctrl___txen___bit 8
#define reg_eth_rw_mgm_ctrl_offset 40
/* Register r_stat, scope eth, type r */
#define reg_eth_r_stat___mdio___lsb 0
#define reg_eth_r_stat___mdio___width 1
#define reg_eth_r_stat___mdio___bit 0
#define reg_eth_r_stat___exc_col___lsb 1
#define reg_eth_r_stat___exc_col___width 1
#define reg_eth_r_stat___exc_col___bit 1
#define reg_eth_r_stat___urun___lsb 2
#define reg_eth_r_stat___urun___width 1
#define reg_eth_r_stat___urun___bit 2
#define reg_eth_r_stat___phyclk___lsb 3
#define reg_eth_r_stat___phyclk___width 1
#define reg_eth_r_stat___phyclk___bit 3
#define reg_eth_r_stat___txdata___lsb 4
#define reg_eth_r_stat___txdata___width 4
#define reg_eth_r_stat___txen___lsb 8
#define reg_eth_r_stat___txen___width 1
#define reg_eth_r_stat___txen___bit 8
#define reg_eth_r_stat___col___lsb 9
#define reg_eth_r_stat___col___width 1
#define reg_eth_r_stat___col___bit 9
#define reg_eth_r_stat___crs___lsb 10
#define reg_eth_r_stat___crs___width 1
#define reg_eth_r_stat___crs___bit 10
#define reg_eth_r_stat___txclk___lsb 11
#define reg_eth_r_stat___txclk___width 1
#define reg_eth_r_stat___txclk___bit 11
#define reg_eth_r_stat___rxdata___lsb 12
#define reg_eth_r_stat___rxdata___width 4
#define reg_eth_r_stat___rxer___lsb 16
#define reg_eth_r_stat___rxer___width 1
#define reg_eth_r_stat___rxer___bit 16
#define reg_eth_r_stat___rxdv___lsb 17
#define reg_eth_r_stat___rxdv___width 1
#define reg_eth_r_stat___rxdv___bit 17
#define reg_eth_r_stat___rxclk___lsb 18
#define reg_eth_r_stat___rxclk___width 1
#define reg_eth_r_stat___rxclk___bit 18
#define reg_eth_r_stat_offset 44
/* Register rs_rec_cnt, scope eth, type rs */
#define reg_eth_rs_rec_cnt___crc_err___lsb 0
#define reg_eth_rs_rec_cnt___crc_err___width 8
#define reg_eth_rs_rec_cnt___align_err___lsb 8
#define reg_eth_rs_rec_cnt___align_err___width 8
#define reg_eth_rs_rec_cnt___oversize___lsb 16
#define reg_eth_rs_rec_cnt___oversize___width 8
#define reg_eth_rs_rec_cnt___congestion___lsb 24
#define reg_eth_rs_rec_cnt___congestion___width 8
#define reg_eth_rs_rec_cnt_offset 48
/* Register r_rec_cnt, scope eth, type r */
#define reg_eth_r_rec_cnt___crc_err___lsb 0
#define reg_eth_r_rec_cnt___crc_err___width 8
#define reg_eth_r_rec_cnt___align_err___lsb 8
#define reg_eth_r_rec_cnt___align_err___width 8
#define reg_eth_r_rec_cnt___oversize___lsb 16
#define reg_eth_r_rec_cnt___oversize___width 8
#define reg_eth_r_rec_cnt___congestion___lsb 24
#define reg_eth_r_rec_cnt___congestion___width 8
#define reg_eth_r_rec_cnt_offset 52
/* Register rs_tr_cnt, scope eth, type rs */
#define reg_eth_rs_tr_cnt___single_col___lsb 0
#define reg_eth_rs_tr_cnt___single_col___width 8
#define reg_eth_rs_tr_cnt___mult_col___lsb 8
#define reg_eth_rs_tr_cnt___mult_col___width 8
#define reg_eth_rs_tr_cnt___late_col___lsb 16
#define reg_eth_rs_tr_cnt___late_col___width 8
#define reg_eth_rs_tr_cnt___deferred___lsb 24
#define reg_eth_rs_tr_cnt___deferred___width 8
#define reg_eth_rs_tr_cnt_offset 56
/* Register r_tr_cnt, scope eth, type r */
#define reg_eth_r_tr_cnt___single_col___lsb 0
#define reg_eth_r_tr_cnt___single_col___width 8
#define reg_eth_r_tr_cnt___mult_col___lsb 8
#define reg_eth_r_tr_cnt___mult_col___width 8
#define reg_eth_r_tr_cnt___late_col___lsb 16
#define reg_eth_r_tr_cnt___late_col___width 8
#define reg_eth_r_tr_cnt___deferred___lsb 24
#define reg_eth_r_tr_cnt___deferred___width 8
#define reg_eth_r_tr_cnt_offset 60
/* Register rs_phy_cnt, scope eth, type rs */
#define reg_eth_rs_phy_cnt___carrier_loss___lsb 0
#define reg_eth_rs_phy_cnt___carrier_loss___width 8
#define reg_eth_rs_phy_cnt___sqe_err___lsb 8
#define reg_eth_rs_phy_cnt___sqe_err___width 8
#define reg_eth_rs_phy_cnt_offset 64
/* Register r_phy_cnt, scope eth, type r */
#define reg_eth_r_phy_cnt___carrier_loss___lsb 0
#define reg_eth_r_phy_cnt___carrier_loss___width 8
#define reg_eth_r_phy_cnt___sqe_err___lsb 8
#define reg_eth_r_phy_cnt___sqe_err___width 8
#define reg_eth_r_phy_cnt_offset 68
/* Register rw_test_ctrl, scope eth, type rw */
#define reg_eth_rw_test_ctrl___snmp_inc___lsb 0
#define reg_eth_rw_test_ctrl___snmp_inc___width 1
#define reg_eth_rw_test_ctrl___snmp_inc___bit 0
#define reg_eth_rw_test_ctrl___snmp___lsb 1
#define reg_eth_rw_test_ctrl___snmp___width 1
#define reg_eth_rw_test_ctrl___snmp___bit 1
#define reg_eth_rw_test_ctrl___backoff___lsb 2
#define reg_eth_rw_test_ctrl___backoff___width 1
#define reg_eth_rw_test_ctrl___backoff___bit 2
#define reg_eth_rw_test_ctrl_offset 72
/* Register rw_intr_mask, scope eth, type rw */
#define reg_eth_rw_intr_mask___crc___lsb 0
#define reg_eth_rw_intr_mask___crc___width 1
#define reg_eth_rw_intr_mask___crc___bit 0
#define reg_eth_rw_intr_mask___align___lsb 1
#define reg_eth_rw_intr_mask___align___width 1
#define reg_eth_rw_intr_mask___align___bit 1
#define reg_eth_rw_intr_mask___oversize___lsb 2
#define reg_eth_rw_intr_mask___oversize___width 1
#define reg_eth_rw_intr_mask___oversize___bit 2
#define reg_eth_rw_intr_mask___congestion___lsb 3
#define reg_eth_rw_intr_mask___congestion___width 1
#define reg_eth_rw_intr_mask___congestion___bit 3
#define reg_eth_rw_intr_mask___single_col___lsb 4
#define reg_eth_rw_intr_mask___single_col___width 1
#define reg_eth_rw_intr_mask___single_col___bit 4
#define reg_eth_rw_intr_mask___mult_col___lsb 5
#define reg_eth_rw_intr_mask___mult_col___width 1
#define reg_eth_rw_intr_mask___mult_col___bit 5
#define reg_eth_rw_intr_mask___late_col___lsb 6
#define reg_eth_rw_intr_mask___late_col___width 1
#define reg_eth_rw_intr_mask___late_col___bit 6
#define reg_eth_rw_intr_mask___deferred___lsb 7
#define reg_eth_rw_intr_mask___deferred___width 1
#define reg_eth_rw_intr_mask___deferred___bit 7
#define reg_eth_rw_intr_mask___carrier_loss___lsb 8
#define reg_eth_rw_intr_mask___carrier_loss___width 1
#define reg_eth_rw_intr_mask___carrier_loss___bit 8
#define reg_eth_rw_intr_mask___sqe_test_err___lsb 9
#define reg_eth_rw_intr_mask___sqe_test_err___width 1
#define reg_eth_rw_intr_mask___sqe_test_err___bit 9
#define reg_eth_rw_intr_mask___orun___lsb 10
#define reg_eth_rw_intr_mask___orun___width 1
#define reg_eth_rw_intr_mask___orun___bit 10
#define reg_eth_rw_intr_mask___urun___lsb 11
#define reg_eth_rw_intr_mask___urun___width 1
#define reg_eth_rw_intr_mask___urun___bit 11
#define reg_eth_rw_intr_mask___excessive_col___lsb 12
#define reg_eth_rw_intr_mask___excessive_col___width 1
#define reg_eth_rw_intr_mask___excessive_col___bit 12
#define reg_eth_rw_intr_mask___mdio___lsb 13
#define reg_eth_rw_intr_mask___mdio___width 1
#define reg_eth_rw_intr_mask___mdio___bit 13
#define reg_eth_rw_intr_mask_offset 76
/* Register rw_ack_intr, scope eth, type rw */
#define reg_eth_rw_ack_intr___crc___lsb 0
#define reg_eth_rw_ack_intr___crc___width 1
#define reg_eth_rw_ack_intr___crc___bit 0
#define reg_eth_rw_ack_intr___align___lsb 1
#define reg_eth_rw_ack_intr___align___width 1
#define reg_eth_rw_ack_intr___align___bit 1
#define reg_eth_rw_ack_intr___oversize___lsb 2
#define reg_eth_rw_ack_intr___oversize___width 1
#define reg_eth_rw_ack_intr___oversize___bit 2
#define reg_eth_rw_ack_intr___congestion___lsb 3
#define reg_eth_rw_ack_intr___congestion___width 1
#define reg_eth_rw_ack_intr___congestion___bit 3
#define reg_eth_rw_ack_intr___single_col___lsb 4
#define reg_eth_rw_ack_intr___single_col___width 1
#define reg_eth_rw_ack_intr___single_col___bit 4
#define reg_eth_rw_ack_intr___mult_col___lsb 5
#define reg_eth_rw_ack_intr___mult_col___width 1
#define reg_eth_rw_ack_intr___mult_col___bit 5
#define reg_eth_rw_ack_intr___late_col___lsb 6
#define reg_eth_rw_ack_intr___late_col___width 1
#define reg_eth_rw_ack_intr___late_col___bit 6
#define reg_eth_rw_ack_intr___deferred___lsb 7
#define reg_eth_rw_ack_intr___deferred___width 1
#define reg_eth_rw_ack_intr___deferred___bit 7
#define reg_eth_rw_ack_intr___carrier_loss___lsb 8
#define reg_eth_rw_ack_intr___carrier_loss___width 1
#define reg_eth_rw_ack_intr___carrier_loss___bit 8
#define reg_eth_rw_ack_intr___sqe_test_err___lsb 9
#define reg_eth_rw_ack_intr___sqe_test_err___width 1
#define reg_eth_rw_ack_intr___sqe_test_err___bit 9
#define reg_eth_rw_ack_intr___orun___lsb 10
#define reg_eth_rw_ack_intr___orun___width 1
#define reg_eth_rw_ack_intr___orun___bit 10
#define reg_eth_rw_ack_intr___urun___lsb 11
#define reg_eth_rw_ack_intr___urun___width 1
#define reg_eth_rw_ack_intr___urun___bit 11
#define reg_eth_rw_ack_intr___excessive_col___lsb 12
#define reg_eth_rw_ack_intr___excessive_col___width 1
#define reg_eth_rw_ack_intr___excessive_col___bit 12
#define reg_eth_rw_ack_intr___mdio___lsb 13
#define reg_eth_rw_ack_intr___mdio___width 1
#define reg_eth_rw_ack_intr___mdio___bit 13
#define reg_eth_rw_ack_intr_offset 80
/* Register r_intr, scope eth, type r */
#define reg_eth_r_intr___crc___lsb 0
#define reg_eth_r_intr___crc___width 1
#define reg_eth_r_intr___crc___bit 0
#define reg_eth_r_intr___align___lsb 1
#define reg_eth_r_intr___align___width 1
#define reg_eth_r_intr___align___bit 1
#define reg_eth_r_intr___oversize___lsb 2
#define reg_eth_r_intr___oversize___width 1
#define reg_eth_r_intr___oversize___bit 2
#define reg_eth_r_intr___congestion___lsb 3
#define reg_eth_r_intr___congestion___width 1
#define reg_eth_r_intr___congestion___bit 3
#define reg_eth_r_intr___single_col___lsb 4
#define reg_eth_r_intr___single_col___width 1
#define reg_eth_r_intr___single_col___bit 4
#define reg_eth_r_intr___mult_col___lsb 5
#define reg_eth_r_intr___mult_col___width 1
#define reg_eth_r_intr___mult_col___bit 5
#define reg_eth_r_intr___late_col___lsb 6
#define reg_eth_r_intr___late_col___width 1
#define reg_eth_r_intr___late_col___bit 6
#define reg_eth_r_intr___deferred___lsb 7
#define reg_eth_r_intr___deferred___width 1
#define reg_eth_r_intr___deferred___bit 7
#define reg_eth_r_intr___carrier_loss___lsb 8
#define reg_eth_r_intr___carrier_loss___width 1
#define reg_eth_r_intr___carrier_loss___bit 8
#define reg_eth_r_intr___sqe_test_err___lsb 9
#define reg_eth_r_intr___sqe_test_err___width 1
#define reg_eth_r_intr___sqe_test_err___bit 9
#define reg_eth_r_intr___orun___lsb 10
#define reg_eth_r_intr___orun___width 1
#define reg_eth_r_intr___orun___bit 10
#define reg_eth_r_intr___urun___lsb 11
#define reg_eth_r_intr___urun___width 1
#define reg_eth_r_intr___urun___bit 11
#define reg_eth_r_intr___excessive_col___lsb 12
#define reg_eth_r_intr___excessive_col___width 1
#define reg_eth_r_intr___excessive_col___bit 12
#define reg_eth_r_intr___mdio___lsb 13
#define reg_eth_r_intr___mdio___width 1
#define reg_eth_r_intr___mdio___bit 13
#define reg_eth_r_intr_offset 84
/* Register r_masked_intr, scope eth, type r */
#define reg_eth_r_masked_intr___crc___lsb 0
#define reg_eth_r_masked_intr___crc___width 1
#define reg_eth_r_masked_intr___crc___bit 0
#define reg_eth_r_masked_intr___align___lsb 1
#define reg_eth_r_masked_intr___align___width 1
#define reg_eth_r_masked_intr___align___bit 1
#define reg_eth_r_masked_intr___oversize___lsb 2
#define reg_eth_r_masked_intr___oversize___width 1
#define reg_eth_r_masked_intr___oversize___bit 2
#define reg_eth_r_masked_intr___congestion___lsb 3
#define reg_eth_r_masked_intr___congestion___width 1
#define reg_eth_r_masked_intr___congestion___bit 3
#define reg_eth_r_masked_intr___single_col___lsb 4
#define reg_eth_r_masked_intr___single_col___width 1
#define reg_eth_r_masked_intr___single_col___bit 4
#define reg_eth_r_masked_intr___mult_col___lsb 5
#define reg_eth_r_masked_intr___mult_col___width 1
#define reg_eth_r_masked_intr___mult_col___bit 5
#define reg_eth_r_masked_intr___late_col___lsb 6
#define reg_eth_r_masked_intr___late_col___width 1
#define reg_eth_r_masked_intr___late_col___bit 6
#define reg_eth_r_masked_intr___deferred___lsb 7
#define reg_eth_r_masked_intr___deferred___width 1
#define reg_eth_r_masked_intr___deferred___bit 7
#define reg_eth_r_masked_intr___carrier_loss___lsb 8
#define reg_eth_r_masked_intr___carrier_loss___width 1
#define reg_eth_r_masked_intr___carrier_loss___bit 8
#define reg_eth_r_masked_intr___sqe_test_err___lsb 9
#define reg_eth_r_masked_intr___sqe_test_err___width 1
#define reg_eth_r_masked_intr___sqe_test_err___bit 9
#define reg_eth_r_masked_intr___orun___lsb 10
#define reg_eth_r_masked_intr___orun___width 1
#define reg_eth_r_masked_intr___orun___bit 10
#define reg_eth_r_masked_intr___urun___lsb 11
#define reg_eth_r_masked_intr___urun___width 1
#define reg_eth_r_masked_intr___urun___bit 11
#define reg_eth_r_masked_intr___excessive_col___lsb 12
#define reg_eth_r_masked_intr___excessive_col___width 1
#define reg_eth_r_masked_intr___excessive_col___bit 12
#define reg_eth_r_masked_intr___mdio___lsb 13
#define reg_eth_r_masked_intr___mdio___width 1
#define reg_eth_r_masked_intr___mdio___bit 13
#define reg_eth_r_masked_intr_offset 88
/* Constants */
#define regk_eth_discard 0x00000000
#define regk_eth_ether 0x00000000
#define regk_eth_full 0x00000001
#define regk_eth_half 0x00000000
#define regk_eth_hsh 0x00000001
#define regk_eth_mii 0x00000001
#define regk_eth_mii_clk 0x00000000
#define regk_eth_mii_rec 0x00000002
#define regk_eth_no 0x00000000
#define regk_eth_rec 0x00000001
#define regk_eth_rw_ga_hi_default 0x00000000
#define regk_eth_rw_ga_lo_default 0x00000000
#define regk_eth_rw_gen_ctrl_default 0x00000000
#define regk_eth_rw_intr_mask_default 0x00000000
#define regk_eth_rw_ma0_hi_default 0x00000000
#define regk_eth_rw_ma0_lo_default 0x00000000
#define regk_eth_rw_ma1_hi_default 0x00000000
#define regk_eth_rw_ma1_lo_default 0x00000000
#define regk_eth_rw_mgm_ctrl_default 0x00000000
#define regk_eth_rw_test_ctrl_default 0x00000000
#define regk_eth_size1518 0x00000000
#define regk_eth_size1522 0x00000001
#define regk_eth_yes 0x00000001
#endif /* __eth_defs_asm_h */

View file

@ -0,0 +1,276 @@
#ifndef __gio_defs_asm_h
#define __gio_defs_asm_h
/*
* This file is autogenerated from
* file: ../../inst/gio/rtl/gio_regs.r
* id: gio_regs.r,v 1.5 2005/02/04 09:43:21 perz Exp
* last modfied: Mon Apr 11 16:07:47 2005
*
* by /n/asic/design/tools/rdesc/src/rdes2c -asm --outfile asm/gio_defs_asm.h ../../inst/gio/rtl/gio_regs.r
* id: $Id: gio_defs_asm.h,v 1.1 2005/04/24 18:31:04 starvik Exp $
* Any changes here will be lost.
*
* -*- buffer-read-only: t -*-
*/
#ifndef REG_FIELD
#define REG_FIELD( scope, reg, field, value ) \
REG_FIELD_X_( value, reg_##scope##_##reg##___##field##___lsb )
#define REG_FIELD_X_( value, shift ) ((value) << shift)
#endif
#ifndef REG_STATE
#define REG_STATE( scope, reg, field, symbolic_value ) \
REG_STATE_X_( regk_##scope##_##symbolic_value, reg_##scope##_##reg##___##field##___lsb )
#define REG_STATE_X_( k, shift ) (k << shift)
#endif
#ifndef REG_MASK
#define REG_MASK( scope, reg, field ) \
REG_MASK_X_( reg_##scope##_##reg##___##field##___width, reg_##scope##_##reg##___##field##___lsb )
#define REG_MASK_X_( width, lsb ) (((1 << width)-1) << lsb)
#endif
#ifndef REG_LSB
#define REG_LSB( scope, reg, field ) reg_##scope##_##reg##___##field##___lsb
#endif
#ifndef REG_BIT
#define REG_BIT( scope, reg, field ) reg_##scope##_##reg##___##field##___bit
#endif
#ifndef REG_ADDR
#define REG_ADDR( scope, inst, reg ) REG_ADDR_X_(inst, reg_##scope##_##reg##_offset)
#define REG_ADDR_X_( inst, offs ) ((inst) + offs)
#endif
#ifndef REG_ADDR_VECT
#define REG_ADDR_VECT( scope, inst, reg, index ) \
REG_ADDR_VECT_X_(inst, reg_##scope##_##reg##_offset, index, \
STRIDE_##scope##_##reg )
#define REG_ADDR_VECT_X_( inst, offs, index, stride ) \
((inst) + offs + (index) * stride)
#endif
/* Register rw_pa_dout, scope gio, type rw */
#define reg_gio_rw_pa_dout___data___lsb 0
#define reg_gio_rw_pa_dout___data___width 8
#define reg_gio_rw_pa_dout_offset 0
/* Register r_pa_din, scope gio, type r */
#define reg_gio_r_pa_din___data___lsb 0
#define reg_gio_r_pa_din___data___width 8
#define reg_gio_r_pa_din_offset 4
/* Register rw_pa_oe, scope gio, type rw */
#define reg_gio_rw_pa_oe___oe___lsb 0
#define reg_gio_rw_pa_oe___oe___width 8
#define reg_gio_rw_pa_oe_offset 8
/* Register rw_intr_cfg, scope gio, type rw */
#define reg_gio_rw_intr_cfg___pa0___lsb 0
#define reg_gio_rw_intr_cfg___pa0___width 3
#define reg_gio_rw_intr_cfg___pa1___lsb 3
#define reg_gio_rw_intr_cfg___pa1___width 3
#define reg_gio_rw_intr_cfg___pa2___lsb 6
#define reg_gio_rw_intr_cfg___pa2___width 3
#define reg_gio_rw_intr_cfg___pa3___lsb 9
#define reg_gio_rw_intr_cfg___pa3___width 3
#define reg_gio_rw_intr_cfg___pa4___lsb 12
#define reg_gio_rw_intr_cfg___pa4___width 3
#define reg_gio_rw_intr_cfg___pa5___lsb 15
#define reg_gio_rw_intr_cfg___pa5___width 3
#define reg_gio_rw_intr_cfg___pa6___lsb 18
#define reg_gio_rw_intr_cfg___pa6___width 3
#define reg_gio_rw_intr_cfg___pa7___lsb 21
#define reg_gio_rw_intr_cfg___pa7___width 3
#define reg_gio_rw_intr_cfg_offset 12
/* Register rw_intr_mask, scope gio, type rw */
#define reg_gio_rw_intr_mask___pa0___lsb 0
#define reg_gio_rw_intr_mask___pa0___width 1
#define reg_gio_rw_intr_mask___pa0___bit 0
#define reg_gio_rw_intr_mask___pa1___lsb 1
#define reg_gio_rw_intr_mask___pa1___width 1
#define reg_gio_rw_intr_mask___pa1___bit 1
#define reg_gio_rw_intr_mask___pa2___lsb 2
#define reg_gio_rw_intr_mask___pa2___width 1
#define reg_gio_rw_intr_mask___pa2___bit 2
#define reg_gio_rw_intr_mask___pa3___lsb 3
#define reg_gio_rw_intr_mask___pa3___width 1
#define reg_gio_rw_intr_mask___pa3___bit 3
#define reg_gio_rw_intr_mask___pa4___lsb 4
#define reg_gio_rw_intr_mask___pa4___width 1
#define reg_gio_rw_intr_mask___pa4___bit 4
#define reg_gio_rw_intr_mask___pa5___lsb 5
#define reg_gio_rw_intr_mask___pa5___width 1
#define reg_gio_rw_intr_mask___pa5___bit 5
#define reg_gio_rw_intr_mask___pa6___lsb 6
#define reg_gio_rw_intr_mask___pa6___width 1
#define reg_gio_rw_intr_mask___pa6___bit 6
#define reg_gio_rw_intr_mask___pa7___lsb 7
#define reg_gio_rw_intr_mask___pa7___width 1
#define reg_gio_rw_intr_mask___pa7___bit 7
#define reg_gio_rw_intr_mask_offset 16
/* Register rw_ack_intr, scope gio, type rw */
#define reg_gio_rw_ack_intr___pa0___lsb 0
#define reg_gio_rw_ack_intr___pa0___width 1
#define reg_gio_rw_ack_intr___pa0___bit 0
#define reg_gio_rw_ack_intr___pa1___lsb 1
#define reg_gio_rw_ack_intr___pa1___width 1
#define reg_gio_rw_ack_intr___pa1___bit 1
#define reg_gio_rw_ack_intr___pa2___lsb 2
#define reg_gio_rw_ack_intr___pa2___width 1
#define reg_gio_rw_ack_intr___pa2___bit 2
#define reg_gio_rw_ack_intr___pa3___lsb 3
#define reg_gio_rw_ack_intr___pa3___width 1
#define reg_gio_rw_ack_intr___pa3___bit 3
#define reg_gio_rw_ack_intr___pa4___lsb 4
#define reg_gio_rw_ack_intr___pa4___width 1
#define reg_gio_rw_ack_intr___pa4___bit 4
#define reg_gio_rw_ack_intr___pa5___lsb 5
#define reg_gio_rw_ack_intr___pa5___width 1
#define reg_gio_rw_ack_intr___pa5___bit 5
#define reg_gio_rw_ack_intr___pa6___lsb 6
#define reg_gio_rw_ack_intr___pa6___width 1
#define reg_gio_rw_ack_intr___pa6___bit 6
#define reg_gio_rw_ack_intr___pa7___lsb 7
#define reg_gio_rw_ack_intr___pa7___width 1
#define reg_gio_rw_ack_intr___pa7___bit 7
#define reg_gio_rw_ack_intr_offset 20
/* Register r_intr, scope gio, type r */
#define reg_gio_r_intr___pa0___lsb 0
#define reg_gio_r_intr___pa0___width 1
#define reg_gio_r_intr___pa0___bit 0
#define reg_gio_r_intr___pa1___lsb 1
#define reg_gio_r_intr___pa1___width 1
#define reg_gio_r_intr___pa1___bit 1
#define reg_gio_r_intr___pa2___lsb 2
#define reg_gio_r_intr___pa2___width 1
#define reg_gio_r_intr___pa2___bit 2
#define reg_gio_r_intr___pa3___lsb 3
#define reg_gio_r_intr___pa3___width 1
#define reg_gio_r_intr___pa3___bit 3
#define reg_gio_r_intr___pa4___lsb 4
#define reg_gio_r_intr___pa4___width 1
#define reg_gio_r_intr___pa4___bit 4
#define reg_gio_r_intr___pa5___lsb 5
#define reg_gio_r_intr___pa5___width 1
#define reg_gio_r_intr___pa5___bit 5
#define reg_gio_r_intr___pa6___lsb 6
#define reg_gio_r_intr___pa6___width 1
#define reg_gio_r_intr___pa6___bit 6
#define reg_gio_r_intr___pa7___lsb 7
#define reg_gio_r_intr___pa7___width 1
#define reg_gio_r_intr___pa7___bit 7
#define reg_gio_r_intr_offset 24
/* Register r_masked_intr, scope gio, type r */
#define reg_gio_r_masked_intr___pa0___lsb 0
#define reg_gio_r_masked_intr___pa0___width 1
#define reg_gio_r_masked_intr___pa0___bit 0
#define reg_gio_r_masked_intr___pa1___lsb 1
#define reg_gio_r_masked_intr___pa1___width 1
#define reg_gio_r_masked_intr___pa1___bit 1
#define reg_gio_r_masked_intr___pa2___lsb 2
#define reg_gio_r_masked_intr___pa2___width 1
#define reg_gio_r_masked_intr___pa2___bit 2
#define reg_gio_r_masked_intr___pa3___lsb 3
#define reg_gio_r_masked_intr___pa3___width 1
#define reg_gio_r_masked_intr___pa3___bit 3
#define reg_gio_r_masked_intr___pa4___lsb 4
#define reg_gio_r_masked_intr___pa4___width 1
#define reg_gio_r_masked_intr___pa4___bit 4
#define reg_gio_r_masked_intr___pa5___lsb 5
#define reg_gio_r_masked_intr___pa5___width 1
#define reg_gio_r_masked_intr___pa5___bit 5
#define reg_gio_r_masked_intr___pa6___lsb 6
#define reg_gio_r_masked_intr___pa6___width 1
#define reg_gio_r_masked_intr___pa6___bit 6
#define reg_gio_r_masked_intr___pa7___lsb 7
#define reg_gio_r_masked_intr___pa7___width 1
#define reg_gio_r_masked_intr___pa7___bit 7
#define reg_gio_r_masked_intr_offset 28
/* Register rw_pb_dout, scope gio, type rw */
#define reg_gio_rw_pb_dout___data___lsb 0
#define reg_gio_rw_pb_dout___data___width 18
#define reg_gio_rw_pb_dout_offset 32
/* Register r_pb_din, scope gio, type r */
#define reg_gio_r_pb_din___data___lsb 0
#define reg_gio_r_pb_din___data___width 18
#define reg_gio_r_pb_din_offset 36
/* Register rw_pb_oe, scope gio, type rw */
#define reg_gio_rw_pb_oe___oe___lsb 0
#define reg_gio_rw_pb_oe___oe___width 18
#define reg_gio_rw_pb_oe_offset 40
/* Register rw_pc_dout, scope gio, type rw */
#define reg_gio_rw_pc_dout___data___lsb 0
#define reg_gio_rw_pc_dout___data___width 18
#define reg_gio_rw_pc_dout_offset 48
/* Register r_pc_din, scope gio, type r */
#define reg_gio_r_pc_din___data___lsb 0
#define reg_gio_r_pc_din___data___width 18
#define reg_gio_r_pc_din_offset 52
/* Register rw_pc_oe, scope gio, type rw */
#define reg_gio_rw_pc_oe___oe___lsb 0
#define reg_gio_rw_pc_oe___oe___width 18
#define reg_gio_rw_pc_oe_offset 56
/* Register rw_pd_dout, scope gio, type rw */
#define reg_gio_rw_pd_dout___data___lsb 0
#define reg_gio_rw_pd_dout___data___width 18
#define reg_gio_rw_pd_dout_offset 64
/* Register r_pd_din, scope gio, type r */
#define reg_gio_r_pd_din___data___lsb 0
#define reg_gio_r_pd_din___data___width 18
#define reg_gio_r_pd_din_offset 68
/* Register rw_pd_oe, scope gio, type rw */
#define reg_gio_rw_pd_oe___oe___lsb 0
#define reg_gio_rw_pd_oe___oe___width 18
#define reg_gio_rw_pd_oe_offset 72
/* Register rw_pe_dout, scope gio, type rw */
#define reg_gio_rw_pe_dout___data___lsb 0
#define reg_gio_rw_pe_dout___data___width 18
#define reg_gio_rw_pe_dout_offset 80
/* Register r_pe_din, scope gio, type r */
#define reg_gio_r_pe_din___data___lsb 0
#define reg_gio_r_pe_din___data___width 18
#define reg_gio_r_pe_din_offset 84
/* Register rw_pe_oe, scope gio, type rw */
#define reg_gio_rw_pe_oe___oe___lsb 0
#define reg_gio_rw_pe_oe___oe___width 18
#define reg_gio_rw_pe_oe_offset 88
/* Constants */
#define regk_gio_anyedge 0x00000007
#define regk_gio_hi 0x00000001
#define regk_gio_lo 0x00000002
#define regk_gio_negedge 0x00000006
#define regk_gio_no 0x00000000
#define regk_gio_off 0x00000000
#define regk_gio_posedge 0x00000005
#define regk_gio_rw_intr_cfg_default 0x00000000
#define regk_gio_rw_intr_mask_default 0x00000000
#define regk_gio_rw_pa_oe_default 0x00000000
#define regk_gio_rw_pb_oe_default 0x00000000
#define regk_gio_rw_pc_oe_default 0x00000000
#define regk_gio_rw_pd_oe_default 0x00000000
#define regk_gio_rw_pe_oe_default 0x00000000
#define regk_gio_set 0x00000003
#define regk_gio_yes 0x00000001
#endif /* __gio_defs_asm_h */

View file

@ -0,0 +1,38 @@
/* Interrupt vector numbers autogenerated by /n/asic/design/tools/rdesc/src/rdes2intr version
from ../../inst/intr_vect/rtl/guinness/ivmask.config.r
version . */
#ifndef _______INST_INTR_VECT_RTL_GUINNESS_IVMASK_CONFIG_R
#define _______INST_INTR_VECT_RTL_GUINNESS_IVMASK_CONFIG_R
#define MEMARB_INTR_VECT 0x31
#define GEN_IO_INTR_VECT 0x32
#define IOP0_INTR_VECT 0x33
#define IOP1_INTR_VECT 0x34
#define IOP2_INTR_VECT 0x35
#define IOP3_INTR_VECT 0x36
#define DMA0_INTR_VECT 0x37
#define DMA1_INTR_VECT 0x38
#define DMA2_INTR_VECT 0x39
#define DMA3_INTR_VECT 0x3a
#define DMA4_INTR_VECT 0x3b
#define DMA5_INTR_VECT 0x3c
#define DMA6_INTR_VECT 0x3d
#define DMA7_INTR_VECT 0x3e
#define DMA8_INTR_VECT 0x3f
#define DMA9_INTR_VECT 0x40
#define ATA_INTR_VECT 0x41
#define SSER0_INTR_VECT 0x42
#define SSER1_INTR_VECT 0x43
#define SER0_INTR_VECT 0x44
#define SER1_INTR_VECT 0x45
#define SER2_INTR_VECT 0x46
#define SER3_INTR_VECT 0x47
#define P21_INTR_VECT 0x48
#define ETH0_INTR_VECT 0x49
#define ETH1_INTR_VECT 0x4a
#define TIMER_INTR_VECT 0x4b
#define BIF_ARB_INTR_VECT 0x4c
#define BIF_DMA_INTR_VECT 0x4d
#define EXT_INTR_VECT 0x4e
#endif

View file

@ -0,0 +1,355 @@
#ifndef __intr_vect_defs_asm_h
#define __intr_vect_defs_asm_h
/*
* This file is autogenerated from
* file: ../../inst/intr_vect/rtl/guinness/ivmask.config.r
* id: ivmask.config.r,v 1.4 2005/02/15 16:05:38 stefans Exp
* last modfied: Mon Apr 11 16:08:03 2005
*
* by /n/asic/design/tools/rdesc/src/rdes2c -asm --outfile asm/intr_vect_defs_asm.h ../../inst/intr_vect/rtl/guinness/ivmask.config.r
* id: $Id: intr_vect_defs_asm.h,v 1.1 2005/04/24 18:31:04 starvik Exp $
* Any changes here will be lost.
*
* -*- buffer-read-only: t -*-
*/
#ifndef REG_FIELD
#define REG_FIELD( scope, reg, field, value ) \
REG_FIELD_X_( value, reg_##scope##_##reg##___##field##___lsb )
#define REG_FIELD_X_( value, shift ) ((value) << shift)
#endif
#ifndef REG_STATE
#define REG_STATE( scope, reg, field, symbolic_value ) \
REG_STATE_X_( regk_##scope##_##symbolic_value, reg_##scope##_##reg##___##field##___lsb )
#define REG_STATE_X_( k, shift ) (k << shift)
#endif
#ifndef REG_MASK
#define REG_MASK( scope, reg, field ) \
REG_MASK_X_( reg_##scope##_##reg##___##field##___width, reg_##scope##_##reg##___##field##___lsb )
#define REG_MASK_X_( width, lsb ) (((1 << width)-1) << lsb)
#endif
#ifndef REG_LSB
#define REG_LSB( scope, reg, field ) reg_##scope##_##reg##___##field##___lsb
#endif
#ifndef REG_BIT
#define REG_BIT( scope, reg, field ) reg_##scope##_##reg##___##field##___bit
#endif
#ifndef REG_ADDR
#define REG_ADDR( scope, inst, reg ) REG_ADDR_X_(inst, reg_##scope##_##reg##_offset)
#define REG_ADDR_X_( inst, offs ) ((inst) + offs)
#endif
#ifndef REG_ADDR_VECT
#define REG_ADDR_VECT( scope, inst, reg, index ) \
REG_ADDR_VECT_X_(inst, reg_##scope##_##reg##_offset, index, \
STRIDE_##scope##_##reg )
#define REG_ADDR_VECT_X_( inst, offs, index, stride ) \
((inst) + offs + (index) * stride)
#endif
/* Register rw_mask, scope intr_vect, type rw */
#define reg_intr_vect_rw_mask___memarb___lsb 0
#define reg_intr_vect_rw_mask___memarb___width 1
#define reg_intr_vect_rw_mask___memarb___bit 0
#define reg_intr_vect_rw_mask___gen_io___lsb 1
#define reg_intr_vect_rw_mask___gen_io___width 1
#define reg_intr_vect_rw_mask___gen_io___bit 1
#define reg_intr_vect_rw_mask___iop0___lsb 2
#define reg_intr_vect_rw_mask___iop0___width 1
#define reg_intr_vect_rw_mask___iop0___bit 2
#define reg_intr_vect_rw_mask___iop1___lsb 3
#define reg_intr_vect_rw_mask___iop1___width 1
#define reg_intr_vect_rw_mask___iop1___bit 3
#define reg_intr_vect_rw_mask___iop2___lsb 4
#define reg_intr_vect_rw_mask___iop2___width 1
#define reg_intr_vect_rw_mask___iop2___bit 4
#define reg_intr_vect_rw_mask___iop3___lsb 5
#define reg_intr_vect_rw_mask___iop3___width 1
#define reg_intr_vect_rw_mask___iop3___bit 5
#define reg_intr_vect_rw_mask___dma0___lsb 6
#define reg_intr_vect_rw_mask___dma0___width 1
#define reg_intr_vect_rw_mask___dma0___bit 6
#define reg_intr_vect_rw_mask___dma1___lsb 7
#define reg_intr_vect_rw_mask___dma1___width 1
#define reg_intr_vect_rw_mask___dma1___bit 7
#define reg_intr_vect_rw_mask___dma2___lsb 8
#define reg_intr_vect_rw_mask___dma2___width 1
#define reg_intr_vect_rw_mask___dma2___bit 8
#define reg_intr_vect_rw_mask___dma3___lsb 9
#define reg_intr_vect_rw_mask___dma3___width 1
#define reg_intr_vect_rw_mask___dma3___bit 9
#define reg_intr_vect_rw_mask___dma4___lsb 10
#define reg_intr_vect_rw_mask___dma4___width 1
#define reg_intr_vect_rw_mask___dma4___bit 10
#define reg_intr_vect_rw_mask___dma5___lsb 11
#define reg_intr_vect_rw_mask___dma5___width 1
#define reg_intr_vect_rw_mask___dma5___bit 11
#define reg_intr_vect_rw_mask___dma6___lsb 12
#define reg_intr_vect_rw_mask___dma6___width 1
#define reg_intr_vect_rw_mask___dma6___bit 12
#define reg_intr_vect_rw_mask___dma7___lsb 13
#define reg_intr_vect_rw_mask___dma7___width 1
#define reg_intr_vect_rw_mask___dma7___bit 13
#define reg_intr_vect_rw_mask___dma8___lsb 14
#define reg_intr_vect_rw_mask___dma8___width 1
#define reg_intr_vect_rw_mask___dma8___bit 14
#define reg_intr_vect_rw_mask___dma9___lsb 15
#define reg_intr_vect_rw_mask___dma9___width 1
#define reg_intr_vect_rw_mask___dma9___bit 15
#define reg_intr_vect_rw_mask___ata___lsb 16
#define reg_intr_vect_rw_mask___ata___width 1
#define reg_intr_vect_rw_mask___ata___bit 16
#define reg_intr_vect_rw_mask___sser0___lsb 17
#define reg_intr_vect_rw_mask___sser0___width 1
#define reg_intr_vect_rw_mask___sser0___bit 17
#define reg_intr_vect_rw_mask___sser1___lsb 18
#define reg_intr_vect_rw_mask___sser1___width 1
#define reg_intr_vect_rw_mask___sser1___bit 18
#define reg_intr_vect_rw_mask___ser0___lsb 19
#define reg_intr_vect_rw_mask___ser0___width 1
#define reg_intr_vect_rw_mask___ser0___bit 19
#define reg_intr_vect_rw_mask___ser1___lsb 20
#define reg_intr_vect_rw_mask___ser1___width 1
#define reg_intr_vect_rw_mask___ser1___bit 20
#define reg_intr_vect_rw_mask___ser2___lsb 21
#define reg_intr_vect_rw_mask___ser2___width 1
#define reg_intr_vect_rw_mask___ser2___bit 21
#define reg_intr_vect_rw_mask___ser3___lsb 22
#define reg_intr_vect_rw_mask___ser3___width 1
#define reg_intr_vect_rw_mask___ser3___bit 22
#define reg_intr_vect_rw_mask___p21___lsb 23
#define reg_intr_vect_rw_mask___p21___width 1
#define reg_intr_vect_rw_mask___p21___bit 23
#define reg_intr_vect_rw_mask___eth0___lsb 24
#define reg_intr_vect_rw_mask___eth0___width 1
#define reg_intr_vect_rw_mask___eth0___bit 24
#define reg_intr_vect_rw_mask___eth1___lsb 25
#define reg_intr_vect_rw_mask___eth1___width 1
#define reg_intr_vect_rw_mask___eth1___bit 25
#define reg_intr_vect_rw_mask___timer___lsb 26
#define reg_intr_vect_rw_mask___timer___width 1
#define reg_intr_vect_rw_mask___timer___bit 26
#define reg_intr_vect_rw_mask___bif_arb___lsb 27
#define reg_intr_vect_rw_mask___bif_arb___width 1
#define reg_intr_vect_rw_mask___bif_arb___bit 27
#define reg_intr_vect_rw_mask___bif_dma___lsb 28
#define reg_intr_vect_rw_mask___bif_dma___width 1
#define reg_intr_vect_rw_mask___bif_dma___bit 28
#define reg_intr_vect_rw_mask___ext___lsb 29
#define reg_intr_vect_rw_mask___ext___width 1
#define reg_intr_vect_rw_mask___ext___bit 29
#define reg_intr_vect_rw_mask_offset 0
/* Register r_vect, scope intr_vect, type r */
#define reg_intr_vect_r_vect___memarb___lsb 0
#define reg_intr_vect_r_vect___memarb___width 1
#define reg_intr_vect_r_vect___memarb___bit 0
#define reg_intr_vect_r_vect___gen_io___lsb 1
#define reg_intr_vect_r_vect___gen_io___width 1
#define reg_intr_vect_r_vect___gen_io___bit 1
#define reg_intr_vect_r_vect___iop0___lsb 2
#define reg_intr_vect_r_vect___iop0___width 1
#define reg_intr_vect_r_vect___iop0___bit 2
#define reg_intr_vect_r_vect___iop1___lsb 3
#define reg_intr_vect_r_vect___iop1___width 1
#define reg_intr_vect_r_vect___iop1___bit 3
#define reg_intr_vect_r_vect___iop2___lsb 4
#define reg_intr_vect_r_vect___iop2___width 1
#define reg_intr_vect_r_vect___iop2___bit 4
#define reg_intr_vect_r_vect___iop3___lsb 5
#define reg_intr_vect_r_vect___iop3___width 1
#define reg_intr_vect_r_vect___iop3___bit 5
#define reg_intr_vect_r_vect___dma0___lsb 6
#define reg_intr_vect_r_vect___dma0___width 1
#define reg_intr_vect_r_vect___dma0___bit 6
#define reg_intr_vect_r_vect___dma1___lsb 7
#define reg_intr_vect_r_vect___dma1___width 1
#define reg_intr_vect_r_vect___dma1___bit 7
#define reg_intr_vect_r_vect___dma2___lsb 8
#define reg_intr_vect_r_vect___dma2___width 1
#define reg_intr_vect_r_vect___dma2___bit 8
#define reg_intr_vect_r_vect___dma3___lsb 9
#define reg_intr_vect_r_vect___dma3___width 1
#define reg_intr_vect_r_vect___dma3___bit 9
#define reg_intr_vect_r_vect___dma4___lsb 10
#define reg_intr_vect_r_vect___dma4___width 1
#define reg_intr_vect_r_vect___dma4___bit 10
#define reg_intr_vect_r_vect___dma5___lsb 11
#define reg_intr_vect_r_vect___dma5___width 1
#define reg_intr_vect_r_vect___dma5___bit 11
#define reg_intr_vect_r_vect___dma6___lsb 12
#define reg_intr_vect_r_vect___dma6___width 1
#define reg_intr_vect_r_vect___dma6___bit 12
#define reg_intr_vect_r_vect___dma7___lsb 13
#define reg_intr_vect_r_vect___dma7___width 1
#define reg_intr_vect_r_vect___dma7___bit 13
#define reg_intr_vect_r_vect___dma8___lsb 14
#define reg_intr_vect_r_vect___dma8___width 1
#define reg_intr_vect_r_vect___dma8___bit 14
#define reg_intr_vect_r_vect___dma9___lsb 15
#define reg_intr_vect_r_vect___dma9___width 1
#define reg_intr_vect_r_vect___dma9___bit 15
#define reg_intr_vect_r_vect___ata___lsb 16
#define reg_intr_vect_r_vect___ata___width 1
#define reg_intr_vect_r_vect___ata___bit 16
#define reg_intr_vect_r_vect___sser0___lsb 17
#define reg_intr_vect_r_vect___sser0___width 1
#define reg_intr_vect_r_vect___sser0___bit 17
#define reg_intr_vect_r_vect___sser1___lsb 18
#define reg_intr_vect_r_vect___sser1___width 1
#define reg_intr_vect_r_vect___sser1___bit 18
#define reg_intr_vect_r_vect___ser0___lsb 19
#define reg_intr_vect_r_vect___ser0___width 1
#define reg_intr_vect_r_vect___ser0___bit 19
#define reg_intr_vect_r_vect___ser1___lsb 20
#define reg_intr_vect_r_vect___ser1___width 1
#define reg_intr_vect_r_vect___ser1___bit 20
#define reg_intr_vect_r_vect___ser2___lsb 21
#define reg_intr_vect_r_vect___ser2___width 1
#define reg_intr_vect_r_vect___ser2___bit 21
#define reg_intr_vect_r_vect___ser3___lsb 22
#define reg_intr_vect_r_vect___ser3___width 1
#define reg_intr_vect_r_vect___ser3___bit 22
#define reg_intr_vect_r_vect___p21___lsb 23
#define reg_intr_vect_r_vect___p21___width 1
#define reg_intr_vect_r_vect___p21___bit 23
#define reg_intr_vect_r_vect___eth0___lsb 24
#define reg_intr_vect_r_vect___eth0___width 1
#define reg_intr_vect_r_vect___eth0___bit 24
#define reg_intr_vect_r_vect___eth1___lsb 25
#define reg_intr_vect_r_vect___eth1___width 1
#define reg_intr_vect_r_vect___eth1___bit 25
#define reg_intr_vect_r_vect___timer___lsb 26
#define reg_intr_vect_r_vect___timer___width 1
#define reg_intr_vect_r_vect___timer___bit 26
#define reg_intr_vect_r_vect___bif_arb___lsb 27
#define reg_intr_vect_r_vect___bif_arb___width 1
#define reg_intr_vect_r_vect___bif_arb___bit 27
#define reg_intr_vect_r_vect___bif_dma___lsb 28
#define reg_intr_vect_r_vect___bif_dma___width 1
#define reg_intr_vect_r_vect___bif_dma___bit 28
#define reg_intr_vect_r_vect___ext___lsb 29
#define reg_intr_vect_r_vect___ext___width 1
#define reg_intr_vect_r_vect___ext___bit 29
#define reg_intr_vect_r_vect_offset 4
/* Register r_masked_vect, scope intr_vect, type r */
#define reg_intr_vect_r_masked_vect___memarb___lsb 0
#define reg_intr_vect_r_masked_vect___memarb___width 1
#define reg_intr_vect_r_masked_vect___memarb___bit 0
#define reg_intr_vect_r_masked_vect___gen_io___lsb 1
#define reg_intr_vect_r_masked_vect___gen_io___width 1
#define reg_intr_vect_r_masked_vect___gen_io___bit 1
#define reg_intr_vect_r_masked_vect___iop0___lsb 2
#define reg_intr_vect_r_masked_vect___iop0___width 1
#define reg_intr_vect_r_masked_vect___iop0___bit 2
#define reg_intr_vect_r_masked_vect___iop1___lsb 3
#define reg_intr_vect_r_masked_vect___iop1___width 1
#define reg_intr_vect_r_masked_vect___iop1___bit 3
#define reg_intr_vect_r_masked_vect___iop2___lsb 4
#define reg_intr_vect_r_masked_vect___iop2___width 1
#define reg_intr_vect_r_masked_vect___iop2___bit 4
#define reg_intr_vect_r_masked_vect___iop3___lsb 5
#define reg_intr_vect_r_masked_vect___iop3___width 1
#define reg_intr_vect_r_masked_vect___iop3___bit 5
#define reg_intr_vect_r_masked_vect___dma0___lsb 6
#define reg_intr_vect_r_masked_vect___dma0___width 1
#define reg_intr_vect_r_masked_vect___dma0___bit 6
#define reg_intr_vect_r_masked_vect___dma1___lsb 7
#define reg_intr_vect_r_masked_vect___dma1___width 1
#define reg_intr_vect_r_masked_vect___dma1___bit 7
#define reg_intr_vect_r_masked_vect___dma2___lsb 8
#define reg_intr_vect_r_masked_vect___dma2___width 1
#define reg_intr_vect_r_masked_vect___dma2___bit 8
#define reg_intr_vect_r_masked_vect___dma3___lsb 9
#define reg_intr_vect_r_masked_vect___dma3___width 1
#define reg_intr_vect_r_masked_vect___dma3___bit 9
#define reg_intr_vect_r_masked_vect___dma4___lsb 10
#define reg_intr_vect_r_masked_vect___dma4___width 1
#define reg_intr_vect_r_masked_vect___dma4___bit 10
#define reg_intr_vect_r_masked_vect___dma5___lsb 11
#define reg_intr_vect_r_masked_vect___dma5___width 1
#define reg_intr_vect_r_masked_vect___dma5___bit 11
#define reg_intr_vect_r_masked_vect___dma6___lsb 12
#define reg_intr_vect_r_masked_vect___dma6___width 1
#define reg_intr_vect_r_masked_vect___dma6___bit 12
#define reg_intr_vect_r_masked_vect___dma7___lsb 13
#define reg_intr_vect_r_masked_vect___dma7___width 1
#define reg_intr_vect_r_masked_vect___dma7___bit 13
#define reg_intr_vect_r_masked_vect___dma8___lsb 14
#define reg_intr_vect_r_masked_vect___dma8___width 1
#define reg_intr_vect_r_masked_vect___dma8___bit 14
#define reg_intr_vect_r_masked_vect___dma9___lsb 15
#define reg_intr_vect_r_masked_vect___dma9___width 1
#define reg_intr_vect_r_masked_vect___dma9___bit 15
#define reg_intr_vect_r_masked_vect___ata___lsb 16
#define reg_intr_vect_r_masked_vect___ata___width 1
#define reg_intr_vect_r_masked_vect___ata___bit 16
#define reg_intr_vect_r_masked_vect___sser0___lsb 17
#define reg_intr_vect_r_masked_vect___sser0___width 1
#define reg_intr_vect_r_masked_vect___sser0___bit 17
#define reg_intr_vect_r_masked_vect___sser1___lsb 18
#define reg_intr_vect_r_masked_vect___sser1___width 1
#define reg_intr_vect_r_masked_vect___sser1___bit 18
#define reg_intr_vect_r_masked_vect___ser0___lsb 19
#define reg_intr_vect_r_masked_vect___ser0___width 1
#define reg_intr_vect_r_masked_vect___ser0___bit 19
#define reg_intr_vect_r_masked_vect___ser1___lsb 20
#define reg_intr_vect_r_masked_vect___ser1___width 1
#define reg_intr_vect_r_masked_vect___ser1___bit 20
#define reg_intr_vect_r_masked_vect___ser2___lsb 21
#define reg_intr_vect_r_masked_vect___ser2___width 1
#define reg_intr_vect_r_masked_vect___ser2___bit 21
#define reg_intr_vect_r_masked_vect___ser3___lsb 22
#define reg_intr_vect_r_masked_vect___ser3___width 1
#define reg_intr_vect_r_masked_vect___ser3___bit 22
#define reg_intr_vect_r_masked_vect___p21___lsb 23
#define reg_intr_vect_r_masked_vect___p21___width 1
#define reg_intr_vect_r_masked_vect___p21___bit 23
#define reg_intr_vect_r_masked_vect___eth0___lsb 24
#define reg_intr_vect_r_masked_vect___eth0___width 1
#define reg_intr_vect_r_masked_vect___eth0___bit 24
#define reg_intr_vect_r_masked_vect___eth1___lsb 25
#define reg_intr_vect_r_masked_vect___eth1___width 1
#define reg_intr_vect_r_masked_vect___eth1___bit 25
#define reg_intr_vect_r_masked_vect___timer___lsb 26
#define reg_intr_vect_r_masked_vect___timer___width 1
#define reg_intr_vect_r_masked_vect___timer___bit 26
#define reg_intr_vect_r_masked_vect___bif_arb___lsb 27
#define reg_intr_vect_r_masked_vect___bif_arb___width 1
#define reg_intr_vect_r_masked_vect___bif_arb___bit 27
#define reg_intr_vect_r_masked_vect___bif_dma___lsb 28
#define reg_intr_vect_r_masked_vect___bif_dma___width 1
#define reg_intr_vect_r_masked_vect___bif_dma___bit 28
#define reg_intr_vect_r_masked_vect___ext___lsb 29
#define reg_intr_vect_r_masked_vect___ext___width 1
#define reg_intr_vect_r_masked_vect___ext___bit 29
#define reg_intr_vect_r_masked_vect_offset 8
/* Register r_nmi, scope intr_vect, type r */
#define reg_intr_vect_r_nmi___ext___lsb 0
#define reg_intr_vect_r_nmi___ext___width 1
#define reg_intr_vect_r_nmi___ext___bit 0
#define reg_intr_vect_r_nmi___watchdog___lsb 1
#define reg_intr_vect_r_nmi___watchdog___width 1
#define reg_intr_vect_r_nmi___watchdog___bit 1
#define reg_intr_vect_r_nmi_offset 12
/* Register r_guru, scope intr_vect, type r */
#define reg_intr_vect_r_guru___jtag___lsb 0
#define reg_intr_vect_r_guru___jtag___width 1
#define reg_intr_vect_r_guru___jtag___bit 0
#define reg_intr_vect_r_guru_offset 16
/* Constants */
#define regk_intr_vect_off 0x00000000
#define regk_intr_vect_on 0x00000001
#define regk_intr_vect_rw_mask_default 0x00000000
#endif /* __intr_vect_defs_asm_h */

View file

@ -0,0 +1,69 @@
#ifndef __irq_nmi_defs_asm_h
#define __irq_nmi_defs_asm_h
/*
* This file is autogenerated from
* file: ../../mod/irq_nmi.r
* id: <not found>
* last modfied: Thu Jan 22 09:22:43 2004
*
* by /n/asic/design/tools/rdesc/src/rdes2c -asm --outfile asm/irq_nmi_defs_asm.h ../../mod/irq_nmi.r
* id: $Id: irq_nmi_defs_asm.h,v 1.1 2005/04/24 18:31:04 starvik Exp $
* Any changes here will be lost.
*
* -*- buffer-read-only: t -*-
*/
#ifndef REG_FIELD
#define REG_FIELD( scope, reg, field, value ) \
REG_FIELD_X_( value, reg_##scope##_##reg##___##field##___lsb )
#define REG_FIELD_X_( value, shift ) ((value) << shift)
#endif
#ifndef REG_STATE
#define REG_STATE( scope, reg, field, symbolic_value ) \
REG_STATE_X_( regk_##scope##_##symbolic_value, reg_##scope##_##reg##___##field##___lsb )
#define REG_STATE_X_( k, shift ) (k << shift)
#endif
#ifndef REG_MASK
#define REG_MASK( scope, reg, field ) \
REG_MASK_X_( reg_##scope##_##reg##___##field##___width, reg_##scope##_##reg##___##field##___lsb )
#define REG_MASK_X_( width, lsb ) (((1 << width)-1) << lsb)
#endif
#ifndef REG_LSB
#define REG_LSB( scope, reg, field ) reg_##scope##_##reg##___##field##___lsb
#endif
#ifndef REG_BIT
#define REG_BIT( scope, reg, field ) reg_##scope##_##reg##___##field##___bit
#endif
#ifndef REG_ADDR
#define REG_ADDR( scope, inst, reg ) REG_ADDR_X_(inst, reg_##scope##_##reg##_offset)
#define REG_ADDR_X_( inst, offs ) ((inst) + offs)
#endif
#ifndef REG_ADDR_VECT
#define REG_ADDR_VECT( scope, inst, reg, index ) \
REG_ADDR_VECT_X_(inst, reg_##scope##_##reg##_offset, index, \
STRIDE_##scope##_##reg )
#define REG_ADDR_VECT_X_( inst, offs, index, stride ) \
((inst) + offs + (index) * stride)
#endif
/* Register rw_cmd, scope irq_nmi, type rw */
#define reg_irq_nmi_rw_cmd___delay___lsb 0
#define reg_irq_nmi_rw_cmd___delay___width 16
#define reg_irq_nmi_rw_cmd___op___lsb 16
#define reg_irq_nmi_rw_cmd___op___width 2
#define reg_irq_nmi_rw_cmd_offset 0
/* Constants */
#define regk_irq_nmi_ack_irq 0x00000002
#define regk_irq_nmi_ack_nmi 0x00000003
#define regk_irq_nmi_irq 0x00000000
#define regk_irq_nmi_nmi 0x00000001
#endif /* __irq_nmi_defs_asm_h */

View file

@ -0,0 +1,579 @@
#ifndef __marb_defs_asm_h
#define __marb_defs_asm_h
/*
* This file is autogenerated from
* file: ../../inst/memarb/rtl/guinness/marb_top.r
* id: <not found>
* last modfied: Mon Apr 11 16:12:16 2005
*
* by /n/asic/design/tools/rdesc/src/rdes2c -asm --outfile asm/marb_defs_asm.h ../../inst/memarb/rtl/guinness/marb_top.r
* id: $Id: marb_defs_asm.h,v 1.1 2005/04/24 18:31:04 starvik Exp $
* Any changes here will be lost.
*
* -*- buffer-read-only: t -*-
*/
#ifndef REG_FIELD
#define REG_FIELD( scope, reg, field, value ) \
REG_FIELD_X_( value, reg_##scope##_##reg##___##field##___lsb )
#define REG_FIELD_X_( value, shift ) ((value) << shift)
#endif
#ifndef REG_STATE
#define REG_STATE( scope, reg, field, symbolic_value ) \
REG_STATE_X_( regk_##scope##_##symbolic_value, reg_##scope##_##reg##___##field##___lsb )
#define REG_STATE_X_( k, shift ) (k << shift)
#endif
#ifndef REG_MASK
#define REG_MASK( scope, reg, field ) \
REG_MASK_X_( reg_##scope##_##reg##___##field##___width, reg_##scope##_##reg##___##field##___lsb )
#define REG_MASK_X_( width, lsb ) (((1 << width)-1) << lsb)
#endif
#ifndef REG_LSB
#define REG_LSB( scope, reg, field ) reg_##scope##_##reg##___##field##___lsb
#endif
#ifndef REG_BIT
#define REG_BIT( scope, reg, field ) reg_##scope##_##reg##___##field##___bit
#endif
#ifndef REG_ADDR
#define REG_ADDR( scope, inst, reg ) REG_ADDR_X_(inst, reg_##scope##_##reg##_offset)
#define REG_ADDR_X_( inst, offs ) ((inst) + offs)
#endif
#ifndef REG_ADDR_VECT
#define REG_ADDR_VECT( scope, inst, reg, index ) \
REG_ADDR_VECT_X_(inst, reg_##scope##_##reg##_offset, index, \
STRIDE_##scope##_##reg )
#define REG_ADDR_VECT_X_( inst, offs, index, stride ) \
((inst) + offs + (index) * stride)
#endif
#define STRIDE_marb_rw_int_slots 4
/* Register rw_int_slots, scope marb, type rw */
#define reg_marb_rw_int_slots___owner___lsb 0
#define reg_marb_rw_int_slots___owner___width 4
#define reg_marb_rw_int_slots_offset 0
#define STRIDE_marb_rw_ext_slots 4
/* Register rw_ext_slots, scope marb, type rw */
#define reg_marb_rw_ext_slots___owner___lsb 0
#define reg_marb_rw_ext_slots___owner___width 4
#define reg_marb_rw_ext_slots_offset 256
#define STRIDE_marb_rw_regs_slots 4
/* Register rw_regs_slots, scope marb, type rw */
#define reg_marb_rw_regs_slots___owner___lsb 0
#define reg_marb_rw_regs_slots___owner___width 4
#define reg_marb_rw_regs_slots_offset 512
/* Register rw_intr_mask, scope marb, type rw */
#define reg_marb_rw_intr_mask___bp0___lsb 0
#define reg_marb_rw_intr_mask___bp0___width 1
#define reg_marb_rw_intr_mask___bp0___bit 0
#define reg_marb_rw_intr_mask___bp1___lsb 1
#define reg_marb_rw_intr_mask___bp1___width 1
#define reg_marb_rw_intr_mask___bp1___bit 1
#define reg_marb_rw_intr_mask___bp2___lsb 2
#define reg_marb_rw_intr_mask___bp2___width 1
#define reg_marb_rw_intr_mask___bp2___bit 2
#define reg_marb_rw_intr_mask___bp3___lsb 3
#define reg_marb_rw_intr_mask___bp3___width 1
#define reg_marb_rw_intr_mask___bp3___bit 3
#define reg_marb_rw_intr_mask_offset 528
/* Register rw_ack_intr, scope marb, type rw */
#define reg_marb_rw_ack_intr___bp0___lsb 0
#define reg_marb_rw_ack_intr___bp0___width 1
#define reg_marb_rw_ack_intr___bp0___bit 0
#define reg_marb_rw_ack_intr___bp1___lsb 1
#define reg_marb_rw_ack_intr___bp1___width 1
#define reg_marb_rw_ack_intr___bp1___bit 1
#define reg_marb_rw_ack_intr___bp2___lsb 2
#define reg_marb_rw_ack_intr___bp2___width 1
#define reg_marb_rw_ack_intr___bp2___bit 2
#define reg_marb_rw_ack_intr___bp3___lsb 3
#define reg_marb_rw_ack_intr___bp3___width 1
#define reg_marb_rw_ack_intr___bp3___bit 3
#define reg_marb_rw_ack_intr_offset 532
/* Register r_intr, scope marb, type r */
#define reg_marb_r_intr___bp0___lsb 0
#define reg_marb_r_intr___bp0___width 1
#define reg_marb_r_intr___bp0___bit 0
#define reg_marb_r_intr___bp1___lsb 1
#define reg_marb_r_intr___bp1___width 1
#define reg_marb_r_intr___bp1___bit 1
#define reg_marb_r_intr___bp2___lsb 2
#define reg_marb_r_intr___bp2___width 1
#define reg_marb_r_intr___bp2___bit 2
#define reg_marb_r_intr___bp3___lsb 3
#define reg_marb_r_intr___bp3___width 1
#define reg_marb_r_intr___bp3___bit 3
#define reg_marb_r_intr_offset 536
/* Register r_masked_intr, scope marb, type r */
#define reg_marb_r_masked_intr___bp0___lsb 0
#define reg_marb_r_masked_intr___bp0___width 1
#define reg_marb_r_masked_intr___bp0___bit 0
#define reg_marb_r_masked_intr___bp1___lsb 1
#define reg_marb_r_masked_intr___bp1___width 1
#define reg_marb_r_masked_intr___bp1___bit 1
#define reg_marb_r_masked_intr___bp2___lsb 2
#define reg_marb_r_masked_intr___bp2___width 1
#define reg_marb_r_masked_intr___bp2___bit 2
#define reg_marb_r_masked_intr___bp3___lsb 3
#define reg_marb_r_masked_intr___bp3___width 1
#define reg_marb_r_masked_intr___bp3___bit 3
#define reg_marb_r_masked_intr_offset 540
/* Register rw_stop_mask, scope marb, type rw */
#define reg_marb_rw_stop_mask___dma0___lsb 0
#define reg_marb_rw_stop_mask___dma0___width 1
#define reg_marb_rw_stop_mask___dma0___bit 0
#define reg_marb_rw_stop_mask___dma1___lsb 1
#define reg_marb_rw_stop_mask___dma1___width 1
#define reg_marb_rw_stop_mask___dma1___bit 1
#define reg_marb_rw_stop_mask___dma2___lsb 2
#define reg_marb_rw_stop_mask___dma2___width 1
#define reg_marb_rw_stop_mask___dma2___bit 2
#define reg_marb_rw_stop_mask___dma3___lsb 3
#define reg_marb_rw_stop_mask___dma3___width 1
#define reg_marb_rw_stop_mask___dma3___bit 3
#define reg_marb_rw_stop_mask___dma4___lsb 4
#define reg_marb_rw_stop_mask___dma4___width 1
#define reg_marb_rw_stop_mask___dma4___bit 4
#define reg_marb_rw_stop_mask___dma5___lsb 5
#define reg_marb_rw_stop_mask___dma5___width 1
#define reg_marb_rw_stop_mask___dma5___bit 5
#define reg_marb_rw_stop_mask___dma6___lsb 6
#define reg_marb_rw_stop_mask___dma6___width 1
#define reg_marb_rw_stop_mask___dma6___bit 6
#define reg_marb_rw_stop_mask___dma7___lsb 7
#define reg_marb_rw_stop_mask___dma7___width 1
#define reg_marb_rw_stop_mask___dma7___bit 7
#define reg_marb_rw_stop_mask___dma8___lsb 8
#define reg_marb_rw_stop_mask___dma8___width 1
#define reg_marb_rw_stop_mask___dma8___bit 8
#define reg_marb_rw_stop_mask___dma9___lsb 9
#define reg_marb_rw_stop_mask___dma9___width 1
#define reg_marb_rw_stop_mask___dma9___bit 9
#define reg_marb_rw_stop_mask___cpui___lsb 10
#define reg_marb_rw_stop_mask___cpui___width 1
#define reg_marb_rw_stop_mask___cpui___bit 10
#define reg_marb_rw_stop_mask___cpud___lsb 11
#define reg_marb_rw_stop_mask___cpud___width 1
#define reg_marb_rw_stop_mask___cpud___bit 11
#define reg_marb_rw_stop_mask___iop___lsb 12
#define reg_marb_rw_stop_mask___iop___width 1
#define reg_marb_rw_stop_mask___iop___bit 12
#define reg_marb_rw_stop_mask___slave___lsb 13
#define reg_marb_rw_stop_mask___slave___width 1
#define reg_marb_rw_stop_mask___slave___bit 13
#define reg_marb_rw_stop_mask_offset 544
/* Register r_stopped, scope marb, type r */
#define reg_marb_r_stopped___dma0___lsb 0
#define reg_marb_r_stopped___dma0___width 1
#define reg_marb_r_stopped___dma0___bit 0
#define reg_marb_r_stopped___dma1___lsb 1
#define reg_marb_r_stopped___dma1___width 1
#define reg_marb_r_stopped___dma1___bit 1
#define reg_marb_r_stopped___dma2___lsb 2
#define reg_marb_r_stopped___dma2___width 1
#define reg_marb_r_stopped___dma2___bit 2
#define reg_marb_r_stopped___dma3___lsb 3
#define reg_marb_r_stopped___dma3___width 1
#define reg_marb_r_stopped___dma3___bit 3
#define reg_marb_r_stopped___dma4___lsb 4
#define reg_marb_r_stopped___dma4___width 1
#define reg_marb_r_stopped___dma4___bit 4
#define reg_marb_r_stopped___dma5___lsb 5
#define reg_marb_r_stopped___dma5___width 1
#define reg_marb_r_stopped___dma5___bit 5
#define reg_marb_r_stopped___dma6___lsb 6
#define reg_marb_r_stopped___dma6___width 1
#define reg_marb_r_stopped___dma6___bit 6
#define reg_marb_r_stopped___dma7___lsb 7
#define reg_marb_r_stopped___dma7___width 1
#define reg_marb_r_stopped___dma7___bit 7
#define reg_marb_r_stopped___dma8___lsb 8
#define reg_marb_r_stopped___dma8___width 1
#define reg_marb_r_stopped___dma8___bit 8
#define reg_marb_r_stopped___dma9___lsb 9
#define reg_marb_r_stopped___dma9___width 1
#define reg_marb_r_stopped___dma9___bit 9
#define reg_marb_r_stopped___cpui___lsb 10
#define reg_marb_r_stopped___cpui___width 1
#define reg_marb_r_stopped___cpui___bit 10
#define reg_marb_r_stopped___cpud___lsb 11
#define reg_marb_r_stopped___cpud___width 1
#define reg_marb_r_stopped___cpud___bit 11
#define reg_marb_r_stopped___iop___lsb 12
#define reg_marb_r_stopped___iop___width 1
#define reg_marb_r_stopped___iop___bit 12
#define reg_marb_r_stopped___slave___lsb 13
#define reg_marb_r_stopped___slave___width 1
#define reg_marb_r_stopped___slave___bit 13
#define reg_marb_r_stopped_offset 548
/* Register rw_no_snoop, scope marb, type rw */
#define reg_marb_rw_no_snoop___dma0___lsb 0
#define reg_marb_rw_no_snoop___dma0___width 1
#define reg_marb_rw_no_snoop___dma0___bit 0
#define reg_marb_rw_no_snoop___dma1___lsb 1
#define reg_marb_rw_no_snoop___dma1___width 1
#define reg_marb_rw_no_snoop___dma1___bit 1
#define reg_marb_rw_no_snoop___dma2___lsb 2
#define reg_marb_rw_no_snoop___dma2___width 1
#define reg_marb_rw_no_snoop___dma2___bit 2
#define reg_marb_rw_no_snoop___dma3___lsb 3
#define reg_marb_rw_no_snoop___dma3___width 1
#define reg_marb_rw_no_snoop___dma3___bit 3
#define reg_marb_rw_no_snoop___dma4___lsb 4
#define reg_marb_rw_no_snoop___dma4___width 1
#define reg_marb_rw_no_snoop___dma4___bit 4
#define reg_marb_rw_no_snoop___dma5___lsb 5
#define reg_marb_rw_no_snoop___dma5___width 1
#define reg_marb_rw_no_snoop___dma5___bit 5
#define reg_marb_rw_no_snoop___dma6___lsb 6
#define reg_marb_rw_no_snoop___dma6___width 1
#define reg_marb_rw_no_snoop___dma6___bit 6
#define reg_marb_rw_no_snoop___dma7___lsb 7
#define reg_marb_rw_no_snoop___dma7___width 1
#define reg_marb_rw_no_snoop___dma7___bit 7
#define reg_marb_rw_no_snoop___dma8___lsb 8
#define reg_marb_rw_no_snoop___dma8___width 1
#define reg_marb_rw_no_snoop___dma8___bit 8
#define reg_marb_rw_no_snoop___dma9___lsb 9
#define reg_marb_rw_no_snoop___dma9___width 1
#define reg_marb_rw_no_snoop___dma9___bit 9
#define reg_marb_rw_no_snoop___cpui___lsb 10
#define reg_marb_rw_no_snoop___cpui___width 1
#define reg_marb_rw_no_snoop___cpui___bit 10
#define reg_marb_rw_no_snoop___cpud___lsb 11
#define reg_marb_rw_no_snoop___cpud___width 1
#define reg_marb_rw_no_snoop___cpud___bit 11
#define reg_marb_rw_no_snoop___iop___lsb 12
#define reg_marb_rw_no_snoop___iop___width 1
#define reg_marb_rw_no_snoop___iop___bit 12
#define reg_marb_rw_no_snoop___slave___lsb 13
#define reg_marb_rw_no_snoop___slave___width 1
#define reg_marb_rw_no_snoop___slave___bit 13
#define reg_marb_rw_no_snoop_offset 832
/* Register rw_no_snoop_rq, scope marb, type rw */
#define reg_marb_rw_no_snoop_rq___cpui___lsb 10
#define reg_marb_rw_no_snoop_rq___cpui___width 1
#define reg_marb_rw_no_snoop_rq___cpui___bit 10
#define reg_marb_rw_no_snoop_rq___cpud___lsb 11
#define reg_marb_rw_no_snoop_rq___cpud___width 1
#define reg_marb_rw_no_snoop_rq___cpud___bit 11
#define reg_marb_rw_no_snoop_rq_offset 836
/* Constants */
#define regk_marb_cpud 0x0000000b
#define regk_marb_cpui 0x0000000a
#define regk_marb_dma0 0x00000000
#define regk_marb_dma1 0x00000001
#define regk_marb_dma2 0x00000002
#define regk_marb_dma3 0x00000003
#define regk_marb_dma4 0x00000004
#define regk_marb_dma5 0x00000005
#define regk_marb_dma6 0x00000006
#define regk_marb_dma7 0x00000007
#define regk_marb_dma8 0x00000008
#define regk_marb_dma9 0x00000009
#define regk_marb_iop 0x0000000c
#define regk_marb_no 0x00000000
#define regk_marb_r_stopped_default 0x00000000
#define regk_marb_rw_ext_slots_default 0x00000000
#define regk_marb_rw_ext_slots_size 0x00000040
#define regk_marb_rw_int_slots_default 0x00000000
#define regk_marb_rw_int_slots_size 0x00000040
#define regk_marb_rw_intr_mask_default 0x00000000
#define regk_marb_rw_no_snoop_default 0x00000000
#define regk_marb_rw_no_snoop_rq_default 0x00000000
#define regk_marb_rw_regs_slots_default 0x00000000
#define regk_marb_rw_regs_slots_size 0x00000004
#define regk_marb_rw_stop_mask_default 0x00000000
#define regk_marb_slave 0x0000000d
#define regk_marb_yes 0x00000001
#endif /* __marb_defs_asm_h */
#ifndef __marb_bp_defs_asm_h
#define __marb_bp_defs_asm_h
/*
* This file is autogenerated from
* file: ../../inst/memarb/rtl/guinness/marb_top.r
* id: <not found>
* last modfied: Mon Apr 11 16:12:16 2005
*
* by /n/asic/design/tools/rdesc/src/rdes2c -asm --outfile asm/marb_defs_asm.h ../../inst/memarb/rtl/guinness/marb_top.r
* id: $Id: marb_defs_asm.h,v 1.1 2005/04/24 18:31:04 starvik Exp $
* Any changes here will be lost.
*
* -*- buffer-read-only: t -*-
*/
#ifndef REG_FIELD
#define REG_FIELD( scope, reg, field, value ) \
REG_FIELD_X_( value, reg_##scope##_##reg##___##field##___lsb )
#define REG_FIELD_X_( value, shift ) ((value) << shift)
#endif
#ifndef REG_STATE
#define REG_STATE( scope, reg, field, symbolic_value ) \
REG_STATE_X_( regk_##scope##_##symbolic_value, reg_##scope##_##reg##___##field##___lsb )
#define REG_STATE_X_( k, shift ) (k << shift)
#endif
#ifndef REG_MASK
#define REG_MASK( scope, reg, field ) \
REG_MASK_X_( reg_##scope##_##reg##___##field##___width, reg_##scope##_##reg##___##field##___lsb )
#define REG_MASK_X_( width, lsb ) (((1 << width)-1) << lsb)
#endif
#ifndef REG_LSB
#define REG_LSB( scope, reg, field ) reg_##scope##_##reg##___##field##___lsb
#endif
#ifndef REG_BIT
#define REG_BIT( scope, reg, field ) reg_##scope##_##reg##___##field##___bit
#endif
#ifndef REG_ADDR
#define REG_ADDR( scope, inst, reg ) REG_ADDR_X_(inst, reg_##scope##_##reg##_offset)
#define REG_ADDR_X_( inst, offs ) ((inst) + offs)
#endif
#ifndef REG_ADDR_VECT
#define REG_ADDR_VECT( scope, inst, reg, index ) \
REG_ADDR_VECT_X_(inst, reg_##scope##_##reg##_offset, index, \
STRIDE_##scope##_##reg )
#define REG_ADDR_VECT_X_( inst, offs, index, stride ) \
((inst) + offs + (index) * stride)
#endif
/* Register rw_first_addr, scope marb_bp, type rw */
#define reg_marb_bp_rw_first_addr_offset 0
/* Register rw_last_addr, scope marb_bp, type rw */
#define reg_marb_bp_rw_last_addr_offset 4
/* Register rw_op, scope marb_bp, type rw */
#define reg_marb_bp_rw_op___rd___lsb 0
#define reg_marb_bp_rw_op___rd___width 1
#define reg_marb_bp_rw_op___rd___bit 0
#define reg_marb_bp_rw_op___wr___lsb 1
#define reg_marb_bp_rw_op___wr___width 1
#define reg_marb_bp_rw_op___wr___bit 1
#define reg_marb_bp_rw_op___rd_excl___lsb 2
#define reg_marb_bp_rw_op___rd_excl___width 1
#define reg_marb_bp_rw_op___rd_excl___bit 2
#define reg_marb_bp_rw_op___pri_wr___lsb 3
#define reg_marb_bp_rw_op___pri_wr___width 1
#define reg_marb_bp_rw_op___pri_wr___bit 3
#define reg_marb_bp_rw_op___us_rd___lsb 4
#define reg_marb_bp_rw_op___us_rd___width 1
#define reg_marb_bp_rw_op___us_rd___bit 4
#define reg_marb_bp_rw_op___us_wr___lsb 5
#define reg_marb_bp_rw_op___us_wr___width 1
#define reg_marb_bp_rw_op___us_wr___bit 5
#define reg_marb_bp_rw_op___us_rd_excl___lsb 6
#define reg_marb_bp_rw_op___us_rd_excl___width 1
#define reg_marb_bp_rw_op___us_rd_excl___bit 6
#define reg_marb_bp_rw_op___us_pri_wr___lsb 7
#define reg_marb_bp_rw_op___us_pri_wr___width 1
#define reg_marb_bp_rw_op___us_pri_wr___bit 7
#define reg_marb_bp_rw_op_offset 8
/* Register rw_clients, scope marb_bp, type rw */
#define reg_marb_bp_rw_clients___dma0___lsb 0
#define reg_marb_bp_rw_clients___dma0___width 1
#define reg_marb_bp_rw_clients___dma0___bit 0
#define reg_marb_bp_rw_clients___dma1___lsb 1
#define reg_marb_bp_rw_clients___dma1___width 1
#define reg_marb_bp_rw_clients___dma1___bit 1
#define reg_marb_bp_rw_clients___dma2___lsb 2
#define reg_marb_bp_rw_clients___dma2___width 1
#define reg_marb_bp_rw_clients___dma2___bit 2
#define reg_marb_bp_rw_clients___dma3___lsb 3
#define reg_marb_bp_rw_clients___dma3___width 1
#define reg_marb_bp_rw_clients___dma3___bit 3
#define reg_marb_bp_rw_clients___dma4___lsb 4
#define reg_marb_bp_rw_clients___dma4___width 1
#define reg_marb_bp_rw_clients___dma4___bit 4
#define reg_marb_bp_rw_clients___dma5___lsb 5
#define reg_marb_bp_rw_clients___dma5___width 1
#define reg_marb_bp_rw_clients___dma5___bit 5
#define reg_marb_bp_rw_clients___dma6___lsb 6
#define reg_marb_bp_rw_clients___dma6___width 1
#define reg_marb_bp_rw_clients___dma6___bit 6
#define reg_marb_bp_rw_clients___dma7___lsb 7
#define reg_marb_bp_rw_clients___dma7___width 1
#define reg_marb_bp_rw_clients___dma7___bit 7
#define reg_marb_bp_rw_clients___dma8___lsb 8
#define reg_marb_bp_rw_clients___dma8___width 1
#define reg_marb_bp_rw_clients___dma8___bit 8
#define reg_marb_bp_rw_clients___dma9___lsb 9
#define reg_marb_bp_rw_clients___dma9___width 1
#define reg_marb_bp_rw_clients___dma9___bit 9
#define reg_marb_bp_rw_clients___cpui___lsb 10
#define reg_marb_bp_rw_clients___cpui___width 1
#define reg_marb_bp_rw_clients___cpui___bit 10
#define reg_marb_bp_rw_clients___cpud___lsb 11
#define reg_marb_bp_rw_clients___cpud___width 1
#define reg_marb_bp_rw_clients___cpud___bit 11
#define reg_marb_bp_rw_clients___iop___lsb 12
#define reg_marb_bp_rw_clients___iop___width 1
#define reg_marb_bp_rw_clients___iop___bit 12
#define reg_marb_bp_rw_clients___slave___lsb 13
#define reg_marb_bp_rw_clients___slave___width 1
#define reg_marb_bp_rw_clients___slave___bit 13
#define reg_marb_bp_rw_clients_offset 12
/* Register rw_options, scope marb_bp, type rw */
#define reg_marb_bp_rw_options___wrap___lsb 0
#define reg_marb_bp_rw_options___wrap___width 1
#define reg_marb_bp_rw_options___wrap___bit 0
#define reg_marb_bp_rw_options_offset 16
/* Register r_brk_addr, scope marb_bp, type r */
#define reg_marb_bp_r_brk_addr_offset 20
/* Register r_brk_op, scope marb_bp, type r */
#define reg_marb_bp_r_brk_op___rd___lsb 0
#define reg_marb_bp_r_brk_op___rd___width 1
#define reg_marb_bp_r_brk_op___rd___bit 0
#define reg_marb_bp_r_brk_op___wr___lsb 1
#define reg_marb_bp_r_brk_op___wr___width 1
#define reg_marb_bp_r_brk_op___wr___bit 1
#define reg_marb_bp_r_brk_op___rd_excl___lsb 2
#define reg_marb_bp_r_brk_op___rd_excl___width 1
#define reg_marb_bp_r_brk_op___rd_excl___bit 2
#define reg_marb_bp_r_brk_op___pri_wr___lsb 3
#define reg_marb_bp_r_brk_op___pri_wr___width 1
#define reg_marb_bp_r_brk_op___pri_wr___bit 3
#define reg_marb_bp_r_brk_op___us_rd___lsb 4
#define reg_marb_bp_r_brk_op___us_rd___width 1
#define reg_marb_bp_r_brk_op___us_rd___bit 4
#define reg_marb_bp_r_brk_op___us_wr___lsb 5
#define reg_marb_bp_r_brk_op___us_wr___width 1
#define reg_marb_bp_r_brk_op___us_wr___bit 5
#define reg_marb_bp_r_brk_op___us_rd_excl___lsb 6
#define reg_marb_bp_r_brk_op___us_rd_excl___width 1
#define reg_marb_bp_r_brk_op___us_rd_excl___bit 6
#define reg_marb_bp_r_brk_op___us_pri_wr___lsb 7
#define reg_marb_bp_r_brk_op___us_pri_wr___width 1
#define reg_marb_bp_r_brk_op___us_pri_wr___bit 7
#define reg_marb_bp_r_brk_op_offset 24
/* Register r_brk_clients, scope marb_bp, type r */
#define reg_marb_bp_r_brk_clients___dma0___lsb 0
#define reg_marb_bp_r_brk_clients___dma0___width 1
#define reg_marb_bp_r_brk_clients___dma0___bit 0
#define reg_marb_bp_r_brk_clients___dma1___lsb 1
#define reg_marb_bp_r_brk_clients___dma1___width 1
#define reg_marb_bp_r_brk_clients___dma1___bit 1
#define reg_marb_bp_r_brk_clients___dma2___lsb 2
#define reg_marb_bp_r_brk_clients___dma2___width 1
#define reg_marb_bp_r_brk_clients___dma2___bit 2
#define reg_marb_bp_r_brk_clients___dma3___lsb 3
#define reg_marb_bp_r_brk_clients___dma3___width 1
#define reg_marb_bp_r_brk_clients___dma3___bit 3
#define reg_marb_bp_r_brk_clients___dma4___lsb 4
#define reg_marb_bp_r_brk_clients___dma4___width 1
#define reg_marb_bp_r_brk_clients___dma4___bit 4
#define reg_marb_bp_r_brk_clients___dma5___lsb 5
#define reg_marb_bp_r_brk_clients___dma5___width 1
#define reg_marb_bp_r_brk_clients___dma5___bit 5
#define reg_marb_bp_r_brk_clients___dma6___lsb 6
#define reg_marb_bp_r_brk_clients___dma6___width 1
#define reg_marb_bp_r_brk_clients___dma6___bit 6
#define reg_marb_bp_r_brk_clients___dma7___lsb 7
#define reg_marb_bp_r_brk_clients___dma7___width 1
#define reg_marb_bp_r_brk_clients___dma7___bit 7
#define reg_marb_bp_r_brk_clients___dma8___lsb 8
#define reg_marb_bp_r_brk_clients___dma8___width 1
#define reg_marb_bp_r_brk_clients___dma8___bit 8
#define reg_marb_bp_r_brk_clients___dma9___lsb 9
#define reg_marb_bp_r_brk_clients___dma9___width 1
#define reg_marb_bp_r_brk_clients___dma9___bit 9
#define reg_marb_bp_r_brk_clients___cpui___lsb 10
#define reg_marb_bp_r_brk_clients___cpui___width 1
#define reg_marb_bp_r_brk_clients___cpui___bit 10
#define reg_marb_bp_r_brk_clients___cpud___lsb 11
#define reg_marb_bp_r_brk_clients___cpud___width 1
#define reg_marb_bp_r_brk_clients___cpud___bit 11
#define reg_marb_bp_r_brk_clients___iop___lsb 12
#define reg_marb_bp_r_brk_clients___iop___width 1
#define reg_marb_bp_r_brk_clients___iop___bit 12
#define reg_marb_bp_r_brk_clients___slave___lsb 13
#define reg_marb_bp_r_brk_clients___slave___width 1
#define reg_marb_bp_r_brk_clients___slave___bit 13
#define reg_marb_bp_r_brk_clients_offset 28
/* Register r_brk_first_client, scope marb_bp, type r */
#define reg_marb_bp_r_brk_first_client___dma0___lsb 0
#define reg_marb_bp_r_brk_first_client___dma0___width 1
#define reg_marb_bp_r_brk_first_client___dma0___bit 0
#define reg_marb_bp_r_brk_first_client___dma1___lsb 1
#define reg_marb_bp_r_brk_first_client___dma1___width 1
#define reg_marb_bp_r_brk_first_client___dma1___bit 1
#define reg_marb_bp_r_brk_first_client___dma2___lsb 2
#define reg_marb_bp_r_brk_first_client___dma2___width 1
#define reg_marb_bp_r_brk_first_client___dma2___bit 2
#define reg_marb_bp_r_brk_first_client___dma3___lsb 3
#define reg_marb_bp_r_brk_first_client___dma3___width 1
#define reg_marb_bp_r_brk_first_client___dma3___bit 3
#define reg_marb_bp_r_brk_first_client___dma4___lsb 4
#define reg_marb_bp_r_brk_first_client___dma4___width 1
#define reg_marb_bp_r_brk_first_client___dma4___bit 4
#define reg_marb_bp_r_brk_first_client___dma5___lsb 5
#define reg_marb_bp_r_brk_first_client___dma5___width 1
#define reg_marb_bp_r_brk_first_client___dma5___bit 5
#define reg_marb_bp_r_brk_first_client___dma6___lsb 6
#define reg_marb_bp_r_brk_first_client___dma6___width 1
#define reg_marb_bp_r_brk_first_client___dma6___bit 6
#define reg_marb_bp_r_brk_first_client___dma7___lsb 7
#define reg_marb_bp_r_brk_first_client___dma7___width 1
#define reg_marb_bp_r_brk_first_client___dma7___bit 7
#define reg_marb_bp_r_brk_first_client___dma8___lsb 8
#define reg_marb_bp_r_brk_first_client___dma8___width 1
#define reg_marb_bp_r_brk_first_client___dma8___bit 8
#define reg_marb_bp_r_brk_first_client___dma9___lsb 9
#define reg_marb_bp_r_brk_first_client___dma9___width 1
#define reg_marb_bp_r_brk_first_client___dma9___bit 9
#define reg_marb_bp_r_brk_first_client___cpui___lsb 10
#define reg_marb_bp_r_brk_first_client___cpui___width 1
#define reg_marb_bp_r_brk_first_client___cpui___bit 10
#define reg_marb_bp_r_brk_first_client___cpud___lsb 11
#define reg_marb_bp_r_brk_first_client___cpud___width 1
#define reg_marb_bp_r_brk_first_client___cpud___bit 11
#define reg_marb_bp_r_brk_first_client___iop___lsb 12
#define reg_marb_bp_r_brk_first_client___iop___width 1
#define reg_marb_bp_r_brk_first_client___iop___bit 12
#define reg_marb_bp_r_brk_first_client___slave___lsb 13
#define reg_marb_bp_r_brk_first_client___slave___width 1
#define reg_marb_bp_r_brk_first_client___slave___bit 13
#define reg_marb_bp_r_brk_first_client_offset 32
/* Register r_brk_size, scope marb_bp, type r */
#define reg_marb_bp_r_brk_size_offset 36
/* Register rw_ack, scope marb_bp, type rw */
#define reg_marb_bp_rw_ack_offset 40
/* Constants */
#define regk_marb_bp_no 0x00000000
#define regk_marb_bp_rw_op_default 0x00000000
#define regk_marb_bp_rw_options_default 0x00000000
#define regk_marb_bp_yes 0x00000001
#endif /* __marb_bp_defs_asm_h */

View file

@ -0,0 +1,212 @@
#ifndef __mmu_defs_asm_h
#define __mmu_defs_asm_h
/*
* This file is autogenerated from
* file: ../../inst/mmu/doc/mmu_regs.r
* id: mmu_regs.r,v 1.12 2004/05/06 13:48:45 mikaeln Exp
* last modfied: Mon Apr 11 17:03:20 2005
*
* by /n/asic/design/tools/rdesc/src/rdes2c -asm --outfile asm/mmu_defs_asm.h ../../inst/mmu/doc/mmu_regs.r
* id: $Id: mmu_defs_asm.h,v 1.1 2005/04/24 18:31:04 starvik Exp $
* Any changes here will be lost.
*
* -*- buffer-read-only: t -*-
*/
#ifndef REG_FIELD
#define REG_FIELD( scope, reg, field, value ) \
REG_FIELD_X_( value, reg_##scope##_##reg##___##field##___lsb )
#define REG_FIELD_X_( value, shift ) ((value) << shift)
#endif
#ifndef REG_STATE
#define REG_STATE( scope, reg, field, symbolic_value ) \
REG_STATE_X_( regk_##scope##_##symbolic_value, reg_##scope##_##reg##___##field##___lsb )
#define REG_STATE_X_( k, shift ) (k << shift)
#endif
#ifndef REG_MASK
#define REG_MASK( scope, reg, field ) \
REG_MASK_X_( reg_##scope##_##reg##___##field##___width, reg_##scope##_##reg##___##field##___lsb )
#define REG_MASK_X_( width, lsb ) (((1 << width)-1) << lsb)
#endif
#ifndef REG_LSB
#define REG_LSB( scope, reg, field ) reg_##scope##_##reg##___##field##___lsb
#endif
#ifndef REG_BIT
#define REG_BIT( scope, reg, field ) reg_##scope##_##reg##___##field##___bit
#endif
#ifndef REG_ADDR
#define REG_ADDR( scope, inst, reg ) REG_ADDR_X_(inst, reg_##scope##_##reg##_offset)
#define REG_ADDR_X_( inst, offs ) ((inst) + offs)
#endif
#ifndef REG_ADDR_VECT
#define REG_ADDR_VECT( scope, inst, reg, index ) \
REG_ADDR_VECT_X_(inst, reg_##scope##_##reg##_offset, index, \
STRIDE_##scope##_##reg )
#define REG_ADDR_VECT_X_( inst, offs, index, stride ) \
((inst) + offs + (index) * stride)
#endif
/* Register rw_mm_cfg, scope mmu, type rw */
#define reg_mmu_rw_mm_cfg___seg_0___lsb 0
#define reg_mmu_rw_mm_cfg___seg_0___width 1
#define reg_mmu_rw_mm_cfg___seg_0___bit 0
#define reg_mmu_rw_mm_cfg___seg_1___lsb 1
#define reg_mmu_rw_mm_cfg___seg_1___width 1
#define reg_mmu_rw_mm_cfg___seg_1___bit 1
#define reg_mmu_rw_mm_cfg___seg_2___lsb 2
#define reg_mmu_rw_mm_cfg___seg_2___width 1
#define reg_mmu_rw_mm_cfg___seg_2___bit 2
#define reg_mmu_rw_mm_cfg___seg_3___lsb 3
#define reg_mmu_rw_mm_cfg___seg_3___width 1
#define reg_mmu_rw_mm_cfg___seg_3___bit 3
#define reg_mmu_rw_mm_cfg___seg_4___lsb 4
#define reg_mmu_rw_mm_cfg___seg_4___width 1
#define reg_mmu_rw_mm_cfg___seg_4___bit 4
#define reg_mmu_rw_mm_cfg___seg_5___lsb 5
#define reg_mmu_rw_mm_cfg___seg_5___width 1
#define reg_mmu_rw_mm_cfg___seg_5___bit 5
#define reg_mmu_rw_mm_cfg___seg_6___lsb 6
#define reg_mmu_rw_mm_cfg___seg_6___width 1
#define reg_mmu_rw_mm_cfg___seg_6___bit 6
#define reg_mmu_rw_mm_cfg___seg_7___lsb 7
#define reg_mmu_rw_mm_cfg___seg_7___width 1
#define reg_mmu_rw_mm_cfg___seg_7___bit 7
#define reg_mmu_rw_mm_cfg___seg_8___lsb 8
#define reg_mmu_rw_mm_cfg___seg_8___width 1
#define reg_mmu_rw_mm_cfg___seg_8___bit 8
#define reg_mmu_rw_mm_cfg___seg_9___lsb 9
#define reg_mmu_rw_mm_cfg___seg_9___width 1
#define reg_mmu_rw_mm_cfg___seg_9___bit 9
#define reg_mmu_rw_mm_cfg___seg_a___lsb 10
#define reg_mmu_rw_mm_cfg___seg_a___width 1
#define reg_mmu_rw_mm_cfg___seg_a___bit 10
#define reg_mmu_rw_mm_cfg___seg_b___lsb 11
#define reg_mmu_rw_mm_cfg___seg_b___width 1
#define reg_mmu_rw_mm_cfg___seg_b___bit 11
#define reg_mmu_rw_mm_cfg___seg_c___lsb 12
#define reg_mmu_rw_mm_cfg___seg_c___width 1
#define reg_mmu_rw_mm_cfg___seg_c___bit 12
#define reg_mmu_rw_mm_cfg___seg_d___lsb 13
#define reg_mmu_rw_mm_cfg___seg_d___width 1
#define reg_mmu_rw_mm_cfg___seg_d___bit 13
#define reg_mmu_rw_mm_cfg___seg_e___lsb 14
#define reg_mmu_rw_mm_cfg___seg_e___width 1
#define reg_mmu_rw_mm_cfg___seg_e___bit 14
#define reg_mmu_rw_mm_cfg___seg_f___lsb 15
#define reg_mmu_rw_mm_cfg___seg_f___width 1
#define reg_mmu_rw_mm_cfg___seg_f___bit 15
#define reg_mmu_rw_mm_cfg___inv___lsb 16
#define reg_mmu_rw_mm_cfg___inv___width 1
#define reg_mmu_rw_mm_cfg___inv___bit 16
#define reg_mmu_rw_mm_cfg___ex___lsb 17
#define reg_mmu_rw_mm_cfg___ex___width 1
#define reg_mmu_rw_mm_cfg___ex___bit 17
#define reg_mmu_rw_mm_cfg___acc___lsb 18
#define reg_mmu_rw_mm_cfg___acc___width 1
#define reg_mmu_rw_mm_cfg___acc___bit 18
#define reg_mmu_rw_mm_cfg___we___lsb 19
#define reg_mmu_rw_mm_cfg___we___width 1
#define reg_mmu_rw_mm_cfg___we___bit 19
#define reg_mmu_rw_mm_cfg_offset 0
/* Register rw_mm_kbase_lo, scope mmu, type rw */
#define reg_mmu_rw_mm_kbase_lo___base_0___lsb 0
#define reg_mmu_rw_mm_kbase_lo___base_0___width 4
#define reg_mmu_rw_mm_kbase_lo___base_1___lsb 4
#define reg_mmu_rw_mm_kbase_lo___base_1___width 4
#define reg_mmu_rw_mm_kbase_lo___base_2___lsb 8
#define reg_mmu_rw_mm_kbase_lo___base_2___width 4
#define reg_mmu_rw_mm_kbase_lo___base_3___lsb 12
#define reg_mmu_rw_mm_kbase_lo___base_3___width 4
#define reg_mmu_rw_mm_kbase_lo___base_4___lsb 16
#define reg_mmu_rw_mm_kbase_lo___base_4___width 4
#define reg_mmu_rw_mm_kbase_lo___base_5___lsb 20
#define reg_mmu_rw_mm_kbase_lo___base_5___width 4
#define reg_mmu_rw_mm_kbase_lo___base_6___lsb 24
#define reg_mmu_rw_mm_kbase_lo___base_6___width 4
#define reg_mmu_rw_mm_kbase_lo___base_7___lsb 28
#define reg_mmu_rw_mm_kbase_lo___base_7___width 4
#define reg_mmu_rw_mm_kbase_lo_offset 4
/* Register rw_mm_kbase_hi, scope mmu, type rw */
#define reg_mmu_rw_mm_kbase_hi___base_8___lsb 0
#define reg_mmu_rw_mm_kbase_hi___base_8___width 4
#define reg_mmu_rw_mm_kbase_hi___base_9___lsb 4
#define reg_mmu_rw_mm_kbase_hi___base_9___width 4
#define reg_mmu_rw_mm_kbase_hi___base_a___lsb 8
#define reg_mmu_rw_mm_kbase_hi___base_a___width 4
#define reg_mmu_rw_mm_kbase_hi___base_b___lsb 12
#define reg_mmu_rw_mm_kbase_hi___base_b___width 4
#define reg_mmu_rw_mm_kbase_hi___base_c___lsb 16
#define reg_mmu_rw_mm_kbase_hi___base_c___width 4
#define reg_mmu_rw_mm_kbase_hi___base_d___lsb 20
#define reg_mmu_rw_mm_kbase_hi___base_d___width 4
#define reg_mmu_rw_mm_kbase_hi___base_e___lsb 24
#define reg_mmu_rw_mm_kbase_hi___base_e___width 4
#define reg_mmu_rw_mm_kbase_hi___base_f___lsb 28
#define reg_mmu_rw_mm_kbase_hi___base_f___width 4
#define reg_mmu_rw_mm_kbase_hi_offset 8
/* Register r_mm_cause, scope mmu, type r */
#define reg_mmu_r_mm_cause___pid___lsb 0
#define reg_mmu_r_mm_cause___pid___width 8
#define reg_mmu_r_mm_cause___op___lsb 8
#define reg_mmu_r_mm_cause___op___width 2
#define reg_mmu_r_mm_cause___vpn___lsb 13
#define reg_mmu_r_mm_cause___vpn___width 19
#define reg_mmu_r_mm_cause_offset 12
/* Register rw_mm_tlb_sel, scope mmu, type rw */
#define reg_mmu_rw_mm_tlb_sel___idx___lsb 0
#define reg_mmu_rw_mm_tlb_sel___idx___width 4
#define reg_mmu_rw_mm_tlb_sel___set___lsb 4
#define reg_mmu_rw_mm_tlb_sel___set___width 2
#define reg_mmu_rw_mm_tlb_sel_offset 16
/* Register rw_mm_tlb_lo, scope mmu, type rw */
#define reg_mmu_rw_mm_tlb_lo___x___lsb 0
#define reg_mmu_rw_mm_tlb_lo___x___width 1
#define reg_mmu_rw_mm_tlb_lo___x___bit 0
#define reg_mmu_rw_mm_tlb_lo___w___lsb 1
#define reg_mmu_rw_mm_tlb_lo___w___width 1
#define reg_mmu_rw_mm_tlb_lo___w___bit 1
#define reg_mmu_rw_mm_tlb_lo___k___lsb 2
#define reg_mmu_rw_mm_tlb_lo___k___width 1
#define reg_mmu_rw_mm_tlb_lo___k___bit 2
#define reg_mmu_rw_mm_tlb_lo___v___lsb 3
#define reg_mmu_rw_mm_tlb_lo___v___width 1
#define reg_mmu_rw_mm_tlb_lo___v___bit 3
#define reg_mmu_rw_mm_tlb_lo___g___lsb 4
#define reg_mmu_rw_mm_tlb_lo___g___width 1
#define reg_mmu_rw_mm_tlb_lo___g___bit 4
#define reg_mmu_rw_mm_tlb_lo___pfn___lsb 13
#define reg_mmu_rw_mm_tlb_lo___pfn___width 19
#define reg_mmu_rw_mm_tlb_lo_offset 20
/* Register rw_mm_tlb_hi, scope mmu, type rw */
#define reg_mmu_rw_mm_tlb_hi___pid___lsb 0
#define reg_mmu_rw_mm_tlb_hi___pid___width 8
#define reg_mmu_rw_mm_tlb_hi___vpn___lsb 13
#define reg_mmu_rw_mm_tlb_hi___vpn___width 19
#define reg_mmu_rw_mm_tlb_hi_offset 24
/* Constants */
#define regk_mmu_execute 0x00000000
#define regk_mmu_flush 0x00000003
#define regk_mmu_linear 0x00000001
#define regk_mmu_no 0x00000000
#define regk_mmu_off 0x00000000
#define regk_mmu_on 0x00000001
#define regk_mmu_page 0x00000000
#define regk_mmu_read 0x00000001
#define regk_mmu_write 0x00000002
#define regk_mmu_yes 0x00000001
#endif /* __mmu_defs_asm_h */

View file

@ -0,0 +1,7 @@
#define RW_MM_CFG 0
#define RW_MM_KBASE_LO 1
#define RW_MM_KBASE_HI 2
#define R_MM_CAUSE 3
#define RW_MM_TLB_SEL 4
#define RW_MM_TLB_LO 5
#define RW_MM_TLB_HI 6

View file

@ -0,0 +1,632 @@
#ifndef __pinmux_defs_asm_h
#define __pinmux_defs_asm_h
/*
* This file is autogenerated from
* file: ../../inst/pinmux/rtl/guinness/pinmux_regs.r
* id: pinmux_regs.r,v 1.40 2005/02/09 16:22:59 perz Exp
* last modfied: Mon Apr 11 16:09:11 2005
*
* by /n/asic/design/tools/rdesc/src/rdes2c -asm --outfile asm/pinmux_defs_asm.h ../../inst/pinmux/rtl/guinness/pinmux_regs.r
* id: $Id: pinmux_defs_asm.h,v 1.1 2005/04/24 18:31:04 starvik Exp $
* Any changes here will be lost.
*
* -*- buffer-read-only: t -*-
*/
#ifndef REG_FIELD
#define REG_FIELD( scope, reg, field, value ) \
REG_FIELD_X_( value, reg_##scope##_##reg##___##field##___lsb )
#define REG_FIELD_X_( value, shift ) ((value) << shift)
#endif
#ifndef REG_STATE
#define REG_STATE( scope, reg, field, symbolic_value ) \
REG_STATE_X_( regk_##scope##_##symbolic_value, reg_##scope##_##reg##___##field##___lsb )
#define REG_STATE_X_( k, shift ) (k << shift)
#endif
#ifndef REG_MASK
#define REG_MASK( scope, reg, field ) \
REG_MASK_X_( reg_##scope##_##reg##___##field##___width, reg_##scope##_##reg##___##field##___lsb )
#define REG_MASK_X_( width, lsb ) (((1 << width)-1) << lsb)
#endif
#ifndef REG_LSB
#define REG_LSB( scope, reg, field ) reg_##scope##_##reg##___##field##___lsb
#endif
#ifndef REG_BIT
#define REG_BIT( scope, reg, field ) reg_##scope##_##reg##___##field##___bit
#endif
#ifndef REG_ADDR
#define REG_ADDR( scope, inst, reg ) REG_ADDR_X_(inst, reg_##scope##_##reg##_offset)
#define REG_ADDR_X_( inst, offs ) ((inst) + offs)
#endif
#ifndef REG_ADDR_VECT
#define REG_ADDR_VECT( scope, inst, reg, index ) \
REG_ADDR_VECT_X_(inst, reg_##scope##_##reg##_offset, index, \
STRIDE_##scope##_##reg )
#define REG_ADDR_VECT_X_( inst, offs, index, stride ) \
((inst) + offs + (index) * stride)
#endif
/* Register rw_pa, scope pinmux, type rw */
#define reg_pinmux_rw_pa___pa0___lsb 0
#define reg_pinmux_rw_pa___pa0___width 1
#define reg_pinmux_rw_pa___pa0___bit 0
#define reg_pinmux_rw_pa___pa1___lsb 1
#define reg_pinmux_rw_pa___pa1___width 1
#define reg_pinmux_rw_pa___pa1___bit 1
#define reg_pinmux_rw_pa___pa2___lsb 2
#define reg_pinmux_rw_pa___pa2___width 1
#define reg_pinmux_rw_pa___pa2___bit 2
#define reg_pinmux_rw_pa___pa3___lsb 3
#define reg_pinmux_rw_pa___pa3___width 1
#define reg_pinmux_rw_pa___pa3___bit 3
#define reg_pinmux_rw_pa___pa4___lsb 4
#define reg_pinmux_rw_pa___pa4___width 1
#define reg_pinmux_rw_pa___pa4___bit 4
#define reg_pinmux_rw_pa___pa5___lsb 5
#define reg_pinmux_rw_pa___pa5___width 1
#define reg_pinmux_rw_pa___pa5___bit 5
#define reg_pinmux_rw_pa___pa6___lsb 6
#define reg_pinmux_rw_pa___pa6___width 1
#define reg_pinmux_rw_pa___pa6___bit 6
#define reg_pinmux_rw_pa___pa7___lsb 7
#define reg_pinmux_rw_pa___pa7___width 1
#define reg_pinmux_rw_pa___pa7___bit 7
#define reg_pinmux_rw_pa___csp2_n___lsb 8
#define reg_pinmux_rw_pa___csp2_n___width 1
#define reg_pinmux_rw_pa___csp2_n___bit 8
#define reg_pinmux_rw_pa___csp3_n___lsb 9
#define reg_pinmux_rw_pa___csp3_n___width 1
#define reg_pinmux_rw_pa___csp3_n___bit 9
#define reg_pinmux_rw_pa___csp5_n___lsb 10
#define reg_pinmux_rw_pa___csp5_n___width 1
#define reg_pinmux_rw_pa___csp5_n___bit 10
#define reg_pinmux_rw_pa___csp6_n___lsb 11
#define reg_pinmux_rw_pa___csp6_n___width 1
#define reg_pinmux_rw_pa___csp6_n___bit 11
#define reg_pinmux_rw_pa___hsh4___lsb 12
#define reg_pinmux_rw_pa___hsh4___width 1
#define reg_pinmux_rw_pa___hsh4___bit 12
#define reg_pinmux_rw_pa___hsh5___lsb 13
#define reg_pinmux_rw_pa___hsh5___width 1
#define reg_pinmux_rw_pa___hsh5___bit 13
#define reg_pinmux_rw_pa___hsh6___lsb 14
#define reg_pinmux_rw_pa___hsh6___width 1
#define reg_pinmux_rw_pa___hsh6___bit 14
#define reg_pinmux_rw_pa___hsh7___lsb 15
#define reg_pinmux_rw_pa___hsh7___width 1
#define reg_pinmux_rw_pa___hsh7___bit 15
#define reg_pinmux_rw_pa_offset 0
/* Register rw_hwprot, scope pinmux, type rw */
#define reg_pinmux_rw_hwprot___ser1___lsb 0
#define reg_pinmux_rw_hwprot___ser1___width 1
#define reg_pinmux_rw_hwprot___ser1___bit 0
#define reg_pinmux_rw_hwprot___ser2___lsb 1
#define reg_pinmux_rw_hwprot___ser2___width 1
#define reg_pinmux_rw_hwprot___ser2___bit 1
#define reg_pinmux_rw_hwprot___ser3___lsb 2
#define reg_pinmux_rw_hwprot___ser3___width 1
#define reg_pinmux_rw_hwprot___ser3___bit 2
#define reg_pinmux_rw_hwprot___sser0___lsb 3
#define reg_pinmux_rw_hwprot___sser0___width 1
#define reg_pinmux_rw_hwprot___sser0___bit 3
#define reg_pinmux_rw_hwprot___sser1___lsb 4
#define reg_pinmux_rw_hwprot___sser1___width 1
#define reg_pinmux_rw_hwprot___sser1___bit 4
#define reg_pinmux_rw_hwprot___ata0___lsb 5
#define reg_pinmux_rw_hwprot___ata0___width 1
#define reg_pinmux_rw_hwprot___ata0___bit 5
#define reg_pinmux_rw_hwprot___ata1___lsb 6
#define reg_pinmux_rw_hwprot___ata1___width 1
#define reg_pinmux_rw_hwprot___ata1___bit 6
#define reg_pinmux_rw_hwprot___ata2___lsb 7
#define reg_pinmux_rw_hwprot___ata2___width 1
#define reg_pinmux_rw_hwprot___ata2___bit 7
#define reg_pinmux_rw_hwprot___ata3___lsb 8
#define reg_pinmux_rw_hwprot___ata3___width 1
#define reg_pinmux_rw_hwprot___ata3___bit 8
#define reg_pinmux_rw_hwprot___ata___lsb 9
#define reg_pinmux_rw_hwprot___ata___width 1
#define reg_pinmux_rw_hwprot___ata___bit 9
#define reg_pinmux_rw_hwprot___eth1___lsb 10
#define reg_pinmux_rw_hwprot___eth1___width 1
#define reg_pinmux_rw_hwprot___eth1___bit 10
#define reg_pinmux_rw_hwprot___eth1_mgm___lsb 11
#define reg_pinmux_rw_hwprot___eth1_mgm___width 1
#define reg_pinmux_rw_hwprot___eth1_mgm___bit 11
#define reg_pinmux_rw_hwprot___timer___lsb 12
#define reg_pinmux_rw_hwprot___timer___width 1
#define reg_pinmux_rw_hwprot___timer___bit 12
#define reg_pinmux_rw_hwprot___p21___lsb 13
#define reg_pinmux_rw_hwprot___p21___width 1
#define reg_pinmux_rw_hwprot___p21___bit 13
#define reg_pinmux_rw_hwprot_offset 4
/* Register rw_pb_gio, scope pinmux, type rw */
#define reg_pinmux_rw_pb_gio___pb0___lsb 0
#define reg_pinmux_rw_pb_gio___pb0___width 1
#define reg_pinmux_rw_pb_gio___pb0___bit 0
#define reg_pinmux_rw_pb_gio___pb1___lsb 1
#define reg_pinmux_rw_pb_gio___pb1___width 1
#define reg_pinmux_rw_pb_gio___pb1___bit 1
#define reg_pinmux_rw_pb_gio___pb2___lsb 2
#define reg_pinmux_rw_pb_gio___pb2___width 1
#define reg_pinmux_rw_pb_gio___pb2___bit 2
#define reg_pinmux_rw_pb_gio___pb3___lsb 3
#define reg_pinmux_rw_pb_gio___pb3___width 1
#define reg_pinmux_rw_pb_gio___pb3___bit 3
#define reg_pinmux_rw_pb_gio___pb4___lsb 4
#define reg_pinmux_rw_pb_gio___pb4___width 1
#define reg_pinmux_rw_pb_gio___pb4___bit 4
#define reg_pinmux_rw_pb_gio___pb5___lsb 5
#define reg_pinmux_rw_pb_gio___pb5___width 1
#define reg_pinmux_rw_pb_gio___pb5___bit 5
#define reg_pinmux_rw_pb_gio___pb6___lsb 6
#define reg_pinmux_rw_pb_gio___pb6___width 1
#define reg_pinmux_rw_pb_gio___pb6___bit 6
#define reg_pinmux_rw_pb_gio___pb7___lsb 7
#define reg_pinmux_rw_pb_gio___pb7___width 1
#define reg_pinmux_rw_pb_gio___pb7___bit 7
#define reg_pinmux_rw_pb_gio___pb8___lsb 8
#define reg_pinmux_rw_pb_gio___pb8___width 1
#define reg_pinmux_rw_pb_gio___pb8___bit 8
#define reg_pinmux_rw_pb_gio___pb9___lsb 9
#define reg_pinmux_rw_pb_gio___pb9___width 1
#define reg_pinmux_rw_pb_gio___pb9___bit 9
#define reg_pinmux_rw_pb_gio___pb10___lsb 10
#define reg_pinmux_rw_pb_gio___pb10___width 1
#define reg_pinmux_rw_pb_gio___pb10___bit 10
#define reg_pinmux_rw_pb_gio___pb11___lsb 11
#define reg_pinmux_rw_pb_gio___pb11___width 1
#define reg_pinmux_rw_pb_gio___pb11___bit 11
#define reg_pinmux_rw_pb_gio___pb12___lsb 12
#define reg_pinmux_rw_pb_gio___pb12___width 1
#define reg_pinmux_rw_pb_gio___pb12___bit 12
#define reg_pinmux_rw_pb_gio___pb13___lsb 13
#define reg_pinmux_rw_pb_gio___pb13___width 1
#define reg_pinmux_rw_pb_gio___pb13___bit 13
#define reg_pinmux_rw_pb_gio___pb14___lsb 14
#define reg_pinmux_rw_pb_gio___pb14___width 1
#define reg_pinmux_rw_pb_gio___pb14___bit 14
#define reg_pinmux_rw_pb_gio___pb15___lsb 15
#define reg_pinmux_rw_pb_gio___pb15___width 1
#define reg_pinmux_rw_pb_gio___pb15___bit 15
#define reg_pinmux_rw_pb_gio___pb16___lsb 16
#define reg_pinmux_rw_pb_gio___pb16___width 1
#define reg_pinmux_rw_pb_gio___pb16___bit 16
#define reg_pinmux_rw_pb_gio___pb17___lsb 17
#define reg_pinmux_rw_pb_gio___pb17___width 1
#define reg_pinmux_rw_pb_gio___pb17___bit 17
#define reg_pinmux_rw_pb_gio_offset 8
/* Register rw_pb_iop, scope pinmux, type rw */
#define reg_pinmux_rw_pb_iop___pb0___lsb 0
#define reg_pinmux_rw_pb_iop___pb0___width 1
#define reg_pinmux_rw_pb_iop___pb0___bit 0
#define reg_pinmux_rw_pb_iop___pb1___lsb 1
#define reg_pinmux_rw_pb_iop___pb1___width 1
#define reg_pinmux_rw_pb_iop___pb1___bit 1
#define reg_pinmux_rw_pb_iop___pb2___lsb 2
#define reg_pinmux_rw_pb_iop___pb2___width 1
#define reg_pinmux_rw_pb_iop___pb2___bit 2
#define reg_pinmux_rw_pb_iop___pb3___lsb 3
#define reg_pinmux_rw_pb_iop___pb3___width 1
#define reg_pinmux_rw_pb_iop___pb3___bit 3
#define reg_pinmux_rw_pb_iop___pb4___lsb 4
#define reg_pinmux_rw_pb_iop___pb4___width 1
#define reg_pinmux_rw_pb_iop___pb4___bit 4
#define reg_pinmux_rw_pb_iop___pb5___lsb 5
#define reg_pinmux_rw_pb_iop___pb5___width 1
#define reg_pinmux_rw_pb_iop___pb5___bit 5
#define reg_pinmux_rw_pb_iop___pb6___lsb 6
#define reg_pinmux_rw_pb_iop___pb6___width 1
#define reg_pinmux_rw_pb_iop___pb6___bit 6
#define reg_pinmux_rw_pb_iop___pb7___lsb 7
#define reg_pinmux_rw_pb_iop___pb7___width 1
#define reg_pinmux_rw_pb_iop___pb7___bit 7
#define reg_pinmux_rw_pb_iop___pb8___lsb 8
#define reg_pinmux_rw_pb_iop___pb8___width 1
#define reg_pinmux_rw_pb_iop___pb8___bit 8
#define reg_pinmux_rw_pb_iop___pb9___lsb 9
#define reg_pinmux_rw_pb_iop___pb9___width 1
#define reg_pinmux_rw_pb_iop___pb9___bit 9
#define reg_pinmux_rw_pb_iop___pb10___lsb 10
#define reg_pinmux_rw_pb_iop___pb10___width 1
#define reg_pinmux_rw_pb_iop___pb10___bit 10
#define reg_pinmux_rw_pb_iop___pb11___lsb 11
#define reg_pinmux_rw_pb_iop___pb11___width 1
#define reg_pinmux_rw_pb_iop___pb11___bit 11
#define reg_pinmux_rw_pb_iop___pb12___lsb 12
#define reg_pinmux_rw_pb_iop___pb12___width 1
#define reg_pinmux_rw_pb_iop___pb12___bit 12
#define reg_pinmux_rw_pb_iop___pb13___lsb 13
#define reg_pinmux_rw_pb_iop___pb13___width 1
#define reg_pinmux_rw_pb_iop___pb13___bit 13
#define reg_pinmux_rw_pb_iop___pb14___lsb 14
#define reg_pinmux_rw_pb_iop___pb14___width 1
#define reg_pinmux_rw_pb_iop___pb14___bit 14
#define reg_pinmux_rw_pb_iop___pb15___lsb 15
#define reg_pinmux_rw_pb_iop___pb15___width 1
#define reg_pinmux_rw_pb_iop___pb15___bit 15
#define reg_pinmux_rw_pb_iop___pb16___lsb 16
#define reg_pinmux_rw_pb_iop___pb16___width 1
#define reg_pinmux_rw_pb_iop___pb16___bit 16
#define reg_pinmux_rw_pb_iop___pb17___lsb 17
#define reg_pinmux_rw_pb_iop___pb17___width 1
#define reg_pinmux_rw_pb_iop___pb17___bit 17
#define reg_pinmux_rw_pb_iop_offset 12
/* Register rw_pc_gio, scope pinmux, type rw */
#define reg_pinmux_rw_pc_gio___pc0___lsb 0
#define reg_pinmux_rw_pc_gio___pc0___width 1
#define reg_pinmux_rw_pc_gio___pc0___bit 0
#define reg_pinmux_rw_pc_gio___pc1___lsb 1
#define reg_pinmux_rw_pc_gio___pc1___width 1
#define reg_pinmux_rw_pc_gio___pc1___bit 1
#define reg_pinmux_rw_pc_gio___pc2___lsb 2
#define reg_pinmux_rw_pc_gio___pc2___width 1
#define reg_pinmux_rw_pc_gio___pc2___bit 2
#define reg_pinmux_rw_pc_gio___pc3___lsb 3
#define reg_pinmux_rw_pc_gio___pc3___width 1
#define reg_pinmux_rw_pc_gio___pc3___bit 3
#define reg_pinmux_rw_pc_gio___pc4___lsb 4
#define reg_pinmux_rw_pc_gio___pc4___width 1
#define reg_pinmux_rw_pc_gio___pc4___bit 4
#define reg_pinmux_rw_pc_gio___pc5___lsb 5
#define reg_pinmux_rw_pc_gio___pc5___width 1
#define reg_pinmux_rw_pc_gio___pc5___bit 5
#define reg_pinmux_rw_pc_gio___pc6___lsb 6
#define reg_pinmux_rw_pc_gio___pc6___width 1
#define reg_pinmux_rw_pc_gio___pc6___bit 6
#define reg_pinmux_rw_pc_gio___pc7___lsb 7
#define reg_pinmux_rw_pc_gio___pc7___width 1
#define reg_pinmux_rw_pc_gio___pc7___bit 7
#define reg_pinmux_rw_pc_gio___pc8___lsb 8
#define reg_pinmux_rw_pc_gio___pc8___width 1
#define reg_pinmux_rw_pc_gio___pc8___bit 8
#define reg_pinmux_rw_pc_gio___pc9___lsb 9
#define reg_pinmux_rw_pc_gio___pc9___width 1
#define reg_pinmux_rw_pc_gio___pc9___bit 9
#define reg_pinmux_rw_pc_gio___pc10___lsb 10
#define reg_pinmux_rw_pc_gio___pc10___width 1
#define reg_pinmux_rw_pc_gio___pc10___bit 10
#define reg_pinmux_rw_pc_gio___pc11___lsb 11
#define reg_pinmux_rw_pc_gio___pc11___width 1
#define reg_pinmux_rw_pc_gio___pc11___bit 11
#define reg_pinmux_rw_pc_gio___pc12___lsb 12
#define reg_pinmux_rw_pc_gio___pc12___width 1
#define reg_pinmux_rw_pc_gio___pc12___bit 12
#define reg_pinmux_rw_pc_gio___pc13___lsb 13
#define reg_pinmux_rw_pc_gio___pc13___width 1
#define reg_pinmux_rw_pc_gio___pc13___bit 13
#define reg_pinmux_rw_pc_gio___pc14___lsb 14
#define reg_pinmux_rw_pc_gio___pc14___width 1
#define reg_pinmux_rw_pc_gio___pc14___bit 14
#define reg_pinmux_rw_pc_gio___pc15___lsb 15
#define reg_pinmux_rw_pc_gio___pc15___width 1
#define reg_pinmux_rw_pc_gio___pc15___bit 15
#define reg_pinmux_rw_pc_gio___pc16___lsb 16
#define reg_pinmux_rw_pc_gio___pc16___width 1
#define reg_pinmux_rw_pc_gio___pc16___bit 16
#define reg_pinmux_rw_pc_gio___pc17___lsb 17
#define reg_pinmux_rw_pc_gio___pc17___width 1
#define reg_pinmux_rw_pc_gio___pc17___bit 17
#define reg_pinmux_rw_pc_gio_offset 16
/* Register rw_pc_iop, scope pinmux, type rw */
#define reg_pinmux_rw_pc_iop___pc0___lsb 0
#define reg_pinmux_rw_pc_iop___pc0___width 1
#define reg_pinmux_rw_pc_iop___pc0___bit 0
#define reg_pinmux_rw_pc_iop___pc1___lsb 1
#define reg_pinmux_rw_pc_iop___pc1___width 1
#define reg_pinmux_rw_pc_iop___pc1___bit 1
#define reg_pinmux_rw_pc_iop___pc2___lsb 2
#define reg_pinmux_rw_pc_iop___pc2___width 1
#define reg_pinmux_rw_pc_iop___pc2___bit 2
#define reg_pinmux_rw_pc_iop___pc3___lsb 3
#define reg_pinmux_rw_pc_iop___pc3___width 1
#define reg_pinmux_rw_pc_iop___pc3___bit 3
#define reg_pinmux_rw_pc_iop___pc4___lsb 4
#define reg_pinmux_rw_pc_iop___pc4___width 1
#define reg_pinmux_rw_pc_iop___pc4___bit 4
#define reg_pinmux_rw_pc_iop___pc5___lsb 5
#define reg_pinmux_rw_pc_iop___pc5___width 1
#define reg_pinmux_rw_pc_iop___pc5___bit 5
#define reg_pinmux_rw_pc_iop___pc6___lsb 6
#define reg_pinmux_rw_pc_iop___pc6___width 1
#define reg_pinmux_rw_pc_iop___pc6___bit 6
#define reg_pinmux_rw_pc_iop___pc7___lsb 7
#define reg_pinmux_rw_pc_iop___pc7___width 1
#define reg_pinmux_rw_pc_iop___pc7___bit 7
#define reg_pinmux_rw_pc_iop___pc8___lsb 8
#define reg_pinmux_rw_pc_iop___pc8___width 1
#define reg_pinmux_rw_pc_iop___pc8___bit 8
#define reg_pinmux_rw_pc_iop___pc9___lsb 9
#define reg_pinmux_rw_pc_iop___pc9___width 1
#define reg_pinmux_rw_pc_iop___pc9___bit 9
#define reg_pinmux_rw_pc_iop___pc10___lsb 10
#define reg_pinmux_rw_pc_iop___pc10___width 1
#define reg_pinmux_rw_pc_iop___pc10___bit 10
#define reg_pinmux_rw_pc_iop___pc11___lsb 11
#define reg_pinmux_rw_pc_iop___pc11___width 1
#define reg_pinmux_rw_pc_iop___pc11___bit 11
#define reg_pinmux_rw_pc_iop___pc12___lsb 12
#define reg_pinmux_rw_pc_iop___pc12___width 1
#define reg_pinmux_rw_pc_iop___pc12___bit 12
#define reg_pinmux_rw_pc_iop___pc13___lsb 13
#define reg_pinmux_rw_pc_iop___pc13___width 1
#define reg_pinmux_rw_pc_iop___pc13___bit 13
#define reg_pinmux_rw_pc_iop___pc14___lsb 14
#define reg_pinmux_rw_pc_iop___pc14___width 1
#define reg_pinmux_rw_pc_iop___pc14___bit 14
#define reg_pinmux_rw_pc_iop___pc15___lsb 15
#define reg_pinmux_rw_pc_iop___pc15___width 1
#define reg_pinmux_rw_pc_iop___pc15___bit 15
#define reg_pinmux_rw_pc_iop___pc16___lsb 16
#define reg_pinmux_rw_pc_iop___pc16___width 1
#define reg_pinmux_rw_pc_iop___pc16___bit 16
#define reg_pinmux_rw_pc_iop___pc17___lsb 17
#define reg_pinmux_rw_pc_iop___pc17___width 1
#define reg_pinmux_rw_pc_iop___pc17___bit 17
#define reg_pinmux_rw_pc_iop_offset 20
/* Register rw_pd_gio, scope pinmux, type rw */
#define reg_pinmux_rw_pd_gio___pd0___lsb 0
#define reg_pinmux_rw_pd_gio___pd0___width 1
#define reg_pinmux_rw_pd_gio___pd0___bit 0
#define reg_pinmux_rw_pd_gio___pd1___lsb 1
#define reg_pinmux_rw_pd_gio___pd1___width 1
#define reg_pinmux_rw_pd_gio___pd1___bit 1
#define reg_pinmux_rw_pd_gio___pd2___lsb 2
#define reg_pinmux_rw_pd_gio___pd2___width 1
#define reg_pinmux_rw_pd_gio___pd2___bit 2
#define reg_pinmux_rw_pd_gio___pd3___lsb 3
#define reg_pinmux_rw_pd_gio___pd3___width 1
#define reg_pinmux_rw_pd_gio___pd3___bit 3
#define reg_pinmux_rw_pd_gio___pd4___lsb 4
#define reg_pinmux_rw_pd_gio___pd4___width 1
#define reg_pinmux_rw_pd_gio___pd4___bit 4
#define reg_pinmux_rw_pd_gio___pd5___lsb 5
#define reg_pinmux_rw_pd_gio___pd5___width 1
#define reg_pinmux_rw_pd_gio___pd5___bit 5
#define reg_pinmux_rw_pd_gio___pd6___lsb 6
#define reg_pinmux_rw_pd_gio___pd6___width 1
#define reg_pinmux_rw_pd_gio___pd6___bit 6
#define reg_pinmux_rw_pd_gio___pd7___lsb 7
#define reg_pinmux_rw_pd_gio___pd7___width 1
#define reg_pinmux_rw_pd_gio___pd7___bit 7
#define reg_pinmux_rw_pd_gio___pd8___lsb 8
#define reg_pinmux_rw_pd_gio___pd8___width 1
#define reg_pinmux_rw_pd_gio___pd8___bit 8
#define reg_pinmux_rw_pd_gio___pd9___lsb 9
#define reg_pinmux_rw_pd_gio___pd9___width 1
#define reg_pinmux_rw_pd_gio___pd9___bit 9
#define reg_pinmux_rw_pd_gio___pd10___lsb 10
#define reg_pinmux_rw_pd_gio___pd10___width 1
#define reg_pinmux_rw_pd_gio___pd10___bit 10
#define reg_pinmux_rw_pd_gio___pd11___lsb 11
#define reg_pinmux_rw_pd_gio___pd11___width 1
#define reg_pinmux_rw_pd_gio___pd11___bit 11
#define reg_pinmux_rw_pd_gio___pd12___lsb 12
#define reg_pinmux_rw_pd_gio___pd12___width 1
#define reg_pinmux_rw_pd_gio___pd12___bit 12
#define reg_pinmux_rw_pd_gio___pd13___lsb 13
#define reg_pinmux_rw_pd_gio___pd13___width 1
#define reg_pinmux_rw_pd_gio___pd13___bit 13
#define reg_pinmux_rw_pd_gio___pd14___lsb 14
#define reg_pinmux_rw_pd_gio___pd14___width 1
#define reg_pinmux_rw_pd_gio___pd14___bit 14
#define reg_pinmux_rw_pd_gio___pd15___lsb 15
#define reg_pinmux_rw_pd_gio___pd15___width 1
#define reg_pinmux_rw_pd_gio___pd15___bit 15
#define reg_pinmux_rw_pd_gio___pd16___lsb 16
#define reg_pinmux_rw_pd_gio___pd16___width 1
#define reg_pinmux_rw_pd_gio___pd16___bit 16
#define reg_pinmux_rw_pd_gio___pd17___lsb 17
#define reg_pinmux_rw_pd_gio___pd17___width 1
#define reg_pinmux_rw_pd_gio___pd17___bit 17
#define reg_pinmux_rw_pd_gio_offset 24
/* Register rw_pd_iop, scope pinmux, type rw */
#define reg_pinmux_rw_pd_iop___pd0___lsb 0
#define reg_pinmux_rw_pd_iop___pd0___width 1
#define reg_pinmux_rw_pd_iop___pd0___bit 0
#define reg_pinmux_rw_pd_iop___pd1___lsb 1
#define reg_pinmux_rw_pd_iop___pd1___width 1
#define reg_pinmux_rw_pd_iop___pd1___bit 1
#define reg_pinmux_rw_pd_iop___pd2___lsb 2
#define reg_pinmux_rw_pd_iop___pd2___width 1
#define reg_pinmux_rw_pd_iop___pd2___bit 2
#define reg_pinmux_rw_pd_iop___pd3___lsb 3
#define reg_pinmux_rw_pd_iop___pd3___width 1
#define reg_pinmux_rw_pd_iop___pd3___bit 3
#define reg_pinmux_rw_pd_iop___pd4___lsb 4
#define reg_pinmux_rw_pd_iop___pd4___width 1
#define reg_pinmux_rw_pd_iop___pd4___bit 4
#define reg_pinmux_rw_pd_iop___pd5___lsb 5
#define reg_pinmux_rw_pd_iop___pd5___width 1
#define reg_pinmux_rw_pd_iop___pd5___bit 5
#define reg_pinmux_rw_pd_iop___pd6___lsb 6
#define reg_pinmux_rw_pd_iop___pd6___width 1
#define reg_pinmux_rw_pd_iop___pd6___bit 6
#define reg_pinmux_rw_pd_iop___pd7___lsb 7
#define reg_pinmux_rw_pd_iop___pd7___width 1
#define reg_pinmux_rw_pd_iop___pd7___bit 7
#define reg_pinmux_rw_pd_iop___pd8___lsb 8
#define reg_pinmux_rw_pd_iop___pd8___width 1
#define reg_pinmux_rw_pd_iop___pd8___bit 8
#define reg_pinmux_rw_pd_iop___pd9___lsb 9
#define reg_pinmux_rw_pd_iop___pd9___width 1
#define reg_pinmux_rw_pd_iop___pd9___bit 9
#define reg_pinmux_rw_pd_iop___pd10___lsb 10
#define reg_pinmux_rw_pd_iop___pd10___width 1
#define reg_pinmux_rw_pd_iop___pd10___bit 10
#define reg_pinmux_rw_pd_iop___pd11___lsb 11
#define reg_pinmux_rw_pd_iop___pd11___width 1
#define reg_pinmux_rw_pd_iop___pd11___bit 11
#define reg_pinmux_rw_pd_iop___pd12___lsb 12
#define reg_pinmux_rw_pd_iop___pd12___width 1
#define reg_pinmux_rw_pd_iop___pd12___bit 12
#define reg_pinmux_rw_pd_iop___pd13___lsb 13
#define reg_pinmux_rw_pd_iop___pd13___width 1
#define reg_pinmux_rw_pd_iop___pd13___bit 13
#define reg_pinmux_rw_pd_iop___pd14___lsb 14
#define reg_pinmux_rw_pd_iop___pd14___width 1
#define reg_pinmux_rw_pd_iop___pd14___bit 14
#define reg_pinmux_rw_pd_iop___pd15___lsb 15
#define reg_pinmux_rw_pd_iop___pd15___width 1
#define reg_pinmux_rw_pd_iop___pd15___bit 15
#define reg_pinmux_rw_pd_iop___pd16___lsb 16
#define reg_pinmux_rw_pd_iop___pd16___width 1
#define reg_pinmux_rw_pd_iop___pd16___bit 16
#define reg_pinmux_rw_pd_iop___pd17___lsb 17
#define reg_pinmux_rw_pd_iop___pd17___width 1
#define reg_pinmux_rw_pd_iop___pd17___bit 17
#define reg_pinmux_rw_pd_iop_offset 28
/* Register rw_pe_gio, scope pinmux, type rw */
#define reg_pinmux_rw_pe_gio___pe0___lsb 0
#define reg_pinmux_rw_pe_gio___pe0___width 1
#define reg_pinmux_rw_pe_gio___pe0___bit 0
#define reg_pinmux_rw_pe_gio___pe1___lsb 1
#define reg_pinmux_rw_pe_gio___pe1___width 1
#define reg_pinmux_rw_pe_gio___pe1___bit 1
#define reg_pinmux_rw_pe_gio___pe2___lsb 2
#define reg_pinmux_rw_pe_gio___pe2___width 1
#define reg_pinmux_rw_pe_gio___pe2___bit 2
#define reg_pinmux_rw_pe_gio___pe3___lsb 3
#define reg_pinmux_rw_pe_gio___pe3___width 1
#define reg_pinmux_rw_pe_gio___pe3___bit 3
#define reg_pinmux_rw_pe_gio___pe4___lsb 4
#define reg_pinmux_rw_pe_gio___pe4___width 1
#define reg_pinmux_rw_pe_gio___pe4___bit 4
#define reg_pinmux_rw_pe_gio___pe5___lsb 5
#define reg_pinmux_rw_pe_gio___pe5___width 1
#define reg_pinmux_rw_pe_gio___pe5___bit 5
#define reg_pinmux_rw_pe_gio___pe6___lsb 6
#define reg_pinmux_rw_pe_gio___pe6___width 1
#define reg_pinmux_rw_pe_gio___pe6___bit 6
#define reg_pinmux_rw_pe_gio___pe7___lsb 7
#define reg_pinmux_rw_pe_gio___pe7___width 1
#define reg_pinmux_rw_pe_gio___pe7___bit 7
#define reg_pinmux_rw_pe_gio___pe8___lsb 8
#define reg_pinmux_rw_pe_gio___pe8___width 1
#define reg_pinmux_rw_pe_gio___pe8___bit 8
#define reg_pinmux_rw_pe_gio___pe9___lsb 9
#define reg_pinmux_rw_pe_gio___pe9___width 1
#define reg_pinmux_rw_pe_gio___pe9___bit 9
#define reg_pinmux_rw_pe_gio___pe10___lsb 10
#define reg_pinmux_rw_pe_gio___pe10___width 1
#define reg_pinmux_rw_pe_gio___pe10___bit 10
#define reg_pinmux_rw_pe_gio___pe11___lsb 11
#define reg_pinmux_rw_pe_gio___pe11___width 1
#define reg_pinmux_rw_pe_gio___pe11___bit 11
#define reg_pinmux_rw_pe_gio___pe12___lsb 12
#define reg_pinmux_rw_pe_gio___pe12___width 1
#define reg_pinmux_rw_pe_gio___pe12___bit 12
#define reg_pinmux_rw_pe_gio___pe13___lsb 13
#define reg_pinmux_rw_pe_gio___pe13___width 1
#define reg_pinmux_rw_pe_gio___pe13___bit 13
#define reg_pinmux_rw_pe_gio___pe14___lsb 14
#define reg_pinmux_rw_pe_gio___pe14___width 1
#define reg_pinmux_rw_pe_gio___pe14___bit 14
#define reg_pinmux_rw_pe_gio___pe15___lsb 15
#define reg_pinmux_rw_pe_gio___pe15___width 1
#define reg_pinmux_rw_pe_gio___pe15___bit 15
#define reg_pinmux_rw_pe_gio___pe16___lsb 16
#define reg_pinmux_rw_pe_gio___pe16___width 1
#define reg_pinmux_rw_pe_gio___pe16___bit 16
#define reg_pinmux_rw_pe_gio___pe17___lsb 17
#define reg_pinmux_rw_pe_gio___pe17___width 1
#define reg_pinmux_rw_pe_gio___pe17___bit 17
#define reg_pinmux_rw_pe_gio_offset 32
/* Register rw_pe_iop, scope pinmux, type rw */
#define reg_pinmux_rw_pe_iop___pe0___lsb 0
#define reg_pinmux_rw_pe_iop___pe0___width 1
#define reg_pinmux_rw_pe_iop___pe0___bit 0
#define reg_pinmux_rw_pe_iop___pe1___lsb 1
#define reg_pinmux_rw_pe_iop___pe1___width 1
#define reg_pinmux_rw_pe_iop___pe1___bit 1
#define reg_pinmux_rw_pe_iop___pe2___lsb 2
#define reg_pinmux_rw_pe_iop___pe2___width 1
#define reg_pinmux_rw_pe_iop___pe2___bit 2
#define reg_pinmux_rw_pe_iop___pe3___lsb 3
#define reg_pinmux_rw_pe_iop___pe3___width 1
#define reg_pinmux_rw_pe_iop___pe3___bit 3
#define reg_pinmux_rw_pe_iop___pe4___lsb 4
#define reg_pinmux_rw_pe_iop___pe4___width 1
#define reg_pinmux_rw_pe_iop___pe4___bit 4
#define reg_pinmux_rw_pe_iop___pe5___lsb 5
#define reg_pinmux_rw_pe_iop___pe5___width 1
#define reg_pinmux_rw_pe_iop___pe5___bit 5
#define reg_pinmux_rw_pe_iop___pe6___lsb 6
#define reg_pinmux_rw_pe_iop___pe6___width 1
#define reg_pinmux_rw_pe_iop___pe6___bit 6
#define reg_pinmux_rw_pe_iop___pe7___lsb 7
#define reg_pinmux_rw_pe_iop___pe7___width 1
#define reg_pinmux_rw_pe_iop___pe7___bit 7
#define reg_pinmux_rw_pe_iop___pe8___lsb 8
#define reg_pinmux_rw_pe_iop___pe8___width 1
#define reg_pinmux_rw_pe_iop___pe8___bit 8
#define reg_pinmux_rw_pe_iop___pe9___lsb 9
#define reg_pinmux_rw_pe_iop___pe9___width 1
#define reg_pinmux_rw_pe_iop___pe9___bit 9
#define reg_pinmux_rw_pe_iop___pe10___lsb 10
#define reg_pinmux_rw_pe_iop___pe10___width 1
#define reg_pinmux_rw_pe_iop___pe10___bit 10
#define reg_pinmux_rw_pe_iop___pe11___lsb 11
#define reg_pinmux_rw_pe_iop___pe11___width 1
#define reg_pinmux_rw_pe_iop___pe11___bit 11
#define reg_pinmux_rw_pe_iop___pe12___lsb 12
#define reg_pinmux_rw_pe_iop___pe12___width 1
#define reg_pinmux_rw_pe_iop___pe12___bit 12
#define reg_pinmux_rw_pe_iop___pe13___lsb 13
#define reg_pinmux_rw_pe_iop___pe13___width 1
#define reg_pinmux_rw_pe_iop___pe13___bit 13
#define reg_pinmux_rw_pe_iop___pe14___lsb 14
#define reg_pinmux_rw_pe_iop___pe14___width 1
#define reg_pinmux_rw_pe_iop___pe14___bit 14
#define reg_pinmux_rw_pe_iop___pe15___lsb 15
#define reg_pinmux_rw_pe_iop___pe15___width 1
#define reg_pinmux_rw_pe_iop___pe15___bit 15
#define reg_pinmux_rw_pe_iop___pe16___lsb 16
#define reg_pinmux_rw_pe_iop___pe16___width 1
#define reg_pinmux_rw_pe_iop___pe16___bit 16
#define reg_pinmux_rw_pe_iop___pe17___lsb 17
#define reg_pinmux_rw_pe_iop___pe17___width 1
#define reg_pinmux_rw_pe_iop___pe17___bit 17
#define reg_pinmux_rw_pe_iop_offset 36
/* Register rw_usb_phy, scope pinmux, type rw */
#define reg_pinmux_rw_usb_phy___en_usb0___lsb 0
#define reg_pinmux_rw_usb_phy___en_usb0___width 1
#define reg_pinmux_rw_usb_phy___en_usb0___bit 0
#define reg_pinmux_rw_usb_phy___en_usb1___lsb 1
#define reg_pinmux_rw_usb_phy___en_usb1___width 1
#define reg_pinmux_rw_usb_phy___en_usb1___bit 1
#define reg_pinmux_rw_usb_phy_offset 40
/* Constants */
#define regk_pinmux_no 0x00000000
#define regk_pinmux_rw_hwprot_default 0x00000000
#define regk_pinmux_rw_pa_default 0x00000000
#define regk_pinmux_rw_pb_gio_default 0x00000000
#define regk_pinmux_rw_pb_iop_default 0x00000000
#define regk_pinmux_rw_pc_gio_default 0x00000000
#define regk_pinmux_rw_pc_iop_default 0x00000000
#define regk_pinmux_rw_pd_gio_default 0x00000000
#define regk_pinmux_rw_pd_iop_default 0x00000000
#define regk_pinmux_rw_pe_gio_default 0x00000000
#define regk_pinmux_rw_pe_iop_default 0x00000000
#define regk_pinmux_rw_usb_phy_default 0x00000000
#define regk_pinmux_yes 0x00000001
#endif /* __pinmux_defs_asm_h */

View file

@ -0,0 +1,96 @@
#ifndef __reg_map_h
#define __reg_map_h
/*
* This file is autogenerated from
* file: ../../mod/fakereg.rmap
* id: fakereg.rmap,v 1.3 2004/02/11 19:53:22 ronny Exp
* last modified: Wed Feb 11 20:53:25 2004
* file: ../../rtl/global.rmap
* id: global.rmap,v 1.3 2003/08/18 15:08:23 mikaeln Exp
* last modified: Mon Aug 18 17:08:23 2003
* file: ../../mod/modreg.rmap
* id: modreg.rmap,v 1.31 2004/02/20 15:40:04 stefans Exp
* last modified: Fri Feb 20 16:40:04 2004
*
* by /n/asic/design/tools/rdesc/src/rdes2c -asm --outfile asm/reg_map_asm.h -base 0xb0000000 ../../rtl/global.rmap ../../mod/modreg.rmap ../../inst/memarb/rtl/guinness/marb_top.r ../../mod/fakereg.rmap
* id: $Id: reg_map_asm.h,v 1.1 2005/04/24 18:31:04 starvik Exp $
* Any changes here will be lost.
*
* -*- buffer-read-only: t -*-
*/
#define regi_artpec_mod 0xb7044000
#define regi_ata 0xb0032000
#define regi_ata_mod 0xb7006000
#define regi_barber 0xb701a000
#define regi_bif_core 0xb0014000
#define regi_bif_dma 0xb0016000
#define regi_bif_slave 0xb0018000
#define regi_bif_slave_ext 0xac000000
#define regi_bus_master 0xb703c000
#define regi_config 0xb003c000
#define regi_dma0 0xb0000000
#define regi_dma1 0xb0002000
#define regi_dma2 0xb0004000
#define regi_dma3 0xb0006000
#define regi_dma4 0xb0008000
#define regi_dma5 0xb000a000
#define regi_dma6 0xb000c000
#define regi_dma7 0xb000e000
#define regi_dma8 0xb0010000
#define regi_dma9 0xb0012000
#define regi_eth0 0xb0034000
#define regi_eth1 0xb0036000
#define regi_eth_mod 0xb7004000
#define regi_eth_mod1 0xb701c000
#define regi_eth_strmod 0xb7008000
#define regi_eth_strmod1 0xb7032000
#define regi_ext_dma 0xb703a000
#define regi_ext_mem 0xb7046000
#define regi_gen_io 0xb7016000
#define regi_gio 0xb001a000
#define regi_hook 0xb7000000
#define regi_iop 0xb0020000
#define regi_irq 0xb001c000
#define regi_irq_nmi 0xb701e000
#define regi_marb 0xb003e000
#define regi_marb_bp0 0xb003e240
#define regi_marb_bp1 0xb003e280
#define regi_marb_bp2 0xb003e2c0
#define regi_marb_bp3 0xb003e300
#define regi_nand_mod 0xb7014000
#define regi_p21 0xb002e000
#define regi_p21_mod 0xb7042000
#define regi_pci_mod 0xb7010000
#define regi_pin_test 0xb7018000
#define regi_pinmux 0xb0038000
#define regi_sdram_chk 0xb703e000
#define regi_sdram_mod 0xb7012000
#define regi_ser0 0xb0026000
#define regi_ser1 0xb0028000
#define regi_ser2 0xb002a000
#define regi_ser3 0xb002c000
#define regi_ser_mod0 0xb7020000
#define regi_ser_mod1 0xb7022000
#define regi_ser_mod2 0xb7024000
#define regi_ser_mod3 0xb7026000
#define regi_smif_stat 0xb700e000
#define regi_sser0 0xb0022000
#define regi_sser1 0xb0024000
#define regi_sser_mod0 0xb700a000
#define regi_sser_mod1 0xb700c000
#define regi_strcop 0xb0030000
#define regi_strmux 0xb003a000
#define regi_strmux_tst 0xb7040000
#define regi_tap 0xb7002000
#define regi_timer 0xb001e000
#define regi_timer_mod 0xb7034000
#define regi_trace 0xb0040000
#define regi_usb0 0xb7028000
#define regi_usb1 0xb702a000
#define regi_usb2 0xb702c000
#define regi_usb3 0xb702e000
#define regi_usb_dev 0xb7030000
#define regi_utmi_mod0 0xb7036000
#define regi_utmi_mod1 0xb7038000
#endif /* __reg_map_h */

View file

@ -0,0 +1,142 @@
#ifndef __rt_trace_defs_asm_h
#define __rt_trace_defs_asm_h
/*
* This file is autogenerated from
* file: ../../inst/rt_trace/rtl/rt_regs.r
* id: rt_regs.r,v 1.18 2005/02/08 15:45:00 stefans Exp
* last modfied: Mon Apr 11 16:09:14 2005
*
* by /n/asic/design/tools/rdesc/src/rdes2c -asm --outfile asm/rt_trace_defs_asm.h ../../inst/rt_trace/rtl/rt_regs.r
* id: $Id: rt_trace_defs_asm.h,v 1.1 2005/04/24 18:31:04 starvik Exp $
* Any changes here will be lost.
*
* -*- buffer-read-only: t -*-
*/
#ifndef REG_FIELD
#define REG_FIELD( scope, reg, field, value ) \
REG_FIELD_X_( value, reg_##scope##_##reg##___##field##___lsb )
#define REG_FIELD_X_( value, shift ) ((value) << shift)
#endif
#ifndef REG_STATE
#define REG_STATE( scope, reg, field, symbolic_value ) \
REG_STATE_X_( regk_##scope##_##symbolic_value, reg_##scope##_##reg##___##field##___lsb )
#define REG_STATE_X_( k, shift ) (k << shift)
#endif
#ifndef REG_MASK
#define REG_MASK( scope, reg, field ) \
REG_MASK_X_( reg_##scope##_##reg##___##field##___width, reg_##scope##_##reg##___##field##___lsb )
#define REG_MASK_X_( width, lsb ) (((1 << width)-1) << lsb)
#endif
#ifndef REG_LSB
#define REG_LSB( scope, reg, field ) reg_##scope##_##reg##___##field##___lsb
#endif
#ifndef REG_BIT
#define REG_BIT( scope, reg, field ) reg_##scope##_##reg##___##field##___bit
#endif
#ifndef REG_ADDR
#define REG_ADDR( scope, inst, reg ) REG_ADDR_X_(inst, reg_##scope##_##reg##_offset)
#define REG_ADDR_X_( inst, offs ) ((inst) + offs)
#endif
#ifndef REG_ADDR_VECT
#define REG_ADDR_VECT( scope, inst, reg, index ) \
REG_ADDR_VECT_X_(inst, reg_##scope##_##reg##_offset, index, \
STRIDE_##scope##_##reg )
#define REG_ADDR_VECT_X_( inst, offs, index, stride ) \
((inst) + offs + (index) * stride)
#endif
/* Register rw_cfg, scope rt_trace, type rw */
#define reg_rt_trace_rw_cfg___en___lsb 0
#define reg_rt_trace_rw_cfg___en___width 1
#define reg_rt_trace_rw_cfg___en___bit 0
#define reg_rt_trace_rw_cfg___mode___lsb 1
#define reg_rt_trace_rw_cfg___mode___width 1
#define reg_rt_trace_rw_cfg___mode___bit 1
#define reg_rt_trace_rw_cfg___owner___lsb 2
#define reg_rt_trace_rw_cfg___owner___width 1
#define reg_rt_trace_rw_cfg___owner___bit 2
#define reg_rt_trace_rw_cfg___wp___lsb 3
#define reg_rt_trace_rw_cfg___wp___width 1
#define reg_rt_trace_rw_cfg___wp___bit 3
#define reg_rt_trace_rw_cfg___stall___lsb 4
#define reg_rt_trace_rw_cfg___stall___width 1
#define reg_rt_trace_rw_cfg___stall___bit 4
#define reg_rt_trace_rw_cfg___wp_start___lsb 8
#define reg_rt_trace_rw_cfg___wp_start___width 7
#define reg_rt_trace_rw_cfg___wp_stop___lsb 16
#define reg_rt_trace_rw_cfg___wp_stop___width 7
#define reg_rt_trace_rw_cfg_offset 0
/* Register rw_tap_ctrl, scope rt_trace, type rw */
#define reg_rt_trace_rw_tap_ctrl___ack_data___lsb 0
#define reg_rt_trace_rw_tap_ctrl___ack_data___width 1
#define reg_rt_trace_rw_tap_ctrl___ack_data___bit 0
#define reg_rt_trace_rw_tap_ctrl___ack_guru___lsb 1
#define reg_rt_trace_rw_tap_ctrl___ack_guru___width 1
#define reg_rt_trace_rw_tap_ctrl___ack_guru___bit 1
#define reg_rt_trace_rw_tap_ctrl_offset 4
/* Register r_tap_stat, scope rt_trace, type r */
#define reg_rt_trace_r_tap_stat___dav___lsb 0
#define reg_rt_trace_r_tap_stat___dav___width 1
#define reg_rt_trace_r_tap_stat___dav___bit 0
#define reg_rt_trace_r_tap_stat___empty___lsb 1
#define reg_rt_trace_r_tap_stat___empty___width 1
#define reg_rt_trace_r_tap_stat___empty___bit 1
#define reg_rt_trace_r_tap_stat_offset 8
/* Register rw_tap_data, scope rt_trace, type rw */
#define reg_rt_trace_rw_tap_data_offset 12
/* Register rw_tap_hdata, scope rt_trace, type rw */
#define reg_rt_trace_rw_tap_hdata___op___lsb 0
#define reg_rt_trace_rw_tap_hdata___op___width 4
#define reg_rt_trace_rw_tap_hdata___sub_op___lsb 4
#define reg_rt_trace_rw_tap_hdata___sub_op___width 4
#define reg_rt_trace_rw_tap_hdata_offset 16
/* Register r_redir, scope rt_trace, type r */
#define reg_rt_trace_r_redir_offset 20
/* Constants */
#define regk_rt_trace_brk 0x0000000c
#define regk_rt_trace_dbg 0x00000003
#define regk_rt_trace_dbgdi 0x00000004
#define regk_rt_trace_dbgdo 0x00000005
#define regk_rt_trace_gmode 0x00000000
#define regk_rt_trace_no 0x00000000
#define regk_rt_trace_nop 0x00000000
#define regk_rt_trace_normal 0x00000000
#define regk_rt_trace_rdmem 0x00000007
#define regk_rt_trace_rdmemb 0x00000009
#define regk_rt_trace_rdpreg 0x00000002
#define regk_rt_trace_rdreg 0x00000001
#define regk_rt_trace_rdsreg 0x00000003
#define regk_rt_trace_redir 0x00000006
#define regk_rt_trace_ret 0x0000000b
#define regk_rt_trace_rw_cfg_default 0x00000000
#define regk_rt_trace_trcfg 0x00000001
#define regk_rt_trace_wp 0x00000001
#define regk_rt_trace_wp0 0x00000001
#define regk_rt_trace_wp1 0x00000002
#define regk_rt_trace_wp2 0x00000004
#define regk_rt_trace_wp3 0x00000008
#define regk_rt_trace_wp4 0x00000010
#define regk_rt_trace_wp5 0x00000020
#define regk_rt_trace_wp6 0x00000040
#define regk_rt_trace_wrmem 0x00000008
#define regk_rt_trace_wrmemb 0x0000000a
#define regk_rt_trace_wrpreg 0x00000005
#define regk_rt_trace_wrreg 0x00000004
#define regk_rt_trace_wrsreg 0x00000006
#define regk_rt_trace_yes 0x00000001
#endif /* __rt_trace_defs_asm_h */

View file

@ -0,0 +1,359 @@
#ifndef __ser_defs_asm_h
#define __ser_defs_asm_h
/*
* This file is autogenerated from
* file: ../../inst/ser/rtl/ser_regs.r
* id: ser_regs.r,v 1.23 2005/02/08 13:58:35 perz Exp
* last modfied: Mon Apr 11 16:09:21 2005
*
* by /n/asic/design/tools/rdesc/src/rdes2c -asm --outfile asm/ser_defs_asm.h ../../inst/ser/rtl/ser_regs.r
* id: $Id: ser_defs_asm.h,v 1.1 2005/04/24 18:31:04 starvik Exp $
* Any changes here will be lost.
*
* -*- buffer-read-only: t -*-
*/
#ifndef REG_FIELD
#define REG_FIELD( scope, reg, field, value ) \
REG_FIELD_X_( value, reg_##scope##_##reg##___##field##___lsb )
#define REG_FIELD_X_( value, shift ) ((value) << shift)
#endif
#ifndef REG_STATE
#define REG_STATE( scope, reg, field, symbolic_value ) \
REG_STATE_X_( regk_##scope##_##symbolic_value, reg_##scope##_##reg##___##field##___lsb )
#define REG_STATE_X_( k, shift ) (k << shift)
#endif
#ifndef REG_MASK
#define REG_MASK( scope, reg, field ) \
REG_MASK_X_( reg_##scope##_##reg##___##field##___width, reg_##scope##_##reg##___##field##___lsb )
#define REG_MASK_X_( width, lsb ) (((1 << width)-1) << lsb)
#endif
#ifndef REG_LSB
#define REG_LSB( scope, reg, field ) reg_##scope##_##reg##___##field##___lsb
#endif
#ifndef REG_BIT
#define REG_BIT( scope, reg, field ) reg_##scope##_##reg##___##field##___bit
#endif
#ifndef REG_ADDR
#define REG_ADDR( scope, inst, reg ) REG_ADDR_X_(inst, reg_##scope##_##reg##_offset)
#define REG_ADDR_X_( inst, offs ) ((inst) + offs)
#endif
#ifndef REG_ADDR_VECT
#define REG_ADDR_VECT( scope, inst, reg, index ) \
REG_ADDR_VECT_X_(inst, reg_##scope##_##reg##_offset, index, \
STRIDE_##scope##_##reg )
#define REG_ADDR_VECT_X_( inst, offs, index, stride ) \
((inst) + offs + (index) * stride)
#endif
/* Register rw_tr_ctrl, scope ser, type rw */
#define reg_ser_rw_tr_ctrl___base_freq___lsb 0
#define reg_ser_rw_tr_ctrl___base_freq___width 3
#define reg_ser_rw_tr_ctrl___en___lsb 3
#define reg_ser_rw_tr_ctrl___en___width 1
#define reg_ser_rw_tr_ctrl___en___bit 3
#define reg_ser_rw_tr_ctrl___par___lsb 4
#define reg_ser_rw_tr_ctrl___par___width 2
#define reg_ser_rw_tr_ctrl___par_en___lsb 6
#define reg_ser_rw_tr_ctrl___par_en___width 1
#define reg_ser_rw_tr_ctrl___par_en___bit 6
#define reg_ser_rw_tr_ctrl___data_bits___lsb 7
#define reg_ser_rw_tr_ctrl___data_bits___width 1
#define reg_ser_rw_tr_ctrl___data_bits___bit 7
#define reg_ser_rw_tr_ctrl___stop_bits___lsb 8
#define reg_ser_rw_tr_ctrl___stop_bits___width 1
#define reg_ser_rw_tr_ctrl___stop_bits___bit 8
#define reg_ser_rw_tr_ctrl___stop___lsb 9
#define reg_ser_rw_tr_ctrl___stop___width 1
#define reg_ser_rw_tr_ctrl___stop___bit 9
#define reg_ser_rw_tr_ctrl___rts_delay___lsb 10
#define reg_ser_rw_tr_ctrl___rts_delay___width 3
#define reg_ser_rw_tr_ctrl___rts_setup___lsb 13
#define reg_ser_rw_tr_ctrl___rts_setup___width 1
#define reg_ser_rw_tr_ctrl___rts_setup___bit 13
#define reg_ser_rw_tr_ctrl___auto_rts___lsb 14
#define reg_ser_rw_tr_ctrl___auto_rts___width 1
#define reg_ser_rw_tr_ctrl___auto_rts___bit 14
#define reg_ser_rw_tr_ctrl___txd___lsb 15
#define reg_ser_rw_tr_ctrl___txd___width 1
#define reg_ser_rw_tr_ctrl___txd___bit 15
#define reg_ser_rw_tr_ctrl___auto_cts___lsb 16
#define reg_ser_rw_tr_ctrl___auto_cts___width 1
#define reg_ser_rw_tr_ctrl___auto_cts___bit 16
#define reg_ser_rw_tr_ctrl_offset 0
/* Register rw_tr_dma_en, scope ser, type rw */
#define reg_ser_rw_tr_dma_en___en___lsb 0
#define reg_ser_rw_tr_dma_en___en___width 1
#define reg_ser_rw_tr_dma_en___en___bit 0
#define reg_ser_rw_tr_dma_en_offset 4
/* Register rw_rec_ctrl, scope ser, type rw */
#define reg_ser_rw_rec_ctrl___base_freq___lsb 0
#define reg_ser_rw_rec_ctrl___base_freq___width 3
#define reg_ser_rw_rec_ctrl___en___lsb 3
#define reg_ser_rw_rec_ctrl___en___width 1
#define reg_ser_rw_rec_ctrl___en___bit 3
#define reg_ser_rw_rec_ctrl___par___lsb 4
#define reg_ser_rw_rec_ctrl___par___width 2
#define reg_ser_rw_rec_ctrl___par_en___lsb 6
#define reg_ser_rw_rec_ctrl___par_en___width 1
#define reg_ser_rw_rec_ctrl___par_en___bit 6
#define reg_ser_rw_rec_ctrl___data_bits___lsb 7
#define reg_ser_rw_rec_ctrl___data_bits___width 1
#define reg_ser_rw_rec_ctrl___data_bits___bit 7
#define reg_ser_rw_rec_ctrl___dma_mode___lsb 8
#define reg_ser_rw_rec_ctrl___dma_mode___width 1
#define reg_ser_rw_rec_ctrl___dma_mode___bit 8
#define reg_ser_rw_rec_ctrl___dma_err___lsb 9
#define reg_ser_rw_rec_ctrl___dma_err___width 1
#define reg_ser_rw_rec_ctrl___dma_err___bit 9
#define reg_ser_rw_rec_ctrl___sampling___lsb 10
#define reg_ser_rw_rec_ctrl___sampling___width 1
#define reg_ser_rw_rec_ctrl___sampling___bit 10
#define reg_ser_rw_rec_ctrl___timeout___lsb 11
#define reg_ser_rw_rec_ctrl___timeout___width 3
#define reg_ser_rw_rec_ctrl___auto_eop___lsb 14
#define reg_ser_rw_rec_ctrl___auto_eop___width 1
#define reg_ser_rw_rec_ctrl___auto_eop___bit 14
#define reg_ser_rw_rec_ctrl___half_duplex___lsb 15
#define reg_ser_rw_rec_ctrl___half_duplex___width 1
#define reg_ser_rw_rec_ctrl___half_duplex___bit 15
#define reg_ser_rw_rec_ctrl___rts_n___lsb 16
#define reg_ser_rw_rec_ctrl___rts_n___width 1
#define reg_ser_rw_rec_ctrl___rts_n___bit 16
#define reg_ser_rw_rec_ctrl___loopback___lsb 17
#define reg_ser_rw_rec_ctrl___loopback___width 1
#define reg_ser_rw_rec_ctrl___loopback___bit 17
#define reg_ser_rw_rec_ctrl_offset 8
/* Register rw_tr_baud_div, scope ser, type rw */
#define reg_ser_rw_tr_baud_div___div___lsb 0
#define reg_ser_rw_tr_baud_div___div___width 16
#define reg_ser_rw_tr_baud_div_offset 12
/* Register rw_rec_baud_div, scope ser, type rw */
#define reg_ser_rw_rec_baud_div___div___lsb 0
#define reg_ser_rw_rec_baud_div___div___width 16
#define reg_ser_rw_rec_baud_div_offset 16
/* Register rw_xoff, scope ser, type rw */
#define reg_ser_rw_xoff___chr___lsb 0
#define reg_ser_rw_xoff___chr___width 8
#define reg_ser_rw_xoff___automatic___lsb 8
#define reg_ser_rw_xoff___automatic___width 1
#define reg_ser_rw_xoff___automatic___bit 8
#define reg_ser_rw_xoff_offset 20
/* Register rw_xoff_clr, scope ser, type rw */
#define reg_ser_rw_xoff_clr___clr___lsb 0
#define reg_ser_rw_xoff_clr___clr___width 1
#define reg_ser_rw_xoff_clr___clr___bit 0
#define reg_ser_rw_xoff_clr_offset 24
/* Register rw_dout, scope ser, type rw */
#define reg_ser_rw_dout___data___lsb 0
#define reg_ser_rw_dout___data___width 8
#define reg_ser_rw_dout_offset 28
/* Register rs_stat_din, scope ser, type rs */
#define reg_ser_rs_stat_din___data___lsb 0
#define reg_ser_rs_stat_din___data___width 8
#define reg_ser_rs_stat_din___dav___lsb 16
#define reg_ser_rs_stat_din___dav___width 1
#define reg_ser_rs_stat_din___dav___bit 16
#define reg_ser_rs_stat_din___framing_err___lsb 17
#define reg_ser_rs_stat_din___framing_err___width 1
#define reg_ser_rs_stat_din___framing_err___bit 17
#define reg_ser_rs_stat_din___par_err___lsb 18
#define reg_ser_rs_stat_din___par_err___width 1
#define reg_ser_rs_stat_din___par_err___bit 18
#define reg_ser_rs_stat_din___orun___lsb 19
#define reg_ser_rs_stat_din___orun___width 1
#define reg_ser_rs_stat_din___orun___bit 19
#define reg_ser_rs_stat_din___rec_err___lsb 20
#define reg_ser_rs_stat_din___rec_err___width 1
#define reg_ser_rs_stat_din___rec_err___bit 20
#define reg_ser_rs_stat_din___rxd___lsb 21
#define reg_ser_rs_stat_din___rxd___width 1
#define reg_ser_rs_stat_din___rxd___bit 21
#define reg_ser_rs_stat_din___tr_idle___lsb 22
#define reg_ser_rs_stat_din___tr_idle___width 1
#define reg_ser_rs_stat_din___tr_idle___bit 22
#define reg_ser_rs_stat_din___tr_empty___lsb 23
#define reg_ser_rs_stat_din___tr_empty___width 1
#define reg_ser_rs_stat_din___tr_empty___bit 23
#define reg_ser_rs_stat_din___tr_rdy___lsb 24
#define reg_ser_rs_stat_din___tr_rdy___width 1
#define reg_ser_rs_stat_din___tr_rdy___bit 24
#define reg_ser_rs_stat_din___cts_n___lsb 25
#define reg_ser_rs_stat_din___cts_n___width 1
#define reg_ser_rs_stat_din___cts_n___bit 25
#define reg_ser_rs_stat_din___xoff_detect___lsb 26
#define reg_ser_rs_stat_din___xoff_detect___width 1
#define reg_ser_rs_stat_din___xoff_detect___bit 26
#define reg_ser_rs_stat_din___rts_n___lsb 27
#define reg_ser_rs_stat_din___rts_n___width 1
#define reg_ser_rs_stat_din___rts_n___bit 27
#define reg_ser_rs_stat_din___txd___lsb 28
#define reg_ser_rs_stat_din___txd___width 1
#define reg_ser_rs_stat_din___txd___bit 28
#define reg_ser_rs_stat_din_offset 32
/* Register r_stat_din, scope ser, type r */
#define reg_ser_r_stat_din___data___lsb 0
#define reg_ser_r_stat_din___data___width 8
#define reg_ser_r_stat_din___dav___lsb 16
#define reg_ser_r_stat_din___dav___width 1
#define reg_ser_r_stat_din___dav___bit 16
#define reg_ser_r_stat_din___framing_err___lsb 17
#define reg_ser_r_stat_din___framing_err___width 1
#define reg_ser_r_stat_din___framing_err___bit 17
#define reg_ser_r_stat_din___par_err___lsb 18
#define reg_ser_r_stat_din___par_err___width 1
#define reg_ser_r_stat_din___par_err___bit 18
#define reg_ser_r_stat_din___orun___lsb 19
#define reg_ser_r_stat_din___orun___width 1
#define reg_ser_r_stat_din___orun___bit 19
#define reg_ser_r_stat_din___rec_err___lsb 20
#define reg_ser_r_stat_din___rec_err___width 1
#define reg_ser_r_stat_din___rec_err___bit 20
#define reg_ser_r_stat_din___rxd___lsb 21
#define reg_ser_r_stat_din___rxd___width 1
#define reg_ser_r_stat_din___rxd___bit 21
#define reg_ser_r_stat_din___tr_idle___lsb 22
#define reg_ser_r_stat_din___tr_idle___width 1
#define reg_ser_r_stat_din___tr_idle___bit 22
#define reg_ser_r_stat_din___tr_empty___lsb 23
#define reg_ser_r_stat_din___tr_empty___width 1
#define reg_ser_r_stat_din___tr_empty___bit 23
#define reg_ser_r_stat_din___tr_rdy___lsb 24
#define reg_ser_r_stat_din___tr_rdy___width 1
#define reg_ser_r_stat_din___tr_rdy___bit 24
#define reg_ser_r_stat_din___cts_n___lsb 25
#define reg_ser_r_stat_din___cts_n___width 1
#define reg_ser_r_stat_din___cts_n___bit 25
#define reg_ser_r_stat_din___xoff_detect___lsb 26
#define reg_ser_r_stat_din___xoff_detect___width 1
#define reg_ser_r_stat_din___xoff_detect___bit 26
#define reg_ser_r_stat_din___rts_n___lsb 27
#define reg_ser_r_stat_din___rts_n___width 1
#define reg_ser_r_stat_din___rts_n___bit 27
#define reg_ser_r_stat_din___txd___lsb 28
#define reg_ser_r_stat_din___txd___width 1
#define reg_ser_r_stat_din___txd___bit 28
#define reg_ser_r_stat_din_offset 36
/* Register rw_rec_eop, scope ser, type rw */
#define reg_ser_rw_rec_eop___set___lsb 0
#define reg_ser_rw_rec_eop___set___width 1
#define reg_ser_rw_rec_eop___set___bit 0
#define reg_ser_rw_rec_eop_offset 40
/* Register rw_intr_mask, scope ser, type rw */
#define reg_ser_rw_intr_mask___tr_rdy___lsb 0
#define reg_ser_rw_intr_mask___tr_rdy___width 1
#define reg_ser_rw_intr_mask___tr_rdy___bit 0
#define reg_ser_rw_intr_mask___tr_empty___lsb 1
#define reg_ser_rw_intr_mask___tr_empty___width 1
#define reg_ser_rw_intr_mask___tr_empty___bit 1
#define reg_ser_rw_intr_mask___tr_idle___lsb 2
#define reg_ser_rw_intr_mask___tr_idle___width 1
#define reg_ser_rw_intr_mask___tr_idle___bit 2
#define reg_ser_rw_intr_mask___dav___lsb 3
#define reg_ser_rw_intr_mask___dav___width 1
#define reg_ser_rw_intr_mask___dav___bit 3
#define reg_ser_rw_intr_mask_offset 44
/* Register rw_ack_intr, scope ser, type rw */
#define reg_ser_rw_ack_intr___tr_rdy___lsb 0
#define reg_ser_rw_ack_intr___tr_rdy___width 1
#define reg_ser_rw_ack_intr___tr_rdy___bit 0
#define reg_ser_rw_ack_intr___tr_empty___lsb 1
#define reg_ser_rw_ack_intr___tr_empty___width 1
#define reg_ser_rw_ack_intr___tr_empty___bit 1
#define reg_ser_rw_ack_intr___tr_idle___lsb 2
#define reg_ser_rw_ack_intr___tr_idle___width 1
#define reg_ser_rw_ack_intr___tr_idle___bit 2
#define reg_ser_rw_ack_intr___dav___lsb 3
#define reg_ser_rw_ack_intr___dav___width 1
#define reg_ser_rw_ack_intr___dav___bit 3
#define reg_ser_rw_ack_intr_offset 48
/* Register r_intr, scope ser, type r */
#define reg_ser_r_intr___tr_rdy___lsb 0
#define reg_ser_r_intr___tr_rdy___width 1
#define reg_ser_r_intr___tr_rdy___bit 0
#define reg_ser_r_intr___tr_empty___lsb 1
#define reg_ser_r_intr___tr_empty___width 1
#define reg_ser_r_intr___tr_empty___bit 1
#define reg_ser_r_intr___tr_idle___lsb 2
#define reg_ser_r_intr___tr_idle___width 1
#define reg_ser_r_intr___tr_idle___bit 2
#define reg_ser_r_intr___dav___lsb 3
#define reg_ser_r_intr___dav___width 1
#define reg_ser_r_intr___dav___bit 3
#define reg_ser_r_intr_offset 52
/* Register r_masked_intr, scope ser, type r */
#define reg_ser_r_masked_intr___tr_rdy___lsb 0
#define reg_ser_r_masked_intr___tr_rdy___width 1
#define reg_ser_r_masked_intr___tr_rdy___bit 0
#define reg_ser_r_masked_intr___tr_empty___lsb 1
#define reg_ser_r_masked_intr___tr_empty___width 1
#define reg_ser_r_masked_intr___tr_empty___bit 1
#define reg_ser_r_masked_intr___tr_idle___lsb 2
#define reg_ser_r_masked_intr___tr_idle___width 1
#define reg_ser_r_masked_intr___tr_idle___bit 2
#define reg_ser_r_masked_intr___dav___lsb 3
#define reg_ser_r_masked_intr___dav___width 1
#define reg_ser_r_masked_intr___dav___bit 3
#define reg_ser_r_masked_intr_offset 56
/* Constants */
#define regk_ser_active 0x00000000
#define regk_ser_bits1 0x00000000
#define regk_ser_bits2 0x00000001
#define regk_ser_bits7 0x00000001
#define regk_ser_bits8 0x00000000
#define regk_ser_del0_5 0x00000000
#define regk_ser_del1 0x00000001
#define regk_ser_del1_5 0x00000002
#define regk_ser_del2 0x00000003
#define regk_ser_del2_5 0x00000004
#define regk_ser_del3 0x00000005
#define regk_ser_del3_5 0x00000006
#define regk_ser_del4 0x00000007
#define regk_ser_even 0x00000000
#define regk_ser_ext 0x00000001
#define regk_ser_f100 0x00000007
#define regk_ser_f29_493 0x00000004
#define regk_ser_f32 0x00000005
#define regk_ser_f32_768 0x00000006
#define regk_ser_ignore 0x00000001
#define regk_ser_inactive 0x00000001
#define regk_ser_majority 0x00000001
#define regk_ser_mark 0x00000002
#define regk_ser_middle 0x00000000
#define regk_ser_no 0x00000000
#define regk_ser_odd 0x00000001
#define regk_ser_off 0x00000000
#define regk_ser_rw_intr_mask_default 0x00000000
#define regk_ser_rw_rec_baud_div_default 0x00000000
#define regk_ser_rw_rec_ctrl_default 0x00010000
#define regk_ser_rw_tr_baud_div_default 0x00000000
#define regk_ser_rw_tr_ctrl_default 0x00008000
#define regk_ser_rw_tr_dma_en_default 0x00000000
#define regk_ser_rw_xoff_default 0x00000000
#define regk_ser_space 0x00000003
#define regk_ser_stop 0x00000000
#define regk_ser_yes 0x00000001
#endif /* __ser_defs_asm_h */

View file

@ -0,0 +1,462 @@
#ifndef __sser_defs_asm_h
#define __sser_defs_asm_h
/*
* This file is autogenerated from
* file: ../../inst/syncser/rtl/sser_regs.r
* id: sser_regs.r,v 1.24 2005/02/11 14:27:36 gunnard Exp
* last modfied: Mon Apr 11 16:09:48 2005
*
* by /n/asic/design/tools/rdesc/src/rdes2c -asm --outfile asm/sser_defs_asm.h ../../inst/syncser/rtl/sser_regs.r
* id: $Id: sser_defs_asm.h,v 1.1 2005/04/24 18:31:04 starvik Exp $
* Any changes here will be lost.
*
* -*- buffer-read-only: t -*-
*/
#ifndef REG_FIELD
#define REG_FIELD( scope, reg, field, value ) \
REG_FIELD_X_( value, reg_##scope##_##reg##___##field##___lsb )
#define REG_FIELD_X_( value, shift ) ((value) << shift)
#endif
#ifndef REG_STATE
#define REG_STATE( scope, reg, field, symbolic_value ) \
REG_STATE_X_( regk_##scope##_##symbolic_value, reg_##scope##_##reg##___##field##___lsb )
#define REG_STATE_X_( k, shift ) (k << shift)
#endif
#ifndef REG_MASK
#define REG_MASK( scope, reg, field ) \
REG_MASK_X_( reg_##scope##_##reg##___##field##___width, reg_##scope##_##reg##___##field##___lsb )
#define REG_MASK_X_( width, lsb ) (((1 << width)-1) << lsb)
#endif
#ifndef REG_LSB
#define REG_LSB( scope, reg, field ) reg_##scope##_##reg##___##field##___lsb
#endif
#ifndef REG_BIT
#define REG_BIT( scope, reg, field ) reg_##scope##_##reg##___##field##___bit
#endif
#ifndef REG_ADDR
#define REG_ADDR( scope, inst, reg ) REG_ADDR_X_(inst, reg_##scope##_##reg##_offset)
#define REG_ADDR_X_( inst, offs ) ((inst) + offs)
#endif
#ifndef REG_ADDR_VECT
#define REG_ADDR_VECT( scope, inst, reg, index ) \
REG_ADDR_VECT_X_(inst, reg_##scope##_##reg##_offset, index, \
STRIDE_##scope##_##reg )
#define REG_ADDR_VECT_X_( inst, offs, index, stride ) \
((inst) + offs + (index) * stride)
#endif
/* Register rw_cfg, scope sser, type rw */
#define reg_sser_rw_cfg___clk_div___lsb 0
#define reg_sser_rw_cfg___clk_div___width 16
#define reg_sser_rw_cfg___base_freq___lsb 16
#define reg_sser_rw_cfg___base_freq___width 3
#define reg_sser_rw_cfg___gate_clk___lsb 19
#define reg_sser_rw_cfg___gate_clk___width 1
#define reg_sser_rw_cfg___gate_clk___bit 19
#define reg_sser_rw_cfg___clkgate_ctrl___lsb 20
#define reg_sser_rw_cfg___clkgate_ctrl___width 1
#define reg_sser_rw_cfg___clkgate_ctrl___bit 20
#define reg_sser_rw_cfg___clkgate_in___lsb 21
#define reg_sser_rw_cfg___clkgate_in___width 1
#define reg_sser_rw_cfg___clkgate_in___bit 21
#define reg_sser_rw_cfg___clk_dir___lsb 22
#define reg_sser_rw_cfg___clk_dir___width 1
#define reg_sser_rw_cfg___clk_dir___bit 22
#define reg_sser_rw_cfg___clk_od_mode___lsb 23
#define reg_sser_rw_cfg___clk_od_mode___width 1
#define reg_sser_rw_cfg___clk_od_mode___bit 23
#define reg_sser_rw_cfg___out_clk_pol___lsb 24
#define reg_sser_rw_cfg___out_clk_pol___width 1
#define reg_sser_rw_cfg___out_clk_pol___bit 24
#define reg_sser_rw_cfg___out_clk_src___lsb 25
#define reg_sser_rw_cfg___out_clk_src___width 2
#define reg_sser_rw_cfg___clk_in_sel___lsb 27
#define reg_sser_rw_cfg___clk_in_sel___width 1
#define reg_sser_rw_cfg___clk_in_sel___bit 27
#define reg_sser_rw_cfg___hold_pol___lsb 28
#define reg_sser_rw_cfg___hold_pol___width 1
#define reg_sser_rw_cfg___hold_pol___bit 28
#define reg_sser_rw_cfg___prepare___lsb 29
#define reg_sser_rw_cfg___prepare___width 1
#define reg_sser_rw_cfg___prepare___bit 29
#define reg_sser_rw_cfg___en___lsb 30
#define reg_sser_rw_cfg___en___width 1
#define reg_sser_rw_cfg___en___bit 30
#define reg_sser_rw_cfg_offset 0
/* Register rw_frm_cfg, scope sser, type rw */
#define reg_sser_rw_frm_cfg___wordrate___lsb 0
#define reg_sser_rw_frm_cfg___wordrate___width 10
#define reg_sser_rw_frm_cfg___rec_delay___lsb 10
#define reg_sser_rw_frm_cfg___rec_delay___width 3
#define reg_sser_rw_frm_cfg___tr_delay___lsb 13
#define reg_sser_rw_frm_cfg___tr_delay___width 3
#define reg_sser_rw_frm_cfg___early_wend___lsb 16
#define reg_sser_rw_frm_cfg___early_wend___width 1
#define reg_sser_rw_frm_cfg___early_wend___bit 16
#define reg_sser_rw_frm_cfg___level___lsb 17
#define reg_sser_rw_frm_cfg___level___width 2
#define reg_sser_rw_frm_cfg___type___lsb 19
#define reg_sser_rw_frm_cfg___type___width 1
#define reg_sser_rw_frm_cfg___type___bit 19
#define reg_sser_rw_frm_cfg___clk_pol___lsb 20
#define reg_sser_rw_frm_cfg___clk_pol___width 1
#define reg_sser_rw_frm_cfg___clk_pol___bit 20
#define reg_sser_rw_frm_cfg___fr_in_rxclk___lsb 21
#define reg_sser_rw_frm_cfg___fr_in_rxclk___width 1
#define reg_sser_rw_frm_cfg___fr_in_rxclk___bit 21
#define reg_sser_rw_frm_cfg___clk_src___lsb 22
#define reg_sser_rw_frm_cfg___clk_src___width 1
#define reg_sser_rw_frm_cfg___clk_src___bit 22
#define reg_sser_rw_frm_cfg___out_off___lsb 23
#define reg_sser_rw_frm_cfg___out_off___width 1
#define reg_sser_rw_frm_cfg___out_off___bit 23
#define reg_sser_rw_frm_cfg___out_on___lsb 24
#define reg_sser_rw_frm_cfg___out_on___width 1
#define reg_sser_rw_frm_cfg___out_on___bit 24
#define reg_sser_rw_frm_cfg___frame_pin_dir___lsb 25
#define reg_sser_rw_frm_cfg___frame_pin_dir___width 1
#define reg_sser_rw_frm_cfg___frame_pin_dir___bit 25
#define reg_sser_rw_frm_cfg___frame_pin_use___lsb 26
#define reg_sser_rw_frm_cfg___frame_pin_use___width 2
#define reg_sser_rw_frm_cfg___status_pin_dir___lsb 28
#define reg_sser_rw_frm_cfg___status_pin_dir___width 1
#define reg_sser_rw_frm_cfg___status_pin_dir___bit 28
#define reg_sser_rw_frm_cfg___status_pin_use___lsb 29
#define reg_sser_rw_frm_cfg___status_pin_use___width 2
#define reg_sser_rw_frm_cfg_offset 4
/* Register rw_tr_cfg, scope sser, type rw */
#define reg_sser_rw_tr_cfg___tr_en___lsb 0
#define reg_sser_rw_tr_cfg___tr_en___width 1
#define reg_sser_rw_tr_cfg___tr_en___bit 0
#define reg_sser_rw_tr_cfg___stop___lsb 1
#define reg_sser_rw_tr_cfg___stop___width 1
#define reg_sser_rw_tr_cfg___stop___bit 1
#define reg_sser_rw_tr_cfg___urun_stop___lsb 2
#define reg_sser_rw_tr_cfg___urun_stop___width 1
#define reg_sser_rw_tr_cfg___urun_stop___bit 2
#define reg_sser_rw_tr_cfg___eop_stop___lsb 3
#define reg_sser_rw_tr_cfg___eop_stop___width 1
#define reg_sser_rw_tr_cfg___eop_stop___bit 3
#define reg_sser_rw_tr_cfg___sample_size___lsb 4
#define reg_sser_rw_tr_cfg___sample_size___width 6
#define reg_sser_rw_tr_cfg___sh_dir___lsb 10
#define reg_sser_rw_tr_cfg___sh_dir___width 1
#define reg_sser_rw_tr_cfg___sh_dir___bit 10
#define reg_sser_rw_tr_cfg___clk_pol___lsb 11
#define reg_sser_rw_tr_cfg___clk_pol___width 1
#define reg_sser_rw_tr_cfg___clk_pol___bit 11
#define reg_sser_rw_tr_cfg___clk_src___lsb 12
#define reg_sser_rw_tr_cfg___clk_src___width 1
#define reg_sser_rw_tr_cfg___clk_src___bit 12
#define reg_sser_rw_tr_cfg___use_dma___lsb 13
#define reg_sser_rw_tr_cfg___use_dma___width 1
#define reg_sser_rw_tr_cfg___use_dma___bit 13
#define reg_sser_rw_tr_cfg___mode___lsb 14
#define reg_sser_rw_tr_cfg___mode___width 2
#define reg_sser_rw_tr_cfg___frm_src___lsb 16
#define reg_sser_rw_tr_cfg___frm_src___width 1
#define reg_sser_rw_tr_cfg___frm_src___bit 16
#define reg_sser_rw_tr_cfg___use60958___lsb 17
#define reg_sser_rw_tr_cfg___use60958___width 1
#define reg_sser_rw_tr_cfg___use60958___bit 17
#define reg_sser_rw_tr_cfg___iec60958_ckdiv___lsb 18
#define reg_sser_rw_tr_cfg___iec60958_ckdiv___width 2
#define reg_sser_rw_tr_cfg___rate_ctrl___lsb 20
#define reg_sser_rw_tr_cfg___rate_ctrl___width 1
#define reg_sser_rw_tr_cfg___rate_ctrl___bit 20
#define reg_sser_rw_tr_cfg___use_md___lsb 21
#define reg_sser_rw_tr_cfg___use_md___width 1
#define reg_sser_rw_tr_cfg___use_md___bit 21
#define reg_sser_rw_tr_cfg___dual_i2s___lsb 22
#define reg_sser_rw_tr_cfg___dual_i2s___width 1
#define reg_sser_rw_tr_cfg___dual_i2s___bit 22
#define reg_sser_rw_tr_cfg___data_pin_use___lsb 23
#define reg_sser_rw_tr_cfg___data_pin_use___width 2
#define reg_sser_rw_tr_cfg___od_mode___lsb 25
#define reg_sser_rw_tr_cfg___od_mode___width 1
#define reg_sser_rw_tr_cfg___od_mode___bit 25
#define reg_sser_rw_tr_cfg___bulk_wspace___lsb 26
#define reg_sser_rw_tr_cfg___bulk_wspace___width 2
#define reg_sser_rw_tr_cfg_offset 8
/* Register rw_rec_cfg, scope sser, type rw */
#define reg_sser_rw_rec_cfg___rec_en___lsb 0
#define reg_sser_rw_rec_cfg___rec_en___width 1
#define reg_sser_rw_rec_cfg___rec_en___bit 0
#define reg_sser_rw_rec_cfg___force_eop___lsb 1
#define reg_sser_rw_rec_cfg___force_eop___width 1
#define reg_sser_rw_rec_cfg___force_eop___bit 1
#define reg_sser_rw_rec_cfg___stop___lsb 2
#define reg_sser_rw_rec_cfg___stop___width 1
#define reg_sser_rw_rec_cfg___stop___bit 2
#define reg_sser_rw_rec_cfg___orun_stop___lsb 3
#define reg_sser_rw_rec_cfg___orun_stop___width 1
#define reg_sser_rw_rec_cfg___orun_stop___bit 3
#define reg_sser_rw_rec_cfg___eop_stop___lsb 4
#define reg_sser_rw_rec_cfg___eop_stop___width 1
#define reg_sser_rw_rec_cfg___eop_stop___bit 4
#define reg_sser_rw_rec_cfg___sample_size___lsb 5
#define reg_sser_rw_rec_cfg___sample_size___width 6
#define reg_sser_rw_rec_cfg___sh_dir___lsb 11
#define reg_sser_rw_rec_cfg___sh_dir___width 1
#define reg_sser_rw_rec_cfg___sh_dir___bit 11
#define reg_sser_rw_rec_cfg___clk_pol___lsb 12
#define reg_sser_rw_rec_cfg___clk_pol___width 1
#define reg_sser_rw_rec_cfg___clk_pol___bit 12
#define reg_sser_rw_rec_cfg___clk_src___lsb 13
#define reg_sser_rw_rec_cfg___clk_src___width 1
#define reg_sser_rw_rec_cfg___clk_src___bit 13
#define reg_sser_rw_rec_cfg___use_dma___lsb 14
#define reg_sser_rw_rec_cfg___use_dma___width 1
#define reg_sser_rw_rec_cfg___use_dma___bit 14
#define reg_sser_rw_rec_cfg___mode___lsb 15
#define reg_sser_rw_rec_cfg___mode___width 2
#define reg_sser_rw_rec_cfg___frm_src___lsb 17
#define reg_sser_rw_rec_cfg___frm_src___width 2
#define reg_sser_rw_rec_cfg___use60958___lsb 19
#define reg_sser_rw_rec_cfg___use60958___width 1
#define reg_sser_rw_rec_cfg___use60958___bit 19
#define reg_sser_rw_rec_cfg___iec60958_ui_len___lsb 20
#define reg_sser_rw_rec_cfg___iec60958_ui_len___width 5
#define reg_sser_rw_rec_cfg___slave2_en___lsb 25
#define reg_sser_rw_rec_cfg___slave2_en___width 1
#define reg_sser_rw_rec_cfg___slave2_en___bit 25
#define reg_sser_rw_rec_cfg___slave3_en___lsb 26
#define reg_sser_rw_rec_cfg___slave3_en___width 1
#define reg_sser_rw_rec_cfg___slave3_en___bit 26
#define reg_sser_rw_rec_cfg___fifo_thr___lsb 27
#define reg_sser_rw_rec_cfg___fifo_thr___width 2
#define reg_sser_rw_rec_cfg_offset 12
/* Register rw_tr_data, scope sser, type rw */
#define reg_sser_rw_tr_data___data___lsb 0
#define reg_sser_rw_tr_data___data___width 16
#define reg_sser_rw_tr_data___md___lsb 16
#define reg_sser_rw_tr_data___md___width 1
#define reg_sser_rw_tr_data___md___bit 16
#define reg_sser_rw_tr_data_offset 16
/* Register r_rec_data, scope sser, type r */
#define reg_sser_r_rec_data___data___lsb 0
#define reg_sser_r_rec_data___data___width 16
#define reg_sser_r_rec_data___md___lsb 16
#define reg_sser_r_rec_data___md___width 1
#define reg_sser_r_rec_data___md___bit 16
#define reg_sser_r_rec_data___ext_clk___lsb 17
#define reg_sser_r_rec_data___ext_clk___width 1
#define reg_sser_r_rec_data___ext_clk___bit 17
#define reg_sser_r_rec_data___status_in___lsb 18
#define reg_sser_r_rec_data___status_in___width 1
#define reg_sser_r_rec_data___status_in___bit 18
#define reg_sser_r_rec_data___frame_in___lsb 19
#define reg_sser_r_rec_data___frame_in___width 1
#define reg_sser_r_rec_data___frame_in___bit 19
#define reg_sser_r_rec_data___din___lsb 20
#define reg_sser_r_rec_data___din___width 1
#define reg_sser_r_rec_data___din___bit 20
#define reg_sser_r_rec_data___data_in___lsb 21
#define reg_sser_r_rec_data___data_in___width 1
#define reg_sser_r_rec_data___data_in___bit 21
#define reg_sser_r_rec_data___clk_in___lsb 22
#define reg_sser_r_rec_data___clk_in___width 1
#define reg_sser_r_rec_data___clk_in___bit 22
#define reg_sser_r_rec_data_offset 20
/* Register rw_extra, scope sser, type rw */
#define reg_sser_rw_extra___clkoff_cycles___lsb 0
#define reg_sser_rw_extra___clkoff_cycles___width 20
#define reg_sser_rw_extra___clkoff_en___lsb 20
#define reg_sser_rw_extra___clkoff_en___width 1
#define reg_sser_rw_extra___clkoff_en___bit 20
#define reg_sser_rw_extra___clkon_en___lsb 21
#define reg_sser_rw_extra___clkon_en___width 1
#define reg_sser_rw_extra___clkon_en___bit 21
#define reg_sser_rw_extra___dout_delay___lsb 22
#define reg_sser_rw_extra___dout_delay___width 5
#define reg_sser_rw_extra_offset 24
/* Register rw_intr_mask, scope sser, type rw */
#define reg_sser_rw_intr_mask___trdy___lsb 0
#define reg_sser_rw_intr_mask___trdy___width 1
#define reg_sser_rw_intr_mask___trdy___bit 0
#define reg_sser_rw_intr_mask___rdav___lsb 1
#define reg_sser_rw_intr_mask___rdav___width 1
#define reg_sser_rw_intr_mask___rdav___bit 1
#define reg_sser_rw_intr_mask___tidle___lsb 2
#define reg_sser_rw_intr_mask___tidle___width 1
#define reg_sser_rw_intr_mask___tidle___bit 2
#define reg_sser_rw_intr_mask___rstop___lsb 3
#define reg_sser_rw_intr_mask___rstop___width 1
#define reg_sser_rw_intr_mask___rstop___bit 3
#define reg_sser_rw_intr_mask___urun___lsb 4
#define reg_sser_rw_intr_mask___urun___width 1
#define reg_sser_rw_intr_mask___urun___bit 4
#define reg_sser_rw_intr_mask___orun___lsb 5
#define reg_sser_rw_intr_mask___orun___width 1
#define reg_sser_rw_intr_mask___orun___bit 5
#define reg_sser_rw_intr_mask___md_rec___lsb 6
#define reg_sser_rw_intr_mask___md_rec___width 1
#define reg_sser_rw_intr_mask___md_rec___bit 6
#define reg_sser_rw_intr_mask___md_sent___lsb 7
#define reg_sser_rw_intr_mask___md_sent___width 1
#define reg_sser_rw_intr_mask___md_sent___bit 7
#define reg_sser_rw_intr_mask___r958err___lsb 8
#define reg_sser_rw_intr_mask___r958err___width 1
#define reg_sser_rw_intr_mask___r958err___bit 8
#define reg_sser_rw_intr_mask_offset 28
/* Register rw_ack_intr, scope sser, type rw */
#define reg_sser_rw_ack_intr___trdy___lsb 0
#define reg_sser_rw_ack_intr___trdy___width 1
#define reg_sser_rw_ack_intr___trdy___bit 0
#define reg_sser_rw_ack_intr___rdav___lsb 1
#define reg_sser_rw_ack_intr___rdav___width 1
#define reg_sser_rw_ack_intr___rdav___bit 1
#define reg_sser_rw_ack_intr___tidle___lsb 2
#define reg_sser_rw_ack_intr___tidle___width 1
#define reg_sser_rw_ack_intr___tidle___bit 2
#define reg_sser_rw_ack_intr___rstop___lsb 3
#define reg_sser_rw_ack_intr___rstop___width 1
#define reg_sser_rw_ack_intr___rstop___bit 3
#define reg_sser_rw_ack_intr___urun___lsb 4
#define reg_sser_rw_ack_intr___urun___width 1
#define reg_sser_rw_ack_intr___urun___bit 4
#define reg_sser_rw_ack_intr___orun___lsb 5
#define reg_sser_rw_ack_intr___orun___width 1
#define reg_sser_rw_ack_intr___orun___bit 5
#define reg_sser_rw_ack_intr___md_rec___lsb 6
#define reg_sser_rw_ack_intr___md_rec___width 1
#define reg_sser_rw_ack_intr___md_rec___bit 6
#define reg_sser_rw_ack_intr___md_sent___lsb 7
#define reg_sser_rw_ack_intr___md_sent___width 1
#define reg_sser_rw_ack_intr___md_sent___bit 7
#define reg_sser_rw_ack_intr___r958err___lsb 8
#define reg_sser_rw_ack_intr___r958err___width 1
#define reg_sser_rw_ack_intr___r958err___bit 8
#define reg_sser_rw_ack_intr_offset 32
/* Register r_intr, scope sser, type r */
#define reg_sser_r_intr___trdy___lsb 0
#define reg_sser_r_intr___trdy___width 1
#define reg_sser_r_intr___trdy___bit 0
#define reg_sser_r_intr___rdav___lsb 1
#define reg_sser_r_intr___rdav___width 1
#define reg_sser_r_intr___rdav___bit 1
#define reg_sser_r_intr___tidle___lsb 2
#define reg_sser_r_intr___tidle___width 1
#define reg_sser_r_intr___tidle___bit 2
#define reg_sser_r_intr___rstop___lsb 3
#define reg_sser_r_intr___rstop___width 1
#define reg_sser_r_intr___rstop___bit 3
#define reg_sser_r_intr___urun___lsb 4
#define reg_sser_r_intr___urun___width 1
#define reg_sser_r_intr___urun___bit 4
#define reg_sser_r_intr___orun___lsb 5
#define reg_sser_r_intr___orun___width 1
#define reg_sser_r_intr___orun___bit 5
#define reg_sser_r_intr___md_rec___lsb 6
#define reg_sser_r_intr___md_rec___width 1
#define reg_sser_r_intr___md_rec___bit 6
#define reg_sser_r_intr___md_sent___lsb 7
#define reg_sser_r_intr___md_sent___width 1
#define reg_sser_r_intr___md_sent___bit 7
#define reg_sser_r_intr___r958err___lsb 8
#define reg_sser_r_intr___r958err___width 1
#define reg_sser_r_intr___r958err___bit 8
#define reg_sser_r_intr_offset 36
/* Register r_masked_intr, scope sser, type r */
#define reg_sser_r_masked_intr___trdy___lsb 0
#define reg_sser_r_masked_intr___trdy___width 1
#define reg_sser_r_masked_intr___trdy___bit 0
#define reg_sser_r_masked_intr___rdav___lsb 1
#define reg_sser_r_masked_intr___rdav___width 1
#define reg_sser_r_masked_intr___rdav___bit 1
#define reg_sser_r_masked_intr___tidle___lsb 2
#define reg_sser_r_masked_intr___tidle___width 1
#define reg_sser_r_masked_intr___tidle___bit 2
#define reg_sser_r_masked_intr___rstop___lsb 3
#define reg_sser_r_masked_intr___rstop___width 1
#define reg_sser_r_masked_intr___rstop___bit 3
#define reg_sser_r_masked_intr___urun___lsb 4
#define reg_sser_r_masked_intr___urun___width 1
#define reg_sser_r_masked_intr___urun___bit 4
#define reg_sser_r_masked_intr___orun___lsb 5
#define reg_sser_r_masked_intr___orun___width 1
#define reg_sser_r_masked_intr___orun___bit 5
#define reg_sser_r_masked_intr___md_rec___lsb 6
#define reg_sser_r_masked_intr___md_rec___width 1
#define reg_sser_r_masked_intr___md_rec___bit 6
#define reg_sser_r_masked_intr___md_sent___lsb 7
#define reg_sser_r_masked_intr___md_sent___width 1
#define reg_sser_r_masked_intr___md_sent___bit 7
#define reg_sser_r_masked_intr___r958err___lsb 8
#define reg_sser_r_masked_intr___r958err___width 1
#define reg_sser_r_masked_intr___r958err___bit 8
#define reg_sser_r_masked_intr_offset 40
/* Constants */
#define regk_sser_both 0x00000002
#define regk_sser_bulk 0x00000001
#define regk_sser_clk100 0x00000000
#define regk_sser_clk_in 0x00000000
#define regk_sser_const0 0x00000003
#define regk_sser_dout 0x00000002
#define regk_sser_edge 0x00000000
#define regk_sser_ext 0x00000001
#define regk_sser_ext_clk 0x00000001
#define regk_sser_f100 0x00000000
#define regk_sser_f29_493 0x00000004
#define regk_sser_f32 0x00000005
#define regk_sser_f32_768 0x00000006
#define regk_sser_frm 0x00000003
#define regk_sser_gio0 0x00000000
#define regk_sser_gio1 0x00000001
#define regk_sser_hispeed 0x00000001
#define regk_sser_hold 0x00000002
#define regk_sser_in 0x00000000
#define regk_sser_inf 0x00000003
#define regk_sser_intern 0x00000000
#define regk_sser_intern_clk 0x00000001
#define regk_sser_intern_tb 0x00000000
#define regk_sser_iso 0x00000000
#define regk_sser_level 0x00000001
#define regk_sser_lospeed 0x00000000
#define regk_sser_lsbfirst 0x00000000
#define regk_sser_msbfirst 0x00000001
#define regk_sser_neg 0x00000001
#define regk_sser_neg_lo 0x00000000
#define regk_sser_no 0x00000000
#define regk_sser_no_clk 0x00000007
#define regk_sser_nojitter 0x00000002
#define regk_sser_out 0x00000001
#define regk_sser_pos 0x00000000
#define regk_sser_pos_hi 0x00000001
#define regk_sser_rec 0x00000000
#define regk_sser_rw_cfg_default 0x00000000
#define regk_sser_rw_extra_default 0x00000000
#define regk_sser_rw_frm_cfg_default 0x00000000
#define regk_sser_rw_intr_mask_default 0x00000000
#define regk_sser_rw_rec_cfg_default 0x00000000
#define regk_sser_rw_tr_cfg_default 0x01800000
#define regk_sser_rw_tr_data_default 0x00000000
#define regk_sser_thr16 0x00000001
#define regk_sser_thr32 0x00000002
#define regk_sser_thr8 0x00000000
#define regk_sser_tr 0x00000001
#define regk_sser_ts_out 0x00000003
#define regk_sser_tx_bulk 0x00000002
#define regk_sser_wiresave 0x00000002
#define regk_sser_yes 0x00000001
#endif /* __sser_defs_asm_h */

View file

@ -0,0 +1,84 @@
#ifndef __strcop_defs_asm_h
#define __strcop_defs_asm_h
/*
* This file is autogenerated from
* file: ../../inst/strcop/rtl/strcop_regs.r
* id: strcop_regs.r,v 1.5 2003/10/15 12:09:45 kriskn Exp
* last modfied: Mon Apr 11 16:09:38 2005
*
* by /n/asic/design/tools/rdesc/src/rdes2c -asm --outfile asm/strcop_defs_asm.h ../../inst/strcop/rtl/strcop_regs.r
* id: $Id: strcop_defs_asm.h,v 1.1 2005/04/24 18:31:04 starvik Exp $
* Any changes here will be lost.
*
* -*- buffer-read-only: t -*-
*/
#ifndef REG_FIELD
#define REG_FIELD( scope, reg, field, value ) \
REG_FIELD_X_( value, reg_##scope##_##reg##___##field##___lsb )
#define REG_FIELD_X_( value, shift ) ((value) << shift)
#endif
#ifndef REG_STATE
#define REG_STATE( scope, reg, field, symbolic_value ) \
REG_STATE_X_( regk_##scope##_##symbolic_value, reg_##scope##_##reg##___##field##___lsb )
#define REG_STATE_X_( k, shift ) (k << shift)
#endif
#ifndef REG_MASK
#define REG_MASK( scope, reg, field ) \
REG_MASK_X_( reg_##scope##_##reg##___##field##___width, reg_##scope##_##reg##___##field##___lsb )
#define REG_MASK_X_( width, lsb ) (((1 << width)-1) << lsb)
#endif
#ifndef REG_LSB
#define REG_LSB( scope, reg, field ) reg_##scope##_##reg##___##field##___lsb
#endif
#ifndef REG_BIT
#define REG_BIT( scope, reg, field ) reg_##scope##_##reg##___##field##___bit
#endif
#ifndef REG_ADDR
#define REG_ADDR( scope, inst, reg ) REG_ADDR_X_(inst, reg_##scope##_##reg##_offset)
#define REG_ADDR_X_( inst, offs ) ((inst) + offs)
#endif
#ifndef REG_ADDR_VECT
#define REG_ADDR_VECT( scope, inst, reg, index ) \
REG_ADDR_VECT_X_(inst, reg_##scope##_##reg##_offset, index, \
STRIDE_##scope##_##reg )
#define REG_ADDR_VECT_X_( inst, offs, index, stride ) \
((inst) + offs + (index) * stride)
#endif
/* Register rw_cfg, scope strcop, type rw */
#define reg_strcop_rw_cfg___td3___lsb 0
#define reg_strcop_rw_cfg___td3___width 1
#define reg_strcop_rw_cfg___td3___bit 0
#define reg_strcop_rw_cfg___td2___lsb 1
#define reg_strcop_rw_cfg___td2___width 1
#define reg_strcop_rw_cfg___td2___bit 1
#define reg_strcop_rw_cfg___td1___lsb 2
#define reg_strcop_rw_cfg___td1___width 1
#define reg_strcop_rw_cfg___td1___bit 2
#define reg_strcop_rw_cfg___ipend___lsb 3
#define reg_strcop_rw_cfg___ipend___width 1
#define reg_strcop_rw_cfg___ipend___bit 3
#define reg_strcop_rw_cfg___ignore_sync___lsb 4
#define reg_strcop_rw_cfg___ignore_sync___width 1
#define reg_strcop_rw_cfg___ignore_sync___bit 4
#define reg_strcop_rw_cfg___en___lsb 5
#define reg_strcop_rw_cfg___en___width 1
#define reg_strcop_rw_cfg___en___bit 5
#define reg_strcop_rw_cfg_offset 0
/* Constants */
#define regk_strcop_big 0x00000001
#define regk_strcop_d 0x00000001
#define regk_strcop_e 0x00000000
#define regk_strcop_little 0x00000000
#define regk_strcop_rw_cfg_default 0x00000002
#endif /* __strcop_defs_asm_h */

View file

@ -0,0 +1,100 @@
#ifndef __strmux_defs_asm_h
#define __strmux_defs_asm_h
/*
* This file is autogenerated from
* file: ../../inst/strmux/rtl/guinness/strmux_regs.r
* id: strmux_regs.r,v 1.10 2005/02/10 10:10:46 perz Exp
* last modfied: Mon Apr 11 16:09:43 2005
*
* by /n/asic/design/tools/rdesc/src/rdes2c -asm --outfile asm/strmux_defs_asm.h ../../inst/strmux/rtl/guinness/strmux_regs.r
* id: $Id: strmux_defs_asm.h,v 1.1 2005/04/24 18:31:04 starvik Exp $
* Any changes here will be lost.
*
* -*- buffer-read-only: t -*-
*/
#ifndef REG_FIELD
#define REG_FIELD( scope, reg, field, value ) \
REG_FIELD_X_( value, reg_##scope##_##reg##___##field##___lsb )
#define REG_FIELD_X_( value, shift ) ((value) << shift)
#endif
#ifndef REG_STATE
#define REG_STATE( scope, reg, field, symbolic_value ) \
REG_STATE_X_( regk_##scope##_##symbolic_value, reg_##scope##_##reg##___##field##___lsb )
#define REG_STATE_X_( k, shift ) (k << shift)
#endif
#ifndef REG_MASK
#define REG_MASK( scope, reg, field ) \
REG_MASK_X_( reg_##scope##_##reg##___##field##___width, reg_##scope##_##reg##___##field##___lsb )
#define REG_MASK_X_( width, lsb ) (((1 << width)-1) << lsb)
#endif
#ifndef REG_LSB
#define REG_LSB( scope, reg, field ) reg_##scope##_##reg##___##field##___lsb
#endif
#ifndef REG_BIT
#define REG_BIT( scope, reg, field ) reg_##scope##_##reg##___##field##___bit
#endif
#ifndef REG_ADDR
#define REG_ADDR( scope, inst, reg ) REG_ADDR_X_(inst, reg_##scope##_##reg##_offset)
#define REG_ADDR_X_( inst, offs ) ((inst) + offs)
#endif
#ifndef REG_ADDR_VECT
#define REG_ADDR_VECT( scope, inst, reg, index ) \
REG_ADDR_VECT_X_(inst, reg_##scope##_##reg##_offset, index, \
STRIDE_##scope##_##reg )
#define REG_ADDR_VECT_X_( inst, offs, index, stride ) \
((inst) + offs + (index) * stride)
#endif
/* Register rw_cfg, scope strmux, type rw */
#define reg_strmux_rw_cfg___dma0___lsb 0
#define reg_strmux_rw_cfg___dma0___width 3
#define reg_strmux_rw_cfg___dma1___lsb 3
#define reg_strmux_rw_cfg___dma1___width 3
#define reg_strmux_rw_cfg___dma2___lsb 6
#define reg_strmux_rw_cfg___dma2___width 3
#define reg_strmux_rw_cfg___dma3___lsb 9
#define reg_strmux_rw_cfg___dma3___width 3
#define reg_strmux_rw_cfg___dma4___lsb 12
#define reg_strmux_rw_cfg___dma4___width 3
#define reg_strmux_rw_cfg___dma5___lsb 15
#define reg_strmux_rw_cfg___dma5___width 3
#define reg_strmux_rw_cfg___dma6___lsb 18
#define reg_strmux_rw_cfg___dma6___width 3
#define reg_strmux_rw_cfg___dma7___lsb 21
#define reg_strmux_rw_cfg___dma7___width 3
#define reg_strmux_rw_cfg___dma8___lsb 24
#define reg_strmux_rw_cfg___dma8___width 3
#define reg_strmux_rw_cfg___dma9___lsb 27
#define reg_strmux_rw_cfg___dma9___width 3
#define reg_strmux_rw_cfg_offset 0
/* Constants */
#define regk_strmux_ata 0x00000003
#define regk_strmux_eth0 0x00000001
#define regk_strmux_eth1 0x00000004
#define regk_strmux_ext0 0x00000001
#define regk_strmux_ext1 0x00000001
#define regk_strmux_ext2 0x00000001
#define regk_strmux_ext3 0x00000001
#define regk_strmux_iop0 0x00000002
#define regk_strmux_iop1 0x00000001
#define regk_strmux_off 0x00000000
#define regk_strmux_p21 0x00000004
#define regk_strmux_rw_cfg_default 0x00000000
#define regk_strmux_ser0 0x00000002
#define regk_strmux_ser1 0x00000002
#define regk_strmux_ser2 0x00000004
#define regk_strmux_ser3 0x00000003
#define regk_strmux_sser0 0x00000003
#define regk_strmux_sser1 0x00000003
#define regk_strmux_strcop 0x00000002
#endif /* __strmux_defs_asm_h */

Some files were not shown because too many files have changed in this diff Show more