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