@@ -361,6 +361,104 @@ CESTER_TEST(normal_dma_odd_address, dma_tests,
361
361
cester_assert_uint_eq (0x00840000 , dicr );
362
362
)
363
363
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
+
364
462
CESTER_TEST (linked_dma_ffffff_terminator , dma_tests ,
365
463
sendGPUStatus (0 );
366
464
sendGPUStatus (0x04000001 );
0 commit comments