|
Nugget
|
#include "common/hardware/hwregs.h"#include "common/syscalls/syscalls.h"#include "exotic/cester.h"
Macros | |
| #define | PCSX_TESTS 0 |
| #define | CESTER_MAYBE_TEST CESTER_TEST |
| #define | CESTER_NO_SIGNAL |
| #define | CESTER_NO_TIME |
| #define | EXIT_SUCCESS 0 |
| #define | EXIT_FAILURE 1 |
| #define | BIU_BASE 0x0001e900u |
| #define | BIT_RAM (1u << 3) |
| #define | BIT_DS (1u << 7) |
| #define | DBLKSZ(n) (((n) & 3u) << 4) |
| #define | BIU_NORMAL (BIU_BASE | BIT_RAM | BIT_DS) |
| #define | BIU_RAM_ONLY (BIU_BASE | BIT_RAM) |
| #define | BIU_DS_ONLY(dblksz) (BIU_BASE | BIT_DS | DBLKSZ(dblksz)) |
| #define | BIU_NEITHER (BIU_BASE) |
| #define | SCRATCHPAD_BASE 0x1f800000u |
| #define | SCRATCHPAD_WORDS 256 |
| #define | TEST_DATA_KSEG0 0x80100000u |
| #define | TEST_DATA_KSEG1 0xa0100000u |
| #define | TEST_DATA_WORDS 1024 |
| #define | BASE_PATTERN 0x5a000000u |
| #define | SP_SLOT_FOR_WORD(wi) ((wi) & 0xffu) |
Functions | |
| CESTER_BODY (extern uint32_t dcache_get_biu(void);extern void dcache_set_biu(uint32_t value);extern uint32_t dcache_run_reads(uint32_t biu_value, uint32_t src, uint32_t count);extern uint32_t dcache_run_reads_strided(uint32_t biu_value, uint32_t src, uint32_t count, uint32_t stride);extern uint32_t dcache_run_reads_drained(uint32_t biu_value, uint32_t src, uint32_t count, uint32_t drain_nops);extern uint32_t dcache_run_reads_swc(uint32_t biu_value, uint32_t src, uint32_t count);extern void dcache_run_writes(uint32_t biu_value, uint32_t dst, uint32_t count, uint32_t base_pattern);extern uint32_t dcache_run_byte_reads(uint32_t biu_value, uint32_t src, uint32_t count);extern uint32_t dcache_run_half_reads(uint32_t biu_value, uint32_t src, uint32_t count);extern void dcache_run_writes_at_sp_addr(uint32_t biu_value, uint32_t sp_off, uint32_t count, uint32_t base);extern uint32_t dcache_run_reads_at_sp_addr(uint32_t biu_value, uint32_t sp_off, uint32_t count);extern void dcache_zero_scratchpad(void);extern void dcache_dump_scratchpad(uint32_t *out_256_words);extern void dcache_fill_pattern(uint32_t dst, uint32_t count, uint32_t base_pattern);static int s_interruptsWereEnabled;static uint32_t s_dump;static int sp_nonzero_count(const uint32_t *dump) { int n=0;for(int i=0;i< SCRATCHPAD_WORDS;i++) if(dump[i] !=0) n++;return n;} static void sp_signature(const char *tag, const uint32_t *dump) { int first=-1, last=-1, n=0;for(int i=0;i< SCRATCHPAD_WORDS;i++) { if(dump[i] !=0) { if(first< 0) first=i;last=i;n++;} } ramsyscall_printf(" [%s] nonzero=%d first=%d last=%d", tag, n, first, last);if(first >=0) { ramsyscall_printf(" sp[%d]=%08lx sp[%d]=%08lx", first, dump[first], last, dump[last]);} ramsyscall_printf("\n");} static void sp_dump_nonzero(const char *tag, const uint32_t *dump, int limit) { ramsyscall_printf(" [%s] nonzero slots:\n", tag);int printed=0;for(int i=0;i< SCRATCHPAD_WORDS &&printed< limit;i++) { if(dump[i] !=0) { ramsyscall_printf(" sp[%3d] = 0x%08lx\n", i, dump[i]);printed++;} } if(printed==limit) ramsyscall_printf(" ... (truncated at %d)\n", limit);}[SCRATCHPAD_WORDS]) | |
| for (int k=0;k< n;k++) | |
| CESTER_TEST (d01_pipeline_drain_sweep, dcache_tests, ramsyscall_printf("=== d01_pipeline_drain_sweep ===\n");static const uint32_t drain_values[]={ 0, 1, 2, 4, 8, 16, 32 };int n=sizeof(drain_values)/sizeof(drain_values[0]);const uint32_t COUNT=4;for(int k=0;k< n;k++) { dcache_zero_scratchpad();dcache_run_reads_drained(BIU_DS_ONLY(0), TEST_DATA_KSEG0, COUNT, drain_values[k]);dcache_dump_scratchpad(s_dump);ramsyscall_printf(" drain=%lu, count=%lu reads:\n", drain_values[k], COUNT);sp_dump_nonzero("", s_dump, 8);}) CESTER_TEST(e01_kseg1_reads_no_fill | |
| ramsyscall_printf ("=== e01_kseg1_reads_no_fill ===\n") | |
| dcache_zero_scratchpad () | |
| dcache_run_reads_drained (BIU_DS_ONLY(0), TEST_DATA_KSEG1, 64, 16) | |
| dcache_dump_scratchpad (s_dump) | |
| sp_signature ("kseg1-ds", s_dump) | |
| if (sp_nonzero_count(s_dump), const uint32_t addr=TEST_DATA_KSEG0+0) | |
| sp_signature ("sweep+drain", s_dump) | |
| cester_assert_uint_eq (SCRATCHPAD_WORDS,(uint32_t) matches) | |
| CESTER_TEST (i01_stride16_at_offset_zero, dcache_tests, ramsyscall_printf("=== i01_stride16_at_offset_zero ===\n");dcache_zero_scratchpad();dcache_run_reads_strided(BIU_DS_ONLY(0), TEST_DATA_KSEG0, 64, 16);dcache_dump_scratchpad(s_dump);sp_signature("stride=16", s_dump);int at_offset_zero=0, others=0;for(int i=0;i< SCRATCHPAD_WORDS;i++) { if(s_dump[i]==0) continue;if((i &3)==0) at_offset_zero++;else others++;} ramsyscall_printf(" hits at i%%4==0: %d (expected 64)\n", at_offset_zero);ramsyscall_printf(" hits at other slots: %d (expected 0)\n", others);cester_assert_uint_eq(64u,(uint32_t) at_offset_zero);cester_assert_uint_eq(0u,(uint32_t) others);) CESTER_TEST(j01_dblksz_sweep | |
| CESTER_TEST (k01_ram_only_no_fill, CESTER_TEST(dcache_tests, ramsyscall_printf("=== k01_ram_only_no_fill ===\n");dcache_zero_scratchpad();dcache_run_reads_drained(BIU_RAM_ONLY, TEST_DATA_KSEG0, SCRATCHPAD_WORDS, 16);dcache_dump_scratchpad(s_dump);sp_signature("ram-only", s_dump);if(sp_nonzero_count(s_dump) > 0) sp_dump_nonzero("ram-only", s_dump, 4);) | |
| ramsyscall_printf (" mapping matches under SwC: %d / %d\n", matches, SCRATCHPAD_WORDS) | |
| CESTER_TEST (m01_address_aliasing, dcache_tests, ramsyscall_printf("=== m01_address_aliasing ===\n");const uint32_t ALT=0x80200000u;const uint32_t ALT_KSEG1=0xa0200000u;volatile uint32_t *alt_unc=(volatile uint32_t *) ALT_KSEG1; *alt_unc=0xa5a5a5a5u;dcache_zero_scratchpad();dcache_run_reads_drained(BIU_DS_ONLY(0), TEST_DATA_KSEG0, 1, 64);dcache_dump_scratchpad(s_dump);uint32_t a=s_dump[0];ramsyscall_printf(" read @0x%08lx -> sp[0] = 0x%08lx (expected 0x%08lx)\n",(uint32_t) TEST_DATA_KSEG0, a, BASE_PATTERN ^ 0);dcache_zero_scratchpad();dcache_run_reads_drained(BIU_DS_ONLY(0), ALT, 1, 64);dcache_dump_scratchpad(s_dump);uint32_t b=s_dump[0];ramsyscall_printf(" read @0x%08lx -> sp[0] = 0x%08lx (expected 0xa5a5a5a5)\n", ALT, b);cester_assert_uint_eq(BASE_PATTERN ^ 0u, a);cester_assert_uint_eq(0xa5a5a5a5u, b);) CESTER_TEST(n01_volatile_write_to_sp0 | |
| ramsyscall_printf (" wrote 0xcafebabe to sp[0], read back 0x%08lx\n", readback) | |
| cester_assert_uint_eq (0xcafebabeu, readback) | |
| cester_assert_uint_eq (0xcafebabeu, s_dump[0]) | |
| CESTER_TEST (n02_zero_then_volatile_write_sp0, dcache_tests, ramsyscall_printf("=== n02_zero_then_volatile_write_sp0 ===\n");volatile uint32_t *sp=(volatile uint32_t *) SCRATCHPAD_BASE;dcache_zero_scratchpad();ramsyscall_printf(" after zero: sp[0] = 0x%08lx\n", sp[0]);sp[0]=0xdeadbeefu;ramsyscall_printf(" after volatile write: sp[0] = 0x%08lx\n", sp[0]);dcache_dump_scratchpad(s_dump);ramsyscall_printf(" via dump probe: sp[0] = 0x%08lx\n", s_dump[0]);cester_assert_uint_eq(0xdeadbeefu, s_dump[0]);sp[0]=0;) CESTER_TEST(n03_sp0_survives_dcache_fill | |
| dcache_run_reads_drained (BIU_DS_ONLY(0), TEST_DATA_KSEG0+0x3FC, 1, 64) | |
| CESTER_TEST (n04_sp0_after_kseg1_read, dcache_tests, ramsyscall_printf("=== n04_sp0_after_kseg1_read ===\n");volatile uint32_t *sp=(volatile uint32_t *) SCRATCHPAD_BASE;sp[0]=0xfeedf00du;dcache_run_reads_drained(BIU_DS_ONLY(0), TEST_DATA_KSEG1, 16, 16);dcache_dump_scratchpad(s_dump);ramsyscall_printf(" sp[0] after kseg1 reads: 0x%08lx\n", s_dump[0]);sp[0]=0;) CESTER_TEST(n05_sp0_with_ram_only | |
| dcache_run_reads_drained (BIU_RAM_ONLY, TEST_DATA_KSEG0, 16, 16) | |
| ramsyscall_printf (" sp[0] after RAM-only reads: 0x%08lx\n", s_dump[0]) | |
| CESTER_TEST (n06_sp0_with_neither, dcache_tests, ramsyscall_printf("=== n06_sp0_with_neither ===\n");volatile uint32_t *sp=(volatile uint32_t *) SCRATCHPAD_BASE;sp[0]=0xfeedf00du;dcache_run_reads_drained(BIU_NEITHER, TEST_DATA_KSEG0, 16, 16);dcache_dump_scratchpad(s_dump);ramsyscall_printf(" sp[0] after BIU-neither reads: 0x%08lx\n", s_dump[0]);sp[0]=0;) CESTER_TEST(n07_sp0_observation_after_count_reads | |
| CESTER_TEST (n08_sp0_with_address_offsets, dcache_tests, ramsyscall_printf("=== n08_sp0_with_address_offsets ===\n");volatile uint32_t *sp=(volatile uint32_t *) SCRATCHPAD_BASE;static const uint32_t bases[]={ TEST_DATA_KSEG0+0x000, TEST_DATA_KSEG0+0x004, TEST_DATA_KSEG0+0x010, TEST_DATA_KSEG0+0x080, TEST_DATA_KSEG0+0x100, TEST_DATA_KSEG0+0x200, TEST_DATA_KSEG0+0x300, TEST_DATA_KSEG0+0x3F0, };int n=sizeof(bases)/sizeof(bases[0]);for(int k=0;k< n;k++) { sp[0]=0xfeedf00du;dcache_run_reads_drained(BIU_DS_ONLY(0), bases[k], 4, 16);dcache_dump_scratchpad(s_dump);ramsyscall_printf(" base=0x%08lx -> sp[0] = 0x%08lx\n", bases[k], s_dump[0]);} sp[0]=0;) CESTER_TEST(q01_tag_bit_with_ds | |
| dcache_run_reads_drained (biu, TEST_DATA_KSEG0, 16, 16) | |
| sp_signature ("ds+tag", s_dump) | |
| ramsyscall_printf (" 16-word fills under DS+TAG: %d/16 matched\n", matches) | |
| CESTER_TEST (q02_inv_bit_with_ds, dcache_tests, ramsyscall_printf("=== q02_inv_bit_with_ds ===\n");uint32_t biu=BIU_BASE|BIT_DS|(1u<< 1);dcache_zero_scratchpad();dcache_run_reads_drained(biu, TEST_DATA_KSEG0, 16, 16);dcache_dump_scratchpad(s_dump);sp_signature("ds+inv", s_dump);int matches=0;for(uint32_t wi=0;wi< 16;wi++) { if(s_dump[wi]==(BASE_PATTERN ^ wi)) matches++;} ramsyscall_printf(" 16-word fills under DS+INV: %d/16 matched\n", matches);) CESTER_TEST(q03_lock_bit_with_ds | |
| sp_signature ("ds+lock", s_dump) | |
| ramsyscall_printf (" 16-word fills under DS+LOCK: %d/16 matched\n", matches) | |
| CESTER_TEST (r01_byte_loads_dcache_mode, CESTER_TEST(dcache_tests, ramsyscall_printf("=== r01_byte_loads_dcache_mode ===\n");dcache_zero_scratchpad();dcache_run_byte_reads(BIU_DS_ONLY(0), TEST_DATA_KSEG0, 16);dcache_dump_scratchpad(s_dump);sp_signature("byte-reads", s_dump);sp_dump_nonzero("byte-reads", s_dump, 8);) | |
| CESTER_TEST (t01_within_line_reads, dcache_tests, ramsyscall_printf("=== t01_within_line_reads ===\n");dcache_zero_scratchpad();dcache_run_reads_drained(BIU_DS_ONLY(0), TEST_DATA_KSEG0, 4, 16);dcache_dump_scratchpad(s_dump);sp_signature("4-words-1-line", s_dump);volatile uint32_t *sp=(volatile uint32_t *) SCRATCHPAD_BASE;sp[0]=0xfeedf00du;sp[1]=0xfeedf00du;sp[2]=0xfeedf00du;sp[3]=0xfeedf00du;dcache_run_reads_drained(BIU_DS_ONLY(0), TEST_DATA_KSEG0, 4, 16);dcache_dump_scratchpad(s_dump);ramsyscall_printf(" re-read after sentinel: sp[0..3] = %08lx %08lx %08lx %08lx\n", s_dump[0], s_dump[1], s_dump[2], s_dump[3]);) CESTER_OPTIONS(CESTER_VERBOSE() | |
Variables | |
| int | n = sizeof(addrs) / sizeof(addrs[0]) |
| dcache_tests | |
| volatile uint32_t * | sp = (volatile uint32_t *)SCRATCHPAD_BASE |
| uint32_t | readback = sp[0] |
| uint32_t | biu = BIU_BASE | BIT_DS | (1u << 2) |
| int | matches = 0 |
| #define BASE_PATTERN 0x5a000000u |
| #define BIT_DS (1u << 7) |
| #define BIT_RAM (1u << 3) |
| #define BIU_BASE 0x0001e900u |
| #define BIU_NEITHER (BIU_BASE) |
| #define CESTER_MAYBE_TEST CESTER_TEST |
| #define CESTER_NO_SIGNAL |
| #define CESTER_NO_TIME |
| #define DBLKSZ | ( | n | ) | (((n) & 3u) << 4) |
| #define EXIT_FAILURE 1 |
| #define EXIT_SUCCESS 0 |
| #define PCSX_TESTS 0 |
| #define SCRATCHPAD_BASE 0x1f800000u |
| #define SCRATCHPAD_WORDS 256 |
| #define SP_SLOT_FOR_WORD | ( | wi | ) | ((wi) & 0xffu) |
| #define TEST_DATA_KSEG0 0x80100000u |
| #define TEST_DATA_KSEG1 0xa0100000u |
| #define TEST_DATA_WORDS 1024 |
| cester_assert_uint_eq | ( | 0xcafebabeu | , |
| readback | |||
| ) |
| cester_assert_uint_eq | ( | 0xcafebabeu | , |
| s_dump | [0] | ||
| ) |
| cester_assert_uint_eq | ( | SCRATCHPAD_WORDS | , |
| (uint32_t) | matches | ||
| ) |
| CESTER_BODY | ( | extern uint32_t dcache_get_biu(void);extern void dcache_set_biu(uint32_t value);extern uint32_t dcache_run_reads(uint32_t biu_value, uint32_t src, uint32_t count);extern uint32_t dcache_run_reads_strided(uint32_t biu_value, uint32_t src, uint32_t count, uint32_t stride);extern uint32_t dcache_run_reads_drained(uint32_t biu_value, uint32_t src, uint32_t count, uint32_t drain_nops);extern uint32_t dcache_run_reads_swc(uint32_t biu_value, uint32_t src, uint32_t count);extern void dcache_run_writes(uint32_t biu_value, uint32_t dst, uint32_t count, uint32_t base_pattern);extern uint32_t dcache_run_byte_reads(uint32_t biu_value, uint32_t src, uint32_t count);extern uint32_t dcache_run_half_reads(uint32_t biu_value, uint32_t src, uint32_t count);extern void dcache_run_writes_at_sp_addr(uint32_t biu_value, uint32_t sp_off, uint32_t count, uint32_t base);extern uint32_t dcache_run_reads_at_sp_addr(uint32_t biu_value, uint32_t sp_off, uint32_t count);extern void dcache_zero_scratchpad(void);extern void dcache_dump_scratchpad(uint32_t *out_256_words);extern void dcache_fill_pattern(uint32_t dst, uint32_t count, uint32_t base_pattern);static int s_interruptsWereEnabled;static uint32_t s_dump;static int sp_nonzero_count(const uint32_t *dump) { int n=0;for(int i=0;i< SCRATCHPAD_WORDS;i++) if(dump[i] !=0) n++;return n;} static void sp_signature(const char *tag, const uint32_t *dump) { int first=-1, last=-1, n=0;for(int i=0;i< SCRATCHPAD_WORDS;i++) { if(dump[i] !=0) { if(first< 0) first=i;last=i;n++;} } ramsyscall_printf(" [%s] nonzero=%d first=%d last=%d", tag, n, first, last);if(first >=0) { ramsyscall_printf(" sp[%d]=%08lx sp[%d]=%08lx", first, dump[first], last, dump[last]);} ramsyscall_printf("\n");} static void sp_dump_nonzero(const char *tag, const uint32_t *dump, int limit) { ramsyscall_printf(" [%s] nonzero slots:\n", tag);int printed=0;for(int i=0;i< SCRATCHPAD_WORDS &&printed< limit;i++) { if(dump[i] !=0) { ramsyscall_printf(" sp[%3d] = 0x%08lx\n", i, dump[i]);printed++;} } if(printed==limit) ramsyscall_printf(" ... (truncated at %d)\n", limit);} | [SCRATCHPAD_WORDS] | ) |
| CESTER_TEST | ( | d01_pipeline_drain_sweep | , |
| dcache_tests | , | ||
| ramsyscall_printf("=== d01_pipeline_drain_sweep ===\n");static const uint32_t | drain_values[] = { 0, 1, 2, 4, 8, 16, 32 }; int n = sizeof(drain_values) / sizeof(drain_values[0]); const uint32_t COUNT = 4; for (int k = 0; k < n; k++) { dcache_zero_scratchpad(); dcache_run_reads_drained(BIU_DS_ONLY(0), TEST_DATA_KSEG0, COUNT, drain_values[k]); dcache_dump_scratchpad(s_dump); ramsyscall_printf(" drain=%lu, count=%lu reads:\n", drain_values[k], COUNT); sp_dump_nonzero("", s_dump, 8); } |
||
| ) |
| CESTER_TEST | ( | i01_stride16_at_offset_zero | , |
| dcache_tests | , | ||
| ramsyscall_printf("=== i01_stride16_at_offset_zero ===\n");dcache_zero_scratchpad();dcache_run_reads_strided(BIU_DS_ONLY(0), TEST_DATA_KSEG0, 64, 16);dcache_dump_scratchpad(s_dump);sp_signature("stride=16", s_dump);int | at_offset_zero = 0, |
||
| others | = 0; for (int i = 0; i < SCRATCHPAD_WORDS; i++) { if (s_dump[i] == 0) continue; if ((i & 3) == 0) at_offset_zero++; else others++; } ramsyscall_printf(" hits at i%%4==0: %d (expected 64)\n", at_offset_zero); ramsyscall_printf(" hits at other slots: %d (expected 0)\n", others); cester_assert_uint_eq(64u, (uint32_t)at_offset_zero); cester_assert_uint_eq(0u, (uint32_t)others); |
||
| ) |
| CESTER_TEST | ( | k01_ram_only_no_fill | , |
| CESTER_TEST( | dcache_tests, | ||
| ramsyscall_printf("=== k01_ram_only_no_fill ===\n");dcache_zero_scratchpad();dcache_run_reads_drained(BIU_RAM_ONLY, TEST_DATA_KSEG0, SCRATCHPAD_WORDS, 16);dcache_dump_scratchpad(s_dump);sp_signature("ram-only", s_dump);if(sp_nonzero_count(s_dump) > 0) sp_dump_nonzero("ram-only", s_dump, 4); | |||
| ) |
| CESTER_TEST | ( | m01_address_aliasing | , |
| dcache_tests | , | ||
| ramsyscall_printf("=== m01_address_aliasing ===\n");const uint32_t | ALT = 0x80200000u; const uint32_t ALT_KSEG1 = 0xa0200000u; volatile uint32_t *alt_unc = (volatile uint32_t *)ALT_KSEG1; *alt_unc = 0xa5a5a5a5u; dcache_zero_scratchpad(); dcache_run_reads_drained(BIU_DS_ONLY(0), TEST_DATA_KSEG0, 1, 64); dcache_dump_scratchpad(s_dump); uint32_t a = s_dump[0]; ramsyscall_printf(" read @0x%08lx -> sp[0] = 0x%08lx (expected 0x%08lx)\n", (uint32_t)TEST_DATA_KSEG0, a, BASE_PATTERN ^ 0); dcache_zero_scratchpad(); dcache_run_reads_drained(BIU_DS_ONLY(0), ALT, 1, 64); dcache_dump_scratchpad(s_dump); uint32_t b = s_dump[0]; ramsyscall_printf(" read @0x%08lx -> sp[0] = 0x%08lx (expected 0xa5a5a5a5)\n", ALT, b); cester_assert_uint_eq(BASE_PATTERN ^ 0u, a); cester_assert_uint_eq(0xa5a5a5a5u, b); |
||
| ) |
| CESTER_TEST | ( | n02_zero_then_volatile_write_sp0 | , |
| dcache_tests | , | ||
| ramsyscall_printf("=== n02_zero_then_volatile_write_sp0 ===\n");volatile uint32_t * | sp = (volatile uint32_t *)SCRATCHPAD_BASE; dcache_zero_scratchpad(); ramsyscall_printf(" after zero: sp[0] = 0x%08lx\n", sp[0]); sp[0] = 0xdeadbeefu; ramsyscall_printf(" after volatile write: sp[0] = 0x%08lx\n", sp[0]); dcache_dump_scratchpad(s_dump); ramsyscall_printf(" via dump probe: sp[0] = 0x%08lx\n", s_dump[0]); cester_assert_uint_eq(0xdeadbeefu, s_dump[0]); sp[0] = 0; |
||
| ) |
| CESTER_TEST | ( | n04_sp0_after_kseg1_read | , |
| dcache_tests | , | ||
| ramsyscall_printf("=== n04_sp0_after_kseg1_read ===\n");volatile uint32_t * | sp = (volatile uint32_t *)SCRATCHPAD_BASE; sp[0] = 0xfeedf00du; dcache_run_reads_drained(BIU_DS_ONLY(0), TEST_DATA_KSEG1, 16, 16); dcache_dump_scratchpad(s_dump); ramsyscall_printf(" sp[0] after kseg1 reads: 0x%08lx\n", s_dump[0]); sp[0] = 0; |
||
| ) |
| CESTER_TEST | ( | n06_sp0_with_neither | , |
| dcache_tests | , | ||
| ramsyscall_printf("=== n06_sp0_with_neither ===\n");volatile uint32_t * | sp = (volatile uint32_t *)SCRATCHPAD_BASE; sp[0] = 0xfeedf00du; dcache_run_reads_drained(BIU_NEITHER, TEST_DATA_KSEG0, 16, 16); dcache_dump_scratchpad(s_dump); ramsyscall_printf(" sp[0] after BIU-neither reads: 0x%08lx\n", s_dump[0]); sp[0] = 0; |
||
| ) |
| CESTER_TEST | ( | n08_sp0_with_address_offsets | , |
| dcache_tests | , | ||
| ramsyscall_printf("=== n08_sp0_with_address_offsets ===\n");volatile uint32_t * | sp = (volatile uint32_t *)SCRATCHPAD_BASE; static const uint32_t bases[] = { TEST_DATA_KSEG0 + 0x000, TEST_DATA_KSEG0 + 0x004, TEST_DATA_KSEG0 + 0x010, TEST_DATA_KSEG0 + 0x080, TEST_DATA_KSEG0 + 0x100, TEST_DATA_KSEG0 + 0x200, TEST_DATA_KSEG0 + 0x300, TEST_DATA_KSEG0 + 0x3F0, }; int n = sizeof(bases) / sizeof(bases[0]); for (int k = 0; k < n; k++) { sp[0] = 0xfeedf00du; dcache_run_reads_drained(BIU_DS_ONLY(0), bases[k], 4, 16); dcache_dump_scratchpad(s_dump); ramsyscall_printf(" base=0x%08lx -> sp[0] = 0x%08lx\n", bases[k], s_dump[0]); } sp[0] = 0; |
||
| ) |
| CESTER_TEST | ( | q02_inv_bit_with_ds | , |
| dcache_tests | , | ||
| ramsyscall_printf("=== q02_inv_bit_with_ds ===\n");uint32_t | biu = BIU_BASE | BIT_DS | (1u << 1); dcache_zero_scratchpad(); dcache_run_reads_drained(biu, TEST_DATA_KSEG0, 16, 16); dcache_dump_scratchpad(s_dump); sp_signature("ds+inv", s_dump); int matches = 0; for (uint32_t wi = 0; wi < 16; wi++) { if (s_dump[wi] == (BASE_PATTERN ^ wi)) matches++; } ramsyscall_printf(" 16-word fills under DS+INV: %d/16 matched\n", matches); |
||
| ) |
| CESTER_TEST | ( | r01_byte_loads_dcache_mode | , |
| CESTER_TEST( | dcache_tests, | ||
| ramsyscall_printf("=== r01_byte_loads_dcache_mode ===\n");dcache_zero_scratchpad();dcache_run_byte_reads(BIU_DS_ONLY(0), TEST_DATA_KSEG0, 16);dcache_dump_scratchpad(s_dump);sp_signature("byte-reads", s_dump);sp_dump_nonzero("byte-reads", s_dump, 8); | |||
| ) |
| CESTER_TEST | ( | t01_within_line_reads | , |
| dcache_tests | , | ||
| ramsyscall_printf("=== t01_within_line_reads ===\n");dcache_zero_scratchpad();dcache_run_reads_drained(BIU_DS_ONLY(0), TEST_DATA_KSEG0, 4, 16);dcache_dump_scratchpad(s_dump);sp_signature("4-words-1-line", s_dump);volatile uint32_t * | sp = (volatile uint32_t *) SCRATCHPAD_BASE;sp[0]=0xfeedf00du;sp[1]=0xfeedf00du;sp[2]=0xfeedf00du;sp[3]=0xfeedf00du;dcache_run_reads_drained(BIU_DS_ONLY(0), TEST_DATA_KSEG0, 4, 16);dcache_dump_scratchpad(s_dump);ramsyscall_printf(" re-read after sentinel: sp[0..3] = %08lx %08lx %08lx %08lx\n", s_dump[0], s_dump[1], s_dump[2], s_dump[3]); |
||
| ) |
| dcache_dump_scratchpad | ( | s_dump | ) |
| dcache_run_reads_drained | ( | biu | , |
| TEST_DATA_KSEG0 | , | ||
| 16 | , | ||
| 16 | |||
| ) |
| dcache_run_reads_drained | ( | BIU_DS_ONLY(0) | , |
| TEST_DATA_KSEG0+ | 0x3FC, | ||
| 1 | , | ||
| 64 | |||
| ) |
| dcache_run_reads_drained | ( | BIU_DS_ONLY(0) | , |
| TEST_DATA_KSEG1 | , | ||
| 64 | , | ||
| 16 | |||
| ) |
| dcache_run_reads_drained | ( | BIU_RAM_ONLY | , |
| TEST_DATA_KSEG0 | , | ||
| 16 | , | ||
| 16 | |||
| ) |
| dcache_zero_scratchpad | ( | ) |
| for | ( | ) |
| if | ( | sp_nonzero_count(s_dump) | , |
| const uint32_t addr = TEST_DATA_KSEG0 + | 0 | ||
| ) |
| ramsyscall_printf | ( | " 16-word fills under DS+LOCK: %d/16 matched\n" | , |
| matches | |||
| ) |
| ramsyscall_printf | ( | " 16-word fills under DS+TAG: %d/16 matched\n" | , |
| matches | |||
| ) |
| ramsyscall_printf | ( | " mapping matches under SwC: %d / %d\n" | , |
| matches | , | ||
| SCRATCHPAD_WORDS | |||
| ) |
| ramsyscall_printf | ( | " sp after RAM-only reads: 0x%08lx\n" | [0], |
| s_dump | [0] | ||
| ) |
| ramsyscall_printf | ( | " wrote 0xcafebabe to | sp[0], |
| read back 0x%08lx\n" | , | ||
| readback | |||
| ) |
| ramsyscall_printf | ( | ) |
| sp_signature | ( | "ds+lock" | , |
| s_dump | |||
| ) |
| sp_signature | ( | "ds+tag" | , |
| s_dump | |||
| ) |
| sp_signature | ( | "kseg1-ds" | , |
| s_dump | |||
| ) |
| sp_signature | ( | "sweep+drain" | , |
| s_dump | |||
| ) |
| dcache_tests |
| int matches = 0 |
| int n = sizeof(addrs) / sizeof(addrs[0]) |
| volatile uint32_t * sp = (volatile uint32_t *)SCRATCHPAD_BASE |