Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

vga: vgastate fix

1) sets 'palette access disabled' during read from AR10.
This is usually documented as needed for access AR01-AR0F,
but on ARK Logic card it is needed for AR10 (otherwise read
returns some nonsence and save_vga_text() returns before do
anything).

2) do not restore AR10, because it was not changed during

3) remove modification of misc reg:
/* force graphics mode */
vga_w(state->vgabase, VGA_MIS_W, misc | 1);

as comment is misleading - LSB of misc reg does not set/reset graphics
mode, but set color/mono adresses of CRT and some other regs.
but these regs are not used during save/restore fonts.
(it worked even when (misc | 1) was replaced by (misc & ~1) ).

Signed-off-by: Ondrej Zajicek <santiago@crfreenet.org>
Signed-off-by: Antonino Daplas <adaplas@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>

authored by

Ondrej Zajicek and committed by
Linus Torvalds
0449359f 56c75549

+11 -15
+11 -15
drivers/video/vgastate.c
··· 50 50 struct regstate *saved = (struct regstate *) state->vidstate; 51 51 int i; 52 52 u8 misc, attr10, gr4, gr5, gr6, seq1, seq2, seq4; 53 + unsigned short iobase; 53 54 54 55 /* if in graphics mode, no need to save */ 56 + misc = vga_r(state->vgabase, VGA_MIS_R); 57 + iobase = (misc & 1) ? 0x3d0 : 0x3b0; 58 + 59 + vga_r(state->vgabase, iobase + 0xa); 60 + vga_w(state->vgabase, VGA_ATT_W, 0x00); 55 61 attr10 = vga_rattr(state->vgabase, 0x10); 62 + vga_r(state->vgabase, iobase + 0xa); 63 + vga_w(state->vgabase, VGA_ATT_W, 0x20); 64 + 56 65 if (attr10 & 1) 57 66 return; 58 - 67 + 59 68 /* save regs */ 60 - misc = vga_r(state->vgabase, VGA_MIS_R); 61 69 gr4 = vga_rgfx(state->vgabase, VGA_GFX_PLANE_READ); 62 70 gr5 = vga_rgfx(state->vgabase, VGA_GFX_MODE); 63 71 gr6 = vga_rgfx(state->vgabase, VGA_GFX_MISC); 64 72 seq2 = vga_rseq(state->vgabase, VGA_SEQ_PLANE_WRITE); 65 73 seq4 = vga_rseq(state->vgabase, VGA_SEQ_MEMORY_MODE); 66 74 67 - /* force graphics mode */ 68 - vga_w(state->vgabase, VGA_MIS_W, misc | 1); 69 - 70 75 /* blank screen */ 71 76 seq1 = vga_rseq(state->vgabase, VGA_SEQ_CLOCK_MODE); 72 77 vga_wseq(state->vgabase, VGA_SEQ_RESET, 0x1); ··· 120 115 } 121 116 122 117 /* restore regs */ 123 - vga_wattr(state->vgabase, 0x10, attr10); 124 - 125 118 vga_wseq(state->vgabase, VGA_SEQ_PLANE_WRITE, seq2); 126 119 vga_wseq(state->vgabase, VGA_SEQ_MEMORY_MODE, seq4); 127 120 128 121 vga_wgfx(state->vgabase, VGA_GFX_PLANE_READ, gr4); 129 122 vga_wgfx(state->vgabase, VGA_GFX_MODE, gr5); 130 123 vga_wgfx(state->vgabase, VGA_GFX_MISC, gr6); 131 - vga_w(state->vgabase, VGA_MIS_W, misc); 132 124 133 125 /* unblank screen */ 134 126 vga_wseq(state->vgabase, VGA_SEQ_RESET, 0x1); ··· 139 137 { 140 138 struct regstate *saved = (struct regstate *) state->vidstate; 141 139 int i; 142 - u8 misc, gr1, gr3, gr4, gr5, gr6, gr8; 140 + u8 gr1, gr3, gr4, gr5, gr6, gr8; 143 141 u8 seq1, seq2, seq4; 144 142 145 143 /* save regs */ 146 - misc = vga_r(state->vgabase, VGA_MIS_R); 147 144 gr1 = vga_rgfx(state->vgabase, VGA_GFX_SR_ENABLE); 148 145 gr3 = vga_rgfx(state->vgabase, VGA_GFX_DATA_ROTATE); 149 146 gr4 = vga_rgfx(state->vgabase, VGA_GFX_PLANE_READ); ··· 152 151 seq2 = vga_rseq(state->vgabase, VGA_SEQ_PLANE_WRITE); 153 152 seq4 = vga_rseq(state->vgabase, VGA_SEQ_MEMORY_MODE); 154 153 155 - /* force graphics mode */ 156 - vga_w(state->vgabase, VGA_MIS_W, misc | 1); 157 - 158 154 /* blank screen */ 159 155 seq1 = vga_rseq(state->vgabase, VGA_SEQ_CLOCK_MODE); 160 156 vga_wseq(state->vgabase, VGA_SEQ_RESET, 0x1); ··· 211 213 vga_wseq(state->vgabase, VGA_SEQ_RESET, 0x3); 212 214 213 215 /* restore regs */ 214 - vga_w(state->vgabase, VGA_MIS_W, misc); 215 - 216 216 vga_wgfx(state->vgabase, VGA_GFX_SR_ENABLE, gr1); 217 217 vga_wgfx(state->vgabase, VGA_GFX_DATA_ROTATE, gr3); 218 218 vga_wgfx(state->vgabase, VGA_GFX_PLANE_READ, gr4);