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