Re: [PATCH v2 2/2] drm/i915/gtt: Avoid using addresses in non-canonical form.

Chris Wilson
2015-09-15T20:03:27Z

On Tue, Sep 15, 2015 at 08:04:27PM +0200, Michał Winiarski wrote:
> According to bspec, some parts of HW expect the addresses to be in
> a canonical form where bits [63:48] == [47].
> If we're using 32b addressing, we never need to handle such high
> addresses, but since we've recently added 48b address space support,
> lets satisfy the HW by converting the address prior to
> alloc/insert/clear.

Ah, that makes sense - it is only the PDE (et al) that you are setting,
right?

> if (USES_FULL_48BIT_PPGTT(vm->dev))
> - return gen8_alloc_va_range_4lvl(vm, &ppgtt->pml4, start, length);
> + return gen8_alloc_va_range_4lvl(vm, &ppgtt->pml4,
> + gen8_canonical_addr(start),
> + length);
> else
> return gen8_alloc_va_range_3lvl(vm, &ppgtt->pdp, start, length);

Whilst we cannot have the high bit set if !48b, if we just
start = gen8_canonical_addr(start);
and used the same start for both paths here, that feels more organized -
or have I misunderstand where the high bits needs to be set? In which
case please add a comment.
-Chris

--
Chris Wilson, Intel Open Source Technology Centre