1 /* SPDX-License-Identifier: BSD-3-Clause
3 * Copyright(c) 2020-2021 Xilinx, Inc.
11 #if EFSYS_OPT_RIVERHEAD
12 static const efx_virtio_ops_t __efx_virtio_rhead_ops = {
13 rhead_virtio_qstart, /* evo_virtio_qstart */
14 rhead_virtio_qstop, /* evo_virtio_qstop */
15 rhead_virtio_get_doorbell_offset, /* evo_get_doorbell_offset */
17 #endif /* EFSYS_OPT_RIVERHEAD */
19 __checkReturn efx_rc_t
23 const efx_virtio_ops_t *evop;
26 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
27 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
28 EFSYS_ASSERT(!(enp->en_mod_flags & EFX_MOD_VIRTIO));
30 switch (enp->en_family) {
31 #if EFSYS_OPT_RIVERHEAD
32 case EFX_FAMILY_RIVERHEAD:
33 evop = &__efx_virtio_rhead_ops;
35 #endif /* EFSYS_OPT_RIVERHEAD */
44 enp->en_mod_flags |= EFX_MOD_VIRTIO;
49 EFSYS_PROBE1(fail1, efx_rc_t, rc);
52 enp->en_mod_flags &= ~EFX_MOD_VIRTIO;
61 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
62 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_PROBE);
63 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_VIRTIO);
66 enp->en_mod_flags &= ~EFX_MOD_VIRTIO;
69 __checkReturn efx_rc_t
72 __deref_out efx_virtio_vq_t **evvpp)
74 const efx_virtio_ops_t *evop = enp->en_evop;
75 efx_virtio_vq_t *evvp;
78 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
79 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_VIRTIO);
81 /* Allocate a virtqueue object */
82 EFSYS_KMEM_ALLOC(enp->en_esip, sizeof (efx_virtio_vq_t), evvp);
88 evvp->evv_magic = EFX_VQ_MAGIC;
90 evvp->evv_state = EFX_VIRTIO_VQ_STATE_INITIALIZED;
97 EFSYS_PROBE1(fail1, efx_rc_t, rc);
102 __checkReturn efx_rc_t
104 __in efx_virtio_vq_t *evvp,
105 __in efx_virtio_vq_cfg_t *evvcp,
106 __in_opt efx_virtio_vq_dyncfg_t *evvdp)
108 const efx_virtio_ops_t *evop;
111 if ((evvcp == NULL) || (evvp == NULL)) {
116 if (evvp->evv_state != EFX_VIRTIO_VQ_STATE_INITIALIZED) {
121 evop = evvp->evv_enp->en_evop;
127 if ((rc = evop->evo_virtio_qstart(evvp, evvcp, evvdp)) != 0)
130 evvp->evv_type = evvcp->evvc_type;
131 evvp->evv_target_vf = evvcp->evvc_target_vf;
132 evvp->evv_state = EFX_VIRTIO_VQ_STATE_STARTED;
143 EFSYS_PROBE1(fail1, efx_rc_t, rc);
148 __checkReturn efx_rc_t
150 __in efx_virtio_vq_t *evvp,
151 __out_opt efx_virtio_vq_dyncfg_t *evvdp)
154 const efx_virtio_ops_t *evop;
165 EFSYS_ASSERT3U(evvp->evv_magic, ==, EFX_VQ_MAGIC);
166 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
167 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_VIRTIO);
174 if (evvp->evv_state != EFX_VIRTIO_VQ_STATE_STARTED) {
179 if ((rc = evop->evo_virtio_qstop(evvp, evvdp)) != 0)
182 evvp->evv_state = EFX_VIRTIO_VQ_STATE_INITIALIZED;
193 EFSYS_PROBE1(fail1, efx_rc_t, rc);
200 __in efx_virtio_vq_t *evvp)
209 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
211 if (evvp->evv_state == EFX_VIRTIO_VQ_STATE_INITIALIZED) {
212 /* Free the virtqueue object */
213 EFSYS_KMEM_FREE(enp->en_esip, sizeof (efx_virtio_vq_t), evvp);
217 __checkReturn efx_rc_t
218 efx_virtio_get_doorbell_offset(
219 __in efx_virtio_vq_t *evvp,
220 __out uint32_t *offsetp)
223 const efx_virtio_ops_t *evop;
226 if ((evvp == NULL) || (offsetp == NULL)) {
234 EFSYS_ASSERT3U(enp->en_magic, ==, EFX_NIC_MAGIC);
235 EFSYS_ASSERT3U(enp->en_mod_flags, &, EFX_MOD_VIRTIO);
242 if ((rc = evop->evo_get_doorbell_offset(evvp, offsetp)) != 0)
252 EFSYS_PROBE1(fail1, efx_rc_t, rc);
257 #endif /* EFSYS_OPT_VIRTIO */