| 437 | } |
| 438 | |
| 439 | static rt_err_t virtio_console_init(rt_device_t dev) |
| 440 | { |
| 441 | struct virtio_console_device *virtio_console_dev = (struct virtio_console_device *)dev; |
| 442 | struct virtio_device *virtio_dev = &virtio_console_dev->virtio_dev; |
| 443 | |
| 444 | if (virtio_has_feature(virtio_dev, VIRTIO_CONSOLE_F_MULTIPORT)) |
| 445 | { |
| 446 | rt_uint16_t id; |
| 447 | rt_uint16_t idx[VIRTIO_CONSOLE_QUEUE_SIZE]; |
| 448 | struct virtq *queue_ctrl_rx, *queue_ctrl_tx; |
| 449 | |
| 450 | queue_ctrl_rx = &virtio_dev->queues[VIRTIO_CONSOLE_QUEUE_CTRL_RX]; |
| 451 | queue_ctrl_tx = &virtio_dev->queues[VIRTIO_CONSOLE_QUEUE_CTRL_TX]; |
| 452 | |
| 453 | virtio_alloc_desc_chain(virtio_dev, VIRTIO_CONSOLE_QUEUE_CTRL_RX, queue_ctrl_rx->num, idx); |
| 454 | virtio_alloc_desc_chain(virtio_dev, VIRTIO_CONSOLE_QUEUE_CTRL_TX, queue_ctrl_tx->num, idx); |
| 455 | |
| 456 | for (id = 0; id < queue_ctrl_rx->num; ++id) |
| 457 | { |
| 458 | void *addr = &virtio_console_dev->info[id].rx_ctrl; |
| 459 | |
| 460 | virtio_fill_desc(virtio_dev, VIRTIO_CONSOLE_QUEUE_CTRL_RX, id, |
| 461 | VIRTIO_VA2PA(addr), sizeof(struct virtio_console_control), VIRTQ_DESC_F_WRITE, 0); |
| 462 | |
| 463 | queue_ctrl_rx->avail->ring[id] = id; |
| 464 | } |
| 465 | rt_hw_dsb(); |
| 466 | |
| 467 | for (id = 0; id < queue_ctrl_tx->num; ++id) |
| 468 | { |
| 469 | virtio_console_dev->info[id].tx_ctrl_paddr = VIRTIO_VA2PA(&virtio_console_dev->info[id].tx_ctrl); |
| 470 | } |
| 471 | |
| 472 | queue_ctrl_rx->avail->flags = 0; |
| 473 | queue_ctrl_rx->avail->idx = queue_ctrl_rx->num; |
| 474 | |
| 475 | queue_ctrl_rx->used_idx = queue_ctrl_rx->used->idx; |
| 476 | |
| 477 | queue_ctrl_tx->avail->flags = VIRTQ_AVAIL_F_NO_INTERRUPT; |
| 478 | queue_ctrl_tx->avail->idx = 0; |
| 479 | |
| 480 | virtio_queue_notify(virtio_dev, VIRTIO_CONSOLE_QUEUE_CTRL_RX); |
| 481 | } |
| 482 | |
| 483 | return virtio_console_port_create(virtio_console_dev); |
| 484 | } |
| 485 | |
| 486 | static rt_err_t virtio_console_control(rt_device_t dev, int cmd, void *args) |
| 487 | { |
nothing calls this directly
no test coverage detected