Nugget
Bare-metal libraries and examples for the original PlayStation
Loading...
Searching...
No Matches
spu-transfer.c
Go to the documentation of this file.
1// ==========================================================================
2// Validate DMA transfer between Main Memory and SPU
3// ==========================================================================
4
5CESTER_TEST(transfer_via_dma, spu_tests,
6 int fail_count = 0;
7 const uint32_t addrs[3] = { 0x01040, 0x40000, 0x7fec0 };
8 const uint8_t seeds[3] = { 0x11, 0x22, 0x33 };
9
10 for (int t = 0; t < 3; t++) {
12
13 for (int i = 0; i < 256; i++) s_readback[i] = (uint8_t)(seeds[t] ^ (i * 7));
14 for (int i = 256; i < 320; i++) s_readback[i] = 0xaa;
15 spu_write_sync(addrs[t], s_readback, 320);
16
17 for (int i = 0; i < 256; i++) s_readback[i] = 0xCC;
18 spu_read_sync(addrs[t], s_readback, 256);
19
20 int local_fail = 0;
21 for (int i = 0; i < 256; i++) {
22 uint8_t expected = (uint8_t)(seeds[t] ^ (i * 7));
23 if (s_readback[i] != expected) local_fail++;
24 }
25 fail_count += local_fail;
26 }
27 cester_assert_int_eq(fail_count, 0);
28)
29
30CESTER_TEST(transfer_to_reserved_sdk_region, spu_tests,
31 // PSY-Q SDK claims 0x1000-0x100F is reserved
33 for (int i = 0; i < 128; i++) s_upload[i] = (uint8_t)(0xa5 ^ i);
34 spu_write_sync(0x1000, s_upload, 128);
36 spu_read_sync(0x1000, s_readback, 0x80);
37
39 for (int i = 0; i < 0x10; i++)
40 if (s_readback[i] == s_upload[i]) matches_reserved++;
42 for (int i = 0x10; i < 0x40; i++)
43 if (s_readback[i] == s_upload[i]) matches_after++;
46)
47
48CESTER_TEST(transfer_to_capture_region, spu_tests,
50 spu_busy_wait(2000000);
51
52 spu_read_sync(0x0000, s_readback, 0x1000);
53 unsigned nonzero_silenced = 0;
54 for (int i = 0; i < 0x1000; i++) if (s_readback[i] != 0) nonzero_silenced++;
55 cester_assert_uint_eq(0, nonzero_silenced);
56
57 for (int i = 0; i < 0x1000; i++) s_readback[i] = (uint8_t)(0x55 ^ (i & 0xff));
58 spu_write_sync(0x0000, s_readback, 0x1000);
59 spu_busy_wait(2000000);
60
61 static uint8_t s_phase3[0x1000] __attribute__((aligned(4)));
62 spu_read_sync(0x0000, s_phase3, 0x1000);
63 unsigned matches = 0;
64 for (int i = 0; i < 0x1000; i++)
65 if (s_phase3[i] == (uint8_t)(0x55 ^ (i & 0xff))) matches++;
67)
cester_assert_uint_eq(5, cause1)
__attribute__((weak))
Definition clz.c:56
uint32_t t
Definition cop0.c:79
int matches
Definition dcache.c:706
int i
Definition gte-regio.c:297
cester_assert_uint_le(readyCount, 2)
int matches_reserved
Definition spu-transfer.c:38
spu_write_sync(0x1000, s_upload, 128)
int matches_after
Definition spu-transfer.c:41
spu_tests
Definition spu-transfer.c:30
cester_assert_int_eq(matches_reserved, 16)
CESTER_TEST(transfer_via_dma, spu_tests, int fail_count=0;const uint32_t addrs[3]={ 0x01040, 0x40000, 0x7fec0 };const uint8_t seeds[3]={ 0x11, 0x22, 0x33 };for(int t=0;t< 3;t++) { spu_reset_quiet();for(int i=0;i< 256;i++) s_readback[i]=(uint8_t)(seeds[t] ^(i *7));for(int i=256;i< 320;i++) s_readback[i]=0xaa;spu_write_sync(addrs[t], s_readback, 320);for(int i=0;i< 256;i++) s_readback[i]=0xCC;spu_read_sync(addrs[t], s_readback, 256);int local_fail=0;for(int i=0;i< 256;i++) { uint8_t expected=(uint8_t)(seeds[t] ^(i *7));if(s_readback[i] !=expected) local_fail++;} fail_count+=local_fail;} cester_assert_int_eq(fail_count, 0);) CESTER_TEST(transfer_to_reserved_sdk_region
spu_busy_wait(500000)
spu_reset_quiet()
spu_read_sync(0x1000, s_readback, 0x80)
void uint32_t(classId, spec)