nb/intel/*: Account for cbmem_top alignment

Having cbmem floating between two ram regions is a bad idea and some
payloads (e.g. tianocore) even bail out on this. To overcome this issue mark the
region between tom and cbmem as uma.

Change-Id: Ifab37b0003f09a680024d5b155ab0bb157920952
Signed-off-by: Arthur Heymans <arthur@aheymans.xyz>
Reviewed-on: https://review.coreboot.org/27871
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
This commit is contained in:
Arthur Heymans
2018-08-06 15:35:28 +02:00
committed by Patrick Georgi
parent 794f56bdf5
commit 17ad4598e9
4 changed files with 48 additions and 4 deletions

View File

@ -14,6 +14,7 @@
* GNU General Public License for more details.
*/
#include <cbmem.h>
#include <console/console.h>
#include <arch/io.h>
#include <stdint.h>
@ -35,7 +36,7 @@ static void mch_domain_read_resources(struct device *dev)
{
u8 index, reg8;
u64 tom, touud;
u32 tomk, tseg_sizek = 0, tolud;
u32 tomk, tseg_sizek = 0, tolud, delta_cbmem;
u32 pcie_config_base, pcie_config_size;
u32 uma_sizek = 0;
@ -100,6 +101,15 @@ static void mch_domain_read_resources(struct device *dev)
printk(BIOS_DEBUG, "%dM\n", tseg_sizek >> 10);
/* cbmem_top can be shifted downwards due to alignment.
Mark the region between cbmem_top and tomk as unusable */
delta_cbmem = tomk - ((uint32_t)cbmem_top() >> 10);
tomk -= delta_cbmem;
uma_sizek += delta_cbmem;
printk(BIOS_DEBUG, "Unused RAM between cbmem_top and TOM: 0x%xK\n",
delta_cbmem);
printk(BIOS_INFO, "Available memory below 4GB: %uM\n", tomk >> 10);
/* Report the memory regions */