plan 9 kernel history: overview | file list | diff list

pc/vgavmware.c (diff list | history)

2001/0822/sys/src/9/pc/vgavmware.c:91,972001/0908/sys/src/9/pc/vgavmware.c:91,96 (short | long)
2001/0822    
	ulong aperture, oaperture; 
	int osize, oapsize, wasupamem; 
	Pcidev *p; 
	Physseg seg; 
 
	osize = *size; 
	oaperture = scr->aperture; 
2001/0822/sys/src/9/pc/vgavmware.c:131,1452001/0908/sys/src/9/pc/vgavmware.c:130,138
2001/0822    
	}else 
		scr->isupamem = 1; 
 
	if(oaperture) 
2001/0908    
	if(oaperture && aperture != oaperture) 
2001/0822    
		print("warning (BUG): redefinition of aperture does not change vmwarescreen segment\n"); 
	memset(&seg, 0, sizeof(seg)); 
	seg.attr = SG_PHYSICAL; 
	seg.name = smalloc(32); 
	snprint(seg.name, 32, "vmwarescreen"); 
	seg.pa = aperture; 
	seg.size = osize; 
	addphysseg(&seg); 
2001/0908    
	addvgaseg("vmwarescreen", aperture, osize); 
2001/0822    
	return aperture; 
} 
 
2001/0908/sys/src/9/pc/vgavmware.c:25,612002/0404/sys/src/9/pc/vgavmware.c:25,111 (short | long)
2001/0822    
	Rwidth, 
	Rheight, 
	Rmaxwidth, 
2002/0404    
 
2001/0822    
	Rmaxheight, 
	Rdepth, 
	Rbpp, 
	Rpseudocolor, 
	Rrmask, 
2002/0404    
 
2001/0822    
	Rgmask, 
	Rbmask, 
	Rbpl, 
	Rfbstart, 
	Rfboffset, 
2002/0404    
 
2001/0822    
	Rfbmaxsize, 
	Rfbsize, 
	Rcap, 
	Rmemstart, 
	Rmemsize, 
2002/0404    
 
2001/0822    
	Rconfigdone, 
	Rsync, 
	Rbusy, 
	Rguestid, 
	Rcursorid, 
2002/0404    
 
2001/0822    
	Rcursorx, 
	Rcursory, 
	Rcursoron, 
	Nreg, 
 
2002/0404    
	Crectfill = 1<<0, 
	Crectcopy = 1<<1, 
	Crectpatfill = 1<<2, 
	Coffscreen = 1<<3, 
	Crasterop = 1<<4, 
	Ccursor = 1<<5, 
	Ccursorbypass = 1<<6, 
	Ccursorbypass2 = 1<<7, 
	C8bitemulation = 1<<8, 
	Calphacursor = 1<<9, 
 
	FifoMin = 0, 
	FifoMax = 1, 
	FifoNextCmd = 2, 
	FifoStop = 3, 
	FifoUser = 4, 
 
	Xupdate = 1, 
	Xrectfill = 2, 
	Xrectcopy = 3, 
	Xdefinebitmap = 4, 
	Xdefinebitmapscanline = 5, 
	Xdefinepixmap = 6, 
	Xdefinepixmapscanline = 7, 
	Xrectbitmapfill = 8, 
	Xrectpixmapfill = 9, 
	Xrectbitmapcopy = 10, 
	Xrectpixmapcopy = 11, 
	Xfreeobject = 12, 
	Xrectropfill = 13, 
	Xrectropcopy = 14, 
	Xrectropbitmapfill = 15, 
	Xrectroppixmapfill = 16, 
	Xrectropbitmapcopy = 17, 
	Xrectroppixmapcopy = 18, 
	Xdefinecursor = 19, 
	Xdisplaycursor = 20, 
	Xmovecursor = 21, 
	Xdefinealphacursor = 22, 
	Xcmdmax = 23, 
 
	CursorOnHide = 0, 
	CursorOnShow = 1, 
	CursorOnRemoveFromFb = 2, 
	CursorOnRestoreToFb = 3, 
 
2001/0822    
	Rpalette = 1024, 
}; 
 
typedef struct Vmware	Vmware; 
struct Vmware { 
	ulong	mmio; 
	ulong	fb; 
 
	ulong	ra; 
2001/0908/sys/src/9/pc/vgavmware.c:62,672002/0404/sys/src/9/pc/vgavmware.c:112,119
2001/0822    
	ulong	rd; 
 
