4 * Copyright (c) 2009 Samsung Electronics.
5 * Contributed by Kirill Batuzov <batuzovk@ispras.ru>
8 /* Print all system information to stderr */
9 static __attribute__((unused)) void debug_sysinfo(const struct s5pc1xx_state_s *s)
11 fprintf(stderr, "CPU: %s\n", s->env->cpu_model_str);
12 fprintf(stderr, "SDRAM: %lu MB\n", s->sdram_size / (1024 * 1024));
13 fprintf(stderr, "SRAM: %lu KB\n", s->isram_size / 1024);
14 fprintf(stderr, "SROM: %lu KB\n", s->isrom_size / 1024);
18 /* Interrupt Controller */
20 #define ADDR 0xF2000F00
23 target_phys_addr_t vic_base[] = {
24 S5PC1XX_VIC0_BASE, S5PC1XX_VIC1_BASE, S5PC1XX_VIC2_BASE, S5PC1XX_VIC3_BASE
28 enable, disable, swint, swclear, select_irq, selclear, priomask, daisyprio
32 static __attribute__((unused)) void test_irq_handler(void *opaque, int irq,
43 fprintf(stderr, "%s was raised\n", name);
46 static __attribute__((unused)) qemu_irq *test_irq_init(void)
48 return qemu_allocate_irqs(test_irq_handler, NULL, 2);
51 static __attribute__((unused)) uint32_t test_irq_op(irq_op op, int irq,
52 int is_wr, uint32_t val)
54 int vic_id = irq / S5PC1XX_VIC_SIZE;
56 target_phys_addr_t base = vic_base[vic_id];
57 target_phys_addr_t off;
86 if (op == priomask || op == daisyprio || !is_wr) {
88 cpu_physical_memory_write(base + off, (uint8_t *)&val, 4);
90 cpu_physical_memory_read(base + off, (uint8_t *)&res, 4);
94 if (op == select_irq || op == selclear)
95 cpu_physical_memory_read(base + off, (uint8_t *)&res, 4);
97 res |= 1 << (irq % S5PC1XX_VIC_SIZE);
98 else if (op == selclear)
99 res &= ~(1 << (irq % S5PC1XX_VIC_SIZE));
101 res = 1 << (irq % S5PC1XX_VIC_SIZE);
102 cpu_physical_memory_write(base + off, (uint8_t *)&res, 4);
106 static __attribute__((unused)) void test_irq_script(struct s5pc1xx_state_s *s)
110 fprintf(stderr,"Step 1: Interrupts disabled. Raising and lowering them.\n");
111 qemu_irq_raise(s5pc1xx_get_irq(s, 14));
112 qemu_irq_raise(s5pc1xx_get_irq(s, 33));
113 qemu_irq_lower(s5pc1xx_get_irq(s, 14));
114 qemu_irq_lower(s5pc1xx_get_irq(s, 33));
115 qemu_irq_raise(s5pc1xx_get_irq(s, 69));
116 qemu_irq_lower(s5pc1xx_get_irq(s, 69));
117 qemu_irq_raise(s5pc1xx_get_irq(s, 101));
119 fprintf(stderr, "Step 2: Interrupt 101 is raised. Enable some other.\n");
120 test_irq_op(enable, 4, 1, 0);
121 test_irq_op(enable, 34, 1, 0);
122 test_irq_op(enable, 5, 1, 0);
124 fprintf(stderr, "Step 3: Interrupt 101 is raised. Enable it.\n");
126 cpu_physical_memory_write(0xF2300114, (const uint8_t *)&res, 4);
127 test_irq_op(enable, 101, 1, 0);
128 cpu_physical_memory_read(ADDR, (uint8_t *)&res, 4);
129 fprintf(stderr, "Interrupt 101 vector is %x\n", res);
130 qemu_irq_raise(s5pc1xx_get_irq(s, 5));
131 fprintf(stderr, "Step 4: Interrupt 101 has been acknoledged. "
132 "Interrupt 5 has been raised.\n");
134 fprintf(stderr, "Step 5: Generate IRQ 4 with higher priority.\n");
136 cpu_physical_memory_write(0xF2000210, (const uint8_t *)&res, 4);
138 cpu_physical_memory_write(0xF2000110, (const uint8_t *)&res, 4);
139 qemu_irq_raise(s5pc1xx_get_irq(s, 4));
141 fprintf(stderr, "Step 6: Acknoledge IRQ 4. Then lower it.\n");
142 cpu_physical_memory_read(ADDR, (uint8_t *)&res, 4);
143 fprintf(stderr, "Interrupt 4 vector is %x\n", res);
144 qemu_irq_lower(s5pc1xx_get_irq(s, 4));
146 fprintf(stderr, "Step 7: Finalize IRQ 4 processing. No new interrupts "
147 "should appear as IRQ 101 is in progress.\n");
148 cpu_physical_memory_write(ADDR, (const uint8_t *)&res, 4);
150 fprintf(stderr, "Step 8: Mask IRQ 4's priority, then raise it again.\n");
151 test_irq_op(priomask, 0, 1, 0xffff & ~(1 << 0xa));
152 qemu_irq_raise(s5pc1xx_get_irq(s, 4));
154 fprintf(stderr, "Step 9: Finalize IRQ 101 processing. "
155 "We should recive IRQ 5.\n");
157 cpu_physical_memory_write(0xF2000114, (const uint8_t *)&res, 4);
158 qemu_irq_lower(s5pc1xx_get_irq(s, 101));
159 cpu_physical_memory_write(ADDR, (const uint8_t *)&res, 4);
160 cpu_physical_memory_read(ADDR, (uint8_t *)&res, 4);
161 fprintf(stderr, "Interrupt 5 vector is %x\n", res);
163 fprintf(stderr, "Step 10: Finalize IRQs. Clear them all.\n");
164 qemu_irq_lower(s5pc1xx_get_irq(s, 5));
165 qemu_irq_lower(s5pc1xx_get_irq(s, 4));
166 cpu_physical_memory_write(ADDR, (const uint8_t *)&res, 4);
172 #define DATA_ADDR 0x20010000
173 #define RESULT_ADDR 0x20020000
174 #define PROG_ADDR 0x20030000
176 #define DBGGO_ADDR 0xFA200D04
177 #define DBG0_ADDR 0xFA200D08
178 #define DBG1_ADDR 0xFA200D0C
180 #define FSC_ADDR 0xFA200034
181 #define FTC1_ADDR 0xFA200044
182 #define CPC1_ADDR 0xFA20010C
185 uint32_t dbg0 = 0x01A00000;
186 uint32_t dbg1 = PROG_ADDR;
187 uint32_t dbggo = 0x0;
188 uint32_t dbgkill = 0x00010101;
190 static const uint8_t dma_data[] = {
191 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
192 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
193 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
197 static const uint8_t dma_stz[] = {
198 0xBC, 0x00, 0x00, 0x00, 0x01, 0x20, /* DMAMOV SAR 0x20010000 */
199 0xBC, 0x02, 0x00, 0x00, 0x02, 0x20, /* DMAMOV DAR 0x20020000 */
200 0xBC, 0x01, 0x35, 0x40, 0x0D, 0x00, /* DMAMOV CCR SAI SS4 SB4 DAI DS4 DB4 */
205 static const uint8_t dma_stzlp[] = {
206 0xBC, 0x00, 0x00, 0x00, 0x01, 0x20, /* DMAMOV SAR 0x20010000 */
207 0xBC, 0x02, 0x00, 0x00, 0x02, 0x20, /* DMAMOV DAR 0x20020000 */
208 0xBC, 0x01, 0x35, 0x40, 0x0D, 0x00, /* DMAMOV CCR SAI SS4 SB4 DAI DS4 DB4 */
209 0x20, 0x01, /* DMALP 2 */
211 0x38, 0x01, /* DMALPEND */
215 static const uint8_t dma_copy[] = {
216 0xBC, 0x00, 0x00, 0x00, 0x01, 0x20, /* DMAMOV SAR 0x20010000 */
217 0xBC, 0x02, 0x00, 0x00, 0x02, 0x20, /* DMAMOV DAR 0x20020000 */
218 0xBC, 0x01, 0x35, 0x40, 0x0D, 0x00, /* DMAMOV CCR SAI SS4 SB4 DAI DS4 DB4 */
219 0x20, 0x01, /* DMALP 2 */
222 0x38, 0x02, /* DMALPEND */
226 /* Paradoxically but this should work correctly too. */
227 static const uint8_t dma_copy_2[] = {
228 0xBC, 0x00, 0x00, 0x00, 0x01, 0x20, /* DMAMOV SAR 0x20010000 */
229 0xBC, 0x02, 0x00, 0x00, 0x02, 0x20, /* DMAMOV DAR 0x20020000 */
230 0xBC, 0x01, 0x35, 0x40, 0x0D, 0x00, /* DMAMOV CCR SAI SS4 SB4 DAI DS4 DB4 */
231 0x20, 0x01, /* DMALP 2 */
234 0x38, 0x02, /* DMALPEND */
238 static const uint8_t dma_scatter[] = {
239 0xBC, 0x00, 0x00, 0x00, 0x01, 0x20, /* DMAMOV SAR 0x20010000 */
240 0xBC, 0x02, 0x00, 0x00, 0x02, 0x20, /* DMAMOV DAR 0x20020000 */
241 0xBC, 0x01, 0x34, 0x40, 0x0D, 0x00, /* DMAMOV CCR SAF SS4 SB4 DAI DS4 DB4 */
242 0x20, 0x01, /* DMALP 2 */
245 0x38, 0x02, /* DMALPEND */
249 static const uint8_t dma_gather[] = {
250 0xBC, 0x00, 0x00, 0x00, 0x01, 0x20, /* DMAMOV SAR 0x20010000 */
251 0xBC, 0x02, 0x00, 0x00, 0x02, 0x20, /* DMAMOV DAR 0x20020000 */
252 0xBC, 0x01, 0x35, 0x00, 0x0D, 0x00, /* DMAMOV CCR SAI SS4 SB4 DAF DS4 DB4 */
253 0x20, 0x01, /* DMALP 2 */
256 0x38, 0x02, /* DMALPEND */
260 /* Watchdog abort at DMAEND */
261 static const uint8_t dma_nold[] = {
262 0xBC, 0x00, 0x00, 0x00, 0x01, 0x20, /* DMAMOV SAR 0x20010000 */
263 0xBC, 0x02, 0x00, 0x00, 0x02, 0x20, /* DMAMOV DAR 0x20020000 */
264 0xBC, 0x01, 0x34, 0x00, 0x0D, 0x00, /* DMAMOV CCR SAF SS4 SB4 DAF DS4 DB4 */
270 /* Watchdog abort at DMAEND */
271 static const uint8_t dma_nost[] = {
272 0xBC, 0x00, 0x00, 0x00, 0x01, 0x20, /* DMAMOV SAR 0x20010000 */
273 0xBC, 0x02, 0x00, 0x00, 0x02, 0x20, /* DMAMOV DAR 0x20020000 */
274 0xBC, 0x01, 0x34, 0x00, 0x0D, 0x00, /* DMAMOV CCR SAF SS4 SB4 DAF DS4 DB4 */
280 /* Watchdog abort at DMALD */
281 static const uint8_t dma_ldfe[] = {
282 0xBC, 0x00, 0x00, 0x00, 0x01, 0x20, /* DMAMOV SAR 0x20010000 */
283 0xBC, 0x02, 0x00, 0x00, 0x02, 0x20, /* DMAMOV DAR 0x20020000 */
284 0xBC, 0x01, 0x34, 0x00, 0x0D, 0x00, /* DMAMOV CCR SAF SS4 SB4 DAF DS4 DB4 */
287 0x28, 0x01, /* DMALPEND */
291 /* Watchdog abort at DMAST */
292 static const uint8_t dma_stfe[] = {
293 0xBC, 0x00, 0x00, 0x00, 0x01, 0x20, /* DMAMOV SAR 0x20010000 */
294 0xBC, 0x02, 0x00, 0x00, 0x02, 0x20, /* DMAMOV DAR 0x20020000 */
295 0xBC, 0x01, 0x34, 0x00, 0x0D, 0x00, /* DMAMOV CCR SAF SS4 SB4 DAF DS4 DB4 */
298 0x28, 0x01, /* DMALPEND */
303 static inline void dma_exec_dbg(const uint8_t *prog, int size)
305 cpu_physical_memory_write(PROG_ADDR, prog, size);
306 cpu_physical_memory_write(DBG0_ADDR, (uint8_t *)&dbg0, 4);
307 cpu_physical_memory_write(DBG1_ADDR, (uint8_t *)&dbg1, 4);
308 cpu_physical_memory_write(DBGGO_ADDR, (uint8_t *)&dbggo, 4);
311 static inline void dma_kill_dbg(void)
313 uint32_t zeroval = 0x0;
315 cpu_physical_memory_write(DBG0_ADDR, (uint8_t *)&dbgkill, 4);
316 cpu_physical_memory_write(DBG1_ADDR, (uint8_t *)&zeroval, 4);
317 cpu_physical_memory_write(DBGGO_ADDR, (uint8_t *)&dbggo, 4);
320 static __attribute__((unused)) void test_dma_script(struct s5pc1xx_state_s *s)
327 cpu_physical_memory_write(DATA_ADDR, dma_data, 32);
330 cpu_physical_memory_write(RESULT_ADDR, dma_data, 32);
331 dma_exec_dbg(dma_stz, 20);
333 cpu_physical_memory_read(RESULT_ADDR, res, 16);
334 for (i = 0; i < 16; i++) {
340 fprintf(stderr, "DMA test 1: DMASTZ. FAILED\n");
342 fprintf(stderr, "DMA test 1: DMASTZ. OK\n");
346 cpu_physical_memory_write(RESULT_ADDR, dma_data, 32);
347 dma_exec_dbg(dma_stzlp, 24);
349 cpu_physical_memory_read(RESULT_ADDR, res, 32);
350 for (i = 0; i < 32; i++) {
356 fprintf(stderr, "DMA test 2: DMASTZ in loop. FAILED\n");
358 fprintf(stderr, "DMA test 2: DMASTZ in loop. OK\n");
362 dma_exec_dbg(dma_stzlp, 24);
363 dma_exec_dbg(dma_copy, 25);
365 cpu_physical_memory_read(RESULT_ADDR, res, 32);
366 for (i = 0; i < 32; i++) {
367 if (res[i] != dma_data[i]) {
372 fprintf(stderr, "DMA test 3: DMA copy of 32 bytes of data. FAILED\n");
374 fprintf(stderr, "DMA test 3: DMA copy of 32 bytes of data. OK\n");
378 dma_exec_dbg(dma_stzlp, 24);
379 dma_exec_dbg(dma_copy_2, 25);
381 cpu_physical_memory_read(RESULT_ADDR, res, 32);
382 for (i = 0; i < 32; i++) {
383 if (res[i] != dma_data[i]) {
388 fprintf(stderr, "DMA test 4: DMA copy of 32 bytes of data (store before load). FAILED\n");
390 fprintf(stderr, "DMA test 4: DMA copy of 32 bytes of data (store before load). OK\n");
394 dma_exec_dbg(dma_stzlp, 24);
395 dma_exec_dbg(dma_scatter, 25);
397 cpu_physical_memory_read(RESULT_ADDR, res, 32);
398 for (i = 0; i < 32; i++) {
399 if (res[i] != dma_data[i % 4]) {
404 fprintf(stderr, "DMA test 5: DMA scatter. FAILED\n");
406 fprintf(stderr, "DMA test 5: DMA scatter. OK\n");
410 dma_exec_dbg(dma_stzlp, 24);
411 dma_exec_dbg(dma_gather, 25);
413 cpu_physical_memory_read(RESULT_ADDR, res, 32);
414 for (i = 0; i < 32; i++) {
415 if (res[i] != ((i > 3) ? 0 : dma_data[28 + i])) {
420 fprintf(stderr, "DMA test 6: DMA gather. FAILED\n");
422 fprintf(stderr, "DMA test 6: DMA gather. OK\n");
426 dma_exec_dbg(dma_stzlp, 24);
427 dma_exec_dbg(dma_nost, 21);
429 cpu_physical_memory_read(FSC_ADDR, (uint8_t *)®, 4);
433 cpu_physical_memory_read(FTC1_ADDR, (uint8_t *)®, 4);
434 if (reg != ((unsigned)1 << 31)) {
437 cpu_physical_memory_read(CPC1_ADDR, (uint8_t *)®, 4);
438 if (reg != PROG_ADDR + 20) {
442 cpu_physical_memory_read(FSC_ADDR, (uint8_t *)®, 4);
447 fprintf(stderr, "DMA test 7: DMALD without DMAST. FAILED\n");
449 fprintf(stderr, "DMA test 7: DMALD without DMAST. OK\n");
453 dma_exec_dbg(dma_stzlp, 24);
454 dma_exec_dbg(dma_nold, 21);
456 cpu_physical_memory_read(FSC_ADDR, (uint8_t *)®, 4);
460 cpu_physical_memory_read(FTC1_ADDR, (uint8_t *)®, 4);
461 if (reg != ((unsigned)1 << 31)) {
464 cpu_physical_memory_read(CPC1_ADDR, (uint8_t *)®, 4);
465 if (reg != PROG_ADDR + 20) {
469 cpu_physical_memory_read(FSC_ADDR, (uint8_t *)®, 4);
474 fprintf(stderr, "DMA test 8: DMAST without DMALD. FAILED\n");
476 fprintf(stderr, "DMA test 8: DMAST without DMALD. OK\n");
480 dma_exec_dbg(dma_stzlp, 24);
481 dma_exec_dbg(dma_ldfe, 22);
483 cpu_physical_memory_read(FSC_ADDR, (uint8_t *)®, 4);
487 cpu_physical_memory_read(FTC1_ADDR, (uint8_t *)®, 4);
488 if (reg != ((unsigned)1 << 31)) {
491 cpu_physical_memory_read(CPC1_ADDR, (uint8_t *)®, 4);
492 if (reg != PROG_ADDR + 18) {
496 cpu_physical_memory_read(FSC_ADDR, (uint8_t *)®, 4);
501 fprintf(stderr, "DMA test 9: DMALD in infinite loop. FAILED\n");
503 fprintf(stderr, "DMA test 9: DMALD in infinite loop. OK\n");
507 dma_exec_dbg(dma_stzlp, 24);
508 dma_exec_dbg(dma_stfe, 22);
510 cpu_physical_memory_read(FSC_ADDR, (uint8_t *)®, 4);
514 cpu_physical_memory_read(FTC1_ADDR, (uint8_t *)®, 4);
515 if (reg != ((unsigned)1 << 31)) {
518 cpu_physical_memory_read(CPC1_ADDR, (uint8_t *)®, 4);
519 if (reg != PROG_ADDR + 18) {
523 cpu_physical_memory_read(FSC_ADDR, (uint8_t *)®, 4);
528 fprintf(stderr, "DMA test 10: DMAST in infinite loop. FAILED\n");
530 fprintf(stderr, "DMA test 10: DMAST in infinite loop. OK\n");
537 #define TRSTATUS_ADDR 0xE2900810
538 #define FIFOCTL_ADDR 0xE2900808
539 #define TRANSMIT_ADDR 0xE2900820
540 #define RECIVE_ADDR 0xE2900824
543 static const char *hello = "Hello world!\n";
544 static char buf[256];
547 static __attribute__((unused)) void test_uart_script(void)
554 cpu_physical_memory_write(FIFOCTL_ADDR, (uint8_t *)&res, 4);
555 cpu_physical_memory_read(TRSTATUS_ADDR, (uint8_t *)&res, 4);
557 fprintf(stderr, "Error: UART2 transmitter is not ready!\n");
561 cpu_physical_memory_write(TRANSMIT_ADDR, (uint8_t *)s, 1);
568 cpu_physical_memory_read(TRSTATUS_ADDR, (uint8_t *)&res, 4);
573 fprintf(stderr, "Error: UART2 too many input data!\n");
576 cpu_physical_memory_read(RECIVE_ADDR, (uint8_t *)s, 1);
580 fprintf (stderr, "Read data: %s\n", s);