From 5b1a8b53b6333ae0048c304f06c848979b24d33e Mon Sep 17 00:00:00 2001 From: Felix Held Date: Wed, 23 Apr 2025 17:42:42 +0200 Subject: [PATCH] soc/amd/common/i23c_pad_ctrl: add I3C pad config options Before, the I2C/I3C pads could only be configured to I2C mode. To be able to use the I3C controller, add the corresponding options and implementation for the I3C pad mode with all possible voltages. Change-Id: I1cc2e830019101cfef96b9474477717a8a75111c Signed-off-by: Felix Held Reviewed-on: https://review.coreboot.org/c/coreboot/+/87435 Tested-by: build bot (Jenkins) Reviewed-by: Maximilian Brune --- src/soc/amd/common/block/i2c/i23c_pad_ctrl.c | 31 +++++++++++++++++-- .../amd/common/block/include/amdblocks/i2c.h | 3 ++ 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/soc/amd/common/block/i2c/i23c_pad_ctrl.c b/src/soc/amd/common/block/i2c/i23c_pad_ctrl.c index bff6223b78..be5ebc4fd2 100644 --- a/src/soc/amd/common/block/i2c/i23c_pad_ctrl.c +++ b/src/soc/amd/common/block/i2c/i23c_pad_ctrl.c @@ -14,26 +14,51 @@ void fch_i23c_pad_init(unsigned int bus, pad_ctrl = misc_read32(MISC_I23C_PAD_CTRL(bus)); - pad_ctrl &= ~I23C_PAD_CTRL_MODE_I3C_I2C_MASK; - pad_ctrl |= I23C_PAD_CTRL_MODE_I2C; - switch (ctrl->rx_level) { case I2C_PAD_RX_NO_CHANGE: + pad_ctrl &= ~I23C_PAD_CTRL_MODE_I3C_I2C_MASK; + pad_ctrl |= I23C_PAD_CTRL_MODE_I2C; /* Default is enabled and thresholds for 1.8V operation */ break; case I2C_PAD_RX_OFF: + pad_ctrl &= ~I23C_PAD_CTRL_MODE_I3C_I2C_MASK; + pad_ctrl |= I23C_PAD_CTRL_MODE_I2C; pad_ctrl &= ~I23C_PAD_CTRL_RX_SEL_MASK; pad_ctrl |= I23C_PAD_CTRL_RX_SEL_OFF; pad_ctrl &= ~I23C_PAD_CTRL_MODE_1_8V_1_1V_MASK; pad_ctrl |= I23C_PAD_CTRL_MODE_1_8V; break; case I2C_PAD_RX_1_8V: + pad_ctrl &= ~I23C_PAD_CTRL_MODE_I3C_I2C_MASK; + pad_ctrl |= I23C_PAD_CTRL_MODE_I2C; pad_ctrl &= ~I23C_PAD_CTRL_RX_SEL_MASK; pad_ctrl |= I23C_PAD_CTRL_RX_SEL_ON; pad_ctrl &= ~I23C_PAD_CTRL_MODE_1_8V_1_1V_MASK; pad_ctrl |= I23C_PAD_CTRL_MODE_1_8V; break; case I2C_PAD_RX_1_1V: + pad_ctrl &= ~I23C_PAD_CTRL_MODE_I3C_I2C_MASK; + pad_ctrl |= I23C_PAD_CTRL_MODE_I2C; + pad_ctrl &= ~I23C_PAD_CTRL_RX_SEL_MASK; + pad_ctrl |= I23C_PAD_CTRL_RX_SEL_ON; + pad_ctrl &= ~I23C_PAD_CTRL_MODE_1_8V_1_1V_MASK; + pad_ctrl |= I23C_PAD_CTRL_MODE_1_1V; + break; + case I3C_PAD_RX_NO_CHANGE: + pad_ctrl &= ~I23C_PAD_CTRL_MODE_I3C_I2C_MASK; + pad_ctrl |= I23C_PAD_CTRL_MODE_I3C; + break; + case I3C_PAD_RX_1_8V: + pad_ctrl &= ~I23C_PAD_CTRL_MODE_I3C_I2C_MASK; + pad_ctrl |= I23C_PAD_CTRL_MODE_I3C; + pad_ctrl &= ~I23C_PAD_CTRL_RX_SEL_MASK; + pad_ctrl |= I23C_PAD_CTRL_RX_SEL_ON; + pad_ctrl &= ~I23C_PAD_CTRL_MODE_1_8V_1_1V_MASK; + pad_ctrl |= I23C_PAD_CTRL_MODE_1_8V; + break; + case I3C_PAD_RX_1_1V: + pad_ctrl &= ~I23C_PAD_CTRL_MODE_I3C_I2C_MASK; + pad_ctrl |= I23C_PAD_CTRL_MODE_I3C; pad_ctrl &= ~I23C_PAD_CTRL_RX_SEL_MASK; pad_ctrl |= I23C_PAD_CTRL_RX_SEL_ON; pad_ctrl &= ~I23C_PAD_CTRL_MODE_1_8V_1_1V_MASK; diff --git a/src/soc/amd/common/block/include/amdblocks/i2c.h b/src/soc/amd/common/block/include/amdblocks/i2c.h index 94ac173d9b..fc1a03217a 100644 --- a/src/soc/amd/common/block/include/amdblocks/i2c.h +++ b/src/soc/amd/common/block/include/amdblocks/i2c.h @@ -62,6 +62,9 @@ enum i2c_pad_rx_level { I2C_PAD_RX_3_3V, I2C_PAD_RX_1_8V, I2C_PAD_RX_1_1V, + I3C_PAD_RX_NO_CHANGE, + I3C_PAD_RX_1_8V, + I3C_PAD_RX_1_1V, }; struct i2c_pad_control {