This source file includes following definitions.
- bt463_funcs
- bt463_register
- bt463_cninit
- bt463_init
- bt463_set_cmap
- bt463_get_cmap
- bt463_check_curcmap
- bt463_set_curcmap
- bt463_get_curcmap
- bt463_store
- bt463_readback
- bt463_debug
- bt463_copyback
- bt463_wraddr
- bt463_update
- bt463_set_cursor
- bt463_get_cursor
- bt463_set_curpos
- bt463_get_curpos
- bt463_get_curmax
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 #include <sys/param.h>
73 #include <sys/systm.h>
74 #include <sys/device.h>
75 #include <sys/buf.h>
76 #include <sys/kernel.h>
77 #include <sys/malloc.h>
78
79 #include <uvm/uvm_extern.h>
80
81 #include <dev/pci/pcivar.h>
82 #include <dev/pci/tgareg.h>
83 #include <dev/pci/tgavar.h>
84 #include <dev/ic/bt463reg.h>
85 #include <dev/ic/bt463var.h>
86
87 #include <dev/wscons/wsconsio.h>
88
89
90
91
92 void bt463_init(struct ramdac_cookie *);
93 int bt463_set_cmap(struct ramdac_cookie *,
94 struct wsdisplay_cmap *);
95 int bt463_get_cmap(struct ramdac_cookie *,
96 struct wsdisplay_cmap *);
97 int bt463_set_cursor(struct ramdac_cookie *,
98 struct wsdisplay_cursor *);
99 int bt463_get_cursor(struct ramdac_cookie *,
100 struct wsdisplay_cursor *);
101 int bt463_set_curpos(struct ramdac_cookie *,
102 struct wsdisplay_curpos *);
103 int bt463_get_curpos(struct ramdac_cookie *,
104 struct wsdisplay_curpos *);
105 int bt463_get_curmax(struct ramdac_cookie *,
106 struct wsdisplay_curpos *);
107 int bt463_check_curcmap(struct ramdac_cookie *,
108 struct wsdisplay_cursor *cursorp);
109 void bt463_set_curcmap(struct ramdac_cookie *,
110 struct wsdisplay_cursor *cursorp);
111 int bt463_get_curcmap(struct ramdac_cookie *,
112 struct wsdisplay_cursor *cursorp);
113
114 #ifdef BT463_DEBUG
115 int bt463_store(void *);
116 int bt463_debug(void *);
117 int bt463_readback(void *);
118 void bt463_copyback(void *);
119 #endif
120
121 struct ramdac_funcs bt463_funcsstruct = {
122 "Bt463",
123 bt463_register,
124 bt463_init,
125 bt463_set_cmap,
126 bt463_get_cmap,
127 bt463_set_cursor,
128 bt463_get_cursor,
129 bt463_set_curpos,
130 bt463_get_curpos,
131 bt463_get_curmax,
132 bt463_check_curcmap,
133 bt463_set_curcmap,
134 bt463_get_curcmap,
135 NULL,
136 };
137
138
139
140
141 struct bt463data {
142 void *cookie;
143
144
145
146
147 int (*ramdac_sched_update)(void *, void (*)(void *));
148 void (*ramdac_wr)(void *, u_int, u_int8_t);
149 u_int8_t (*ramdac_rd)(void *, u_int);
150
151 int changed;
152 char curcmap_r[2];
153 char curcmap_g[2];
154 char curcmap_b[2];
155 char cmap_r[BT463_NCMAP_ENTRIES];
156 char cmap_g[BT463_NCMAP_ENTRIES];
157 char cmap_b[BT463_NCMAP_ENTRIES];
158 int window_type[16];
159 };
160
161
162
163
164
165
166 static struct bt463data *console_data;
167
168
169 #define BTWREG(data, addr, val) do { bt463_wraddr((data), (addr)); \
170 (data)->ramdac_wr((data)->cookie, BT463_REG_IREG_DATA, (val)); } while (0)
171 #define BTWNREG(data, val) (data)->ramdac_wr((data)->cookie, \
172 BT463_REG_IREG_DATA, (val))
173 #define BTRREG(data, addr) (bt463_wraddr((data), (addr)), \
174 (data)->ramdac_rd((data)->cookie, BT463_REG_IREG_DATA))
175 #define BTRNREG(data) ((data)->ramdac_rd((data)->cookie, BT463_REG_IREG_DATA))
176
177 #define DATA_CURCMAP_CHANGED 0x01
178 #define DATA_CMAP_CHANGED 0x02
179 #define DATA_WTYPE_CHANGED 0x04
180 #define DATA_ALL_CHANGED 0x07
181
182
183
184
185 inline void bt463_wraddr(struct bt463data *, u_int16_t);
186
187 void bt463_update(void *);
188
189
190
191
192
193
194
195
196 struct ramdac_funcs *
197 bt463_funcs(void)
198 {
199 return &bt463_funcsstruct;
200 }
201
202 struct ramdac_cookie *
203 bt463_register(v, sched_update, wr, rd)
204 void *v;
205 int (*sched_update)(void *, void (*)(void *));
206 void (*wr)(void *, u_int, u_int8_t);
207 u_int8_t (*rd)(void *, u_int);
208 {
209 struct bt463data *data;
210
211
212
213
214
215
216 data = malloc(sizeof *data, M_DEVBUF, M_WAITOK);
217
218 data->cookie = v;
219 data->ramdac_sched_update = sched_update;
220 data->ramdac_wr = wr;
221 data->ramdac_rd = rd;
222 return (struct ramdac_cookie *)data;
223 }
224
225
226
227
228
229
230 void
231 bt463_cninit(v, sched_update, wr, rd)
232 void *v;
233 int (*sched_update)(void *, void (*)(void *));
234 void (*wr)(void *, u_int, u_int8_t);
235 u_int8_t (*rd)(void *, u_int);
236 {
237 struct bt463data tmp, *data = &tmp;
238 data->cookie = v;
239 data->ramdac_sched_update = sched_update;
240 data->ramdac_wr = wr;
241 data->ramdac_rd = rd;
242
243
244
245 console_data = data;
246 bt463_init((struct ramdac_cookie *)data);
247 console_data = NULL;
248 }
249
250 void
251 bt463_init(rc)
252 struct ramdac_cookie *rc;
253 {
254 struct bt463data *data = (struct bt463data *)rc;
255
256 int i;
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272 BTWREG(data, BT463_IREG_COMMAND_0, 0x40);
273 BTWREG(data, BT463_IREG_COMMAND_1, 0x48);
274 BTWREG(data, BT463_IREG_COMMAND_2, 0xC0);
275
276
277
278
279 bt463_wraddr(data, BT463_IREG_READ_MASK_P0_P7);
280 for (i = 0; i < 4; i++)
281 BTWNREG(data, 0xff);
282
283
284
285
286 bt463_wraddr(data, BT463_IREG_BLINK_MASK_P0_P7);
287 for (i = 0; i < 4; i++)
288 BTWNREG(data, 0);
289
290
291
292
293
294 BTWREG(data, BT463_IREG_TEST, 0);
295
296
297
298
299
300 data->changed = DATA_ALL_CHANGED;
301
302
303 data->curcmap_r[0] = data->curcmap_g[0] = data->curcmap_b[0] = 0;
304 data->curcmap_r[1] = data->curcmap_g[1] = data->curcmap_b[1] = 0xff;
305
306
307 data->cmap_r[0] = data->cmap_g[0] = data->cmap_b[0] = 0;
308 for (i = 1; i < 256; i++) {
309 data->cmap_r[i] = rasops_cmap[3*i + 0];
310 data->cmap_g[i] = rasops_cmap[3*i + 1];
311 data->cmap_b[i] = rasops_cmap[3*i + 2];
312 }
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328 data->window_type[0] = 0x81e100;
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343 data->window_type[1] = 0x01e310;
344
345
346
347
348
349
350
351
352
353
354 for (i = 2; i < BT463_NWTYPE_ENTRIES; i++) {
355 data->window_type[i] = 0x81e100;
356 }
357
358 data->ramdac_sched_update(data->cookie, bt463_update);
359
360 }
361
362 int
363 bt463_set_cmap(rc, cmapp)
364 struct ramdac_cookie *rc;
365 struct wsdisplay_cmap *cmapp;
366 {
367 struct bt463data *data = (struct bt463data *)rc;
368 u_int count, index;
369 int s, error;
370
371 index = cmapp->index;
372 count = cmapp->count;
373
374 if (index >= BT463_NCMAP_ENTRIES || count > BT463_NCMAP_ENTRIES - index)
375 return (EINVAL);
376
377 s = spltty();
378
379 if ((error = copyin(cmapp->red, &data->cmap_r[index], count)) != 0) {
380 splx(s);
381 return (error);
382 }
383 if ((error = copyin(cmapp->green, &data->cmap_g[index], count)) != 0) {
384 splx(s);
385 return (error);
386 }
387 if ((error = copyin(cmapp->blue, &data->cmap_b[index], count)) != 0) {
388 splx(s);
389 return (error);
390 }
391
392 data->changed |= DATA_CMAP_CHANGED;
393
394 data->ramdac_sched_update(data->cookie, bt463_update);
395 splx(s);
396
397 return (0);
398 }
399
400 int
401 bt463_get_cmap(rc, cmapp)
402 struct ramdac_cookie *rc;
403 struct wsdisplay_cmap *cmapp;
404 {
405 struct bt463data *data = (struct bt463data *)rc;
406 u_int count, index;
407 int error;
408
409 count = cmapp->count;
410 index = cmapp->index;
411
412 if (index >= BT463_NCMAP_ENTRIES || count > BT463_NCMAP_ENTRIES - index)
413 return (EINVAL);
414
415 error = copyout(&data->cmap_r[index], cmapp->red, count);
416 if (error)
417 return (error);
418 error = copyout(&data->cmap_g[index], cmapp->green, count);
419 if (error)
420 return (error);
421 error = copyout(&data->cmap_b[index], cmapp->blue, count);
422 return (error);
423 }
424
425 int
426 bt463_check_curcmap(rc, cursorp)
427 struct ramdac_cookie *rc;
428 struct wsdisplay_cursor *cursorp;
429 {
430 u_int index, count;
431 u_int8_t spare[2];
432 int error;
433
434 index = cursorp->cmap.index;
435 count = cursorp->cmap.count;
436
437 if (index >= 2 || count > 2 - index)
438 return (EINVAL);
439
440 if ((error = copyin(&cursorp->cmap.red, &spare, count)) != 0)
441 return (error);
442 if ((error = copyin(&cursorp->cmap.green, &spare, count)) != 0)
443 return (error);
444 if ((error = copyin(&cursorp->cmap.blue, &spare, count)) != 0)
445 return (error);
446
447 return (0);
448 }
449
450 void
451 bt463_set_curcmap(rc, cursorp)
452 struct ramdac_cookie *rc;
453 struct wsdisplay_cursor *cursorp;
454 {
455 struct bt463data *data = (struct bt463data *)rc;
456 int count, index;
457
458
459 count = cursorp->cmap.count;
460 index = cursorp->cmap.index;
461 copyin(cursorp->cmap.red, &data->curcmap_r[index], count);
462 copyin(cursorp->cmap.green, &data->curcmap_g[index], count);
463 copyin(cursorp->cmap.blue, &data->curcmap_b[index], count);
464 data->changed |= DATA_CURCMAP_CHANGED;
465 data->ramdac_sched_update(data->cookie, bt463_update);
466 }
467
468 int
469 bt463_get_curcmap(rc, cursorp)
470 struct ramdac_cookie *rc;
471 struct wsdisplay_cursor *cursorp;
472 {
473 struct bt463data *data = (struct bt463data *)rc;
474 int error;
475
476 cursorp->cmap.index = 0;
477 cursorp->cmap.count = 2;
478 if (cursorp->cmap.red != NULL) {
479 error = copyout(data->curcmap_r, cursorp->cmap.red, 2);
480 if (error)
481 return (error);
482 }
483 if (cursorp->cmap.green != NULL) {
484 error = copyout(data->curcmap_g, cursorp->cmap.green, 2);
485 if (error)
486 return (error);
487 }
488 if (cursorp->cmap.blue != NULL) {
489 error = copyout(data->curcmap_b, cursorp->cmap.blue, 2);
490 if (error)
491 return (error);
492 }
493 return (0);
494 }
495
496
497
498
499
500
501
502
503 #ifdef BT463_DEBUG
504 int bt463_store(void *v)
505 {
506 struct bt463data *data = (struct bt463data *)v;
507
508 data->changed = DATA_ALL_CHANGED;
509 data->ramdac_sched_update(data->cookie, bt463_update);
510 printf("Scheduled bt463 store\n");
511
512 return 0;
513 }
514
515
516 int bt463_readback(void *v)
517 {
518 struct bt463data *data = (struct bt463data *)v;
519
520 data->ramdac_sched_update(data->cookie, bt463_copyback);
521 printf("Scheduled bt463 copyback\n");
522 return 0;
523 }
524
525 int
526 bt463_debug(v)
527 void *v;
528 {
529 struct bt463data *data = (struct bt463data *)v;
530 int i;
531 u_int8_t val;
532
533 printf("BT463 main regs:\n");
534 for (i = 0x200; i < 0x20F; i ++) {
535 val = BTRREG(data, i);
536 printf(" $%04x %02x\n", i, val);
537 }
538
539 printf("BT463 revision register:\n");
540 val = BTRREG(data, 0x220);
541 printf(" $%04x %02x\n", 0x220, val);
542
543 printf("BT463 window type table (from softc):\n");
544
545 for (i = 0; i < BT463_NWTYPE_ENTRIES; i++) {
546 printf("%02x %06x\n", i, data->window_type[i]);
547 }
548
549 return 0;
550 }
551
552 void
553 bt463_copyback(p)
554 void *p;
555 {
556 struct bt463data *data = (struct bt463data *)p;
557 int i;
558
559 for (i = 0; i < BT463_NWTYPE_ENTRIES; i++) {
560 bt463_wraddr(data, BT463_IREG_WINDOW_TYPE_TABLE + i);
561 data->window_type[i] = (BTRNREG(data) & 0xff);
562 data->window_type[i] |= (BTRNREG(data) & 0xff) << 8;
563 data->window_type[i] |= (BTRNREG(data) & 0xff) << 16;
564 }
565 }
566 #endif
567
568 inline void
569 bt463_wraddr(data, ireg)
570 struct bt463data *data;
571 u_int16_t ireg;
572 {
573 data->ramdac_wr(data->cookie, BT463_REG_ADDR_LOW, ireg & 0xff);
574 data->ramdac_wr(data->cookie, BT463_REG_ADDR_HIGH, (ireg >> 8) & 0xff);
575 }
576
577 void
578 bt463_update(p)
579 void *p;
580 {
581 struct bt463data *data = (struct bt463data *)p;
582 int i, v;
583
584 if (console_data != NULL) {
585
586
587
588 data = console_data;
589 }
590
591 v = data->changed;
592
593
594
595
596
597
598
599 if (v & DATA_WTYPE_CHANGED) {
600
601 for (i = 0; i < BT463_NWTYPE_ENTRIES; i++) {
602 bt463_wraddr(data, BT463_IREG_WINDOW_TYPE_TABLE + i);
603 BTWNREG(data, (data->window_type[i]) & 0xff);
604 BTWNREG(data, (data->window_type[i] >> 8) & 0xff);
605 BTWNREG(data, (data->window_type[i] >> 16) & 0xff);
606 }
607 }
608
609 if (v & DATA_CURCMAP_CHANGED) {
610 bt463_wraddr(data, BT463_IREG_CURSOR_COLOR_0);
611
612 for (i = 0; i < 2; i++) {
613 BTWNREG(data, data->curcmap_r[i]);
614 BTWNREG(data, data->curcmap_g[i]);
615 BTWNREG(data, data->curcmap_b[i]);
616 }
617 }
618
619 if (v & DATA_CMAP_CHANGED) {
620 bt463_wraddr(data, BT463_IREG_CPALETTE_RAM);
621
622 for (i = 0; i < BT463_NCMAP_ENTRIES; i++) {
623 data->ramdac_wr(data->cookie, BT463_REG_CMAP_DATA,
624 data->cmap_r[i]);
625 data->ramdac_wr(data->cookie, BT463_REG_CMAP_DATA,
626 data->cmap_g[i]);
627 data->ramdac_wr(data->cookie, BT463_REG_CMAP_DATA,
628 data->cmap_b[i]);
629 }
630 }
631
632 data->changed = 0;
633 }
634
635 int bt463_set_cursor (rc, cur)
636 struct ramdac_cookie *rc;
637 struct wsdisplay_cursor *cur;
638 {
639 struct bt463data *data = (struct bt463data *)rc;
640 return tga_builtin_set_cursor(data->cookie, cur);
641 }
642
643 int bt463_get_cursor (rc, cur)
644 struct ramdac_cookie *rc;
645 struct wsdisplay_cursor *cur;
646 {
647 struct bt463data *data = (struct bt463data *)rc;
648 return tga_builtin_get_cursor(data->cookie, cur);
649 }
650
651 int bt463_set_curpos (rc, cur)
652 struct ramdac_cookie *rc;
653 struct wsdisplay_curpos *cur;
654 {
655 struct bt463data *data = (struct bt463data *)rc;
656 return tga_builtin_set_curpos(data->cookie, cur);
657 }
658
659 int bt463_get_curpos (rc, cur)
660 struct ramdac_cookie *rc;
661 struct wsdisplay_curpos *cur;
662 {
663 struct bt463data *data = (struct bt463data *)rc;
664 return tga_builtin_get_curpos(data->cookie, cur);
665 }
666
667 int bt463_get_curmax (rc, cur)
668 struct ramdac_cookie *rc;
669 struct wsdisplay_curpos *cur;
670 {
671 struct bt463data *data = (struct bt463data *)rc;
672 return tga_builtin_get_curmax(data->cookie, cur);
673 }