1/* 2 * Copyright 2013, Haiku, Inc. All Rights Reserved. 3 * Distributed under the terms of the MIT License. 4 */ 5#ifndef _VIRTIO_H_ 6#define _VIRTIO_H_ 7 8 9#include <device_manager.h> 10#include <KernelExport.h> 11 12 13#define VIRTIO_DEVICE_ID_NETWORK 1 14#define VIRTIO_DEVICE_ID_BLOCK 2 15#define VIRTIO_DEVICE_ID_CONSOLE 3 16#define VIRTIO_DEVICE_ID_ENTROPY 4 17#define VIRTIO_DEVICE_ID_BALLOON 5 18#define VIRTIO_DEVICE_ID_IOMEMORY 6 19#define VIRTIO_DEVICE_ID_RP_MESSAGE 7 20#define VIRTIO_DEVICE_ID_SCSI 8 21#define VIRTIO_DEVICE_ID_9P 9 22#define VIRTIO_DEVICE_ID_RP_SERIAL 11 23#define VIRTIO_DEVICE_ID_CAIF 12 24#define VIRTIO_DEVICE_ID_GPU 16 25#define VIRTIO_DEVICE_ID_INPUT 18 26#define VIRTIO_DEVICE_ID_VSOCK 19 27#define VIRTIO_DEVICE_ID_CRYPTO 20 28#define VIRTIO_DEVICE_ID_SOUND 25 29 30#define VIRTIO_FEATURE_TRANSPORT_MASK ((1ULL << 28) - 1) 31 32#define VIRTIO_FEATURE_NOTIFY_ON_EMPTY (1 << 24) 33#define VIRTIO_FEATURE_ANY_LAYOUT (1 << 27) 34#define VIRTIO_FEATURE_RING_INDIRECT_DESC (1 << 28) 35#define VIRTIO_FEATURE_RING_EVENT_IDX (1 << 29) 36#define VIRTIO_FEATURE_BAD_FEATURE (1 << 30) 37#define VIRTIO_FEATURE_VERSION_1 (1ULL << 32) 38 39#define VIRTIO_VIRTQUEUES_MAX_COUNT 8 40 41#define VIRTIO_CONFIG_STATUS_RESET 0x00 42#define VIRTIO_CONFIG_STATUS_ACK 0x01 43#define VIRTIO_CONFIG_STATUS_DRIVER 0x02 44#define VIRTIO_CONFIG_STATUS_DRIVER_OK 0x04 45#define VIRTIO_CONFIG_STATUS_FEATURES_OK 0x08 46#define VIRTIO_CONFIG_STATUS_DEVICE_NEEDS_RESET 0x40 47#define VIRTIO_CONFIG_STATUS_FAILED 0x80 48 49// attributes: 50 51// node type 52#define VIRTIO_BUS_TYPE_NAME "bus/virtio/v1" 53// device type (uint16) 54#define VIRTIO_DEVICE_TYPE_ITEM "virtio/type" 55// alignment (uint16) 56#define VIRTIO_VRING_ALIGNMENT_ITEM "virtio/vring_alignment" 57// version (uint8) 58#define VIRTIO_VERSION_ITEM "virtio/version" 59 60// sim cookie, issued by virtio bus manager 61typedef void* virtio_sim; 62// device cookie, issued by virtio bus manager 63typedef void* virtio_device; 64// queue cookie, issued by virtio bus manager 65typedef void* virtio_queue; 66// callback function for requests 67typedef void (*virtio_callback_func)(void* driverCookie, void* cookie); 68// callback function for interrupts 69typedef void (*virtio_intr_func)(void* cookie); 70 71#define VIRTIO_DEVICE_MODULE_NAME "bus_managers/virtio/device/v1" 72 73typedef struct { 74 driver_module_info info; 75 76 status_t (*queue_interrupt_handler)(virtio_sim sim, uint16 queue); 77 status_t (*config_interrupt_handler)(virtio_sim sim); 78} virtio_for_controller_interface; 79 80#define VIRTIO_FOR_CONTROLLER_MODULE_NAME "bus_managers/virtio/controller/driver_v1" 81 82// Bus manager interface used by Virtio controller drivers. 83typedef struct { 84 driver_module_info info; 85 86 void (*set_sim)(void* cookie, virtio_sim sim); 87 status_t (*read_host_features)(void* cookie, uint64* features); 88 status_t (*write_guest_features)(void* cookie, uint64 features); 89 uint8 (*get_status)(void* cookie); 90 void (*set_status)(void* cookie, uint8 status); 91 status_t (*read_device_config)(void* cookie, uint8 offset, void* buffer, 92 size_t bufferSize); 93 status_t (*write_device_config)(void* cookie, uint8 offset, 94 const void* buffer, size_t bufferSize); 95 96 uint16 (*get_queue_ring_size)(void* cookie, uint16 queue); 97 status_t (*setup_queue)(void* cookie, uint16 queue, phys_addr_t phy, phys_addr_t phyAvail, 98 phys_addr_t phyUsed); 99 status_t (*setup_interrupt)(void* cookie, uint16 queueCount); 100 status_t (*free_interrupt)(void* cookie); 101 void (*notify_queue)(void* cookie, uint16 queue); 102} virtio_sim_interface; 103 104 105// bus manager device interface for peripheral driver 106typedef struct { 107 driver_module_info info; 108 109 status_t (*negotiate_features)(virtio_device cookie, uint64 supported, 110 uint64* negotiated, const char* (*get_feature_name)(uint64)); 111 112 status_t (*clear_feature)(virtio_device cookie, uint64 feature); 113 114 status_t (*read_device_config)(virtio_device cookie, uint8 offset, 115 void* buffer, size_t bufferSize); 116 status_t (*write_device_config)(virtio_device cookie, uint8 offset, 117 const void* buffer, size_t bufferSize); 118 119 status_t (*alloc_queues)(virtio_device cookie, size_t count, 120 virtio_queue* queues); 121 122 void (*free_queues)(virtio_device cookie); 123 124 status_t (*setup_interrupt)(virtio_device cookie, 125 virtio_intr_func config_handler, void* driverCookie); 126 127 status_t (*free_interrupts)(virtio_device cookie); 128 129 status_t (*queue_setup_interrupt)(virtio_queue queue, 130 virtio_callback_func handler, void* cookie); 131 132 status_t (*queue_request)(virtio_queue queue, 133 const physical_entry* readEntry, 134 const physical_entry* writtenEntry, void* cookie); 135 136 status_t (*queue_request_v)(virtio_queue queue, 137 const physical_entry* vector, 138 size_t readVectorCount, size_t writtenVectorCount, 139 void* cookie); 140 141 bool (*queue_is_full)(virtio_queue queue); 142 143 bool (*queue_is_empty)(virtio_queue queue); 144 145 uint16 (*queue_size)(virtio_queue queue); 146 147 bool (*queue_dequeue)(virtio_queue queue, void** _cookie, 148 uint32* _usedLength); 149 150} virtio_device_interface; 151 152 153#endif /* _VIRTIO_H_ */ 154