Commit 2d2699d9 authored by Antonino A. Daplas's avatar Antonino A. Daplas Committed by Linus Torvalds

fbcon: font setting should check limitation of driver

fbcon_set_font() will now check if the new font dimensions can be drawn by the
driver (by checking pixmap.blit_x and blit_y).  Similarly, add 2 new
parameters to get_default_font(), font_w and font_h, to further aid in the
font selection process.
Signed-off-by: default avatarAntonino Daplas <adaplas@gmail.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent bf26ad72
...@@ -988,7 +988,9 @@ static const char *fbcon_startup(void) ...@@ -988,7 +988,9 @@ static const char *fbcon_startup(void)
if (!p->fontdata) { if (!p->fontdata) {
if (!fontname[0] || !(font = find_font(fontname))) if (!fontname[0] || !(font = find_font(fontname)))
font = get_default_font(info->var.xres, font = get_default_font(info->var.xres,
info->var.yres); info->var.yres,
info->pixmap.blit_x,
info->pixmap.blit_y);
vc->vc_font.width = font->width; vc->vc_font.width = font->width;
vc->vc_font.height = font->height; vc->vc_font.height = font->height;
vc->vc_font.data = (void *)(p->fontdata = font->data); vc->vc_font.data = (void *)(p->fontdata = font->data);
...@@ -1108,7 +1110,9 @@ static void fbcon_init(struct vc_data *vc, int init) ...@@ -1108,7 +1110,9 @@ static void fbcon_init(struct vc_data *vc, int init)
if (!fontname[0] || !(font = find_font(fontname))) if (!fontname[0] || !(font = find_font(fontname)))
font = get_default_font(info->var.xres, font = get_default_font(info->var.xres,
info->var.yres); info->var.yres,
info->pixmap.blit_x,
info->pixmap.blit_y);
vc->vc_font.width = font->width; vc->vc_font.width = font->width;
vc->vc_font.height = font->height; vc->vc_font.height = font->height;
vc->vc_font.data = (void *)(p->fontdata = font->data); vc->vc_font.data = (void *)(p->fontdata = font->data);
...@@ -2495,6 +2499,7 @@ static int fbcon_copy_font(struct vc_data *vc, int con) ...@@ -2495,6 +2499,7 @@ static int fbcon_copy_font(struct vc_data *vc, int con)
static int fbcon_set_font(struct vc_data *vc, struct console_font *font, unsigned flags) static int fbcon_set_font(struct vc_data *vc, struct console_font *font, unsigned flags)
{ {
struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
unsigned charcount = font->charcount; unsigned charcount = font->charcount;
int w = font->width; int w = font->width;
int h = font->height; int h = font->height;
...@@ -2508,6 +2513,11 @@ static int fbcon_set_font(struct vc_data *vc, struct console_font *font, unsigne ...@@ -2508,6 +2513,11 @@ static int fbcon_set_font(struct vc_data *vc, struct console_font *font, unsigne
if (charcount != 256 && charcount != 512) if (charcount != 256 && charcount != 512)
return -EINVAL; return -EINVAL;
/* Make sure drawing engine can handle the font */
if (!(info->pixmap.blit_x & (1 << (font->width - 1))) ||
!(info->pixmap.blit_y & (1 << (font->height - 1))))
return -EINVAL;
size = h * pitch * charcount; size = h * pitch * charcount;
new_data = kmalloc(FONT_EXTRA_WORDS * sizeof(int) + size, GFP_USER); new_data = kmalloc(FONT_EXTRA_WORDS * sizeof(int) + size, GFP_USER);
...@@ -2552,7 +2562,8 @@ static int fbcon_set_def_font(struct vc_data *vc, struct console_font *font, cha ...@@ -2552,7 +2562,8 @@ static int fbcon_set_def_font(struct vc_data *vc, struct console_font *font, cha
const struct font_desc *f; const struct font_desc *f;
if (!name) if (!name)
f = get_default_font(info->var.xres, info->var.yres); f = get_default_font(info->var.xres, info->var.yres,
info->pixmap.blit_x, info->pixmap.blit_y);
else if (!(f = find_font(name))) else if (!(f = find_font(name)))
return -ENOENT; return -ENOENT;
......
...@@ -98,6 +98,8 @@ const struct font_desc *find_font(const char *name) ...@@ -98,6 +98,8 @@ const struct font_desc *find_font(const char *name)
* get_default_font - get default font * get_default_font - get default font
* @xres: screen size of X * @xres: screen size of X
* @yres: screen size of Y * @yres: screen size of Y
* @font_w: bit array of supported widths (1 - 32)
* @font_h: bit array of supported heights (1 - 32)
* *
* Get the default font for a specified screen size. * Get the default font for a specified screen size.
* Dimensions are in pixels. * Dimensions are in pixels.
...@@ -107,7 +109,8 @@ const struct font_desc *find_font(const char *name) ...@@ -107,7 +109,8 @@ const struct font_desc *find_font(const char *name)
* *
*/ */
const struct font_desc *get_default_font(int xres, int yres) const struct font_desc *get_default_font(int xres, int yres, u32 font_w,
u32 font_h)
{ {
int i, c, cc; int i, c, cc;
const struct font_desc *f, *g; const struct font_desc *f, *g;
...@@ -129,6 +132,11 @@ const struct font_desc *get_default_font(int xres, int yres) ...@@ -129,6 +132,11 @@ const struct font_desc *get_default_font(int xres, int yres)
#endif #endif
if ((yres < 400) == (f->height <= 8)) if ((yres < 400) == (f->height <= 8))
c += 1000; c += 1000;
if (!(font_w & (1 << (f->width - 1))) ||
!(font_w & (1 << (f->height - 1))))
c += 1000;
if (c > cc) { if (c > cc) {
cc = c; cc = c;
g = f; g = f;
......
...@@ -495,7 +495,7 @@ sti_select_fbfont(struct sti_cooked_rom *cooked_rom, const char *fbfont_name) ...@@ -495,7 +495,7 @@ sti_select_fbfont(struct sti_cooked_rom *cooked_rom, const char *fbfont_name)
return NULL; return NULL;
fbfont = find_font(fbfont_name); fbfont = find_font(fbfont_name);
if (!fbfont) if (!fbfont)
fbfont = get_default_font(1024,768); fbfont = get_default_font(1024,768, ~(u32)0, ~(u32)0);
if (!fbfont) if (!fbfont)
return NULL; return NULL;
......
...@@ -49,7 +49,8 @@ extern const struct font_desc *find_font(const char *name); ...@@ -49,7 +49,8 @@ extern const struct font_desc *find_font(const char *name);
/* Get the default font for a specific screen size */ /* Get the default font for a specific screen size */
extern const struct font_desc *get_default_font(int xres, int yres); extern const struct font_desc *get_default_font(int xres, int yres,
u32 font_w, u32 font_h);
/* Max. length for the name of a predefined font */ /* Max. length for the name of a predefined font */
#define MAX_FONT_NAME 32 #define MAX_FONT_NAME 32
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment