~kris/9p

9hist

ebc2f99c5de21cc3176f97a3a2f218a3eddcf0a5 — David du Colombier 24 years ago e58fe89
Plan 9 from Bell Labs 2001-10-14
5 files changed, 63 insertions(+), 31 deletions(-)

M pc/devarch.c
M pc/ether82557.c
M pc/screen.c
M pc/vgas3.c
M pc/vgasavage.c
M pc/devarch.c => pc/devarch.c +2 -2
@@ 360,7 360,7 @@ archread(Chan *c, void *a, long n, vlong offset)
		return n;

	case Qiow:
		if((n & 0x01) || (offset & 0x01))
		if(n & 1)
			error(Ebadarg);
		checkport(offset, offset+n);
		n /= 2;


@@ 370,7 370,7 @@ archread(Chan *c, void *a, long n, vlong offset)
		return n*2;

	case Qiol:
		if((n & 0x03) || (offset & 0x03))
		if(n & 3)
			error(Ebadarg);
		checkport(offset, offset+n);
		n /= 4;

M pc/ether82557.c => pc/ether82557.c +9 -1
@@ 898,7 898,15 @@ i82557pci(void)
	Ctlr *ctlr;

	p = nil;
	while(p = pcimatch(p, 0x8086, 0x1229)){
	while(p = pcimatch(p, 0x8086, 0)){
		switch(p->did){
		default:
			continue;
		case 0x1229:		/* Intel 8255[789] */
		case 0x1031:		/* Intel 82562EM */
			break;
		}

		/*
		 * bar[0] is the memory-mapped register address (4KB),
		 * bar[1] is the I/O port register address (32 bytes) and

M pc/screen.c => pc/screen.c +6 -2
@@ 13,6 13,8 @@
#include <cursor.h>
#include "screen.h"

#define round16(x) (((x)+15)&~15)

#define RGB2K(r,g,b)	((156763*(r)+307758*(g)+59769*(b))>>19)

Point ZP = {0, 0};


@@ 51,7 53,7 @@ screensize(int x, int y, int z, ulong chan)
	 * be given back if aperture is set.
	 */
	if(scr->aperture == 0){
		int width = (x*z)/BI2WD;
		int width = (round16(x)*z)/BI2WD;

		gscreendata.bdata = xalloc(width*BY2WD*y);
		if(gscreendata.bdata == 0)


@@ 67,11 69,13 @@ screensize(int x, int y, int z, ulong chan)
	if(gscreen)
		freememimage(gscreen);

	gscreen = allocmemimaged(Rect(0,0,x,y), chan, &gscreendata);
	gscreen = allocmemimaged(Rect(0,0,round16(x),y), chan, &gscreendata);
	vgaimageinit(chan);
	if(gscreen == nil)
		return -1;

	gscreen->r.max.x = x;	/* we used round16(x) to allocate */

	scr->palettedepth = 6;	/* default */
	scr->gscreendata = &gscreendata;
	scr->memdefont = getmemdefont();

M pc/vgas3.c => pc/vgas3.c +16 -18
@@ 12,6 12,8 @@
#include <cursor.h>
#include "screen.h"

#define	round16(x)	(((x)+15)&~15)

enum {
	PCIS3		= 0x5333,		/* PCI VID */



@@ 22,6 24,7 @@ enum {
	SAVAGEMX	= 0x8C11,
	SAVAGEIXMV	= 0x8C12,
	SAVAGEIX	= 0x8C13,
	SUPERSAVAGEIXC16 = 0x8C2E,
	SAVAGE2000	= 0x9102,

	VIRGE		= 0x5631,


@@ 124,7 127,9 @@ s3linear(VGAscr* scr, int* size, int* align)
		*size = p->mem[i].size;

		id = (vgaxi(Crtx, 0x2D)<<8)|vgaxi(Crtx, 0x2E);
		if(id == SAVAGE4){		/* find Savage4 mmio */
		switch(id){			/* find mmio */
		case SAVAGE4:
		case SUPERSAVAGEIXC16:
			/*
			 * We could assume that the MMIO registers
			 * will be in the screen segment and just use


@@ 140,8 145,8 @@ s3linear(VGAscr* scr, int* size, int* align)
				if(p->mem[j].size==512*1024 || p->mem[j].size==16*1024*1024){
					mmiobase = p->mem[j].bar & ~0x0F;
					mmiosize = 512*1024;
					scr->mmio = (ulong*)upamalloc(mmiobase, mmiosize, 16*1024*1024);
					mmioname = "savage4mmio";
					scr->mmio = (ulong*)upamalloc(mmiobase, mmiosize, 0);
					mmioname = "savagemmio";
					break;
				}
			}


@@ 204,7 209,7 @@ static void
s3load(VGAscr* scr, Cursor* curs)
{
	uchar *p;
	int id, opage, x, y;
	int id, dolock, opage, x, y;

	/*
	 * Disable the cursor and


@@ 223,10 228,13 @@ s3load(VGAscr* scr, Cursor* curs)
	case VIRGEVX:	
	case SAVAGEIXMV:
	case SAVAGE4:
	case SUPERSAVAGEIXC16:
		dolock = 0;
		p += scr->storage;
		break;

	default:
		dolock = 1;
		lock(&scr->devlock);
		opage = s3pageset(scr, scr->storage>>16);
		p += (scr->storage & 0xFFFF);


@@ 263,20 271,9 @@ s3load(VGAscr* scr, Cursor* curs)
		}
	}

	switch(id){

	case VIRGE:
	case VIRGEDXGX:
	case VIRGEGX2:
	case VIRGEVX:	
	case SAVAGEIXMV:
	case SAVAGE4:
		break;

	default:
	if(dolock){
		s3pageset(scr, opage);
		unlock(&scr->devlock);
		break;
	}

	/*


@@ 466,7 463,7 @@ hwscroll(VGAscr *scr, Rectangle r, Rectangle sr)
	d = scr->gscreen->depth;
	did = (d-8)/8;
	cmd = 0x00000020|(Bitbltop<<17)|(did<<2);
	stride = Dx(scr->gscreen->r)*d/8;
	stride = round16(Dx(scr->gscreen->r))*d/8;

	if(r.min.x <= sr.min.x){
		cmd |= 1<<25;


@@ 511,7 508,7 @@ hwfill(VGAscr *scr, Rectangle r, ulong sval)
	d = scr->gscreen->depth;
	did = (d-8)/8;
	cmd = 0x16000120|(Bitbltop<<17)|(did<<2);
	stride = Dx(scr->gscreen->r)*d/8;
	stride = round16(Dx(scr->gscreen->r))*d/8;
	mmio = scr->mmio;
	waitforlinearfifo(scr);
	waitforfifo(scr, 8);


@@ 577,6 574,7 @@ s3drawinit(VGAscr *scr)
		scr->mmio = (ulong*)(scr->aperture+0x1000000);
		savageinit(scr);	
		break;
	case SUPERSAVAGEIXC16:
	case SAVAGE4:
		/* scr->mmio is set by s3linear */
		savageinit(scr);

M pc/vgasavage.c => pc/vgasavage.c +30 -8
@@ 12,6 12,7 @@
#include <cursor.h>
#include "screen.h"

#define	round16(x)	(((x)+15)&~15)
enum {
	PCIS3		= 0x5333,		/* PCI VID */



@@ 22,6 23,7 @@ enum {
	SAVAGEMX	= 0x8C11,
	SAVAGEIXMV	= 0x8C12,
	SAVAGEIX	= 0x8C13,
	SUPERSAVAGEIXC16 = 0x8C2E,
	SAVAGE2000	= 0x9102,

	VIRGE		= 0x5631,


@@ 346,10 348,11 @@ enum {

struct {
	ulong idletimeout;
	ulong tostatw[16];
} savagestats;

enum {
	Maxloop = 1<<25
	Maxloop = 1<<20
};

static void


@@ 360,10 363,11 @@ savagewaitidle(VGAscr *scr)

	switch(scr->id){
	case SAVAGE4:
	case SUPERSAVAGEIXC16:
		/* wait for engine idle and FIFO empty */
		statw = (ulong*)((uchar*)scr->mmio+AltStatus0);
		mask = 0x0081FFFF;
		goal = 0x00800000;
		mask = CBEMask | Ge2Idle;
		goal = Ge2Idle;
		break;
	/* case SAVAGEMXMV: ? */
	/* case SAVAGEMX: ? */


@@ 372,8 376,8 @@ savagewaitidle(VGAscr *scr)
	case SAVAGEIXMV:
		/* wait for engine idle and FIFO empty */
		statw = (ulong*)((uchar*)scr->mmio+XStatus0);
		mask = 0x0008FFFF;
		goal = 0x00080000;
		mask = CBEMaskA | Ge2IdleA;
		goal = Ge2IdleA;
		break;
	default:
		/* 


@@ 387,7 391,8 @@ savagewaitidle(VGAscr *scr)
		if((*statw & mask) == goal)
			return;

	savagestats.idletimeout++;
	savagestats.tostatw[savagestats.idletimeout++&15] = *statw;
	savagestats.tostatw[savagestats.idletimeout++&15] = (ulong)statw;
}

static int


@@ 452,6 457,21 @@ savagescroll(VGAscr *scr, Rectangle r, Rectangle sr)
	return 1;
}


static void
savageblank(VGAscr*, int blank)
{
	uchar seqD;

	vgaxo(Seqx, 8, vgaxi(Seqx,8)|0x06);
	seqD = vgaxi(Seqx, 0xD);
	seqD &= 0x03;
	if(blank)
		seqD |= 0x50;
	vgaxo(Seqx, 0xD, seqD);
}


void
savageinit(VGAscr *scr)
{


@@ 462,6 482,7 @@ savageinit(VGAscr *scr)
	switch(scr->id){
	case SAVAGE4:
	case SAVAGEIXMV:
	case SUPERSAVAGEIXC16:
		break;
	default:
		print("unknown savage %.4lux\n", scr->id);


@@ 500,10 521,11 @@ savageinit(VGAscr *scr)

	/* set bitmap descriptors */
	bd = (scr->gscreen->depth<<DepthShift) |
		(Dx(scr->gscreen->r)<<StrideShift) | BlockWriteDis;
		(round16(Dx(scr->gscreen->r))<<StrideShift) | BlockWriteDis
		| BDS64;

	*(ulong*)(mmio+GBD1) = 0;
	*(ulong*)(mmio+GBD2) = bd | BDS64;
	*(ulong*)(mmio+GBD2) = bd;

	*(ulong*)(mmio+PBD1) = 0;
	*(ulong*)(mmio+PBD2) = bd;