[Intel-gfx] [PATCH v6 04/19] drm/i915/gen8: Generalize PTE writing for GEN8 PPGTT

Michel Thierry michel.thierry at intel.com
Thu Jul 30 02:31:28 PDT 2015


On 7/30/2015 5:46 AM, Goel, Akash wrote:
> On 7/29/2015 9:53 PM, Michel Thierry wrote:
>> The insert_entries function was the function used to write PTEs. For the
>> PPGTT it was "hardcoded" to only understand two level page tables, which
>> was the case for GEN7. We can reuse this for 4 level page tables, and
>> remove the concept of insert_entries, which was never viable past 2
>> level page tables anyway, but it requires a bit of rework to make the
>> function a bit more generic.
>>
>> This patch begins the generalization work, and it will be heavily used
>> upon when the 48b code is complete. The patch series attempts to make
>> each function which touches a part of code specific to the page table
>> level and here is no exception.
>>
>> v2: Rebase after Mika's ppgtt cleanup / scratch merge patch series.
>> v3: Rebase after final merged version of Mika's ppgtt/scratch patches.
>>
>> Signed-off-by: Ben Widawsky <ben at bwidawsk.net>
>> Signed-off-by: Michel Thierry <michel.thierry at intel.com> (v2)
>> ---
>>   drivers/gpu/drm/i915/i915_gem_gtt.c | 52
>> +++++++++++++++++++++++++++----------
>>   1 file changed, 39 insertions(+), 13 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c
>> b/drivers/gpu/drm/i915/i915_gem_gtt.c
>> index bd56979..f338a13 100644
>> --- a/drivers/gpu/drm/i915/i915_gem_gtt.c
>> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
>> @@ -600,24 +600,21 @@ static int gen8_mm_switch(struct i915_hw_ppgtt
>> *ppgtt,
>>       return 0;
>>   }
>>
>> -static void gen8_ppgtt_clear_range(struct i915_address_space *vm,
>> -                   uint64_t start,
>> -                   uint64_t length,
>> -                   bool use_scratch)
>> +static void gen8_ppgtt_clear_pte_range(struct i915_address_space *vm,
>> +                       struct i915_page_directory_pointer *pdp,
>> +                       uint64_t start,
>> +                       uint64_t length,
>> +                       gen8_pte_t scratch_pte)
>>   {
>>       struct i915_hw_ppgtt *ppgtt =
>>           container_of(vm, struct i915_hw_ppgtt, base);
>> -    struct i915_page_directory_pointer *pdp = &ppgtt->pdp; /* FIXME:
>> 48b */
>> -    gen8_pte_t *pt_vaddr, scratch_pte;
>> +    gen8_pte_t *pt_vaddr;
>>       unsigned pdpe = start >> GEN8_PDPE_SHIFT & GEN8_PDPE_MASK;
>>       unsigned pde = start >> GEN8_PDE_SHIFT & GEN8_PDE_MASK;
>>       unsigned pte = start >> GEN8_PTE_SHIFT & GEN8_PTE_MASK;
>>       unsigned num_entries = length >> PAGE_SHIFT;
>>       unsigned last_pte, i;
>>
>> -    scratch_pte = gen8_pte_encode(px_dma(ppgtt->base.scratch_page),
>> -                      I915_CACHE_LLC, use_scratch);
>> -
>
> Sorry for the late comment.
> Would it be better to have a WARN_ON check here on NULL value of pdp
> pointer, considering the pdp will no longer be static in case of 48 bit.
>
> Actually there are already such checks used in this function for pd, pt
> and page pointers.
>
> Best regards
> Akash
>

Ok, I'll add the extra WARN_ON(!pdp).

-Michel


More information about the Intel-gfx mailing list