By popular request, this is a patch to buildrom adding support for the AMD SimNow simulator. Basically, it patches LinuxBIOS to work around a few SimNow related quirks that are currently in the public version of SimNow. The quirks themselves have been reported, and hopefully will be fixed in future releases.
What is SimNow, and why does it rock, you might ask? SimNow (TM) is a processor simulator that we have developed at AMD. Its a great way to simulate the processor / chipset boot process and develop LinuxBIOS and payloads, because it features an integrated debugger, and its easy to fix when you brick the thing (just hit reset). There is a public version here:
http://developer.amd.com/simnow.jsp
For the more commercial customers out there, there is also a NDA version that has support for more processors (contact your friendly AMD representative for more information). I'll put this information on the wiki as well, for posterity.
Myles and other SimNow users - let me know if this works.
Thanks, Jordan
[BUILDROM] Add support for the AMD SimNow (TM) simulator
Add a build option and a patch against LinuxBIOS to allow the Serengeti-Cheetah platform to come up on its emulated self in the SimNow simulator.
Signed-off-by: Jordan Crouse jordan.crouse@amd.com
Index: buildrom-devel/config/platforms/Config.in =================================================================== --- buildrom-devel.orig/config/platforms/Config.in +++ buildrom-devel/config/platforms/Config.in @@ -81,4 +81,13 @@ config PLATFORM_SERENGETI_CHEETAH depends VENDOR_AMD select PLATFORM endchoice + +config SIMNOW + bool "Build for the AMD SimNow (TM) emulator" + depends PLATFORM_SERENGETI_CHEETAH + default n + help + Say 'y' here to patch the build to work on an + emulated platform in the AMD SimNow (TM) simulator + endmenu Index: buildrom-devel/packages/linuxbios/generic-linuxbios.mk =================================================================== --- buildrom-devel.orig/packages/linuxbios/generic-linuxbios.mk +++ buildrom-devel/packages/linuxbios/generic-linuxbios.mk @@ -21,6 +21,10 @@ endif
LINUXBIOS_PATCHES += $(PACKAGE_DIR)/linuxbios/patches/s-c-buildrom-payload.patch
+ifeq ($(CONFIG_SIMNOW),y) +LINUXBIOS_PATCHES += $(PACKAGE_DIR)/linuxbios/patches/simnow.patch +endif + include $(PACKAGE_DIR)/linuxbios/linuxbios.inc
$(SOURCE_DIR)/$(LINUXBIOS_TARBALL): Index: buildrom-devel/packages/linuxbios/patches/simnow.patch =================================================================== --- /dev/null +++ buildrom-devel/packages/linuxbios/patches/simnow.patch @@ -0,0 +1,59 @@ +Index: svn/src/northbridge/amd/amdk8/raminit_f_dqs.c +=================================================================== +--- svn.orig/src/northbridge/amd/amdk8/raminit_f_dqs.c ++++ svn/src/northbridge/amd/amdk8/raminit_f_dqs.c +@@ -1987,6 +1987,16 @@ static inline void train_ram_on_node(uns + struct sys_info *sysinfox = ((CONFIG_LB_MEM_TOPK<<10) - DCACHE_RAM_GLOBAL_VAR_SIZE); + wait_till_sysinfo_in_ram(); // use pci to get it + ++ /* In SimNow, when we get to this point, CAR is disabled, so ++ * our stack pointer points to never-never land, andjust it. ++ */ ++ ++ __asm__ volatile ( ++ "subl %0, %%ebp\n\t" ++ "subl %0, %%esp\n\t" ++ ::"a"( (DCACHE_RAM_BASE + DCACHE_RAM_SIZE)- (CONFIG_LB_MEM_TOPK<<10) ) ++ ); ++ + if(sysinfox->mem_trained[nodeid] == 0x80) { + #if 0 + sysinfo->tom_k = sysinfox->tom_k; +Index: svn/src/mainboard/amd/serengeti_cheetah/Options.lb +=================================================================== +--- svn.orig/src/mainboard/amd/serengeti_cheetah/Options.lb ++++ svn/src/mainboard/amd/serengeti_cheetah/Options.lb +@@ -218,7 +218,7 @@ default CONFIG_USE_INIT=0 + ## + ## for rev F training on AP purpose + ## +-default CONFIG_AP_CODE_IN_CAR=1 ++default CONFIG_AP_CODE_IN_CAR=0 + default MEM_TRAIN_SEQ=1 + default WAIT_BEFORE_CPUS_INIT=1 + +Index: svn/src/mainboard/amd/serengeti_cheetah/cache_as_ram_auto.c +=================================================================== +--- svn.orig/src/mainboard/amd/serengeti_cheetah/cache_as_ram_auto.c ++++ svn/src/mainboard/amd/serengeti_cheetah/cache_as_ram_auto.c +@@ -338,16 +338,18 @@ void real_main(unsigned long bist, unsig + } + #endif + +-#if 1 + needs_reset = optimize_link_coherent_ht(); ++#if 0 ++ /* On SimNow, this causes issues - remove it for now */ + needs_reset |= optimize_link_incoherent_ht(sysinfo); ++#endif + + // fidvid change will issue one LDTSTOP and the HT change will be effective too + if (needs_reset) { + print_info("ht reset -\r\n"); + soft_reset_x(sysinfo->sbbusn, sysinfo->sbdn); + } +-#endif ++ + allow_all_aps_stop(bsp_apicid); + + //It's the time to set ctrl in sysinfo now;