0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026 #ifndef VIRTIO_DRV_H
0027 #define VIRTIO_DRV_H
0028
0029 #include <linux/dma-direction.h>
0030 #include <linux/virtio.h>
0031 #include <linux/virtio_ids.h>
0032 #include <linux/virtio_config.h>
0033 #include <linux/virtio_gpu.h>
0034
0035 #include <drm/drm_atomic.h>
0036 #include <drm/drm_drv.h>
0037 #include <drm/drm_encoder.h>
0038 #include <drm/drm_fb_helper.h>
0039 #include <drm/drm_fourcc.h>
0040 #include <drm/drm_framebuffer.h>
0041 #include <drm/drm_gem.h>
0042 #include <drm/drm_gem_shmem_helper.h>
0043 #include <drm/drm_ioctl.h>
0044 #include <drm/drm_probe_helper.h>
0045 #include <drm/virtgpu_drm.h>
0046
0047 #define DRIVER_NAME "virtio_gpu"
0048 #define DRIVER_DESC "virtio GPU"
0049 #define DRIVER_DATE "0"
0050
0051 #define DRIVER_MAJOR 0
0052 #define DRIVER_MINOR 1
0053 #define DRIVER_PATCHLEVEL 0
0054
0055 #define STATE_INITIALIZING 0
0056 #define STATE_OK 1
0057 #define STATE_ERR 2
0058
0059 #define MAX_CAPSET_ID 63
0060 #define MAX_RINGS 64
0061
0062 struct virtio_gpu_object_params {
0063 unsigned long size;
0064 bool dumb;
0065
0066 bool virgl;
0067 bool blob;
0068
0069
0070 uint32_t format;
0071 uint32_t width;
0072 uint32_t height;
0073 uint32_t target;
0074 uint32_t bind;
0075 uint32_t depth;
0076 uint32_t array_size;
0077 uint32_t last_level;
0078 uint32_t nr_samples;
0079 uint32_t flags;
0080
0081
0082 uint32_t ctx_id;
0083 uint32_t blob_mem;
0084 uint32_t blob_flags;
0085 uint64_t blob_id;
0086 };
0087
0088 struct virtio_gpu_object {
0089 struct drm_gem_shmem_object base;
0090 uint32_t hw_res_handle;
0091 bool dumb;
0092 bool created;
0093 bool host3d_blob, guest_blob;
0094 uint32_t blob_mem, blob_flags;
0095
0096 int uuid_state;
0097 uuid_t uuid;
0098 };
0099 #define gem_to_virtio_gpu_obj(gobj) \
0100 container_of((gobj), struct virtio_gpu_object, base.base)
0101
0102 struct virtio_gpu_object_shmem {
0103 struct virtio_gpu_object base;
0104 struct sg_table *pages;
0105 uint32_t mapped;
0106 };
0107
0108 struct virtio_gpu_object_vram {
0109 struct virtio_gpu_object base;
0110 uint32_t map_state;
0111 uint32_t map_info;
0112 struct drm_mm_node vram_node;
0113 };
0114
0115 #define to_virtio_gpu_shmem(virtio_gpu_object) \
0116 container_of((virtio_gpu_object), struct virtio_gpu_object_shmem, base)
0117
0118 #define to_virtio_gpu_vram(virtio_gpu_object) \
0119 container_of((virtio_gpu_object), struct virtio_gpu_object_vram, base)
0120
0121 struct virtio_gpu_object_array {
0122 struct ww_acquire_ctx ticket;
0123 struct list_head next;
0124 u32 nents, total;
0125 struct drm_gem_object *objs[];
0126 };
0127
0128 struct virtio_gpu_vbuffer;
0129 struct virtio_gpu_device;
0130
0131 typedef void (*virtio_gpu_resp_cb)(struct virtio_gpu_device *vgdev,
0132 struct virtio_gpu_vbuffer *vbuf);
0133
0134 struct virtio_gpu_fence_driver {
0135 atomic64_t last_fence_id;
0136 uint64_t current_fence_id;
0137 uint64_t context;
0138 struct list_head fences;
0139 spinlock_t lock;
0140 };
0141
0142 struct virtio_gpu_fence_event {
0143 struct drm_pending_event base;
0144 struct drm_event event;
0145 };
0146
0147 struct virtio_gpu_fence {
0148 struct dma_fence f;
0149 uint32_t ring_idx;
0150 uint64_t fence_id;
0151 bool emit_fence_info;
0152 struct virtio_gpu_fence_event *e;
0153 struct virtio_gpu_fence_driver *drv;
0154 struct list_head node;
0155 };
0156
0157 struct virtio_gpu_vbuffer {
0158 char *buf;
0159 int size;
0160
0161 void *data_buf;
0162 uint32_t data_size;
0163
0164 char *resp_buf;
0165 int resp_size;
0166 virtio_gpu_resp_cb resp_cb;
0167 void *resp_cb_data;
0168
0169 struct virtio_gpu_object_array *objs;
0170 struct list_head list;
0171 };
0172
0173 struct virtio_gpu_output {
0174 int index;
0175 struct drm_crtc crtc;
0176 struct drm_connector conn;
0177 struct drm_encoder enc;
0178 struct virtio_gpu_display_one info;
0179 struct virtio_gpu_update_cursor cursor;
0180 struct edid *edid;
0181 int cur_x;
0182 int cur_y;
0183 bool needs_modeset;
0184 };
0185 #define drm_crtc_to_virtio_gpu_output(x) \
0186 container_of(x, struct virtio_gpu_output, crtc)
0187
0188 struct virtio_gpu_framebuffer {
0189 struct drm_framebuffer base;
0190 struct virtio_gpu_fence *fence;
0191 };
0192 #define to_virtio_gpu_framebuffer(x) \
0193 container_of(x, struct virtio_gpu_framebuffer, base)
0194
0195 struct virtio_gpu_queue {
0196 struct virtqueue *vq;
0197 spinlock_t qlock;
0198 wait_queue_head_t ack_queue;
0199 struct work_struct dequeue_work;
0200 };
0201
0202 struct virtio_gpu_drv_capset {
0203 uint32_t id;
0204 uint32_t max_version;
0205 uint32_t max_size;
0206 };
0207
0208 struct virtio_gpu_drv_cap_cache {
0209 struct list_head head;
0210 void *caps_cache;
0211 uint32_t id;
0212 uint32_t version;
0213 uint32_t size;
0214 atomic_t is_valid;
0215 };
0216
0217 struct virtio_gpu_device {
0218 struct device *dev;
0219 struct drm_device *ddev;
0220
0221 struct virtio_device *vdev;
0222
0223 struct virtio_gpu_output outputs[VIRTIO_GPU_MAX_SCANOUTS];
0224 uint32_t num_scanouts;
0225
0226 struct virtio_gpu_queue ctrlq;
0227 struct virtio_gpu_queue cursorq;
0228 struct kmem_cache *vbufs;
0229
0230 atomic_t pending_commands;
0231
0232 struct ida resource_ida;
0233
0234 wait_queue_head_t resp_wq;
0235
0236 spinlock_t display_info_lock;
0237 bool display_info_pending;
0238
0239 struct virtio_gpu_fence_driver fence_drv;
0240
0241 struct ida ctx_id_ida;
0242
0243 bool has_virgl_3d;
0244 bool has_edid;
0245 bool has_indirect;
0246 bool has_resource_assign_uuid;
0247 bool has_resource_blob;
0248 bool has_host_visible;
0249 bool has_context_init;
0250 struct virtio_shm_region host_visible_region;
0251 struct drm_mm host_visible_mm;
0252
0253 struct work_struct config_changed_work;
0254
0255 struct work_struct obj_free_work;
0256 spinlock_t obj_free_lock;
0257 struct list_head obj_free_list;
0258
0259 struct virtio_gpu_drv_capset *capsets;
0260 uint32_t num_capsets;
0261 uint64_t capset_id_mask;
0262 struct list_head cap_cache;
0263
0264
0265 spinlock_t resource_export_lock;
0266
0267 spinlock_t host_visible_lock;
0268 };
0269
0270 struct virtio_gpu_fpriv {
0271 uint32_t ctx_id;
0272 uint32_t context_init;
0273 bool context_created;
0274 uint32_t num_rings;
0275 uint64_t base_fence_ctx;
0276 uint64_t ring_idx_mask;
0277 struct mutex context_lock;
0278 };
0279
0280
0281 #define DRM_VIRTIO_NUM_IOCTLS 12
0282 extern struct drm_ioctl_desc virtio_gpu_ioctls[DRM_VIRTIO_NUM_IOCTLS];
0283 void virtio_gpu_create_context(struct drm_device *dev, struct drm_file *file);
0284
0285
0286 int virtio_gpu_init(struct drm_device *dev);
0287 void virtio_gpu_deinit(struct drm_device *dev);
0288 void virtio_gpu_release(struct drm_device *dev);
0289 int virtio_gpu_driver_open(struct drm_device *dev, struct drm_file *file);
0290 void virtio_gpu_driver_postclose(struct drm_device *dev, struct drm_file *file);
0291
0292
0293 int virtio_gpu_gem_object_open(struct drm_gem_object *obj,
0294 struct drm_file *file);
0295 void virtio_gpu_gem_object_close(struct drm_gem_object *obj,
0296 struct drm_file *file);
0297 int virtio_gpu_mode_dumb_create(struct drm_file *file_priv,
0298 struct drm_device *dev,
0299 struct drm_mode_create_dumb *args);
0300 int virtio_gpu_mode_dumb_mmap(struct drm_file *file_priv,
0301 struct drm_device *dev,
0302 uint32_t handle, uint64_t *offset_p);
0303
0304 struct virtio_gpu_object_array *virtio_gpu_array_alloc(u32 nents);
0305 struct virtio_gpu_object_array*
0306 virtio_gpu_array_from_handles(struct drm_file *drm_file, u32 *handles, u32 nents);
0307 void virtio_gpu_array_add_obj(struct virtio_gpu_object_array *objs,
0308 struct drm_gem_object *obj);
0309 int virtio_gpu_array_lock_resv(struct virtio_gpu_object_array *objs);
0310 void virtio_gpu_array_unlock_resv(struct virtio_gpu_object_array *objs);
0311 void virtio_gpu_array_add_fence(struct virtio_gpu_object_array *objs,
0312 struct dma_fence *fence);
0313 void virtio_gpu_array_put_free(struct virtio_gpu_object_array *objs);
0314 void virtio_gpu_array_put_free_delayed(struct virtio_gpu_device *vgdev,
0315 struct virtio_gpu_object_array *objs);
0316 void virtio_gpu_array_put_free_work(struct work_struct *work);
0317
0318
0319 int virtio_gpu_alloc_vbufs(struct virtio_gpu_device *vgdev);
0320 void virtio_gpu_free_vbufs(struct virtio_gpu_device *vgdev);
0321 void virtio_gpu_cmd_create_resource(struct virtio_gpu_device *vgdev,
0322 struct virtio_gpu_object *bo,
0323 struct virtio_gpu_object_params *params,
0324 struct virtio_gpu_object_array *objs,
0325 struct virtio_gpu_fence *fence);
0326 void virtio_gpu_cmd_unref_resource(struct virtio_gpu_device *vgdev,
0327 struct virtio_gpu_object *bo);
0328 void virtio_gpu_cmd_transfer_to_host_2d(struct virtio_gpu_device *vgdev,
0329 uint64_t offset,
0330 uint32_t width, uint32_t height,
0331 uint32_t x, uint32_t y,
0332 struct virtio_gpu_object_array *objs,
0333 struct virtio_gpu_fence *fence);
0334 void virtio_gpu_cmd_resource_flush(struct virtio_gpu_device *vgdev,
0335 uint32_t resource_id,
0336 uint32_t x, uint32_t y,
0337 uint32_t width, uint32_t height,
0338 struct virtio_gpu_object_array *objs,
0339 struct virtio_gpu_fence *fence);
0340 void virtio_gpu_cmd_set_scanout(struct virtio_gpu_device *vgdev,
0341 uint32_t scanout_id, uint32_t resource_id,
0342 uint32_t width, uint32_t height,
0343 uint32_t x, uint32_t y);
0344 void virtio_gpu_object_attach(struct virtio_gpu_device *vgdev,
0345 struct virtio_gpu_object *obj,
0346 struct virtio_gpu_mem_entry *ents,
0347 unsigned int nents);
0348 int virtio_gpu_attach_status_page(struct virtio_gpu_device *vgdev);
0349 int virtio_gpu_detach_status_page(struct virtio_gpu_device *vgdev);
0350 void virtio_gpu_cursor_ping(struct virtio_gpu_device *vgdev,
0351 struct virtio_gpu_output *output);
0352 int virtio_gpu_cmd_get_display_info(struct virtio_gpu_device *vgdev);
0353 int virtio_gpu_cmd_get_capset_info(struct virtio_gpu_device *vgdev, int idx);
0354 int virtio_gpu_cmd_get_capset(struct virtio_gpu_device *vgdev,
0355 int idx, int version,
0356 struct virtio_gpu_drv_cap_cache **cache_p);
0357 int virtio_gpu_cmd_get_edids(struct virtio_gpu_device *vgdev);
0358 void virtio_gpu_cmd_context_create(struct virtio_gpu_device *vgdev, uint32_t id,
0359 uint32_t context_init, uint32_t nlen,
0360 const char *name);
0361 void virtio_gpu_cmd_context_destroy(struct virtio_gpu_device *vgdev,
0362 uint32_t id);
0363 void virtio_gpu_cmd_context_attach_resource(struct virtio_gpu_device *vgdev,
0364 uint32_t ctx_id,
0365 struct virtio_gpu_object_array *objs);
0366 void virtio_gpu_cmd_context_detach_resource(struct virtio_gpu_device *vgdev,
0367 uint32_t ctx_id,
0368 struct virtio_gpu_object_array *objs);
0369 void virtio_gpu_cmd_submit(struct virtio_gpu_device *vgdev,
0370 void *data, uint32_t data_size,
0371 uint32_t ctx_id,
0372 struct virtio_gpu_object_array *objs,
0373 struct virtio_gpu_fence *fence);
0374 void virtio_gpu_cmd_transfer_from_host_3d(struct virtio_gpu_device *vgdev,
0375 uint32_t ctx_id,
0376 uint64_t offset, uint32_t level,
0377 uint32_t stride,
0378 uint32_t layer_stride,
0379 struct drm_virtgpu_3d_box *box,
0380 struct virtio_gpu_object_array *objs,
0381 struct virtio_gpu_fence *fence);
0382 void virtio_gpu_cmd_transfer_to_host_3d(struct virtio_gpu_device *vgdev,
0383 uint32_t ctx_id,
0384 uint64_t offset, uint32_t level,
0385 uint32_t stride,
0386 uint32_t layer_stride,
0387 struct drm_virtgpu_3d_box *box,
0388 struct virtio_gpu_object_array *objs,
0389 struct virtio_gpu_fence *fence);
0390 void
0391 virtio_gpu_cmd_resource_create_3d(struct virtio_gpu_device *vgdev,
0392 struct virtio_gpu_object *bo,
0393 struct virtio_gpu_object_params *params,
0394 struct virtio_gpu_object_array *objs,
0395 struct virtio_gpu_fence *fence);
0396 void virtio_gpu_ctrl_ack(struct virtqueue *vq);
0397 void virtio_gpu_cursor_ack(struct virtqueue *vq);
0398 void virtio_gpu_fence_ack(struct virtqueue *vq);
0399 void virtio_gpu_dequeue_ctrl_func(struct work_struct *work);
0400 void virtio_gpu_dequeue_cursor_func(struct work_struct *work);
0401 void virtio_gpu_dequeue_fence_func(struct work_struct *work);
0402
0403 void virtio_gpu_notify(struct virtio_gpu_device *vgdev);
0404
0405 int
0406 virtio_gpu_cmd_resource_assign_uuid(struct virtio_gpu_device *vgdev,
0407 struct virtio_gpu_object_array *objs);
0408
0409 int virtio_gpu_cmd_map(struct virtio_gpu_device *vgdev,
0410 struct virtio_gpu_object_array *objs, uint64_t offset);
0411
0412 void virtio_gpu_cmd_unmap(struct virtio_gpu_device *vgdev,
0413 struct virtio_gpu_object *bo);
0414
0415 void
0416 virtio_gpu_cmd_resource_create_blob(struct virtio_gpu_device *vgdev,
0417 struct virtio_gpu_object *bo,
0418 struct virtio_gpu_object_params *params,
0419 struct virtio_gpu_mem_entry *ents,
0420 uint32_t nents);
0421 void
0422 virtio_gpu_cmd_set_scanout_blob(struct virtio_gpu_device *vgdev,
0423 uint32_t scanout_id,
0424 struct virtio_gpu_object *bo,
0425 struct drm_framebuffer *fb,
0426 uint32_t width, uint32_t height,
0427 uint32_t x, uint32_t y);
0428
0429
0430 int virtio_gpu_modeset_init(struct virtio_gpu_device *vgdev);
0431 void virtio_gpu_modeset_fini(struct virtio_gpu_device *vgdev);
0432
0433
0434 uint32_t virtio_gpu_translate_format(uint32_t drm_fourcc);
0435 struct drm_plane *virtio_gpu_plane_init(struct virtio_gpu_device *vgdev,
0436 enum drm_plane_type type,
0437 int index);
0438
0439
0440 struct virtio_gpu_fence *virtio_gpu_fence_alloc(struct virtio_gpu_device *vgdev,
0441 uint64_t base_fence_ctx,
0442 uint32_t ring_idx);
0443 void virtio_gpu_fence_emit(struct virtio_gpu_device *vgdev,
0444 struct virtio_gpu_ctrl_hdr *cmd_hdr,
0445 struct virtio_gpu_fence *fence);
0446 void virtio_gpu_fence_event_process(struct virtio_gpu_device *vdev,
0447 u64 fence_id);
0448
0449
0450 void virtio_gpu_cleanup_object(struct virtio_gpu_object *bo);
0451 struct drm_gem_object *virtio_gpu_create_object(struct drm_device *dev,
0452 size_t size);
0453 int virtio_gpu_object_create(struct virtio_gpu_device *vgdev,
0454 struct virtio_gpu_object_params *params,
0455 struct virtio_gpu_object **bo_ptr,
0456 struct virtio_gpu_fence *fence);
0457
0458 bool virtio_gpu_is_shmem(struct virtio_gpu_object *bo);
0459
0460 int virtio_gpu_resource_id_get(struct virtio_gpu_device *vgdev,
0461 uint32_t *resid);
0462
0463 int virtio_gpu_resource_assign_uuid(struct virtio_gpu_device *vgdev,
0464 struct virtio_gpu_object *bo);
0465 struct dma_buf *virtgpu_gem_prime_export(struct drm_gem_object *obj,
0466 int flags);
0467 struct drm_gem_object *virtgpu_gem_prime_import(struct drm_device *dev,
0468 struct dma_buf *buf);
0469 int virtgpu_gem_prime_get_uuid(struct drm_gem_object *obj,
0470 uuid_t *uuid);
0471 struct drm_gem_object *virtgpu_gem_prime_import_sg_table(
0472 struct drm_device *dev, struct dma_buf_attachment *attach,
0473 struct sg_table *sgt);
0474
0475
0476 void virtio_gpu_debugfs_init(struct drm_minor *minor);
0477
0478
0479 bool virtio_gpu_is_vram(struct virtio_gpu_object *bo);
0480 int virtio_gpu_vram_create(struct virtio_gpu_device *vgdev,
0481 struct virtio_gpu_object_params *params,
0482 struct virtio_gpu_object **bo_ptr);
0483 struct sg_table *virtio_gpu_vram_map_dma_buf(struct virtio_gpu_object *bo,
0484 struct device *dev,
0485 enum dma_data_direction dir);
0486 void virtio_gpu_vram_unmap_dma_buf(struct device *dev,
0487 struct sg_table *sgt,
0488 enum dma_data_direction dir);
0489
0490 #endif