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

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
...@@ -1939,27 +1939,17 @@ void hl_notifier_event_send_all(struct hl_device *hdev, u64 event_mask) ...@@ -1939,27 +1939,17 @@ void hl_notifier_event_send_all(struct hl_device *hdev, u64 event_mask)
mutex_unlock(&hdev->fpriv_ctrl_list_lock); mutex_unlock(&hdev->fpriv_ctrl_list_lock);
} }
/* static int create_cdev(struct hl_device *hdev, struct class *hclass)
* 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;
char *name; char *name;
bool add_cdev_sysfs_on_err = false; int rc;
hdev->cdev_idx = hdev->id / 2; hdev->cdev_idx = hdev->id / 2;
name = kasprintf(GFP_KERNEL, "hl%d", hdev->cdev_idx); name = kasprintf(GFP_KERNEL, "hl%d", hdev->cdev_idx);
if (!name) { if (!name) {
rc = -ENOMEM; rc = -ENOMEM;
goto out_disabled; goto out_err;
} }
/* Initialize cdev and device structures */ /* Initialize cdev and device structures */
...@@ -1969,7 +1959,7 @@ int hl_device_init(struct hl_device *hdev, struct class *hclass) ...@@ -1969,7 +1959,7 @@ int hl_device_init(struct hl_device *hdev, struct class *hclass)
kfree(name); kfree(name);
if (rc) if (rc)
goto out_disabled; goto out_err;
name = kasprintf(GFP_KERNEL, "hl_controlD%d", hdev->cdev_idx); name = kasprintf(GFP_KERNEL, "hl_controlD%d", hdev->cdev_idx);
if (!name) { if (!name) {
...@@ -1986,10 +1976,36 @@ int hl_device_init(struct hl_device *hdev, struct class *hclass) ...@@ -1986,10 +1976,36 @@ int hl_device_init(struct hl_device *hdev, struct class *hclass)
if (rc) if (rc)
goto free_dev; 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 */ /* Initialize ASIC function pointers and perform early init */
rc = device_early_init(hdev); rc = device_early_init(hdev);
if (rc) if (rc)
goto free_dev_ctrl; goto free_dev;
user_interrupt_cnt = hdev->asic_prop.user_dec_intr_count + user_interrupt_cnt = hdev->asic_prop.user_dec_intr_count +
hdev->asic_prop.user_interrupt_count; hdev->asic_prop.user_interrupt_count;
...@@ -2241,9 +2257,8 @@ int hl_device_init(struct hl_device *hdev, struct class *hclass) ...@@ -2241,9 +2257,8 @@ int hl_device_init(struct hl_device *hdev, struct class *hclass)
kfree(hdev->user_interrupt); kfree(hdev->user_interrupt);
early_fini: early_fini:
device_early_fini(hdev); device_early_fini(hdev);
free_dev_ctrl:
put_device(hdev->dev_ctrl);
free_dev: free_dev:
put_device(hdev->dev_ctrl);
put_device(hdev->dev); put_device(hdev->dev);
out_disabled: out_disabled:
hdev->disabled = true; hdev->disabled = true;
......
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