OpenCores
URL https://opencores.org/ocsvn/mips_enhanced/mips_enhanced/trunk

Subversion Repositories mips_enhanced

[/] [mips_enhanced/] [trunk/] [grlib-gpl-1.0.19-b3188/] [software/] [leon3/] [spwtest.c] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dimamali
#include "testmod.h"
2
#include <stdlib.h>
3
 
4
struct spwregs
5
{
6
   volatile int ctrl;
7
   volatile int status;
8
   volatile int nodeaddr;
9
   volatile int clkdiv;
10
   volatile int destkey;
11
   volatile int time;
12
   volatile int unused[2];
13
   volatile int dmactrl;
14
   volatile int rxmaxlen;
15
   volatile int txdesc;
16
   volatile int rxdesc;
17
};
18
 
19
static int snoopen;
20
 
21
static char *almalloc(int sz)
22
{
23
  char *tmp;
24
  tmp = (char *) malloc(2*sz);
25
  tmp = (char *) (((int)tmp+sz) & ~(sz -1));
26
  return(tmp);
27
}
28
 
29
static inline int loadmem(int addr)
30
{
31
  int tmp;
32
  if (snoopen) {
33
    asm volatile (" ld [%1], %0 "
34
      : "=r"(tmp)
35
      : "r"(addr)
36
    );
37
  } else {
38
    asm volatile (" lda [%1]1, %0 "
39
      : "=r"(tmp)
40
      : "r"(addr)
41
    );
42
  }
43
  return tmp;
44
}
45
 
46
static inline char loadb(int addr)
47
{
48
  char tmp;
49
  if (snoopen) {
50
    asm volatile (" ldub [%1], %0 "
51
      : "=r"(tmp)
52
      : "r"(addr)
53
    );
54
  } else {
55
    asm volatile (" lduba [%1]1, %0 "
56
      : "=r"(tmp)
57
      : "r"(addr)
58
    );
59
  }
60
  return tmp;
61
}
62
 
