xref: /dpdk/drivers/net/sfc/sfc_mcdi.c (revision 3037e6cf3ddec72a4091b5f023301152a0640900)
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