^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #ifndef UDLFB_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #define UDLFB_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * TODO: Propose standard fb.h ioctl for reporting damage,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * using _IOWR() and one of the existing area structs from fb.h
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) * Consider these ioctls deprecated, but they're still used by the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * DisplayLink X server as yet - need both to be modified in tandem
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * when new ioctl(s) are ready.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #define DLFB_IOCTL_RETURN_EDID 0xAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #define DLFB_IOCTL_REPORT_DAMAGE 0xAA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) struct dloarea {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) int x, y;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) int w, h;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) int x2, y2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) struct urb_node {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) struct list_head entry;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) struct dlfb_data *dlfb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) struct urb *urb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) struct urb_list {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) struct list_head list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) spinlock_t lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) struct semaphore limit_sem;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) int available;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) int count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) size_t size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) struct dlfb_data {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) struct usb_device *udev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) struct fb_info *info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) struct urb_list urbs;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) char *backing_buffer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) int fb_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) bool virtualized; /* true when physical usb device not present */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) atomic_t usb_active; /* 0 = update virtual buffer, but no usb traffic */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) atomic_t lost_pixels; /* 1 = a render op failed. Need screen refresh */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) char *edid; /* null until we read edid from hw or get from sysfs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) size_t edid_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) int sku_pixel_limit;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) int base16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) int base8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) u32 pseudo_palette[256];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) int blank_mode; /*one of FB_BLANK_ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) struct mutex render_mutex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) int damage_x;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) int damage_y;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) int damage_x2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) int damage_y2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) spinlock_t damage_lock;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) struct work_struct damage_work;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) struct fb_ops ops;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) /* blit-only rendering path metrics, exposed through sysfs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) atomic_t bytes_rendered; /* raw pixel-bytes driver asked to render */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) atomic_t bytes_identical; /* saved effort with backbuffer comparison */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) atomic_t bytes_sent; /* to usb, after compression including overhead */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) atomic_t cpu_kcycles_used; /* transpired during pixel processing */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) struct fb_var_screeninfo current_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) struct list_head deferred_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #define NR_USB_REQUEST_I2C_SUB_IO 0x02
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #define NR_USB_REQUEST_CHANNEL 0x12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) /* -BULK_SIZE as per usb-skeleton. Can we get full page and avoid overhead? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) #define BULK_SIZE 512
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) #define MAX_TRANSFER (PAGE_SIZE*16 - BULK_SIZE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) #define WRITES_IN_FLIGHT (4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #define MAX_VENDOR_DESCRIPTOR_SIZE 256
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) #define GET_URB_TIMEOUT HZ
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) #define FREE_URB_TIMEOUT (HZ*2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) #define BPP 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) #define MAX_CMD_PIXELS 255
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) #define RLX_HEADER_BYTES 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) #define MIN_RLX_PIX_BYTES 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #define MIN_RLX_CMD_BYTES (RLX_HEADER_BYTES + MIN_RLX_PIX_BYTES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) #define RLE_HEADER_BYTES 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) #define MIN_RLE_PIX_BYTES 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) #define MIN_RLE_CMD_BYTES (RLE_HEADER_BYTES + MIN_RLE_PIX_BYTES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) #define RAW_HEADER_BYTES 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) #define MIN_RAW_PIX_BYTES 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) #define MIN_RAW_CMD_BYTES (RAW_HEADER_BYTES + MIN_RAW_PIX_BYTES)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) #define DL_DEFIO_WRITE_DELAY msecs_to_jiffies(HZ <= 300 ? 4 : 10) /* optimal value for 720p video */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) #define DL_DEFIO_WRITE_DISABLE (HZ*60) /* "disable" with long delay */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) /* remove these once align.h patch is taken into kernel */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) #define DL_ALIGN_UP(x, a) ALIGN(x, a)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #define DL_ALIGN_DOWN(x, a) ALIGN_DOWN(x, a)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) #endif