[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