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