From 11ff753407ee7fd1cb2da06f8bedc5ac40ebbd95 Mon Sep 17 00:00:00 2001 From: Felix Held Date: Tue, 6 Jun 2023 00:29:58 +0200 Subject: soc/amd/common/block/cpu/noncar: add get_usable_physical_address_bits() In case the secure memory encryption is enabled, some of the upper usable address bits of the host can't be used any more. Bits 11..6 in CPUID_EBX_MEM_ENCRYPT indicate how many of the address bits are taken away from the usable address bits in the case the secure memory encryption is enabled. Signed-off-by: Felix Held Change-Id: Ia810b0984972216095da2ad8f9c19e37684f2a2e Reviewed-on: https://review.coreboot.org/c/coreboot/+/75623 Reviewed-by: Arthur Heymans Reviewed-by: Raul Rangel Tested-by: build bot (Jenkins) --- src/soc/amd/common/block/cpu/noncar/cpu.c | 18 ++++++++++++++++++ src/soc/amd/common/block/include/amdblocks/cpu.h | 1 + 2 files changed, 19 insertions(+) (limited to 'src/soc') diff --git a/src/soc/amd/common/block/cpu/noncar/cpu.c b/src/soc/amd/common/block/cpu/noncar/cpu.c index 4afb69a299..891dece7dd 100644 --- a/src/soc/amd/common/block/cpu/noncar/cpu.c +++ b/src/soc/amd/common/block/cpu/noncar/cpu.c @@ -1,9 +1,12 @@ /* SPDX-License-Identifier: GPL-2.0-only */ #include +#include #include #include +#include #include +#include #include #include #include @@ -31,3 +34,18 @@ void set_cstate_io_addr(void) cst_addr.lo = ACPI_CSTATE_CONTROL; wrmsr(MSR_CSTATE_ADDRESS, cst_addr); } + +static uint32_t get_smee_reserved_address_bits(void) +{ + if (rdmsr(SYSCFG_MSR).raw & SYSCFG_MSR_SMEE) + return (cpuid_ebx(CPUID_EBX_MEM_ENCRYPT) & + CPUID_EBX_MEM_ENCRYPT_ADDR_BITS_MASK) >> + CPUID_EBX_MEM_ENCRYPT_ADDR_BITS_SHIFT; + else + return 0; +} + +uint32_t get_usable_physical_address_bits(void) +{ + return cpu_phys_address_size() - get_smee_reserved_address_bits(); +} diff --git a/src/soc/amd/common/block/include/amdblocks/cpu.h b/src/soc/amd/common/block/include/amdblocks/cpu.h index 4aa225bda3..10dd23f11b 100644 --- a/src/soc/amd/common/block/include/amdblocks/cpu.h +++ b/src/soc/amd/common/block/include/amdblocks/cpu.h @@ -12,6 +12,7 @@ void early_cache_setup(void); int get_cpu_count(void); unsigned int get_threads_per_core(void); void set_cstate_io_addr(void); +uint32_t get_usable_physical_address_bits(void); void write_resume_eip(void); union pstate_msr; /* proper definition is in soc/msr.h */ -- cgit v1.2.3