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