From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?q?Micha=C5=82=20Miros=C5=82aw?= Subject: [PATCH v2 03/12] fbdev: add remove_conflicting_pci_framebuffers() Date: Thu, 30 Aug 2018 23:00:06 +0200 Message-ID: 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, virtualization@lists.linux-foundation.org, Eric Anholt , Thierry Reding , Gerd Hoffmann , Alex Deucher , Maxime Ripard , linux-arm-kernel@lists.infradead.org List-Id: linux-tegra@vger.kernel.org QWxtb3N0IGFsbCBQQ0kgZHJpdmVycyB1c2luZyByZW1vdmVfY29uZmxpY3RpbmdfZnJhbWVidWZm ZXJzKCkgd3JhcCBpdAp3aXRoIHRoZSBzYW1lIGNvZGUuCgpTaWduZWQtb2ZmLWJ5OiBNaWNoYcWC IE1pcm9zxYJhdyA8bWlycS1saW51eEByZXJlLnFtcW0ucGw+Cltmb3IgdjFdCkFja2VkLWJ5OiBC YXJ0bG9taWVqIFpvbG5pZXJraWV3aWN6IDxiLnpvbG5pZXJraWVAc2Ftc3VuZy5jb20+CgotLS0K djI6IGFkZCBrZXJuZWxkb2MgZm9yIERSTSBoZWxwZXIKLS0tCiBkcml2ZXJzL3ZpZGVvL2ZiZGV2 L2NvcmUvZmJtZW0uYyB8IDIyICsrKysrKysrKysrKysrKysrKysrKysKIGluY2x1ZGUvZHJtL2Ry bV9mYl9oZWxwZXIuaCAgICAgIHwgMjQgKysrKysrKysrKysrKysrKysrKysrKysrCiBpbmNsdWRl L2xpbnV4L2ZiLmggICAgICAgICAgICAgICB8ICAyICsrCiAzIGZpbGVzIGNoYW5nZWQsIDQ4IGlu c2VydGlvbnMoKykKCmRpZmYgLS1naXQgYS9kcml2ZXJzL3ZpZGVvL2ZiZGV2L2NvcmUvZmJtZW0u YyBiL2RyaXZlcnMvdmlkZW8vZmJkZXYvY29yZS9mYm1lbS5jCmluZGV4IDBkZjE0OGViNDY5OS4u OTI3ZTAxNjQ4N2U5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3ZpZGVvL2ZiZGV2L2NvcmUvZmJtZW0u YworKysgYi9kcml2ZXJzL3ZpZGVvL2ZiZGV2L2NvcmUvZmJtZW0uYwpAQCAtMzQsNiArMzQsNyBA QAogI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiAjaW5jbHVkZSA8bGludXgvZmJjb24uaD4KICNpbmNs dWRlIDxsaW51eC9tZW1fZW5jcnlwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogCiAjaW5j bHVkZSA8YXNtL2ZiLmg+CiAKQEAgLTE4MDIsNiArMTgwMywyNyBAQCBpbnQgcmVtb3ZlX2NvbmZs aWN0aW5nX2ZyYW1lYnVmZmVycyhzdHJ1Y3QgYXBlcnR1cmVzX3N0cnVjdCAqYSwKIH0KIEVYUE9S VF9TWU1CT0wocmVtb3ZlX2NvbmZsaWN0aW5nX2ZyYW1lYnVmZmVycyk7CiAKK2ludCByZW1vdmVf Y29uZmxpY3RpbmdfcGNpX2ZyYW1lYnVmZmVycyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IHJl c19pZCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgYXBlcnR1cmVzX3N0cnVjdCAqYXA7 CisJYm9vbCBwcmltYXJ5ID0gZmFsc2U7CisKKwlhcCA9IGFsbG9jX2FwZXJ0dXJlcygxKTsKKwlp ZiAoIWFwKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWFwLT5yYW5nZXNbMF0uYmFzZSA9IHBjaV9y ZXNvdXJjZV9zdGFydChwZGV2LCByZXNfaWQpOworCWFwLT5yYW5nZXNbMF0uc2l6ZSA9IHBjaV9y ZXNvdXJjZV9sZW4ocGRldiwgcmVzX2lkKTsKKyNpZmRlZiBDT05GSUdfWDg2CisJcHJpbWFyeSA9 IHBkZXYtPnJlc291cmNlW1BDSV9ST01fUkVTT1VSQ0VdLmZsYWdzICYKKwkJCQkJSU9SRVNPVVJD RV9ST01fU0hBRE9XOworI2VuZGlmCisJcmVtb3ZlX2NvbmZsaWN0aW5nX2ZyYW1lYnVmZmVycyhh cCwgbmFtZSwgcHJpbWFyeSk7CisJa2ZyZWUoYXApOworCXJldHVybiAwOworfQorRVhQT1JUX1NZ TUJPTChyZW1vdmVfY29uZmxpY3RpbmdfcGNpX2ZyYW1lYnVmZmVycyk7CisKIC8qKgogICoJcmVn aXN0ZXJfZnJhbWVidWZmZXIgLSByZWdpc3RlcnMgYSBmcmFtZSBidWZmZXIgZGV2aWNlCiAgKglA ZmJfaW5mbzogZnJhbWUgYnVmZmVyIGluZm8gc3RydWN0dXJlCmRpZmYgLS1naXQgYS9pbmNsdWRl L2RybS9kcm1fZmJfaGVscGVyLmggYi9pbmNsdWRlL2RybS9kcm1fZmJfaGVscGVyLmgKaW5kZXgg MWMxZTUzYWJiMjVkLi42ZTFmYzUyZDFiMWIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL2RybV9m Yl9oZWxwZXIuaAorKysgYi9pbmNsdWRlL2RybS9kcm1fZmJfaGVscGVyLmgKQEAgLTU4Nyw0ICs1 ODcsMjggQEAgZHJtX2ZiX2hlbHBlcl9yZW1vdmVfY29uZmxpY3RpbmdfZnJhbWVidWZmZXJzKHN0 cnVjdCBhcGVydHVyZXNfc3RydWN0ICphLAogI2VuZGlmCiB9CiAKKy8qKgorICogZHJtX2ZiX2hl bHBlcl9yZW1vdmVfY29uZmxpY3RpbmdfZnJhbWVidWZmZXJzIC0gcmVtb3ZlIGZpcm13YXJlIGZy YW1lYnVmZmVycyBmb3IgUENJIGRldmljZXMKKyAqIEBwZGV2OiBQQ0kgZGV2aWNlIGJlaW5nIGRy aXZlbgorICogQHJlc291cmNlX2lkOiBpbmRleCBvZiBQQ0kgQkFSIGNvbmZpZ3VyaW5nIGZyYW1l YnVmZmVyIG1lbW9yeQorICogQG5hbWU6IHJlcXVlc3RpbmcgZHJpdmVyIG5hbWUKKyAqCisgKiBU aGlzIGZ1bmN0aW9uIHJlbW92ZXMgZnJhbWVidWZmZXIgZGV2aWNlcyAoZWcuIGluaXRpYWxpemVk IGJ5IGZpcm13YXJlKQorICogdXNpbmcgbWVtb3J5IHJhbmdlIGNvbmZpZ3VyZWQgZm9yIEBwZGV2 J3MgQkFSIEByZXNvdXJjZV9pZC4KKyAqCisgKiBUaGUgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IFBD SSBkZXZpY2Ugd2l0aCBzaGFkb3dlZCBST00gaXMgZHJpdmVzIGEgcHJpbWFyeQorICogZGlzcGxh eSBhbmQgc28ga2lja3Mgb3V0IHZnYTE2ZmIuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50Citkcm1f ZmJfaGVscGVyX3JlbW92ZV9jb25mbGljdGluZ19wY2lfZnJhbWVidWZmZXJzKHN0cnVjdCBwY2lf ZGV2ICpwZGV2LAorCQkJCQkJICBpbnQgcmVzb3VyY2VfaWQsCisJCQkJCQkgIGNvbnN0IGNoYXIg Km5hbWUpCit7CisjaWYgSVNfUkVBQ0hBQkxFKENPTkZJR19GQikKKwlyZXR1cm4gcmVtb3ZlX2Nv bmZsaWN0aW5nX3BjaV9mcmFtZWJ1ZmZlcnMocGRldiwgcmVzb3VyY2VfaWQsIG5hbWUpOworI2Vs c2UKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUv bGludXgvZmIuaCBiL2luY2x1ZGUvbGludXgvZmIuaAppbmRleCBhYTc0YTIyOGJiOTIuLmFiZWZm ZDU1YjY2YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mYi5oCisrKyBiL2luY2x1ZGUvbGlu dXgvZmIuaApAQCAtNjMyLDYgKzYzMiw4IEBAIGV4dGVybiBzc2l6ZV90IGZiX3N5c193cml0ZShz dHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKIGV4dGVybiBpbnQg cmVnaXN0ZXJfZnJhbWVidWZmZXIoc3RydWN0IGZiX2luZm8gKmZiX2luZm8pOwogZXh0ZXJuIGlu dCB1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKHN0cnVjdCBmYl9pbmZvICpmYl9pbmZvKTsKIGV4dGVy biBpbnQgdW5saW5rX2ZyYW1lYnVmZmVyKHN0cnVjdCBmYl9pbmZvICpmYl9pbmZvKTsKK2V4dGVy biBpbnQgcmVtb3ZlX2NvbmZsaWN0aW5nX3BjaV9mcmFtZWJ1ZmZlcnMoc3RydWN0IHBjaV9kZXYg KnBkZXYsIGludCByZXNfaWQsCisJCQkJCSAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKIGV4dGVy biBpbnQgcmVtb3ZlX2NvbmZsaWN0aW5nX2ZyYW1lYnVmZmVycyhzdHJ1Y3QgYXBlcnR1cmVzX3N0 cnVjdCAqYSwKIAkJCQkJICAgY29uc3QgY2hhciAqbmFtZSwgYm9vbCBwcmltYXJ5KTsKIGV4dGVy biBpbnQgZmJfcHJlcGFyZV9sb2dvKHN0cnVjdCBmYl9pbmZvICpmYl9pbmZvLCBpbnQgcm90YXRl KTsKLS0gCjIuMTguMAoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlz dHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3Rp bmZvL2xpbnV4LWFybS1rZXJuZWwK From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?UTF-8?q?Micha=C5=82=20Miros=C5=82aw?= Date: Thu, 30 Aug 2018 21:00:06 +0000 Subject: [PATCH v2 03/12] fbdev: add remove_conflicting_pci_framebuffers() Message-Id: 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, virtualization@lists.linux-foundation.org, Eric Anholt , Thierry Reding , Gerd Hoffmann , Alex Deucher , Maxime Ripard , linux-arm-kernel@lists.infradead.org Almost all PCI drivers using remove_conflicting_framebuffers() wrap it with the same code. Signed-off-by: Michał Mirosław [for v1] Acked-by: Bartlomiej Zolnierkiewicz --- v2: add kerneldoc for DRM helper --- drivers/video/fbdev/core/fbmem.c | 22 ++++++++++++++++++++++ include/drm/drm_fb_helper.h | 24 ++++++++++++++++++++++++ include/linux/fb.h | 2 ++ 3 files changed, 48 insertions(+) diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c index 0df148eb4699..927e016487e9 100644 --- a/drivers/video/fbdev/core/fbmem.c +++ b/drivers/video/fbdev/core/fbmem.c @@ -34,6 +34,7 @@ #include #include #include +#include #include @@ -1802,6 +1803,27 @@ int remove_conflicting_framebuffers(struct apertures_struct *a, } EXPORT_SYMBOL(remove_conflicting_framebuffers); +int remove_conflicting_pci_framebuffers(struct pci_dev *pdev, int res_id, const char *name) +{ + struct apertures_struct *ap; + bool primary = false; + + 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 + remove_conflicting_framebuffers(ap, name, primary); + kfree(ap); + return 0; +} +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 1c1e53abb25d..6e1fc52d1b1b 100644 --- a/include/drm/drm_fb_helper.h +++ b/include/drm/drm_fb_helper.h @@ -587,4 +587,28 @@ drm_fb_helper_remove_conflicting_framebuffers(struct apertures_struct *a, #endif } +/** + * drm_fb_helper_remove_conflicting_framebuffers - remove firmware framebuffers for PCI devices + * @pdev: PCI device being driven + * @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 is drives a primary + * display and so kicks out vga16fb. + */ +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: Thu, 30 Aug 2018 23:00:06 +0200 Subject: [PATCH v2 03/12] fbdev: add remove_conflicting_pci_framebuffers() In-Reply-To: References: Message-ID: 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. Signed-off-by: Micha? Miros?aw [for v1] Acked-by: Bartlomiej Zolnierkiewicz --- v2: add kerneldoc for DRM helper --- drivers/video/fbdev/core/fbmem.c | 22 ++++++++++++++++++++++ include/drm/drm_fb_helper.h | 24 ++++++++++++++++++++++++ include/linux/fb.h | 2 ++ 3 files changed, 48 insertions(+) diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c index 0df148eb4699..927e016487e9 100644 --- a/drivers/video/fbdev/core/fbmem.c +++ b/drivers/video/fbdev/core/fbmem.c @@ -34,6 +34,7 @@ #include #include #include +#include #include @@ -1802,6 +1803,27 @@ int remove_conflicting_framebuffers(struct apertures_struct *a, } EXPORT_SYMBOL(remove_conflicting_framebuffers); +int remove_conflicting_pci_framebuffers(struct pci_dev *pdev, int res_id, const char *name) +{ + struct apertures_struct *ap; + bool primary = false; + + 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 + remove_conflicting_framebuffers(ap, name, primary); + kfree(ap); + return 0; +} +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 1c1e53abb25d..6e1fc52d1b1b 100644 --- a/include/drm/drm_fb_helper.h +++ b/include/drm/drm_fb_helper.h @@ -587,4 +587,28 @@ drm_fb_helper_remove_conflicting_framebuffers(struct apertures_struct *a, #endif } +/** + * drm_fb_helper_remove_conflicting_framebuffers - remove firmware framebuffers for PCI devices + * @pdev: PCI device being driven + * @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 is drives a primary + * display and so kicks out vga16fb. + */ +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