patch-2.1.115 linux/drivers/sbus/char/cgfourteen.c

Next file: linux/drivers/sbus/char/cgsix.c
Previous file: linux/drivers/sbus/char/cg_common.h
Back to the patch index
Back to the overall index

diff -u --recursive --new-file v2.1.114/linux/drivers/sbus/char/cgfourteen.c linux/drivers/sbus/char/cgfourteen.c
@@ -1,475 +0,0 @@
-/* $Id: cgfourteen.c,v 1.26 1998/03/10 20:18:23 jj Exp $
- * cgfourteen.c: Sun SparcStation console support.
- *
- * Copyright (C) 1995 Miguel de Icaza (miguel@nuclecu.unam.mx)
- * Copyright (C) 1996 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
- *
- * TODO:
- *
- * Add the ioctls for CLUT manipulation.
- * Map only the amount requested, not a constant amount.
- * XBGR mapping.
- * Add the interrupt handler.
-*/
-
-#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>
-#include <asm/uaccess.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"
-
-#define CG14_MCR_INTENABLE_SHIFT	7
-#define CG14_MCR_INTENABLE_MASK		0x80
-#define CG14_MCR_VIDENABLE_SHIFT	6
-#define CG14_MCR_VIDENABLE_MASK		0x40
-#define CG14_MCR_PIXMODE_SHIFT		4
-#define CG14_MCR_PIXMODE_MASK		0x30
-#define CG14_MCR_TMR_SHIFT		2
-#define CG14_MCR_TMR_MASK		0x0c
-#define CG14_MCR_TMENABLE_SHIFT		1
-#define CG14_MCR_TMENABLE_MASK		0x02
-#define CG14_MCR_RESET_SHIFT		0
-#define CG14_MCR_RESET_MASK		0x01
-#define CG14_REV_REVISION_SHIFT		4
-#define CG14_REV_REVISION_MASK		0xf0
-#define CG14_REV_IMPL_SHIFT		0
-#define CG14_REV_IMPL_MASK		0x0f
-#define CG14_VBR_FRAMEBASE_SHIFT	12
-#define CG14_VBR_FRAMEBASE_MASK		0x00fff000
-#define CG14_VMCR1_SETUP_SHIFT		0
-#define CG14_VMCR1_SETUP_MASK		0x000001ff
-#define CG14_VMCR1_VCONFIG_SHIFT	9
-#define CG14_VMCR1_VCONFIG_MASK		0x00000e00
-#define CG14_VMCR2_REFRESH_SHIFT	0
-#define CG14_VMCR2_REFRESH_MASK		0x00000001
-#define CG14_VMCR2_TESTROWCNT_SHIFT	1
-#define CG14_VMCR2_TESTROWCNT_MASK	0x00000002
-#define CG14_VMCR2_FBCONFIG_SHIFT	2
-#define CG14_VMCR2_FBCONFIG_MASK	0x0000000c
-#define CG14_VCR_REFRESHREQ_SHIFT	0
-#define CG14_VCR_REFRESHREQ_MASK	0x000003ff
-#define CG14_VCR1_REFRESHENA_SHIFT	10
-#define CG14_VCR1_REFRESHENA_MASK	0x00000400
-#define CG14_VCA_CAD_SHIFT		0
-#define CG14_VCA_CAD_MASK		0x000003ff
-#define CG14_VCA_VERS_SHIFT		10
-#define CG14_VCA_VERS_MASK		0x00000c00
-#define CG14_VCA_RAMSPEED_SHIFT		12
-#define CG14_VCA_RAMSPEED_MASK		0x00001000
-#define CG14_VCA_8MB_SHIFT		13
-#define CG14_VCA_8MB_MASK		0x00002000
-
-#define CG14_MCR_PIXMODE_8		0
-#define CG14_MCR_PIXMODE_16		2
-#define CG14_MCR_PIXMODE_32		3
-
-struct cg14_regs{
-	volatile u8 mcr;	/* Master Control Reg */
-	volatile u8 ppr;	/* Packed Pixel Reg */
-	volatile u8 tms[2];	/* Test Mode Status Regs */
-	volatile u8 msr;	/* Master Status Reg */
-	volatile u8 fsr;	/* Fault Status Reg */
-	volatile u8 rev;	/* Revision & Impl */
-	volatile u8 ccr;	/* Clock Control Reg */
-	volatile u32 tmr;	/* Test Mode Read Back */
-	volatile u8 mod;	/* Monitor Operation Data Reg */
-	volatile u8 acr;	/* Aux Control */
-	u8 xxx0[6];
-	volatile u16 hct;	/* Hor Counter */
-	volatile u16 vct;	/* Vert Counter */
-	volatile u16 hbs;	/* Hor Blank Start */
-	volatile u16 hbc;	/* Hor Blank Clear */
-	volatile u16 hss;	/* Hor Sync Start */
-	volatile u16 hsc;	/* Hor Sync Clear */
-	volatile u16 csc;	/* Composite Sync Clear */
-	volatile u16 vbs;	/* Vert Blank Start */
-	volatile u16 vbc;	/* Vert Blank Clear */
-	volatile u16 vss;	/* Vert Sync Start */
-	volatile u16 vsc;	/* Vert Sync Clear */
-	volatile u16 xcs;
-	volatile u16 xcc;
-	volatile u16 fsa;	/* Fault Status Address */
-	volatile u16 adr;	/* Address Registers */
-	u8 xxx1[0xce];
-	volatile u8 pcg[0x100]; /* Pixel Clock Generator */
-	volatile u32 vbr;	/* Frame Base Row */
-	volatile u32 vmcr;	/* VBC Master Control */
-	volatile u32 vcr;	/* VBC refresh */
-	volatile u32 vca;	/* VBC Config */
-};
-
-#define CG14_CCR_ENABLE	0x04
-#define CG14_CCR_SELECT 0x02	/* HW/Full screen */
-
-struct cg14_cursor {
-	volatile u32 cpl0[32];	/* Enable plane 0 */
-	volatile u32 cpl1[32];  /* Color selection plane */
-	volatile u8 ccr;	/* Cursor Control Reg */
-	u8 xxx0[3];
-	volatile u16 cursx;	/* Cursor x,y position */
-	volatile u16 cursy;	/* Cursor x,y position */
-	volatile u32 color0;
-	volatile u32 color1;
-	u32 xxx1[0x1bc];
-	volatile u32 cpl0i[32];	/* Enable plane 0 autoinc */
-	volatile u32 cpl1i[32]; /* Color selection autoinc */
-};
-
-struct cg14_dac {
-	volatile u8 addr;	/* Address Register */
-	u8 xxx0[255];
-	volatile u8 glut;	/* Gamma table */
-	u8 xxx1[255];
-	volatile u8 select;	/* Register Select */
-	u8 xxx2[255];
-	volatile u8 mode;	/* Mode Register */
-};
-
-struct cg14_xlut{
-	volatile u8 x_xlut [256];
-	volatile u8 x_xlutd [256];
-	u8 xxx0[0x600];
-	volatile u8 x_xlut_inc [256];
-	volatile u8 x_xlutd_inc [256];
-};
-
-/* Color look up table (clut) */
-/* Each one of these arrays hold the color lookup table (for 256
- * colors) for each MDI page (I assume then there should be 4 MDI
- * pages, I still wonder what they are.  I have seen NeXTStep split
- * the screen in four parts, while operating in 24 bits mode.  Each
- * integer holds 4 values: alpha value (transparency channel, thanks
- * go to John Stone (johns@umr.edu) from OpenBSD), red, green and blue
- *
- * I currently use the clut instead of the Xlut
- */
-struct cg14_clut {
-	unsigned int c_clut [256];
-	unsigned int c_clutd [256];    /* i wonder what the 'd' is for */
-	unsigned int c_clut_inc [256];
-	unsigned int c_clutd_inc [256];
-};
-
-static int
-cg14_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;
-	uint ram_size = fb->info.cg14.ramsize;
-
-	printk ("RAMSIZE=%d\n", ram_size);
-	size = vma->vm_end - vma->vm_start;
-        if (vma->vm_offset & ~PAGE_MASK)
-                return -ENXIO;
-
-	/* 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 CG3_MMAP_OFFSET-0x7000:
-		        printk ("Wee!  They are mapping the register, report this to miguel@gnu.ai.mit.edu\n");
-			printk ("Mapping fb->info.regs!\n");
-			map_size = 0x7000;
-			map_offset = get_phys ((unsigned long) fb->info.cg14.regs);
-			break;
-			
-		case CG3_MMAP_OFFSET:
-			map_size = size-page;
-			map_offset = get_phys ((unsigned long) fb->base);
-			break;
-
-		case MDI_PLANAR_X16_MAP:
-			map_size = ram_size/2;
-			map_offset = get_phys ((unsigned long) fb->base) | 0x2000000;
-			break;
-			
-		case MDI_PLANAR_C16_MAP:
-			map_size = ram_size/2;
-			map_offset = get_phys ((unsigned long) fb->base) | 0x2800000;
-			break;
-			
-		case MDI_CHUNKY_XBGR_MAP:
-			map_size = 0;
-			printk ("Woo Woo: XBGR not there yet\n");
-			break;
-			
-		case MDI_CHUNKY_BGR_MAP:
-			map_size = ram_size;
-			map_offset = get_phys ((unsigned long) fb->base) | 0x1000000;
-			break;
-			
-		case MDI_PLANAR_X32_MAP:
-			map_size = ram_size/4;
-			map_offset = get_phys ((unsigned long) fb->base) | 0x3000000;
-			break;
-		case MDI_PLANAR_B32_MAP:
-			map_size = ram_size/4;
-			map_offset = get_phys ((unsigned long) fb->base) | 0x3400000;
-			break;
-		case MDI_PLANAR_G32_MAP:
-			map_size = ram_size/4;
-			map_offset = get_phys ((unsigned long) fb->base) | 0x3800000;
-			break;
-		case MDI_PLANAR_R32_MAP:
-			map_size = ram_size/4;
-			map_offset = get_phys ((unsigned long) fb->base) | 0x3c00000;
-			break;
-
-		case MDI_CURSOR_MAP:
-			map_size = PAGE_SIZE;
-			map_offset = get_phys ((unsigned long) fb->info.cg14.cursor_regs);
-			break;
-			
-		case CG14_REGS:
-		        printk ("Wee!  They are mapping the register, report this to miguel@gnu.ai.mit.edu\n");
-			map_size = PAGE_SIZE;
-			map_offset = get_phys ((unsigned long) fb->info.cg14.regs);
-			break;
-			
-		case CG14_XLUT:
-			map_size = PAGE_SIZE;
-			map_offset = get_phys ((unsigned long) fb->info.cg14.regs+0x3000);
-			break;
-			
-		case CG14_CLUT1:
-			map_size = PAGE_SIZE;
-			map_offset = get_phys ((unsigned long) fb->info.cg14.regs+0x4000);
-			break;
-			
-		case CG14_CLUT2:
-			map_size = PAGE_SIZE;
-			map_offset = get_phys ((unsigned long) fb->info.cg14.regs+0x5000);
-			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
-cg14_cmap (fbinfo_t *fb, int index, int count)
-{
-	struct cg14_clut *clut = fb->info.cg14.clut;
-	int i;
-	
-	for (i = index; count--; i++){
-		clut->c_clut [i] = 
-			(fb->color_map CM(i,2) << 16) |
-			(fb->color_map CM(i,1) << 8) |
-			(fb->color_map CM(i,0));
-	}
-}
-
-static void
-cg14_setcursormap (fbinfo_t *fb, unsigned char *red,
-                                 unsigned char *green,
-                                 unsigned char *blue)
-{
-        struct cg14_cursor *cur = fb->info.cg14.cursor_regs;
-
-	cur->color0 = ((red[0]) | (green[0] << 8) | (blue[0] << 16));
-	cur->color1 = ((red[1]) | (green[1] << 8) | (blue[1] << 16));
-}
-
-/* Load cursor information */
-static void
-cg14_setcursor (fbinfo_t *fb)
-{
-        struct cg_cursor *c = &fb->cursor;
-	struct cg14_cursor *cur = fb->info.cg14.cursor_regs;
-
-        if (c->enable)
-		cur->ccr |= CG14_CCR_ENABLE;
-        cur->cursx = ((c->cpos.fbx - c->chot.fbx) & 0xfff);
-        cur->cursy = ((c->cpos.fby - c->chot.fby) & 0xfff);
-}
-
-/* Set cursor shape */
-static void
-cg14_setcurshape (fbinfo_t *fb)
-{
-        struct cg14_cursor *cur = fb->info.cg14.cursor_regs;
-        int i;
-
-        for (i = 0; i < 32; i++){
-                cur->cpl0 [i] = fb->cursor.bits[0][i];
-                cur->cpl1 [i] = fb->cursor.bits[1][i];
-        }
-}
-
-/* These ones are for putting the video card on 16/32 bpp */
-static int
-cg14_ioctl (struct inode *inode, struct file *file, unsigned cmd, unsigned long arg, fbinfo_t *fb)
-{
-	switch (cmd){
-	case MDI_RESET: {
-		volatile unsigned char *control = &(fb->info.cg14.regs->mcr);
-		*control = (*control & ~CG14_MCR_PIXMODE_MASK);
-	}
-	break;
-
-	case MDI_GET_CFGINFO: {
-		int error;
-		struct mdi_cfginfo *mdii;
-		
-		error = verify_area (VERIFY_WRITE, (void *) arg,
-				     sizeof (struct mdi_cfginfo));
-		if (error)
-			return error;
-
-		mdii = (struct mdi_cfginfo *) arg;
-#if 0
-		__put_user_ret(2, &mdii->mdi_ncluts, -EFAULT);
-		switch (fb->info.cg14.regs->rev & CG14_REV_IMPL_MASK){
-		case 0:
-		case 2:
-		    break;
-		    
-		case 1:
-		case 3:
-		    __put_user_ret(3, &mdii->mdi_ncluts, -EFAULT);
-		    break;
-		default:
-		    printk ("Unknown implementation number\n");
-		}
-#endif
-		__put_user_ret(FBTYPE_MDICOLOR, &mdii->mdi_type, -EFAULT);
-		__put_user_ret(fb->type.fb_height, &mdii->mdi_height, -EFAULT);
-		__put_user_ret(fb->type.fb_width, &mdii->mdi_width, -EFAULT);
-		__put_user_ret(fb->info.cg14.video_mode, &mdii->mdi_mode, -EFAULT);
-		__put_user_ret(72, &mdii->mdi_pixfreq, -EFAULT); /* FIXME */
-		__put_user_ret(fb->info.cg14.ramsize, &mdii->mdi_size, -EFAULT);
-	}
-	break;
-
-	case MDI_SET_PIXELMODE: {
-		int newmode;
-		volatile u8 *control;
-		
-		get_user_ret(newmode, (int *)arg, -EFAULT);
-		control = &(fb->info.cg14.regs->mcr);
-		switch (newmode){
-		case MDI_32_PIX:
-			*control = (*control & ~CG14_MCR_PIXMODE_MASK) |
-				(CG14_MCR_PIXMODE_32 << CG14_MCR_PIXMODE_SHIFT);
-			break;
-		case MDI_16_PIX:
-			*control = (*control & ~CG14_MCR_PIXMODE_MASK) | 0x20;
-			break;
-		case MDI_8_PIX:
-			*control = (*control & ~CG14_MCR_PIXMODE_MASK);
-			break;
-
-		default:
-			return -ENOSYS;
-		}
-		fb->info.cg14.video_mode = newmode;
-	}
-	break;
-	
-	} /* switch */
-	return 0;
-}
-
-static void
-cg14_switch_from_graph (void)
-{
-	fbinfo_t *fb = &(fbinfo [0]);
-	struct cg14_info *cg14info = (struct cg14_info *) &fb->info.cg14;
-
-	/* Set the 8-bpp mode */
-	if (fb->open && fb->mmaped){
-		volatile char *mcr = (char *)(&cg14info->regs->mcr);
-
-		fb->info.cg14.video_mode = 8;
-		*mcr = (*mcr & ~(CG14_MCR_PIXMODE_MASK));
-	}
-}
-
-void
-cg14_reset (fbinfo_t *fb)
-{
-	volatile char *mcr = &(fb->info.cg14.regs->mcr);
-
-	*mcr = (*mcr & ~(CG14_MCR_PIXMODE_MASK));
-}
-
-__initfunc(void cg14_setup (fbinfo_t *fb, int slot, int con_node, u32 cg14, int cg14_io))
-{
-	struct cg14_info *cg14info;
-	uint bases [2];
-	unsigned long cg14regs = 0;
-	struct cg14_regs *regs = 0;
-
-	if (!cg14) {
-		prom_getproperty (con_node, "address", (char *) &bases[0], 8);
-		cg14 = bases[1];
-		cg14regs = bases[0];
-		fb->base = cg14;
-		fb->info.cg14.regs = (struct cg14_regs *) cg14regs;
-		regs = (struct cg14_regs *) cg14regs;
-	}
-	
-	if (!cg14regs){
-		printk ("The PROM does not have mapped the frame buffer or the registers\n"
-			"Mr. Penguin can't use that");
-		prom_halt ();
-	}
-	
-	fb->type.fb_cmsize = 256;
-	fb->mmap =  cg14_mmap;
-	fb->loadcmap = cg14_cmap;
-	fb->setcursor = cg14_setcursor;
-	fb->setcursormap = cg14_setcursormap;
-	fb->setcurshape = cg14_setcurshape;
-	fb->ioctl = cg14_ioctl;
-	fb->switch_from_graph = cg14_switch_from_graph;
-	fb->postsetup = cg_postsetup;
-	fb->reset = cg14_reset;
-	fb->blank = 0;
-	fb->unblank = 0;
-	fb->info.cg14.video_mode = 8;
-	fb->emulations [1] = FBTYPE_SUN3COLOR;
-	fb->type.fb_depth = 24;
-	cg14info = (struct cg14_info *) &fb->info.cg14;
-	cg14info->clut = (void *) (cg14regs + CG14_CLUT1);
-	cg14info->cursor_regs = (void *) (cg14regs + CG14_CURSORREGS);
-
-	/* If the bit is turned on, the card has 8 mb of ram, otherwise just 4 */
-	cg14info->ramsize = (regs->vca & CG14_VCA_8MB_MASK ? 8 : 4) * 1024 * 1024;
-	printk ("cgfourteen%d at 0x%8.8x with %d megs of RAM rev=%d, impl=%d\n",
-		slot, cg14, cg14info->ramsize/(1024*1024), regs->rev >> 4, regs->rev & 0xf);
-}

FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov