annotate packages/io/nand/current/tests/nand_rwbenchmark.c @ 3383:060772fa9bb3

nand tests/nand_rwbenchmark.c: Fix infinite loop when all blocks are marked bad.
author Ross Younger <wry@ecoscentric.com>
date Sat, 14 Jun 2014 19:11:12 +1200
parents b1e9145ae7cd
children 631d86e5d620
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3017
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
1 //=============================================================================
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
2 //
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
3 // mounttime.c
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
4 //
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
5 // Mount timings exerciser, use on a filesystem filled by `makefiles'
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
6 //
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
7 //=============================================================================
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
8 // ####ECOSGPLCOPYRIGHTBEGIN####
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
9 // -------------------------------------------
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
11 // Copyright (C) 2009 Free Software Foundation, Inc.
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
12 //
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
13 // eCos is free software; you can redistribute it and/or modify it under
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
14 // the terms of the GNU General Public License as published by the Free
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
15 // Software Foundation; either version 2 or (at your option) any later
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
16 // version.
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
17 //
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
18 // eCos is distributed in the hope that it will be useful, but WITHOUT
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
19 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
21 // for more details.
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
22 //
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
23 // You should have received a copy of the GNU General Public License
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
24 // along with eCos; if not, write to the Free Software Foundation, Inc.,
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
25 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
26 //
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
27 // As a special exception, if other files instantiate templates or use
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
28 // macros or inline functions from this file, or you compile this file
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
29 // and link it with other works to produce a work based on this file,
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
30 // this file does not by itself cause the resulting work to be covered by
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
31 // the GNU General Public License. However the source code for this file
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
32 // must still be made available in accordance with section (3) of the GNU
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
33 // General Public License v2.
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
34 //
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
35 // This exception does not invalidate any other reasons why a work based
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
36 // on this file might be covered by the GNU General Public License.
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
37 // -------------------------------------------
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
38 // ####ECOSGPLCOPYRIGHTEND####
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
39 //==========================================================================
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
40 //#####DESCRIPTIONBEGIN####
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
41 //
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
42 // Author(s): wry
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
43 // Date: 2009-07-02
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
44 // Description: Read, write and erase timing benchmark.
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
45 // Some timing code borrowed from mmfs tests.
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
46 //
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
47 //####DESCRIPTIONEND####
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
48 //=============================================================================
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
49
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
50 #include <cyg/infra/testcase.h>
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
51 #include <cyg/infra/diag.h>
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
52 #include <cyg/infra/cyg_ass.h>
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
53 #include <pkgconf/system.h>
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
54 #include <pkgconf/hal.h>
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
55 #include <cyg/hal/hal_intr.h>
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
56
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
57 #ifndef HAL_CLOCK_READ
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
58 # error "HAL_CLOCK_READ not defined!"
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
59 #endif
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
60
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
61 #if !defined(CYGPKG_LIBC_TIME) || !defined(CYGPKG_ERROR) || !defined(CYGPKG_LIBC_STDIO) || !defined(CYGPKG_KERNEL)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
62
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
63 void cyg_user_start(void)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
64 {
3379
b1e9145ae7cd packages/io/nand/current/tests/nand_rwbenchmark.c: Add CYG_TEST_INIT() before CYG_TEST_NA() to allow auto-testing cyg_test_init() breakpoint to work.
James G. Smith <jsmith@ecoscentric.com>
parents: 3017
diff changeset
65 CYG_TEST_INIT();
3017
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
66 CYG_TEST_NA("Needs CYGPKG_KERNEL, CYGPKG_LIBC_TIME, CYGPKG_ERROR and CYGPKG_LIBC_STDIO");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
67 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
68
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
69 #else
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
70
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
71 #include <cyg/nand/nand.h>
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
72 #include <cyg/nand/nand_device.h>
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
73 #include <cyg/nand/util.h>
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
74
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
75 #include <string.h>
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
76 #include <stdio.h>
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
77 #include <unistd.h>
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
78 #include <sys/types.h>
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
79 #include <dirent.h>
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
80 #include <stdlib.h>
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
81
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
82 #include <cyg/kernel/kapi.h>
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
83
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
84 #include "ar4prng.inl"
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
85 ar4ctx rnd;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
86 /* we'll use our text segment as seed to the prng; not crypto-secure but
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
87 * pretty good for running tests */
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
88 extern unsigned char _stext[], _etext[];
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
89
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
90
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
91 #ifdef CYGPKG_DEVS_NAND_SYNTH
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
92 #define DEVICE "synth"
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
93 #else
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
94 #define DEVICE "onboard"
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
95 #endif
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
96
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
97 #define PARTITION 0
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
98
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
99 #define MUST(what) do { \
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
100 if (0 != what) { \
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
101 perror(#what); \
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
102 CYG_TEST_FAIL(#what); \
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
103 cyg_test_exit(); \
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
104 } \
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
105 } while(0)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
106
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
107 #define min(a,b) ( (a) > (b) ? (b) : (a) )
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
108
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
109 // --------------------------------------------------------------
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
110 // Timing code cribbed from pvr5.c
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
111
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
112 typedef struct
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
113 {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
114 cyg_int64 ticks;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
115 cyg_uint32 halticks;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
116 } timestamp;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
117
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
118 typedef struct
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
119 {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
120 timestamp start;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
121 timestamp end;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
122 cyg_int64 interval; // In HAL ticks
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
123 cyg_int64 us_interval; // Interval in microseconds
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
124 } timing;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
125
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
126 static cyg_int64 ticks_overhead = 0;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
127 static cyg_int32 us_per_haltick = 0;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
128 static cyg_int32 halticks_per_us = 0;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
129
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
130 static cyg_int64 rtc_resolution[] = CYGNUM_KERNEL_COUNTERS_RTC_RESOLUTION;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
131 static cyg_int64 rtc_period = CYGNUM_KERNEL_COUNTERS_RTC_PERIOD;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
132
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
133 static void wait_for_tick( void )
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
134 {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
135 cyg_tick_count_t now = cyg_current_time();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
136
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
137 while( cyg_current_time() == now )
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
138 continue;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
139 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
140
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
141 static void get_timestamp( timestamp *ts )
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
142 {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
143 ts->ticks = cyg_current_time();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
144 HAL_CLOCK_READ( &ts->halticks );
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
145 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
146
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
147 static cyg_int64 ticks_to_us( cyg_int64 ticks )
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
148 {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
149 cyg_int64 us;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
150
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
151 if( us_per_haltick != 0 )
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
152 us = ticks * us_per_haltick;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
153 else
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
154 us = ticks / halticks_per_us;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
155
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
156 return us;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
157 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
158
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
159 static void calculate_interval( timing *t )
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
160 {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
161 t->interval = t->end.halticks - t->start.halticks;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
162
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
163 t->interval += (t->end.ticks - t->start.ticks) * rtc_period;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
164
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
165 t->interval -= ticks_overhead;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
166
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
167 t->us_interval = ticks_to_us( t->interval );
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
168 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
169
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
170 static void init_timing( void )
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
171 {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
172 timing t;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
173
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
174 cyg_thread_delay(2); // ensure clock running - asserts if not
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
175
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
176 us_per_haltick = 1000000/(rtc_period * rtc_resolution[1]);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
177 halticks_per_us = (rtc_period * rtc_resolution[1])/1000000;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
178
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
179 wait_for_tick();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
180
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
181 get_timestamp( &t.start );
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
182 get_timestamp( &t.end );
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
183
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
184 calculate_interval( &t );
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
185
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
186 ticks_overhead = t.interval;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
187
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
188 diag_printf("Timing overhead %lld ticks (%lluus), this will be factored out of all other measurements\n", ticks_overhead, t.us_interval );
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
189 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
190
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
191 #define disable_clock_latency_measurement()
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
192 #define enable_clock_latency_measurement()
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
193
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
194 // --------------------------------------------------------------
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
195
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
196 void
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
197 show_times_hdr(void)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
198 {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
199 disable_clock_latency_measurement();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
200 diag_printf("\n");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
201 #ifdef _TM_BASIC_HAL_CLOCK_READ_UNDEFINED
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
202 diag_printf("HAL_CLOCK_READ() is not supported on this platform.\n");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
203 diag_printf("Timing results are meaningless.\n");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
204 #endif
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
205 diag_printf("All times are in microseconds (us) unless stated\n");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
206 diag_printf("\n");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
207 diag_printf(" Confidence\n");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
208 diag_printf(" Ave Min Max Var Ave Min Function\n");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
209 diag_printf(" ====== ====== ====== ====== ========== ========\n");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
210 enable_clock_latency_measurement();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
211 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
212
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
213 // Display a time result
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
214 void
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
215 show_ns(cyg_uint64 ns)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
216 {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
217 if (ns > 999995000) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
218 ns += 5000000; // round to nearest 0.01s
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
219 diag_printf("%5u.%02us", (int)(ns/1000000000), (int)((ns%1000000000)/10000000));
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
220
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
221 } else if (ns >= 99999995) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
222 ns += 5000; // round to 0.01ms
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
223 diag_printf("%4u.%02ums", (int)(ns/1000000), (int)((ns%1000000)/10000));
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
224 } else {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
225 ns += 5; // round to .01us
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
226 diag_printf("%6u.%02u", (int)(ns/1000), (int)((ns%1000)/10));
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
227 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
228 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
229
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
230 void
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
231 show_times_detail(timing ft[], int nsamples, char *title, bool ignore_first)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
232 {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
233 int i;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
234 int start_sample, total_samples;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
235 cyg_uint64 delta, total, ave, min, max, ave_dev;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
236 /* we measure in ticks, convert to us, but store as ns for good precision */
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
237 cyg_int32 con_ave, con_min;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
238
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
239 if (ignore_first) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
240 start_sample = 1;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
241 total_samples = nsamples-1;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
242 } else {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
243 start_sample = 0;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
244 total_samples = nsamples;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
245 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
246
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
247 total = 0;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
248 min = 0xFFFFffffFFFFffffULL;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
249 max = 0;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
250 for (i = start_sample; i < nsamples; i++) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
251 calculate_interval(&ft[i]);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
252 delta = ft[i].us_interval * 1000;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
253 total += delta;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
254 if (delta < min) min = delta;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
255 if (delta > max) max = delta;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
256 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
257 ave = total / total_samples;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
258
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
259 ave_dev = 0;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
260 for (i = start_sample; i < nsamples; i++) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
261 delta = ft[i].us_interval * 1000;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
262 if (delta > ave)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
263 delta = delta - ave;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
264 else
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
265 delta = ave - delta;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
266 ave_dev += delta;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
267 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
268 ave_dev /= total_samples;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
269
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
270 con_ave = 0;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
271 con_min = 0;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
272 for (i = start_sample; i < nsamples; i++) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
273 delta = ft[i].us_interval * 1000;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
274 if ((delta <= (ave+ave_dev)) && (delta >= (ave-ave_dev))) con_ave++;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
275 if ((delta <= (min+ave_dev)) && (delta >= (min-ave_dev))) con_min++;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
276 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
277 con_ave = (con_ave * 100) / total_samples;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
278 con_min = (con_min * 100) / total_samples;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
279
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
280 disable_clock_latency_measurement();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
281 show_ns(ave);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
282 show_ns(min);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
283 show_ns(max);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
284 show_ns(ave_dev);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
285 diag_printf(" %3d%% %3d%%", con_ave, con_min);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
286 diag_printf(" %s\n", title);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
287
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
288 CYG_ASSERT( ave <= max, "ave < max" );
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
289
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
290 enable_clock_latency_measurement();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
291 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
292
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
293 void
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
294 show_times(timing ft[], int nsamples, char *title)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
295 {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
296 show_times_detail(ft, nsamples, title, false);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
297 #ifdef STATS_WITHOUT_FIRST_SAMPLE
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
298 show_times_detail(ft, nsamples, "", true);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
299 #endif
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
300 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
301
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
302 // --------------------------------------------------------------
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
303
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
304 #define WORKDIR MOUNTPOINT "/" "test"
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
305
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
306 #define NREADS 100
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
307 #define NBULKREADS 10
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
308 #define NBULKWRITES 10
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
309 #define NWRITES 30
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
310 #define NERASES 30
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
311
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
312 void show_test_parameters(cyg_nand_device *dev)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
313 {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
314 disable_clock_latency_measurement();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
315 diag_printf("\nTesting parameters:\n");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
316 diag_printf(" NAND reads: %5u\n", NREADS);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
317 if (NWRITES)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
318 diag_printf(" NAND writes: %5u\n", NWRITES);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
319 if (NERASES)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
320 diag_printf(" NAND erases: %5u\n", NERASES);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
321 if (NBULKREADS)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
322 diag_printf(" NAND bulk reads: %5u\n", NBULKREADS);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
323 if (NBULKWRITES)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
324 diag_printf(" NAND bulk writes: %5u\n", NBULKWRITES);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
325 diag_printf(" Device page size: %5u bytes\n"
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
326 " Device block size: %5u pages\n",
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
327 CYG_NAND_BYTES_PER_PAGE(dev),
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
328 CYG_NAND_PAGES_PER_BLOCK(dev) );
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
329
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
330 enable_clock_latency_measurement();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
331 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
332
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
333 cyg_nand_block_addr find_spare_block(cyg_nand_partition *part)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
334 {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
335 const int oobz = CYG_NAND_APPSPARE_PER_PAGE(part->dev);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
336 unsigned char oob[oobz];
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
337 int i,rv;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
338 cyg_nand_block_addr b;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
339
3383
060772fa9bb3 nand tests/nand_rwbenchmark.c: Fix infinite loop when all blocks are marked bad.
Ross Younger <wry@ecoscentric.com>
parents: 3379
diff changeset
340 for (b=CYG_NAND_PARTITION_NBLOCKS(part)-1; b>=1; b--) {
060772fa9bb3 nand tests/nand_rwbenchmark.c: Fix infinite loop when all blocks are marked bad.
Ross Younger <wry@ecoscentric.com>
parents: 3379
diff changeset
341 /* Testing for b>=1 means we don't check block 0 for
060772fa9bb3 nand tests/nand_rwbenchmark.c: Fix infinite loop when all blocks are marked bad.
Ross Younger <wry@ecoscentric.com>
parents: 3379
diff changeset
342 * availability, but if we get there then realistically
060772fa9bb3 nand tests/nand_rwbenchmark.c: Fix infinite loop when all blocks are marked bad.
Ross Younger <wry@ecoscentric.com>
parents: 3379
diff changeset
343 * the device is worn out anyway. So fail the test. */
3017
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
344 cyg_nand_page_addr pg = CYG_NAND_BLOCK2PAGEADDR(part->dev, b);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
345 rv = cyg_nandp_read_page(part, pg, 0, oob, oobz);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
346 if (rv != 0) continue; // bad block?
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
347
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
348 for (i=0; i<oobz; i++)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
349 if (oob[i] != 0xff)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
350 goto next;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
351
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
352 // oob all FF: take it!
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
353 return b;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
354 next:
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
355 ;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
356 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
357
3383
060772fa9bb3 nand tests/nand_rwbenchmark.c: Fix infinite loop when all blocks are marked bad.
Ross Younger <wry@ecoscentric.com>
parents: 3379
diff changeset
358 CYG_TEST_FAIL_EXIT("can't find an untagged block - device worn out?");
3017
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
359 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
360
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
361 CYG_BYTE databuf[CYGNUM_NAND_PAGEBUFFER], testbuf[CYGNUM_NAND_PAGEBUFFER];
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
362 timing ft_read[NREADS];
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
363 timing ft_write[NWRITES];
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
364 timing ft_erase[NERASES];
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
365 timing ft_bulkread[NBULKREADS];
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
366 timing ft_bulkwrite[NBULKWRITES];
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
367
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
368 int fails = 0;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
369
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
370 void test_reads(cyg_nand_partition *part, cyg_nand_block_addr b)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
371 {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
372 cyg_nand_page_addr pgstart = CYG_NAND_BLOCK2PAGEADDR(part->dev, b),
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
373 pgend = CYG_NAND_BLOCK2PAGEADDR(part->dev, b+1)-1,
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
374 pg = pgstart;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
375 int i, rv;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
376 const int oobz = CYG_NAND_APPSPARE_PER_PAGE(part->dev);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
377 unsigned char oob[oobz];
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
378 #define ft ft_read
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
379
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
380 /* First, set up the block the way we want it ... */
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
381 cyg_nandp_erase_block(part, b);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
382 memcpy(oob, databuf, oobz);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
383 for (i=pgstart; i <= pgend; i++) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
384 rv = cyg_nandp_write_page(part, i, databuf, oob, oobz);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
385 switch (rv) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
386 case 0: break;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
387 case -EIO:
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
388 cyg_nandp_bbt_markbad(part, b);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
389 CYG_TEST_FAIL_FINISH("Write failed; block now marked as bad. This run can't continue but should be OK to repeat.");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
390
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
391 default:
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
392 diag_printf("Unexpected write failure: %d\n", rv);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
393 CYG_TEST_FAIL_FINISH("Pre-write failed");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
394 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
395 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
396
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
397 #define CLEARDATA() memset(testbuf, 0, sizeof testbuf)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
398 #define CHECKDATA() do { if (0 != memcmp(testbuf, databuf, sizeof testbuf)) { \
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
399 CYG_TEST_FAIL("readback check failed"); \
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
400 ++fails; \
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
401 break; \
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
402 } } while(0)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
403
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
404 #define CLEAROOB() memset(oob, 0, oobz)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
405 #define CHECKOOB() do { if (0 != memcmp(oob, databuf, oobz)) { \
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
406 CYG_TEST_FAIL("readback OOB check failed"); \
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
407 ++fails; \
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
408 break; \
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
409 } } while(0)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
410
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
411
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
412 for (i=0; i < NREADS; i++) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
413 CLEARDATA();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
414 wait_for_tick();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
415 get_timestamp(&ft[i].start);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
416 cyg_nandp_read_page(part, pg, testbuf, 0, 0);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
417 get_timestamp(&ft[i].end);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
418 CHECKDATA();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
419 ++pg;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
420 if (pg > pgend) pg = pgstart;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
421 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
422 show_times(ft, NREADS, "NAND page reads (page data only)");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
423
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
424 for (i=0; i < NREADS; i++) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
425 CLEAROOB();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
426 wait_for_tick();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
427 get_timestamp(&ft[i].start);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
428 cyg_nandp_read_page(part, pg, 0, oob, oobz);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
429 get_timestamp(&ft[i].end);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
430 CHECKOOB();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
431 ++pg;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
432 if (pg > pgend) pg = pgstart;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
433 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
434 show_times(ft, NREADS, "NAND page reads (OOB only)");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
435
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
436 for (i=0; i < NREADS; i++) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
437 CLEARDATA();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
438 CLEAROOB();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
439 wait_for_tick();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
440 get_timestamp(&ft[i].start);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
441 cyg_nandp_read_page(part, pg, testbuf, oob, oobz);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
442 get_timestamp(&ft[i].end);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
443 CHECKDATA();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
444 CHECKOOB();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
445 ++pg;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
446 if (pg > pgend) pg = pgstart;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
447 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
448 show_times(ft, NREADS, "NAND page reads (page + OOB)");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
449
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
450 #undef ft
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
451 #define ft ft_bulkread
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
452 for (i=0; i < NBULKREADS; i++) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
453 CLEARDATA();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
454 wait_for_tick();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
455 get_timestamp(&ft[i].start);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
456 for (pg = pgstart; pg <= pgend; pg++) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
457 cyg_nandp_read_page(part, pg, testbuf, 0, 0);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
458 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
459 get_timestamp(&ft[i].end);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
460 CHECKDATA();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
461 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
462 // report the results later.
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
463 #undef ft
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
464 cyg_nandp_erase_block(part, b);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
465 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
466
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
467
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
468 void test_writes(cyg_nand_partition *part, cyg_nand_block_addr b)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
469 {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
470 cyg_nand_page_addr pgstart = CYG_NAND_BLOCK2PAGEADDR(part->dev, b),
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
471 pgend = CYG_NAND_BLOCK2PAGEADDR(part->dev, b+1)-1,
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
472 pg = pgstart;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
473 int i;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
474 const int oobz = CYG_NAND_APPSPARE_PER_PAGE(part->dev);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
475 unsigned char oob[oobz];
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
476 #define ft ft_write
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
477
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
478 cyg_nandp_erase_block(part, b);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
479 for (i=0; i < NWRITES; i++) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
480 wait_for_tick();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
481 get_timestamp(&ft[i].start);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
482 cyg_nandp_write_page(part, pg, databuf, databuf, oobz);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
483 get_timestamp(&ft[i].end);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
484
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
485 // Read it back to confirm
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
486 CLEARDATA();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
487 CLEAROOB();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
488 cyg_nandp_read_page(part, pg, testbuf, oob, oobz);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
489 CHECKDATA();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
490 CHECKOOB();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
491
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
492 ++pg;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
493 if (pg > pgend) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
494 cyg_nandp_erase_block(part, b);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
495 pg = pgstart;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
496 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
497 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
498 cyg_nandp_erase_block(part, b);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
499 show_times(ft, NWRITES, "NAND full-page writes");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
500
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
501 #undef ft
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
502 #define ft ft_bulkwrite
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
503 // N.B. Bulk writing times will likely improve later if we implement cache-programming mode as found on many a large-page device.
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
504 for (i=0; i < NBULKWRITES; i++) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
505 wait_for_tick();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
506 get_timestamp(&ft[i].start);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
507 for (pg = pgstart; pg <= pgend; pg++) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
508 cyg_nandp_write_page(part, pg, testbuf, 0, 0);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
509 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
510 get_timestamp(&ft[i].end);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
511 cyg_nandp_erase_block(part, b);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
512 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
513 // report later.
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
514 #undef ft
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
515 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
516
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
517
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
518 void test_erases(cyg_nand_partition *part, cyg_nand_block_addr b)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
519 {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
520 int i;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
521 #define ft ft_erase
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
522
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
523 for (i=0; i < NERASES; i++) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
524 wait_for_tick();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
525 get_timestamp(&ft[i].start);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
526 cyg_nandp_erase_block(part, b);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
527 get_timestamp(&ft[i].end);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
528
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
529 if (i==0) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
530 cyg_nand_page_addr pg = CYG_NAND_BLOCK2PAGEADDR(part->dev, b);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
531 const int oobz = CYG_NAND_APPSPARE_PER_PAGE(part->dev);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
532 unsigned char oob[oobz];
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
533 int j;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
534 // TODO: It only makes sense to check the one, unless we want
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
535 // to try writing out more dummy data each time.
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
536 CLEARDATA();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
537 CLEAROOB();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
538 cyg_nandp_read_page(part, pg, testbuf, oob, oobz);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
539 for (j=0; j < sizeof testbuf; j++) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
540 if (testbuf[j] != 0xff) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
541 CYG_TEST_FAIL("readback check failed");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
542 ++fails;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
543 break;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
544 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
545 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
546 for (j=0; j < oobz; j++) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
547 if (oob[j] != 0xff) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
548 CYG_TEST_FAIL("readback OOB check failed");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
549 ++fails;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
550 break;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
551 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
552 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
553 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
554 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
555 show_times(ft, NERASES, "NAND block erases");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
556 #undef ft
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
557 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
558
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
559
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
560
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
561 void rwbenchmark_main(void)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
562 {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
563 cyg_nand_device *dev;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
564 cyg_nand_partition *part;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
565 cyg_nand_block_addr block;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
566
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
567 cyg_nand_lookup(DEVICE, &dev);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
568 if (!dev)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
569 CYG_TEST_FAIL_EXIT("can't get device "DEVICE);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
570 part = cyg_nand_get_partition(dev, PARTITION);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
571 if (!part)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
572 CYG_TEST_FAIL_EXIT("can't get partition");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
573
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
574 block = find_spare_block(part);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
575 diag_printf("Using block %d\n",block);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
576
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
577 show_test_parameters(dev);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
578 show_times_hdr();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
579
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
580 // TODO: For speed, refactor test_reads and test_writes into each other.
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
581 test_reads(part, block);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
582
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
583 // Freshen our test data for the second phase
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
584 ar4prng_many(&rnd, databuf, sizeof databuf);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
585 test_writes(part,block);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
586
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
587 test_erases(part,block);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
588
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
589 show_times(ft_bulkread, NBULKREADS, "Bulk reads (block data)");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
590 show_times(ft_bulkwrite, NBULKWRITES, "Bulk writes (block data)");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
591 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
592
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
593 int main(void)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
594 {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
595 CYG_TEST_INIT();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
596 init_timing();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
597
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
598 ar4prng_init(&rnd,_stext, _etext-_stext);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
599 ar4prng_many(&rnd, databuf, sizeof databuf);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
600
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
601
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
602 #if defined(CYGVAR_KERNEL_COUNTERS_CLOCK_LATENCY) || defined(CYGVAR_KERNEL_COUNTERS_CLOCK_DSR_LATENCY)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
603 CYG_TEST_INFO("WARNING: Clock or DSR latency instrumentation can mess with the results, recommend you turn it off.");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
604 #endif
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
605
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
606
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
607 rwbenchmark_main();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
608
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
609 if (fails) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
610 diag_printf("There were %d failures.\n",fails);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
611 CYG_TEST_FAIL_FINISH("something went wrong, THESE RESULTS ARE INVALID");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
612 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
613
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
614 CYG_TEST_PASS_FINISH("Benchmarking complete");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
615 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
616
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
617 #endif
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
618