| // SPDX-License-Identifier: GPL-2.0 | |
| /* | |
| * Copyright (c) 2014 Google, Inc | |
| * | |
| * From Coreboot src/lib/ramtest.c | |
| */ | |
| #include <asm/io.h> | |
| #include <asm/post.h> | |
| #include <vsprintf.h> | |
| static void write_phys(unsigned long addr, u32 value) | |
| { | |
| #if CONFIG_SSE2 | |
| asm volatile( | |
| "movnti %1, (%0)" | |
| : /* outputs */ | |
| : "r" (addr), "r" (value) /* inputs */ | |
| : /* clobbers */ | |
| ); | |
| #else | |
| writel(value, addr); | |
| #endif | |
| } | |
| static u32 read_phys(unsigned long addr) | |
| { | |
| return readl(addr); | |
| } | |
| static void phys_memory_barrier(void) | |
| { | |
| #if CONFIG_SSE2 | |
| /* Needed for movnti */ | |
| asm volatile( | |
| "sfence" | |
| : | |
| : | |
| : "memory" | |
| ); | |
| #else | |
| asm volatile("" | |
| : | |
| : | |
| : "memory"); | |
| #endif | |
| } | |
| void quick_ram_check(void) | |
| { | |
| int fail = 0; | |
| u32 backup; | |
| backup = read_phys(CONFIG_RAMBASE); | |
| write_phys(CONFIG_RAMBASE, 0x55555555); | |
| phys_memory_barrier(); | |
| if (read_phys(CONFIG_RAMBASE) != 0x55555555) | |
| fail = 1; | |
| write_phys(CONFIG_RAMBASE, 0xaaaaaaaa); | |
| phys_memory_barrier(); | |
| if (read_phys(CONFIG_RAMBASE) != 0xaaaaaaaa) | |
| fail = 1; | |
| write_phys(CONFIG_RAMBASE, 0x00000000); | |
| phys_memory_barrier(); | |
| if (read_phys(CONFIG_RAMBASE) != 0x00000000) | |
| fail = 1; | |
| write_phys(CONFIG_RAMBASE, 0xffffffff); | |
| phys_memory_barrier(); | |
| if (read_phys(CONFIG_RAMBASE) != 0xffffffff) | |
| fail = 1; | |
| write_phys(CONFIG_RAMBASE, backup); | |
| if (fail) { | |
| post_code(POST_RAM_FAILURE); | |
| panic("RAM INIT FAILURE!\n"); | |
| } | |
| phys_memory_barrier(); | |
| } |