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