<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic P4080 cache issues in QorIQ</title>
    <link>https://community.nxp.com/t5/QorIQ/P4080-cache-issues/m-p/211871#M155</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Shouldn't a spinlock act as a system-wide memory barrier? I took the example given with CodeWarrior (&amp;lt;Install folder&amp;gt;/PA/CodeWarrior_Examples/Bareboard_Examples/P4080_SMP) and enabled caching. I modified the code and it's now like this:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;extern char&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*ret_from_spin_loop;&lt;BR /&gt;#define MASTER_CORE_ID&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0&lt;BR /&gt;#define MAX_NUM_OF_CORES&amp;nbsp;&amp;nbsp; &amp;nbsp;8&lt;BR /&gt;unsigned long long volatile spin_table[MAX_NUM_OF_CORES] = {0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1};&lt;BR /&gt;uint32_t spin_table_lock = 1; /* yes, locked */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;void __spin_table_loop(void)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp; &amp;nbsp; /* I translated the original assembly code to C */&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;unsigned long proc_id;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;asm ("mfpir %0" : "=r" (proc_id));&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;proc_id &amp;gt;&amp;gt;= 5;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;unsigned long long TEA = 0x1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;lwe_spin_lock(&amp;amp;spin_table_lock);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;do {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;TEA = spin_table[proc_id];&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;} while (TEA == 0x1);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;lwe_spin_unlock(&amp;amp;spin_table_lock);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;void (*fptr)(void) = (void*)(size_t) TEA;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;fptr();&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;void __init_smp(void)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;unsigned long proc_id;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;asm ("mfpir %0" : "=r" (proc_id));&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;proc_id &amp;gt;&amp;gt;= 5;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (proc_id == MASTER_CORE_ID) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;const unsigned long startAddr = (unsigned long) &amp;amp;ret_from_spin_loop;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;for (int coreId = 0; coreId &amp;lt; MAX_NUM_OF_CORES; coreId++) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;spin_table[coreId] = startAddr;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;lwe_spin_unlock(&amp;amp;spin_table_lock);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;It happens that cores &amp;gt; 0 never see what core 0 writes in the spin_table array, and, consequently, never step-out of the__spin_table_loop function. What's wrong with my code?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Fri, 02 Mar 2012 00:48:06 GMT</pubDate>
    <dc:creator>JFernandes</dc:creator>
    <dc:date>2012-03-02T00:48:06Z</dc:date>
    <item>
      <title>P4080 cache issues</title>
      <link>https://community.nxp.com/t5/QorIQ/P4080-cache-issues/m-p/211871#M155</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Shouldn't a spinlock act as a system-wide memory barrier? I took the example given with CodeWarrior (&amp;lt;Install folder&amp;gt;/PA/CodeWarrior_Examples/Bareboard_Examples/P4080_SMP) and enabled caching. I modified the code and it's now like this:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;extern char&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;*ret_from_spin_loop;&lt;BR /&gt;#define MASTER_CORE_ID&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;0&lt;BR /&gt;#define MAX_NUM_OF_CORES&amp;nbsp;&amp;nbsp; &amp;nbsp;8&lt;BR /&gt;unsigned long long volatile spin_table[MAX_NUM_OF_CORES] = {0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1};&lt;BR /&gt;uint32_t spin_table_lock = 1; /* yes, locked */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;void __spin_table_loop(void)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp; &amp;nbsp; /* I translated the original assembly code to C */&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;unsigned long proc_id;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;asm ("mfpir %0" : "=r" (proc_id));&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;proc_id &amp;gt;&amp;gt;= 5;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;unsigned long long TEA = 0x1;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;lwe_spin_lock(&amp;amp;spin_table_lock);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;do {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;TEA = spin_table[proc_id];&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;} while (TEA == 0x1);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;lwe_spin_unlock(&amp;amp;spin_table_lock);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;void (*fptr)(void) = (void*)(size_t) TEA;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;fptr();&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;void __init_smp(void)&lt;BR /&gt;{&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;unsigned long proc_id;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;asm ("mfpir %0" : "=r" (proc_id));&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;proc_id &amp;gt;&amp;gt;= 5;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (proc_id == MASTER_CORE_ID) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;const unsigned long startAddr = (unsigned long) &amp;amp;ret_from_spin_loop;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;for (int coreId = 0; coreId &amp;lt; MAX_NUM_OF_CORES; coreId++) {&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;spin_table[coreId] = startAddr;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;lwe_spin_unlock(&amp;amp;spin_table_lock);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;}&lt;BR /&gt;}&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;It happens that cores &amp;gt; 0 never see what core 0 writes in the spin_table array, and, consequently, never step-out of the__spin_table_loop function. What's wrong with my code?&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 02 Mar 2012 00:48:06 GMT</pubDate>
      <guid>https://community.nxp.com/t5/QorIQ/P4080-cache-issues/m-p/211871#M155</guid>
      <dc:creator>JFernandes</dc:creator>
      <dc:date>2012-03-02T00:48:06Z</dc:date>
    </item>
    <item>
      <title>Re: P4080 cache issues</title>
      <link>https://community.nxp.com/t5/QorIQ/P4080-cache-issues/m-p/211872#M156</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;&amp;gt; and enabled caching&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Each core has its own I and D and L2 cache.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Are your spinlocks in shared-and-uncached memory? If not, how are you making sure all cores are seeing all accesses? What's the memory access architecture on this chip - do they snoop?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Tom&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 06 Mar 2012 14:34:40 GMT</pubDate>
      <guid>https://community.nxp.com/t5/QorIQ/P4080-cache-issues/m-p/211872#M156</guid>
      <dc:creator>TomE</dc:creator>
      <dc:date>2012-03-06T14:34:40Z</dc:date>
    </item>
  </channel>
</rss>

