MCPcopy Create free account
hub / github.com/RT-Thread/rt-thread / rt_virtio_console_init

Function rt_virtio_console_init

components/drivers/virtio/virtio_console.c:669–777  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

667}
668
669rt_err_t rt_virtio_console_init(rt_ubase_t *mmio_base, rt_uint32_t irq)
670{
671 int i;
672 rt_size_t queues_num;
673 static int dev_no = 0;
674 char dev_name[RT_NAME_MAX];
675 struct virtio_device *virtio_dev;
676 struct virtio_console_device *virtio_console_dev;
677
678 RT_ASSERT(RT_USING_VIRTIO_CONSOLE_PORT_MAX_NR > 0);
679
680 virtio_console_dev = rt_malloc(sizeof(struct virtio_console_device));
681
682 if (virtio_console_dev == RT_NULL)
683 {
684 goto _alloc_fail;
685 }
686
687 virtio_dev = &virtio_console_dev->virtio_dev;
688 virtio_dev->irq = irq;
689 virtio_dev->mmio_base = mmio_base;
690
691 virtio_console_dev->config = (struct virtio_console_config *)virtio_dev->mmio_config->config;
692
693#ifdef RT_USING_SMP
694 rt_spin_lock_init(&virtio_dev->spinlock);
695#endif
696
697 virtio_reset_device(virtio_dev);
698 virtio_status_acknowledge_driver(virtio_dev);
699
700 virtio_dev->mmio_config->driver_features = virtio_dev->mmio_config->device_features & ~(
701 (1 << VIRTIO_F_RING_EVENT_IDX) |
702 (1 << VIRTIO_F_RING_INDIRECT_DESC));
703
704 virtio_status_driver_ok(virtio_dev);
705
706 if (!virtio_has_feature(virtio_dev, VIRTIO_CONSOLE_F_MULTIPORT))
707 {
708 virtio_console_dev->max_port_nr = 1;
709 queues_num = 2;
710 }
711 else
712 {
713 if (virtio_console_dev->config->max_nr_ports > RT_USING_VIRTIO_CONSOLE_PORT_MAX_NR)
714 {
715 virtio_console_dev->max_port_nr = RT_USING_VIRTIO_CONSOLE_PORT_MAX_NR;
716 virtio_console_dev->config->max_nr_ports = virtio_console_dev->max_port_nr;
717 }
718 else
719 {
720 virtio_console_dev->max_port_nr = virtio_console_dev->config->max_nr_ports;
721 }
722
723 queues_num = VIRTIO_CONSOLE_PORT_QUEUE_INDEX(virtio_console_dev->max_port_nr, VIRTIO_CONSOLE_QUEUE_DATA_RX);
724 }
725
726 if (virtio_queues_alloc(virtio_dev, queues_num) != RT_EOK)

Callers

nothing calls this directly

Calls 15

rt_mallocFunction · 0.85
virtio_reset_deviceFunction · 0.85
virtio_status_driver_okFunction · 0.85
virtio_has_featureFunction · 0.85
virtio_queues_allocFunction · 0.85
virtio_queue_initFunction · 0.85
virtio_queue_destroyFunction · 0.85
rt_list_initFunction · 0.85
rt_snprintfFunction · 0.85
rt_device_registerFunction · 0.85
virtio_queues_freeFunction · 0.85

Tested by

no test coverage detected