qat_admin.c revision 7afa232e76ced910a191a3f6669d8f48bcb46b3e
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