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:
parent
614eb1970c
commit
3e19306671
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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 */
|
||||
|
|
@ -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])
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue