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

📄 controller.c

📁 Memtest86 is thorough, stand alone memory test for Intel/AMD x86 architecture systems. BIOS based m
💻 C
📖 第 1 页 / 共 4 页
字号:
	/* Check if DRAM_NERR contains data */	if (nerr & 3) {		pci_conf_write(ctrl.bus, ctrl.dev, ctrl.fn +1, 0x82, 1, nerr & 3);	}	}static void setup_i440gx(void){	static const int ddim[] = { ECC_NONE, ECC_DETECT, ECC_CORRECT, ECC_CORRECT };	unsigned long nbxcfg;	/* Fill in the correct memory capabilites */	pci_conf_read(ctrl.bus, ctrl.dev, ctrl.fn, 0x50, 4, &nbxcfg);	ctrl.cap = ECC_CORRECT;	ctrl.mode = ddim[(nbxcfg >> 7)&3];}static void poll_i440gx(void){	unsigned long errsts;	unsigned long page;	int bits;	/* Read the error status */	pci_conf_read(ctrl.bus, ctrl.dev, ctrl.fn, 0x91, 2, &errsts);	if (errsts & 0x11) {		unsigned long eap;		/* Read the error location */		pci_conf_read(ctrl.bus, ctrl.dev, ctrl.fn, 0x80, 4, &eap);		/* Parse the error location and error type */		page = (eap & 0xFFFFF000) >> 12;		bits = 0;		if (eap &3) {			bits = ((eap & 3) == 1)?1:2;		}		if (bits) {			/* Report the error */			print_ecc_err(page, 0, bits==1?1:0, 0, 0);		}		/* Clear the error status */		pci_conf_write(ctrl.bus, ctrl.dev, ctrl.fn, 0x91, 2, 0x11);		pci_conf_write(ctrl.bus, ctrl.dev, ctrl.fn, 0x80, 4, 3);	}	}static void setup_i840(void){	static const int ddim[] = { ECC_NONE, ECC_RESERVED, ECC_CORRECT, ECC_CORRECT };	unsigned long mchcfg;	/* Fill in the correct memory capabilites */	pci_conf_read(ctrl.bus, ctrl.dev, ctrl.fn, 0x50, 2, &mchcfg);	ctrl.cap = ECC_CORRECT;	ctrl.mode = ddim[(mchcfg >> 7)&3]; }static void poll_i840(void){	unsigned long errsts;	unsigned long page;	unsigned long syndrome;	int channel;	int bits;	/* Read the error status */	pci_conf_read(ctrl.bus, ctrl.dev, ctrl.fn, 0xC8, 2, &errsts);	if (errsts & 3) {		unsigned long eap;		unsigned long derrctl_sts;		/* Read the error location */		pci_conf_read(ctrl.bus, ctrl.dev, ctrl.fn, 0xE4, 4, &eap);		pci_conf_read(ctrl.bus, ctrl.dev, ctrl.fn, 0xE2, 2, &derrctl_sts);		/* Parse the error location and error type */		page = (eap & 0xFFFFF800) >> 11;		channel = eap & 1;		syndrome = derrctl_sts & 0xFF;		bits = ((errsts & 3) == 1)?1:2;		/* Report the error */		print_ecc_err(page, 0, bits==1?1:0, syndrome, channel);		/* Clear the error status */		pci_conf_write(ctrl.bus, ctrl.dev, ctrl.fn, 0xE2, 2, 3 << 10);		pci_conf_write(ctrl.bus, ctrl.dev, ctrl.fn, 0xC8, 2, 3);	}}static void setup_i875(void){	long *ptr;	ulong dev0, dev6 ;	/* Fill in the correct memory capabilites */	ctrl.cap = ECC_CORRECT;	ctrl.mode = ECC_NONE;		/* From my article : http://www.x86-secret.com/articles/tweak/pat/patsecrets-2.htm */	/* Activate Device 6 */	pci_conf_read( 0, 0, 0, 0xF4, 1, &dev0);	pci_conf_write( 0, 0, 0, 0xF4, 1, (dev0 | 0x2));		/* Activate Device 6 MMR */	pci_conf_read( 0, 6, 0, 0x04, 2, &dev6);	pci_conf_write( 0, 6, 0, 0x04, 2, (dev6 | 0x2));		/* Read the MMR Base Address & Define the pointer*/	pci_conf_read( 0, 6, 0, 0x10, 4, &dev6);	ptr=(long*)(dev6+0x68);		if (((*ptr >> 18)&1) == 1) { ctrl.mode = ECC_CORRECT; }		/* Reseting state */	pci_conf_write(ctrl.bus, ctrl.dev, ctrl.fn, 0xC8, 2,  0x81);	}static void setup_i925(void){	// Activate MMR I/O	ulong dev0;		// Current stepping of i925X does not support ECC	ctrl.cap = ECC_CORRECT;	ctrl.mode = ECC_NONE;		pci_conf_read( 0, 0, 0, 0x54, 4, &dev0);		dev0 = dev0 | 0x10000000;	pci_conf_write( 0, 0, 0, 0x54, 4, dev0);		}static void poll_i875(void){	unsigned long errsts;	unsigned long page;	unsigned long des;	unsigned long syndrome;	int channel;	int bits;	/* Read the error status */	pci_conf_read(ctrl.bus, ctrl.dev, ctrl.fn, 0xC8, 2, &errsts);	if (errsts & 0x81)  {		unsigned long eap;		unsigned long derrsyn;		/* Read the error location, syndrome and channel */		pci_conf_read(ctrl.bus, ctrl.dev, ctrl.fn, 0x58, 4, &eap);		pci_conf_read(ctrl.bus, ctrl.dev, ctrl.fn, 0x5C, 1, &derrsyn);		pci_conf_read(ctrl.bus, ctrl.dev, ctrl.fn, 0x5D, 1, &des);				/* Parse the error location and error type */		page = (eap & 0xFFFFF000) >> 12;		syndrome = derrsyn;		channel = des & 1;		bits = (errsts & 0x80)?0:1;		/* Report the error */		print_ecc_err(page, 0, bits, syndrome, channel);		/* Clear the error status */		pci_conf_write(ctrl.bus, ctrl.dev, ctrl.fn, 0xC8, 2,  0x81);	}}static void setup_i845(void){	static const int ddim[] = { ECC_NONE, ECC_RESERVED, ECC_CORRECT, ECC_RESERVED };	unsigned long drc;	/* Fill in the correct memory capabilites */	pci_conf_read(ctrl.bus, ctrl.dev, ctrl.fn, 0x7C, 4, &drc);	ctrl.cap = ECC_CORRECT;	ctrl.mode = ddim[(drc >> 20)&3];}static void poll_i845(void){	unsigned long errsts;	unsigned long page, offset;	unsigned long syndrome;	int bits;	/* Read the error status */	pci_conf_read(ctrl.bus, ctrl.dev, ctrl.fn, 0xC8, 2, &errsts);	if (errsts & 3) {		unsigned long eap;		unsigned long derrsyn;		/* Read the error location */		pci_conf_read(ctrl.bus, ctrl.dev, ctrl.fn, 0x8C, 4, &eap);		pci_conf_read(ctrl.bus, ctrl.dev, ctrl.fn, 0x86, 1, &derrsyn);		/* Parse the error location and error type */		offset = (eap & 0xFE) << 4;		page = (eap & 0x3FFFFFFE) >> 8;		syndrome = derrsyn;		bits = ((errsts & 3) == 1)?1:2;		/* Report the error */		print_ecc_err(page, offset, bits==1?1:0, syndrome, 0);		/* Clear the error status */		pci_conf_write(ctrl.bus, ctrl.dev, ctrl.fn, 0xC8, 2, 3);	}}static void setup_i820(void){	static const int ddim[] = { ECC_NONE, ECC_RESERVED, ECC_CORRECT, ECC_CORRECT };	unsigned long mchcfg;	/* Fill in the correct memory capabilites */	pci_conf_read(ctrl.bus, ctrl.dev, ctrl.fn, 0xbe, 2, &mchcfg);	ctrl.cap = ECC_CORRECT;	ctrl.mode = ddim[(mchcfg >> 7)&3];}static void poll_i820(void){	unsigned long errsts;	unsigned long page;	unsigned long syndrome;	int bits;	/* Read the error status */	pci_conf_read(ctrl.bus, ctrl.dev, ctrl.fn, 0xC8, 2, &errsts);	if (errsts & 3) {		unsigned long eap;		/* Read the error location */		pci_conf_read(ctrl.bus, ctrl.dev, ctrl.fn, 0xc4, 4, &eap);		/* Parse the error location and error type */		page = (eap & 0xFFFFF000) >> 4;		syndrome = eap & 0xFF;		bits = ((errsts & 3) == 1)?1:2;		/* Report the error */		print_ecc_err(page, 0, bits==1?1:0, syndrome, 0);		/* Clear the error status */		pci_conf_write(ctrl.bus, ctrl.dev, ctrl.fn, 0xC8, 2, 3);	}}static void setup_i850(void){	static const int ddim[] = { ECC_NONE, ECC_RESERVED, ECC_CORRECT, ECC_RESERVED };	unsigned long mchcfg;	/* Fill in the correct memory capabilites */	pci_conf_read(ctrl.bus, ctrl.dev, ctrl.fn, 0x50, 2, &mchcfg);	ctrl.cap = ECC_CORRECT;	ctrl.mode = ddim[(mchcfg >> 7)&3]; }static void poll_i850(void){	unsigned long errsts;	unsigned long page;	unsigned long syndrome;	int channel;	int bits;	/* Read the error status */	pci_conf_read(ctrl.bus, ctrl.dev, ctrl.fn, 0xC8, 2, &errsts);	if (errsts & 3) {		unsigned long eap;		unsigned long derrctl_sts;		/* Read the error location */		pci_conf_read(ctrl.bus, ctrl.dev, ctrl.fn, 0xE4, 4, &eap);		pci_conf_read(ctrl.bus, ctrl.dev, ctrl.fn, 0xE2, 2, &derrctl_sts);		/* Parse the error location and error type */		page = (eap & 0xFFFFF800) >> 11;		channel = eap & 1;		syndrome = derrctl_sts & 0xFF;		bits = ((errsts & 3) == 1)?1:2;		/* Report the error */		print_ecc_err(page, 0, bits==1?1:0, syndrome, channel);		/* Clear the error status */		pci_conf_write(ctrl.bus, ctrl.dev, ctrl.fn, 0xC8, 2, errsts & 3);	}}static void setup_i860(void){	static const int ddim[] = { ECC_NONE, ECC_RESERVED, ECC_CORRECT, ECC_RESERVED };	unsigned long mchcfg;	unsigned long errsts;	/* Fill in the correct memory capabilites */	pci_conf_read(ctrl.bus, ctrl.dev, ctrl.fn, 0x50, 2, &mchcfg);	ctrl.cap = ECC_CORRECT;	ctrl.mode = ddim[(mchcfg >> 7)&3]; 	/* Clear any prexisting error reports */	pci_conf_read(ctrl.bus, ctrl.dev, ctrl.fn, 0xC8, 2, &errsts);		pci_conf_write(ctrl.bus, ctrl.dev, ctrl.fn, 0xC8, 2, errsts & 3);}static void poll_i860(void){	unsigned long errsts;	unsigned long page;	unsigned char syndrome;	int channel;	int bits;	/* Read the error status */	pci_conf_read(ctrl.bus, ctrl.dev, ctrl.fn, 0xC8, 2, &errsts);	if (errsts & 3) {		unsigned long eap;		unsigned long derrctl_sts;		/* Read the error location */		pci_conf_read(ctrl.bus, ctrl.dev, ctrl.fn, 0xE4, 4, &eap);		pci_conf_read(ctrl.bus, ctrl.dev, ctrl.fn, 0xE2, 2, &derrctl_sts);		/* Parse the error location and error type */		page = (eap & 0xFFFFFE00) >> 9;		channel = eap & 1;		syndrome = derrctl_sts & 0xFF;		bits = ((errsts & 3) == 1)?1:2;		/* Report the error */		print_ecc_err(page, 0, bits==1?1:0, syndrome, channel);		/* Clear the error status */		pci_conf_write(ctrl.bus, ctrl.dev, ctrl.fn, 0xC8, 2, errsts & 3);	}}/* ------------------ Here the code for FSB detection ------------------ *//* --------------------------------------------------------------------- */static float athloncoef[] = {11, 11.5, 12.0, 12.5, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5, 10.0, 10.5};static float athloncoef2[] = {12, 19.0, 12.0, 20.0, 13.0, 13.5, 14.0, 21.0, 15.0, 22, 16.0, 16.5, 17.0, 18.0, 23.0, 24.0};static int p4model1ratios[] = {16, 17, 18, 19, 20, 21, 22, 23, 8, 9, 10, 11, 12, 13, 14, 15};static int getP4PMmultiplier(void){	unsigned int msr_lo, msr_hi;	int coef;	/* Find multiplier (by MSR) */		if (cpu_id.type == 6) {			rdmsr(0x2A, msr_lo, msr_hi);		coef = (msr_lo >> 22) & 0x1F;	} 	else 	{		if (cpu_id.model < 2) 		{	  	rdmsr(0x2A, msr_lo, msr_hi);	  	coef = (msr_lo >> 8) & 0xF;	  	coef = p4model1ratios[coef];		} 		else 		{	  	rdmsr(0x2C, msr_lo, msr_hi);	  	coef = (msr_lo >> 24) & 0x1F;		}	}	return coef;}static void poll_fsb_amd64(void) {	unsigned int mcgsrl;	unsigned int mcgsth;	unsigned long fid, temp2;	unsigned long dramchr;	double clockratio;	double dramclock;	float coef;	coef = 10;		/* First, got the FID by MSR */	/* First look if Cool 'n Quiet is supported to choose the best msr */	if (((cpu_id.pwrcap >> 1) & 1) == 1) {	rdmsr(0xc0010042, mcgsrl, mcgsth);	fid = (mcgsrl & 0x3F);	} else {	rdmsr(0xc0010015, mcgsrl, mcgsth);	fid = ((mcgsrl >> 24)& 0x3F);	}		/* Extreme simplification. */	coef = ( fid / 2 ) + 4.0;		/* Support for .5 coef */ 	if ((fid & 1) == 1) { coef = coef + 0.5; } 		/* Next, we need the clock ratio */	pci_conf_read(0, 24, 2, 0x94, 4, &dramchr);	temp2 = (dramchr >> 20) & 0x7;	clockratio = 1;		switch (temp2) {		case 0x0:			clockratio = 0.5;			break;		case 0x2:			clockratio = 0.66666666666;			break;		case 0x4:			clockratio = 0.75;			break;		case 0x5:			clockratio = 0.83333333333;			break;		case 0x7:			clockratio = 1;			break;		} 				/* Compute the final DRAM Clock */	dramclock = ((extclock /1000) / coef) * clockratio;		/* ...and print */	print_fsb_info(dramclock, "RAM : ");	}static void poll_fsb_i925(void) {	double dramclock, dramratio, fsb;	unsigned long mchcfg, mchcfg2, dev0;	int coef = getP4PMmultiplier();	long *ptr;			/* Find dramratio */	pci_conf_read( 0, 0, 0, 0x44, 4, &dev0);	ptr=(long*)(dev0+0xC00);	mchcfg = *ptr & 0xFFFF;	dramratio = 1;

⌨️ 快捷键说明

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