drm/omap: pll: fix iteration loop check
authorTomi Valkeinen <tomi.valkeinen@ti.com>
Tue, 15 Dec 2020 10:46:31 +0000 (12:46 +0200)
committerTomi Valkeinen <tomi.valkeinen@ti.com>
Tue, 15 Dec 2020 14:17:30 +0000 (16:17 +0200)
If the PLL calc function is given bad parameters, n_start/m_start may be
higher than n_stop/m_stop, which leads to the loops iterating through
the whole u32 number space.

Fix this by failing early on such cases.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20201215104657.802264-59-tomi.valkeinen@ti.com
drivers/gpu/drm/omapdrm/dss/pll.c

index 241a338..4c8246a 100644 (file)
@@ -222,6 +222,9 @@ bool dss_pll_calc_a(const struct dss_pll *pll, unsigned long clkin,
        n_stop = min((unsigned)(clkin / fint_hw_min), hw->n_max);
        n_inc = 1;
 
+       if (n_start > n_stop)
+               return false;
+
        if (hw->errata_i886) {
                swap(n_start, n_stop);
                n_inc = -1;
@@ -239,6 +242,9 @@ bool dss_pll_calc_a(const struct dss_pll *pll, unsigned long clkin,
                                hw->m_max);
                m_inc = 1;
 
+               if (m_start > m_stop)
+                       continue;
+
                if (hw->errata_i886) {
                        swap(m_start, m_stop);
                        m_inc = -1;