patch-2.1.115 linux/drivers/sbus/char/cgsix.c
Next file: linux/drivers/sbus/char/cgthree.c
Previous file: linux/drivers/sbus/char/cgfourteen.c
Back to the patch index
Back to the overall index
- Lines: 689
- Date:
Wed Dec 31 16:00:00 1969
- Orig file:
v2.1.114/linux/drivers/sbus/char/cgsix.c
- Orig date:
Sun Jun 7 11:16:33 1998
diff -u --recursive --new-file v2.1.114/linux/drivers/sbus/char/cgsix.c linux/drivers/sbus/char/cgsix.c
@@ -1,688 +0,0 @@
-/* $Id: cgsix.c,v 1.39 1998/03/10 20:18:25 jj Exp $
- * cgsix.c: cgsix frame buffer driver
- *
- * Copyright (C) 1996 Miguel de Icaza (miguel@nuclecu.unam.mx)
- * Copyright (C) 1996 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
- * Copyright (C) 1996 Eddie C. Dost (ecd@skynet.be)
- */
-#include <linux/kd.h>
-#include <linux/tty.h>
-#include <linux/malloc.h>
-#include <linux/proc_fs.h>
-
-#include <asm/sbus.h>
-#include <asm/io.h>
-#include <asm/fbio.h>
-#include <asm/pgtable.h>
-
-/* These must be included after asm/fbio.h */
-#include <linux/vt_kern.h>
-#include <linux/selection.h>
-#include <linux/console_struct.h>
-#include "fb.h"
-#include "cg_common.h"
-
-/* Offset of interesting structures in the OBIO space */
-/*
- * Brooktree is the video dac and is funny to program on the cg6.
- * (it's even funnier on the cg3)
- * The FBC could be the frame buffer control
- * The FHC could is the frame buffer hardware control.
- */
-#define CG6_ROM_OFFSET 0x0
-#define CG6_BROOKTREE_OFFSET 0x200000
-#define CG6_DHC_OFFSET 0x240000
-#define CG6_ALT_OFFSET 0x280000
-#define CG6_FHC_OFFSET 0x300000
-#define CG6_THC_OFFSET 0x301000
-#define CG6_FBC_OFFSET 0x700000
-#define CG6_TEC_OFFSET 0x701000
-#define CG6_RAM_OFFSET 0x800000
-
-/* FHC definitions */
-#define CG6_FHC_FBID_SHIFT 24
-#define CG6_FHC_FBID_MASK 255
-#define CG6_FHC_REV_SHIFT 20
-#define CG6_FHC_REV_MASK 15
-#define CG6_FHC_FROP_DISABLE (1 << 19)
-#define CG6_FHC_ROW_DISABLE (1 << 18)
-#define CG6_FHC_SRC_DISABLE (1 << 17)
-#define CG6_FHC_DST_DISABLE (1 << 16)
-#define CG6_FHC_RESET (1 << 15)
-#define CG6_FHC_LITTLE_ENDIAN (1 << 13)
-#define CG6_FHC_RES_MASK (3 << 11)
-#define CG6_FHC_1024 (0 << 11)
-#define CG6_FHC_1152 (1 << 11)
-#define CG6_FHC_1280 (2 << 11)
-#define CG6_FHC_1600 (3 << 11)
-#define CG6_FHC_CPU_MASK (3 << 9)
-#define CG6_FHC_CPU_SPARC (0 << 9)
-#define CG6_FHC_CPU_68020 (1 << 9)
-#define CG6_FHC_CPU_386 (2 << 9)
-#define CG6_FHC_TEST (1 << 8)
-#define CG6_FHC_TEST_X_SHIFT 4
-#define CG6_FHC_TEST_X_MASK 15
-#define CG6_FHC_TEST_Y_SHIFT 0
-#define CG6_FHC_TEST_Y_MASK 15
-
-/* FBC mode definitions */
-#define CG6_FBC_BLIT_IGNORE 0x00000000
-#define CG6_FBC_BLIT_NOSRC 0x00100000
-#define CG6_FBC_BLIT_SRC 0x00200000
-#define CG6_FBC_BLIT_ILLEGAL 0x00300000
-#define CG6_FBC_BLIT_MASK 0x00300000
-
-#define CG6_FBC_VBLANK 0x00080000
-
-#define CG6_FBC_MODE_IGNORE 0x00000000
-#define CG6_FBC_MODE_COLOR8 0x00020000
-#define CG6_FBC_MODE_COLOR1 0x00040000
-#define CG6_FBC_MODE_HRMONO 0x00060000
-#define CG6_FBC_MODE_MASK 0x00060000
-
-#define CG6_FBC_DRAW_IGNORE 0x00000000
-#define CG6_FBC_DRAW_RENDER 0x00008000
-#define CG6_FBC_DRAW_PICK 0x00010000
-#define CG6_FBC_DRAW_ILLEGAL 0x00018000
-#define CG6_FBC_DRAW_MASK 0x00018000
-
-#define CG6_FBC_BWRITE0_IGNORE 0x00000000
-#define CG6_FBC_BWRITE0_ENABLE 0x00002000
-#define CG6_FBC_BWRITE0_DISABLE 0x00004000
-#define CG6_FBC_BWRITE0_ILLEGAL 0x00006000
-#define CG6_FBC_BWRITE0_MASK 0x00006000
-
-#define CG6_FBC_BWRITE1_IGNORE 0x00000000
-#define CG6_FBC_BWRITE1_ENABLE 0x00000800
-#define CG6_FBC_BWRITE1_DISABLE 0x00001000
-#define CG6_FBC_BWRITE1_ILLEGAL 0x00001800
-#define CG6_FBC_BWRITE1_MASK 0x00001800
-
-#define CG6_FBC_BREAD_IGNORE 0x00000000
-#define CG6_FBC_BREAD_0 0x00000200
-#define CG6_FBC_BREAD_1 0x00000400
-#define CG6_FBC_BREAD_ILLEGAL 0x00000600
-#define CG6_FBC_BREAD_MASK 0x00000600
-
-#define CG6_FBC_BDISP_IGNORE 0x00000000
-#define CG6_FBC_BDISP_0 0x00000080
-#define CG6_FBC_BDISP_1 0x00000100
-#define CG6_FBC_BDISP_ILLEGAL 0x00000180
-#define CG6_FBC_BDISP_MASK 0x00000180
-
-#define CG6_FBC_INDEX_MOD 0x00000040
-#define CG6_FBC_INDEX_MASK 0x00000030
-
-/* THC definitions */
-#define CG6_THC_MISC_REV_SHIFT 16
-#define CG6_THC_MISC_REV_MASK 15
-#define CG6_THC_MISC_RESET (1 << 12)
-#define CG6_THC_MISC_VIDEO (1 << 10)
-#define CG6_THC_MISC_SYNC (1 << 9)
-#define CG6_THC_MISC_VSYNC (1 << 8)
-#define CG6_THC_MISC_SYNC_ENAB (1 << 7)
-#define CG6_THC_MISC_CURS_RES (1 << 6)
-#define CG6_THC_MISC_INT_ENAB (1 << 5)
-#define CG6_THC_MISC_INT (1 << 4)
-#define CG6_THC_MISC_INIT 0x9f
-
-/* The contents are unknown */
-struct cg6_tec {
- volatile int tec_matrix;
- volatile int tec_clip;
- volatile int tec_vdc;
-};
-
-struct cg6_thc {
- uint thc_pad0[512];
- volatile uint thc_hs; /* hsync timing */
- volatile uint thc_hsdvs;
- volatile uint thc_hd;
- volatile uint thc_vs; /* vsync timing */
- volatile uint thc_vd;
- volatile uint thc_refresh;
- volatile uint thc_misc;
- uint thc_pad1[56];
- volatile uint thc_cursxy; /* cursor x,y position (16 bits each) */
- volatile uint thc_cursmask[32]; /* cursor mask bits */
- volatile uint thc_cursbits[32]; /* what to show where mask enabled */
-};
-
-struct cg6_fbc {
- u32 xxx0[1];
- volatile u32 mode;
- volatile u32 clip;
- u32 xxx1[1];
- volatile u32 s;
- volatile u32 draw;
- volatile u32 blit;
- volatile u32 font;
- u32 xxx2[24];
- volatile u32 x0, y0, z0, color0;
- volatile u32 x1, y1, z1, color1;
- volatile u32 x2, y2, z2, color2;
- volatile u32 x3, y3, z3, color3;
- volatile u32 offx, offy;
- u32 xxx3[2];
- volatile u32 incx, incy;
- u32 xxx4[2];
- volatile u32 clipminx, clipminy;
- u32 xxx5[2];
- volatile u32 clipmaxx, clipmaxy;
- u32 xxx6[2];
- volatile u32 fg;
- volatile u32 bg;
- volatile u32 alu;
- volatile u32 pm;
- volatile u32 pixelm;
- u32 xxx7[2];
- volatile u32 patalign;
- volatile u32 pattern[8];
- u32 xxx8[432];
- volatile u32 apointx, apointy, apointz;
- u32 xxx9[1];
- volatile u32 rpointx, rpointy, rpointz;
- u32 xxx10[5];
- volatile u32 pointr, pointg, pointb, pointa;
- volatile u32 alinex, aliney, alinez;
- u32 xxx11[1];
- volatile u32 rlinex, rliney, rlinez;
- u32 xxx12[5];
- volatile u32 liner, lineg, lineb, linea;
- volatile u32 atrix, atriy, atriz;
- u32 xxx13[1];
- volatile u32 rtrix, rtriy, rtriz;
- u32 xxx14[5];
- volatile u32 trir, trig, trib, tria;
- volatile u32 aquadx, aquady, aquadz;
- u32 xxx15[1];
- volatile u32 rquadx, rquady, rquadz;
- u32 xxx16[5];
- volatile u32 quadr, quadg, quadb, quada;
- volatile u32 arectx, arecty, arectz;
- u32 xxx17[1];
- volatile u32 rrectx, rrecty, rrectz;
- u32 xxx18[5];
- volatile u32 rectr, rectg, rectb, recta;
-};
-
-static void
-cg6_restore_palette (fbinfo_t *fbinfo)
-{
- volatile struct bt_regs *bt;
-
- bt = fbinfo->info.cg6.bt;
- bt->addr = 0;
- bt->color_map = 0xffffffff;
- bt->color_map = 0xffffffff;
- bt->color_map = 0xffffffff;
-}
-
-static void cg6_blitc(unsigned short, int, int);
-static void cg6_setw(int, int, unsigned short, int);
-static void cg6_cpyw(int, int, unsigned short *, int);
-
-#if 0
-static void cg6_fill(int, int, int *);
-#endif
-
-/* Ugh: X wants to mmap a bunch of cute stuff at the same time :-( */
-/* So, we just mmap the things that are being asked for */
-static int
-cg6_mmap (struct inode *inode, struct file *file, struct vm_area_struct *vma,
- long base, fbinfo_t *fb)
-{
- uint size, page, r, map_size;
- unsigned long map_offset = 0;
-
- size = vma->vm_end - vma->vm_start;
- if (vma->vm_offset & ~PAGE_MASK)
- return -ENXIO;
-
-#ifdef __sparc_v9__
- /* Try to align RAM */
-#define ALIGNMENT 0x80000
- map_offset = vma->vm_offset + size;
- if (vma->vm_offset <= CG6_RAM && map_offset >= CG6_RAM + fb->type.fb_size) {
- struct vm_area_struct *vmm = find_vma(current->mm, vma->vm_start);
- int alignment = ALIGNMENT - ((vma->vm_start + CG6_RAM - vma->vm_offset) & (ALIGNMENT - 1));
- int sz = 0, fbsz;
-
- if (alignment == ALIGNMENT) alignment = 0;
- fbsz = ((fb->type.fb_size + ALIGNMENT - 1) & ~(ALIGNMENT - 1));
- if (map_offset < CG6_RAM + fbsz)
- sz = fbsz - map_offset + CG6_RAM;
- if ((sz || alignment) && (!vmm || vmm->vm_start >= vma->vm_end + sz + alignment)) {
- vma->vm_start += alignment;
- vma->vm_end += alignment + sz;
- }
- }
-#undef ALIGNMENT
-#endif
-
- /* To stop the swapper from even considering these pages */
- vma->vm_flags |= FB_MMAP_VM_FLAGS;
-
- /* Each page, see which map applies */
- for (page = 0; page < size; ){
- switch (vma->vm_offset+page){
- case CG6_TEC:
- map_size = PAGE_SIZE;
- map_offset = get_phys ((unsigned long)fb->info.cg6.tec) & PAGE_MASK;
- break;
- case CG6_FBC:
- map_size = PAGE_SIZE;
- map_offset = get_phys ((unsigned long)fb->info.cg6.fbc);
- break;
- case CG6_FHC:
- map_size = PAGE_SIZE;
- map_offset = get_phys ((unsigned long)fb->info.cg6.fhc);
- break;
- case CG6_THC:
- map_size = PAGE_SIZE;
- map_offset = get_phys ((unsigned long)fb->info.cg6.thc) & PAGE_MASK;
- break;
- case CG6_BTREGS:
- map_size = PAGE_SIZE;
- map_offset = get_phys ((unsigned long)fb->info.cg6.bt);
- break;
-
- /* For Ultra, make sure the following two are right.
- * The above two happen to work out (for example FBC and
- * TEC will get mapped by one I/O page mapping because
- * of the 8192 byte page size, same for FHC/THC. -DaveM
- */
-
- case CG6_DHC:
- map_size = /* PAGE_SIZE * 40 */ (4096 * 40);
- map_offset = get_phys ((unsigned long)fb->info.cg6.dhc);
- break;
- case CG6_ROM:
- map_size = /* PAGE_SIZE * 16 */ (4096 * 16);
- map_offset = get_phys ((unsigned long)fb->info.cg6.rom);
- break;
- case CG6_RAM:
- map_size = size-page;
- map_offset = get_phys ((unsigned long) fb->base);
- if (map_size < fb->type.fb_size)
- map_size = fb->type.fb_size;
- break;
- default:
- map_size = 0;
- break;
- }
- if (!map_size){
- page += PAGE_SIZE;
- continue;
- }
- if (page + map_size > size)
- map_size = size - page;
- r = io_remap_page_range (vma->vm_start+page,
- map_offset,
- map_size, vma->vm_page_prot,
- fb->space);
- if (r)
- return -EAGAIN;
- page += map_size;
- }
-
- vma->vm_file = file;
- file->f_count++;
- return 0;
-}
-
-static void
-cg6_loadcmap (fbinfo_t *fb, int index, int count)
-{
- struct bt_regs *bt = fb->info.cg6.bt;
- int i;
-
- bt->addr = index << 24;
- for (i = index; count--; i++){
- bt->color_map = fb->color_map CM(i,0) << 24;
- bt->color_map = fb->color_map CM(i,1) << 24;
- bt->color_map = fb->color_map CM(i,2) << 24;
- }
-}
-
-static void
-cg6_setcursormap (fbinfo_t *fb, unsigned char *red,
- unsigned char *green,
- unsigned char *blue)
-{
- struct bt_regs *bt = fb->info.cg6.bt;
-
- bt->addr = 1 << 24;
- bt->cursor = red[0] << 24;
- bt->cursor = green[0] << 24;
- bt->cursor = blue[0] << 24;
- bt->addr = 3 << 24;
- bt->cursor = red[1] << 24;
- bt->cursor = green[1] << 24;
- bt->cursor = blue[1] << 24;
-}
-
-/* Load cursor information */
-static void
-cg6_setcursor (fbinfo_t *fb)
-{
- uint v;
- struct cg_cursor *c = &fb->cursor;
-
- if (c->enable){
- v = ((c->cpos.fbx - c->chot.fbx) << 16)
- |((c->cpos.fby - c->chot.fby) & 0xffff);
- } else {
- /* Magic constant to turn off the cursor */
- v = ((65536-32) << 16) | (65536-32);
- }
- fb->info.cg6.thc->thc_cursxy = v;
-}
-
-/* Set cursor shape */
-static void
-cg6_setcurshape (fbinfo_t *fb)
-{
- struct cg6_thc *thc = fb->info.cg6.thc;
- int i;
-
- for (i = 0; i < 32; i++){
- thc->thc_cursmask [i] = fb->cursor.bits[0][i];
- thc->thc_cursbits [i] = fb->cursor.bits[1][i];
- }
-}
-
-static void
-cg6_blank (fbinfo_t *fb)
-{
- fb->info.cg6.thc->thc_misc &= ~CG6_THC_MISC_VIDEO;
- /* This should put us in power-save */
- fb->info.cg6.thc->thc_misc &= ~CG6_THC_MISC_SYNC_ENAB;
-}
-
-static void
-cg6_unblank (fbinfo_t *fb)
-{
- fb->info.cg6.thc->thc_misc |= CG6_THC_MISC_SYNC_ENAB;
- fb->info.cg6.thc->thc_misc |= CG6_THC_MISC_VIDEO;
-}
-
-void
-cg6_reset (fbinfo_t *fb)
-{
- struct cg6_info *cg6 = &(fb->info.cg6);
- unsigned int rev, conf;
-
- if (fb == &fbinfo[0])
- sbus_hw_hide_cursor ();
- /* Turn off stuff in the Transform Engine. */
- cg6->tec->tec_matrix = 0;
- cg6->tec->tec_clip = 0;
- cg6->tec->tec_vdc = 0;
-
- /* Take care of bugs in old revisions. */
- rev = (*(cg6->fhc) >> CG6_FHC_REV_SHIFT) & CG6_FHC_REV_MASK;
- if (rev < 5) {
- conf = (*(cg6->fhc) & CG6_FHC_RES_MASK) |
- CG6_FHC_CPU_68020 | CG6_FHC_TEST |
- (11 << CG6_FHC_TEST_X_SHIFT) |
- (11 << CG6_FHC_TEST_Y_SHIFT);
- if (rev < 2)
- conf |= CG6_FHC_DST_DISABLE;
- *(cg6->fhc) = conf;
- }
-
- /* Set things in the FBC. */
- cg6->fbc->mode &= ~(CG6_FBC_BLIT_MASK | CG6_FBC_MODE_MASK |
- CG6_FBC_DRAW_MASK | CG6_FBC_BWRITE0_MASK |
- CG6_FBC_BWRITE1_MASK | CG6_FBC_BREAD_MASK |
- CG6_FBC_BDISP_MASK);
- cg6->fbc->mode |= (CG6_FBC_BLIT_SRC | CG6_FBC_MODE_COLOR8 |
- CG6_FBC_DRAW_RENDER | CG6_FBC_BWRITE0_ENABLE |
- CG6_FBC_BWRITE1_DISABLE | CG6_FBC_BREAD_0 |
- CG6_FBC_BDISP_0);
- cg6->fbc->clip = 0;
- cg6->fbc->offx = 0;
- cg6->fbc->offy = 0;
- cg6->fbc->clipminx = 0;
- cg6->fbc->clipminy = 0;
- cg6->fbc->clipmaxx = fb->type.fb_width - 1;
- cg6->fbc->clipmaxy = fb->type.fb_height - 1;
- /* Enable cursor in Brooktree DAC. */
- cg6->bt->addr = 0x06 << 24;
- cg6->bt->control |= 0x03 << 24;
-}
-
-__initfunc(void cg6_setup (fbinfo_t *fb, int slot, u32 cg6, int cg6_io))
-{
- struct cg6_info *cg6info;
- unsigned int rev, cpu, conf;
-
- printk ("cgsix%d at 0x%8.8x ", slot, cg6);
-
- /* Fill in parameters we left out */
- fb->type.fb_cmsize = 256;
- fb->mmap = cg6_mmap;
- fb->loadcmap = cg6_loadcmap;
- fb->reset = cg6_reset;
- fb->blank = cg6_blank;
- fb->unblank = cg6_unblank;
- fb->setcursor = cg6_setcursor;
- fb->setcursormap = cg6_setcursormap;
- fb->setcurshape = cg6_setcurshape;
- fb->postsetup = cg_postsetup;
- fb->blitc = cg6_blitc;
- fb->setw = cg6_setw;
- fb->cpyw = cg6_cpyw;
-
- cg6info = (struct cg6_info *) &fb->info.cg6;
-
- /* Map the hardware registers */
- cg6info->bt = sparc_alloc_io (cg6+CG6_BROOKTREE_OFFSET, 0,
- sizeof (struct bt_regs), "cgsix_dac", cg6_io, 0);
- cg6info->fhc = sparc_alloc_io (cg6+CG6_FHC_OFFSET, 0,
- sizeof (int), "cgsix_fhc", cg6_io, 0);
-#if PAGE_SHIFT <= 12
- cg6info->thc = sparc_alloc_io (cg6+CG6_THC_OFFSET, 0,
- sizeof (struct cg6_thc), "cgsix_thc", cg6_io, 0);
-#else
- cg6info->thc = (struct cg6_thc *)(((char *)cg6info->fhc)+0x1000);
-#endif
- cg6info->fbc = sparc_alloc_io (cg6+CG6_FBC_OFFSET, 0,
- 0x1000, "cgsix_fbc", cg6_io, 0);
-#if PAGE_SHIFT <= 12
- cg6info->tec = sparc_alloc_io (cg6+CG6_TEC_OFFSET, 0,
- sizeof (struct cg6_tec), "cgsix_tec", cg6_io, 0);
-#else
- cg6info->tec = (struct cg6_tec *)(((char *)cg6info->fbc)+0x1000);
-#endif
- cg6info->dhc = sparc_alloc_io (cg6+CG6_DHC_OFFSET, 0,
- 0x40000, "cgsix_dhc", cg6_io, 0);
- cg6info->rom = sparc_alloc_io (cg6+CG6_ROM_OFFSET, 0,
- 0x10000, "cgsix_rom", cg6_io, 0);
- if (!fb->base) {
- fb->base = (unsigned long)
- sparc_alloc_io (cg6+CG6_RAM_OFFSET, 0,
- fb->type.fb_size, "cgsix_ram", cg6_io, 0);
- }
- if (slot == sun_prom_console_id)
- fb_restore_palette = cg6_restore_palette;
-
- /* Initialize Brooktree DAC */
- cg6info->bt->addr = 0x04 << 24; /* color planes */
- cg6info->bt->control = 0xff << 24;
- cg6info->bt->addr = 0x05 << 24;
- cg6info->bt->control = 0x00 << 24;
- cg6info->bt->addr = 0x06 << 24; /* overlay plane */
- cg6info->bt->control = 0x73 << 24;
- cg6info->bt->addr = 0x07 << 24;
- cg6info->bt->control = 0x00 << 24;
-
-#ifdef __sparc_v9__
- printk("VA %016lx ", fb->base);
-#endif
-
- printk("TEC Rev %x ",
- (cg6info->thc->thc_misc >> CG6_THC_MISC_REV_SHIFT) &
- CG6_THC_MISC_REV_MASK);
-
- /* Get FHC Revision */
- conf = *(cg6info->fhc);
-
- cpu = conf & CG6_FHC_CPU_MASK;
- printk("CPU ");
- if (cpu == CG6_FHC_CPU_SPARC)
- printk("sparc ");
- else if (cpu == CG6_FHC_CPU_68020)
- printk("68020 ");
- else
- printk("386 ");
-
- rev = conf >> CG6_FHC_REV_SHIFT & CG6_FHC_REV_MASK;
- printk("Rev %x\n", rev);
-
- if (slot && sun_prom_console_id == slot)
- return;
-
- /* Reset the cg6 */
- cg6_reset(fb);
-
- if (!slot) {
- /* Enable Video */
- cg6_unblank(fb);
- } else {
- cg6_blank(fb);
- }
-}
-
-extern unsigned char vga_font[];
-
-#define GX_BLITC_START(attr) \
- { \
- register struct cg6_fbc *gx = fbinfo[0].info.cg6.fbc; \
- register uint i; \
- do { \
- i = gx->s; \
- } while (i & 0x10000000); \
- gx->fg = attr & 0xf; \
- gx->bg = (attr>>4); \
- gx->mode = 0x140000; \
- gx->alu = 0xe880fc30; \
- gx->pixelm = ~(0); \
- gx->s = 0; \
- gx->clip = 0; \
- gx->pm = 0xff;
-#define GX_BLITC_BODY4(count,x,y,start,action) \
- while (count >= 4) { \
- count -= 4; \
- gx->incx = 0; \
- gx->incy = 1; \
- gx->x0 = x; \
- gx->x1 = (x += 32) - 1; \
- gx->y0 = y; \
- start; \
- for (i = 0; i < CHAR_HEIGHT; i++) { \
- action; \
- } \
- }
-#define GX_BLITC_BODY1(x,y,action) \
- gx->incx = 0; \
- gx->incy = 1; \
- gx->x0 = x; \
- gx->x1 = (x += 8) - 1; \
- gx->y0 = y; \
- for (i = 0; i < CHAR_HEIGHT; i++) { \
- action; \
- }
-#define GX_BLITC_END \
- }
-
-static void cg6_blitc(unsigned short charattr, int xoff, int yoff)
-{
- unsigned char attrib = CHARATTR_TO_SUNCOLOR(charattr);
- unsigned char *p = &vga_font[((unsigned char)charattr) << 4];
- GX_BLITC_START(attrib)
- GX_BLITC_BODY1(xoff, yoff, gx->font=((*p++) << 24))
- GX_BLITC_END
-}
-
-static void cg6_setw(int xoff, int yoff, unsigned short c, int count)
-{
- unsigned char attrib = CHARATTR_TO_SUNCOLOR(c);
- unsigned char *p = &vga_font[((unsigned char)c) << 4];
- register unsigned char *q;
- register uint l;
- GX_BLITC_START(attrib)
- if (count >= 4) {
- GX_BLITC_BODY4(count, xoff, yoff, q = p,
- l = *q++;
- l |= l << 8;
- l |= l << 16;
- gx->font=l)
- }
- while (count) {
- count--;
- q = p;
- GX_BLITC_BODY1(xoff, yoff, gx->font=((*q++) << 24));
- }
- GX_BLITC_END
-}
-
-static void cg6_cpyw(int xoff, int yoff, unsigned short *p, int count)
-{
- unsigned char attrib = CHARATTR_TO_SUNCOLOR(*p);
- unsigned char *p1, *p2, *p3, *p4;
- GX_BLITC_START(attrib)
- if (count >= 4) {
- GX_BLITC_BODY4(count, xoff, yoff,
- p1 = &vga_font[((unsigned char)*p++) << 4];
- p2 = &vga_font[((unsigned char)*p++) << 4];
- p3 = &vga_font[((unsigned char)*p++) << 4];
- p4 = &vga_font[((unsigned char)*p++) << 4],
- gx->font=((uint)*p4++) | ((((uint)*p3++) | ((((uint)*p2++) | (((uint)*p1++) << 8)) << 8)) << 8))
- }
- while (count) {
- count--;
- p1 = &vga_font[((unsigned char)*p++) << 4];
- GX_BLITC_BODY1(xoff, yoff, gx->font=((*p1++) << 24));
- }
- GX_BLITC_END
-}
-
-#define GX_FILL_START(attr) \
- { \
- register struct cg6_fbc *gx = fbinfo[0].info.cg6.fbc; \
- register uint i; \
- do { \
- i = gx->s; \
- } while (i & 0x10000000); \
- gx->fg = attr & 0xf; \
- gx->bg = 0; \
- gx->pixelm = ~(0); \
- gx->s = 0; \
- gx->alu = 0xea80ff00; \
- gx->pm = ~(0); \
- gx->clip = 0;
-#define GX_FILL_END \
- }
-
-#if 0
-static void cg6_fill(int attrib, int count, int *boxes)
-{
- register int r;
-
- attrib = 5;
- GX_FILL_START(attrib)
- while (count-- > 0) {
- gx->arecty = boxes[1];
- gx->arectx = boxes[0];
- gx->arecty = boxes[3];
- gx->arecty = boxes[2];
- boxes += 4;
- do {
- r = gx->draw;
- } while (r < 0 && (r & 0x20000000) );
- }
- GX_FILL_END
-}
-#endif
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov