]> Git Repo - J-linux.git/commitdiff
VT: Add height parameter to con_font_get/set consw operations
authorSamuel Thibault <[email protected]>
Thu, 19 Jan 2023 15:19:15 +0000 (16:19 +0100)
committerGreg Kroah-Hartman <[email protected]>
Thu, 19 Jan 2023 15:28:56 +0000 (16:28 +0100)
The current con_font_get/set API currently hardcodes a 32-pixel-tall
limitation, which only dates from the old VGA hardware which could not
handle taller fonts than that.

This change just adds a vpitch parameter to release this
constraint. Drivers which do not support vpitch != 32 can just return
EINVAL when it is not 32, font loading tools will revert to trying 32
and succeed.

This change makes the fbcon driver consider vpitch appropriately, thus
making it able to load large fonts.

Signed-off-by: Samuel Thibault <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Greg Kroah-Hartman <[email protected]>
drivers/tty/vt/vt.c
drivers/video/console/newport_con.c
drivers/video/console/sticon.c
drivers/video/console/vgacon.c
drivers/video/fbdev/core/fbcon.c
include/linux/console.h

index 71f1824168356c48fa4ce2283599558e07f8960c..268d0f57fdd4d054f1fc9eb970c45fff3c97c89c 100644 (file)
@@ -4552,7 +4552,7 @@ static int con_font_get(struct vc_data *vc, struct console_font_op *op)
        if (vc->vc_mode != KD_TEXT)
                rc = -EINVAL;
        else if (vc->vc_sw->con_font_get)
-               rc = vc->vc_sw->con_font_get(vc, &font);
+               rc = vc->vc_sw->con_font_get(vc, &font, 32);
        else
                rc = -ENOSYS;
        console_unlock();
@@ -4613,7 +4613,7 @@ static int con_font_set(struct vc_data *vc, struct console_font_op *op)
        else if (vc->vc_sw->con_font_set) {
                if (vc_is_sel(vc))
                        clear_selection();
-               rc = vc->vc_sw->con_font_set(vc, &font, op->flags);
+               rc = vc->vc_sw->con_font_set(vc, &font, 32, op->flags);
        } else
                rc = -ENOSYS;
        console_unlock();
index d9c682ae03926aa4cce6f8ee61765054e495de5c..e8e4f82cd4a1b845c83f36d126745fffbf176b46 100644 (file)
@@ -497,7 +497,7 @@ static int newport_blank(struct vc_data *c, int blank, int mode_switch)
        return 1;
 }
 
