#include #include "diag.h" /******************************************************************************* * * Name : mem_data_bus_test * Description : The function tests data bus of the DRAM. It writes walking one * pattern to a fixed memory location. * Input arg : None * Output arg : None * Return : Returns 1 on failure, else 0 *******************************************************************************/ int mem_data_bus_test(void) { unsigned int pattern = 1; unsigned int *address = mem_test_start_offset; printf("\tDDR2 data bus test "); for(; pattern != 0; pattern <<= 1) { *address = pattern; if(pattern != *address) { printf("FAILED\n"); printf("\t\tTest failed at offset = 0x%X\n" "\t\tData written = 0x%X\n" "\t\tData read = 0x%X\n", address, pattern, *address); return 1; } } printf("PASSED\n"); return 0; } /******************************************************************************* * * Name : mem_address_bus_test * Description : The function tests address bus of the DRAM. It writes walking * one pattern while changes the addresses in the same way. i.e. * write 1 to offset 1, 8 to offset 8, etc. Verify the data after * writting to the buffer with length MEM_ADD_TEST_SIZE. * Input arg : None * Output arg : None * Return : Returns 1 on failure, else 0 *******************************************************************************/ int mem_address_bus_test(void) { unsigned int offset = 1, size; unsigned int *base_address = mem_test_start_offset; size = mem_test_end_offset - mem_test_start_offset; printf("\tDDR2 address bus test "); /* We should start with pattern = 1. As we want to use offset and * pattern the same variable, we will decrement base address by 1. * So, even if we start with offset = pattern = 1, we have actually * started from the given base address. */ base_address--; for(; offset < size; offset <<= 1) { base_address[offset] = offset; } for(offset = 1; offset < size; offset <<= 1) { if(base_address[offset] != offset) { printf("FAILED\n"); printf("\t\tTest failed at offset = 0x%X\n" "\t\tData written = 0x%X\n" "\t\tData read = 0x%X\n", base_address + offset, offset, base_address[offset]); return 1; } } printf("PASSED\n"); return 0; } /******************************************************************************* * * Name : mem_device_test * Description : The function tests address bus of the DRAM. It writes walking * one pattern while changes the addresses in the same way. i.e. * write 1 to offset 1, 8 to offset 8, etc. Verify the data after * writting to the buffer with length MEM_ADD_TEST_SIZE. * Input arg : None * Output arg : None * Return : Returns 1 on failure, else 0 *******************************************************************************/ int mem_device_test(void) { unsigned int offset = 1, size; unsigned int *base_address = mem_test_start_offset; size = mem_test_end_offset - mem_test_start_offset; printf("\tDDR2 device test "); /* Debug print */ #ifdef DEBUG printf("Start address = %#X\n", base_address); printf("size = %#X\n", size); #endif /* We should start with pattern = 1. As we want to use offset and * pattern the same variable, we will decrement base address by 1. * So, even if we start with offset = pattern = 1, we have actually * started from the given base address. */ base_address--; for(; offset < size; offset++) { base_address[offset] = offset; } /* Check previously written pattern and write anti-pattern */ for(offset = 1; offset < size; offset++) { if(base_address[offset] != offset) { printf("FAILED\n"); printf("\t\tTest failed at offset = 0x%X\n" "\t\tData written = 0x%X\n" "\t\tData read = 0x%X\n", base_address + offset, offset, base_address[offset]); return 1; } /* Write anti-pattern */ base_address[offset] = ~offset; } /* Debug print */ #ifdef DEBUG printf("Checking anti-pattern\n"); #endif /* Check anti-pattern */ for(offset = 1; offset < size; offset++) { if(base_address[offset] != ~offset) { printf("FAILED\n"); printf("\t\tTest failed at offset = 0x%X\n" "\t\tData written = 0x%X\n" "\t\tData read = 0x%X\n", base_address + offset, ~offset, base_address[offset]); return 1; } } printf("PASSED\n"); return 0; }