diff options
author | Daniel Stone <daniels@collabora.com> | 2018-03-30 10:11:28 -0400 |
---|---|---|
committer | Thierry Reding <treding@nvidia.com> | 2018-05-17 11:44:48 -0400 |
commit | c34a997d033df6bbeaf5c06e9124f89bc0ecac8d (patch) | |
tree | 4cbf0b7ad081ccd64f6630fc78fe77cdbff733ab | |
parent | dbc33c7d65536bce447057dc6f882decc515047d (diff) |
drm/tegra: Move fbdev unmap special case
User framebuffers are created with either bo->pages or bo->vaddr set,
depending on whether or not an IOMMU is present. On the other hand, the
framebuffer created for fbdev emulation has a vaddr mapping made if
bo->pages is set after creation. This is set up in fbdev probe.
Remove the special case unmapping from the general-purpose framebuffer
destroy, and move it to fbdev teardown.
Signed-off-by: Daniel Stone <daniels@collabora.com>
Cc: Thierry Reding <thierry.reding@gmail.com>
Cc: linux-tegra@vger.kernel.org
Signed-off-by: Thierry Reding <treding@nvidia.com>
-rw-r--r-- | drivers/gpu/drm/tegra/fb.c | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/drivers/gpu/drm/tegra/fb.c b/drivers/gpu/drm/tegra/fb.c index 57da9683a713..709aa6ef171a 100644 --- a/drivers/gpu/drm/tegra/fb.c +++ b/drivers/gpu/drm/tegra/fb.c | |||
@@ -99,12 +99,8 @@ static void tegra_fb_destroy(struct drm_framebuffer *framebuffer) | |||
99 | for (i = 0; i < framebuffer->format->num_planes; i++) { | 99 | for (i = 0; i < framebuffer->format->num_planes; i++) { |
100 | struct tegra_bo *bo = tegra_fb_get_plane(framebuffer, i); | 100 | struct tegra_bo *bo = tegra_fb_get_plane(framebuffer, i); |
101 | 101 | ||
102 | if (bo) { | 102 | if (bo) |
103 | if (bo->pages) | ||
104 | vunmap(bo->vaddr); | ||
105 | |||
106 | drm_gem_object_put_unlocked(&bo->gem); | 103 | drm_gem_object_put_unlocked(&bo->gem); |
107 | } | ||
108 | } | 104 | } |
109 | 105 | ||
110 | drm_framebuffer_cleanup(framebuffer); | 106 | drm_framebuffer_cleanup(framebuffer); |
@@ -369,8 +365,17 @@ static void tegra_fbdev_exit(struct tegra_fbdev *fbdev) | |||
369 | { | 365 | { |
370 | drm_fb_helper_unregister_fbi(&fbdev->base); | 366 | drm_fb_helper_unregister_fbi(&fbdev->base); |
371 | 367 | ||
372 | if (fbdev->fb) | 368 | if (fbdev->fb) { |
369 | struct tegra_bo *bo = tegra_fb_get_plane(fbdev->fb, 0); | ||
370 | |||
371 | /* Undo the special mapping we made in fbdev probe. */ | ||
372 | if (bo && bo->pages) { | ||
373 | vunmap(bo->vaddr); | ||
374 | bo->vaddr = 0; | ||
375 | } | ||
376 | |||
373 | drm_framebuffer_remove(fbdev->fb); | 377 | drm_framebuffer_remove(fbdev->fb); |
378 | } | ||
374 | 379 | ||
375 | drm_fb_helper_fini(&fbdev->base); | 380 | drm_fb_helper_fini(&fbdev->base); |
376 | tegra_fbdev_free(fbdev); | 381 | tegra_fbdev_free(fbdev); |