diff options
Diffstat (limited to 'recipes-kernel/linux/linux-toradex-mainline-4.14/0011-drm-tegra-fb-Implement-fb_mmap-callback.patch')
-rw-r--r-- | recipes-kernel/linux/linux-toradex-mainline-4.14/0011-drm-tegra-fb-Implement-fb_mmap-callback.patch | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/recipes-kernel/linux/linux-toradex-mainline-4.14/0011-drm-tegra-fb-Implement-fb_mmap-callback.patch b/recipes-kernel/linux/linux-toradex-mainline-4.14/0011-drm-tegra-fb-Implement-fb_mmap-callback.patch new file mode 100644 index 0000000..7aa85ae --- /dev/null +++ b/recipes-kernel/linux/linux-toradex-mainline-4.14/0011-drm-tegra-fb-Implement-fb_mmap-callback.patch @@ -0,0 +1,56 @@ +From b8f3f500e09c2c457efc2fcbfe8b7f815f2e6a0e Mon Sep 17 00:00:00 2001 +From: Thierry Reding <treding@nvidia.com> +Date: Wed, 7 Feb 2018 18:45:56 +0100 +Subject: [PATCH] drm/tegra: fb: Implement ->fb_mmap() callback + +This fixes hangs with legacy applications that use the mmap() syscall on +the fbdev device to map framebuffer memory. The fbdev implementation for +mmap() creates a mapping that conflicts with DRM usage and causes a hang +when the memory is accessed through the mapping. + +Reported-by: Marcel Ziswiler <marcel.ziswiler@toradex.com> +Signed-off-by: Thierry Reding <treding@nvidia.com> +Tested-by: Stefan Agner <stefan@agner.ch> +Tested-by: Marcel Ziswiler <marcel.ziswiler@toradex.com> +Reported-by: Marcel Ziswiler <marcel.ziswiler@toradex.com> +Signed-off-by: Thierry Reding <treding@nvidia.com> +--- + drivers/gpu/drm/tegra/fb.c | 16 ++++++++++++++++ + 1 file changed, 16 insertions(+) + +diff --git a/drivers/gpu/drm/tegra/fb.c b/drivers/gpu/drm/tegra/fb.c +index 001cb77e2f59..0786159edef3 100644 +--- a/drivers/gpu/drm/tegra/fb.c ++++ b/drivers/gpu/drm/tegra/fb.c +@@ -224,12 +224,28 @@ struct drm_framebuffer *tegra_fb_create(struct drm_device *drm, + } + + #ifdef CONFIG_DRM_FBDEV_EMULATION ++static int tegra_fb_mmap(struct fb_info *info, struct vm_area_struct *vma) ++{ ++ struct drm_fb_helper *helper = info->par; ++ struct tegra_bo *bo; ++ int err; ++ ++ bo = tegra_fb_get_plane(helper->fb, 0); ++ ++ err = drm_gem_mmap_obj(&bo->gem, bo->gem.size, vma); ++ if (err < 0) ++ return err; ++ ++ return __tegra_gem_mmap(&bo->gem, vma); ++} ++ + static struct fb_ops tegra_fb_ops = { + .owner = THIS_MODULE, + DRM_FB_HELPER_DEFAULT_OPS, + .fb_fillrect = drm_fb_helper_sys_fillrect, + .fb_copyarea = drm_fb_helper_sys_copyarea, + .fb_imageblit = drm_fb_helper_sys_imageblit, ++ .fb_mmap = tegra_fb_mmap, + }; + + static int tegra_fbdev_probe(struct drm_fb_helper *helper, +-- +2.15.1 + |