virtio_console.h 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /*
  2. * Copyright (c) 2006-2023, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2021-11-11 GuEe-GUI the first version
  9. */
  10. #ifndef __VIRTIO_CONSOLE_H__
  11. #define __VIRTIO_CONSOLE_H__
  12. #include <rtdef.h>
  13. #include <virtio.h>
  14. #ifndef RT_USING_VIRTIO_CONSOLE_PORT_MAX_NR
  15. #define RT_USING_VIRTIO_CONSOLE_PORT_MAX_NR 4
  16. #endif
  17. #define VIRTIO_CONSOLE_QUEUE_DATA_RX 0
  18. #define VIRTIO_CONSOLE_QUEUE_DATA_TX 1
  19. #define VIRTIO_CONSOLE_QUEUE_CTRL_RX 2
  20. #define VIRTIO_CONSOLE_QUEUE_CTRL_TX 3
  21. #define VIRTIO_CONSOLE_QUEUE_SIZE 64
  22. /* Every port has data rx & tx, and port0 has ctrl rx & tx in multiport */
  23. #define VIRTIO_CONSOLE_PORT_QUEUE_INDEX(id, queue) ((id) * 2 + (!!(id)) * 2 + (queue))
  24. #define VIRTIO_CONSOLE_PORT_BAD_ID (~(rt_uint32_t)0)
  25. #define VIRTIO_CONSOLE_F_SIZE 0 /* Does host provide console size? */
  26. #define VIRTIO_CONSOLE_F_MULTIPORT 1 /* Does host provide multiple ports? */
  27. #define VIRTIO_CONSOLE_F_EMERG_WRITE 2 /* Does host support emergency write? */
  28. struct virtio_console_config
  29. {
  30. rt_uint16_t cols;
  31. rt_uint16_t rows;
  32. rt_uint32_t max_nr_ports;
  33. rt_uint32_t emerg_wr;
  34. } __attribute__((packed));
  35. struct virtio_console_control
  36. {
  37. rt_uint32_t id; /* Port number */
  38. rt_uint16_t event; /* The kind of control event */
  39. rt_uint16_t value; /* Extra information for the event */
  40. };
  41. enum virtio_console_control_event
  42. {
  43. VIRTIO_CONSOLE_DEVICE_READY = 0,
  44. VIRTIO_CONSOLE_PORT_ADD,
  45. VIRTIO_CONSOLE_PORT_REMOVE,
  46. VIRTIO_CONSOLE_PORT_READY,
  47. VIRTIO_CONSOLE_CONSOLE_PORT,
  48. VIRTIO_CONSOLE_RESIZE,
  49. VIRTIO_CONSOLE_PORT_OPEN,
  50. VIRTIO_CONSOLE_PORT_NAME,
  51. };
  52. struct virtio_console_resize
  53. {
  54. rt_uint16_t cols;
  55. rt_uint16_t rows;
  56. };
  57. struct virtio_console_device
  58. {
  59. struct rt_device parent;
  60. struct virtio_device virtio_dev;
  61. rt_uint32_t console_id;
  62. rt_size_t port_nr;
  63. rt_size_t max_port_nr;
  64. rt_list_t port_head;
  65. struct virtio_console_config *config;
  66. struct
  67. {
  68. rt_ubase_t tx_ctrl_paddr;
  69. struct virtio_console_control rx_ctrl, tx_ctrl;
  70. } info[VIRTIO_CONSOLE_QUEUE_SIZE];
  71. };
  72. rt_err_t rt_virtio_console_init(rt_ubase_t *mmio_base, rt_uint32_t irq);
  73. enum
  74. {
  75. VIRTIO_DEVICE_CTRL_CONSOLE_PORT_CREATE = 0x20,
  76. VIRTIO_DEVICE_CTRL_CONSOLE_PORT_DESTROY,
  77. };
  78. #endif /* __VIRTIO_CONSOLE_H__ */