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: Javier Martinez Canillas <javierm@redhat.com> Acked-by: Helge Deller <deller@gmx.de> Signed-off-by: Arnd Bergmann <arnd@arndb.de> Link: https://lore.kernel.org/r/20231009211845.3136536-9-arnd@kernel.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
b858a97bf0
commit
a07b50d80a
@ -73,9 +73,10 @@ static int hyperv_setup_vram(struct hyperv_drm_device *hv,
|
|||||||
struct drm_device *dev = &hv->dev;
|
struct drm_device *dev = &hv->dev;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
drm_aperture_remove_conflicting_framebuffers(screen_info.lfb_base,
|
if (IS_ENABLED(CONFIG_SYSFB))
|
||||||
screen_info.lfb_size,
|
drm_aperture_remove_conflicting_framebuffers(screen_info.lfb_base,
|
||||||
&hyperv_driver);
|
screen_info.lfb_size,
|
||||||
|
&hyperv_driver);
|
||||||
|
|
||||||
hv->fb_size = (unsigned long)hv->mmio_megabytes * 1024 * 1024;
|
hv->fb_size = (unsigned long)hv->mmio_megabytes * 1024 * 1024;
|
||||||
|
|
||||||
|
@ -2100,8 +2100,10 @@ static void __maybe_unused vmbus_reserve_fb(void)
|
|||||||
|
|
||||||
if (efi_enabled(EFI_BOOT)) {
|
if (efi_enabled(EFI_BOOT)) {
|
||||||
/* Gen2 VM: get FB base from EFI framebuffer */
|
/* Gen2 VM: get FB base from EFI framebuffer */
|
||||||
start = screen_info.lfb_base;
|
if (IS_ENABLED(CONFIG_SYSFB)) {
|
||||||
size = max_t(__u32, screen_info.lfb_size, 0x800000);
|
start = screen_info.lfb_base;
|
||||||
|
size = max_t(__u32, screen_info.lfb_size, 0x800000);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Gen1 VM: get FB base from PCI */
|
/* Gen1 VM: get FB base from PCI */
|
||||||
pdev = pci_get_device(PCI_VENDOR_ID_MICROSOFT,
|
pdev = pci_get_device(PCI_VENDOR_ID_MICROSOFT,
|
||||||
|
@ -1030,7 +1030,7 @@ static int hvfb_getmem(struct hv_device *hdev, struct fb_info *info)
|
|||||||
goto getmem_done;
|
goto getmem_done;
|
||||||
}
|
}
|
||||||
pr_info("Unable to allocate enough contiguous physical memory on Gen 1 VM. Using MMIO instead.\n");
|
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;
|
base = screen_info.lfb_base;
|
||||||
size = screen_info.lfb_size;
|
size = screen_info.lfb_size;
|
||||||
}
|
}
|
||||||
@ -1076,13 +1076,13 @@ static int hvfb_getmem(struct hv_device *hdev, struct fb_info *info)
|
|||||||
getmem_done:
|
getmem_done:
|
||||||
aperture_remove_conflicting_devices(base, size, KBUILD_MODNAME);
|
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 */
|
/* framebuffer is reallocated, clear screen_info to avoid misuse from kexec */
|
||||||
screen_info.lfb_size = 0;
|
screen_info.lfb_size = 0;
|
||||||
screen_info.lfb_base = 0;
|
screen_info.lfb_base = 0;
|
||||||
screen_info.orig_video_isVGA = 0;
|
screen_info.orig_video_isVGA = 0;
|
||||||
} else {
|
|
||||||
pci_dev_put(pdev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user