File:  [Power 6/32 Unix Tahoe 4.2BSD] / cci / d / mem / test6.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Sun Jul 28 12:24:19 2019 UTC (6 years, 11 months ago) by root
Branches: bsd, MAIN
CVS tags: v12b, v121, HEAD
Power 6/32 Unix version 1.2b

/* 
	This test Ecc Memory bits  Test
*/
#include "definitions"
#define	BEVEC	128			/* offset in scb block for Bus error*/
#define	ecczero	0x00000028
#define	eccone	0x0000012d
#define MEMUNIT 64 * 1024
#include "test4.h"

extern struct OPTIONS OPTIONS;
extern	long	maxmem,endprog,scb;
extern	long	eccloc(), cycle,test_no,errcnt;
extern	long	loop_flg,hlt_flg,prt_flg;
extern long ber1, ber2;

subtest6()
{
  register long *mcr = (long *)0xffffb000;
  register long *mer = (long *)0xffffb020;
  register long *mcbr = (long *)0xffffb008;
  register long *addr, bit, delay;
  long counter, oldstatus, data, code, wcnt, cnt, actual, eccloc();
  char *msg;

	if (OPTIONS.header)
	      writes("\n** Subtest6 : ECC single (check) bit error detection.");
	 oldstatus = *mcr;	 	/* save old status */
	 data = ecczero;		/* data to force a zero ecc */
	 addr = (long *)(((int )endprog + MEMUNIT) & 0xffff0000);
	 counter = 0;
	 for(wcnt=0;addr <= (long *)maxmem;addr++, wcnt++)  
		{
		if (++counter == 5120) {
			counter = 0;
			writes(".");
			}
		for(bit=1,cnt=7;(cnt--); bit <<= 1) {
repeat:
	 		*mcr = 4;  		/* Turn ON diag_write */ 
			*mcbr = 0;		/* Clear check bits in MCBR */
			*addr = data;		/* Write Data with check */
						/* bits taken from MCBR */
			*mcr = 0x1;		/* Turn ON ECC detection */
			delay = *mcr;
			actual = *addr;		/* Read data back */
			*mcr = 0x80;		/* Turn OFF ECC,clear error */
			delay = *mcr;
			if (actual != data) {   /* check data  */
			  	msg = "\nData Bits Test with ECC diagnostic Write enable";
			  	error4(msg,addr,data,actual);
			  	if (loop_flg) goto repeat;
			  		else if (hlt_flg) Halt();
				}
			*mcbr = bit;		/* Set check bits in MCBR */
	 		*mcr = 4;  		/* Turn ON diag_write */ 
			delay = *mcr;
			*addr = data;		/* Write data with check */
						/* bits from MCBR */
	 		*mcr = 0;  		/* Turn OFF diag_write */ 
			delay = *mcr;
		  	code = eccloc(addr);   /* Read back data, exp. buser */

		  	if (!code) { 
				*mcr = 0;	/* Turn OFF ECC logic */
			  	writes("\nExpected BUSER didnot happen");
			  	if (loop_flg) goto repeat;
			  		else if (hlt_flg) Halt();
			  			else continue;
				}			
		  	if (code == -2) { 
				*mcr = 0;	/* Turn OFF ECC logic */
			        writes("\nWrong Buser parameter,DCE expected");
			        wr_mibreg();
			  	if (loop_flg) goto repeat;
			  		else if (hlt_flg) Halt();
			  			else continue;
				}			
			actual = (tmp_mcbr >> 23) & 0x7f;
			if ((actual != bit) && prt_flg ) {
			  	*mcr = 0;	/* Turn OFF ECC logic */
			  	msg = "\nSyndrome Bits error <Check Bits>";
			        wr_mibreg();
			  	error4(msg,addr,bit,actual);
				writes("\nNumber Lwords passed ");
				writed(wcnt); writes("\n");
			  	if (loop_flg) goto repeat;
			  		else if (hlt_flg) Halt();
				}
			*addr = data;      	/* reset test cell */
			for(delay=0x100;(delay>0);--delay);
		}
	}
	*mcr = oldstatus;	 	/* old status */
}


error4(msg,addr,exp,actual)
char *msg;
long addr, actual;
{
	writes(msg);
	writes("\n      Test    Address   Expected    Actual    Count   Cycle \n");
	writes("   ");
	pt_hex(test_no,8);writes("  ");
	pt_hex(addr,8);writes("   ");
	pt_hex(exp,8);writes("  ");
	pt_hex(actual,8);writes("  ");
	pt_hex(errcnt++,8);writes(" ");
	pt_hex(cycle,8);
	locate(addr,exp,actual);
}

Halt()
{
	asm("halt");
}

/*
	Routine to Init. memory + ECC
*/
long I_ecc = 0;
i_ecc()
{
  register long *mcr = (long *)0xffffb000;
  register long *mcbr = (long *)0xffffb008;
  register long *addr, delay;

	 if (I_ecc) return;
		else I_ecc=1;
	 writes("\nInitializing memory + ECC..\n");
	 addr = (long *)(((int )endprog + MEMUNIT) & 0xffff0000);
	 for(;addr <= (long *)maxmem;addr++)  {  
		*mcbr = 0xc;		/* Valid check bits for data 0 */
	 	*mcr = 4;  		/* Turn ON diag_write */ 
		*addr = 0;	/* Write Data with check bit from MCBR */
	 	*mcr = 0;  		/* Turn OFF diag_write */ 
		for(delay=0x5;(delay>0);--delay);
		}
	 *mcr = 0;  			/* Turn OFF diag_write */ 
	 writes("Done..\n");
}


unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.