From: Thomas Zimmermann Date: Wed, 27 May 2026 15:14:04 +0000 (+0200) Subject: fbdev: Wrap fbcon updates from vga-switcheroo in helper X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=2f4230fad9a7af4ebfbadbc3df5c1d99dc9320b1;p=thirdparty%2Flinux.git fbdev: Wrap fbcon updates from vga-switcheroo in helper Handle console remapping in fbcon in fb_switch_output(). Vga-switcheroo invokes this functionality before switching physical outputs to a new graphics device. Open-coding fbcon state in vga-switcheroo exposed fbdev implementation details. Vga-switcheroo is used for switching physical outputs among graphics hardware. This functionality is only supported by DRM drivers. A later update will further move fb_switch_output() into DRM's fbdev emulation; thus fully decoupling vga-switcheroo from fbdev. v3: - remove Kconfig dependency related to fbcon (Geert) v2: - use '#if defined' (Helge) Signed-off-by: Thomas Zimmermann Signed-off-by: Helge Deller --- diff --git a/drivers/gpu/vga/Kconfig b/drivers/gpu/vga/Kconfig index eb8b14ab22c3a..bad4bcee313f5 100644 --- a/drivers/gpu/vga/Kconfig +++ b/drivers/gpu/vga/Kconfig @@ -4,7 +4,7 @@ config VGA_SWITCHEROO depends on X86 depends on ACPI depends on PCI - depends on (FRAMEBUFFER_CONSOLE=n || FB=y) + depends on FB=y select VGA_ARB help Many laptops released in 2008/9/10 have two GPUs with a multiplexer diff --git a/drivers/gpu/vga/vga_switcheroo.c b/drivers/gpu/vga/vga_switcheroo.c index 8fe1ae3c71bba..22cf52b78b755 100644 --- a/drivers/gpu/vga/vga_switcheroo.c +++ b/drivers/gpu/vga/vga_switcheroo.c @@ -31,11 +31,9 @@ #define pr_fmt(fmt) "vga_switcheroo: " fmt #include -#include #include #include #include -#include #include #include #include @@ -735,8 +733,10 @@ static int vga_switchto_stage2(struct vga_switcheroo_client *new_client) if (!active->driver_power_control) set_audio_state(active->id, VGA_SWITCHEROO_OFF); +#if defined(CONFIG_FB) if (new_client->fb_info) - fbcon_remap_all(new_client->fb_info); + fb_switch_outputs(new_client->fb_info); +#endif mutex_lock(&vgasr_priv.mux_hw_lock); ret = vgasr_priv.handler->switchto(new_client->id); diff --git a/drivers/video/fbdev/core/fbmem.c b/drivers/video/fbdev/core/fbmem.c index 1a6758653b647..ecadbc58abff3 100644 --- a/drivers/video/fbdev/core/fbmem.c +++ b/drivers/video/fbdev/core/fbmem.c @@ -684,6 +684,16 @@ void fb_set_suspend(struct fb_info *info, int state) } EXPORT_SYMBOL(fb_set_suspend); +/** + * fb_switch_outputs - framebuffer got the outputs from vga-switcheroo + * @info: framebuffer + */ +void fb_switch_outputs(struct fb_info *info) +{ + fbcon_remap_all(info); +} +EXPORT_SYMBOL(fb_switch_outputs); + static int __init fbmem_init(void) { int ret; diff --git a/include/linux/fb.h b/include/linux/fb.h index 88680a7cabd55..e9a26e82322aa 100644 --- a/include/linux/fb.h +++ b/include/linux/fb.h @@ -608,6 +608,7 @@ void fb_pad_unaligned_buffer(u8 *dst, u32 d_pitch, const u8 *src, u32 idx, u32 h u32 shift_high, u32 shift_low, u32 mod); void fb_pad_aligned_buffer(u8 *dst, u32 d_pitch, const u8 *src, u32 s_pitch, u32 height); extern void fb_set_suspend(struct fb_info *info, int state); +extern void fb_switch_outputs(struct fb_info *info); extern int fb_get_color_depth(struct fb_var_screeninfo *var, struct fb_fix_screeninfo *fix); extern int fb_get_options(const char *name, char **option);