13caa85daSAndrew Rybchenko /* SPDX-License-Identifier: BSD-3-Clause 23caa85daSAndrew Rybchenko * 3672386c1SAndrew Rybchenko * Copyright(c) 2019-2021 Xilinx, Inc. 43caa85daSAndrew Rybchenko * Copyright(c) 2016-2019 Solarflare Communications Inc. 53caa85daSAndrew Rybchenko * 63caa85daSAndrew Rybchenko * This software was jointly developed between OKTET Labs (under contract 73caa85daSAndrew Rybchenko * for Solarflare) and Solarflare Communications, Inc. 83caa85daSAndrew Rybchenko */ 93caa85daSAndrew Rybchenko 103caa85daSAndrew Rybchenko #ifndef _SFC_EFX_MCDI_H 113caa85daSAndrew Rybchenko #define _SFC_EFX_MCDI_H 123caa85daSAndrew Rybchenko 133caa85daSAndrew Rybchenko #include <stdint.h> 143caa85daSAndrew Rybchenko 15*1094dd94SDavid Marchand #include <rte_compat.h> 163caa85daSAndrew Rybchenko #include <rte_spinlock.h> 173caa85daSAndrew Rybchenko 183caa85daSAndrew Rybchenko #include "efsys.h" 193caa85daSAndrew Rybchenko #include "efx.h" 203caa85daSAndrew Rybchenko 213caa85daSAndrew Rybchenko 223caa85daSAndrew Rybchenko #ifdef __cplusplus 233caa85daSAndrew Rybchenko extern "C" { 243caa85daSAndrew Rybchenko #endif 253caa85daSAndrew Rybchenko 263caa85daSAndrew Rybchenko enum sfc_efx_mcdi_state { 273caa85daSAndrew Rybchenko SFC_EFX_MCDI_UNINITIALIZED = 0, 283caa85daSAndrew Rybchenko SFC_EFX_MCDI_INITIALIZED, 293caa85daSAndrew Rybchenko SFC_EFX_MCDI_BUSY, 303caa85daSAndrew Rybchenko SFC_EFX_MCDI_COMPLETED, 313caa85daSAndrew Rybchenko SFC_EFX_MCDI_DEAD, 323caa85daSAndrew Rybchenko 333caa85daSAndrew Rybchenko SFC_EFX_MCDI_NSTATES 343caa85daSAndrew Rybchenko }; 353caa85daSAndrew Rybchenko 363caa85daSAndrew Rybchenko typedef int (sfc_efx_mcdi_dma_alloc_cb)(void *cookie, const char *name, 373caa85daSAndrew Rybchenko size_t len, efsys_mem_t *esmp); 383caa85daSAndrew Rybchenko 393caa85daSAndrew Rybchenko typedef void (sfc_efx_mcdi_dma_free_cb)(void *cookie, efsys_mem_t *esmp); 403caa85daSAndrew Rybchenko 413caa85daSAndrew Rybchenko typedef void (sfc_efx_mcdi_sched_restart_cb)(void *cookie); 423caa85daSAndrew Rybchenko 433caa85daSAndrew Rybchenko typedef void (sfc_efx_mcdi_mgmt_evq_poll_cb)(void *cookie); 443caa85daSAndrew Rybchenko 453caa85daSAndrew Rybchenko struct sfc_efx_mcdi_ops { 463caa85daSAndrew Rybchenko sfc_efx_mcdi_dma_alloc_cb *dma_alloc; 473caa85daSAndrew Rybchenko sfc_efx_mcdi_dma_free_cb *dma_free; 483caa85daSAndrew Rybchenko sfc_efx_mcdi_sched_restart_cb *sched_restart; 493caa85daSAndrew Rybchenko sfc_efx_mcdi_mgmt_evq_poll_cb *mgmt_evq_poll; 503caa85daSAndrew Rybchenko }; 513caa85daSAndrew Rybchenko 523caa85daSAndrew Rybchenko struct sfc_efx_mcdi { 533caa85daSAndrew Rybchenko rte_spinlock_t lock; 543caa85daSAndrew Rybchenko const struct sfc_efx_mcdi_ops *ops; 553caa85daSAndrew Rybchenko void *ops_cookie; 563caa85daSAndrew Rybchenko efx_nic_t *nic; 573caa85daSAndrew Rybchenko efsys_mem_t mem; 583caa85daSAndrew Rybchenko enum sfc_efx_mcdi_state state; 593caa85daSAndrew Rybchenko efx_mcdi_transport_t transport; 603caa85daSAndrew Rybchenko uint32_t logtype; 613caa85daSAndrew Rybchenko uint32_t proxy_handle; 623caa85daSAndrew Rybchenko efx_rc_t proxy_result; 633caa85daSAndrew Rybchenko const char *log_prefix; 643caa85daSAndrew Rybchenko }; 653caa85daSAndrew Rybchenko 663caa85daSAndrew Rybchenko __rte_internal 673caa85daSAndrew Rybchenko int sfc_efx_mcdi_init(struct sfc_efx_mcdi *mcdi, 683caa85daSAndrew Rybchenko uint32_t logtype, const char *log_prefix, 693caa85daSAndrew Rybchenko efx_nic_t *nic, 703caa85daSAndrew Rybchenko const struct sfc_efx_mcdi_ops *ops, void *ops_cookie); 713caa85daSAndrew Rybchenko __rte_internal 723caa85daSAndrew Rybchenko void sfc_efx_mcdi_fini(struct sfc_efx_mcdi *mcdi); 733caa85daSAndrew Rybchenko 743caa85daSAndrew Rybchenko #ifdef __cplusplus 753caa85daSAndrew Rybchenko } 763caa85daSAndrew Rybchenko #endif 773caa85daSAndrew Rybchenko 783caa85daSAndrew Rybchenko #endif /* _SFC_EFX_MCDI_H */ 79