Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

accel/qaic: Increase number of in_reset states

'in_reset' holds the state of the device. As part of bringup, the device
needs to be queried to check if it's in a valid state. Add a new state
that indicates that the device is coming up, but not ready for users
yet. Rename to 'dev_state' to better describe the variable.

Signed-off-by: Carl Vanderlip <quic_carlv@quicinc.com>
Reviewed-by: Pranjal Ramajor Asha Kanojiya <quic_pkanojiy@quicinc.com>
Reviewed-by: Jeffrey Hugo <quic_jhugo@quicinc.com>
Signed-off-by: Jeffrey Hugo <quic_jhugo@quicinc.com>
Reviewed-by: Jacek Lawrynowicz <jacek.lawrynowicz@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20231117174337.20174-2-quic_jhugo@quicinc.com

authored by

Carl Vanderlip and committed by
Jeffrey Hugo
44df9a2a ff367087

+28 -18
+11 -2
drivers/accel/qaic/qaic.h
··· 31 31 #define to_drm(qddev) (&(qddev)->drm) 32 32 #define to_accel_kdev(qddev) (to_drm(qddev)->accel->kdev) /* Return Linux device of accel node */ 33 33 34 + enum __packed dev_states { 35 + /* Device is offline or will be very soon */ 36 + QAIC_OFFLINE, 37 + /* Device is booting, not clear if it's in a usable state */ 38 + QAIC_BOOT, 39 + /* Device is fully operational */ 40 + QAIC_ONLINE, 41 + }; 42 + 34 43 extern bool datapath_polling; 35 44 36 45 struct qaic_user { ··· 130 121 struct workqueue_struct *cntl_wq; 131 122 /* Synchronizes all the users of device during cleanup */ 132 123 struct srcu_struct dev_lock; 133 - /* true: Device under reset; false: Device not under reset */ 134 - bool in_reset; 124 + /* Track the state of the device during resets */ 125 + enum dev_states dev_state; 135 126 /* true: single MSI is used to operate device */ 136 127 bool single_msi; 137 128 /*
+3 -2
drivers/accel/qaic/qaic_control.c
··· 1022 1022 int xfer_count = 0; 1023 1023 int retry_count; 1024 1024 1025 - if (qdev->in_reset) { 1025 + /* Allow QAIC_BOOT state since we need to check control protocol version */ 1026 + if (qdev->dev_state == QAIC_OFFLINE) { 1026 1027 mutex_unlock(&qdev->cntl_mutex); 1027 1028 return ERR_PTR(-ENODEV); 1028 1029 } ··· 1307 1306 qdev = usr->qddev->qdev; 1308 1307 1309 1308 qdev_rcu_id = srcu_read_lock(&qdev->dev_lock); 1310 - if (qdev->in_reset) { 1309 + if (qdev->dev_state != QAIC_ONLINE) { 1311 1310 srcu_read_unlock(&qdev->dev_lock, qdev_rcu_id); 1312 1311 srcu_read_unlock(&usr->qddev_lock, usr_rcu_id); 1313 1312 return -ENODEV;
+8 -8
drivers/accel/qaic/qaic_data.c
··· 690 690 691 691 qdev = usr->qddev->qdev; 692 692 qdev_rcu_id = srcu_read_lock(&qdev->dev_lock); 693 - if (qdev->in_reset) { 693 + if (qdev->dev_state != QAIC_ONLINE) { 694 694 ret = -ENODEV; 695 695 goto unlock_dev_srcu; 696 696 } ··· 749 749 750 750 qdev = usr->qddev->qdev; 751 751 qdev_rcu_id = srcu_read_lock(&qdev->dev_lock); 752 - if (qdev->in_reset) { 752 + if (qdev->dev_state != QAIC_ONLINE) { 753 753 ret = -ENODEV; 754 754 goto unlock_dev_srcu; 755 755 } ··· 970 970 971 971 qdev = usr->qddev->qdev; 972 972 qdev_rcu_id = srcu_read_lock(&qdev->dev_lock); 973 - if (qdev->in_reset) { 973 + if (qdev->dev_state != QAIC_ONLINE) { 974 974 ret = -ENODEV; 975 975 goto unlock_dev_srcu; 976 976 } ··· 1341 1341 1342 1342 qdev = usr->qddev->qdev; 1343 1343 qdev_rcu_id = srcu_read_lock(&qdev->dev_lock); 1344 - if (qdev->in_reset) { 1344 + if (qdev->dev_state != QAIC_ONLINE) { 1345 1345 ret = -ENODEV; 1346 1346 goto unlock_dev_srcu; 1347 1347 } ··· 1497 1497 rcu_id = srcu_read_lock(&dbc->ch_lock); 1498 1498 1499 1499 while (1) { 1500 - if (dbc->qdev->in_reset) { 1500 + if (dbc->qdev->dev_state != QAIC_ONLINE) { 1501 1501 srcu_read_unlock(&dbc->ch_lock, rcu_id); 1502 1502 return; 1503 1503 } ··· 1687 1687 1688 1688 qdev = usr->qddev->qdev; 1689 1689 qdev_rcu_id = srcu_read_lock(&qdev->dev_lock); 1690 - if (qdev->in_reset) { 1690 + if (qdev->dev_state != QAIC_ONLINE) { 1691 1691 ret = -ENODEV; 1692 1692 goto unlock_dev_srcu; 1693 1693 } ··· 1756 1756 1757 1757 qdev = usr->qddev->qdev; 1758 1758 qdev_rcu_id = srcu_read_lock(&qdev->dev_lock); 1759 - if (qdev->in_reset) { 1759 + if (qdev->dev_state != QAIC_ONLINE) { 1760 1760 ret = -ENODEV; 1761 1761 goto unlock_dev_srcu; 1762 1762 } ··· 1847 1847 1848 1848 qdev = usr->qddev->qdev; 1849 1849 qdev_rcu_id = srcu_read_lock(&qdev->dev_lock); 1850 - if (qdev->in_reset) { 1850 + if (qdev->dev_state != QAIC_ONLINE) { 1851 1851 ret = -ENODEV; 1852 1852 goto unlock_dev_srcu; 1853 1853 }
+6 -6
drivers/accel/qaic/qaic_drv.c
··· 64 64 int ret; 65 65 66 66 rcu_id = srcu_read_lock(&qdev->dev_lock); 67 - if (qdev->in_reset) { 67 + if (qdev->dev_state != QAIC_ONLINE) { 68 68 ret = -ENODEV; 69 69 goto dev_unlock; 70 70 } ··· 121 121 if (qddev) { 122 122 qdev = qddev->qdev; 123 123 qdev_rcu_id = srcu_read_lock(&qdev->dev_lock); 124 - if (!qdev->in_reset) { 124 + if (qdev->dev_state == QAIC_ONLINE) { 125 125 qaic_release_usr(qdev, usr); 126 126 for (i = 0; i < qdev->num_dbc; ++i) 127 127 if (qdev->dbc[i].usr && qdev->dbc[i].usr->handle == usr->handle) ··· 254 254 255 255 qdev = pci_get_drvdata(to_pci_dev(mhi_dev->mhi_cntrl->cntrl_dev)); 256 256 257 - qdev->in_reset = false; 257 + qdev->dev_state = QAIC_ONLINE; 258 258 259 259 dev_set_drvdata(&mhi_dev->dev, qdev); 260 260 qdev->cntl_ch = mhi_dev; ··· 291 291 { 292 292 int i; 293 293 294 - qdev->in_reset = true; 294 + qdev->dev_state = QAIC_OFFLINE; 295 295 /* wake up any waiters to avoid waiting for timeouts at sync */ 296 296 wake_all_cntl(qdev); 297 297 for (i = 0; i < qdev->num_dbc; ++i) ··· 313 313 release_dbc(qdev, i); 314 314 315 315 if (exit_reset) 316 - qdev->in_reset = false; 316 + qdev->dev_state = QAIC_ONLINE; 317 317 } 318 318 319 319 static void cleanup_qdev(struct qaic_device *qdev) ··· 550 550 { 551 551 struct qaic_device *qdev = pci_get_drvdata(pdev); 552 552 553 - qdev->in_reset = false; 553 + qdev->dev_state = QAIC_ONLINE; 554 554 qaic_mhi_reset_done(qdev->mhi_cntrl); 555 555 } 556 556