From: Alexey Gladkov <legion@kernel.org>
To: Samuel Thibault <samuel.thibault@ens-lyon.org>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Jiri Slaby <jirislaby@kernel.org>,
linux-kernel@vger.kernel.org, kbd@lists.altlinux.org
Subject: Re: [kbd] [patchv2 3/3] VT: Bump font size limitation to 64x128 pixels
Date: Sun, 18 Dec 2022 15:39:38 +0100 [thread overview]
Message-ID: <Y58mKmE9Km+NujDa@example.org> (raw)
In-Reply-To: <20221218003237.503424466@ens-lyon.org>
On Sun, Dec 18, 2022 at 01:32:12AM +0100, Samuel Thibault wrote:
> This moves 32x32 font size limitation checking down to drivers, so that
> fbcon can allow large fonts.
>
> We still keep a limitation to 64x128 pixels so as to have a simple bounded
> allocation for con_font_get and in the userland kbd tool. That glyph size
> will however be enough to have 128x36 characters on a "16/9 8K display".
>
> Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
>
> ---
> V1 -> V2: Switch con_font_get to kvmalloc/kvfree instead of kmalloc/kfree
>
> Index: linux-6.0/drivers/tty/vt/vt.c
> ===================================================================
> --- linux-6.0.orig/drivers/tty/vt/vt.c
> +++ linux-6.0/drivers/tty/vt/vt.c
> @@ -4575,17 +4575,20 @@ void reset_palette(struct vc_data *vc)
> /*
> * Font switching
> *
> - * Currently we only support fonts up to 32 pixels wide, at a maximum height
> - * of 32 pixels. Userspace fontdata is stored with 32 bytes (shorts/ints,
> - * depending on width) reserved for each character which is kinda wasty, but
> - * this is done in order to maintain compatibility with the EGA/VGA fonts. It
> - * is up to the actual low-level console-driver convert data into its favorite
> - * format (maybe we should add a `fontoffset' field to the `display'
> - * structure so we won't have to convert the fontdata all the time.
> + * Currently we only support fonts up to 128 pixels wide, at a maximum height
> + * of 128 pixels. Userspace fontdata may have to be stored with 32 bytes
> + * (shorts/ints, depending on width) reserved for each character which is
> + * kinda wasty, but this is done in order to maintain compatibility with the
> + * EGA/VGA fonts. It is up to the actual low-level console-driver convert data
> + * into its favorite format (maybe we should add a `fontoffset' field to the
> + * `display' structure so we won't have to convert the fontdata all the time.
> * /Jes
> */
>
> -#define max_font_size 65536
> +#define max_font_width 64
> +#define max_font_height 128
> +#define max_font_glyphs 512
> +#define max_font_size (max_font_glyphs*max_font_width*max_font_height)
As a suggestion that you can safely ignore. Maybe make max_font_glyphs a
sysctl parameter to be able to use larger fonts ?
I get requests from time to time in kbd that it is not possible to load a
larger font.
> static int con_font_get(struct vc_data *vc, struct console_font_op *op)
> {
> @@ -4595,7 +4598,7 @@ static int con_font_get(struct vc_data *
> unsigned int vpitch = op->op == KD_FONT_OP_GET_TALL ? op->height : 32;
>
> if (op->data) {
> - font.data = kmalloc(max_font_size, GFP_KERNEL);
> + font.data = kvmalloc(max_font_size, GFP_KERNEL);
> if (!font.data)
> return -ENOMEM;
> } else
> @@ -4630,7 +4633,7 @@ static int con_font_get(struct vc_data *
> rc = -EFAULT;
>
> out:
> - kfree(font.data);
> + kvfree(font.data);
> return rc;
> }
>
> @@ -4645,9 +4648,10 @@ static int con_font_set(struct vc_data *
> return -EINVAL;
> if (!op->data)
> return -EINVAL;
> - if (op->charcount > 512)
> + if (op->charcount > max_font_glyphs)
> return -EINVAL;
> - if (op->width <= 0 || op->width > 32 || !op->height || op->height > 32)
> + if (op->width <= 0 || op->width > max_font_width || !op->height ||
> + op->height > max_font_height)
> return -EINVAL;
> if (vpitch < op->height)
> return -EINVAL;
> Index: linux-6.0/drivers/usb/misc/sisusbvga/sisusb_con.c
> ===================================================================
> --- linux-6.0.orig/drivers/usb/misc/sisusbvga/sisusb_con.c
> +++ linux-6.0/drivers/usb/misc/sisusbvga/sisusb_con.c
> @@ -1203,7 +1203,7 @@ sisusbcon_font_set(struct vc_data *c, st
> struct sisusb_usb_data *sisusb;
> unsigned charcount = font->charcount;
>
> - if (font->width != 8 || vpitch != 32 ||
> + if (font->width != 8 || font->height > 32 || vpitch != 32 ||
> (charcount != 256 && charcount != 512))
> return -EINVAL;
>
> Index: linux-6.0/drivers/video/console/vgacon.c
> ===================================================================
> --- linux-6.0.orig/drivers/video/console/vgacon.c
> +++ linux-6.0/drivers/video/console/vgacon.c
> @@ -1037,7 +1037,7 @@ static int vgacon_font_set(struct vc_dat
> if (vga_video_type < VIDEO_TYPE_EGAM)
> return -EINVAL;
>
> - if (font->width != VGA_FONTWIDTH || vpitch != 32 ||
> + if (font->width != VGA_FONTWIDTH || font->height > 32 || vpitch != 32 ||
> (charcount != 256 && charcount != 512))
> return -EINVAL;
>
> Index: linux-6.0/drivers/video/fbdev/core/fbcon.c
> ===================================================================
> --- linux-6.0.orig/drivers/video/fbdev/core/fbcon.c
> +++ linux-6.0/drivers/video/fbdev/core/fbcon.c
> @@ -2279,6 +2279,8 @@ static int fbcon_get_font(struct vc_data
>
> font->width = vc->vc_font.width;
> font->height = vc->vc_font.height;
> + if (font->height > vpitch)
> + return -ENOSPC;
> font->charcount = vc->vc_hi_font_mask ? 512 : 256;
> if (!font->data)
> return 0;
>
> _______________________________________________
> kbd mailing list
> kbd@lists.altlinux.org
> https://lists.altlinux.org/mailman/listinfo/kbd
>
--
Rgrds, legion
WARNING: multiple messages have this Message-ID (diff)
From: Alexey Gladkov <legion@kernel.org>
To: Samuel Thibault <samuel.thibault@ens-lyon.org>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Jiri Slaby <jirislaby@kernel.org>,
kbd@lists.altlinux.org, linux-kernel@vger.kernel.org
Subject: Re: [kbd] [patchv2 3/3] VT: Bump font size limitation to 64x128 pixels
Date: Sun, 18 Dec 2022 15:39:38 +0100 [thread overview]
Message-ID: <Y58mKmE9Km+NujDa@example.org> (raw)
In-Reply-To: <20221218003237.503424466@ens-lyon.org>
On Sun, Dec 18, 2022 at 01:32:12AM +0100, Samuel Thibault wrote:
> This moves 32x32 font size limitation checking down to drivers, so that
> fbcon can allow large fonts.
>
> We still keep a limitation to 64x128 pixels so as to have a simple bounded
> allocation for con_font_get and in the userland kbd tool. That glyph size
> will however be enough to have 128x36 characters on a "16/9 8K display".
>
> Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
>
> ---
> V1 -> V2: Switch con_font_get to kvmalloc/kvfree instead of kmalloc/kfree
>
> Index: linux-6.0/drivers/tty/vt/vt.c
> ===================================================================
> --- linux-6.0.orig/drivers/tty/vt/vt.c
> +++ linux-6.0/drivers/tty/vt/vt.c
> @@ -4575,17 +4575,20 @@ void reset_palette(struct vc_data *vc)
> /*
> * Font switching
> *
> - * Currently we only support fonts up to 32 pixels wide, at a maximum height
> - * of 32 pixels. Userspace fontdata is stored with 32 bytes (shorts/ints,
> - * depending on width) reserved for each character which is kinda wasty, but
> - * this is done in order to maintain compatibility with the EGA/VGA fonts. It
> - * is up to the actual low-level console-driver convert data into its favorite
> - * format (maybe we should add a `fontoffset' field to the `display'
> - * structure so we won't have to convert the fontdata all the time.
> + * Currently we only support fonts up to 128 pixels wide, at a maximum height
> + * of 128 pixels. Userspace fontdata may have to be stored with 32 bytes
> + * (shorts/ints, depending on width) reserved for each character which is
> + * kinda wasty, but this is done in order to maintain compatibility with the
> + * EGA/VGA fonts. It is up to the actual low-level console-driver convert data
> + * into its favorite format (maybe we should add a `fontoffset' field to the
> + * `display' structure so we won't have to convert the fontdata all the time.
> * /Jes
> */
>
> -#define max_font_size 65536
> +#define max_font_width 64
> +#define max_font_height 128
> +#define max_font_glyphs 512
> +#define max_font_size (max_font_glyphs*max_font_width*max_font_height)
As a suggestion that you can safely ignore. Maybe make max_font_glyphs a
sysctl parameter to be able to use larger fonts ?
I get requests from time to time in kbd that it is not possible to load a
larger font.
> static int con_font_get(struct vc_data *vc, struct console_font_op *op)
> {
> @@ -4595,7 +4598,7 @@ static int con_font_get(struct vc_data *
> unsigned int vpitch = op->op == KD_FONT_OP_GET_TALL ? op->height : 32;
>
> if (op->data) {
> - font.data = kmalloc(max_font_size, GFP_KERNEL);
> + font.data = kvmalloc(max_font_size, GFP_KERNEL);
> if (!font.data)
> return -ENOMEM;
> } else
> @@ -4630,7 +4633,7 @@ static int con_font_get(struct vc_data *
> rc = -EFAULT;
>
> out:
> - kfree(font.data);
> + kvfree(font.data);
> return rc;
> }
>
> @@ -4645,9 +4648,10 @@ static int con_font_set(struct vc_data *
> return -EINVAL;
> if (!op->data)
> return -EINVAL;
> - if (op->charcount > 512)
> + if (op->charcount > max_font_glyphs)
> return -EINVAL;
> - if (op->width <= 0 || op->width > 32 || !op->height || op->height > 32)
> + if (op->width <= 0 || op->width > max_font_width || !op->height ||
> + op->height > max_font_height)
> return -EINVAL;
> if (vpitch < op->height)
> return -EINVAL;
> Index: linux-6.0/drivers/usb/misc/sisusbvga/sisusb_con.c
> ===================================================================
> --- linux-6.0.orig/drivers/usb/misc/sisusbvga/sisusb_con.c
> +++ linux-6.0/drivers/usb/misc/sisusbvga/sisusb_con.c
> @@ -1203,7 +1203,7 @@ sisusbcon_font_set(struct vc_data *c, st
> struct sisusb_usb_data *sisusb;
> unsigned charcount = font->charcount;
>
> - if (font->width != 8 || vpitch != 32 ||
> + if (font->width != 8 || font->height > 32 || vpitch != 32 ||
> (charcount != 256 && charcount != 512))
> return -EINVAL;
>
> Index: linux-6.0/drivers/video/console/vgacon.c
> ===================================================================
> --- linux-6.0.orig/drivers/video/console/vgacon.c
> +++ linux-6.0/drivers/video/console/vgacon.c
> @@ -1037,7 +1037,7 @@ static int vgacon_font_set(struct vc_dat
> if (vga_video_type < VIDEO_TYPE_EGAM)
> return -EINVAL;
>
> - if (font->width != VGA_FONTWIDTH || vpitch != 32 ||
> + if (font->width != VGA_FONTWIDTH || font->height > 32 || vpitch != 32 ||
> (charcount != 256 && charcount != 512))
> return -EINVAL;
>
> Index: linux-6.0/drivers/video/fbdev/core/fbcon.c
> ===================================================================
> --- linux-6.0.orig/drivers/video/fbdev/core/fbcon.c
> +++ linux-6.0/drivers/video/fbdev/core/fbcon.c
> @@ -2279,6 +2279,8 @@ static int fbcon_get_font(struct vc_data
>
> font->width = vc->vc_font.width;
> font->height = vc->vc_font.height;
> + if (font->height > vpitch)
> + return -ENOSPC;
> font->charcount = vc->vc_hi_font_mask ? 512 : 256;
> if (!font->data)
> return 0;
>
> _______________________________________________
> kbd mailing list
> kbd@lists.altlinux.org
> https://lists.altlinux.org/mailman/listinfo/kbd
>
--
Rgrds, legion
next prev parent reply other threads:[~2022-12-18 14:39 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-12-18 0:32 [kbd] [patchv2 0/3] VT: Support >32x32 fonts for hidpi displays Samuel Thibault
2022-12-18 0:32 ` Samuel Thibault
2022-12-18 0:32 ` [kbd] [patchv2 1/3] VT: Add height parameter to con_font_get/set consw operations Samuel Thibault
2022-12-18 0:32 ` Samuel Thibault
2023-01-19 15:09 ` [kbd] " Greg Kroah-Hartman
2023-01-19 15:09 ` Greg Kroah-Hartman
2023-01-19 15:20 ` [kbd] " Samuel Thibault
2023-01-19 15:20 ` Samuel Thibault
2022-12-18 0:32 ` [kbd] [patchv2 2/3] VT: Add KD_FONT_OP_SET/GET_TALL operations Samuel Thibault
2022-12-18 0:32 ` Samuel Thibault
2022-12-18 0:32 ` [kbd] [patchv2 3/3] VT: Bump font size limitation to 64x128 pixels Samuel Thibault
2022-12-18 0:32 ` Samuel Thibault
2022-12-18 14:39 ` Alexey Gladkov [this message]
2022-12-18 14:39 ` [kbd] " Alexey Gladkov
2022-12-18 14:55 ` Samuel Thibault
2022-12-18 14:55 ` Samuel Thibault
2022-12-18 15:25 ` Alexey Gladkov
2022-12-18 15:28 ` Samuel Thibault
2022-12-18 15:28 ` Samuel Thibault
2022-12-18 15:38 ` Alexey Gladkov
2023-01-19 14:55 ` Greg Kroah-Hartman
2023-01-19 14:55 ` Greg Kroah-Hartman
2022-12-18 0:33 ` [kbd] [patch] font: Leverage KD_FONT_OP_GET/SET_TALL font operations Samuel Thibault
2022-12-18 0:33 ` Samuel Thibault
2023-01-11 20:00 ` [kbd] " Alexey Gladkov
2023-01-11 20:00 ` Alexey Gladkov
2023-01-16 22:44 ` Samuel Thibault
2023-01-16 22:44 ` Samuel Thibault
2023-01-10 20:55 ` [kbd] [patchv2 0/3] VT: Support >32x32 fonts for hidpi displays Samuel Thibault
2023-01-10 20:55 ` Samuel Thibault
2023-01-18 14:00 ` [kbd] " Alexey Gladkov
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Y58mKmE9Km+NujDa@example.org \
--to=legion@kernel.org \
--cc=gregkh@linuxfoundation.org \
--cc=jirislaby@kernel.org \
--cc=kbd@lists.altlinux.org \
--cc=linux-kernel@vger.kernel.org \
--cc=samuel.thibault@ens-lyon.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.