1 /************************************************************************** 2 * 3 * Copyright © 2009 VMware, Inc., Palo Alto, CA., USA 4 * All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the 8 * "Software"), to deal in the Software without restriction, including 9 * without limitation the rights to use, copy, modify, merge, publish, 10 * distribute, sub license, and/or sell copies of the Software, and to 11 * permit persons to whom the Software is furnished to do so, subject to 12 * the following conditions: 13 * 14 * The above copyright notice and this permission notice (including the 15 * next paragraph) shall be included in all copies or substantial portions 16 * of the Software. 17 * 18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 21 * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, 22 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 23 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 24 * USE OR OTHER DEALINGS IN THE SOFTWARE. 25 * 26 **************************************************************************/ 27 28 #ifndef _VMWGFX_DRV_H_ 29 #define _VMWGFX_DRV_H_ 30 31 #include "vmwgfx_reg.h" 32 #include "drmP.h" 33 #include "vmwgfx_drm.h" 34 #include "drm_hashtab.h" 35 #include "ttm/ttm_bo_driver.h" 36 #include "ttm/ttm_object.h" 37 #include "ttm/ttm_lock.h" 38 #include "ttm/ttm_execbuf_util.h" 39 #include "ttm/ttm_module.h" 40 41 #define VMWGFX_DRIVER_DATE "20090724" 42 #define VMWGFX_DRIVER_MAJOR 0 43 #define VMWGFX_DRIVER_MINOR 1 44 #define VMWGFX_DRIVER_PATCHLEVEL 2 45 #define VMWGFX_FILE_PAGE_OFFSET 0x00100000 46 #define VMWGFX_FIFO_STATIC_SIZE (1024*1024) 47 #define VMWGFX_MAX_RELOCATIONS 2048 48 #define VMWGFX_MAX_GMRS 2048 49 50 struct vmw_fpriv { 51 struct drm_master *locked_master; 52 struct ttm_object_file *tfile; 53 }; 54 55 struct vmw_dma_buffer { 56 struct ttm_buffer_object base; 57 struct list_head validate_list; 58 struct list_head gmr_lru; 59 uint32_t gmr_id; 60 bool gmr_bound; 61 uint32_t cur_validate_node; 62 bool on_validate_list; 63 }; 64 65 struct vmw_resource { 66 struct kref kref; 67 struct vmw_private *dev_priv; 68 struct idr *idr; 69 int id; 70 enum ttm_object_type res_type; 71 bool avail; 72 void (*hw_destroy) (struct vmw_resource *res); 73 void (*res_free) (struct vmw_resource *res); 74 75 /* TODO is a generic snooper needed? */ 76 #if 0 77 void (*snoop)(struct vmw_resource *res, 78 struct ttm_object_file *tfile, 79 SVGA3dCmdHeader *header); 80 void *snoop_priv; 81 #endif 82 }; 83 84 struct vmw_cursor_snooper { 85 struct drm_crtc *crtc; 86 size_t age; 87 uint32_t *image; 88 }; 89 90 struct vmw_surface { 91 struct vmw_resource res; 92 uint32_t flags; 93 uint32_t format; 94 uint32_t mip_levels[DRM_VMW_MAX_SURFACE_FACES]; 95 struct drm_vmw_size *sizes; 96 uint32_t num_sizes; 97 98 /* TODO so far just a extra pointer */ 99 struct vmw_cursor_snooper snooper; 100 }; 101 102 struct vmw_fifo_state { 103 unsigned long reserved_size; 104 __le32 *dynamic_buffer; 105 __le32 *static_buffer; 106 __le32 *last_buffer; 107 uint32_t last_data_size; 108 uint32_t last_buffer_size; 109 bool last_buffer_add; 110 unsigned long static_buffer_size; 111 bool using_bounce_buffer; 112 uint32_t capabilities; 113 struct rw_semaphore rwsem; 114 }; 115 116 struct vmw_relocation { 117 SVGAGuestPtr *location; 118 uint32_t index; 119 }; 120 121 struct vmw_sw_context{ 122 struct ida bo_list; 123 uint32_t last_cid; 124 bool cid_valid; 125 uint32_t last_sid; 126 uint32_t sid_translation; 127 bool sid_valid; 128 struct ttm_object_file *tfile; 129 struct list_head validate_nodes; 130 struct vmw_relocation relocs[VMWGFX_MAX_RELOCATIONS]; 131 uint32_t cur_reloc; 132 struct ttm_validate_buffer val_bufs[VMWGFX_MAX_GMRS]; 133 uint32_t cur_val_buf; 134 }; 135 136 struct vmw_legacy_display; 137 struct vmw_overlay; 138 139 struct vmw_master { 140 struct ttm_lock lock; 141 }; 142 143 struct vmw_private { 144 struct ttm_bo_device bdev; 145 struct ttm_bo_global_ref bo_global_ref; 146 struct ttm_global_reference mem_global_ref; 147 148 struct vmw_fifo_state fifo; 149 150 struct drm_device *dev; 151 unsigned long vmw_chipset; 152 unsigned int io_start; 153 uint32_t vram_start; 154 uint32_t vram_size; 155 uint32_t mmio_start; 156 uint32_t mmio_size; 157 uint32_t fb_max_width; 158 uint32_t fb_max_height; 159 __le32 __iomem *mmio_virt; 160 int mmio_mtrr; 161 uint32_t capabilities; 162 uint32_t max_gmr_descriptors; 163 uint32_t max_gmr_ids; 164 struct mutex hw_mutex; 165 166 /* 167 * VGA registers. 168 */ 169 170 uint32_t vga_width; 171 uint32_t vga_height; 172 uint32_t vga_depth; 173 uint32_t vga_bpp; 174 uint32_t vga_pseudo; 175 uint32_t vga_red_mask; 176 uint32_t vga_blue_mask; 177 uint32_t vga_green_mask; 178 179 /* 180 * Framebuffer info. 181 */ 182 183 void *fb_info; 184 struct vmw_legacy_display *ldu_priv; 185 struct vmw_overlay *overlay_priv; 186 187 /* 188 * Context and surface management. 189 */ 190 191 rwlock_t resource_lock; 192 struct idr context_idr; 193 struct idr surface_idr; 194 struct idr stream_idr; 195 196 /* 197 * Block lastclose from racing with firstopen. 198 */ 199 200 struct mutex init_mutex; 201 202 /* 203 * A resource manager for kernel-only surfaces and 204 * contexts. 205 */ 206 207 struct ttm_object_device *tdev; 208 209 /* 210 * Fencing and IRQs. 211 */ 212 213 uint32_t fence_seq; 214 wait_queue_head_t fence_queue; 215 wait_queue_head_t fifo_queue; 216 atomic_t fence_queue_waiters; 217 atomic_t fifo_queue_waiters; 218 uint32_t last_read_sequence; 219 spinlock_t irq_lock; 220 221 /* 222 * Device state 223 */ 224 225 uint32_t traces_state; 226 uint32_t enable_state; 227 uint32_t config_done_state; 228 229 /** 230 * Execbuf 231 */ 232 /** 233 * Protected by the cmdbuf mutex. 234 */ 235 236 struct vmw_sw_context ctx; 237 uint32_t val_seq; 238 struct mutex cmdbuf_mutex; 239 240 /** 241 * GMR management. Protected by the lru spinlock. 242 */ 243 244 struct ida gmr_ida; 245 struct list_head gmr_lru; 246 247 248 /** 249 * Operating mode. 250 */ 251 252 bool stealth; 253 bool is_opened; 254 255 /** 256 * Master management. 257 */ 258 259 struct vmw_master *active_master; 260 struct vmw_master fbdev_master; 261 }; 262 263 static inline struct vmw_private *vmw_priv(struct drm_device *dev) 264 { 265 return (struct vmw_private *)dev->dev_private; 266 } 267 268 static inline struct vmw_fpriv *vmw_fpriv(struct drm_file *file_priv) 269 { 270 return (struct vmw_fpriv *)file_priv->driver_priv; 271 } 272 273 static inline struct vmw_master *vmw_master(struct drm_master *master) 274 { 275 return (struct vmw_master *) master->driver_priv; 276 } 277 278 static inline void vmw_write(struct vmw_private *dev_priv, 279 unsigned int offset, uint32_t value) 280 { 281 outl(offset, dev_priv->io_start + VMWGFX_INDEX_PORT); 282 outl(value, dev_priv->io_start + VMWGFX_VALUE_PORT); 283 } 284 285 static inline uint32_t vmw_read(struct vmw_private *dev_priv, 286 unsigned int offset) 287 { 288 uint32_t val; 289 290 outl(offset, dev_priv->io_start + VMWGFX_INDEX_PORT); 291 val = inl(dev_priv->io_start + VMWGFX_VALUE_PORT); 292 return val; 293 } 294 295 /** 296 * GMR utilities - vmwgfx_gmr.c 297 */ 298 299 extern int vmw_gmr_bind(struct vmw_private *dev_priv, 300 struct ttm_buffer_object *bo); 301 extern void vmw_gmr_unbind(struct vmw_private *dev_priv, int gmr_id); 302 303 /** 304 * Resource utilities - vmwgfx_resource.c 305 */ 306 307 extern struct vmw_resource *vmw_context_alloc(struct vmw_private *dev_priv); 308 extern void vmw_resource_unreference(struct vmw_resource **p_res); 309 extern struct vmw_resource *vmw_resource_reference(struct vmw_resource *res); 310 extern int vmw_context_destroy_ioctl(struct drm_device *dev, void *data, 311 struct drm_file *file_priv); 312 extern int vmw_context_define_ioctl(struct drm_device *dev, void *data, 313 struct drm_file *file_priv); 314 extern int vmw_context_check(struct vmw_private *dev_priv, 315 struct ttm_object_file *tfile, 316 int id); 317 extern void vmw_surface_res_free(struct vmw_resource *res); 318 extern int vmw_surface_init(struct vmw_private *dev_priv, 319 struct vmw_surface *srf, 320 void (*res_free) (struct vmw_resource *res)); 321 extern int vmw_user_surface_lookup_handle(struct vmw_private *dev_priv, 322 struct ttm_object_file *tfile, 323 uint32_t handle, 324 struct vmw_surface **out); 325 extern int vmw_surface_destroy_ioctl(struct drm_device *dev, void *data, 326 struct drm_file *file_priv); 327 extern int vmw_surface_define_ioctl(struct drm_device *dev, void *data, 328 struct drm_file *file_priv); 329 extern int vmw_surface_reference_ioctl(struct drm_device *dev, void *data, 330 struct drm_file *file_priv); 331 extern int vmw_surface_check(struct vmw_private *dev_priv, 332 struct ttm_object_file *tfile, 333 uint32_t handle, int *id); 334 extern void vmw_dmabuf_bo_free(struct ttm_buffer_object *bo); 335 extern int vmw_dmabuf_init(struct vmw_private *dev_priv, 336 struct vmw_dma_buffer *vmw_bo, 337 size_t size, struct ttm_placement *placement, 338 bool interuptable, 339 void (*bo_free) (struct ttm_buffer_object *bo)); 340 extern int vmw_dmabuf_alloc_ioctl(struct drm_device *dev, void *data, 341 struct drm_file *file_priv); 342 extern int vmw_dmabuf_unref_ioctl(struct drm_device *dev, void *data, 343 struct drm_file *file_priv); 344 extern uint32_t vmw_dmabuf_validate_node(struct ttm_buffer_object *bo, 345 uint32_t cur_validate_node); 346 extern void vmw_dmabuf_validate_clear(struct ttm_buffer_object *bo); 347 extern int vmw_user_dmabuf_lookup(struct ttm_object_file *tfile, 348 uint32_t id, struct vmw_dma_buffer **out); 349 extern uint32_t vmw_dmabuf_gmr(struct ttm_buffer_object *bo); 350 extern void vmw_dmabuf_set_gmr(struct ttm_buffer_object *bo, uint32_t id); 351 extern int vmw_gmr_id_alloc(struct vmw_private *dev_priv, uint32_t *p_id); 352 extern int vmw_dmabuf_to_start_of_vram(struct vmw_private *vmw_priv, 353 struct vmw_dma_buffer *bo); 354 extern int vmw_dmabuf_from_vram(struct vmw_private *vmw_priv, 355 struct vmw_dma_buffer *bo); 356 extern int vmw_stream_claim_ioctl(struct drm_device *dev, void *data, 357 struct drm_file *file_priv); 358 extern int vmw_stream_unref_ioctl(struct drm_device *dev, void *data, 359 struct drm_file *file_priv); 360 extern int vmw_user_stream_lookup(struct vmw_private *dev_priv, 361 struct ttm_object_file *tfile, 362 uint32_t *inout_id, 363 struct vmw_resource **out); 364 365 366 /** 367 * Misc Ioctl functionality - vmwgfx_ioctl.c 368 */ 369 370 extern int vmw_getparam_ioctl(struct drm_device *dev, void *data, 371 struct drm_file *file_priv); 372 extern int vmw_fifo_debug_ioctl(struct drm_device *dev, void *data, 373 struct drm_file *file_priv); 374 375 /** 376 * Fifo utilities - vmwgfx_fifo.c 377 */ 378 379 extern int vmw_fifo_init(struct vmw_private *dev_priv, 380 struct vmw_fifo_state *fifo); 381 extern void vmw_fifo_release(struct vmw_private *dev_priv, 382 struct vmw_fifo_state *fifo); 383 extern void *vmw_fifo_reserve(struct vmw_private *dev_priv, uint32_t bytes); 384 extern void vmw_fifo_commit(struct vmw_private *dev_priv, uint32_t bytes); 385 extern int vmw_fifo_send_fence(struct vmw_private *dev_priv, 386 uint32_t *sequence); 387 extern void vmw_fifo_ping_host(struct vmw_private *dev_priv, uint32_t reason); 388 extern int vmw_fifo_mmap(struct file *filp, struct vm_area_struct *vma); 389 390 /** 391 * TTM glue - vmwgfx_ttm_glue.c 392 */ 393 394 extern int vmw_ttm_global_init(struct vmw_private *dev_priv); 395 extern void vmw_ttm_global_release(struct vmw_private *dev_priv); 396 extern int vmw_mmap(struct file *filp, struct vm_area_struct *vma); 397 398 /** 399 * TTM buffer object driver - vmwgfx_buffer.c 400 */ 401 402 extern struct ttm_placement vmw_vram_placement; 403 extern struct ttm_placement vmw_vram_ne_placement; 404 extern struct ttm_placement vmw_sys_placement; 405 extern struct ttm_bo_driver vmw_bo_driver; 406 extern int vmw_dma_quiescent(struct drm_device *dev); 407 408 /** 409 * Command submission - vmwgfx_execbuf.c 410 */ 411 412 extern int vmw_execbuf_ioctl(struct drm_device *dev, void *data, 413 struct drm_file *file_priv); 414 415 /** 416 * IRQs and wating - vmwgfx_irq.c 417 */ 418 419 extern irqreturn_t vmw_irq_handler(DRM_IRQ_ARGS); 420 extern int vmw_wait_fence(struct vmw_private *dev_priv, bool lazy, 421 uint32_t sequence, bool interruptible, 422 unsigned long timeout); 423 extern void vmw_irq_preinstall(struct drm_device *dev); 424 extern int vmw_irq_postinstall(struct drm_device *dev); 425 extern void vmw_irq_uninstall(struct drm_device *dev); 426 extern bool vmw_fence_signaled(struct vmw_private *dev_priv, 427 uint32_t sequence); 428 extern int vmw_fence_wait_ioctl(struct drm_device *dev, void *data, 429 struct drm_file *file_priv); 430 extern int vmw_fallback_wait(struct vmw_private *dev_priv, 431 bool lazy, 432 bool fifo_idle, 433 uint32_t sequence, 434 bool interruptible, 435 unsigned long timeout); 436 437 /** 438 * Kernel framebuffer - vmwgfx_fb.c 439 */ 440 441 int vmw_fb_init(struct vmw_private *vmw_priv); 442 int vmw_fb_close(struct vmw_private *dev_priv); 443 int vmw_fb_off(struct vmw_private *vmw_priv); 444 int vmw_fb_on(struct vmw_private *vmw_priv); 445 446 /** 447 * Kernel modesetting - vmwgfx_kms.c 448 */ 449 450 int vmw_kms_init(struct vmw_private *dev_priv); 451 int vmw_kms_close(struct vmw_private *dev_priv); 452 int vmw_kms_save_vga(struct vmw_private *vmw_priv); 453 int vmw_kms_restore_vga(struct vmw_private *vmw_priv); 454 int vmw_kms_cursor_bypass_ioctl(struct drm_device *dev, void *data, 455 struct drm_file *file_priv); 456 void vmw_kms_cursor_post_execbuf(struct vmw_private *dev_priv); 457 void vmw_kms_cursor_snoop(struct vmw_surface *srf, 458 struct ttm_object_file *tfile, 459 struct ttm_buffer_object *bo, 460 SVGA3dCmdHeader *header); 461 462 /** 463 * Overlay control - vmwgfx_overlay.c 464 */ 465 466 int vmw_overlay_init(struct vmw_private *dev_priv); 467 int vmw_overlay_close(struct vmw_private *dev_priv); 468 int vmw_overlay_ioctl(struct drm_device *dev, void *data, 469 struct drm_file *file_priv); 470 int vmw_overlay_stop_all(struct vmw_private *dev_priv); 471 int vmw_overlay_resume_all(struct vmw_private *dev_priv); 472 int vmw_overlay_pause_all(struct vmw_private *dev_priv); 473 int vmw_overlay_claim(struct vmw_private *dev_priv, uint32_t *out); 474 int vmw_overlay_unref(struct vmw_private *dev_priv, uint32_t stream_id); 475 int vmw_overlay_num_overlays(struct vmw_private *dev_priv); 476 int vmw_overlay_num_free_overlays(struct vmw_private *dev_priv); 477 478 /** 479 * Inline helper functions 480 */ 481 482 static inline void vmw_surface_unreference(struct vmw_surface **srf) 483 { 484 struct vmw_surface *tmp_srf = *srf; 485 struct vmw_resource *res = &tmp_srf->res; 486 *srf = NULL; 487 488 vmw_resource_unreference(&res); 489 } 490 491 static inline struct vmw_surface *vmw_surface_reference(struct vmw_surface *srf) 492 { 493 (void) vmw_resource_reference(&srf->res); 494 return srf; 495 } 496 497 static inline void vmw_dmabuf_unreference(struct vmw_dma_buffer **buf) 498 { 499 struct vmw_dma_buffer *tmp_buf = *buf; 500 struct ttm_buffer_object *bo = &tmp_buf->base; 501 *buf = NULL; 502 503 ttm_bo_unref(&bo); 504 } 505 506 static inline struct vmw_dma_buffer *vmw_dmabuf_reference(struct vmw_dma_buffer *buf) 507 { 508 if (ttm_bo_reference(&buf->base)) 509 return buf; 510 return NULL; 511 } 512 513 #endif 514