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> 8*c84f0ed8SJon Lin #include <common.h> 9*c84f0ed8SJon Lin #include <hexdump.h> 10ad309a88SDingqiang Lin 11ad309a88SDingqiang Lin #include "rkflash_debug.h" 12ad309a88SDingqiang Lin #include "rkflash_blk.h" 136096696bSDingqiang Lin #include "boot_rkimg.h" 14ad309a88SDingqiang Lin 15*c84f0ed8SJon Lin static unsigned int rkflash_debug; 16*c84f0ed8SJon Lin 17*c84f0ed8SJon Lin __printf(1, 2) int rkflash_print_dio(const char *fmt, ...) 18ad309a88SDingqiang Lin { 19*c84f0ed8SJon Lin int nret = 0; 20*c84f0ed8SJon Lin #if PRINT_SWI_CON_IO 21*c84f0ed8SJon Lin if (rkflash_debug & PRINT_BIT_CON_IO) { 22*c84f0ed8SJon Lin va_list args; 23ad309a88SDingqiang Lin 24*c84f0ed8SJon Lin if (!fmt) 25*c84f0ed8SJon Lin return nret; 26ad309a88SDingqiang Lin 27*c84f0ed8SJon Lin va_start(args, fmt); 28*c84f0ed8SJon Lin nret = vprintf(fmt, args); 29*c84f0ed8SJon Lin va_end(args); 30ad309a88SDingqiang Lin } 31*c84f0ed8SJon Lin #endif 32*c84f0ed8SJon Lin return nret; 33ad309a88SDingqiang Lin } 34*c84f0ed8SJon Lin 35*c84f0ed8SJon Lin __printf(1, 2) int rkflash_print_bio(const char *fmt, ...) 36*c84f0ed8SJon Lin { 37*c84f0ed8SJon Lin int nret = 0; 38*c84f0ed8SJon Lin #if PRINT_SWI_BLK_IO 39*c84f0ed8SJon Lin if (rkflash_debug & PRINT_BIT_BLK_IO) { 40*c84f0ed8SJon Lin va_list args; 41*c84f0ed8SJon Lin 42*c84f0ed8SJon Lin if (!fmt) 43*c84f0ed8SJon Lin return nret; 44*c84f0ed8SJon Lin 45*c84f0ed8SJon Lin va_start(args, fmt); 46*c84f0ed8SJon Lin nret = vprintf(fmt, args); 47*c84f0ed8SJon Lin va_end(args); 48*c84f0ed8SJon Lin } 49*c84f0ed8SJon Lin #endif 50*c84f0ed8SJon Lin return nret; 51*c84f0ed8SJon Lin } 52*c84f0ed8SJon Lin 53*c84f0ed8SJon Lin __printf(1, 2) int rkflash_print_info(const char *fmt, ...) 54*c84f0ed8SJon Lin { 55*c84f0ed8SJon Lin int nret = 0; 56*c84f0ed8SJon Lin #if PRINT_SWI_INFO 57*c84f0ed8SJon Lin va_list args; 58*c84f0ed8SJon Lin 59*c84f0ed8SJon Lin if (!fmt) 60*c84f0ed8SJon Lin return nret; 61*c84f0ed8SJon Lin 62*c84f0ed8SJon Lin va_start(args, fmt); 63*c84f0ed8SJon Lin nret = vprintf(fmt, args); 64*c84f0ed8SJon Lin va_end(args); 65*c84f0ed8SJon Lin #endif 66*c84f0ed8SJon Lin return nret; 67*c84f0ed8SJon Lin } 68*c84f0ed8SJon Lin 69*c84f0ed8SJon Lin __printf(1, 2) int rkflash_print_error(const char *fmt, ...) 70*c84f0ed8SJon Lin { 71*c84f0ed8SJon Lin int nret = 0; 72*c84f0ed8SJon Lin #if PRINT_SWI_ERROR 73*c84f0ed8SJon Lin va_list args; 74*c84f0ed8SJon Lin 75*c84f0ed8SJon Lin if (!fmt) 76*c84f0ed8SJon Lin return nret; 77*c84f0ed8SJon Lin 78*c84f0ed8SJon Lin va_start(args, fmt); 79*c84f0ed8SJon Lin nret = vprintf(fmt, args); 80*c84f0ed8SJon Lin va_end(args); 81*c84f0ed8SJon Lin #endif 82*c84f0ed8SJon Lin return nret; 83*c84f0ed8SJon Lin } 84*c84f0ed8SJon Lin 85*c84f0ed8SJon Lin void rkflash_print_hex(const char *s, const void *buf, int w, size_t len) 86*c84f0ed8SJon Lin { 87*c84f0ed8SJon Lin #if PRINT_SWI_ERROR 88*c84f0ed8SJon Lin print_hex_dump(s, DUMP_PREFIX_OFFSET, 4, w, 89*c84f0ed8SJon Lin buf, (len) * w, 0); 90*c84f0ed8SJon Lin #endif 91ad309a88SDingqiang Lin } 92ad309a88SDingqiang Lin 93ad309a88SDingqiang Lin #if (BLK_STRESS_TEST_EN) 94ad309a88SDingqiang Lin #define max_test_sector 64 95ba0501acSDingqiang Lin static u8 pwrite[max_test_sector * 512]; 96ba0501acSDingqiang Lin static u8 pread[max_test_sector * 512]; 97ba0501acSDingqiang Lin static u32 *pwrite32; 98ad309a88SDingqiang Lin void blk_stress_test(struct udevice *udev) 99ad309a88SDingqiang Lin { 1006096696bSDingqiang Lin struct blk_desc *block_dev = rockchip_get_bootdev(); 101ad309a88SDingqiang Lin u16 i, j, loop = 0; 1025238e9abSJon Lin u32 test_end_lba, test_begin_lba; 1036096696bSDingqiang Lin u32 test_lba; 104ad309a88SDingqiang Lin u16 test_sec_count = 1; 105ad309a88SDingqiang Lin u16 print_flag; 106ad309a88SDingqiang Lin 1076096696bSDingqiang Lin if (!block_dev) { 108ad309a88SDingqiang Lin printf("device unknown\n"); 109ad309a88SDingqiang Lin return; 110ad309a88SDingqiang Lin } 111ad309a88SDingqiang Lin 1126096696bSDingqiang Lin if (block_dev->if_type == IF_TYPE_SPINOR) 1135238e9abSJon Lin test_begin_lba = 0x4000; 1146096696bSDingqiang Lin else 1155238e9abSJon Lin test_begin_lba = 0x8000; 1166096696bSDingqiang Lin 1176096696bSDingqiang Lin test_end_lba = block_dev->lba; 118ad309a88SDingqiang Lin pwrite32 = (u32 *)pwrite; 119ad309a88SDingqiang Lin for (i = 0; i < (max_test_sector * 512); i++) 120ad309a88SDingqiang Lin pwrite[i] = i; 1215238e9abSJon Lin for (loop = 0; loop < 100; loop++) { 1225238e9abSJon Lin test_lba = test_begin_lba; 123ad309a88SDingqiang Lin printf("---------Test loop = %d---------\n", loop); 124ad309a88SDingqiang Lin printf("---------Test ftl write---------\n"); 125ad309a88SDingqiang Lin test_sec_count = 1; 126ad309a88SDingqiang Lin printf("test_end_lba = %x\n", test_end_lba); 127ad309a88SDingqiang Lin printf("test_lba = %x\n", test_lba); 1286096696bSDingqiang Lin for (; (test_lba + test_sec_count) < test_end_lba;) { 129ad309a88SDingqiang Lin pwrite32[0] = test_lba; 130ad309a88SDingqiang Lin blk_dwrite(block_dev, test_lba, test_sec_count, pwrite); 131ad309a88SDingqiang Lin blk_dread(block_dev, test_lba, test_sec_count, pread); 132ad309a88SDingqiang Lin for (j = 0; j < test_sec_count * 512; j++) { 133ad309a88SDingqiang Lin if (pwrite[j] != pread[j]) { 1345238e9abSJon Lin printf("rkflash stress test fail\n"); 135ad309a88SDingqiang Lin rkflash_print_hex("w:", 136ad309a88SDingqiang Lin pwrite, 137ad309a88SDingqiang Lin 4, 138ad309a88SDingqiang Lin test_sec_count * 128); 139ad309a88SDingqiang Lin rkflash_print_hex("r:", 140ad309a88SDingqiang Lin pread, 141ad309a88SDingqiang Lin 4, 142ad309a88SDingqiang Lin test_sec_count * 128); 143ad309a88SDingqiang Lin printf("r=%x, n=%x, w=%x, r=%x\n", 144ad309a88SDingqiang Lin test_lba, 145ad309a88SDingqiang Lin j, 146ad309a88SDingqiang Lin pwrite[j], 147ad309a88SDingqiang Lin pread[j]); 148ad309a88SDingqiang Lin while (1) 149ad309a88SDingqiang Lin ; 150ad309a88SDingqiang Lin } 151ad309a88SDingqiang Lin } 152ad309a88SDingqiang Lin print_flag = test_lba & 0x1FF; 153ad309a88SDingqiang Lin if (print_flag < test_sec_count) 154ad309a88SDingqiang Lin printf("test_lba = %x\n", test_lba); 155ad309a88SDingqiang Lin test_lba += test_sec_count; 156ad309a88SDingqiang Lin test_sec_count++; 157ad309a88SDingqiang Lin if (test_sec_count > max_test_sector) 158ad309a88SDingqiang Lin test_sec_count = 1; 159ad309a88SDingqiang Lin } 160ad309a88SDingqiang Lin printf("---------Test ftl check---------\n"); 161ad309a88SDingqiang Lin 1625238e9abSJon Lin test_lba = test_begin_lba; 163ad309a88SDingqiang Lin test_sec_count = 1; 1646096696bSDingqiang Lin for (; (test_lba + test_sec_count) < test_end_lba;) { 165ad309a88SDingqiang Lin pwrite32[0] = test_lba; 166ad309a88SDingqiang Lin blk_dread(block_dev, test_lba, test_sec_count, pread); 167ad309a88SDingqiang Lin print_flag = test_lba & 0x7FF; 168ad309a88SDingqiang Lin if (print_flag < test_sec_count) 169ad309a88SDingqiang Lin printf("test_lba = %x\n", test_lba); 170ad309a88SDingqiang Lin 171ad309a88SDingqiang Lin for (j = 0; j < test_sec_count * 512; j++) { 172ad309a88SDingqiang Lin if (pwrite[j] != pread[j]) { 1735238e9abSJon Lin printf("rkflash stress test fail\n"); 174ad309a88SDingqiang Lin printf("r=%x, n=%x, w=%x, r=%x\n", 175ad309a88SDingqiang Lin test_lba, 176ad309a88SDingqiang Lin j, 177ad309a88SDingqiang Lin pwrite[j], 178ad309a88SDingqiang Lin pread[j]); 1795238e9abSJon Lin while (1) 1805238e9abSJon Lin ; 181ad309a88SDingqiang Lin } 182ad309a88SDingqiang Lin } 183ad309a88SDingqiang Lin test_lba += test_sec_count; 184ad309a88SDingqiang Lin test_sec_count++; 185ad309a88SDingqiang Lin if (test_sec_count > max_test_sector) 186ad309a88SDingqiang Lin test_sec_count = 1; 187ad309a88SDingqiang Lin } 188ad309a88SDingqiang Lin } 189ad309a88SDingqiang Lin printf("---------Test end---------\n"); 190ad309a88SDingqiang Lin /* while(1); */ 191ad309a88SDingqiang Lin } 192ad309a88SDingqiang Lin #endif 193ad309a88SDingqiang Lin 194ad309a88SDingqiang Lin void rkflash_test(struct udevice *udev) 195ad309a88SDingqiang Lin { 196ad309a88SDingqiang Lin #if (BLK_STRESS_TEST_EN) 197ad309a88SDingqiang Lin blk_stress_test(udev); 198ad309a88SDingqiang Lin #endif 199ad309a88SDingqiang Lin } 200ad309a88SDingqiang Lin 201