soc/software/bios/sdram: split memtest and allow external #define of memtest sizes
This commit is contained in:
parent
619cd8e695
commit
bda196fbc8
|
@ -44,7 +44,9 @@ class BaseSoC(SoCSDRAM):
|
||||||
self.submodules.sdrphy = SDRAMPHYModel(sdram_module, phy_settings)
|
self.submodules.sdrphy = SDRAMPHYModel(sdram_module, phy_settings)
|
||||||
self.register_sdram(self.sdrphy, "minicon",
|
self.register_sdram(self.sdrphy, "minicon",
|
||||||
sdram_module.geom_settings, sdram_module.timing_settings)
|
sdram_module.geom_settings, sdram_module.timing_settings)
|
||||||
|
# reduce memtest size to speed up simulation
|
||||||
|
self.add_constant("MEMTEST_DATA_SIZE", 8*1024)
|
||||||
|
self.add_constant("MEMTEST_ADDR_SIZE", 8*1024)
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
|
|
@ -423,15 +423,6 @@ int sdrlevel(void)
|
||||||
|
|
||||||
#endif /* CSR_DDRPHY_BASE */
|
#endif /* CSR_DDRPHY_BASE */
|
||||||
|
|
||||||
#define TEST_DATA_SIZE (32*1024) // FIXME add #define
|
|
||||||
#define TEST_DATA_RANDOM 1
|
|
||||||
|
|
||||||
#define TEST_ADDR_SIZE (32*1024)
|
|
||||||
#define TEST_ADDR_RANDOM 0
|
|
||||||
|
|
||||||
#define ONEZERO 0xAAAAAAAA
|
|
||||||
#define ZEROONE 0x55555555
|
|
||||||
|
|
||||||
static unsigned int seed_to_data_32(unsigned int seed, int random)
|
static unsigned int seed_to_data_32(unsigned int seed, int random)
|
||||||
{
|
{
|
||||||
if (random)
|
if (random)
|
||||||
|
@ -448,81 +439,123 @@ static unsigned short seed_to_data_16(unsigned short seed, int random)
|
||||||
return seed + 1;
|
return seed + 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int memtest_silent(void)
|
#define ONEZERO 0xAAAAAAAA
|
||||||
|
#define ZEROONE 0x55555555
|
||||||
|
|
||||||
|
#ifndef MEMTEST_BUS_SIZE
|
||||||
|
#define MEMTEST_BUS_SIZE (512)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static int memtest_bus(void)
|
||||||
{
|
{
|
||||||
volatile unsigned int *array = (unsigned int *)MAIN_RAM_BASE;
|
volatile unsigned int *array = (unsigned int *)MAIN_RAM_BASE;
|
||||||
int i;
|
int i, errors;
|
||||||
unsigned int seed_32;
|
|
||||||
unsigned short seed_16;
|
|
||||||
unsigned int error_cnt;
|
|
||||||
|
|
||||||
error_cnt = 0;
|
errors = 0;
|
||||||
|
|
||||||
/* test data bus */
|
for(i=0;i<MEMTEST_BUS_SIZE/4;i++) {
|
||||||
for(i=0;i<128;i++) {
|
|
||||||
array[i] = ONEZERO;
|
array[i] = ONEZERO;
|
||||||
}
|
}
|
||||||
flush_cpu_dcache();
|
flush_cpu_dcache();
|
||||||
flush_l2_cache();
|
flush_l2_cache();
|
||||||
for(i=0;i<128;i++) {
|
for(i=0;i<MEMTEST_BUS_SIZE/4;i++) {
|
||||||
if(array[i] != ONEZERO)
|
if(array[i] != ONEZERO)
|
||||||
error_cnt++;
|
errors++;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(i=0;i<128;i++) {
|
for(i=0;i<MEMTEST_BUS_SIZE/4;i++) {
|
||||||
array[i] = ZEROONE;
|
array[i] = ZEROONE;
|
||||||
}
|
}
|
||||||
flush_cpu_dcache();
|
flush_cpu_dcache();
|
||||||
flush_l2_cache();
|
flush_l2_cache();
|
||||||
for(i=0;i<128;i++) {
|
for(i=0;i<MEMTEST_BUS_SIZE/4;i++) {
|
||||||
if(array[i] != ZEROONE)
|
if(array[i] != ZEROONE)
|
||||||
error_cnt++;
|
errors++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* test counter or random data */
|
return errors;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef MEMTEST_DATA_SIZE
|
||||||
|
#define MEMTEST_DATA_SIZE (2*1024*1024)
|
||||||
|
#endif
|
||||||
|
#define MEMTEST_DATA_RANDOM 1
|
||||||
|
|
||||||
|
static int memtest_data(void)
|
||||||
|
{
|
||||||
|
volatile unsigned int *array = (unsigned int *)MAIN_RAM_BASE;
|
||||||
|
int i, errors;
|
||||||
|
unsigned int seed_32;
|
||||||
|
|
||||||
|
errors = 0;
|
||||||
seed_32 = 0;
|
seed_32 = 0;
|
||||||
for(i=0;i<TEST_DATA_SIZE/4;i++) {
|
|
||||||
seed_32 = seed_to_data_32(seed_32, TEST_DATA_RANDOM);
|
for(i=0;i<MEMTEST_DATA_SIZE/4;i++) {
|
||||||
|
seed_32 = seed_to_data_32(seed_32, MEMTEST_DATA_RANDOM);
|
||||||
array[i] = seed_32;
|
array[i] = seed_32;
|
||||||
}
|
}
|
||||||
|
|
||||||
seed_32 = 0;
|
seed_32 = 0;
|
||||||
flush_cpu_dcache();
|
flush_cpu_dcache();
|
||||||
flush_l2_cache();
|
flush_l2_cache();
|
||||||
for(i=0;i<TEST_DATA_SIZE/4;i++) {
|
for(i=0;i<MEMTEST_DATA_SIZE/4;i++) {
|
||||||
seed_32 = seed_to_data_32(seed_32, TEST_DATA_RANDOM);
|
seed_32 = seed_to_data_32(seed_32, MEMTEST_DATA_RANDOM);
|
||||||
if(array[i] != seed_32)
|
if(array[i] != seed_32)
|
||||||
error_cnt++;
|
errors++;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* test random addressing */
|
return errors;
|
||||||
|
}
|
||||||
|
#ifndef MEMTEST_ADDR_SIZE
|
||||||
|
#define MEMTEST_ADDR_SIZE (32*1024)
|
||||||
|
#endif
|
||||||
|
#define MEMTEST_ADDR_RANDOM 0
|
||||||
|
|
||||||
|
static int memtest_addr(void)
|
||||||
|
{
|
||||||
|
volatile unsigned int *array = (unsigned int *)MAIN_RAM_BASE;
|
||||||
|
int i, errors;
|
||||||
|
unsigned short seed_16;
|
||||||
|
|
||||||
|
errors = 0;
|
||||||
seed_16 = 0;
|
seed_16 = 0;
|
||||||
for(i=0;i<TEST_ADDR_SIZE/4;i++) {
|
|
||||||
seed_16 = seed_to_data_16(seed_16, TEST_ADDR_RANDOM);
|
for(i=0;i<MEMTEST_ADDR_SIZE/4;i++) {
|
||||||
|
seed_16 = seed_to_data_16(seed_16, MEMTEST_ADDR_RANDOM);
|
||||||
array[(unsigned int) seed_16] = i;
|
array[(unsigned int) seed_16] = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
seed_16 = 0;
|
seed_16 = 0;
|
||||||
flush_cpu_dcache();
|
flush_cpu_dcache();
|
||||||
flush_l2_cache();
|
flush_l2_cache();
|
||||||
for(i=0;i<TEST_ADDR_SIZE/4;i++) {
|
for(i=0;i<MEMTEST_ADDR_SIZE/4;i++) {
|
||||||
seed_16 = seed_to_data_16(seed_16, TEST_ADDR_RANDOM);
|
seed_16 = seed_to_data_16(seed_16, MEMTEST_ADDR_RANDOM);
|
||||||
if(array[(unsigned int) seed_16] != i)
|
if(array[(unsigned int) seed_16] != i)
|
||||||
error_cnt++;
|
errors++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return error_cnt;
|
return errors;
|
||||||
}
|
}
|
||||||
|
|
||||||
int memtest(void)
|
int memtest(void)
|
||||||
{
|
{
|
||||||
unsigned int e;
|
int bus_errors, data_errors, addr_errors;
|
||||||
|
|
||||||
e = memtest_silent();
|
bus_errors = memtest_bus();
|
||||||
if(e != 0) {
|
if(bus_errors != 0)
|
||||||
printf("Memtest failed: %d/%d words incorrect\n", e, 2*128 + TEST_DATA_SIZE/4 + TEST_ADDR_SIZE/4);
|
printf("Memtest bus failed: %d/%d errors\n", bus_errors, 2*128);
|
||||||
|
|
||||||
|
data_errors = memtest_data();
|
||||||
|
if(bus_errors != 0)
|
||||||
|
printf("Memtest data failed: %d/%d errors\n", data_errors, MEMTEST_DATA_SIZE/4);
|
||||||
|
|
||||||
|
addr_errors = memtest_addr();
|
||||||
|
if(addr_errors != 0)
|
||||||
|
printf("Memtest addr failed: %d/%d errors\n", addr_errors, MEMTEST_ADDR_SIZE/4);
|
||||||
|
|
||||||
|
if(bus_errors + data_errors + addr_errors != 0)
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
else {
|
||||||
printf("Memtest OK\n");
|
printf("Memtest OK\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue