1 // SPDX-License-Identifier: MIT
17 #include <sys/types.h>
19 #include <sys/ioctl.h>
21 #include "gpio/ps_protocol.h"
22 #include "platforms/amiga/gayle-ide/ide.h"
24 #define SIZE_KILO 1024
25 #define SIZE_MEGA (1024 * 1024)
26 #define SIZE_GIGA (1024 * 1024 * 1024)
28 uint8_t garbege_datas[2 * SIZE_MEGA];
35 uint8_t loop_tests = 0, total_errors = 0;
37 void sigint_handler(int sig_num) {
38 printf("Received sigint %d, exiting.\n", sig_num);
39 printf("Total number of transaction errors occured: %d\n", total_errors);
46 int main(int argc, char *argv[]) {
47 uint32_t test_size = 512 * SIZE_KILO, cur_loop = 0;
49 clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &f2);
50 srand((unsigned int)f2.tv_nsec);
52 signal(SIGINT, sigint_handler);
55 ps_reset_state_machine();
60 write8(0xbfe201, 0x0101); //CIA OVL
61 write8(0xbfe001, 0x0000); //CIA OVL LOW
64 test_size = atoi(argv[1]) * SIZE_KILO;
65 if (test_size == 0 || test_size > 2 * SIZE_MEGA) {
66 test_size = 512 * SIZE_KILO;
68 printf("Testing %d KB of memory.\n", test_size / SIZE_KILO);
70 if (strcmp(argv[2], "l") == 0) {
71 printf("Looping tests.\n");
78 printf("Writing garbege datas.\n");
79 for (uint32_t i = 0; i < test_size; i++) {
80 while(garbege_datas[i] == 0x00)
81 garbege_datas[i] = (uint8_t)(rand() % 0xFF);
82 write8(i, (uint32_t)garbege_datas[i]);
85 printf("Reading back garbege datas, read8()...\n");
86 for (uint32_t i = 0; i < test_size; i++) {
87 uint32_t c = read8(i);
88 if (c != garbege_datas[i]) {
90 printf("READ8: Garbege data mismatch at $%.6X: %.2X should be %.2X.\n", i, c, garbege_datas[i]);
94 printf("read8 errors total: %d.\n", errors);
95 total_errors += errors;
99 printf("Reading back garbege datas, read16(), even addresses...\n");
100 for (uint32_t i = 0; i < (test_size) - 2; i += 2) {
101 uint32_t c = be16toh(read16(i));
102 if (c != *((uint16_t *)&garbege_datas[i])) {
104 printf("READ16_EVEN: Garbege data mismatch at $%.6X: %.4X should be %.4X.\n", i, c, *((uint16_t *)&garbege_datas[i]));
108 printf("read16 even errors total: %d.\n", errors);
109 total_errors += errors;
113 printf("Reading back garbege datas, read16(), odd addresses...\n");
114 for (uint32_t i = 1; i < (test_size) - 2; i += 2) {
115 uint32_t c = be16toh((read8(i) << 8) | read8(i + 1));
116 if (c != *((uint16_t *)&garbege_datas[i])) {
118 printf("READ16_ODD: Garbege data mismatch at $%.6X: %.4X should be %.4X.\n", i, c, *((uint16_t *)&garbege_datas[i]));
122 printf("read16 odd errors total: %d.\n", errors);
126 printf("Reading back garbege datas, read32(), even addresses...\n");
127 for (uint32_t i = 0; i < (test_size) - 4; i += 2) {
128 uint32_t c = be32toh(read32(i));
129 if (c != *((uint32_t *)&garbege_datas[i])) {
131 printf("READ32_EVEN: Garbege data mismatch at $%.6X: %.8X should be %.8X.\n", i, c, *((uint32_t *)&garbege_datas[i]));
135 printf("read32 even errors total: %d.\n", errors);
136 total_errors += errors;
140 printf("Reading back garbege datas, read32(), odd addresses...\n");
141 for (uint32_t i = 1; i < (test_size) - 4; i += 2) {
142 uint32_t c = read8(i);
143 c |= (be16toh(read16(i + 1)) << 8);
144 c |= (read8(i + 3) << 24);
145 if (c != *((uint32_t *)&garbege_datas[i])) {
147 printf("READ32_ODD: Garbege data mismatch at $%.6X: %.8X should be %.8X.\n", i, c, *((uint32_t *)&garbege_datas[i]));
151 printf("read32 odd errors total: %d.\n", errors);
152 total_errors += errors;
156 printf("Clearing %d KB of Chip again\n", test_size / SIZE_KILO);
157 for (uint32_t i = 0; i < test_size; i++) {
158 write8(i, (uint32_t)0x0);
161 printf("[WORD] Writing garbege datas to Chip, unaligned...\n");
162 for (uint32_t i = 1; i < (test_size) - 2; i += 2) {
163 uint16_t v = *((uint16_t *)&garbege_datas[i]);
164 write8(i, (v & 0x00FF));
165 write8(i + 1, (v >> 8));
169 printf("Reading back garbege datas, read16(), odd addresses...\n");
170 for (uint32_t i = 1; i < (test_size) - 2; i += 2) {
171 uint32_t c = be16toh((read8(i) << 8) | read8(i + 1));
172 if (c != *((uint16_t *)&garbege_datas[i])) {
174 printf("READ16_ODD: Garbege data mismatch at $%.6X: %.4X should be %.4X.\n", i, c, *((uint16_t *)&garbege_datas[i]));
178 printf("read16 odd errors total: %d.\n", errors);
179 total_errors += errors;
182 printf("Clearing %d KB of Chip again\n", test_size / SIZE_KILO);
183 for (uint32_t i = 0; i < test_size; i++) {
184 write8(i, (uint32_t)0x0);
187 printf("[LONG] Writing garbege datas to Chip, unaligned...\n");
188 for (uint32_t i = 1; i < (test_size) - 4; i += 4) {
189 uint32_t v = *((uint32_t *)&garbege_datas[i]);
190 write8(i , v & 0x0000FF);
191 write16(i + 1, htobe16(((v & 0x00FFFF00) >> 8)));
192 write8(i + 3 , (v & 0xFF000000) >> 24);
196 printf("Reading back garbege datas, read32(), odd addresses...\n");
197 for (uint32_t i = 1; i < (test_size) - 4; i += 4) {
198 uint32_t c = read8(i);
199 c |= (be16toh(read16(i + 1)) << 8);
200 c |= (read8(i + 3) << 24);
201 if (c != *((uint32_t *)&garbege_datas[i])) {
203 printf("READ32_ODD: Garbege data mismatch at $%.6X: %.8X should be %.8X.\n", i, c, *((uint32_t *)&garbege_datas[i]));
207 printf("read32 odd errors total: %d.\n", errors);
208 total_errors += errors;
212 printf ("Loop %d done. Begin loop %d.\n", cur_loop + 1, cur_loop + 2);
213 printf ("Current total errors: %d.\n", total_errors);
220 void m68k_set_irq(unsigned int level) {
223 struct ide_controller *get_ide(int index) {