From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?q?Micha=C5=82=20Miros=C5=82aw?= Subject: [PATCH v3 04/13] fbdev: add remove_conflicting_pci_framebuffers() Date: Sat, 01 Sep 2018 16:08:45 +0200 Message-ID: <7db1c278276de420eb45a1b71d06b5eb6bbd49ef.1535810304.git.mirq-linux@rere.qmqm.pl> References: Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=m.gmane.org@lists.infradead.org To: dri-devel@lists.freedesktop.org Cc: linux-fbdev@vger.kernel.org, linux-tegra@vger.kernel.org, Bartlomiej Zolnierkiewicz , David Airlie , amd-gfx@lists.freedesktop.org, Jonathan Hunter , Eric Anholt , Thierry Reding , Gerd Hoffmann , Alex Deucher , Dave Airlie , Maxime Ripard , virtualization@lists.linux-foundation.org, linux-arm-kernel@lists.infradead.org List-Id: linux-tegra@vger.kernel.org QWxtb3N0IGFsbCBQQ0kgZHJpdmVycyB1c2luZyByZW1vdmVfY29uZmxpY3RpbmdfZnJhbWVidWZm ZXJzKCkgd3JhcCBpdAp3aXRoIHRoZSBzYW1lIGNvZGUuCgotLS0KdjI6IGFkZCBrZXJuZWxkb2Mg Zm9yIERSTSBoZWxwZXIKdjM6IHByb3BhZ2F0ZSByZW1vdmVfY29uZmxpY3RpbmdfZnJhbWVidWZm ZXJzKCkgcmV0dXJuIHZhbHVlCiAgKyBtb3ZlIGtlcm5lbGRvYyB0byB3aGVyZSBmdW5jdGlvbiBp cyBpbXBsZW1lbnRlZAoKU2lnbmVkLW9mZi1ieTogTWljaGHFgiBNaXJvc8WCYXcgPG1pcnEtbGlu dXhAcmVyZS5xbXFtLnBsPgotLS0KIGRyaXZlcnMvdmlkZW8vZmJkZXYvY29yZS9mYm1lbS5jIHwg MzUgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIGluY2x1ZGUvZHJtL2RybV9mYl9o ZWxwZXIuaCAgICAgIHwgMTIgKysrKysrKysrKysKIGluY2x1ZGUvbGludXgvZmIuaCAgICAgICAg ICAgICAgIHwgIDIgKysKIDMgZmlsZXMgY2hhbmdlZCwgNDkgaW5zZXJ0aW9ucygrKQoKZGlmZiAt LWdpdCBhL2RyaXZlcnMvdmlkZW8vZmJkZXYvY29yZS9mYm1lbS5jIGIvZHJpdmVycy92aWRlby9m YmRldi9jb3JlL2ZibWVtLmMKaW5kZXggMmRlOTNiNTAxNGUzLi5jZDk2YjFjNjJiYmUgMTAwNjQ0 Ci0tLSBhL2RyaXZlcnMvdmlkZW8vZmJkZXYvY29yZS9mYm1lbS5jCisrKyBiL2RyaXZlcnMvdmlk ZW8vZmJkZXYvY29yZS9mYm1lbS5jCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8bGludXgv ZmIuaD4KICNpbmNsdWRlIDxsaW51eC9mYmNvbi5oPgogI2luY2x1ZGUgPGxpbnV4L21lbV9lbmNy eXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAKICNpbmNsdWRlIDxhc20vZmIuaD4KIApA QCAtMTgxMiw2ICsxODEzLDQwIEBAIGludCByZW1vdmVfY29uZmxpY3RpbmdfZnJhbWVidWZmZXJz KHN0cnVjdCBhcGVydHVyZXNfc3RydWN0ICphLAogfQogRVhQT1JUX1NZTUJPTChyZW1vdmVfY29u ZmxpY3RpbmdfZnJhbWVidWZmZXJzKTsKIAorLyoqCisgKiByZW1vdmVfY29uZmxpY3RpbmdfcGNp X2ZyYW1lYnVmZmVycyAtIHJlbW92ZSBmaXJtd2FyZS1jb25maWd1cmVkIGZyYW1lYnVmZmVycyBm b3IgUENJIGRldmljZXMKKyAqIEBwZGV2OiBQQ0kgZGV2aWNlCisgKiBAcmVzb3VyY2VfaWQ6IGlu ZGV4IG9mIFBDSSBCQVIgY29uZmlndXJpbmcgZnJhbWVidWZmZXIgbWVtb3J5CisgKiBAbmFtZTog cmVxdWVzdGluZyBkcml2ZXIgbmFtZQorICoKKyAqIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBmcmFt ZWJ1ZmZlciBkZXZpY2VzIChlZy4gaW5pdGlhbGl6ZWQgYnkgZmlybXdhcmUpCisgKiB1c2luZyBt ZW1vcnkgcmFuZ2UgY29uZmlndXJlZCBmb3IgQHBkZXYncyBCQVIgQHJlc291cmNlX2lkLgorICoK KyAqIFRoZSBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgUENJIGRldmljZSB3aXRoIHNoYWRvd2VkIFJP TSBkcml2ZXMgYSBwcmltYXJ5CisgKiBkaXNwbGF5IGFuZCBzbyBraWNrcyBvdXQgdmdhMTZmYi4K KyAqLworaW50IHJlbW92ZV9jb25mbGljdGluZ19wY2lfZnJhbWVidWZmZXJzKHN0cnVjdCBwY2lf ZGV2ICpwZGV2LCBpbnQgcmVzX2lkLCBjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBhcGVy dHVyZXNfc3RydWN0ICphcDsKKwlib29sIHByaW1hcnkgPSBmYWxzZTsKKwlpbnQgZXJyOworCisJ YXAgPSBhbGxvY19hcGVydHVyZXMoMSk7CisJaWYgKCFhcCkKKwkJcmV0dXJuIC1FTk9NRU07CisK KwlhcC0+cmFuZ2VzWzBdLmJhc2UgPSBwY2lfcmVzb3VyY2Vfc3RhcnQocGRldiwgcmVzX2lkKTsK KwlhcC0+cmFuZ2VzWzBdLnNpemUgPSBwY2lfcmVzb3VyY2VfbGVuKHBkZXYsIHJlc19pZCk7Cisj aWZkZWYgQ09ORklHX1g4NgorCXByaW1hcnkgPSBwZGV2LT5yZXNvdXJjZVtQQ0lfUk9NX1JFU09V UkNFXS5mbGFncyAmCisJCQkJCUlPUkVTT1VSQ0VfUk9NX1NIQURPVzsKKyNlbmRpZgorCWVyciA9 IHJlbW92ZV9jb25mbGljdGluZ19mcmFtZWJ1ZmZlcnMoYXAsIG5hbWUsIHByaW1hcnkpOworCWtm cmVlKGFwKTsKKwlyZXR1cm4gZXJyOworfQorRVhQT1JUX1NZTUJPTChyZW1vdmVfY29uZmxpY3Rp bmdfcGNpX2ZyYW1lYnVmZmVycyk7CisKIC8qKgogICoJcmVnaXN0ZXJfZnJhbWVidWZmZXIgLSBy ZWdpc3RlcnMgYSBmcmFtZSBidWZmZXIgZGV2aWNlCiAgKglAZmJfaW5mbzogZnJhbWUgYnVmZmVy IGluZm8gc3RydWN0dXJlCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9kcm1fZmJfaGVscGVyLmgg Yi9pbmNsdWRlL2RybS9kcm1fZmJfaGVscGVyLmgKaW5kZXggYjA2OTQzM2U3ZmMxLi4yMGVhODU2 ZGI5MDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL2RybV9mYl9oZWxwZXIuaAorKysgYi9pbmNs dWRlL2RybS9kcm1fZmJfaGVscGVyLmgKQEAgLTU3Nyw0ICs1NzcsMTYgQEAgZHJtX2ZiX2hlbHBl cl9yZW1vdmVfY29uZmxpY3RpbmdfZnJhbWVidWZmZXJzKHN0cnVjdCBhcGVydHVyZXNfc3RydWN0 ICphLAogI2VuZGlmCiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50Citkcm1fZmJfaGVscGVyX3JlbW92 ZV9jb25mbGljdGluZ19wY2lfZnJhbWVidWZmZXJzKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorCQkJ CQkJICBpbnQgcmVzb3VyY2VfaWQsCisJCQkJCQkgIGNvbnN0IGNoYXIgKm5hbWUpCit7CisjaWYg SVNfUkVBQ0hBQkxFKENPTkZJR19GQikKKwlyZXR1cm4gcmVtb3ZlX2NvbmZsaWN0aW5nX3BjaV9m cmFtZWJ1ZmZlcnMocGRldiwgcmVzb3VyY2VfaWQsIG5hbWUpOworI2Vsc2UKKwlyZXR1cm4gMDsK KyNlbmRpZgorfQorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZmIuaCBiL2lu Y2x1ZGUvbGludXgvZmIuaAppbmRleCBhYTc0YTIyOGJiOTIuLmFiZWZmZDU1YjY2YSAxMDA2NDQK LS0tIGEvaW5jbHVkZS9saW51eC9mYi5oCisrKyBiL2luY2x1ZGUvbGludXgvZmIuaApAQCAtNjMy LDYgKzYzMiw4IEBAIGV4dGVybiBzc2l6ZV90IGZiX3N5c193cml0ZShzdHJ1Y3QgZmJfaW5mbyAq aW5mbywgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKIGV4dGVybiBpbnQgcmVnaXN0ZXJfZnJhbWVi dWZmZXIoc3RydWN0IGZiX2luZm8gKmZiX2luZm8pOwogZXh0ZXJuIGludCB1bnJlZ2lzdGVyX2Zy YW1lYnVmZmVyKHN0cnVjdCBmYl9pbmZvICpmYl9pbmZvKTsKIGV4dGVybiBpbnQgdW5saW5rX2Zy YW1lYnVmZmVyKHN0cnVjdCBmYl9pbmZvICpmYl9pbmZvKTsKK2V4dGVybiBpbnQgcmVtb3ZlX2Nv bmZsaWN0aW5nX3BjaV9mcmFtZWJ1ZmZlcnMoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCByZXNf aWQsCisJCQkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKIGV4dGVybiBpbnQgcmVtb3ZlX2Nv bmZsaWN0aW5nX2ZyYW1lYnVmZmVycyhzdHJ1Y3QgYXBlcnR1cmVzX3N0cnVjdCAqYSwKIAkJCQkJ ICAgY29uc3QgY2hhciAqbmFtZSwgYm9vbCBwcmltYXJ5KTsKIGV4dGVybiBpbnQgZmJfcHJlcGFy ZV9sb2dvKHN0cnVjdCBmYl9pbmZvICpmYl9pbmZvLCBpbnQgcm90YXRlKTsKLS0gCjIuMTguMAoK Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFy bS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9y ZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1r ZXJuZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?q?Micha=C5=82=20Miros=C5=82aw?= Date: Sat, 01 Sep 2018 14:08:45 +0000 Subject: [PATCH v3 04/13] fbdev: add remove_conflicting_pci_framebuffers() Message-Id: <7db1c278276de420eb45a1b71d06b5eb6bbd49ef.1535810304.git.mirq-linux@rere.qmqm.pl> List-Id: References: In-Reply-To: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit To: dri-devel@lists.freedesktop.org Cc: linux-fbdev@vger.kernel.org, linux-tegra@vger.kernel.org, Bartlomiej Zolnierkiewicz , David Airlie , amd-gfx@lists.freedesktop.org, Jonathan Hunter , Eric Anholt , Thierry Reding , Gerd Hoffmann , Alex Deucher , Dave Airlie , Maxime Ripard , virtualization@lists.linux-foundation.org, linux-arm-kernel@lists.infradead.org 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 --- 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 2de93b5014e3..cd96b1c62bbe 100644 --- a/drivers/video/fbdev/core/fbmem.c +++ b/drivers/video/fbdev/core/fbmem.c @@ -34,6 +34,7 @@ #include #include #include +#include #include @@ -1812,6 +1813,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 b069433e7fc1..20ea856db900 100644 --- a/include/drm/drm_fb_helper.h +++ b/include/drm/drm_fb_helper.h @@ -577,4 +577,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 aa74a228bb92..abeffd55b66a 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.18.0 From mboxrd@z Thu Jan 1 00:00:00 1970 From: mirq-linux@rere.qmqm.pl (=?UTF-8?q?Micha=C5=82=20Miros=C5=82aw?=) Date: Sat, 01 Sep 2018 16:08:45 +0200 Subject: [PATCH v3 04/13] fbdev: add remove_conflicting_pci_framebuffers() In-Reply-To: References: Message-ID: <7db1c278276de420eb45a1b71d06b5eb6bbd49ef.1535810304.git.mirq-linux@rere.qmqm.pl> To: linux-arm-kernel@lists.infradead.org List-Id: linux-arm-kernel.lists.infradead.org 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 --- 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 2de93b5014e3..cd96b1c62bbe 100644 --- a/drivers/video/fbdev/core/fbmem.c +++ b/drivers/video/fbdev/core/fbmem.c @@ -34,6 +34,7 @@ #include #include #include +#include #include @@ -1812,6 +1813,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 b069433e7fc1..20ea856db900 100644 --- a/include/drm/drm_fb_helper.h +++ b/include/drm/drm_fb_helper.h @@ -577,4 +577,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 aa74a228bb92..abeffd55b66a 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.18.0