Quellcode durchsuchen

[components/drivers/virtio] Fixup align in riscv support.

GuEe_GUI vor 3 Jahren
Ursprung
Commit
53a2e2333c

+ 1 - 0
bsp/qemu-virt64-aarch64/.config

@@ -194,6 +194,7 @@ CONFIG_RT_USING_RTC=y
 # CONFIG_RT_USING_WIFI is not set
 # CONFIG_RT_USING_WIFI is not set
 CONFIG_RT_USING_VIRTIO=y
 CONFIG_RT_USING_VIRTIO=y
 CONFIG_RT_USING_VIRTIO10=y
 CONFIG_RT_USING_VIRTIO10=y
+CONFIG_RT_USING_VIRTIO_MMIO_ALIGN=y
 CONFIG_RT_USING_VIRTIO_BLK=y
 CONFIG_RT_USING_VIRTIO_BLK=y
 CONFIG_RT_USING_VIRTIO_NET=y
 CONFIG_RT_USING_VIRTIO_NET=y
 CONFIG_RT_USING_VIRTIO_CONSOLE=y
 CONFIG_RT_USING_VIRTIO_CONSOLE=y

+ 1 - 5
bsp/qemu-virt64-aarch64/rtconfig.h

@@ -8,8 +8,6 @@
 
 
 #define RT_NAME_MAX 16
 #define RT_NAME_MAX 16
 #define RT_USING_SMART
 #define RT_USING_SMART
-#define RT_USING_SMP
-#define RT_CPUS_NR 4
 #define RT_ALIGN_SIZE 4
 #define RT_ALIGN_SIZE 4
 #define RT_THREAD_PRIORITY_32
 #define RT_THREAD_PRIORITY_32
 #define RT_THREAD_PRIORITY_MAX 32
 #define RT_THREAD_PRIORITY_MAX 32
@@ -19,7 +17,6 @@
 #define RT_USING_IDLE_HOOK
 #define RT_USING_IDLE_HOOK
 #define RT_IDLE_HOOK_LIST_SIZE 4
 #define RT_IDLE_HOOK_LIST_SIZE 4
 #define IDLE_THREAD_STACK_SIZE 8192
 #define IDLE_THREAD_STACK_SIZE 8192
-#define SYSTEM_THREAD_STACK_SIZE 8192
 #define RT_USING_TIMER_SOFT
 #define RT_USING_TIMER_SOFT
 #define RT_TIMER_THREAD_PRIO 4
 #define RT_TIMER_THREAD_PRIO 4
 #define RT_TIMER_THREAD_STACK_SIZE 8192
 #define RT_TIMER_THREAD_STACK_SIZE 8192
@@ -122,11 +119,10 @@
 #define RT_SERIAL_RB_BUFSZ 256
 #define RT_SERIAL_RB_BUFSZ 256
 #define RT_USING_TTY
 #define RT_USING_TTY
 #define RT_USING_PIN
 #define RT_USING_PIN
-#define RT_USING_FDT
-#define RT_USING_FDTLIB
 #define RT_USING_RTC
 #define RT_USING_RTC
 #define RT_USING_VIRTIO
 #define RT_USING_VIRTIO
 #define RT_USING_VIRTIO10
 #define RT_USING_VIRTIO10
+#define RT_USING_VIRTIO_MMIO_ALIGN
 #define RT_USING_VIRTIO_BLK
 #define RT_USING_VIRTIO_BLK
 #define RT_USING_VIRTIO_NET
 #define RT_USING_VIRTIO_NET
 #define RT_USING_VIRTIO_CONSOLE
 #define RT_USING_VIRTIO_CONSOLE

+ 4 - 0
components/drivers/Kconfig

@@ -679,6 +679,10 @@ menuconfig RT_USING_VIRTIO
                 bool "VirtIO v1.0"
                 bool "VirtIO v1.0"
         endchoice
         endchoice
 
 
+        config RT_USING_VIRTIO_MMIO_ALIGN
+            bool "Using VirtIO MMIO alignment"
+            default y
+
         config RT_USING_VIRTIO_BLK
         config RT_USING_VIRTIO_BLK
             bool "Using VirtIO BLK"
             bool "Using VirtIO BLK"
             default y
             default y

