Minor nit-pick inline. Otherwise this patch is

Reviewed-by: Felix Kuehling <felix.kuehl...@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.z...@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.


>   #define KFD_MAX_RING_ENTRY_SIZE     8
>   
>   #define KFD_SYSFS_FILE_MODE 0444
_______________________________________________
amd-gfx mailing list
amd-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/amd-gfx

Reply via email to