// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) /* Copyright (C) 2015-2018 Netronome Systems, Inc. */ /* * nfp_nffw.c * Authors: Jakub Kicinski <[email protected]> * Jason McMullan <[email protected]> * Francois H. Theron <[email protected]> */ #include <linux/kernel.h> #include <linux/slab.h> #include "nfp.h" #include "nfp_cpp.h" #include "nfp_nffw.h" #include "nfp6000/nfp6000.h" /* Init-CSR owner IDs for firmware map to firmware IDs which start at 4. * Lower IDs are reserved for target and loader IDs. */ #define NFFW_FWID_EXT … #define NFFW_FWID_BASE … #define NFFW_FWID_ALL … /* * NFFW_INFO_VERSION history: * 0: This was never actually used (before versioning), but it refers to * the previous struct which had FWINFO_CNT = MEINFO_CNT = 120 that later * changed to 200. * 1: First versioned struct, with * FWINFO_CNT = 120 * MEINFO_CNT = 120 * 2: FWINFO_CNT = 200 * MEINFO_CNT = 200 */ #define NFFW_INFO_VERSION_CURRENT … /* Enough for all current chip families */ #define NFFW_MEINFO_CNT_V1 … #define NFFW_FWINFO_CNT_V1 … #define NFFW_MEINFO_CNT_V2 … #define NFFW_FWINFO_CNT_V2 … /* Work in 32-bit words to make cross-platform endianness easier to handle */ /** nfp.nffw meinfo **/ struct nffw_meinfo { … }; struct nffw_fwinfo { … }; struct nfp_nffw_info_v1 { … }; struct nfp_nffw_info_v2 { … }; /** Resource: nfp.nffw main **/ struct nfp_nffw_info_data { … }; struct nfp_nffw_info { … }; /* flg_info_version = flags[0]<27:16> * This is a small version counter intended only to detect if the current * implementation can read the current struct. Struct changes should be very * rare and as such a 12-bit counter should cover large spans of time. By the * time it wraps around, we don't expect to have 4096 versions of this struct * to be in use at the same time. */ static u32 nffw_res_info_version_get(const struct nfp_nffw_info_data *res) { … } /* flg_init = flags[0]<0> */ static u32 nffw_res_flg_init_get(const struct nfp_nffw_info_data *res) { … } /* loaded = loaded__mu_da__mip_off_hi<31:31> */ static u32 nffw_fwinfo_loaded_get(const struct nffw_fwinfo *fi) { … } /* mip_cppid = mip_cppid */ static u32 nffw_fwinfo_mip_cppid_get(const struct nffw_fwinfo *fi) { … } /* loaded = loaded__mu_da__mip_off_hi<8:8> */ static u32 nffw_fwinfo_mip_mu_da_get(const struct nffw_fwinfo *fi) { … } /* mip_offset = (loaded__mu_da__mip_off_hi<7:0> << 8) | mip_offset_lo */ static u64 nffw_fwinfo_mip_offset_get(const struct nffw_fwinfo *fi) { … } static unsigned int nffw_res_fwinfos(struct nfp_nffw_info_data *fwinf, struct nffw_fwinfo **arr) { … } /** * nfp_nffw_info_open() - Acquire the lock on the NFFW table * @cpp: NFP CPP handle * * Return: pointer to nfp_nffw_info object or ERR_PTR() */ struct nfp_nffw_info *nfp_nffw_info_open(struct nfp_cpp *cpp) { … } /** * nfp_nffw_info_close() - Release the lock on the NFFW table and free state * @state: NFP FW info state */ void nfp_nffw_info_close(struct nfp_nffw_info *state) { … } /** * nfp_nffw_info_fwid_first() - Return the first firmware ID in the NFFW * @state: NFP FW info state * * Return: First NFFW firmware info, NULL on failure */ static struct nffw_fwinfo *nfp_nffw_info_fwid_first(struct nfp_nffw_info *state) { … } /** * nfp_nffw_info_mip_first() - Retrieve the location of the first FW's MIP * @state: NFP FW info state * @cpp_id: Pointer to the CPP ID of the MIP * @off: Pointer to the CPP Address of the MIP * * Return: 0, or -ERRNO */ int nfp_nffw_info_mip_first(struct nfp_nffw_info *state, u32 *cpp_id, u64 *off) { … }