root/drivers/gpu/drm/qxl/qxl_drv.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. qxl_bo_physical_address

   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 #ifndef QXL_DRV_H
  27 #define QXL_DRV_H
  28 
  29 /*
  30  * Definitions taken from spice-protocol, plus kernel driver specific bits.
  31  */
  32 
  33 #include <linux/dma-fence.h>
  34 #include <linux/firmware.h>
  35 #include <linux/platform_device.h>
  36 #include <linux/workqueue.h>
  37 
  38 #include <drm/drm_crtc.h>
  39 #include <drm/drm_encoder.h>
  40 #include <drm/drm_fb_helper.h>
  41 #include <drm/drm_ioctl.h>
  42 #include <drm/drm_gem.h>
  43 #include <drm/qxl_drm.h>
  44 #include <drm/ttm/ttm_bo_api.h>
  45 #include <drm/ttm/ttm_bo_driver.h>
  46 #include <drm/ttm/ttm_execbuf_util.h>
  47 #include <drm/ttm/ttm_module.h>
  48 #include <drm/ttm/ttm_placement.h>
  49 
  50 #include "qxl_dev.h"
  51 
  52 #define DRIVER_AUTHOR           "Dave Airlie"
  53 
  54 #define DRIVER_NAME             "qxl"
  55 #define DRIVER_DESC             "RH QXL"
  56 #define DRIVER_DATE             "20120117"
  57 
  58 #define DRIVER_MAJOR 0
  59 #define DRIVER_MINOR 1
  60 #define DRIVER_PATCHLEVEL 0
  61 
  62 #define QXL_DEBUGFS_MAX_COMPONENTS              32
  63 
  64 extern int qxl_num_crtc;
  65 extern int qxl_max_ioctls;
  66 
  67 #define QXL_INTERRUPT_MASK (\
  68         QXL_INTERRUPT_DISPLAY |\
  69         QXL_INTERRUPT_CURSOR |\
  70         QXL_INTERRUPT_IO_CMD |\
  71         QXL_INTERRUPT_CLIENT_MONITORS_CONFIG)
  72 
  73 struct qxl_bo {
  74         struct ttm_buffer_object        tbo;
  75 
  76         /* Protected by gem.mutex */
  77         struct list_head                list;
  78         /* Protected by tbo.reserved */
  79         struct ttm_place                placements[3];
  80         struct ttm_placement            placement;
  81         struct ttm_bo_kmap_obj          kmap;
  82         unsigned int pin_count;
  83         void                            *kptr;
  84         unsigned int                    map_count;
  85         int                             type;
  86 
  87         /* Constant after initialization */
  88         unsigned int is_primary:1; /* is this now a primary surface */
  89         unsigned int is_dumb:1;
  90         struct qxl_bo *shadow;
  91         unsigned int hw_surf_alloc:1;
  92         struct qxl_surface surf;
  93         uint32_t surface_id;
  94         struct qxl_release *surf_create;
  95 };
  96 #define gem_to_qxl_bo(gobj) container_of((gobj), struct qxl_bo, tbo.base)
  97 #define to_qxl_bo(tobj) container_of((tobj), struct qxl_bo, tbo)
  98 
  99 struct qxl_gem {
 100         struct mutex            mutex;
 101         struct list_head        objects;
 102 };
 103 
 104 struct qxl_bo_list {
 105         struct ttm_validate_buffer tv;
 106 };
 107 
 108 struct qxl_crtc {
 109         struct drm_crtc base;
 110         int index;
 111 
 112         struct qxl_bo *cursor_bo;
 113 };
 114 
 115 struct qxl_output {
 116         int index;
 117         struct drm_connector base;
 118         struct drm_encoder enc;
 119 };
 120 
 121 #define to_qxl_crtc(x) container_of(x, struct qxl_crtc, base)
 122 #define drm_connector_to_qxl_output(x) container_of(x, struct qxl_output, base)
 123 #define drm_encoder_to_qxl_output(x) container_of(x, struct qxl_output, enc)
 124 
 125 struct qxl_mman {
 126         struct ttm_bo_device            bdev;
 127 };
 128 
 129 struct qxl_memslot {
 130         int             index;
 131         const char      *name;
 132         uint8_t         generation;
 133         uint64_t        start_phys_addr;
 134         uint64_t        size;
 135         uint64_t        high_bits;
 136         uint64_t        gpu_offset;
 137 };
 138 
 139 enum {
 140         QXL_RELEASE_DRAWABLE,
 141         QXL_RELEASE_SURFACE_CMD,
 142         QXL_RELEASE_CURSOR_CMD,
 143 };
 144 
 145 /* drm_ prefix to differentiate from qxl_release_info in
 146  * spice-protocol/qxl_dev.h */
 147 #define QXL_MAX_RES 96
 148 struct qxl_release {
 149         struct dma_fence base;
 150 
 151         int id;
 152         int type;
 153         struct qxl_bo *release_bo;
 154         uint32_t release_offset;
 155         uint32_t surface_release_id;
 156         struct ww_acquire_ctx ticket;
 157         struct list_head bos;
 158 };
 159 
 160 struct qxl_drm_chunk {
 161         struct list_head head;
 162         struct qxl_bo *bo;
 163 };
 164 
 165 struct qxl_drm_image {
 166         struct qxl_bo *bo;
 167         struct list_head chunk_list;
 168 };
 169 
 170 struct qxl_fb_image {
 171         struct qxl_device *qdev;
 172         uint32_t pseudo_palette[16];
 173         struct fb_image fb_image;
 174         uint32_t visual;
 175 };
 176 
 177 struct qxl_draw_fill {
 178         struct qxl_device *qdev;
 179         struct qxl_rect rect;
 180         uint32_t color;
 181         uint16_t rop;
 182 };
 183 
 184 /*
 185  * Debugfs
 186  */
 187 struct qxl_debugfs {
 188         struct drm_info_list    *files;
 189         unsigned int num_files;
 190 };
 191 
 192 int qxl_debugfs_add_files(struct qxl_device *rdev,
 193                              struct drm_info_list *files,
 194                              unsigned int nfiles);
 195 int qxl_debugfs_fence_init(struct qxl_device *rdev);
 196 
 197 struct qxl_device;
 198 
 199 struct qxl_device {
 200         struct drm_device ddev;
 201 
 202         resource_size_t vram_base, vram_size;
 203         resource_size_t surfaceram_base, surfaceram_size;
 204         resource_size_t rom_base, rom_size;
 205         struct qxl_rom *rom;
 206 
 207         struct qxl_mode *modes;
 208         struct qxl_bo *monitors_config_bo;
 209         struct qxl_monitors_config *monitors_config;
 210 
 211         /* last received client_monitors_config */
 212         struct qxl_monitors_config *client_monitors_config;
 213 
 214         int io_base;
 215         void *ram;
 216         struct qxl_mman         mman;
 217         struct qxl_gem          gem;
 218 
 219         void *ram_physical;
 220 
 221         struct qxl_ring *release_ring;
 222         struct qxl_ring *command_ring;
 223         struct qxl_ring *cursor_ring;
 224 
 225         struct qxl_ram_header *ram_header;
 226 
 227         struct qxl_bo *primary_bo;
 228         struct qxl_bo *dumb_shadow_bo;
 229         struct qxl_head *dumb_heads;
 230 
 231         struct qxl_memslot main_slot;
 232         struct qxl_memslot surfaces_slot;
 233 
 234         spinlock_t      release_lock;
 235         struct idr      release_idr;
 236         uint32_t        release_seqno;
 237         spinlock_t release_idr_lock;
 238         struct mutex    async_io_mutex;
 239         unsigned int last_sent_io_cmd;
 240 
 241         /* interrupt handling */
 242         atomic_t irq_received;
 243         atomic_t irq_received_display;
 244         atomic_t irq_received_cursor;
 245         atomic_t irq_received_io_cmd;
 246         unsigned int irq_received_error;
 247         wait_queue_head_t display_event;
 248         wait_queue_head_t cursor_event;
 249         wait_queue_head_t io_cmd_event;
 250         struct work_struct client_monitors_config_work;
 251 
 252         /* debugfs */
 253         struct qxl_debugfs      debugfs[QXL_DEBUGFS_MAX_COMPONENTS];
 254         unsigned int debugfs_count;
 255 
 256         struct mutex            update_area_mutex;
 257 
 258         struct idr      surf_id_idr;
 259         spinlock_t surf_id_idr_lock;
 260         int last_alloced_surf_id;
 261 
 262         struct mutex surf_evict_mutex;
 263         struct io_mapping *vram_mapping;
 264         struct io_mapping *surface_mapping;
 265 
 266         /* */
 267         struct mutex release_mutex;
 268         struct qxl_bo *current_release_bo[3];
 269         int current_release_bo_offset[3];
 270 
 271         struct work_struct gc_work;
 272 
 273         struct drm_property *hotplug_mode_update_property;
 274         int monitors_config_width;
 275         int monitors_config_height;
 276 };
 277 
 278 extern const struct drm_ioctl_desc qxl_ioctls[];
 279 extern int qxl_max_ioctl;
 280 
 281 int qxl_device_init(struct qxl_device *qdev, struct drm_driver *drv,
 282                     struct pci_dev *pdev);
 283 void qxl_device_fini(struct qxl_device *qdev);
 284 
 285 int qxl_modeset_init(struct qxl_device *qdev);
 286 void qxl_modeset_fini(struct qxl_device *qdev);
 287 
 288 int qxl_bo_init(struct qxl_device *qdev);
 289 void qxl_bo_fini(struct qxl_device *qdev);
 290 
 291 void qxl_reinit_memslots(struct qxl_device *qdev);
 292 int qxl_surf_evict(struct qxl_device *qdev);
 293 int qxl_vram_evict(struct qxl_device *qdev);
 294 
 295 struct qxl_ring *qxl_ring_create(struct qxl_ring_header *header,
 296                                  int element_size,
 297                                  int n_elements,
 298                                  int prod_notify,
 299                                  bool set_prod_notify,
 300                                  wait_queue_head_t *push_event);
 301 void qxl_ring_free(struct qxl_ring *ring);
 302 void qxl_ring_init_hdr(struct qxl_ring *ring);
 303 int qxl_check_idle(struct qxl_ring *ring);
 304 
 305 static inline uint64_t
 306 qxl_bo_physical_address(struct qxl_device *qdev, struct qxl_bo *bo,
 307                         unsigned long offset)
 308 {
 309         struct qxl_memslot *slot =
 310                 (bo->tbo.mem.mem_type == TTM_PL_VRAM)
 311                 ? &qdev->main_slot : &qdev->surfaces_slot;
 312 
 313         WARN_ON_ONCE((bo->tbo.offset & slot->gpu_offset) != slot->gpu_offset);
 314 
 315         /* TODO - need to hold one of the locks to read tbo.offset */
 316         return slot->high_bits | (bo->tbo.offset - slot->gpu_offset + offset);
 317 }
 318 
 319 /* qxl_display.c */
 320 void qxl_display_read_client_monitors_config(struct qxl_device *qdev);
 321 int qxl_create_monitors_object(struct qxl_device *qdev);
 322 int qxl_destroy_monitors_object(struct qxl_device *qdev);
 323 
 324 /* qxl_gem.c */
 325 void qxl_gem_init(struct qxl_device *qdev);
 326 void qxl_gem_fini(struct qxl_device *qdev);
 327 int qxl_gem_object_create(struct qxl_device *qdev, int size,
 328                           int alignment, int initial_domain,
 329                           bool discardable, bool kernel,
 330                           struct qxl_surface *surf,
 331                           struct drm_gem_object **obj);
 332 int qxl_gem_object_create_with_handle(struct qxl_device *qdev,
 333                                       struct drm_file *file_priv,
 334                                       u32 domain,
 335                                       size_t size,
 336                                       struct qxl_surface *surf,
 337                                       struct qxl_bo **qobj,
 338                                       uint32_t *handle);
 339 void qxl_gem_object_free(struct drm_gem_object *gobj);
 340 int qxl_gem_object_open(struct drm_gem_object *obj, struct drm_file *file_priv);
 341 void qxl_gem_object_close(struct drm_gem_object *obj,
 342                           struct drm_file *file_priv);
 343 void qxl_bo_force_delete(struct qxl_device *qdev);
 344 int qxl_bo_kmap(struct qxl_bo *bo, void **ptr);
 345 
 346 /* qxl_dumb.c */
 347 int qxl_mode_dumb_create(struct drm_file *file_priv,
 348                          struct drm_device *dev,
 349                          struct drm_mode_create_dumb *args);
 350 int qxl_mode_dumb_mmap(struct drm_file *filp,
 351                        struct drm_device *dev,
 352                        uint32_t handle, uint64_t *offset_p);
 353 
 354 /* qxl ttm */
 355 int qxl_ttm_init(struct qxl_device *qdev);
 356 void qxl_ttm_fini(struct qxl_device *qdev);
 357 int qxl_mmap(struct file *filp, struct vm_area_struct *vma);
 358 
 359 /* qxl image */
 360 
 361 int qxl_image_init(struct qxl_device *qdev,
 362                    struct qxl_release *release,
 363                    struct qxl_drm_image *dimage,
 364                    const uint8_t *data,
 365                    int x, int y, int width, int height,
 366                    int depth, int stride);
 367 int
 368 qxl_image_alloc_objects(struct qxl_device *qdev,
 369                         struct qxl_release *release,
 370                         struct qxl_drm_image **image_ptr,
 371                         int height, int stride);
 372 void qxl_image_free_objects(struct qxl_device *qdev, struct qxl_drm_image *dimage);
 373 
 374 void qxl_update_screen(struct qxl_device *qxl);
 375 
 376 /* qxl io operations (qxl_cmd.c) */
 377 
 378 void qxl_io_create_primary(struct qxl_device *qdev,
 379                            struct qxl_bo *bo);
 380 void qxl_io_destroy_primary(struct qxl_device *qdev);
 381 void qxl_io_memslot_add(struct qxl_device *qdev, uint8_t id);
 382 void qxl_io_notify_oom(struct qxl_device *qdev);
 383 
 384 int qxl_io_update_area(struct qxl_device *qdev, struct qxl_bo *surf,
 385                        const struct qxl_rect *area);
 386 
 387 void qxl_io_reset(struct qxl_device *qdev);
 388 void qxl_io_monitors_config(struct qxl_device *qdev);
 389 int qxl_ring_push(struct qxl_ring *ring, const void *new_elt, bool interruptible);
 390 void qxl_io_flush_release(struct qxl_device *qdev);
 391 void qxl_io_flush_surfaces(struct qxl_device *qdev);
 392 
 393 union qxl_release_info *qxl_release_map(struct qxl_device *qdev,
 394                                         struct qxl_release *release);
 395 void qxl_release_unmap(struct qxl_device *qdev,
 396                        struct qxl_release *release,
 397                        union qxl_release_info *info);
 398 int qxl_release_list_add(struct qxl_release *release, struct qxl_bo *bo);
 399 int qxl_release_reserve_list(struct qxl_release *release, bool no_intr);
 400 void qxl_release_backoff_reserve_list(struct qxl_release *release);
 401 void qxl_release_fence_buffer_objects(struct qxl_release *release);
 402 
 403 int qxl_alloc_surface_release_reserved(struct qxl_device *qdev,
 404                                        enum qxl_surface_cmd_type surface_cmd_type,
 405                                        struct qxl_release *create_rel,
 406                                        struct qxl_release **release);
 407 int qxl_alloc_release_reserved(struct qxl_device *qdev, unsigned long size,
 408                                int type, struct qxl_release **release,
 409                                struct qxl_bo **rbo);
 410 
 411 int
 412 qxl_push_command_ring_release(struct qxl_device *qdev, struct qxl_release *release,
 413                               uint32_t type, bool interruptible);
 414 int
 415 qxl_push_cursor_ring_release(struct qxl_device *qdev, struct qxl_release *release,
 416                              uint32_t type, bool interruptible);
 417 int qxl_alloc_bo_reserved(struct qxl_device *qdev,
 418                           struct qxl_release *release,
 419                           unsigned long size,
 420                           struct qxl_bo **_bo);
 421 /* qxl drawing commands */
 422 
 423 void qxl_draw_dirty_fb(struct qxl_device *qdev,
 424                        struct drm_framebuffer *fb,
 425                        struct qxl_bo *bo,
 426                        unsigned int flags, unsigned int color,
 427                        struct drm_clip_rect *clips,
 428                        unsigned int num_clips, int inc,
 429                        uint32_t dumb_shadow_offset);
 430 
 431 void qxl_release_free(struct qxl_device *qdev,
 432                       struct qxl_release *release);
 433 
 434 /* used by qxl_debugfs_release */
 435 struct qxl_release *qxl_release_from_id_locked(struct qxl_device *qdev,
 436                                                    uint64_t id);
 437 
 438 bool qxl_queue_garbage_collect(struct qxl_device *qdev, bool flush);
 439 int qxl_garbage_collect(struct qxl_device *qdev);
 440 
 441 /* debugfs */
 442 
 443 int qxl_debugfs_init(struct drm_minor *minor);
 444 int qxl_ttm_debugfs_init(struct qxl_device *qdev);
 445 
 446 /* qxl_prime.c */
 447 int qxl_gem_prime_pin(struct drm_gem_object *obj);
 448 void qxl_gem_prime_unpin(struct drm_gem_object *obj);
 449 struct sg_table *qxl_gem_prime_get_sg_table(struct drm_gem_object *obj);
 450 struct drm_gem_object *qxl_gem_prime_import_sg_table(
 451         struct drm_device *dev, struct dma_buf_attachment *attach,
 452         struct sg_table *sgt);
 453 void *qxl_gem_prime_vmap(struct drm_gem_object *obj);
 454 void qxl_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr);
 455 int qxl_gem_prime_mmap(struct drm_gem_object *obj,
 456                                 struct vm_area_struct *vma);
 457 
 458 /* qxl_irq.c */
 459 int qxl_irq_init(struct qxl_device *qdev);
 460 irqreturn_t qxl_irq_handler(int irq, void *arg);
 461 
 462 int qxl_debugfs_add_files(struct qxl_device *qdev,
 463                           struct drm_info_list *files,
 464                           unsigned int nfiles);
 465 
 466 int qxl_surface_id_alloc(struct qxl_device *qdev,
 467                          struct qxl_bo *surf);
 468 void qxl_surface_id_dealloc(struct qxl_device *qdev,
 469                             uint32_t surface_id);
 470 int qxl_hw_surface_alloc(struct qxl_device *qdev,
 471                          struct qxl_bo *surf);
 472 int qxl_hw_surface_dealloc(struct qxl_device *qdev,
 473                            struct qxl_bo *surf);
 474 
 475 int qxl_bo_check_id(struct qxl_device *qdev, struct qxl_bo *bo);
 476 
 477 struct qxl_drv_surface *
 478 qxl_surface_lookup(struct drm_device *dev, int surface_id);
 479 void qxl_surface_evict(struct qxl_device *qdev, struct qxl_bo *surf, bool freeing);
 480 
 481 #endif

/* [<][>][^][v][top][bottom][index][help] */