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

📄 t_sdram.c

📁 PNX系列设备驱动 PNX系列设备驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
 * of the top64 bug
 */
start_p = sdram_virt_base + (blkOffset/sizeof(int32)) ;
end_p = (int32 *) (((char *) sdram_virt_base) + sdram_len - 64) ;
errors = 0 ;

/*
 * Save current burst mode
 */
biu_cntl_save = MMIO(BIU_CNTL) ;

for ( pass = 0; (errors == 0) && (pass < 100) ; pass++) {

	/*
	 * Disable burst mode
	 */
	MMIO(BIU_CNTL) = biu_cntl_save | 0x2 ;

	/*
	 * Initialize all memory to zero
	 */
	printf("Pass %d, Initializing Memory\n", pass);

	ipp = sdram_virt_base;
	while (ipp < end_p)
		{
		*ipp++ = 0;
		}
	ipp = start_p;

	while (ipp < end_p)
		{
		obs_val = *ipp ;
		if ( obs_val != 0 )
			{
			MMIO(ICLEAR) = 0;  /* LA Trigger */
			printf("Init error:    addr %08x exp %08x obs %08x xor %08x\n",
				SDRAM_VA_TO_PA(ipp), 0, obs_val, obs_val) ;
			errors++;
			}
		ipp++ ;
		}

	if ( errors >= errors_max )
		{
		break;
		}

	/*
	 * Restore old burst mode
	 */
	MMIO(BIU_CNTL) = biu_cntl_save ;

	/*
	 * Write/verify data patterns on block by block basis
	 */
	printf("Write/Verify Memory\n");

	blk_p = start_p ;
	while (errors == 0)
		{
		/*
		 * Set last location to test
		 * (and make sure we don't overrun end of region)
		 */
		blk_end_p = blk_p + (blkSize/sizeof(int32)) ;
		if (blk_end_p >= end_p)
			{
			last_p = blk_p ;
			break ;
			}

		/*
		 * Write data
		 */
		ipp = blk_p ;
		exp_val = SDRAM_VA_TO_PA(ipp) ;
		while (ipp < blk_end_p)
			{
			*ipp++ = exp_val ;
			exp_val += sizeof(int32) ;
			}

		/*
		 * Verify data
		 */
		ipp = blk_p ;
		exp_val = SDRAM_VA_TO_PA(ipp) ;
		while (ipp < blk_end_p)
			{
			obs_val = *ipp ;
			if (obs_val != exp_val)
				{
				errors++ ;
				MMIO(ICLEAR) = 0;  /* LA Trigger */
				printf("verify error:    addr %08x exp %08x obs %08x xor %08x\n",
					exp_val, exp_val, obs_val, exp_val ^ obs_val) ;
				break;
				}
			ipp++ ;
			exp_val += sizeof(int32) ;
			}

		/*
		 * Increment block pointer
		 */
		blk_p += (blkSize/sizeof(int32)) ;
		}

	if ( errors >= errors_max )
		{
		break;
		}

	/*
	 * Disable burst mode
	 */
	MMIO(BIU_CNTL) = biu_cntl_save | 0x2 ;

	/*
	 * Final pass through memory to make sure
 	 * no writes were misplaced
	 *
	 * Note that this requires three loops:
	 *	test zeroes before first block
	 *	test addr@addr for blocks
	 *	test zeroes after last block
	 */
	printf("Reading Memory\n");

	ipp = sdram_virt_base ;
	while ((errors == 0) && (ipp < start_p))
		{
		obs_val = *ipp ;
		if (obs_val != 0)
			{
			MMIO(ICLEAR) = 0;  /* LA Trigger */
			errors++ ;
			printf("read error    addr %08x exp %08x obs %08x xor %08x\n",
				SDRAM_VA_TO_PA(ipp), 0, obs_val, obs_val) ;
			break;
			}
		ipp++ ;
		}

	exp_val = SDRAM_VA_TO_PA(ipp) ;
	while ((errors == 0) && (ipp < last_p))
		{
		obs_val = *ipp ;
		if (obs_val != exp_val)
			{
			MMIO(ICLEAR) = 0;  /* LA Trigger */
			errors++ ;
			printf("read error    addr %08x exp %08x obs %08x xor %08x\n",
				exp_val, exp_val, obs_val, exp_val ^ obs_val) ;
			break;
			}
		ipp++ ;
		exp_val += sizeof(int32) ;
		}

	while ((errors == 0) && (ipp < end_p))
		{
		obs_val = *ipp ;
		if (obs_val != 0)
			{
			MMIO(ICLEAR) = 0;  /* LA Trigger */
			errors++ ;
			printf("read error    addr %08x exp %08x obs %08x xor %08x\n",
				SDRAM_VA_TO_PA(ipp), 0, obs_val, obs_val) ;
			break;
			}
		ipp++ ;
		}
	}

