patch-2.3.9 linux/drivers/sgi/char/cons_newport.c
Next file: linux/drivers/sgi/char/ds1286.c
Previous file: linux/drivers/sgi/char/Makefile
Back to the patch index
Back to the overall index
- Lines: 612
- Date:
Wed Dec 31 16:00:00 1969
- Orig file:
v2.3.8/linux/drivers/sgi/char/cons_newport.c
- Orig date:
Fri May 8 00:23:41 1998
diff -u --recursive --new-file v2.3.8/linux/drivers/sgi/char/cons_newport.c linux/drivers/sgi/char/cons_newport.c
@@ -1,611 +0,0 @@
-/*
- * cons_newport.c: Newport graphics console code for the SGI.
- *
- * Copyright (C) 1996 David S. Miller (dm@engr.sgi.com)
- *
- * $Id: cons_newport.c,v 1.1 1998/01/10 19:05:47 ecd Exp $
- */
-
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/sched.h>
-#include <linux/string.h>
-#include <linux/timer.h>
-#include <linux/interrupt.h>
-#include <linux/errno.h>
-#include <linux/kd.h>
-#include <linux/tty.h>
-#include <linux/malloc.h>
-#include <linux/major.h>
-#include <linux/mm.h>
-#include <linux/version.h>
-
-#include <asm/uaccess.h>
-#include <asm/system.h>
-#include <asm/page.h>
-#include <asm/pgtable.h>
-#include <asm/bitops.h>
-#include <asm/sgialib.h>
-#include <asm/ptrace.h>
-
-#include <linux/kbd_kern.h>
-#include <linux/vt_kern.h>
-#include <linux/consolemap.h>
-#include <linux/selection.h>
-#include <linux/console_struct.h>
-
-#include "gconsole.h"
-#include "newport.h"
-#include "graphics.h" /* Just for now */
-#include <asm/gfx.h>
-#include <asm/ng1.h>
-
-#if 0
-#include "linux_logo.h"
-#endif
-
-#define BMASK(c) (c << 24)
-
-#define RENDER(regs, cp) do { \
-(regs)->go.zpattern = BMASK((cp)[0x0]); (regs)->go.zpattern = BMASK((cp)[0x1]); \
-(regs)->go.zpattern = BMASK((cp)[0x2]); (regs)->go.zpattern = BMASK((cp)[0x3]); \
-(regs)->go.zpattern = BMASK((cp)[0x4]); (regs)->go.zpattern = BMASK((cp)[0x5]); \
-(regs)->go.zpattern = BMASK((cp)[0x6]); (regs)->go.zpattern = BMASK((cp)[0x7]); \
-(regs)->go.zpattern = BMASK((cp)[0x8]); (regs)->go.zpattern = BMASK((cp)[0x9]); \
-(regs)->go.zpattern = BMASK((cp)[0xa]); (regs)->go.zpattern = BMASK((cp)[0xb]); \
-(regs)->go.zpattern = BMASK((cp)[0xc]); (regs)->go.zpattern = BMASK((cp)[0xd]); \
-(regs)->go.zpattern = BMASK((cp)[0xe]); (regs)->go.zpattern = BMASK((cp)[0xf]); \
-} while(0)
-
-#define REVERSE_RENDER(regs, cp) do { \
-(regs)->go.zpattern = BMASK((~(cp)[0x0])); (regs)->go.zpattern = BMASK((~(cp)[0x1])); \
-(regs)->go.zpattern = BMASK((~(cp)[0x2])); (regs)->go.zpattern = BMASK((~(cp)[0x3])); \
-(regs)->go.zpattern = BMASK((~(cp)[0x4])); (regs)->go.zpattern = BMASK((~(cp)[0x5])); \
-(regs)->go.zpattern = BMASK((~(cp)[0x6])); (regs)->go.zpattern = BMASK((~(cp)[0x7])); \
-(regs)->go.zpattern = BMASK((~(cp)[0x8])); (regs)->go.zpattern = BMASK((~(cp)[0x9])); \
-(regs)->go.zpattern = BMASK((~(cp)[0xa])); (regs)->go.zpattern = BMASK((~(cp)[0xb])); \
-(regs)->go.zpattern = BMASK((~(cp)[0xc])); (regs)->go.zpattern = BMASK((~(cp)[0xd])); \
-(regs)->go.zpattern = BMASK((~(cp)[0xe])); (regs)->go.zpattern = BMASK((~(cp)[0xf])); \
-} while(0)
-
-extern int default_red[16], default_grn[16], default_blu[16];
-extern unsigned char video_type;
-
-static int cursor_pos = -1;
-struct newport_regs *npregs;
-
-#define TESTVAL 0xdeadbeef
-#define XSTI_TO_FXSTART(val) (((val) & 0xffff) << 11)
-
-static inline void
-newport_disable_video(void)
-{
- unsigned short treg;
-
- treg = newport_vc2_get(npregs, VC2_IREG_CONTROL);
- newport_vc2_set(npregs, VC2_IREG_CONTROL, (treg & ~(VC2_CTRL_EVIDEO)));
-}
-
-static inline void
-newport_enable_video(void)
-{
- unsigned short treg;
-
- treg = newport_vc2_get(npregs, VC2_IREG_CONTROL);
- newport_vc2_set(npregs, VC2_IREG_CONTROL, (treg | VC2_CTRL_EVIDEO));
-}
-
-static inline void
-newport_disable_cursor(void)
-{
- unsigned short treg;
-
- treg = newport_vc2_get(npregs, VC2_IREG_CONTROL);
- newport_vc2_set(npregs, VC2_IREG_CONTROL, (treg & ~(VC2_CTRL_ECDISP)));
-}
-
-#if 0
-static inline void
-newport_enable_cursor(void)
-{
- unsigned short treg;
-
- treg = newport_vc2_get(npregs, VC2_IREG_CONTROL);
- newport_vc2_set(npregs, VC2_IREG_CONTROL, (treg | VC2_CTRL_ECDISP));
-}
-#endif
-
-static inline void
-newport_init_cmap(void)
-{
- unsigned short i;
-
- for(i = 0; i < 16; i++) {
- newport_bfwait();
- newport_cmap_setaddr(npregs, color_table[i]);
- newport_cmap_setrgb(npregs,
- default_red[i],
- default_grn[i],
- default_blu[i]);
- }
-}
-
-#if 0
-static inline void
-newport_init_cursor(void)
-{
- unsigned char cursor[256];
- unsigned short *cookie;
- int i;
-
- for(i = 0; i < 256; i++)
- cursor[i] = 0x0;
- for(i = 211; i < 256; i+=4) {
- cursor[i] = 0xff;
-#if 0
- cursor[(i + 128) << 2] = 0xff;
- cursor[((i + 128) << 2) + 1] = 0xff;
-#endif
- }
-
- /* Load the SRAM on the VC2 for this new GLYPH. */
- cookie = (unsigned short *) cursor;
- newport_vc2_set(npregs, VC2_IREG_RADDR, VC2_CGLYPH_ADDR);
- npregs->set.dcbmode = (NPORT_DMODE_AVC2 | VC2_REGADDR_RAM |
- NPORT_DMODE_W2 | VC2_PROTOCOL);
- for(i = 0; i < 128; i++) {
- newport_bfwait();
- npregs->set.dcbdata0.hwords.s1 = *cookie++;
- }
-
- /* Place the cursor at origin. */
- newport_vc2_set(npregs, VC2_IREG_CURSX, 0);
- newport_vc2_set(npregs, VC2_IREG_CURSY, 0);
- newport_enable_cursor();
-}
-#endif
-
-static inline void
-newport_clear_screen(void)
-{
- newport_wait();
- npregs->set.wrmask = 0xffffffff;
- npregs->set.drawmode0 = (NPORT_DMODE0_DRAW | NPORT_DMODE0_BLOCK |
- NPORT_DMODE0_DOSETUP | NPORT_DMODE0_STOPX |
- NPORT_DMODE0_STOPY);
- npregs->set.colori = 0;
- npregs->set.xystarti = 0;
- npregs->go.xyendi = (((1280 + 63) << 16)|(1024));
- newport_bfwait();
-}
-
-static inline void
-newport_render_version(void)
-{
-#if 0
- unsigned short *ush;
- int currcons = 0;
- char *p;
-
- ush = (unsigned short *) video_mem_base + video_num_columns * 2 + 20;
- for (p = "SGI/Linux version " UTS_RELEASE; *p; p++, ush++) {
- *ush = (attr << 8) + *p;
- newport_blitc (*ush, (unsigned long) ush);
- }
-#endif
-}
-
-#if 0
-static inline void
-newport_render_logo(void)
-{
- int i, xpos, ypos;
- unsigned char *bmap;
-
- xpos = 8;
- ypos = 18;
-
- newport_wait();
- npregs->set.colori = 9;
- npregs->set.drawmode0 = (NPORT_DMODE0_DRAW | NPORT_DMODE0_BLOCK |
- NPORT_DMODE0_STOPX | NPORT_DMODE0_ZPENAB |
- NPORT_DMODE0_L32);
-
- for(i = 0; i < 80; i+=8) {
- /* Set coordinates for bitmap operation. */
- npregs->set.xystarti = ((xpos + i) << 16) | ypos;
- npregs->set.xyendi = (((xpos + i) + 7) << 16);
- newport_wait();
-
- bmap = linux_logo + (i * 80);
- RENDER(npregs, bmap); bmap += 0x10;
- RENDER(npregs, bmap); bmap += 0x10;
- RENDER(npregs, bmap); bmap += 0x10;
- RENDER(npregs, bmap); bmap += 0x10;
- RENDER(npregs, bmap);
- }
- prom_getchar();
- prom_imode();
-}
-#endif
-
-static inline void
-newport_render_background(int xpos, int ypos, int ci)
-{
- newport_wait();
- npregs->set.wrmask = 0xffffffff;
- npregs->set.drawmode0 = (NPORT_DMODE0_DRAW | NPORT_DMODE0_BLOCK |
- NPORT_DMODE0_DOSETUP | NPORT_DMODE0_STOPX |
- NPORT_DMODE0_STOPY);
- npregs->set.colori = ci;
- npregs->set.xystarti = (xpos << 16) | ypos;
- npregs->go.xyendi = ((xpos + 7) << 16) | (ypos + 15);
-}
-
-void
-newport_set_origin(unsigned short offset)
-{
- /* maybe this works... */
- __origin = offset;
-}
-
-void
-newport_hide_cursor(void)
-{
- int xpos, ypos, idx;
- unsigned long flags;
-
- if(vt_cons[fg_console]->vc_mode == KD_GRAPHICS)
- return;
- save_and_cli(flags);
-
- idx = cursor_pos;
- if(idx == -1) {
- restore_flags(flags);
- return;
- }
- xpos = 8 + ((idx % video_num_columns) << 3);
- ypos = 18 + ((idx / video_num_columns) << 4);
- newport_render_background(xpos, ypos, 0);
- restore_flags(flags);
-}
-
-void
-newport_set_cursor(int currcons)
-{
- int xpos, ypos, idx, oldpos;
- unsigned short *sp, *osp, cattr;
- unsigned long flags;
- unsigned char *p;
-
- if (currcons != fg_console || console_blanked || vcmode == KD_GRAPHICS)
- return;
-
- if (__real_origin != __origin)
- __set_origin(__real_origin);
-
- save_and_cli(flags);
-
- idx = (pos - video_mem_base) >> 1;
- sp = (unsigned short *) pos;
- oldpos = cursor_pos;
- cursor_pos = idx;
- if(!deccm) {
- hide_cursor();
- restore_flags(flags);
- return;
- }
- xpos = 8 + ((idx % video_num_columns) << 3);
- ypos = 18 + ((idx / video_num_columns) << 4);
- if(oldpos != -1) {
- int oxpos, oypos;
-
- /* Restore old location. */
- osp = (unsigned short *) ((oldpos << 1) + video_mem_base);
- oxpos = 8 + ((oldpos % video_num_columns) << 3);
- oypos = 18 + ((oldpos / video_num_columns) << 4);
- cattr = *osp;
- newport_render_background(oxpos, oypos, (cattr & 0xf000) >> 12);
- p = &vga_font[(cattr & 0xff) << 4];
- newport_wait();
- npregs->set.colori = (cattr & 0x0f00) >> 8;
- npregs->set.drawmode0 = (NPORT_DMODE0_DRAW | NPORT_DMODE0_BLOCK |
- NPORT_DMODE0_STOPX | NPORT_DMODE0_ZPENAB |
- NPORT_DMODE0_L32);
- npregs->set.xystarti = (oxpos << 16) | oypos;
- npregs->set.xyendi = ((oxpos + 7) << 16);
- newport_wait();
- RENDER(npregs, p);
- }
- cattr = *sp;
- newport_render_background(xpos, ypos, (cattr & 0xf000) >> 12);
- p = &vga_font[(cattr & 0xff) << 4];
- newport_wait();
- npregs->set.colori = (cattr & 0x0f00) >> 8;
- npregs->set.drawmode0 = (NPORT_DMODE0_DRAW | NPORT_DMODE0_BLOCK |
- NPORT_DMODE0_STOPX | NPORT_DMODE0_ZPENAB |
- NPORT_DMODE0_L32);
- npregs->set.xystarti = (xpos << 16) | ypos;
- npregs->set.xyendi = ((xpos + 7) << 16);
- newport_wait();
- REVERSE_RENDER(npregs, p);
- restore_flags (flags);
- return;
-}
-
-void
-newport_get_scrmem(int currcons)
-{
- memcpyw((unsigned short *)vc_scrbuf[currcons],
- (unsigned short *)origin, video_screen_size);
- origin = video_mem_start = (unsigned long)vc_scrbuf[currcons];
- scr_end = video_mem_end = video_mem_start + video_screen_size;
- pos = origin + y*video_size_row + (x<<1);
-}
-
-void
-newport_set_scrmem(int currcons, long offset)
-{
- if (video_mem_term - video_mem_base < offset + video_screen_size)
- offset = 0;
- memcpyw((unsigned short *)(video_mem_base + offset),
- (unsigned short *) origin, video_screen_size);
- video_mem_start = video_mem_base;
- video_mem_end = video_mem_term;
- origin = video_mem_base + offset;
- scr_end = origin + video_screen_size;
- pos = origin + y*video_size_row + (x<<1);
- has_wrapped = 0;
-}
-
-int
-newport_set_get_cmap(unsigned char * arg, int set)
-{
- unsigned short ent;
- int i;
-
- i = verify_area(set ? VERIFY_READ : VERIFY_WRITE, (void *)arg, 16*3);
- if (i)
- return i;
-
- for (i=0; i<16; i++) {
- if (set) {
- __get_user(default_red[i], arg++);
- __get_user(default_grn[i], arg++);
- __get_user(default_blu[i], arg++);
- } else {
- __put_user (default_red[i], arg++);
- __put_user (default_grn[i], arg++);
- __put_user (default_blu[i], arg++);
- }
- }
- if (set) {
- for (i=0; i<MAX_NR_CONSOLES; i++) {
- if (vc_cons_allocated(i)) {
- int j, k;
- for (j = k = 0; j<16; j++) {
- vc_cons[i].d->vc_palette[k++] =
- default_red[j];
- vc_cons[i].d->vc_palette[k++] =
- default_grn[j];
- vc_cons[i].d->vc_palette[k++] =
- default_blu[j];
- }
- }
- }
- if(console_blanked || vt_cons[fg_console]->vc_mode == KD_GRAPHICS)
- return 0;
- for(ent = 0; ent < 16; ent++) {
- newport_bfwait();
- newport_cmap_setaddr(npregs, ent);
- newport_cmap_setrgb(npregs,
- default_red[ent],
- default_grn[ent],
- default_blu[ent]);
- }
- }
-
- return 0;
-}
-
-void
-newport_blitc(unsigned short charattr, unsigned long addr)
-{
- int idx, xpos, ypos;
- unsigned char *p;
-
- idx = (addr - (video_mem_base + (__origin<<1))) >> 1;
- xpos = 8 + ((idx % video_num_columns) << 3);
- ypos = 18 + ((idx / video_num_columns) << 4);
-
- p = &vga_font[(charattr & 0xff) << 4];
- charattr = (charattr >> 8) & 0xff;
-
- newport_render_background(xpos, ypos, (charattr & 0xf0) >> 4);
-
- /* Set the color and drawing mode. */
- newport_wait();
- npregs->set.colori = charattr & 0xf;
- npregs->set.drawmode0 = (NPORT_DMODE0_DRAW | NPORT_DMODE0_BLOCK |
- NPORT_DMODE0_STOPX | NPORT_DMODE0_ZPENAB |
- NPORT_DMODE0_L32);
-
- /* Set coordinates for bitmap operation. */
- npregs->set.xystarti = (xpos << 16) | ypos;
- npregs->set.xyendi = ((xpos + 7) << 16);
- newport_wait();
-
- /* Go, baby, go... */
- RENDER(npregs, p);
-}
-
-void
-newport_memsetw(void * s, unsigned short c, unsigned int count)
-{
- unsigned short * addr = (unsigned short *) s;
-
- count /= 2;
- if (vt_cons[fg_console]->vc_mode == KD_GRAPHICS) {
- while (count) {
- count--;
- *addr++ = c;
- }
- return;
- }
- if ((unsigned long) addr + count > video_mem_term ||
- (unsigned long) addr < video_mem_base) {
- if ((unsigned long) addr + count <= video_mem_term ||
- (unsigned long) addr > video_mem_base) {
- while (count) {
- count--;
- *addr++ = c;
- }
- return;
- } else {
- while (count) {
- count--;
- scr_writew(c, addr++);
- }
- }
- } else {
- while (count) {
- count--;
- if (*addr != c) {
- newport_blitc(c, (unsigned long)addr);
- *addr++ = c;
- } else
- addr++;
- }
- }
-}
-
-void
-newport_memcpyw(unsigned short *to, unsigned short *from, unsigned int count)
-{
- if (vt_cons[fg_console]->vc_mode == KD_GRAPHICS) {
- memcpy(to, from, count);
- return;
- }
- if ((unsigned long) to + count > video_mem_term ||
- (unsigned long) to < video_mem_base) {
- if ((unsigned long) to + count <= video_mem_term ||
- (unsigned long) to > video_mem_base)
- memcpy(to, from, count);
- else {
- count /= 2;
- while (count) {
- count--;
- scr_writew(scr_readw(from++), to++);
- }
- }
- } else {
- count /= 2;
- while (count) {
- count--;
- if (*to != *from) {
- newport_blitc(*from, (unsigned long)to);
- *to++ = *from++;
- } else {
- from++;
- to++;
- }
- }
- }
-}
-
-struct console_ops newport_console = {
- newport_set_origin,
- newport_hide_cursor,
- newport_set_cursor,
- newport_get_scrmem,
- newport_set_scrmem,
- newport_set_get_cmap,
- newport_blitc,
- newport_memsetw,
- newport_memcpyw
-};
-
-/* Currently hard-coded values that are the same as those found on my system */
-struct ng1_info newport_board_info = {
- { "NG1", "" /* what is the label? */, 1280, 1024, sizeof (struct ng1_info) },
- 6, /* boardrev */
- 1, /* rex3rev */
- 0, /* vc2rev */
- 2, /* monitor type */
- 0, /* videoinstalled */
- 3, /* mcrev */
- 24, /* bitplanes */
- 0, /* xmap9rev */
- 2, /* cmaprev */
- { 256, 1280, 1024, 76}, /* ng1_vof_info */
- 13, /* paneltype */
- 0
-};
-
-void
-newport_reset (void)
-{
- newport_wait();
- newport_enable_video();
-
- /* Init the cursor disappear. */
- newport_wait();
-#if 0
- newport_init_cursor();
-#else
- newport_disable_cursor();
-#endif
-
- newport_init_cmap();
-
- /* Clear the screen. */
- newport_clear_screen();
-}
-
-/* right now the newport does not do anything at all */
-struct graphics_ops newport_graphic_ops = {
- 0, /* owner */
- 0, /* current user */
- (void *) &newport_board_info, /* board info */
- sizeof (struct ng1_info), /* size of our data structure */
- 0, 0, /* g_regs, g_regs_size */
- newport_save, newport_restore, /* g_save_context, g_restore_context */
- newport_reset, newport_ioctl /* g_reset_console, g_ioctl */
-};
-
-struct graphics_ops *
-newport_probe (int slot, const char **name)
-{
- struct newport_regs *p;
-
- npregs = (struct newport_regs *) (KSEG1 + 0x1f0f0000);
-
- p = npregs;
- p->cset.config = NPORT_CFG_GD0;
-
- if(newport_wait()) {
- prom_printf("whoops, timeout, no NEWPORT there?");
- return 0;
- }
-
- p->set.xstarti = TESTVAL; if(p->set._xstart.i != XSTI_TO_FXSTART(TESTVAL)) {
- prom_printf("newport_probe: read back wrong value ;-(\n");
- return 0;
- }
-
- if (slot == 0){
- register_gconsole (&newport_console);
- video_type = VIDEO_TYPE_SGI;
- can_do_color = 1;
- *name = "NEWPORT";
- }
-
- newport_reset ();
- newport_render_version();
-#if 0
- newport_render_logo();
-#endif
- newport_graphic_ops.g_regs = 0x1f0f0000;
- newport_graphic_ops.g_regs_size = sizeof (struct newport_regs);
- return &newport_graphic_ops;
-}
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)