]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/nouveau/pmu/gm20b,gp10b: Fix Falcon bootstrapping
authorThierry Reding <treding@nvidia.com>
Wed, 15 Jan 2020 14:06:13 +0000 (15:06 +0100)
committerBen Skeggs <bskeggs@redhat.com>
Wed, 22 Jan 2020 22:56:51 +0000 (08:56 +1000)
The low-level Falcon bootstrapping callbacks are expected to return 0 on
success or a negative error code on failure. However, the implementation
on Tegra returns the ID or mask of the Falcons that were bootstrapped on
success, thus breaking the calling code, which treats this as failure.

Fix this by making sure we only return 0 or a negative error code, just
like the code for discrete GPUs does.

Fixes: 062b2e0490a4 ("drm/nouveau/flcn/cmdq: move command generation to subdevs")
Signed-off-by: Thierry Reding <treding@nvidia.com>
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gm20b.c
drivers/gpu/drm/nouveau/nvkm/subdev/pmu/gp10b.c

index 6d5a13e4a857ed77cf1828a7cdee3394f9610572..82571032a07d004e27c465408ed7046e23b11ebe 100644 (file)
@@ -52,8 +52,13 @@ gm20b_pmu_acr_bootstrap_falcon(struct nvkm_falcon *falcon,
        ret = nvkm_falcon_cmdq_send(pmu->hpq, &cmd.cmd.hdr,
                                    gm20b_pmu_acr_bootstrap_falcon_cb,
                                    &pmu->subdev, msecs_to_jiffies(1000));
-       if (ret >= 0 && ret != cmd.falcon_id)
-               ret = -EIO;
+       if (ret >= 0) {
+               if (ret != cmd.falcon_id)
+                       ret = -EIO;
+               else
+                       ret = 0;
+       }
+
        return ret;
 }
 
index 39c86bc56310dcd4225d1e1913ba1a0edaa21b1e..5b81c732047963b7e31dcbff7c8cb65dfea6f2bc 100644 (file)
@@ -52,8 +52,13 @@ gp10b_pmu_acr_bootstrap_multiple_falcons(struct nvkm_falcon *falcon, u32 mask)
        ret = nvkm_falcon_cmdq_send(pmu->hpq, &cmd.cmd.hdr,
                                    gp10b_pmu_acr_bootstrap_multiple_falcons_cb,
                                    &pmu->subdev, msecs_to_jiffies(1000));
-       if (ret >= 0 && ret != cmd.falcon_mask)
-               ret = -EIO;
+       if (ret >= 0) {
+               if (ret != cmd.falcon_mask)
+                       ret = -EIO;
+               else
+                       ret = 0;
+       }
+
        return ret;
 }