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" 116096696bSDingqiang 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 { 466096696bSDingqiang Lin struct blk_desc *block_dev = rockchip_get_bootdev(); 47ad309a88SDingqiang Lin u16 i, j, loop = 0; 48*5238e9abSJon Lin u32 test_end_lba, test_begin_lba; 496096696bSDingqiang Lin u32 test_lba; 50ad309a88SDingqiang Lin u16 test_sec_count = 1; 51ad309a88SDingqiang Lin u16 print_flag; 52ad309a88SDingqiang Lin 536096696bSDingqiang Lin if (!block_dev) { 54ad309a88SDingqiang Lin printf("device unknown\n"); 55ad309a88SDingqiang Lin return; 56ad309a88SDingqiang Lin } 57ad309a88SDingqiang Lin 586096696bSDingqiang Lin if (block_dev->if_type == IF_TYPE_SPINOR) 59*5238e9abSJon Lin test_begin_lba = 0x4000; 606096696bSDingqiang Lin else 61*5238e9abSJon Lin test_begin_lba = 0x8000; 626096696bSDingqiang Lin 636096696bSDingqiang 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; 67*5238e9abSJon Lin for (loop = 0; loop < 100; loop++) { 68*5238e9abSJon Lin test_lba = test_begin_lba; 69ad309a88SDingqiang Lin printf("---------Test loop = %d---------\n", loop); 70ad309a88SDingqiang Lin printf("---------Test ftl write---------\n"); 71ad309a88SDingqiang Lin test_sec_count = 1; 72ad309a88SDingqiang Lin printf("test_end_lba = %x\n", test_end_lba); 73ad309a88SDingqiang Lin printf("test_lba = %x\n", test_lba); 746096696bSDingqiang Lin for (; (test_lba + test_sec_count) < test_end_lba;) { 75ad309a88SDingqiang Lin pwrite32[0] = test_lba; 76ad309a88SDingqiang Lin blk_dwrite(block_dev, test_lba, test_sec_count, pwrite); 77ad309a88SDingqiang Lin blk_dread(block_dev, test_lba, test_sec_count, pread); 78ad309a88SDingqiang Lin for (j = 0; j < test_sec_count * 512; j++) { 79ad309a88SDingqiang Lin if (pwrite[j] != pread[j]) { 80*5238e9abSJon Lin printf("rkflash stress test fail\n"); 81ad309a88SDingqiang Lin rkflash_print_hex("w:", 82ad309a88SDingqiang Lin pwrite, 83ad309a88SDingqiang Lin 4, 84ad309a88SDingqiang Lin test_sec_count * 128); 85ad309a88SDingqiang Lin rkflash_print_hex("r:", 86ad309a88SDingqiang Lin pread, 87ad309a88SDingqiang Lin 4, 88ad309a88SDingqiang Lin test_sec_count * 128); 89ad309a88SDingqiang Lin printf("r=%x, n=%x, w=%x, r=%x\n", 90ad309a88SDingqiang Lin test_lba, 91ad309a88SDingqiang Lin j, 92ad309a88SDingqiang Lin pwrite[j], 93ad309a88SDingqiang Lin pread[j]); 94ad309a88SDingqiang Lin while (1) 95ad309a88SDingqiang Lin ; 96ad309a88SDingqiang Lin } 97ad309a88SDingqiang Lin } 98ad309a88SDingqiang Lin print_flag = test_lba & 0x1FF; 99ad309a88SDingqiang Lin if (print_flag < test_sec_count) 100ad309a88SDingqiang Lin printf("test_lba = %x\n", test_lba); 101ad309a88SDingqiang Lin test_lba += test_sec_count; 102ad309a88SDingqiang Lin test_sec_count++; 103ad309a88SDingqiang Lin if (test_sec_count > max_test_sector) 104ad309a88SDingqiang Lin test_sec_count = 1; 105ad309a88SDingqiang Lin } 106ad309a88SDingqiang Lin printf("---------Test ftl check---------\n"); 107ad309a88SDingqiang Lin 108*5238e9abSJon Lin test_lba = test_begin_lba; 109ad309a88SDingqiang Lin test_sec_count = 1; 1106096696bSDingqiang Lin for (; (test_lba + test_sec_count) < test_end_lba;) { 111ad309a88SDingqiang Lin pwrite32[0] = test_lba; 112ad309a88SDingqiang Lin blk_dread(block_dev, test_lba, test_sec_count, pread); 113ad309a88SDingqiang Lin print_flag = test_lba & 0x7FF; 114ad309a88SDingqiang Lin if (print_flag < test_sec_count) 115ad309a88SDingqiang Lin printf("test_lba = %x\n", test_lba); 116ad309a88SDingqiang Lin 117ad309a88SDingqiang Lin for (j = 0; j < test_sec_count * 512; j++) { 118ad309a88SDingqiang Lin if (pwrite[j] != pread[j]) { 119*5238e9abSJon Lin printf("rkflash stress test fail\n"); 120ad309a88SDingqiang Lin printf("r=%x, n=%x, w=%x, r=%x\n", 121ad309a88SDingqiang Lin test_lba, 122ad309a88SDingqiang Lin j, 123ad309a88SDingqiang Lin pwrite[j], 124ad309a88SDingqiang Lin pread[j]); 125*5238e9abSJon Lin while (1) 126*5238e9abSJon Lin ; 127ad309a88SDingqiang Lin } 128ad309a88SDingqiang Lin } 129ad309a88SDingqiang Lin test_lba += test_sec_count; 130ad309a88SDingqiang Lin test_sec_count++; 131ad309a88SDingqiang Lin if (test_sec_count > max_test_sector) 132ad309a88SDingqiang Lin test_sec_count = 1; 133ad309a88SDingqiang Lin } 134ad309a88SDingqiang Lin } 135ad309a88SDingqiang Lin printf("---------Test end---------\n"); 136ad309a88SDingqiang Lin /* while(1); */ 137ad309a88SDingqiang Lin } 138ad309a88SDingqiang Lin #endif 139ad309a88SDingqiang Lin 140ad309a88SDingqiang Lin void rkflash_test(struct udevice *udev) 141ad309a88SDingqiang Lin { 142ad309a88SDingqiang Lin #if (BLK_STRESS_TEST_EN) 143ad309a88SDingqiang Lin blk_stress_test(udev); 144ad309a88SDingqiang Lin #endif 145ad309a88SDingqiang Lin } 146ad309a88SDingqiang Lin 147