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