cmd: memtester: add cpu data to io remap

Change-Id: Ia9e2e6014c162cc929f5cbcb1559c91245c273bd
Signed-off-by: Tang Yun ping <typ@rock-chips.com>
This commit is contained in:
Tang Yun ping 2018-12-24 11:24:39 +08:00 committed by Kever Yang
parent 614eb1970c
commit 3e19306671
5 changed files with 168 additions and 31 deletions

View File

@ -1,2 +1,3 @@
obj-$(CONFIG_CMD_MEMTESTER) += tests.o
obj-$(CONFIG_CMD_MEMTESTER) += memtester.o
obj-$(CONFIG_CMD_MEMTESTER) += memtester.o
obj-$(CONFIG_CMD_MEMTESTER) += io_map.o

91
cmd/memtester/io_map.c Normal file
View File

@ -0,0 +1,91 @@
/* SPDX-License-Identifier: GPL-2.0 */
/*
* Very simple but very effective user-space memory tester.
* Originally by Simon Kirby <sim@stormix.com> <sim@neato.org>
* Version 2 by Charles Cazabon <charlesc-memtester@pyropus.ca>
* Version 3 not publicly released.
* Version 4 rewrite:
* Copyright (C) 2004-2012 Charles Cazabon <charlesc-memtester@pyropus.ca>
* Licensed under the terms of the GNU General Public License version 2 (only).
* See the file COPYING for details.
*
* This file contains the functions for the actual tests, called from the
* main routine in memtester.c. See other comments in that file.
*
*/
#include <common.h>
#include "io_map.h"
#define IO_TYPE_1_1_16 0
#define IO_TYPE_1_1_32 1
#define IO_TYPE_1_2 2
#define IO_TYPE_2 3
static u32 io_type;
/* len should be 16byte align */
int data_cpu_2_io(void *p, u32 len)
{
uchar *val = p;
uchar buf[16];
u32 i, j;
if ((len % sizeof(buf)) || !len)
return -1;
if (io_type == IO_TYPE_1_2) {
len /= sizeof(buf);
for (j = 0; j < len; j++) {
memset(buf, 0, sizeof(buf));
for (i = 0; i < sizeof(buf); i++)
buf[i] = val[(i % 4) * 4 + i / 4 + j * sizeof(buf)];
memcpy(&val[j * sizeof(buf)], buf, sizeof(buf));
}
} else if (io_type == IO_TYPE_1_1_32) {
len /= 8;
for (j = 0; j < len; j++) {
memset(buf, 0, sizeof(buf));
for (i = 0; i < 8; i++)
buf[i] = val[(i % 4) * 2 + i / 4 + j * 8];
memcpy(&val[j * 8], buf, 8);
}
}
/* IO_TYPE_2 and IO_TYPE_1_1_16 do nothing*/
return 0;
}
void data_cpu_2_io_init(void)
{
u32 osreg = 0;
u32 bw;
#if defined(CONFIG_ROCKCHIP_RK3036)
io_type = IO_TYPE_1_1_16;
#elif defined(CONFIG_ROCKCHIP_RK3228) || \
defined(CONFIG_ROCKCHIP_RV1108) || \
defined(CONFIG_ROCKCHIP_RK3368) || \
defined(CONFIG_ROCKCHIP_RK3366)
io_type = IO_TYPE_1_2;
#elif defined(CONFIG_ROCKCHIP_RK3128)
osreg = 0x200081cc;
#elif defined(CONFIG_ROCKCHIP_RK3288)
osreg = 0xff73009c;
#elif defined(CONFIG_ROCKCHIP_RK3188)
osreg = 0x20004048;
#elif defined(CONFIG_ROCKCHIP_RK3328) || \
defined(CONFIG_ROCKCHIP_PX30) || \
defined(CONFIG_ROCKCHIP_RK1808)
io_type = IO_TYPE_2;
#else
io_type = IO_TYPE_2;
#endif
if (osreg) {
bw = (2 >> ((osreg >> 2) & 0x3));
if (bw == 2)
io_type = IO_TYPE_1_1_32;
else
io_type = IO_TYPE_1_1_16;
}
}

13
cmd/memtester/io_map.h Normal file
View File

@ -0,0 +1,13 @@
/*
* Copyright (C) 2017 Rockchip Electronics Co., Ltd.
*
* SPDX-License-Identifier: GPL-2.0+
*/
#ifndef _CMD_MEMTESTER_IO_MAP_H
#define _CMD_MEMTESTER_IO_MAP_H
int data_cpu_2_io(void *p, u32 len);
void data_cpu_2_io_init(void);
#endif /* _CMD_MEMTESTER_IO_MAP_H */

