1 /* SPDX-License-Identifier: BSD-3-Clause */
2 /* Copyright(c) 2007-2022 Intel Corporation */
3 /* $FreeBSD$ */
4 /*****************************************************************************
5  * @file icp_adf_init.h
6  *
7  * @description
8  *      This file contains the function prototype used to register a subsystem
9  *      into the Acceleration Driver Framework (ADF).
10  *
11  *****************************************************************************/
12 #ifndef ICP_ADF_INIT_H
13 #define ICP_ADF_INIT_H
14 
15 #include "icp_accel_devices.h"
16 #include "adf_kernel_types.h"
17 #include "adf_cfg_common.h"
18 
19 /*
20  * Events that will be sending to subsystem. The order of the enum
21  * declaration matters. It should be defined so that the messages can be
22  * sent in loop.
23  */
24 typedef enum icp_adf_subsystemEvent_s {
25 	ICP_ADF_EVENT_INIT = 0,
26 	ICP_ADF_EVENT_START,
27 	ICP_ADF_EVENT_STOP,
28 	ICP_ADF_EVENT_SHUTDOWN,
29 	ICP_ADF_EVENT_RESTARING,
30 	ICP_ADF_EVENT_RESTARTED,
31 	ICP_ADF_EVENT_ERROR,
32 	ICP_ADF_EVENT_END
33 } icp_adf_subsystemEvent_t;
34 
35 /*
36  * Ring info operation used to enable or disable ring polling by ME
37  */
38 typedef enum icp_adf_ringInfoOperation_e {
39 	ICP_ADF_RING_ENABLE = 0,
40 	ICP_ADF_RING_DISABLE
41 } icp_adf_ringInfoOperation_t;
42 
43 /*
44  * Ring generic serivce info private data
45  */
46 typedef enum icp_adf_ringInfoService_e {
47 	ICP_ADF_RING_SERVICE_0 = 0,
48 	ICP_ADF_RING_SERVICE_1,
49 	ICP_ADF_RING_SERVICE_2,
50 	ICP_ADF_RING_SERVICE_3,
51 	ICP_ADF_RING_SERVICE_4,
52 	ICP_ADF_RING_SERVICE_5,
53 	ICP_ADF_RING_SERVICE_6,
54 	ICP_ADF_RING_SERVICE_7,
55 	ICP_ADF_RING_SERVICE_8,
56 	ICP_ADF_RING_SERVICE_9,
57 	ICP_ADF_RING_SERVICE_10,
58 } icp_adf_ringInfoService_t;
59 
60 /*
61  * Ring info callback. Function is used to send operation and ring info
62  * to enable or disable ring polling by ME
63  */
64 typedef CpaStatus (*ringInfoCb)(icp_accel_dev_t *accel_dev,
65 				Cpa32U ringNumber,
66 				icp_adf_ringInfoOperation_t operation,
67 				icp_adf_ringInfoService_t info);
68 
69 /*
70  * Registration handle structure
71  * Each subservice has to have an instance of it.
72  */
73 typedef struct subservice_registation_handle_s {
74 	CpaStatus (*subserviceEventHandler)(icp_accel_dev_t *accel_dev,
75 					    icp_adf_subsystemEvent_t event,
76 					    void *param);
77 	struct {
78 		Cpa32U subsystemInitBit : 1;
79 		Cpa32U subsystemStartBit : 1;
80 		Cpa32U subsystemFailedBit : 1;
81 	} subsystemStatus[ADF_MAX_DEVICES];
82 	char *subsystem_name;
83 	struct subservice_registation_handle_s *pNext;
84 	struct subservice_registation_handle_s *pPrev;
85 } subservice_registation_handle_t;
86 
87 /*
88  * icp_adf_subsystemRegister
89  *
90  * Description:
91  *  Function used by subsystem to register within ADF
92  *  Should be called during insertion of a subsystem
93  *
94  * Returns:
95  *   CPA_STATUS_SUCCESS   on success
96  *   CPA_STATUS_FAIL      on failure
97  */
98 CpaStatus icp_adf_subsystemRegister(subservice_registation_handle_t *handle);
99 
100 /*
101  * icp_adf_subsystemUnregister
102  *
103  * Description:
104  *  Function used by subsystem to unregister from ADF
105  *  Should be called while subsystem in removed
106  *  If the subsystem is initialised and/or started
107  *  it will be stopped and shutdown by this function
108  *
109  * Returns:
110  *   CPA_STATUS_SUCCESS   on success
111  *   CPA_STATUS_FAIL      on failure
112  */
113 CpaStatus icp_adf_subsystemUnregister(subservice_registation_handle_t *handle);
114 
115 /*
116  * icp_adf_accesLayerRingInfoCbRegister
117  *
118  * Description:
119  *  Function register access layer callback, which sends ring info message
120  *
121  * Returns:
122  *   CPA_STATUS_SUCCESS   on success
123  *   CPA_STATUS_FAIL      on failure
124  */
125 CpaStatus icp_adf_accesLayerRingInfoCbRegister(icp_accel_dev_t *accel_dev,
126 					       ringInfoCb);
127 
128 /*
129  * icp_adf_accesLayerRingInfoCbUnregister
130  *
131  * Description:
132  *  Function unregister access layer callback for ring info message
133  *
134  * Returns:
135  *   CPA_STATUS_SUCCESS   on success
136  *   CPA_STATUS_FAIL      on failure
137  */
138 void icp_adf_accesLayerRingInfoCbUnregister(icp_accel_dev_t *accel_dev);
139 
140 /*
141  * icp_adf_isSubsystemStarted
142  *
143  * Description:
144  * Function returns true if the service is started on a device
145  *
146  * Returns:
147  *   CPA_TRUE   if subsystem is started
148  *   CPA_FALSE  if subsystem is not started
149  */
150 
151 CpaBoolean
152 icp_adf_isSubsystemStarted(subservice_registation_handle_t *subsystem_hdl);
153 
154 /*
155  * icp_adf_isDevStarted
156  *
157  * Description:
158  * Function returns true if the device is started
159  * Returns:
160  *   CPA_TRUE   if dev is started
161  *   CPA_FALSE  if dev is not started
162  */
163 CpaBoolean icp_adf_isDevStarted(icp_accel_dev_t *accel_dev);
164 
165 /*
166  * adf_subsystemRestarting
167  *
168  * Description:
169  * Function sends restarting event to all subsystems.
170  * This function should be used by error handling function only
171  *
172  * Returns:
173  *   CPA_TRUE   on success
174  *   CPA_FALSE  on failure
175  */
176 CpaStatus adf_subsystemRestarting(icp_accel_dev_t *accel_dev);
177 
178 /*
179  * adf_subsystemRestarted
180  *
181  * Description:
182  * Function sends restarted event to all subsystems.
183  * This function should be used by error handling function only
184  *
185  * Returns:
186  *   CPA_TRUE   on success
187  *   CPA_FALSE  on failure
188  */
189 CpaStatus adf_subsystemRestarted(icp_accel_dev_t *accel_dev);
190 
191 /*
192  * adf_subsystemError
193  *
194  * Description:
195  * Function sends error event to all subsystems.
196  * This function should be used by error handling funct. only
197  *
198  * Returns:
199  *   CPA_STATUS_SUCCESS   on success
200  *   CPA_STATUS_FAIL      on failure
201  */
202 CpaStatus adf_subsystemError(icp_accel_dev_t *accel_dev);
203 
204 /*
205  * reset_adf_subsystemTable
206  *
207  * Description:
208  * Function to reset subsystem table head, the pointer
209  * to the head of the list and lock.
210  *
211  * Returns: void
212  */
213 void reset_adf_subsystemTable(void);
214 
215 #endif /* ICP_ADF_INIT_H */
216