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 <sean@starlabs.systems>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/90911
Reviewed-by: Matt DeVillier <matt.devillier@gmail.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
Sean Rhodes 2026-01-26 13:03:59 +00:00
commit d80482400f

View file

@ -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;
}