1ad309a88SDingqiang Lin /* 2ad309a88SDingqiang Lin * Copyright (c) 2018 Fuzhou Rockchip Electronics Co., Ltd 3ad309a88SDingqiang Lin * 4ba0501acSDingqiang Lin * SPDX-License-Identifier: GPL-2.0 5ad309a88SDingqiang Lin */ 6ad309a88SDingqiang Lin 7ad309a88SDingqiang Lin #include <blk.h> 8ad309a88SDingqiang Lin 9ad309a88SDingqiang Lin #include "rkflash_debug.h" 10ad309a88SDingqiang Lin #include "rkflash_blk.h" 11*6096696bSDingqiang Lin #include "boot_rkimg.h" 12ad309a88SDingqiang Lin 13ad309a88SDingqiang Lin void rkflash_print_hex(char *s, void *buf, u32 width, u32 len) 14ad309a88SDingqiang Lin { 15ad309a88SDingqiang Lin u32 i, j; 16ad309a88SDingqiang Lin char *p8 = (char *)buf; 17ad309a88SDingqiang Lin short *p16 = (short *)buf; 18ad309a88SDingqiang Lin u32 *p32 = (u32 *)buf; 19ad309a88SDingqiang Lin 20ad309a88SDingqiang Lin j = 0; 21ad309a88SDingqiang Lin for (i = 0; i < len; i++) { 22ad309a88SDingqiang Lin if (j == 0) 23ad309a88SDingqiang Lin printf("%s 0x%x:", s, i * width); 24ad309a88SDingqiang Lin 25ad309a88SDingqiang Lin if (width == 4) 26ad309a88SDingqiang Lin printf("%x ", p32[i]); 27ad309a88SDingqiang Lin else if (width == 2) 28ad309a88SDingqiang Lin printf("%x ", p16[i]); 29ad309a88SDingqiang Lin else 30ad309a88SDingqiang Lin printf("%02x ", p8[i]); 31ad309a88SDingqiang Lin if (++j >= 16) { 32ad309a88SDingqiang Lin j = 0; 33ad309a88SDingqiang Lin printf("\n"); 34ad309a88SDingqiang Lin } 35ad309a88SDingqiang Lin } 36ad309a88SDingqiang Lin printf("\n"); 37ad309a88SDingqiang Lin } 38ad309a88SDingqiang Lin 39ad309a88SDingqiang Lin #if (BLK_STRESS_TEST_EN) 40ad309a88SDingqiang Lin #define max_test_sector 64 41ba0501acSDingqiang Lin static u8 pwrite[max_test_sector * 512]; 42ba0501acSDingqiang Lin static u8 pread[max_test_sector * 512]; 43ba0501acSDingqiang Lin static u32 *pwrite32; 44ad309a88SDingqiang Lin void blk_stress_test(struct udevice *udev) 45ad309a88SDingqiang Lin { 46*6096696bSDingqiang Lin struct blk_desc *block_dev = rockchip_get_bootdev(); 47ad309a88SDingqiang Lin u16 i, j, loop = 0; 48ad309a88SDingqiang Lin u32 test_end_lba; 49*6096696bSDingqiang Lin u32 test_lba; 50ad309a88SDingqiang Lin u16 test_sec_count = 1; 51ad309a88SDingqiang Lin u16 print_flag; 52ad309a88SDingqiang Lin 53*6096696bSDingqiang Lin if (!block_dev) { 54ad309a88SDingqiang Lin printf("device unknown\n"); 55ad309a88SDingqiang Lin return; 56ad309a88SDingqiang Lin } 57ad309a88SDingqiang Lin 58*6096696bSDingqiang Lin if (block_dev->if_type == IF_TYPE_SPINOR) 59*6096696bSDingqiang Lin test_lba = 0x800; 60*6096696bSDingqiang Lin else 61*6096696bSDingqiang Lin test_lba = 0; 62*6096696bSDingqiang Lin 63*6096696bSDingqiang Lin test_end_lba = block_dev->lba; 64ad309a88SDingqiang Lin pwrite32 = (u32 *)pwrite; 65ad309a88SDingqiang Lin for (i = 0; i < (max_test_sector * 512); i++) 66ad309a88SDingqiang Lin pwrite[i] = i; 67ad309a88SDingqiang Lin for (loop = 0; loop < 10; loop++) { 68ad309a88SDingqiang Lin printf("---------Test loop = %d---------\n", loop); 69ad309a88SDingqiang Lin printf("---------Test ftl write---------\n"); 70ad309a88SDingqiang Lin test_sec_count = 1; 71ad309a88SDingqiang Lin printf("test_end_lba = %x\n", test_end_lba); 72ad309a88SDingqiang Lin printf("test_lba = %x\n", test_lba); 73*6096696bSDingqiang Lin for (; (test_lba + test_sec_count) < test_end_lba;) { 74ad309a88SDingqiang Lin pwrite32[0] = test_lba; 75ad309a88SDingqiang Lin blk_dwrite(block_dev, test_lba, test_sec_count, pwrite); 76ad309a88SDingqiang Lin blk_dread(block_dev, test_lba, test_sec_count, pread); 77ad309a88SDingqiang Lin for (j = 0; j < test_sec_count * 512; j++) { 78ad309a88SDingqiang Lin if (pwrite[j] != pread[j]) { 79ad309a88SDingqiang Lin rkflash_print_hex("w:", 80ad309a88SDingqiang Lin pwrite, 81ad309a88SDingqiang Lin 4, 82ad309a88SDingqiang Lin test_sec_count * 128); 83ad309a88SDingqiang Lin rkflash_print_hex("r:", 84ad309a88SDingqiang Lin pread, 85ad309a88SDingqiang Lin 4, 86ad309a88SDingqiang Lin test_sec_count * 128); 87ad309a88SDingqiang Lin printf("r=%x, n=%x, w=%x, r=%x\n", 88ad309a88SDingqiang Lin test_lba, 89ad309a88SDingqiang Lin j, 90ad309a88SDingqiang Lin pwrite[j], 91ad309a88SDingqiang Lin pread[j]); 92ad309a88SDingqiang Lin while (1) 93ad309a88SDingqiang Lin ; 94ad309a88SDingqiang Lin break; 95ad309a88SDingqiang Lin } 96ad309a88SDingqiang Lin } 97ad309a88SDingqiang Lin print_flag = test_lba & 0x1FF; 98ad309a88SDingqiang Lin if (print_flag < test_sec_count) 99ad309a88SDingqiang Lin printf("test_lba = %x\n", test_lba); 100ad309a88SDingqiang Lin test_lba += test_sec_count; 101ad309a88SDingqiang Lin test_sec_count++; 102ad309a88SDingqiang Lin if (test_sec_count > max_test_sector) 103ad309a88SDingqiang Lin test_sec_count = 1; 104ad309a88SDingqiang Lin } 105ad309a88SDingqiang Lin printf("---------Test ftl check---------\n"); 106ad309a88SDingqiang Lin 107ad309a88SDingqiang Lin test_sec_count = 1; 108*6096696bSDingqiang Lin for (; (test_lba + test_sec_count) < test_end_lba;) { 109ad309a88SDingqiang Lin pwrite32[0] = test_lba; 110ad309a88SDingqiang Lin blk_dread(block_dev, test_lba, test_sec_count, pread); 111ad309a88SDingqiang Lin print_flag = test_lba & 0x7FF; 112ad309a88SDingqiang Lin if (print_flag < test_sec_count) 113ad309a88SDingqiang Lin printf("test_lba = %x\n", test_lba); 114ad309a88SDingqiang Lin 115ad309a88SDingqiang Lin for (j = 0; j < test_sec_count * 512; j++) { 116ad309a88SDingqiang Lin if (pwrite[j] != pread[j]) { 117ad309a88SDingqiang Lin printf("r=%x, n=%x, w=%x, r=%x\n", 118ad309a88SDingqiang Lin test_lba, 119ad309a88SDingqiang Lin j, 120ad309a88SDingqiang Lin pwrite[j], 121ad309a88SDingqiang Lin pread[j]); 122ad309a88SDingqiang Lin /* while(1); */ 123ad309a88SDingqiang Lin break; 124ad309a88SDingqiang Lin } 125ad309a88SDingqiang Lin } 126ad309a88SDingqiang Lin test_lba += test_sec_count; 127ad309a88SDingqiang Lin test_sec_count++; 128ad309a88SDingqiang Lin if (test_sec_count > max_test_sector) 129ad309a88SDingqiang Lin test_sec_count = 1; 130ad309a88SDingqiang Lin } 131ad309a88SDingqiang Lin } 132ad309a88SDingqiang Lin printf("---------Test end---------\n"); 133ad309a88SDingqiang Lin /* while(1); */ 134ad309a88SDingqiang Lin } 135ad309a88SDingqiang Lin #endif 136ad309a88SDingqiang Lin 137ad309a88SDingqiang Lin void rkflash_test(struct udevice *udev) 138ad309a88SDingqiang Lin { 139ad309a88SDingqiang Lin #if (BLK_STRESS_TEST_EN) 140ad309a88SDingqiang Lin blk_stress_test(udev); 141ad309a88SDingqiang Lin #endif 142ad309a88SDingqiang Lin } 143ad309a88SDingqiang Lin 144