Skip to content

Commit

Permalink
vgacon: prevent vgacon_deinit from touching the hardware for inactive…
Browse files Browse the repository at this point in the history
… consoles.

fbcon makes the (reasonable) assumption that it only needs to program the
hardware once, when fbcon_init() is called for the foreground console.

This doesn't always play well with vgacon because vgacon_deinit() is only
doing its job when the last console it owns is closed (when switching from
vgacon to fbcon, that's usually *after* fbcon_init() has set the new
mode).

Depending on the hardware this can cause the wrong framebuffer location to
be scanned out (e.g.  reproduced on nv05 with the nouveau framebuffer
driver).

Signed-off-by: Francisco Jerez <currojerez@riseup.net>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: Krzysztof Helt <krzysztof.h1@poczta.fm>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Francisco Jerez authored and Linus Torvalds committed Sep 23, 2009
1 parent 2ddce3f commit f0c7d2b
Showing 1 changed file with 5 additions and 3 deletions.
8 changes: 5 additions & 3 deletions drivers/video/console/vgacon.c
Original file line number Diff line number Diff line change
Expand Up @@ -589,12 +589,14 @@ static void vgacon_init(struct vc_data *c, int init)

static void vgacon_deinit(struct vc_data *c)
{
/* When closing the last console, reset video origin */
if (!--vgacon_uni_pagedir[1]) {
/* When closing the active console, reset video origin */
if (CON_IS_VISIBLE(c)) {
c->vc_visible_origin = vga_vram_base;
vga_set_mem_top(c);
con_free_unimap(c);
}

if (!--vgacon_uni_pagedir[1])
con_free_unimap(c);
c->vc_uni_pagedir_loc = &c->vc_uni_pagedir;
con_set_default_unimap(c);
}
Expand Down

0 comments on commit f0c7d2b

Please sign in to comment.