xref: /linux/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_cpp.h (revision 3ad0876554cafa368f574d4d408468510543e9ff)
1 /*
2  * Copyright (C) 2015-2017 Netronome Systems, Inc.
3  *
4  * This software is dual licensed under the GNU General License Version 2,
5  * June 1991 as shown in the file COPYING in the top-level directory of this
6  * source tree or the BSD 2-Clause License provided below.  You have the
7  * option to license this software under the complete terms of either license.
8  *
9  * The BSD 2-Clause License:
10  *
11  *     Redistribution and use in source and binary forms, with or
12  *     without modification, are permitted provided that the following
13  *     conditions are met:
14  *
15  *      1. Redistributions of source code must retain the above
16  *         copyright notice, this list of conditions and the following
17  *         disclaimer.
18  *
19  *      2. Redistributions in binary form must reproduce the above
20  *         copyright notice, this list of conditions and the following
21  *         disclaimer in the documentation and/or other materials
22  *         provided with the distribution.
23  *
24  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
28  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
29  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
30  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
31  * SOFTWARE.
32  */
33 
34 /*
35  * nfp_cpp.h
36  * Interface for low-level NFP CPP access.
37  * Authors: Jason McMullan <jason.mcmullan@netronome.com>
38  *          Rolf Neugebauer <rolf.neugebauer@netronome.com>
39  */
40 #ifndef __NFP_CPP_H__
41 #define __NFP_CPP_H__
42 
43 #include <linux/ctype.h>
44 #include <linux/types.h>
45 #include <linux/sizes.h>
46 
47 #ifndef NFP_SUBSYS
48 #define NFP_SUBSYS "nfp"
49 #endif
50 
51 #define nfp_err(cpp, fmt, args...) \
52 	dev_err(nfp_cpp_device(cpp)->parent, NFP_SUBSYS ": " fmt, ## args)
53 #define nfp_warn(cpp, fmt, args...) \
54 	dev_warn(nfp_cpp_device(cpp)->parent, NFP_SUBSYS ": " fmt, ## args)
55 #define nfp_info(cpp, fmt, args...) \
56 	dev_info(nfp_cpp_device(cpp)->parent, NFP_SUBSYS ": " fmt, ## args)
57 #define nfp_dbg(cpp, fmt, args...) \
58 	dev_dbg(nfp_cpp_device(cpp)->parent, NFP_SUBSYS ": " fmt, ## args)
59 
60 #define PCI_64BIT_BAR_COUNT             3
61 
62 #define NFP_CPP_NUM_TARGETS             16
63 /* Max size of area it should be safe to request */
64 #define NFP_CPP_SAFE_AREA_SIZE		SZ_2M
65 
66 /* NFP_MUTEX_WAIT_* are timeouts in seconds when waiting for a mutex */
67 #define NFP_MUTEX_WAIT_FIRST_WARN	15
68 #define NFP_MUTEX_WAIT_NEXT_WARN	5
69 #define NFP_MUTEX_WAIT_ERROR		60
70 
71 struct device;
72 
73 struct nfp_cpp_area;
74 struct nfp_cpp;
75 struct resource;
76 
77 /* Wildcard indicating a CPP read or write action
78  *
79  * The action used will be either read or write depending on whether a
80  * read or write instruction/call is performed on the NFP_CPP_ID.  It
81  * is recomended that the RW action is used even if all actions to be
82  * performed on a NFP_CPP_ID are known to be only reads or writes.
83  * Doing so will in many cases save NFP CPP internal software
84  * resources.
85  */
86 #define NFP_CPP_ACTION_RW               32
87 
88 #define NFP_CPP_TARGET_ID_MASK          0x1f
89 
90 /**
91  * NFP_CPP_ID() - pack target, token, and action into a CPP ID.
92  * @target:     NFP CPP target id
93  * @action:     NFP CPP action id
94  * @token:      NFP CPP token id
95  *
96  * Create a 32-bit CPP identifier representing the access to be made.
97  * These identifiers are used as parameters to other NFP CPP
98  * functions.  Some CPP devices may allow wildcard identifiers to be
99  * specified.
100  *
101  * Return:      NFP CPP ID
102  */
103 #define NFP_CPP_ID(target, action, token)			 \
104 	((((target) & 0x7f) << 24) | (((token)  & 0xff) << 16) | \
105 	 (((action) & 0xff) <<  8))
106 
107 /**
108  * NFP_CPP_ISLAND_ID() - pack target, token, action, and island into a CPP ID.
109  * @target:     NFP CPP target id
110  * @action:     NFP CPP action id
111  * @token:      NFP CPP token id
112  * @island:     NFP CPP island id
113  *
114  * Create a 32-bit CPP identifier representing the access to be made.
115  * These identifiers are used as parameters to other NFP CPP
116  * functions.  Some CPP devices may allow wildcard identifiers to be
117  * specified.
118  *
119  * Return:      NFP CPP ID
120  */
121 #define NFP_CPP_ISLAND_ID(target, action, token, island)	 \
122 	((((target) & 0x7f) << 24) | (((token)  & 0xff) << 16) | \
123 	 (((action) & 0xff) <<  8) | (((island) & 0xff) << 0))
124 
125 /**
126  * NFP_CPP_ID_TARGET_of() - Return the NFP CPP target of a NFP CPP ID
127  * @id:         NFP CPP ID
128  *
129  * Return:      NFP CPP target
130  */
131 static inline u8 NFP_CPP_ID_TARGET_of(u32 id)
132 {
133 	return (id >> 24) & NFP_CPP_TARGET_ID_MASK;
134 }
135 
136 /**
137  * NFP_CPP_ID_TOKEN_of() - Return the NFP CPP token of a NFP CPP ID
138  * @id:         NFP CPP ID
139  * Return:      NFP CPP token
140  */
141 static inline u8 NFP_CPP_ID_TOKEN_of(u32 id)
142 {
143 	return (id >> 16) & 0xff;
144 }
145 
146 /**
147  * NFP_CPP_ID_ACTION_of() - Return the NFP CPP action of a NFP CPP ID
148  * @id:         NFP CPP ID
149  *
150  * Return:      NFP CPP action
151  */
152 static inline u8 NFP_CPP_ID_ACTION_of(u32 id)
153 {
154 	return (id >> 8) & 0xff;
155 }
156 
157 /**
158  * NFP_CPP_ID_ISLAND_of() - Return the NFP CPP island of a NFP CPP ID
159  * @id: NFP CPP ID
160  *
161  * Return:      NFP CPP island
162  */
163 static inline u8 NFP_CPP_ID_ISLAND_of(u32 id)
164 {
165 	return (id >> 0) & 0xff;
166 }
167 
168 /* NFP Interface types - logical interface for this CPP connection
169  * 4 bits are reserved for interface type.
170  */
171 #define NFP_CPP_INTERFACE_TYPE_INVALID      0x0
172 #define NFP_CPP_INTERFACE_TYPE_PCI          0x1
173 #define NFP_CPP_INTERFACE_TYPE_ARM          0x2
174 #define NFP_CPP_INTERFACE_TYPE_RPC          0x3
175 #define NFP_CPP_INTERFACE_TYPE_ILA          0x4
176 
177 /**
178  * NFP_CPP_INTERFACE() - Construct a 16-bit NFP Interface ID
179  * @type:       NFP Interface Type
180  * @unit:       Unit identifier for the interface type
181  * @channel:    Channel identifier for the interface unit
182  *
183  * Interface IDs consists of 4 bits of interface type,
184  * 4 bits of unit identifier, and 8 bits of channel identifier.
185  *
186  * The NFP Interface ID is used in the implementation of
187  * NFP CPP API mutexes, which use the MU Atomic CompareAndWrite
188  * operation - hence the limit to 16 bits to be able to
189  * use the NFP Interface ID as a lock owner.
190  *
191  * Return:      Interface ID
192  */
193 #define NFP_CPP_INTERFACE(type, unit, channel)	\
194 	((((type) & 0xf) << 12) |		\
195 	 (((unit) & 0xf) <<  8) |		\
196 	 (((channel) & 0xff) << 0))
197 
198 /**
199  * NFP_CPP_INTERFACE_TYPE_of() - Get the interface type
200  * @interface:  NFP Interface ID
201  * Return:      NFP Interface ID's type
202  */
203 #define NFP_CPP_INTERFACE_TYPE_of(interface)   (((interface) >> 12) & 0xf)
204 
205 /**
206  * NFP_CPP_INTERFACE_UNIT_of() - Get the interface unit
207  * @interface:  NFP Interface ID
208  * Return:      NFP Interface ID's unit
209  */
210 #define NFP_CPP_INTERFACE_UNIT_of(interface)   (((interface) >>  8) & 0xf)
211 
212 /**
213  * NFP_CPP_INTERFACE_CHANNEL_of() - Get the interface channel
214  * @interface:  NFP Interface ID
215  * Return:      NFP Interface ID's channel
216  */
217 #define NFP_CPP_INTERFACE_CHANNEL_of(interface)   (((interface) >>  0) & 0xff)
218 
219 /* Implemented in nfp_cppcore.c */
220 void nfp_cpp_free(struct nfp_cpp *cpp);
221 u32 nfp_cpp_model(struct nfp_cpp *cpp);
222 u16 nfp_cpp_interface(struct nfp_cpp *cpp);
223 int nfp_cpp_serial(struct nfp_cpp *cpp, const u8 **serial);
224 
225 struct nfp_cpp_area *nfp_cpp_area_alloc_with_name(struct nfp_cpp *cpp,
226 						  u32 cpp_id,
227 						  const char *name,
228 						  unsigned long long address,
229 						  unsigned long size);
230 struct nfp_cpp_area *nfp_cpp_area_alloc(struct nfp_cpp *cpp, u32 cpp_id,
231 					unsigned long long address,
232 					unsigned long size);
233 struct nfp_cpp_area *
234 nfp_cpp_area_alloc_acquire(struct nfp_cpp *cpp, const char *name, u32 cpp_id,
235 			   unsigned long long address, unsigned long size);
236 void nfp_cpp_area_free(struct nfp_cpp_area *area);
237 int nfp_cpp_area_acquire(struct nfp_cpp_area *area);
238 int nfp_cpp_area_acquire_nonblocking(struct nfp_cpp_area *area);
239 void nfp_cpp_area_release(struct nfp_cpp_area *area);
240 void nfp_cpp_area_release_free(struct nfp_cpp_area *area);
241 int nfp_cpp_area_read(struct nfp_cpp_area *area, unsigned long offset,
242 		      void *buffer, size_t length);
243 int nfp_cpp_area_write(struct nfp_cpp_area *area, unsigned long offset,
244 		       const void *buffer, size_t length);
245 size_t nfp_cpp_area_size(struct nfp_cpp_area *area);
246 const char *nfp_cpp_area_name(struct nfp_cpp_area *cpp_area);
247 void *nfp_cpp_area_priv(struct nfp_cpp_area *cpp_area);
248 struct nfp_cpp *nfp_cpp_area_cpp(struct nfp_cpp_area *cpp_area);
249 struct resource *nfp_cpp_area_resource(struct nfp_cpp_area *area);
250 phys_addr_t nfp_cpp_area_phys(struct nfp_cpp_area *area);
251 void __iomem *nfp_cpp_area_iomem(struct nfp_cpp_area *area);
252 
253 int nfp_cpp_area_readl(struct nfp_cpp_area *area, unsigned long offset,
254 		       u32 *value);
255 int nfp_cpp_area_writel(struct nfp_cpp_area *area, unsigned long offset,
256 			u32 value);
257 int nfp_cpp_area_readq(struct nfp_cpp_area *area, unsigned long offset,
258 		       u64 *value);
259 int nfp_cpp_area_writeq(struct nfp_cpp_area *area, unsigned long offset,
260 			u64 value);
261 int nfp_cpp_area_fill(struct nfp_cpp_area *area, unsigned long offset,
262 		      u32 value, size_t length);
263 
264 int nfp_xpb_readl(struct nfp_cpp *cpp, u32 xpb_tgt, u32 *value);
265 int nfp_xpb_writel(struct nfp_cpp *cpp, u32 xpb_tgt, u32 value);
266 int nfp_xpb_writelm(struct nfp_cpp *cpp, u32 xpb_tgt, u32 mask, u32 value);
267 
268 /* Implemented in nfp_cpplib.c */
269 int nfp_cpp_read(struct nfp_cpp *cpp, u32 cpp_id,
270 		 unsigned long long address, void *kernel_vaddr, size_t length);
271 int nfp_cpp_write(struct nfp_cpp *cpp, u32 cpp_id,
272 		  unsigned long long address, const void *kernel_vaddr,
273 		  size_t length);
274 int nfp_cpp_readl(struct nfp_cpp *cpp, u32 cpp_id,
275 		  unsigned long long address, u32 *value);
276 int nfp_cpp_writel(struct nfp_cpp *cpp, u32 cpp_id,
277 		   unsigned long long address, u32 value);
278 int nfp_cpp_readq(struct nfp_cpp *cpp, u32 cpp_id,
279 		  unsigned long long address, u64 *value);
280 int nfp_cpp_writeq(struct nfp_cpp *cpp, u32 cpp_id,
281 		   unsigned long long address, u64 value);
282 
283 u8 __iomem *
284 nfp_cpp_map_area(struct nfp_cpp *cpp, const char *name, int domain, int target,
285 		 u64 addr, unsigned long size, struct nfp_cpp_area **area);
286 
287 struct nfp_cpp_mutex;
288 
289 int nfp_cpp_mutex_init(struct nfp_cpp *cpp, int target,
290 		       unsigned long long address, u32 key_id);
291 struct nfp_cpp_mutex *nfp_cpp_mutex_alloc(struct nfp_cpp *cpp, int target,
292 					  unsigned long long address,
293 					  u32 key_id);
294 void nfp_cpp_mutex_free(struct nfp_cpp_mutex *mutex);
295 int nfp_cpp_mutex_lock(struct nfp_cpp_mutex *mutex);
296 int nfp_cpp_mutex_unlock(struct nfp_cpp_mutex *mutex);
297 int nfp_cpp_mutex_trylock(struct nfp_cpp_mutex *mutex);
298 
299 /**
300  * nfp_cppcore_pcie_unit() - Get PCI Unit of a CPP handle
301  * @cpp:	CPP handle
302  *
303  * Return: PCI unit for the NFP CPP handle
304  */
305 static inline u8 nfp_cppcore_pcie_unit(struct nfp_cpp *cpp)
306 {
307 	return NFP_CPP_INTERFACE_UNIT_of(nfp_cpp_interface(cpp));
308 }
309 
310 struct nfp_cpp_explicit;
311 
312 struct nfp_cpp_explicit_command {
313 	u32 cpp_id;
314 	u16 data_ref;
315 	u8  data_master;
316 	u8  len;
317 	u8  byte_mask;
318 	u8  signal_master;
319 	u8  signal_ref;
320 	u8  posted;
321 	u8  siga;
322 	u8  sigb;
323 	s8   siga_mode;
324 	s8   sigb_mode;
325 };
326 
327 #define NFP_SERIAL_LEN		6
328 
329 /**
330  * struct nfp_cpp_operations - NFP CPP operations structure
331  * @area_priv_size:     Size of the nfp_cpp_area private data
332  * @owner:              Owner module
333  * @init:               Initialize the NFP CPP bus
334  * @free:               Free the bus
335  * @read_serial:	Read serial number to memory provided
336  * @get_interface:	Return CPP interface
337  * @area_init:          Initialize a new NFP CPP area (not serialized)
338  * @area_cleanup:       Clean up a NFP CPP area (not serialized)
339  * @area_acquire:       Acquire the NFP CPP area (serialized)
340  * @area_release:       Release area (serialized)
341  * @area_resource:      Get resource range of area (not serialized)
342  * @area_phys:          Get physical address of area (not serialized)
343  * @area_iomem:         Get iomem of area (not serialized)
344  * @area_read:          Perform a read from a NFP CPP area (serialized)
345  * @area_write:         Perform a write to a NFP CPP area (serialized)
346  * @explicit_priv_size: Size of an explicit's private area
347  * @explicit_acquire:   Acquire an explicit area
348  * @explicit_release:   Release an explicit area
349  * @explicit_put:       Write data to send
350  * @explicit_get:       Read data received
351  * @explicit_do:        Perform the transaction
352  */
353 struct nfp_cpp_operations {
354 	size_t area_priv_size;
355 	struct module *owner;
356 
357 	int (*init)(struct nfp_cpp *cpp);
358 	void (*free)(struct nfp_cpp *cpp);
359 
360 	void (*read_serial)(struct device *dev, u8 *serial);
361 	u16 (*get_interface)(struct device *dev);
362 
363 	int (*area_init)(struct nfp_cpp_area *area,
364 			 u32 dest, unsigned long long address,
365 			 unsigned long size);
366 	void (*area_cleanup)(struct nfp_cpp_area *area);
367 	int (*area_acquire)(struct nfp_cpp_area *area);
368 	void (*area_release)(struct nfp_cpp_area *area);
369 	struct resource *(*area_resource)(struct nfp_cpp_area *area);
370 	phys_addr_t (*area_phys)(struct nfp_cpp_area *area);
371 	void __iomem *(*area_iomem)(struct nfp_cpp_area *area);
372 	int (*area_read)(struct nfp_cpp_area *area, void *kernel_vaddr,
373 			 unsigned long offset, unsigned int length);
374 	int (*area_write)(struct nfp_cpp_area *area, const void *kernel_vaddr,
375 			  unsigned long offset, unsigned int length);
376 
377 	size_t explicit_priv_size;
378 	int (*explicit_acquire)(struct nfp_cpp_explicit *expl);
379 	void (*explicit_release)(struct nfp_cpp_explicit *expl);
380 	int (*explicit_put)(struct nfp_cpp_explicit *expl,
381 			    const void *buff, size_t len);
382 	int (*explicit_get)(struct nfp_cpp_explicit *expl,
383 			    void *buff, size_t len);
384 	int (*explicit_do)(struct nfp_cpp_explicit *expl,
385 			   const struct nfp_cpp_explicit_command *cmd,
386 			   u64 address);
387 };
388 
389 struct nfp_cpp *
390 nfp_cpp_from_operations(const struct nfp_cpp_operations *ops,
391 			struct device *parent, void *priv);
392 void *nfp_cpp_priv(struct nfp_cpp *priv);
393 
394 int nfp_cpp_area_cache_add(struct nfp_cpp *cpp, size_t size);
395 
396 /* The following section contains extensions to the
397  * NFP CPP API, to be used in a Linux kernel-space context.
398  */
399 
400 /* Use this channel ID for multiple virtual channel interfaces
401  * (ie ARM and PCIe) when setting up the interface field.
402  */
403 #define NFP_CPP_INTERFACE_CHANNEL_PEROPENER	255
404 struct device *nfp_cpp_device(struct nfp_cpp *cpp);
405 
406 /* Return code masks for nfp_cpp_explicit_do()
407  */
408 #define NFP_SIGNAL_MASK_A	BIT(0)	/* Signal A fired */
409 #define NFP_SIGNAL_MASK_B	BIT(1)	/* Signal B fired */
410 
411 enum nfp_cpp_explicit_signal_mode {
412 	NFP_SIGNAL_NONE = 0,
413 	NFP_SIGNAL_PUSH = 1,
414 	NFP_SIGNAL_PUSH_OPTIONAL = -1,
415 	NFP_SIGNAL_PULL = 2,
416 	NFP_SIGNAL_PULL_OPTIONAL = -2,
417 };
418 
419 struct nfp_cpp_explicit *nfp_cpp_explicit_acquire(struct nfp_cpp *cpp);
420 int nfp_cpp_explicit_set_target(struct nfp_cpp_explicit *expl, u32 cpp_id,
421 				u8 len, u8 mask);
422 int nfp_cpp_explicit_set_data(struct nfp_cpp_explicit *expl,
423 			      u8 data_master, u16 data_ref);
424 int nfp_cpp_explicit_set_signal(struct nfp_cpp_explicit *expl,
425 				u8 signal_master, u8 signal_ref);
426 int nfp_cpp_explicit_set_posted(struct nfp_cpp_explicit *expl, int posted,
427 				u8 siga,
428 				enum nfp_cpp_explicit_signal_mode siga_mode,
429 				u8 sigb,
430 				enum nfp_cpp_explicit_signal_mode sigb_mode);
431 int nfp_cpp_explicit_put(struct nfp_cpp_explicit *expl,
432 			 const void *buff, size_t len);
433 int nfp_cpp_explicit_do(struct nfp_cpp_explicit *expl, u64 address);
434 int nfp_cpp_explicit_get(struct nfp_cpp_explicit *expl, void *buff, size_t len);
435 void nfp_cpp_explicit_release(struct nfp_cpp_explicit *expl);
436 struct nfp_cpp *nfp_cpp_explicit_cpp(struct nfp_cpp_explicit *expl);
437 void *nfp_cpp_explicit_priv(struct nfp_cpp_explicit *cpp_explicit);
438 
439 /* Implemented in nfp_cpplib.c */
440 
441 int nfp_cpp_model_autodetect(struct nfp_cpp *cpp, u32 *model);
442 
443 int nfp_cpp_explicit_read(struct nfp_cpp *cpp, u32 cpp_id,
444 			  u64 addr, void *buff, size_t len,
445 			  int width_read);
446 
447 int nfp_cpp_explicit_write(struct nfp_cpp *cpp, u32 cpp_id,
448 			   u64 addr, const void *buff, size_t len,
449 			   int width_write);
450 
451 #endif /* !__NFP_CPP_H__ */
452