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));
232 systemAddress = 0xb0000000 | (sramAddress << 3);
239 return systemAddress;
246 uint8 validFlags = (mc->ECCD.U >> IFX_MC_ECCD_VAL_OFF) & IFX_MC_ECCD_VAL_MSK;
247 uint8 numTrackedAddresses = 0;
250 #if IFX_MC_ECCD_VAL_LEN > IFXMTU_MAX_TRACKED_ADDRESSES
251 # error "Unexpected size of VAL mask"
256 if (validFlags & (1 << i))
258 trackedSramAddresses[numTrackedAddresses].U = mc->ETRR[i].U;
259 ++numTrackedAddresses;
263 return numTrackedAddresses;
269 volatile uint32 *mtuMemstat = (
volatile uint32 *)((
uint32)&MTU_MEMSTAT0 + 4 * (mbistSel >> 5));
270 uint32 mask = 1 << (mbistSel & 0x1f);
271 return (*mtuMemstat & mask) != 0;
294 status = mc->MSTATUS.U;
295 return (
boolean)(status & 0x01);
304 uint16 mcontrolMask = 0x4000;
305 mc->MCONTROL.U = mcontrolMask | (1 << IFX_MC_MCONTROL_DIR_OFF);
306 mc->CONFIG0.U = (1 << IFX_MC_CONFIG0_NUMACCS_OFF) | (1 << IFX_MC_CONFIG0_ACCSTYPE_OFF);
310 mc->RANGE.U = sramAddress;
313 mc->MCONTROL.U = mcontrolMask | (1 << IFX_MC_MCONTROL_DIR_OFF) | (1 << IFX_MC_MCONTROL_START_OFF);
314 mc->MCONTROL.U = mcontrolMask | (1 << IFX_MC_MCONTROL_DIR_OFF);
317 IfxMtu_waitForMbistDone(256, 1, mbistSel);
332 uint32 configCheckerBoardSequence[4] = {
341 uint8 isEndInitEnabled = 0;
349 isEndInitEnabled = 1;
360 mc->RANGE.U = (rangeSel << 15) | (rangeAddrUp << 7) | (rangeAddrLow << 0);
363 for (testStep = 0; testStep < 4; ++testStep)
365 mc->CONFIG0.U = configCheckerBoardSequence[testStep] & 0x0000FFFF;
366 mc->CONFIG1.U = (configCheckerBoardSequence[testStep] & 0xFFFF0000) >> 16;
367 mc->MCONTROL.U = numberRedundancyLines ? 0x30c9 : 0x00c9;
368 mc->MCONTROL.U = numberRedundancyLines ? 0x30c8 : 0x00c8;
374 IfxMtu_waitForMbistDone(
IfxMtu_sramTable[mbistSel].mbistDelay, 4, mbistSel);
386 if (mc->MSTATUS.B.FAIL)
392 *errorAddr = mc->ETRR[0].U;
406 if (isEndInitEnabled == 1)
422 uint32 configMarchUSequence[6] = {
433 uint8 isEndInitEnabled = 0;
441 isEndInitEnabled = 1;
452 mc->RANGE.U = (rangeSel << 15) | (rangeAddrUp << 7) | (rangeAddrLow << 0);
455 for (testStep = 0; testStep < 6; ++testStep)
457 mc->CONFIG0.U = configMarchUSequence[testStep] & 0x0000FFFF;
458 mc->CONFIG1.U = (configMarchUSequence[testStep] & 0xFFFF0000) >> 16;
459 mc->MCONTROL.U = 0x0209;
460 mc->MCONTROL.B.START = 0;
466 IfxMtu_waitForMbistDone(
IfxMtu_sramTable[mbistSel].mbistDelay, 4, mbistSel);
478 if (mc->MSTATUS.B.FAIL)
484 *errorAddr = mc->ETRR[0].U;
499 if (isEndInitEnabled == 1)
517 uint8 isEndInitEnabled = 0;
525 isEndInitEnabled = 1;
536 mc->CONFIG0.U = 0x4005;
537 mc->CONFIG1.U = 0x5000;
539 mc->RANGE.U = (rangeSel << 15) | (rangeAddrUp << 7) | (rangeAddrLow << 0);
541 mc->MCONTROL.U = 0xF201;
542 mc->MCONTROL.B.START = 0;
547 IfxMtu_waitForMbistDone(
IfxMtu_sramTable[mbistSel].mbistDelay, 4, mbistSel);
559 if (mc->MSTATUS.B.FAIL)
565 *errorAddr = mc->ETRR[0].U;
578 if (isEndInitEnabled == 1)
590 uint32 waitFact = (SCU_CCUCON0.B.SPBDIV / SCU_CCUCON0.B.SRIDIV) * numInstructions;
596 waitFact = waitFact * SCU_CCUCON1.B.GTMDIV;
625 waitFact = waitFact * SCU_CCUCON2.B.BBBDIV;
631 if (numInstructions == 4)
633 waitTime = (towerDepth * waitFact) + 30;
637 waitTime = ((towerDepth / 4) * waitFact) + 30;
640 waitTime = waitTime / 3;
652 uint8 isEndInitEnabled = 0;
661 isEndInitEnabled = 1;
665 uint16 mcontrolMask = 0x4000;
666 mc->MCONTROL.U = mcontrolMask | (1 << IFX_MC_MCONTROL_DIR_OFF);
667 mc->CONFIG0.U = (1 << IFX_MC_CONFIG0_NUMACCS_OFF) | (0 << IFX_MC_CONFIG0_ACCSTYPE_OFF);
671 mc->RANGE.U = sramAddress;
674 mc->MCONTROL.U = mcontrolMask | (1 << IFX_MC_MCONTROL_DIR_OFF) | (1 << IFX_MC_MCONTROL_START_OFF);
675 mc->MCONTROL.U = mcontrolMask | (1 << IFX_MC_MCONTROL_DIR_OFF);
677 if (isEndInitEnabled == 1)
684 IfxMtu_waitForMbistDone(
IfxMtu_sramTable[mbistSel].mbistDelay, 1, mbistSel);