Commit 89859a89 authored by Oded Gabbay's avatar Oded Gabbay
Browse files

accel/habanalabs: split cdev creation to separate function



Move the cdev creation code from the main hdev init function to
a separate function. This will make the code more readable once we
add the accel registration code (instead/in addition to legacy
cdev).

Signed-off-by: default avatarOded Gabbay <ogabbay@kernel.org>
Reviewed-by: default avatarTomer Tayar <ttayar@habana.ai>
Reviewed-by: default avatarStanislaw Gruszka <stanislaw.gruszka@linux.intel.com>
parent 4b9c2d36
Loading
Loading
Loading
Loading
+32 −17
Original line number Diff line number Diff line
@@ -1939,27 +1939,17 @@ void hl_notifier_event_send_all(struct hl_device *hdev, u64 event_mask)
	mutex_unlock(&hdev->fpriv_ctrl_list_lock);
}

/*
 * hl_device_init - main initialization function for habanalabs device
 *
 * @hdev: pointer to habanalabs device structure
 *
 * Allocate an id for the device, do early initialization and then call the
 * ASIC specific initialization functions. Finally, create the cdev and the
 * Linux device to expose it to the user
 */
int hl_device_init(struct hl_device *hdev, struct class *hclass)
static int create_cdev(struct hl_device *hdev, struct class *hclass)
{
	int i, rc, cq_cnt, user_interrupt_cnt, cq_ready_cnt;
	char *name;
	bool add_cdev_sysfs_on_err = false;
	int rc;

	hdev->cdev_idx = hdev->id / 2;

	name = kasprintf(GFP_KERNEL, "hl%d", hdev->cdev_idx);
	if (!name) {
		rc = -ENOMEM;
		goto out_disabled;
		goto out_err;
	}

	/* Initialize cdev and device structures */
@@ -1969,7 +1959,7 @@ int hl_device_init(struct hl_device *hdev, struct class *hclass)
	kfree(name);

	if (rc)
		goto out_disabled;
		goto out_err;

	name = kasprintf(GFP_KERNEL, "hl_controlD%d", hdev->cdev_idx);
	if (!name) {
@@ -1986,10 +1976,36 @@ int hl_device_init(struct hl_device *hdev, struct class *hclass)
	if (rc)
		goto free_dev;

	return 0;

free_dev:
	put_device(hdev->dev);
out_err:
	return rc;
}

/*
 * hl_device_init - main initialization function for habanalabs device
 *
 * @hdev: pointer to habanalabs device structure
 *
 * Allocate an id for the device, do early initialization and then call the
 * ASIC specific initialization functions. Finally, create the cdev and the
 * Linux device to expose it to the user
 */
int hl_device_init(struct hl_device *hdev, struct class *hclass)
{
	int i, rc, cq_cnt, user_interrupt_cnt, cq_ready_cnt;
	bool add_cdev_sysfs_on_err = false;

	rc = create_cdev(hdev, hclass);
	if (rc)
		goto out_disabled;

	/* Initialize ASIC function pointers and perform early init */
	rc = device_early_init(hdev);
	if (rc)
		goto free_dev_ctrl;
		goto free_dev;

	user_interrupt_cnt = hdev->asic_prop.user_dec_intr_count +
				hdev->asic_prop.user_interrupt_count;
@@ -2241,9 +2257,8 @@ int hl_device_init(struct hl_device *hdev, struct class *hclass)
	kfree(hdev->user_interrupt);
early_fini:
	device_early_fini(hdev);
free_dev_ctrl:
	put_device(hdev->dev_ctrl);
free_dev:
	put_device(hdev->dev_ctrl);
	put_device(hdev->dev);
out_disabled:
	hdev->disabled = true;