Commit a07b50d8 authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Greg Kroah-Hartman
Browse files

hyperv: avoid dependency on screen_info



The two hyperv framebuffer drivers (hyperv_fb or hyperv_drm_drv) access the
global screen_info in order to take over from the sysfb framebuffer, which
in turn could be handled by simplefb, simpledrm or efifb. Similarly, the
vmbus_drv code marks the original EFI framebuffer as reserved, but this
is not required if there is no sysfb.

As a preparation for making screen_info itself more local to the sysfb
helper code, add a compile-time conditional in all three files that relate
to hyperv fb and just skip this code if there is no sysfb that needs to
be unregistered.

Reviewed-by: default avatarJavier Martinez Canillas <javierm@redhat.com>
Acked-by: default avatarHelge Deller <deller@gmx.de>
Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Link: https://lore.kernel.org/r/20231009211845.3136536-9-arnd@kernel.org


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent b858a97b
Loading
Loading
Loading
Loading
+4 −3
Original line number Diff line number Diff line
@@ -73,6 +73,7 @@ static int hyperv_setup_vram(struct hyperv_drm_device *hv,
	struct drm_device *dev = &hv->dev;
	int ret;

	if (IS_ENABLED(CONFIG_SYSFB))
		drm_aperture_remove_conflicting_framebuffers(screen_info.lfb_base,
							     screen_info.lfb_size,
							     &hyperv_driver);
+4 −2
Original line number Diff line number Diff line
@@ -2100,8 +2100,10 @@ static void __maybe_unused vmbus_reserve_fb(void)

	if (efi_enabled(EFI_BOOT)) {
		/* Gen2 VM: get FB base from EFI framebuffer */
		if (IS_ENABLED(CONFIG_SYSFB)) {
			start = screen_info.lfb_base;
			size = max_t(__u32, screen_info.lfb_size, 0x800000);
		}
	} else {
		/* Gen1 VM: get FB base from PCI */
		pdev = pci_get_device(PCI_VENDOR_ID_MICROSOFT,
+4 −4
Original line number Diff line number Diff line
@@ -1030,7 +1030,7 @@ static int hvfb_getmem(struct hv_device *hdev, struct fb_info *info)
			goto getmem_done;
		}
		pr_info("Unable to allocate enough contiguous physical memory on Gen 1 VM. Using MMIO instead.\n");
	} else {
	} else if (IS_ENABLED(CONFIG_SYSFB)) {
		base = screen_info.lfb_base;
		size = screen_info.lfb_size;
	}
@@ -1076,13 +1076,13 @@ static int hvfb_getmem(struct hv_device *hdev, struct fb_info *info)
getmem_done:
	aperture_remove_conflicting_devices(base, size, KBUILD_MODNAME);

	if (gen2vm) {
	if (!gen2vm) {
		pci_dev_put(pdev);
	} else if (IS_ENABLED(CONFIG_SYSFB)) {
		/* framebuffer is reallocated, clear screen_info to avoid misuse from kexec */
		screen_info.lfb_size = 0;
		screen_info.lfb_base = 0;
		screen_info.orig_video_isVGA = 0;
	} else {
		pci_dev_put(pdev);
	}

	return 0;