Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+6 −1
Original line number Diff line number Diff line
@@ -300,9 +300,14 @@ int kfd_init_apertures(struct kfd_process *process)
	struct kfd_process_device *pdd;

	/*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) {

		if (!dev) {
			id++; /* Skip non GPU devices */
			continue;
		}

		pdd = kfd_create_process_device_data(dev, process);
		if (!pdd) {
			pr_err("Failed to create process device data\n");
+1 −1
Original line number Diff line number Diff line
@@ -59,7 +59,7 @@ unsigned int kfd_pasid_alloc(void)
		struct kfd_dev *dev = NULL;
		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) {
				kfd2kgd = dev->kfd2kgd;
				break;
+1 −1
Original line number Diff line number Diff line
@@ -670,7 +670,7 @@ int kfd_topology_add_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_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 */
int kfd_interrupt_init(struct kfd_dev *dev);
+11 −7
Original line number Diff line number Diff line
@@ -927,22 +927,26 @@ int kfd_topology_remove_device(struct kfd_dev *gpu)
	return res;
}

/*
 * When idx is out of bounds, the function will return NULL
/* kfd_topology_enum_kfd_devices - Enumerate through all devices in KFD
 *	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_dev *device = NULL;
	uint8_t device_idx = 0;

	*kdev = NULL;
	down_read(&topology_lock);

	list_for_each_entry(top_dev, &topology_device_list, list) {
		if (device_idx == idx) {
			device = top_dev->gpu;
			break;
			*kdev = top_dev->gpu;
			up_read(&topology_lock);
			return 0;
		}

		device_idx++;
@@ -950,7 +954,7 @@ struct kfd_dev *kfd_topology_enum_kfd_devices(uint8_t idx)

	up_read(&topology_lock);

	return device;
	return -1;

}