	ulong	r[Nreg]; 
2002/0404    
	ulong	*mmio; 
	ulong	mmiosize; 
2001/0822    
 
	char	chan[32]; 
	int	depth; 
2001/0908/sys/src/9/pc/vgavmware.c:84,892002/0404/sys/src/9/pc/vgavmware.c:136,149
2001/0822    
	outl(vm->rd, v); 
} 
 
2002/0404    
static void 
vmwait(Vmware *vm) 
{ 
	vmwr(vm, Rsync, 1); 
	while(vmrd(vm, Rbusy)) 
		; 
} 
 
2001/0822    
static ulong 
vmwarelinear(VGAscr* scr, int* size, int* align) 
{ 
2001/0908/sys/src/9/pc/vgavmware.c:97,1022002/0404/sys/src/9/pc/vgavmware.c:157,163
2001/0822    
	oapsize = scr->apsize; 
	wasupamem = scr->isupamem; 
 
2002/0404    
iprint("osize %d oaperture %.8lux oapsize %d wasupamem %d\n", osize, oaperture, oapsize, wasupamem); 
2001/0822    
	p = pcimatch(nil, PCIVMWARE, 0); 
	if(p == nil) 
		error("no vmware card found"); 
2001/0908/sys/src/9/pc/vgavmware.c:128,1602002/0404/sys/src/9/pc/vgavmware.c:189,299
2001/0822    
		if(wasupamem && upamalloc(oaperture, oapsize, 0)) 
			scr->isupamem = 1; 
	}else 
2002/0404    
{ 
memset((void*)KADDR(aperture), 0x7F, 1048576); 
2001/0822    
		scr->isupamem = 1; 
2002/0404    
} 
2001/0822    
 
2002/0404    
iprint("aperture %lux size %lux\n", aperture, *size); 
2001/0908    
	if(oaperture && aperture != oaperture) 
2001/0822    
		print("warning (BUG): redefinition of aperture does not change vmwarescreen segment\n"); 
2001/0908    
	addvgaseg("vmwarescreen", aperture, osize); 
2002/0404    
 
2001/0822    
	return aperture; 
} 
 
static void 
vmwaredisable(VGAscr*) 
2002/0404    
vmfifowr(Vmware *vm, ulong v) 
2001/0822    
{ 
2002/0404    
	ulong *mm; 
 
	mm = vm->mmio; 
	if(mm == nil){ 
		iprint("!"); 
		return; 
	} 
 
	if(mm[FifoNextCmd]+sizeof(ulong) == mm[FifoStop] 
	|| (mm[FifoNextCmd]+sizeof(ulong) == mm[FifoMax] 
	    && mm[FifoStop] == mm[FifoMin])) 
		vmwait(vm); 
 
	mm[mm[FifoNextCmd]/sizeof(ulong)] = v; 
	mm[FifoNextCmd] += sizeof(ulong); 
	if(mm[FifoNextCmd]==mm[FifoMax]) 
		mm[FifoNextCmd] = mm[FifoMin]; 
2001/0822    
} 
 
static void 
vmwareload(VGAscr*, Cursor*) 
2002/0404    
vmwareflush(VGAscr*, Rectangle r) 
2001/0822    
{ 
2002/0404    
	if(vm->mmio == nil) 
		return; 
 
	vmfifowr(vm, Xupdate); 
	vmfifowr(vm, r.min.x); 
	vmfifowr(vm, r.min.y); 
	vmfifowr(vm, r.max.x-r.min.x); 
	vmfifowr(vm, r.max.y-r.min.y); 
	vmwait(vm); 
2001/0822    
} 
 
2002/0404    
static void 
vmwareload(VGAscr*, Cursor *c) 
{ 
	int i; 
	ulong clr, set; 
	ulong and[16]; 
	ulong xor[16]; 
 
	if(vm->mmio == nil) 
		return; 
	vmfifowr(vm, Xdefinecursor); 
	vmfifowr(vm, 1);	/* cursor id */ 
	vmfifowr(vm, -c->offset.x); 
	vmfifowr(vm, -c->offset.y); 
 
	vmfifowr(vm, 16);	/* width */ 
	vmfifowr(vm, 16);	/* height */ 
	vmfifowr(vm, 1);	/* depth for and mask */ 
	vmfifowr(vm, 1);	/* depth for xor mask */ 
 
	for(i=0; i<16; i++){ 
		clr = (c->clr[i*2+1]<<8) | c->clr[i*2]; 
		set = (c->set[i*2+1]<<8) | c->set[i*2]; 
		and[i] = ~(clr|set);	/* clr and set pixels => black */ 
		xor[i] = clr&~set;		/* clr pixels => white */ 
	} 
	for(i=0; i<16; i++) 
		vmfifowr(vm, and[i]); 
	for(i=0; i<16; i++) 
		vmfifowr(vm, xor[i]); 
 
	vmwait(vm); 
} 
 
