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

Chris Wilson chris at chris-wilson.co.uk
Thu May 11 11:17:39 UTC 2017


On Thu, May 11, 2017 at 01:51:40PM +0300, Grazvydas Ignotas wrote:
> 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?

That would be wise for bsw and friends.
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre


More information about the mesa-dev mailing list