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 "linux/suspend.h" 36 #include "ttm/ttm_bo_driver.h" 37 #include "ttm/ttm_object.h" 38 #include "ttm/ttm_lock.h" 39 #include "ttm/ttm_execbuf_util.h" 40 #include "ttm/ttm_module.h" 41 42 #define VMWGFX_DRIVER_DATE "20100927" 43 #define VMWGFX_DRIVER_MAJOR 1 44 #define VMWGFX_DRIVER_MINOR 4 45 #define VMWGFX_DRIVER_PATCHLEVEL 0 46 #define VMWGFX_FILE_PAGE_OFFSET 0x00100000 47 #define VMWGFX_FIFO_STATIC_SIZE (1024*1024) 48 #define VMWGFX_MAX_RELOCATIONS 2048 49 #define VMWGFX_MAX_GMRS 2048 50 #define VMWGFX_MAX_DISPLAYS 16 51 52 #define VMW_PL_GMR TTM_PL_PRIV0 53 #define VMW_PL_FLAG_GMR TTM_PL_FLAG_PRIV0 54 55 struct vmw_fpriv { 56 struct drm_master *locked_master; 57 struct ttm_object_file *tfile; 58 }; 59 60 struct vmw_dma_buffer { 61 struct ttm_buffer_object base; 62 struct list_head validate_list; 63 bool gmr_bound; 64 uint32_t cur_validate_node; 65 bool on_validate_list; 66 }; 67 68 struct vmw_resource { 69 struct kref kref; 70 struct vmw_private *dev_priv; 71 struct idr *idr; 72 int id; 73 enum ttm_object_type res_type; 74 bool avail; 75 void (*hw_destroy) (struct vmw_resource *res); 76 void (*res_free) (struct vmw_resource *res); 77 78 /* TODO is a generic snooper needed? */ 79 #if 0 80 void (*snoop)(struct vmw_resource *res, 81 struct ttm_object_file *tfile, 82 SVGA3dCmdHeader *header); 83 void *snoop_priv; 84 #endif 85 }; 86 87 struct vmw_cursor_snooper { 88 struct drm_crtc *crtc; 89 size_t age; 90 uint32_t *image; 91 }; 92 93 struct vmw_surface { 94 struct vmw_resource res; 95 uint32_t flags; 96 uint32_t format; 97 uint32_t mip_levels[DRM_VMW_MAX_SURFACE_FACES]; 98 struct drm_vmw_size *sizes; 99 uint32_t num_sizes; 100 101 bool scanout; 102 103 /* TODO so far just a extra pointer */ 104 struct vmw_cursor_snooper snooper; 105 }; 106 107 struct vmw_fence_queue { 108 struct list_head head; 109 struct timespec lag; 110 struct timespec lag_time; 111 spinlock_t lock; 112 }; 113 114 struct vmw_fifo_state { 115 unsigned long reserved_size; 116 __le32 *dynamic_buffer; 117 __le32 *static_buffer; 118 __le32 *last_buffer; 119 uint32_t last_data_size; 120 uint32_t last_buffer_size; 121 bool last_buffer_add; 122 unsigned long static_buffer_size; 123 bool using_bounce_buffer; 124 uint32_t capabilities; 125 struct mutex fifo_mutex; 126 struct rw_semaphore rwsem; 127 struct vmw_fence_queue fence_queue; 128 }; 129 130 struct vmw_relocation { 131 SVGAGuestPtr *location; 132 uint32_t index; 133 }; 134 135 struct vmw_sw_context{ 136 struct ida bo_list; 137 uint32_t last_cid; 138 bool cid_valid; 139 uint32_t last_sid; 140 uint32_t sid_translation; 141 bool sid_valid; 142 struct ttm_object_file *tfile; 143 struct list_head validate_nodes; 144 struct vmw_relocation relocs[VMWGFX_MAX_RELOCATIONS]; 145 uint32_t cur_reloc; 146 struct ttm_validate_buffer val_bufs[VMWGFX_MAX_GMRS]; 147 uint32_t cur_val_buf; 148 }; 149 150 struct vmw_legacy_display; 151 struct vmw_overlay; 152 153 struct vmw_master { 154 struct ttm_lock lock; 155 struct mutex fb_surf_mutex; 156 struct list_head fb_surf; 157 }; 158 159 struct vmw_vga_topology_state { 160 uint32_t width; 161 uint32_t height; 162 uint32_t primary; 163 uint32_t pos_x; 164 uint32_t pos_y; 165 }; 166 167 struct vmw_private { 168 struct ttm_bo_device bdev; 169 struct ttm_bo_global_ref bo_global_ref; 170 struct drm_global_reference mem_global_ref; 171 172 struct vmw_fifo_state fifo; 173 174 struct drm_device *dev; 175 unsigned long vmw_chipset; 176 unsigned int io_start; 177 uint32_t vram_start; 178 uint32_t vram_size; 179 uint32_t mmio_start; 180 uint32_t mmio_size; 181 uint32_t fb_max_width; 182 uint32_t fb_max_height; 183 __le32 __iomem *mmio_virt; 184 int mmio_mtrr; 185 uint32_t capabilities; 186 uint32_t max_gmr_descriptors; 187 uint32_t max_gmr_ids; 188 bool has_gmr; 189 struct mutex hw_mutex; 190 191 /* 192 * VGA registers. 193 */ 194 195 struct vmw_vga_topology_state vga_save[VMWGFX_MAX_DISPLAYS]; 196 uint32_t vga_width; 197 uint32_t vga_height; 198 uint32_t vga_depth; 199 uint32_t vga_bpp; 200 uint32_t vga_pseudo; 201 uint32_t vga_red_mask; 202 uint32_t vga_green_mask; 203 uint32_t vga_blue_mask; 204 uint32_t vga_bpl; 205 uint32_t vga_pitchlock; 206 207 uint32_t num_displays; 208 209 /* 210 * Framebuffer info. 211 */ 212 213 void *fb_info; 214 struct vmw_legacy_display *ldu_priv; 215 struct vmw_overlay *overlay_priv; 216 217 /* 218 * Context and surface management. 219 */ 220 221 rwlock_t resource_lock; 222 struct idr context_idr; 223 struct idr surface_idr; 224 struct idr stream_idr; 225 226 /* 227 * Block lastclose from racing with firstopen. 228 */ 229 230 struct mutex init_mutex; 231 232 /* 233 * A resource manager for kernel-only surfaces and 234 * contexts. 235 */ 236 237 struct ttm_object_device *tdev; 238 239 /* 240 * Fencing and IRQs. 241 */ 242 243 atomic_t fence_seq; 244 wait_queue_head_t fence_queue; 245 wait_queue_head_t fifo_queue; 246 atomic_t fence_queue_waiters; 247 atomic_t fifo_queue_waiters; 248 uint32_t last_read_sequence; 249 spinlock_t irq_lock; 250 251 /* 252 * Device state 253 */ 254 255 uint32_t traces_state; 256 uint32_t enable_state; 257 uint32_t config_done_state; 258 259 /** 260 * Execbuf 261 */ 262 /** 263 * Protected by the cmdbuf mutex. 264 */ 265 266 struct vmw_sw_context ctx; 267 uint32_t val_seq; 268 struct mutex cmdbuf_mutex; 269 270 /** 271 * Operating mode. 272 */ 273 274 bool stealth; 275 bool is_opened; 276 bool enable_fb; 277 278 /** 279 * Master management. 280 */ 281 282 struct vmw_master *active_master; 283 struct vmw_master fbdev_master; 284 struct notifier_block pm_nb; 285 bool suspended; 286 287 struct mutex release_mutex; 288 uint32_t num_3d_resources; 289 }; 290 291 static inline struct vmw_private *vmw_priv(struct drm_device *dev) 292 { 293 return (struct vmw_private *)dev->dev_private; 294 } 295 296 static inline struct vmw_fpriv *vmw_fpriv(struct drm_file *file_priv) 297 { 298 return (struct vmw_fpriv *)file_priv->driver_priv; 299 } 300 301 static inline struct vmw_master *vmw_master(struct drm_master *master) 302 { 303 return (struct vmw_master *) master->driver_priv; 304 } 305 306 static inline void vmw_write(struct vmw_private *dev_priv, 307 unsigned int offset, uint32_t value) 308 { 309 outl(offset, dev_priv->io_start + VMWGFX_INDEX_PORT); 310 outl(value, dev_priv->io_start + VMWGFX_VALUE_PORT); 311 } 312 313 static inline uint32_t vmw_read(struct vmw_private *dev_priv, 314 unsigned int offset) 315 { 316 uint32_t val; 317 318 outl(offset, dev_priv->io_start + VMWGFX_INDEX_PORT); 319 val = inl(dev_priv->io_start + VMWGFX_VALUE_PORT); 320 return val; 321 } 322 323 int vmw_3d_resource_inc(struct vmw_private *dev_priv); 324 void vmw_3d_resource_dec(struct vmw_private *dev_priv); 325 326 /** 327 * GMR utilities - vmwgfx_gmr.c 328 */ 329 330 extern int vmw_gmr_bind(struct vmw_private *dev_priv, 331 struct page *pages[], 332 unsigned long num_pages, 333 int gmr_id); 334 extern void vmw_gmr_unbind(struct vmw_private *dev_priv, int gmr_id); 335 336 /** 337 * Resource utilities - vmwgfx_resource.c 338 */ 339 340 extern struct vmw_resource *vmw_context_alloc(struct vmw_private *dev_priv); 341 extern void vmw_resource_unreference(struct vmw_resource **p_res); 342 extern struct vmw_resource *vmw_resource_reference(struct vmw_resource *res); 343 extern int vmw_context_destroy_ioctl(struct drm_device *dev, void *data, 344 struct drm_file *file_priv); 345 extern int vmw_context_define_ioctl(struct drm_device *dev, void *data, 346 struct drm_file *file_priv); 347 extern int vmw_context_check(struct vmw_private *dev_priv, 348 struct ttm_object_file *tfile, 349 int id); 350 extern void vmw_surface_res_free(struct vmw_resource *res); 351 extern int vmw_surface_init(struct vmw_private *dev_priv, 352 struct vmw_surface *srf, 353 void (*res_free) (struct vmw_resource *res)); 354 extern int vmw_user_surface_lookup_handle(struct vmw_private *dev_priv, 355 struct ttm_object_file *tfile, 356 uint32_t handle, 357 struct vmw_surface **out); 358 extern int vmw_surface_destroy_ioctl(struct drm_device *dev, void *data, 359 struct drm_file *file_priv); 360 extern int vmw_surface_define_ioctl(struct drm_device *dev, void *data, 361 struct drm_file *file_priv); 362 extern int vmw_surface_reference_ioctl(struct drm_device *dev, void *data, 363 struct drm_file *file_priv); 364 extern int vmw_surface_check(struct vmw_private *dev_priv, 365 struct ttm_object_file *tfile, 366 uint32_t handle, int *id); 367 extern void vmw_dmabuf_bo_free(struct ttm_buffer_object *bo); 368 extern int vmw_dmabuf_init(struct vmw_private *dev_priv, 369 struct vmw_dma_buffer *vmw_bo, 370 size_t size, struct ttm_placement *placement, 371 bool interuptable, 372 void (*bo_free) (struct ttm_buffer_object *bo)); 373 extern int vmw_dmabuf_alloc_ioctl(struct drm_device *dev, void *data, 374 struct drm_file *file_priv); 375 extern int vmw_dmabuf_unref_ioctl(struct drm_device *dev, void *data, 376 struct drm_file *file_priv); 377 extern uint32_t vmw_dmabuf_validate_node(struct ttm_buffer_object *bo, 378 uint32_t cur_validate_node); 379 extern void vmw_dmabuf_validate_clear(struct ttm_buffer_object *bo); 380 extern int vmw_user_dmabuf_lookup(struct ttm_object_file *tfile, 381 uint32_t id, struct vmw_dma_buffer **out); 382 extern int vmw_dmabuf_to_start_of_vram(struct vmw_private *vmw_priv, 383 struct vmw_dma_buffer *bo); 384 extern int vmw_dmabuf_from_vram(struct vmw_private *vmw_priv, 385 struct vmw_dma_buffer *bo); 386 extern int vmw_stream_claim_ioctl(struct drm_device *dev, void *data, 387 struct drm_file *file_priv); 388 extern int vmw_stream_unref_ioctl(struct drm_device *dev, void *data, 389 struct drm_file *file_priv); 390 extern int vmw_user_stream_lookup(struct vmw_private *dev_priv, 391 struct ttm_object_file *tfile, 392 uint32_t *inout_id, 393 struct vmw_resource **out); 394 395 396 /** 397 * Misc Ioctl functionality - vmwgfx_ioctl.c 398 */ 399 400 extern int vmw_getparam_ioctl(struct drm_device *dev, void *data, 401 struct drm_file *file_priv); 402 extern int vmw_fifo_debug_ioctl(struct drm_device *dev, void *data, 403 struct drm_file *file_priv); 404 405 /** 406 * Fifo utilities - vmwgfx_fifo.c 407 */ 408 409 extern int vmw_fifo_init(struct vmw_private *dev_priv, 410 struct vmw_fifo_state *fifo); 411 extern void vmw_fifo_release(struct vmw_private *dev_priv, 412 struct vmw_fifo_state *fifo); 413 extern void *vmw_fifo_reserve(struct vmw_private *dev_priv, uint32_t bytes); 414 extern void vmw_fifo_commit(struct vmw_private *dev_priv, uint32_t bytes); 415 extern int vmw_fifo_send_fence(struct vmw_private *dev_priv, 416 uint32_t *sequence); 417 extern void vmw_fifo_ping_host(struct vmw_private *dev_priv, uint32_t reason); 418 extern int vmw_fifo_mmap(struct file *filp, struct vm_area_struct *vma); 419 extern bool vmw_fifo_have_3d(struct vmw_private *dev_priv); 420 extern bool vmw_fifo_have_pitchlock(struct vmw_private *dev_priv); 421 422 /** 423 * TTM glue - vmwgfx_ttm_glue.c 424 */ 425 426 extern int vmw_ttm_global_init(struct vmw_private *dev_priv); 427 extern void vmw_ttm_global_release(struct vmw_private *dev_priv); 428 extern int vmw_mmap(struct file *filp, struct vm_area_struct *vma); 429 430 /** 431 * TTM buffer object driver - vmwgfx_buffer.c 432 */ 433 434 extern struct ttm_placement vmw_vram_placement; 435 extern struct ttm_placement vmw_vram_ne_placement; 436 extern struct ttm_placement vmw_vram_sys_placement; 437 extern struct ttm_placement vmw_vram_gmr_placement; 438 extern struct ttm_placement vmw_sys_placement; 439 extern struct ttm_bo_driver vmw_bo_driver; 440 extern int vmw_dma_quiescent(struct drm_device *dev); 441 442 /** 443 * Command submission - vmwgfx_execbuf.c 444 */ 445 446 extern int vmw_execbuf_ioctl(struct drm_device *dev, void *data, 447 struct drm_file *file_priv); 448 449 /** 450 * IRQs and wating - vmwgfx_irq.c 451 */ 452 453 extern irqreturn_t vmw_irq_handler(DRM_IRQ_ARGS); 454 extern int vmw_wait_fence(struct vmw_private *dev_priv, bool lazy, 455 uint32_t sequence, bool interruptible, 456 unsigned long timeout); 457 extern void vmw_irq_preinstall(struct drm_device *dev); 458 extern int vmw_irq_postinstall(struct drm_device *dev); 459 extern void vmw_irq_uninstall(struct drm_device *dev); 460 extern bool vmw_fence_signaled(struct vmw_private *dev_priv, 461 uint32_t sequence); 462 extern int vmw_fence_wait_ioctl(struct drm_device *dev, void *data, 463 struct drm_file *file_priv); 464 extern int vmw_fallback_wait(struct vmw_private *dev_priv, 465 bool lazy, 466 bool fifo_idle, 467 uint32_t sequence, 468 bool interruptible, 469 unsigned long timeout); 470 extern void vmw_update_sequence(struct vmw_private *dev_priv, 471 struct vmw_fifo_state *fifo_state); 472 473 474 /** 475 * Rudimentary fence objects currently used only for throttling - 476 * vmwgfx_fence.c 477 */ 478 479 extern void vmw_fence_queue_init(struct vmw_fence_queue *queue); 480 extern void vmw_fence_queue_takedown(struct vmw_fence_queue *queue); 481 extern int vmw_fence_push(struct vmw_fence_queue *queue, 482 uint32_t sequence); 483 extern int vmw_fence_pull(struct vmw_fence_queue *queue, 484 uint32_t signaled_sequence); 485 extern int vmw_wait_lag(struct vmw_private *dev_priv, 486 struct vmw_fence_queue *queue, uint32_t us); 487 488 /** 489 * Kernel framebuffer - vmwgfx_fb.c 490 */ 491 492 int vmw_fb_init(struct vmw_private *vmw_priv); 493 int vmw_fb_close(struct vmw_private *dev_priv); 494 int vmw_fb_off(struct vmw_private *vmw_priv); 495 int vmw_fb_on(struct vmw_private *vmw_priv); 496 497 /** 498 * Kernel modesetting - vmwgfx_kms.c 499 */ 500 501 int vmw_kms_init(struct vmw_private *dev_priv); 502 int vmw_kms_close(struct vmw_private *dev_priv); 503 int vmw_kms_save_vga(struct vmw_private *vmw_priv); 504 int vmw_kms_restore_vga(struct vmw_private *vmw_priv); 505 int vmw_kms_cursor_bypass_ioctl(struct drm_device *dev, void *data, 506 struct drm_file *file_priv); 507 void vmw_kms_cursor_post_execbuf(struct vmw_private *dev_priv); 508 void vmw_kms_cursor_snoop(struct vmw_surface *srf, 509 struct ttm_object_file *tfile, 510 struct ttm_buffer_object *bo, 511 SVGA3dCmdHeader *header); 512 void vmw_kms_write_svga(struct vmw_private *vmw_priv, 513 unsigned width, unsigned height, unsigned pitch, 514 unsigned bbp, unsigned depth); 515 int vmw_kms_update_layout_ioctl(struct drm_device *dev, void *data, 516 struct drm_file *file_priv); 517 void vmw_kms_idle_workqueues(struct vmw_master *vmaster); 518 bool vmw_kms_validate_mode_vram(struct vmw_private *dev_priv, 519 uint32_t pitch, 520 uint32_t height); 521 u32 vmw_get_vblank_counter(struct drm_device *dev, int crtc); 522 523 /** 524 * Overlay control - vmwgfx_overlay.c 525 */ 526 527 int vmw_overlay_init(struct vmw_private *dev_priv); 528 int vmw_overlay_close(struct vmw_private *dev_priv); 529 int vmw_overlay_ioctl(struct drm_device *dev, void *data, 530 struct drm_file *file_priv); 531 int vmw_overlay_stop_all(struct vmw_private *dev_priv); 532 int vmw_overlay_resume_all(struct vmw_private *dev_priv); 533 int vmw_overlay_pause_all(struct vmw_private *dev_priv); 534 int vmw_overlay_claim(struct vmw_private *dev_priv, uint32_t *out); 535 int vmw_overlay_unref(struct vmw_private *dev_priv, uint32_t stream_id); 536 int vmw_overlay_num_overlays(struct vmw_private *dev_priv); 537 int vmw_overlay_num_free_overlays(struct vmw_private *dev_priv); 538 539 /** 540 * GMR Id manager 541 */ 542 543 extern const struct ttm_mem_type_manager_func vmw_gmrid_manager_func; 544 545 /** 546 * Inline helper functions 547 */ 548 549 static inline void vmw_surface_unreference(struct vmw_surface **srf) 550 { 551 struct vmw_surface *tmp_srf = *srf; 552 struct vmw_resource *res = &tmp_srf->res; 553 *srf = NULL; 554 555 vmw_resource_unreference(&res); 556 } 557 558 static inline struct vmw_surface *vmw_surface_reference(struct vmw_surface *srf) 559 { 560 (void) vmw_resource_reference(&srf->res); 561 return srf; 562 } 563 564 static inline void vmw_dmabuf_unreference(struct vmw_dma_buffer **buf) 565 { 566 struct vmw_dma_buffer *tmp_buf = *buf; 567 struct ttm_buffer_object *bo = &tmp_buf->base; 568 *buf = NULL; 569 570 ttm_bo_unref(&bo); 571 } 572 573 static inline struct vmw_dma_buffer *vmw_dmabuf_reference(struct vmw_dma_buffer *buf) 574 { 575 if (ttm_bo_reference(&buf->base)) 576 return buf; 577 return NULL; 578 } 579 580 #endif 581