Hi
I have been playing around with the AMD fam10 codebase as of late. It is quite different from Intel hardware is that AMD hardware starts up other AP cores whereas on Intel hardware typically only the BSP runs code.
As far as I can tell the AP's are started early on. They then start running from the reset vector. The code then updates their microcode and sets a 'reasonable' TOP_MEM MTRR such that when starting the APs later on during the ramstage, it won't result in any problems given that the stack will be in that 'reasonable' range (below CONFIG_RAMTOP). After that, they are put to rest and the BSP will be doing the rest of the things during the romstage (raminit for instance).
Now the cbmem_top depends on the value the BSP set's in TOP_MEM, but unless the AP's have their own TOP_MEM (not shared MTRR) synced with the BSP. This syncing only happens during the AP init.
To implement relocatable ramstage this syncing needs to happen earlier, preferable during the romstage...
At the moment with relocatable ramstage enabled it hangs when starting the APs as it puts their stack somewhere in CBMEM well above the 'reasonable' default value of TOP_MEM which is CONFIG_RAMTOP.
Now my questions:
- Is this analysis correct? - If so, how to sync TOP_MEM in romstage (is there already an example of an implementation somewhere?), is there an easy way to run code on all AP's during the romstage? - Are workarounds possible/better? like figuring out TOP_MEM saving it nvram and resetting and programming that value on AP's
Kind regards
Arthur Heymans