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. > #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