linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Helge Deller <deller@gmx.de>
To: legion@kernel.org,
	Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
	Jiri Slaby <jirislaby@kernel.org>
Cc: LKML <linux-kernel@vger.kernel.org>,
	kbd@lists.linux.dev, linux-api@vger.kernel.org,
	linux-fbdev@vger.kernel.org, linux-serial@vger.kernel.org
Subject: Re: [PATCH v3 2/2] VT: Allow to get max font width and height
Date: Fri, 15 Mar 2024 10:16:18 +0100	[thread overview]
Message-ID: <bc2a7319-2daa-423b-8b18-e55446dbff81@gmx.de> (raw)
In-Reply-To: <78fcb9ad77b88edee8768806ce6a4d23f6d33118.1710252966.git.legion@kernel.org>

On 3/12/24 15:23, legion@kernel.org wrote:
> From: Alexey Gladkov <legion@kernel.org>
>
> The Console drivers has more restrictive font size limits than vt_ioctl.
> This leads to errors that are difficult to handle. If a font whose size
> is not supported is used, an EINVAL error will be returned, which is
> also returned in case of errors in the font itself. At the moment there
> is no way to understand what font sizes the current console driver
> supports.
>
> To solve this problem, we need to transfer information about the
> supported font to userspace from the console driver.
>
> Signed-off-by: Alexey Gladkov <legion@kernel.org>

Acked-by: Helge Deller <deller@gmx.de>

Helge


