linux/drivers/gpu/drm/udl/udl_drv.h
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2012 Red Hat
   3 *
   4 * based in parts on udlfb.c:
   5 * Copyright (C) 2009 Roberto De Ioris <roberto@unbit.it>
   6 * Copyright (C) 2009 Jaya Kumar <jayakumar.lkml@gmail.com>
   7 * Copyright (C) 2009 Bernie Thompson <bernie@plugable.com>
   8 *
   9 * This file is subject to the terms and conditions of the GNU General Public
  10 * License v2. See the file COPYING in the main directory of this archive for
  11 * more details.
  12 */
  13
  14#ifndef UDL_DRV_H
  15#define UDL_DRV_H
  16
  17#include <linux/usb.h>
  18#include <drm/drm_gem.h>
  19
  20#define DRIVER_NAME             "udl"
  21#define DRIVER_DESC             "DisplayLink"
  22#define DRIVER_DATE             "20120220"
  23
  24#define DRIVER_MAJOR            0
  25#define DRIVER_MINOR            0
  26#define DRIVER_PATCHLEVEL       1
  27
  28struct udl_device;
  29
  30struct urb_node {
  31        struct list_head entry;
  32        struct udl_device *dev;
  33        struct delayed_work release_urb_work;
  34        struct urb *urb;
  35};
  36
  37struct urb_list {
  38        struct list_head list;
  39        spinlock_t lock;
  40        struct semaphore limit_sem;
  41        int available;
  42        int count;
  43        size_t size;
  44};
  45
  46struct udl_fbdev;
  47
  48struct udl_device {
  49        struct device *dev;
  50        struct drm_device *ddev;
  51        struct usb_device *udev;
  52
  53        int sku_pixel_limit;
  54
  55        struct urb_list urbs;
  56        atomic_t lost_pixels; /* 1 = a render op failed. Need screen refresh */
  57
  58        struct udl_fbdev *fbdev;
  59        char mode_buf[1024];
  60        uint32_t mode_buf_len;
  61        atomic_t bytes_rendered; /* raw pixel-bytes driver asked to render */
  62        atomic_t bytes_identical; /* saved effort with backbuffer comparison */
  63        atomic_t bytes_sent; /* to usb, after compression including overhead */
  64        atomic_t cpu_kcycles_used; /* transpired during pixel processing */
  65};
  66
  67struct udl_gem_object {
  68        struct drm_gem_object base;
  69        struct page **pages;
  70        void *vmapping;
  71        struct sg_table *sg;
  72};
  73
  74#define to_udl_bo(x) container_of(x, struct udl_gem_object, base)
  75
  76struct udl_framebuffer {
  77        struct drm_framebuffer base;
  78        struct udl_gem_object *obj;
  79        bool active_16; /* active on the 16-bit channel */
  80        int x1, y1, x2, y2; /* dirty rect */
  81        spinlock_t dirty_lock;
  82};
  83
  84#define to_udl_fb(x) container_of(x, struct udl_framebuffer, base)
  85
  86/* modeset */
  87int udl_modeset_init(struct drm_device *dev);
  88void udl_modeset_cleanup(struct drm_device *dev);
  89int udl_connector_init(struct drm_device *dev, struct drm_encoder *encoder);
  90
  91struct drm_encoder *udl_encoder_init(struct drm_device *dev);
  92
  93struct urb *udl_get_urb(struct drm_device *dev);
  94
  95int udl_submit_urb(struct drm_device *dev, struct urb *urb, size_t len);
  96void udl_urb_completion(struct urb *urb);
  97
  98int udl_driver_load(struct drm_device *dev, unsigned long flags);
  99int udl_driver_unload(struct drm_device *dev);
 100
 101int udl_fbdev_init(struct drm_device *dev);
 102void udl_fbdev_cleanup(struct drm_device *dev);
 103void udl_fbdev_unplug(struct drm_device *dev);
 104struct drm_framebuffer *
 105udl_fb_user_fb_create(struct drm_device *dev,
 106                      struct drm_file *file,
 107                      struct drm_mode_fb_cmd2 *mode_cmd);
 108
 109int udl_render_hline(struct drm_device *dev, int bpp, struct urb **urb_ptr,
 110                     const char *front, char **urb_buf_ptr,
 111                     u32 byte_offset, u32 device_byte_offset, u32 byte_width,
 112                     int *ident_ptr, int *sent_ptr);
 113
 114int udl_dumb_create(struct drm_file *file_priv,
 115                    struct drm_device *dev,
 116                    struct drm_mode_create_dumb *args);
 117int udl_gem_mmap(struct drm_file *file_priv, struct drm_device *dev,
 118                 uint32_t handle, uint64_t *offset);
 119
 120void udl_gem_free_object(struct drm_gem_object *gem_obj);
 121struct udl_gem_object *udl_gem_alloc_object(struct drm_device *dev,
 122                                            size_t size);
 123struct drm_gem_object *udl_gem_prime_import(struct drm_device *dev,
 124                                struct dma_buf *dma_buf);
 125
 126int udl_gem_vmap(struct udl_gem_object *obj);
 127void udl_gem_vunmap(struct udl_gem_object *obj);
 128int udl_drm_gem_mmap(struct file *filp, struct vm_area_struct *vma);
 129int udl_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf);
 130
 131int udl_handle_damage(struct udl_framebuffer *fb, int x, int y,
 132                      int width, int height);
 133
 134int udl_drop_usb(struct drm_device *dev);
 135
 136#define CMD_WRITE_RAW8   "\xAF\x60" /**< 8 bit raw write command. */
 137#define CMD_WRITE_RL8    "\xAF\x61" /**< 8 bit run length command. */
 138#define CMD_WRITE_COPY8  "\xAF\x62" /**< 8 bit copy command. */
 139#define CMD_WRITE_RLX8   "\xAF\x63" /**< 8 bit extended run length command. */
 140
 141#define CMD_WRITE_RAW16  "\xAF\x68" /**< 16 bit raw write command. */
 142#define CMD_WRITE_RL16   "\xAF\x69" /**< 16 bit run length command. */
 143#define CMD_WRITE_COPY16 "\xAF\x6A" /**< 16 bit copy command. */
 144#define CMD_WRITE_RLX16  "\xAF\x6B" /**< 16 bit extended run length command. */
 145
 146#endif
 147