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

📄 matroxfb_base.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 5 页
字号:
	mga_outb(M_EXTVGA_INDEX, 0x03);	mga_outb(M_EXTVGA_DATA, orig);	*realSize = offs - 0x100000;#ifdef CONFIG_FB_MATROX_MILLENIUM	ACCESS_FBINFO(interleave) = !(!isMillenium(MINFO) || ((offs - 0x100000) & 0x3FFFFF));#endif	return 1;}struct video_board {	int maxvram;	int maxdisplayable;	int accelID;	struct matrox_switch* lowlevel;		 };#ifdef CONFIG_FB_MATROX_MILLENIUMstatic struct video_board vbMillennium		= {0x0800000, 0x0800000, FB_ACCEL_MATROX_MGA2064W,	&matrox_millennium};static struct video_board vbMillennium2		= {0x1000000, 0x0800000, FB_ACCEL_MATROX_MGA2164W,	&matrox_millennium};static struct video_board vbMillennium2A	= {0x1000000, 0x0800000, FB_ACCEL_MATROX_MGA2164W_AGP,	&matrox_millennium};#endif	/* CONFIG_FB_MATROX_MILLENIUM */#ifdef CONFIG_FB_MATROX_MYSTIQUEstatic struct video_board vbMystique		= {0x0800000, 0x0800000, FB_ACCEL_MATROX_MGA1064SG,	&matrox_mystique};#endif	/* CONFIG_FB_MATROX_MYSTIQUE */#ifdef CONFIG_FB_MATROX_Gstatic struct video_board vbG100		= {0x0800000, 0x0800000, FB_ACCEL_MATROX_MGAG100,	&matrox_G100};static struct video_board vbG200		= {0x1000000, 0x1000000, FB_ACCEL_MATROX_MGAG200,	&matrox_G100};#ifdef CONFIG_FB_MATROX_32MB/* from doc it looks like that accelerator can draw only to low 16MB :-( Direct accesses & displaying are OK for   whole 32MB */static struct video_board vbG400		= {0x2000000, 0x1000000, FB_ACCEL_MATROX_MGAG400,	&matrox_G100};#elsestatic struct video_board vbG400		= {0x2000000, 0x1000000, FB_ACCEL_MATROX_MGAG400,	&matrox_G100};#endif#endif#define DEVF_VIDEO64BIT		0x0001#define	DEVF_SWAPS		0x0002#define DEVF_SRCORG		0x0004#define DEVF_DUALHEAD		0x0008#define DEVF_CROSS4MB		0x0010#define DEVF_TEXT4B		0x0020/* #define DEVF_recycled	0x0040	*//* #define DEVF_recycled	0x0080	*/#define DEVF_SUPPORT32MB	0x0100#define DEVF_ANY_VXRES		0x0200#define DEVF_TEXT16B		0x0400#define DEVF_CRTC2		0x0800#define DEVF_MAVEN_CAPABLE	0x1000#define DEVF_PANELLINK_CAPABLE	0x2000#define DEVF_G450DAC		0x4000#define DEVF_GCORE	(DEVF_VIDEO64BIT | DEVF_SWAPS | DEVF_CROSS4MB)#define DEVF_G2CORE	(DEVF_GCORE | DEVF_ANY_VXRES | DEVF_MAVEN_CAPABLE | DEVF_PANELLINK_CAPABLE | DEVF_SRCORG | DEVF_DUALHEAD)#define DEVF_G100	(DEVF_GCORE) /* no doc, no vxres... */#define DEVF_G200	(DEVF_G2CORE)#define DEVF_G400	(DEVF_G2CORE | DEVF_SUPPORT32MB | DEVF_TEXT16B | DEVF_CRTC2)/* if you'll find how to drive DFP... */#define DEVF_G450	(DEVF_GCORE | DEVF_ANY_VXRES | DEVF_SUPPORT32MB | DEVF_TEXT16B | DEVF_CRTC2 | DEVF_G450DAC | DEVF_SRCORG | DEVF_DUALHEAD)#define DEVF_G550	(DEVF_G450)static struct board {	unsigned short vendor, device, rev, svid, sid;	unsigned int flags;	unsigned int maxclk;	enum mga_chip chip;	struct video_board* base;	const char* name;		} dev_list[] = {#ifdef CONFIG_FB_MATROX_MILLENIUM	{PCI_VENDOR_ID_MATROX,	PCI_DEVICE_ID_MATROX_MIL,	0xFF,		0,			0,		DEVF_TEXT4B,		230000,		MGA_2064,		&vbMillennium,		"Millennium (PCI)"},	{PCI_VENDOR_ID_MATROX,	PCI_DEVICE_ID_MATROX_MIL_2,	0xFF,		0,			0,		DEVF_SWAPS,		220000,		MGA_2164,		&vbMillennium2,		"Millennium II (PCI)"},	{PCI_VENDOR_ID_MATROX,	PCI_DEVICE_ID_MATROX_MIL_2_AGP,	0xFF,		0,			0,		DEVF_SWAPS,		250000,		MGA_2164,		&vbMillennium2A,		"Millennium II (AGP)"},#endif#ifdef CONFIG_FB_MATROX_MYSTIQUE	{PCI_VENDOR_ID_MATROX,	PCI_DEVICE_ID_MATROX_MYS,	0x02,		0,			0,		DEVF_VIDEO64BIT | DEVF_CROSS4MB,		180000,		MGA_1064,		&vbMystique,		"Mystique (PCI)"},	{PCI_VENDOR_ID_MATROX,	PCI_DEVICE_ID_MATROX_MYS,	0xFF,		0,			0,		DEVF_VIDEO64BIT | DEVF_SWAPS | DEVF_CROSS4MB,		220000,		MGA_1164,		&vbMystique,		"Mystique 220 (PCI)"},	{PCI_VENDOR_ID_MATROX,	PCI_DEVICE_ID_MATROX_MYS_AGP,	0x02,		0,			0,		DEVF_VIDEO64BIT | DEVF_CROSS4MB,		180000,		MGA_1064,		&vbMystique,		"Mystique (AGP)"},	{PCI_VENDOR_ID_MATROX,	PCI_DEVICE_ID_MATROX_MYS_AGP,	0xFF,		0,			0,		DEVF_VIDEO64BIT | DEVF_SWAPS | DEVF_CROSS4MB,		220000,		MGA_1164,		&vbMystique,		"Mystique 220 (AGP)"},#endif#ifdef CONFIG_FB_MATROX_G	{PCI_VENDOR_ID_MATROX,	PCI_DEVICE_ID_MATROX_G100_MM,	0xFF,		0,			0,		DEVF_G100,		230000,		MGA_G100,		&vbG100,		"MGA-G100 (PCI)"},	{PCI_VENDOR_ID_MATROX,	PCI_DEVICE_ID_MATROX_G100_AGP,	0xFF,		0,			0,		DEVF_G100,		230000,		MGA_G100,		&vbG100,		"MGA-G100 (AGP)"},	{PCI_VENDOR_ID_MATROX,	PCI_DEVICE_ID_MATROX_G200_PCI,	0xFF,		0,			0,		DEVF_G200,		250000,		MGA_G200,		&vbG200,		"MGA-G200 (PCI)"},	{PCI_VENDOR_ID_MATROX,	PCI_DEVICE_ID_MATROX_G200_AGP,	0xFF,		PCI_SS_VENDOR_ID_MATROX,	PCI_SS_ID_MATROX_GENERIC,		DEVF_G200,		220000,		MGA_G200,		&vbG200,		"MGA-G200 (AGP)"},	{PCI_VENDOR_ID_MATROX,	PCI_DEVICE_ID_MATROX_G200_AGP,	0xFF,		PCI_SS_VENDOR_ID_MATROX,	PCI_SS_ID_MATROX_MYSTIQUE_G200_AGP,		DEVF_G200,		230000,		MGA_G200,		&vbG200,		"Mystique G200 (AGP)"},	{PCI_VENDOR_ID_MATROX,	PCI_DEVICE_ID_MATROX_G200_AGP,	0xFF,		PCI_SS_VENDOR_ID_MATROX,	PCI_SS_ID_MATROX_MILLENIUM_G200_AGP,		DEVF_G200,		250000,		MGA_G200,		&vbG200,		"Millennium G200 (AGP)"},	{PCI_VENDOR_ID_MATROX,	PCI_DEVICE_ID_MATROX_G200_AGP,	0xFF,		PCI_SS_VENDOR_ID_MATROX,	PCI_SS_ID_MATROX_MARVEL_G200_AGP,		DEVF_G200,		230000,		MGA_G200,		&vbG200,		"Marvel G200 (AGP)"},	{PCI_VENDOR_ID_MATROX,	PCI_DEVICE_ID_MATROX_G200_AGP,	0xFF,		PCI_SS_VENDOR_ID_SIEMENS_NIXDORF,	PCI_SS_ID_SIEMENS_MGA_G200_AGP,		DEVF_G200,		230000,		MGA_G200,		&vbG200,		"MGA-G200 (AGP)"},	{PCI_VENDOR_ID_MATROX,	PCI_DEVICE_ID_MATROX_G200_AGP,	0xFF,		0,			0,		DEVF_G200,		230000,		MGA_G200,		&vbG200,		"G200 (AGP)"},	{PCI_VENDOR_ID_MATROX,	PCI_DEVICE_ID_MATROX_G400,	0x80,		PCI_SS_VENDOR_ID_MATROX,	PCI_SS_ID_MATROX_MILLENNIUM_G400_MAX_AGP,		DEVF_G400,		360000,		MGA_G400,		&vbG400,		"Millennium G400 MAX (AGP)"},	{PCI_VENDOR_ID_MATROX,	PCI_DEVICE_ID_MATROX_G400,	0x80,		0,			0,		DEVF_G400,		300000,		MGA_G400,		&vbG400,		"G400 (AGP)"},	{PCI_VENDOR_ID_MATROX,	PCI_DEVICE_ID_MATROX_G400,	0xFF,		0,			0,		DEVF_G450,		360000,		MGA_G450,		&vbG400,		"G450"},	{PCI_VENDOR_ID_MATROX,	PCI_DEVICE_ID_MATROX_G550,	0xFF,		0,			0,		DEVF_G550,		360000,		MGA_G550,		&vbG400,		"G550"},#endif	{0,			0,				0xFF,		0,			0,		0,		0,		0,		NULL,		NULL}};#ifndef MODULEstatic struct fb_videomode defaultmode = {	/* 640x480 @ 60Hz, 31.5 kHz */	NULL, 60, 640, 480, 39721, 40, 24, 32, 11, 96, 2,	0, FB_VMODE_NONINTERLACED};#endif /* !MODULE */static int hotplug = 0;static void setDefaultOutputs(WPMINFO2) {	unsigned int i;	const char* ptr;	ACCESS_FBINFO(outputs[0]).default_src = MATROXFB_SRC_CRTC1;	if (ACCESS_FBINFO(devflags.g450dac)) {		ACCESS_FBINFO(outputs[1]).default_src = MATROXFB_SRC_CRTC1;		ACCESS_FBINFO(outputs[2]).default_src = MATROXFB_SRC_CRTC1;	} else if (dfp) {		ACCESS_FBINFO(outputs[2]).default_src = MATROXFB_SRC_CRTC1;	}	ptr = outputs;	for (i = 0; i < MATROXFB_MAX_OUTPUTS; i++) {		char c = *ptr++;		if (c == 0) {			break;		}		if (c == '0') {			ACCESS_FBINFO(outputs[i]).default_src = MATROXFB_SRC_NONE;		} else if (c == '1') {			ACCESS_FBINFO(outputs[i]).default_src = MATROXFB_SRC_CRTC1;		} else if (c == '2' && ACCESS_FBINFO(devflags.crtc2)) {			ACCESS_FBINFO(outputs[i]).default_src = MATROXFB_SRC_CRTC2;		} else {			printk(KERN_ERR "matroxfb: Unknown outputs setting\n");			break;		}	}	/* Nullify this option for subsequent adapters */	outputs[0] = 0;}static int initMatrox2(WPMINFO struct board* b){	unsigned long ctrlptr_phys = 0;	unsigned long video_base_phys = 0;	unsigned int memsize;	int err;	static struct pci_device_id intel_82437[] = {		{ PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82437) },		{ },	};	DBG(__FUNCTION__)	/* set default values... */	vesafb_defined.accel_flags = FB_ACCELF_TEXT;	ACCESS_FBINFO(hw_switch) = b->base->lowlevel;	ACCESS_FBINFO(devflags.accelerator) = b->base->accelID;	ACCESS_FBINFO(max_pixel_clock) = b->maxclk;	printk(KERN_INFO "matroxfb: Matrox %s detected\n", b->name);	ACCESS_FBINFO(capable.plnwt) = 1;	ACCESS_FBINFO(chip) = b->chip;	ACCESS_FBINFO(capable.srcorg) = b->flags & DEVF_SRCORG;	ACCESS_FBINFO(devflags.video64bits) = b->flags & DEVF_VIDEO64BIT;	if (b->flags & DEVF_TEXT4B) {		ACCESS_FBINFO(devflags.vgastep) = 4;		ACCESS_FBINFO(devflags.textmode) = 4;		ACCESS_FBINFO(devflags.text_type_aux) = FB_AUX_TEXT_MGA_STEP16;	} else if (b->flags & DEVF_TEXT16B) {		ACCESS_FBINFO(devflags.vgastep) = 16;		ACCESS_FBINFO(devflags.textmode) = 1;		ACCESS_FBINFO(devflags.text_type_aux) = FB_AUX_TEXT_MGA_STEP16;	} else {		ACCESS_FBINFO(devflags.vgastep) = 8;		ACCESS_FBINFO(devflags.textmode) = 1;		ACCESS_FBINFO(devflags.text_type_aux) = FB_AUX_TEXT_MGA_STEP8;	}#ifdef CONFIG_FB_MATROX_32MB	ACCESS_FBINFO(devflags.support32MB) = (b->flags & DEVF_SUPPORT32MB) != 0;#endif	ACCESS_FBINFO(devflags.precise_width) = !(b->flags & DEVF_ANY_VXRES);	ACCESS_FBINFO(devflags.crtc2) = (b->flags & DEVF_CRTC2) != 0;	ACCESS_FBINFO(devflags.maven_capable) = (b->flags & DEVF_MAVEN_CAPABLE) != 0;	ACCESS_FBINFO(devflags.dualhead) = (b->flags & DEVF_DUALHEAD) != 0;	ACCESS_FBINFO(devflags.dfp_type) = dfp_type;	ACCESS_FBINFO(devflags.g450dac) = (b->flags & DEVF_G450DAC) != 0;	ACCESS_FBINFO(devflags.textstep) = ACCESS_FBINFO(devflags.vgastep) * ACCESS_FBINFO(devflags.textmode);	ACCESS_FBINFO(devflags.textvram) = 65536 / ACCESS_FBINFO(devflags.textmode);	setDefaultOutputs(PMINFO2);	if (b->flags & DEVF_PANELLINK_CAPABLE) {		ACCESS_FBINFO(outputs[2]).data = MINFO;		ACCESS_FBINFO(outputs[2]).output = &panellink_output;		ACCESS_FBINFO(outputs[2]).src = ACCESS_FBINFO(outputs[2]).default_src;		ACCESS_FBINFO(outputs[2]).mode = MATROXFB_OUTPUT_MODE_MONITOR;		ACCESS_FBINFO(devflags.panellink) = 1;	}	if (ACCESS_FBINFO(capable.cross4MB) < 0)		ACCESS_FBINFO(capable.cross4MB) = b->flags & DEVF_CROSS4MB;	if (b->flags & DEVF_SWAPS) {		ctrlptr_phys = pci_resource_start(ACCESS_FBINFO(pcidev), 1);		video_base_phys = pci_resource_start(ACCESS_FBINFO(pcidev), 0);		ACCESS_FBINFO(devflags.fbResource) = PCI_BASE_ADDRESS_0;	} else {		ctrlptr_phys = pci_resource_start(ACCESS_FBINFO(pcidev), 0);		video_base_phys = pci_resource_start(ACCESS_FBINFO(pcidev), 1);		ACCESS_FBINFO(devflags.fbResource) = PCI_BASE_ADDRESS_1;	}	err = -EINVAL;	if (!ctrlptr_phys) {		printk(KERN_ERR "matroxfb: control registers are not available, matroxfb disabled\n");		goto fail;	}	if (!video_base_phys) {		printk(KERN_ERR "matroxfb: video RAM is not available in PCI address space, matroxfb disabled\n");		goto fail;	}	memsize = b->base->maxvram;	if (!request_mem_region(ctrlptr_phys, 16384, "matroxfb MMIO")) {		goto fail;	}	if (!request_mem_region(video_base_phys, memsize, "matroxfb FB")) {		goto failCtrlMR;	}	ACCESS_FBINFO(video.len_maximum) = memsize;	/* convert mem (autodetect k, M) */	if (mem < 1024) mem *= 1024;	if (mem < 0x00100000) mem *= 1024;	if (mem && (mem < memsize))		memsize = mem;	err = -ENOMEM;	if (mga_ioremap(ctrlptr_phys, 16384, MGA_IOREMAP_MMIO, &ACCESS_FBINFO(mmio.vbase))) {		printk(KERN_ERR "matroxfb: cannot ioremap(%lX, 16384), matroxfb disabled\n", ctrlptr_phys);		goto failVideoMR;	}	ACCESS_FBINFO(mmio.base) = ctrlptr_phys;	ACCESS_FBINFO(mmio.len) = 16384;	ACCESS_FBINFO(video.base) = video_base_phys;	if (mga_ioremap(video_base_phys, memsize, MGA_IOREMAP_FB, &ACCESS_FBINFO(video.vbase))) {		printk(KERN_ERR "matroxfb: cannot ioremap(%lX, %d), matroxfb disabled\n",			video_base_phys, memsize);		goto failCtrlIO;	}	{		u_int32_t cmd;		u_int32_t mga_option;		pci_read_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, &mga_option);		pci_read_config_dword(ACCESS_FBINFO(pcidev), PCI_COMMAND, &cmd);		mga_option &= 0x7FFFFFFF; /* clear BIG_ENDIAN */		mga_option |= MX_OPTION_BSWAP;                /* disable palette snooping */                cmd &= ~PCI_COMMAND_VGA_PALETTE;		if (pci_dev_present(intel_82437)) {			if (!(mga_option & 0x20000000) && !ACCESS_FBINFO(devflags.nopciretry)) {				printk(KERN_WARNING "matroxfb: Disabling PCI retries due to i82437 present\n");			}			mga_option |= 0x20000000;			ACCESS_FBINFO(devflags.nopciretry) = 1;		}		pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_COMMAND, cmd);		pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_OPTION_REG, mga_option);		ACCESS_FBINFO(hw).MXoptionReg = mga_option;		/* select non-DMA memory for PCI_MGA_DATA, otherwise dump of PCI cfg space can lock PCI bus */		/* maybe preinit() candidate, but it is same... for all devices... at this time... */		pci_write_config_dword(ACCESS_FBINFO(pcidev), PCI_MGA_INDEX, 0x00003C00);	}	err = -ENXIO;	matroxfb_read_pins(PMINFO2);	if (ACCESS_FBINFO(hw_switch)->preinit(PMINFO2)) {		goto failVideoIO;	}	err = -ENOMEM;	if (!matroxfb_getmemory(PMINFO memsize, &ACCESS_FBINFO(video.len)) || !ACCESS_FBINFO(video.len)) {		printk(KERN_ERR "matroxfb: cannot determine memory size\n");		goto failVideoIO;	}	ACCESS_FBINFO(devflags.ydstorg) = 0;	ACCESS_FBINFO(video.base) = video_base_phys;	ACCESS_FBINFO(video.len_usable) = ACCESS_FBINFO(video.len);	if (ACCESS_FBINFO(video.len_usable) > b->base->maxdisplayable)		ACCESS_FBINFO(video.len_usable) = b->base->maxdisplayable;#ifdef CONFIG_MTRR	if (mtrr) {		ACCESS_FBINFO(mtrr.vram) = mtrr_add(video_base_phys, ACCESS_FBINFO(video.len), MTRR_TYPE_WRCOMB, 1);		ACCESS_FBINFO(mtrr.vram_valid) = 1;		printk(KERN_INFO "matroxfb: MTRR's turned on\n");	}#endif	/* CONFIG_MTRR */	if (!ACCESS_FBINFO(devflags.novga))		request_region(0x3C0, 32, "matrox");	matroxfb_g450_connect(PMINFO2);	ACCESS_FBINFO(hw_switch->reset(PMINFO2));	ACCESS_FBINFO(fbcon.monspecs.hfmin) = 0;	ACCESS_FBINFO(fbcon.monspecs.hfmax) = fh;	ACCESS_FBINFO(fbcon.monspecs.vfmin) = 0;	ACCESS_FBINFO(fbcon.monspecs.vfmax) = fv;	ACCESS_FBINFO(fbcon.monspecs.dpms) = 0;	/* TBD */	/* static settings */	vesafb_defined.red = colors[depth-1].red;	vesafb_defined.green = colors[depth-1].green;	vesafb_defined.blue = colors[depth-1].blue;	vesafb_defined.bits_per_pixel = colors[depth-1].bits_per_pixel;

⌨️ 快捷键说明

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