Skip to content

Commit 51f5c50

Browse files
authored
Adding more dma tests.
More linked DMA tests.
1 parent 8df902d commit 51f5c50

File tree

1 file changed

+98
-0
lines changed

1 file changed

+98
-0
lines changed

src/mips/tests/dma/dma.c

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,104 @@ CESTER_TEST(normal_dma_odd_address, dma_tests,
361361
cester_assert_uint_eq(0x00840000, dicr);
362362
)
363363

364+
CESTER_TEST(linked_dma_3_links, dma_tests,
365+
sendGPUStatus(0);
366+
sendGPUStatus(0x04000001);
367+
sendGPUData(0xe1000000);
368+
DPCR = 0x00000800;
369+
DICR = 0x00840000;
370+
IMASK = IRQ_VBLANK | IRQ_DMA;
371+
uint32_t cmd1[2] = { 0x01000000, 0x00000000 };
372+
uint32_t cmd2[2] = { 0x01000000, 0x00000000 };
373+
uint32_t cmd3[2] = { 0x01ffffff, 0xe1000555 };
374+
cmd1[0] = (((uint32_t)&cmd2) & 0xffffff) | 0x01000000;
375+
cmd2[0] = (((uint32_t)&cmd3) & 0xffffff) | 0x01000000;
376+
sendGPUStatus(0x04000002);
377+
while ((GPU_STATUS & 0x10000000) == 0);
378+
DMA_CTRL[DMA_GPU].MADR = (uintptr_t)&cmd1;
379+
DMA_CTRL[DMA_GPU].BCR = 0x12345678;
380+
DMA_CTRL[DMA_GPU].CHCR = 0x01000401;
381+
unsigned count = 0;
382+
unsigned timeout = 0;
383+
while (1) {
384+
while ((IREG & (IRQ_VBLANK | IRQ_DMA)) == 0);
385+
if (IREG & IRQ_DMA) break;
386+
IREG &= ~IRQ_VBLANK;
387+
if (count++ == 128) {
388+
timeout = 1;
389+
break;
390+
}
391+
}
392+
IREG = 0;
393+
uint32_t stat = GPU_STATUS & 0x000007ff;
394+
uintptr_t bcr = DMA_CTRL[DMA_GPU].BCR;
395+
uint32_t madr = DMA_CTRL[DMA_GPU].MADR;
396+
uint32_t chcr = DMA_CTRL[DMA_GPU].CHCR;
397+
uint32_t dicr = DICR;
398+
cester_assert_uint_eq(0, timeout);
399+
cester_assert_uint_eq(0, s_got40);
400+
cester_assert_uint_eq(0, s_got80);
401+
cester_assert_uint_eq(0, s_from);
402+
cester_assert_uint_eq(0, s_epc);
403+
cester_assert_uint_eq(0x555, stat);
404+
cester_assert_uint_eq(0x12345678, bcr);
405+
cester_assert_uint_eq(0x00ffffff, madr);
406+
cester_assert_uint_eq(0x00000401, chcr);
407+
cester_assert_uint_eq(0x84840000, dicr);
408+
DICR = (dicr & ~0x7f000000) | 0x04000000;
409+
dicr = DICR;
410+
cester_assert_uint_eq(0x00840000, dicr);
411+
)
412+
413+
CESTER_TEST(linked_dma_3_oddlinks, dma_tests,
414+
sendGPUStatus(0);
415+
sendGPUStatus(0x04000001);
416+
sendGPUData(0xe1000000);
417+
DPCR = 0x00000800;
418+
DICR = 0x00840000;
419+
IMASK = IRQ_VBLANK | IRQ_DMA;
420+
uint32_t cmd1[2] = { 0x01000000, 0x00000000 };
421+
uint32_t cmd2[2] = { 0x01000000, 0x00000000 };
422+
uint32_t cmd3[2] = { 0x01ffffff, 0xe1000555 };
423+
cmd1[0] = (((uint32_t)&cmd2) & 0xffffff) | 0x01000003;
424+
cmd2[0] = (((uint32_t)&cmd3) & 0xffffff) | 0x01000003;
425+
sendGPUStatus(0x04000002);
426+
while ((GPU_STATUS & 0x10000000) == 0);
427+
DMA_CTRL[DMA_GPU].MADR = (uintptr_t)&cmd1;
428+
DMA_CTRL[DMA_GPU].BCR = 0x12345678;
429+
DMA_CTRL[DMA_GPU].CHCR = 0x01000401;
430+
unsigned count = 0;
431+
unsigned timeout = 0;
432+
while (1) {
433+
while ((IREG & (IRQ_VBLANK | IRQ_DMA)) == 0);
434+
if (IREG & IRQ_DMA) break;
435+
IREG &= ~IRQ_VBLANK;
436+
if (count++ == 128) {
437+
timeout = 1;
438+
break;
439+
}
440+
}
441+
IREG = 0;
442+
uint32_t stat = GPU_STATUS & 0x000007ff;
443+
uintptr_t bcr = DMA_CTRL[DMA_GPU].BCR;
444+
uint32_t madr = DMA_CTRL[DMA_GPU].MADR;
445+
uint32_t chcr = DMA_CTRL[DMA_GPU].CHCR;
446+
uint32_t dicr = DICR;
447+
cester_assert_uint_eq(0, timeout);
448+
cester_assert_uint_eq(0, s_got40);
449+
cester_assert_uint_eq(0, s_got80);
450+
cester_assert_uint_eq(0, s_from);
451+
cester_assert_uint_eq(0, s_epc);
452+
cester_assert_uint_eq(0x555, stat);
453+
cester_assert_uint_eq(0x12345678, bcr);
454+
cester_assert_uint_eq(0x00ffffff, madr);
455+
cester_assert_uint_eq(0x00000401, chcr);
456+
cester_assert_uint_eq(0x84840000, dicr);
457+
DICR = (dicr & ~0x7f000000) | 0x04000000;
458+
dicr = DICR;
459+
cester_assert_uint_eq(0x00840000, dicr);
460+
)
461+
364462
CESTER_TEST(linked_dma_ffffff_terminator, dma_tests,
365463
sendGPUStatus(0);
366464
sendGPUStatus(0x04000001);

0 commit comments

Comments
 (0)