2 * Copyright (C) 2015-2017 Netronome Systems, Inc.
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.
9 * The BSD 2-Clause License:
11 * Redistribution and use in source and binary forms, with or
12 * without modification, are permitted provided that the following
15 * 1. Redistributions of source code must retain the above
16 * copyright notice, this list of conditions and the following
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.
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
36 * Interface for low-level NFP CPP access.
37 * Authors: Jason McMullan <jason.mcmullan@netronome.com>
38 * Rolf Neugebauer <rolf.neugebauer@netronome.com>
43 #include <linux/ctype.h>
44 #include <linux/types.h>
45 #include <linux/sizes.h>
48 #define NFP_SUBSYS "nfp"
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)
60 #define PCI_64BIT_BAR_COUNT 3
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
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
77 /* Wildcard indicating a CPP read or write action
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
86 #define NFP_CPP_ACTION_RW 32
88 #define NFP_CPP_TARGET_ID_MASK 0x1f
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
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
103 #define NFP_CPP_ID(target, action, token) \
104 ((((target) & 0x7f) << 24) | (((token) & 0xff) << 16) | \
105 (((action) & 0xff) << 8))
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
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
121 #define NFP_CPP_ISLAND_ID(target, action, token, island) \
122 ((((target) & 0x7f) << 24) | (((token) & 0xff) << 16) | \
123 (((action) & 0xff) << 8) | (((island) & 0xff) << 0))
126 * NFP_CPP_ID_TARGET_of() - Return the NFP CPP target of a NFP CPP ID
129 * Return: NFP CPP target
131 static inline u8
NFP_CPP_ID_TARGET_of(u32 id
)
133 return (id
>> 24) & NFP_CPP_TARGET_ID_MASK
;
137 * NFP_CPP_ID_TOKEN_of() - Return the NFP CPP token of a NFP CPP ID
139 * Return: NFP CPP token
141 static inline u8
NFP_CPP_ID_TOKEN_of(u32 id
)
143 return (id
>> 16) & 0xff;
147 * NFP_CPP_ID_ACTION_of() - Return the NFP CPP action of a NFP CPP ID
150 * Return: NFP CPP action
152 static inline u8
NFP_CPP_ID_ACTION_of(u32 id
)
154 return (id
>> 8) & 0xff;
158 * NFP_CPP_ID_ISLAND_of() - Return the NFP CPP island of a NFP CPP ID
161 * Return: NFP CPP island
163 static inline u8
NFP_CPP_ID_ISLAND_of(u32 id
)
165 return (id
>> 0) & 0xff;
168 /* NFP Interface types - logical interface for this CPP connection
169 * 4 bits are reserved for interface type.
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
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
183 * Interface IDs consists of 4 bits of interface type,
184 * 4 bits of unit identifier, and 8 bits of channel identifier.
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.
191 * Return: Interface ID
193 #define NFP_CPP_INTERFACE(type, unit, channel) \
194 ((((type) & 0xf) << 12) | \
195 (((unit) & 0xf) << 8) | \
196 (((channel) & 0xff) << 0))
199 * NFP_CPP_INTERFACE_TYPE_of() - Get the interface type
200 * @interface: NFP Interface ID
201 * Return: NFP Interface ID's type
203 #define NFP_CPP_INTERFACE_TYPE_of(interface) (((interface) >> 12) & 0xf)
206 * NFP_CPP_INTERFACE_UNIT_of() - Get the interface unit
207 * @interface: NFP Interface ID
208 * Return: NFP Interface ID's unit
210 #define NFP_CPP_INTERFACE_UNIT_of(interface) (((interface) >> 8) & 0xf)
213 * NFP_CPP_INTERFACE_CHANNEL_of() - Get the interface channel
214 * @interface: NFP Interface ID
215 * Return: NFP Interface ID's channel
217 #define NFP_CPP_INTERFACE_CHANNEL_of(interface) (((interface) >> 0) & 0xff)
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
);
225 struct nfp_cpp_area
*nfp_cpp_area_alloc_with_name(struct nfp_cpp
*cpp
,
228 unsigned long long address
,
230 struct nfp_cpp_area
*nfp_cpp_area_alloc(struct nfp_cpp
*cpp
, u32 cpp_id
,
231 unsigned long long address
,
233 void nfp_cpp_area_free(struct nfp_cpp_area
*area
);
234 int nfp_cpp_area_acquire(struct nfp_cpp_area
*area
);
235 int nfp_cpp_area_acquire_nonblocking(struct nfp_cpp_area
*area
);
236 void nfp_cpp_area_release(struct nfp_cpp_area
*area
);
237 void nfp_cpp_area_release_free(struct nfp_cpp_area
*area
);
238 int nfp_cpp_area_read(struct nfp_cpp_area
*area
, unsigned long offset
,
239 void *buffer
, size_t length
);
240 int nfp_cpp_area_write(struct nfp_cpp_area
*area
, unsigned long offset
,
241 const void *buffer
, size_t length
);
242 int nfp_cpp_area_check_range(struct nfp_cpp_area
*area
,
243 unsigned long long offset
, unsigned long size
);
244 const char *nfp_cpp_area_name(struct nfp_cpp_area
*cpp_area
);
245 void *nfp_cpp_area_priv(struct nfp_cpp_area
*cpp_area
);
246 struct nfp_cpp
*nfp_cpp_area_cpp(struct nfp_cpp_area
*cpp_area
);
247 struct resource
*nfp_cpp_area_resource(struct nfp_cpp_area
*area
);
248 phys_addr_t
nfp_cpp_area_phys(struct nfp_cpp_area
*area
);
249 void __iomem
*nfp_cpp_area_iomem(struct nfp_cpp_area
*area
);
251 int nfp_cpp_area_readl(struct nfp_cpp_area
*area
, unsigned long offset
,
253 int nfp_cpp_area_writel(struct nfp_cpp_area
*area
, unsigned long offset
,
255 int nfp_cpp_area_readq(struct nfp_cpp_area
*area
, unsigned long offset
,
257 int nfp_cpp_area_writeq(struct nfp_cpp_area
*area
, unsigned long offset
,
259 int nfp_cpp_area_fill(struct nfp_cpp_area
*area
, unsigned long offset
,
260 u32 value
, size_t length
);
262 int nfp_xpb_readl(struct nfp_cpp
*cpp
, u32 xpb_tgt
, u32
*value
);
263 int nfp_xpb_writel(struct nfp_cpp
*cpp
, u32 xpb_tgt
, u32 value
);
264 int nfp_xpb_writelm(struct nfp_cpp
*cpp
, u32 xpb_tgt
, u32 mask
, u32 value
);
266 /* Implemented in nfp_cpplib.c */
267 int nfp_cpp_read(struct nfp_cpp
*cpp
, u32 cpp_id
,
268 unsigned long long address
, void *kernel_vaddr
, size_t length
);
269 int nfp_cpp_write(struct nfp_cpp
*cpp
, u32 cpp_id
,
270 unsigned long long address
, const void *kernel_vaddr
,
272 int nfp_cpp_readl(struct nfp_cpp
*cpp
, u32 cpp_id
,
273 unsigned long long address
, u32
*value
);
274 int nfp_cpp_writel(struct nfp_cpp
*cpp
, u32 cpp_id
,
275 unsigned long long address
, u32 value
);
276 int nfp_cpp_readq(struct nfp_cpp
*cpp
, u32 cpp_id
,
277 unsigned long long address
, u64
*value
);
278 int nfp_cpp_writeq(struct nfp_cpp
*cpp
, u32 cpp_id
,
279 unsigned long long address
, u64 value
);
281 struct nfp_cpp_mutex
;
283 int nfp_cpp_mutex_init(struct nfp_cpp
*cpp
, int target
,
284 unsigned long long address
, u32 key_id
);
285 struct nfp_cpp_mutex
*nfp_cpp_mutex_alloc(struct nfp_cpp
*cpp
, int target
,
286 unsigned long long address
,
288 void nfp_cpp_mutex_free(struct nfp_cpp_mutex
*mutex
);
289 int nfp_cpp_mutex_lock(struct nfp_cpp_mutex
*mutex
);
290 int nfp_cpp_mutex_unlock(struct nfp_cpp_mutex
*mutex
);
291 int nfp_cpp_mutex_trylock(struct nfp_cpp_mutex
*mutex
);
294 * nfp_cppcore_pcie_unit() - Get PCI Unit of a CPP handle
297 * Return: PCI unit for the NFP CPP handle
299 static inline u8
nfp_cppcore_pcie_unit(struct nfp_cpp
*cpp
)
301 return NFP_CPP_INTERFACE_UNIT_of(nfp_cpp_interface(cpp
));
304 struct nfp_cpp_explicit
;
306 struct nfp_cpp_explicit_command
{
321 #define NFP_SERIAL_LEN 6
324 * struct nfp_cpp_operations - NFP CPP operations structure
325 * @area_priv_size: Size of the nfp_cpp_area private data
326 * @owner: Owner module
327 * @init: Initialize the NFP CPP bus
328 * @free: Free the bus
329 * @read_serial: Read serial number to memory provided
330 * @get_interface: Return CPP interface
331 * @area_init: Initialize a new NFP CPP area (not serialized)
332 * @area_cleanup: Clean up a NFP CPP area (not serialized)
333 * @area_acquire: Acquire the NFP CPP area (serialized)
334 * @area_release: Release area (serialized)
335 * @area_resource: Get resource range of area (not serialized)
336 * @area_phys: Get physical address of area (not serialized)
337 * @area_iomem: Get iomem of area (not serialized)
338 * @area_read: Perform a read from a NFP CPP area (serialized)
339 * @area_write: Perform a write to a NFP CPP area (serialized)
340 * @explicit_priv_size: Size of an explicit's private area
341 * @explicit_acquire: Acquire an explicit area
342 * @explicit_release: Release an explicit area
343 * @explicit_put: Write data to send
344 * @explicit_get: Read data received
345 * @explicit_do: Perform the transaction
347 struct nfp_cpp_operations
{
348 size_t area_priv_size
;
349 struct module
*owner
;
351 int (*init
)(struct nfp_cpp
*cpp
);
352 void (*free
)(struct nfp_cpp
*cpp
);
354 void (*read_serial
)(struct device
*dev
, u8
*serial
);
355 u16 (*get_interface
)(struct device
*dev
);
357 int (*area_init
)(struct nfp_cpp_area
*area
,
358 u32 dest
, unsigned long long address
,
360 void (*area_cleanup
)(struct nfp_cpp_area
*area
);
361 int (*area_acquire
)(struct nfp_cpp_area
*area
);
362 void (*area_release
)(struct nfp_cpp_area
*area
);
363 struct resource
*(*area_resource
)(struct nfp_cpp_area
*area
);
364 phys_addr_t (*area_phys
)(struct nfp_cpp_area
*area
);
365 void __iomem
*(*area_iomem
)(struct nfp_cpp_area
*area
);
366 int (*area_read
)(struct nfp_cpp_area
*area
, void *kernel_vaddr
,
367 unsigned long offset
, unsigned int length
);
368 int (*area_write
)(struct nfp_cpp_area
*area
, const void *kernel_vaddr
,
369 unsigned long offset
, unsigned int length
);
371 size_t explicit_priv_size
;
372 int (*explicit_acquire
)(struct nfp_cpp_explicit
*expl
);
373 void (*explicit_release
)(struct nfp_cpp_explicit
*expl
);
374 int (*explicit_put
)(struct nfp_cpp_explicit
*expl
,
375 const void *buff
, size_t len
);
376 int (*explicit_get
)(struct nfp_cpp_explicit
*expl
,
377 void *buff
, size_t len
);
378 int (*explicit_do
)(struct nfp_cpp_explicit
*expl
,
379 const struct nfp_cpp_explicit_command
*cmd
,
384 nfp_cpp_from_operations(const struct nfp_cpp_operations
*ops
,
385 struct device
*parent
, void *priv
);
386 void *nfp_cpp_priv(struct nfp_cpp
*priv
);
388 int nfp_cpp_area_cache_add(struct nfp_cpp
*cpp
, size_t size
);
390 /* The following section contains extensions to the
391 * NFP CPP API, to be used in a Linux kernel-space context.
394 /* Use this channel ID for multiple virtual channel interfaces
395 * (ie ARM and PCIe) when setting up the interface field.
397 #define NFP_CPP_INTERFACE_CHANNEL_PEROPENER 255
398 struct device
*nfp_cpp_device(struct nfp_cpp
*cpp
);
400 /* Return code masks for nfp_cpp_explicit_do()
402 #define NFP_SIGNAL_MASK_A BIT(0) /* Signal A fired */
403 #define NFP_SIGNAL_MASK_B BIT(1) /* Signal B fired */
405 enum nfp_cpp_explicit_signal_mode
{
408 NFP_SIGNAL_PUSH_OPTIONAL
= -1,
410 NFP_SIGNAL_PULL_OPTIONAL
= -2,
413 struct nfp_cpp_explicit
*nfp_cpp_explicit_acquire(struct nfp_cpp
*cpp
);
414 int nfp_cpp_explicit_set_target(struct nfp_cpp_explicit
*expl
, u32 cpp_id
,
416 int nfp_cpp_explicit_set_data(struct nfp_cpp_explicit
*expl
,
417 u8 data_master
, u16 data_ref
);
418 int nfp_cpp_explicit_set_signal(struct nfp_cpp_explicit
*expl
,
419 u8 signal_master
, u8 signal_ref
);
420 int nfp_cpp_explicit_set_posted(struct nfp_cpp_explicit
*expl
, int posted
,
422 enum nfp_cpp_explicit_signal_mode siga_mode
,
424 enum nfp_cpp_explicit_signal_mode sigb_mode
);
425 int nfp_cpp_explicit_put(struct nfp_cpp_explicit
*expl
,
426 const void *buff
, size_t len
);
427 int nfp_cpp_explicit_do(struct nfp_cpp_explicit
*expl
, u64 address
);
428 int nfp_cpp_explicit_get(struct nfp_cpp_explicit
*expl
, void *buff
, size_t len
);
429 void nfp_cpp_explicit_release(struct nfp_cpp_explicit
*expl
);
430 struct nfp_cpp
*nfp_cpp_explicit_cpp(struct nfp_cpp_explicit
*expl
);
431 void *nfp_cpp_explicit_priv(struct nfp_cpp_explicit
*cpp_explicit
);
433 /* Implemented in nfp_cpplib.c */
435 int nfp_cpp_model_autodetect(struct nfp_cpp
*cpp
, u32
*model
);
437 int nfp_cpp_explicit_read(struct nfp_cpp
*cpp
, u32 cpp_id
,
438 u64 addr
, void *buff
, size_t len
,
441 int nfp_cpp_explicit_write(struct nfp_cpp
*cpp
, u32 cpp_id
,
442 u64 addr
, const void *buff
, size_t len
,
445 #endif /* !__NFP_CPP_H__ */