On Wed, Dec 6, 2017 at 12:30 AM, Jon Hunter <jonathanh@xxxxxxxxxx> wrote:
I'd love to get a good explanation as to why it hangs without this change,
On 04/12/17 18:37, Guillaume Tucker wrote:
If the firmware fails to load then ->fini() will be called before theb/drivers/gpu/drm/nouveau/nvkm/subdev/bar/gf100.c
device has been initialised, causing the kernel to hang while trying
to write to a register. Add a test in ->fini() to avoid this issue.
This fixes a kernel hang on tegra124.
Fixes: b17de35a2ebbe ("drm/nouveau/bar: implement bar1 teardown")
Signed-off-by: Guillaume Tucker <guillaume.tucker@xxxxxxxxxxxxx>
CC: Ben Skeggs <bskeggs@xxxxxxxxxx>
---
drivers/gpu/drm/nouveau/nvkm/subdev/bar/gf100.c | 7 +++++--
1 file changed, 5 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/bar/gf100.c
index a3ba7f50198b..95e2aba64aad 100644
--- a/drivers/gpu/drm/nouveau/nvkm/subdev/bar/gf100.c
+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/bar/gf100.c
@@ -43,9 +43,12 @@ gf100_bar_bar1_wait(struct nvkm_bar *base)
}
void
-gf100_bar_bar1_fini(struct nvkm_bar *bar)
+gf100_bar_bar1_fini(struct nvkm_bar *base)
{
- nvkm_mask(bar->subdev.device, 0x001704, 0x80000000, 0x00000000);
+ struct nvkm_device *device = base->subdev.device;
+
+ if (base->subdev.oneinit)
+ nvkm_mask(device, 0x001704, 0x80000000, 0x00000000);
}
void
I have tested this and it works for me. Thanks for fixing this! Would be
good to get Ben's ACK, but you can have my ...
as, on the surface, it's not immediately obvious as to why it's hanging.
Tested-by: Jon Hunter <jonathanh@xxxxxxxxxx>