net/cnxk: support CPT CTX write through microcode op
[dpdk.git] / drivers / net / virtio / virtio.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2010-2014 Intel Corporation
3  * Copyright(c) 2020 Red Hat, Inc.
4  */
5
6 #include <unistd.h>
7
8 #include "virtio.h"
9 #include "virtio_logs.h"
10
11 uint64_t
12 virtio_negotiate_features(struct virtio_hw *hw, uint64_t host_features)
13 {
14         uint64_t features;
15
16         /*
17          * Limit negotiated features to what the driver, virtqueue, and
18          * host all support.
19          */
20         features = host_features & hw->guest_features;
21         VIRTIO_OPS(hw)->set_features(hw, features);
22
23         return features;
24 }
25
26
27 void
28 virtio_read_dev_config(struct virtio_hw *hw, size_t offset,
29                       void *dst, int length)
30 {
31         VIRTIO_OPS(hw)->read_dev_cfg(hw, offset, dst, length);
32 }
33
34 void
35 virtio_write_dev_config(struct virtio_hw *hw, size_t offset,
36                        const void *src, int length)
37 {
38         VIRTIO_OPS(hw)->write_dev_cfg(hw, offset, src, length);
39 }
40
41 void
42 virtio_reset(struct virtio_hw *hw)
43 {
44         uint32_t retry = 0;
45
46         VIRTIO_OPS(hw)->set_status(hw, VIRTIO_CONFIG_STATUS_RESET);
47         /* Flush status write and wait device ready max 3 seconds. */
48         while (VIRTIO_OPS(hw)->get_status(hw) != VIRTIO_CONFIG_STATUS_RESET) {
49                 if (retry++ > 3000) {
50                         PMD_INIT_LOG(WARNING, "port %u device reset timeout", hw->port_id);
51                         break;
52                 }
53                 usleep(1000L);
54         }
55 }
56
57 void
58 virtio_reinit_complete(struct virtio_hw *hw)
59 {
60         virtio_set_status(hw, VIRTIO_CONFIG_STATUS_DRIVER_OK);
61 }
62
63 void
64 virtio_set_status(struct virtio_hw *hw, uint8_t status)
65 {
66         if (status != VIRTIO_CONFIG_STATUS_RESET)
67                 status |= VIRTIO_OPS(hw)->get_status(hw);
68
69         VIRTIO_OPS(hw)->set_status(hw, status);
70 }
71
72 uint8_t
73 virtio_get_status(struct virtio_hw *hw)
74 {
75         return VIRTIO_OPS(hw)->get_status(hw);
76 }
77
78 uint8_t
79 virtio_get_isr(struct virtio_hw *hw)
80 {
81         return VIRTIO_OPS(hw)->get_isr(hw);
82 }