Home | History | Annotate | Line # | Download | only in virtio
virtgpu_drv.h revision 1.1
      1 /*	$NetBSD: virtgpu_drv.h,v 1.1 2018/08/27 01:34:59 riastradh Exp $	*/
      2 
      3 /*
      4  * Copyright (C) 2015 Red Hat, Inc.
      5  * All Rights Reserved.
      6  *
      7  * Permission is hereby granted, free of charge, to any person obtaining
      8  * a copy of this software and associated documentation files (the
      9  * "Software"), to deal in the Software without restriction, including
     10  * without limitation the rights to use, copy, modify, merge, publish,
     11  * distribute, sublicense, and/or sell copies of the Software, and to
     12  * permit persons to whom the Software is furnished to do so, subject to
     13  * the following conditions:
     14  *
     15  * The above copyright notice and this permission notice (including the
     16  * next paragraph) shall be included in all copies or substantial
     17  * portions of the Software.
     18  *
     19  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
     20  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     21  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
     22  * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
     23  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
     24  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
     25  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     26  */
     27 
     28 #ifndef VIRTIO_DRV_H
     29 #define VIRTIO_DRV_H
     30 
     31 #include <linux/virtio.h>
     32 #include <linux/virtio_ids.h>
     33 #include <linux/virtio_config.h>
     34 #include <linux/virtio_gpu.h>
     35 
     36 #include <drm/drmP.h>
     37 #include <drm/drm_gem.h>
     38 #include <drm/drm_crtc_helper.h>
     39 #include <ttm/ttm_bo_api.h>
     40 #include <ttm/ttm_bo_driver.h>
     41 #include <ttm/ttm_placement.h>
     42 #include <ttm/ttm_module.h>
     43 
     44 #define DRIVER_NAME "virtio_gpu"
     45 #define DRIVER_DESC "virtio GPU"
     46 #define DRIVER_DATE "0"
     47 
     48 #define DRIVER_MAJOR 0
     49 #define DRIVER_MINOR 0
     50 #define DRIVER_PATCHLEVEL 1
     51 
     52 /* virtgpu_drm_bus.c */
     53 int drm_virtio_set_busid(struct drm_device *dev, struct drm_master *master);
     54 int drm_virtio_init(struct drm_driver *driver, struct virtio_device *vdev);
     55 
     56 struct virtio_gpu_object {
     57 	struct drm_gem_object gem_base;
     58 	uint32_t hw_res_handle;
     59 
     60 	struct sg_table *pages;
     61 	void *vmap;
     62 	bool dumb;
     63 	struct ttm_place                placement_code;
     64 	struct ttm_placement		placement;
     65 	struct ttm_buffer_object	tbo;
     66 	struct ttm_bo_kmap_obj		kmap;
     67 };
     68 #define gem_to_virtio_gpu_obj(gobj) \
     69 	container_of((gobj), struct virtio_gpu_object, gem_base)
     70 
     71 struct virtio_gpu_vbuffer;
     72 struct virtio_gpu_device;
     73 
     74 typedef void (*virtio_gpu_resp_cb)(struct virtio_gpu_device *vgdev,
     75 				   struct virtio_gpu_vbuffer *vbuf);
     76 
     77 struct virtio_gpu_fence_driver {
     78 	atomic64_t       last_seq;
     79 	uint64_t         sync_seq;
     80 	struct list_head fences;
     81 	spinlock_t       lock;
     82 };
     83 
     84 struct virtio_gpu_fence {
     85 	struct fence f;
     86 	struct virtio_gpu_fence_driver *drv;
     87 	struct list_head node;
     88 	uint64_t seq;
     89 };
     90 #define to_virtio_fence(x) \
     91 	container_of(x, struct virtio_gpu_fence, f)
     92 
     93 struct virtio_gpu_vbuffer {
     94 	char *buf;
     95 	int size;
     96 
     97 	void *data_buf;
     98 	uint32_t data_size;
     99 
    100 	char *resp_buf;
    101 	int resp_size;
    102 
    103 	virtio_gpu_resp_cb resp_cb;
    104 
    105 	struct list_head list;
    106 };
    107 
    108 struct virtio_gpu_output {
    109 	int index;
    110 	struct drm_crtc crtc;
    111 	struct drm_connector conn;
    112 	struct drm_encoder enc;
    113 	struct virtio_gpu_display_one info;
    114 	struct virtio_gpu_update_cursor cursor;
    115 	int cur_x;
    116 	int cur_y;
    117 };
    118 #define drm_crtc_to_virtio_gpu_output(x) \
    119 	container_of(x, struct virtio_gpu_output, crtc)
    120 #define drm_connector_to_virtio_gpu_output(x) \
    121 	container_of(x, struct virtio_gpu_output, conn)
    122 #define drm_encoder_to_virtio_gpu_output(x) \
    123 	container_of(x, struct virtio_gpu_output, enc)
    124 
    125 struct virtio_gpu_framebuffer {
    126 	struct drm_framebuffer base;
    127 	struct drm_gem_object *obj;
    128 	int x1, y1, x2, y2; /* dirty rect */
    129 	spinlock_t dirty_lock;
    130 	uint32_t hw_res_handle;
    131 };
    132 #define to_virtio_gpu_framebuffer(x) \
    133 	container_of(x, struct virtio_gpu_framebuffer, base)
    134 
    135 struct virtio_gpu_mman {
    136 	struct ttm_bo_global_ref        bo_global_ref;
    137 	struct drm_global_reference	mem_global_ref;
    138 	bool				mem_global_referenced;
    139 	struct ttm_bo_device		bdev;
    140 };
    141 
    142 struct virtio_gpu_fbdev;
    143 
    144 struct virtio_gpu_queue {
    145 	struct virtqueue *vq;
    146 	spinlock_t qlock;
    147 	wait_queue_head_t ack_queue;
    148 	struct work_struct dequeue_work;
    149 };
    150 
    151 struct virtio_gpu_drv_capset {
    152 	uint32_t id;
    153 	uint32_t max_version;
    154 	uint32_t max_size;
    155 };
    156 
    157 struct virtio_gpu_drv_cap_cache {
    158 	struct list_head head;
    159 	void *caps_cache;
    160 	uint32_t id;
    161 	uint32_t version;
    162 	uint32_t size;
    163 	atomic_t is_valid;
    164 };
    165 
    166 struct virtio_gpu_device {
    167 	struct device *dev;
    168 	struct drm_device *ddev;
    169 
    170 	struct virtio_device *vdev;
    171 
    172 	struct virtio_gpu_mman mman;
    173 
    174 	/* pointer to fbdev info structure */
    175 	struct virtio_gpu_fbdev *vgfbdev;
    176 	struct virtio_gpu_output outputs[VIRTIO_GPU_MAX_SCANOUTS];
    177 	uint32_t num_scanouts;
    178 
    179 	struct virtio_gpu_queue ctrlq;
    180 	struct virtio_gpu_queue cursorq;
    181 	struct list_head free_vbufs;
    182 	spinlock_t free_vbufs_lock;
    183 	void *vbufs;
    184 	bool vqs_ready;
    185 
    186 	struct idr	resource_idr;
    187 	spinlock_t resource_idr_lock;
    188 
    189 	wait_queue_head_t resp_wq;
    190 	/* current display info */
    191 	spinlock_t display_info_lock;
    192 	bool display_info_pending;
    193 
    194 	struct virtio_gpu_fence_driver fence_drv;
    195 
    196 	struct idr	ctx_id_idr;
    197 	spinlock_t ctx_id_idr_lock;
    198 
    199 	bool has_virgl_3d;
    200 
    201 	struct work_struct config_changed_work;
    202 
    203 	struct virtio_gpu_drv_capset *capsets;
    204 	uint32_t num_capsets;
    205 	struct list_head cap_cache;
    206 };
    207 
    208 struct virtio_gpu_fpriv {
    209 	uint32_t ctx_id;
    210 };
    211 
    212 /* virtio_ioctl.c */
    213 #define DRM_VIRTIO_NUM_IOCTLS 10
    214 extern struct drm_ioctl_desc virtio_gpu_ioctls[DRM_VIRTIO_NUM_IOCTLS];
    215 
    216 /* virtio_kms.c */
    217 int virtio_gpu_driver_load(struct drm_device *dev, unsigned long flags);
    218 int virtio_gpu_driver_unload(struct drm_device *dev);
    219 int virtio_gpu_driver_open(struct drm_device *dev, struct drm_file *file);
    220 void virtio_gpu_driver_postclose(struct drm_device *dev, struct drm_file *file);
    221 
    222 /* virtio_gem.c */
    223 void virtio_gpu_gem_free_object(struct drm_gem_object *gem_obj);
    224 int virtio_gpu_gem_init(struct virtio_gpu_device *vgdev);
    225 void virtio_gpu_gem_fini(struct virtio_gpu_device *vgdev);
    226 int virtio_gpu_gem_create(struct drm_file *file,
    227 			  struct drm_device *dev,
    228 			  uint64_t size,
    229 			  struct drm_gem_object **obj_p,
    230 			  uint32_t *handle_p);
    231 int virtio_gpu_gem_object_open(struct drm_gem_object *obj,
    232 			       struct drm_file *file);
    233 void virtio_gpu_gem_object_close(struct drm_gem_object *obj,
    234 				 struct drm_file *file);
    235 struct virtio_gpu_object *virtio_gpu_alloc_object(struct drm_device *dev,
    236 						  size_t size, bool kernel,
    237 						  bool pinned);
    238 int virtio_gpu_mode_dumb_create(struct drm_file *file_priv,
    239 				struct drm_device *dev,
    240 				struct drm_mode_create_dumb *args);
    241 int virtio_gpu_mode_dumb_destroy(struct drm_file *file_priv,
    242 				 struct drm_device *dev,
    243 				 uint32_t handle);
    244 int virtio_gpu_mode_dumb_mmap(struct drm_file *file_priv,
    245 			      struct drm_device *dev,
    246 			      uint32_t handle, uint64_t *offset_p);
    247 
    248 /* virtio_fb */
    249 #define VIRTIO_GPUFB_CONN_LIMIT 1
    250 int virtio_gpu_fbdev_init(struct virtio_gpu_device *vgdev);
    251 void virtio_gpu_fbdev_fini(struct virtio_gpu_device *vgdev);
    252 int virtio_gpu_surface_dirty(struct virtio_gpu_framebuffer *qfb,
    253 			     struct drm_clip_rect *clips,
    254 			     unsigned num_clips);
    255 /* virtio vg */
    256 int virtio_gpu_alloc_vbufs(struct virtio_gpu_device *vgdev);
    257 void virtio_gpu_free_vbufs(struct virtio_gpu_device *vgdev);
    258 void virtio_gpu_resource_id_get(struct virtio_gpu_device *vgdev,
    259 			       uint32_t *resid);
    260 void virtio_gpu_resource_id_put(struct virtio_gpu_device *vgdev, uint32_t id);
    261 void virtio_gpu_cmd_create_resource(struct virtio_gpu_device *vgdev,
    262 				    uint32_t resource_id,
    263 				    uint32_t format,
    264 				    uint32_t width,
    265 				    uint32_t height);
    266 void virtio_gpu_cmd_unref_resource(struct virtio_gpu_device *vgdev,
    267 				   uint32_t resource_id);
    268 void virtio_gpu_cmd_transfer_to_host_2d(struct virtio_gpu_device *vgdev,
    269 					uint32_t resource_id, uint64_t offset,
    270 					__le32 width, __le32 height,
    271 					__le32 x, __le32 y,
    272 					struct virtio_gpu_fence **fence);
    273 void virtio_gpu_cmd_resource_flush(struct virtio_gpu_device *vgdev,
    274 				   uint32_t resource_id,
    275 				   uint32_t x, uint32_t y,
    276 				   uint32_t width, uint32_t height);
    277 void virtio_gpu_cmd_set_scanout(struct virtio_gpu_device *vgdev,
    278 				uint32_t scanout_id, uint32_t resource_id,
    279 				uint32_t width, uint32_t height,
    280 				uint32_t x, uint32_t y);
    281 int virtio_gpu_object_attach(struct virtio_gpu_device *vgdev,
    282 			     struct virtio_gpu_object *obj,
    283 			     uint32_t resource_id,
    284 			     struct virtio_gpu_fence **fence);
    285 int virtio_gpu_attach_status_page(struct virtio_gpu_device *vgdev);
    286 int virtio_gpu_detach_status_page(struct virtio_gpu_device *vgdev);
    287 void virtio_gpu_cursor_ping(struct virtio_gpu_device *vgdev,
    288 			    struct virtio_gpu_output *output);
    289 int virtio_gpu_cmd_get_display_info(struct virtio_gpu_device *vgdev);
    290 void virtio_gpu_cmd_resource_inval_backing(struct virtio_gpu_device *vgdev,
    291 					   uint32_t resource_id);
    292 int virtio_gpu_cmd_get_capset_info(struct virtio_gpu_device *vgdev, int idx);
    293 int virtio_gpu_cmd_get_capset(struct virtio_gpu_device *vgdev,
    294 			      int idx, int version,
    295 			      struct virtio_gpu_drv_cap_cache **cache_p);
    296 void virtio_gpu_cmd_context_create(struct virtio_gpu_device *vgdev, uint32_t id,
    297 				   uint32_t nlen, const char *name);
    298 void virtio_gpu_cmd_context_destroy(struct virtio_gpu_device *vgdev,
    299 				    uint32_t id);
    300 void virtio_gpu_cmd_context_attach_resource(struct virtio_gpu_device *vgdev,
    301 					    uint32_t ctx_id,
    302 					    uint32_t resource_id);
    303 void virtio_gpu_cmd_context_detach_resource(struct virtio_gpu_device *vgdev,
    304 					    uint32_t ctx_id,
    305 					    uint32_t resource_id);
    306 void virtio_gpu_cmd_submit(struct virtio_gpu_device *vgdev,
    307 			   void *data, uint32_t data_size,
    308 			   uint32_t ctx_id, struct virtio_gpu_fence **fence);
    309 void virtio_gpu_cmd_transfer_from_host_3d(struct virtio_gpu_device *vgdev,
    310 					  uint32_t resource_id, uint32_t ctx_id,
    311 					  uint64_t offset, uint32_t level,
    312 					  struct virtio_gpu_box *box,
    313 					  struct virtio_gpu_fence **fence);
    314 void virtio_gpu_cmd_transfer_to_host_3d(struct virtio_gpu_device *vgdev,
    315 					uint32_t resource_id, uint32_t ctx_id,
    316 					uint64_t offset, uint32_t level,
    317 					struct virtio_gpu_box *box,
    318 					struct virtio_gpu_fence **fence);
    319 void
    320 virtio_gpu_cmd_resource_create_3d(struct virtio_gpu_device *vgdev,
    321 				  struct virtio_gpu_resource_create_3d *rc_3d,
    322 				  struct virtio_gpu_fence **fence);
    323 void virtio_gpu_ctrl_ack(struct virtqueue *vq);
    324 void virtio_gpu_cursor_ack(struct virtqueue *vq);
    325 void virtio_gpu_fence_ack(struct virtqueue *vq);
    326 void virtio_gpu_dequeue_ctrl_func(struct work_struct *work);
    327 void virtio_gpu_dequeue_cursor_func(struct work_struct *work);
    328 void virtio_gpu_dequeue_fence_func(struct work_struct *work);
    329 
    330 /* virtio_gpu_display.c */
    331 int virtio_gpu_framebuffer_init(struct drm_device *dev,
    332 				struct virtio_gpu_framebuffer *vgfb,
    333 				struct drm_mode_fb_cmd2 *mode_cmd,
    334 				struct drm_gem_object *obj);
    335 int virtio_gpu_modeset_init(struct virtio_gpu_device *vgdev);
    336 void virtio_gpu_modeset_fini(struct virtio_gpu_device *vgdev);
    337 
    338 /* virtio_gpu_plane.c */
    339 struct drm_plane *virtio_gpu_plane_init(struct virtio_gpu_device *vgdev,
    340 					int index);
    341 
    342 /* virtio_gpu_ttm.c */
    343 int virtio_gpu_ttm_init(struct virtio_gpu_device *vgdev);
    344 void virtio_gpu_ttm_fini(struct virtio_gpu_device *vgdev);
    345 int virtio_gpu_mmap(struct file *filp, struct vm_area_struct *vma);
    346 
    347 /* virtio_gpu_fence.c */
    348 int virtio_gpu_fence_emit(struct virtio_gpu_device *vgdev,
    349 			  struct virtio_gpu_ctrl_hdr *cmd_hdr,
    350 			  struct virtio_gpu_fence **fence);
    351 void virtio_gpu_fence_event_process(struct virtio_gpu_device *vdev,
    352 				    u64 last_seq);
    353 
    354 /* virtio_gpu_object */
    355 int virtio_gpu_object_create(struct virtio_gpu_device *vgdev,
    356 			     unsigned long size, bool kernel, bool pinned,
    357 			     struct virtio_gpu_object **bo_ptr);
    358 int virtio_gpu_object_kmap(struct virtio_gpu_object *bo, void **ptr);
    359 int virtio_gpu_object_get_sg_table(struct virtio_gpu_device *qdev,
    360 				   struct virtio_gpu_object *bo);
    361 void virtio_gpu_object_free_sg_table(struct virtio_gpu_object *bo);
    362 int virtio_gpu_object_wait(struct virtio_gpu_object *bo, bool no_wait);
    363 
    364 /* virtgpu_prime.c */
    365 int virtgpu_gem_prime_pin(struct drm_gem_object *obj);
    366 void virtgpu_gem_prime_unpin(struct drm_gem_object *obj);
    367 struct sg_table *virtgpu_gem_prime_get_sg_table(struct drm_gem_object *obj);
    368 struct drm_gem_object *virtgpu_gem_prime_import_sg_table(
    369         struct drm_device *dev, struct dma_buf_attachment *attach,
    370         struct sg_table *sgt);
    371 void *virtgpu_gem_prime_vmap(struct drm_gem_object *obj);
    372 void virtgpu_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr);
    373 int virtgpu_gem_prime_mmap(struct drm_gem_object *obj,
    374                                 struct vm_area_struct *vma);
    375 
    376 static inline struct virtio_gpu_object*
    377 virtio_gpu_object_ref(struct virtio_gpu_object *bo)
    378 {
    379 	ttm_bo_reference(&bo->tbo);
    380 	return bo;
    381 }
    382 
    383 static inline void virtio_gpu_object_unref(struct virtio_gpu_object **bo)
    384 {
    385 	struct ttm_buffer_object *tbo;
    386 
    387 	if ((*bo) == NULL)
    388 		return;
    389 	tbo = &((*bo)->tbo);
    390 	ttm_bo_unref(&tbo);
    391 	if (tbo == NULL)
    392 		*bo = NULL;
    393 }
    394 
    395 static inline u64 virtio_gpu_object_mmap_offset(struct virtio_gpu_object *bo)
    396 {
    397 	return drm_vma_node_offset_addr(&bo->tbo.vma_node);
    398 }
    399 
    400 static inline int virtio_gpu_object_reserve(struct virtio_gpu_object *bo,
    401 					 bool no_wait)
    402 {
    403 	int r;
    404 
    405 	r = ttm_bo_reserve(&bo->tbo, true, no_wait, false, NULL);
    406 	if (unlikely(r != 0)) {
    407 		if (r != -ERESTARTSYS) {
    408 			struct virtio_gpu_device *qdev =
    409 				bo->gem_base.dev->dev_private;
    410 			dev_err(qdev->dev, "%p reserve failed\n", bo);
    411 		}
    412 		return r;
    413 	}
    414 	return 0;
    415 }
    416 
    417 static inline void virtio_gpu_object_unreserve(struct virtio_gpu_object *bo)
    418 {
    419 	ttm_bo_unreserve(&bo->tbo);
    420 }
    421 
    422 /* virgl debufs */
    423 int virtio_gpu_debugfs_init(struct drm_minor *minor);
    424 void virtio_gpu_debugfs_takedown(struct drm_minor *minor);
    425 
    426 #endif
    427