xref: /linux/drivers/crypto/intel/qat/qat_common/adf_kpt.c (revision b2128290c29902315e632ea59e0504d6bc9e9b42)
1*fb98254aSJunyuan Wang // SPDX-License-Identifier: GPL-2.0-only
2*fb98254aSJunyuan Wang /* Copyright(c) 2026 Intel Corporation */
3*fb98254aSJunyuan Wang #include <linux/dma-mapping.h>
4*fb98254aSJunyuan Wang 
5*fb98254aSJunyuan Wang #include "adf_admin.h"
6*fb98254aSJunyuan Wang #include "adf_cfg_services.h"
7*fb98254aSJunyuan Wang #include "adf_common_drv.h"
8*fb98254aSJunyuan Wang #include "adf_kpt.h"
9*fb98254aSJunyuan Wang 
10*fb98254aSJunyuan Wang static bool adf_kpt_supported(struct adf_accel_dev *accel_dev)
11*fb98254aSJunyuan Wang {
12*fb98254aSJunyuan Wang 	struct adf_hw_device_data *hw_data = GET_HW_DATA(accel_dev);
13*fb98254aSJunyuan Wang 
14*fb98254aSJunyuan Wang 	return hw_data->accel_capabilities_mask & ICP_ACCEL_CAPABILITIES_KPT;
15*fb98254aSJunyuan Wang }
16*fb98254aSJunyuan Wang 
17*fb98254aSJunyuan Wang int adf_enable_kpt(struct adf_accel_dev *accel_dev)
18*fb98254aSJunyuan Wang {
19*fb98254aSJunyuan Wang 	struct adf_kpt_interface_data *user_data = GET_KPT_USER_DATA(accel_dev);
20*fb98254aSJunyuan Wang 	struct adf_hw_device_data *hw_data = GET_HW_DATA(accel_dev);
21*fb98254aSJunyuan Wang 	dma_addr_t paddr;
22*fb98254aSJunyuan Wang 	void *vaddr;
23*fb98254aSJunyuan Wang 	int ret;
24*fb98254aSJunyuan Wang 	int svc;
25*fb98254aSJunyuan Wang 
26*fb98254aSJunyuan Wang 	/* Return 0 if KPT is not supported by the hardware */
27*fb98254aSJunyuan Wang 	if (!adf_kpt_supported(accel_dev))
28*fb98254aSJunyuan Wang 		return 0;
29*fb98254aSJunyuan Wang 
30*fb98254aSJunyuan Wang 	if (!user_data->enable) {
31*fb98254aSJunyuan Wang 		/* Disable KPT capability if user has not enabled it */
32*fb98254aSJunyuan Wang 		hw_data->accel_capabilities_mask &= ~ICP_ACCEL_CAPABILITIES_KPT;
33*fb98254aSJunyuan Wang 		return 0;
34*fb98254aSJunyuan Wang 	}
35*fb98254aSJunyuan Wang 
36*fb98254aSJunyuan Wang 	svc = adf_get_service_enabled(accel_dev);
37*fb98254aSJunyuan Wang 	if (svc < 0)
38*fb98254aSJunyuan Wang 		return svc;
39*fb98254aSJunyuan Wang 
40*fb98254aSJunyuan Wang 	if (svc != SVC_ASYM) {
41*fb98254aSJunyuan Wang 		dev_err(&GET_DEV(accel_dev),
42*fb98254aSJunyuan Wang 			"KPT can only be enabled when service is configured as 'asym'\n");
43*fb98254aSJunyuan Wang 		return -EINVAL;
44*fb98254aSJunyuan Wang 	}
45*fb98254aSJunyuan Wang 
46*fb98254aSJunyuan Wang 	vaddr = dma_alloc_coherent(&GET_DEV(accel_dev), PAGE_SIZE, &paddr,
47*fb98254aSJunyuan Wang 				   GFP_KERNEL);
48*fb98254aSJunyuan Wang 	if (!vaddr)
49*fb98254aSJunyuan Wang 		return -ENOMEM;
50*fb98254aSJunyuan Wang 
51*fb98254aSJunyuan Wang 	ret = adf_send_admin_kpt_init(accel_dev, vaddr, PAGE_SIZE, paddr);
52*fb98254aSJunyuan Wang 
53*fb98254aSJunyuan Wang 	dma_free_coherent(&GET_DEV(accel_dev), PAGE_SIZE, vaddr, paddr);
54*fb98254aSJunyuan Wang 
55*fb98254aSJunyuan Wang 	return ret;
56*fb98254aSJunyuan Wang }
57