import migen in litex/gen
[litex.git] / litex / soc / misoc / software / memtest / main.c
1 #include <stdio.h>
2 #include <stdlib.h>
3
4 #include <irq.h>
5 #include <uart.h>
6 #include <time.h>
7 #include <generated/csr.h>
8 #include <generated/mem.h>
9 #include <hw/flags.h>
10 #include <console.h>
11 #include <system.h>
12
13 static unsigned int log2(unsigned int v)
14 {
15 unsigned int r;
16 r = 0;
17 while(v>>=1) r++;
18 return r;
19 }
20
21 static void membw_service(void)
22 {
23 static int last_event;
24 unsigned long long int nr, nw;
25 unsigned long long int f;
26 unsigned int rdb, wrb;
27 unsigned int dw;
28
29 if(elapsed(&last_event, identifier_frequency_read())) {
30 sdram_controller_bandwidth_update_write(1);
31 nr = sdram_controller_bandwidth_nreads_read();
32 nw = sdram_controller_bandwidth_nwrites_read();
33 f = identifier_frequency_read();
34 dw = sdram_controller_bandwidth_data_width_read();
35 rdb = (nr*f >> (24 - log2(dw)))/1000000ULL;
36 wrb = (nw*f >> (24 - log2(dw)))/1000000ULL;
37 printf("read:%5dMbps write:%5dMbps all:%5dMbps\n", rdb, wrb, rdb + wrb);
38 }
39 }
40
41 //#define DEBUG
42
43 static void memtest_service(void)
44 {
45 static unsigned int test_buffer[(MAIN_RAM_SIZE/2)/4] __attribute__((aligned(16)));
46 static unsigned char reading;
47 static unsigned int err, total_err;
48 #ifdef DEBUG
49 int i;
50 #endif
51
52 if(reading) {
53 if(!memtest_w_busy_read()) {
54 #ifdef DEBUG
55 flush_l2_cache();
56 flush_cpu_dcache();
57 printf("starting read\n");
58 for(i=0;i<64;i++) {
59 printf("%08x", test_buffer[i]);
60 if((i % 4) == 3)
61 printf("\n");
62 }
63 #endif
64 memtest_r_reset_write(1);
65 memtest_r_base_write((unsigned int)test_buffer);
66 memtest_r_length_write(sizeof(test_buffer));
67 memtest_r_shoot_write(1);
68 reading = 0;
69 }
70 } else {
71 if(!memtest_r_busy_read()) {
72 err = memtest_r_error_count_read();
73 total_err += err;
74 printf("err=%d\t\ttotal=%d\n", err, total_err);
75 memtest_w_reset_write(1);
76 memtest_w_base_write((unsigned int)test_buffer);
77 memtest_w_length_write(sizeof(test_buffer));
78 memtest_w_shoot_write(1);
79 reading = 1;
80 }
81 }
82 }
83
84 int main(void)
85 {
86 irq_setmask(0);
87 irq_setie(1);
88 uart_init();
89
90 puts("Memory testing software built "__DATE__" "__TIME__"\n");
91
92 if((memtest_w_magic_read() != 0x361f) || (memtest_r_magic_read() != 0x361f)) {
93 printf("Memory test cores not detected\n");
94 while(1);
95 }
96
97 time_init();
98
99 flush_l2_cache();
100 while(1) {
101 memtest_service();
102 membw_service();
103 }
104
105 return 0;
106 }