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