pi_functest.c
7.9 KB
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
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
#include "pi_util.h"
#include "pi_tests.h"
/* 16MByte, 16MByte, 32MByte, 64MByte */
const u32 flashSimDeviceSize[] = {0x1000000,0x1000000,0x2000000,0x4000000};
#ifdef TOSHIBA_FLASH
const u16 expectedIds[] = {0x9873,0x9873,0x9875,0x9876};
#else
const u16 expectedIds[] = {0xec73,0xec73,0xec75,0xec76};
#endif
void IoTestAll(char *flashInitFileName,int isGateLevel)
{
int ret, errCount;
int num_blocks =0;
int result = PASS;
int offset =0;
u32 val;
unsigned int seed;
int i;
FILE *fp;
/* some log output settings hardcoded for now */
Dflags |= DLOG | DSTATUS | DERROR;
displayMsg("Beginning PI functional testing.");
/* enter secure mode. We'll remain in secure mode until testing
PI_ACCESS further down. After tests that issue pin reset,
a re-entry into secure mode should be done. */
IO_READ(MI_SEC_MODE_REG);
IO_READ(BOOT_RAM_LO_START);
/* if running gate-level testing, just run the tests
* in the block below and return.
*/
if(isGateLevel){
/* enable writing to flash and set flash timing */
initFlash();
/* flash controller and ecc for gate-level */
eccSingleBitGateLevel(0,IS_BIG_DEVICE(flashSimDeviceSize[0]));
/* aes for gate level */
aesGateLevel();
/*
* Exit secure mode
*/
val = IO_READ(MI_SEC_MODE_REG);
val = val & 0x42;
IO_WRITE(MI_SEC_MODE_REG, val);
return;
}
/* Do a pin reset for reset state test */
displayMsg("PI functional test issuing pin reset.");
_TRACE(DLOG, fprintf(LogFp,"Doing a pin reset\n"));
fflush(NULL);
pin_reset();
/* re-enter secure mode after pin reset */
IO_READ(MI_SEC_MODE_REG);
IO_READ(BOOT_RAM_LO_START);
/*
* Reset register state testing
*/
displayMsg("Starting PI RegResetStateTest test.");
RegResetStateTest();
/* many tests use rand(), so seed here */
seed = getpid();
srand(seed);
_TRACE(DSTATUS,fprintf(LogFp,"Initial seed = %d\n",seed));
/* GPIO tests issue multiple pin resets, so do these before
* init DDR and flash
*/
/*
* GPIO, 1 (GPIO board-id)
*/
displayMsg("Starting PI gpioBoardId test.");
gpioBoardId();
/*
* GPIO, 2 (GPIO signals)
*/
displayMsg("Starting PI gpioSignals test.");
gpioSignals();
/* re-enter secure mode since gpioSignals() issues reset */
IO_READ(MI_SEC_MODE_REG);
IO_READ(BOOT_RAM_LO_START);
_TRACE(DLOG, fprintf(LogFp,"Initializing DDR and flash\n"));
fflush(NULL);
/* initialize DDR */
displayMsg("PI functional test initializing DDR.");
ret = InitDDR(0x0, 0x0, 0x0, 0x0);
/* enable writing to flash and set flash timing */
initFlash();
/*
* Memory Module Indicators
*/
displayMsg("Starting PI memModIndicators test.");
memModIndicators();
/*
* Flash Controller, 1 (Read ID)
*/
displayMsg("Starting PI flashCtlReadId test.");
flashCtlReadId(expectedIds);
/*
* ATB tests (all)
* NOTE: THIS MUST BE CALLED BEFORE FLASH TESTS THAT
* ERASE BLOCKS!!!
*/
displayMsg("Starting PI piAtbDmaTest test.");
piAtbDmaTest(flashInitFileName);
/* make sure we're in secure mode after first set of atb tests */
IO_READ(MI_SEC_MODE_REG);
IO_READ(BOOT_RAM_LO_START);
displayMsg("Starting PI piAtbDmaIntTest test.");
piAtbDmaIntTest(flashInitFileName);
displayMsg("Starting PI piAtbDmaErrTest test.");
piAtbDmaErrTest(flashInitFileName);
displayMsg("Starting PI piAtbDmaPioTest test.");
piAtbDmaPioTest(flashInitFileName);
/*
* Flash Controller, 2 (Full-page Read Operation)
*/
displayMsg("Starting PI flashCtlFullPageRead test.");
flashCtlFullPageRead(flashInitFileName,flashSimDeviceSize);
/*
* Flash Controller, 3 (Block Operations)
*/
displayMsg("Starting PI flashCtlBlockOperations test.");
flashCtlBlockOperations(flashSimDeviceSize);
/*
* Flash Controller, 4 (Read over buffer offsets)
*/
displayMsg("Starting PI flashCtlPartialPageReads test.");
flashCtlPartialPageReads(flashSimDeviceSize);
/*
* Flash Controller, 5 (OOB read buffer packing)
*/
displayMsg("Starting PI flashCtlOobReadBufPack test.");
flashCtlOobReadBufPack(flashSimDeviceSize);
/*
* Flash Controller. 6 (Interrupt tests)
*/
/* The flash interrupt tests are done during
* the other flash tests. The list below doesn't
* include all routines that test interrupts, but
* shows all flash cmds are all covered. "e&d"
* means tests for both intr enabled and disabled
*
* 0x00 read - e&d eccReadValid
* 0x10 programm commit - same tests as page program
* 0x50 read spare only - e&d flashCtlOobReadBufPack,
* flashCtlPartialPageReads
* 0x60 block erase - e flashBlockEraseRandom
* d flashBlockEraseZero
* e&d flashBlockEraseWalk
* 0x70 read status - same tests as block erase
* and page program
* 0x80 page program - e&d flashFullPageProgCheck,
* flashFullPageProgWalk
* 0x90 read ID - e&d flashCtlReadId
* 0xd0 erase commit - same tests as block erase
*/
/*
* Flash Controller. 7 (Stop bit and reset command)
*/
displayMsg("Starting PI flashCtlStopAndReset test.");
flashCtlStopAndReset(flashSimDeviceSize);
/*
* Flash Controller. 8 (Status failure)
* The flash status fail bit does not
* get set by either setting write
* protect or doing multiple prog's
* with no erase between. Therefore,
* this test does not pass.
*/
/* flashCtlReadStatus(flashSimDeviceSize); */
/*
* Flash Controller. 9 (Module state)
*/
displayMsg("Starting PI flashCtlModuleState test.");
flashCtlModuleState(flashSimDeviceSize);
/*
* ECC, 1 (ECC generation)
*/
displayMsg("Starting PI flashSimDeviceSize test.");
eccGen(flashSimDeviceSize);
/*
* ECC, 2 (Read valid)
*/
displayMsg("Starting PI eccReadValid test.");
eccReadValid(flashSimDeviceSize);
/*
* ECC, 3 (Single bit error)
*/
displayMsg("Starting PI eccSingleBitErr test.");
eccSingleBitErr(flashSimDeviceSize);
/*
* ECC, 4 (Double bit error)
* ECC, 5 (Mixed single/double error)
*/
displayMsg("Starting PI eccDoubleBitErr test.");
eccDoubleBitErr(flashSimDeviceSize);
/*
* AES tests (all)
*/
displayMsg("Starting PI piAesTests test.");
piAesTests();
/*
* PI Buffer DMA tests (all with no ints)
*/
displayMsg("Starting PI piBufDmaTest test.");
piBufDmaTest();
/*
* PI Buffer DMA tests for ints
*/
displayMsg("Starting PI piBufDmaIntTest test.");
piBufDmaIntTest();
/*
* PI Buffer DMA tests for errors
*/
displayMsg("Starting PI piBufDmaErrTest test.");
piBufDmaErrTest();
/*
* PI Buffer DMA test to insure removing module has no impact
*/
displayMsg("Starting PI piBufDmaModTest test.");
piBufDmaModTest();
/*
* Register i/o Testing
*/
displayMsg("Starting PI piRegIoTest test.");
piRegIoTest();
/*
* PI Buffer ATB Area PIO
*/
displayMsg("Starting PI piAtbEntryIoTest Test.");
piAtbEntryIoTest();
/*
* IDE Debug Port (full test of MI IDE int registers)
*/
displayMsg("Starting PI ideDebugPort test.");
ideDebugPort();
/*
* PI Access Control
*/
displayMsg("Starting PI accCtrlTest test.");
accCtrlTest(flashSimDeviceSize);
/*
* Exit secure mode
*/
val = IO_READ(MI_SEC_MODE_REG);
val = val & 0x42;
IO_WRITE(MI_SEC_MODE_REG, val);
}