xref: /rk3399_rockchip-uboot/arch/x86/lib/ramtest.c (revision 746667f1e56bf08d03e66a178df3c4f4f6c806e1)
1*65dd74a6SSimon Glass /*
2*65dd74a6SSimon Glass  * Copyright (c) 2014 Google, Inc
3*65dd74a6SSimon Glass  *
4*65dd74a6SSimon Glass  * From Coreboot src/lib/ramtest.c
5*65dd74a6SSimon Glass  *
6*65dd74a6SSimon Glass  * SPDX-License-Identifier:	GPL-2.0
7*65dd74a6SSimon Glass  */
8*65dd74a6SSimon Glass 
9*65dd74a6SSimon Glass #include <common.h>
10*65dd74a6SSimon Glass #include <asm/io.h>
11*65dd74a6SSimon Glass #include <asm/post.h>
12*65dd74a6SSimon Glass 
write_phys(unsigned long addr,u32 value)13*65dd74a6SSimon Glass static void write_phys(unsigned long addr, u32 value)
14*65dd74a6SSimon Glass {
15*65dd74a6SSimon Glass #if CONFIG_SSE2
16*65dd74a6SSimon Glass 	asm volatile(
17*65dd74a6SSimon Glass 		"movnti %1, (%0)"
18*65dd74a6SSimon Glass 		: /* outputs */
19*65dd74a6SSimon Glass 		: "r" (addr), "r" (value) /* inputs */
20*65dd74a6SSimon Glass 		: /* clobbers */
21*65dd74a6SSimon Glass 		);
22*65dd74a6SSimon Glass #else
23*65dd74a6SSimon Glass 	writel(value, addr);
24*65dd74a6SSimon Glass #endif
25*65dd74a6SSimon Glass }
26*65dd74a6SSimon Glass 
read_phys(unsigned long addr)27*65dd74a6SSimon Glass static u32 read_phys(unsigned long addr)
28*65dd74a6SSimon Glass {
29*65dd74a6SSimon Glass 	return readl(addr);
30*65dd74a6SSimon Glass }
31*65dd74a6SSimon Glass 
phys_memory_barrier(void)32*65dd74a6SSimon Glass static void phys_memory_barrier(void)
33*65dd74a6SSimon Glass {
34*65dd74a6SSimon Glass #if CONFIG_SSE2
35*65dd74a6SSimon Glass 	/* Needed for movnti */
36*65dd74a6SSimon Glass 	asm volatile(
37*65dd74a6SSimon Glass 		"sfence"
38*65dd74a6SSimon Glass 		:
39*65dd74a6SSimon Glass 		:
40*65dd74a6SSimon Glass 		: "memory"
41*65dd74a6SSimon Glass 	);
42*65dd74a6SSimon Glass #else
43*65dd74a6SSimon Glass 	asm volatile(""
44*65dd74a6SSimon Glass 		:
45*65dd74a6SSimon Glass 		:
46*65dd74a6SSimon Glass 		: "memory");
47*65dd74a6SSimon Glass #endif
48*65dd74a6SSimon Glass }
49*65dd74a6SSimon Glass 
quick_ram_check(void)50*65dd74a6SSimon Glass void quick_ram_check(void)
51*65dd74a6SSimon Glass {
52*65dd74a6SSimon Glass 	int fail = 0;
53*65dd74a6SSimon Glass 	u32 backup;
54*65dd74a6SSimon Glass 
55*65dd74a6SSimon Glass 	backup = read_phys(CONFIG_RAMBASE);
56*65dd74a6SSimon Glass 	write_phys(CONFIG_RAMBASE, 0x55555555);
57*65dd74a6SSimon Glass 	phys_memory_barrier();
58*65dd74a6SSimon Glass 	if (read_phys(CONFIG_RAMBASE) != 0x55555555)
59*65dd74a6SSimon Glass 		fail = 1;
60*65dd74a6SSimon Glass 	write_phys(CONFIG_RAMBASE, 0xaaaaaaaa);
61*65dd74a6SSimon Glass 	phys_memory_barrier();
62*65dd74a6SSimon Glass 	if (read_phys(CONFIG_RAMBASE) != 0xaaaaaaaa)
63*65dd74a6SSimon Glass 		fail = 1;
64*65dd74a6SSimon Glass 	write_phys(CONFIG_RAMBASE, 0x00000000);
65*65dd74a6SSimon Glass 	phys_memory_barrier();
66*65dd74a6SSimon Glass 	if (read_phys(CONFIG_RAMBASE) != 0x00000000)
67*65dd74a6SSimon Glass 		fail = 1;
68*65dd74a6SSimon Glass 	write_phys(CONFIG_RAMBASE, 0xffffffff);
69*65dd74a6SSimon Glass 	phys_memory_barrier();
70*65dd74a6SSimon Glass 	if (read_phys(CONFIG_RAMBASE) != 0xffffffff)
71*65dd74a6SSimon Glass 		fail = 1;
72*65dd74a6SSimon Glass 
73*65dd74a6SSimon Glass 	write_phys(CONFIG_RAMBASE, backup);
74*65dd74a6SSimon Glass 	if (fail) {
75*65dd74a6SSimon Glass 		post_code(POST_RAM_FAILURE);
76*65dd74a6SSimon Glass 		panic("RAM INIT FAILURE!\n");
77*65dd74a6SSimon Glass 	}
78*65dd74a6SSimon Glass 	phys_memory_barrier();
79*65dd74a6SSimon Glass }
80