Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a3e50776 authored by Thomas Zimmermann's avatar Thomas Zimmermann Committed by Greg Kroah-Hartman
Browse files

drm/ast: Remove existing framebuffers before loading driver

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: default avatarThomas Zimmermann <tzimmermann@suse.de>
Cc: <stable@vger.kernel.org>
Tested-by: default avatarY.C. Chen <yc_chen@aspeedtech.com>
Reviewed-by: default avatarJean Delvare <jdelvare@suse.de>
Tested-by: default avatarJean Delvare <jdelvare@suse.de>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 3921d5b8
Loading
Loading
Loading
Loading
+21 −0
Original line number Original line Diff line number Diff line
@@ -60,8 +60,29 @@ static const struct pci_device_id pciidlist[] = {


MODULE_DEVICE_TABLE(pci, pciidlist);
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)
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);
	return drm_get_pci_dev(pdev, ent, &driver);
}
}