+ 11 - 9
components/drivers/virtio/virtio_blk.c

@@ -17,9 +17,11 @@
 
 
 #include <virtio_blk.h>
 #include <virtio_blk.h>
 
 
-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_uint16_t idx[3];
+    rt_size_t size = count * VIRTIO_BLK_BUF_DATA_SIZE;
     struct virtio_device *virtio_dev = &virtio_blk_dev->virtio_dev;
     struct virtio_device *virtio_dev = &virtio_blk_dev->virtio_dev;
 
 
 #ifdef RT_USING_SMP
 #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]].valid = RT_TRUE;
     virtio_blk_dev->info[idx[0]].req.type = flags;
     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.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;
     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_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_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_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);
             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
 #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)
 static rt_err_t virtio_blk_control(rt_device_t dev, int cmd, void *args)

+ 43 - 15
components/drivers/virtio/virtio_console.c

@@ -75,8 +75,26 @@ static void virtio_console_send_ctrl(struct virtio_console_device *virtio_consol
 #endif
 #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;
     rt_uint32_t port_id;
     char dev_name[RT_NAME_MAX];
     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.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.rx_indicate = RT_NULL;
     port_dev->parent.tx_complete = 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;
     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)
 static rt_err_t virtio_console_init(rt_device_t dev)
 {
 {
     struct virtio_console_device *virtio_console_dev = (struct virtio_console_device *)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);
         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)
 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)
     switch (cmd)
     {
     {
     case VIRTIO_DEVICE_CTRL_CONSOLE_PORT_CREATE:
     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;
         break;
     default:
     default:
         status = -RT_EINVAL;
         status = -RT_EINVAL;
@@ -484,6 +501,7 @@ static rt_err_t virtio_console_control(rt_device_t dev, int cmd, void *args)
     return status;
     return status;
 }
 }
 
 
+#ifdef RT_USING_DEVICE_OPS
 const static struct rt_device_ops virtio_console_ops =
 const static struct rt_device_ops virtio_console_ops =
 {
 {
     virtio_console_init,
     virtio_console_init,
@@ -493,6 +511,7 @@ const static struct rt_device_ops virtio_console_ops =
     RT_NULL,
     RT_NULL,
     virtio_console_control
     virtio_console_control
 };
 };
+#endif
 
 
 static void virtio_console_isr(int irqno, void *param)
 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;
     virtio_console_dev->parent.type = RT_Device_Class_Char;
+#ifdef RT_USING_DEVICE_OPS
     virtio_console_dev->parent.ops  = &virtio_console_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.rx_indicate = RT_NULL;
     virtio_console_dev->parent.tx_complete = RT_NULL;
     virtio_console_dev->parent.tx_complete = RT_NULL;

+ 10 - 0
components/drivers/virtio/virtio_mmio.h

@@ -52,6 +52,16 @@ struct virtio_mmio_config
     rt_uint32_t res8[21];               /* [0xa8] */
     rt_uint32_t res8[21];               /* [0xa8] */
     rt_uint32_t config_generation;      /* [0xfc]<RO> Configuration atomicity value */
     rt_uint32_t config_generation;      /* [0xfc]<RO> Configuration atomicity value */
     rt_uint32_t config[];               /* [0x100+]<RO> Configuration space */
     rt_uint32_t config[];               /* [0x100+]<RO> 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));
 } __attribute__((packed));
+#else
+};
+#endif
 
 
 #endif /* __VIRTIO_MMIO_H__ */
 #endif /* __VIRTIO_MMIO_H__ */

+ 1 - 1
components/drivers/virtio/virtio_queue.h

@@ -78,7 +78,7 @@ struct virtq
     struct virtq_used *used;
     struct virtq_used *used;
 
 
     /* Helper of driver */
     /* Helper of driver */
-    rt_uint32_t used_idx;
+    rt_uint16_t used_idx;
     rt_bool_t *free;
     rt_bool_t *free;
     rt_size_t free_count;
     rt_size_t free_count;
 };
 };