<div dir="ltr"><div>I'll answer two questions asked:</div><div><br></div><div>1) SDMA doesn't need GCR at the end of IBs. It's because SDMA writes bypass GL2 and at the same time they invalidate all cache lines they touch.</div><div><br></div><div>2)</div><div>> <span style="color:windowtext">If we always insert a GL2C invalidate at 
every EOP of every IB from every engine, why we need a GL2C invalidate 
before IB  execute ?</span></div><div><span style="color:windowtext"><br></span></div><div><span style="color:windowtext">I just sent you a counterexample on a private thread that proves that invalidation in RELEASE_MEM doesn't accomplish anything. The invalidation flag is there because:</span></div><div><span style="color:windowtext">1) it was inherited from gfx9, which was inherited from gfx8, which was inherited from gfx7, which doesn't have the WB flag, so INV has to be used instead.</span></div><div><span style="color:windowtext">2) to hide bugs<br></span></div><div><span style="color:windowtext"><br></span></div><div><span style="color:windowtext">Marek<br></span></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Wed, Apr 29, 2020 at 7:24 AM Liu, Monk <<a href="mailto:Monk.Liu@amd.com">Monk.Liu@amd.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">





<div bgcolor="white" lang="EN-US">
<div class="gmail-m_-2967598555427486213WordSection1">
<p class="MsoNormal"><span style="color:windowtext">>></span> Well from my understanding I think that a G2LC invalidation is still necessary before an IB executes.<u></u><u></u></p>
<p class="MsoNormal">Agree, I think before an IB executes the only thing we need on GL2C is the invalidation, not the flush .<u></u><u></u></p>
<p class="MsoNormal"><br>
>> The problem is that the memory of the IB could also be cached because of some activity of the GFX or Compute rings.<u></u><u></u></p>
<p class="MsoNormal"><span style="color:windowtext">If we always insert a GL2C invalidate at every EOP of every IB from every engine, why we need a GL2C invalidate before IB  execute ?<u></u><u></u></span></p>
<div>
<p class="MsoNormal"><span style="color:windowtext">_____________________________________<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:12pt;background:white none repeat scroll 0% 0%">Monk Liu|GPU Virtualization Team |</span><span style="font-size:12pt;color:rgb(200,38,19);border:1pt none windowtext;padding:0in;background:white none repeat scroll 0% 0%">AMD<u></u><u></u></span></p>
<p class="MsoNormal"><span style="color:windowtext"><img style="width: 0.8333in; height: 0.8333in;" id="gmail-m_-2967598555427486213_x0000_i1027" src="cid:171d0f0a62b4cff311" alt="sig-cloud-gpu" width="80" height="80"><u></u><u></u></span></p>
</div>
<p class="MsoNormal"><span style="color:windowtext"><u></u> <u></u></span></p>
<div>
<div style="border-color:rgb(225,225,225) currentcolor currentcolor;border-style:solid none none;border-width:1pt medium medium;padding:3pt 0in 0in">
<p class="MsoNormal"><b><span style="color:windowtext">From:</span></b><span style="color:windowtext"> Koenig, Christian <<a href="mailto:Christian.Koenig@amd.com" target="_blank">Christian.Koenig@amd.com</a>>
<br>
<b>Sent:</b> Wednesday, April 29, 2020 5:38 PM<br>
<b>To:</b> Liu, Monk <<a href="mailto:Monk.Liu@amd.com" target="_blank">Monk.Liu@amd.com</a>>; Marek Olšák <<a href="mailto:maraeo@gmail.com" target="_blank">maraeo@gmail.com</a>>; amd-gfx mailing list <<a href="mailto:amd-gfx@lists.freedesktop.org" target="_blank">amd-gfx@lists.freedesktop.org</a>><br>
<b>Subject:</b> Re: drm/amdgpu: invalidate L2 before SDMA IBs (on gfx10)<u></u><u></u></span></p>
</div>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
<div>
<p class="MsoNormal">Well from my understanding I think that a G2LC invalidation is still necessary before an IB executes.<br>
<br>
The problem is that the memory of the IB could also be cached because of some activity of the GFX or Compute rings.<br>
<br>
Regards,<br>
Christian.<br>
<br>
Am 29.04.20 um 11:35 schrieb Liu, Monk:<u></u><u></u></p>
</div>
<blockquote style="margin-top:5pt;margin-bottom:5pt">
<p class="MsoNormal">Here is the reason we should always insert a “sync mem” packet at the FENCE place of SDMA, not before IB emit.<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">By always inserting “sync mem” in the FENCE place we can make sure:1<u></u><u></u></p>
<ol style="margin-top:0in" type="1" start="1">
<li class="gmail-m_-2967598555427486213MsoListParagraph" style="margin-left:0in">data is really flushed to system memory before CPU try to read it
<u></u><u></u></li><li class="gmail-m_-2967598555427486213MsoListParagraph" style="margin-left:0in">all the G2LC is invalidated by “sync mem”, thus in the next round SDMA IB, it won’t get staled data from G2LC cache
<u></u><u></u></li></ol>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">by inserting “sync mem” in prior to IB could only achieve :  Avoid get staled data in g2lc during IB execution
<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">for GFX/COMPUTE ring since they have release_mem packet so it is inherently doing the G2LC flush and invalidate upon a fence signaled
<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<div>
<p class="MsoNormal">_____________________________________<u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:12pt;background:white none repeat scroll 0% 0%">Monk Liu|GPU Virtualization Team |</span><span style="font-size:12pt;color:rgb(200,38,19);border:1pt none windowtext;padding:0in;background:white none repeat scroll 0% 0%">AMD</span><u></u><u></u></p>
<p class="MsoNormal"><img style="width: 0.8333in; height: 0.8333in;" id="gmail-m_-2967598555427486213_x0000_i1025" src="cid:171d0f0a62b4cff311" alt="sig-cloud-gpu" width="80" height="80"><u></u><u></u></p>
</div>
<p class="MsoNormal"> <u></u><u></u></p>
<div>
<div style="border-color:rgb(225,225,225) currentcolor currentcolor;border-style:solid none none;border-width:1pt medium medium;padding:3pt 0in 0in">
<p class="MsoNormal"><b>From:</b> Liu, Monk <br>
<b>Sent:</b> Wednesday, April 29, 2020 5:06 PM<br>
<b>To:</b> 'Marek Olšák' <a href="mailto:maraeo@gmail.com" target="_blank"><maraeo@gmail.com></a>; amd-gfx mailing list
<a href="mailto:amd-gfx@lists.freedesktop.org" target="_blank"><amd-gfx@lists.freedesktop.org></a>; Koenig, Christian
<a href="mailto:Christian.Koenig@amd.com" target="_blank"><Christian.Koenig@amd.com></a><br>
<b>Subject:</b> RE: drm/amdgpu: invalidate L2 before SDMA IBs (on gfx10)<u></u><u></u></p>
</div>
</div>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">Hi <a id="gmail-m_-2967598555427486213OWAAM709EE8E0E6054CD48698E878A98E9795" href="mailto:Christian.Koenig@amd.com" target="_blank">
<span style="font-family:"Calibri",sans-serif;text-decoration:none">@Koenig, Christian</span></a> & Marek<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">I still have some concerns regarding Marek’s patch, correct me if I’m wrong<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">See that Marek put a SDMA_OP_GCR_REQ before emitting IB, to make sure SDMA won’t get stale cache data during the IB execution.<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">But that “SDMA_OP_GCR_REQ” only invalidate/flush the GFXHUB’s G2LC cache right ?  what if the memory is changed by MM or CPU (out side of GFXHUB) ?<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">Can this “ SDMA_OP_GCR_REQ” force MMHUB or even CPU to flush their operation result from their cache to memory ??<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">Besides, with my understanding the “EOP” of gfx ring is doing the thing of “invalidate/flush” L2 cache upon a fence signaled, so what we should do on SDMA5 is to insert this “SDMA_OP_GCR_REQ”<u></u><u></u></p>
<p class="MsoNormal">Right before thee “emit_fence” of SDMA  (this is what windows KMD do)<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal">thanks <u></u><u></u></p>
<p class="MsoNormal">_____________________________________<u></u><u></u></p>
<p class="MsoNormal"><span style="font-size:12pt;background:white none repeat scroll 0% 0%">Monk Liu|GPU Virtualization Team |</span><span style="font-size:12pt;color:rgb(200,38,19);border:1pt none windowtext;padding:0in;background:white none repeat scroll 0% 0%">AMD</span><u></u><u></u></p>
<p class="MsoNormal"><img style="width: 0.8333in; height: 0.8333in;" id="gmail-m_-2967598555427486213Picture_x0020_1" src="cid:171d0f0a62b4cff311" alt="sig-cloud-gpu" width="80" height="80" border="0"><u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal"><b>From:</b> amd-gfx <<a href="mailto:amd-gfx-bounces@lists.freedesktop.org" target="_blank">amd-gfx-bounces@lists.freedesktop.org</a>>
<b>On Behalf Of </b>Marek Ol?ák<br>
<b>Sent:</b> Saturday, April 25, 2020 4:52 PM<br>
<b>To:</b> amd-gfx mailing list <<a href="mailto:amd-gfx@lists.freedesktop.org" target="_blank">amd-gfx@lists.freedesktop.org</a>><br>
<b>Subject:</b> drm/amdgpu: invalidate L2 before SDMA IBs (on gfx10)<u></u><u></u></p>
<p class="MsoNormal"> <u></u><u></u></p>
<div>
<div>
<p class="MsoNormal">This should fix SDMA hangs on gfx10.<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">Marek<u></u><u></u></p>
</div>
</div>
</blockquote>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
</div>

</blockquote></div>