2001/0822    
static int 
vmwaremove(VGAscr*, Point) 
2002/0404    
vmwaremove(VGAscr*, Point p) 
2001/0822    
{ 
2002/0404    
	vmwr(vm, Rcursorid, 1); 
	vmwr(vm, Rcursorx, p.x); 
	vmwr(vm, Rcursory, p.y); 
	vmwr(vm, Rcursoron, CursorOnShow); 
2001/0822    
	return 0; 
} 
 
static void 
2002/0404    
vmwaredisable(VGAscr*) 
{ 
	vmwr(vm, Rcursorid, 1); 
	vmwr(vm, Rcursoron, CursorOnHide); 
} 
 
static void 
2001/0822    
vmwareenable(VGAscr*) 
{ 
2002/0404    
	vmwr(vm, Rcursorid, 1); 
	vmwr(vm, Rcursoron, CursorOnShow); 
2001/0822    
} 
 
static void 
2001/0908/sys/src/9/pc/vgavmware.c:162,1702002/0404/sys/src/9/pc/vgavmware.c:301,370
2001/0822    
{ 
} 
 
2002/0404    
static int 
vmwarescroll(VGAscr*, Rectangle r, Rectangle sr) 
{ 
	if(vm->mmio == nil) 
		return 0; 
	vmfifowr(vm, Xrectropcopy); 
	vmfifowr(vm, r.max.x); 
	vmfifowr(vm, r.max.y); 
	vmfifowr(vm, r.min.x); 
	vmfifowr(vm, r.min.y); 
	vmfifowr(vm, sr.min.x - r.min.x); 
	vmfifowr(vm, sr.min.y - r.min.y); 
	vmfifowr(vm, 3);	/* code for copy */ 
	vmwait(vm); 
	return 1; 
} 
 
static int 
vmwarefill(VGAscr*, Rectangle r, ulong sval) 
{ 
	if(vm->mmio == nil) 
		return 0; 
	vmfifowr(vm, Xrectfill); 
	vmfifowr(vm, sval); 
	vmfifowr(vm, r.min.x); 
	vmfifowr(vm, r.min.y); 
	vmfifowr(vm, r.max.x-r.min.x); 
	vmfifowr(vm, r.max.y-r.min.y); 
	vmwait(vm); 
	return 1; 
} 
 
2001/0822    
static void 
vmwaredrawinit(VGAscr*) 
2002/0404    
vmwaredrawinit(VGAscr *scr) 
2001/0822    
{ 
2002/0404    
	ulong mmiobase, mmiosize; 
 
extern int iprintscreenputs; 
	iprintscreenputs = 0; 
 
	if(scr->mmio==nil){ 
		mmiobase = vmrd(vm, Rmemstart); 
		if(mmiobase == 0){ 
			iprint("mmiobase 0\n"); 
			return; 
		} 
		mmiosize = vmrd(vm, Rmemsize); 
		scr->mmio = KADDR(upamalloc(mmiobase, mmiosize, 0)); 
iprint("mmio %p\n", scr->mmio); 
		vm->mmio = scr->mmio; 
		vm->mmiosize = mmiosize; 
		if(scr->mmio == nil) 
			return; 
		addvgaseg("vmwaremmio", mmiobase, mmiosize); 
	} 
 
	scr->mmio[FifoMin] = 4*sizeof(ulong); 
	scr->mmio[FifoMax] = vm->mmiosize; 
	scr->mmio[FifoNextCmd] = 4*sizeof(ulong); 
	scr->mmio[FifoStop] = 4*sizeof(ulong); 
	vmwr(vm, Rconfigdone, 1); 
 
	scr->scroll = vmwarescroll; 
	scr->fill = vmwarefill; 
2001/0822    
} 
 
VGAdev vgavmwaredev = { 
2001/0908/sys/src/9/pc/vgavmware.c:175,1802002/0404/sys/src/9/pc/vgavmware.c:375,384
2001/0822    
	0, 
	vmwarelinear, 
	vmwaredrawinit, 
2002/0404    
	0, 
	0, 
	0, 
	vmwareflush, 
2001/0822    
}; 
 
