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_NUM_OUTPUTS 1 59 60 #define QXL_DEBUGFS_MAX_COMPONENTS 32 61 62 extern int qxl_log_level; 63 64 enum { 65 QXL_INFO_LEVEL = 1, 66 QXL_DEBUG_LEVEL = 2, 67 }; 68 69 #define QXL_INFO(qdev, fmt, ...) do { \ 70 if (qxl_log_level >= QXL_INFO_LEVEL) { \ 71 qxl_io_log(qdev, fmt, __VA_ARGS__); \ 72 } \ 73 } while (0) 74 #define QXL_DEBUG(qdev, fmt, ...) do { \ 75 if (qxl_log_level >= QXL_DEBUG_LEVEL) { \ 76 qxl_io_log(qdev, fmt, __VA_ARGS__); \ 77 } \ 78 } while (0) 79 #define QXL_INFO_ONCE(qdev, fmt, ...) do { \ 80 static int done; \ 81 if (!done) { \ 82 done = 1; \ 83 QXL_INFO(qdev, fmt, __VA_ARGS__); \ 84 } \ 85 } while (0) 86 87 #define DRM_FILE_OFFSET 0x100000000ULL 88 #define DRM_FILE_PAGE_OFFSET (DRM_FILE_OFFSET >> PAGE_SHIFT) 89 90 #define QXL_INTERRUPT_MASK (\ 91 QXL_INTERRUPT_DISPLAY |\ 92 QXL_INTERRUPT_CURSOR |\ 93 QXL_INTERRUPT_IO_CMD |\ 94 QXL_INTERRUPT_CLIENT_MONITORS_CONFIG) 95 96 struct qxl_fence { 97 struct qxl_device *qdev; 98 uint32_t num_active_releases; 99 uint32_t *release_ids; 100 struct radix_tree_root tree; 101 }; 102 103 struct qxl_bo { 104 /* Protected by gem.mutex */ 105 struct list_head list; 106 /* Protected by tbo.reserved */ 107 u32 placements[3]; 108 struct ttm_placement placement; 109 struct ttm_buffer_object tbo; 110 struct ttm_bo_kmap_obj kmap; 111 unsigned pin_count; 112 void *kptr; 113 int type; 114 /* Constant after initialization */ 115 struct drm_gem_object gem_base; 116 bool is_primary; /* is this now a primary surface */ 117 bool hw_surf_alloc; 118 struct qxl_surface surf; 119 uint32_t surface_id; 120 struct qxl_fence fence; /* per bo fence - list of releases */ 121 struct qxl_release *surf_create; 122 atomic_t reserve_count; 123 }; 124 #define gem_to_qxl_bo(gobj) container_of((gobj), struct qxl_bo, gem_base) 125 126 struct qxl_gem { 127 struct mutex mutex; 128 struct list_head objects; 129 }; 130 131 struct qxl_bo_list { 132 struct list_head lhead; 133 struct qxl_bo *bo; 134 }; 135 136 struct qxl_reloc_list { 137 struct list_head bos; 138 }; 139 140 struct qxl_crtc { 141 struct drm_crtc base; 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, base) 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 struct qxl_ring *qxl_ring_create(struct qxl_ring_header *header, 335 int element_size, 336 int n_elements, 337 int prod_notify, 338 bool set_prod_notify, 339 wait_queue_head_t *push_event); 340 void qxl_ring_free(struct qxl_ring *ring); 341 342 static inline void * 343 qxl_fb_virtual_address(struct qxl_device *qdev, unsigned long physical) 344 { 345 QXL_INFO(qdev, "not implemented (%lu)\n", physical); 346 return 0; 347 } 348 349 static inline uint64_t 350 qxl_bo_physical_address(struct qxl_device *qdev, struct qxl_bo *bo, 351 unsigned long offset) 352 { 353 int slot_id = bo->type == QXL_GEM_DOMAIN_VRAM ? qdev->main_mem_slot : qdev->surfaces_mem_slot; 354 struct qxl_memslot *slot = &(qdev->mem_slots[slot_id]); 355 356 /* TODO - need to hold one of the locks to read tbo.offset */ 357 return slot->high_bits | (bo->tbo.offset + offset); 358 } 359 360 /* qxl_fb.c */ 361 #define QXLFB_CONN_LIMIT 1 362 363 int qxl_fbdev_init(struct qxl_device *qdev); 364 void qxl_fbdev_fini(struct qxl_device *qdev); 365 int qxl_get_handle_for_primary_fb(struct qxl_device *qdev, 366 struct drm_file *file_priv, 367 uint32_t *handle); 368 369 /* qxl_display.c */ 370 int 371 qxl_framebuffer_init(struct drm_device *dev, 372 struct qxl_framebuffer *rfb, 373 struct drm_mode_fb_cmd2 *mode_cmd, 374 struct drm_gem_object *obj); 375 void qxl_display_read_client_monitors_config(struct qxl_device *qdev); 376 void qxl_send_monitors_config(struct qxl_device *qdev); 377 378 /* used by qxl_debugfs only */ 379 void qxl_crtc_set_from_monitors_config(struct qxl_device *qdev); 380 void qxl_alloc_client_monitors_config(struct qxl_device *qdev, unsigned count); 381 382 /* qxl_gem.c */ 383 int qxl_gem_init(struct qxl_device *qdev); 384 void qxl_gem_fini(struct qxl_device *qdev); 385 int qxl_gem_object_create(struct qxl_device *qdev, int size, 386 int alignment, int initial_domain, 387 bool discardable, bool kernel, 388 struct qxl_surface *surf, 389 struct drm_gem_object **obj); 390 int qxl_gem_object_pin(struct drm_gem_object *obj, uint32_t pin_domain, 391 uint64_t *gpu_addr); 392 void qxl_gem_object_unpin(struct drm_gem_object *obj); 393 int qxl_gem_object_create_with_handle(struct qxl_device *qdev, 394 struct drm_file *file_priv, 395 u32 domain, 396 size_t size, 397 struct qxl_surface *surf, 398 struct qxl_bo **qobj, 399 uint32_t *handle); 400 int qxl_gem_object_init(struct drm_gem_object *obj); 401 void qxl_gem_object_free(struct drm_gem_object *gobj); 402 int qxl_gem_object_open(struct drm_gem_object *obj, struct drm_file *file_priv); 403 void qxl_gem_object_close(struct drm_gem_object *obj, 404 struct drm_file *file_priv); 405 void qxl_bo_force_delete(struct qxl_device *qdev); 406 int qxl_bo_kmap(struct qxl_bo *bo, void **ptr); 407 408 /* qxl_dumb.c */ 409 int qxl_mode_dumb_create(struct drm_file *file_priv, 410 struct drm_device *dev, 411 struct drm_mode_create_dumb *args); 412 int qxl_mode_dumb_destroy(struct drm_file *file_priv, 413 struct drm_device *dev, 414 uint32_t handle); 415 int qxl_mode_dumb_mmap(struct drm_file *filp, 416 struct drm_device *dev, 417 uint32_t handle, uint64_t *offset_p); 418 419 420 /* qxl ttm */ 421 int qxl_ttm_init(struct qxl_device *qdev); 422 void qxl_ttm_fini(struct qxl_device *qdev); 423 int qxl_mmap(struct file *filp, struct vm_area_struct *vma); 424 425 /* qxl image */ 426 427 int qxl_image_create(struct qxl_device *qdev, 428 struct qxl_release *release, 429 struct qxl_bo **image_bo, 430 const uint8_t *data, 431 int x, int y, int width, int height, 432 int depth, int stride); 433 void qxl_update_screen(struct qxl_device *qxl); 434 435 /* qxl io operations (qxl_cmd.c) */ 436 437 void qxl_io_create_primary(struct qxl_device *qdev, 438 unsigned width, unsigned height, unsigned offset, 439 struct qxl_bo *bo); 440 void qxl_io_destroy_primary(struct qxl_device *qdev); 441 void qxl_io_memslot_add(struct qxl_device *qdev, uint8_t id); 442 void qxl_io_notify_oom(struct qxl_device *qdev); 443 444 int qxl_io_update_area(struct qxl_device *qdev, struct qxl_bo *surf, 445 const struct qxl_rect *area); 446 447 void qxl_io_reset(struct qxl_device *qdev); 448 void qxl_io_monitors_config(struct qxl_device *qdev); 449 int qxl_ring_push(struct qxl_ring *ring, const void *new_elt, bool interruptible); 450 void qxl_io_flush_release(struct qxl_device *qdev); 451 void qxl_io_flush_surfaces(struct qxl_device *qdev); 452 453 int qxl_release_reserve(struct qxl_device *qdev, 454 struct qxl_release *release, bool no_wait); 455 void qxl_release_unreserve(struct qxl_device *qdev, 456 struct qxl_release *release); 457 union qxl_release_info *qxl_release_map(struct qxl_device *qdev, 458 struct qxl_release *release); 459 void qxl_release_unmap(struct qxl_device *qdev, 460 struct qxl_release *release, 461 union qxl_release_info *info); 462 /* 463 * qxl_bo_add_resource. 464 * 465 */ 466 void qxl_bo_add_resource(struct qxl_bo *main_bo, struct qxl_bo *resource); 467 468 int qxl_alloc_surface_release_reserved(struct qxl_device *qdev, 469 enum qxl_surface_cmd_type surface_cmd_type, 470 struct qxl_release *create_rel, 471 struct qxl_release **release); 472 int qxl_alloc_release_reserved(struct qxl_device *qdev, unsigned long size, 473 int type, struct qxl_release **release, 474 struct qxl_bo **rbo); 475 int qxl_fence_releaseable(struct qxl_device *qdev, 476 struct qxl_release *release); 477 int 478 qxl_push_command_ring_release(struct qxl_device *qdev, struct qxl_release *release, 479 uint32_t type, bool interruptible); 480 int 481 qxl_push_cursor_ring_release(struct qxl_device *qdev, struct qxl_release *release, 482 uint32_t type, bool interruptible); 483 int qxl_alloc_bo_reserved(struct qxl_device *qdev, unsigned long size, 484 struct qxl_bo **_bo); 485 /* qxl drawing commands */ 486 487 void qxl_draw_opaque_fb(const struct qxl_fb_image *qxl_fb_image, 488 int stride /* filled in if 0 */); 489 490 void qxl_draw_dirty_fb(struct qxl_device *qdev, 491 struct qxl_framebuffer *qxl_fb, 492 struct qxl_bo *bo, 493 unsigned flags, unsigned color, 494 struct drm_clip_rect *clips, 495 unsigned num_clips, int inc); 496 497 void qxl_draw_fill(struct qxl_draw_fill *qxl_draw_fill_rec); 498 499 void qxl_draw_copyarea(struct qxl_device *qdev, 500 u32 width, u32 height, 501 u32 sx, u32 sy, 502 u32 dx, u32 dy); 503 504 uint64_t 505 qxl_release_alloc(struct qxl_device *qdev, int type, 506 struct qxl_release **ret); 507 508 void qxl_release_free(struct qxl_device *qdev, 509 struct qxl_release *release); 510 void qxl_release_add_res(struct qxl_device *qdev, 511 struct qxl_release *release, 512 struct qxl_bo *bo); 513 /* used by qxl_debugfs_release */ 514 struct qxl_release *qxl_release_from_id_locked(struct qxl_device *qdev, 515 uint64_t id); 516 517 bool qxl_queue_garbage_collect(struct qxl_device *qdev, bool flush); 518 int qxl_garbage_collect(struct qxl_device *qdev); 519 520 /* debugfs */ 521 522 int qxl_debugfs_init(struct drm_minor *minor); 523 void qxl_debugfs_takedown(struct drm_minor *minor); 524 525 /* qxl_irq.c */ 526 int qxl_irq_init(struct qxl_device *qdev); 527 irqreturn_t qxl_irq_handler(DRM_IRQ_ARGS); 528 529 /* qxl_fb.c */ 530 int qxl_fb_init(struct qxl_device *qdev); 531 532 int qxl_debugfs_add_files(struct qxl_device *qdev, 533 struct drm_info_list *files, 534 unsigned nfiles); 535 536 int qxl_surface_id_alloc(struct qxl_device *qdev, 537 struct qxl_bo *surf); 538 void qxl_surface_id_dealloc(struct qxl_device *qdev, 539 uint32_t surface_id); 540 int qxl_hw_surface_alloc(struct qxl_device *qdev, 541 struct qxl_bo *surf, 542 struct ttm_mem_reg *mem); 543 int qxl_hw_surface_dealloc(struct qxl_device *qdev, 544 struct qxl_bo *surf); 545 546 int qxl_bo_check_id(struct qxl_device *qdev, struct qxl_bo *bo); 547 548 struct qxl_drv_surface * 549 qxl_surface_lookup(struct drm_device *dev, int surface_id); 550 void qxl_surface_evict(struct qxl_device *qdev, struct qxl_bo *surf, bool freeing); 551 int qxl_update_surface(struct qxl_device *qdev, struct qxl_bo *surf); 552 553 /* qxl_fence.c */ 554 int qxl_fence_add_release(struct qxl_fence *qfence, uint32_t rel_id); 555 int qxl_fence_remove_release(struct qxl_fence *qfence, uint32_t rel_id); 556 int qxl_fence_init(struct qxl_device *qdev, struct qxl_fence *qfence); 557 void qxl_fence_fini(struct qxl_fence *qfence); 558 559 #endif 560