1
0

disp: msm: sde: add multi-mode RFI support

Currently, RFI feature only supports panel that contains
a single timing node. This limits the feature availability
for panel with multiple modes or with DFPS support.

This change adds support for RFI on panels that contains
multiple timing nodes.

Change-Id: I3a7aadf7b6da3518350b2eb815602b13b5c259f5
Signed-off-by: Amine Najahi <anajahi@codeaurora.org>
Este cometimento está contido em:
Amine Najahi
2021-02-16 16:53:04 -05:00
cometido por Gerrit - the friendly Code Review server
ascendente d4def5bd8c
cometimento c5f2bd7401
7 ficheiros modificados com 102 adições e 75 eliminações

Ver ficheiro

@@ -6678,12 +6678,11 @@ static void _dsi_display_populate_bit_clks(struct dsi_display *display,
src = &display->modes[i];
if (!src)
return;
/*
* TODO: currently setting the first bit rate in
* the list as preferred rate. But ideally should
* be based on user or device tree preferrence.
*/
src->timing.clk_rate_hz = dyn_clk_caps->bit_clk_list[0];
if (!src->priv_info->bit_clk_list.count)
continue;
src->timing.clk_rate_hz = src->priv_info->bit_clk_list.rates[0];
dsi_display_adjust_mode_timing(display, src, lanes, bpp);
@@ -6728,6 +6727,7 @@ static void _dsi_display_populate_bit_clks(struct dsi_display *display,
int dsi_display_restore_bit_clk(struct dsi_display *display, struct dsi_display_mode *mode)
{
int i;
u32 clk_rate_hz = 0;
if (!display || !mode || !mode->priv_info) {
@@ -6735,17 +6735,24 @@ int dsi_display_restore_bit_clk(struct dsi_display *display, struct dsi_display_
return -EINVAL;
}
/* for dynamic DSI use specified clock rate otherwise restore clock rate */
if (display->dyn_bit_clk > 0)
clk_rate_hz = display->dyn_bit_clk;
else if (display->cached_clk_rate > 0)
clk_rate_hz = display->cached_clk_rate;
clk_rate_hz = display->cached_clk_rate;
if (mode->priv_info->bit_clk_list.count) {
/* use first entry as the default bit clk rate */
clk_rate_hz = mode->priv_info->bit_clk_list.rates[0];
for (i = 0; i < mode->priv_info->bit_clk_list.count; i++) {
if (display->dyn_bit_clk == mode->priv_info->bit_clk_list.rates[i])
clk_rate_hz = display->dyn_bit_clk;
}
}
mode->timing.clk_rate_hz = clk_rate_hz;
mode->priv_info->clk_rate_hz = clk_rate_hz;
DSI_DEBUG("dyn_bit_clk:%u, cached_clk_rate:%u, clk_rate_hz:%u\n",
display->dyn_bit_clk, display->cached_clk_rate, clk_rate_hz);
SDE_EVT32(clk_rate_hz, display->cached_clk_rate, display->dyn_bit_clk);
DSI_DEBUG("clk_rate_hz:%u, cached_clk_rate:%u, dyn_bit_clk:%u\n",
clk_rate_hz, display->cached_clk_rate, display->dyn_bit_clk);
return 0;
}
@@ -8412,6 +8419,9 @@ int dsi_display_update_dyn_bit_clk(struct dsi_display *display,
} else if (!display->dyn_bit_clk_pending) {
DSI_DEBUG("dynamic bit clock rate not updated\n");
return 0;
} else if (!display->dyn_bit_clk) {
DSI_DEBUG("dynamic bit clock rate cleared\n");
return 0;
} else if (display->dyn_bit_clk < mode->priv_info->min_dsi_clk_hz) {
DSI_ERR("dynamic bit clock rate %llu smaller than minimum value:%llu\n",
display->dyn_bit_clk, mode->priv_info->min_dsi_clk_hz);
@@ -8440,6 +8450,8 @@ int dsi_display_update_dyn_bit_clk(struct dsi_display *display,
mode->pixel_clk_khz = div_u64(mode->timing.clk_rate_hz * lanes, bpp);
do_div(mode->pixel_clk_khz, 1000);
mode->pixel_clk_khz *= display->ctrl_count;
SDE_EVT32(display->dyn_bit_clk, mode->priv_info->min_dsi_clk_hz, mode->pixel_clk_khz);
DSI_DEBUG("dynamic bit clk:%u, min dsi clk:%llu, lanes:%d, bpp:%d, pck:%d Khz\n",
display->dyn_bit_clk, mode->priv_info->min_dsi_clk_hz, lanes, bpp,
mode->pixel_clk_khz);