[PATCH 1/2] drm/amdgpu: add support for inplace IB patching for MM engines v2

James Zhu jamesz at amd.com
Wed Jul 25 12:53:25 UTC 2018


Hi Christian,

Sure, Let me find a time to try this afternoon.

Best Regards!

James Zhu


On 2018-07-25 08:18 AM, Christian König wrote:
> Hi James,
>
> can you give those two patches another try on a Vega20? At least in 
> theory it should work now.
>
> Thanks in advance,
> Christian.
>
> Am 25.07.2018 um 13:05 schrieb Christian König:
>> We are going to need that for the second UVD instance on Vega20.
>>
>> v2: rename to patch_cs_in_place
>>
>> Signed-off-by: Christian König <christian.koenig at amd.com>
>> ---
>>   drivers/gpu/drm/amd/amdgpu/amdgpu.h      |  1 +
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c   | 22 +++++++++++++++-------
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h |  1 +
>>   3 files changed, 17 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h 
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
>> index a9f09daeffa3..3ec1f31b892c 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h
>> @@ -1751,6 +1751,7 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring)
>>   #define amdgpu_vm_write_pte(adev, ib, pe, value, count, incr) 
>> ((adev)->vm_manager.vm_pte_funcs->write_pte((ib), (pe), (value), 
>> (count), (incr)))
>>   #define amdgpu_vm_set_pte_pde(adev, ib, pe, addr, count, incr, 
>> flags) ((adev)->vm_manager.vm_pte_funcs->set_pte_pde((ib), (pe), 
>> (addr), (count), (incr), (flags)))
>>   #define amdgpu_ring_parse_cs(r, p, ib) ((r)->funcs->parse_cs((p), 
>> (ib)))
>> +#define amdgpu_ring_patch_cs_in_place(r, p, ib) 
>> ((r)->funcs->patch_cs_in_place((p), (ib)))
>>   #define amdgpu_ring_test_ring(r) (r)->funcs->test_ring((r))
>>   #define amdgpu_ring_test_ib(r, t) (r)->funcs->test_ib((r), (t))
>>   #define amdgpu_ring_get_rptr(r) (r)->funcs->get_rptr((r))
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c 
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
>> index 7c5cc33d0cda..566e2c51931b 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
>> @@ -916,7 +916,7 @@ static int amdgpu_cs_ib_vm_chunk(struct 
>> amdgpu_device *adev,
>>       int r;
>>         /* Only for UVD/VCE VM emulation */
>> -    if (p->ring->funcs->parse_cs) {
>> +    if (p->ring->funcs->parse_cs || 
>> p->ring->funcs->patch_cs_in_place) {
>>           unsigned i, j;
>>             for (i = 0, j = 0; i < p->nchunks && j < p->job->num_ibs; 
>> i++) {
>> @@ -957,12 +957,20 @@ static int amdgpu_cs_ib_vm_chunk(struct 
>> amdgpu_device *adev,
>>               offset = m->start * AMDGPU_GPU_PAGE_SIZE;
>>               kptr += va_start - offset;
>>   -            memcpy(ib->ptr, kptr, chunk_ib->ib_bytes);
>> -            amdgpu_bo_kunmap(aobj);
>> -
>> -            r = amdgpu_ring_parse_cs(ring, p, j);
>> -            if (r)
>> -                return r;
>> +            if (p->ring->funcs->parse_cs) {
>> +                memcpy(ib->ptr, kptr, chunk_ib->ib_bytes);
>> +                amdgpu_bo_kunmap(aobj);
>> +
>> +                r = amdgpu_ring_parse_cs(ring, p, j);
>> +                if (r)
>> +                    return r;
>> +            } else {
>> +                ib->ptr = (uint32_t *)kptr;
>> +                r = amdgpu_ring_patch_cs_in_place(ring, p, j);
>> +                amdgpu_bo_kunmap(aobj);
>> +                if (r)
>> +                    return r;
>> +            }
>>                 j++;
>>           }
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h 
>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
>> index 5018c0b6bf1a..d242b9a51e90 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ring.h
>> @@ -123,6 +123,7 @@ struct amdgpu_ring_funcs {
>>       void (*set_wptr)(struct amdgpu_ring *ring);
>>       /* validating and patching of IBs */
>>       int (*parse_cs)(struct amdgpu_cs_parser *p, uint32_t ib_idx);
>> +    int (*patch_cs_in_place)(struct amdgpu_cs_parser *p, uint32_t 
>> ib_idx);
>>       /* constants to calculate how many DW are needed for an emit */
>>       unsigned emit_frame_size;
>>       unsigned emit_ib_size;
>



More information about the amd-gfx mailing list