<br style="font-family: courier new,monospace;" clear="all"><span style="font-family: courier new,monospace;">Hi,</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">I'm working on a simple EDAC driver for ERC32. Tests running on SIS do nothing and tests running on real hardware produce trap 0x9 (not 0x16, as it would be expected).</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">Driver (basically) does the following:</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">1. Ensure EDAC is turned on in MEMCFR:</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">ERC32_MEC.Memory_Configuration |= 0x00004000;</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">2. Install ISR handler:</span><br style="font-family: courier new,monospace;"><br><span style="font-family: courier new,monospace;">/* EDAC_Correction_Handler */</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">rtems_isr EDAC_Correction_Handler( rtems_vector_number vector ) </span><span style="font-family: courier new,monospace;">{</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    ++_Sram_Edac.errorCount;<br>    *( (uint32_t*)ERC32_MEC.First_Failing_Address) = </span><span style="font-family: courier new,monospace;"><br>        *( (uint32_t*)ERC32_MEC.First_Failing_Address)</span><span style="font-family: courier new,monospace;">;    <br>
}<br></span><br>(...)<br><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">/* install handler */</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">rtems_interrupt_catch( EDAC_Correction_Handler,</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">                       ERC32_TRAP_TYPE(ERC32_INTERRUPT_CORRECTABLE_MEMORY_ERROR),</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">                       &old );</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;">For testing, I'm using a function to write a value with checkbits and another to read it and produce EDAC trap if checkbits are wrong:<br><br><span style="font-family: courier new,monospace;">--- file: EDACTest.c --</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">(...)<br><br>uint32_t a;<br><br>
 /* Intentionally write value with wrong CheckBits (Correct CB: 0x2C) */</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">writeValueWithCheckBits(&a, 0x01, 0x2D): <br>
<br>
/* Attempt to read so Trap 0x16 occurs */</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">readAddress(&a);</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;"><br>(...)</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;"></span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">/*****************************************************************************/</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">void writeValueWithCheckBits(uint32_t* address, <br>                             uint32_t value, <br>                             uint32_t checkbits ) <br>/*****************************************************************************/</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">{</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    // Enable EDAC Test Mode in TESTCTR</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    printf("EDAC Test$ Enabling EDAC Test Mode in Test Control Register.\n");</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    ERC32_MEC.Test_Control = 0x20000;</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    // Setting check bits</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    printf("EDAC Test$ Writing check bits.\n");</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    ERC32_MEC.Test_Control |= checkbits;</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    // Write value affected by check bits</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    printf("EDAC Test$ Writing '0x%08x' at address '0x%08x'.\n", value, address);</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    *address = value;</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    // Disable EDAC Test Mode in TESTCTR</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    printf("EDAC Test$ Disabling EDAC Test Mode in Test Control Register.\n");</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    ERC32_MEC.Test_Control &= ~0x20000;</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">}</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">/*****************************************************************************/</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">void readAddress(uint32_t* address)<br>/*****************************************************************************/</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">{</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    uint32_t tmp;</span><br style="font-family: courier new,monospace;">
<br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    // Read address</span><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    printf("EDAC Test$ Reading address '0x%08x'. If wrong checkbits, EDAC trap should occur.\n", address);</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">    tmp = address;</span><br style="font-family: courier new,monospace;"><br style="font-family: courier new,monospace;"><span style="font-family: courier new,monospace;">    printf("EDAC Test$ Address content is: '0x%08x'.\n", tmp);</span><br style="font-family: courier new,monospace;">
<span style="font-family: courier new,monospace;">}<br><br>(...)<br><br></span>Any suggestion? Obviously I'm doing something wrong, but I can't figure out what it is.<br><br>Greetings and thanks!<br><br>Nicolás Eduardo Horro<br style="font-family: courier new,monospace;">