From 1dc3e45f7ceb310419546117b2338d1a4f3c7032 Mon Sep 17 00:00:00 2001 From: Yu-Ping Wu Date: Tue, 16 Dec 2025 11:38:34 +0800 Subject: [PATCH] mipi: Support passing user data to mipi_cmd_func_t The mipi_cmd_func_t callback for mipi_panel_parse_init_commands() currently doesn't support passing additional data for storing context. Therefore user code would need to store any extra data in global variables. For example, in the upcoming DSI dual channel support for MediaTek platforms, the callback needs to know whether the MIPI panel supports dual channel or not. To support that use case, pass an extra `user_data` argument to mipi_cmd_func_t. BUG=b:424782827 TEST=util/abuild/abuild -x -t GOOGLE_SAPPHIRE -a BRANCH=none Change-Id: Id5d7b168cdcadfe8d8435c29d7e855a535815057 Signed-off-by: Yu-Ping Wu Reviewed-on: https://review.coreboot.org/c/coreboot/+/90519 Tested-by: build bot (Jenkins) Reviewed-by: Subrata Banik Reviewed-by: Hung-Te Lin Reviewed-by: Yidi Lin --- src/drivers/mipi/panel.c | 5 +++-- src/include/mipi/panel.h | 13 +++++++++++-- src/soc/mediatek/common/dsi_common.c | 5 +++-- src/soc/qualcomm/sc7180/display/dsi.c | 5 +++-- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/drivers/mipi/panel.c b/src/drivers/mipi/panel.c index 7279d17b9a..0182a8594a 100644 --- a/src/drivers/mipi/panel.c +++ b/src/drivers/mipi/panel.c @@ -5,7 +5,8 @@ #include #include -enum cb_err mipi_panel_parse_init_commands(const void *buf, mipi_cmd_func_t cmd_func) +enum cb_err mipi_panel_parse_init_commands(const void *buf, mipi_cmd_func_t cmd_func, + void *user_data) { const struct panel_init_command *init = buf; enum mipi_dsi_transaction type; @@ -69,7 +70,7 @@ enum cb_err mipi_panel_parse_init_commands(const void *buf, mipi_cmd_func_t cmd_ return CB_ERR; } - enum cb_err ret = cmd_func(type, init->data, len); + enum cb_err ret = cmd_func(type, init->data, len, user_data); if (ret != CB_SUCCESS) return ret; buf += len; diff --git a/src/include/mipi/panel.h b/src/include/mipi/panel.h index 938f87dc3b..d306f06fb4 100644 --- a/src/include/mipi/panel.h +++ b/src/include/mipi/panel.h @@ -223,10 +223,19 @@ struct panel_serializable_data { u8 init[]; /* A packed array of panel_init_command */ }; -typedef enum cb_err (*mipi_cmd_func_t)(enum mipi_dsi_transaction type, const u8 *data, u8 len); +/* + * Callback function type for mipi_panel_parse_init_commands(). + * @param type MIPI DSI transaction type. + * @param data panel_init_command data. + * @param len panel_init_command len. + * @param user_data Arbitrary user data passed from mipi_panel_parse_init_commands(). + */ +typedef enum cb_err (*mipi_cmd_func_t)(enum mipi_dsi_transaction type, const u8 *data, u8 len, + void *user_data); /* Parse a command array and call cmd_func() for each entry. Delays get handled internally. */ -enum cb_err mipi_panel_parse_init_commands(const void *buf, mipi_cmd_func_t cmd_func); +enum cb_err mipi_panel_parse_init_commands(const void *buf, mipi_cmd_func_t cmd_func, + void *user_data); #define PANEL_DCS(...) \ PANEL_CMD_DCS, \ diff --git a/src/soc/mediatek/common/dsi_common.c b/src/soc/mediatek/common/dsi_common.c index 5ee8985dfd..2298aa0ace 100644 --- a/src/soc/mediatek/common/dsi_common.c +++ b/src/soc/mediatek/common/dsi_common.c @@ -313,7 +313,8 @@ static bool mtk_dsi_is_read_command(enum mipi_dsi_transaction type) } } -static enum cb_err mtk_dsi_cmdq(enum mipi_dsi_transaction type, const u8 *data, u8 len) +static enum cb_err mtk_dsi_cmdq(enum mipi_dsi_transaction type, const u8 *data, u8 len, + void *user_data) { const u8 *tx_buf = data; u32 config; @@ -399,7 +400,7 @@ int mtk_dsi_init(u32 mode_flags, u32 format, u32 lanes, const struct edid *edid, mtk_dsi_config_vdo_timing(mode_flags, format, lanes, edid, &phy_timing); mtk_dsi_clk_hs_mode_enable(); if (init_commands) - mipi_panel_parse_init_commands(init_commands, mtk_dsi_cmdq); + mipi_panel_parse_init_commands(init_commands, mtk_dsi_cmdq, NULL); mtk_dsi_set_mode(mode_flags); mtk_dsi_start(); diff --git a/src/soc/qualcomm/sc7180/display/dsi.c b/src/soc/qualcomm/sc7180/display/dsi.c index 9e6977ca7b..c1e75e1090 100644 --- a/src/soc/qualcomm/sc7180/display/dsi.c +++ b/src/soc/qualcomm/sc7180/display/dsi.c @@ -205,7 +205,7 @@ static int mdss_dsi_cmd_dma_trigger_for_panel(void) } static enum cb_err mdss_dsi_send_init_cmd(enum mipi_dsi_transaction type, const u8 *body, - u8 len) + u8 len, void *user_data) { uint8_t *pload = _dma_coherent; uint32_t size; @@ -287,7 +287,8 @@ enum cb_err mdss_dsi_panel_initialize(const u8 *init_cmds) /* Enable command mode before sending the commands */ write32(&dsi0->ctrl, ctrl_mode | 0x04); - enum cb_err ret = mipi_panel_parse_init_commands(init_cmds, mdss_dsi_send_init_cmd); + enum cb_err ret = mipi_panel_parse_init_commands(init_cmds, mdss_dsi_send_init_cmd, + NULL); write32(&dsi0->ctrl, ctrl_mode); mdss_dsi_clear_intr();