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