[Intel-gfx] [PATCH 12/19] drm/i915: support 64K pages for the 48b PPGTT
Matthew Auld
matthew.william.auld at gmail.com
Thu Jun 22 11:27:50 UTC 2017
On 21 June 2017 at 22:55, Chris Wilson <chris at chris-wilson.co.uk> wrote:
> Quoting Matthew Auld (2017-06-21 21:33:38)
>> Signed-off-by: Matthew Auld <matthew.auld at intel.com>
>> Cc: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
>> ---
>> drivers/gpu/drm/i915/i915_gem_gtt.c | 26 ++++++++++++++++++++++++++
>> drivers/gpu/drm/i915/i915_gem_gtt.h | 1 +
>> 2 files changed, 27 insertions(+)
>>
>> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
>> index 03c35097ef39..9b89ec10f333 100644
>> --- a/drivers/gpu/drm/i915/i915_gem_gtt.c
>> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
>> @@ -937,6 +937,7 @@ static void gen8_ppgtt_insert_huge_entries(struct i915_vma *vma,
>> struct i915_page_table *pt = pd->page_table[idx.pde];
>> dma_addr_t rem = iter->max - iter->dma;
>> unsigned int page_size;
>> + bool maybe_64K = false;
>> gen8_pte_t encode = pte_encode;
>> gen8_pte_t *vaddr;
>> u16 index, max;
>> @@ -962,9 +963,17 @@ static void gen8_ppgtt_insert_huge_entries(struct i915_vma *vma,
>> index = idx.pte;
>> max = GEN8_PTES;
>> page_size = I915_GTT_PAGE_SIZE;
>> +
>> + if (vma->page_sizes.sg & I915_GTT_PAGE_SIZE_64K && !idx.pte)
>> + maybe_64K = true;
>> }
>>
>> do {
>> + if (maybe_64K && (index % 16 == 0) &&
>> + (!IS_ALIGNED(iter->dma, I915_GTT_PAGE_SIZE_64K) ||
>> + rem < I915_GTT_PAGE_SIZE_64K))
>> + maybe_64K = false;
>> +
>> vaddr[index++] = encode | iter->dma;
>>
>> start += page_size;
>> @@ -986,6 +995,23 @@ static void gen8_ppgtt_insert_huge_entries(struct i915_vma *vma,
>>
>> kunmap_atomic(vaddr);
>>
>> +
>> + /* Is it safe to mark the 2M block as 64K? -- Either we have
>> + * filled whole page-table with 64K entries, or filled part of
>> + * it and have reached the end of the sg table and we have
>> + * enough padding.
>> + */
>> + if (maybe_64K) {
>> + if (index == max ||
>> + (!iter->sg && IS_ALIGNED(vma->node.start +
>> + vma->node.size,
>> + I915_GTT_PAGE_SIZE_2M))) {
>> + vaddr = kmap_atomic_px(pd);
>> + vaddr[idx.pde] |= GEN8_PDE_IPS_64K;
>> + kunmap_atomic(vaddr);
>> + }
>
> Hmm. I think you know this at the start. It's a bit hard to see from
> this diff why not.
Not sure I follow, what do we know from the start?
> -Chris
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/intel-gfx
More information about the Intel-gfx
mailing list