sh: First support code of SuperH.
authorNobuhiro Iwamatsu <iwamatsu@rahute.(none)>
Sun, 13 May 2007 11:58:00 +0000 (20:58 +0900)
committerNobuhiro Iwamatsu <iwamatsu@rahute.(none)>
Sun, 13 May 2007 11:58:00 +0000 (20:58 +0900)
Signed-off-by: Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
31 files changed:
CREDITS
Makefile
common/cmd_bootm.c
cpu/sh4/Makefile [new file with mode: 0644]
cpu/sh4/config.mk [new file with mode: 0644]
cpu/sh4/cpu.c [new file with mode: 0644]
cpu/sh4/interrupts.c [new file with mode: 0644]
cpu/sh4/start.S [new file with mode: 0644]
cpu/sh4/time.c [new file with mode: 0644]
cpu/sh4/watchdog.c [new file with mode: 0644]
drivers/Makefile
drivers/serial_sh.c [new file with mode: 0644]
examples/Makefile
examples/stubs.c
include/asm-sh/bitops.h [new file with mode: 0644]
include/asm-sh/byteorder.h [new file with mode: 0644]
include/asm-sh/cpu_sh4.h [new file with mode: 0644]
include/asm-sh/cpu_sh7750.h [new file with mode: 0644]
include/asm-sh/global_data.h [new file with mode: 0644]
include/asm-sh/io.h [new file with mode: 0644]
include/asm-sh/posix_types.h [new file with mode: 0644]
include/asm-sh/processor.h [new file with mode: 0644]
include/asm-sh/ptrace.h [new file with mode: 0644]
include/asm-sh/string.h [new file with mode: 0644]
include/asm-sh/system.h [new file with mode: 0644]
include/asm-sh/types.h [new file with mode: 0644]
include/asm-sh/u-boot.h [new file with mode: 0644]
lib_sh/Makefile [new file with mode: 0644]
lib_sh/board.c [new file with mode: 0644]
lib_sh/sh_linux.c [new file with mode: 0644]
lib_sh/time.c [new file with mode: 0644]

diff --git a/CREDITS b/CREDITS
index 7af1b806ab0e3a651b00998cdd94475cdaf78554..e94372dd0c1a26a36d7df884c9bade99f8427489 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -479,3 +479,8 @@ N: Michal Simek
 E: monstr@monstr.eu
 D: Support for Microblaze, ML401, XUPV2P board
 W: www.monstr.eu
+
+N: Nobuhiro Iwamatsu
+E: iwamatsu@nigauri.org
+D: Support for SuperH, MS7750SE01 , MS7780SE03  board
+W: www.nigauri.org
index ceee2c7bed3ad5ee4f7a33e23dd51a164a5e0d22..1a9b3d26003e9e66dfc66036e8147eb425369e23 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -151,6 +151,9 @@ endif
 ifeq ($(ARCH),avr32)
 CROSS_COMPILE = avr32-linux-
 endif
+ifeq ($(ARCH),sh)
+CROSS_COMPILE = sh4-linux-
+endif
 endif
 endif
 
index a6499e8dd9bc3fc853606567c847d0a064f02e55..8af0589d9a12bc0b92e699bdf9fbb66c59ed9fb6 100644 (file)
@@ -267,6 +267,8 @@ int do_bootm (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
        if (hdr->ih_arch != IH_CPU_NIOS2)
 #elif defined(__PPC__)
        if (hdr->ih_arch != IH_CPU_PPC)
+#elif defined(__sh__)
+       if (hdr->ih_arch != IH_CPU_SH)
 #else
 # error Unknown CPU type
 #endif
diff --git a/cpu/sh4/Makefile b/cpu/sh4/Makefile
new file mode 100644 (file)
index 0000000..b24a280
--- /dev/null
@@ -0,0 +1,46 @@
+#
+# (C) Copyright 2000-2006
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# (C) Copyright 2007
+# Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
+#
+# See file CREDITS for list of people who contributed to this
+# project.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA
+#
+
+include $(TOPDIR)/config.mk
+
+LIB    = $(obj)lib$(CPU).a
+
+START  = start.o
+OBJS   = cpu.o interrupts.o watchdog.o time.o 
+
+all:   .depend $(START) $(LIB)
+
+$(LIB):        $(OBJS)
+       $(AR) crv $@ $(OBJS)
+
+#########################################################################
+
+.depend:       Makefile $(START:.o=.S) $(OBJS:.o=.c)
+               $(CC) -M $(CFLAGS) $(START:.o=.S) $(OBJS:.o=.c) > $@
+
+sinclude .depend
+
+#########################################################################
diff --git a/cpu/sh4/config.mk b/cpu/sh4/config.mk
new file mode 100644 (file)
index 0000000..2dc7b91
--- /dev/null
@@ -0,0 +1,28 @@
+#
+# (C) Copyright 2000-2004
+# Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+#
+# (C) Copyright 2007
+# Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
+#   
+# See file CREDITS for list of people who contributed to this
+# project.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA
+#
+#
+PLATFORM_CPPFLAGS += -m4-nofpu
+PLATFORM_RELFLAGS += -ffixed-r13
diff --git a/cpu/sh4/cpu.c b/cpu/sh4/cpu.c
new file mode 100644 (file)
index 0000000..70df45e
--- /dev/null
@@ -0,0 +1,67 @@
+/*
+ * (C) Copyright 2007
+ * Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <command.h>
+
+int checkcpu(void)
+{
+       puts("CPU: SH4\n");
+       return 0;
+}
+
+int cpu_init (void)
+{
+       return 0;
+}
+
+int cleanup_before_linux (void)
+{
+       disable_interrupts();
+       return 0;
+}
+
+int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
+{
+       disable_interrupts();
+       reset_cpu (0);
+       return 0;
+}
+
+void flush_cache (unsigned long addr, unsigned long size){}
+
+void icache_enable (void)
+{
+
+}
+
+void icache_disable (void)
+{
+
+}
+
+
+int icache_status (void)
+{
+       return 0; 
+}
diff --git a/cpu/sh4/interrupts.c b/cpu/sh4/interrupts.c
new file mode 100644 (file)
index 0000000..d310dd2
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * (C) Copyright 2007
+ * Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+
+int interrupt_init (void)
+{
+       return 0; 
+}
+
+void enable_interrupts (void)
+{
+
+}
+
+int disable_interrupts (void){ 
+       return 0; 
+}
+
diff --git a/cpu/sh4/start.S b/cpu/sh4/start.S
new file mode 100644 (file)
index 0000000..d88b705
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ * (C) Copyright 2007
+ * Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <config.h>
+#include <version.h>
+
+       .text
+       .align  2
+
+       .global _start
+_start:
+       mov.l   ._lowlevel_init, r0
+100:   bsrf    r0
+       nop
+
+       bsr     1f
+       nop
+1:     sts     pr, r5
+       mov.l   ._reloc_dst, r4 
+       add     #(_start-1b), r5        
+       mov.l   ._reloc_dst_end, r6     
+
+2:     mov.l   @r5+, r1
+       mov.l   r1, @r4
+       add     #4, r4
+       cmp/hs  r6, r4
+       bf      2b
+       
+       mov.l   ._bss_start, r4 
+       mov.l   ._bss_end, r5           
+       mov     #0, r1
+
+3:     mov.l   r1, @r4                 /* bss clear */ 
+       add     #4, r4
+       cmp/hs  r5, r4
+       bf      3b
+
+       mov.l   ._gd_init, r13          /* global data */
+       mov.l   ._stack_init, r15       /* stack */
+
+       mov.l   ._sh_generic_init, r0
+       jsr     @r0                     
+       nop                             
+
+loop:
+       bra     loop
+
+       .align  2
+
+._lowlevel_init:       .long   (lowlevel_init - (100b + 4))
+._reloc_dst:           .long   reloc_dst
+._reloc_dst_end:       .long   reloc_dst_end
+._bss_start:           .long   bss_start
+._bss_end:             .long   bss_end
+._gd_init:             .long   (_start - CFG_GBL_DATA_SIZE)
+._stack_init:          .long   (_start - CFG_GBL_DATA_SIZE - CFG_MALLOC_LEN - 16)
+._sh_generic_init:     .long   sh_generic_init
+
diff --git a/cpu/sh4/time.c b/cpu/sh4/time.c
new file mode 100644 (file)
index 0000000..b6e4d02
--- /dev/null
@@ -0,0 +1,94 @@
+/*
+ * (C) Copyright 2003
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <asm/processor.h>
+
+#define TMU_MAX_COUNTER (~0UL)
+
+static void tmu_timer_start (unsigned int timer)
+{
+       if (timer > 2)
+               return;
+
+       *((volatile unsigned char *) TSTR0) |= (1 << timer);
+}
+
+int timer_init (void)
+{
+       /* Divide clock by 4 */
+       *(volatile u16 *)TCR0 = 0;
+
+       tmu_timer_start (0);
+       return 0;
+}
+
+/*
+   In theory we should return a true 64bit value (ie something that doesn't
+   overflow). However, we don't. Therefore if TMU runs at fastest rate of
+   6.75 MHz this value will wrap after u-boot has been running for approx
+   10 minutes.
+*/
+unsigned long long get_ticks (void)
+{
+       return (0 - *((volatile unsigned int *) TCNT0));
+}
+
+unsigned long get_timer (unsigned long base)
+{
+       unsigned long n = 
+               *((volatile unsigned int *)TCNT0) ;
+       
+       return ((int)n - base ) < 0 ? ( TMU_MAX_COUNTER - ( base -n )):(n - base );
+}
+
+void set_timer (unsigned long t)
+{
+       *((volatile unsigned int *) TCNT0) = (0 - t);
+}
+
+void reset_timer (void)
+{
+       set_timer (0);
+}
+
+void udelay (unsigned long usec)
+{
+       unsigned int start = get_timer (0);
+       unsigned int end = 0;
+       if (usec > 1000000)
+               end = ((usec/100000) * CFG_HZ) / 10;
+       else if (usec > 1000)
+               end = ((usec/100) * CFG_HZ) / 10000;
+       else
+               end = (usec * CFG_HZ) / 1000000;
+
+       while (get_timer (0) < end)
+               continue;
+}
+
+unsigned long get_tbclk (void)
+{
+       return CFG_HZ;
+}
+
diff --git a/cpu/sh4/watchdog.c b/cpu/sh4/watchdog.c
new file mode 100644 (file)
index 0000000..e2bc820
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <asm/processor.h>
+
+#define WDT_BASE       WTCNT
+
+static unsigned char cnt_read (void){
+       return *((volatile unsigned char *)(WDT_BASE + 0x00));
+}
+
+static unsigned char csr_read (void){
+       return *((volatile unsigned char *)(WDT_BASE + 0x04));
+}
+
+static void cnt_write (unsigned char value){
+       while (csr_read() & (1 << 5)) {
+               /* delay */
+       }
+       *((volatile unsigned short *)(WDT_BASE + 0x00)) = ((unsigned short) value) | 0x5A00;
+}
+
+static void csr_write (unsigned char value){
+       *((volatile unsigned short *)(WDT_BASE + 0x04)) = ((unsigned short) value) | 0xA500;
+}
+
+
+int watchdog_init (void){ return 0; }
+
+void reset_cpu (unsigned long ignored)
+{
+       while(1);
+}
+
+
index d68cba682be295949d15c3635896a6c944849531..a3a9986cf4e78cbb897a77cd54de5c824a0ad593 100644 (file)
@@ -41,7 +41,7 @@ COBJS = 3c589.o 5701rls.o ali512x.o atmel_usart.o \
          rtl8019.o rtl8139.o rtl8169.o \
          s3c4510b_eth.o s3c4510b_uart.o \
          sed13806.o sed156x.o \
