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

📄 matroxfb_dac1064.c

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
		   Doing so cause immediate PCI lockup :-( Maybe they should		   generate ABORT or I/O (parity...) error and Linux should		   recover from this... (kill driver/process). But world is not		   perfect... */		/* (bit 2 of PCI_OPTION_REG must be 0... and bits 0,1 must not		   select PLL... because of PLL can be stopped at this time) */		DAC1064_calcclock(PMINFO fmem, ACCESS_FBINFO(max_pixel_clock), &m, &n, &p);		outDAC1064(PMINFO DAC1064_XSYSPLLM, hw->DACclk[3] = m);		outDAC1064(PMINFO DAC1064_XSYSPLLN, hw->DACclk[4] = n);		outDAC1064(PMINFO DAC1064_XSYSPLLP, hw->DACclk[5] = p);		for (clk = 65536; clk; --clk) {			if (inDAC1064(PMINFO DAC1064_XSYSPLLSTAT) & 0x40)				break;		}		if (!clk)			printk(KERN_ERR "matroxfb: aiee, SYSPLL not locked\n");		/* select PLL */		mx |= 0x00000005;	} else {		/* select specified system clock source */		mx |= oscinfo & DAC1064_OPT_SCLK_MASK;	}	pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, mx);	mx &= ~0x00000004;	pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, mx);	hw->MXoptionReg = mx;}void DAC1064_global_init(CPMINFO struct matrox_hw_state* hw) {	hw->DACreg[POS1064_XMISCCTRL] &= M1064_XMISCCTRL_DAC_WIDTHMASK;	hw->DACreg[POS1064_XMISCCTRL] |= M1064_XMISCCTRL_LUT_EN;	hw->DACreg[POS1064_XPIXCLKCTRL] = M1064_XPIXCLKCTRL_PLL_UP | M1064_XPIXCLKCTRL_EN | M1064_XPIXCLKCTRL_SRC_PLL;	hw->DACreg[POS1064_XOUTPUTCONN] = 0x01;	/* output #1 enabled */	if (ACCESS_FBINFO(output.ph) & MATROXFB_OUTPUT_CONN_SECONDARY) {		if (ACCESS_FBINFO(devflags.g450dac)) {			hw->DACreg[POS1064_XPIXCLKCTRL] = M1064_XPIXCLKCTRL_PLL_UP | M1064_XPIXCLKCTRL_EN | M1064_XPIXCLKCTRL_SRC_PLL2;			hw->DACreg[POS1064_XOUTPUTCONN] = 0x05;	/* output #1 enabled; CRTC1 connected to output #2 */		} else {			hw->DACreg[POS1064_XPIXCLKCTRL] = M1064_XPIXCLKCTRL_PLL_UP | M1064_XPIXCLKCTRL_EN | M1064_XPIXCLKCTRL_SRC_EXT;			hw->DACreg[POS1064_XMISCCTRL] |= GX00_XMISCCTRL_MFC_MAFC | G400_XMISCCTRL_VDO_MAFC12;		}	} else if (ACCESS_FBINFO(output.sh) & MATROXFB_OUTPUT_CONN_SECONDARY) {		hw->DACreg[POS1064_XMISCCTRL] |= GX00_XMISCCTRL_MFC_MAFC | G400_XMISCCTRL_VDO_C2_MAFC12;		hw->DACreg[POS1064_XOUTPUTCONN] = 0x09; /* output #1 enabled; CRTC2 connected to output #2 */	} else if (ACCESS_FBINFO(output.ph) & MATROXFB_OUTPUT_CONN_DFP)		hw->DACreg[POS1064_XMISCCTRL] |= GX00_XMISCCTRL_MFC_PANELLINK | G400_XMISCCTRL_VDO_MAFC12;	else		hw->DACreg[POS1064_XMISCCTRL] |= GX00_XMISCCTRL_MFC_DIS;	if ((ACCESS_FBINFO(output.ph) | ACCESS_FBINFO(output.sh)) & MATROXFB_OUTPUT_CONN_PRIMARY)		hw->DACreg[POS1064_XMISCCTRL] |= M1064_XMISCCTRL_DAC_EN;}void DAC1064_global_restore(CPMINFO const struct matrox_hw_state* hw) {	outDAC1064(PMINFO M1064_XPIXCLKCTRL, hw->DACreg[POS1064_XPIXCLKCTRL]);	outDAC1064(PMINFO M1064_XMISCCTRL, hw->DACreg[POS1064_XMISCCTRL]);	if (ACCESS_FBINFO(devflags.accelerator) == FB_ACCEL_MATROX_MGAG400) {		outDAC1064(PMINFO 0x20, 0x04);		outDAC1064(PMINFO 0x1F, 0x00);		if (ACCESS_FBINFO(devflags.g450dac)) {			outDAC1064(PMINFO M1064_X8B, 0xCC);	/* only matrox know... */			outDAC1064(PMINFO M1064_XOUTPUTCONN, hw->DACreg[POS1064_XOUTPUTCONN]);		}	}}static int DAC1064_init_1(CPMINFO struct matrox_hw_state* hw, struct my_timming* m, struct display *p) {	DBG("DAC1064_init_1")	memcpy(hw->DACreg, MGA1064_DAC, sizeof(MGA1064_DAC_regs));	if (p->type == FB_TYPE_TEXT) {		hw->DACreg[POS1064_XMISCCTRL] = M1064_XMISCCTRL_DAC_6BIT;		hw->DACreg[POS1064_XMULCTRL] = M1064_XMULCTRL_DEPTH_8BPP					     | M1064_XMULCTRL_GRAPHICS_PALETIZED;	} else {		switch (p->var.bits_per_pixel) {		/* case 4: not supported by MGA1064 DAC */		case 8:			hw->DACreg[POS1064_XMULCTRL] = M1064_XMULCTRL_DEPTH_8BPP | M1064_XMULCTRL_GRAPHICS_PALETIZED;			break;		case 16:			if (p->var.green.length == 5)				hw->DACreg[POS1064_XMULCTRL] = M1064_XMULCTRL_DEPTH_15BPP_1BPP | M1064_XMULCTRL_GRAPHICS_PALETIZED;			else				hw->DACreg[POS1064_XMULCTRL] = M1064_XMULCTRL_DEPTH_16BPP | M1064_XMULCTRL_GRAPHICS_PALETIZED;			break;		case 24:			hw->DACreg[POS1064_XMULCTRL] = M1064_XMULCTRL_DEPTH_24BPP | M1064_XMULCTRL_GRAPHICS_PALETIZED;			break;		case 32:			hw->DACreg[POS1064_XMULCTRL] = M1064_XMULCTRL_DEPTH_32BPP | M1064_XMULCTRL_GRAPHICS_PALETIZED;			break;		default:			return 1;	/* unsupported depth */		}	}	DAC1064_global_init(PMINFO hw);	hw->DACreg[POS1064_XVREFCTRL] = ACCESS_FBINFO(features.DAC1064.xvrefctrl);	hw->DACreg[POS1064_XGENCTRL] &= ~M1064_XGENCTRL_SYNC_ON_GREEN_MASK;	hw->DACreg[POS1064_XGENCTRL] |= (m->sync & FB_SYNC_ON_GREEN)?M1064_XGENCTRL_SYNC_ON_GREEN:M1064_XGENCTRL_NO_SYNC_ON_GREEN;	hw->DACreg[POS1064_XCURADDL] = ACCESS_FBINFO(features.DAC1064.cursorimage) >> 10;	hw->DACreg[POS1064_XCURADDH] = ACCESS_FBINFO(features.DAC1064.cursorimage) >> 18;	return 0;}static int DAC1064_init_2(CPMINFO struct matrox_hw_state* hw, struct my_timming* m, struct display* p) {	DBG("DAC1064_init_2")	if (p->var.bits_per_pixel > 16) {	/* 256 entries */		int i;		for (i = 0; i < 256; i++) {			hw->DACpal[i * 3 + 0] = i;			hw->DACpal[i * 3 + 1] = i;			hw->DACpal[i * 3 + 2] = i;		}	} else if (p->var.bits_per_pixel > 8) {		if (p->var.green.length == 5) {	/* 0..31, 128..159 */			int i;			for (i = 0; i < 32; i++) {				/* with p15 == 0 */				hw->DACpal[i * 3 + 0] = i << 3;				hw->DACpal[i * 3 + 1] = i << 3;				hw->DACpal[i * 3 + 2] = i << 3;				/* with p15 == 1 */				hw->DACpal[(i + 128) * 3 + 0] = i << 3;				hw->DACpal[(i + 128) * 3 + 1] = i << 3;				hw->DACpal[(i + 128) * 3 + 2] = i << 3;			}		} else {			int i;			for (i = 0; i < 64; i++) {		/* 0..63 */				hw->DACpal[i * 3 + 0] = i << 3;				hw->DACpal[i * 3 + 1] = i << 2;				hw->DACpal[i * 3 + 2] = i << 3;			}		}	} else {		memset(hw->DACpal, 0, 768);	}	return 0;}static void DAC1064_restore_1(WPMINFO const struct matrox_hw_state* hw, const struct matrox_hw_state* oldhw) {	CRITFLAGS	DBG("DAC1064_restore_1")	CRITBEGIN	outDAC1064(PMINFO DAC1064_XSYSPLLM, hw->DACclk[3]);	outDAC1064(PMINFO DAC1064_XSYSPLLN, hw->DACclk[4]);	outDAC1064(PMINFO DAC1064_XSYSPLLP, hw->DACclk[5]);	if (!oldhw || memcmp(hw->DACreg, oldhw->DACreg, sizeof(MGA1064_DAC_regs))) {		unsigned int i;		for (i = 0; i < sizeof(MGA1064_DAC_regs); i++) {			if ((i != POS1064_XPIXCLKCTRL) && (i != POS1064_XMISCCTRL))				outDAC1064(PMINFO MGA1064_DAC_regs[i], hw->DACreg[i]);		}	}	DAC1064_global_restore(PMINFO hw);	CRITEND};static void DAC1064_restore_2(WPMINFO const struct matrox_hw_state* hw, const struct matrox_hw_state* oldhw, struct display* p) {#ifdef DEBUG	unsigned int i;#endif	DBG("DAC1064_restore_2")	matrox_init_putc(PMINFO p, matroxfb_DAC1064_createcursor);#ifdef DEBUG	dprintk(KERN_DEBUG "DAC1064regs ");	for (i = 0; i < sizeof(MGA1064_DAC_regs); i++) {		dprintk("R%02X=%02X ", MGA1064_DAC_regs[i], hw->DACreg[i]);		if ((i & 0x7) == 0x7) dprintk("\n" KERN_DEBUG "continuing... ");	}	dprintk("\n" KERN_DEBUG "DAC1064clk ");	for (i = 0; i < 6; i++)		dprintk("C%02X=%02X ", i, hw->DACclk[i]);	dprintk("\n");#endif}static int m1064_compute(void* outdev, struct my_timming* m, struct matrox_hw_state* hw) {#define minfo ((struct matrox_fb_info*)outdev)	DAC1064_setpclk(PMINFO hw, m->pixclock);#undef minfo	return 0;}static int m1064_program(void* outdev, const struct matrox_hw_state* hw) {#define minfo ((struct matrox_fb_info*)outdev)	int i;	int tmout;	CRITFLAGS	CRITBEGIN	for (i = 0; i < 3; i++)		outDAC1064(PMINFO M1064_XPIXPLLCM + i, hw->DACclk[i]);	for (tmout = 500000; tmout; tmout--) {		if (inDAC1064(PMINFO M1064_XPIXPLLSTAT) & 0x40)			break;		udelay(10);	};	CRITEND	if (!tmout)		printk(KERN_ERR "matroxfb: Pixel PLL not locked after 5 secs\n");#undef minfo	return 0;}static int m1064_start(void* outdev) {	/* nothing */	return 0;}static void m1064_incuse(void* outdev) {	/* nothing yet; MODULE_INC_USE in future... */}static void m1064_decuse(void* outdev) {	/* nothing yet; MODULE_DEC_USE in future... */}static int m1064_setmode(void* outdev, u_int32_t mode) {	if (mode != MATROXFB_OUTPUT_MODE_MONITOR)		return -EINVAL;	return 0;}static struct matrox_altout m1064 = {	m1064_compute,	m1064_program,	m1064_start,	m1064_incuse,	m1064_decuse,	m1064_setmode};#endif /* NEED_DAC1064 */#ifdef CONFIG_FB_MATROX_MYSTIQUEstatic int MGA1064_init(CPMINFO struct matrox_hw_state* hw, struct my_timming* m, struct display* p) {	DBG("MGA1064_init")	if (DAC1064_init_1(PMINFO hw, m, p)) return 1;	if (matroxfb_vgaHWinit(PMINFO hw, m, p)) return 1;	hw->MiscOutReg = 0xCB;	if (m->sync & FB_SYNC_HOR_HIGH_ACT)		hw->MiscOutReg &= ~0x40;	if (m->sync & FB_SYNC_VERT_HIGH_ACT)		hw->MiscOutReg &= ~0x80;	if (m->sync & FB_SYNC_COMP_HIGH_ACT) /* should be only FB_SYNC_COMP */		hw->CRTCEXT[3] |= 0x40;	if (DAC1064_init_2(PMINFO hw, m, p)) return 1;	return 0;}#endif#ifdef CONFIG_FB_MATROX_G100static int MGAG100_init(CPMINFO struct matrox_hw_state* hw, struct my_timming* m, struct display* p) {	DBG("MGAG100_init")	if (DAC1064_init_1(PMINFO hw, m, p)) return 1;	hw->MXoptionReg &= ~0x2000;	if (matroxfb_vgaHWinit(PMINFO hw, m, p)) return 1;	hw->MiscOutReg = 0xEF;	if (m->sync & FB_SYNC_HOR_HIGH_ACT)		hw->MiscOutReg &= ~0x40;	if (m->sync & FB_SYNC_VERT_HIGH_ACT)		hw->MiscOutReg &= ~0x80;	if (m->sync & FB_SYNC_COMP_HIGH_ACT) /* should be only FB_SYNC_COMP */		hw->CRTCEXT[3] |= 0x40;	if (DAC1064_init_2(PMINFO hw, m, p)) return 1;	return 0;}#endif	/* G100 */#ifdef CONFIG_FB_MATROX_MYSTIQUEstatic void MGA1064_ramdac_init(WPMINFO struct matrox_hw_state* hw){	DBG("MGA1064_ramdac_init");	/* ACCESS_FBINFO(features.DAC1064.vco_freq_min) = 120000; */	ACCESS_FBINFO(features.pll.vco_freq_min) = 62000;	ACCESS_FBINFO(features.pll.ref_freq)	 = 14318;	ACCESS_FBINFO(features.pll.feed_div_min) = 100;	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_EXTERNAL;	/* maybe cmdline MCLK= ?, doc says gclk=44MHz, mclk=66MHz... it was 55/83 with old values */	DAC1064_setmclk(PMINFO hw, DAC1064_OPT_MDIV2 | DAC1064_OPT_GDIV3 | DAC1064_OPT_SCLK_PLL, 133333);}#endif#ifdef CONFIG_FB_MATROX_G100/* BIOS environ */static int x7AF4 = 0x10;	/* flags, maybe 0x10 = SDRAM, 0x00 = SGRAM??? */				/* G100 wants 0x10, G200 SGRAM does not care... */#if 0static int def50 = 0;	/* reg50, & 0x0F, & 0x3000 (only 0x0000, 0x1000, 0x2000 (0x3000 disallowed and treated as 0) */#endifstatic void MGAG100_progPixClock(CPMINFO int flags, int m, int n, int p){	int reg;	int selClk;	int clk;	DBG("MGAG100_progPixClock")

⌨️ 快捷键说明

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