Exemplo n.º 1
0
u8 NVReadAttr(struct nvidia_par *par, u8 index)
{
    volatile u8 tmp;

    tmp = VGA_RD08(par->PCIO, par->IOBase + 0x0a);
    if (par->paletteEnabled)
        index &= ~0x20;
    else
        index |= 0x20;
    VGA_WR08(par->PCIO, VGA_ATT_IW, index);
    return (VGA_RD08(par->PCIO, VGA_ATT_R));
}
static int nvidia_gpio_getscl(void *data)
{
	struct nvidia_i2c_chan *chan = data;
	struct nvidia_par *par = chan->par;
	u32 val = 0;

	VGA_WR08(par->PCIO, 0x3d4, chan->ddc_base);
	if (VGA_RD08(par->PCIO, 0x3d5) & 0x04)
		val = 1;

	val = VGA_RD08(par->PCIO, 0x3d5);

	return val;
}
Exemplo n.º 3
0
void NVDisablePalette(struct nvidia_par *par)
{
    volatile u8 tmp;

    tmp = VGA_RD08(par->PCIO, par->IOBase + 0x0a);
    VGA_WR08(par->PCIO, VGA_ATT_IW, 0x20);
    par->paletteEnabled = 0;
}
Exemplo n.º 4
0
void NVWriteAttr(struct nvidia_par *par, u8 index, u8 value)
{
    volatile u8 tmp;

    tmp = VGA_RD08(par->PCIO, par->IOBase + 0x0a);
    if (par->paletteEnabled)
        index &= ~0x20;
    else
        index |= 0x20;
    VGA_WR08(par->PCIO, VGA_ATT_IW, index);
    VGA_WR08(par->PCIO, VGA_ATT_W, value);
}
Exemplo n.º 5
0
static int riva_gpio_getsda(void* data)
{
	struct riva_i2c_chan 	*chan = (struct riva_i2c_chan *)data;
	struct riva_par 	*par = chan->par;
	u32			val = 0;

	VGA_WR08(par->riva.PCIO, 0x3d4, chan->ddc_base);
	if (VGA_RD08(par->riva.PCIO, 0x3d5) & 0x08)
		val = 1;

	return val;
}
static void nvidia_gpio_setsda(void *data, int state)
{
	struct nvidia_i2c_chan *chan = data;
	struct nvidia_par *par = chan->par;
	u32 val;

	VGA_WR08(par->PCIO, 0x3d4, chan->ddc_base + 1);
	val = VGA_RD08(par->PCIO, 0x3d5) & 0xf0;

	if (state)
		val |= 0x10;
	else
		val &= ~0x10;

	VGA_WR08(par->PCIO, 0x3d4, chan->ddc_base + 1);
	VGA_WR08(par->PCIO, 0x3d5, val | 0x1);
}
Exemplo n.º 7
0
static void riva_gpio_setscl(void* data, int state)
{
	struct riva_i2c_chan 	*chan = (struct riva_i2c_chan *)data;
	struct riva_par 	*par = chan->par;
	u32			val;

	VGA_WR08(par->riva.PCIO, 0x3d4, chan->ddc_base + 1);
	val = VGA_RD08(par->riva.PCIO, 0x3d5) & 0xf0;

	if (state)
		val |= 0x20;
	else
		val &= ~0x20;

	VGA_WR08(par->riva.PCIO, 0x3d4, chan->ddc_base + 1);
	VGA_WR08(par->riva.PCIO, 0x3d5, val | 0x1);
}
Exemplo n.º 8
0
u8 NVReadDacMask(struct nvidia_par *par)
{
    return (VGA_RD08(par->PDIO, VGA_PEL_MSK));
}
Exemplo n.º 9
0
u8 NVReadMiscOut(struct nvidia_par *par)
{
    return (VGA_RD08(par->PVIO, VGA_MIS_R));
}
Exemplo n.º 10
0
u8 NVReadSeq(struct nvidia_par *par, u8 index)
{
    VGA_WR08(par->PVIO, VGA_SEQ_I, index);
    return (VGA_RD08(par->PVIO, VGA_SEQ_D));
}
Exemplo n.º 11
0
u8 NVReadGr(struct nvidia_par *par, u8 index)
{
    VGA_WR08(par->PVIO, VGA_GFX_I, index);
    return (VGA_RD08(par->PVIO, VGA_GFX_D));
}
Exemplo n.º 12
0
u8 NVReadCrtc(struct nvidia_par *par, u8 index)
{
    VGA_WR08(par->PCIO, par->IOBase + 0x04, index);
    return (VGA_RD08(par->PCIO, par->IOBase + 0x05));
}
Exemplo n.º 13
0
u8 NVReadDacData(struct nvidia_par *par)
{
    return (VGA_RD08(par->PDIO, VGA_PEL_D));
}
Exemplo n.º 14
0
static BOOL GenericInit(struct staticdata *sd)
{
    D(bug("[NVidia] Generic chip init\n"));
    IPTR regs = (IPTR)sd->Card.Registers;
    UWORD architecture = sd->Card.Architecture;
    UWORD implementation = sd->Card.Chipset;
    UWORD implementation_masked = implementation & 0x0FF0;
    
    sd->Card.EnableIRQ	= 0;
    sd->Card.IO		= 0x3d0;
    sd->Card.PRAMDAC0	= (ULONG*)(regs + 0x00680000);
    sd->Card.PFB	= (ULONG*)(regs + 0x00100000);
    sd->Card.PFIFO	= (ULONG*)(regs + 0x00002000);
    sd->Card.PGRAPH	= (ULONG*)(regs + 0x00400000);
    sd->Card.PEXTDEV	= (ULONG*)(regs + 0x00101000);
    sd->Card.PTIMER	= (ULONG*)(regs + 0x00009000);
    sd->Card.PMC	= (ULONG*)(regs + 0x00000000);
    sd->Card.FIFO	= (ULONG*)(regs + 0x00800000);
    sd->Card.PCIO0	= (UBYTE*)(regs + 0x00601000);
    sd->Card.PDIO0	= (UBYTE*)(regs + 0x00681000);
    sd->Card.PVIO	= (UBYTE*)(regs + 0x000C0000);

    sd->Card.FlatPanel	= 0;

    sd->Card.twoHeads =  (architecture >= NV_ARCH_10) &&
                     (implementation_masked != 0x0100) &&
                     (implementation_masked != 0x0150) &&
                     (implementation_masked != 0x01A0) &&
                     (implementation_masked != 0x0200);

    sd->Card.fpScaler = (sd->Card.twoHeads && (implementation_masked != 0x0110));

    sd->Card.twoStagePLL = (implementation_masked == 0x0310) ||
                           (implementation_masked == 0x0340) ||
			   (architecture == NV_ARCH_40);
    
    sd->Card.alphaCursor = implementation_masked >= 0x0110;

    switch (implementation)
    {
	case 0x0112:
	case 0x0174:
	case 0x0175:
	case 0x0176:
	case 0x0177:
	case 0x0179:
	case 0x017c:
	case 0x017d:
	case 0x0186:
	case 0x0187:
	case 0x0286:
	case 0x028c:
	case 0x0316:
	case 0x0317:
	case 0x031a:
	case 0x031b:
	case 0x031c:
	case 0x031d:
	case 0x031e:
	case 0x031f:
    	case 0x0324:
    	case 0x0325:
	case 0x0326: /* stegerg: checkme, not listed in xfree nv_setup.c */
	case 0x0328:
	case 0x0329:
	case 0x032C:
	case 0x032D:
	case 0x032e: /* stegerg: checkme, not listed in xfree nv_setup.c */
	case 0x0347:
	case 0x0349:
	case 0x034B:
	case 0x034C:
	case 0x0160:
	case 0x0166:
	case 0x00C8:
	case 0x00C9:
	case 0x00CC:
	case 0x0147:
	case 0x0148:
	case 0x0149:
	case 0x014C:
	    D(bug("[NVidia] Assuming Digital FlatPanel\n"));
	    sd->Card.FlatPanel = 1;
	    break;
	default:
	    break;
    }

    if (architecture == NV_ARCH_04)
	nv4GetConfig(sd);
    else
	nv10GetConfig(sd);
    
    NVSelectHead(sd, 0);

    NVLockUnlock(sd, 0);

    if (!sd->Card.twoHeads)
    {
	VGA_WR08(sd->Card.PCIO, 0x3d4, 0x28);
	if (VGA_RD08(sd->Card.PCIO, 0x3d5) & 0x80)
	    sd->Card.FlatPanel = 1;
	else
	    sd->Card.FlatPanel = 0;
    }
    else
    {
	UBYTE outputAfromCRTC, outputBfromCRTC;
	int CRTCnumber = -1;
	UBYTE slaved_on_A, slaved_on_B,tvA=0,tvB=0;
	BOOL analog_on_A, analog_on_B;
	ULONG oldhead;
	UBYTE cr44;
	
	if(implementation_masked != 0x0110) {
	    if(sd->Card.PRAMDAC0[0x0000052C/4] & 0x100)
		outputAfromCRTC = 1;
	    else
		outputAfromCRTC = 0;
	    if(sd->Card.PRAMDAC0[0x0000252C/4] & 0x100)
		outputBfromCRTC = 1;
	    else
		outputBfromCRTC = 0;
	    analog_on_A = NVIsConnected(sd, 0);
	    analog_on_B = NVIsConnected(sd, 1);
	} else {
	    outputAfromCRTC = 0;
	    outputBfromCRTC = 1;
	    analog_on_A = FALSE;
	    analog_on_B = FALSE;
	}

	VGA_WR08(sd->Card.PCIO, 0x03D4, 0x44);
	cr44 = VGA_RD08(sd->Card.PCIO, 0x03D5);

	VGA_WR08(sd->Card.PCIO, 0x03D5, 3);
	NVSelectHead(sd, 1);
	NVLockUnlock(sd, 0);

	VGA_WR08(sd->Card.PCIO, 0x03D4, 0x28);
	slaved_on_B = VGA_RD08(sd->Card.PCIO, 0x03D5) & 0x80;
	if(slaved_on_B) {
	    VGA_WR08(sd->Card.PCIO, 0x03D4, 0x33);
	    tvB = !(VGA_RD08(sd->Card.PCIO, 0x03D5) & 0x01);
	}

	VGA_WR08(sd->Card.PCIO, 0x03D4, 0x44);
	VGA_WR08(sd->Card.PCIO, 0x03D5, 0);
	NVSelectHead(sd, 0);
	NVLockUnlock(sd, 0);

	VGA_WR08(sd->Card.PCIO, 0x03D4, 0x28);
	slaved_on_A = VGA_RD08(sd->Card.PCIO, 0x03D5) & 0x80;
	if(slaved_on_A) {
	    VGA_WR08(sd->Card.PCIO, 0x03D4, 0x33);
	    tvA = !(VGA_RD08(sd->Card.PCIO, 0x03D5) & 0x01);
	}

	oldhead = sd->Card.PCRTC0[0x00000860/4];
	sd->Card.PCRTC0[0x00000860/4] = oldhead | 0x00000010;

	if(slaved_on_A && !tvA) {
	    CRTCnumber = 0;
	    sd->Card.FlatPanel = 1;
	} else
	if(slaved_on_B && !tvB) {
	    CRTCnumber = 1;
	    sd->Card.FlatPanel = 1;
	} else
	if(analog_on_A) {
	    CRTCnumber = outputAfromCRTC;
	    sd->Card.FlatPanel = 0;
	} else
	if(analog_on_B) {
	    CRTCnumber = outputBfromCRTC;
	    sd->Card.FlatPanel = 0;
	} else
	if(slaved_on_A) {
	    CRTCnumber = 0;
	    sd->Card.FlatPanel = 1;
	    sd->Card.Television = 1;
	} else
	if(slaved_on_B) {
	    CRTCnumber = 1;
	    sd->Card.FlatPanel = 1;
	    sd->Card.Television = 1;
	}
	
	if (CRTCnumber == -1)
	{
	    D(bug("[NVidia] Unable to detect CRTC number, using defaults\n"));

	    if (sd->Card.FlatPanel) sd->Card.CRTCnumber = 1;
	    else sd->Card.CRTCnumber = 0;
	}
	else sd->Card.CRTCnumber = CRTCnumber;

	if(implementation_masked == 0x0110)
	    cr44 = sd->Card.CRTCnumber * 0x3;

	sd->Card.PCRTC0[0x00000860/4] = oldhead;

	VGA_WR08(sd->Card.PCIO, 0x03D4, 0x44);
	VGA_WR08(sd->Card.PCIO, 0x03D5, cr44);
	NVSelectHead(sd, sd->Card.CRTCnumber);
    }

    if (sd->Card.FlatPanel && !sd->Card.Television)
    {
	sd->Card.fpWidth = sd->Card.PRAMDAC[0x0820/4] + 1;
	sd->Card.fpHeight= sd->Card.PRAMDAC[0x0800/4] + 1;
    }

    sd->Card.PRAMDAC[0x0300/4] = 0;

    D(bug("[NVidia] Configuration received.\n"));
    D(bug("[NVidia] Card has %dMB of video memory\n",
	sd->Card.RamAmountKBytes >> 10));

    sd->Card.FrameBufferSize = sd->Card.RamAmountKBytes * 1024;
    sd->Card.FbUsableSize = sd->Card.FrameBufferSize - 128 * 1024;

    D(bug("[NVidia] Max clock is %dMHz\n",
	sd->Card.MaxVClockFreqKHz / 1000));

kprintf("\n=== NVidia GenericInit FlatPanel = %d TwoHeads = %d CRTCnumber = %d twostagepll = %d\n\n",
    	sd->Card.FlatPanel,
	sd->Card.twoHeads,
	sd->Card.CRTCnumber,
	sd->Card.twoStagePLL);
	
    return TRUE;
}
static inline unsigned char MISCin(struct riva_par *par)
{
	return (VGA_RD08(par->riva.PVIO, 0x3cc));
}