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