-static int newport_set_font(int unit, struct console_font *op)
+static int newport_set_font(int unit, struct console_font *op, unsigned int vpitch)
 {
        int w = op->width;
        int h = op->height;
@@ -507,7 +507,7 @@ static int newport_set_font(int unit, struct console_font *op)
 
        /* ladis: when I grow up, there will be a day... and more sizes will
         * be supported ;-) */
-       if ((w != 8) || (h != 16)
+       if ((w != 8) || (h != 16) || (vpitch != 32)
            || (op->charcount != 256 && op->charcount != 512))
                return -EINVAL;
 
@@ -569,9 +569,10 @@ static int newport_font_default(struct vc_data *vc, struct console_font *op, cha
        return newport_set_def_font(vc->vc_num, op);
 }
 
-static int newport_font_set(struct vc_data *vc, struct console_font *font, unsigned flags)
+static int newport_font_set(struct vc_data *vc, struct console_font *font,
+                           unsigned int vpitch, unsigned int flags)
 {
-       return newport_set_font(vc->vc_num, font);
+       return newport_set_font(vc->vc_num, font, vpitch);
 }
 
 static bool newport_scroll(struct vc_data *vc, unsigned int t, unsigned int b,
index f304163e87e99299a52fabaf079d54b2700b2e7c..2cea69418a83c36920d55e4980509a7d239bd4c6 100644 (file)
@@ -169,7 +169,8 @@ static int sticon_set_def_font(int unit, struct console_font *op)
        return 0;
 }
 
-static int sticon_set_font(struct vc_data *vc, struct console_font *op)
+static int sticon_set_font(struct vc_data *vc, struct console_font *op,
+                          unsigned int vpitch)
 {
        struct sti_struct *sti = sticon_sti;
        int vc_cols, vc_rows, vc_old_cols, vc_old_rows;
@@ -181,7 +182,7 @@ static int sticon_set_font(struct vc_data *vc, struct console_font *op)
        struct sti_cooked_font *cooked_font;
        unsigned char *data = op->data, *p;
 
-       if ((w < 6) || (h < 6) || (w > 32) || (h > 32)
+       if ((w < 6) || (h < 6) || (w > 32) || (h > 32) || (vpitch != 32)
            || (op->charcount != 256 && op->charcount != 512))
                return -EINVAL;
        pitch = ALIGN(w, 8) / 8;
@@ -267,9 +268,9 @@ static int sticon_font_default(struct vc_data *vc, struct console_font *op, char
 }
 
 static int sticon_font_set(struct vc_data *vc, struct console_font *font,
-                          unsigned int flags)
+                          unsigned int vpitch, unsigned int flags)
 {
-       return sticon_set_font(vc, font);
+       return sticon_set_font(vc, font, vpitch);
 }
 
 static void sticon_init(struct vc_data *c, int init)
index fcdf017e266522366d7ddccea386de274d4c2c2d..03c2cce71c0c865f7d181d3f9a339b5e3d45e876 100644 (file)
@@ -1029,7 +1029,7 @@ static int vgacon_adjust_height(struct vc_data *vc, unsigned fontheight)
 }
 
 static int vgacon_font_set(struct vc_data *c, struct console_font *font,
-                          unsigned int flags)
+                          unsigned int vpitch, unsigned int flags)
 {
        unsigned charcount = font->charcount;
        int rc;
@@ -1037,7 +1037,7 @@ static int vgacon_font_set(struct vc_data *c, struct console_font *font,
        if (vga_video_type < VIDEO_TYPE_EGAM)
                return -EINVAL;
 
-       if (font->width != VGA_FONTWIDTH ||
+       if (font->width != VGA_FONTWIDTH || vpitch != 32 ||
            (charcount != 256 && charcount != 512))
                return -EINVAL;
 
@@ -1050,9 +1050,9 @@ static int vgacon_font_set(struct vc_data *c, struct console_font *font,
        return rc;
 }
 
-static int vgacon_font_get(struct vc_data *c, struct console_font *font)
+static int vgacon_font_get(struct vc_data *c, struct console_font *font, unsigned int vpitch)
 {
-       if (vga_video_type < VIDEO_TYPE_EGAM)
+       if (vga_video_type < VIDEO_TYPE_EGAM || vpitch != 32)
                return -EINVAL;
 
        font->width = VGA_FONTWIDTH;
index 14a7d404062c38e006933da5d42a729b8f9fbf07..7cd7346bbc9a9490f1cc6eb99c28118951b056df 100644 (file)
@@ -2271,7 +2271,7 @@ static int fbcon_debug_leave(struct vc_data *vc)
        return 0;
 }
 
-static int fbcon_get_font(struct vc_data *vc, struct console_font *font)
+static int fbcon_get_font(struct vc_data *vc, struct console_font *font, unsigned int vpitch)
 {
        u8 *fontdata = vc->vc_font.data;
        u8 *data = font->data;
@@ -2290,8 +2290,8 @@ static int fbcon_get_font(struct vc_data *vc, struct console_font *font)
 
                for (i = 0; i < font->charcount; i++) {
                        memcpy(data, fontdata, j);
-                       memset(data + j, 0, 32 - j);
-                       data += 32;
+                       memset(data + j, 0, vpitch - j);
+                       data += vpitch;
                        fontdata += j;
                }
        } else if (font->width <= 16) {
@@ -2301,8 +2301,8 @@ static int fbcon_get_font(struct vc_data *vc, struct console_font *font)
 
                for (i = 0; i < font->charcount; i++) {
                        memcpy(data, fontdata, j);
-                       memset(data + j, 0, 64 - j);
-                       data += 64;
+                       memset(data + j, 0, 2*vpitch - j);
+                       data += 2*vpitch;
                        fontdata += j;
                }
        } else if (font->width <= 24) {
@@ -2316,8 +2316,8 @@ static int fbcon_get_font(struct vc_data *vc, struct console_font *font)
                                *data++ = fontdata[2];
                                fontdata += sizeof(u32);
                        }
-                       memset(data, 0, 3 * (32 - j));
-                       data += 3 * (32 - j);
+                       memset(data, 0, 3 * (vpitch - j));
+                       data += 3 * (vpitch - j);
                }
        } else {
                j = vc->vc_font.height * 4;
@@ -2326,8 +2326,8 @@ static int fbcon_get_font(struct vc_data *vc, struct console_font *font)
 
                for (i = 0; i < font->charcount; i++) {
                        memcpy(data, fontdata, j);
-                       memset(data + j, 0, 128 - j);
-                       data += 128;
+                       memset(data + j, 0, 4 * vpitch - j);
+                       data += 4 * vpitch;
                        fontdata += j;
                }
        }
@@ -2462,19 +2462,12 @@ err_out:
 }
 
 /*
- *  User asked to set font; we are guaranteed that
- *     a) width and height are in range 1..32
- *     b) charcount does not exceed 512
- *  but lets not assume that, since someone might someday want to use larger
- *  fonts. And charcount of 512 is small for unicode support.
- *
- *  However, user space gives the font in 32 rows , regardless of
- *  actual font height. So a new API is needed if support for larger fonts
- *  is ever implemented.
+ *  User asked to set font; we are guaranteed that charcount does not exceed 512
+ *  but lets not assume that, since charcount of 512 is small for unicode support.
  */
 
 static int fbcon_set_font(struct vc_data *vc, struct console_font *font,
-                         unsigned int flags)
+                         unsigned int vpitch, unsigned int flags)
 {
        struct fb_info *info = fbcon_info_from_console(vc->vc_num);
        unsigned charcount = font->charcount;
@@ -2517,7 +2510,7 @@ static int fbcon_set_font(struct vc_data *vc, struct console_font *font,
        FNTSIZE(new_data) = size;
        REFCOUNT(new_data) = 0; /* usage counter */
        for (i=0; i< charcount; i++) {
-               memcpy(new_data + i*h*pitch, data +  i*32*pitch, h*pitch);
+               memcpy(new_data + i*h*pitch, data +  i*vpitch*pitch, h*pitch);
        }
 
        /* Since linux has a nice crc32 function use it for counting font
index 9cea254b34b8eac4420532eba870ce24cfee6937..9e52de94a583b609b7325378c8dee1befef5a436 100644 (file)
@@ -59,8 +59,9 @@ struct consw {
        int     (*con_switch)(struct vc_data *vc);
        int     (*con_blank)(struct vc_data *vc, int blank, int mode_switch);
        int     (*con_font_set)(struct vc_data *vc, struct console_font *font,
-                       unsigned int flags);
-       int     (*con_font_get)(struct vc_data *vc, struct console_font *font);
+                       unsigned int vpitch, unsigned int flags);
+       int     (*con_font_get)(struct vc_data *vc, struct console_font *font,
+                       unsigned int vpitch);
        int     (*con_font_default)(struct vc_data *vc,
                        struct console_font *font, char *name);
        int     (*con_resize)(struct vc_data *vc, unsigned int width,
This page took 0.078855 seconds and 4 git commands to generate.