Files
V2TMUMemTester/Test_Data.c
chacha b9692565af .
2026-02-25 00:45:04 +00:00

541 lines
22 KiB
C

/* V2MemTest - A CLI Tool to test & fix Voodoo² TMU System
* Copyright (C) 2026 ChaCha
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
#include <stdint.h>
#include "cvg.h"
#include <glide.h>
#include "sst1init.h"
#include "fxpci.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)
{
sst1InitIdle(sst);
devInfo->tmuInit0[(int)ucNumTMU] = SST_TREXINIT0_DEFAULT ;
ISET(SST_TREX(sstregs,ucNumTMU)->trexInit0, devInfo->tmuInit0[(int)ucNumTMU]);
sst1InitIdle(sst);
ISET(sstregs->texBaseAddr, mem>>3);
/* Writing to first texture line, to use RAM bits 0..31 */
volatile FxU32 *texAddr = (ucNumTMU<<(21-2)) /* NUM_TMU */
+ (((FxU32)0)<<(17-2)) /* LOD_0 */
+ (FxU32 *)SST_TEX_ADDRESS(sst); /* tex base address */
ISET(texAddr[0], value1); ISET(texAddr[1], value1 + 1);
ISET(texAddr[2], value1 + 2); ISET(texAddr[3], value1 + 3);
/* writing to second texture line, to use RAM bits 32..63 */
texAddr += (1<<(9-2));
ISET(texAddr[0], value2); ISET(texAddr[1], value2 + 1);
ISET(texAddr[2], value2 + 2); ISET(texAddr[3], value2 + 3);
/* draw a 8x8 square */ //TODO: 4x2
drawSquare(sstregs,0,0,8);
sst1InitIdle(sst);
/* reading back first line pixels addresses */
const uint32_t L1_1 = IGET(sst[(SST_LFB_ADDR >> 2) + 0]);
const uint32_t L1_2 = IGET(sst[(SST_LFB_ADDR >> 2) + 1]);
const uint32_t L1_3 = IGET(sst[(SST_LFB_ADDR >> 2) + 2]);
const uint32_t L1_4 = IGET(sst[(SST_LFB_ADDR >> 2) + 3]);
/* reading back second line pixels addresses */
const uint32_t L2_1 = IGET(sst[(SST_LFB_ADDR >> 2) + (2048 >> 2) + 0]);
const uint32_t L2_2 = IGET(sst[(SST_LFB_ADDR >> 2) + (2048 >> 2) + 1]);
const uint32_t L2_3 = IGET(sst[(SST_LFB_ADDR >> 2) + (2048 >> 2) + 2]);
const uint32_t L2_4 = IGET(sst[(SST_LFB_ADDR >> 2) + (2048 >> 2) + 3]);
unsigned long long NbErr = 0;
const uint32_t ErrorMark_L1_1 = L1_1 ^ ( value1 + 0 );
const uint32_t ErrorMark_L1_2 = L1_2 ^ ( value1 + 1 );
const uint32_t ErrorMark_L1_3 = L1_3 ^ ( value1 + 2 );
const uint32_t ErrorMark_L1_4 = L1_4 ^ ( value1 + 3 );
const uint32_t ErrorMark_L2_1 = L2_1 ^ ( value2 + 0 );
const uint32_t ErrorMark_L2_2 = L2_2 ^ ( value2 + 1 );
const uint32_t ErrorMark_L2_3 = L2_3 ^ ( value2 + 2 );
const uint32_t ErrorMark_L2_4 = L2_4 ^ ( value2 + 3 );
if( ErrorMark_L1_1 || ErrorMark_L1_2 || ErrorMark_L1_3 || ErrorMark_L1_4
|| ErrorMark_L2_1 || ErrorMark_L2_2 || ErrorMark_L2_3 || ErrorMark_L2_4)
{
NbErr++;
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) ? 1.0 / 8 : 1.0 / 4;
const double dScoreBack = (mem >= 0x200000) ? 1.0 / 4 : 1.0 / 8;
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 / 8,
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 / 8,
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 / 8,
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 / 8,
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 / 8,
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 / 8,
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 / 8,
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 / 8,
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, 1.0 / 2, U9_TMU0_FT_DATA_0, U9_TMU0_FT_DATA_0);
WordBitFaultSet(ErrorMark_L1_2, 1.0 / 2, U9_TMU0_FT_DATA_0, U9_TMU0_FT_DATA_0);
WordBitFaultSet(ErrorMark_L1_3, 1.0 / 2, U9_TMU0_FT_DATA_0, U9_TMU0_FT_DATA_0);
WordBitFaultSet(ErrorMark_L1_4, 1.0 / 2, U9_TMU0_FT_DATA_0, U9_TMU0_FT_DATA_0);
WordBitFaultSet(ErrorMark_L2_1, 1.0 / 2, U9_TMU0_FT_DATA_0, U9_TMU0_FT_DATA_0);
WordBitFaultSet(ErrorMark_L2_2, 1.0 / 2, U9_TMU0_FT_DATA_0, U9_TMU0_FT_DATA_0);
WordBitFaultSet(ErrorMark_L2_3, 1.0 / 2, U9_TMU0_FT_DATA_0, U9_TMU0_FT_DATA_0);
WordBitFaultSet(ErrorMark_L2_4, 1.0 / 2, 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 / 8,
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 / 8,
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 / 8,
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 / 8,
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 / 8,
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 / 8,
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 / 8,
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 / 8,
U8_TMU1_TEX_CAS2,
U8_TMU1_TEX_CAS3,
mem < 0x200000 ? U8_TMU1_TEX_RAS0 : U8_TMU1_TEX_RAS1,
U8_TMU1_TEX_WE );
}
/*
printf("== Quick Report ==\n");
if(ErrorMark_L1_1)
{
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(ErrorMark_L1_2)
{
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(ErrorMark_L1_3)
{
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(ErrorMark_L1_4)
{
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(ErrorMark_L2_1)
{
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(ErrorMark_L2_2)
{
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(ErrorMark_L2_3)
{
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(ErrorMark_L2_4)
{
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");
}
*/
}
/* 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{
uint32_t ulAddStart;
uint32_t ulAddEnd;
uint32_t 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 only 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 | (1u << ucAddMovingBit);
if(new_addrTest == pMemBlk->ulAddStart) break;
addrTest = new_addrTest;
}
}
return ullNbErrorAll;
}