// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) /* Copyright (C) 2015-2018 Netronome Systems, Inc. */ /* * nfp_cpplib.c * Library of functions to access the NFP's CPP bus * Authors: Jakub Kicinski <[email protected]> * Jason McMullan <[email protected]> * Rolf Neugebauer <[email protected]> */ #include <asm/unaligned.h> #include <linux/bitfield.h> #include <linux/delay.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/slab.h> #include <linux/sched.h> #include "nfp_cpp.h" #include "nfp6000/nfp6000.h" #include "nfp6000/nfp_xpb.h" /* NFP6000 PL */ #define NFP_PL_DEVICE_PART_NFP6000 … #define NFP_PL_DEVICE_ID … #define NFP_PL_DEVICE_ID_MASK … #define NFP_PL_DEVICE_PART_MASK … #define NFP_PL_DEVICE_MODEL_MASK … /** * nfp_cpp_readl() - Read a u32 word from a CPP location * @cpp: CPP device handle * @cpp_id: CPP ID for operation * @address: Address for operation * @value: Pointer to read buffer * * Return: 0 on success, or -ERRNO */ int nfp_cpp_readl(struct nfp_cpp *cpp, u32 cpp_id, unsigned long long address, u32 *value) { … } /** * nfp_cpp_writel() - Write a u32 word to a CPP location * @cpp: CPP device handle * @cpp_id: CPP ID for operation * @address: Address for operation * @value: Value to write * * Return: 0 on success, or -ERRNO */ int nfp_cpp_writel(struct nfp_cpp *cpp, u32 cpp_id, unsigned long long address, u32 value) { … } /** * nfp_cpp_readq() - Read a u64 word from a CPP location * @cpp: CPP device handle * @cpp_id: CPP ID for operation * @address: Address for operation * @value: Pointer to read buffer * * Return: 0 on success, or -ERRNO */ int nfp_cpp_readq(struct nfp_cpp *cpp, u32 cpp_id, unsigned long long address, u64 *value) { … } /** * nfp_cpp_writeq() - Write a u64 word to a CPP location * @cpp: CPP device handle * @cpp_id: CPP ID for operation * @address: Address for operation * @value: Value to write * * Return: 0 on success, or -ERRNO */ int nfp_cpp_writeq(struct nfp_cpp *cpp, u32 cpp_id, unsigned long long address, u64 value) { … } /* NOTE: This code should not use nfp_xpb_* functions, * as those are model-specific */ int nfp_cpp_model_autodetect(struct nfp_cpp *cpp, u32 *model) { … } static u8 nfp_bytemask(int width, u64 addr) { … } int nfp_cpp_explicit_read(struct nfp_cpp *cpp, u32 cpp_id, u64 addr, void *buff, size_t len, int width_read) { … } int nfp_cpp_explicit_write(struct nfp_cpp *cpp, u32 cpp_id, u64 addr, const void *buff, size_t len, int width_write) { … } /** * nfp_cpp_map_area() - Helper function to map an area * @cpp: NFP CPP handler * @name: Name for the area * @cpp_id: CPP ID for operation * @addr: CPP address * @size: Size of the area * @area: Area handle (output) * * Map an area of IOMEM access. To undo the effect of this function call * @nfp_cpp_area_release_free(*area). * * Return: Pointer to memory mapped area or ERR_PTR */ u8 __iomem * nfp_cpp_map_area(struct nfp_cpp *cpp, const char *name, u32 cpp_id, u64 addr, unsigned long size, struct nfp_cpp_area **area) { … }