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: Harish Kasiviswanathan <Harish.Kasiviswanathan@amd.com> Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com> Reviewed-by: Oded Gabbay <oded.gabbay@gmail.com> Signed-off-by: Oded Gabbay <oded.gabbay@gmail.com>
This commit is contained in:
parent
4f449311e9
commit
6d82eb0ef2
|
@ -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)
|
||||||
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);
|
||||||
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)
|
||||||
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)
|
||||||
|
|
||||||
up_read(&topology_lock);
|
up_read(&topology_lock);
|
||||||
|
|
||||||
return device;
|
return -1;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue