⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 matroxfb_dac1064.c

📁 linux-2.4.29操作系统的源码
💻 C
📖 第 1 页 / 共 3 页
字号:
	if (ACCESS_FBINFO(devflags.hwcursor))		ACCESS_FBINFO(video.len_usable) -= 1024;	matroxfb_fastfont_init(MINFO);	MGA1064_ramdac_init(PMINFO2);}#endif#ifdef CONFIG_FB_MATROX_G100#ifdef CONFIG_FB_MATROX_G450static void g450_mclk_init(WPMINFO2) {	/* switch all clocks to PCI source */	pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, ACCESS_FBINFO(hw).MXoptionReg | 4);	pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION3_REG, ACCESS_FBINFO(values).reg.opt3 & ~0x00300C03);	pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, ACCESS_FBINFO(hw).MXoptionReg);		if (((ACCESS_FBINFO(values).reg.opt3 & 0x000003) == 0x000003) ||	    ((ACCESS_FBINFO(values).reg.opt3 & 0x000C00) == 0x000C00) ||	    ((ACCESS_FBINFO(values).reg.opt3 & 0x300000) == 0x300000)) {		matroxfb_g450_setclk(PMINFO ACCESS_FBINFO(values.pll.video), M_VIDEO_PLL);	} else {		unsigned long flags;		unsigned int pwr;				matroxfb_DAC_lock_irqsave(flags);		pwr = inDAC1064(PMINFO M1064_XPWRCTRL) & ~0x02;		outDAC1064(PMINFO M1064_XPWRCTRL, pwr);		matroxfb_DAC_unlock_irqrestore(flags);	}	matroxfb_g450_setclk(PMINFO ACCESS_FBINFO(values.pll.system), M_SYSTEM_PLL);		/* switch clocks to their real PLL source(s) */	pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, ACCESS_FBINFO(hw).MXoptionReg | 4);	pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION3_REG, ACCESS_FBINFO(values).reg.opt3);	pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, ACCESS_FBINFO(hw).MXoptionReg);}static void g450_memory_init(WPMINFO2) {	/* disable memory refresh */	ACCESS_FBINFO(hw).MXoptionReg &= ~0x001F8000;	pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, ACCESS_FBINFO(hw).MXoptionReg);		/* set memory interface parameters */	ACCESS_FBINFO(hw).MXoptionReg &= ~0x00207E00;	ACCESS_FBINFO(hw).MXoptionReg |= 0x00207E00 & ACCESS_FBINFO(values).reg.opt;	pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, ACCESS_FBINFO(hw).MXoptionReg);	pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION2_REG, ACCESS_FBINFO(values).reg.opt2);		mga_outl(M_CTLWTST, ACCESS_FBINFO(values).reg.mctlwtst);		/* first set up memory interface with disabled memory interface clocks */	pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_MEMMISC_REG, ACCESS_FBINFO(values).reg.memmisc & ~0x80000000U);	mga_outl(M_MEMRDBK, ACCESS_FBINFO(values).reg.memrdbk);	mga_outl(M_MACCESS, ACCESS_FBINFO(values).reg.maccess);	/* start memory clocks */	pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_MEMMISC_REG, ACCESS_FBINFO(values).reg.memmisc | 0x80000000U);	udelay(200);		if (ACCESS_FBINFO(values).memory.ddr && (!ACCESS_FBINFO(values).memory.emrswen || !ACCESS_FBINFO(values).memory.dll)) {		mga_outl(M_MEMRDBK, ACCESS_FBINFO(values).reg.memrdbk & ~0x1000);	}	mga_outl(M_MACCESS, ACCESS_FBINFO(values).reg.maccess | 0x8000);		udelay(200);		ACCESS_FBINFO(hw).MXoptionReg |= 0x001F8000 & ACCESS_FBINFO(values).reg.opt;	pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, ACCESS_FBINFO(hw).MXoptionReg);		/* value is written to memory chips only if old != new */	mga_outl(M_PLNWT, 0);	mga_outl(M_PLNWT, ~0);		if (ACCESS_FBINFO(values).reg.mctlwtst != ACCESS_FBINFO(values).reg.mctlwtst_core) {		mga_outl(M_CTLWTST, ACCESS_FBINFO(values).reg.mctlwtst_core);	}	}static void g450_preinit(WPMINFO2) {	u_int32_t c2ctl;	u_int8_t curctl;	u_int8_t c1ctl;		/* ACCESS_FBINFO(hw).MXoptionReg = minfo->values.reg.opt; */	ACCESS_FBINFO(hw).MXoptionReg &= 0xC0000100;	ACCESS_FBINFO(hw).MXoptionReg |= 0x00000020;	if (ACCESS_FBINFO(devflags.novga))		ACCESS_FBINFO(hw).MXoptionReg &= ~0x00000100;	if (ACCESS_FBINFO(devflags.nobios))		ACCESS_FBINFO(hw).MXoptionReg &= ~0x40000000;	if (ACCESS_FBINFO(devflags.nopciretry))		ACCESS_FBINFO(hw).MXoptionReg |=  0x20000000;	ACCESS_FBINFO(hw).MXoptionReg |= ACCESS_FBINFO(values).reg.opt & 0x03400040;	pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, ACCESS_FBINFO(hw).MXoptionReg);	/* Init system clocks */			/* stop crtc2 */	c2ctl = mga_inl(M_C2CTL);	mga_outl(M_C2CTL, c2ctl & ~1);	/* stop cursor */	curctl = inDAC1064(PMINFO M1064_XCURCTRL);	outDAC1064(PMINFO M1064_XCURCTRL, 0);	/* stop crtc1 */	c1ctl = mga_readr(M_SEQ_INDEX, 1);	mga_setr(M_SEQ_INDEX, 1, c1ctl | 0x20);	g450_mclk_init(PMINFO2);	g450_memory_init(PMINFO2);		/* set legacy VGA clock sources for DOSEmu or VMware... */	matroxfb_g450_setclk(PMINFO 25175, M_PIXEL_PLL_A);	matroxfb_g450_setclk(PMINFO 28322, M_PIXEL_PLL_B);	/* restore crtc1 */	mga_setr(M_SEQ_INDEX, 1, c1ctl);		/* restore cursor */	outDAC1064(PMINFO M1064_XCURCTRL, curctl);	/* restore crtc2 */	mga_outl(M_C2CTL, c2ctl);		return;}#elsestatic inline void g450_preinit(WPMINFO2) {}#endifstatic int MGAG100_preinit(WPMINFO2) {	static const int vxres_g100[] = {  512,        640, 768,  800,  832,  960,                                          1024, 1152, 1280,      1600, 1664, 1920,                                          2048, 0};	struct matrox_hw_state* hw = &ACCESS_FBINFO(hw);        u_int32_t reg50;#if 0	u_int32_t q;#endif	DBG("MGAG100_preinit")	/* there are some instabilities if in_div > 19 && vco < 61000 */	if (ACCESS_FBINFO(devflags.g450dac)) {		ACCESS_FBINFO(features.pll.vco_freq_min) = 130000;	/* my sample: >118 */	} else {		ACCESS_FBINFO(features.pll.vco_freq_min) = 62000;	}	if (!ACCESS_FBINFO(features.pll.ref_freq)) {		ACCESS_FBINFO(features.pll.ref_freq)	 = 27000;	}	ACCESS_FBINFO(features.pll.feed_div_min) = 7;	ACCESS_FBINFO(features.pll.feed_div_max) = 127;	ACCESS_FBINFO(features.pll.in_div_min)	 = 1;	ACCESS_FBINFO(features.pll.in_div_max)	 = 31;	ACCESS_FBINFO(features.pll.post_shift_max) = 3;	ACCESS_FBINFO(features.DAC1064.xvrefctrl) = DAC1064_XVREFCTRL_G100_DEFAULT;	/* ACCESS_FBINFO(capable.cfb4) = 0; ... preinitialized by 0 */	ACCESS_FBINFO(capable.text) = 1;	ACCESS_FBINFO(capable.vxres) = vxres_g100;	ACCESS_FBINFO(features.accel.has_cacheflush) = 1;	ACCESS_FBINFO(cursor.timer.function) = matroxfb_DAC1064_flashcursor;	ACCESS_FBINFO(capable.plnwt) = ACCESS_FBINFO(devflags.accelerator) == FB_ACCEL_MATROX_MGAG100			? ACCESS_FBINFO(devflags.sgram) : 1;#ifdef CONFIG_FB_MATROX_G450	if (ACCESS_FBINFO(devflags.g450dac)) {		ACCESS_FBINFO(outputs[0]).output = &g450out;	} else#endif	{		ACCESS_FBINFO(outputs[0]).output = &m1064;	}	ACCESS_FBINFO(outputs[0]).src = MATROXFB_SRC_CRTC1;	ACCESS_FBINFO(outputs[0]).data = MINFO;	ACCESS_FBINFO(outputs[0]).mode = MATROXFB_OUTPUT_MODE_MONITOR;	if (ACCESS_FBINFO(devflags.g450dac)) {		/* we must do this always, BIOS does not do it for us		   and accelerator dies without it */		mga_outl(0x1C0C, 0);	}	if (ACCESS_FBINFO(devflags.noinit))		return 0;	if (ACCESS_FBINFO(devflags.g450dac)) {		g450_preinit(PMINFO2);		return 0;	}	hw->MXoptionReg &= 0xC0000100;	hw->MXoptionReg |= 0x00000020;	if (ACCESS_FBINFO(devflags.novga))		hw->MXoptionReg &= ~0x00000100;	if (ACCESS_FBINFO(devflags.nobios))		hw->MXoptionReg &= ~0x40000000;	if (ACCESS_FBINFO(devflags.nopciretry))		hw->MXoptionReg |=  0x20000000;	pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, hw->MXoptionReg);	DAC1064_setmclk(PMINFO DAC1064_OPT_MDIV2 | DAC1064_OPT_GDIV3 | DAC1064_OPT_SCLK_PCI, 133333);	if (ACCESS_FBINFO(devflags.accelerator) == FB_ACCEL_MATROX_MGAG100) {		pci_read_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION2_REG, &reg50);		reg50 &= ~0x3000;		pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION2_REG, reg50);		hw->MXoptionReg |= 0x1080;		pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, hw->MXoptionReg);		mga_outl(M_CTLWTST, ACCESS_FBINFO(values).reg.mctlwtst);		udelay(100);		mga_outb(0x1C05, 0x00);		mga_outb(0x1C05, 0x80);		udelay(100);		mga_outb(0x1C05, 0x40);		mga_outb(0x1C05, 0xC0);		udelay(100);		reg50 &= ~0xFF;		reg50 |=  0x07;		pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION2_REG, reg50);		/* it should help with G100 */		mga_outb(M_GRAPHICS_INDEX, 6);		mga_outb(M_GRAPHICS_DATA, (mga_inb(M_GRAPHICS_DATA) & 3) | 4);		mga_setr(M_EXTVGA_INDEX, 0x03, 0x81);		mga_setr(M_EXTVGA_INDEX, 0x04, 0x00);		mga_writeb(ACCESS_FBINFO(video.vbase), 0x0000, 0xAA);		mga_writeb(ACCESS_FBINFO(video.vbase), 0x0800, 0x55);		mga_writeb(ACCESS_FBINFO(video.vbase), 0x4000, 0x55);#if 0		if (mga_readb(ACCESS_FBINFO(video.vbase), 0x0000) != 0xAA) {			hw->MXoptionReg &= ~0x1000;		}#endif		hw->MXoptionReg |= 0x00078020;	} else if (ACCESS_FBINFO(devflags.accelerator) == FB_ACCEL_MATROX_MGAG200) {		pci_read_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION2_REG, &reg50);		reg50 &= ~0x3000;		pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION2_REG, reg50);		if (ACCESS_FBINFO(devflags.memtype) == -1)			hw->MXoptionReg |= ACCESS_FBINFO(values).reg.opt & 0x1C00;		else			hw->MXoptionReg |= (ACCESS_FBINFO(devflags.memtype) & 7) << 10;		if (ACCESS_FBINFO(devflags.sgram))			hw->MXoptionReg |= 0x4000;		mga_outl(M_CTLWTST, ACCESS_FBINFO(values).reg.mctlwtst);		mga_outl(M_MEMRDBK, ACCESS_FBINFO(values).reg.memrdbk);		udelay(200);		mga_outl(M_MACCESS, 0x00000000);		mga_outl(M_MACCESS, 0x00008000);		udelay(100);		mga_outw(M_MEMRDBK, ACCESS_FBINFO(values).reg.memrdbk);		hw->MXoptionReg |= 0x00078020;	} else {		pci_read_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION2_REG, &reg50);		reg50 &= ~0x00000100;		reg50 |=  0x00000000;		pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION2_REG, reg50);		if (ACCESS_FBINFO(devflags.memtype) == -1)			hw->MXoptionReg |= ACCESS_FBINFO(values).reg.opt & 0x1C00;		else			hw->MXoptionReg |= (ACCESS_FBINFO(devflags.memtype) & 7) << 10;		if (ACCESS_FBINFO(devflags.sgram))			hw->MXoptionReg |= 0x4000;		mga_outl(M_CTLWTST, ACCESS_FBINFO(values).reg.mctlwtst);		mga_outl(M_MEMRDBK, ACCESS_FBINFO(values).reg.memrdbk);		udelay(200);		mga_outl(M_MACCESS, 0x00000000);		mga_outl(M_MACCESS, 0x00008000);		udelay(100);		mga_outl(M_MEMRDBK, ACCESS_FBINFO(values).reg.memrdbk);		hw->MXoptionReg |= 0x00040020;	}	pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, hw->MXoptionReg);	return 0;}static void MGAG100_reset(WPMINFO2) {	u_int8_t b;	struct matrox_hw_state* hw = &ACCESS_FBINFO(hw);	DBG("MGAG100_reset")	ACCESS_FBINFO(features.DAC1064.cursorimage) = ACCESS_FBINFO(video.len_usable) - 1024;	if (ACCESS_FBINFO(devflags.hwcursor))		ACCESS_FBINFO(video.len_usable) -= 1024;	matroxfb_fastfont_init(MINFO);	{#ifdef G100_BROKEN_IBM_82351		u_int32_t d;		find 1014/22 (IBM/82351); /* if found and bridging Matrox, do some strange stuff */		pci_read_config_byte(ibm, PCI_SECONDARY_BUS, &b);		if (b == ACCESS_FBINFO(pcidev)->bus->number) {			pci_write_config_byte(ibm, PCI_COMMAND+1, 0);	/* disable back-to-back & SERR */			pci_write_config_byte(ibm, 0x41, 0xF4);		/* ??? */			pci_write_config_byte(ibm, PCI_IO_BASE, 0xF0);	/* ??? */			pci_write_config_byte(ibm, PCI_IO_LIMIT, 0x00);	/* ??? */		}#endif		if (!ACCESS_FBINFO(devflags.noinit)) {			if (x7AF4 & 8) {				hw->MXoptionReg |= 0x40;	/* FIXME... */				pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, hw->MXoptionReg);			}			mga_setr(M_EXTVGA_INDEX, 0x06, 0x50);		}	}	if (ACCESS_FBINFO(devflags.g450dac)) {		/* either leave MCLK as is... or they were set in preinit */		hw->DACclk[3] = inDAC1064(PMINFO DAC1064_XSYSPLLM);		hw->DACclk[4] = inDAC1064(PMINFO DAC1064_XSYSPLLN);		hw->DACclk[5] = inDAC1064(PMINFO DAC1064_XSYSPLLP);	} else {		DAC1064_setmclk(PMINFO DAC1064_OPT_RESERVED | DAC1064_OPT_MDIV2 | DAC1064_OPT_GDIV1 | DAC1064_OPT_SCLK_PLL, 133333);	}	if (ACCESS_FBINFO(devflags.accelerator) == FB_ACCEL_MATROX_MGAG400) {		if (ACCESS_FBINFO(devflags.dfp_type) == -1) {			ACCESS_FBINFO(devflags.dfp_type) = inDAC1064(PMINFO 0x1F);		}	}	if (ACCESS_FBINFO(devflags.noinit))		return;	if (ACCESS_FBINFO(devflags.g450dac)) {	} else {		MGAG100_setPixClock(PMINFO 4, 25175);		MGAG100_setPixClock(PMINFO 5, 28322);		if (x7AF4 & 0x10) {			b = inDAC1064(PMINFO M1064_XGENIODATA) & ~1;			outDAC1064(PMINFO M1064_XGENIODATA, b);			b = inDAC1064(PMINFO M1064_XGENIOCTRL) | 1;			outDAC1064(PMINFO M1064_XGENIOCTRL, b);		}	}}#endif#ifdef CONFIG_FB_MATROX_MYSTIQUEstatic void MGA1064_restore(WPMINFO struct display* p) {	int i;	struct matrox_hw_state* hw = &ACCESS_FBINFO(hw);	CRITFLAGS	DBG("MGA1064_restore")	CRITBEGIN	pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, hw->MXoptionReg);	mga_outb(M_IEN, 0x00);	mga_outb(M_CACHEFLUSH, 0x00);	CRITEND	DAC1064_restore_1(PMINFO2);	matroxfb_vgaHWrestore(PMINFO2);	ACCESS_FBINFO(crtc1.panpos) = -1;	for (i = 0; i < 6; i++)		mga_setr(M_EXTVGA_INDEX, i, hw->CRTCEXT[i]);	DAC1064_restore_2(PMINFO p);}#endif#ifdef CONFIG_FB_MATROX_G100static void MGAG100_restore(WPMINFO struct display* p) {	int i;	struct matrox_hw_state* hw = &ACCESS_FBINFO(hw);	CRITFLAGS	DBG("MGAG100_restore")	CRITBEGIN	pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, hw->MXoptionReg);	CRITEND	DAC1064_restore_1(PMINFO2);	matroxfb_vgaHWrestore(PMINFO2);#ifdef CONFIG_FB_MATROX_32MB	if (ACCESS_FBINFO(devflags.support32MB))		mga_setr(M_EXTVGA_INDEX, 8, hw->CRTCEXT[8]);#endif	ACCESS_FBINFO(crtc1.panpos) = -1;	for (i = 0; i < 6; i++)		mga_setr(M_EXTVGA_INDEX, i, hw->CRTCEXT[i]);	DAC1064_restore_2(PMINFO p);}#endif#ifdef CONFIG_FB_MATROX_MYSTIQUEstruct matrox_switch matrox_mystique = {	MGA1064_preinit, MGA1064_reset, MGA1064_init, MGA1064_restore, DAC1064_selhwcursor};EXPORT_SYMBOL(matrox_mystique);#endif#ifdef CONFIG_FB_MATROX_G100struct matrox_switch matrox_G100 = {	MGAG100_preinit, MGAG100_reset, MGAG100_init, MGAG100_restore, DAC1064_selhwcursor};EXPORT_SYMBOL(matrox_G100);#endif#ifdef NEED_DAC1064EXPORT_SYMBOL(DAC1064_global_init);EXPORT_SYMBOL(DAC1064_global_restore);#endifMODULE_LICENSE("GPL");

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -