summaryrefslogtreecommitdiffstats
path: root/resources/libreboot/patch/coreboot/369b561315ca68d0cdedc38208105a513c7139b5/grub/kcma-d8/0011-cpu-amd-family_10h-family_15h-Move-CBMEM-storage-out.patch
diff options
context:
space:
mode:
Diffstat (limited to 'resources/libreboot/patch/coreboot/369b561315ca68d0cdedc38208105a513c7139b5/grub/kcma-d8/0011-cpu-amd-family_10h-family_15h-Move-CBMEM-storage-out.patch')
-rw-r--r--resources/libreboot/patch/coreboot/369b561315ca68d0cdedc38208105a513c7139b5/grub/kcma-d8/0011-cpu-amd-family_10h-family_15h-Move-CBMEM-storage-out.patch107
1 files changed, 107 insertions, 0 deletions
diff --git a/resources/libreboot/patch/coreboot/369b561315ca68d0cdedc38208105a513c7139b5/grub/kcma-d8/0011-cpu-amd-family_10h-family_15h-Move-CBMEM-storage-out.patch b/resources/libreboot/patch/coreboot/369b561315ca68d0cdedc38208105a513c7139b5/grub/kcma-d8/0011-cpu-amd-family_10h-family_15h-Move-CBMEM-storage-out.patch
new file mode 100644
index 0000000..1c25598
--- /dev/null
+++ b/resources/libreboot/patch/coreboot/369b561315ca68d0cdedc38208105a513c7139b5/grub/kcma-d8/0011-cpu-amd-family_10h-family_15h-Move-CBMEM-storage-out.patch
@@ -0,0 +1,107 @@
+From 908455aa41424aefbb328fd8c826be2e2b344ce6 Mon Sep 17 00:00:00 2001
+From: Timothy Pearson <tpearson@raptorengineeringinc.com>
+Date: Tue, 24 Nov 2015 14:11:48 -0600
+Subject: [PATCH 11/45] cpu/amd/family_10h-family_15h: Move CBMEM storage out
+ of CC6 save region
+
+The existing CBMEM TOM calculations did not account for the CC6 save region
+(when enabled); this resulted in CBMEM storage being placed on top of the
+CC6 save region, which resulted in corrupt CBMEM data and a boot hang.
+
+Signed-off-by: Timothy Pearson <tpearson@raptorengineeringinc.com>
+---
+ src/cpu/amd/family_10h-family_15h/ram_calc.c | 51 +++++++++++++++++++++++++++-
+ src/cpu/amd/family_10h-family_15h/ram_calc.h | 1 +
+ 2 files changed, 51 insertions(+), 1 deletion(-)
+
+diff --git a/src/cpu/amd/family_10h-family_15h/ram_calc.c b/src/cpu/amd/family_10h-family_15h/ram_calc.c
+index 9ac2c99..4fe997e 100644
+--- a/src/cpu/amd/family_10h-family_15h/ram_calc.c
++++ b/src/cpu/amd/family_10h-family_15h/ram_calc.c
+@@ -18,11 +18,30 @@
+ #include <cpu/x86/msr.h>
+ #include <cpu/amd/mtrr.h>
+
++#include <arch/io.h>
++#include <device/device.h>
++#include <device/pci.h>
++
+ #include <cbmem.h>
+
+ #include "ram_calc.h"
+
+ #if !IS_ENABLED(CONFIG_LATE_CBMEM_INIT)
++static inline uint8_t is_fam15h(void)
++{
++ uint8_t fam15h = 0;
++ uint32_t family;
++
++ family = cpuid_eax(0x80000001);
++ family = ((family & 0xf00000) >> 16) | ((family & 0xf00) >> 8);
++
++ if (family >= 0x6f)
++ /* Family 15h or later */
++ fam15h = 1;
++
++ return fam15h;
++}
++
+ uint64_t get_uma_memory_size(uint64_t topmem)
+ {
+ uint64_t uma_size = 0;
+@@ -41,10 +60,40 @@ uint64_t get_uma_memory_size(uint64_t topmem)
+ return uma_size;
+ }
+
++uint64_t get_cc6_memory_size()
++{
++ uint8_t enable_cc6;
++
++ uint64_t cc6_size = 0;
++
++ if (is_fam15h()) {
++ enable_cc6 = 0;
++
++#ifdef __PRE_RAM__
++ if (pci_read_config32(PCI_DEV(0, 0x18, 2), 0x118) & (0x1 << 18))
++ enable_cc6 = 1;
++#else
++ device_t dct_dev = dev_find_slot(0, PCI_DEVFN(0x18, 2));
++ if (pci_read_config32(dct_dev, 0x118) & (0x1 << 18))
++ enable_cc6 = 1;
++#endif
++
++ if (enable_cc6) {
++ /* Preserve the maximum possible CC6 save region
++ * This needs to be kept in sync with
++ * amdfam10_domain_read_resources() in northbridge.c
++ */
++ cc6_size = 0x8000000;
++ }
++ }
++
++ return cc6_size;
++}
++
+ void *cbmem_top(void)
+ {
+ uint32_t topmem = rdmsr(TOP_MEM).lo;
+
+- return (void *) topmem - get_uma_memory_size(topmem);
++ return (void *) topmem - get_uma_memory_size(topmem) - get_cc6_memory_size();
+ }
+ #endif
+diff --git a/src/cpu/amd/family_10h-family_15h/ram_calc.h b/src/cpu/amd/family_10h-family_15h/ram_calc.h
+index 8cfc199..0bb4cac 100644
+--- a/src/cpu/amd/family_10h-family_15h/ram_calc.h
++++ b/src/cpu/amd/family_10h-family_15h/ram_calc.h
+@@ -17,5 +17,6 @@
+ #define _AMD_MODEL_10XXX_RAM_CALC_H_
+
+ uint64_t get_uma_memory_size(uint64_t topmem);
++uint64_t get_cc6_memory_size(void);
+
+ #endif
+--
+2.1.4
+