[lvc-project] [PATCH] gpu: fix potential division by zero in DesignWare controller driver
Fedor Pchelkin
pchelkin at ispras.ru
Fri Oct 24 23:25:43 MSK 2025
Добрый вечер!
`git log drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c` говорит, что
префикс для патчей в этот драйвер есть "drm/hisilicon:".
Информация "in DesignWare controller driver" не нужна в названии, отчасти
это уже понятно из корректного префикса. Можете конкретизировать, написав
имя функции.
drm/hisilicon: fix potential division by zero in dsi_get_phy_params()
On Tue, 30. Sep 15:08, Pavel Zhigulin wrote:
> A division by zero may occur in the dsi_get_phy_params function if
> phy_req_kHz is in the range [1000000, 1500000]. In this case,
Хм, внутри dsi_calc_phy_rate() после сравнения req_kHz с верхней граничной
частотой из таблицы dphy_range_info дальше в цикле идёт какая-то логика,
после чего выход из цикла всё равно происходит только при условии
if (f_kHz >= req_kHz)
break;
т.е. судя по всему при передаче req_kHz из последней строчки таблицы
static const struct dsi_phy_range dphy_range_info[] = {
{ 46875, 62500, 1, 7 },
{ 62500, 93750, 0, 7 },
{ 93750, 125000, 1, 6 },
{ 125000, 187500, 0, 6 },
{ 187500, 250000, 1, 5 },
{ 250000, 375000, 0, 5 },
{ 375000, 500000, 1, 4 },
{ 500000, 750000, 0, 4 },
{ 750000, 1000000, 1, 0 },
{ 1000000, 1500000, 0, 0 }
};
переменная ui будет детерминированно выходить равной нулю.
Вы это уже описали, насколько вижу.
Странно, выглядит как баг либо в алгоритме, либо в таблице (последняя
строчка невалидна).
Нашёл репозиторий, в котором зафиксирована история разработки этого
драйвера в кулуарах Linaro. Коммит, немного поменявший логику и
добавивший этот странный выход из цикла по условию:
https://github.com/tom-gall/hikey-linaro/commit/4b637a8ba6250b33442df63418d70b918dca7428
Похоже проблема всё-таки в алгоритме. Но как-то узнать, чего тут хотели
сделать и проверить работу драйвера в действии не представляется
возможным, потому кроме патча с проверкой нам ничего и не остаётся..
> dsi_calc_phy_rate can return a value greater than 1000000, which sets
> the 'ui' variable to zero. The variable is then used as the denominator
> in the ROUND macro.
>
> This patch adds an additional check of phy_rate_kHz to prevent 'ui'
> from being zero.
Используйте, пожалуйста, императивный стиль при описании вводимых патчем
изменений. Такая рекомендация прописана в основном гайде по отправке
патчей в ядро.
Патч с подправленным названием и описанием можете направить только в
lvc-patches at linuxtesting.org.
Спасибо!
>
> Found by Linux Verification Center (linuxtesting.org) with SVACE.
>
> Fixes: f819b0d4a913 ("drm/hisilicon: Add designware dsi encoder driver")
> Signed-off-by: Pavel Zhigulin <Pavel.Zhigulin at kaspersky.com>
> ---
> drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c b/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c
> index e80debdc4176..7502a9ddbbf5 100644
> --- a/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c
> +++ b/drivers/gpu/drm/hisilicon/kirin/dw_drm_dsi.c
> @@ -251,7 +251,7 @@ static void dsi_get_phy_params(u32 phy_req_kHz,
> memset(phy, 0, sizeof(*phy));
>
> phy_rate_kHz = dsi_calc_phy_rate(phy_req_kHz, phy);
> - if (!phy_rate_kHz)
> + if (!phy_rate_kHz || phy_rate_kHz > 1000000)
> return;
>
> ui = 1000000 / phy_rate_kHz;
> --
> 2.43.0
More information about the lvc-project
mailing list