diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.19.8/0711-fbdev-add-remove_conflicting_pci_framebuffers.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.19.8/0711-fbdev-add-remove_conflicting_pci_framebuffers.patch | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.19.8/0711-fbdev-add-remove_conflicting_pci_framebuffers.patch b/common/recipes-kernel/linux/linux-yocto-4.19.8/0711-fbdev-add-remove_conflicting_pci_framebuffers.patch new file mode 100644 index 00000000..6de6ef76 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.19.8/0711-fbdev-add-remove_conflicting_pci_framebuffers.patch @@ -0,0 +1,115 @@ +From 1d8f46935c56332c273f977902543ad02dd5d2e1 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Micha=C5=82=20Miros=C5=82aw?= <mirq-linux@rere.qmqm.pl> +Date: Sat, 1 Sep 2018 16:08:45 +0200 +Subject: [PATCH 0711/2940] fbdev: add remove_conflicting_pci_framebuffers() +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Almost all PCI drivers using remove_conflicting_framebuffers() wrap it +with the same code. + +v2: add kerneldoc for DRM helper +v3: propagate remove_conflicting_framebuffers() return value + + move kerneldoc to where function is implemented + +Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl> +Acked-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com> +Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch> +Link: https://patchwork.freedesktop.org/patch/msgid/7db1c278276de420eb45a1b71d06b5eb6bbd49ef.1535810304.git.mirq-linux@rere.qmqm.pl +--- + drivers/video/fbdev/core/fbmem.c | 35 ++++++++++++++++++++++++++++++++ + include/drm/drm_fb_helper.h | 12 +++++++++++ + include/linux/fb.h | 2 ++ + 3 files changed, 49 insertions(+) + +diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c +index 20405421a5ed..d4c8b2897780 100644 +--- a/drivers/video/fbdev/core/fbmem.c ++++ b/drivers/video/fbdev/core/fbmem.c +@@ -34,6 +34,7 @@ + #include <linux/fb.h> + #include <linux/fbcon.h> + #include <linux/mem_encrypt.h> ++#include <linux/pci.h> + + #include <asm/fb.h> + +@@ -1806,6 +1807,40 @@ int remove_conflicting_framebuffers(struct apertures_struct *a, + } + EXPORT_SYMBOL(remove_conflicting_framebuffers); + ++/** ++ * remove_conflicting_pci_framebuffers - remove firmware-configured framebuffers for PCI devices ++ * @pdev: PCI device ++ * @resource_id: index of PCI BAR configuring framebuffer memory ++ * @name: requesting driver name ++ * ++ * This function removes framebuffer devices (eg. initialized by firmware) ++ * using memory range configured for @pdev's BAR @resource_id. ++ * ++ * The function assumes that PCI device with shadowed ROM drives a primary ++ * display and so kicks out vga16fb. ++ */ ++int remove_conflicting_pci_framebuffers(struct pci_dev *pdev, int res_id, const char *name) ++{ ++ struct apertures_struct *ap; ++ bool primary = false; ++ int err; ++ ++ ap = alloc_apertures(1); ++ if (!ap) ++ return -ENOMEM; ++ ++ ap->ranges[0].base = pci_resource_start(pdev, res_id); ++ ap->ranges[0].size = pci_resource_len(pdev, res_id); ++#ifdef CONFIG_X86 ++ primary = pdev->resource[PCI_ROM_RESOURCE].flags & ++ IORESOURCE_ROM_SHADOW; ++#endif ++ err = remove_conflicting_framebuffers(ap, name, primary); ++ kfree(ap); ++ return err; ++} ++EXPORT_SYMBOL(remove_conflicting_pci_framebuffers); ++ + /** + * register_framebuffer - registers a frame buffer device + * @fb_info: frame buffer info structure +diff --git a/include/drm/drm_fb_helper.h b/include/drm/drm_fb_helper.h +index 5db08c8f1d25..8b6ab3200a2c 100644 +--- a/include/drm/drm_fb_helper.h ++++ b/include/drm/drm_fb_helper.h +@@ -615,4 +615,16 @@ drm_fb_helper_remove_conflicting_framebuffers(struct apertures_struct *a, + #endif + } + ++static inline int ++drm_fb_helper_remove_conflicting_pci_framebuffers(struct pci_dev *pdev, ++ int resource_id, ++ const char *name) ++{ ++#if IS_REACHABLE(CONFIG_FB) ++ return remove_conflicting_pci_framebuffers(pdev, resource_id, name); ++#else ++ return 0; ++#endif ++} ++ + #endif +diff --git a/include/linux/fb.h b/include/linux/fb.h +index 3e7e75383d32..3cd375dafd0e 100644 +--- a/include/linux/fb.h ++++ b/include/linux/fb.h +@@ -632,6 +632,8 @@ extern ssize_t fb_sys_write(struct fb_info *info, const char __user *buf, + extern int register_framebuffer(struct fb_info *fb_info); + extern int unregister_framebuffer(struct fb_info *fb_info); + extern int unlink_framebuffer(struct fb_info *fb_info); ++extern int remove_conflicting_pci_framebuffers(struct pci_dev *pdev, int res_id, ++ const char *name); + extern int remove_conflicting_framebuffers(struct apertures_struct *a, + const char *name, bool primary); + extern int fb_prepare_logo(struct fb_info *fb_info, int rotate); +-- +2.17.1 + |