ec/starlabs/merlin: Fix get_ec_value_from_option() value validation

The function incorrectly treated option values as array indices.
Update the function to search the LUT array for the value, and return
it if found, otherwise return the fallback value (not index).

Update call sites to pass EC value constants (SEC_30, FN_CTRL, etc.)
as the fallback values instead of numeric indices.

TEST=build/boot starlabs/starlite, verify charge limit and other EC
options work properly and values set properly in ECRAM using ectool.

Change-Id: Ie44d912932c8a3cec6ce0829c024788421cf89aa
Signed-off-by: Matt DeVillier <matt.devillier@gmail.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/90100
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Sean Rhodes <sean@starlabs.systems>
This commit is contained in:
Matt DeVillier 2025-11-18 12:03:42 -06:00 committed by Sean Rhodes
commit a4242e5c38

View file

@ -41,16 +41,19 @@ static uint8_t get_ec_value_from_option(const char *name,
uint32_t cmos_start_bit,
uint32_t cmos_length)
{
unsigned int index;
uint8_t value;
if (cmos_start_bit != UINT_MAX)
index = get_cmos_value(cmos_start_bit, cmos_length);
value = get_cmos_value(cmos_start_bit, cmos_length);
else
index = get_uint_option(name, fallback);
value = get_uint_option(name, fallback);
if (index >= lut_size)
index = fallback;
return lut[index];
/* Check if the value exists in the LUT array */
for (int i = 0; i < lut_size; i++)
if (lut[i] == value)
return value;
return fallback;
}
static uint16_t ec_get_chip_id(unsigned int port)
@ -118,7 +121,7 @@ static void merlin_init(struct device *dev)
ec_write(ECRAM_KBL_TIMEOUT,
get_ec_value_from_option("kbl_timeout",
0,
SEC_30,
kbl_timeout,
ARRAY_SIZE(kbl_timeout),
UINT_MAX,
@ -140,7 +143,7 @@ static void merlin_init(struct device *dev)
ec_write(ECRAM_FN_CTRL_REVERSE,
get_ec_value_from_option("fn_ctrl_swap",
0,
FN_CTRL,
fn_ctrl_swap,
ARRAY_SIZE(fn_ctrl_swap),
UINT_MAX,
@ -164,7 +167,7 @@ static void merlin_init(struct device *dev)
if (CONFIG(EC_STARLABS_MAX_CHARGE))
ec_write(ECRAM_MAX_CHARGE,
get_ec_value_from_option("max_charge",
0,
CHARGE_100,
max_charge,
ARRAY_SIZE(max_charge),
UINT_MAX,
@ -189,7 +192,7 @@ static void merlin_init(struct device *dev)
if (CONFIG(EC_STARLABS_FAN))
ec_write(ECRAM_FAN_MODE,
get_ec_value_from_option("fan_mode",
0,
FAN_NORMAL,
fan_mode,
ARRAY_SIZE(fan_mode),
UINT_MAX,
@ -212,7 +215,7 @@ static void merlin_init(struct device *dev)
ec_write(ECRAM_FN_LOCK_STATE,
get_ec_value_from_option("fn_lock_state",
1,
UNLOCKED,
fn_lock_state,
ARRAY_SIZE(fn_lock_state),
CMOS_VSTART_fn_lock_state,
@ -236,7 +239,7 @@ static void merlin_init(struct device *dev)
ec_write(ECRAM_TRACKPAD_STATE,
get_ec_value_from_option("trackpad_state",
0,
TRACKPAD_ENABLED,
trackpad_state,
ARRAY_SIZE(trackpad_state),
CMOS_VSTART_trackpad_state,
@ -262,7 +265,7 @@ static void merlin_init(struct device *dev)
ec_write(ECRAM_KBL_BRIGHTNESS,
get_ec_value_from_option("kbl_brightness",
CONFIG(EC_STARLABS_KBL_LEVELS) ? 2 : 0,
CONFIG(EC_STARLABS_KBL_LEVELS) ? KBL_LOW : KBL_ON,
kbl_brightness,
ARRAY_SIZE(kbl_brightness),
CMOS_VSTART_kbl_brightness,
@ -327,7 +330,7 @@ static void merlin_init(struct device *dev)
if (CONFIG(EC_STARLABS_LID_SWITCH))
ec_write(ECRAM_LID_SWITCH,
get_ec_value_from_option("lid_switch",
0,
SWITCH_NORMAL,
lid_switch,
ARRAY_SIZE(lid_switch),
UINT_MAX,
@ -351,7 +354,7 @@ static void merlin_init(struct device *dev)
if (CONFIG(EC_STARLABS_POWER_LED))
ec_write(ECRAM_POWER_LED,
get_ec_value_from_option("power_led",
0,
LED_NORMAL,
power_led,
ARRAY_SIZE(power_led),
UINT_MAX,