Nugget
Loading...
Searching...
No Matches
Macros | Functions | Variables
dcache.c File Reference
#include "common/hardware/hwregs.h"
#include "common/syscalls/syscalls.h"
#include "exotic/cester.h"
Include dependency graph for dcache.c:

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_tsp = (volatile uint32_t *)SCRATCHPAD_BASE
 
uint32_t readback = sp[0]
 
uint32_t biu = BIU_BASE | BIT_DS | (1u << 2)
 
int matches = 0
 

Macro Definition Documentation

◆ BASE_PATTERN

#define BASE_PATTERN   0x5a000000u

◆ BIT_DS

#define BIT_DS   (1u << 7)

◆ BIT_RAM

#define BIT_RAM   (1u << 3)

◆ BIU_BASE

#define BIU_BASE   0x0001e900u

◆ BIU_DS_ONLY

#define BIU_DS_ONLY (   dblksz)    (BIU_BASE | BIT_DS | DBLKSZ(dblksz))

◆ BIU_NEITHER

#define BIU_NEITHER   (BIU_BASE)

◆ BIU_NORMAL

#define BIU_NORMAL   (BIU_BASE | BIT_RAM | BIT_DS)

◆ BIU_RAM_ONLY

#define BIU_RAM_ONLY   (BIU_BASE | BIT_RAM)

◆ CESTER_MAYBE_TEST

#define CESTER_MAYBE_TEST   CESTER_TEST

◆ CESTER_NO_SIGNAL

#define CESTER_NO_SIGNAL

◆ CESTER_NO_TIME

#define CESTER_NO_TIME

◆ DBLKSZ

#define DBLKSZ (   n)    (((n) & 3u) << 4)

◆ EXIT_FAILURE

#define EXIT_FAILURE   1

◆ EXIT_SUCCESS

#define EXIT_SUCCESS   0

◆ PCSX_TESTS

#define PCSX_TESTS   0

◆ SCRATCHPAD_BASE

#define SCRATCHPAD_BASE   0x1f800000u

◆ SCRATCHPAD_WORDS

#define SCRATCHPAD_WORDS   256

◆ SP_SLOT_FOR_WORD

#define SP_SLOT_FOR_WORD (   wi)    ((wi) & 0xffu)

◆ TEST_DATA_KSEG0

#define TEST_DATA_KSEG0   0x80100000u

◆ TEST_DATA_KSEG1

#define TEST_DATA_KSEG1   0xa0100000u

◆ TEST_DATA_WORDS

#define TEST_DATA_WORDS   1024

Function Documentation

◆ cester_assert_uint_eq() [1/3]

cester_assert_uint_eq ( 0xcafebabeu  ,
readback   
)

◆ cester_assert_uint_eq() [2/3]

cester_assert_uint_eq ( 0xcafebabeu  ,
s_dump  [0] 
)

◆ cester_assert_uint_eq() [3/3]

cester_assert_uint_eq ( SCRATCHPAD_WORDS  ,
(uint32_t matches 
)

◆ CESTER_BODY()

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() [1/11]

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() [2/11]

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_WORDSi++) { 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() [3/11]

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() [4/11]

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() [5/11]

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_BASEdcache_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() [6/11]

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_BASEsp[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() [7/11]

CESTER_TEST ( n06_sp0_with_neither  ,
dcache_tests  ,
ramsyscall_printf("=== n06_sp0_with_neither ===\n");volatile uint32_t sp = (volatile uint32_t *)SCRATCHPAD_BASEsp[0] = 0xfeedf00du; dcache_run_reads_drained(BIU_NEITHERTEST_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() [8/11]

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() [9/11]

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(biuTEST_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() [10/11]

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() [11/11]

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()

dcache_dump_scratchpad ( s_dump  )

◆ dcache_run_reads_drained() [1/4]

dcache_run_reads_drained ( biu  ,
TEST_DATA_KSEG0  ,
16  ,
16   
)

◆ dcache_run_reads_drained() [2/4]

dcache_run_reads_drained ( BIU_DS_ONLY(0)  ,
TEST_DATA_KSEG0 0x3FC,
,
64   
)

◆ dcache_run_reads_drained() [3/4]

dcache_run_reads_drained ( BIU_DS_ONLY(0)  ,
TEST_DATA_KSEG1  ,
64  ,
16   
)

◆ dcache_run_reads_drained() [4/4]

dcache_run_reads_drained ( BIU_RAM_ONLY  ,
TEST_DATA_KSEG0  ,
16  ,
16   
)

◆ dcache_zero_scratchpad()

dcache_zero_scratchpad ( )

◆ for()

for ( )

◆ if()

if ( sp_nonzero_count(s_dump)  ,
const uint32_t addr = TEST_DATA_KSEG0 0 
)

◆ ramsyscall_printf() [1/6]

ramsyscall_printf ( " 16-word fills under DS+LOCK: %d/16 matched\n"  ,
matches   
)

◆ ramsyscall_printf() [2/6]

ramsyscall_printf ( " 16-word fills under DS+TAG: %d/16 matched\n"  ,
matches   
)

◆ ramsyscall_printf() [3/6]

ramsyscall_printf ( " mapping matches under SwC: %d / %d\n"  ,
matches  ,
SCRATCHPAD_WORDS   
)

◆ ramsyscall_printf() [4/6]

ramsyscall_printf ( " sp after RAM-only reads: 0x%08lx\n"  [0],
s_dump  [0] 
)

◆ ramsyscall_printf() [5/6]

ramsyscall_printf ( " wrote 0xcafebabe to  sp[0],
read back 0x%08lx\n"  ,
readback   
)

◆ ramsyscall_printf() [6/6]

ramsyscall_printf ( )

◆ sp_signature() [1/4]

sp_signature ( "ds+lock"  ,
s_dump   
)

◆ sp_signature() [2/4]

sp_signature ( "ds+tag"  ,
s_dump   
)

◆ sp_signature() [3/4]

sp_signature ( "kseg1-ds"  ,
s_dump   
)

◆ sp_signature() [4/4]

sp_signature ( "sweep+drain"  ,
s_dump   
)

Variable Documentation

◆ biu

uint32_t biu = BIU_BASE | BIT_DS | (1u << 2)

◆ dcache_tests

dcache_tests

◆ matches

int matches = 0

◆ n

int n = sizeof(addrs) / sizeof(addrs[0])

◆ readback

uint32_t readback = sp[0]

◆ sp