662 lines
24 KiB
C
662 lines
24 KiB
C
#include <cvg.h>
|
|
#include <fxpci.h>
|
|
#include <sst1init.h>
|
|
#include <3dfx.h>
|
|
#include <glide.h>
|
|
|
|
#include "FaultSources.h"
|
|
#include "Utils.h"
|
|
#include "Draw.h"
|
|
|
|
#include "Test_Data.h"
|
|
|
|
static unsigned long long
|
|
RenderTest( sst1DeviceInfoStruct* devInfo,
|
|
FxU32* sst,
|
|
SstRegs *sstregs,
|
|
const char ucNumTMU,
|
|
const FxU32 mem,
|
|
const FxU32 value1,
|
|
const FxU32 value2)
|
|
{
|
|
|
|
/* set the Init0 register to enable ? MBytes of memory */
|
|
// info->tmuInit0[tmu] = SST_TREXINIT0_DEFAULT | BIT(20); // BIT(20) seems to use bank 2...even if TMU mem is <= 2MB
|
|
|
|
devInfo->tmuInit0[(int)ucNumTMU] = SST_TREXINIT0_DEFAULT ;
|
|
|
|
sst1InitIdle(sst);
|
|
ISET(SST_TREX(sstregs,ucNumTMU)->trexInit0, devInfo->tmuInit0[(int)ucNumTMU]);
|
|
sst1InitIdle(sst);
|
|
/*
|
|
sst1InitIdle(sst);
|
|
ISET(SST_TREX(sstregs,ucNumTMU)->trexInit0, 0x5000 | (devInfo->tmuInit0[(int)ucNumTMU] & ~0x7000));
|
|
sst1InitIdle(sst);
|
|
*/
|
|
ISET(sstregs->texBaseAddr, (mem>>3)); /* set to mem addr */
|
|
|
|
// First line, to use bits 0..31
|
|
volatile const FxU32 *texAddr = (ucNumTMU<<(21-2)) + (((FxU32)0)<<(17-2)) + (FxU32 *)SST_TEX_ADDRESS(sstregs);
|
|
ISET(texAddr[0], value1); /* write a value */
|
|
ISET(texAddr[1], value1+1); /* write a value */
|
|
ISET(texAddr[2], value1+2); /* write a value */
|
|
ISET(texAddr[3], value1+3); /* write a value */
|
|
|
|
// Second line, to use bits 32..63
|
|
volatile const FxU32 *texAddr2 = (ucNumTMU<<(21-2)) + (((FxU32)0)<<(17-2)) + (1<<(9-2))+ (FxU32 *)SST_TEX_ADDRESS(sstregs);
|
|
ISET(texAddr2[0], value2); /* write a value */
|
|
ISET(texAddr2[1], value2+1); /* write a value */
|
|
ISET(texAddr2[2], value2+2); /* write a value */
|
|
ISET(texAddr2[3], value2+3); /* write a value */
|
|
|
|
drawTriangle(sstregs,0,0,10); /* draw a 10x10 triangle */
|
|
|
|
// First line pixels addresses
|
|
const FxU32 L1_1 = IGET(sst[(SST_LFB_ADDR>>2)+0]);
|
|
const FxU32 L1_2 = IGET(sst[(SST_LFB_ADDR>>2)+1]);
|
|
const FxU32 L1_3 = IGET(sst[(SST_LFB_ADDR>>2)+2]);
|
|
const FxU32 L1_4 = IGET(sst[(SST_LFB_ADDR>>2)+3]);
|
|
|
|
// Second line pixels addresses
|
|
const FxU32 L2_1 = IGET(sst[(SST_LFB_ADDR>>2)+(2048>>2)+0]);
|
|
const FxU32 L2_2 = IGET(sst[(SST_LFB_ADDR>>2)+(2048>>2)+1]);
|
|
const FxU32 L2_3 = IGET(sst[(SST_LFB_ADDR>>2)+(2048>>2)+2]);
|
|
const FxU32 L2_4 = IGET(sst[(SST_LFB_ADDR>>2)+(2048>>2)+3]);
|
|
|
|
unsigned long long NbErr = 0;
|
|
//unsigned char bErrLowBytes=0;
|
|
//unsigned char bErrHighBytes=0;
|
|
if( L1_1 != value1)
|
|
{
|
|
//printf("Error on pixel LFB[0][0] (0x%08x)!\n",mem);
|
|
NbErr++;
|
|
//bErrLowBytes=1;
|
|
}
|
|
if( L1_2 != value1+1)
|
|
{
|
|
//printf("Error on pixel LFB[0][1] (0x%08x)!\n",mem);
|
|
NbErr++;
|
|
//bErrLowBytes=1;
|
|
}
|
|
if( L1_3 != value1+2)
|
|
{
|
|
//printf("Error on pixel LFB[0][2] (0x%08x)!\n",mem);
|
|
NbErr++;
|
|
//bErrLowBytes=1;
|
|
}
|
|
if( L1_4 != value1+3)
|
|
{
|
|
//printf("Error on pixel LFB[0][3] (0x%08x)!\n",mem);
|
|
NbErr++;
|
|
//bErrLowBytes=1;
|
|
}
|
|
|
|
if( L2_1 != value2)
|
|
{
|
|
//printf("Error on pixel LFB[1][0] (0x%08x)!\n",mem);
|
|
NbErr++;
|
|
//bErrHighBytes=1;
|
|
}
|
|
if( L2_2 != value2+1)
|
|
{
|
|
//printf("Error on pixel LFB[1][1] (0x%08x)!\n",mem);
|
|
NbErr++;
|
|
//bErrHighBytes=1;
|
|
}
|
|
if( L2_3 != value2+2)
|
|
{
|
|
//printf("Error on pixel LFB[1][2] (0x%08x)!\n",mem);
|
|
NbErr++;
|
|
//bErrHighBytes=1;
|
|
}
|
|
if( L2_4 != value2+3)
|
|
{
|
|
//printf("Error on pixel LFB[1][3] (0x%08x)!\n",mem);
|
|
NbErr++;
|
|
//bErrHighBytes=1;
|
|
}
|
|
|
|
// Diag Help logs
|
|
|
|
const unsigned long ErrorMark_L1_1 = L1_1 ^ ( value1 + 0 );
|
|
const unsigned long ErrorMark_L1_2 = L1_2 ^ ( value1 + 1 );
|
|
const unsigned long ErrorMark_L1_3 = L1_3 ^ ( value1 + 2 );
|
|
const unsigned long ErrorMark_L1_4 = L1_4 ^ ( value1 + 3 );
|
|
const unsigned long ErrorMark_L2_1 = L2_1 ^ ( value2 + 0 );
|
|
const unsigned long ErrorMark_L2_2 = L2_2 ^ ( value2 + 1 );
|
|
const unsigned long ErrorMark_L2_3 = L2_3 ^ ( value2 + 2 );
|
|
const unsigned long ErrorMark_L2_4 = L2_4 ^ ( value2 + 3 );
|
|
|
|
WordBitFaultSet(ErrorMark_L1_1, 1.0/16, U9_TMU0_TF_DATA_0, U9_TMU0_TF_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L1_2, 1.0/16, U9_TMU0_TF_DATA_0, U9_TMU0_TF_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L1_3, 1.0/16, U9_TMU0_TF_DATA_0, U9_TMU0_TF_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L1_4, 1.0/16, U9_TMU0_TF_DATA_0, U9_TMU0_TF_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L2_1, 1.0/16, U9_TMU0_TF_DATA_0, U9_TMU0_TF_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L2_2, 1.0/16, U9_TMU0_TF_DATA_0, U9_TMU0_TF_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L2_3, 1.0/16, U9_TMU0_TF_DATA_0, U9_TMU0_TF_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L2_4, 1.0/16, U9_TMU0_TF_DATA_0, U9_TMU0_TF_DATA_0);
|
|
|
|
WordBitFaultSet(ErrorMark_L1_1, 1.0/16, TT_TDATA_R131, TT_TDATA_R131);
|
|
WordBitFaultSet(ErrorMark_L1_2, 1.0/16, TT_TDATA_R131, TT_TDATA_R131);
|
|
WordBitFaultSet(ErrorMark_L1_3, 1.0/16, TT_TDATA_R131, TT_TDATA_R131);
|
|
WordBitFaultSet(ErrorMark_L1_4, 1.0/16, TT_TDATA_R131, TT_TDATA_R131);
|
|
WordBitFaultSet(ErrorMark_L2_1, 1.0/16, TT_TDATA_R131, TT_TDATA_R131);
|
|
WordBitFaultSet(ErrorMark_L2_2, 1.0/16, TT_TDATA_R131, TT_TDATA_R131);
|
|
WordBitFaultSet(ErrorMark_L2_3, 1.0/16, TT_TDATA_R131, TT_TDATA_R131);
|
|
WordBitFaultSet(ErrorMark_L2_4, 1.0/16, TT_TDATA_R131, TT_TDATA_R131);
|
|
|
|
QuartetBitFaultSet(ErrorMark_L1_1 >> 0, 1.0/16, RA10_1);
|
|
QuartetBitFaultSet(ErrorMark_L1_1 >> 4, 1.0/16, RA11_1);
|
|
QuartetBitFaultSet(ErrorMark_L1_1 >> 8, 1.0/16, RA12_1);
|
|
QuartetBitFaultSet(ErrorMark_L1_1 >> 12, 1.0/16, RA13_1);
|
|
QuartetBitFaultSet(ErrorMark_L1_1 >> 16, 1.0/16, RA10_1);
|
|
QuartetBitFaultSet(ErrorMark_L1_1 >> 20, 1.0/16, RA11_1);
|
|
QuartetBitFaultSet(ErrorMark_L1_1 >> 24, 1.0/16, RA12_1);
|
|
QuartetBitFaultSet(ErrorMark_L1_1 >> 28, 1.0/16, RA13_1);
|
|
|
|
QuartetBitFaultSet(ErrorMark_L1_2 >> 0, 1.0/16, RA10_1);
|
|
QuartetBitFaultSet(ErrorMark_L1_2 >> 4, 1.0/16, RA11_1);
|
|
QuartetBitFaultSet(ErrorMark_L1_2 >> 8, 1.0/16, RA12_1);
|
|
QuartetBitFaultSet(ErrorMark_L1_2 >> 12, 1.0/16, RA13_1);
|
|
QuartetBitFaultSet(ErrorMark_L1_2 >> 16, 1.0/16, RA10_1);
|
|
QuartetBitFaultSet(ErrorMark_L1_2 >> 20, 1.0/16, RA11_1);
|
|
QuartetBitFaultSet(ErrorMark_L1_2 >> 24, 1.0/16, RA12_1);
|
|
QuartetBitFaultSet(ErrorMark_L1_2 >> 28, 1.0/16, RA13_1);
|
|
|
|
QuartetBitFaultSet(ErrorMark_L1_3 >> 0, 1.0/16, RA10_1);
|
|
QuartetBitFaultSet(ErrorMark_L1_3 >> 4, 1.0/16, RA11_1);
|
|
QuartetBitFaultSet(ErrorMark_L1_3 >> 8, 1.0/16, RA12_1);
|
|
QuartetBitFaultSet(ErrorMark_L1_3 >> 12, 1.0/16, RA13_1);
|
|
QuartetBitFaultSet(ErrorMark_L1_3 >> 16, 1.0/16, RA10_1);
|
|
QuartetBitFaultSet(ErrorMark_L1_3 >> 20, 1.0/16, RA11_1);
|
|
QuartetBitFaultSet(ErrorMark_L1_3 >> 24, 1.0/16, RA12_1);
|
|
QuartetBitFaultSet(ErrorMark_L1_3 >> 28, 1.0/16, RA13_1);
|
|
|
|
QuartetBitFaultSet(ErrorMark_L1_4 >> 0, 1.0/16, RA10_1);
|
|
QuartetBitFaultSet(ErrorMark_L1_4 >> 4, 1.0/16, RA11_1);
|
|
QuartetBitFaultSet(ErrorMark_L1_4 >> 8, 1.0/16, RA12_1);
|
|
QuartetBitFaultSet(ErrorMark_L1_4 >> 12, 1.0/16, RA13_1);
|
|
QuartetBitFaultSet(ErrorMark_L1_4 >> 16, 1.0/16, RA10_1);
|
|
QuartetBitFaultSet(ErrorMark_L1_4 >> 20, 1.0/16, RA11_1);
|
|
QuartetBitFaultSet(ErrorMark_L1_4 >> 24, 1.0/16, RA12_1);
|
|
QuartetBitFaultSet(ErrorMark_L1_4 >> 28, 1.0/16, RA13_1);
|
|
|
|
QuartetBitFaultSet(ErrorMark_L2_1 >> 0, 1.0/16, RA10_1);
|
|
QuartetBitFaultSet(ErrorMark_L2_1 >> 4, 1.0/16, RA11_1);
|
|
QuartetBitFaultSet(ErrorMark_L2_1 >> 8, 1.0/16, RA12_1);
|
|
QuartetBitFaultSet(ErrorMark_L2_1 >> 12, 1.0/16, RA13_1);
|
|
QuartetBitFaultSet(ErrorMark_L2_1 >> 16, 1.0/16, RA10_1);
|
|
QuartetBitFaultSet(ErrorMark_L2_1 >> 20, 1.0/16, RA11_1);
|
|
QuartetBitFaultSet(ErrorMark_L2_1 >> 24, 1.0/16, RA12_1);
|
|
QuartetBitFaultSet(ErrorMark_L2_1 >> 28, 1.0/16, RA13_1);
|
|
|
|
QuartetBitFaultSet(ErrorMark_L2_2 >> 0, 1.0/16, RA10_1);
|
|
QuartetBitFaultSet(ErrorMark_L2_2 >> 4, 1.0/16, RA11_1);
|
|
QuartetBitFaultSet(ErrorMark_L2_2 >> 8, 1.0/16, RA12_1);
|
|
QuartetBitFaultSet(ErrorMark_L2_2 >> 12, 1.0/16, RA13_1);
|
|
QuartetBitFaultSet(ErrorMark_L2_2 >> 16, 1.0/16, RA10_1);
|
|
QuartetBitFaultSet(ErrorMark_L2_2 >> 20, 1.0/16, RA11_1);
|
|
QuartetBitFaultSet(ErrorMark_L2_2 >> 24, 1.0/16, RA12_1);
|
|
QuartetBitFaultSet(ErrorMark_L2_2 >> 28, 1.0/16, RA13_1);
|
|
|
|
QuartetBitFaultSet(ErrorMark_L2_3 >> 0, 1.0/16, RA10_1);
|
|
QuartetBitFaultSet(ErrorMark_L2_3 >> 4, 1.0/16, RA11_1);
|
|
QuartetBitFaultSet(ErrorMark_L2_3 >> 8, 1.0/16, RA12_1);
|
|
QuartetBitFaultSet(ErrorMark_L2_3 >> 12, 1.0/16, RA13_1);
|
|
QuartetBitFaultSet(ErrorMark_L2_3 >> 16, 1.0/16, RA10_1);
|
|
QuartetBitFaultSet(ErrorMark_L2_3 >> 20, 1.0/16, RA11_1);
|
|
QuartetBitFaultSet(ErrorMark_L2_3 >> 24, 1.0/16, RA12_1);
|
|
QuartetBitFaultSet(ErrorMark_L2_3 >> 28, 1.0/16, RA13_1);
|
|
|
|
QuartetBitFaultSet(ErrorMark_L2_4 >> 0, 1.0/16, RA10_1);
|
|
QuartetBitFaultSet(ErrorMark_L2_4 >> 4, 1.0/16, RA11_1);
|
|
QuartetBitFaultSet(ErrorMark_L2_4 >> 8, 1.0/16, RA12_1);
|
|
QuartetBitFaultSet(ErrorMark_L2_4 >> 12, 1.0/16, RA13_1);
|
|
QuartetBitFaultSet(ErrorMark_L2_4 >> 16, 1.0/16, RA10_1);
|
|
QuartetBitFaultSet(ErrorMark_L2_4 >> 20, 1.0/16, RA11_1);
|
|
QuartetBitFaultSet(ErrorMark_L2_4 >> 24, 1.0/16, RA12_1);
|
|
QuartetBitFaultSet(ErrorMark_L2_4 >> 28, 1.0/16, RA13_1);
|
|
|
|
const double dScoreFront = (mem >= 0x200000) ? 0.5/4 : 1.0/4;
|
|
const double dScoreBack = (mem >= 0x200000) ? 1.0/4 : 0.5/4;
|
|
|
|
if(ucNumTMU == 0)
|
|
{
|
|
WordBitFaultSet(ErrorMark_L1_1, 1.0/16, U9_TMU0_FT_DATA_0, U9_TMU0_FT_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L1_2, 1.0/16, U9_TMU0_FT_DATA_0, U9_TMU0_FT_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L1_3, 1.0/16, U9_TMU0_FT_DATA_0, U9_TMU0_FT_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L1_4, 1.0/16, U9_TMU0_FT_DATA_0, U9_TMU0_FT_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L2_1, 1.0/16, U9_TMU0_FT_DATA_0, U9_TMU0_FT_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L2_2, 1.0/16, U9_TMU0_FT_DATA_0, U9_TMU0_FT_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L2_3, 1.0/16, U9_TMU0_FT_DATA_0, U9_TMU0_FT_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L2_4, 1.0/16, U9_TMU0_FT_DATA_0, U9_TMU0_FT_DATA_0);
|
|
|
|
MemChipDQFaultSet(ErrorMark_L1_1, dScoreFront, U14, U12);
|
|
MemChipDQFaultSet(ErrorMark_L1_2, dScoreFront, U14, U12);
|
|
MemChipDQFaultSet(ErrorMark_L1_3, dScoreFront, U14, U12);
|
|
MemChipDQFaultSet(ErrorMark_L1_4, dScoreFront, U14, U12);
|
|
|
|
MemChipDQFaultSet(ErrorMark_L2_1, dScoreFront, U18, U17);
|
|
MemChipDQFaultSet(ErrorMark_L2_2, dScoreFront, U18, U17);
|
|
MemChipDQFaultSet(ErrorMark_L2_3, dScoreFront, U18, U17);
|
|
MemChipDQFaultSet(ErrorMark_L2_4, dScoreFront, U18, U17);
|
|
|
|
MemChipDQFaultSet(ErrorMark_L1_1, dScoreBack, U23, U24);
|
|
MemChipDQFaultSet(ErrorMark_L1_2, dScoreBack, U23, U24);
|
|
MemChipDQFaultSet(ErrorMark_L1_3, dScoreBack, U23, U24);
|
|
MemChipDQFaultSet(ErrorMark_L1_4, dScoreBack, U23, U12);
|
|
|
|
MemChipDQFaultSet(ErrorMark_L2_1, dScoreBack, U25, U26);
|
|
MemChipDQFaultSet(ErrorMark_L2_2, dScoreBack, U25, U26);
|
|
MemChipDQFaultSet(ErrorMark_L2_3, dScoreBack, U25, U26);
|
|
MemChipDQFaultSet(ErrorMark_L2_4, dScoreBack, U25, U26);
|
|
|
|
TMUTexDataFaultSet(ErrorMark_L1_1, ErrorMark_L2_1, 1.0/4, U9_TMU0);
|
|
TMUTexDataFaultSet(ErrorMark_L1_2, ErrorMark_L2_2, 1.0/4, U9_TMU0);
|
|
TMUTexDataFaultSet(ErrorMark_L1_3, ErrorMark_L2_3, 1.0/4, U9_TMU0);
|
|
TMUTexDataFaultSet(ErrorMark_L1_4, ErrorMark_L2_4, 1.0/4, U9_TMU0);
|
|
|
|
TMUTexDataCtrlFaultSet( ErrorMark_L1_1,
|
|
1.0/4,
|
|
U9_TMU0_TEX_CAS0,
|
|
U9_TMU0_TEX_CAS1,
|
|
mem < 0x200000 ? U9_TMU0_TEX_RAS0 : U9_TMU0_TEX_RAS1,
|
|
U9_TMU0_TEX_WE);
|
|
TMUTexDataCtrlFaultSet( ErrorMark_L1_2,
|
|
1.0/4,
|
|
U9_TMU0_TEX_CAS0,
|
|
U9_TMU0_TEX_CAS1,
|
|
mem < 0x200000 ? U9_TMU0_TEX_RAS0 : U9_TMU0_TEX_RAS1,
|
|
U9_TMU0_TEX_WE);
|
|
TMUTexDataCtrlFaultSet( ErrorMark_L1_3,
|
|
1.0/4,
|
|
U9_TMU0_TEX_CAS0,
|
|
U9_TMU0_TEX_CAS1,
|
|
mem < 0x200000 ? U9_TMU0_TEX_RAS0 : U9_TMU0_TEX_RAS1,
|
|
U9_TMU0_TEX_WE);
|
|
TMUTexDataCtrlFaultSet( ErrorMark_L1_4,
|
|
1.0/4,
|
|
U9_TMU0_TEX_CAS0,
|
|
U9_TMU0_TEX_CAS1,
|
|
mem < 0x200000 ? U9_TMU0_TEX_RAS0 : U9_TMU0_TEX_RAS1,
|
|
U9_TMU0_TEX_WE);
|
|
TMUTexDataCtrlFaultSet( ErrorMark_L2_1,
|
|
1.0/4,
|
|
U9_TMU0_TEX_CAS2,
|
|
U9_TMU0_TEX_CAS3,
|
|
mem < 0x200000 ? U9_TMU0_TEX_RAS0 : U9_TMU0_TEX_RAS1,
|
|
U9_TMU0_TEX_WE);
|
|
TMUTexDataCtrlFaultSet( ErrorMark_L2_2,
|
|
1.0/4,
|
|
U9_TMU0_TEX_CAS2,
|
|
U9_TMU0_TEX_CAS3,
|
|
mem < 0x200000 ? U9_TMU0_TEX_RAS0 : U9_TMU0_TEX_RAS1,
|
|
U9_TMU0_TEX_WE);
|
|
TMUTexDataCtrlFaultSet( ErrorMark_L2_3,
|
|
1.0/4,
|
|
U9_TMU0_TEX_CAS2,
|
|
U9_TMU0_TEX_CAS3,
|
|
mem < 0x200000 ? U9_TMU0_TEX_RAS0 : U9_TMU0_TEX_RAS1,
|
|
U9_TMU0_TEX_WE);
|
|
TMUTexDataCtrlFaultSet( ErrorMark_L2_4,
|
|
1.0/4,
|
|
U9_TMU0_TEX_CAS2,
|
|
U9_TMU0_TEX_CAS3,
|
|
mem < 0x200000 ? U9_TMU0_TEX_RAS0 : U9_TMU0_TEX_RAS1,
|
|
U9_TMU0_TEX_WE);
|
|
|
|
}
|
|
else if(ucNumTMU == 1)
|
|
{
|
|
/* during TMU1 test, TMU0 doesnt receive any textures => ignoring these
|
|
WordBitFaultSet(ErrorMark_L1_1, 0.5, U9_TMU0_FT_DATA_0, U9_TMU0_FT_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L1_2, 0.5, U9_TMU0_FT_DATA_0, U9_TMU0_FT_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L1_3, 0.5, U9_TMU0_FT_DATA_0, U9_TMU0_FT_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L1_4, 0.5, U9_TMU0_FT_DATA_0, U9_TMU0_FT_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L2_1, 0.5, U9_TMU0_FT_DATA_0, U9_TMU0_FT_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L2_2, 0.5, U9_TMU0_FT_DATA_0, U9_TMU0_FT_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L2_3, 0.5, U9_TMU0_FT_DATA_0, U9_TMU0_FT_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L2_4, 0.5, U9_TMU0_FT_DATA_0, U9_TMU0_FT_DATA_0);
|
|
*/
|
|
|
|
// U9_TMU0_TT_DATA_x is only tested when using TMU1
|
|
WordBitFaultSet(ErrorMark_L1_1, 1.0/16, U9_TMU0_TT_DATA_0, U9_TMU0_TT_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L1_2, 1.0/16, U9_TMU0_TT_DATA_0, U9_TMU0_TT_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L1_3, 1.0/16, U9_TMU0_TT_DATA_0, U9_TMU0_TT_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L1_4, 1.0/16, U9_TMU0_TT_DATA_0, U9_TMU0_TT_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L2_1, 1.0/16, U9_TMU0_TT_DATA_0, U9_TMU0_TT_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L2_2, 1.0/16, U9_TMU0_TT_DATA_0, U9_TMU0_TT_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L2_3, 1.0/16, U9_TMU0_TT_DATA_0, U9_TMU0_TT_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L2_4, 1.0/16, U9_TMU0_TT_DATA_0, U9_TMU0_TT_DATA_0);
|
|
|
|
WordBitFaultSet(ErrorMark_L1_1, 1.0/16, U8_TMU1_TF_DATA_0, U8_TMU1_TF_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L1_2, 1.0/16, U8_TMU1_TF_DATA_0, U8_TMU1_TF_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L1_3, 1.0/16, U8_TMU1_TF_DATA_0, U8_TMU1_TF_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L1_4, 1.0/16, U8_TMU1_TF_DATA_0, U8_TMU1_TF_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L2_1, 1.0/16, U8_TMU1_TF_DATA_0, U8_TMU1_TF_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L2_2, 1.0/16, U8_TMU1_TF_DATA_0, U8_TMU1_TF_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L2_3, 1.0/16, U8_TMU1_TF_DATA_0, U8_TMU1_TF_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L2_4, 1.0/16, U8_TMU1_TF_DATA_0, U8_TMU1_TF_DATA_0);
|
|
|
|
WordBitFaultSet(ErrorMark_L1_1, 1.0/16, U8_TMU1_FT_DATA_0, U8_TMU1_FT_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L1_2, 1.0/16, U8_TMU1_FT_DATA_0, U8_TMU1_FT_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L1_3, 1.0/16, U8_TMU1_FT_DATA_0, U8_TMU1_FT_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L1_4, 1.0/16, U8_TMU1_FT_DATA_0, U8_TMU1_FT_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L2_1, 1.0/16, U8_TMU1_FT_DATA_0, U8_TMU1_FT_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L2_2, 1.0/16, U8_TMU1_FT_DATA_0, U8_TMU1_FT_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L2_3, 1.0/16, U8_TMU1_FT_DATA_0, U8_TMU1_FT_DATA_0);
|
|
WordBitFaultSet(ErrorMark_L2_4, 1.0/16, U8_TMU1_FT_DATA_0, U8_TMU1_FT_DATA_0);
|
|
|
|
MemChipDQFaultSet(ErrorMark_L1_1, dScoreFront, U13, U11);
|
|
MemChipDQFaultSet(ErrorMark_L1_2, dScoreFront, U13, U11);
|
|
MemChipDQFaultSet(ErrorMark_L1_3, dScoreFront, U13, U11);
|
|
MemChipDQFaultSet(ErrorMark_L1_4, dScoreFront, U13, U11);
|
|
|
|
MemChipDQFaultSet(ErrorMark_L2_1, dScoreFront, U16, U15);
|
|
MemChipDQFaultSet(ErrorMark_L2_2, dScoreFront, U16, U15);
|
|
MemChipDQFaultSet(ErrorMark_L2_3, dScoreFront, U16, U15);
|
|
MemChipDQFaultSet(ErrorMark_L2_4, dScoreFront, U16, U15);
|
|
|
|
MemChipDQFaultSet(ErrorMark_L1_1, dScoreBack, U27, U28);
|
|
MemChipDQFaultSet(ErrorMark_L1_2, dScoreBack, U27, U28);
|
|
MemChipDQFaultSet(ErrorMark_L1_3, dScoreBack, U27, U28);
|
|
MemChipDQFaultSet(ErrorMark_L1_4, dScoreBack, U27, U28);
|
|
|
|
MemChipDQFaultSet(ErrorMark_L2_1, dScoreBack, U29, U30);
|
|
MemChipDQFaultSet(ErrorMark_L2_2, dScoreBack, U29, U30);
|
|
MemChipDQFaultSet(ErrorMark_L2_3, dScoreBack, U29, U30);
|
|
MemChipDQFaultSet(ErrorMark_L2_4, dScoreBack, U29, U30);
|
|
|
|
TMUTexDataFaultSet(ErrorMark_L1_1, ErrorMark_L2_1, 1.0/4, U8_TMU1);
|
|
TMUTexDataFaultSet(ErrorMark_L1_2, ErrorMark_L2_2, 1.0/4, U8_TMU1);
|
|
TMUTexDataFaultSet(ErrorMark_L1_3, ErrorMark_L2_3, 1.0/4, U8_TMU1);
|
|
TMUTexDataFaultSet(ErrorMark_L1_4, ErrorMark_L2_4, 1.0/4, U8_TMU1);
|
|
|
|
TMUTexDataCtrlFaultSet( ErrorMark_L1_1,
|
|
1.0/4,
|
|
U8_TMU1_TEX_CAS0,
|
|
U8_TMU1_TEX_CAS1,
|
|
mem < 0x200000 ? U8_TMU1_TEX_RAS0 : U8_TMU1_TEX_RAS1,
|
|
U8_TMU1_TEX_WE);
|
|
TMUTexDataCtrlFaultSet( ErrorMark_L1_2,
|
|
1.0/4,
|
|
U8_TMU1_TEX_CAS0,
|
|
U8_TMU1_TEX_CAS1,
|
|
mem < 0x200000 ? U8_TMU1_TEX_RAS0 : U8_TMU1_TEX_RAS1,
|
|
U8_TMU1_TEX_WE);
|
|
TMUTexDataCtrlFaultSet( ErrorMark_L1_3,
|
|
1.0/4,
|
|
U8_TMU1_TEX_CAS0,
|
|
U8_TMU1_TEX_CAS1,
|
|
mem < 0x200000 ? U8_TMU1_TEX_RAS0 : U8_TMU1_TEX_RAS1,
|
|
U8_TMU1_TEX_WE);
|
|
TMUTexDataCtrlFaultSet( ErrorMark_L1_4,
|
|
1.0/4,
|
|
U8_TMU1_TEX_CAS0,
|
|
U8_TMU1_TEX_CAS1,
|
|
mem < 0x200000 ? U8_TMU1_TEX_RAS0 : U8_TMU1_TEX_RAS1,
|
|
U8_TMU1_TEX_WE);
|
|
TMUTexDataCtrlFaultSet( ErrorMark_L2_1,
|
|
1.0/4,
|
|
U8_TMU1_TEX_CAS2,
|
|
U8_TMU1_TEX_CAS3,
|
|
mem < 0x200000 ? U8_TMU1_TEX_RAS0 : U8_TMU1_TEX_RAS1,
|
|
U8_TMU1_TEX_WE);
|
|
TMUTexDataCtrlFaultSet( ErrorMark_L2_2,
|
|
1.0/4,
|
|
U8_TMU1_TEX_CAS2,
|
|
U8_TMU1_TEX_CAS3,
|
|
mem < 0x200000 ? U8_TMU1_TEX_RAS0 : U8_TMU1_TEX_RAS1,
|
|
U8_TMU1_TEX_WE);
|
|
TMUTexDataCtrlFaultSet( ErrorMark_L2_3,
|
|
1.0/4,
|
|
U8_TMU1_TEX_CAS2,
|
|
U8_TMU1_TEX_CAS3,
|
|
mem < 0x200000 ? U8_TMU1_TEX_RAS0 : U8_TMU1_TEX_RAS1,
|
|
U8_TMU1_TEX_WE);
|
|
TMUTexDataCtrlFaultSet( ErrorMark_L2_4,
|
|
1.0/4,
|
|
U8_TMU1_TEX_CAS2,
|
|
U8_TMU1_TEX_CAS3,
|
|
mem < 0x200000 ? U8_TMU1_TEX_RAS0 : U8_TMU1_TEX_RAS1,
|
|
U8_TMU1_TEX_WE );
|
|
}
|
|
|
|
/*
|
|
if( NbErr )
|
|
{
|
|
printf("============\n");
|
|
if(L1_1 != value1+0)
|
|
{
|
|
printf( "LFB[0][0] is 0x%08x [expected 0x%08x] !\n", L1_1, value1+0);
|
|
printf( "Faulty bits :\n");
|
|
printbin32Info(ErrorMark_L1_1, 31, 0);
|
|
printf( "\n");
|
|
}
|
|
if(L1_2 != value1+1)
|
|
{
|
|
printf( "LFB[0][1] is 0x%08x [expected 0x%08x] !\n", L1_2, value1+1);
|
|
printf( "Faulty bits :\n");
|
|
printbin32Info(ErrorMark_L1_2, 31, 0);
|
|
printf( "\n");
|
|
}
|
|
if(L1_3 != value1+2)
|
|
{
|
|
printf( "LFB[0][2] is 0x%08x [expected 0x%08x] !\n", L1_3, value1+2);
|
|
printf( "Faulty bits :\n");
|
|
printbin32Info(ErrorMark_L1_3, 31, 0);
|
|
printf( "\n");
|
|
}
|
|
if(L1_4!= value1+3)
|
|
{
|
|
printf( "LFB[0][3] is 0x%08x [expected 0x%08x] !\n", L1_4, value1+3);
|
|
printf( "Faulty bits :\n");
|
|
printbin32Info(ErrorMark_L1_4, 31, 0);
|
|
printf( "\n");
|
|
}
|
|
|
|
if(L2_1 != value2+0)
|
|
{
|
|
printf( "LFB[1][0] is 0x%08x [expected 0x%08x] !\n", L2_1, value2+0);
|
|
printf( "Faulty bits :\n");
|
|
printbin32Info(ErrorMark_L2_1, 63, 21);
|
|
printf( "\n");
|
|
}
|
|
if(L2_2 != value2+1)
|
|
{
|
|
printf( "LFB[1][1] is 0x%08x [expected 0x%08x] !\n", L2_2, value2+1);
|
|
printf( "Faulty bits :\n");
|
|
printbin32Info(ErrorMark_L2_2, 63, 21);
|
|
printf( "\n");
|
|
}
|
|
if(L2_3 != value2+2)
|
|
{
|
|
printf( "LFB[1][2] is 0x%08x [expected 0x%08x] !\n", L2_3, value2+2);
|
|
printf( "Faulty bits :\n");
|
|
printbin32Info(ErrorMark_L2_3, 63, 21);
|
|
printf( "\n");
|
|
}
|
|
if(L2_4!= value2+3)
|
|
{
|
|
printf( "LFB[1][3] is 0x%08x [expected 0x%08x] !\n", L2_4, value2+3);
|
|
printf( "Faulty bits :\n");
|
|
printbin32Info(ErrorMark_L2_4, 63, 21);
|
|
printf( "\n");
|
|
}
|
|
|
|
if(bErrLowBytes)
|
|
{
|
|
if(tmu == 0)
|
|
{
|
|
if( (ErrorMark_L1_1 & 0xFFFF)
|
|
|| (ErrorMark_L1_2 & 0xFFFF)
|
|
|| (ErrorMark_L1_3 & 0xFFFF)
|
|
|| (ErrorMark_L1_4 & 0xFFFF) )
|
|
{
|
|
printf("Check DQ connections to/from U14 (front) and U23 (back)\n");
|
|
}
|
|
|
|
if( (ErrorMark_L1_1 & 0xFFFF0000)
|
|
|| (ErrorMark_L1_2 & 0xFFFF0000)
|
|
|| (ErrorMark_L1_3 & 0xFFFF0000)
|
|
|| (ErrorMark_L1_4 & 0xFFFF0000) )
|
|
{
|
|
printf("Check DQ connections to/from U12 (front) and U24 (back)\n");
|
|
}
|
|
}
|
|
else if(tmu == 1)
|
|
{
|
|
if( (ErrorMark_L1_1 & 0xFFFF)
|
|
|| (ErrorMark_L1_2 & 0xFFFF)
|
|
|| (ErrorMark_L1_3 & 0xFFFF)
|
|
|| (ErrorMark_L1_4 & 0xFFFF) )
|
|
{
|
|
printf("Check DQ connections to/from U13 (front) and U27 (back)\n");
|
|
}
|
|
|
|
if( (ErrorMark_L1_1 & 0xFFFF0000)
|
|
|| (ErrorMark_L1_2 & 0xFFFF0000)
|
|
|| (ErrorMark_L1_3 & 0xFFFF0000)
|
|
|| (ErrorMark_L1_4 & 0xFFFF0000) )
|
|
{
|
|
printf("Check DQ connections to/from U11 (front) and U28 (back)\n");
|
|
}
|
|
}
|
|
|
|
}
|
|
if(bErrHighBytes)
|
|
{
|
|
if(ucNumTMU == 0)
|
|
{
|
|
if( (ErrorMark_L2_1 & 0xFFFF)
|
|
|| (ErrorMark_L2_2 & 0xFFFF)
|
|
|| (ErrorMark_L2_3 & 0xFFFF)
|
|
|| (ErrorMark_L2_4 & 0xFFFF) )
|
|
{
|
|
printf("Check DQ connections to/from U18 (front) and U25 (back)\n");
|
|
}
|
|
|
|
if( (ErrorMark_L2_1 & 0xFFFF0000)
|
|
|| (ErrorMark_L2_2 & 0xFFFF0000)
|
|
|| (ErrorMark_L2_3 & 0xFFFF0000)
|
|
|| (ErrorMark_L2_4 & 0xFFFF0000) )
|
|
{
|
|
printf("Check DQ connections to/from U17 (front) and U26 (back)\n");
|
|
}
|
|
}
|
|
else if(ucNumTMU == 1)
|
|
{
|
|
if( (ErrorMark_L2_1 & 0xFFFF)
|
|
|| (ErrorMark_L2_2 & 0xFFFF)
|
|
|| (ErrorMark_L2_3 & 0xFFFF)
|
|
|| (ErrorMark_L2_4 & 0xFFFF) )
|
|
{
|
|
printf("Check DQ connections to/from U16 (front) and U29 (back)\n");
|
|
}
|
|
|
|
if( (ErrorMark_L2_1 & 0xFFFF0000)
|
|
|| (ErrorMark_L2_2 & 0xFFFF0000)
|
|
|| (ErrorMark_L2_3 & 0xFFFF0000)
|
|
|| (ErrorMark_L2_4 & 0xFFFF0000) )
|
|
{
|
|
printf("Check DQ connections to/from U15 (front) and U32 (back)\n");
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
}*/
|
|
|
|
/* reset the Init0 register back to its previous value */
|
|
sst1InitIdle(sst);
|
|
ISET(SST_TREX(sst,ucNumTMU)->trexInit0, devInfo->tmuInit0[(int)ucNumTMU]);
|
|
sst1InitIdle(sst);
|
|
return NbErr;
|
|
}
|
|
|
|
unsigned long long
|
|
test_TMU_datalines( sst1DeviceInfoStruct* devInfo,
|
|
FxU32* sst,
|
|
SstRegs *sstregs,
|
|
const unsigned char ucNumTMU,
|
|
const unsigned char bRandom,
|
|
const unsigned char RamSizeMB)
|
|
{
|
|
typedef struct _def_sMemBlock{
|
|
unsigned long ulAddStart;
|
|
unsigned long ulAddEnd;
|
|
unsigned long ulAddLength;
|
|
}def_sMemBlock;
|
|
|
|
const def_sMemBlock ar_memBlocks[] = {
|
|
{ .ulAddStart = 0x000000,
|
|
.ulAddLength = 0x100000
|
|
},
|
|
{ .ulAddStart = 0x100000,
|
|
.ulAddLength = 0x100000
|
|
},
|
|
{ .ulAddStart = 0x200000,
|
|
.ulAddLength = 0x100000
|
|
},
|
|
{ .ulAddStart = 0x300000,
|
|
.ulAddLength = 0x100000
|
|
},
|
|
};
|
|
|
|
unsigned long long ullNbErrorAll = 0;
|
|
|
|
// set downstream TMUs to passthrough
|
|
for (int i=0; i<ucNumTMU; i++)
|
|
ISET(SST_TREX(sstregs,i)->textureMode, SST_TC_PASS | SST_TCA_PASS);
|
|
|
|
for( int iMemBlock = 0;
|
|
iMemBlock <= sizeof(ar_memBlocks)/sizeof(def_sMemBlock);
|
|
iMemBlock++)
|
|
{
|
|
const def_sMemBlock* pMemBlk = &ar_memBlocks[iMemBlock];
|
|
|
|
if(RamSizeMB<4 && pMemBlk->ulAddStart >= 0x300000) continue;
|
|
if(RamSizeMB<3 && pMemBlk->ulAddStart >= 0x200000) continue;
|
|
if(RamSizeMB<2 && pMemBlk->ulAddStart >= 0x100000) continue;
|
|
/*
|
|
printf("Testing memory block 0x%08x to 0x%08x ...\n",
|
|
pMemBlk->ulAddStart,
|
|
pMemBlk->ulAddStart + pMemBlk->ulAddLength -4);
|
|
*/
|
|
unsigned char ucAddMovingBit = 0;
|
|
for( FxU32 addrTest = pMemBlk->ulAddStart ;
|
|
addrTest < (pMemBlk->ulAddStart + pMemBlk->ulAddLength);
|
|
ucAddMovingBit++)
|
|
{
|
|
FxU32 bitTest = 1u;
|
|
FxU32 bitTest2 = 1u<<31;
|
|
for(unsigned long nloop=0;; nloop++)
|
|
{
|
|
unsigned long ulNbError;
|
|
ulNbError = RenderTest( devInfo,
|
|
sst,
|
|
sstregs,
|
|
ucNumTMU,
|
|
addrTest,
|
|
bitTest,
|
|
bitTest2);
|
|
ullNbErrorAll += ulNbError;
|
|
|
|
if((bRandom && (nloop > 32)) || bitTest == 0)
|
|
{
|
|
break;
|
|
}
|
|
bitTest = bRandom ? get_notnull_random_balanced_mByte() : (bitTest << 1);
|
|
bitTest2 = bRandom ? get_notnull_random_balanced_mByte() : (bitTest2 >> 1);
|
|
}
|
|
//printf("Done @ 0x%08x\n",dataTest);
|
|
|
|
const FxU32 new_addrTest = pMemBlk->ulAddStart | (1 << ucAddMovingBit);
|
|
if(new_addrTest == pMemBlk->ulAddStart) break;
|
|
addrTest = new_addrTest;
|
|
}
|
|
}
|
|
|
|
return ullNbErrorAll;
|
|
}
|