VGAcur vgavmwarecur = { 
2002/0404/sys/src/9/pc/vgavmware.c:157,1632002/0405/sys/src/9/pc/vgavmware.c:157,162 (short | long)
2001/0822    
	oapsize = scr->apsize; 
	wasupamem = scr->isupamem; 
 
2002/0404    
iprint("osize %d oaperture %.8lux oapsize %d wasupamem %d\n", osize, oaperture, oapsize, wasupamem); 
2001/0822    
	p = pcimatch(nil, PCIVMWARE, 0); 
	if(p == nil) 
		error("no vmware card found"); 
2002/0404/sys/src/9/pc/vgavmware.c:189,2002002/0405/sys/src/9/pc/vgavmware.c:188,195
2001/0822    
		if(wasupamem && upamalloc(oaperture, oapsize, 0)) 
			scr->isupamem = 1; 
	}else 
2002/0404    
{ 
memset((void*)KADDR(aperture), 0x7F, 1048576); 
2001/0822    
		scr->isupamem = 1; 
2002/0404    
} 
2001/0822    
 
2002/0404    
iprint("aperture %lux size %lux\n", aperture, *size); 
2001/0908    
	if(oaperture && aperture != oaperture) 
2001/0822    
		print("warning (BUG): redefinition of aperture does not change vmwarescreen segment\n"); 
2001/0908    
	addvgaseg("vmwarescreen", aperture, osize); 
2002/0404/sys/src/9/pc/vgavmware.c:306,3192002/0405/sys/src/9/pc/vgavmware.c:301,313
2002/0404    
{ 
	if(vm->mmio == nil) 
		return 0; 
	vmfifowr(vm, Xrectropcopy); 
	vmfifowr(vm, r.max.x); 
	vmfifowr(vm, r.max.y); 
2002/0405    
	vmfifowr(vm, Xrectcopy); 
	vmfifowr(vm, sr.min.x); 
	vmfifowr(vm, sr.min.y); 
2002/0404    
	vmfifowr(vm, r.min.x); 
	vmfifowr(vm, r.min.y); 
	vmfifowr(vm, sr.min.x - r.min.x); 
	vmfifowr(vm, sr.min.y - r.min.y); 
	vmfifowr(vm, 3);	/* code for copy */ 
2002/0405    
	vmfifowr(vm, Dx(r)); 
	vmfifowr(vm, Dy(r)); 
2002/0404    
	vmwait(vm); 
	return 1; 
} 
2002/0404/sys/src/9/pc/vgavmware.c:338,3552002/0405/sys/src/9/pc/vgavmware.c:332,343
2001/0822    
{ 
2002/0404    
	ulong mmiobase, mmiosize; 
 
extern int iprintscreenputs; 
	iprintscreenputs = 0; 
                 
	if(scr->mmio==nil){ 
		mmiobase = vmrd(vm, Rmemstart); 
		if(mmiobase == 0){ 
			iprint("mmiobase 0\n"); 
2002/0405    
		if(mmiobase == 0) 
2002/0404    
			return; 
		} 
		mmiosize = vmrd(vm, Rmemsize); 
		scr->mmio = KADDR(upamalloc(mmiobase, mmiosize, 0)); 
iprint("mmio %p\n", scr->mmio); 
		vm->mmio = scr->mmio; 
		vm->mmiosize = mmiosize; 
		if(scr->mmio == nil) 
2002/0405/sys/src/9/pc/vgavmware.c:330,3352002/0501/sys/src/9/pc/vgavmware.c:330,336 (short | long)
2001/0822    
static void 
2002/0404    
vmwaredrawinit(VGAscr *scr) 
2001/0822    
{ 
2002/0501    
	ulong offset; 
2002/0404    
	ulong mmiobase, mmiosize; 
 
	if(scr->mmio==nil){ 
2002/0405/sys/src/9/pc/vgavmware.c:353,3582002/0501/sys/src/9/pc/vgavmware.c:354,362
2002/0404    
 
	scr->scroll = vmwarescroll; 
	scr->fill = vmwarefill; 
2002/0501    
 
	offset = vmrd(vm, Rfboffset); 
	scr->gscreendata->bdata += offset; 
2001/0822    
} 
 
VGAdev vgavmwaredev = { 


source code copyright © 1990-2005 Lucent Technologies; see license
Plan 9 distribution
comments to russ cox (rsc@swtch.com)