144c0947bSAndrew Rybchenko /* SPDX-License-Identifier: BSD-3-Clause
2244cfa79SAndrew Rybchenko *
398d26ef7SAndrew Rybchenko * Copyright(c) 2019-2021 Xilinx, Inc.
4a0147be5SAndrew Rybchenko * Copyright(c) 2016-2019 Solarflare Communications Inc.
5ba641f20SAndrew Rybchenko *
6ba641f20SAndrew Rybchenko * This software was jointly developed between OKTET Labs (under contract
7ba641f20SAndrew Rybchenko * for Solarflare) and Solarflare Communications, Inc.
8ba641f20SAndrew Rybchenko */
9ba641f20SAndrew Rybchenko
103caa85daSAndrew Rybchenko #include "sfc_efx_mcdi.h"
11ba641f20SAndrew Rybchenko
12ba641f20SAndrew Rybchenko #include "sfc.h"
131b0236e2SAndrew Rybchenko #include "sfc_debug.h"
14ba641f20SAndrew Rybchenko #include "sfc_log.h"
154650ed44SIvan Malov #include "sfc_ev.h"
16ba641f20SAndrew Rybchenko
17710ac30eSAndrew Rybchenko static sfc_efx_mcdi_dma_alloc_cb sfc_mcdi_dma_alloc;
18710ac30eSAndrew Rybchenko static int
sfc_mcdi_dma_alloc(void * cookie,const char * name,size_t len,efsys_mem_t * esmp)19710ac30eSAndrew Rybchenko sfc_mcdi_dma_alloc(void *cookie, const char *name, size_t len,
20710ac30eSAndrew Rybchenko efsys_mem_t *esmp)
21710ac30eSAndrew Rybchenko {
22*3037e6cfSViacheslav Galaktionov struct sfc_adapter *sa = cookie;
23710ac30eSAndrew Rybchenko
24*3037e6cfSViacheslav Galaktionov return sfc_dma_alloc(sa, name, 0, EFX_NIC_DMA_ADDR_MCDI_BUF, len,
25*3037e6cfSViacheslav Galaktionov sa->socket_id, esmp);
26710ac30eSAndrew Rybchenko }
27710ac30eSAndrew Rybchenko
28710ac30eSAndrew Rybchenko static sfc_efx_mcdi_dma_free_cb sfc_mcdi_dma_free;
29710ac30eSAndrew Rybchenko static void
sfc_mcdi_dma_free(void * cookie,efsys_mem_t * esmp)30710ac30eSAndrew Rybchenko sfc_mcdi_dma_free(void *cookie, efsys_mem_t *esmp)
31710ac30eSAndrew Rybchenko {
32710ac30eSAndrew Rybchenko const struct sfc_adapter *sa = cookie;
33710ac30eSAndrew Rybchenko
34710ac30eSAndrew Rybchenko sfc_dma_free(sa, esmp);
35710ac30eSAndrew Rybchenko }
36710ac30eSAndrew Rybchenko
37fc96cecfSAndrew Rybchenko static sfc_efx_mcdi_sched_restart_cb sfc_mcdi_sched_restart;
38fc96cecfSAndrew Rybchenko static void
sfc_mcdi_sched_restart(void * cookie)39fc96cecfSAndrew Rybchenko sfc_mcdi_sched_restart(void *cookie)
40fc96cecfSAndrew Rybchenko {
41fc96cecfSAndrew Rybchenko struct sfc_adapter *sa = cookie;
42fc96cecfSAndrew Rybchenko
43fc96cecfSAndrew Rybchenko sfc_schedule_restart(sa);
44fc96cecfSAndrew Rybchenko }
45fc96cecfSAndrew Rybchenko
466ad77561SAndrew Rybchenko static sfc_efx_mcdi_mgmt_evq_poll_cb sfc_mcdi_mgmt_evq_poll;
476ad77561SAndrew Rybchenko static void
sfc_mcdi_mgmt_evq_poll(void * cookie)486ad77561SAndrew Rybchenko sfc_mcdi_mgmt_evq_poll(void *cookie)
496ad77561SAndrew Rybchenko {
506ad77561SAndrew Rybchenko struct sfc_adapter *sa = cookie;
516ad77561SAndrew Rybchenko
526ad77561SAndrew Rybchenko sfc_ev_mgmt_qpoll(sa);
536ad77561SAndrew Rybchenko }
546ad77561SAndrew Rybchenko
55710ac30eSAndrew Rybchenko static const struct sfc_efx_mcdi_ops sfc_mcdi_ops = {
56710ac30eSAndrew Rybchenko .dma_alloc = sfc_mcdi_dma_alloc,
57710ac30eSAndrew Rybchenko .dma_free = sfc_mcdi_dma_free,
58fc96cecfSAndrew Rybchenko .sched_restart = sfc_mcdi_sched_restart,
596ad77561SAndrew Rybchenko .mgmt_evq_poll = sfc_mcdi_mgmt_evq_poll,
60710ac30eSAndrew Rybchenko };
61710ac30eSAndrew Rybchenko
62109acc9dSAndrew Rybchenko int
sfc_mcdi_init(struct sfc_adapter * sa)63109acc9dSAndrew Rybchenko sfc_mcdi_init(struct sfc_adapter *sa)
64109acc9dSAndrew Rybchenko {
65671eb37cSAndrew Rybchenko uint32_t logtype;
66671eb37cSAndrew Rybchenko
67671eb37cSAndrew Rybchenko sfc_log_init(sa, "entry");
68671eb37cSAndrew Rybchenko
69671eb37cSAndrew Rybchenko logtype = sfc_register_logtype(&sa->priv.shared->pci_addr,
70671eb37cSAndrew Rybchenko SFC_LOGTYPE_MCDI_STR,
71671eb37cSAndrew Rybchenko RTE_LOG_NOTICE);
72671eb37cSAndrew Rybchenko
73bbd3f0f1SAndrew Rybchenko return sfc_efx_mcdi_init(&sa->mcdi, logtype,
74710ac30eSAndrew Rybchenko sa->priv.shared->log_prefix, sa->nic,
75710ac30eSAndrew Rybchenko &sfc_mcdi_ops, sa);
76109acc9dSAndrew Rybchenko }
77109acc9dSAndrew Rybchenko
78109acc9dSAndrew Rybchenko void
sfc_mcdi_fini(struct sfc_adapter * sa)79109acc9dSAndrew Rybchenko sfc_mcdi_fini(struct sfc_adapter *sa)
80109acc9dSAndrew Rybchenko {
81671eb37cSAndrew Rybchenko sfc_log_init(sa, "entry");
82710ac30eSAndrew Rybchenko sfc_efx_mcdi_fini(&sa->mcdi);
83109acc9dSAndrew Rybchenko }
84