| From 5478ad10e7850ce3d8b7056db05ddfa3c9ddad9a Mon Sep 17 00:00:00 2001 |
| From: Thomas Zimmermann <tzimmermann@suse.de> |
| Date: Thu, 15 Nov 2018 11:42:16 +0100 |
| Subject: drm/ast: Remove existing framebuffers before loading driver |
| |
| From: Thomas Zimmermann <tzimmermann@suse.de> |
| |
| commit 5478ad10e7850ce3d8b7056db05ddfa3c9ddad9a upstream. |
| |
| If vesafb attaches to the AST device, it configures the framebuffer memory |
| for uncached access by default. When ast.ko later tries to attach itself to |
| the device, it wants to use write-combining on the framebuffer memory, but |
| vesefb's existing configuration for uncached access takes precedence. This |
| results in reduced performance. |
| |
| Removing the framebuffer's configuration before loding the AST driver fixes |
| the problem. Other DRM drivers already contain equivalent code. |
| |
| Link: https://bugzilla.opensuse.org/show_bug.cgi?id=1112963 |
| Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> |
| Cc: <stable@vger.kernel.org> |
| Tested-by: Y.C. Chen <yc_chen@aspeedtech.com> |
| Reviewed-by: Jean Delvare <jdelvare@suse.de> |
| Tested-by: Jean Delvare <jdelvare@suse.de> |
| Signed-off-by: Dave Airlie <airlied@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/gpu/drm/ast/ast_drv.c | 21 +++++++++++++++++++++ |
| 1 file changed, 21 insertions(+) |
| |
| --- a/drivers/gpu/drm/ast/ast_drv.c |
| +++ b/drivers/gpu/drm/ast/ast_drv.c |
| @@ -60,8 +60,29 @@ static const struct pci_device_id pciidl |
| |
| MODULE_DEVICE_TABLE(pci, pciidlist); |
| |
| +static void ast_kick_out_firmware_fb(struct pci_dev *pdev) |
| +{ |
| + struct apertures_struct *ap; |
| + bool primary = false; |
| + |
| + ap = alloc_apertures(1); |
| + if (!ap) |
| + return; |
| + |
| + ap->ranges[0].base = pci_resource_start(pdev, 0); |
| + ap->ranges[0].size = pci_resource_len(pdev, 0); |
| + |
| +#ifdef CONFIG_X86 |
| + primary = pdev->resource[PCI_ROM_RESOURCE].flags & IORESOURCE_ROM_SHADOW; |
| +#endif |
| + remove_conflicting_framebuffers(ap, "astdrmfb", primary); |
| + kfree(ap); |
| +} |
| + |
| static int ast_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent) |
| { |
| + ast_kick_out_firmware_fb(pdev); |
| + |
| return drm_get_pci_dev(pdev, ent, &driver); |
| } |
| |