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@xxxxxxx> > > 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@xxxxxxx> >> --- >> .../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 _______________________________________________ amd-gfx mailing list amd-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/amd-gfx