From: Thierry Reding <tred...@nvidia.com>

Display controllers that don't own any windows and which therefore
aren't currently being assigned a primary plane are not registered
as a CRTC with the DRM framework. They request neither a syncpoint
nor an interrupt because they don't use them, so avoid cleaning up
those resources.

Signed-off-by: Thierry Reding <tred...@nvidia.com>
---
 drivers/gpu/drm/tegra/dc.c | 38 ++++++++++++++++++++++----------------
 1 file changed, 22 insertions(+), 16 deletions(-)

diff --git a/drivers/gpu/drm/tegra/dc.c b/drivers/gpu/drm/tegra/dc.c
index f80e82e16475..607a6ea17ecc 100644
--- a/drivers/gpu/drm/tegra/dc.c
+++ b/drivers/gpu/drm/tegra/dc.c
@@ -1978,6 +1978,23 @@ static irqreturn_t tegra_dc_irq(int irq, void *data)
        return IRQ_HANDLED;
 }
 
+static bool tegra_dc_has_window_groups(struct tegra_dc *dc)
+{
+       unsigned int i;
+
+       if (!dc->soc->wgrps)
+               return true;
+
+       for (i = 0; i < dc->soc->num_wgrps; i++) {
+               const struct tegra_windowgroup_soc *wgrp = &dc->soc->wgrps[i];
+
+               if (wgrp->dc == dc->pipe && wgrp->num_windows > 0)
+                       return true;
+       }
+
+       return false;
+}
+
 static int tegra_dc_init(struct host1x_client *client)
 {
        struct drm_device *drm = dev_get_drvdata(client->parent);
@@ -1993,22 +2010,8 @@ static int tegra_dc_init(struct host1x_client *client)
         * assign a primary plane to them, which in turn will cause KMS to
         * crash.
         */
-       if (dc->soc->wgrps) {
-               bool has_wgrps = false;
-               unsigned int i;
-
-               for (i = 0; i < dc->soc->num_wgrps; i++) {
-                       const struct tegra_windowgroup_soc *wgrp = 
&dc->soc->wgrps[i];
-
-                       if (wgrp->dc == dc->pipe && wgrp->num_windows > 0) {
-                               has_wgrps = true;
-                               break;
-                       }
-               }
-
-               if (!has_wgrps)
-                       return 0;
-       }
+       if (!tegra_dc_has_window_groups(dc))
+               return 0;
 
        dc->syncpt = host1x_syncpt_request(client, flags);
        if (!dc->syncpt)
@@ -2094,6 +2097,9 @@ static int tegra_dc_exit(struct host1x_client *client)
        struct tegra_dc *dc = host1x_client_to_dc(client);
        int err;
 
+       if (!tegra_dc_has_window_groups(dc))
+               return 0;
+
        devm_free_irq(dc->dev, dc->irq, dc);
 
        err = tegra_dc_rgb_exit(dc);
-- 
2.19.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to