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 <yupingso@chromium.org>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/90519
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Subrata Banik <subratabanik@google.com>
Reviewed-by: Hung-Te Lin <hungte@chromium.org>
Reviewed-by: Yidi Lin <yidilin@google.com>
This commit is contained in:
Yu-Ping Wu 2025-12-16 11:38:34 +08:00 committed by Yu-Ping Wu
commit 1dc3e45f7c
4 changed files with 20 additions and 8 deletions

View file

@ -5,7 +5,8 @@
#include <mipi/panel.h>
#include <types.h>
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;

View file

@ -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, \

View file

@ -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();

View file

@ -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();