/*
 * Restore old burst mode
 */
MMIO(BIU_CNTL) = biu_cntl_save ;

return errors;
}

/*----------------------------------------------------------------------
 * 32 bit aligned x86 to sdram burst mode stress test
 */
int
burst32(
int32	burst_bytes,
int32	offset_bytes,
int	pass_max
)
{
int32		*region_start ;
int32		*region_end ;
int32		*blk_start ;
int32		*blk_end ;
int32		*preload_start ;
int32		*preload_end ;
int32		exp_blk ;
int32		exp_preload ;
int		errors ;
int		pass ;
int		report ;
int		report_interval ;
int32		biu_cntl_save ;
int32		biu_cntl_burst_on ;
int32		biu_cntl_burst_off ;

errors = 0 ;

printf("x86 to sdram burst write test. burst_bytes 0x%x burst_offset 0x%x pass_max 0x%x\n", 
	   burst_bytes, offset_bytes, pass_max) ;

/*
 * setup test boundaries
 *
 */
region_start = sdram_virt_base + ((sdram_len/2)/sizeof(int32)) ;
region_end = region_start + (256/sizeof(int32)) ;
preload_start = region_start + ((sdram_len/4)/sizeof(int32)) ;
preload_end = preload_start + (64/sizeof(int32)) ;
blk_start = region_start + (64/sizeof(int32)) + (offset_bytes/sizeof(int32)) ;
blk_end = blk_start + (burst_bytes/sizeof(int32)) ;

exp_blk = 0x40000000 | (((int32) SDRAM_VA_TO_PA(blk_start)) & 0xff) ;
exp_preload = 0x80000000 | (((int32) SDRAM_VA_TO_PA(preload_start)) & 0xff) ;

printf("burst mode test, 32 bit aligned\n") ;
printf("    region  %08x %08x\n",
	SDRAM_VA_TO_PA(region_start),
	SDRAM_VA_TO_PA(region_end)) ;
printf("    preload %08x %08x\n", 
	SDRAM_VA_TO_PA(preload_start),
	SDRAM_VA_TO_PA(preload_end)) ;
printf("    blk     %08x %08x\n", 
	SDRAM_VA_TO_PA(blk_start),
	SDRAM_VA_TO_PA(blk_end)) ;

errors = 0 ;

/*
 * Save current burst mode
 */
biu_cntl_save = MMIO(BIU_CNTL) ;
biu_cntl_burst_on = biu_cntl_save & ~0x2 ;
biu_cntl_burst_off = biu_cntl_save | 0x2 ;

report_interval = pass_max / 100 ;
report = report_interval ;
pass = 0 ;
while ((errors == 0) && (pass < pass_max))
	{
	/*
	 * Disable burst mode
	 */
	MMIO(BIU_CNTL) = biu_cntl_burst_off ;

	/*
	 * Initialize region to 0
	 */
	errors += fill_verify32("region init", region_start, region_end,
				0, 0) ;
	if ( errors >= errors_max )
		{
		break;
		}

	/*
	 * Initialize preload to pattern
	 */
	errors += fill_verify32("preload init", preload_start, preload_end,
				exp_preload, sizeof(int32)) ;
	if ( errors >= errors_max )
		{
		break;
		}

	/*
	 * Write/verify data patterns on block by block basis
	 */
	MMIO(BIU_CNTL) = biu_cntl_burst_on ;
	errors += fill_verify32("block test", blk_start, blk_end,
				exp_blk, sizeof(int32)) ;
	MMIO(BIU_CNTL) = biu_cntl_burst_off ;
	if ( errors >= errors_max )
		{
		break;
		}

	/*
	 * Final pass through memory to make sure
 	 * no writes were misplaced
	 *
	 * Note that this requires three loops:
	 *	test zeroes before first block
	 *	test addr@addr for blocks
	 *	test zeroes after last block
	 */
	errors += verify32("preload final", preload_start, preload_end,
				exp_preload, sizeof(int32)) ;
	if ( errors >= errors_max )
		{
		break;
		}
	errors += verify32("region_low", region_start, blk_start, 0, 0) ;
	if ( errors >= errors_max )
		{
		break;
		}
	errors += verify32("block final", blk_start, blk_end,
				exp_blk, sizeof(int32)) ;
	if ( errors >= errors_max )
		{
		break;
		}
	errors += verify32("region_high", blk_end, region_end, 0, 0) ;
	if ( errors >= errors_max )
		{
		break;
		}

	/*
	 * pass reporting
	 */
	if (report == 0)
		{
		printf("    pass %10d errors %10d\r", pass, errors) ;
		report = report_interval ;
		}
	report-- ;
	pass++ ;
	}
printf("    burst32 done - pass %10d errors %10d\n", pass, errors) ;

/*
 * Restore old burst mode
 */
MMIO(BIU_CNTL) = biu_cntl_save ;

return errors;
}

