[PATCH 1/2] drm/amdkfd: Record vmid pasid mapping in the driver for non HWS mode

Zhao, Yong Yong.Zhao at amd.com
Thu Sep 26 21:59:35 UTC 2019


On 2019-09-26 5:36 p.m., Kuehling, Felix wrote:
> Minor nit-pick inline. Otherwise this patch is
>
> Reviewed-by: Felix Kuehling <Felix.Kuehling at amd.com>
>
> On 2019-09-26 5:27 p.m., Zhao, Yong wrote:
>> This makes possible the vmid pasid mapping query through software.
>>
>> Change-Id: Ib539aae277a227cc39f6469ae23c46c4d289b87b
>> Signed-off-by: Yong Zhao <Yong.Zhao at amd.com>
>> ---
>>    .../drm/amd/amdkfd/kfd_device_queue_manager.c | 33 ++++++++++++-------
>>    .../drm/amd/amdkfd/kfd_device_queue_manager.h |  3 +-
>>    drivers/gpu/drm/amd/amdkfd/kfd_priv.h         |  2 ++
>>    3 files changed, 25 insertions(+), 13 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
>> index e7f0a32e0e44..455f49a25ccb 100644
>> --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
>> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.c
>> @@ -224,20 +224,30 @@ static int allocate_vmid(struct device_queue_manager *dqm,
>>    			struct qcm_process_device *qpd,
>>    			struct queue *q)
>>    {
>> -	int bit, allocated_vmid;
>> +	int allocated_vmid = -1, i;
>>    
>> -	if (dqm->vmid_bitmap == 0)
>> -		return -ENOMEM;
>> +	for (i = dqm->dev->vm_info.first_vmid_kfd;
>> +			i <= dqm->dev->vm_info.last_vmid_kfd; i++) {
>> +		if (!dqm->vmid_pasid[i]) {
>> +			allocated_vmid = i;
>> +			break;
>> +		}
>> +	}
>> +
>> +	if (allocated_vmid < 0) {
>> +		pr_err("no more vmid to allocate\n");
>> +		return -ENOSPC;
>> +	}
>> +
>> +	pr_debug("vmid allocated: %d\n", allocated_vmid);
>> +
>> +	dqm->vmid_pasid[allocated_vmid] = q->process->pasid;
>>    
>> -	bit = ffs(dqm->vmid_bitmap) - 1;
>> -	dqm->vmid_bitmap &= ~(1 << bit);
>> +	set_pasid_vmid_mapping(dqm, q->process->pasid, allocated_vmid);
>>    
>> -	allocated_vmid = bit + dqm->dev->vm_info.first_vmid_kfd;
>> -	pr_debug("vmid allocation %d\n", allocated_vmid);
>>    	qpd->vmid = allocated_vmid;
>>    	q->properties.vmid = allocated_vmid;
>>    
>> -	set_pasid_vmid_mapping(dqm, q->process->pasid, q->properties.vmid);
>>    	program_sh_mem_settings(dqm, qpd);
>>    
>>    	/* qpd->page_table_base is set earlier when register_process()
>> @@ -278,8 +288,6 @@ static void deallocate_vmid(struct device_queue_manager *dqm,
>>    				struct qcm_process_device *qpd,
>>    				struct queue *q)
>>    {
>> -	int bit = qpd->vmid - dqm->dev->vm_info.first_vmid_kfd;
>> -
>>    	/* On GFX v7, CP doesn't flush TC at dequeue */
>>    	if (q->device->device_info->asic_family == CHIP_HAWAII)
>>    		if (flush_texture_cache_nocpsch(q->device, qpd))
>> @@ -289,8 +297,8 @@ static void deallocate_vmid(struct device_queue_manager *dqm,
>>    
>>    	/* Release the vmid mapping */
>>    	set_pasid_vmid_mapping(dqm, 0, qpd->vmid);
>> +	dqm->vmid_pasid[qpd->vmid] = 0;
>>    
>> -	dqm->vmid_bitmap |= (1 << bit);
>>    	qpd->vmid = 0;
>>    	q->properties.vmid = 0;
>>    }
>> @@ -1017,7 +1025,8 @@ static int initialize_nocpsch(struct device_queue_manager *dqm)
>>    				dqm->allocated_queues[pipe] |= 1 << queue;
>>    	}
>>    
>> -	dqm->vmid_bitmap = (1 << dqm->dev->vm_info.vmid_num_kfd) - 1;
>> +	memset(dqm->vmid_pasid, 0, sizeof(dqm->vmid_pasid));
>> +
>>    	dqm->sdma_bitmap = ~0ULL >> (64 - get_num_sdma_queues(dqm));
>>    	dqm->xgmi_sdma_bitmap = ~0ULL >> (64 - get_num_xgmi_sdma_queues(dqm));
>>    
>> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h
>> index eed8f950b663..99c8b36301ef 100644
>> --- a/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h
>> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_device_queue_manager.h
>> @@ -188,7 +188,8 @@ struct device_queue_manager {
>>    	unsigned int		*allocated_queues;
>>    	uint64_t		sdma_bitmap;
>>    	uint64_t		xgmi_sdma_bitmap;
>> -	unsigned int		vmid_bitmap;
>> +	/* the pasid mapping for each kfd vmid */
>> +	uint16_t		vmid_pasid[VMID_NUM];
>>    	uint64_t		pipelines_addr;
>>    	struct kfd_mem_obj	*pipeline_mem;
>>    	uint64_t		fence_gpu_addr;
>> diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
>> index 0d2c7fa1fa46..a08015720841 100644
>> --- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
>> +++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
>> @@ -43,6 +43,8 @@
>>    
>>    #include "amd_shared.h"
>>    
>> +#define VMID_NUM 16
>> +
> Any good reason why this is not defined in kfd_device_queue_manager.h?
> It's only used there.
[yz] It could be used by other places in the future, as they use 16 
directly now.
>
>
>>    #define KFD_MAX_RING_ENTRY_SIZE	8
>>    
>>    #define KFD_SYSFS_FILE_MODE 0444


More information about the amd-gfx mailing list