xref: /linux/drivers/crypto/intel/qat/qat_common/adf_anti_rb.c (revision 0fc8f6200d2313278fbf4539bbab74677c685531)
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