<div dir="ltr">This is probably a good idea thought it doesn't solve any actual bugs ATM since the kernel always provides us canonical offsets.  I considered doing it earlier when I was bringing up 48bit but didn't for that reason.  I dug up the patch I had for doing it directly in genxml and sent it out.  I'm not sure if it's better to do it there or here though if we're going to do it here, then blorp and i965 need to be updated as well.<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Thu, May 11, 2017 at 6:13 AM, Chris Wilson <span dir="ltr"><<a href="mailto:chris@chris-wilson.co.uk" target="_blank">chris@chris-wilson.co.uk</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">When we add the reloc, we write the value of the relocation target using<br>
non-canonical form. If we later patch up the address prior to command<br>
submission, we will rewrite it using canonical form. We should always<br>
write the address in canonical form in case we skip the relocation (as<br>
the target did not move since creation of the relocation).<br>
<br>
</span>v2: Rebuild reloc_size lost in collateral damage.<br>
<span class=""><br>
Signed-off-by: Chris Wilson <<a href="mailto:chris@chris-wilson.co.uk">chris@chris-wilson.co.uk</a>><br>
Cc: Jason Ekstrand <<a href="mailto:jason.ekstrand@intel.com">jason.ekstrand@intel.com</a>><br>
</span>Cc: Grazvydas Ignotas <<a href="mailto:notasas@gmail.com">notasas@gmail.com</a>><br>
---<br>
 src/intel/vulkan/anv_batch_<wbr>chain.c | 34 ++++++++++++++++++++++--------<wbr>----<br>
 1 file changed, 22 insertions(+), 12 deletions(-)<br>
<br>
diff --git a/src/intel/vulkan/anv_batch_<wbr>chain.c b/src/intel/vulkan/anv_batch_<wbr>chain.c<br>
index 9def174b42..45952da012 100644<br>
<div><div class="h5">--- a/src/intel/vulkan/anv_batch_<wbr>chain.c<br>
+++ b/src/intel/vulkan/anv_batch_<wbr>chain.c<br>
@@ -214,6 +214,26 @@ anv_batch_emit_dwords(struct anv_batch *batch, int num_dwords)<br>
    return p;<br>
 }<br>
<br>
+static inline uint64_t sign_extend(uint64_t value, int index)<br>
+{<br>
+   int shift = 63 - index;<br>
+   return (int64_t)(value << shift) >> shift;<br>
+}<br>
+<br>
+static uint64_t gen8_canonical_address(uint64_<wbr>t address)<br>
+{<br>
+   /* From the Broadwell PRM Vol. 2a, MI_LOAD_REGISTER_MEM::<wbr>MemoryAddress:<br>
+    *<br>
+    *    "This field specifies the address of the memory location where the<br>
+    *    register value specified in the DWord above will read from. The<br>
+    *    address specifies the DWord location of the data. Range =<br>
+    *    GraphicsVirtualAddress[63:2] for a DWord register GraphicsAddress<br>
+    *    [63:48] are ignored by the HW and assumed to be in correct<br>
+    *    canonical form [63:48] == [47]."<br>
+    */<br>
+   return sign_extend(address, 47);<br>
+}<br>
+<br>
 uint64_t<br>
 anv_batch_emit_reloc(struct anv_batch *batch,<br>
                      void *location, struct anv_bo *bo, uint32_t delta)<br>
@@ -225,7 +245,7 @@ anv_batch_emit_reloc(struct anv_batch *batch,<br>
       return 0;<br>
    }<br>
<br>
-   return bo->offset + delta;<br>
+   return gen8_canonical_address(bo-><wbr>offset + delta);<br>
 }<br>
<br>
 void<br>
</div></div>@@ -1076,18 +1096,8 @@ write_reloc(const struct anv_device *device, void *p, uint64_t v, bool flush)<br>
<span class="im HOEnZb"> {<br>
    unsigned reloc_size = 0;<br>
    if (device->info.gen >= 8) {<br>
-      /* From the Broadwell PRM Vol. 2a, MI_LOAD_REGISTER_MEM::<wbr>MemoryAddress:<br>
-       *<br>
-       *    "This field specifies the address of the memory location where the<br>
-       *    register value specified in the DWord above will read from. The<br>
-       *    address specifies the DWord location of the data. Range =<br>
-       *    GraphicsVirtualAddress[63:2] for a DWord register GraphicsAddress<br>
-       *    [63:48] are ignored by the HW and assumed to be in correct<br>
-       *    canonical form [63:48] == [47]."<br>
-       */<br>
-      const int shift = 63 - 47;<br>
</span><span class="im HOEnZb">       reloc_size = sizeof(uint64_t);<br>
-      *(uint64_t *)p = (((int64_t)v) << shift) >> shift;<br>
+      *(uint64_t *)p = gen8_canonical_address(v);<br>
    } else {<br>
       reloc_size = sizeof(uint32_t);<br>
       *(uint32_t *)p = v;<br>
--<br>
2.11.0<br>
<br>
</span><div class="HOEnZb"><div class="h5">______________________________<wbr>_________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/<wbr>mailman/listinfo/mesa-dev</a><br>
</div></div></blockquote></div><br></div>