*/
static int __init efi_earlycon_remap_fb(void)
{
+ const struct screen_info *si = &screen_info;
+
/* bail if there is no bootconsole or it was unregistered already */
if (!earlycon_console || !console_is_registered(earlycon_console))
return 0;
- efi_fb = memremap(fb_base, screen_info.lfb_size,
- fb_wb ? MEMREMAP_WB : MEMREMAP_WC);
+ efi_fb = memremap(fb_base, si->lfb_size, fb_wb ? MEMREMAP_WB : MEMREMAP_WC);
return efi_fb ? 0 : -ENOMEM;
}
early_memunmap(addr, len);
}
-static void efi_earlycon_clear_scanline(unsigned int y)
+static void efi_earlycon_clear_scanline(unsigned int y, const struct screen_info *si)
{
unsigned long *dst;
u16 len;
- len = screen_info.lfb_linelength;
+ len = si->lfb_linelength;
dst = efi_earlycon_map(y*len, len);
if (!dst)
return;
efi_earlycon_unmap(dst, len);
}
-static void efi_earlycon_scroll_up(void)
+static void efi_earlycon_scroll_up(const struct screen_info *si)
{
unsigned long *dst, *src;
u16 maxlen = 0;
}
maxlen *= 4;
- len = screen_info.lfb_linelength;
- height = screen_info.lfb_height;
+ len = si->lfb_linelength;
+ height = si->lfb_height;
for (i = 0; i < height - font->height; i++) {
dst = efi_earlycon_map(i*len, len);
}
}
-static void efi_earlycon_write_char(u32 *dst, unsigned char c, unsigned int h)
+static void efi_earlycon_write_char(u32 *dst, unsigned char c, unsigned int h,
+ const struct screen_info *si)
{
const u32 color_black = 0x00000000;
const u32 color_white = 0x00ffffff;
static void
efi_earlycon_write(struct console *con, const char *str, unsigned int num)
{
- struct screen_info *si;
+ const struct screen_info *si = &screen_info;
u32 cur_efi_x = efi_x;
unsigned int len;
const char *s;
void *dst;
- si = &screen_info;
len = si->lfb_linelength;
while (num) {
x = efi_x;
while (n-- > 0) {
- efi_earlycon_write_char(dst + x*4, *s, h);
+ efi_earlycon_write_char(dst + x * 4, *s, h, si);
x += font->width;
s++;
}
cur_line_y = (cur_line_y + 1) % max_line_y;
efi_y -= font->height;
- efi_earlycon_scroll_up();
+ efi_earlycon_scroll_up(si);
for (i = 0; i < font->height; i++)
- efi_earlycon_clear_scanline(efi_y + i);
+ efi_earlycon_clear_scanline(efi_y + i, si);
}
}
}
static int __init efi_earlycon_setup(struct earlycon_device *device,
const char *opt)
{
- struct screen_info *si;
+ const struct screen_info *si = &screen_info;
u16 xres, yres;
u32 i;
fb_wb = opt && !strcmp(opt, "ram");
- if (screen_info.orig_video_isVGA != VIDEO_TYPE_EFI) {
+ if (si->orig_video_isVGA != VIDEO_TYPE_EFI) {
fb_probed = true;
return -ENODEV;
}
- fb_base = screen_info.lfb_base;
- if (screen_info.capabilities & VIDEO_CAPABILITY_64BIT_BASE)
- fb_base |= (u64)screen_info.ext_lfb_base << 32;
+ fb_base = si->lfb_base;
+ if (si->capabilities & VIDEO_CAPABILITY_64BIT_BASE)
+ fb_base |= (u64)si->ext_lfb_base << 32;
- si = &screen_info;
xres = si->lfb_width;
yres = si->lfb_height;
efi_y -= font->height;
for (i = 0; i < (yres - efi_y) / font->height; i++)
- efi_earlycon_scroll_up();
+ efi_earlycon_scroll_up(si);
device->con->write = efi_earlycon_write;
earlycon_console = device->con;