1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
|
/*
* selection.h
*
* Interface between console.c, tty_io.c, vt.c, vc_screen.c and selection.c
*/
#include <linux/config.h>
extern int sel_cons;
extern void clear_selection(void);
extern int set_selection(const unsigned long arg, struct tty_struct *tty, int user);
extern int paste_selection(struct tty_struct *tty);
extern int sel_loadlut(const unsigned long arg);
extern int mouse_reporting(void);
extern void mouse_report(struct tty_struct * tty, int butt, int mrx, int mry);
#ifdef CONFIG_FB_CONSOLE
extern unsigned long get_video_num_columns(unsigned int console);
extern unsigned long get_video_num_lines(unsigned int console);
extern unsigned long get_video_size_row(unsigned int console);
#else
#define get_video_num_columns(dummy) video_num_columns
#define get_video_num_lines(dummy) video_num_lines
#define get_video_size_row(dummy) video_size_row
#endif
extern unsigned long video_num_columns;
extern unsigned long video_num_lines;
extern unsigned long video_size_row;
extern unsigned char video_type;
extern unsigned long video_mem_base;
extern unsigned long video_mem_term;
extern unsigned long video_screen_size;
extern unsigned short video_port_reg;
extern unsigned short video_port_val;
extern int console_blanked;
extern int can_do_color;
extern unsigned long video_font_height;
extern unsigned long video_scan_lines;
extern unsigned long default_font_height;
extern int video_font_is_default;
extern unsigned char color_table[];
extern int default_red[];
extern int default_grn[];
extern int default_blu[];
extern unsigned short __real_origin;
extern unsigned short __origin;
extern unsigned char has_wrapped;
extern unsigned short *vc_scrbuf[MAX_NR_CONSOLES];
extern void do_unblank_screen(void);
extern unsigned short *screen_pos(int currcons, int w_offset, int viewed);
extern unsigned short screen_word(int currcons, int offset, int viewed);
extern int scrw2glyph(unsigned short scr_word);
extern void complement_pos(int currcons, int offset);
extern void invert_screen(int currcons, int offset, int count, int shift);
#define reverse_video_char(a) (((a) & 0x88) | ((((a) >> 4) | ((a) << 4)) & 0x77))
#define reverse_video_short(a) (((a) & 0x88ff) | \
(((a) & 0x7000) >> 4) | (((a) & 0x0700) << 4))
/* this latter line used to have masks 0xf000 and 0x0f00, but selection
requires a self-inverse operation; moreover, the old version looks wrong */
extern void getconsxy(int currcons, char *p);
extern void putconsxy(int currcons, char *p);
/* how to access screen memory */
#if defined(CONFIG_TGA_CONSOLE)
extern int tga_blitc(unsigned int, unsigned long);
extern unsigned long video_mem_term;
/*
* TGA console screen memory access
*
* TGA is *not* a character/attribute cell device; font bitmaps must be rendered
* to the screen pixels.
*
* We must test for an Alpha kernel virtual address that falls within
* the "shadow screen" memory. This condition indicates we really want
* to write to the screen, so, we do... :-)
*
* NOTE also: there's only *TWO* operations: to put/get a character/attribute.
* All the others needed by VGA support go away, as Not Applicable for TGA.
*/
static inline void scr_writew(unsigned short val, unsigned short * addr)
{
/*
* always deposit the char/attr, then see if it was to "screen" mem.
* if so, then render the char/attr onto the real screen.
*/
*addr = val;
if ((unsigned long)addr < video_mem_term &&
(unsigned long)addr >= video_mem_base) {
tga_blitc(val, (unsigned long) addr);
}
}
static inline unsigned short scr_readw(unsigned short * addr)
{
return *addr;
}
#elif defined (CONFIG_SGI)
#include <linux/vt_kern.h>
#include <linux/kd.h>
extern void blitc(unsigned short, unsigned long);
extern void memsetw(void * s, unsigned short c, unsigned int count);
extern void memcpyw(unsigned short *to, unsigned short *from, unsigned int count);
extern unsigned long video_mem_term;
static inline void scr_writew(unsigned short val, unsigned short * addr)
{
/* always deposit the char/attr, then see if it was to "screen" mem.
* if so, then render the char/attr onto the real screen.
*/
if(*addr != val) {
*addr = val;
if ((unsigned long)addr < video_mem_term &&
(unsigned long)addr >= video_mem_base &&
vt_cons [fg_console]->vc_mode == KD_TEXT)
blitc(val, (unsigned long) addr);
}
}
static inline unsigned short scr_readw(unsigned short * addr)
{
return *addr;
}
#elif defined (CONFIG_VIDEO_G364) /* The G364 cards: same as above. */
extern void g364_blitc(unsigned short, unsigned long);
extern void g364_blitc_colour(unsigned short, unsigned long);
extern unsigned long video_mem_term;
/*
* G364 console screen memory access
*
* G364 is *not* a character/attribute cell device; font bitmaps must be
* rendered to the screen pixels.
*
* The "unsigned short * addr" is *ALWAYS* a kernel virtual address, either
* of the VC's backing store, or the "shadow screen" memory where the screen
* contents are kept, as the G364 frame buffer is *not* char/attr cells.
*
* We must test for a Mips kernel virtual address that falls within
* the "shadow screen" memory. This condition indicates we really want
* to write to the screen, so, we do... :-)
*
* NOTE also: there's only *TWO* operations: to put/get a character/attribute.
* All the others needed by VGA support go away, as Not Applicable for G364.
*/
static inline void scr_writew(unsigned short val, unsigned short * addr)
{
/*
* always deposit the char/attr, then see if it was to "screen" mem.
* if so, then render the char/attr onto the real screen.
*/
*addr = val;
if ((unsigned long)addr < video_mem_term &&
(unsigned long)addr >= video_mem_base) {
if ((val & 0xff00) == 0x0700)
g364_blitc(val, (unsigned long) addr); /* B&W faster */
else
g364_blitc_colour(val, (unsigned long) addr);
}
}
static inline unsigned short scr_readw(unsigned short * addr)
{
return *addr;
}
#elif defined(CONFIG_SUN_CONSOLE)
#include "vt_kern.h"
#include <linux/kd.h>
extern int sun_blitc(unsigned int, unsigned long);
extern void memsetw(void * s, unsigned short c, unsigned int count);
extern void memcpyw(unsigned short *to, unsigned short *from, unsigned int count);
extern unsigned long video_mem_term;
/* Basically the same as the TGA stuff. */
static inline void scr_writew(unsigned short val, unsigned short * addr)
{
/*
* always deposit the char/attr, then see if it was to "screen" mem.
* if so, then render the char/attr onto the real screen.
*/
if (*addr != val) {
*addr = val;
if ((unsigned long)addr < video_mem_term &&
(unsigned long)addr >= video_mem_base &&
vt_cons [fg_console]->vc_mode == KD_TEXT)
sun_blitc(val, (unsigned long) addr);
}
}
static inline unsigned short scr_readw(unsigned short * addr)
{
return *addr;
}
#else
/*
* normal VGA console access
*
*/
#include <asm/io.h>
/*
* NOTE: "(long) addr < 0" tests for an Alpha kernel virtual address; this
* indicates a VC's backing store; otherwise, it's a bus memory address, for
* the VGA's screen memory, so we do the Alpha "swizzle"... :-)
*/
static inline void scr_writeb(unsigned char val, unsigned char * addr)
{
if ((long) addr < 0)
*addr = val;
else
writeb(val, (unsigned long) addr);
}
static inline unsigned char scr_readb(unsigned char * addr)
{
if ((long) addr < 0)
return *addr;
return readb((unsigned long) addr);
}
static inline void scr_writew(unsigned short val, unsigned short * addr)
{
if ((long) addr < 0)
*addr = val;
else
writew(val, (unsigned long) addr);
}
static inline unsigned short scr_readw(unsigned short * addr)
{
if ((long) addr < 0)
return *addr;
return readw((unsigned long) addr);
}
#endif /* CONFIG_TGA_CONSOLE */
#if !defined(CONFIG_SUN_CONSOLE) && !defined(CONFIG_SGI)
static inline void memsetw(void * s, unsigned short c, unsigned int count)
{
unsigned short * addr = (unsigned short *) s;
count /= 2;
while (count) {
count--;
scr_writew(c, addr++);
}
}
static inline void memcpyw(unsigned short *to, unsigned short *from,
unsigned int count)
{
count /= 2;
while (count) {
count--;
scr_writew(scr_readw(from++), to++);
}
}
#endif /* !defined(CONFIG_SUN_CONSOLE) && !defined(CONFIG_SGI) */
|