2014-06-05 13:42:39 -07:00
/*
This file is provided under a dual BSD / GPLv2 license . When using or
redistributing this file , you may do so under either license .
GPL LICENSE SUMMARY
Copyright ( c ) 2014 Intel Corporation .
This program is free software ; you can redistribute it and / or modify
it under the terms of version 2 of the GNU General Public License as
published by the Free Software Foundation .
This program is distributed in the hope that it will be useful , but
WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
General Public License for more details .
Contact Information :
qat - linux @ intel . com
BSD LICENSE
Copyright ( c ) 2014 Intel Corporation .
Redistribution and use in source and binary forms , with or without
modification , are permitted provided that the following conditions
are met :
* Redistributions of source code must retain the above copyright
notice , this list of conditions and the following disclaimer .
* Redistributions in binary form must reproduce the above copyright
notice , this list of conditions and the following disclaimer in
the documentation and / or other materials provided with the
distribution .
* Neither the name of Intel Corporation nor the names of its
contributors may be used to endorse or promote products derived
from this software without specific prior written permission .
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
" AS IS " AND ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT
LIMITED TO , THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
A PARTICULAR PURPOSE ARE DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT , INDIRECT , INCIDENTAL ,
SPECIAL , EXEMPLARY , OR CONSEQUENTIAL DAMAGES ( INCLUDING , BUT NOT
LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES ; LOSS OF USE ,
DATA , OR PROFITS ; OR BUSINESS INTERRUPTION ) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT LIABILITY , OR TORT
( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE .
*/
# ifndef ADF_DRV_H
# define ADF_DRV_H
# include <linux/list.h>
# include <linux/pci.h>
# include "adf_accel_devices.h"
# include "icp_qat_fw_loader_handle.h"
# include "icp_qat_hal.h"
2015-05-07 17:00:42 -07:00
# define ADF_MAJOR_VERSION 0
# define ADF_MINOR_VERSION 1
# define ADF_BUILD_VERSION 3
# define ADF_DRV_VERSION __stringify(ADF_MAJOR_VERSION) "." \
__stringify ( ADF_MINOR_VERSION ) " . " \
__stringify ( ADF_BUILD_VERSION )
2014-06-05 13:42:39 -07:00
# define ADF_STATUS_RESTARTING 0
# define ADF_STATUS_STARTING 1
# define ADF_STATUS_CONFIGURED 2
# define ADF_STATUS_STARTED 3
# define ADF_STATUS_AE_INITIALISED 4
# define ADF_STATUS_AE_UCODE_LOADED 5
# define ADF_STATUS_AE_STARTED 6
# define ADF_STATUS_ORPHAN_TH_RUNNING 7
# define ADF_STATUS_IRQ_ALLOCATED 8
enum adf_dev_reset_mode {
ADF_DEV_RESET_ASYNC = 0 ,
ADF_DEV_RESET_SYNC
} ;
enum adf_event {
ADF_EVENT_INIT = 0 ,
ADF_EVENT_START ,
ADF_EVENT_STOP ,
ADF_EVENT_SHUTDOWN ,
ADF_EVENT_RESTARTING ,
ADF_EVENT_RESTARTED ,
} ;
struct service_hndl {
int ( * event_hld ) ( struct adf_accel_dev * accel_dev ,
enum adf_event event ) ;
unsigned long init_status ;
unsigned long start_status ;
char * name ;
struct list_head list ;
int admin ;
} ;
int adf_service_register ( struct service_hndl * service ) ;
int adf_service_unregister ( struct service_hndl * service ) ;
int adf_dev_init ( struct adf_accel_dev * accel_dev ) ;
int adf_dev_start ( struct adf_accel_dev * accel_dev ) ;
int adf_dev_stop ( struct adf_accel_dev * accel_dev ) ;
crypto: qat - fix device reset flow
When the device needs a reset, e.g. when an uncorrectable PCIe AER event
occurs, various services/data structures need to be cleaned up, the
hardware reset and the services/data structures initialized and started.
The code to perform the cleanup and initialization was not performed when
a device reset was done.
This patch moves some of the initialization code out of the .probe entry-
point into a separate function that is now called during probe as well as
after the hardware has been reset. Similarly, a new function is added for
first cleaning up these services/data structures prior to resetting. The
new functions are adf_dev_init() and adf_dev_shutdown(), respectively, for
which there are already prototypes but no actual functions just yet and are
now called when the device is reset and during probe/cleanup of the driver.
The down and up flows via ioctl calls has similarly been updated.
In addition, there are two other bugs in the reset flow - one in the logic
for determining whether to schedule a device reset upon receiving an
uncorrectable AER event which prevents the reset flow from being initiated,
and another with clearing the status bit indicating a device is configured
(when resetting the device the configuration remains across the reset so
the bit should not be cleared, otherwise, the necessary services will not
be re-started in adf_dev_start() after the reset - clear the bit only when
actually deleting the configuration).
Signed-off-by: Bruce Allan <bruce.w.allan@intel.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2015-01-09 11:54:58 -08:00
void adf_dev_shutdown ( struct adf_accel_dev * accel_dev ) ;
2014-06-05 13:42:39 -07:00
int adf_ctl_dev_register ( void ) ;
void adf_ctl_dev_unregister ( void ) ;
int adf_processes_dev_register ( void ) ;
void adf_processes_dev_unregister ( void ) ;
int adf_devmgr_add_dev ( struct adf_accel_dev * accel_dev ) ;
void adf_devmgr_rm_dev ( struct adf_accel_dev * accel_dev ) ;
struct list_head * adf_devmgr_get_head ( void ) ;
struct adf_accel_dev * adf_devmgr_get_dev_by_id ( uint32_t id ) ;
struct adf_accel_dev * adf_devmgr_get_first ( void ) ;
struct adf_accel_dev * adf_devmgr_pci_to_accel_dev ( struct pci_dev * pci_dev ) ;
int adf_devmgr_verify_id ( uint32_t id ) ;
void adf_devmgr_get_num_dev ( uint32_t * num ) ;
int adf_devmgr_in_reset ( struct adf_accel_dev * accel_dev ) ;
int adf_dev_started ( struct adf_accel_dev * accel_dev ) ;
int adf_dev_restarting_notify ( struct adf_accel_dev * accel_dev ) ;
int adf_dev_restarted_notify ( struct adf_accel_dev * accel_dev ) ;
int adf_ae_init ( struct adf_accel_dev * accel_dev ) ;
int adf_ae_shutdown ( struct adf_accel_dev * accel_dev ) ;
int adf_ae_fw_load ( struct adf_accel_dev * accel_dev ) ;
2015-04-03 08:41:17 -07:00
void adf_ae_fw_release ( struct adf_accel_dev * accel_dev ) ;
2014-06-05 13:42:39 -07:00
int adf_ae_start ( struct adf_accel_dev * accel_dev ) ;
int adf_ae_stop ( struct adf_accel_dev * accel_dev ) ;
int adf_enable_aer ( struct adf_accel_dev * accel_dev , struct pci_driver * adf ) ;
void adf_disable_aer ( struct adf_accel_dev * accel_dev ) ;
int adf_init_aer ( void ) ;
void adf_exit_aer ( void ) ;
int adf_dev_get ( struct adf_accel_dev * accel_dev ) ;
void adf_dev_put ( struct adf_accel_dev * accel_dev ) ;
int adf_dev_in_use ( struct adf_accel_dev * accel_dev ) ;
int adf_init_etr_data ( struct adf_accel_dev * accel_dev ) ;
void adf_cleanup_etr_data ( struct adf_accel_dev * accel_dev ) ;
int qat_crypto_register ( void ) ;
int qat_crypto_unregister ( void ) ;
struct qat_crypto_instance * qat_crypto_get_instance_node ( int node ) ;
void qat_crypto_put_instance ( struct qat_crypto_instance * inst ) ;
void qat_alg_callback ( void * resp ) ;
int qat_algs_init ( void ) ;
void qat_algs_exit ( void ) ;
int qat_algs_register ( void ) ;
int qat_algs_unregister ( void ) ;
int qat_hal_init ( struct adf_accel_dev * accel_dev ) ;
void qat_hal_deinit ( struct icp_qat_fw_loader_handle * handle ) ;
void qat_hal_start ( struct icp_qat_fw_loader_handle * handle , unsigned char ae ,
unsigned int ctx_mask ) ;
void qat_hal_stop ( struct icp_qat_fw_loader_handle * handle , unsigned char ae ,
unsigned int ctx_mask ) ;
void qat_hal_reset ( struct icp_qat_fw_loader_handle * handle ) ;
int qat_hal_clr_reset ( struct icp_qat_fw_loader_handle * handle ) ;
void qat_hal_set_live_ctx ( struct icp_qat_fw_loader_handle * handle ,
unsigned char ae , unsigned int ctx_mask ) ;
int qat_hal_set_ae_lm_mode ( struct icp_qat_fw_loader_handle * handle ,
unsigned char ae , enum icp_qat_uof_regtype lm_type ,
unsigned char mode ) ;
int qat_hal_set_ae_ctx_mode ( struct icp_qat_fw_loader_handle * handle ,
unsigned char ae , unsigned char mode ) ;
int qat_hal_set_ae_nn_mode ( struct icp_qat_fw_loader_handle * handle ,
unsigned char ae , unsigned char mode ) ;
void qat_hal_set_pc ( struct icp_qat_fw_loader_handle * handle ,
unsigned char ae , unsigned int ctx_mask , unsigned int upc ) ;
void qat_hal_wr_uwords ( struct icp_qat_fw_loader_handle * handle ,
unsigned char ae , unsigned int uaddr ,
unsigned int words_num , uint64_t * uword ) ;
void qat_hal_wr_umem ( struct icp_qat_fw_loader_handle * handle , unsigned char ae ,
unsigned int uword_addr , unsigned int words_num ,
unsigned int * data ) ;
int qat_hal_get_ins_num ( void ) ;
int qat_hal_batch_wr_lm ( struct icp_qat_fw_loader_handle * handle ,
unsigned char ae ,
struct icp_qat_uof_batch_init * lm_init_header ) ;
int qat_hal_init_gpr ( struct icp_qat_fw_loader_handle * handle ,
unsigned char ae , unsigned char ctx_mask ,
enum icp_qat_uof_regtype reg_type ,
unsigned short reg_num , unsigned int regdata ) ;
int qat_hal_init_wr_xfer ( struct icp_qat_fw_loader_handle * handle ,
unsigned char ae , unsigned char ctx_mask ,
enum icp_qat_uof_regtype reg_type ,
unsigned short reg_num , unsigned int regdata ) ;
int qat_hal_init_rd_xfer ( struct icp_qat_fw_loader_handle * handle ,
unsigned char ae , unsigned char ctx_mask ,
enum icp_qat_uof_regtype reg_type ,
unsigned short reg_num , unsigned int regdata ) ;
int qat_hal_init_nn ( struct icp_qat_fw_loader_handle * handle ,
unsigned char ae , unsigned char ctx_mask ,
unsigned short reg_num , unsigned int regdata ) ;
int qat_hal_wr_lm ( struct icp_qat_fw_loader_handle * handle ,
unsigned char ae , unsigned short lm_addr , unsigned int value ) ;
int qat_uclo_wr_all_uimage ( struct icp_qat_fw_loader_handle * handle ) ;
2014-06-24 15:19:40 -07:00
void qat_uclo_del_uof_obj ( struct icp_qat_fw_loader_handle * handle ) ;
2014-06-05 13:42:39 -07:00
int qat_uclo_map_uof_obj ( struct icp_qat_fw_loader_handle * handle ,
void * addr_ptr , int mem_size ) ;
2015-07-15 15:28:26 -07:00
void qat_uclo_wr_mimage ( struct icp_qat_fw_loader_handle * handle ,
void * addr_ptr , int mem_size ) ;
2014-06-05 13:42:39 -07:00
# endif