From d80482400f88a187739c44eb9f4bfb13a2d34f54 Mon Sep 17 00:00:00 2001 From: Sean Rhodes Date: Mon, 26 Jan 2026 13:03:59 +0000 Subject: [PATCH] drivers/option/cfr: Fix numeric default override CFR default overrides use SM_OBJ_* kinds, but write_numeric_option() compared them to CFR_TAG_OPTION_*, so enum/number/bool overrides were always skipped. Compare kinds against the expected SM_OBJ_* for each numeric tag, then apply the override. Change-Id: I02046974a7b0a3ef32973689833e1b0d38a5d6f4 Signed-off-by: Sean Rhodes Reviewed-on: https://review.coreboot.org/c/coreboot/+/90911 Reviewed-by: Matt DeVillier Tested-by: build bot (Jenkins) --- src/drivers/option/cfr.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/drivers/option/cfr.c b/src/drivers/option/cfr.c index d5390231d6..1a5f1d67d7 100644 --- a/src/drivers/option/cfr.c +++ b/src/drivers/option/cfr.c @@ -123,6 +123,21 @@ static uint32_t sm_write_enum_value(char *current, const struct sm_enum_value *e return enum_val->size; } + +static bool override_matches_numeric_tag(enum sm_object_kind override_kind, uint32_t tag) +{ + switch (tag) { + case CFR_TAG_OPTION_ENUM: + return override_kind == SM_OBJ_ENUM; + case CFR_TAG_OPTION_NUMBER: + return override_kind == SM_OBJ_NUMBER; + case CFR_TAG_OPTION_BOOL: + return override_kind == SM_OBJ_BOOL; + default: + return false; + } +} + static uint32_t write_numeric_option(char *current, uint32_t tag, const uint64_t object_id, const char *opt_name, const char *ui_name, const char *ui_helptext, uint32_t flags, uint32_t default_value, uint32_t min, uint32_t max, uint32_t step, @@ -135,10 +150,8 @@ static uint32_t write_numeric_option(char *current, uint32_t tag, const uint64_t /* Check for mainboard override of default value */ const struct cfr_default_override *ovr = find_override(opt_name); if (ovr) { - if (ovr->kind != tag) + if (!override_matches_numeric_tag(ovr->kind, tag)) printk(BIOS_WARNING, "CFR: override for option '%s' has mismatched type; skipping.\n", opt_name); - else if (tag == CFR_TAG_OPTION_BOOL) - default_value = ovr->bool_value; else default_value = ovr->uint_value; }