diff --git a/bsp/qemu-virt64-aarch64/.config b/bsp/qemu-virt64-aarch64/.config index 758084b49147935290b1d354ebfae9c30e10d63d..4621240c93e7922111f04b65f724e0987ad5a592 100644 --- a/bsp/qemu-virt64-aarch64/.config +++ b/bsp/qemu-virt64-aarch64/.config @@ -194,6 +194,7 @@ CONFIG_RT_USING_RTC=y # CONFIG_RT_USING_WIFI is not set CONFIG_RT_USING_VIRTIO=y CONFIG_RT_USING_VIRTIO10=y +CONFIG_RT_USING_VIRTIO_MMIO_ALIGN=y CONFIG_RT_USING_VIRTIO_BLK=y CONFIG_RT_USING_VIRTIO_NET=y CONFIG_RT_USING_VIRTIO_CONSOLE=y diff --git a/bsp/qemu-virt64-aarch64/rtconfig.h b/bsp/qemu-virt64-aarch64/rtconfig.h index 376a55344518d7911684b1131a9c7753ed844bec..576e8577a7cc62ac0f982c35dbe314349efcfaa1 100644 --- a/bsp/qemu-virt64-aarch64/rtconfig.h +++ b/bsp/qemu-virt64-aarch64/rtconfig.h @@ -8,8 +8,6 @@ #define RT_NAME_MAX 16 #define RT_USING_SMART -#define RT_USING_SMP -#define RT_CPUS_NR 4 #define RT_ALIGN_SIZE 4 #define RT_THREAD_PRIORITY_32 #define RT_THREAD_PRIORITY_MAX 32 @@ -19,7 +17,6 @@ #define RT_USING_IDLE_HOOK #define RT_IDLE_HOOK_LIST_SIZE 4 #define IDLE_THREAD_STACK_SIZE 8192 -#define SYSTEM_THREAD_STACK_SIZE 8192 #define RT_USING_TIMER_SOFT #define RT_TIMER_THREAD_PRIO 4 #define RT_TIMER_THREAD_STACK_SIZE 8192 @@ -122,11 +119,10 @@ #define RT_SERIAL_RB_BUFSZ 256 #define RT_USING_TTY #define RT_USING_PIN -#define RT_USING_FDT -#define RT_USING_FDTLIB #define RT_USING_RTC #define RT_USING_VIRTIO #define RT_USING_VIRTIO10 +#define RT_USING_VIRTIO_MMIO_ALIGN #define RT_USING_VIRTIO_BLK #define RT_USING_VIRTIO_NET #define RT_USING_VIRTIO_CONSOLE diff --git a/components/drivers/Kconfig b/components/drivers/Kconfig index 156dfa7ee1bfbbbdb067357670d1cb9a231acdda..d8af4291344e07b924e5f5c019b24dac7e1c54bc 100644 --- a/components/drivers/Kconfig +++ b/components/drivers/Kconfig @@ -679,6 +679,10 @@ menuconfig RT_USING_VIRTIO bool "VirtIO v1.0" endchoice + config RT_USING_VIRTIO_MMIO_ALIGN + bool "Using VirtIO MMIO alignment" + default y + config RT_USING_VIRTIO_BLK bool "Using VirtIO BLK" default y diff --git a/components/drivers/virtio/virtio_blk.c b/components/drivers/virtio/virtio_blk.c index 680374b45f072e2c52c2da2285294ac7a498dbb7..9629f3cac505fd2d16745bf96dd401a2f0ea5cfe 100644 --- a/components/drivers/virtio/virtio_blk.c +++ b/components/drivers/virtio/virtio_blk.c @@ -17,9 +17,11 @@ #include -static void virtio_blk_rw(struct virtio_blk_device *virtio_blk_dev, rt_off_t pos, void *buffer, int flags) +static void virtio_blk_rw(struct virtio_blk_device *virtio_blk_dev, rt_off_t pos, void *buffer, rt_size_t count, + int flags) { rt_uint16_t idx[3]; + rt_size_t size = count * VIRTIO_BLK_BUF_DATA_SIZE; struct virtio_device *virtio_dev = &virtio_blk_dev->virtio_dev; #ifdef RT_USING_SMP @@ -43,7 +45,7 @@ static void virtio_blk_rw(struct virtio_blk_device *virtio_blk_dev, rt_off_t pos virtio_blk_dev->info[idx[0]].valid = RT_TRUE; virtio_blk_dev->info[idx[0]].req.type = flags; virtio_blk_dev->info[idx[0]].req.ioprio = 0; - virtio_blk_dev->info[idx[0]].req.sector = pos * (VIRTIO_BLK_BUF_DATA_SIZE / 512); + virtio_blk_dev->info[idx[0]].req.sector = pos * count; flags = flags == VIRTIO_BLK_T_OUT ? 0 : VIRTQ_DESC_F_WRITE; @@ -51,7 +53,7 @@ static void virtio_blk_rw(struct virtio_blk_device *virtio_blk_dev, rt_off_t pos VIRTIO_VA2PA(&virtio_blk_dev->info[idx[0]].req), sizeof(struct virtio_blk_req), VIRTQ_DESC_F_NEXT, idx[1]); virtio_fill_desc(virtio_dev, VIRTIO_BLK_QUEUE, idx[1], - VIRTIO_VA2PA(buffer), VIRTIO_BLK_BUF_DATA_SIZE, flags | VIRTQ_DESC_F_NEXT, idx[2]); + VIRTIO_VA2PA(buffer), size, flags | VIRTQ_DESC_F_NEXT, idx[2]); virtio_fill_desc(virtio_dev, VIRTIO_BLK_QUEUE, idx[2], VIRTIO_VA2PA(&virtio_blk_dev->info[idx[0]].status), sizeof(rt_uint8_t), VIRTQ_DESC_F_WRITE, 0); @@ -80,18 +82,18 @@ static void virtio_blk_rw(struct virtio_blk_device *virtio_blk_dev, rt_off_t pos #endif } -static rt_size_t virtio_blk_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size) +static rt_size_t virtio_blk_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t count) { - virtio_blk_rw((struct virtio_blk_device *)dev, pos, buffer, VIRTIO_BLK_T_IN); + virtio_blk_rw((struct virtio_blk_device *)dev, pos, buffer, count, VIRTIO_BLK_T_IN); - return size; + return count; } -static rt_size_t virtio_blk_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size) +static rt_size_t virtio_blk_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t count) { - virtio_blk_rw((struct virtio_blk_device *)dev, pos, (void *)buffer, VIRTIO_BLK_T_OUT); + virtio_blk_rw((struct virtio_blk_device *)dev, pos, (void *)buffer, count, VIRTIO_BLK_T_OUT); - return size; + return count; } static rt_err_t virtio_blk_control(rt_device_t dev, int cmd, void *args) diff --git a/components/drivers/virtio/virtio_console.c b/components/drivers/virtio/virtio_console.c index 269ffb5d1b5a2368e34798f618d6e550fd02efd8..7f1a9b8af55767aef96bd499215bad4aaf11bb8d 100644 --- a/components/drivers/virtio/virtio_console.c +++ b/components/drivers/virtio/virtio_console.c @@ -75,8 +75,26 @@ static void virtio_console_send_ctrl(struct virtio_console_device *virtio_consol #endif } -static rt_err_t virtio_console_port_create(struct virtio_console_device *virtio_console_dev, - const struct rt_device_ops *ops) +static rt_err_t virtio_console_port_init(rt_device_t dev); +static rt_err_t virtio_console_port_open(rt_device_t dev, rt_uint16_t oflag); +static rt_err_t virtio_console_port_close(rt_device_t dev); +static rt_size_t virtio_console_port_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size); +static rt_size_t virtio_console_port_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size); +static rt_err_t virtio_console_port_control(rt_device_t dev, int cmd, void *args); + +#ifdef RT_USING_DEVICE_OPS +const static struct rt_device_ops virtio_console_port_ops = +{ + virtio_console_port_init, + virtio_console_port_open, + virtio_console_port_close, + virtio_console_port_read, + virtio_console_port_write, + virtio_console_port_control +}; +#endif + +static rt_err_t virtio_console_port_create(struct virtio_console_device *virtio_console_dev) { rt_uint32_t port_id; char dev_name[RT_NAME_MAX]; @@ -114,7 +132,16 @@ static rt_err_t virtio_console_port_create(struct virtio_console_device *virtio_ } port_dev->parent.type = RT_Device_Class_Char; - port_dev->parent.ops = ops; +#ifdef RT_USING_DEVICE_OPS + port_dev->parent.ops = &virtio_console_port_ops; +#else + port_dev->parent.init = virtio_console_port_init; + port_dev->parent.open = virtio_console_port_open; + port_dev->parent.close = virtio_console_port_close; + port_dev->parent.read = virtio_console_port_read; + port_dev->parent.write = virtio_console_port_write; + port_dev->parent.control = virtio_console_port_control; +#endif port_dev->parent.rx_indicate = RT_NULL; port_dev->parent.tx_complete = RT_NULL; @@ -409,16 +436,6 @@ static rt_err_t virtio_console_port_control(rt_device_t dev, int cmd, void *args return status; } -const static struct rt_device_ops virtio_console_port_ops = -{ - virtio_console_port_init, - virtio_console_port_open, - virtio_console_port_close, - virtio_console_port_read, - virtio_console_port_write, - virtio_console_port_control -}; - static rt_err_t virtio_console_init(rt_device_t dev) { struct virtio_console_device *virtio_console_dev = (struct virtio_console_device *)dev; @@ -463,7 +480,7 @@ static rt_err_t virtio_console_init(rt_device_t dev) virtio_queue_notify(virtio_dev, VIRTIO_CONSOLE_QUEUE_CTRL_RX); } - return virtio_console_port_create(virtio_console_dev, &virtio_console_port_ops); + return virtio_console_port_create(virtio_console_dev); } static rt_err_t virtio_console_control(rt_device_t dev, int cmd, void *args) @@ -474,7 +491,7 @@ static rt_err_t virtio_console_control(rt_device_t dev, int cmd, void *args) switch (cmd) { case VIRTIO_DEVICE_CTRL_CONSOLE_PORT_CREATE: - status = virtio_console_port_create(virtio_console_dev, &virtio_console_port_ops); + status = virtio_console_port_create(virtio_console_dev); break; default: status = -RT_EINVAL; @@ -484,6 +501,7 @@ static rt_err_t virtio_console_control(rt_device_t dev, int cmd, void *args) return status; } +#ifdef RT_USING_DEVICE_OPS const static struct rt_device_ops virtio_console_ops = { virtio_console_init, @@ -493,6 +511,7 @@ const static struct rt_device_ops virtio_console_ops = RT_NULL, virtio_console_control }; +#endif static void virtio_console_isr(int irqno, void *param) { @@ -722,7 +741,16 @@ rt_err_t rt_virtio_console_init(rt_ubase_t *mmio_base, rt_uint32_t irq) } virtio_console_dev->parent.type = RT_Device_Class_Char; +#ifdef RT_USING_DEVICE_OPS virtio_console_dev->parent.ops = &virtio_console_ops; +#else + virtio_console_dev->parent.init = virtio_console_init; + virtio_console_dev->parent.open = RT_NULL; + virtio_console_dev->parent.close = RT_NULL; + virtio_console_dev->parent.read = RT_NULL; + virtio_console_dev->parent.write = RT_NULL; + virtio_console_dev->parent.control = virtio_console_control; +#endif virtio_console_dev->parent.rx_indicate = RT_NULL; virtio_console_dev->parent.tx_complete = RT_NULL; diff --git a/components/drivers/virtio/virtio_mmio.h b/components/drivers/virtio/virtio_mmio.h index 4082aa668211ec3a0064a9c56e36b899d4cff98e..98b92e460c96d23b2bb36e5c1586633bb9c17e3b 100644 --- a/components/drivers/virtio/virtio_mmio.h +++ b/components/drivers/virtio/virtio_mmio.h @@ -52,6 +52,16 @@ struct virtio_mmio_config rt_uint32_t res8[21]; /* [0xa8] */ rt_uint32_t config_generation; /* [0xfc] Configuration atomicity value */ rt_uint32_t config[]; /* [0x100+] Configuration space */ + +/* + * According to the compiler's optimization ways, we should force compiler not + * to optimization here, but it will cause some compilers generate memory access + * instructions fail. So we allow user to choose a toggle of optimize here. + */ +#ifdef RT_USING_VIRTIO_MMIO_ALIGN } __attribute__((packed)); +#else +}; +#endif #endif /* __VIRTIO_MMIO_H__ */ diff --git a/components/drivers/virtio/virtio_queue.h b/components/drivers/virtio/virtio_queue.h index af133b4a53f00a9255dad03e8498eb092cc846c3..1e416af1318cd8c1e8f7e9ea62621ebf6e1c75b3 100644 --- a/components/drivers/virtio/virtio_queue.h +++ b/components/drivers/virtio/virtio_queue.h @@ -78,7 +78,7 @@ struct virtq struct virtq_used *used; /* Helper of driver */ - rt_uint32_t used_idx; + rt_uint16_t used_idx; rt_bool_t *free; rt_size_t free_count; };