Commit 6d82eb0e authored by Harish Kasiviswanathan's avatar Harish Kasiviswanathan Committed by Oded Gabbay

drm/amdkfd: Support enumerating non-GPU devices

Modify kfd_topology_enum_kfd_devices(..) function to support non-GPU
nodes. The function returned NULL when it encountered non-GPU (say CPU)
nodes. This caused kfd_ioctl_create_event and kfd_init_apertures to fail
for Intel + Tonga.

kfd_topology_enum_kfd_devices will now parse all the nodes and return
valid kfd_dev for nodes with GPU.
Signed-off-by: default avatarHarish Kasiviswanathan <Harish.Kasiviswanathan@amd.com>
Signed-off-by: default avatarFelix Kuehling <Felix.Kuehling@amd.com>
Reviewed-by: default avatarOded Gabbay <oded.gabbay@gmail.com>
Signed-off-by: default avatarOded Gabbay <oded.gabbay@gmail.com>
parent 4f449311
...@@ -300,9 +300,14 @@ int kfd_init_apertures(struct kfd_process *process) ...@@ -300,9 +300,14 @@ int kfd_init_apertures(struct kfd_process *process)
struct kfd_process_device *pdd; struct kfd_process_device *pdd;
/*Iterating over all devices*/ /*Iterating over all devices*/
while ((dev = kfd_topology_enum_kfd_devices(id)) != NULL && while (kfd_topology_enum_kfd_devices(id, &dev) == 0 &&
id < NUM_OF_SUPPORTED_GPUS) { id < NUM_OF_SUPPORTED_GPUS) {
if (!dev) {
id++; /* Skip non GPU devices */
continue;
}
pdd = kfd_create_process_device_data(dev, process); pdd = kfd_create_process_device_data(dev, process);
if (!pdd) { if (!pdd) {
pr_err("Failed to create process device data\n"); pr_err("Failed to create process device data\n");
......
...@@ -59,7 +59,7 @@ unsigned int kfd_pasid_alloc(void) ...@@ -59,7 +59,7 @@ unsigned int kfd_pasid_alloc(void)
struct kfd_dev *dev = NULL; struct kfd_dev *dev = NULL;
unsigned int i = 0; unsigned int i = 0;
while ((dev = kfd_topology_enum_kfd_devices(i)) != NULL) { while ((kfd_topology_enum_kfd_devices(i, &dev)) == 0) {
if (dev && dev->kfd2kgd) { if (dev && dev->kfd2kgd) {
kfd2kgd = dev->kfd2kgd; kfd2kgd = dev->kfd2kgd;
break; break;
......
...@@ -670,7 +670,7 @@ int kfd_topology_add_device(struct kfd_dev *gpu); ...@@ -670,7 +670,7 @@ int kfd_topology_add_device(struct kfd_dev *gpu);
int kfd_topology_remove_device(struct kfd_dev *gpu); int kfd_topology_remove_device(struct kfd_dev *gpu);
struct kfd_dev *kfd_device_by_id(uint32_t gpu_id); struct kfd_dev *kfd_device_by_id(uint32_t gpu_id);
struct kfd_dev *kfd_device_by_pci_dev(const struct pci_dev *pdev); struct kfd_dev *kfd_device_by_pci_dev(const struct pci_dev *pdev);
struct kfd_dev *kfd_topology_enum_kfd_devices(uint8_t idx); int kfd_topology_enum_kfd_devices(uint8_t idx, struct kfd_dev **kdev);
/* Interrupts */ /* Interrupts */
int kfd_interrupt_init(struct kfd_dev *dev); int kfd_interrupt_init(struct kfd_dev *dev);
......
...@@ -927,22 +927,26 @@ int kfd_topology_remove_device(struct kfd_dev *gpu) ...@@ -927,22 +927,26 @@ int kfd_topology_remove_device(struct kfd_dev *gpu)
return res; return res;
} }
/* /* kfd_topology_enum_kfd_devices - Enumerate through all devices in KFD
* When idx is out of bounds, the function will return NULL * topology. If GPU device is found @idx, then valid kfd_dev pointer is
* returned through @kdev
* Return - 0: On success (@kdev will be NULL for non GPU nodes)
* -1: If end of list
*/ */
struct kfd_dev *kfd_topology_enum_kfd_devices(uint8_t idx) int kfd_topology_enum_kfd_devices(uint8_t idx, struct kfd_dev **kdev)
{ {
struct kfd_topology_device *top_dev; struct kfd_topology_device *top_dev;
struct kfd_dev *device = NULL;
uint8_t device_idx = 0; uint8_t device_idx = 0;
*kdev = NULL;
down_read(&topology_lock); down_read(&topology_lock);
list_for_each_entry(top_dev, &topology_device_list, list) { list_for_each_entry(top_dev, &topology_device_list, list) {
if (device_idx == idx) { if (device_idx == idx) {
device = top_dev->gpu; *kdev = top_dev->gpu;
break; up_read(&topology_lock);
return 0;
} }
device_idx++; device_idx++;
...@@ -950,7 +954,7 @@ struct kfd_dev *kfd_topology_enum_kfd_devices(uint8_t idx) ...@@ -950,7 +954,7 @@ struct kfd_dev *kfd_topology_enum_kfd_devices(uint8_t idx)
up_read(&topology_lock); up_read(&topology_lock);
return device; return -1;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment