summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/sparc/leon3/include/spacewire.h
blob: 516cc9377234c8e3a3ee5555afcc9de9e2cd7c66 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
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