-         serial.o serial_max3100.o \
+         serial.o serial_max3100.o serial_sh.o \
          serial_pl010.o serial_pl011.o serial_xuartlite.o \
          sl811_usb.o sm501.o smc91111.o smiLynxEM.o \
          status_led.o sym53c8xx.o systemace.o ahci.o \
diff --git a/drivers/serial_sh.c b/drivers/serial_sh.c
new file mode 100644 (file)
index 0000000..fca92fd
--- /dev/null
@@ -0,0 +1,177 @@
+/*
+ * SuperH SCIF device driver.
+ * Copyright (c) 2007 Nobuhiro Iwamatsu
+ * 
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#include <common.h>
+#include <asm/processor.h>
+
+#ifdef CFG_SCIF_CONSOLE
+
+#if defined (CONFIG_CONS_SCIF0)
+#define SCIF_BASE      SCIF0_BASE
+#elif defined (CONFIG_CONS_SCIF1)
+#define SCIF_BASE      SCIF1_BASE
+#else
+#error "Default SCIF doesn't set....."
+#endif
+
+#define SCSMR  (volatile unsigned short *)(SCIF_BASE + 0x0)
+#define SCBRR  (volatile unsigned char  *)(SCIF_BASE + 0x4) 
+#define SCSCR  (volatile unsigned short *)(SCIF_BASE + 0x8)
+#define SCFTDR         (volatile unsigned char  *)(SCIF_BASE + 0xC)
+#define SCFSR  (volatile unsigned short *)(SCIF_BASE + 0x10)
+#define SCFRDR         (volatile unsigned char  *)(SCIF_BASE + 0x14)
+#define SCFCR  (volatile unsigned short *)(SCIF_BASE + 0x18)
+#define SCFDR  (volatile unsigned short *)(SCIF_BASE + 0x1C)
+#if defined(CONFIG_SH4A)
+#define SCRFDR (volatile unsigned short *)(SCIF_BASE + 0x20)
+#define SCSPTR (volatile unsigned short *)(SCIF_BASE + 0x24)
+#define SCLSR   (volatile unsigned short *)(SCIF_BASE + 0x28)
+#define SCRER  (volatile unsigned short *)(SCIF_BASE + 0x2C)
+#elif defined (CONFIG_SH4)
+#define SCSPTR         (volatile unsigned short *)(SCIF_BASE + 0x20)
+#define SCLSR  (volatile unsigned short *)(SCIF_BASE + 0x24)
+#elif defined (CONFIG_SH3)
+#define SCLSR  (volatile unsigned short *)(SCIF_BASE + 0x24)
+#endif
+
+#define SCR_RE                 (1 << 4)
+#define SCR_TE                 (1 << 5) 
+#define FCR_RFRST      (1 << 1) /* RFCL */
+#define FCR_TFRST      (1 << 2) /* TFCL */
+#define FSR_DR         (1 << 0)
+#define FSR_RDF        (1 << 1)
+#define FSR_FER        (1 << 3)
+#define FSR_BRK        (1 << 4)
+#define FSR_FER        (1 << 3)
+#define FSR_TEND       (1 << 6)
+#define FSR_ER         (1 << 7)
+
+/*----------------------------------------------------------------------*/
+
+void serial_setbrg (void)
+{
+       DECLARE_GLOBAL_DATA_PTR;
+       int divisor = gd->baudrate * 32;
+
+       *SCBRR = (CONFIG_SYS_CLK_FREQ + (divisor / 2)) / 
+                                               (gd->baudrate * 32) - 1;
+}
+
+int serial_init (void)
+{
+       *SCSCR = (SCR_RE | SCR_TE);
+       *SCSMR = 0 ;
+       *SCSMR = 0;
+       *SCFCR = (FCR_RFRST | FCR_TFRST);
+       *SCFCR;
+       *SCFCR = 0;
+
+       serial_setbrg();
+       return 0;
+}
+
+static int serial_tx_fifo_level (void)
+{
+       return (*SCFDR >> 8) & 0x1F;
+}
+
+static int serial_rx_fifo_level (void)
+{
+       return (*SCFDR >> 0) & 0x1F;
+}
+
+void serial_raw_putc (const char c)
+{
+       unsigned int fsr_bits_to_clear;
+
+       while (1) {
+               if (*SCFSR & FSR_TEND) {                /* Tx fifo is empty */
+                       fsr_bits_to_clear = FSR_TEND;
+                       break;
+               }
+       }
+
+       *SCFTDR = c;
+       if (fsr_bits_to_clear != 0)
+               *SCFSR &= ~fsr_bits_to_clear;
+}
+
+void serial_putc (const char c)
+{
+       if (c == '\n')
+               serial_raw_putc ('\r');
+       serial_raw_putc (c);
+}
+
+void serial_puts (const char *s)
+{
+       char c;
+       while ((c = *s++) != 0)
+               serial_putc (c);
+}
+
+int serial_tstc (void)
+{
+       return serial_rx_fifo_level() ? 1 : 0;
+}
+
+#define FSR_ERR_CLEAR   0x0063
+#define RDRF_CLEAR      0x00fc
+#define LSR_ORER        1
+void handle_error( void ){
+
+       (void)*SCFSR ;
+       *SCFSR = FSR_ERR_CLEAR ;
+       (void)*SCLSR ;
+       *SCLSR = 0x00 ;
+}
+
+int serial_getc_check( void ){
+       unsigned short status;
+
+       status = *SCFSR ;
+
+       if (status & (FSR_FER | FSR_FER | FSR_ER | FSR_BRK))
+               handle_error();
+       if( *SCLSR & LSR_ORER )
+               handle_error();
+       return (status & ( FSR_DR | FSR_RDF ));
+}
+
+int serial_getc (void)
+{
+       unsigned short status ;
+       char ch;
+       while(!serial_getc_check());
+
+       ch = *SCFRDR;
+       status =  *SCFSR ;
+
+       *SCFSR = RDRF_CLEAR ;
+
+       if (status & (FSR_FER | FSR_FER | FSR_ER | FSR_BRK))
+               handle_error();
+
+       if( *SCLSR & LSR_ORER )
+               handle_error();
+
+       return ch ;
+}
+
+#endif /* CFG_SCIF_CONSOLE */
index e9b4974be4923120f0aa86db28b7db10c4bd7157..71a8c7f3ab9e7dda5cb91d801fd96ee62ee0c11e 100644 (file)
@@ -61,6 +61,11 @@ ifeq ($(ARCH),avr32)
 LOAD_ADDR = 0x00000000
 endif
 
+ifeq ($(ARCH),sh)
+LOAD_ADDR = 0x8C000000
+endif
+
+
 include $(TOPDIR)/config.mk
 
 ELF    = hello_world
index 26df6e06a15ea58d8853fbbcd30ce3b14002581e..263dd8c3de97de2826587708656ae08ad1bf652a 100644 (file)
@@ -151,6 +151,22 @@ gd_t *global_data;
                :                                       \
                : "i"(offsetof(gd_t, jt)), "i"(XF_ ##x) \
                : "r8");
