1 /*
2  * Copyright (c) 2006-2023, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2021-9-16      GuEe-GUI     the first version
9  * 2021-11-11     GuEe-GUI     modify to virtio common interface
10  */
11 
12 #ifndef __VIRTIO_H__
13 #define __VIRTIO_H__
14 
15 #include <rthw.h>
16 #include <rtdef.h>
17 
18 #ifdef RT_USING_SMART
19 #include <mmu.h>
20 #include <ioremap.h>
21 #endif
22 
23 #if RT_NAME_MAX < 16
24 #error "Please set RT_NAME_MAX to at lest 16"
25 #endif
26 
27 #ifdef RT_USING_VIRTIO10
28 #define RT_USING_VIRTIO_VERSION 0x1
29 #endif
30 
31 #include <virtio_mmio.h>
32 #include <virtio_queue.h>
33 
34 #define VIRTIO_MAGIC_VALUE          0x74726976 /* "virt" */
35 
36 #define VIRTIO_STATUS_ACKNOWLEDGE   (1 << 0)
37 #define VIRTIO_STATUS_DRIVER        (1 << 1)
38 #define VIRTIO_STATUS_DRIVER_OK     (1 << 2)
39 #define VIRTIO_STATUS_FEATURES_OK   (1 << 3)
40 #define VIRTIO_STATUS_NEEDS_RESET   (1 << 6)
41 #define VIRTIO_STATUS_FAILED        (1 << 7)
42 
43 #define VIRTIO_F_NOTIFY_ON_EMPTY    24
44 #define VIRTIO_F_ANY_LAYOUT         27
45 #define VIRTIO_F_RING_INDIRECT_DESC 28
46 #define VIRTIO_F_RING_EVENT_IDX     29
47 #define VIRTIO_F_VERSION_1          32
48 #define VIRTIO_F_RING_PACKED        34
49 
50 #ifdef RT_USING_SMART
51 #define VIRTIO_VA2PA(vaddr)         ((rt_ubase_t)rt_kmem_v2p(vaddr))
52 #define VIRTIO_PA2VA(paddr)         ((rt_ubase_t)rt_ioremap((void *)paddr, ARCH_PAGE_SIZE))
53 #else
54 #define VIRTIO_VA2PA(vaddr)         ((rt_ubase_t)vaddr)
55 #define VIRTIO_PA2VA(paddr)         ((rt_ubase_t)paddr)
56 #endif /* RT_USING_SMART */
57 #define VIRTIO_PAGE_SHIFT           12
58 #define VIRTIO_PAGE_SIZE            (1 << VIRTIO_PAGE_SHIFT)
59 #define VIRTIO_PAGE_ALIGN(addr)     (RT_ALIGN(addr, VIRTIO_PAGE_SIZE))
60 
61 enum
62 {
63     /* virtio 1.0 */
64     VIRTIO_DEVICE_ID_INVALID        = 0,    /* Invalid device */
65     VIRTIO_DEVICE_ID_NET            = 1,    /* Net */
66     VIRTIO_DEVICE_ID_BLOCK          = 2,    /* Block */
67     VIRTIO_DEVICE_ID_CONSOLE        = 3,    /* Console */
68     VIRTIO_DEVICE_ID_RNG            = 4,    /* Rng */
69     VIRTIO_DEVICE_ID_BALLOON        = 5,    /* Balloon */
70     VIRTIO_DEVICE_ID_IOMEM          = 6,    /* IO memory */
71     VIRTIO_DEVICE_ID_RPMSG          = 7,    /* Remote processor messaging */
72     VIRTIO_DEVICE_ID_SCSI           = 8,    /* SCSI */
73     VIRTIO_DEVICE_ID_9P             = 9,    /* 9p console */
74     VIRTIO_DEVICE_ID_MAC80211_WLAN  = 10,   /* Mac80211 wlan */
75     VIRTIO_DEVICE_ID_RPROC_SERIAL   = 11,   /* Remoteproc serial link */
76     VIRTIO_DEVICE_ID_CAIF           = 12,   /* CAIF */
77     VIRTIO_DEVICE_ID_MEM_BALLOON    = 13,   /* Memory balloon */
78     VIRTIO_DEVICE_ID_GPU            = 16,   /* GPU */
79     VIRTIO_DEVICE_ID_TIME           = 17,   /* Timer/clock device */
80     VIRTIO_DEVICE_ID_INPUT          = 18,   /* Input */
81     /* virtio 1.1 */
82     VIRTIO_DEVICE_ID_SOCKET         = 19,   /* Socket device */
83     VIRTIO_DEVICE_ID_CRYPTO         = 20,   /* Crypto device */
84     VIRTIO_DEVICE_ID_SIG_DIS_MOD    = 21,   /* Signal Distribution Module */
85     VIRTIO_DEVICE_ID_PSTORE         = 22,   /* Pstore device */
86     VIRTIO_DEVICE_ID_IOMMU          = 23,   /* IOMMU device */
87     VIRTIO_DEVICE_ID_MEM            = 24,   /* Memory device */
88     /* virtio 1.2 */
89     VIRTIO_DEVICE_ID_AUDIO          = 25,   /* Audio device */
90     VIRTIO_DEVICE_ID_FS             = 26,   /* File system device */
91     VIRTIO_DEVICE_ID_PMEM           = 27,   /* PMEM device */
92     VIRTIO_DEVICE_ID_RPMB           = 28,   /* RPMB device */
93     VIRTIO_DEVICE_ID_MAC80211_HWSIM = 29,   /* Mac80211 hwsim wireless simulation device */
94     VIRTIO_DEVICE_ID_VIDEO_ENCODER  = 30,   /* Video encoder device */
95     VIRTIO_DEVICE_ID_VIDEO_DECODER  = 31,   /* Video decoder device */
96     VIRTIO_DEVICE_ID_SCMI           = 32,   /* SCMI device */
97     VIRTIO_DEVICE_ID_NITRO_SEC_MOD  = 33,   /* NitroSecureModule */
98     VIRTIO_DEVICE_ID_I2C_ADAPTER    = 34,   /* I2C adapter */
99     VIRTIO_DEVICE_ID_WATCHDOG       = 35,   /* Watchdog */
100     VIRTIO_DEVICE_ID_CAN            = 36,   /* CAN device */
101     VIRTIO_DEVICE_ID_DMABUF         = 37,   /* Virtio dmabuf */
102     VIRTIO_DEVICE_ID_PARAM_SERV     = 38,   /* Parameter Server */
103     VIRTIO_DEVICE_ID_AUDIO_POLICY   = 39,   /* Audio policy device */
104     VIRTIO_DEVICE_ID_BT             = 40,   /* Bluetooth device */
105     VIRTIO_DEVICE_ID_GPIO           = 41,   /* GPIO device */
106     VIRTIO_DEVICE_ID_RDMA           = 42,   /* RDMA device */
107 
108     VIRTIO_DEVICE_TYPE_SIZE
109 };
110 
111 struct virtio_device
112 {
113     rt_uint32_t irq;
114 
115     struct virtq *queues;
116     rt_size_t queues_num;
117 
118     union
119     {
120         rt_ubase_t *mmio_base;
121         struct virtio_mmio_config *mmio_config;
122     };
123 
124 #ifdef RT_USING_SMP
125     struct rt_spinlock spinlock;
126 #endif
127 
128     void *priv;
129 };
130 
131 typedef rt_err_t (*virtio_device_init_handler)(rt_ubase_t *mmio_base, rt_uint32_t irq);
132 
133 void virtio_reset_device(struct virtio_device *dev);
134 void virtio_status_acknowledge_driver(struct virtio_device *dev);
135 void virtio_status_driver_ok(struct virtio_device *dev);
136 void virtio_interrupt_ack(struct virtio_device *dev);
137 rt_bool_t virtio_has_feature(struct virtio_device *dev, rt_uint32_t feature_bit);
138 
139 rt_err_t virtio_queues_alloc(struct virtio_device *dev, rt_size_t queues_num);
140 void virtio_queues_free(struct virtio_device *dev);
141 rt_err_t virtio_queue_init(struct virtio_device *dev, rt_uint32_t queue_index, rt_size_t ring_size);
142 void virtio_queue_destroy(struct virtio_device *dev, rt_uint32_t queue_index);
143 void virtio_queue_notify(struct virtio_device *dev, rt_uint32_t queue_index);
144 
145 void virtio_submit_chain(struct virtio_device *dev, rt_uint32_t queue_index, rt_uint16_t desc_index);
146 
147 rt_uint16_t virtio_alloc_desc(struct virtio_device *dev, rt_uint32_t queue_index);
148 void virtio_free_desc(struct virtio_device *dev, rt_uint32_t queue_index, rt_uint16_t desc_index);
149 rt_err_t virtio_alloc_desc_chain(struct virtio_device *dev, rt_uint32_t queue_index, rt_size_t count,
150         rt_uint16_t *indexs);
151 void virtio_free_desc_chain(struct virtio_device *dev, rt_uint32_t queue_index, rt_uint16_t desc_index);
152 void virtio_fill_desc(struct virtio_device *dev, rt_uint32_t queue_index, rt_uint16_t desc_index,
153         rt_uint64_t addr, rt_uint32_t len, rt_uint16_t flags, rt_uint16_t next);
154 
155 #endif /* __VIRTIO_H__ */
156