[Mesa-dev] [PATCH] anv: Canonicalize known offsets

Grazvydas Ignotas notasas at gmail.com
Thu May 11 10:51:40 UTC 2017


On Thu, May 11, 2017 at 11:09 AM, Chris Wilson <chris at chris-wilson.co.uk> wrote:
> When we add the reloc, we write the value of the relocation target using
> non-canonical form. If we later patch up the address prior to command
> submission, we will rewrite it using canonical form. We should always
> write the address in canonical form in case we skip the relocation (as
> the target did not move since creation of the relocation).
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Cc: Jason Ekstrand <jason.ekstrand at intel.com>
> ---
>  src/intel/vulkan/anv_batch_chain.c | 35 ++++++++++++++++++++++-------------
>  1 file changed, 22 insertions(+), 13 deletions(-)
>
> diff --git a/src/intel/vulkan/anv_batch_chain.c b/src/intel/vulkan/anv_batch_chain.c
> index 73ed82e7a5..93df210b61 100644
> --- a/src/intel/vulkan/anv_batch_chain.c
> +++ b/src/intel/vulkan/anv_batch_chain.c
> @@ -214,6 +214,26 @@ anv_batch_emit_dwords(struct anv_batch *batch, int num_dwords)
>     return p;
>  }
>
> +static inline uint64_t sign_extend(uint64_t value, int index)
> +{
> +   int shift = 63 - index;
> +   return (int64_t)(value << shift) >> shift;
> +}
> +
> +static uint64_t gen8_canonical_address(uint64_t address)
> +{
> +   /* From the Broadwell PRM Vol. 2a, MI_LOAD_REGISTER_MEM::MemoryAddress:
> +    *
> +    *    "This field specifies the address of the memory location where the
> +    *    register value specified in the DWord above will read from. The
> +    *    address specifies the DWord location of the data. Range =
> +    *    GraphicsVirtualAddress[63:2] for a DWord register GraphicsAddress
> +    *    [63:48] are ignored by the HW and assumed to be in correct
> +    *    canonical form [63:48] == [47]."
> +    */
> +   return sign_extend(address, 47);
> +}
> +
>  uint64_t
>  anv_batch_emit_reloc(struct anv_batch *batch,
>                       void *location, struct anv_bo *bo, uint32_t delta)
> @@ -225,7 +245,7 @@ anv_batch_emit_reloc(struct anv_batch *batch,
>        return 0;
>     }
>
> -   return bo->offset + delta;
> +   return gen8_canonical_address(bo->offset + delta);
>  }
>
>  void
> @@ -1076,18 +1096,7 @@ write_reloc(const struct anv_device *device, void *p, uint64_t v, bool flush)
>  {
>     unsigned reloc_size = 0;
>     if (device->info.gen >= 8) {
> -      /* From the Broadwell PRM Vol. 2a, MI_LOAD_REGISTER_MEM::MemoryAddress:
> -       *
> -       *    "This field specifies the address of the memory location where the
> -       *    register value specified in the DWord above will read from. The
> -       *    address specifies the DWord location of the data. Range =
> -       *    GraphicsVirtualAddress[63:2] for a DWord register GraphicsAddress
> -       *    [63:48] are ignored by the HW and assumed to be in correct
> -       *    canonical form [63:48] == [47]."
> -       */
> -      const int shift = 63 - 47;
> -      reloc_size = sizeof(uint64_t);

I guess this line should be left alone?

GraÅžvydas


More information about the mesa-dev mailing list