aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0711-fbdev-add-remove_conflicting_pci_framebuffers.patch
diff options
context:
space:
mode:
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0711-fbdev-add-remove_conflicting_pci_framebuffers.patch')
-rw-r--r--meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0711-fbdev-add-remove_conflicting_pci_framebuffers.patch115
1 files changed, 115 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0711-fbdev-add-remove_conflicting_pci_framebuffers.patch b/meta-amd-bsp/recipes-kernel/linux-4.19/linux-yocto-4.19.8/0711-fbdev-add-remove_conflicting_pci_framebuffers.patch
new file mode 100644
index 00000000..6de6ef76
--- /dev/null
+++ b/meta-amd-bsp/recipes-kernel/linux-4.19/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
+