Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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