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