1 /*
2  * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16 
17 #ifndef _CDP_TXRX_PPE_H_
18 #define _CDP_TXRX_PPE_H_
19 
20 /**
21  * cdp_ppesds_vp_setup_fw_recovery() - Setup DS VP on FW recovery.
22  * @soc: data path soc handle
23  * @vdev_id: vdev id
24  * @profile_idx: DS profile index.
25  *
26  * return: qdf_status where DS VP setup is done or not.
27  */
28 static inline
cdp_ppesds_vp_setup_fw_recovery(struct cdp_soc_t * soc,uint8_t vdev_id,uint16_t profile_idx)29 QDF_STATUS cdp_ppesds_vp_setup_fw_recovery(struct cdp_soc_t *soc,
30 					   uint8_t vdev_id,
31 					   uint16_t profile_idx)
32 {
33 	if (!soc || !soc->ops || !soc->ops->ppeds_ops) {
34 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
35 			  "%s invalid instance", __func__);
36 		return QDF_STATUS_E_NOSUPPORT;
37 	}
38 
39 	if (soc->ops->ppeds_ops->ppeds_vp_setup_recovery)
40 		return soc->ops->ppeds_ops->ppeds_vp_setup_recovery(soc,
41 								    vdev_id,
42 								    profile_idx);
43 
44 	return QDF_STATUS_E_INVAL;
45 }
46 
47 /*
48  * cdp_ppesds_update_dev_stats() - Update dev stats for PPE-DS mode.
49  * @soc: data path soc handle
50  * @vp_params: VP params
51  * @vdev_id: vdev id
52  * @stats: stats pointer from ppe
53  *
54  * return: void
55  */
56 static inline
cdp_ppesds_update_dev_stats(struct cdp_soc_t * soc,struct cdp_ds_vp_params * vp_params,uint16_t vdev_id,void * stats)57 void cdp_ppesds_update_dev_stats(struct cdp_soc_t *soc,
58 				 struct cdp_ds_vp_params *vp_params,
59 				 uint16_t vdev_id, void *stats)
60 {
61 	if (!soc || !soc->ops || !soc->ops->ppeds_ops) {
62 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
63 			  "%s invalid instance", __func__);
64 		return;
65 	}
66 
67 	if (soc->ops->ppeds_ops->ppeds_stats_sync)
68 		return soc->ops->ppeds_ops->ppeds_stats_sync(soc,
69 							     vdev_id,
70 							     vp_params,
71 							     stats);
72 }
73 
74 /**
75  * cdp_ppesds_entry_attach() - attach the ppe vp interface.
76  * @soc: data path soc handle
77  * @vdev_id: vdev id
78  * @vpai: PPE VP opaque
79  * @ppe_vp_num: Allocated VP Port number
80  * @vp_params: VP params
81  *
82  * return: qdf_status where vp entry got allocated or not.
83  */
84 static inline
cdp_ppesds_entry_attach(struct cdp_soc_t * soc,uint8_t vdev_id,void * vpai,int32_t * ppe_vp_num,struct cdp_ds_vp_params * vp_params)85 QDF_STATUS cdp_ppesds_entry_attach(struct cdp_soc_t *soc, uint8_t vdev_id,
86 				   void *vpai, int32_t *ppe_vp_num,
87 				   struct cdp_ds_vp_params *vp_params)
88 {
89 	if (!soc || !soc->ops || !soc->ops->ppeds_ops) {
90 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
91 			  "%s invalid instance", __func__);
92 		return QDF_STATUS_E_NOSUPPORT;
93 	}
94 
95 	if (soc->ops->ppeds_ops->ppeds_entry_attach)
96 		return soc->ops->ppeds_ops->ppeds_entry_attach(soc, vdev_id,
97 							       vpai,
98 							       ppe_vp_num,
99 							       vp_params);
100 
101 	return QDF_STATUS_E_INVAL;
102 }
103 
104 /**
105  * cdp_ppesds_entry_detach() - Detach the PPE VP interface.
106  * @soc: data path soc handle
107  * @vdev_id: vdev ID
108  * @vp_params: VP params
109  *
110  * return: void
111  */
112 static inline
cdp_ppesds_entry_detach(struct cdp_soc_t * soc,uint8_t vdev_id,struct cdp_ds_vp_params * vp_params)113 void cdp_ppesds_entry_detach(struct cdp_soc_t *soc, uint8_t vdev_id,
114 			     struct cdp_ds_vp_params *vp_params)
115 {
116 	if (!soc || !soc->ops || !soc->ops->ppeds_ops) {
117 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
118 			  "%s invalid instance", __func__);
119 		return;
120 	}
121 
122 	if (soc->ops->ppeds_ops->ppeds_entry_detach)
123 		return soc->ops->ppeds_ops->ppeds_entry_detach(soc,
124 							       vdev_id,
125 							       vp_params);
126 }
127 
128 /**
129  * cdp_ppeds_attached() - Check whether ppeds attached
130  * @soc: data path soc handle
131  *
132  * return: true for ppeds attached otherwise false.
133  */
134 static inline
cdp_ppeds_attached(struct cdp_soc_t * soc)135 QDF_STATUS cdp_ppeds_attached(struct cdp_soc_t *soc)
136 {
137 	if (!soc || !soc->ops || !soc->ops->ppeds_ops)
138 		return false;
139 
140 	return true;
141 }
142 
143 /**
144  * cdp_ppesds_set_int_pri2tid() - Set the INT_PRI to TID
145  * @soc: data path soc handle
146  * @pri2tid: PRI2TID table
147  *
148  * return: void
149  */
150 static inline
cdp_ppesds_set_int_pri2tid(struct cdp_soc_t * soc,uint8_t * pri2tid)151 void cdp_ppesds_set_int_pri2tid(struct cdp_soc_t *soc,
152 				uint8_t *pri2tid)
153 {
154 	if (!soc || !soc->ops || !soc->ops->ppeds_ops) {
155 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
156 			  "%s invalid instance", __func__);
157 		return;
158 	}
159 
160 	if (soc->ops->ppeds_ops->ppeds_set_int_pri2tid)
161 		return soc->ops->ppeds_ops->ppeds_set_int_pri2tid(soc, pri2tid);
162 }
163 
164 /**
165  * cdp_ppesds_update_int_pri2tid() - Update the INT_PRI to TID
166  * @soc: data path soc handle
167  * @pri: Priority index
168  * @tid: TID mapped to the input priority
169  *
170  * return: void
171  */
172 static inline
cdp_ppesds_update_int_pri2tid(struct cdp_soc_t * soc,uint8_t pri,uint8_t tid)173 void cdp_ppesds_update_int_pri2tid(struct cdp_soc_t *soc,
174 				   uint8_t pri, uint8_t tid)
175 {
176 	if (!soc || !soc->ops || !soc->ops->ppeds_ops) {
177 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
178 			  "%s invalid instance", __func__);
179 	}
180 
181 	if (soc->ops->ppeds_ops->ppeds_update_int_pri2tid)
182 		return soc->ops->ppeds_ops->ppeds_update_int_pri2tid(soc, pri,
183 								     tid);
184 }
185 
186 /**
187  * cdp_ppesds_entry_dump() - Dump the PPE VP entries
188  * @soc: data path soc handle
189  *
190  * return: void
191  */
192 static inline
cdp_ppesds_entry_dump(struct cdp_soc_t * soc)193 void cdp_ppesds_entry_dump(struct cdp_soc_t *soc)
194 {
195 	if (!soc || !soc->ops || !soc->ops->ppeds_ops) {
196 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
197 			  "%s invalid instance", __func__);
198 		return;
199 	}
200 
201 	if (soc->ops->ppeds_ops->ppeds_entry_dump)
202 		soc->ops->ppeds_ops->ppeds_entry_dump(soc);
203 }
204 
205 /**
206  * cdp_ppesds_enable_pri2tid() - Enable PPE VP PRI2TID table
207  * @soc: data path soc handle
208  * @vdev_id: vdev id
209  * @val: Boolean value to enable/disable
210  *
211  * return: QDF_STATUS
212  */
213 static inline
cdp_ppesds_enable_pri2tid(struct cdp_soc_t * soc,uint8_t vdev_id,bool val)214 QDF_STATUS cdp_ppesds_enable_pri2tid(struct cdp_soc_t *soc,
215 				     uint8_t vdev_id, bool val)
216 {
217 	if (!soc || !soc->ops || !soc->ops->ppeds_ops) {
218 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,
219 			  "%s invalid instance", __func__);
220 		return QDF_STATUS_E_INVAL;
221 	}
222 
223 	if (soc->ops->ppeds_ops->ppeds_enable_pri2tid)
224 		return soc->ops->ppeds_ops->ppeds_enable_pri2tid(soc, vdev_id,
225 								 val);
226 
227 	return QDF_STATUS_E_NOSUPPORT;
228 }
229 #endif /* _CDP_TXRX_PPE_H_ */
230