+#elif defined(CONFIG_SH)
+/*
+ * r13 holds the pointer to the global_data. r1 is a call clobbered.
+ */
+#define EXPORT_FUNC(x)                  \
+        asm volatile (                  \
+               "       .align  2\n"                    \
+               "       .globl " #x "\n"                \
+               #x ":\n"                                \
+               "       mov     r13, r1\n"              \
+               "       add     %0, r1\n"               \
+               "       add     %1, r1\n"               \
+               "       jmp     @r1\n"                  \
+               "       nop\n"                          \
+               "       nop\n"                          \
+               : : "i"(offsetof(gd_t, jt)), "i"(XF_ ## x * sizeof(void *)) : "r1");
 #else
 #error stubs definition missing for this architecture
 #endif
diff --git a/include/asm-sh/bitops.h b/include/asm-sh/bitops.h
new file mode 100644 (file)
index 0000000..44dca9f
--- /dev/null
@@ -0,0 +1,13 @@
+#ifndef __ASM_SH_BITOPS_H_
+#define __ASM_SH_BITOPS_H_
+
+extern void set_bit(int nr, volatile void * a);
+extern void clear_bit(int nr, volatile void * a);
+extern int test_and_clear_bit(int nr, volatile void * a);
+extern void change_bit(unsigned long nr, volatile void *addr);
+extern int test_and_set_bit(int nr, volatile void * a);
+extern int test_and_change_bit(int nr, volatile void * addr);
+extern int test_bit(int nr, volatile void * a);
+extern int ffs(int i);
+
+#endif
diff --git a/include/asm-sh/byteorder.h b/include/asm-sh/byteorder.h
new file mode 100644 (file)
index 0000000..8836e65
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#ifndef __ASM_SH_BYTEORDER_H_
+#define __ASM_SH_BYTEORDER_H_
+
+#include <config.h>
+#include <asm/types.h>
+
+#ifdef __LITTLE_ENDIAN__
+#include <linux/byteorder/little_endian.h>
+#else
+#include <linux/byteorder/big_endian.h>
+#endif
+
+#endif
+
diff --git a/include/asm-sh/cpu_sh4.h b/include/asm-sh/cpu_sh4.h
new file mode 100644 (file)
index 0000000..e0275f3
--- /dev/null
@@ -0,0 +1,10 @@
+#ifndef _ASM_CPU_SH4_H_
+#define _ASM_CPU_SH4_H_
+#if defined (CONFIG_CPU_SH7750)
+#include <asm/cpu_sh7750.h>
+#elif defined (CONFIG_CPU_SH7780)
+#include <asm/cpu_sh7780.h>
+#else
+#error "Unknown SH4 variant"
+#endif
+#endif
diff --git a/include/asm-sh/cpu_sh7750.h b/include/asm-sh/cpu_sh7750.h
new file mode 100644 (file)
index 0000000..eb4f1af
--- /dev/null
@@ -0,0 +1,145 @@
+#ifndef _ASM_CPU_SH7750_H_
+#define _ASM_CPU_SH7750_H_
+
+#define PTEH   0xFF000000 
+#define PTEL   0xFF000004 
+#define TTB    0xFF000008 
+#define TEA    0xFF00000C 
+#define MMUCR  0xFF000010 
+#define BASRA  0xFF000014 
+#define BASRB  0xFF000018 
+#define CCR    0xFF00001C
+#define TRA    0xFF000020
+#define EXPEVT         0xFF000024
+#define INTEVT         0xFF000028
+#define PTEA   0xFF000034
+#define QACR0  0xFF000038
+#define QACR1  0xFF00003C
+#define BARA   0xFF200000
+#define BAMRA  0xFF200004
+#define BBRA   0xFF200008
+#define BARB   0xFF20000C
+#define BAMRB  0xFF200010
+#define BBRB   0xFF200014
+#define BDRB   0xFF200018
+#define BDMRB  0xFF20001C
+#define BRCR   0xFF200020
+
+#define BCR1   0xFF800000
+#define BCR2   0xFF800004 
+#define BCR3   0xFF800050 
+#define BCR4   0xFE0A00F0 
+#define WCR1   0xFF800008 
+#define WCR2   0xFF80000C 
+#define WCR3   0xFF800010 
+#define MCR    0xFF800014 
+#define PCR    0xFF800018 
+#define RTCSR  0xFF80001C 
+#define RTCNT  0xFF800020 
+#define RTCOR  0xFF800024 
+#define RFCR   0xFF800028 
+#define PCTRA  0xFF80002C 
+#define PDTRA  0xFF800030 
+#define PCTRB  0xFF800040 
+#define PDTRB  0xFF800044 
+#define GPIOIC         0xFF800048 
+#define SAR0   0xFFA00000 
+#define DAR0   0xFFA00004 
+#define DMATCR0 0xFFA00008 
+#define CHCR0  0xFFA0000C 
+#define SAR1   0xFFA00010 
+#define DAR1   0xFFA00014 
+#define DMATCR1 0xFFA00018 
+#define CHCR1  0xFFA0001C 
+#define SAR2   0xFFA00020 
+#define DAR2   0xFFA00024 
+#define DMATCR2 0xFFA00028 
+#define CHCR2  0xFFA0002C 
+#define SAR3   0xFFA00030 
+#define DAR3   0xFFA00034 
+#define DMATCR3 0xFFA00038 
+#define CHCR3  0xFFA0003C 
+#define DMAOR  0xFFA00040 
+#define SAR4   0xFFA00050 
+#define DAR4   0xFFA00054 
+#define DMATCR4 0xFFA00058 
+
+#define FRQCR  0xFFC00000 
+#define STBCR  0xFFC00004 
+#define WTCNT  0xFFC00008 
+#define WTCSR  0xFFC0000C 
+#define STBCR2         0xFFC00010 
+#define R64CNT 0xFFC80000 
+#define RSECCNT 0xFFC80004 
+#define RMINCNT 0xFFC80008 
+#define RHRCNT         0xFFC8000C 
+#define RWKCNT         0xFFC80010 
+#define RDAYCNT 0xFFC80014 
+#define RMONCNT 0xFFC80018 
+#define RYRCNT         0xFFC8001C 
+#define RSECAR         0xFFC80020 
+#define RMINAR         0xFFC80024 
+#define RHRAR  0xFFC80028 
+#define RWKAR  0xFFC8002C 
+#define RDAYAR         0xFFC80030 
+#define RMONAR         0xFFC80034 
+#define RCR1   0xFFC80038 
+#define RCR2   0xFFC8003C 
+#define RCR3   0xFFC80050 
+#define RYRAR  0xFFC80054 
+#define ICR    0xFFD00000 
+#define IPRA   0xFFD00004 
+#define IPRB   0xFFD00008 
+#define IPRC   0xFFD0000C 
+#define IPRD   0xFFD00010 
+#define INTPRI         0xFE080000 
+#define INTREQ 0xFE080020 
+#define INTMSK 0xFE080040 
+#define INTMSKCL       0xFE080060 
+#define CLKSTP         0xFE0A0000
+#define CLKSTPCLR      0xFE0A0008
+#define TSTR2  0xFE100004 
+#define TCOR3  0xFE100008 
+#define TCNT3  0xFE10000C 
+#define TCR3   0xFE100010 
+#define TCOR4  0xFE100014 
+#define TCNT4  0xFE100018 
+#define TCR4   0xFE10001C 
+#define TOCR   0xFFD80000 
+#define TSTR0  0xFFD80004 
+#define TCOR0  0xFFD80008 
+#define TCNT0  0xFFD8000C 
+#define TCR0   0xFFD80010 
+#define TCOR1  0xFFD80014 
+#define TCNT1  0xFFD80018 
+#define TCR1   0xFFD8001C 
+#define TCOR2  0xFFD80020 
+#define TCNT2  0xFFD80024 
+#define TCR2   0xFFD80028 
+#define TCPR2  0xFFD8002C
+#define SCSMR1         0xFFE00000 
+#define SCBRR1         0xFFE00004 
+#define SCSCR1         0xFFE00008 
+#define SCTDR1         0xFFE0000C 
+#define SCSSR1         0xFFE00010 
+#define SCRDR1         0xFFE00014 
+#define SCSCMR1 0xFFE00018 
+#define SCSPTR1 0xFFE0001C 
+#define SCF0_BASE      SCSMR1
+#define SCSMR2         0xFFE80000
+#define SCBRR2         0xFFE80004 
+#define SCSCR2         0xFFE80008 
+#define SCFTDR2 0xFFE8000C 
+#define SCFSR2         0xFFE80010 
+#define SCFRDR2        0xFFE80014 
+#define SCFCR2         0xFFE80018 
+#define SCFDR2         0xFFE8001C 
+#define SCSPTR2        0xFFE80020 
+#define SCLSR2         0xFFE80024 
+#define SCIF1_BASE     SCSMR2
+#define SDIR   0xFFF00000 
+#define SDDR   0xFFF00008 
+#define SDINT  0xFFF00014 
+
+#endif /* _ASM_CPU_SH7750_H_ */
+
diff --git a/include/asm-sh/global_data.h b/include/asm-sh/global_data.h
new file mode 100644 (file)
index 0000000..0a44a34
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * (C) Copyright 2002
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * (C) Copyright 2007
+ * Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#ifndef        __ASM_SH_GLOBALDATA_H_
+#define __ASM_SH_GLOBALDATA_H_
+
+typedef        struct global_data
+{
+       bd_t            *bd;
+       unsigned long   flags;
+       unsigned long   baudrate;
+       unsigned long   cpu_clk;        /* CPU clock in Hz! */
+       unsigned long   have_console;   /* serial_init() was called */
+       unsigned long   ram_size;       /* RAM size */
+       unsigned long   reloc_off;      /* Relocation Offset */
+       unsigned long   env_addr;       /* Address  of Environment struct */
+       unsigned long   env_valid;      /* Checksum of Environment valid */
+       void            **jt;           /* Standalone app jump table */
+}gd_t;
+
+#define        GD_FLG_RELOC    0x00001         /* Code was relocated to RAM            */
+#define        GD_FLG_DEVINIT  0x00002         /* Devices have been initialized        */
+#define        GD_FLG_SILENT   0x00004         /* Silent mode                          */
+
+#define DECLARE_GLOBAL_DATA_PTR        register gd_t *gd asm ("r13")
+
+#endif /* __ASM_SH_GLOBALDATA_H_ */
diff --git a/include/asm-sh/io.h b/include/asm-sh/io.h
new file mode 100644 (file)
index 0000000..70e60b1
--- /dev/null
@@ -0,0 +1,292 @@
+/*
+ *  linux/include/asm-sh/io.h
+ *
+ *  Copyright (C) 1996-2000 Russell King
+ *
+ * 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.
+ *
+ * Modifications:
+ *  16-Sep-1996        RMK     Inlined the inx/outx functions & optimised for both
+ *                     constant addresses and variable addresses.
+ *  04-Dec-1997        RMK     Moved a lot of this stuff to the new architecture
+ *                     specific IO header files.
+ *  27-Mar-1999        PJB     Second parameter of memcpy_toio is const..
+ *  04-Apr-1999        PJB     Added check_signature.
+ *  12-Dec-1999        RMK     More cleanups
+ *  18-Jun-2000 RMK    Removed virt_to_* and friends definitions
+ */
+#ifndef __ASM_SH_IO_H
+#define __ASM_SH_IO_H
+
+#ifdef __KERNEL__
+
+#include <linux/types.h>
+#include <asm/byteorder.h>
+
+/*
+ * Generic virtual read/write.  Note that we don't support half-word
+ * read/writes.  We define __arch_*[bl] here, and leave __arch_*w
+ * to the architecture specific code.
+ */
+#define __arch_getb(a)                 (*(volatile unsigned char *)(a))
+#define __arch_getw(a)                 (*(volatile unsigned short *)(a))
+#define __arch_getl(a)                 (*(volatile unsigned int *)(a))
+
+#define __arch_putb(v,a)               (*(volatile unsigned char *)(a) = (v))
+#define __arch_putw(v,a)               (*(volatile unsigned short *)(a) = (v))
+#define __arch_putl(v,a)               (*(volatile unsigned int *)(a) = (v))
+
+extern void __raw_writesb(unsigned int addr, const void *data, int bytelen);
+extern void __raw_writesw(unsigned int addr, const void *data, int wordlen);
+extern void __raw_writesl(unsigned int addr, const void *data, int longlen);
+
+extern void __raw_readsb(unsigned int addr, void *data, int bytelen);
+extern void __raw_readsw(unsigned int addr, void *data, int wordlen);
+extern void __raw_readsl(unsigned int addr, void *data, int longlen);
+
+#define __raw_writeb(v,a)              __arch_putb(v,a)
+#define __raw_writew(v,a)              __arch_putw(v,a)
+#define __raw_writel(v,a)              __arch_putl(v,a)
+
+#define __raw_readb(a)                 __arch_getb(a)
+#define __raw_readw(a)                 __arch_getw(a)
+#define __raw_readl(a)                 __arch_getl(a)
+
+/*
+ * The compiler seems to be incapable of optimising constants
+ * properly.  Spell it out to the compiler in some cases.
+ * These are only valid for small values of "off" (< 1<<12)
+ */
+#define __raw_base_writeb(val,base,off)        __arch_base_putb(val,base,off)
+#define __raw_base_writew(val,base,off)        __arch_base_putw(val,base,off)
+#define __raw_base_writel(val,base,off)        __arch_base_putl(val,base,off)
+
+#define __raw_base_readb(base,off)     __arch_base_getb(base,off)
+#define __raw_base_readw(base,off)     __arch_base_getw(base,off)
+#define __raw_base_readl(base,off)     __arch_base_getl(base,off)
+
+/*
+ * Now, pick up the machine-defined IO definitions
+ */
+#if 0  /* XXX###XXX */
+#include <asm/arch/io.h>
+#endif /* XXX###XXX */
+
+/*
+ *  IO port access primitives
+ *  -------------------------
+ *
+ * The SH doesn't have special IO access instructions; all IO is memory
+ * mapped.  Note that these are defined to perform little endian accesses
+ * only.  Their primary purpose is to access PCI and ISA peripherals.
+ *
+ * The machine specific io.h include defines __io to translate an "IO"
+ * address to a memory address.
+ *
+ * Note that we prevent GCC re-ordering or caching values in expressions
+ * by introducing sequence points into the in*() definitions.  Note that
+ * __raw_* do not guarantee this behaviour.
+ *
+ * The {in,out}[bwl] macros are for emulating x86-style PCI/ISA IO space.
+ */
+#ifdef __io
+#define outb(v,p)                      __raw_writeb(v,__io(p))
+#define outw(v,p)                      __raw_writew(cpu_to_le16(v),__io(p))
+#define outl(v,p)                      __raw_writel(cpu_to_le32(v),__io(p))
+
+#define inb(p) ({ unsigned int __v = __raw_readb(__io(p)); __v; })
+#define inw(p) ({ unsigned int __v = le16_to_cpu(__raw_readw(__io(p))); __v; })
+#define inl(p) ({ unsigned int __v = le32_to_cpu(__raw_readl(__io(p))); __v; })
+
+#define outsb(p,d,l)                   __raw_writesb(__io(p),d,l)
+#define outsw(p,d,l)                   __raw_writesw(__io(p),d,l)
+#define outsl(p,d,l)                   __raw_writesl(__io(p),d,l)
+
+#define insb(p,d,l)                    __raw_readsb(__io(p),d,l)
+#define insw(p,d,l)                    __raw_readsw(__io(p),d,l)
+#define insl(p,d,l)                    __raw_readsl(__io(p),d,l)
+#endif
+
+#define outb_p(val,port)               outb((val),(port))
+#define outw_p(val,port)               outw((val),(port))
+#define outl_p(val,port)               outl((val),(port))
+#define inb_p(port)                    inb((port))
+#define inw_p(port)                    inw((port))
+#define inl_p(port)                    inl((port))
+
+#define outsb_p(port,from,len)         outsb(port,from,len)
+#define outsw_p(port,from,len)         outsw(port,from,len)
+#define outsl_p(port,from,len)         outsl(port,from,len)
+#define insb_p(port,to,len)            insb(port,to,len)
+#define insw_p(port,to,len)            insw(port,to,len)
+#define insl_p(port,to,len)            insl(port,to,len)
+
+/*
+ * ioremap and friends.
+ *
+ * ioremap takes a PCI memory address, as specified in
+ * linux/Documentation/IO-mapping.txt.  If you want a
+ * physical address, use __ioremap instead.
+ */
+extern void * __ioremap(unsigned long offset, size_t size, unsigned long flags);
+extern void __iounmap(void *addr);
+
+/*
+ * Generic ioremap support.
+ *
+ * Define:
+ *  iomem_valid_addr(off,size)
+ *  iomem_to_phys(off)
+ */
+#ifdef iomem_valid_addr
+#define __arch_ioremap(off,sz,nocache)                         \
+ ({                                                            \
+       unsigned long _off = (off), _size = (sz);               \
+       void *_ret = (void *)0;                                 \
+       if (iomem_valid_addr(_off, _size))                      \
+               _ret = __ioremap(iomem_to_phys(_off),_size,0);  \
+       _ret;                                                   \
+ })
+
+#define __arch_iounmap __iounmap
+#endif
+
+#define ioremap(off,sz)                        __arch_ioremap((off),(sz),0)
+#define ioremap_nocache(off,sz)                __arch_ioremap((off),(sz),1)
+#define iounmap(_addr)                 __arch_iounmap(_addr)
+
+/*
+ * DMA-consistent mapping functions.  These allocate/free a region of
+ * uncached, unwrite-buffered mapped memory space for use with DMA
+ * devices.  This is the "generic" version.  The PCI specific version
+ * is in pci.h
+ */
+extern void *consistent_alloc(int gfp, size_t size, dma_addr_t *handle);
+extern void consistent_free(void *vaddr, size_t size, dma_addr_t handle);
+extern void consistent_sync(void *vaddr, size_t size, int rw);
+
+/*
+ * String version of IO memory access ops:
+ */
+extern void _memcpy_fromio(void *, unsigned long, size_t);
+extern void _memcpy_toio(unsigned long, const void *, size_t);
+extern void _memset_io(unsigned long, int, size_t);
+
+extern void __readwrite_bug(const char *fn);
+
+/*
+ * If this architecture has PCI memory IO, then define the read/write
+ * macros.  These should only be used with the cookie passed from
+ * ioremap.
+ */
+#ifdef __mem_pci
+
+#define readb(c) ({ unsigned int __v = __raw_readb(__mem_pci(c)); __v; })
+#define readw(c) ({ unsigned int __v = le16_to_cpu(__raw_readw(__mem_pci(c))); __v; })
+#define readl(c) ({ unsigned int __v = le32_to_cpu(__raw_readl(__mem_pci(c))); __v; })
+
+#define writeb(v,c)            __raw_writeb(v,__mem_pci(c))
+#define writew(v,c)            __raw_writew(cpu_to_le16(v),__mem_pci(c))
+#define writel(v,c)            __raw_writel(cpu_to_le32(v),__mem_pci(c))
+
+#define memset_io(c,v,l)               _memset_io(__mem_pci(c),(v),(l))
+#define memcpy_fromio(a,c,l)           _memcpy_fromio((a),__mem_pci(c),(l))
+#define memcpy_toio(c,a,l)             _memcpy_toio(__mem_pci(c),(a),(l))
+
+#define eth_io_copy_and_sum(s,c,l,b) \
+                               eth_copy_and_sum((s),__mem_pci(c),(l),(b))
+
+static inline int
+check_signature(unsigned long io_addr, const unsigned char *signature,
+               int length)
+{
+       int retval = 0;
+       do {
+               if (readb(io_addr) != *signature)
+                       goto out;
+               io_addr++;
+               signature++;
+               length--;
+       } while (length);
+       retval = 1;
+out:
+       return retval;
+}
+
+#elif !defined(readb)
+
+#define readb(addr)                    (__readwrite_bug("readb"),0)
+#define readw(addr)                    (__readwrite_bug("readw"),0)
+#define readl(addr)                    (__readwrite_bug("readl"),0)
+#define writeb(v,addr)                 __readwrite_bug("writeb")
+#define writew(v,addr)                 __readwrite_bug("writew")
+#define writel(v,addr)                 __readwrite_bug("writel")
+
+#define eth_io_copy_and_sum(a,b,c,d)   __readwrite_bug("eth_io_copy_and_sum")
+
+#define check_signature(io,sig,len)    (0)
+
+#endif /* __mem_pci */
+
+/*
+ * If this architecture has ISA IO, then define the isa_read/isa_write
+ * macros.
+ */
+#ifdef __mem_isa
+
+#define isa_readb(addr)                        __raw_readb(__mem_isa(addr))
+#define isa_readw(addr)                        __raw_readw(__mem_isa(addr))
+#define isa_readl(addr)                        __raw_readl(__mem_isa(addr))
+#define isa_writeb(val,addr)           __raw_writeb(val,__mem_isa(addr))
+#define isa_writew(val,addr)           __raw_writew(val,__mem_isa(addr))
+#define isa_writel(val,addr)           __raw_writel(val,__mem_isa(addr))
+#define isa_memset_io(a,b,c)           _memset_io(__mem_isa(a),(b),(c))
+#define isa_memcpy_fromio(a,b,c)       _memcpy_fromio((a),__mem_isa(b),(c))
+#define isa_memcpy_toio(a,b,c)         _memcpy_toio(__mem_isa((a)),(b),(c))
+
+#define isa_eth_io_copy_and_sum(a,b,c,d) \
+                               eth_copy_and_sum((a),__mem_isa(b),(c),(d))
+
+static inline int
+isa_check_signature(unsigned long io_addr, const unsigned char *signature,
+                   int length)
+{
+       int retval = 0;
+       do {
+               if (isa_readb(io_addr) != *signature)
+                       goto out;
+               io_addr++;
+               signature++;
+               length--;
+       } while (length);
+       retval = 1;
+out:
+       return retval;
+}
+
+#else  /* __mem_isa */
+
+#define isa_readb(addr)                        (__readwrite_bug("isa_readb"),0)
+#define isa_readw(addr)                        (__readwrite_bug("isa_readw"),0)
+#define isa_readl(addr)                        (__readwrite_bug("isa_readl"),0)
+#define isa_writeb(val,addr)           __readwrite_bug("isa_writeb")
+#define isa_writew(val,addr)           __readwrite_bug("isa_writew")
+#define isa_writel(val,addr)           __readwrite_bug("isa_writel")
+#define isa_memset_io(a,b,c)           __readwrite_bug("isa_memset_io")
+#define isa_memcpy_fromio(a,b,c)       __readwrite_bug("isa_memcpy_fromio")
+#define isa_memcpy_toio(a,b,c)         __readwrite_bug("isa_memcpy_toio")
+
+#define isa_eth_io_copy_and_sum(a,b,c,d) \
+                               __readwrite_bug("isa_eth_io_copy_and_sum")
+
+#define isa_check_signature(io,sig,len)        (0)
+
+static inline void sync(void)
+{
+}
+
+#endif /* __mem_isa */
+#endif /* __KERNEL__ */
+#endif /* __ASM_SH_IO_H */
diff --git a/include/asm-sh/posix_types.h b/include/asm-sh/posix_types.h
new file mode 100644 (file)
index 0000000..4bb9f7e
--- /dev/null
@@ -0,0 +1,123 @@
+#ifndef __ASM_SH_POSIX_TYPES_H
+#define __ASM_SH_POSIX_TYPES_H
+
+/*
+ * This file is generally used by user-level software, so you need to
+ * be a little careful about namespace pollution etc.  Also, we cannot
+ * assume GCC is being used.
+ */
+
+typedef unsigned short  __kernel_dev_t;
+typedef unsigned long  __kernel_ino_t;
+typedef unsigned short __kernel_mode_t;
+typedef unsigned short __kernel_nlink_t;
+typedef long           __kernel_off_t;
+typedef int            __kernel_pid_t;
+typedef unsigned short __kernel_ipc_pid_t;
+typedef unsigned short __kernel_uid_t;
+typedef unsigned short __kernel_gid_t;
+typedef unsigned int   __kernel_size_t;
+typedef int            __kernel_ssize_t;
+typedef int            __kernel_ptrdiff_t;
+typedef long           __kernel_time_t;
+typedef long           __kernel_suseconds_t;
+typedef long           __kernel_clock_t;
+typedef int            __kernel_timer_t;
+typedef int            __kernel_clockid_t;
+typedef int            __kernel_daddr_t;
+typedef char *         __kernel_caddr_t;
+typedef unsigned short __kernel_uid16_t;
+typedef unsigned short __kernel_gid16_t;
+typedef unsigned int   __kernel_uid32_t;
+typedef unsigned int   __kernel_gid32_t;
+
+typedef unsigned short __kernel_old_uid_t;
+typedef unsigned short __kernel_old_gid_t;
+typedef unsigned short __kernel_old_dev_t;
+
+#ifdef __GNUC__
+typedef long long      __kernel_loff_t;
+#endif
+
+typedef struct {
+#if defined(__KERNEL__) || defined(__USE_ALL)
+       int     val[2];
+#else /* !defined(__KERNEL__) && !defined(__USE_ALL) */
+       int     __val[2];
+#endif /* !defined(__KERNEL__) && !defined(__USE_ALL) */
+} __kernel_fsid_t;
+
+#if defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2)
+
+#undef __FD_SET
+static __inline__ void __FD_SET(unsigned long __fd, __kernel_fd_set *__fdsetp)
+{
+       unsigned long __tmp = __fd / __NFDBITS;
+       unsigned long __rem = __fd % __NFDBITS;
+       __fdsetp->fds_bits[__tmp] |= (1UL<<__rem);
+}
+
+#undef __FD_CLR
+static __inline__ void __FD_CLR(unsigned long __fd, __kernel_fd_set *__fdsetp)
+{
+       unsigned long __tmp = __fd / __NFDBITS;
+       unsigned long __rem = __fd % __NFDBITS;
+       __fdsetp->fds_bits[__tmp] &= ~(1UL<<__rem);
+}
+
+
+#undef __FD_ISSET
+static __inline__ int __FD_ISSET(unsigned long __fd, const __kernel_fd_set *__p)
+{ 
+       unsigned long __tmp = __fd / __NFDBITS;
+       unsigned long __rem = __fd % __NFDBITS;
+       return (__p->fds_bits[__tmp] & (1UL<<__rem)) != 0;
+}
+
+/*
+ * This will unroll the loop for the normal constant case (8 ints,
+ * for a 256-bit fd_set)
+ */
+#undef __FD_ZERO
+static __inline__ void __FD_ZERO(__kernel_fd_set *__p)
+{
+       unsigned long *__tmp = __p->fds_bits;
+       int __i;
+
+       if (__builtin_constant_p(__FDSET_LONGS)) {
+               switch (__FDSET_LONGS) {
+               case 16:
+                       __tmp[ 0] = 0; __tmp[ 1] = 0;
+                       __tmp[ 2] = 0; __tmp[ 3] = 0;
+                       __tmp[ 4] = 0; __tmp[ 5] = 0;
+                       __tmp[ 6] = 0; __tmp[ 7] = 0;
+                       __tmp[ 8] = 0; __tmp[ 9] = 0;
+                       __tmp[10] = 0; __tmp[11] = 0;
+                       __tmp[12] = 0; __tmp[13] = 0;
+                       __tmp[14] = 0; __tmp[15] = 0;
+                       return;
+
+               case 8:
+                       __tmp[ 0] = 0; __tmp[ 1] = 0;
+                       __tmp[ 2] = 0; __tmp[ 3] = 0;
+                       __tmp[ 4] = 0; __tmp[ 5] = 0;
+                       __tmp[ 6] = 0; __tmp[ 7] = 0;
+                       return;
+
+               case 4:
+                       __tmp[ 0] = 0; __tmp[ 1] = 0;
+                       __tmp[ 2] = 0; __tmp[ 3] = 0;
+                       return;
+               }
+       }
+       __i = __FDSET_LONGS;
+       while (__i) {
+               __i--;
+               *__tmp = 0;
+               __tmp++;
+       }
+}
+
+#endif /* defined(__KERNEL__) || !defined(__GLIBC__) || (__GLIBC__ < 2) */
+
+#endif /* __ASM_SH_POSIX_TYPES_H */
diff --git a/include/asm-sh/processor.h b/include/asm-sh/processor.h
new file mode 100644 (file)
index 0000000..bb9a35f
--- /dev/null
@@ -0,0 +1,8 @@
+#ifndef _ASM_SH_PROCESSOR_H_
+#define _ASM_SH_PROCESSOR_H_
+#if defined CONFIG_SH3
+# include <asm/cpu_sh3.h>
+#elif defined (CONFIG_SH4)
+# include <asm/cpu_sh4.h>
+#endif
+#endif
diff --git a/include/asm-sh/ptrace.h b/include/asm-sh/ptrace.h
new file mode 100644 (file)
index 0000000..14cc1ac
--- /dev/null
@@ -0,0 +1,112 @@
+#ifndef __ASM_SH_PTRACE_H
+#define __ASM_SH_PTRACE_H
+
+/*
+ * Copyright (C) 1999, 2000  Niibe Yutaka
+ * from linux kernel code.
+ */
+
+/*
+ * GCC defines register number like this:
+ * -----------------------------
+ *      0 - 15 are integer registers
+ *     17 - 22 are control/special registers
+ *     24 - 39 fp registers
+ *     40 - 47 xd registers
+ *     48 -    fpscr register
+ * -----------------------------
+ *
+ * We follows above, except:
+ *     16 --- program counter (PC)
+ *     22 --- syscall #
+ *     23 --- floating point communication register
+ */
+#define REG_REG0        0
+#define REG_REG15      15
+
+#define REG_PC         16
+
+#define REG_PR         17
+#define REG_SR         18
+#define REG_GBR        19
+#define REG_MACH       20
+#define REG_MACL       21
+
+#define REG_SYSCALL    22
+
+#define REG_FPREG0     23
+#define REG_FPREG15    38
+#define REG_XFREG0     39
+#define REG_XFREG15    54
+
+#define REG_FPSCR      55
+#define REG_FPUL       56
+
+/* options set using PTRACE_SETOPTIONS */
+#define PTRACE_O_TRACESYSGOOD     0x00000001
+
+/*
+ * This struct defines the way the registers are stored on the
+ * kernel stack during a system call or other kernel entry.
+ */
+struct pt_regs {
+       unsigned long regs[16];
+       unsigned long pc;
+       unsigned long pr;
+       unsigned long sr;
+       unsigned long gbr;
+       unsigned long mach;
+       unsigned long macl;
+       long tra;
+};
+
+/*
+ * This struct defines the way the DSP registers are stored on the
+ * kernel stack during a system call or other kernel entry.
+ */
+struct pt_dspregs {
+       unsigned long   a1;
+       unsigned long   a0g;
+       unsigned long   a1g;
+       unsigned long   m0;
+       unsigned long   m1;
+       unsigned long   a0;
+       unsigned long   x0;
+       unsigned long   x1;
+       unsigned long   y0;
+       unsigned long   y1;
+       unsigned long   dsr;
+       unsigned long   rs;
+       unsigned long   re;
+       unsigned long   mod;
+};
+
+#define        PTRACE_GETDSPREGS       55
+#define        PTRACE_SETDSPREGS       56
+
+#ifdef __KERNEL__
+#define user_mode(regs) (((regs)->sr & 0x40000000)==0)
+#define instruction_pointer(regs) ((regs)->pc)
+extern void show_regs(struct pt_regs *);
+
+#ifdef CONFIG_SH_DSP
+#define task_pt_regs(task) \
+       ((struct pt_regs *) (task_stack_page(task) + THREAD_SIZE \
+                - sizeof(struct pt_dspregs) - sizeof(unsigned long)) - 1)
+#else
+#define task_pt_regs(task) \
+       ((struct pt_regs *) (task_stack_page(task) + THREAD_SIZE \
+                - sizeof(unsigned long)) - 1)
+#endif
+
+static inline unsigned long profile_pc(struct pt_regs *regs)
+{
+       unsigned long pc = instruction_pointer(regs);
+
+       if (pc >= 0xa0000000UL && pc < 0xc0000000UL)
+               pc -= 0x20000000;
+       return pc;
+}
+#endif
+
+#endif /* __ASM_SH_PTRACE_H */
diff --git a/include/asm-sh/string.h b/include/asm-sh/string.h
new file mode 100644 (file)
index 0000000..a78ef81
--- /dev/null
@@ -0,0 +1,132 @@
+#ifndef __ASM_SH_STRING_H
+#define __ASM_SH_STRING_H
+
+/*
+ * Copyright (C) 1999 Niibe Yutaka
+ * But consider these trivial functions to be public domain.
+ *
+ * from linux kernel code.
+ */
+
+#define __HAVE_ARCH_STRCPY
+static inline char *strcpy(char *__dest, const char *__src)
+{
+       register char *__xdest = __dest;
+       unsigned long __dummy;
+
+       __asm__ __volatile__("1:\n\t"
+                            "mov.b     @%1+, %2\n\t"
+                            "mov.b     %2, @%0\n\t"
+                            "cmp/eq    #0, %2\n\t"
+                            "bf/s      1b\n\t"
+                            " add      #1, %0\n\t"
+                            : "=r" (__dest), "=r" (__src), "=&z" (__dummy)
+                            : "0" (__dest), "1" (__src)
+                            : "memory", "t");
+
+       return __xdest;
+}
+
+#define __HAVE_ARCH_STRNCPY
+static inline char *strncpy(char *__dest, const char *__src, size_t __n)
+{
+       register char *__xdest = __dest;
+       unsigned long __dummy;
+
+       if (__n == 0)
+               return __xdest;
+
+       __asm__ __volatile__(
+               "1:\n"
+               "mov.b  @%1+, %2\n\t"
+               "mov.b  %2, @%0\n\t"
+               "cmp/eq #0, %2\n\t"
+               "bt/s   2f\n\t"
+               " cmp/eq        %5,%1\n\t"
+               "bf/s   1b\n\t"
+               " add   #1, %0\n"
+               "2:"
+               : "=r" (__dest), "=r" (__src), "=&z" (__dummy)
+               : "0" (__dest), "1" (__src), "r" (__src+__n)
+               : "memory", "t");
+
+       return __xdest;
+}
+
+#define __HAVE_ARCH_STRCMP
+static inline int strcmp(const char *__cs, const char *__ct)
+{
+       register int __res;
+       unsigned long __dummy;
+
+       __asm__ __volatile__(
+               "mov.b  @%1+, %3\n"
+               "1:\n\t"
+               "mov.b  @%0+, %2\n\t"
+               "cmp/eq #0, %3\n\t"
+               "bt     2f\n\t"
+               "cmp/eq %2, %3\n\t"
+               "bt/s   1b\n\t"
+               " mov.b @%1+, %3\n\t"
+               "add    #-2, %1\n\t"
+               "mov.b  @%1, %3\n\t"
+               "sub    %3, %2\n"
+               "2:"
+               : "=r" (__cs), "=r" (__ct), "=&r" (__res), "=&z" (__dummy)
+               : "0" (__cs), "1" (__ct)
+               : "t");
+
+       return __res;
+}
+
+#define __HAVE_ARCH_STRNCMP
+static inline int strncmp(const char *__cs, const char *__ct, size_t __n)
+{
+       register int __res;
+       unsigned long __dummy;
+
+       if (__n == 0)
+               return 0;
+
+       __asm__ __volatile__(
+               "mov.b  @%1+, %3\n"
+               "1:\n\t"
+               "mov.b  @%0+, %2\n\t"
+               "cmp/eq %6, %0\n\t"
+               "bt/s   2f\n\t"
+               " cmp/eq #0, %3\n\t"
+               "bt/s   3f\n\t"
+               " cmp/eq %3, %2\n\t"
+               "bt/s   1b\n\t"
+               " mov.b @%1+, %3\n\t"
+               "add    #-2, %1\n\t"
+               "mov.b  @%1, %3\n"
+               "2:\n\t"
+               "sub    %3, %2\n"
+               "3:"
+               :"=r" (__cs), "=r" (__ct), "=&r" (__res), "=&z" (__dummy)
+               : "0" (__cs), "1" (__ct), "r" (__cs+__n)
+               : "t");
+
+       return __res;
+}
+
+#undef __HAVE_ARCH_MEMSET
+extern void *memset(void *__s, int __c, size_t __count);
+
+#undef __HAVE_ARCH_MEMCPY
+extern void *memcpy(void *__to, __const__ void *__from, size_t __n);
+
+#undef __HAVE_ARCH_MEMMOVE
+extern void *memmove(void *__dest, __const__ void *__src, size_t __n);
+
+#undef __HAVE_ARCH_MEMCHR
+extern void *memchr(const void *__s, int __c, size_t __n);
+
+#undef __HAVE_ARCH_STRLEN
+extern size_t strlen(const char *);
+
+/* arch/sh/lib/strcasecmp.c */
+extern int strcasecmp(const char *, const char *);
+
+#endif /* __ASM_SH_STRING_H */
diff --git a/include/asm-sh/system.h b/include/asm-sh/system.h
new file mode 100644 (file)
index 0000000..b353bc5
--- /dev/null
@@ -0,0 +1,275 @@
+#ifndef __ASM_SH_SYSTEM_H
+#define __ASM_SH_SYSTEM_H
+
+/*
+ * Copyright (C) 1999, 2000  Niibe Yutaka  &  Kaz Kojima
+ * Copyright (C) 2002 Paul Mundt
+ *
+ * from linux kernel code.
+ */
+
+#include <linux/irqflags.h>
+#include <asm/types.h>
+
+/*
+ *     switch_to() should switch tasks to task nr n, first
+ */
+
+#define switch_to(prev, next, last) do {                               \
+ struct task_struct *__last;                                           \
+ register unsigned long *__ts1 __asm__ ("r1") = &prev->thread.sp;      \
+ register unsigned long *__ts2 __asm__ ("r2") = &prev->thread.pc;      \
+ register unsigned long *__ts4 __asm__ ("r4") = (unsigned long *)prev; \
+ register unsigned long *__ts5 __asm__ ("r5") = (unsigned long *)next; \
+ register unsigned long *__ts6 __asm__ ("r6") = &next->thread.sp;      \
+ register unsigned long __ts7 __asm__ ("r7") = next->thread.pc;                \
+ __asm__ __volatile__ (".balign 4\n\t"                                         \
+                      "stc.l   gbr, @-r15\n\t"                         \
+                      "sts.l   pr, @-r15\n\t"                          \
+                      "mov.l   r8, @-r15\n\t"                          \
+                      "mov.l   r9, @-r15\n\t"                          \
+                      "mov.l   r10, @-r15\n\t"                         \
+                      "mov.l   r11, @-r15\n\t"                         \
+                      "mov.l   r12, @-r15\n\t"                         \
+                      "mov.l   r13, @-r15\n\t"                         \
+                      "mov.l   r14, @-r15\n\t"                         \
+                      "mov.l   r15, @r1        ! save SP\n\t"          \
+                      "mov.l   @r6, r15        ! change to new stack\n\t" \
+                      "mova    1f, %0\n\t"                             \
+                      "mov.l   %0, @r2         ! save PC\n\t"          \
+                      "mov.l   2f, %0\n\t"                             \
+                      "jmp     @%0             ! call __switch_to\n\t" \
+                      " lds    r7, pr          !  with return to new PC\n\t" \
+                      ".balign 4\n"                                    \
+                      "2:\n\t"                                         \
+                      ".long   __switch_to\n"                          \
+                      "1:\n\t"                                         \
+                      "mov.l   @r15+, r14\n\t"                         \
+                      "mov.l   @r15+, r13\n\t"                         \
+                      "mov.l   @r15+, r12\n\t"                         \
+                      "mov.l   @r15+, r11\n\t"                         \
+                      "mov.l   @r15+, r10\n\t"                         \
+                      "mov.l   @r15+, r9\n\t"                          \
+                      "mov.l   @r15+, r8\n\t"                          \
+                      "lds.l   @r15+, pr\n\t"                          \
+                      "ldc.l   @r15+, gbr\n\t"                         \
+                      : "=z" (__last)                                  \
+                      : "r" (__ts1), "r" (__ts2), "r" (__ts4),         \
+                        "r" (__ts5), "r" (__ts6), "r" (__ts7)          \
+                      : "r3", "t");                                    \
+       last = __last;                                                  \
+} while (0)
+
+/*
+ * On SMP systems, when the scheduler does migration-cost autodetection,
+ * it needs a way to flush as much of the CPU's caches as possible.
+ *
+ * TODO: fill this in!
+ */
+static inline void sched_cacheflush(void)
+{
+}
+
+#ifdef CONFIG_CPU_SH4A
+#define __icbi()                       \
+{                                      \
+       unsigned long __addr;           \
+       __addr = 0xa8000000;            \
+       __asm__ __volatile__(           \
+               "icbi   %0\n\t"         \
+               : /* no output */       \
+               : "m" (__m(__addr)));   \
+}
+#endif
+
+static inline unsigned long tas(volatile int *m)
+{
+       unsigned long retval;
+
+       __asm__ __volatile__ ("tas.b    @%1\n\t"
+                             "movt     %0"
+                             : "=r" (retval): "r" (m): "t", "memory");
+       return retval;
+}
+
+/*
+ * A brief note on ctrl_barrier(), the control register write barrier.
+ *
+ * Legacy SH cores typically require a sequence of 8 nops after
+ * modification of a control register in order for the changes to take
+ * effect. On newer cores (like the sh4a and sh5) this is accomplished
+ * with icbi.
+ *
+ * Also note that on sh4a in the icbi case we can forego a synco for the
+ * write barrier, as it's not necessary for control registers.
+ *
+ * Historically we have only done this type of barrier for the MMUCR, but
+ * it's also necessary for the CCR, so we make it generic here instead.
+ */
+#ifdef CONFIG_CPU_SH4A
+#define mb()           __asm__ __volatile__ ("synco": : :"memory")
+#define rmb()          mb()
+#define wmb()          __asm__ __volatile__ ("synco": : :"memory")
+#define ctrl_barrier() __icbi()
+#define read_barrier_depends() do { } while(0)
+#else
+#define mb()           __asm__ __volatile__ ("": : :"memory")
+#define rmb()          mb()
+#define wmb()          __asm__ __volatile__ ("": : :"memory")
+#define ctrl_barrier() __asm__ __volatile__ ("nop;nop;nop;nop;nop;nop;nop;nop")
+#define read_barrier_depends() do { } while(0)
+#endif
+
+#ifdef CONFIG_SMP
+#define smp_mb()       mb()
+#define smp_rmb()      rmb()
+#define smp_wmb()      wmb()
+#define smp_read_barrier_depends()     read_barrier_depends()
+#else
+#define smp_mb()       barrier()
+#define smp_rmb()      barrier()
+#define smp_wmb()      barrier()
+#define smp_read_barrier_depends()     do { } while(0)
+#endif
+
+#define set_mb(var, value) do { xchg(&var, value); } while (0)
+
+/*
+ * Jump to P2 area.
+ * When handling TLB or caches, we need to do it from P2 area.
+ */
+#define jump_to_P2()                   \
+do {                                   \
+       unsigned long __dummy;          \
+       __asm__ __volatile__(           \
+               "mov.l  1f, %0\n\t"     \
+               "or     %1, %0\n\t"     \
+               "jmp    @%0\n\t"        \
+               " nop\n\t"              \
+               ".balign 4\n"           \
+               "1:     .long 2f\n"     \
+               "2:"                    \
+               : "=&r" (__dummy)       \
+               : "r" (0x20000000));    \
+} while (0)
+
+/*
+ * Back to P1 area.
+ */
+#define back_to_P1()                                   \
+do {                                                   \
+       unsigned long __dummy;                          \
+       ctrl_barrier();                                 \
+       __asm__ __volatile__(                           \
+               "mov.l  1f, %0\n\t"                     \
+               "jmp    @%0\n\t"                        \
+               " nop\n\t"                              \
+               ".balign 4\n"                           \
+               "1:     .long 2f\n"                     \
+               "2:"                                    \
+               : "=&r" (__dummy));                     \
+} while (0)
+
+static inline unsigned long xchg_u32(volatile u32 *m, unsigned long val)
+{
+       unsigned long flags, retval;
+
+       local_irq_save(flags);
+       retval = *m;
+       *m = val;
+       local_irq_restore(flags);
+       return retval;
+}
+
+static inline unsigned long xchg_u8(volatile u8 *m, unsigned long val)
+{
+       unsigned long flags, retval;
+
+       local_irq_save(flags);
+       retval = *m;
+       *m = val & 0xff;
+       local_irq_restore(flags);
+       return retval;
+}
+
+extern void __xchg_called_with_bad_pointer(void);
+
+#define __xchg(ptr, x, size)                           \
+({                                                     \
+       unsigned long __xchg__res;                      \
+       volatile void *__xchg_ptr = (ptr);              \
+       switch (size) {                                 \
+       case 4:                                         \
+               __xchg__res = xchg_u32(__xchg_ptr, x);  \
+               break;                                  \
+       case 1:                                         \
+               __xchg__res = xchg_u8(__xchg_ptr, x);   \
+               break;                                  \
+       default:                                        \
+               __xchg_called_with_bad_pointer();       \
+               __xchg__res = x;                        \
+               break;                                  \
+       }                                               \
+                                                       \
+       __xchg__res;                                    \
+})
+
+#define xchg(ptr,x)    \
+       ((__typeof__(*(ptr)))__xchg((ptr),(unsigned long)(x), sizeof(*(ptr))))
+
+static inline unsigned long __cmpxchg_u32(volatile int * m, unsigned long old,
+       unsigned long new)
+{
+       __u32 retval;
+       unsigned long flags;
+
+       local_irq_save(flags);
+       retval = *m;
+       if (retval == old)
+               *m = new;
+       local_irq_restore(flags);       /* implies memory barrier  */
+       return retval;
+}
+
+/* This function doesn't exist, so you'll get a linker error
+ * if something tries to do an invalid cmpxchg(). */
+extern void __cmpxchg_called_with_bad_pointer(void);
+
+#define __HAVE_ARCH_CMPXCHG 1
+
+static inline unsigned long __cmpxchg(volatile void * ptr, unsigned long old,
+               unsigned long new, int size)
+{
+       switch (size) {
+       case 4:
+               return __cmpxchg_u32(ptr, old, new);
+       }
+       __cmpxchg_called_with_bad_pointer();
+       return old;
+}
+
+#define cmpxchg(ptr,o,n)                                                \
+  ({                                                                    \
+     __typeof__(*(ptr)) _o_ = (o);                                      \
+     __typeof__(*(ptr)) _n_ = (n);                                      \
+     (__typeof__(*(ptr))) __cmpxchg((ptr), (unsigned long)_o_,          \
+                                   (unsigned long)_n_, sizeof(*(ptr))); \
+  })
+
+extern void *set_exception_table_vec(unsigned int vec, void *handler);
+
+static inline void *set_exception_table_evt(unsigned int evt, void *handler)
+{
+       return set_exception_table_vec(evt >> 5, handler);
+}
+
+/* XXX
+ * disable hlt during certain critical i/o operations
+ */
+#define HAVE_DISABLE_HLT
+void disable_hlt(void);
+void enable_hlt(void);
+
+#define arch_align_stack(x) (x)
+
+#endif
diff --git a/include/asm-sh/types.h b/include/asm-sh/types.h
new file mode 100644 (file)
index 0000000..fd00dbb
--- /dev/null
@@ -0,0 +1,59 @@
+#ifndef __ASM_SH_TYPES_H
+#define __ASM_SH_TYPES_H
+
+#ifndef __ASSEMBLY__
+
+typedef unsigned short umode_t;
+
+/*
+ * __xx is ok: it doesn't pollute the POSIX namespace. Use these in the
+ * header files exported to user space
+ */
+
+typedef __signed__ char __s8;
+typedef unsigned char __u8;
+
+typedef __signed__ short __s16;
+typedef unsigned short __u16;
+
+typedef __signed__ int __s32;
+typedef unsigned int __u32;
+
+#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
+typedef __signed__ long long __s64;
+typedef unsigned long long __u64;
+#endif
+
+#endif /* __ASSEMBLY__ */
+
+/*
+ * These aren't exported outside the kernel to avoid name space clashes
+ */
+#ifdef __KERNEL__
+
+#define BITS_PER_LONG 32
+
+#ifndef __ASSEMBLY__
+
+
+typedef __signed__ char s8;
+typedef unsigned char u8;
+
+typedef __signed__ short s16;
+typedef unsigned short u16;
+
+typedef __signed__ int s32;
+typedef unsigned int u32;
+
+typedef __signed__ long long s64;
+typedef unsigned long long u64;
+
+/* Dma addresses are 32-bits wide.  */
+
+typedef u32 dma_addr_t;
+
+#endif /* __ASSEMBLY__ */
+
+#endif /* __KERNEL__ */
+
+#endif /* __ASM_SH_TYPES_H */
diff --git a/include/asm-sh/u-boot.h b/include/asm-sh/u-boot.h
new file mode 100644 (file)
index 0000000..c74e97c
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ *
+ ********************************************************************
+ * NOTE: This header file defines an interface to U-Boot. Including
+ * this (unmodified) header file in another file is considered normal
+ * use of U-Boot, and does *not* fall under the heading of "derived
+ * work".
+ ********************************************************************
+ */
+
+#ifndef __ASM_SH_U_BOOT_H_
+#define __ASM_SH_U_BOOT_H_
+
+
+typedef struct bd_info {
+       unsigned long   bi_memstart;    /* start of DRAM memory */
+       unsigned long   bi_memsize;     /* size  of DRAM memory in bytes */
+       unsigned long   bi_flashstart;  /* start of FLASH memory */
+       unsigned long   bi_flashsize;   /* size  of FLASH memory */
+       unsigned long   bi_flashoffset; /* reserved area for startup monitor */
+       unsigned long   bi_sramstart;   /* start of SRAM memory */
+       unsigned long   bi_sramsize;    /* size  of SRAM memory */
+       unsigned long   bi_ip_addr;     /* IP Address */
+       unsigned char   bi_enetaddr[6]; /* Ethernet adress */
+       unsigned long   bi_baudrate;    /* Console Baudrate */
+       unsigned long   bi_boot_params; /* where this board expects params */
+} bd_t;
+
+#endif
+
diff --git a/lib_sh/Makefile b/lib_sh/Makefile
new file mode 100644 (file)
index 0000000..c84276a
--- /dev/null
@@ -0,0 +1,42 @@
+#
+# Copyright (c) 2007
+# Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA
+#
+
+include $(TOPDIR)/config.mk
+
+LIB    = $(obj)lib$(ARCH).a
+
+SOBJS  = 
+
+COBJS  = board.o sh_linux.o # time.o
+
+SRCS   := $(SOBJS:.o=.S) $(COBJS:.o=.c)
+OBJS   := $(addprefix $(obj),$(SOBJS) $(COBJS))
+
+$(LIB):        $(obj).depend $(OBJS)
+       $(AR) $(ARFLAGS) $@ $(OBJS)
+
+#########################################################################
+
+# defines $(obj).depend target
+include $(SRCTREE)/rules.mk
+
+sinclude $(obj).depend
+
+#########################################################################
diff --git a/lib_sh/board.c b/lib_sh/board.c
new file mode 100644 (file)
index 0000000..c3f8462
--- /dev/null
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2007
+ * Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <command.h>
+#include <malloc.h>
+#include <devices.h>
+#include <version.h>
+#include <net.h>
+#include <environment.h>
+
+extern void malloc_bin_reloc (void);
+extern int cpu_init(void);
+extern int board_init(void);
+extern int dram_init(void);
+extern int watchdog_init(void);
+extern int timer_init(void);
+
+const char version_string[] = U_BOOT_VERSION" (" __DATE__ " - " __TIME__ ")";
+
+unsigned long monitor_flash_len = CFG_MONITOR_LEN;
+
+static unsigned long mem_malloc_start;
+static unsigned long mem_malloc_end;
+static unsigned long mem_malloc_brk;
+
+static void mem_malloc_init (void)
+{
+
+       mem_malloc_start = (TEXT_BASE - CFG_GBL_DATA_SIZE - CFG_MALLOC_LEN);
+       mem_malloc_end = (mem_malloc_start + CFG_MALLOC_LEN - 16);
+       mem_malloc_brk = mem_malloc_start;
+       memset ((void *) mem_malloc_start, 0, 
+               (mem_malloc_end - mem_malloc_start));
+}
+
+void *sbrk (ptrdiff_t increment)
+{
+       unsigned long old = mem_malloc_brk;
+       unsigned long new = old + increment;
+
+       if ((new < mem_malloc_start) ||
+           (new > mem_malloc_end)) {
+               return NULL;
+       }
+
+       mem_malloc_brk = new;
+       return (void *) old;
+}
+
+typedef int (init_fnc_t) (void);
+
+init_fnc_t *init_sequence[] =
+{
+       cpu_init,               /* basic cpu dependent setup */
+       board_init,             /* basic board dependent setup */
+       interrupt_init,         /* set up exceptions */
+       env_init,               /* event init */
+       serial_init,            /* SCIF init */
+       watchdog_init,
+       console_init_f,
+       display_options,
+       checkcpu,
+       checkboard,
+       dram_init,              /* SDRAM init */
+       NULL                    /* Terminate this list */
+};
+
+void sh_generic_init (void)
+{
+       DECLARE_GLOBAL_DATA_PTR;
+
+       bd_t *bd;
+       init_fnc_t **init_fnc_ptr;
+       char *s, *e;
+       int i;
+
+       memset (gd, 0, CFG_GBL_DATA_SIZE);
+
+       gd->flags |= GD_FLG_RELOC;      /* tell others: relocation done */
+
+       gd->bd = (bd_t *) (gd + 1);             /* At end of global data */
+       gd->baudrate = CONFIG_BAUDRATE;
+
+       gd->cpu_clk = CONFIG_SYS_CLK_FREQ;
+
+       bd = gd->bd;
+       bd->bi_memstart = CFG_SDRAM_BASE;
+       bd->bi_memsize = CFG_SDRAM_SIZE;
+       bd->bi_flashstart = CFG_FLASH_BASE;
+#if defined(CFG_SRAM_BASE) && defined(CFG_SRAM_SIZE)
+       bd->bi_sramstart= CFG_SRAM_BASE;
+       bd->bi_sramsize = CFG_SRAM_SIZE;
+#endif
+       bd->bi_baudrate = CONFIG_BAUDRATE;
+
+       for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
+               if ((*init_fnc_ptr) () != 0) {
+                       hang();
+               }
+       }
+       
+       timer_init();
+       
+       /* flash_init need timer_init().(TMU) */
+       bd->bi_flashsize = flash_init();
+       printf("FLASH: %dMB\n", bd->bi_flashsize / (1024*1024));
+
+       mem_malloc_init();
+       malloc_bin_reloc();
+       env_relocate();
+
+#if  (CONFIG_COMMANDS & CFG_CMD_NET)
+       bd->bi_ip_addr = getenv_IPaddr ("ipaddr");
+       s = getenv ("ethaddr");
+       for (i = 0; i < 6; ++i) {
+               bd->bi_enetaddr[i] = s ? simple_strtoul (s, &e, 16) : 0;
+               if (s) s = (*e) ? e + 1 : e;
+       }
+#endif
+       devices_init();
+       jumptable_init();
+       console_init_r();
+       interrupt_init();
+#ifdef BOARD_LATE_INIT
+       board_late_init ();
+#endif
+#if (CONFIG_COMMANDS & CFG_CMD_NET)
+#if defined(CONFIG_NET_MULTI)
+       puts ("Net:   ");
+#endif
+       eth_initialize(gd->bd);
+#endif
+       while (1) {
+               main_loop();
+       }
+}
+
+
+/***********************************************************************/
+
+void hang (void)
+{
+       puts ("Board ERROR \n");
+       for (;;);
+}
diff --git a/lib_sh/sh_linux.c b/lib_sh/sh_linux.c
new file mode 100644 (file)
index 0000000..7237ab3
--- /dev/null
@@ -0,0 +1,74 @@
+/*
+ * (C) Copyright 2003
+ * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
+
+#include <common.h>
+#include <command.h>
+#include <asm/byteorder.h>
+
+extern image_header_t header;  /* common/cmd_bootm.c */
+
+/* The SH kernel reads arguments from the empty zero page at location
+ * 0 at the start of SDRAM. The following are copied from 
+ * arch/sh/kernel/setup.c and may require tweaking if the kernel sources
+ * change.
+ */
+#define PARAM   ((unsigned char *)CFG_SDRAM_BASE + 0x1000)
+
+#define MOUNT_ROOT_RDONLY (*(unsigned long *) (PARAM+0x000))
+#define RAMDISK_FLAGS (*(unsigned long *) (PARAM+0x004))
+#define ORIG_ROOT_DEV (*(unsigned long *) (PARAM+0x008))
+#define LOADER_TYPE (*(unsigned long *) (PARAM+0x00c))
+#define INITRD_START (*(unsigned long *) (PARAM+0x010))
+#define INITRD_SIZE (*(unsigned long *) (PARAM+0x014))
+/* ... */
+#define COMMAND_LINE ((char *) (PARAM+0x100))
+
+#define RAMDISK_IMAGE_START_MASK        0x07FF
+
+#ifdef CFG_DEBUG
+static void hexdump (unsigned char *buf, int len)
+{
+       int i;
+
+       for (i = 0; i < len; i++) {
+               if ((i % 16) == 0)
+                       printf ("%s%08x: ", i ? "\n" : "", (unsigned int) &buf[i]);
+               printf ("%02x ", buf[i]);
+       }
+       printf ("\n");
+}
+#endif
+
+void do_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[],
+                    ulong addr, ulong *len_ptr, int verify)
+{
+       image_header_t *hdr = &header;
+       char *bootargs = getenv("bootargs");
+       void (*kernel) (void) = (void (*)(void)) ntohl (hdr->ih_ep);
+
+       /* Setup parameters */
+       memset(PARAM, 0, 0x1000);       /* Clear zero page */
+       strcpy(COMMAND_LINE, bootargs);
+       kernel();
+}
+
diff --git a/lib_sh/time.c b/lib_sh/time.c
new file mode 100644 (file)
index 0000000..3620136
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2007
+ * Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
+ *
+ * See file CREDITS for list of people who contributed to this
+ * project.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+ * MA 02111-1307 USA
+ */
+
+#include <common.h>
+#include <asm/processer.h>
+
+static void tmu_timer_start (unsigned int timer)
+{
+       if (timer > 2)
+               return;
+
+       *((volatile unsigned char *) TSTR0) |= (1 << timer);
+}
+
+int timer_init (void)
+{
+       *(volatile u16 *)TCR0 = 0;
+
+       tmu_timer_start (0);
+       return 0;
+}
+
+unsigned long long get_ticks (void)
+{
+       return (0 - *((volatile unsigned int *) TCNT0));
+}
+
+unsigned long get_timer (unsigned long base)
+{
+       return ((0 - *((volatile unsigned int *) TCNT0)) - base);
+}
+
+void set_timer (unsigned long t)
+{
+       *((volatile unsigned int *) TCNT0) = (0 - t);
+}
+
+void reset_timer (void)
+{
+       set_timer (0);
+}
+
+void udelay (unsigned long usec)
+{
+       unsigned int start = get_timer (0);
+       unsigned int end = start + (usec * ((CFG_HZ + 500000) / 1000000));
+
+       while (get_timer (0) < end)
+               continue;
+}
+
+unsigned long get_tbclk (void)
+{
+       return CFG_HZ;
+}
+