View File

@ -20,6 +20,7 @@
#include "sizes.h"
#include "types.h"
#include "tests.h"
#include "io_map.h"
#define EXIT_FAIL_NONSTARTER 0x01
#define EXIT_FAIL_ADDRESSLINES 0x02
@ -148,6 +149,8 @@ static int do_memtester(cmd_tbl_t *cmdtp, int flag, int argc,
}
}
data_cpu_2_io_init();
for (loop = 1; ((!loops) || loop <= loops); loop++) {
for (j = 0; j < 2; j++) {
if (!bufa[j])

View File

@ -17,6 +17,7 @@
#include "memtester.h"
#include "sizes.h"
#include "types.h"
#include "io_map.h"
union {
unsigned char bytes[UL_LEN / 8];
@ -239,6 +240,7 @@ int test_solidbits_comparison(u32v *bufa, u32v *bufb, size_t count)
u32v *p2 = bufb;
unsigned int j;
u32 q;
u32 data[4];
size_t i;
printf(" ");
@ -246,12 +248,15 @@ int test_solidbits_comparison(u32v *bufa, u32v *bufb, size_t count)
for (j = 0; j < 64; j++) {
printf("\b\b\b\b\b\b\b\b\b\b\b");
q = (j % 2) == 0 ? UL_ONEBITS : 0;
data[0] = data[2] = q;
data[1] = data[3] = ~q;
data_cpu_2_io(data, sizeof(data));
printf("setting %3u", j);
fflush(stdout);
p1 = (u32v *)bufa;
p2 = (u32v *)bufb;
for (i = 0; i < count; i++)
*p1++ = *p2++ = (i % 2) == 0 ? q : ~q;
*p1++ = *p2++ = data[i & 3];
printf("\b\b\b\b\b\b\b\b\b\b\b");
printf("testing %3u", j);
fflush(stdout);
@ -269,6 +274,7 @@ int test_checkerboard_comparison(u32v *bufa, u32v *bufb, size_t count)
u32v *p2 = bufb;
unsigned int j;
u32 q;
u32 data[4];
size_t i;
printf(" ");
@ -276,12 +282,15 @@ int test_checkerboard_comparison(u32v *bufa, u32v *bufb, size_t count)
for (j = 0; j < 64; j++) {
printf("\b\b\b\b\b\b\b\b\b\b\b");
q = (j % 2) == 0 ? CHECKERBOARD1 : CHECKERBOARD2;
data[0] = data[2] = q;
data[1] = data[3] = ~q;
data_cpu_2_io(data, sizeof(data));
printf("setting %3u", j);
fflush(stdout);
p1 = (u32v *)bufa;
p2 = (u32v *)bufb;
for (i = 0; i < count; i++)
*p1++ = *p2++ = (i % 2) == 0 ? q : ~q;
*p1++ = *p2++ = data[i & 3];
printf("\b\b\b\b\b\b\b\b\b\b\b");
printf("testing %3u", j);
fflush(stdout);
@ -298,6 +307,7 @@ int test_blockseq_comparison(u32v *bufa, u32v *bufb, size_t count)
u32v *p1 = bufa;
u32v *p2 = bufb;
unsigned int j;
u32 data[4];
size_t i;
printf(" ");
@ -308,8 +318,12 @@ int test_blockseq_comparison(u32v *bufa, u32v *bufb, size_t count)
p2 = (u32v *)bufb;
printf("setting %3u", j);
fflush(stdout);
data[0] = data[2] = (u32)UL_BYTE(j);
data[1] = data[3] = (u32)UL_BYTE(j);
data_cpu_2_io(data, sizeof(data));
for (i = 0; i < count; i++)
*p1++ = *p2++ = (u32)UL_BYTE(j);
*p1++ = *p2++ = data[i & 3];
printf("\b\b\b\b\b\b\b\b\b\b\b");
printf("testing %3u", j);
fflush(stdout);
@ -326,6 +340,7 @@ int test_walkbits0_comparison(u32v *bufa, u32v *bufb, size_t count)
u32v *p1 = bufa;
u32v *p2 = bufb;
unsigned int j;
u32 data[4];
size_t i;
printf(" ");
@ -336,12 +351,17 @@ int test_walkbits0_comparison(u32v *bufa, u32v *bufb, size_t count)
p2 = (u32v *)bufb;
printf("setting %3u", j);
fflush(stdout);
if (j < UL_LEN)
data[0] = ONE << j;
else
data[0] = ONE << (UL_LEN * 2 - j - 1);
data[1] = data[0];
data[2] = data[0];
data[3] = data[0];
data_cpu_2_io(data, sizeof(data));
for (i = 0; i < count; i++) {
if (j < UL_LEN) { /* Walk it up. */
*p1++ = *p2++ = ONE << j;
} else { /* Walk it back down. */
*p1++ = *p2++ = ONE << (UL_LEN * 2 - j - 1);
}
*p1++ = *p2++ = data[i & 3];
}
printf("\b\b\b\b\b\b\b\b\b\b\b");
printf("testing %3u", j);
@ -359,6 +379,7 @@ int test_walkbits1_comparison(u32v *bufa, u32v *bufb, size_t count)
u32v *p1 = bufa;
u32v *p2 = bufb;
unsigned int j;
u32 data[4];
size_t i;
printf(" ");
@ -369,13 +390,17 @@ int test_walkbits1_comparison(u32v *bufa, u32v *bufb, size_t count)
p2 = (u32v *)bufb;
printf("setting %3u", j);
fflush(stdout);
if (j < UL_LEN)
data[0] = UL_ONEBITS ^ (ONE << j);
else
data[0] = UL_ONEBITS ^ (ONE << (UL_LEN * 2 - j - 1));
data[1] = data[0];
data[2] = data[0];
data[3] = data[0];
data_cpu_2_io(data, sizeof(data));
for (i = 0; i < count; i++) {
if (j < UL_LEN) { /* Walk it up. */
*p1++ = *p2++ = UL_ONEBITS ^ (ONE << j);
} else { /* Walk it back down. */
*p1++ = *p2++ =
UL_ONEBITS ^ (ONE << (UL_LEN * 2 - j - 1));
}
*p1++ = *p2++ = data[i & 3];
}
printf("\b\b\b\b\b\b\b\b\b\b\b");
printf("testing %3u", j);
@ -393,6 +418,7 @@ int test_bitspread_comparison(u32v *bufa, u32v *bufb, size_t count)
u32v *p1 = bufa;
u32v *p2 = bufb;
unsigned int j;
u32 data[4];
size_t i;
printf(" ");
@ -403,22 +429,21 @@ int test_bitspread_comparison(u32v *bufa, u32v *bufb, size_t count)
p2 = (u32v *)bufb;
printf("setting %3u", j);
fflush(stdout);
if (j < UL_LEN) {
data[0] = (ONE << j) | (ONE << (j + 2));
data[1] = UL_ONEBITS ^ ((ONE << j) | (ONE << (j + 2)));
} else {
data[0] = (ONE << (UL_LEN * 2 - 1 - j)) |
(ONE << (UL_LEN * 2 + 1 - j));
data[1] = UL_ONEBITS ^ (ONE << (UL_LEN * 2 - 1 - j)
| (ONE << (UL_LEN * 2 + 1 - j)));
}
data[2] = data[0];
data[3] = data[1];
data_cpu_2_io(data, sizeof(data));
for (i = 0; i < count; i++) {
if (j < UL_LEN) { /* Walk it up. */
*p1++ = *p2++ = (i % 2 == 0)
? (ONE << j) | (ONE << (j + 2))
: UL_ONEBITS ^ ((ONE << j)
| (ONE << (j + 2)));
} else { /* Walk it back down. */
*p1++ = *p2++ = (i % 2 == 0)
? (ONE << (UL_LEN * 2 - 1 - j)) | (ONE <<
(UL_LEN *
2 + 1 -
j))
: UL_ONEBITS ^ (ONE << (UL_LEN * 2 - 1 - j)
| (ONE <<
(UL_LEN * 2 + 1 - j)));
}
*p1++ = *p2++ = data[i & 3];
}
printf("\b\b\b\b\b\b\b\b\b\b\b");
printf("testing %3u", j);
@ -437,6 +462,7 @@ int test_bitflip_comparison(u32v *bufa, u32v *bufb, size_t count)
u32v *p2 = bufb;
unsigned int j, k;
u32 q;
u32 data[4];
size_t i;
printf(" ");
@ -448,10 +474,13 @@ int test_bitflip_comparison(u32v *bufa, u32v *bufb, size_t count)
q = ~q;
printf("setting %3u", k * 8 + j);
fflush(stdout);
data[0] = data[2] = q;
data[1] = data[3] = ~q;
data_cpu_2_io(data, sizeof(data));
p1 = (u32v *)bufa;
p2 = (u32v *)bufb;
for (i = 0; i < count; i++)
*p1++ = *p2++ = (i % 2) == 0 ? q : ~q;
*p1++ = *p2++ = data[i & 3];
printf("\b\b\b\b\b\b\b\b\b\b\b");
printf("testing %3u", k * 8 + j);
fflush(stdout);