xref: /openbmc/linux/include/video/udlfb.h (revision babc250e)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
296f8d864SPaul Mundt #ifndef UDLFB_H
396f8d864SPaul Mundt #define UDLFB_H
496f8d864SPaul Mundt 
596f8d864SPaul Mundt /*
696f8d864SPaul Mundt  * TODO: Propose standard fb.h ioctl for reporting damage,
796f8d864SPaul Mundt  * using _IOWR() and one of the existing area structs from fb.h
896f8d864SPaul Mundt  * Consider these ioctls deprecated, but they're still used by the
996f8d864SPaul Mundt  * DisplayLink X server as yet - need both to be modified in tandem
1096f8d864SPaul Mundt  * when new ioctl(s) are ready.
1196f8d864SPaul Mundt  */
1296f8d864SPaul Mundt #define DLFB_IOCTL_RETURN_EDID	 0xAD
1396f8d864SPaul Mundt #define DLFB_IOCTL_REPORT_DAMAGE 0xAA
1496f8d864SPaul Mundt struct dloarea {
1596f8d864SPaul Mundt 	int x, y;
1696f8d864SPaul Mundt 	int w, h;
1796f8d864SPaul Mundt 	int x2, y2;
1896f8d864SPaul Mundt };
1996f8d864SPaul Mundt 
2096f8d864SPaul Mundt struct urb_node {
2196f8d864SPaul Mundt 	struct list_head entry;
227ea46206SLadislav Michl 	struct dlfb_data *dlfb;
2396f8d864SPaul Mundt 	struct urb *urb;
2496f8d864SPaul Mundt };
2596f8d864SPaul Mundt 
2696f8d864SPaul Mundt struct urb_list {
2796f8d864SPaul Mundt 	struct list_head list;
2896f8d864SPaul Mundt 	spinlock_t lock;
2996f8d864SPaul Mundt 	struct semaphore limit_sem;
3096f8d864SPaul Mundt 	int available;
3196f8d864SPaul Mundt 	int count;
3296f8d864SPaul Mundt 	size_t size;
3396f8d864SPaul Mundt };
3496f8d864SPaul Mundt 
3596f8d864SPaul Mundt struct dlfb_data {
3696f8d864SPaul Mundt 	struct usb_device *udev;
3796f8d864SPaul Mundt 	struct fb_info *info;
3896f8d864SPaul Mundt 	struct urb_list urbs;
3996f8d864SPaul Mundt 	char *backing_buffer;
4096f8d864SPaul Mundt 	int fb_count;
4196f8d864SPaul Mundt 	bool virtualized; /* true when physical usb device not present */
4296f8d864SPaul Mundt 	atomic_t usb_active; /* 0 = update virtual buffer, but no usb traffic */
4396f8d864SPaul Mundt 	atomic_t lost_pixels; /* 1 = a render op failed. Need screen refresh */
4496f8d864SPaul Mundt 	char *edid; /* null until we read edid from hw or get from sysfs */
4596f8d864SPaul Mundt 	size_t edid_size;
4696f8d864SPaul Mundt 	int sku_pixel_limit;
4796f8d864SPaul Mundt 	int base16;
4896f8d864SPaul Mundt 	int base8;
4996f8d864SPaul Mundt 	u32 pseudo_palette[256];
5058e7c3b0SBernie Thompson 	int blank_mode; /*one of FB_BLANK_ */
51babc250eSMikulas Patocka 	struct mutex render_mutex;
526b11f9d8SMikulas Patocka 	int damage_x;
536b11f9d8SMikulas Patocka 	int damage_y;
546b11f9d8SMikulas Patocka 	int damage_x2;
556b11f9d8SMikulas Patocka 	int damage_y2;
566b11f9d8SMikulas Patocka 	spinlock_t damage_lock;
576b11f9d8SMikulas Patocka 	struct work_struct damage_work;
582c29cfc3SMikulas Patocka 	struct fb_ops ops;
5996f8d864SPaul Mundt 	/* blit-only rendering path metrics, exposed through sysfs */
6096f8d864SPaul Mundt 	atomic_t bytes_rendered; /* raw pixel-bytes driver asked to render */
6196f8d864SPaul Mundt 	atomic_t bytes_identical; /* saved effort with backbuffer comparison */
6296f8d864SPaul Mundt 	atomic_t bytes_sent; /* to usb, after compression including overhead */
6396f8d864SPaul Mundt 	atomic_t cpu_kcycles_used; /* transpired during pixel processing */
64564f1807SMikulas Patocka 	struct fb_var_screeninfo current_mode;
657433914eSMikulas Patocka 	struct list_head deferred_free;
6696f8d864SPaul Mundt };
6796f8d864SPaul Mundt 
6896f8d864SPaul Mundt #define NR_USB_REQUEST_I2C_SUB_IO 0x02
6996f8d864SPaul Mundt #define NR_USB_REQUEST_CHANNEL 0x12
7096f8d864SPaul Mundt 
7196f8d864SPaul Mundt /* -BULK_SIZE as per usb-skeleton. Can we get full page and avoid overhead? */
7296f8d864SPaul Mundt #define BULK_SIZE 512
7396f8d864SPaul Mundt #define MAX_TRANSFER (PAGE_SIZE*16 - BULK_SIZE)
7496f8d864SPaul Mundt #define WRITES_IN_FLIGHT (4)
7596f8d864SPaul Mundt 
7696f8d864SPaul Mundt #define MAX_VENDOR_DESCRIPTOR_SIZE 256
7796f8d864SPaul Mundt 
7896f8d864SPaul Mundt #define GET_URB_TIMEOUT	HZ
7996f8d864SPaul Mundt #define FREE_URB_TIMEOUT (HZ*2)
8096f8d864SPaul Mundt 
8196f8d864SPaul Mundt #define BPP                     2
8296f8d864SPaul Mundt #define MAX_CMD_PIXELS		255
8396f8d864SPaul Mundt 
8496f8d864SPaul Mundt #define RLX_HEADER_BYTES	7
8596f8d864SPaul Mundt #define MIN_RLX_PIX_BYTES       4
8696f8d864SPaul Mundt #define MIN_RLX_CMD_BYTES	(RLX_HEADER_BYTES + MIN_RLX_PIX_BYTES)
8796f8d864SPaul Mundt 
8896f8d864SPaul Mundt #define RLE_HEADER_BYTES	6
8996f8d864SPaul Mundt #define MIN_RLE_PIX_BYTES	3
9096f8d864SPaul Mundt #define MIN_RLE_CMD_BYTES	(RLE_HEADER_BYTES + MIN_RLE_PIX_BYTES)
9196f8d864SPaul Mundt 
9296f8d864SPaul Mundt #define RAW_HEADER_BYTES	6
9396f8d864SPaul Mundt #define MIN_RAW_PIX_BYTES	2
9496f8d864SPaul Mundt #define MIN_RAW_CMD_BYTES	(RAW_HEADER_BYTES + MIN_RAW_PIX_BYTES)
9596f8d864SPaul Mundt 
96bb24153aSMikulas Patocka #define DL_DEFIO_WRITE_DELAY    msecs_to_jiffies(HZ <= 300 ? 4 : 10) /* optimal value for 720p video */
9796f8d864SPaul Mundt #define DL_DEFIO_WRITE_DISABLE  (HZ*60) /* "disable" with long delay */
9896f8d864SPaul Mundt 
9996f8d864SPaul Mundt /* remove these once align.h patch is taken into kernel */
10096f8d864SPaul Mundt #define DL_ALIGN_UP(x, a) ALIGN(x, a)
101ed067d4aSKrzysztof Kozlowski #define DL_ALIGN_DOWN(x, a) ALIGN_DOWN(x, a)
10296f8d864SPaul Mundt 
10396f8d864SPaul Mundt #endif
104