> ---
>   drivers/video/console/newport_con.c | 21 +++++++++++++++++----
>   drivers/video/console/sticon.c      | 25 +++++++++++++++++++++++--
>   drivers/video/console/vgacon.c      | 21 ++++++++++++++++++++-
>   drivers/video/fbdev/core/fbcon.c    | 22 +++++++++++++++++++++-
>   4 files changed, 81 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/video/console/newport_con.c b/drivers/video/console/newport_con.c
> index e8e4f82cd4a1..87f174a95fa8 100644
> --- a/drivers/video/console/newport_con.c
> +++ b/drivers/video/console/newport_con.c
> @@ -33,6 +33,9 @@
>
>   #define NEWPORT_LEN	0x10000
>
> +#define NEWPORT_MAX_FONT_WIDTH 8
> +#define NEWPORT_MAX_FONT_HEIGHT 16
> +
>   #define FONT_DATA ((unsigned char *)font_vga_8x16.data)
>
>   static unsigned char *font_data[MAX_NR_CONSOLES];
> @@ -328,8 +331,8 @@ static void newport_init(struct vc_data *vc, int init)
>   {
>   	int cols, rows;
>
> -	cols = newport_xsize / 8;
> -	rows = newport_ysize / 16;
> +	cols = newport_xsize / NEWPORT_MAX_FONT_WIDTH;
> +	rows = newport_ysize / NEWPORT_MAX_FONT_HEIGHT;
>   	vc->vc_can_do_color = 1;
>   	if (init) {
>   		vc->vc_cols = cols;
> @@ -507,8 +510,8 @@ static int newport_set_font(int unit, struct console_font *op, unsigned int vpit
>
>   	/* ladis: when I grow up, there will be a day... and more sizes will
>   	 * be supported ;-) */
> -	if ((w != 8) || (h != 16) || (vpitch != 32)
> -	    || (op->charcount != 256 && op->charcount != 512))
> +	if ((w != NEWPORT_MAX_FONT_WIDTH) || (h != NEWPORT_MAX_FONT_HEIGHT) ||
> +	    (vpitch != 32) || (op->charcount != 256 && op->charcount != 512))
>   		return -EINVAL;
>
>   	if (!(new_data = kmalloc(FONT_EXTRA_WORDS * sizeof(int) + size,
> @@ -569,6 +572,15 @@ 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_info(struct vc_data *vc, struct console_font_info *info)
> +{
> +	info->min_width = info->max_width = NEWPORT_MAX_FONT_WIDTH;
> +	info->min_height = info->max_height = NEWPORT_MAX_FONT_HEIGHT;
> +	info->flags = KD_FONT_INFO_FLAG_LOW_SIZE | KD_FONT_INFO_FLAG_HIGH_SIZE;
> +
> +	return 0;
> +}
> +
>   static int newport_font_set(struct vc_data *vc, struct console_font *font,
>   			    unsigned int vpitch, unsigned int flags)
>   {
> @@ -688,6 +700,7 @@ const struct consw newport_con = {
>   	.con_scroll	  = newport_scroll,
>   	.con_switch	  = newport_switch,
>   	.con_blank	  = newport_blank,
> +	.con_font_info	  = newport_font_info,
>   	.con_font_set	  = newport_font_set,
>   	.con_font_default = newport_font_default,
>   	.con_save_screen  = newport_save_screen
> diff --git a/drivers/video/console/sticon.c b/drivers/video/console/sticon.c
> index 992a4fa431aa..d32ca458eb77 100644
> --- a/drivers/video/console/sticon.c
> +++ b/drivers/video/console/sticon.c
> @@ -56,6 +56,11 @@
>   #define BLANK 0
>   static int vga_is_gfx;
>
> +#define STICON_MIN_FONT_WIDTH 6
> +#define STICON_MIN_FONT_HEIGHT 6
> +#define STICON_MAX_FONT_WIDTH 32
> +#define STICON_MAX_FONT_HEIGHT 32
> +
>   #define STI_DEF_FONT	sticon_sti->font
>
>   /* borrowed from fbcon.c */
> @@ -180,8 +185,10 @@ 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) || (vpitch != 32)
> -	    || (op->charcount != 256 && op->charcount != 512))
> +	if (!in_range(w, STICON_MIN_FONT_WIDTH, STICON_MAX_FONT_WIDTH) ||
> +	    !in_range(h, STICON_MIN_FONT_HEIGHT, STICON_MAX_FONT_HEIGHT) ||
> +	    (vpitch != 32) ||
> +	    (op->charcount != 256 && op->charcount != 512))
>   		return -EINVAL;
>   	pitch = ALIGN(w, 8) / 8;
>   	bpc = pitch * h;
> @@ -273,6 +280,19 @@ static int sticon_font_set(struct vc_data *vc, struct console_font *font,
>   	return sticon_set_font(vc, font, vpitch);
>   }
>
> +static int sticon_font_info(struct vc_data *vc, struct console_font_info *info)
> +{
> +	info->min_width = STICON_MIN_FONT_WIDTH;
> +	info->min_height = STICON_MIN_FONT_HEIGHT;
> +
> +	info->max_width = STICON_MAX_FONT_WIDTH;
> +	info->max_height = STICON_MAX_FONT_HEIGHT;
> +
> +	info->flags = KD_FONT_INFO_FLAG_LOW_SIZE | KD_FONT_INFO_FLAG_HIGH_SIZE;
> +
> +	return 0;
> +}
> +
>   static void sticon_init(struct vc_data *c, int init)
>   {
>       struct sti_struct *sti = sticon_sti;
> @@ -371,6 +391,7 @@ static const struct consw sti_con = {
>   	.con_scroll		= sticon_scroll,
>   	.con_switch		= sticon_switch,
>   	.con_blank		= sticon_blank,
> +	.con_font_info		= sticon_font_info,
>   	.con_font_set		= sticon_font_set,
>   	.con_font_default	= sticon_font_default,
>   	.con_build_attr		= sticon_build_attr,
> diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
> index 8ef1579fa57f..b75d31ef3353 100644
> --- a/drivers/video/console/vgacon.c
> +++ b/drivers/video/console/vgacon.c
> @@ -61,6 +61,10 @@ static struct vgastate vgastate;
>   #define BLANK 0x0020
>
>   #define VGA_FONTWIDTH       8   /* VGA does not support fontwidths != 8 */
> +
> +#define VGACON_MAX_FONT_WIDTH VGA_FONTWIDTH
> +#define VGACON_MAX_FONT_HEIGHT 32
> +
>   /*
>    *  Interface used by the world
>    */
> @@ -1013,6 +1017,19 @@ static int vgacon_adjust_height(struct vc_data *vc, unsigned fontheight)
>   	return 0;
>   }
>
> +static int vgacon_font_info(struct vc_data *vc, struct console_font_info *info)
> +{
> +	info->min_width = VGACON_MAX_FONT_WIDTH;
> +	info->min_height = 0;
> +
> +	info->max_width = VGACON_MAX_FONT_WIDTH;
> +	info->max_height = VGACON_MAX_FONT_HEIGHT;
> +
> +	info->flags = KD_FONT_INFO_FLAG_LOW_SIZE | KD_FONT_INFO_FLAG_HIGH_SIZE;
> +
> +	return 0;
> +}
> +
>   static int vgacon_font_set(struct vc_data *c, struct console_font *font,
>   			   unsigned int vpitch, unsigned int flags)
>   {
> @@ -1022,7 +1039,8 @@ 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 || font->height > 32 || vpitch != 32 ||
> +	if (font->width != VGACON_MAX_FONT_WIDTH ||
> +	    font->height > VGACON_MAX_FONT_HEIGHT || vpitch != 32 ||
>   	    (charcount != 256 && charcount != 512))
>   		return -EINVAL;
>
> @@ -1177,6 +1195,7 @@ const struct consw vga_con = {
>   	.con_scroll = vgacon_scroll,
>   	.con_switch = vgacon_switch,
>   	.con_blank = vgacon_blank,
> +	.con_font_info = vgacon_font_info,
>   	.con_font_set = vgacon_font_set,
>   	.con_font_get = vgacon_font_get,
>   	.con_resize = vgacon_resize,
> diff --git a/drivers/video/fbdev/core/fbcon.c b/drivers/video/fbdev/core/fbcon.c
> index 46823c2e2ba1..e10abe416159 100644
> --- a/drivers/video/fbdev/core/fbcon.c
> +++ b/drivers/video/fbdev/core/fbcon.c
> @@ -101,6 +101,9 @@ enum {
>   	FBCON_LOGO_DONTSHOW	= -3	/* do not show the logo */
>   };
>
> +#define FBCON_MAX_FONT_WIDTH 32
> +#define FBCON_MAX_FONT_HEIGHT 32
> +
>   static struct fbcon_display fb_display[MAX_NR_CONSOLES];
>
>   static struct fb_info *fbcon_registered_fb[FB_MAX];
> @@ -2456,6 +2459,21 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h, int charcount,
>   	return ret;
>   }
>
> +
> +static int fbcon_font_info(struct vc_data *vc, struct console_font_info *info)
> +{
> +	info->min_width = 0;
> +	info->min_height = 0;
> +
> +	info->max_width = FBCON_MAX_FONT_WIDTH;
> +	info->max_height = FBCON_MAX_FONT_HEIGHT;
> +
> +	info->flags = KD_FONT_INFO_FLAG_LOW_SIZE | KD_FONT_INFO_FLAG_HIGH_SIZE;
> +
> +	return 0;
> +}
> +
> +
>   /*
>    *  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.
> @@ -2483,7 +2501,8 @@ static int fbcon_set_font(struct vc_data *vc, struct console_font *font,
>   	    h > FBCON_SWAP(info->var.rotate, info->var.yres, info->var.xres))
>   		return -EINVAL;
>
> -	if (font->width > 32 || font->height > 32)
> +	if (font->width > FBCON_MAX_FONT_WIDTH ||
> +	    font->height > FBCON_MAX_FONT_HEIGHT)
>   		return -EINVAL;
>
>   	/* Make sure drawing engine can handle the font */
> @@ -3158,6 +3177,7 @@ static const struct consw fb_con = {
>   	.con_scroll 		= fbcon_scroll,
>   	.con_switch 		= fbcon_switch,
>   	.con_blank 		= fbcon_blank,
> +	.con_font_info 		= fbcon_font_info,
>   	.con_font_set 		= fbcon_set_font,
>   	.con_font_get 		= fbcon_get_font,
>   	.con_font_default	= fbcon_set_def_font,


  parent reply	other threads:[~2024-03-15  9:16 UTC|newest]

Thread overview: 56+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-02-15 15:37 [RFC PATCH v1 0/5] VT: Add ability to get font requirements Alexey Gladkov
2024-02-15 15:37 ` [RFC PATCH v1 1/5] VT: Add KD_FONT_OP_GET_INFO operation Alexey Gladkov
2024-02-15 15:37 ` [RFC PATCH v1 2/5] newport_con: Allow to get max font width and height Alexey Gladkov
2024-02-15 15:37 ` [RFC PATCH v1 3/5] sticon: " Alexey Gladkov
2024-02-16  7:10   ` Jiri Slaby
2024-02-16 13:03     ` Alexey Gladkov
2024-02-15 15:37 ` [RFC PATCH v1 4/5] vgacon: " Alexey Gladkov
2024-02-15 15:37 ` [RFC PATCH v1 5/5] fbcon: " Alexey Gladkov
2024-02-16  7:21 ` [RFC PATCH v1 0/5] VT: Add ability to get font requirements Jiri Slaby
2024-02-16 13:26   ` Alexey Gladkov
2024-02-16 13:45     ` Samuel Thibault
2024-02-16 14:40       ` Alexey Gladkov
2024-02-21  7:04     ` Jiri Slaby
2024-02-26 15:21 ` [RFC PATCH v2 " Alexey Gladkov
2024-02-26 15:21   ` [RFC PATCH v2 1/5] VT: Add KD_FONT_OP_GET_INFO operation Alexey Gladkov
2024-02-26 15:21   ` [RFC PATCH v2 2/5] newport_con: Allow to get max font width and height Alexey Gladkov
2024-02-26 15:21   ` [RFC PATCH v2 3/5] sticon: " Alexey Gladkov
2024-02-27  5:52     ` Greg Kroah-Hartman
2024-02-27 14:06       ` Alexey Gladkov
2024-02-26 15:21   ` [RFC PATCH v2 4/5] vgacon: " Alexey Gladkov
2024-02-26 15:21   ` [RFC PATCH v2 5/5] fbcon: " Alexey Gladkov
2024-03-12 14:23   ` [PATCH v3 0/2] VT: Add ability to get font requirements legion
2024-03-12 14:23     ` [PATCH v3 1/2] VT: Add KDFONTINFO ioctl legion
2024-03-15  9:15       ` Helge Deller
2024-03-12 14:23     ` [PATCH v3 2/2] VT: Allow to get max font width and height legion
2024-03-13 17:40       ` Oleg Bulatov
2024-04-02 11:09         ` Jiri Slaby
2024-03-15  9:16       ` Helge Deller [this message]
2024-04-02 10:32     ` [RESEND PATCH v3 0/2] VT: Add ability to get font requirements Alexey Gladkov
2024-04-02 10:32       ` [RESEND PATCH v3 1/2] VT: Add KDFONTINFO ioctl Alexey Gladkov
2024-04-02 11:02         ` Jiri Slaby
2024-04-02 13:19           ` Alexey Gladkov
2024-04-03  5:27             ` Jiri Slaby
2024-04-10 16:29               ` Alexey Gladkov
2024-04-10 17:11                 ` Greg Kroah-Hartman
2024-04-02 17:50           ` [PATCH v4 0/3] VT: Add ability to get font requirements Alexey Gladkov
2024-04-02 17:50             ` [PATCH v4 1/3] VT: Use macros to define ioctls Alexey Gladkov
2024-04-02 17:50             ` [PATCH v4 2/3] VT: Add KDFONTINFO ioctl Alexey Gladkov
2024-04-03  4:55               ` Greg Kroah-Hartman
2024-04-03  5:05               ` Jiri Slaby
2024-04-10 16:36                 ` Alexey Gladkov
2024-04-11  3:53                   ` Jiri Slaby
2024-04-02 17:50             ` [PATCH v4 3/3] VT: Allow to get max font width and height Alexey Gladkov
2024-04-17 17:37             ` [PATCH v5 0/3] VT: Add ability to get font requirements Alexey Gladkov
2024-04-17 17:37               ` [PATCH v5 1/3] VT: Use macros to define ioctls Alexey Gladkov
2024-04-18  6:18                 ` Greg Kroah-Hartman
2024-04-17 17:37               ` [PATCH v5 2/3] VT: Add KDFONTINFO ioctl Alexey Gladkov
2024-04-17 19:31                 ` Helge Deller
2024-04-18 10:45                   ` Alexey Gladkov
2024-04-25 10:33                     ` Helge Deller
2024-04-25 11:06                       ` Alexey Gladkov
2024-04-25 11:35                         ` Helge Deller
2024-04-18  6:18                 ` Greg Kroah-Hartman
2024-04-18 10:27                   ` Alexey Gladkov
2024-04-17 17:37               ` [PATCH v5 3/3] VT: Allow to get max font width and height Alexey Gladkov
2024-04-02 10:32       ` [RESEND PATCH v3 2/2] " 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=bc2a7319-2daa-423b-8b18-e55446dbff81@gmx.de \
    --to=deller@gmx.de \
    --cc=gregkh@linuxfoundation.org \
    --cc=jirislaby@kernel.org \
    --cc=kbd@lists.linux.dev \
    --cc=legion@kernel.org \
    --cc=linux-api@vger.kernel.org \
    --cc=linux-fbdev@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-serial@vger.kernel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).