xref: /f-stack/dpdk/drivers/net/nfp/nfpcore/nfp_cpp.h (revision d30ea906)
1*d30ea906Sjfb8856606 /* SPDX-License-Identifier: BSD-3-Clause
2*d30ea906Sjfb8856606  * Copyright(c) 2018 Netronome Systems, Inc.
3*d30ea906Sjfb8856606  * All rights reserved.
4*d30ea906Sjfb8856606  */
5*d30ea906Sjfb8856606 
6*d30ea906Sjfb8856606 #ifndef __NFP_CPP_H__
7*d30ea906Sjfb8856606 #define __NFP_CPP_H__
8*d30ea906Sjfb8856606 
9*d30ea906Sjfb8856606 #include <rte_ethdev_pci.h>
10*d30ea906Sjfb8856606 
11*d30ea906Sjfb8856606 #include "nfp-common/nfp_platform.h"
12*d30ea906Sjfb8856606 #include "nfp-common/nfp_resid.h"
13*d30ea906Sjfb8856606 
14*d30ea906Sjfb8856606 struct nfp_cpp_mutex;
15*d30ea906Sjfb8856606 
16*d30ea906Sjfb8856606 /*
17*d30ea906Sjfb8856606  * NFP CPP handle
18*d30ea906Sjfb8856606  */
19*d30ea906Sjfb8856606 struct nfp_cpp {
20*d30ea906Sjfb8856606 	uint32_t model;
21*d30ea906Sjfb8856606 	uint32_t interface;
22*d30ea906Sjfb8856606 	uint8_t *serial;
23*d30ea906Sjfb8856606 	int serial_len;
24*d30ea906Sjfb8856606 	void *priv;
25*d30ea906Sjfb8856606 
26*d30ea906Sjfb8856606 	/* Mutex cache */
27*d30ea906Sjfb8856606 	struct nfp_cpp_mutex *mutex_cache;
28*d30ea906Sjfb8856606 	const struct nfp_cpp_operations *op;
29*d30ea906Sjfb8856606 
30*d30ea906Sjfb8856606 	/*
31*d30ea906Sjfb8856606 	 * NFP-6xxx originating island IMB CPP Address Translation. CPP Target
32*d30ea906Sjfb8856606 	 * ID is index into array. Values are obtained at runtime from local
33*d30ea906Sjfb8856606 	 * island XPB CSRs.
34*d30ea906Sjfb8856606 	 */
35*d30ea906Sjfb8856606 	uint32_t imb_cat_table[16];
36*d30ea906Sjfb8856606 
37*d30ea906Sjfb8856606 	int driver_lock_needed;
38*d30ea906Sjfb8856606 };
39*d30ea906Sjfb8856606 
40*d30ea906Sjfb8856606 /*
41*d30ea906Sjfb8856606  * NFP CPP device area handle
42*d30ea906Sjfb8856606  */
43*d30ea906Sjfb8856606 struct nfp_cpp_area {
44*d30ea906Sjfb8856606 	struct nfp_cpp *cpp;
45*d30ea906Sjfb8856606 	char *name;
46*d30ea906Sjfb8856606 	unsigned long long offset;
47*d30ea906Sjfb8856606 	unsigned long size;
48*d30ea906Sjfb8856606 	/* Here follows the 'priv' part of nfp_cpp_area. */
49*d30ea906Sjfb8856606 };
50*d30ea906Sjfb8856606 
51*d30ea906Sjfb8856606 /*
52*d30ea906Sjfb8856606  * NFP CPP operations structure
53*d30ea906Sjfb8856606  */
54*d30ea906Sjfb8856606 struct nfp_cpp_operations {
55*d30ea906Sjfb8856606 	/* Size of priv area in struct nfp_cpp_area */
56*d30ea906Sjfb8856606 	size_t area_priv_size;
57*d30ea906Sjfb8856606 
58*d30ea906Sjfb8856606 	/* Instance an NFP CPP */
59*d30ea906Sjfb8856606 	int (*init)(struct nfp_cpp *cpp, struct rte_pci_device *dev);
60*d30ea906Sjfb8856606 
61*d30ea906Sjfb8856606 	/*
62*d30ea906Sjfb8856606 	 * Free the bus.
63*d30ea906Sjfb8856606 	 * Called only once, during nfp_cpp_unregister()
64*d30ea906Sjfb8856606 	 */
65*d30ea906Sjfb8856606 	void (*free)(struct nfp_cpp *cpp);
66*d30ea906Sjfb8856606 
67*d30ea906Sjfb8856606 	/*
68*d30ea906Sjfb8856606 	 * Initialize a new NFP CPP area
69*d30ea906Sjfb8856606 	 * NOTE: This is _not_ serialized
70*d30ea906Sjfb8856606 	 */
71*d30ea906Sjfb8856606 	int (*area_init)(struct nfp_cpp_area *area,
72*d30ea906Sjfb8856606 			 uint32_t dest,
73*d30ea906Sjfb8856606 			 unsigned long long address,
74*d30ea906Sjfb8856606 			 unsigned long size);
75*d30ea906Sjfb8856606 	/*
76*d30ea906Sjfb8856606 	 * Clean up a NFP CPP area before it is freed
77*d30ea906Sjfb8856606 	 * NOTE: This is _not_ serialized
78*d30ea906Sjfb8856606 	 */
79*d30ea906Sjfb8856606 	void (*area_cleanup)(struct nfp_cpp_area *area);
80*d30ea906Sjfb8856606 
81*d30ea906Sjfb8856606 	/*
82*d30ea906Sjfb8856606 	 * Acquire resources for a NFP CPP area
83*d30ea906Sjfb8856606 	 * Serialized
84*d30ea906Sjfb8856606 	 */
85*d30ea906Sjfb8856606 	int (*area_acquire)(struct nfp_cpp_area *area);
86*d30ea906Sjfb8856606 	/*
87*d30ea906Sjfb8856606 	 * Release resources for a NFP CPP area
88*d30ea906Sjfb8856606 	 * Serialized
89*d30ea906Sjfb8856606 	 */
90*d30ea906Sjfb8856606 	void (*area_release)(struct nfp_cpp_area *area);
91*d30ea906Sjfb8856606 	/*
92*d30ea906Sjfb8856606 	 * Return a void IO pointer to a NFP CPP area
93*d30ea906Sjfb8856606 	 * NOTE: This is _not_ serialized
94*d30ea906Sjfb8856606 	 */
95*d30ea906Sjfb8856606 
96*d30ea906Sjfb8856606 	void *(*area_iomem)(struct nfp_cpp_area *area);
97*d30ea906Sjfb8856606 
98*d30ea906Sjfb8856606 	void *(*area_mapped)(struct nfp_cpp_area *area);
99*d30ea906Sjfb8856606 	/*
100*d30ea906Sjfb8856606 	 * Perform a read from a NFP CPP area
101*d30ea906Sjfb8856606 	 * Serialized
102*d30ea906Sjfb8856606 	 */
103*d30ea906Sjfb8856606 	int (*area_read)(struct nfp_cpp_area *area,
104*d30ea906Sjfb8856606 			 void *kernel_vaddr,
105*d30ea906Sjfb8856606 			 unsigned long offset,
106*d30ea906Sjfb8856606 			 unsigned int length);
107*d30ea906Sjfb8856606 	/*
108*d30ea906Sjfb8856606 	 * Perform a write to a NFP CPP area
109*d30ea906Sjfb8856606 	 * Serialized
110*d30ea906Sjfb8856606 	 */
111*d30ea906Sjfb8856606 	int (*area_write)(struct nfp_cpp_area *area,
112*d30ea906Sjfb8856606 			  const void *kernel_vaddr,
113*d30ea906Sjfb8856606 			  unsigned long offset,
114*d30ea906Sjfb8856606 			  unsigned int length);
115*d30ea906Sjfb8856606 };
116*d30ea906Sjfb8856606 
117*d30ea906Sjfb8856606 /*
118*d30ea906Sjfb8856606  * This should be the only external function the transport
119*d30ea906Sjfb8856606  * module supplies
120*d30ea906Sjfb8856606  */
121*d30ea906Sjfb8856606 const struct nfp_cpp_operations *nfp_cpp_transport_operations(void);
122*d30ea906Sjfb8856606 
123*d30ea906Sjfb8856606 /*
124*d30ea906Sjfb8856606  * Set the model id
125*d30ea906Sjfb8856606  *
126*d30ea906Sjfb8856606  * @param   cpp     NFP CPP operations structure
127*d30ea906Sjfb8856606  * @param   model   Model ID
128*d30ea906Sjfb8856606  */
129*d30ea906Sjfb8856606 void nfp_cpp_model_set(struct nfp_cpp *cpp, uint32_t model);
130*d30ea906Sjfb8856606 
131*d30ea906Sjfb8856606 /*
132*d30ea906Sjfb8856606  * Set the private instance owned data of a nfp_cpp struct
133*d30ea906Sjfb8856606  *
134*d30ea906Sjfb8856606  * @param   cpp     NFP CPP operations structure
135*d30ea906Sjfb8856606  * @param   interface Interface ID
136*d30ea906Sjfb8856606  */
137*d30ea906Sjfb8856606 void nfp_cpp_interface_set(struct nfp_cpp *cpp, uint32_t interface);
138*d30ea906Sjfb8856606 
139*d30ea906Sjfb8856606 /*
140*d30ea906Sjfb8856606  * Set the private instance owned data of a nfp_cpp struct
141*d30ea906Sjfb8856606  *
142*d30ea906Sjfb8856606  * @param   cpp     NFP CPP operations structure
143*d30ea906Sjfb8856606  * @param   serial  NFP serial byte array
144*d30ea906Sjfb8856606  * @param   len     Length of the serial byte array
145*d30ea906Sjfb8856606  */
146*d30ea906Sjfb8856606 int nfp_cpp_serial_set(struct nfp_cpp *cpp, const uint8_t *serial,
147*d30ea906Sjfb8856606 		       size_t serial_len);
148*d30ea906Sjfb8856606 
149*d30ea906Sjfb8856606 /*
150*d30ea906Sjfb8856606  * Set the private data of the nfp_cpp instance
151*d30ea906Sjfb8856606  *
152*d30ea906Sjfb8856606  * @param   cpp NFP CPP operations structure
153*d30ea906Sjfb8856606  * @return      Opaque device pointer
154*d30ea906Sjfb8856606  */
155*d30ea906Sjfb8856606 void nfp_cpp_priv_set(struct nfp_cpp *cpp, void *priv);
156*d30ea906Sjfb8856606 
157*d30ea906Sjfb8856606 /*
158*d30ea906Sjfb8856606  * Return the private data of the nfp_cpp instance
159*d30ea906Sjfb8856606  *
160*d30ea906Sjfb8856606  * @param   cpp NFP CPP operations structure
161*d30ea906Sjfb8856606  * @return      Opaque device pointer
162*d30ea906Sjfb8856606  */
163*d30ea906Sjfb8856606 void *nfp_cpp_priv(struct nfp_cpp *cpp);
164*d30ea906Sjfb8856606 
165*d30ea906Sjfb8856606 /*
166*d30ea906Sjfb8856606  * Get the privately allocated portion of a NFP CPP area handle
167*d30ea906Sjfb8856606  *
168*d30ea906Sjfb8856606  * @param   cpp_area    NFP CPP area handle
169*d30ea906Sjfb8856606  * @return          Pointer to the private area, or NULL on failure
170*d30ea906Sjfb8856606  */
171*d30ea906Sjfb8856606 void *nfp_cpp_area_priv(struct nfp_cpp_area *cpp_area);
172*d30ea906Sjfb8856606 
173*d30ea906Sjfb8856606 uint32_t __nfp_cpp_model_autodetect(struct nfp_cpp *cpp);
174*d30ea906Sjfb8856606 
175*d30ea906Sjfb8856606 /*
176*d30ea906Sjfb8856606  * NFP CPP core interface for CPP clients.
177*d30ea906Sjfb8856606  */
178*d30ea906Sjfb8856606 
179*d30ea906Sjfb8856606 /*
180*d30ea906Sjfb8856606  * Open a NFP CPP handle to a CPP device
181*d30ea906Sjfb8856606  *
182*d30ea906Sjfb8856606  * @param[in]	id	0-based ID for the CPP interface to use
183*d30ea906Sjfb8856606  *
184*d30ea906Sjfb8856606  * @return NFP CPP handle, or NULL on failure (and set errno accordingly).
185*d30ea906Sjfb8856606  */
186*d30ea906Sjfb8856606 struct nfp_cpp *nfp_cpp_from_device_name(struct rte_pci_device *dev,
187*d30ea906Sjfb8856606 					 int driver_lock_needed);
188*d30ea906Sjfb8856606 
189*d30ea906Sjfb8856606 /*
190*d30ea906Sjfb8856606  * Free a NFP CPP handle
191*d30ea906Sjfb8856606  *
192*d30ea906Sjfb8856606  * @param[in]	cpp	NFP CPP handle
193*d30ea906Sjfb8856606  */
194*d30ea906Sjfb8856606 void nfp_cpp_free(struct nfp_cpp *cpp);
195*d30ea906Sjfb8856606 
196*d30ea906Sjfb8856606 #define NFP_CPP_MODEL_INVALID   0xffffffff
197*d30ea906Sjfb8856606 
198*d30ea906Sjfb8856606 /*
199*d30ea906Sjfb8856606  * NFP_CPP_MODEL_CHIP_of - retrieve the chip ID from the model ID
200*d30ea906Sjfb8856606  *
201*d30ea906Sjfb8856606  * The chip ID is a 16-bit BCD+A-F encoding for the chip type.
202*d30ea906Sjfb8856606  *
203*d30ea906Sjfb8856606  * @param[in]   model   NFP CPP model id
204*d30ea906Sjfb8856606  * @return      NFP CPP chip id
205*d30ea906Sjfb8856606  */
206*d30ea906Sjfb8856606 #define NFP_CPP_MODEL_CHIP_of(model)        (((model) >> 16) & 0xffff)
207*d30ea906Sjfb8856606 
208*d30ea906Sjfb8856606 /*
209*d30ea906Sjfb8856606  * NFP_CPP_MODEL_IS_6000 - Check for the NFP6000 family of devices
210*d30ea906Sjfb8856606  *
211*d30ea906Sjfb8856606  * NOTE: The NFP4000 series is considered as a NFP6000 series variant.
212*d30ea906Sjfb8856606  *
213*d30ea906Sjfb8856606  * @param[in]	model	NFP CPP model id
214*d30ea906Sjfb8856606  * @return		true if model is in the NFP6000 family, false otherwise.
215*d30ea906Sjfb8856606  */
216*d30ea906Sjfb8856606 #define NFP_CPP_MODEL_IS_6000(model)		     \
217*d30ea906Sjfb8856606 		((NFP_CPP_MODEL_CHIP_of(model) >= 0x4000) && \
218*d30ea906Sjfb8856606 		(NFP_CPP_MODEL_CHIP_of(model) < 0x7000))
219*d30ea906Sjfb8856606 
220*d30ea906Sjfb8856606 /*
221*d30ea906Sjfb8856606  * nfp_cpp_model - Retrieve the Model ID of the NFP
222*d30ea906Sjfb8856606  *
223*d30ea906Sjfb8856606  * @param[in]	cpp	NFP CPP handle
224*d30ea906Sjfb8856606  * @return		NFP CPP Model ID
225*d30ea906Sjfb8856606  */
226*d30ea906Sjfb8856606 uint32_t nfp_cpp_model(struct nfp_cpp *cpp);
227*d30ea906Sjfb8856606 
228*d30ea906Sjfb8856606 /*
229*d30ea906Sjfb8856606  * NFP Interface types - logical interface for this CPP connection 4 bits are
230*d30ea906Sjfb8856606  * reserved for interface type.
231*d30ea906Sjfb8856606  */
232*d30ea906Sjfb8856606 #define NFP_CPP_INTERFACE_TYPE_INVALID		0x0
233*d30ea906Sjfb8856606 #define NFP_CPP_INTERFACE_TYPE_PCI		0x1
234*d30ea906Sjfb8856606 #define NFP_CPP_INTERFACE_TYPE_ARM		0x2
235*d30ea906Sjfb8856606 #define NFP_CPP_INTERFACE_TYPE_RPC		0x3
236*d30ea906Sjfb8856606 #define NFP_CPP_INTERFACE_TYPE_ILA		0x4
237*d30ea906Sjfb8856606 
238*d30ea906Sjfb8856606 /*
239*d30ea906Sjfb8856606  * Construct a 16-bit NFP Interface ID
240*d30ea906Sjfb8856606  *
241*d30ea906Sjfb8856606  * Interface IDs consists of 4 bits of interface type, 4 bits of unit
242*d30ea906Sjfb8856606  * identifier, and 8 bits of channel identifier.
243*d30ea906Sjfb8856606  *
244*d30ea906Sjfb8856606  * The NFP Interface ID is used in the implementation of NFP CPP API mutexes,
245*d30ea906Sjfb8856606  * which use the MU Atomic CompareAndWrite operation - hence the limit to 16
246*d30ea906Sjfb8856606  * bits to be able to use the NFP Interface ID as a lock owner.
247*d30ea906Sjfb8856606  *
248*d30ea906Sjfb8856606  * @param[in]	type	NFP Interface Type
249*d30ea906Sjfb8856606  * @param[in]	unit	Unit identifier for the interface type
250*d30ea906Sjfb8856606  * @param[in]	channel	Channel identifier for the interface unit
251*d30ea906Sjfb8856606  * @return		Interface ID
252*d30ea906Sjfb8856606  */
253*d30ea906Sjfb8856606 #define NFP_CPP_INTERFACE(type, unit, channel)	\
254*d30ea906Sjfb8856606 	((((type) & 0xf) << 12) | \
255*d30ea906Sjfb8856606 	 (((unit) & 0xf) <<  8) | \
256*d30ea906Sjfb8856606 	 (((channel) & 0xff) << 0))
257*d30ea906Sjfb8856606 
258*d30ea906Sjfb8856606 /*
259*d30ea906Sjfb8856606  * Get the interface type of a NFP Interface ID
260*d30ea906Sjfb8856606  * @param[in]	interface	NFP Interface ID
261*d30ea906Sjfb8856606  * @return			NFP Interface ID's type
262*d30ea906Sjfb8856606  */
263*d30ea906Sjfb8856606 #define NFP_CPP_INTERFACE_TYPE_of(interface)	(((interface) >> 12) & 0xf)
264*d30ea906Sjfb8856606 
265*d30ea906Sjfb8856606 /*
266*d30ea906Sjfb8856606  * Get the interface unit of a NFP Interface ID
267*d30ea906Sjfb8856606  * @param[in]	interface	NFP Interface ID
268*d30ea906Sjfb8856606  * @return			NFP Interface ID's unit
269*d30ea906Sjfb8856606  */
270*d30ea906Sjfb8856606 #define NFP_CPP_INTERFACE_UNIT_of(interface)	(((interface) >>  8) & 0xf)
271*d30ea906Sjfb8856606 
272*d30ea906Sjfb8856606 /*
273*d30ea906Sjfb8856606  * Get the interface channel of a NFP Interface ID
274*d30ea906Sjfb8856606  * @param[in]	interface	NFP Interface ID
275*d30ea906Sjfb8856606  * @return			NFP Interface ID's channel
276*d30ea906Sjfb8856606  */
277*d30ea906Sjfb8856606 #define NFP_CPP_INTERFACE_CHANNEL_of(interface)	(((interface) >>  0) & 0xff)
278*d30ea906Sjfb8856606 
279*d30ea906Sjfb8856606 /*
280*d30ea906Sjfb8856606  * Retrieve the Interface ID of the NFP
281*d30ea906Sjfb8856606  * @param[in]	cpp	NFP CPP handle
282*d30ea906Sjfb8856606  * @return		NFP CPP Interface ID
283*d30ea906Sjfb8856606  */
284*d30ea906Sjfb8856606 uint16_t nfp_cpp_interface(struct nfp_cpp *cpp);
285*d30ea906Sjfb8856606 
286*d30ea906Sjfb8856606 /*
287*d30ea906Sjfb8856606  * Retrieve the NFP Serial Number (unique per NFP)
288*d30ea906Sjfb8856606  * @param[in]	cpp	NFP CPP handle
289*d30ea906Sjfb8856606  * @param[out]	serial	Pointer to reference the serial number array
290*d30ea906Sjfb8856606  *
291*d30ea906Sjfb8856606  * @return	size of the NFP6000 serial number, in bytes
292*d30ea906Sjfb8856606  */
293*d30ea906Sjfb8856606 int nfp_cpp_serial(struct nfp_cpp *cpp, const uint8_t **serial);
294*d30ea906Sjfb8856606 
295*d30ea906Sjfb8856606 /*
296*d30ea906Sjfb8856606  * Allocate a NFP CPP area handle, as an offset into a CPP ID
297*d30ea906Sjfb8856606  * @param[in]	cpp	NFP CPP handle
298*d30ea906Sjfb8856606  * @param[in]	cpp_id	NFP CPP ID
299*d30ea906Sjfb8856606  * @param[in]	address	Offset into the NFP CPP ID address space
300*d30ea906Sjfb8856606  * @param[in]	size	Size of the area to reserve
301*d30ea906Sjfb8856606  *
302*d30ea906Sjfb8856606  * @return NFP CPP handle, or NULL on failure (and set errno accordingly).
303*d30ea906Sjfb8856606  */
304*d30ea906Sjfb8856606 struct nfp_cpp_area *nfp_cpp_area_alloc(struct nfp_cpp *cpp, uint32_t cpp_id,
305*d30ea906Sjfb8856606 					unsigned long long address,
306*d30ea906Sjfb8856606 					unsigned long size);
307*d30ea906Sjfb8856606 
308*d30ea906Sjfb8856606 /*
309*d30ea906Sjfb8856606  * Allocate a NFP CPP area handle, as an offset into a CPP ID, by a named owner
310*d30ea906Sjfb8856606  * @param[in]	cpp	NFP CPP handle
311*d30ea906Sjfb8856606  * @param[in]	cpp_id	NFP CPP ID
312*d30ea906Sjfb8856606  * @param[in]	name	Name of owner of the area
313*d30ea906Sjfb8856606  * @param[in]	address	Offset into the NFP CPP ID address space
314*d30ea906Sjfb8856606  * @param[in]	size	Size of the area to reserve
315*d30ea906Sjfb8856606  *
316*d30ea906Sjfb8856606  * @return NFP CPP handle, or NULL on failure (and set errno accordingly).
317*d30ea906Sjfb8856606  */
318*d30ea906Sjfb8856606 struct nfp_cpp_area *nfp_cpp_area_alloc_with_name(struct nfp_cpp *cpp,
319*d30ea906Sjfb8856606 						  uint32_t cpp_id,
320*d30ea906Sjfb8856606 						  const char *name,
321*d30ea906Sjfb8856606 						  unsigned long long address,
322*d30ea906Sjfb8856606 						  unsigned long size);
323*d30ea906Sjfb8856606 
324*d30ea906Sjfb8856606 /*
325*d30ea906Sjfb8856606  * Free an allocated NFP CPP area handle
326*d30ea906Sjfb8856606  * @param[in]	area	NFP CPP area handle
327*d30ea906Sjfb8856606  */
328*d30ea906Sjfb8856606 void nfp_cpp_area_free(struct nfp_cpp_area *area);
329*d30ea906Sjfb8856606 
330*d30ea906Sjfb8856606 /*
331*d30ea906Sjfb8856606  * Acquire the resources needed to access the NFP CPP area handle
332*d30ea906Sjfb8856606  *
333*d30ea906Sjfb8856606  * @param[in]	area	NFP CPP area handle
334*d30ea906Sjfb8856606  *
335*d30ea906Sjfb8856606  * @return 0 on success, -1 on failure (and set errno accordingly).
336*d30ea906Sjfb8856606  */
337*d30ea906Sjfb8856606 int nfp_cpp_area_acquire(struct nfp_cpp_area *area);
338*d30ea906Sjfb8856606 
339*d30ea906Sjfb8856606 /*
340*d30ea906Sjfb8856606  * Release the resources needed to access the NFP CPP area handle
341*d30ea906Sjfb8856606  *
342*d30ea906Sjfb8856606  * @param[in]	area	NFP CPP area handle
343*d30ea906Sjfb8856606  */
344*d30ea906Sjfb8856606 void nfp_cpp_area_release(struct nfp_cpp_area *area);
345*d30ea906Sjfb8856606 
346*d30ea906Sjfb8856606 /*
347*d30ea906Sjfb8856606  * Allocate, then acquire the resources needed to access the NFP CPP area handle
348*d30ea906Sjfb8856606  * @param[in]	cpp	NFP CPP handle
349*d30ea906Sjfb8856606  * @param[in]	cpp_id	NFP CPP ID
350*d30ea906Sjfb8856606  * @param[in]	address	Offset into the NFP CPP ID address space
351*d30ea906Sjfb8856606  * @param[in]	size	Size of the area to reserve
352*d30ea906Sjfb8856606  *
353*d30ea906Sjfb8856606  * @return NFP CPP handle, or NULL on failure (and set errno accordingly).
354*d30ea906Sjfb8856606  */
355*d30ea906Sjfb8856606 struct nfp_cpp_area *nfp_cpp_area_alloc_acquire(struct nfp_cpp *cpp,
356*d30ea906Sjfb8856606 						uint32_t cpp_id,
357*d30ea906Sjfb8856606 						unsigned long long address,
358*d30ea906Sjfb8856606 						unsigned long size);
359*d30ea906Sjfb8856606 
360*d30ea906Sjfb8856606 /*
361*d30ea906Sjfb8856606  * Release the resources, then free the NFP CPP area handle
362*d30ea906Sjfb8856606  * @param[in]	area	NFP CPP area handle
363*d30ea906Sjfb8856606  */
364*d30ea906Sjfb8856606 void nfp_cpp_area_release_free(struct nfp_cpp_area *area);
365*d30ea906Sjfb8856606 
366*d30ea906Sjfb8856606 uint8_t *nfp_cpp_map_area(struct nfp_cpp *cpp, int domain, int target,
367*d30ea906Sjfb8856606 			   uint64_t addr, unsigned long size,
368*d30ea906Sjfb8856606 			   struct nfp_cpp_area **area);
369*d30ea906Sjfb8856606 /*
370*d30ea906Sjfb8856606  * Return an IO pointer to the beginning of the NFP CPP area handle. The area
371*d30ea906Sjfb8856606  * must be acquired with 'nfp_cpp_area_acquire()' before calling this operation.
372*d30ea906Sjfb8856606  *
373*d30ea906Sjfb8856606  * @param[in]	area	NFP CPP area handle
374*d30ea906Sjfb8856606  *
375*d30ea906Sjfb8856606  * @return Pointer to IO memory, or NULL on failure (and set errno accordingly).
376*d30ea906Sjfb8856606  */
377*d30ea906Sjfb8856606 void *nfp_cpp_area_mapped(struct nfp_cpp_area *area);
378*d30ea906Sjfb8856606 
379*d30ea906Sjfb8856606 /*
380*d30ea906Sjfb8856606  * Read from a NFP CPP area handle into a buffer. The area must be acquired with
381*d30ea906Sjfb8856606  * 'nfp_cpp_area_acquire()' before calling this operation.
382*d30ea906Sjfb8856606  *
383*d30ea906Sjfb8856606  * @param[in]	area	NFP CPP area handle
384*d30ea906Sjfb8856606  * @param[in]	offset	Offset into the area
385*d30ea906Sjfb8856606  * @param[in]	buffer	Location of buffer to receive the data
386*d30ea906Sjfb8856606  * @param[in]	length	Length of the data to read
387*d30ea906Sjfb8856606  *
388*d30ea906Sjfb8856606  * @return bytes read on success, -1 on failure (and set errno accordingly).
389*d30ea906Sjfb8856606  *
390*d30ea906Sjfb8856606  */
391*d30ea906Sjfb8856606 int nfp_cpp_area_read(struct nfp_cpp_area *area, unsigned long offset,
392*d30ea906Sjfb8856606 		      void *buffer, size_t length);
393*d30ea906Sjfb8856606 
394*d30ea906Sjfb8856606 /*
395*d30ea906Sjfb8856606  * Write to a NFP CPP area handle from a buffer. The area must be acquired with
396*d30ea906Sjfb8856606  * 'nfp_cpp_area_acquire()' before calling this operation.
397*d30ea906Sjfb8856606  *
398*d30ea906Sjfb8856606  * @param[in]	area	NFP CPP area handle
399*d30ea906Sjfb8856606  * @param[in]	offset	Offset into the area
400*d30ea906Sjfb8856606  * @param[in]	buffer	Location of buffer that holds the data
401*d30ea906Sjfb8856606  * @param[in]	length	Length of the data to read
402*d30ea906Sjfb8856606  *
403*d30ea906Sjfb8856606  * @return bytes written on success, -1 on failure (and set errno accordingly).
404*d30ea906Sjfb8856606  */
405*d30ea906Sjfb8856606 int nfp_cpp_area_write(struct nfp_cpp_area *area, unsigned long offset,
406*d30ea906Sjfb8856606 		       const void *buffer, size_t length);
407*d30ea906Sjfb8856606 
408*d30ea906Sjfb8856606 /*
409*d30ea906Sjfb8856606  * nfp_cpp_area_iomem() - get IOMEM region for CPP area
410*d30ea906Sjfb8856606  * @area:       CPP area handle
411*d30ea906Sjfb8856606  *
412*d30ea906Sjfb8856606  * Returns an iomem pointer for use with readl()/writel() style operations.
413*d30ea906Sjfb8856606  *
414*d30ea906Sjfb8856606  * NOTE: Area must have been locked down with an 'acquire'.
415*d30ea906Sjfb8856606  *
416*d30ea906Sjfb8856606  * Return: pointer to the area, or NULL
417*d30ea906Sjfb8856606  */
418*d30ea906Sjfb8856606 void *nfp_cpp_area_iomem(struct nfp_cpp_area *area);
419*d30ea906Sjfb8856606 
420*d30ea906Sjfb8856606 /*
421*d30ea906Sjfb8856606  * Verify that IO can be performed on an offset in an area
422*d30ea906Sjfb8856606  *
423*d30ea906Sjfb8856606  * @param[in]	area	NFP CPP area handle
424*d30ea906Sjfb8856606  * @param[in]	offset	Offset into the area
425*d30ea906Sjfb8856606  * @param[in]	size	Size of region to validate
426*d30ea906Sjfb8856606  *
427*d30ea906Sjfb8856606  * @return 0 on success, -1 on failure (and set errno accordingly).
428*d30ea906Sjfb8856606  */
429*d30ea906Sjfb8856606 int nfp_cpp_area_check_range(struct nfp_cpp_area *area,
430*d30ea906Sjfb8856606 			     unsigned long long offset, unsigned long size);
431*d30ea906Sjfb8856606 
432*d30ea906Sjfb8856606 /*
433*d30ea906Sjfb8856606  * Get the NFP CPP handle that is the parent of a NFP CPP area handle
434*d30ea906Sjfb8856606  *
435*d30ea906Sjfb8856606  * @param	cpp_area	NFP CPP area handle
436*d30ea906Sjfb8856606  * @return			NFP CPP handle
437*d30ea906Sjfb8856606  */
438*d30ea906Sjfb8856606 struct nfp_cpp *nfp_cpp_area_cpp(struct nfp_cpp_area *cpp_area);
439*d30ea906Sjfb8856606 
440*d30ea906Sjfb8856606 /*
441*d30ea906Sjfb8856606  * Get the name passed during allocation of the NFP CPP area handle
442*d30ea906Sjfb8856606  *
443*d30ea906Sjfb8856606  * @param	cpp_area	NFP CPP area handle
444*d30ea906Sjfb8856606  * @return			Pointer to the area's name
445*d30ea906Sjfb8856606  */
446*d30ea906Sjfb8856606 const char *nfp_cpp_area_name(struct nfp_cpp_area *cpp_area);
447*d30ea906Sjfb8856606 
448*d30ea906Sjfb8856606 /*
449*d30ea906Sjfb8856606  * Read a block of data from a NFP CPP ID
450*d30ea906Sjfb8856606  *
451*d30ea906Sjfb8856606  * @param[in]	cpp	NFP CPP handle
452*d30ea906Sjfb8856606  * @param[in]	cpp_id	NFP CPP ID
453*d30ea906Sjfb8856606  * @param[in]	address	Offset into the NFP CPP ID address space
454*d30ea906Sjfb8856606  * @param[in]	kernel_vaddr	Buffer to copy read data to
455*d30ea906Sjfb8856606  * @param[in]	length	Size of the area to reserve
456*d30ea906Sjfb8856606  *
457*d30ea906Sjfb8856606  * @return bytes read on success, -1 on failure (and set errno accordingly).
458*d30ea906Sjfb8856606  */
459*d30ea906Sjfb8856606 int nfp_cpp_read(struct nfp_cpp *cpp, uint32_t cpp_id,
460*d30ea906Sjfb8856606 		 unsigned long long address, void *kernel_vaddr, size_t length);
461*d30ea906Sjfb8856606 
462*d30ea906Sjfb8856606 /*
463*d30ea906Sjfb8856606  * Write a block of data to a NFP CPP ID
464*d30ea906Sjfb8856606  *
465*d30ea906Sjfb8856606  * @param[in]	cpp	NFP CPP handle
466*d30ea906Sjfb8856606  * @param[in]	cpp_id	NFP CPP ID
467*d30ea906Sjfb8856606  * @param[in]	address	Offset into the NFP CPP ID address space
468*d30ea906Sjfb8856606  * @param[in]	kernel_vaddr	Buffer to copy write data from
469*d30ea906Sjfb8856606  * @param[in]	length	Size of the area to reserve
470*d30ea906Sjfb8856606  *
471*d30ea906Sjfb8856606  * @return bytes written on success, -1 on failure (and set errno accordingly).
472*d30ea906Sjfb8856606  */
473*d30ea906Sjfb8856606 int nfp_cpp_write(struct nfp_cpp *cpp, uint32_t cpp_id,
474*d30ea906Sjfb8856606 		  unsigned long long address, const void *kernel_vaddr,
475*d30ea906Sjfb8856606 		  size_t length);
476*d30ea906Sjfb8856606 
477*d30ea906Sjfb8856606 
478*d30ea906Sjfb8856606 
479*d30ea906Sjfb8856606 /*
480*d30ea906Sjfb8856606  * Fill a NFP CPP area handle and offset with a value
481*d30ea906Sjfb8856606  *
482*d30ea906Sjfb8856606  * @param[in]	area	NFP CPP area handle
483*d30ea906Sjfb8856606  * @param[in]	offset	Offset into the NFP CPP ID address space
484*d30ea906Sjfb8856606  * @param[in]	value	32-bit value to fill area with
485*d30ea906Sjfb8856606  * @param[in]	length	Size of the area to reserve
486*d30ea906Sjfb8856606  *
487*d30ea906Sjfb8856606  * @return bytes written on success, -1 on failure (and set errno accordingly).
488*d30ea906Sjfb8856606  */
489*d30ea906Sjfb8856606 int nfp_cpp_area_fill(struct nfp_cpp_area *area, unsigned long offset,
490*d30ea906Sjfb8856606 		      uint32_t value, size_t length);
491*d30ea906Sjfb8856606 
492*d30ea906Sjfb8856606 /*
493*d30ea906Sjfb8856606  * Read a single 32-bit value from a NFP CPP area handle
494*d30ea906Sjfb8856606  *
495*d30ea906Sjfb8856606  * @param area		NFP CPP area handle
496*d30ea906Sjfb8856606  * @param offset	offset into NFP CPP area handle
497*d30ea906Sjfb8856606  * @param value		output value
498*d30ea906Sjfb8856606  *
499*d30ea906Sjfb8856606  * The area must be acquired with 'nfp_cpp_area_acquire()' before calling this
500*d30ea906Sjfb8856606  * operation.
501*d30ea906Sjfb8856606  *
502*d30ea906Sjfb8856606  * NOTE: offset must be 32-bit aligned.
503*d30ea906Sjfb8856606  *
504*d30ea906Sjfb8856606  * @return 0 on success, or -1 on error (and set errno accordingly).
505*d30ea906Sjfb8856606  */
506*d30ea906Sjfb8856606 int nfp_cpp_area_readl(struct nfp_cpp_area *area, unsigned long offset,
507*d30ea906Sjfb8856606 		       uint32_t *value);
508*d30ea906Sjfb8856606 
509*d30ea906Sjfb8856606 /*
510*d30ea906Sjfb8856606  * Write a single 32-bit value to a NFP CPP area handle
511*d30ea906Sjfb8856606  *
512*d30ea906Sjfb8856606  * @param area		NFP CPP area handle
513*d30ea906Sjfb8856606  * @param offset	offset into NFP CPP area handle
514*d30ea906Sjfb8856606  * @param value		value to write
515*d30ea906Sjfb8856606  *
516*d30ea906Sjfb8856606  * The area must be acquired with 'nfp_cpp_area_acquire()' before calling this
517*d30ea906Sjfb8856606  * operation.
518*d30ea906Sjfb8856606  *
519*d30ea906Sjfb8856606  * NOTE: offset must be 32-bit aligned.
520*d30ea906Sjfb8856606  *
521*d30ea906Sjfb8856606  * @return 0 on success, or -1 on error (and set errno accordingly).
522*d30ea906Sjfb8856606  */
523*d30ea906Sjfb8856606 int nfp_cpp_area_writel(struct nfp_cpp_area *area, unsigned long offset,
524*d30ea906Sjfb8856606 			uint32_t value);
525*d30ea906Sjfb8856606 
526*d30ea906Sjfb8856606 /*
527*d30ea906Sjfb8856606  * Read a single 64-bit value from a NFP CPP area handle
528*d30ea906Sjfb8856606  *
529*d30ea906Sjfb8856606  * @param area		NFP CPP area handle
530*d30ea906Sjfb8856606  * @param offset	offset into NFP CPP area handle
531*d30ea906Sjfb8856606  * @param value		output value
532*d30ea906Sjfb8856606  *
533*d30ea906Sjfb8856606  * The area must be acquired with 'nfp_cpp_area_acquire()' before calling this
534*d30ea906Sjfb8856606  * operation.
535*d30ea906Sjfb8856606  *
536*d30ea906Sjfb8856606  * NOTE: offset must be 64-bit aligned.
537*d30ea906Sjfb8856606  *
538*d30ea906Sjfb8856606  * @return 0 on success, or -1 on error (and set errno accordingly).
539*d30ea906Sjfb8856606  */
540*d30ea906Sjfb8856606 int nfp_cpp_area_readq(struct nfp_cpp_area *area, unsigned long offset,
541*d30ea906Sjfb8856606 		       uint64_t *value);
542*d30ea906Sjfb8856606 
543*d30ea906Sjfb8856606 /*
544*d30ea906Sjfb8856606  * Write a single 64-bit value to a NFP CPP area handle
545*d30ea906Sjfb8856606  *
546*d30ea906Sjfb8856606  * @param area		NFP CPP area handle
547*d30ea906Sjfb8856606  * @param offset	offset into NFP CPP area handle
548*d30ea906Sjfb8856606  * @param value		value to write
549*d30ea906Sjfb8856606  *
550*d30ea906Sjfb8856606  * The area must be acquired with 'nfp_cpp_area_acquire()' before calling this
551*d30ea906Sjfb8856606  * operation.
552*d30ea906Sjfb8856606  *
553*d30ea906Sjfb8856606  * NOTE: offset must be 64-bit aligned.
554*d30ea906Sjfb8856606  *
555*d30ea906Sjfb8856606  * @return 0 on success, or -1 on error (and set errno accordingly).
556*d30ea906Sjfb8856606  */
557*d30ea906Sjfb8856606 int nfp_cpp_area_writeq(struct nfp_cpp_area *area, unsigned long offset,
558*d30ea906Sjfb8856606 			uint64_t value);
559*d30ea906Sjfb8856606 
560*d30ea906Sjfb8856606 /*
561*d30ea906Sjfb8856606  * Write a single 32-bit value on the XPB bus
562*d30ea906Sjfb8856606  *
563*d30ea906Sjfb8856606  * @param cpp           NFP CPP device handle
564*d30ea906Sjfb8856606  * @param xpb_tgt	XPB target and address
565*d30ea906Sjfb8856606  * @param value         value to write
566*d30ea906Sjfb8856606  *
567*d30ea906Sjfb8856606  * @return 0 on success, or -1 on failure (and set errno accordingly).
568*d30ea906Sjfb8856606  */
569*d30ea906Sjfb8856606 int nfp_xpb_writel(struct nfp_cpp *cpp, uint32_t xpb_tgt, uint32_t value);
570*d30ea906Sjfb8856606 
571*d30ea906Sjfb8856606 /*
572*d30ea906Sjfb8856606  * Read a single 32-bit value from the XPB bus
573*d30ea906Sjfb8856606  *
574*d30ea906Sjfb8856606  * @param cpp           NFP CPP device handle
575*d30ea906Sjfb8856606  * @param xpb_tgt	XPB target and address
576*d30ea906Sjfb8856606  * @param value         output value
577*d30ea906Sjfb8856606  *
578*d30ea906Sjfb8856606  * @return 0 on success, or -1 on failure (and set errno accordingly).
579*d30ea906Sjfb8856606  */
580*d30ea906Sjfb8856606 int nfp_xpb_readl(struct nfp_cpp *cpp, uint32_t xpb_tgt, uint32_t *value);
581*d30ea906Sjfb8856606 
582*d30ea906Sjfb8856606 /*
583*d30ea906Sjfb8856606  * Modify bits of a 32-bit value from the XPB bus
584*d30ea906Sjfb8856606  *
585*d30ea906Sjfb8856606  * @param cpp           NFP CPP device handle
586*d30ea906Sjfb8856606  * @param xpb_tgt       XPB target and address
587*d30ea906Sjfb8856606  * @param mask          mask of bits to alter
588*d30ea906Sjfb8856606  * @param value         value to modify
589*d30ea906Sjfb8856606  *
590*d30ea906Sjfb8856606  * @return 0 on success, or -1 on failure (and set errno accordingly).
591*d30ea906Sjfb8856606  */
592*d30ea906Sjfb8856606 int nfp_xpb_writelm(struct nfp_cpp *cpp, uint32_t xpb_tgt, uint32_t mask,
593*d30ea906Sjfb8856606 		    uint32_t value);
594*d30ea906Sjfb8856606 
595*d30ea906Sjfb8856606 /*
596*d30ea906Sjfb8856606  * Modify bits of a 32-bit value from the XPB bus
597*d30ea906Sjfb8856606  *
598*d30ea906Sjfb8856606  * @param cpp           NFP CPP device handle
599*d30ea906Sjfb8856606  * @param xpb_tgt       XPB target and address
600*d30ea906Sjfb8856606  * @param mask          mask of bits to alter
601*d30ea906Sjfb8856606  * @param value         value to monitor for
602*d30ea906Sjfb8856606  * @param timeout_us    maximum number of us to wait (-1 for forever)
603*d30ea906Sjfb8856606  *
604*d30ea906Sjfb8856606  * @return >= 0 on success, or -1 on failure (and set errno accordingly).
605*d30ea906Sjfb8856606  */
606*d30ea906Sjfb8856606 int nfp_xpb_waitlm(struct nfp_cpp *cpp, uint32_t xpb_tgt, uint32_t mask,
607*d30ea906Sjfb8856606 		   uint32_t value, int timeout_us);
608*d30ea906Sjfb8856606 
609*d30ea906Sjfb8856606 /*
610*d30ea906Sjfb8856606  * Read a 32-bit word from a NFP CPP ID
611*d30ea906Sjfb8856606  *
612*d30ea906Sjfb8856606  * @param cpp           NFP CPP handle
613*d30ea906Sjfb8856606  * @param cpp_id        NFP CPP ID
614*d30ea906Sjfb8856606  * @param address       offset into the NFP CPP ID address space
615*d30ea906Sjfb8856606  * @param value         output value
616*d30ea906Sjfb8856606  *
617*d30ea906Sjfb8856606  * @return 0 on success, or -1 on failure (and set errno accordingly).
618*d30ea906Sjfb8856606  */
619*d30ea906Sjfb8856606 int nfp_cpp_readl(struct nfp_cpp *cpp, uint32_t cpp_id,
620*d30ea906Sjfb8856606 		  unsigned long long address, uint32_t *value);
621*d30ea906Sjfb8856606 
622*d30ea906Sjfb8856606 /*
623*d30ea906Sjfb8856606  * Write a 32-bit value to a NFP CPP ID
624*d30ea906Sjfb8856606  *
625*d30ea906Sjfb8856606  * @param cpp           NFP CPP handle
626*d30ea906Sjfb8856606  * @param cpp_id        NFP CPP ID
627*d30ea906Sjfb8856606  * @param address       offset into the NFP CPP ID address space
628*d30ea906Sjfb8856606  * @param value         value to write
629*d30ea906Sjfb8856606  *
630*d30ea906Sjfb8856606  * @return 0 on success, or -1 on failure (and set errno accordingly).
631*d30ea906Sjfb8856606  *
632*d30ea906Sjfb8856606  */
633*d30ea906Sjfb8856606 int nfp_cpp_writel(struct nfp_cpp *cpp, uint32_t cpp_id,
634*d30ea906Sjfb8856606 		   unsigned long long address, uint32_t value);
635*d30ea906Sjfb8856606 
636*d30ea906Sjfb8856606 /*
637*d30ea906Sjfb8856606  * Read a 64-bit work from a NFP CPP ID
638*d30ea906Sjfb8856606  *
639*d30ea906Sjfb8856606  * @param cpp           NFP CPP handle
640*d30ea906Sjfb8856606  * @param cpp_id        NFP CPP ID
641*d30ea906Sjfb8856606  * @param address       offset into the NFP CPP ID address space
642*d30ea906Sjfb8856606  * @param value         output value
643*d30ea906Sjfb8856606  *
644*d30ea906Sjfb8856606  * @return 0 on success, or -1 on failure (and set errno accordingly).
645*d30ea906Sjfb8856606  */
646*d30ea906Sjfb8856606 int nfp_cpp_readq(struct nfp_cpp *cpp, uint32_t cpp_id,
647*d30ea906Sjfb8856606 		  unsigned long long address, uint64_t *value);
648*d30ea906Sjfb8856606 
649*d30ea906Sjfb8856606 /*
650*d30ea906Sjfb8856606  * Write a 64-bit value to a NFP CPP ID
651*d30ea906Sjfb8856606  *
652*d30ea906Sjfb8856606  * @param cpp           NFP CPP handle
653*d30ea906Sjfb8856606  * @param cpp_id        NFP CPP ID
654*d30ea906Sjfb8856606  * @param address       offset into the NFP CPP ID address space
655*d30ea906Sjfb8856606  * @param value         value to write
656*d30ea906Sjfb8856606  *
657*d30ea906Sjfb8856606  * @return 0 on success, or -1 on failure (and set errno accordingly).
658*d30ea906Sjfb8856606  */
659*d30ea906Sjfb8856606 int nfp_cpp_writeq(struct nfp_cpp *cpp, uint32_t cpp_id,
660*d30ea906Sjfb8856606 		   unsigned long long address, uint64_t value);
661*d30ea906Sjfb8856606 
662*d30ea906Sjfb8856606 /*
663*d30ea906Sjfb8856606  * Initialize a mutex location
664*d30ea906Sjfb8856606 
665*d30ea906Sjfb8856606  * The CPP target:address must point to a 64-bit aligned location, and will
666*d30ea906Sjfb8856606  * initialize 64 bits of data at the location.
667*d30ea906Sjfb8856606  *
668*d30ea906Sjfb8856606  * This creates the initial mutex state, as locked by this nfp_cpp_interface().
669*d30ea906Sjfb8856606  *
670*d30ea906Sjfb8856606  * This function should only be called when setting up the initial lock state
671*d30ea906Sjfb8856606  * upon boot-up of the system.
672*d30ea906Sjfb8856606  *
673*d30ea906Sjfb8856606  * @param cpp		NFP CPP handle
674*d30ea906Sjfb8856606  * @param target	NFP CPP target ID
675*d30ea906Sjfb8856606  * @param address	Offset into the address space of the NFP CPP target ID
676*d30ea906Sjfb8856606  * @param key_id	Unique 32-bit value for this mutex
677*d30ea906Sjfb8856606  *
678*d30ea906Sjfb8856606  * @return 0 on success, or -1 on failure (and set errno accordingly).
679*d30ea906Sjfb8856606  */
680*d30ea906Sjfb8856606 int nfp_cpp_mutex_init(struct nfp_cpp *cpp, int target,
681*d30ea906Sjfb8856606 		       unsigned long long address, uint32_t key_id);
682*d30ea906Sjfb8856606 
683*d30ea906Sjfb8856606 /*
684*d30ea906Sjfb8856606  * Create a mutex handle from an address controlled by a MU Atomic engine
685*d30ea906Sjfb8856606  *
686*d30ea906Sjfb8856606  * The CPP target:address must point to a 64-bit aligned location, and reserve
687*d30ea906Sjfb8856606  * 64 bits of data at the location for use by the handle.
688*d30ea906Sjfb8856606  *
689*d30ea906Sjfb8856606  * Only target/address pairs that point to entities that support the MU Atomic
690*d30ea906Sjfb8856606  * Engine's CmpAndSwap32 command are supported.
691*d30ea906Sjfb8856606  *
692*d30ea906Sjfb8856606  * @param cpp		NFP CPP handle
693*d30ea906Sjfb8856606  * @param target	NFP CPP target ID
694*d30ea906Sjfb8856606  * @param address	Offset into the address space of the NFP CPP target ID
695*d30ea906Sjfb8856606  * @param key_id	32-bit unique key (must match the key at this location)
696*d30ea906Sjfb8856606  *
697*d30ea906Sjfb8856606  * @return		A non-NULL struct nfp_cpp_mutex * on success, NULL on
698*d30ea906Sjfb8856606  *                      failure.
699*d30ea906Sjfb8856606  */
700*d30ea906Sjfb8856606 struct nfp_cpp_mutex *nfp_cpp_mutex_alloc(struct nfp_cpp *cpp, int target,
701*d30ea906Sjfb8856606 					  unsigned long long address,
702*d30ea906Sjfb8856606 					  uint32_t key_id);
703*d30ea906Sjfb8856606 
704*d30ea906Sjfb8856606 /*
705*d30ea906Sjfb8856606  * Get the NFP CPP handle the mutex was created with
706*d30ea906Sjfb8856606  *
707*d30ea906Sjfb8856606  * @param   mutex   NFP mutex handle
708*d30ea906Sjfb8856606  * @return          NFP CPP handle
709*d30ea906Sjfb8856606  */
710*d30ea906Sjfb8856606 struct nfp_cpp *nfp_cpp_mutex_cpp(struct nfp_cpp_mutex *mutex);
711*d30ea906Sjfb8856606 
712*d30ea906Sjfb8856606 /*
713*d30ea906Sjfb8856606  * Get the mutex key
714*d30ea906Sjfb8856606  *
715*d30ea906Sjfb8856606  * @param   mutex   NFP mutex handle
716*d30ea906Sjfb8856606  * @return          Mutex key
717*d30ea906Sjfb8856606  */
718*d30ea906Sjfb8856606 uint32_t nfp_cpp_mutex_key(struct nfp_cpp_mutex *mutex);
719*d30ea906Sjfb8856606 
720*d30ea906Sjfb8856606 /*
721*d30ea906Sjfb8856606  * Get the mutex owner
722*d30ea906Sjfb8856606  *
723*d30ea906Sjfb8856606  * @param   mutex   NFP mutex handle
724*d30ea906Sjfb8856606  * @return          Interface ID of the mutex owner
725*d30ea906Sjfb8856606  *
726*d30ea906Sjfb8856606  * NOTE: This is for debug purposes ONLY - the owner may change at any time,
727*d30ea906Sjfb8856606  * unless it has been locked by this NFP CPP handle.
728*d30ea906Sjfb8856606  */
729*d30ea906Sjfb8856606 uint16_t nfp_cpp_mutex_owner(struct nfp_cpp_mutex *mutex);
730*d30ea906Sjfb8856606 
731*d30ea906Sjfb8856606 /*
732*d30ea906Sjfb8856606  * Get the mutex target
733*d30ea906Sjfb8856606  *
734*d30ea906Sjfb8856606  * @param   mutex   NFP mutex handle
735*d30ea906Sjfb8856606  * @return          Mutex CPP target (ie NFP_CPP_TARGET_MU)
736*d30ea906Sjfb8856606  */
737*d30ea906Sjfb8856606 int nfp_cpp_mutex_target(struct nfp_cpp_mutex *mutex);
738*d30ea906Sjfb8856606 
739*d30ea906Sjfb8856606 /*
740*d30ea906Sjfb8856606  * Get the mutex address
741*d30ea906Sjfb8856606  *
742*d30ea906Sjfb8856606  * @param   mutex   NFP mutex handle
743*d30ea906Sjfb8856606  * @return          Mutex CPP address
744*d30ea906Sjfb8856606  */
745*d30ea906Sjfb8856606 uint64_t nfp_cpp_mutex_address(struct nfp_cpp_mutex *mutex);
746*d30ea906Sjfb8856606 
747*d30ea906Sjfb8856606 /*
748*d30ea906Sjfb8856606  * Free a mutex handle - does not alter the lock state
749*d30ea906Sjfb8856606  *
750*d30ea906Sjfb8856606  * @param mutex		NFP CPP Mutex handle
751*d30ea906Sjfb8856606  */
752*d30ea906Sjfb8856606 void nfp_cpp_mutex_free(struct nfp_cpp_mutex *mutex);
753*d30ea906Sjfb8856606 
754*d30ea906Sjfb8856606 /*
755*d30ea906Sjfb8856606  * Lock a mutex handle, using the NFP MU Atomic Engine
756*d30ea906Sjfb8856606  *
757*d30ea906Sjfb8856606  * @param mutex		NFP CPP Mutex handle
758*d30ea906Sjfb8856606  *
759*d30ea906Sjfb8856606  * @return 0 on success, or -1 on failure (and set errno accordingly).
760*d30ea906Sjfb8856606  */
761*d30ea906Sjfb8856606 int nfp_cpp_mutex_lock(struct nfp_cpp_mutex *mutex);
762*d30ea906Sjfb8856606 
763*d30ea906Sjfb8856606 /*
764*d30ea906Sjfb8856606  * Unlock a mutex handle, using the NFP MU Atomic Engine
765*d30ea906Sjfb8856606  *
766*d30ea906Sjfb8856606  * @param mutex		NFP CPP Mutex handle
767*d30ea906Sjfb8856606  *
768*d30ea906Sjfb8856606  * @return 0 on success, or -1 on failure (and set errno accordingly).
769*d30ea906Sjfb8856606  */
770*d30ea906Sjfb8856606 int nfp_cpp_mutex_unlock(struct nfp_cpp_mutex *mutex);
771*d30ea906Sjfb8856606 
772*d30ea906Sjfb8856606 /*
773*d30ea906Sjfb8856606  * Attempt to lock a mutex handle, using the NFP MU Atomic Engine
774*d30ea906Sjfb8856606  *
775*d30ea906Sjfb8856606  * @param mutex		NFP CPP Mutex handle
776*d30ea906Sjfb8856606  * @return		0 if the lock succeeded, -1 on failure (and errno set
777*d30ea906Sjfb8856606  *			appropriately).
778*d30ea906Sjfb8856606  */
779*d30ea906Sjfb8856606 int nfp_cpp_mutex_trylock(struct nfp_cpp_mutex *mutex);
780*d30ea906Sjfb8856606 
781*d30ea906Sjfb8856606 #endif /* !__NFP_CPP_H__ */
782