1 // SPDX-License-Identifier: GPL-2.0-only 2 /* Copyright(c) 2026 Intel Corporation */ 3 #include <linux/bitfield.h> 4 #include <linux/delay.h> 5 #include <linux/errno.h> 6 #include <linux/kstrtox.h> 7 8 #include "adf_accel_devices.h" 9 #include "adf_admin.h" 10 #include "adf_anti_rb.h" 11 #include "adf_common_drv.h" 12 #include "icp_qat_fw_init_admin.h" 13 14 #define ADF_SVN_RETRY_MAX 60 15 16 int adf_anti_rb_commit(struct adf_accel_dev *accel_dev) 17 { 18 return adf_send_admin_arb_commit(accel_dev); 19 } 20 21 int adf_anti_rb_query(struct adf_accel_dev *accel_dev, enum anti_rb cmd, u8 *svn) 22 { 23 return adf_send_admin_arb_query(accel_dev, cmd, svn); 24 } 25 26 int adf_anti_rb_check(struct pci_dev *pdev) 27 { 28 struct adf_anti_rb_hw_data *anti_rb; 29 u32 svncheck_sts, cfc_svncheck_sts; 30 struct adf_accel_dev *accel_dev; 31 void __iomem *pmisc_addr; 32 33 accel_dev = adf_devmgr_pci_to_accel_dev(pdev); 34 if (!accel_dev) 35 return -EINVAL; 36 37 anti_rb = GET_ANTI_RB_DATA(accel_dev); 38 if (!anti_rb->anti_rb_enabled || !anti_rb->anti_rb_enabled(accel_dev)) 39 return 0; 40 41 pmisc_addr = adf_get_pmisc_base(accel_dev); 42 43 cfc_svncheck_sts = ADF_CSR_RD(pmisc_addr, anti_rb->svncheck_offset); 44 45 svncheck_sts = FIELD_GET(ADF_SVN_STS_MASK, cfc_svncheck_sts); 46 switch (svncheck_sts) { 47 case ADF_SVN_NO_STS: 48 return 0; 49 case ADF_SVN_PASS_STS: 50 anti_rb->svncheck_retry = 0; 51 return 0; 52 case ADF_SVN_FAIL_STS: 53 dev_err(&GET_DEV(accel_dev), "Security Version Number failure\n"); 54 return -EIO; 55 case ADF_SVN_RETRY_STS: 56 if (anti_rb->svncheck_retry++ >= ADF_SVN_RETRY_MAX) { 57 anti_rb->svncheck_retry = 0; 58 return -ETIMEDOUT; 59 } 60 msleep(ADF_SVN_RETRY_MS); 61 return -EAGAIN; 62 default: 63 dev_err(&GET_DEV(accel_dev), "Invalid SVN check status\n"); 64 return -EINVAL; 65 } 66 } 67