summaryrefslogtreecommitdiff
path: root/components/legacy/virtio/virtio_console.h
blob: 542a187e7c8eb44b98de47dc145082c0ab978667 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/*
 * Copyright (c) 2006-2023, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2021-11-11     GuEe-GUI     the first version
 */

#ifndef __VIRTIO_CONSOLE_H__
#define __VIRTIO_CONSOLE_H__

#include <rtdef.h>

#include <virtio.h>

#ifndef RT_USING_VIRTIO_CONSOLE_PORT_MAX_NR
#define RT_USING_VIRTIO_CONSOLE_PORT_MAX_NR 4
#endif

#define VIRTIO_CONSOLE_QUEUE_DATA_RX    0
#define VIRTIO_CONSOLE_QUEUE_DATA_TX    1
#define VIRTIO_CONSOLE_QUEUE_CTRL_RX    2
#define VIRTIO_CONSOLE_QUEUE_CTRL_TX    3
#define VIRTIO_CONSOLE_QUEUE_SIZE       64

/* Every port has data rx & tx, and port0 has ctrl rx & tx in multiport */
#define VIRTIO_CONSOLE_PORT_QUEUE_INDEX(id, queue)  ((id) * 2 + (!!(id)) * 2 + (queue))

#define VIRTIO_CONSOLE_PORT_BAD_ID      (~(rt_uint32_t)0)

#define VIRTIO_CONSOLE_F_SIZE           0   /* Does host provide console size? */
#define VIRTIO_CONSOLE_F_MULTIPORT      1   /* Does host provide multiple ports? */
#define VIRTIO_CONSOLE_F_EMERG_WRITE    2   /* Does host support emergency write? */

struct virtio_console_config
{
    rt_uint16_t cols;
    rt_uint16_t rows;
    rt_uint32_t max_nr_ports;
    rt_uint32_t emerg_wr;
} __attribute__((packed));

struct virtio_console_control
{
    rt_uint32_t id;     /* Port number */
    rt_uint16_t event;  /* The kind of control event */
    rt_uint16_t value;  /* Extra information for the event */
};

enum virtio_console_control_event
{
    VIRTIO_CONSOLE_DEVICE_READY = 0,
    VIRTIO_CONSOLE_PORT_ADD,
    VIRTIO_CONSOLE_PORT_REMOVE,
    VIRTIO_CONSOLE_PORT_READY,
    VIRTIO_CONSOLE_CONSOLE_PORT,
    VIRTIO_CONSOLE_RESIZE,
    VIRTIO_CONSOLE_PORT_OPEN,
    VIRTIO_CONSOLE_PORT_NAME,
};

struct virtio_console_resize
{
    rt_uint16_t cols;
    rt_uint16_t rows;
};

struct virtio_console_device
{
    struct rt_device parent;

    struct virtio_device virtio_dev;

    rt_uint32_t console_id;
    rt_size_t port_nr;
    rt_size_t max_port_nr;
    rt_list_t port_head;
    struct virtio_console_config *config;

    struct
    {
        rt_ubase_t tx_ctrl_paddr;
        struct virtio_console_control rx_ctrl, tx_ctrl;
    } info[VIRTIO_CONSOLE_QUEUE_SIZE];
};

rt_err_t rt_virtio_console_init(rt_ubase_t *mmio_base, rt_uint32_t irq);

enum
{
    VIRTIO_DEVICE_CTRL_CONSOLE_PORT_CREATE  = 0x20,
    VIRTIO_DEVICE_CTRL_CONSOLE_PORT_DESTROY,
};

#endif /* __VIRTIO_CONSOLE_H__ */