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