/*----------------------------------------------------------------------
 * Fill and verify 32 bit aligned region
 */

int
fill_verify32(
char	*name,
int32	*start_p,
int32	*end_p,
int32	exp_start,
int32	exp_increment
)

{
fill32(name, start_p, end_p, exp_start, exp_increment) ;
return verify32(name, start_p, end_p, exp_start, exp_increment) ;
}

/*----------------------------------------------------------------------
 * Fill 32 bit aligned region
 */

void
fill32(
char	*name,
int32	*start_p,
int32	*end_p,
int32	exp_start,
int32	exp_increment
)

{
int32	*ipp ;
int32	exp_val ;

if (trace) printf("    filling %s from %08x to %08x, pattern %08x increment %08x\n",
		name, 
		SDRAM_VA_TO_PA(start_p),
		SDRAM_VA_TO_PA(end_p),
		exp_start,
		exp_increment);

ipp = start_p ;
exp_val = exp_start ;
while (ipp < end_p)
	{
	*ipp++ = exp_val ;
	exp_val += exp_increment ;
	}
}

/*----------------------------------------------------------------------
 * Verify 32 bit aligned region
 */

int
verify32(
char	*name,
int32	*start_p,
int32	*end_p,
int32	exp_start,
int32	exp_increment
)

{
int32	*ipp ;
int32	exp_val ;
int32	obs_val ;
int	errors ;

if (trace) printf("    verifying %s from %08x to %08x, pattern %08x increment %08x\n",
		name, 
		SDRAM_VA_TO_PA(start_p),
		SDRAM_VA_TO_PA(end_p),
		exp_start,
		exp_increment);

errors = 0 ;
ipp = start_p;
exp_val = exp_start ;
while ((errors < errors_max) && (ipp < end_p))
	{
	obs_val = *ipp ;
	if ( obs_val != exp_val )
		{
		MMIO(ICLEAR) = 0;  /* LA Trigger */
		errors++;
		printf("Error %s:    addr %08x exp %08x obs %08x xor %08x\n",
			name,
			SDRAM_VA_TO_PA(ipp),
			exp_val, obs_val, exp_val ^ obs_val) ;
		obs_val = *ipp ;
		if ( obs_val != exp_val )
			{
			printf("Error %s:    addr %08x exp %08x obs %08x xor %08x\n",
				name,
				SDRAM_VA_TO_PA(ipp),
				exp_val, obs_val, exp_val ^ obs_val) ;
			}
		}
	ipp++ ;
	exp_val += exp_increment ;
	}
return errors ;
}

/*----------------------------------------------------------------------*/

⌨️ 快捷键说明

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