From a4c91e15f879eb2b6cf0984f97c6efdc6c8fdca8 Mon Sep 17 00:00:00 2001 From: Subrata Banik Date: Sat, 16 Mar 2024 17:57:28 +0530 Subject: arch/x86: Add API to check if cache sets are power-of-two Introduce a function to determine whether the number of cache sets is a power of two. This aligns with common cache design practices that favor power-of-two counts for efficient indexing and addressing. BUG=b:306677879 BRANCH=firmware-rex-15709.B TEST=Verified functionality on google/ovis and google/rex (including a non-power-of-two Ovis configuration). Change-Id: I819e0d1aeb4c1dbe1cdf3115b2e172588a6e8da5 Signed-off-by: Subrata Banik Reviewed-on: https://review.coreboot.org/c/coreboot/+/81268 Reviewed-by: Stefan Reinauer Tested-by: build bot (Jenkins) --- src/arch/x86/cpu_common.c | 16 ++++++++++++++++ src/arch/x86/include/arch/cpu.h | 9 +++++++++ 2 files changed, 25 insertions(+) (limited to 'src') diff --git a/src/arch/x86/cpu_common.c b/src/arch/x86/cpu_common.c index c4d30a2c06..ee0721412b 100644 --- a/src/arch/x86/cpu_common.c +++ b/src/arch/x86/cpu_common.c @@ -1,5 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0-only */ +#include #include #include @@ -234,3 +235,18 @@ bool fill_cpu_cache_info(uint8_t level, struct cpu_cache_info *info) return true; } + +bool is_cache_sets_power_of_two(void) +{ + struct cpu_cache_info info; + + if (!fill_cpu_cache_info(CACHE_L3, &info)) + return false; + + size_t cache_sets = cpu_get_cache_sets(&info); + + if (IS_POWER_OF_2(cache_sets)) + return true; + + return false; +} diff --git a/src/arch/x86/include/arch/cpu.h b/src/arch/x86/include/arch/cpu.h index 0c4decfc1b..fa0d5f4678 100644 --- a/src/arch/x86/include/arch/cpu.h +++ b/src/arch/x86/include/arch/cpu.h @@ -329,6 +329,15 @@ uint8_t cpu_get_c_substate_support(const int state); */ bool fill_cpu_cache_info(uint8_t level, struct cpu_cache_info *info); +/* + * Determines whether the number of cache sets is a power of two. + * + * Cache designs often favor power-of-two set counts for efficient indexing + * and addressing. This function checks if the provided cache configuration + * adheres to this practice. + */ +bool is_cache_sets_power_of_two(void); + #if CONFIG(RESERVED_PHYSICAL_ADDRESS_BITS_SUPPORT) unsigned int get_reserved_phys_addr_bits(void); #else -- cgit v1.2.3