| 667 | } |
| 668 | |
| 669 | rt_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) |
nothing calls this directly
no test coverage detected