56 mc->ECCD.U |= (1 << IFX_MC_ECCD_TRC_OFF);
62 uint8 isEndInitEnabled = 0;
95 if (isEndInitEnabled == 1)
140 uint32 memSize = dataSize + eccSize;
148 for (mem = 0; mem < numBlocks; ++mem)
152 for (i = 0; i < memSize; ++i)
154 if ((i == eccInvPos0) || (i == eccInvPos1))
156 data |= (1 << bitPos);
163 mc->RDBFL[wordIx++].U = data;
173 mc->RDBFL[wordIx].U = data;
178 uint16 mcontrolMask = 0x4000;
179 mc->MCONTROL.U = mcontrolMask | (1 << IFX_MC_MCONTROL_DINIT_OFF) | (1 << IFX_MC_MCONTROL_START_OFF);
180 mc->MCONTROL.U = mcontrolMask | (0 << IFX_MC_MCONTROL_DINIT_OFF) | (1 << IFX_MC_MCONTROL_DINIT_OFF);
186 volatile uint32 *mtuMemtest = (
volatile uint32 *)((
uint32)&MTU_MEMTEST0 + 4 * (mbistSel >> 5));
187 uint32 mask = 1 << (mbistSel & 0x1f);
188 *mtuMemtest &= ~mask;
198 mc->ECCS.U &= ~(1 << IFX_MC_ECCS_TRE_OFF);
202 mc->ECCS.U |= (1 << IFX_MC_ECCS_TRE_OFF);
209 volatile uint32 *mtuMemtest = (
volatile uint32 *)((
uint32)&MTU_MEMTEST0 + 4 * (mbistSel >> 5));
210 uint32 mask = 1 << (mbistSel & 0x1f);
217 uint32 sramAddress = trackedSramAddress.B.ADDR;
218 uint32 mbi = trackedSramAddress.B.MBI;
224 systemAddress = 0x70100000 | ((sramAddress << 3) | ((mbi & 1) << 2));
228 systemAddress = 0x70000000 | ((sramAddress << 4) | ((mbi & 3) << 2));
235 return systemAddress;
242 uint8 validFlags = (mc->ECCD.U >> IFX_MC_ECCD_VAL_OFF) & IFX_MC_ECCD_VAL_MSK;
243 uint8 numTrackedAddresses = 0;
246 #if IFX_MC_ECCD_VAL_LEN > IFXMTU_MAX_TRACKED_ADDRESSES
247 # error "Unexpected size of VAL mask"
252 if (validFlags & (1 << i))
254 trackedSramAddresses[numTrackedAddresses].U = mc->ETRR[i].U;
255 ++numTrackedAddresses;
259 return numTrackedAddresses;
265 volatile uint32 *mtuMemstat = (
volatile uint32 *)((
uint32)&MTU_MEMSTAT0 + 4 * (mbistSel >> 5));
266 uint32 mask = 1 << (mbistSel & 0x1f);
267 return (*mtuMemstat & mask) != 0;
290 status = mc->MSTATUS.U;
291 return (
boolean)(status & 0x01);
300 uint16 mcontrolMask = 0x4000;
301 mc->MCONTROL.U = mcontrolMask | (1 << IFX_MC_MCONTROL_DIR_OFF);
302 mc->CONFIG0.U = (1 << IFX_MC_CONFIG0_NUMACCS_OFF) | (1 << IFX_MC_CONFIG0_ACCSTYPE_OFF);
306 mc->RANGE.U = sramAddress;
309 mc->MCONTROL.U = mcontrolMask | (1 << IFX_MC_MCONTROL_DIR_OFF) | (1 << IFX_MC_MCONTROL_START_OFF);
310 mc->MCONTROL.U = mcontrolMask | (1 << IFX_MC_MCONTROL_DIR_OFF);
313 IfxMtu_waitForMbistDone(256, 1, mbistSel);
328 uint32 configCheckerBoardSequence[4] = {
337 uint8 isEndInitEnabled = 0;
345 isEndInitEnabled = 1;
356 mc->RANGE.U = (rangeSel << 15) | (rangeAddrUp << 7) | (rangeAddrLow << 0);
359 for (testStep = 0; testStep < 4; ++testStep)
361 mc->CONFIG0.U = configCheckerBoardSequence[testStep] & 0x0000FFFF;
362 mc->CONFIG1.U = (configCheckerBoardSequence[testStep] & 0xFFFF0000) >> 16;
363 mc->MCONTROL.U = numberRedundancyLines ? 0x30c9 : 0x00c9;
364 mc->MCONTROL.U = numberRedundancyLines ? 0x30c8 : 0x00c8;
370 IfxMtu_waitForMbistDone(
IfxMtu_sramTable[mbistSel].mbistDelay, 4, mbistSel);
382 if (mc->MSTATUS.B.FAIL)
388 *errorAddr = mc->ETRR[0].U;
402 if (isEndInitEnabled == 1)
418 uint32 configMarchUSequence[6] = {
429 uint8 isEndInitEnabled = 0;
437 isEndInitEnabled = 1;
448 mc->RANGE.U = (rangeSel << 15) | (rangeAddrUp << 7) | (rangeAddrLow << 0);
451 for (testStep = 0; testStep < 6; ++testStep)
453 mc->CONFIG0.U = configMarchUSequence[testStep] & 0x0000FFFF;
454 mc->CONFIG1.U = (configMarchUSequence[testStep] & 0xFFFF0000) >> 16;
455 mc->MCONTROL.U = 0x0209;
456 mc->MCONTROL.B.START = 0;
462 IfxMtu_waitForMbistDone(
IfxMtu_sramTable[mbistSel].mbistDelay, 4, mbistSel);
474 if (mc->MSTATUS.B.FAIL)
480 *errorAddr = mc->ETRR[0].U;
495 if (isEndInitEnabled == 1)
513 uint8 isEndInitEnabled = 0;
521 isEndInitEnabled = 1;
532 mc->CONFIG0.U = 0x4005;
533 mc->CONFIG1.U = 0x5000;
535 mc->RANGE.U = (rangeSel << 15) | (rangeAddrUp << 7) | (rangeAddrLow << 0);
537 mc->MCONTROL.U = 0xF201;
538 mc->MCONTROL.B.START = 0;
543 IfxMtu_waitForMbistDone(
IfxMtu_sramTable[mbistSel].mbistDelay, 4, mbistSel);
555 if (mc->MSTATUS.B.FAIL)
561 *errorAddr = mc->ETRR[0].U;
574 if (isEndInitEnabled == 1)
586 uint32 waitFact = (SCU_CCUCON0.B.SPBDIV / SCU_CCUCON0.B.SRIDIV) * numInstructions;
599 if (numInstructions == 4)
601 waitTime = (towerDepth * waitFact) + 30;
605 waitTime = ((towerDepth / 4) * waitFact) + 30;
608 waitTime = waitTime / 3;
620 uint8 isEndInitEnabled = 0;
629 isEndInitEnabled = 1;
633 uint16 mcontrolMask = 0x4000;
634 mc->MCONTROL.U = mcontrolMask | (1 << IFX_MC_MCONTROL_DIR_OFF);
635 mc->CONFIG0.U = (1 << IFX_MC_CONFIG0_NUMACCS_OFF) | (0 << IFX_MC_CONFIG0_ACCSTYPE_OFF);
639 mc->RANGE.U = sramAddress;
642 mc->MCONTROL.U = mcontrolMask | (1 << IFX_MC_MCONTROL_DIR_OFF) | (1 << IFX_MC_MCONTROL_START_OFF);
643 mc->MCONTROL.U = mcontrolMask | (1 << IFX_MC_MCONTROL_DIR_OFF);
645 if (isEndInitEnabled == 1)
652 IfxMtu_waitForMbistDone(
IfxMtu_sramTable[mbistSel].mbistDelay, 1, mbistSel);