[PATCH 01/14] drm/cirrus: split out bo unpinning from cirrus_bo_push_sysram

Varad Gautam varadgautam at gmail.com
Tue Sep 5 13:04:50 UTC 2017


Hi Gabriel,

On Mon, Sep 4, 2017 at 4:11 PM, Gabriel Krisman Bertazi
<krisman at collabora.co.uk> wrote:
> Varad Gautam <varadgautam at gmail.com> writes:
>
>
>>  int cirrus_bo_push_sysram(struct cirrus_bo *bo)
>>  {
>>       int i, ret;
>> -     if (!bo->pin_count) {
>> +
>> +     ret = cirrus_bo_reserve(bo, false);
>> +     if (ret)
>> +             return ret;
>> +
>> +     if (bo->pin_count) {
>>               DRM_ERROR("unpin bad %p\n", bo);
>> -             return 0;
>> +             goto out;
>>       }
>> -     bo->pin_count--;
>> -     if (bo->pin_count)
>> -             return 0;
>
> Can you adjust this to also use your version of cirrus_bo_unpin()?
>
> Also, If I'm not mistaken, this hunk unbalances pin_count, since you
> no longer decrement it after unpinning.
>

Do you mean we also need to call bo_unpin() from push_sysram?

With this patch, we unpin immediately before calling push_sysram(),
and only allow non-pinned bo-s to be moved to sysram (pin_count
decrements in cirrus_bo_unpin preserving pinning state). With atomic
handlers later (patch 10+), pin-unpin happens from prepare/cleanup_fb,
and a later prepare_fb calls push_sysram() on the bo - so the
pin_count maintains.

Thanks,
Varad

>>
>>       if (bo->kmap.virtual)
>>               ttm_bo_kunmap(&bo->kmap);
>> @@ -400,9 +432,12 @@ int cirrus_bo_push_sysram(struct cirrus_bo *bo)
>>       ret = ttm_bo_validate(&bo->bo, &bo->placement, false, false);
>>       if (ret) {
>>               DRM_ERROR("pushing to VRAM failed\n");
>> -             return ret;
>> +             goto out;
>>       }
>> -     return 0;
>> +
>> +out:
>> +     cirrus_bo_unreserve(bo);
>> +     return ret;
>>  }
>>
>>  int cirrus_mmap(struct file *filp, struct vm_area_struct *vma)
>
> --
> Gabriel Krisman Bertazi


More information about the dri-devel mailing list