1 /* 2 * Copyright 2013 Red Hat Inc. 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice shall be included in 12 * all copies or substantial portions of the Software. 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 * OTHER DEALINGS IN THE SOFTWARE. 21 * 22 * Authors: Dave Airlie 23 * Alon Levy 24 */ 25 26 27 #ifndef QXL_DRV_H 28 #define QXL_DRV_H 29 30 /* 31 * Definitions taken from spice-protocol, plus kernel driver specific bits. 32 */ 33 34 #include <linux/workqueue.h> 35 #include <linux/firmware.h> 36 #include <linux/platform_device.h> 37 38 #include "drmP.h" 39 #include "drm_crtc.h" 40 #include <ttm/ttm_bo_api.h> 41 #include <ttm/ttm_bo_driver.h> 42 #include <ttm/ttm_placement.h> 43 #include <ttm/ttm_module.h> 44 45 #include <drm/qxl_drm.h> 46 #include "qxl_dev.h" 47 48 #define DRIVER_AUTHOR "Dave Airlie" 49 50 #define DRIVER_NAME "qxl" 51 #define DRIVER_DESC "RH QXL" 52 #define DRIVER_DATE "20120117" 53 54 #define DRIVER_MAJOR 0 55 #define DRIVER_MINOR 1 56 #define DRIVER_PATCHLEVEL 0 57 58 #define QXL_DEBUGFS_MAX_COMPONENTS 32 59 60 extern int qxl_log_level; 61 extern int qxl_num_crtc; 62 63 enum { 64 QXL_INFO_LEVEL = 1, 65 QXL_DEBUG_LEVEL = 2, 66 }; 67 68 #define QXL_INFO(qdev, fmt, ...) do { \ 69 if (qxl_log_level >= QXL_INFO_LEVEL) { \ 70 qxl_io_log(qdev, fmt, __VA_ARGS__); \ 71 } \ 72 } while (0) 73 #define QXL_DEBUG(qdev, fmt, ...) do { \ 74 if (qxl_log_level >= QXL_DEBUG_LEVEL) { \ 75 qxl_io_log(qdev, fmt, __VA_ARGS__); \ 76 } \ 77 } while (0) 78 #define QXL_INFO_ONCE(qdev, fmt, ...) do { \ 79 static int done; \ 80 if (!done) { \ 81 done = 1; \ 82 QXL_INFO(qdev, fmt, __VA_ARGS__); \ 83 } \ 84 } while (0) 85 86 #define DRM_FILE_OFFSET 0x100000000ULL 87 #define DRM_FILE_PAGE_OFFSET (DRM_FILE_OFFSET >> PAGE_SHIFT) 88 89 #define QXL_INTERRUPT_MASK (\ 90 QXL_INTERRUPT_DISPLAY |\ 91 QXL_INTERRUPT_CURSOR |\ 92 QXL_INTERRUPT_IO_CMD |\ 93 QXL_INTERRUPT_CLIENT_MONITORS_CONFIG) 94 95 struct qxl_fence { 96 struct qxl_device *qdev; 97 uint32_t num_active_releases; 98 uint32_t *release_ids; 99 struct radix_tree_root tree; 100 }; 101 102 struct qxl_bo { 103 /* Protected by gem.mutex */ 104 struct list_head list; 105 /* Protected by tbo.reserved */ 106 u32 placements[3]; 107 struct ttm_placement placement; 108 struct ttm_buffer_object tbo; 109 struct ttm_bo_kmap_obj kmap; 110 unsigned pin_count; 111 void *kptr; 112 int type; 113 /* Constant after initialization */ 114 struct drm_gem_object gem_base; 115 bool is_primary; /* is this now a primary surface */ 116 bool hw_surf_alloc; 117 struct qxl_surface surf; 118 uint32_t surface_id; 119 struct qxl_fence fence; /* per bo fence - list of releases */ 120 struct qxl_release *surf_create; 121 atomic_t reserve_count; 122 }; 123 #define gem_to_qxl_bo(gobj) container_of((gobj), struct qxl_bo, gem_base) 124 125 struct qxl_gem { 126 struct mutex mutex; 127 struct list_head objects; 128 }; 129 130 struct qxl_bo_list { 131 struct list_head lhead; 132 struct qxl_bo *bo; 133 }; 134 135 struct qxl_reloc_list { 136 struct list_head bos; 137 }; 138 139 struct qxl_crtc { 140 struct drm_crtc base; 141 int index; 142 int cur_x; 143 int cur_y; 144 }; 145 146 struct qxl_output { 147 int index; 148 struct drm_connector base; 149 struct drm_encoder enc; 150 }; 151 152 struct qxl_framebuffer { 153 struct drm_framebuffer base; 154 struct drm_gem_object *obj; 155 }; 156 157 #define to_qxl_crtc(x) container_of(x, struct qxl_crtc, base) 158 #define drm_connector_to_qxl_output(x) container_of(x, struct qxl_output, base) 159 #define drm_encoder_to_qxl_output(x) container_of(x, struct qxl_output, enc) 160 #define to_qxl_framebuffer(x) container_of(x, struct qxl_framebuffer, base) 161 162 struct qxl_mman { 163 struct ttm_bo_global_ref bo_global_ref; 164 struct drm_global_reference mem_global_ref; 165 bool mem_global_referenced; 166 struct ttm_bo_device bdev; 167 }; 168 169 struct qxl_mode_info { 170 int num_modes; 171 struct qxl_mode *modes; 172 bool mode_config_initialized; 173 174 /* pointer to fbdev info structure */ 175 struct qxl_fbdev *qfbdev; 176 }; 177 178 179 struct qxl_memslot { 180 uint8_t generation; 181 uint64_t start_phys_addr; 182 uint64_t end_phys_addr; 183 uint64_t high_bits; 184 }; 185 186 enum { 187 QXL_RELEASE_DRAWABLE, 188 QXL_RELEASE_SURFACE_CMD, 189 QXL_RELEASE_CURSOR_CMD, 190 }; 191 192 /* drm_ prefix to differentiate from qxl_release_info in 193 * spice-protocol/qxl_dev.h */ 194 #define QXL_MAX_RES 96 195 struct qxl_release { 196 int id; 197 int type; 198 int bo_count; 199 uint32_t release_offset; 200 uint32_t surface_release_id; 201 struct qxl_bo *bos[QXL_MAX_RES]; 202 }; 203 204 struct qxl_fb_image { 205 struct qxl_device *qdev; 206 uint32_t pseudo_palette[16]; 207 struct fb_image fb_image; 208 uint32_t visual; 209 }; 210 211 struct qxl_draw_fill { 212 struct qxl_device *qdev; 213 struct qxl_rect rect; 214 uint32_t color; 215 uint16_t rop; 216 }; 217 218 /* 219 * Debugfs 220 */ 221 struct qxl_debugfs { 222 struct drm_info_list *files; 223 unsigned num_files; 224 }; 225 226 int qxl_debugfs_add_files(struct qxl_device *rdev, 227 struct drm_info_list *files, 228 unsigned nfiles); 229 int qxl_debugfs_fence_init(struct qxl_device *rdev); 230 void qxl_debugfs_remove_files(struct qxl_device *qdev); 231 232 struct qxl_device; 233 234 struct qxl_device { 235 struct device *dev; 236 struct drm_device *ddev; 237 struct pci_dev *pdev; 238 unsigned long flags; 239 240 resource_size_t vram_base, vram_size; 241 resource_size_t surfaceram_base, surfaceram_size; 242 resource_size_t rom_base, rom_size; 243 struct qxl_rom *rom; 244 245 struct qxl_mode *modes; 246 struct qxl_bo *monitors_config_bo; 247 struct qxl_monitors_config *monitors_config; 248 249 /* last received client_monitors_config */ 250 struct qxl_monitors_config *client_monitors_config; 251 252 int io_base; 253 void *ram; 254 struct qxl_mman mman; 255 struct qxl_gem gem; 256 struct qxl_mode_info mode_info; 257 258 struct fb_info *fbdev_info; 259 struct qxl_framebuffer *fbdev_qfb; 260 void *ram_physical; 261 262 struct qxl_ring *release_ring; 263 struct qxl_ring *command_ring; 264 struct qxl_ring *cursor_ring; 265 266 struct qxl_ram_header *ram_header; 267 268 bool primary_created; 269 270 struct qxl_memslot *mem_slots; 271 uint8_t n_mem_slots; 272 273 uint8_t main_mem_slot; 274 uint8_t surfaces_mem_slot; 275 uint8_t slot_id_bits; 276 uint8_t slot_gen_bits; 277 uint64_t va_slot_mask; 278 279 struct idr release_idr; 280 spinlock_t release_idr_lock; 281 struct mutex async_io_mutex; 282 unsigned int last_sent_io_cmd; 283 284 /* interrupt handling */ 285 atomic_t irq_received; 286 atomic_t irq_received_display; 287 atomic_t irq_received_cursor; 288 atomic_t irq_received_io_cmd; 289 unsigned irq_received_error; 290 wait_queue_head_t display_event; 291 wait_queue_head_t cursor_event; 292 wait_queue_head_t io_cmd_event; 293 struct work_struct client_monitors_config_work; 294 295 /* debugfs */ 296 struct qxl_debugfs debugfs[QXL_DEBUGFS_MAX_COMPONENTS]; 297 unsigned debugfs_count; 298 299 struct mutex update_area_mutex; 300 301 struct idr surf_id_idr; 302 spinlock_t surf_id_idr_lock; 303 int last_alloced_surf_id; 304 305 struct mutex surf_evict_mutex; 306 struct io_mapping *vram_mapping; 307 struct io_mapping *surface_mapping; 308 309 /* */ 310 struct mutex release_mutex; 311 struct qxl_bo *current_release_bo[3]; 312 int current_release_bo_offset[3]; 313 314 struct workqueue_struct *gc_queue; 315 struct work_struct gc_work; 316 317 }; 318 319 /* forward declaration for QXL_INFO_IO */ 320 void qxl_io_log(struct qxl_device *qdev, const char *fmt, ...); 321 322 extern struct drm_ioctl_desc qxl_ioctls[]; 323 extern int qxl_max_ioctl; 324 325 int qxl_driver_load(struct drm_device *dev, unsigned long flags); 326 int qxl_driver_unload(struct drm_device *dev); 327 328 int qxl_modeset_init(struct qxl_device *qdev); 329 void qxl_modeset_fini(struct qxl_device *qdev); 330 331 int qxl_bo_init(struct qxl_device *qdev); 332 void qxl_bo_fini(struct qxl_device *qdev); 333 334 void qxl_reinit_memslots(struct qxl_device *qdev); 335 int qxl_surf_evict(struct qxl_device *qdev); 336 int qxl_vram_evict(struct qxl_device *qdev); 337 338 struct qxl_ring *qxl_ring_create(struct qxl_ring_header *header, 339 int element_size, 340 int n_elements, 341 int prod_notify, 342 bool set_prod_notify, 343 wait_queue_head_t *push_event); 344 void qxl_ring_free(struct qxl_ring *ring); 345 void qxl_ring_init_hdr(struct qxl_ring *ring); 346 int qxl_check_idle(struct qxl_ring *ring); 347 348 static inline void * 349 qxl_fb_virtual_address(struct qxl_device *qdev, unsigned long physical) 350 { 351 QXL_INFO(qdev, "not implemented (%lu)\n", physical); 352 return 0; 353 } 354 355 static inline uint64_t 356 qxl_bo_physical_address(struct qxl_device *qdev, struct qxl_bo *bo, 357 unsigned long offset) 358 { 359 int slot_id = bo->type == QXL_GEM_DOMAIN_VRAM ? qdev->main_mem_slot : qdev->surfaces_mem_slot; 360 struct qxl_memslot *slot = &(qdev->mem_slots[slot_id]); 361 362 /* TODO - need to hold one of the locks to read tbo.offset */ 363 return slot->high_bits | (bo->tbo.offset + offset); 364 } 365 366 /* qxl_fb.c */ 367 #define QXLFB_CONN_LIMIT 1 368 369 int qxl_fbdev_init(struct qxl_device *qdev); 370 void qxl_fbdev_fini(struct qxl_device *qdev); 371 int qxl_get_handle_for_primary_fb(struct qxl_device *qdev, 372 struct drm_file *file_priv, 373 uint32_t *handle); 374 void qxl_fbdev_set_suspend(struct qxl_device *qdev, int state); 375 376 /* qxl_display.c */ 377 int 378 qxl_framebuffer_init(struct drm_device *dev, 379 struct qxl_framebuffer *rfb, 380 struct drm_mode_fb_cmd2 *mode_cmd, 381 struct drm_gem_object *obj); 382 void qxl_display_read_client_monitors_config(struct qxl_device *qdev); 383 void qxl_send_monitors_config(struct qxl_device *qdev); 384 int qxl_create_monitors_object(struct qxl_device *qdev); 385 int qxl_destroy_monitors_object(struct qxl_device *qdev); 386 387 /* used by qxl_debugfs only */ 388 void qxl_crtc_set_from_monitors_config(struct qxl_device *qdev); 389 void qxl_alloc_client_monitors_config(struct qxl_device *qdev, unsigned count); 390 391 /* qxl_gem.c */ 392 int qxl_gem_init(struct qxl_device *qdev); 393 void qxl_gem_fini(struct qxl_device *qdev); 394 int qxl_gem_object_create(struct qxl_device *qdev, int size, 395 int alignment, int initial_domain, 396 bool discardable, bool kernel, 397 struct qxl_surface *surf, 398 struct drm_gem_object **obj); 399 int qxl_gem_object_pin(struct drm_gem_object *obj, uint32_t pin_domain, 400 uint64_t *gpu_addr); 401 void qxl_gem_object_unpin(struct drm_gem_object *obj); 402 int qxl_gem_object_create_with_handle(struct qxl_device *qdev, 403 struct drm_file *file_priv, 404 u32 domain, 405 size_t size, 406 struct qxl_surface *surf, 407 struct qxl_bo **qobj, 408 uint32_t *handle); 409 int qxl_gem_object_init(struct drm_gem_object *obj); 410 void qxl_gem_object_free(struct drm_gem_object *gobj); 411 int qxl_gem_object_open(struct drm_gem_object *obj, struct drm_file *file_priv); 412 void qxl_gem_object_close(struct drm_gem_object *obj, 413 struct drm_file *file_priv); 414 void qxl_bo_force_delete(struct qxl_device *qdev); 415 int qxl_bo_kmap(struct qxl_bo *bo, void **ptr); 416 417 /* qxl_dumb.c */ 418 int qxl_mode_dumb_create(struct drm_file *file_priv, 419 struct drm_device *dev, 420 struct drm_mode_create_dumb *args); 421 int qxl_mode_dumb_destroy(struct drm_file *file_priv, 422 struct drm_device *dev, 423 uint32_t handle); 424 int qxl_mode_dumb_mmap(struct drm_file *filp, 425 struct drm_device *dev, 426 uint32_t handle, uint64_t *offset_p); 427 428 429 /* qxl ttm */ 430 int qxl_ttm_init(struct qxl_device *qdev); 431 void qxl_ttm_fini(struct qxl_device *qdev); 432 int qxl_mmap(struct file *filp, struct vm_area_struct *vma); 433 434 /* qxl image */ 435 436 int qxl_image_create(struct qxl_device *qdev, 437 struct qxl_release *release, 438 struct qxl_bo **image_bo, 439 const uint8_t *data, 440 int x, int y, int width, int height, 441 int depth, int stride); 442 void qxl_update_screen(struct qxl_device *qxl); 443 444 /* qxl io operations (qxl_cmd.c) */ 445 446 void qxl_io_create_primary(struct qxl_device *qdev, 447 unsigned offset, 448 struct qxl_bo *bo); 449 void qxl_io_destroy_primary(struct qxl_device *qdev); 450 void qxl_io_memslot_add(struct qxl_device *qdev, uint8_t id); 451 void qxl_io_notify_oom(struct qxl_device *qdev); 452 453 int qxl_io_update_area(struct qxl_device *qdev, struct qxl_bo *surf, 454 const struct qxl_rect *area); 455 456 void qxl_io_reset(struct qxl_device *qdev); 457 void qxl_io_monitors_config(struct qxl_device *qdev); 458 int qxl_ring_push(struct qxl_ring *ring, const void *new_elt, bool interruptible); 459 void qxl_io_flush_release(struct qxl_device *qdev); 460 void qxl_io_flush_surfaces(struct qxl_device *qdev); 461 462 int qxl_release_reserve(struct qxl_device *qdev, 463 struct qxl_release *release, bool no_wait); 464 void qxl_release_unreserve(struct qxl_device *qdev, 465 struct qxl_release *release); 466 union qxl_release_info *qxl_release_map(struct qxl_device *qdev, 467 struct qxl_release *release); 468 void qxl_release_unmap(struct qxl_device *qdev, 469 struct qxl_release *release, 470 union qxl_release_info *info); 471 /* 472 * qxl_bo_add_resource. 473 * 474 */ 475 void qxl_bo_add_resource(struct qxl_bo *main_bo, struct qxl_bo *resource); 476 477 int qxl_alloc_surface_release_reserved(struct qxl_device *qdev, 478 enum qxl_surface_cmd_type surface_cmd_type, 479 struct qxl_release *create_rel, 480 struct qxl_release **release); 481 int qxl_alloc_release_reserved(struct qxl_device *qdev, unsigned long size, 482 int type, struct qxl_release **release, 483 struct qxl_bo **rbo); 484 int qxl_fence_releaseable(struct qxl_device *qdev, 485 struct qxl_release *release); 486 int 487 qxl_push_command_ring_release(struct qxl_device *qdev, struct qxl_release *release, 488 uint32_t type, bool interruptible); 489 int 490 qxl_push_cursor_ring_release(struct qxl_device *qdev, struct qxl_release *release, 491 uint32_t type, bool interruptible); 492 int qxl_alloc_bo_reserved(struct qxl_device *qdev, unsigned long size, 493 struct qxl_bo **_bo); 494 /* qxl drawing commands */ 495 496 void qxl_draw_opaque_fb(const struct qxl_fb_image *qxl_fb_image, 497 int stride /* filled in if 0 */); 498 499 void qxl_draw_dirty_fb(struct qxl_device *qdev, 500 struct qxl_framebuffer *qxl_fb, 501 struct qxl_bo *bo, 502 unsigned flags, unsigned color, 503 struct drm_clip_rect *clips, 504 unsigned num_clips, int inc); 505 506 void qxl_draw_fill(struct qxl_draw_fill *qxl_draw_fill_rec); 507 508 void qxl_draw_copyarea(struct qxl_device *qdev, 509 u32 width, u32 height, 510 u32 sx, u32 sy, 511 u32 dx, u32 dy); 512 513 uint64_t 514 qxl_release_alloc(struct qxl_device *qdev, int type, 515 struct qxl_release **ret); 516 517 void qxl_release_free(struct qxl_device *qdev, 518 struct qxl_release *release); 519 void qxl_release_add_res(struct qxl_device *qdev, 520 struct qxl_release *release, 521 struct qxl_bo *bo); 522 /* used by qxl_debugfs_release */ 523 struct qxl_release *qxl_release_from_id_locked(struct qxl_device *qdev, 524 uint64_t id); 525 526 bool qxl_queue_garbage_collect(struct qxl_device *qdev, bool flush); 527 int qxl_garbage_collect(struct qxl_device *qdev); 528 529 /* debugfs */ 530 531 int qxl_debugfs_init(struct drm_minor *minor); 532 void qxl_debugfs_takedown(struct drm_minor *minor); 533 534 /* qxl_irq.c */ 535 int qxl_irq_init(struct qxl_device *qdev); 536 irqreturn_t qxl_irq_handler(DRM_IRQ_ARGS); 537 538 /* qxl_fb.c */ 539 int qxl_fb_init(struct qxl_device *qdev); 540 bool qxl_fbdev_qobj_is_fb(struct qxl_device *qdev, struct qxl_bo *qobj); 541 542 int qxl_debugfs_add_files(struct qxl_device *qdev, 543 struct drm_info_list *files, 544 unsigned nfiles); 545 546 int qxl_surface_id_alloc(struct qxl_device *qdev, 547 struct qxl_bo *surf); 548 void qxl_surface_id_dealloc(struct qxl_device *qdev, 549 uint32_t surface_id); 550 int qxl_hw_surface_alloc(struct qxl_device *qdev, 551 struct qxl_bo *surf, 552 struct ttm_mem_reg *mem); 553 int qxl_hw_surface_dealloc(struct qxl_device *qdev, 554 struct qxl_bo *surf); 555 556 int qxl_bo_check_id(struct qxl_device *qdev, struct qxl_bo *bo); 557 558 struct qxl_drv_surface * 559 qxl_surface_lookup(struct drm_device *dev, int surface_id); 560 void qxl_surface_evict(struct qxl_device *qdev, struct qxl_bo *surf, bool freeing); 561 int qxl_update_surface(struct qxl_device *qdev, struct qxl_bo *surf); 562 563 /* qxl_fence.c */ 564 int qxl_fence_add_release(struct qxl_fence *qfence, uint32_t rel_id); 565 int qxl_fence_remove_release(struct qxl_fence *qfence, uint32_t rel_id); 566 int qxl_fence_init(struct qxl_device *qdev, struct qxl_fence *qfence); 567 void qxl_fence_fini(struct qxl_fence *qfence); 568 569 #endif 570