63
int spw_test(int addr)
64
{
65
  int i;
66
  int rmapaddr;
67
  int  *tmp;
68
  int  *size;
69
  volatile char *rx;
70
  volatile char *tx;
71
  volatile char *rmap;
72
  volatile char *rmaphdr;
73
  volatile int *rxd;
74
  volatile int *txd;
75
 
76
  struct spwregs *regs;
77
 
78
  report_device(0x0101F000);
79
  snoopen = rsysreg(0) & (1 << 23);
80
 
81
  if (snoopen) report_subtest(SPW_SNOOP_TEST);
82
  else report_subtest(SPW_NOSNOOP_TEST);
83
 
84
  regs = (struct spwregs *) addr;
85
  rx = (char *) malloc(64);
86
  tx = (char *) malloc(64);
87
  rmaphdr = (char *) malloc(32);
88
  rmap = (char *) malloc(64);
89
  rxd = (int *) almalloc(1024);
90
  txd = (int *) almalloc(1024);
91
  size = (int *) malloc(sizeof(int));
92
 
93
  /*reset link */
94
  regs->ctrl = (1 << 6);
95
 
96
  /*initiate registers*/
97
  regs->ctrl = 0x2;
98
  regs->ctrl = 0x2;
99
  regs->status = 0xFFFFFFFF;
100
  regs->nodeaddr = 0xFE;
101
  regs->clkdiv = 0;
102
  regs->destkey = 0;
103
  regs->time = 0;
104
  regs->dmactrl = 0x01E0;
105
  regs->rxmaxlen = 1024;
106
  regs->txdesc = 0;
107
  regs->rxdesc = 0;
108
 
109
  while(((loadmem((int)&regs->status) >> 21) & 7) != 5) {}
110
 
111
  /*check dma channel*/
112
  tmp = (int *) rx;
113
  for (i = 0; i < 64/sizeof(int); i++) {
114
    tmp[i] = 0;
115
  }
116
  tmp = (int *) tx;
117
  for (i = 0; i < 64/sizeof(int); i++) {
118
    tmp[i] = 0;
119
  }
120
  tmp = (int *) rmap;
121
  for (i = 0; i < 64/sizeof(int); i++) {
122
    tmp[i] = 0;
123
  }
124
  tmp = (int *) rmaphdr;
125
  for (i = 0; i < 32/sizeof(int); i++) {
126
    tmp[i] = 0;
127
  }
128
  for (i = 0; i < 8; i++) {
129
    txd[i] = 0;
130
  }
131
  for (i = 0; i < 8; i++) {
132
    rxd[i] = 0;
133
  }
134
  for(i = 1; i < 64; i++) {
135
    tx[i] = (char) i;
136
  }
137
  tx[0] = (char) 0xFE;
138
 
139
  rxd[1] = (int) rx;
140
  rxd[0] = (1 << 26) | (1 << 25);
141
 
142
  txd[4] = 0;
143
  txd[3] = (int)tx;
144
  txd[2] = 32;
145
  txd[1] = 0;
146
  txd[0] = (1 << 13) | (1 << 12);
147
 
148
  regs->txdesc = (int) txd;
149
  regs->rxdesc = (int) rxd;
150
 
151
  regs->dmactrl = 0x19E3;
152
 
153
  while((loadmem((int)&rxd[0]) >> 25) & 1) {}
154
 
155
  if (!((loadmem((int)&regs->dmactrl) >> 6) & 1)) {
156
    fail(3);
157
  }
158
  if (!((loadmem((int)&regs->dmactrl) >> 5) & 1)) {
159
    fail(4);
160
  }
161
  if ((loadmem((int)&regs->dmactrl) & 1)) {
162
    fail(5);
163
  }
164
 
165
  for(i = 0; i < 32; i++) {
166
    if (loadb((int)&rx[i]) != tx[i]) {
167
      fail(6);
168
    }
169
  }
170
 
171
  /*check rmap*/
172
  rmapaddr = (int) rmap;
173
  if ((loadmem((int)&regs->ctrl) >> 31) & 1) {
174
    report_subtest(SPW_RMAP_TEST);
175
    regs->ctrl = loadmem((int)&regs->ctrl) | (1 << 16);
176
    rmaphdr[0] = 0xFE;
177
    rmaphdr[1] = 1;
178
    rmaphdr[2] = 0x6C;
179
    rmaphdr[3] = 0;
180
    rmaphdr[4] = 0xFE;
181
    rmaphdr[5] = 0;
182
    rmaphdr[6] = 0;
183
    rmaphdr[7] = 0;
184
    rmaphdr[8] = (rmapaddr >> 24) & 0xFF;
185
    rmaphdr[9] = (rmapaddr >> 16) & 0xFF;
186
    rmaphdr[10] = (rmapaddr >> 8) & 0xFF;
187
    rmaphdr[11] = rmapaddr & 0xFF;
188
    rmaphdr[12] = 0;
189
    rmaphdr[13] = 0;
190
    rmaphdr[14] = 64;
191
 
192
    rxd[0] = (1 << 26) | (1 << 25);
193
    txd[2] = 64;
194
    txd[1] = (int) rmaphdr;
195
    txd[0] = (1 << 13) | (1 << 12) | 15 | (1 << 16) | (1 << 17);
196
    regs->dmactrl = 0x19E3;
197
 
198
    while((loadmem((int)&rxd[0]) >> 25) & 1) {}
199
 
200
    for(i = 0; i < 64; i++) {
201
      if (loadb((int)&rmap[i]) != tx[i]) {
202
        fail(7);
203
      }
204
    }
205
 
206
    rmaphdr[0] = 0xFE;
207
    rmaphdr[1] = 1;
208
    rmaphdr[2] = 0x2C;
209
    rmaphdr[3] = 0;
210
    rmaphdr[4] = 0xFE;
211
    rmaphdr[5] = 0;
212
    rmaphdr[6] = 0;
213
 
214
    if ((rxd[0] & 0x1FFFFFF) != 8) {
215
      fail(7);
216
    }
217
 
218
    for(i = 0; i < 7; i++) {
219
      if (loadb((int)&rx[i]) != rmaphdr[i]) {
220
        fail(8);
221
      }
222
    }
223
 
224
  }
225
 
226
  /*check time interface*/
227
  report_subtest(SPW_TIME_TEST);
228
  regs->ctrl = loadmem((int)&regs->ctrl) | (1 << 11) | (1 << 10);
229
  regs->ctrl = loadmem((int)&regs->ctrl) | (1 << 4);
230
 
231
  while((loadmem((int)&regs->ctrl) >> 4) & 1) {}
232
 
233
  if ((loadmem((int)&regs->status) & 1)) {
234
    fail(1);
235
  }
236
  if ((loadmem((int)&regs->time) & 0xFF) != 1) {
237
    fail(2);
238
  }
239
 
240
  return 0;
241
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.