vhost_user.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /* Vhost-user protocol */
  3. #ifndef __VHOST_USER_H__
  4. #define __VHOST_USER_H__
  5. /* Message flags */
  6. #define VHOST_USER_FLAG_REPLY BIT(2)
  7. #define VHOST_USER_FLAG_NEED_REPLY BIT(3)
  8. /* Feature bits */
  9. #define VHOST_USER_F_PROTOCOL_FEATURES 30
  10. /* Protocol feature bits */
  11. #define VHOST_USER_PROTOCOL_F_MQ 0
  12. #define VHOST_USER_PROTOCOL_F_REPLY_ACK 3
  13. #define VHOST_USER_PROTOCOL_F_SLAVE_REQ 5
  14. #define VHOST_USER_PROTOCOL_F_CONFIG 9
  15. #define VHOST_USER_PROTOCOL_F_INBAND_NOTIFICATIONS 14
  16. /* Vring state index masks */
  17. #define VHOST_USER_VRING_INDEX_MASK 0xff
  18. #define VHOST_USER_VRING_POLL_MASK BIT(8)
  19. /* Supported version */
  20. #define VHOST_USER_VERSION 1
  21. /* Supported transport features */
  22. #define VHOST_USER_SUPPORTED_F BIT_ULL(VHOST_USER_F_PROTOCOL_FEATURES)
  23. /* Supported protocol features */
  24. #define VHOST_USER_SUPPORTED_PROTOCOL_F (BIT_ULL(VHOST_USER_PROTOCOL_F_MQ) | \
  25. BIT_ULL(VHOST_USER_PROTOCOL_F_REPLY_ACK) | \
  26. BIT_ULL(VHOST_USER_PROTOCOL_F_SLAVE_REQ) | \
  27. BIT_ULL(VHOST_USER_PROTOCOL_F_CONFIG) | \
  28. BIT_ULL(VHOST_USER_PROTOCOL_F_INBAND_NOTIFICATIONS))
  29. enum vhost_user_request {
  30. VHOST_USER_GET_FEATURES = 1,
  31. VHOST_USER_SET_FEATURES = 2,
  32. VHOST_USER_SET_OWNER = 3,
  33. VHOST_USER_RESET_OWNER = 4,
  34. VHOST_USER_SET_MEM_TABLE = 5,
  35. VHOST_USER_SET_LOG_BASE = 6,
  36. VHOST_USER_SET_LOG_FD = 7,
  37. VHOST_USER_SET_VRING_NUM = 8,
  38. VHOST_USER_SET_VRING_ADDR = 9,
  39. VHOST_USER_SET_VRING_BASE = 10,
  40. VHOST_USER_GET_VRING_BASE = 11,
  41. VHOST_USER_SET_VRING_KICK = 12,
  42. VHOST_USER_SET_VRING_CALL = 13,
  43. VHOST_USER_SET_VRING_ERR = 14,
  44. VHOST_USER_GET_PROTOCOL_FEATURES = 15,
  45. VHOST_USER_SET_PROTOCOL_FEATURES = 16,
  46. VHOST_USER_GET_QUEUE_NUM = 17,
  47. VHOST_USER_SET_VRING_ENABLE = 18,
  48. VHOST_USER_SEND_RARP = 19,
  49. VHOST_USER_NET_SEND_MTU = 20,
  50. VHOST_USER_SET_SLAVE_REQ_FD = 21,
  51. VHOST_USER_IOTLB_MSG = 22,
  52. VHOST_USER_SET_VRING_ENDIAN = 23,
  53. VHOST_USER_GET_CONFIG = 24,
  54. VHOST_USER_SET_CONFIG = 25,
  55. VHOST_USER_VRING_KICK = 35,
  56. };
  57. enum vhost_user_slave_request {
  58. VHOST_USER_SLAVE_IOTLB_MSG = 1,
  59. VHOST_USER_SLAVE_CONFIG_CHANGE_MSG = 2,
  60. VHOST_USER_SLAVE_VRING_HOST_NOTIFIER_MSG = 3,
  61. VHOST_USER_SLAVE_VRING_CALL = 4,
  62. };
  63. struct vhost_user_header {
  64. /*
  65. * Use enum vhost_user_request for outgoing messages,
  66. * uses enum vhost_user_slave_request for incoming ones.
  67. */
  68. u32 request;
  69. u32 flags;
  70. u32 size;
  71. } __packed;
  72. struct vhost_user_config {
  73. u32 offset;
  74. u32 size;
  75. u32 flags;
  76. u8 payload[]; /* Variable length */
  77. } __packed;
  78. struct vhost_user_vring_state {
  79. u32 index;
  80. u32 num;
  81. } __packed;
  82. struct vhost_user_vring_addr {
  83. u32 index;
  84. u32 flags;
  85. u64 desc, used, avail, log;
  86. } __packed;
  87. struct vhost_user_mem_region {
  88. u64 guest_addr;
  89. u64 size;
  90. u64 user_addr;
  91. u64 mmap_offset;
  92. } __packed;
  93. struct vhost_user_mem_regions {
  94. u32 num;
  95. u32 padding;
  96. struct vhost_user_mem_region regions[2]; /* Currently supporting 2 */
  97. } __packed;
  98. union vhost_user_payload {
  99. u64 integer;
  100. struct vhost_user_config config;
  101. struct vhost_user_vring_state vring_state;
  102. struct vhost_user_vring_addr vring_addr;
  103. struct vhost_user_mem_regions mem_regions;
  104. };
  105. struct vhost_user_msg {
  106. struct vhost_user_header header;
  107. union vhost_user_payload payload;
  108. } __packed;
  109. #endif