annotate packages/io/nand/current/tests/nand_rwbenchmark.c @ 3394:7905ed422fdf

io/nand: Rename CYGINT_IO_NAND_TEST_PARTITION to CYGNUM_IO_NAND_TEST_PARTITION.
author Ross Younger <wry@ecoscentric.com>
date Tue, 02 Dec 2014 12:07:18 +1300
parents c1cbf062a826
children
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 MUST(what) do { \
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
98 if (0 != what) { \
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
99 perror(#what); \
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
100 CYG_TEST_FAIL(#what); \
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
101 cyg_test_exit(); \
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
102 } \
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
103 } while(0)
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 #define min(a,b) ( (a) > (b) ? (b) : (a) )
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 // --------------------------------------------------------------
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
108 // Timing code cribbed from pvr5.c
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 typedef struct
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 cyg_int64 ticks;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
113 cyg_uint32 halticks;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
114 } timestamp;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
115
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
116 typedef struct
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 timestamp start;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
119 timestamp end;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
120 cyg_int64 interval; // In HAL ticks
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
121 cyg_int64 us_interval; // Interval in microseconds
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
122 } timing;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
123
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
124 static cyg_int64 ticks_overhead = 0;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
125 static cyg_int32 us_per_haltick = 0;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
126 static cyg_int32 halticks_per_us = 0;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
127
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
128 static cyg_int64 rtc_resolution[] = CYGNUM_KERNEL_COUNTERS_RTC_RESOLUTION;
3385
631d86e5d620 io/nand tests/nand_rwbenchmark.c: Cope with CYGNUM_KERNEL_COUNTERS_RTC_PERIOD not being constant.
Ross Younger <wry@ecoscentric.com>
parents: 3383
diff changeset
129 static cyg_int64 rtc_period;
3017
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
130
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
131 static void wait_for_tick( void )
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 cyg_tick_count_t now = cyg_current_time();
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 while( cyg_current_time() == now )
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
136 continue;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
137 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
138
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
139 static void get_timestamp( timestamp *ts )
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 ts->ticks = cyg_current_time();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
142 HAL_CLOCK_READ( &ts->halticks );
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
143 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
144
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
145 static cyg_int64 ticks_to_us( cyg_int64 ticks )
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 cyg_int64 us;
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 if( us_per_haltick != 0 )
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
150 us = ticks * us_per_haltick;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
151 else
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
152 us = ticks / halticks_per_us;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
153
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
154 return 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
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
157 static void calculate_interval( timing *t )
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 t->interval = t->end.halticks - t->start.halticks;
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.ticks - t->start.ticks) * rtc_period;
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 -= ticks_overhead;
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->us_interval = ticks_to_us( t->interval );
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
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
168 static void init_timing( void )
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 timing t;
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 cyg_thread_delay(2); // ensure clock running - asserts if not
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
173
3385
631d86e5d620 io/nand tests/nand_rwbenchmark.c: Cope with CYGNUM_KERNEL_COUNTERS_RTC_PERIOD not being constant.
Ross Younger <wry@ecoscentric.com>
parents: 3383
diff changeset
174 rtc_period = CYGNUM_KERNEL_COUNTERS_RTC_PERIOD;
3017
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
175 us_per_haltick = 1000000/(rtc_period * rtc_resolution[1]);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
176 halticks_per_us = (rtc_period * rtc_resolution[1])/1000000;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
177
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
178 wait_for_tick();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
179
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
180 get_timestamp( &t.start );
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
181 get_timestamp( &t.end );
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
182
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
183 calculate_interval( &t );
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
184
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
185 ticks_overhead = t.interval;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
186
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
187 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
188 }
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 #define disable_clock_latency_measurement()
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
191 #define enable_clock_latency_measurement()
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
192
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 void
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
196 show_times_hdr(void)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
197 {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
198 disable_clock_latency_measurement();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
199 diag_printf("\n");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
200 #ifdef _TM_BASIC_HAL_CLOCK_READ_UNDEFINED
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
201 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
202 diag_printf("Timing results are meaningless.\n");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
203 #endif
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
204 diag_printf("All times are in microseconds (us) unless stated\n");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
205 diag_printf("\n");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
206 diag_printf(" Confidence\n");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
207 diag_printf(" Ave Min Max Var Ave Min Function\n");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
208 diag_printf(" ====== ====== ====== ====== ========== ========\n");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
209 enable_clock_latency_measurement();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
210 }
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 // Display a time result
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
213 void
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
214 show_ns(cyg_uint64 ns)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
215 {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
216 if (ns > 999995000) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
217 ns += 5000000; // round to nearest 0.01s
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
218 diag_printf("%5u.%02us", (int)(ns/1000000000), (int)((ns%1000000000)/10000000));
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
219
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
220 } else if (ns >= 99999995) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
221 ns += 5000; // round to 0.01ms
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
222 diag_printf("%4u.%02ums", (int)(ns/1000000), (int)((ns%1000000)/10000));
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
223 } else {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
224 ns += 5; // round to .01us
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
225 diag_printf("%6u.%02u", (int)(ns/1000), (int)((ns%1000)/10));
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
226 }
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 void
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
230 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
231 {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
232 int i;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
233 int start_sample, total_samples;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
234 cyg_uint64 delta, total, ave, min, max, ave_dev;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
235 /* 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
236 cyg_int32 con_ave, con_min;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
237
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
238 if (ignore_first) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
239 start_sample = 1;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
240 total_samples = nsamples-1;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
241 } else {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
242 start_sample = 0;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
243 total_samples = nsamples;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
244 }
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 total = 0;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
247 min = 0xFFFFffffFFFFffffULL;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
248 max = 0;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
249 for (i = start_sample; i < nsamples; i++) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
250 calculate_interval(&ft[i]);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
251 delta = ft[i].us_interval * 1000;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
252 total += delta;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
253 if (delta < min) min = delta;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
254 if (delta > max) max = delta;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
255 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
256 ave = total / total_samples;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
257
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
258 ave_dev = 0;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
259 for (i = start_sample; i < nsamples; i++) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
260 delta = ft[i].us_interval * 1000;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
261 if (delta > ave)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
262 delta = delta - ave;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
263 else
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
264 delta = ave - delta;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
265 ave_dev += delta;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
266 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
267 ave_dev /= total_samples;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
268
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
269 con_ave = 0;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
270 con_min = 0;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
271 for (i = start_sample; i < nsamples; i++) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
272 delta = ft[i].us_interval * 1000;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
273 if ((delta <= (ave+ave_dev)) && (delta >= (ave-ave_dev))) con_ave++;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
274 if ((delta <= (min+ave_dev)) && (delta >= (min-ave_dev))) con_min++;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
275 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
276 con_ave = (con_ave * 100) / total_samples;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
277 con_min = (con_min * 100) / total_samples;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
278
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
279 disable_clock_latency_measurement();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
280 show_ns(ave);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
281 show_ns(min);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
282 show_ns(max);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
283 show_ns(ave_dev);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
284 diag_printf(" %3d%% %3d%%", con_ave, con_min);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
285 diag_printf(" %s\n", title);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
286
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
287 CYG_ASSERT( ave <= max, "ave < max" );
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
288
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
289 enable_clock_latency_measurement();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
290 }
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 void
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
293 show_times(timing ft[], int nsamples, char *title)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
294 {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
295 show_times_detail(ft, nsamples, title, false);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
296 #ifdef STATS_WITHOUT_FIRST_SAMPLE
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
297 show_times_detail(ft, nsamples, "", true);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
298 #endif
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
299 }
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 #define WORKDIR MOUNTPOINT "/" "test"
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
304
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
305 #define NREADS 100
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
306 #define NBULKREADS 10
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
307 #define NBULKWRITES 10
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
308 #define NWRITES 30
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
309 #define NERASES 30
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
310
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
311 void show_test_parameters(cyg_nand_device *dev)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
312 {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
313 disable_clock_latency_measurement();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
314 diag_printf("\nTesting parameters:\n");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
315 diag_printf(" NAND reads: %5u\n", NREADS);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
316 if (NWRITES)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
317 diag_printf(" NAND writes: %5u\n", NWRITES);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
318 if (NERASES)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
319 diag_printf(" NAND erases: %5u\n", NERASES);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
320 if (NBULKREADS)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
321 diag_printf(" NAND bulk reads: %5u\n", NBULKREADS);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
322 if (NBULKWRITES)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
323 diag_printf(" NAND bulk writes: %5u\n", NBULKWRITES);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
324 diag_printf(" Device page size: %5u bytes\n"
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
325 " Device block size: %5u pages\n",
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
326 CYG_NAND_BYTES_PER_PAGE(dev),
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
327 CYG_NAND_PAGES_PER_BLOCK(dev) );
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
328
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
329 enable_clock_latency_measurement();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
330 }
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 cyg_nand_block_addr find_spare_block(cyg_nand_partition *part)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
333 {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
334 const int oobz = CYG_NAND_APPSPARE_PER_PAGE(part->dev);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
335 unsigned char oob[oobz];
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
336 int i,rv;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
337 cyg_nand_block_addr b;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
338
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
339 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
340 /* 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
341 * 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
342 * the device is worn out anyway. So fail the test. */
3017
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
343 cyg_nand_page_addr pg = CYG_NAND_BLOCK2PAGEADDR(part->dev, b);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
344 rv = cyg_nandp_read_page(part, pg, 0, oob, oobz);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
345 if (rv != 0) continue; // bad block?
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
346
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
347 for (i=0; i<oobz; i++)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
348 if (oob[i] != 0xff)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
349 goto next;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
350
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
351 // oob all FF: take it!
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
352 return b;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
353 next:
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
354 ;
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
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
357 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
358 }
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 CYG_BYTE databuf[CYGNUM_NAND_PAGEBUFFER], testbuf[CYGNUM_NAND_PAGEBUFFER];
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
361 timing ft_read[NREADS];
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
362 timing ft_write[NWRITES];
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
363 timing ft_erase[NERASES];
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
364 timing ft_bulkread[NBULKREADS];
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
365 timing ft_bulkwrite[NBULKWRITES];
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
366
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
367 int fails = 0;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
368
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
369 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
370 {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
371 cyg_nand_page_addr pgstart = CYG_NAND_BLOCK2PAGEADDR(part->dev, b),
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
372 pgend = CYG_NAND_BLOCK2PAGEADDR(part->dev, b+1)-1,
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
373 pg = pgstart;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
374 int i, rv;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
375 const int oobz = CYG_NAND_APPSPARE_PER_PAGE(part->dev);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
376 unsigned char oob[oobz];
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
377 #define ft ft_read
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
378
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
379 /* First, set up the block the way we want it ... */
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
380 cyg_nandp_erase_block(part, b);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
381 memcpy(oob, databuf, oobz);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
382 for (i=pgstart; i <= pgend; i++) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
383 rv = cyg_nandp_write_page(part, i, databuf, oob, oobz);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
384 switch (rv) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
385 case 0: break;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
386 case -EIO:
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
387 cyg_nandp_bbt_markbad(part, b);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
388 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
389
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
390 default:
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
391 diag_printf("Unexpected write failure: %d\n", rv);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
392 CYG_TEST_FAIL_FINISH("Pre-write failed");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
393 }
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 #define CLEARDATA() memset(testbuf, 0, sizeof testbuf)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
397 #define CHECKDATA() do { if (0 != memcmp(testbuf, databuf, sizeof testbuf)) { \
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
398 CYG_TEST_FAIL("readback check failed"); \
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
399 ++fails; \
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
400 break; \
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
401 } } while(0)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
402
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
403 #define CLEAROOB() memset(oob, 0, oobz)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
404 #define CHECKOOB() do { if (0 != memcmp(oob, databuf, oobz)) { \
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
405 CYG_TEST_FAIL("readback OOB check failed"); \
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
406 ++fails; \
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
407 break; \
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
408 } } while(0)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
409
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 for (i=0; i < NREADS; i++) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
412 CLEARDATA();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
413 wait_for_tick();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
414 get_timestamp(&ft[i].start);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
415 cyg_nandp_read_page(part, pg, testbuf, 0, 0);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
416 get_timestamp(&ft[i].end);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
417 CHECKDATA();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
418 ++pg;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
419 if (pg > pgend) pg = pgstart;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
420 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
421 show_times(ft, NREADS, "NAND page reads (page data only)");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
422
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
423 for (i=0; i < NREADS; i++) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
424 CLEAROOB();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
425 wait_for_tick();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
426 get_timestamp(&ft[i].start);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
427 cyg_nandp_read_page(part, pg, 0, oob, oobz);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
428 get_timestamp(&ft[i].end);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
429 CHECKOOB();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
430 ++pg;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
431 if (pg > pgend) pg = pgstart;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
432 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
433 show_times(ft, NREADS, "NAND page reads (OOB only)");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
434
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
435 for (i=0; i < NREADS; i++) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
436 CLEARDATA();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
437 CLEAROOB();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
438 wait_for_tick();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
439 get_timestamp(&ft[i].start);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
440 cyg_nandp_read_page(part, pg, testbuf, oob, oobz);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
441 get_timestamp(&ft[i].end);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
442 CHECKDATA();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
443 CHECKOOB();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
444 ++pg;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
445 if (pg > pgend) pg = pgstart;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
446 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
447 show_times(ft, NREADS, "NAND page reads (page + OOB)");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
448
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
449 #undef ft
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
450 #define ft ft_bulkread
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
451 for (i=0; i < NBULKREADS; i++) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
452 CLEARDATA();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
453 wait_for_tick();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
454 get_timestamp(&ft[i].start);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
455 for (pg = pgstart; pg <= pgend; pg++) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
456 cyg_nandp_read_page(part, pg, testbuf, 0, 0);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
457 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
458 get_timestamp(&ft[i].end);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
459 CHECKDATA();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
460 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
461 // report the results later.
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
462 #undef ft
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
463 cyg_nandp_erase_block(part, b);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
464 }
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 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
468 {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
469 cyg_nand_page_addr pgstart = CYG_NAND_BLOCK2PAGEADDR(part->dev, b),
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
470 pgend = CYG_NAND_BLOCK2PAGEADDR(part->dev, b+1)-1,
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
471 pg = pgstart;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
472 int i;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
473 const int oobz = CYG_NAND_APPSPARE_PER_PAGE(part->dev);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
474 unsigned char oob[oobz];
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
475 #define ft ft_write
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
476
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
477 cyg_nandp_erase_block(part, b);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
478 for (i=0; i < NWRITES; i++) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
479 wait_for_tick();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
480 get_timestamp(&ft[i].start);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
481 cyg_nandp_write_page(part, pg, databuf, databuf, oobz);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
482 get_timestamp(&ft[i].end);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
483
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
484 // Read it back to confirm
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
485 CLEARDATA();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
486 CLEAROOB();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
487 cyg_nandp_read_page(part, pg, testbuf, oob, oobz);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
488 CHECKDATA();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
489 CHECKOOB();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
490
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
491 ++pg;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
492 if (pg > pgend) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
493 cyg_nandp_erase_block(part, b);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
494 pg = pgstart;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
495 }
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 cyg_nandp_erase_block(part, b);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
498 show_times(ft, NWRITES, "NAND full-page writes");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
499
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
500 #undef ft
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
501 #define ft ft_bulkwrite
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
502 // 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
503 for (i=0; i < NBULKWRITES; i++) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
504 wait_for_tick();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
505 get_timestamp(&ft[i].start);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
506 for (pg = pgstart; pg <= pgend; pg++) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
507 cyg_nandp_write_page(part, pg, testbuf, 0, 0);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
508 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
509 get_timestamp(&ft[i].end);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
510 cyg_nandp_erase_block(part, b);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
511 }
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
512 // report later.
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
513 #undef ft
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
514 }
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 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
518 {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
519 int i;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
520 #define ft ft_erase
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
521
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
522 for (i=0; i < NERASES; i++) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
523 wait_for_tick();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
524 get_timestamp(&ft[i].start);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
525 cyg_nandp_erase_block(part, b);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
526 get_timestamp(&ft[i].end);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
527
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
528 if (i==0) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
529 cyg_nand_page_addr pg = CYG_NAND_BLOCK2PAGEADDR(part->dev, b);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
530 const int oobz = CYG_NAND_APPSPARE_PER_PAGE(part->dev);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
531 unsigned char oob[oobz];
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
532 int j;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
533 // 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
534 // to try writing out more dummy data each time.
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
535 CLEARDATA();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
536 CLEAROOB();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
537 cyg_nandp_read_page(part, pg, testbuf, oob, oobz);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
538 for (j=0; j < sizeof testbuf; j++) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
539 if (testbuf[j] != 0xff) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
540 CYG_TEST_FAIL("readback check failed");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
541 ++fails;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
542 break;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
543 }
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 for (j=0; j < oobz; j++) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
546 if (oob[j] != 0xff) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
547 CYG_TEST_FAIL("readback OOB check failed");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
548 ++fails;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
549 break;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
550 }
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 show_times(ft, NERASES, "NAND block erases");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
555 #undef ft
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
556 }
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 void rwbenchmark_main(void)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
561 {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
562 cyg_nand_device *dev;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
563 cyg_nand_partition *part;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
564 cyg_nand_block_addr block;
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
565
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
566 cyg_nand_lookup(DEVICE, &dev);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
567 if (!dev)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
568 CYG_TEST_FAIL_EXIT("can't get device "DEVICE);
3394
7905ed422fdf io/nand: Rename CYGINT_IO_NAND_TEST_PARTITION to CYGNUM_IO_NAND_TEST_PARTITION.
Ross Younger <wry@ecoscentric.com>
parents: 3387
diff changeset
569 part = cyg_nand_get_partition(dev, CYGNUM_IO_NAND_TEST_PARTITION);
3017
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
570 if (!part)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
571 CYG_TEST_FAIL_EXIT("can't get partition");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
572
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
573 block = find_spare_block(part);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
574 diag_printf("Using block %d\n",block);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
575
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
576 show_test_parameters(dev);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
577 show_times_hdr();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
578
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
579 // 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
580 test_reads(part, block);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
581
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
582 // Freshen our test data for the second phase
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
583 ar4prng_many(&rnd, databuf, sizeof databuf);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
584 test_writes(part,block);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
585
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
586 test_erases(part,block);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
587
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
588 show_times(ft_bulkread, NBULKREADS, "Bulk reads (block data)");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
589 show_times(ft_bulkwrite, NBULKWRITES, "Bulk writes (block data)");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
590 }
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 int main(void)
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
593 {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
594 CYG_TEST_INIT();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
595 init_timing();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
596
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
597 ar4prng_init(&rnd,_stext, _etext-_stext);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
598 ar4prng_many(&rnd, databuf, sizeof databuf);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
599
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 #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
602 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
603 #endif
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
604
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 rwbenchmark_main();
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
607
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
608 if (fails) {
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
609 diag_printf("There were %d failures.\n",fails);
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
610 CYG_TEST_FAIL_FINISH("something went wrong, THESE RESULTS ARE INVALID");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
611 }
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 CYG_TEST_PASS_FINISH("Benchmarking complete");
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
614 }
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 #endif
8502a048ad17 Update NAND to latest
Ross Younger <wry@ecoscentric.com>
parents:
diff changeset
617