soc/amd/picasso: Move BERT region to cbmem
Allocate storage for the BERT reserved memory in cbmem, and add it in response to a romstage hook. Add a Kconfig option for adjusting the size reserved. This is different from the Stoney Ridge implementation where it was intentionally oversized to ease MTRR use and to keep TSEG aligned. Signed-off-by: Marshall Dawson <marshalldawson3rd@gmail.com> Signed-off-by: Felix Held <felix-coreboot@felixheld.de> Change-Id: I4759154d394a8f5b35c0ef0a15994bbef25492e5 Reviewed-on: https://review.coreboot.org/c/coreboot/+/38694 Reviewed-by: Raul Rangel <rrangel@chromium.org> Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
		
				
					committed by
					
						 Felix Held
						Felix Held
					
				
			
			
				
	
			
			
			
						parent
						
							4fc59af03d
						
					
				
				
					commit
					901cb9ca46
				
			| @@ -199,6 +199,13 @@ config ACPI_BERT | |||||||
| 	  ACPI Boot Error Record Table.  This option reserves an 8MB region | 	  ACPI Boot Error Record Table.  This option reserves an 8MB region | ||||||
| 	  for building the error structures. | 	  for building the error structures. | ||||||
|  |  | ||||||
|  | config ACPI_BERT_SIZE | ||||||
|  | 	hex | ||||||
|  | 	default 0x4000 | ||||||
|  | 	help | ||||||
|  | 	  Specify the amount of DRAM reserved for gathering the data used to | ||||||
|  | 	  generate the ACPI table. | ||||||
|  |  | ||||||
| config RO_REGION_ONLY | config RO_REGION_ONLY | ||||||
| 	string | 	string | ||||||
| 	depends on CHROMEOS | 	depends on CHROMEOS | ||||||
|   | |||||||
| @@ -8,6 +8,7 @@ | |||||||
| #include <console/console.h> | #include <console/console.h> | ||||||
| #include <arch/bert_storage.h> | #include <arch/bert_storage.h> | ||||||
| #include <cper.h> | #include <cper.h> | ||||||
|  | #include <cbmem.h> | ||||||
|  |  | ||||||
| struct mca_bank { | struct mca_bank { | ||||||
| 	int bank; | 	int bank; | ||||||
| @@ -193,3 +194,31 @@ void check_mca(void) | |||||||
| 	for (i = 0 ; i < num_banks ; i++) | 	for (i = 0 ; i < num_banks ; i++) | ||||||
| 		wrmsr(IA32_MC0_STATUS + (i * 4), mci.sts); | 		wrmsr(IA32_MC0_STATUS + (i * 4), mci.sts); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void bert_reserved_region(void **start, size_t *size) | ||||||
|  | { | ||||||
|  | 	const struct cbmem_entry *bert; | ||||||
|  |  | ||||||
|  | 	*start = NULL; | ||||||
|  | 	*size = 0; | ||||||
|  |  | ||||||
|  | 	bert = cbmem_entry_find(CBMEM_ID_BERT_RAW_DATA); | ||||||
|  | 	if (!bert) | ||||||
|  | 		return; | ||||||
|  |  | ||||||
|  | 	*start = cbmem_entry_start(bert); | ||||||
|  | 	*size = cbmem_entry_size(bert); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void alloc_bert_in_cbmem(int unused) | ||||||
|  | { | ||||||
|  | 	void *p; | ||||||
|  |  | ||||||
|  | 	if (CONFIG(ACPI_BERT)) { | ||||||
|  | 		p = cbmem_add(CBMEM_ID_BERT_RAW_DATA, CONFIG_ACPI_BERT_SIZE); | ||||||
|  | 		if (!p) | ||||||
|  | 			printk(BIOS_ERR, "Error: BERT region was not added\n"); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | ROMSTAGE_CBMEM_INIT_HOOK(alloc_bert_in_cbmem) | ||||||
|   | |||||||
| @@ -16,26 +16,6 @@ | |||||||
| #include <soc/iomap.h> | #include <soc/iomap.h> | ||||||
| #include <amdblocks/acpimmio.h> | #include <amdblocks/acpimmio.h> | ||||||
|  |  | ||||||
| #if CONFIG(ACPI_BERT) |  | ||||||
|  #if CONFIG_SMM_TSEG_SIZE == 0x0 |  | ||||||
|   #define BERT_REGION_MAX_SIZE 0x100000 |  | ||||||
|  #else |  | ||||||
|   /* SMM_TSEG_SIZE must stay on a boundary appropriate for its granularity */ |  | ||||||
|   #define BERT_REGION_MAX_SIZE CONFIG_SMM_TSEG_SIZE |  | ||||||
|  #endif |  | ||||||
| #else |  | ||||||
|  #define BERT_REGION_MAX_SIZE 0 |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| void bert_reserved_region(void **start, size_t *size) |  | ||||||
| { |  | ||||||
| 	if (CONFIG(ACPI_BERT)) |  | ||||||
| 		*start = cbmem_top(); |  | ||||||
| 	else |  | ||||||
| 		start = NULL; |  | ||||||
| 	*size = BERT_REGION_MAX_SIZE; |  | ||||||
| } |  | ||||||
|  |  | ||||||
| void *cbmem_top_chipset(void) | void *cbmem_top_chipset(void) | ||||||
| { | { | ||||||
| 	msr_t tom = rdmsr(TOP_MEM); | 	msr_t tom = rdmsr(TOP_MEM); | ||||||
| @@ -45,13 +25,12 @@ void *cbmem_top_chipset(void) | |||||||
|  |  | ||||||
| 	/* 8MB alignment to keep MTRR usage low */ | 	/* 8MB alignment to keep MTRR usage low */ | ||||||
| 	return (void *)ALIGN_DOWN(restore_top_of_low_cacheable() | 	return (void *)ALIGN_DOWN(restore_top_of_low_cacheable() | ||||||
| 			- CONFIG_SMM_TSEG_SIZE | 			- CONFIG_SMM_TSEG_SIZE, 8*MiB); | ||||||
| 			- BERT_REGION_MAX_SIZE, 8*MiB); |  | ||||||
| } | } | ||||||
|  |  | ||||||
| static uintptr_t smm_region_start(void) | static uintptr_t smm_region_start(void) | ||||||
| { | { | ||||||
| 	return (uintptr_t)cbmem_top() + BERT_REGION_MAX_SIZE; | 	return (uintptr_t)cbmem_top(); | ||||||
| } | } | ||||||
|  |  | ||||||
| static size_t smm_region_size(void) | static size_t smm_region_size(void) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user