]> git.baikalelectronics.ru Git - kernel.git/commitdiff
Revert "fbcon: don't lose the console font across generic->chip driver switch"
authorThomas Zimmermann <tzimmermann@suse.de>
Mon, 19 Dec 2022 16:05:00 +0000 (17:05 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 10 Mar 2023 08:33:56 +0000 (09:33 +0100)
[ Upstream commit 8c38f3bbbbe63166c00f36dab2d87b84a0e3b115 ]

This reverts commit 8bd541dd6a273e7384868f10dd966b25da72596f.

Always free the console font when deinitializing the framebuffer
console. Subsequent framebuffer consoles will then use the default
font. Rely on userspace to load any user-configured font for these
consoles.

Commit 8bd541dd6a27 ("fbcon: don't lose the console font across
generic->chip driver switch") was introduced to work around losing
the font during graphics-device handover. [1][2] It kept a dangling
pointer with the font data between loading the two consoles, which is
fairly adventurous hack. It also never covered cases when the other
consoles, such as VGA text mode, where involved.

The problem has meanwhile been solved in userspace. Systemd comes
with a udev rule that re-installs the configured font when a console
comes up. [3] So the kernel workaround can be removed.

This also removes one of the two special cases triggered by setting
FBINFO_MISC_FIRMWARE in an fbdev driver.

Tested during device handover from efifb and simpledrm to radeon. Udev
reloads the configured console font for the new driver's terminal.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Link: https://bugzilla.redhat.com/show_bug.cgi?id=892340
Link: https://bugzilla.redhat.com/show_bug.cgi?id=1074624
Link: https://cgit.freedesktop.org/systemd/systemd/tree/src/vconsole/90-vconsole.rules.in?h=v222
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20221219160516.23436-3-tzimmermann@suse.de
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/video/fbdev/core/fbcon.c

index 1b14c21af2b74983f02dd17dbf99bae8a249e25f..2bc8baa90c0f27b21e53c479096d42d2af32d627 100644 (file)
@@ -958,7 +958,7 @@ static const char *fbcon_startup(void)
        set_blitting_type(vc, info);
 
        /* Setup default font */
-       if (!p->fontdata && !vc->vc_font.data) {
+       if (!p->fontdata) {
                if (!fontname[0] || !(font = find_font(fontname)))
                        font = get_default_font(info->var.xres,
                                                info->var.yres,
@@ -968,8 +968,6 @@ static const char *fbcon_startup(void)
                vc->vc_font.height = font->height;
                vc->vc_font.data = (void *)(p->fontdata = font->data);
                vc->vc_font.charcount = font->charcount;
-       } else {
-               p->fontdata = vc->vc_font.data;
        }
 
        cols = FBCON_SWAP(ops->rotate, info->var.xres, info->var.yres);
@@ -1135,9 +1133,9 @@ static void fbcon_init(struct vc_data *vc, int init)
        ops->p = &fb_display[fg_console];
 }
 
-static void fbcon_free_font(struct fbcon_display *p, bool freefont)
+static void fbcon_free_font(struct fbcon_display *p)
 {
-       if (freefont && p->userfont && p->fontdata && (--REFCOUNT(p->fontdata) == 0))
+       if (p->userfont && p->fontdata && (--REFCOUNT(p->fontdata) == 0))
                kfree(p->fontdata - FONT_EXTRA_WORDS * sizeof(int));
        p->fontdata = NULL;
        p->userfont = 0;
@@ -1172,8 +1170,8 @@ static void fbcon_deinit(struct vc_data *vc)
        struct fb_info *info;
        struct fbcon_ops *ops;
        int idx;
-       bool free_font = true;
 
+       fbcon_free_font(p);
        idx = con2fb_map[vc->vc_num];
 
        if (idx == -1)
@@ -1184,8 +1182,6 @@ static void fbcon_deinit(struct vc_data *vc)
        if (!info)
                goto finished;
 
-       if (info->flags & FBINFO_MISC_FIRMWARE)
-               free_font = false;
        ops = info->fbcon_par;
 
        if (!ops)
@@ -1197,9 +1193,8 @@ static void fbcon_deinit(struct vc_data *vc)
        ops->initialized = false;
 finished:
 
-       fbcon_free_font(p, free_font);
-       if (free_font)
-               vc->vc_font.data = NULL;
+       fbcon_free_font(p);
+       vc->vc_font.data = NULL;
 
        if (vc->vc_hi_font_mask && vc->vc_screenbuf)
                set_vc_hi_font(vc, false);