Esempio n. 1
0
static Bool
riva_is_connected(struct riva_par *par, Bool second)
{
	volatile U032 __iomem *PRAMDAC = par->riva.PRAMDAC0;
	U032 reg52C, reg608;
	Bool present;

	if(second) PRAMDAC += 0x800;

	reg52C = NV_RD32(PRAMDAC, 0x052C);
	reg608 = NV_RD32(PRAMDAC, 0x0608);

	NV_WR32(PRAMDAC, 0x0608, reg608 & ~0x00010000);

	NV_WR32(PRAMDAC, 0x052C, reg52C & 0x0000FEEE);
	mdelay(1);
	NV_WR32(PRAMDAC, 0x052C, NV_RD32(PRAMDAC, 0x052C) | 1);

	NV_WR32(par->riva.PRAMDAC0, 0x0610, 0x94050140);
	NV_WR32(par->riva.PRAMDAC0, 0x0608, 0x00001000);

	mdelay(1);

	present = (NV_RD32(PRAMDAC, 0x0608) & (1 << 28)) ? TRUE : FALSE;

	NV_WR32(par->riva.PRAMDAC0, 0x0608,
		NV_RD32(par->riva.PRAMDAC0, 0x0608) & 0x0000EFFF);

	NV_WR32(PRAMDAC, 0x052C, reg52C);
	NV_WR32(PRAMDAC, 0x0608, reg608);

	return present;
}
Esempio n. 2
0
static int nvidia_bl_update_status(struct backlight_device *bd)
{
	struct nvidia_par *par = bl_get_data(bd);
	u32 tmp_pcrt, tmp_pmc, fpcontrol;
	int level;

	if (!par->FlatPanel)
		return 0;

	if (bd->props.power != FB_BLANK_UNBLANK ||
	    bd->props.fb_blank != FB_BLANK_UNBLANK)
		level = 0;
	else
		level = bd->props.brightness;

	tmp_pmc = NV_RD32(par->PMC, 0x10F0) & 0x0000FFFF;
	tmp_pcrt = NV_RD32(par->PCRTC0, 0x081C) & 0xFFFFFFFC;
	fpcontrol = NV_RD32(par->PRAMDAC, 0x0848) & 0xCFFFFFCC;

	if (level > 0) {
		tmp_pcrt |= 0x1;
		tmp_pmc |= (1 << 31); /* backlight bit */
		tmp_pmc |= nvidia_bl_get_level_brightness(par, level) << 16;
		fpcontrol |= par->fpSyncs;
	} else
		fpcontrol |= 0x20000022;

	NV_WR32(par->PCRTC0, 0x081C, tmp_pcrt);
	NV_WR32(par->PMC, 0x10F0, tmp_pmc);
	NV_WR32(par->PRAMDAC, 0x848, fpcontrol);

	return 0;
}
Esempio n. 3
0
static void
riva_is_second(struct riva_par *par)
{
	if (par->FlatPanel == 1) {
		switch(par->Chipset & 0xffff) {
		case 0x0174:
		case 0x0175:
		case 0x0176:
		case 0x0177:
		case 0x0179:
		case 0x017C:
		case 0x017D:
		case 0x0186:
		case 0x0187:
		/* this might not be a good default for the chips below */
		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 0x0328:
		case 0x0329:
		case 0x032C:
		case 0x032D:
			par->SecondCRTC = TRUE;
			break;
		default:
			par->SecondCRTC = FALSE;
			break;
		}
	} else {
		if(riva_is_connected(par, 0)) {

			if (NV_RD32(par->riva.PRAMDAC0, 0x0000052C) & 0x100)
				par->SecondCRTC = TRUE;
			else
				par->SecondCRTC = FALSE;
		} else
		if (riva_is_connected(par, 1)) {
			if(NV_RD32(par->riva.PRAMDAC0, 0x0000252C) & 0x100)
				par->SecondCRTC = TRUE;
			else
				par->SecondCRTC = FALSE;
		} else /* default */
			par->SecondCRTC = FALSE;
	}
	riva_override_CRTC(par);
}
Esempio n. 4
0
static void nv4GetConfig(struct nvidia_par *par)
{
    if (NV_RD32(par->PFB, 0x0000) & 0x00000100) {
        par->RamAmountKBytes =
            ((NV_RD32(par->PFB, 0x0000) >> 12) & 0x0F) * 1024 * 2 +
            1024 * 2;
    } else {
Esempio n. 5
0
static void
nvc0_graph_load_microcode()
{
	int i;
	const uint32_t val260 = NV_RD32(0x260);

        printf("micro code loading...\n");
        NV_WR32(0x260, val260 & ~1);

#ifdef USE_BLOB_UCODE
       printf("use blob_ucode^\n");
        /* load HUB microcode */
       NV_WR32(0x4091c0, 0x01000000);
        for (i = 0; i< sizeof(nvc0_grhub_data) /4; i++){
          NV_WR32(0x4091c4,((uint32_t *)nvc0_grhub_data)[i]);
        }

        NV_WR32(0x409180,0x01000000);
        for (i = 0; i< sizeof(nvc0_grhub_code) /4; i++){
          if ((i & 0x3f) == 0){
            NV_WR32(0x409188, i>>6);
            }
        //NV_WR32(NVC0_CTXCTL_FUC_CODE_DATA, x);
          NV_WR32(0x409184,((uint32_t *)nvc0_grhub_code)[i]);
        }
Esempio n. 6
0
void nv50_graph_reset() {
	uint32_t enable = NV_RD32(0x200);
	NV_WR32(0x200, enable & ~0x1000);
	NV_WR32(0x200, enable | 0x1000);
	NV_WR32(0x400040, -1);
	NV_WR32(0x400040, 0);
}
Esempio n. 7
0
unsigned long riva_get_memlen(struct riva_par *par)
{
	RIVA_HW_INST *chip = &par->riva;
	unsigned long memlen = 0;
	unsigned int chipset = par->Chipset;
	struct pci_dev* dev;
	u32 amt;

	switch (chip->Architecture) {
	case NV_ARCH_03:
		if (NV_RD32(chip->PFB, 0x00000000) & 0x00000020) {
			if (((NV_RD32(chip->PMC, 0x00000000) & 0xF0) == 0x20)
			    && ((NV_RD32(chip->PMC, 0x00000000)&0x0F)>=0x02)) {
				/*
				 * SDRAM 128 ZX.
				 */
				switch (NV_RD32(chip->PFB,0x00000000) & 0x03) {
				case 2:
					memlen = 1024 * 4;
					break;
				case 1:
					memlen = 1024 * 2;
					break;
				default:
					memlen = 1024 * 8;
					break;
				}
			} else {
				memlen = 1024 * 8;
			}
		} else 	{
			/*
			 * SGRAM 128.
			 */
			switch (NV_RD32(chip->PFB, 0x00000000) & 0x00000003) {
			case 0:
				memlen = 1024 * 8;
				break;
			case 2:
				memlen = 1024 * 4;
				break;
			default:
				memlen = 1024 * 2;
				break;
			}
		}
		break;
	case NV_ARCH_04:
		if (NV_RD32(chip->PFB, 0x00000000) & 0x00000100) {
			memlen = ((NV_RD32(chip->PFB, 0x00000000)>>12)&0x0F) *
				1024 * 2 + 1024 * 2;
		} else {
			switch (NV_RD32(chip->PFB, 0x00000000) & 0x00000003) {
Esempio n. 8
0
static int NVIsConnected(struct nvidia_par *par, int output)
{
    volatile u32 __iomem *PRAMDAC = par->PRAMDAC0;
    u32 reg52C, reg608, dac0_reg608 = 0;
    int present;

    if (output) {
        dac0_reg608 = NV_RD32(PRAMDAC, 0x0608);
        PRAMDAC += 0x800;
    }

    reg52C = NV_RD32(PRAMDAC, 0x052C);
    reg608 = NV_RD32(PRAMDAC, 0x0608);

    NV_WR32(PRAMDAC, 0x0608, reg608 & ~0x00010000);

    NV_WR32(PRAMDAC, 0x052C, reg52C & 0x0000FEEE);
    msleep(1);
    NV_WR32(PRAMDAC, 0x052C, NV_RD32(PRAMDAC, 0x052C) | 1);

    NV_WR32(par->PRAMDAC0, 0x0610, 0x94050140);
    NV_WR32(par->PRAMDAC0, 0x0608, NV_RD32(par->PRAMDAC0, 0x0608) |
            0x00001000);

    msleep(1);

    present = (NV_RD32(PRAMDAC, 0x0608) & (1 << 28)) ? 1 : 0;

    if (present)
        printk("nvidiafb: CRTC%i analog found\n", output);
    else
        printk("nvidiafb: CRTC%i analog not found\n", output);

    if (output)
        NV_WR32(par->PRAMDAC0, 0x0608, dac0_reg608);

    NV_WR32(PRAMDAC, 0x052C, reg52C);
    NV_WR32(PRAMDAC, 0x0608, reg608);

    return present;
}