amd: raminit sysinfo offset fix

The sysinfo object within the k8 ram init is used
to communicate progess/status from all the nodes in the
system. However, the code was assuming where the sysinfo
object lived in cache-as-ram. The layout of cache-as-ram
is dynamic so one needs to do the lookup of the correct
address at runtime. The way the amd code is compiled
by #include'ing .c files makes the solution a little
more complex in that some cache-as-ram support code
needed to be refactored.

Change-Id: I6500fa7b005dc082c4c0b3382ee2c3a138d9ac31
Signed-off-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-on: http://review.coreboot.org/10961
Tested-by: build bot (Jenkins)
Tested-by: Raptor Engineering Automated Test Stand <noreply@raptorengineeringinc.com>
Reviewed-by: Patrick Georgi <pgeorgi@google.com>
This commit is contained in:
Aaron Durbin
2015-07-16 16:07:02 -05:00
parent db01ddfd49
commit 0dc7354760
8 changed files with 30 additions and 25 deletions

View File

@@ -519,7 +519,8 @@ struct sys_info {
} __attribute__((packed));
#ifdef __PRE_RAM__
extern struct sys_info sysinfo_car;
#include <arch/early_variables.h>
struct sys_info sysinfo_car CAR_GLOBAL;
#endif
#include <reset.h>

View File

@@ -263,7 +263,8 @@ struct sys_info {
} __attribute__((packed));
#ifdef __PRE_RAM__
extern struct sys_info sysinfo_car;
#include <arch/early_variables.h>
struct sys_info sysinfo_car CAR_GLOBAL;
#endif
#endif /* AMDK8_PRE_F_H */

View File

@@ -17,9 +17,6 @@
#include "option_table.h"
#endif
#include <arch/early_variables.h>
struct sys_info sysinfo_car CAR_GLOBAL;
void setup_resource_map(const unsigned int *register_values, int max)
{
int i;

View File

@@ -42,9 +42,6 @@
#endif
#include <arch/early_variables.h>
struct sys_info sysinfo_car CAR_GLOBAL;
#include "f_pci.c"

View File

@@ -2074,7 +2074,11 @@ static void train_ram(unsigned nodeid, struct sys_info *sysinfo, struct sys_info
static inline void train_ram_on_node(unsigned nodeid, unsigned coreid, struct sys_info *sysinfo, unsigned retcall)
{
if(coreid) return; // only do it on core0
struct sys_info *sysinfox = (void *)((CONFIG_RAMTOP) - sizeof(*sysinfox));
struct sys_info *sysinfox;
uintptr_t migrated_base = CONFIG_RAMTOP - car_data_size();
sysinfox = (void *)(migrated_base + car_object_offset(&sysinfo_car));
wait_till_sysinfo_in_ram(); // use pci to get it
if(sysinfox->mem_trained[nodeid] == 0x80) {