From: David Yat Sin <david.yat...@amd.com>

When doing a restore on a different node, the gpu_id's on the restore
node may be different. But the user space application will still refer
use the original gpu_id's in the ioctl calls. Adding code to create a
gpu id mapping so that kfd can determine actual gpu_id during the user
ioctl's.

Signed-off-by: David Yat Sin <david.yat...@amd.com>
Signed-off-by: Rajneesh Bhardwaj <rajneesh.bhard...@amd.com>
Change-Id: I8f72afe847c9ef7b25a902b30516e9043f1b5834
---
 drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | 245 +++++++++++++----------
 drivers/gpu/drm/amd/amdkfd/kfd_priv.h    |   3 +
 drivers/gpu/drm/amd/amdkfd/kfd_process.c |  18 ++
 3 files changed, 157 insertions(+), 109 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
index ce511b246beb..8e92c68eb9c5 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c
@@ -294,13 +294,14 @@ static int kfd_ioctl_create_queue(struct file *filep, 
struct kfd_process *p,
                return err;
 
        pr_debug("Looking for gpu id 0x%x\n", args->gpu_id);
-       dev = kfd_device_by_id(args->gpu_id);
-       if (!dev) {
+
+       mutex_lock(&p->mutex);
+       pdd = kfd_process_device_data_by_id(p, args->gpu_id);
+       if (!pdd) {
                pr_debug("Could not find gpu id 0x%x\n", args->gpu_id);
                return -EINVAL;
        }
-
-       mutex_lock(&p->mutex);
+       dev = pdd->dev;
 
        pdd = kfd_bind_process_to_device(dev, p);
        if (IS_ERR(pdd)) {
@@ -491,7 +492,6 @@ static int kfd_ioctl_set_memory_policy(struct file *filep,
                                        struct kfd_process *p, void *data)
 {
        struct kfd_ioctl_set_memory_policy_args *args = data;
-       struct kfd_dev *dev;
        int err = 0;
        struct kfd_process_device *pdd;
        enum cache_policy default_policy, alternate_policy;
@@ -506,13 +506,15 @@ static int kfd_ioctl_set_memory_policy(struct file *filep,
                return -EINVAL;
        }
 
-       dev = kfd_device_by_id(args->gpu_id);
-       if (!dev)
-               return -EINVAL;
-
        mutex_lock(&p->mutex);
+       pdd = kfd_process_device_data_by_id(p, args->gpu_id);
+       if (!pdd) {
+               pr_debug("Could not find gpu id 0x%x\n", args->gpu_id);
+               err = -EINVAL;
+               goto out;
+       }
 
-       pdd = kfd_bind_process_to_device(dev, p);
+       pdd = kfd_bind_process_to_device(pdd->dev, p);
        if (IS_ERR(pdd)) {
                err = -ESRCH;
                goto out;
@@ -525,7 +527,7 @@ static int kfd_ioctl_set_memory_policy(struct file *filep,
                (args->alternate_policy == KFD_IOC_CACHE_POLICY_COHERENT)
                   ? cache_policy_coherent : cache_policy_noncoherent;
 
-       if (!dev->dqm->ops.set_cache_memory_policy(dev->dqm,
+       if (!pdd->dev->dqm->ops.set_cache_memory_policy(pdd->dev->dqm,
                                &pdd->qpd,
                                default_policy,
                                alternate_policy,
@@ -543,17 +545,18 @@ static int kfd_ioctl_set_trap_handler(struct file *filep,
                                        struct kfd_process *p, void *data)
 {
        struct kfd_ioctl_set_trap_handler_args *args = data;
-       struct kfd_dev *dev;
        int err = 0;
        struct kfd_process_device *pdd;
 
-       dev = kfd_device_by_id(args->gpu_id);
-       if (!dev)
-               return -EINVAL;
-
        mutex_lock(&p->mutex);
 
-       pdd = kfd_bind_process_to_device(dev, p);
+       pdd = kfd_process_device_data_by_id(p, args->gpu_id);
+       if (!pdd) {
+               err = -EINVAL;
+               goto out;
+       }
+
+       pdd = kfd_bind_process_to_device(pdd->dev, p);
        if (IS_ERR(pdd)) {
                err = -ESRCH;
                goto out;
@@ -577,16 +580,20 @@ static int kfd_ioctl_dbg_register(struct file *filep,
        bool create_ok;
        long status = 0;
 
-       dev = kfd_device_by_id(args->gpu_id);
-       if (!dev)
-               return -EINVAL;
+       mutex_lock(&p->mutex);
+       pdd = kfd_process_device_data_by_id(p, args->gpu_id);
+       if (!pdd) {
+               status = -EINVAL;
+               goto out_unlock_p;
+       }
+       dev = pdd->dev;
 
        if (dev->device_info->asic_family == CHIP_CARRIZO) {
                pr_debug("kfd_ioctl_dbg_register not supported on CZ\n");
-               return -EINVAL;
+               status = -EINVAL;
+               goto out_unlock_p;
        }
 
-       mutex_lock(&p->mutex);
        mutex_lock(kfd_get_dbgmgr_mutex());
 
        /*
@@ -596,7 +603,7 @@ static int kfd_ioctl_dbg_register(struct file *filep,
        pdd = kfd_bind_process_to_device(dev, p);
        if (IS_ERR(pdd)) {
                status = PTR_ERR(pdd);
-               goto out;
+               goto out_unlock_dbg;
        }
 
        if (!dev->dbgmgr) {
@@ -614,8 +621,9 @@ static int kfd_ioctl_dbg_register(struct file *filep,
                status = -EINVAL;
        }
 
-out:
+out_unlock_dbg:
        mutex_unlock(kfd_get_dbgmgr_mutex());
+out_unlock_p:
        mutex_unlock(&p->mutex);
 
        return status;
@@ -625,12 +633,18 @@ static int kfd_ioctl_dbg_unregister(struct file *filep,
                                struct kfd_process *p, void *data)
 {
        struct kfd_ioctl_dbg_unregister_args *args = data;
+       struct kfd_process_device *pdd;
        struct kfd_dev *dev;
        long status;
 
-       dev = kfd_device_by_id(args->gpu_id);
-       if (!dev || !dev->dbgmgr)
+       mutex_lock(&p->mutex);
+       pdd = kfd_process_device_data_by_id(p, args->gpu_id);
+       if (!pdd || !pdd->dev->dbgmgr) {
+               mutex_unlock(&p->mutex);
                return -EINVAL;
+       }
+       dev = pdd->dev;
+       mutex_unlock(&p->mutex);
 
        if (dev->device_info->asic_family == CHIP_CARRIZO) {
                pr_debug("kfd_ioctl_dbg_unregister not supported on CZ\n");
@@ -664,6 +678,7 @@ static int kfd_ioctl_dbg_address_watch(struct file *filep,
 {
        struct kfd_ioctl_dbg_address_watch_args *args = data;
        struct kfd_dev *dev;
+       struct kfd_process_device *pdd;
        struct dbg_address_watch_info aw_info;
        unsigned char *args_buff;
        long status;
@@ -673,9 +688,15 @@ static int kfd_ioctl_dbg_address_watch(struct file *filep,
 
        memset((void *) &aw_info, 0, sizeof(struct dbg_address_watch_info));
 
-       dev = kfd_device_by_id(args->gpu_id);
-       if (!dev)
+       mutex_lock(&p->mutex);
+       pdd = kfd_process_device_data_by_id(p, args->gpu_id);
+       if (!pdd) {
+               mutex_unlock(&p->mutex);
+               pr_debug("Could not find gpu id 0x%x\n", args->gpu_id);
                return -EINVAL;
+       }
+       dev = pdd->dev;
+       mutex_unlock(&p->mutex);
 
        if (dev->device_info->asic_family == CHIP_CARRIZO) {
                pr_debug("kfd_ioctl_dbg_wave_control not supported on CZ\n");
@@ -764,6 +785,7 @@ static int kfd_ioctl_dbg_wave_control(struct file *filep,
 {
        struct kfd_ioctl_dbg_wave_control_args *args = data;
        struct kfd_dev *dev;
+       struct kfd_process_device *pdd;
        struct dbg_wave_control_info wac_info;
        unsigned char *args_buff;
        uint32_t computed_buff_size;
@@ -781,9 +803,15 @@ static int kfd_ioctl_dbg_wave_control(struct file *filep,
                                sizeof(wac_info.dbgWave_msg.MemoryVA) +
                                sizeof(wac_info.trapId);
 
-       dev = kfd_device_by_id(args->gpu_id);
-       if (!dev)
+       mutex_lock(&p->mutex);
+       pdd = kfd_process_device_data_by_id(p, args->gpu_id);
+       if (!pdd) {
+               mutex_unlock(&p->mutex);
+               pr_debug("Could not find gpu id 0x%x\n", args->gpu_id);
                return -EINVAL;
+       }
+       dev = pdd->dev;
+       mutex_unlock(&p->mutex);
 
        if (dev->device_info->asic_family == CHIP_CARRIZO) {
                pr_debug("kfd_ioctl_dbg_wave_control not supported on CZ\n");
@@ -847,16 +875,19 @@ static int kfd_ioctl_get_clock_counters(struct file 
*filep,
                                struct kfd_process *p, void *data)
 {
        struct kfd_ioctl_get_clock_counters_args *args = data;
-       struct kfd_dev *dev;
+       struct kfd_process_device *pdd;
 
-       dev = kfd_device_by_id(args->gpu_id);
-       if (dev)
+       mutex_lock(&p->mutex);
+       pdd = kfd_process_device_data_by_id(p, args->gpu_id);
+       if (pdd)
                /* Reading GPU clock counter from KGD */
-               args->gpu_clock_counter = 
amdgpu_amdkfd_get_gpu_clock_counter(dev->kgd);
+               args->gpu_clock_counter = 
amdgpu_amdkfd_get_gpu_clock_counter(pdd->dev->kgd);
        else
                /* Node without GPU resource */
                args->gpu_clock_counter = 0;
 
+       mutex_unlock(&p->mutex);
+
        /* No access to rdtsc. Using raw monotonic time */
        args->cpu_clock_counter = ktime_get_raw_ns();
        args->system_clock_counter = ktime_get_boottime_ns();
@@ -1010,15 +1041,15 @@ static int kmap_event_page(struct kfd_process *p, 
uint64_t event_page_offset)
                return -EINVAL;
        }
 
-       kfd = kfd_device_by_id(GET_GPU_ID(event_page_offset));
-       if (!kfd) {
+       pdd = kfd_process_device_data_by_id(p, GET_GPU_ID(event_page_offset));
+       if (!pdd) {
                pr_err("Getting device by id failed in %s\n", __func__);
                return -EINVAL;
        }
+       kfd = pdd->dev;
 
        pdd = kfd_bind_process_to_device(kfd, p);
        if (IS_ERR(pdd)) {
-               mutex_unlock(&p->mutex);
                return PTR_ERR(pdd);
        }
 
@@ -1026,8 +1057,6 @@ static int kmap_event_page(struct kfd_process *p, 
uint64_t event_page_offset)
                        GET_IDR_HANDLE(event_page_offset));
        if (!mem) {
                pr_err("Can't find BO, offset is 0x%llx\n", event_page_offset);
-
-               mutex_unlock(&p->mutex);
                return -EINVAL;
        }
 
@@ -1119,11 +1148,13 @@ static int kfd_ioctl_set_scratch_backing_va(struct file 
*filep,
        struct kfd_dev *dev;
        long err;
 
-       dev = kfd_device_by_id(args->gpu_id);
-       if (!dev)
-               return -EINVAL;
-
        mutex_lock(&p->mutex);
+       pdd = kfd_process_device_data_by_id(p, args->gpu_id);
+       if (!pdd) {
+               err = -EINVAL;
+               goto bind_process_to_device_fail;
+       }
+       dev = pdd->dev;
 
        pdd = kfd_bind_process_to_device(dev, p);
        if (IS_ERR(pdd)) {
@@ -1151,15 +1182,20 @@ static int kfd_ioctl_get_tile_config(struct file *filep,
                struct kfd_process *p, void *data)
 {
        struct kfd_ioctl_get_tile_config_args *args = data;
-       struct kfd_dev *dev;
+       struct kfd_process_device *pdd;
        struct tile_config config;
        int err = 0;
 
-       dev = kfd_device_by_id(args->gpu_id);
-       if (!dev)
+       mutex_lock(&p->mutex);
+       pdd = kfd_process_device_data_by_id(p, args->gpu_id);
+       if (!pdd) {
+               mutex_unlock(&p->mutex);
                return -EINVAL;
+       }
+
+       amdgpu_amdkfd_get_tile_config(pdd->dev->kgd, &config);
 
-       amdgpu_amdkfd_get_tile_config(dev->kgd, &config);
+       mutex_unlock(&p->mutex);
 
        args->gb_addr_config = config.gb_addr_config;
        args->num_banks = config.num_banks;
@@ -1194,21 +1230,15 @@ static int kfd_ioctl_acquire_vm(struct file *filep, 
struct kfd_process *p,
 {
        struct kfd_ioctl_acquire_vm_args *args = data;
        struct kfd_process_device *pdd;
-       struct kfd_dev *dev;
        struct file *drm_file;
        int ret;
 
-       dev = kfd_device_by_id(args->gpu_id);
-       if (!dev)
-               return -EINVAL;
-
        drm_file = fget(args->drm_fd);
        if (!drm_file)
                return -EINVAL;
 
        mutex_lock(&p->mutex);
-
-       pdd = kfd_get_process_device_data(dev, p);
+       pdd = kfd_process_device_data_by_id(p, args->gpu_id);
        if (!pdd) {
                ret = -EINVAL;
                goto err_unlock;
@@ -1267,19 +1297,23 @@ static int kfd_ioctl_alloc_memory_of_gpu(struct file 
*filep,
        if (args->size == 0)
                return -EINVAL;
 
-       dev = kfd_device_by_id(args->gpu_id);
-       if (!dev)
-               return -EINVAL;
+       mutex_lock(&p->mutex);
+       pdd = kfd_process_device_data_by_id(p, args->gpu_id);
+       if (!pdd) {
+               err = -EINVAL;
+               goto err_unlock;
+       }
+
+       dev = pdd->dev;
 
        if ((flags & KFD_IOC_ALLOC_MEM_FLAGS_PUBLIC) &&
                (flags & KFD_IOC_ALLOC_MEM_FLAGS_VRAM) &&
                !kfd_dev_is_large_bar(dev)) {
                pr_err("Alloc host visible vram on small bar is not allowed\n");
-               return -EINVAL;
+               err = -EINVAL;
+               goto err_unlock;
        }
 
-       mutex_lock(&p->mutex);
-
        pdd = kfd_bind_process_to_device(dev, p);
        if (IS_ERR(pdd)) {
                err = PTR_ERR(pdd);
@@ -1350,17 +1384,12 @@ static int kfd_ioctl_free_memory_of_gpu(struct file 
*filep,
        struct kfd_ioctl_free_memory_of_gpu_args *args = data;
        struct kfd_process_device *pdd;
        void *mem;
-       struct kfd_dev *dev;
        int ret;
        uint64_t size = 0;
 
-       dev = kfd_device_by_id(GET_GPU_ID(args->handle));
-       if (!dev)
-               return -EINVAL;
-
        mutex_lock(&p->mutex);
 
-       pdd = kfd_get_process_device_data(dev, p);
+       pdd = kfd_process_device_data_by_id(p, GET_GPU_ID(args->handle));
        if (!pdd) {
                pr_err("Process device data doesn't exist\n");
                ret = -EINVAL;
@@ -1374,7 +1403,7 @@ static int kfd_ioctl_free_memory_of_gpu(struct file 
*filep,
                goto err_unlock;
        }
 
-       ret = amdgpu_amdkfd_gpuvm_free_memory_of_gpu(dev->kgd,
+       ret = amdgpu_amdkfd_gpuvm_free_memory_of_gpu(pdd->dev->kgd,
                                (struct kgd_mem *)mem, pdd->drm_priv, &size);
 
        /* If freeing the buffer failed, leave the handle in place for
@@ -1397,15 +1426,11 @@ static int kfd_ioctl_map_memory_to_gpu(struct file 
*filep,
        struct kfd_ioctl_map_memory_to_gpu_args *args = data;
        struct kfd_process_device *pdd, *peer_pdd;
        void *mem;
-       struct kfd_dev *dev, *peer;
+       struct kfd_dev *dev;
        long err = 0;
        int i;
        uint32_t *devices_arr = NULL;
 
-       dev = kfd_device_by_id(GET_GPU_ID(args->handle));
-       if (!dev)
-               return -EINVAL;
-
        if (!args->n_devices) {
                pr_debug("Device IDs array empty\n");
                return -EINVAL;
@@ -1429,6 +1454,12 @@ static int kfd_ioctl_map_memory_to_gpu(struct file 
*filep,
        }
 
        mutex_lock(&p->mutex);
+       pdd = kfd_process_device_data_by_id(p, GET_GPU_ID(args->handle));
+       if (!pdd) {
+               err = -EINVAL;
+               goto get_process_device_data_failed;
+       }
+       dev = pdd->dev;
 
        pdd = kfd_bind_process_to_device(dev, p);
        if (IS_ERR(pdd)) {
@@ -1444,21 +1475,21 @@ static int kfd_ioctl_map_memory_to_gpu(struct file 
*filep,
        }
 
        for (i = args->n_success; i < args->n_devices; i++) {
-               peer = kfd_device_by_id(devices_arr[i]);
-               if (!peer) {
+               peer_pdd = kfd_process_device_data_by_id(p, devices_arr[i]);
+               if (!peer_pdd) {
                        pr_debug("Getting device by id failed for 0x%x\n",
                                 devices_arr[i]);
                        err = -EINVAL;
                        goto get_mem_obj_from_handle_failed;
                }
 
-               peer_pdd = kfd_bind_process_to_device(peer, p);
+               peer_pdd = kfd_bind_process_to_device(peer_pdd->dev, p);
                if (IS_ERR(peer_pdd)) {
                        err = PTR_ERR(peer_pdd);
                        goto get_mem_obj_from_handle_failed;
                }
                err = amdgpu_amdkfd_gpuvm_map_memory_to_gpu(
-                       peer->kgd, (struct kgd_mem *)mem, peer_pdd->drm_priv);
+                       peer_pdd->dev->kgd, (struct kgd_mem *)mem, 
peer_pdd->drm_priv);
                if (err) {
                        pr_err("Failed to map to gpu %d/%d\n",
                               i, args->n_devices);
@@ -1477,12 +1508,10 @@ static int kfd_ioctl_map_memory_to_gpu(struct file 
*filep,
 
        /* Flush TLBs after waiting for the page table updates to complete */
        for (i = 0; i < args->n_devices; i++) {
-               peer = kfd_device_by_id(devices_arr[i]);
-               if (WARN_ON_ONCE(!peer))
-                       continue;
-               peer_pdd = kfd_get_process_device_data(peer, p);
+               peer_pdd = kfd_process_device_data_by_id(p, devices_arr[i]);
                if (WARN_ON_ONCE(!peer_pdd))
                        continue;
+
                kfd_flush_tlb(peer_pdd);
        }
 
@@ -1490,6 +1519,7 @@ static int kfd_ioctl_map_memory_to_gpu(struct file *filep,
 
        return err;
 
+get_process_device_data_failed:
 bind_process_to_device_failed:
 get_mem_obj_from_handle_failed:
 map_memory_to_gpu_failed:
@@ -1507,14 +1537,9 @@ static int kfd_ioctl_unmap_memory_from_gpu(struct file 
*filep,
        struct kfd_ioctl_unmap_memory_from_gpu_args *args = data;
        struct kfd_process_device *pdd, *peer_pdd;
        void *mem;
-       struct kfd_dev *dev, *peer;
        long err = 0;
        uint32_t *devices_arr = NULL, i;
 
-       dev = kfd_device_by_id(GET_GPU_ID(args->handle));
-       if (!dev)
-               return -EINVAL;
-
        if (!args->n_devices) {
                pr_debug("Device IDs array empty\n");
                return -EINVAL;
@@ -1538,8 +1563,7 @@ static int kfd_ioctl_unmap_memory_from_gpu(struct file 
*filep,
        }
 
        mutex_lock(&p->mutex);
-
-       pdd = kfd_get_process_device_data(dev, p);
+       pdd = kfd_process_device_data_by_id(p, GET_GPU_ID(args->handle));
        if (!pdd) {
                err = -EINVAL;
                goto bind_process_to_device_failed;
@@ -1553,19 +1577,13 @@ static int kfd_ioctl_unmap_memory_from_gpu(struct file 
*filep,
        }
 
        for (i = args->n_success; i < args->n_devices; i++) {
-               peer = kfd_device_by_id(devices_arr[i]);
-               if (!peer) {
-                       err = -EINVAL;
-                       goto get_mem_obj_from_handle_failed;
-               }
-
-               peer_pdd = kfd_get_process_device_data(peer, p);
+               peer_pdd = kfd_process_device_data_by_id(p, devices_arr[i]);
                if (!peer_pdd) {
-                       err = -ENODEV;
+                       err = -EINVAL;
                        goto get_mem_obj_from_handle_failed;
                }
                err = amdgpu_amdkfd_gpuvm_unmap_memory_from_gpu(
-                       peer->kgd, (struct kgd_mem *)mem, peer_pdd->drm_priv);
+                       peer_pdd->dev->kgd, (struct kgd_mem *)mem, 
peer_pdd->drm_priv);
                if (err) {
                        pr_err("Failed to unmap from gpu %d/%d\n",
                               i, args->n_devices);
@@ -1694,23 +1712,26 @@ static int kfd_ioctl_import_dmabuf(struct file *filep,
        void *mem;
        int r;
 
-       dev = kfd_device_by_id(args->gpu_id);
-       if (!dev)
-               return -EINVAL;
+       mutex_lock(&p->mutex);
+       pdd = kfd_process_device_data_by_id(p, args->gpu_id);
+       if (!pdd) {
+               r = -EINVAL;
+               goto err_unlock;
+       }
 
        dmabuf = dma_buf_get(args->dmabuf_fd);
-       if (IS_ERR(dmabuf))
-               return PTR_ERR(dmabuf);
-
-       mutex_lock(&p->mutex);
+       if (IS_ERR(dmabuf)) {
+               r = PTR_ERR(dmabuf);
+               goto err_unlock;
+       }
 
-       pdd = kfd_bind_process_to_device(dev, p);
+       pdd = kfd_bind_process_to_device(pdd->dev, p);
        if (IS_ERR(pdd)) {
                r = PTR_ERR(pdd);
                goto err_unlock;
        }
 
-       r = amdgpu_amdkfd_gpuvm_import_dmabuf(dev->kgd, dmabuf,
+       r = amdgpu_amdkfd_gpuvm_import_dmabuf(pdd->dev->kgd, dmabuf,
                                              args->va_addr, pdd->drm_priv,
                                              (struct kgd_mem **)&mem, &size,
                                              NULL);
@@ -1744,13 +1765,19 @@ static int kfd_ioctl_smi_events(struct file *filep,
                                struct kfd_process *p, void *data)
 {
        struct kfd_ioctl_smi_events_args *args = data;
-       struct kfd_dev *dev;
+       struct kfd_process_device *pdd;
 
-       dev = kfd_device_by_id(args->gpuid);
-       if (!dev)
+       mutex_lock(&p->mutex);
+
+       pdd = kfd_process_device_data_by_id(p, args->gpuid);
+       if (!pdd) {
+               mutex_unlock(&p->mutex);
                return -EINVAL;
+       }
+
+       mutex_unlock(&p->mutex);
 
-       return kfd_smi_event_open(dev, &args->anon_fd);
+       return kfd_smi_event_open(pdd->dev, &args->anon_fd);
 }
 
 static int kfd_ioctl_set_xnack_mode(struct file *filep,
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h 
b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
index d3265860e78b..b2ea00e7309f 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
@@ -930,6 +930,9 @@ int kfd_process_restore_queues(struct kfd_process *p);
 void kfd_suspend_all_processes(void);
 int kfd_resume_all_processes(void);
 
+struct kfd_process_device *kfd_process_device_data_by_id(struct kfd_process 
*process,
+                               uint32_t gpu_id);
+
 int kfd_process_device_init_vm(struct kfd_process_device *pdd,
                               struct file *drm_file);
 struct kfd_process_device *kfd_bind_process_to_device(struct kfd_dev *dev,
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c 
b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
index bbf21395fb06..604b2b398be2 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
@@ -1424,6 +1424,7 @@ struct kfd_process_device 
*kfd_create_process_device_data(struct kfd_dev *dev,
        pdd->runtime_inuse = false;
        pdd->vram_usage = 0;
        pdd->sdma_past_activity_counter = 0;
+       pdd->user_gpu_id = dev->id;
        atomic64_set(&pdd->evict_duration_counter, 0);
        p->pdds[p->n_pdds++] = pdd;
 
@@ -1897,6 +1898,23 @@ void kfd_flush_tlb(struct kfd_process_device *pdd)
        }
 }
 
+struct kfd_process_device *kfd_process_device_data_by_id(struct kfd_process 
*p, uint32_t gpu_id)
+{
+       int i;
+
+       if (gpu_id) {
+               for (i = 0; i < p->n_pdds; i++) {
+                       struct kfd_process_device *pdd = p->pdds[i];
+
+                       if (pdd->user_gpu_id == gpu_id)
+                               return pdd;
+               }
+
+               WARN_ONCE(1, "Failed to find mapping for gpu = 0x%x\n",  
gpu_id);
+       }
+       return NULL;
+}
+
 #if defined(CONFIG_DEBUG_FS)
 
 int kfd_debugfs_mqds_by_process(struct seq_file *m, void *data)
-- 
2.17.1

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to