summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/sparc/leon3/include
diff options
context:
space:
mode:
Diffstat (limited to 'c/src/lib/libbsp/sparc/leon3/include')
-rw-r--r--c/src/lib/libbsp/sparc/leon3/include/Makefile.am2
-rw-r--r--c/src/lib/libbsp/sparc/leon3/include/amba.h7
-rw-r--r--c/src/lib/libbsp/sparc/leon3/include/bsp.h19
-rw-r--r--c/src/lib/libbsp/sparc/leon3/include/leon.h79
-rw-r--r--c/src/lib/libbsp/sparc/leon3/include/spacewire.h186
5 files changed, 232 insertions, 61 deletions
diff --git a/c/src/lib/libbsp/sparc/leon3/include/Makefile.am b/c/src/lib/libbsp/sparc/leon3/include/Makefile.am
index db4701af17..da1ce2aead 100644
--- a/c/src/lib/libbsp/sparc/leon3/include/Makefile.am
+++ b/c/src/lib/libbsp/sparc/leon3/include/Makefile.am
@@ -3,7 +3,7 @@
##
-include_HEADERS = amba.h bsp.h coverhd.h leon.h bspopts.h
+include_HEADERS = amba.h bsp.h coverhd.h leon.h bspopts.h spacewire.h
$(PROJECT_INCLUDE):
$(mkinstalldirs) $@
diff --git a/c/src/lib/libbsp/sparc/leon3/include/amba.h b/c/src/lib/libbsp/sparc/leon3/include/amba.h
index a9d4bef59a..fb98df9582 100644
--- a/c/src/lib/libbsp/sparc/leon3/include/amba.h
+++ b/c/src/lib/libbsp/sparc/leon3/include/amba.h
@@ -19,8 +19,8 @@
#define LEON3_AHB_CONF_WORDS 8
#define LEON3_APB_CONF_WORDS 2
-#define LEON3_AHB_MASTERS 8
-#define LEON3_AHB_SLAVES 8
+#define LEON3_AHB_MASTERS 64
+#define LEON3_AHB_SLAVES 64
#define LEON3_APB_SLAVES 16
#define LEON3_APBUARTS 8
@@ -48,6 +48,9 @@
#define GAISLER_PCITRACE 0x15
#define GAISLER_DMACTRL 0x16
#define GAISLER_PIOPORT 0x1A
+#define GAISLER_ETHMAC 0x1D
+
+#define GAISLER_SPACEWIRE 0x01f
/* European Space Agency device id's */
#define ESA_LEON2 0x2
diff --git a/c/src/lib/libbsp/sparc/leon3/include/bsp.h b/c/src/lib/libbsp/sparc/leon3/include/bsp.h
index be77c93e23..57d0b7ccd2 100644
--- a/c/src/lib/libbsp/sparc/leon3/include/bsp.h
+++ b/c/src/lib/libbsp/sparc/leon3/include/bsp.h
@@ -44,6 +44,11 @@ extern "C" {
#define CONFIGURE_NUMBER_OF_TERMIOS_PORTS 2
#define CONFIGURE_INTERRUPT_STACK_MEMORY (16 * 1024)
+/* add a entry to the device driver table so that I can call rtems_io_register_driver */
+#define CONFIGURE_NUMBER_OF_DRIVERS_LEON3 \
+ (((sizeof(Device_drivers) / sizeof(rtems_driver_address_table))) + 1)
+#define CONFIGURE_MAXIMUM_DRIVERS CONFIGURE_NUMBER_OF_DRIVERS_LEON3
+
/*
* Network driver configuration
*/
@@ -57,10 +62,22 @@ extern int rtems_smc91111_driver_attach_leon3(
struct rtems_bsdnet_ifconfig *config,
int attach
);
-#define RTEMS_BSP_NETWORK_DRIVER_NAME "open_eth1"
+extern int rtems_leon_greth_driver_attach(
+ struct rtems_bsdnet_ifconfig *config,
+ int attach
+);
+
+#define RTEMS_BSP_NETWORK_DRIVER_NAME_OPENETH "open_eth1"
#define RTEMS_BSP_NETWORK_DRIVER_ATTACH_OPENETH rtems_leon_open_eth_driver_attach
+#define RTEMS_BSP_NETWORK_DRIVER_NAME_SMC91111 "smc_eth1"
#define RTEMS_BSP_NETWORK_DRIVER_ATTACH_SMC91111 rtems_smc91111_driver_attach_leon3
+#define RTEMS_BSP_NETWORK_DRIVER_NAME_GRETH "gr_eth1"
+#define RTEMS_BSP_NETWORK_DRIVER_ATTACH_GRETH rtems_leon_greth_driver_attach
+#ifndef RTEMS_BSP_NETWORK_DRIVER_NAME
+#define RTEMS_BSP_NETWORK_DRIVER_NAME RTEMS_BSP_NETWORK_DRIVER_NAME_GRETH
+#define RTEMS_BSP_NETWORK_DRIVER_ATTACH RTEMS_BSP_NETWORK_DRIVER_ATTACH_GRETH
+#endif
/*
* Define the time limits for RTEMS Test Suite test durations.
diff --git a/c/src/lib/libbsp/sparc/leon3/include/leon.h b/c/src/lib/libbsp/sparc/leon3/include/leon.h
index 990b359295..a7922b876e 100644
--- a/c/src/lib/libbsp/sparc/leon3/include/leon.h
+++ b/c/src/lib/libbsp/sparc/leon3/include/leon.h
@@ -116,7 +116,7 @@ typedef struct {
volatile unsigned int ipend;
volatile unsigned int iforce;
volatile unsigned int iclear;
- volatile unsigned int notused00;
+ volatile unsigned int mpstat;
volatile unsigned int notused01;
volatile unsigned int notused02;
volatile unsigned int notused03;
@@ -128,65 +128,24 @@ typedef struct {
volatile unsigned int notused21;
volatile unsigned int notused22;
volatile unsigned int notused23;
- volatile unsigned int mask_p0;
- volatile unsigned int mask_p1;
- volatile unsigned int mask_p2;
- volatile unsigned int mask_p3;
- volatile unsigned int mask_p4;
- volatile unsigned int mask_p5;
- volatile unsigned int mask_p6;
- volatile unsigned int mask_p7;
- volatile unsigned int mask_p8;
- volatile unsigned int mask_p9;
- volatile unsigned int mask_p10;
- volatile unsigned int mask_p11;
- volatile unsigned int mask_p12;
- volatile unsigned int mask_p13;
- volatile unsigned int mask_p14;
- volatile unsigned int mask_p15;
+ volatile unsigned int mask[16];
+ volatile unsigned int force[16];
} LEON3_IrqCtrl_Regs_Map;
-/*
typedef struct {
volatile unsigned int value;
volatile unsigned int reload;
volatile unsigned int conf;
volatile unsigned int notused;
} LEON3_Timer_SubType;
-*/
+
typedef struct {
volatile unsigned int scaler_value; /* common timer registers */
volatile unsigned int scaler_reload;
volatile unsigned int status;
volatile unsigned int notused;
- volatile unsigned int value_t0; /* timer 0 */
- volatile unsigned int reload_t0;
- volatile unsigned int conf_t0;
- volatile unsigned int notused0;
- volatile unsigned int value_t1; /* timer 1 */
- volatile unsigned int reload_t1;
- volatile unsigned int conf_t1;
- volatile unsigned int notused1;
- volatile unsigned int value_t2; /* timer 2 */
- volatile unsigned int reload_t2;
- volatile unsigned int conf_t2;
- volatile unsigned int notused2;
- volatile unsigned int value_t3; /* timer 3 */
- volatile unsigned int reload_t3;
- volatile unsigned int conf_t3;
- volatile unsigned int notused3;
- volatile unsigned int value_t4; /* timer 4 */
- volatile unsigned int reload_t4;
- volatile unsigned int conf_t4;
- volatile unsigned int notused4;
- volatile unsigned int value_t5; /* timer 5 */
- volatile unsigned int reload_t5;
- volatile unsigned int conf_t5;
- volatile unsigned int notused5;
- volatile unsigned int value_t6; /* timer 6 */
- volatile unsigned int reload_t6;
- volatile unsigned int conf_t6;
+ LEON3_Timer_SubType timer[8];
} LEON3_Timer_Regs_Map;
typedef struct {
@@ -295,6 +254,8 @@ extern volatile LEON3_IrqCtrl_Regs_Map *LEON3_IrqCtrl_Regs; /* LEON3 Interrupt
extern volatile LEON3_Timer_Regs_Map *LEON3_Timer_Regs; /* LEON3 GP Timer */
extern volatile LEON3_UART_Regs_Map *LEON3_Console_Uart[LEON3_APBUARTS];
+extern int LEON3_Cpu_Index;
+
/* Macros used for manipulating bits in LEON3 GP Timer Control Register */
#define LEON3_GPTIMER_EN 1
@@ -302,6 +263,8 @@ extern volatile LEON3_UART_Regs_Map *LEON3_Console_Uart[LEON3_APBUARTS];
#define LEON3_GPTIMER_LD 4
#define LEON3_GPTIMER_IRQEN 8
+#define LEON3_MP_IRQ 14 /* Irq used by shared memory driver */
+
#ifndef ASM
/*
@@ -328,23 +291,24 @@ extern volatile LEON3_UART_Regs_Map *LEON3_Console_Uart[LEON3_APBUARTS];
(LEON3_IrqCtrl_Regs.ipend & (1 << (_source)))
#define LEON_Is_interrupt_masked( _source ) \
- (LEON3_IrqCtrl_Regs.mask_p0 & (1 << (_source)))
+ do {\
+ (LEON3_IrqCtrl_Regs.mask[LEON3_Cpu_Index] & (1 << (_source))); \
+ } while (0)
+
#define LEON_Mask_interrupt( _source ) \
do { \
unsigned32 _level; \
- \
_level = sparc_disable_interrupts(); \
- LEON3_IrqCtrl_Regs->mask_p0 &= ~(1 << (_source)); \
+ LEON3_IrqCtrl_Regs->mask[LEON3_Cpu_Index] &= ~(1 << (_source)); \
sparc_enable_interrupts( _level ); \
} while (0)
#define LEON_Unmask_interrupt( _source ) \
do { \
unsigned32 _level; \
- \
_level = sparc_disable_interrupts(); \
- LEON3_IrqCtrl_Regs->mask_p0 |= (1 << (_source)); \
+ LEON3_IrqCtrl_Regs->mask[LEON3_Cpu_Index] |= (1 << (_source)); \
sparc_enable_interrupts( _level ); \
} while (0)
@@ -352,10 +316,9 @@ extern volatile LEON3_UART_Regs_Map *LEON3_Console_Uart[LEON3_APBUARTS];
do { \
unsigned32 _level; \
unsigned32 _mask = 1 << (_source); \
- \
_level = sparc_disable_interrupts(); \
- (_previous) = LEON3_IrqCtrl_Regs->mask_p0; \
- LEON3_IrqCtrl_Regs->mask_p0 = _previous & ~_mask; \
+ (_previous) = LEON3_IrqCtrl_Regs->mask[LEON3_Cpu_Index]; \
+ LEON3_IrqCtrl_Regs->mask[LEON3_Cpu_Index] = _previous & ~_mask; \
sparc_enable_interrupts( _level ); \
(_previous) &= _mask; \
} while (0)
@@ -364,13 +327,13 @@ extern volatile LEON3_UART_Regs_Map *LEON3_Console_Uart[LEON3_APBUARTS];
do { \
unsigned32 _level; \
unsigned32 _mask = 1 << (_source); \
- \
_level = sparc_disable_interrupts(); \
- LEON3_IrqCtrl_Regs->mask_p0 = \
- (LEON3_IrqCtrl_Regs->mask_p0 & ~_mask) | (_previous); \
+ LEON3_IrqCtrl_Regs->mask[LEON3_Cpu_Index] = \
+ (LEON3_IrqCtrl_Regs->mask[LEON3_Cpu_Index] & ~_mask) | (_previous); \
sparc_enable_interrupts( _level ); \
} while (0)
+
/*
* Each timer control register is organized as follows:
*
@@ -402,6 +365,8 @@ extern volatile LEON3_UART_Regs_Map *LEON3_Console_Uart[LEON3_APBUARTS];
#define LEON_REG_TIMER_COUNTER_DEFINED_MASK 0x00000003
#define LEON_REG_TIMER_COUNTER_CURRENT_MODE_MASK 0x00000003
+#include "spacewire.h"
+
#endif /* !ASM */
#ifdef __cplusplus
diff --git a/c/src/lib/libbsp/sparc/leon3/include/spacewire.h b/c/src/lib/libbsp/sparc/leon3/include/spacewire.h
new file mode 100644
index 0000000000..516cc93772
--- /dev/null
+++ b/c/src/lib/libbsp/sparc/leon3/include/spacewire.h
@@ -0,0 +1,186 @@
+/*
+ * Macros used for Spacewire bus
+ *
+ * COPYRIGHT (c) 2004.
+ * Gaisler Research
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.com/license/LICENSE.
+ *
+ * $Id$
+ */
+
+#ifndef __SPACEWIRE_h
+#define __SPACEWIRE_h
+
+typedef struct {
+ volatile unsigned int ctrl;
+ volatile unsigned int status;
+ volatile unsigned int nodeaddr;
+ volatile unsigned int clockdiv;
+ volatile unsigned int destkey;
+ volatile unsigned int pad1,pad2,pad3;
+
+ volatile unsigned int dma0ctrl; /* 0x20 */
+ volatile unsigned int dma0rxmax;
+ volatile unsigned int dma0txdesc;
+ volatile unsigned int dma0rxdesc;
+} LEON3_SPACEWIRE_Regs_Map;
+
+typedef struct {
+ volatile unsigned int ctrl;
+ volatile unsigned int addr;
+} SPACEWIRE_RXBD;
+
+typedef struct {
+ volatile unsigned int ctrl;
+ volatile unsigned int addr_header;
+ volatile unsigned int len;
+ volatile unsigned int addr_data;
+} SPACEWIRE_TXBD;
+
+#define SPACEWIRE_BDTABLE_SIZE 0x400
+#define SPACEWIRE_TXPCK_SIZE 1024
+#define SPACEWIRE_RXPCK_SIZE 1024
+#define SPACEWIRE_TXBUFS_NR 1
+#define SPACEWIRE_RXBUFS_NR 2
+#define SPW_BUFMALLOC 1
+
+#define SPW_ALIGN(p,c) ((((unsigned int)(p))+((c)-1))&~((c)-1))
+
+int spacewire_setattibutes(int minor, int nodeaddr, int proto, int dest);
+
+typedef struct {
+ unsigned int nodeaddr;
+ unsigned int destnodeaddr;
+ unsigned int proto;
+ unsigned int destkey;
+ unsigned int maxfreq;
+ unsigned int clkdiv;
+ unsigned int rxmaxlen;
+
+ unsigned int is_rmap,is_rxunaligned,is_rmapcrc;
+
+ unsigned int txcur,rxcur,rxbufcur;
+ unsigned int txbufsize,rxbufsize;
+ unsigned int txbufcnt,rxbufcnt;
+ char *ptr_rxbuf0,*ptr_txbuf0;
+ unsigned int irq;
+
+ SPACEWIRE_RXBD *rx;
+ SPACEWIRE_TXBD *tx;
+
+ char _rxtable[SPACEWIRE_BDTABLE_SIZE*2];
+ char _txtable[SPACEWIRE_BDTABLE_SIZE*2];
+
+#ifndef SPW_BUFMALLOC
+ char _rxbuf0[SPACEWIRE_RXPCK_SIZE*SPACEWIRE_RXBUFS_NR];
+ char _txbuf0[SPACEWIRE_TXPCK_SIZE*SPACEWIRE_TXBUFS_NR];
+#endif
+
+ volatile LEON3_SPACEWIRE_Regs_Map *regs;
+} SPACEWIRE_PARAM;
+
+int _SPW_READ(void *addr);
+#define SPW_READ(addr) _SPW_READ((void *)(addr))
+#define SPW_WRITE(addr,v) *addr=v
+
+#define SPACEWIRE_MAX_CORENR 2
+extern SPACEWIRE_PARAM LEON3_Spacewire[SPACEWIRE_MAX_CORENR];
+
+#define SPW_PARAM(c) (LEON3_Spacewire[c])
+#define SPW_REG(c,r) (SPW_PARAM(c).regs->r)
+#define SPW_REG_CTRL(c) SPW_REG(c,ctrl)
+#define SPW_REG_STATUS(c) SPW_REG(c,status)
+#define SPW_REG_NODEADDR(c) SPW_REG(c,nodeaddr)
+
+#define SPW_CTRL_READ(c) SPW_READ(&SPW_REG_CTRL(c))
+#define SPW_CTRL_WRITE(c,v) SPW_WRITE(&SPW_REG_CTRL(c),v)
+#define SPW_STATUS_READ(c) SPW_READ(&SPW_REG_STATUS(c))
+#define SPW_STATUS_WRITE(c,v) SPW_WRITE(&SPW_REG_STATUS(c),v)
+
+#define SPW_LINKSTATE(c) (((c) >> 21) & 0x7)
+
+#define SPW_NODEADDR_READ(c) SPW_BYPASSCACHE(&SPW_NODEADDR(c))
+#define SPW_NODEADDR_WRITE(c,v) SPW_NODEADDR(c) = v
+
+#define SPACEWIRE_RXNR(c) ((c&~(SPACEWIRE_BDTABLE_SIZE-1))>>3)
+#define SPACEWIRE_TXNR(c) ((c&~(SPACEWIRE_BDTABLE_SIZE-1))>>4)
+
+#define SPACEWIRE_RXBD_LENGTH 0x1ffffff
+#define SPACEWIRE_RXBD_EN (1<<25)
+#define SPACEWIRE_RXBD_WR (1<<26)
+#define SPACEWIRE_RXBD_IE (1<<27)
+
+#define SPACEWIRE_RXBD_EEP (1<<28)
+#define SPACEWIRE_RXBD_EHC (1<<29)
+#define SPACEWIRE_RXBD_EDC (1<<30)
+#define SPACEWIRE_RXBD_ETR (1<<31)
+
+#define SPACEWIRE_RXBD_ERROR (SPACEWIRE_RXBD_EEP | \
+ SPACEWIRE_RXBD_EHC | \
+ SPACEWIRE_RXBD_EDC | \
+ SPACEWIRE_RXBD_ETR)
+
+#define SPACEWIRE_RXBD_RMAPERROR (SPACEWIRE_RXBD_EHC | SPACEWIRE_RXBD_EDC)
+
+#define SPACEWIRE_RXBD_LENGTH(c) ((c)&0xffffff)
+#define SPACEWIRE_PCKHEAD 2
+
+#define SPACEWIRE_TXBD_LENGTH 0xffffff
+
+#define SPACEWIRE_TXBD_EN (1<<12)
+#define SPACEWIRE_TXBD_WR (1<<13)
+#define SPACEWIRE_TXBD_IE (1<<14)
+
+#define SPACEWIRE_TXBD_LE (1<<15)
+
+#define SPACEWIRE_TXBD_ERROR (SPACEWIRE_TXBD_LE)
+
+#define SPACEWIRE_CTRL_RA (1<<31)
+#define SPACEWIRE_CTRL_RX (1<<30)
+#define SPACEWIRE_CTRL_RC (1<<29)
+
+#define SPACEWIRE_CTRL_RESET (1<<6)
+#define SPACEWIRE_CTRL_LINKSTART (1<<1)
+#define SPACEWIRE_CTRL_LINKDISABLE (1<<0)
+
+#define SPACEWIRE_DMACTRL_TXEN (1<<0)
+#define SPACEWIRE_DMACTRL_RXEN (1<<1)
+#define SPACEWIRE_DMACTRL_TXIE (1<<2)
+#define SPACEWIRE_DMACTRL_RXIE (1<<3)
+
+#define SPACEWIRE_DMACTRL_AI (1<<4)
+#define SPACEWIRE_DMACTRL_PS (1<<5)
+#define SPACEWIRE_DMACTRL_PR (1<<6)
+#define SPACEWIRE_DMACTRL_TA (1<<7)
+#define SPACEWIRE_DMACTRL_RA (1<<8)
+
+#define SPACEWIRE_DMACTRL_RD (1<<11)
+#define SPACEWIRE_DMACTRL_NS (1<<12)
+
+#define SPACEWIRE_PREPAREMASK_TX (SPACEWIRE_DMACTRL_RXEN | SPACEWIRE_DMACTRL_RXIE | SPACEWIRE_DMACTRL_PS | SPACEWIRE_DMACTRL_TA | SPACEWIRE_DMACTRL_RD)
+#define SPACEWIRE_PREPAREMASK_RX (SPACEWIRE_DMACTRL_TXEN | SPACEWIRE_DMACTRL_TXIE | SPACEWIRE_DMACTRL_AI | SPACEWIRE_DMACTRL_PR | SPACEWIRE_DMACTRL_RA)
+
+
+#define SPACEWIRE_IOCTRL_SET_NODEADDR 1
+#define SPACEWIRE_IOCTRL_SET_PROTOCOL 2
+#define SPACEWIRE_IOCTRL_SET_DESTNODEADDR 3
+#define SPACEWIRE_IOCTRL_GET_COREBASEADDR 4
+#define SPACEWIRE_IOCTRL_GET_COREIRQ 5
+#define SPACEWIRE_IOCTRL_SET_PACKETSIZE 6
+#define SPACEWIRE_IOCTRL_GETPACKET 7
+#define SPACEWIRE_IOCTRL_PUTPACKET 8
+
+typedef struct {
+ unsigned int txsize, rxsize;
+} spw_ioctl_packetsize;
+
+typedef struct {
+ char *buf;
+ int buf_size;
+ int ret_size;
+} spw_ioctl_packet;
+
+#endif