17afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk/* 27afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk This file is provided under a dual BSD/GPLv2 license. When using or 37afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk redistributing this file, you may do so under either license. 47afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk 57afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk GPL LICENSE SUMMARY 67afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk Copyright(c) 2014 Intel Corporation. 77afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk This program is free software; you can redistribute it and/or modify 87afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk it under the terms of version 2 of the GNU General Public License as 97afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk published by the Free Software Foundation. 107afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk 117afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk This program is distributed in the hope that it will be useful, but 127afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk WITHOUT ANY WARRANTY; without even the implied warranty of 137afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 147afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk General Public License for more details. 157afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk 167afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk Contact Information: 177afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk qat-linux@intel.com 187afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk 197afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk BSD LICENSE 207afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk Copyright(c) 2014 Intel Corporation. 217afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk Redistribution and use in source and binary forms, with or without 227afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk modification, are permitted provided that the following conditions 237afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk are met: 247afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk 257afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk * Redistributions of source code must retain the above copyright 267afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk notice, this list of conditions and the following disclaimer. 277afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk * Redistributions in binary form must reproduce the above copyright 287afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk notice, this list of conditions and the following disclaimer in 297afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk the documentation and/or other materials provided with the 307afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk distribution. 317afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk * Neither the name of Intel Corporation nor the names of its 327afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk contributors may be used to endorse or promote products derived 337afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk from this software without specific prior written permission. 347afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk 357afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 367afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 377afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 387afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 397afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 407afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 417afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 427afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 437afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 447afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 457afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 467afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk*/ 477afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk#include <icp_qat_fw_init_admin.h> 487afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk#include <adf_accel_devices.h> 497afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk#include <adf_common_drv.h> 507afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk#include "adf_drv.h" 517afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk 527afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Strukstatic struct service_hndl qat_admin; 537afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk 547afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Strukstatic int qat_send_admin_cmd(struct adf_accel_dev *accel_dev, int cmd) 557afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk{ 567afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk struct adf_hw_device_data *hw_device = accel_dev->hw_device; 577afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk struct icp_qat_fw_init_admin_req req; 587afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk struct icp_qat_fw_init_admin_resp resp; 597afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk int i; 607afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk 617afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk memset(&req, 0, sizeof(struct icp_qat_fw_init_admin_req)); 627afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk req.init_admin_cmd_id = cmd; 637afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk for (i = 0; i < hw_device->get_num_aes(hw_device); i++) { 647afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk memset(&resp, 0, sizeof(struct icp_qat_fw_init_admin_resp)); 657afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk if (adf_put_admin_msg_sync(accel_dev, i, &req, &resp) || 667afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk resp.init_resp_hdr.status) 677afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk return -EFAULT; 687afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk } 697afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk return 0; 707afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk} 717afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk 727afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Strukstatic int qat_admin_start(struct adf_accel_dev *accel_dev) 737afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk{ 747afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk return qat_send_admin_cmd(accel_dev, ICP_QAT_FW_INIT_ME); 757afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk} 767afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk 777afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Strukstatic int qat_admin_event_handler(struct adf_accel_dev *accel_dev, 787afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk enum adf_event event) 797afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk{ 807afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk int ret; 817afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk 827afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk switch (event) { 837afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk case ADF_EVENT_START: 847afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk ret = qat_admin_start(accel_dev); 857afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk break; 867afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk case ADF_EVENT_STOP: 877afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk case ADF_EVENT_INIT: 887afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk case ADF_EVENT_SHUTDOWN: 897afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk default: 907afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk ret = 0; 917afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk } 927afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk return ret; 937afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk} 947afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk 957afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Strukint qat_admin_register(void) 967afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk{ 977afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk memset(&qat_admin, 0, sizeof(struct service_hndl)); 987afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk qat_admin.event_hld = qat_admin_event_handler; 997afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk qat_admin.name = "qat_admin"; 1007afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk qat_admin.admin = 1; 1017afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk return adf_service_register(&qat_admin); 1027afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk} 1037afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk 1047afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Strukint qat_admin_unregister(void) 1057afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk{ 1067afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk return adf_service_unregister(&qat_admin); 1077afa232e76ced910a191a3f6669d8f48bcb46b3eTadeusz Struk} 108