Commit 15260979 authored by Samuel Thibault's avatar Samuel Thibault Committed by Helge Deller
Browse files

fbcon: Increase maximum font width x height to 64 x 128



By using bitmaps we actually support whatever size we would want, but
the console currently limits fonts to 64x128 (which gives 60x16 text on
4k screens), so we don't need more for now, and we can easily increase
later.

Signed-off-by: default avatarSamuel Thibault <samuel.thibault@ens-lyon.org>
Signed-off-by: default avatarHelge Deller <deller@gmx.de>
parent bc87bb34
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -252,7 +252,7 @@ static int __init efi_earlycon_setup(struct earlycon_device *device,
	if (si->lfb_depth != 32)
		return -ENODEV;

	font = get_default_font(xres, yres, -1, -1);
	font = get_default_font(xres, yres, NULL, NULL);
	if (!font)
		return -ENODEV;

+11 −4
Original line number Diff line number Diff line
@@ -622,8 +622,13 @@ static int arkfb_set_par(struct fb_info *info)
		info->tileops = NULL;

		/* in 4bpp supports 8p wide tiles only, any tiles otherwise */
		info->pixmap.blit_x = (bpp == 4) ? (1 << (8 - 1)) : (~(u32)0);
		info->pixmap.blit_y = ~(u32)0;
		if (bpp == 4) {
			bitmap_zero(info->pixmap.blit_x, FB_MAX_BLIT_WIDTH);
			set_bit(8 - 1, info->pixmap.blit_x);
		} else {
			bitmap_fill(info->pixmap.blit_x, FB_MAX_BLIT_WIDTH);
		}
		bitmap_fill(info->pixmap.blit_y, FB_MAX_BLIT_HEIGHT);

		offset_value = (info->var.xres_virtual * bpp) / 64;
		screen_size = info->var.yres_virtual * info->fix.line_length;
@@ -635,8 +640,10 @@ static int arkfb_set_par(struct fb_info *info)
		info->tileops = &arkfb_tile_ops;

		/* supports 8x16 tiles only */
		info->pixmap.blit_x = 1 << (8 - 1);
		info->pixmap.blit_y = 1 << (16 - 1);
		bitmap_zero(info->pixmap.blit_x, FB_MAX_BLIT_WIDTH);
		set_bit(8 - 1, info->pixmap.blit_x);
		bitmap_zero(info->pixmap.blit_y, FB_MAX_BLIT_HEIGHT);
		set_bit(16 - 1, info->pixmap.blit_y);

		offset_value = info->var.xres_virtual / 16;
		screen_size = (info->var.xres_virtual * info->var.yres_virtual) / 64;
+9 −7
Original line number Diff line number Diff line
@@ -2485,12 +2485,12 @@ 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 > FB_MAX_BLIT_WIDTH || font->height > FB_MAX_BLIT_HEIGHT)
		return -EINVAL;

	/* Make sure drawing engine can handle the font */
	if (!(info->pixmap.blit_x & BIT(font->width - 1)) ||
	    !(info->pixmap.blit_y & BIT(font->height - 1)))
	if (!test_bit(font->width - 1, info->pixmap.blit_x) ||
	    !test_bit(font->height - 1, info->pixmap.blit_y))
		return -EINVAL;

	/* Make sure driver can handle the font length */
@@ -3084,8 +3084,8 @@ void fbcon_get_requirement(struct fb_info *info,
			vc = vc_cons[i].d;
			if (vc && vc->vc_mode == KD_TEXT &&
			    info->node == con2fb_map[i]) {
				caps->x |= 1 << (vc->vc_font.width - 1);
				caps->y |= 1 << (vc->vc_font.height - 1);
				set_bit(vc->vc_font.width - 1, caps->x);
				set_bit(vc->vc_font.height - 1, caps->y);
				charcnt = vc->vc_font.charcount;
				if (caps->len < charcnt)
					caps->len = charcnt;
@@ -3096,8 +3096,10 @@ void fbcon_get_requirement(struct fb_info *info,

		if (vc && vc->vc_mode == KD_TEXT &&
		    info->node == con2fb_map[fg_console]) {
			caps->x = 1 << (vc->vc_font.width - 1);
			caps->y = 1 << (vc->vc_font.height - 1);
			bitmap_zero(caps->x, FB_MAX_BLIT_WIDTH);
			set_bit(vc->vc_font.width - 1, caps->x);
			bitmap_zero(caps->y, FB_MAX_BLIT_HEIGHT);
			set_bit(vc->vc_font.height - 1, caps->y);
			caps->len = vc->vc_font.charcount;
		}
	}
+6 −6
Original line number Diff line number Diff line
@@ -212,8 +212,8 @@ static int fb_check_caps(struct fb_info *info, struct fb_var_screeninfo *var,
	fbcon_get_requirement(info, &caps);
	info->fbops->fb_get_caps(info, &fbcaps, var);

	if (((fbcaps.x ^ caps.x) & caps.x) ||
	    ((fbcaps.y ^ caps.y) & caps.y) ||
	if (!bitmap_subset(caps.x, fbcaps.x, FB_MAX_BLIT_WIDTH) ||
	    !bitmap_subset(caps.y, fbcaps.y, FB_MAX_BLIT_HEIGHT) ||
	    (fbcaps.len < caps.len))
		err = -EINVAL;

@@ -420,11 +420,11 @@ static int do_register_framebuffer(struct fb_info *fb_info)
	}
	fb_info->pixmap.offset = 0;

	if (!fb_info->pixmap.blit_x)
		fb_info->pixmap.blit_x = ~(u32)0;
	if (bitmap_empty(fb_info->pixmap.blit_x, FB_MAX_BLIT_WIDTH))
		bitmap_fill(fb_info->pixmap.blit_x, FB_MAX_BLIT_WIDTH);

	if (!fb_info->pixmap.blit_y)
		fb_info->pixmap.blit_y = ~(u32)0;
	if (bitmap_empty(fb_info->pixmap.blit_y, FB_MAX_BLIT_HEIGHT))
		bitmap_fill(fb_info->pixmap.blit_y, FB_MAX_BLIT_HEIGHT);

	if (!fb_info->modelist.prev || !fb_info->modelist.next)
		INIT_LIST_HEAD(&fb_info->modelist);
+11 −4
Original line number Diff line number Diff line
@@ -354,12 +354,19 @@ void svga_get_caps(struct fb_info *info, struct fb_blit_caps *caps,
{
	if (var->bits_per_pixel == 0) {
		/* can only support 256 8x16 bitmap */
		caps->x = 1 << (8 - 1);
		caps->y = 1 << (16 - 1);
		bitmap_zero(caps->x, FB_MAX_BLIT_WIDTH);
		set_bit(8 - 1, caps->x);
		bitmap_zero(caps->y, FB_MAX_BLIT_HEIGHT);
		set_bit(16 - 1, caps->y);
		caps->len = 256;
	} else {
		caps->x = (var->bits_per_pixel == 4) ? 1 << (8 - 1) : ~(u32)0;
		caps->y = ~(u32)0;
		if (var->bits_per_pixel == 4) {
			bitmap_zero(caps->x, FB_MAX_BLIT_WIDTH);
			set_bit(8 - 1, caps->x);
		} else {
			bitmap_fill(caps->x, FB_MAX_BLIT_WIDTH);
		}
		bitmap_fill(caps->y, FB_MAX_BLIT_HEIGHT);
		caps->len = ~(u32)0;
	}
}
Loading