xref: /linux-6.15/include/linux/fb.h (revision 6cdef2dd)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
21da177e4SLinus Torvalds #ifndef _LINUX_FB_H
31da177e4SLinus Torvalds #define _LINUX_FB_H
41da177e4SLinus Torvalds 
5607ca46eSDavid Howells #include <uapi/linux/fb.h>
61da177e4SLinus Torvalds 
71da177e4SLinus Torvalds #define FBIO_CURSOR            _IOWR('F', 0x08, struct fb_cursor_user)
81da177e4SLinus Torvalds 
90c591381SThomas Zimmermann #include <linux/mutex.h>
100c591381SThomas Zimmermann #include <linux/printk.h>
110c591381SThomas Zimmermann #include <linux/refcount.h>
120c591381SThomas Zimmermann #include <linux/types.h>
131da177e4SLinus Torvalds #include <linux/workqueue.h>
148ff1541dSThomas Zimmermann 
152fd001cdSThomas Zimmermann #include <asm/video.h>
161da177e4SLinus Torvalds 
1711b4eedfSThomas Zimmermann struct backlight_device;
181da177e4SLinus Torvalds struct device;
19f6d52078SThomas Zimmermann struct device_node;
20f6d52078SThomas Zimmermann struct fb_info;
211da177e4SLinus Torvalds struct file;
22f6d52078SThomas Zimmermann struct i2c_adapter;
23183c8156SThomas Zimmermann struct inode;
2426228256SThomas Zimmermann struct lcd_device;
25f6d52078SThomas Zimmermann struct module;
260f115335SThomas Zimmermann struct notifier_block;
277a46212fSThomas Zimmermann struct page;
282db54c72SSteffen Trumtrar struct videomode;
29f6d52078SThomas Zimmermann struct vm_area_struct;
301da177e4SLinus Torvalds 
311da177e4SLinus Torvalds /* Definitions below are used in the parsed monitor specs */
321da177e4SLinus Torvalds #define FB_DPMS_ACTIVE_OFF	1
331da177e4SLinus Torvalds #define FB_DPMS_SUSPEND		2
341da177e4SLinus Torvalds #define FB_DPMS_STANDBY		4
351da177e4SLinus Torvalds 
361da177e4SLinus Torvalds #define FB_DISP_DDI		1
371da177e4SLinus Torvalds #define FB_DISP_ANA_700_300	2
381da177e4SLinus Torvalds #define FB_DISP_ANA_714_286	4
391da177e4SLinus Torvalds #define FB_DISP_ANA_1000_400	8
401da177e4SLinus Torvalds #define FB_DISP_ANA_700_000	16
411da177e4SLinus Torvalds 
421da177e4SLinus Torvalds #define FB_DISP_MONO		32
431da177e4SLinus Torvalds #define FB_DISP_RGB		64
441da177e4SLinus Torvalds #define FB_DISP_MULTI		128
451da177e4SLinus Torvalds #define FB_DISP_UNKNOWN		256
461da177e4SLinus Torvalds 
471da177e4SLinus Torvalds #define FB_SIGNAL_NONE		0
481da177e4SLinus Torvalds #define FB_SIGNAL_BLANK_BLANK	1
491da177e4SLinus Torvalds #define FB_SIGNAL_SEPARATE	2
501da177e4SLinus Torvalds #define FB_SIGNAL_COMPOSITE	4
511da177e4SLinus Torvalds #define FB_SIGNAL_SYNC_ON_GREEN	8
521da177e4SLinus Torvalds #define FB_SIGNAL_SERRATION_ON	16
531da177e4SLinus Torvalds 
541da177e4SLinus Torvalds #define FB_MISC_PRIM_COLOR	1
551da177e4SLinus Torvalds #define FB_MISC_1ST_DETAIL	2	/* First Detailed Timing is preferred */
56e6853aafSDavid Ung #define FB_MISC_HDMI		4
571da177e4SLinus Torvalds struct fb_chroma {
581da177e4SLinus Torvalds 	__u32 redx;	/* in fraction of 1024 */
591da177e4SLinus Torvalds 	__u32 greenx;
601da177e4SLinus Torvalds 	__u32 bluex;
611da177e4SLinus Torvalds 	__u32 whitex;
621da177e4SLinus Torvalds 	__u32 redy;
631da177e4SLinus Torvalds 	__u32 greeny;
641da177e4SLinus Torvalds 	__u32 bluey;
651da177e4SLinus Torvalds 	__u32 whitey;
661da177e4SLinus Torvalds };
671da177e4SLinus Torvalds 
681da177e4SLinus Torvalds struct fb_monspecs {
691da177e4SLinus Torvalds 	struct fb_chroma chroma;
701da177e4SLinus Torvalds 	struct fb_videomode *modedb;	/* mode database */
711da177e4SLinus Torvalds 	__u8  manufacturer[4];		/* Manufacturer */
721da177e4SLinus Torvalds 	__u8  monitor[14];		/* Monitor String */
731da177e4SLinus Torvalds 	__u8  serial_no[14];		/* Serial Number */
741da177e4SLinus Torvalds 	__u8  ascii[14];		/* ? */
751da177e4SLinus Torvalds 	__u32 modedb_len;		/* mode database length */
761da177e4SLinus Torvalds 	__u32 model;			/* Monitor Model */
771da177e4SLinus Torvalds 	__u32 serial;			/* Serial Number - Integer */
781da177e4SLinus Torvalds 	__u32 year;			/* Year manufactured */
791da177e4SLinus Torvalds 	__u32 week;			/* Week Manufactured */
801da177e4SLinus Torvalds 	__u32 hfmin;			/* hfreq lower limit (Hz) */
811da177e4SLinus Torvalds 	__u32 hfmax;			/* hfreq upper limit (Hz) */
821da177e4SLinus Torvalds 	__u32 dclkmin;			/* pixelclock lower limit (Hz) */
831da177e4SLinus Torvalds 	__u32 dclkmax;			/* pixelclock upper limit (Hz) */
841da177e4SLinus Torvalds 	__u16 input;			/* display type - see FB_DISP_* */
851da177e4SLinus Torvalds 	__u16 dpms;			/* DPMS support - see FB_DPMS_ */
861da177e4SLinus Torvalds 	__u16 signal;			/* Signal Type - see FB_SIGNAL_* */
871da177e4SLinus Torvalds 	__u16 vfmin;			/* vfreq lower limit (Hz) */
881da177e4SLinus Torvalds 	__u16 vfmax;			/* vfreq upper limit (Hz) */
891da177e4SLinus Torvalds 	__u16 gamma;			/* Gamma - in fractions of 100 */
901da177e4SLinus Torvalds 	__u16 gtf	: 1;		/* supports GTF */
911da177e4SLinus Torvalds 	__u16 misc;			/* Misc flags - see FB_MISC_* */
921da177e4SLinus Torvalds 	__u8  version;			/* EDID version... */
931da177e4SLinus Torvalds 	__u8  revision;			/* ...and revision */
941da177e4SLinus Torvalds 	__u8  max_x;			/* Maximum horizontal size (cm) */
951da177e4SLinus Torvalds 	__u8  max_y;			/* Maximum vertical size (cm) */
961da177e4SLinus Torvalds };
971da177e4SLinus Torvalds 
981da177e4SLinus Torvalds struct fb_cmap_user {
991da177e4SLinus Torvalds 	__u32 start;			/* First entry	*/
1001da177e4SLinus Torvalds 	__u32 len;			/* Number of entries */
1011da177e4SLinus Torvalds 	__u16 __user *red;		/* Red values	*/
1021da177e4SLinus Torvalds 	__u16 __user *green;
1031da177e4SLinus Torvalds 	__u16 __user *blue;
1041da177e4SLinus Torvalds 	__u16 __user *transp;		/* transparency, can be NULL */
1051da177e4SLinus Torvalds };
1061da177e4SLinus Torvalds 
1071da177e4SLinus Torvalds struct fb_image_user {
1081da177e4SLinus Torvalds 	__u32 dx;			/* Where to place image */
1091da177e4SLinus Torvalds 	__u32 dy;
1101da177e4SLinus Torvalds 	__u32 width;			/* Size of image */
1111da177e4SLinus Torvalds 	__u32 height;
1121da177e4SLinus Torvalds 	__u32 fg_color;			/* Only used when a mono bitmap */
1131da177e4SLinus Torvalds 	__u32 bg_color;
1141da177e4SLinus Torvalds 	__u8  depth;			/* Depth of the image */
1151da177e4SLinus Torvalds 	const char __user *data;	/* Pointer to image data */
1161da177e4SLinus Torvalds 	struct fb_cmap_user cmap;	/* color map info */
1171da177e4SLinus Torvalds };
1181da177e4SLinus Torvalds 
1191da177e4SLinus Torvalds struct fb_cursor_user {
1201da177e4SLinus Torvalds 	__u16 set;			/* what to set */
1211da177e4SLinus Torvalds 	__u16 enable;			/* cursor on/off */
1221da177e4SLinus Torvalds 	__u16 rop;			/* bitop operation */
1231da177e4SLinus Torvalds 	const char __user *mask;	/* cursor mask bits */
1241da177e4SLinus Torvalds 	struct fbcurpos hot;		/* cursor hot spot */
1251da177e4SLinus Torvalds 	struct fb_image_user image;	/* Cursor image */
1261da177e4SLinus Torvalds };
1271da177e4SLinus Torvalds 
1281da177e4SLinus Torvalds /*
1291da177e4SLinus Torvalds  * Register/unregister for framebuffer events
1301da177e4SLinus Torvalds  */
1311da177e4SLinus Torvalds 
1321da177e4SLinus Torvalds /*	The resolution of the passed in fb_info about to change */
1331da177e4SLinus Torvalds #define FB_EVENT_MODE_CHANGE		0x01
13497b67986SDaniel Vetter 
13597b67986SDaniel Vetter #ifdef CONFIG_GUMSTIX_AM200EPD
13697b67986SDaniel Vetter /* only used by mach-pxa/am200epd.c */
1371da177e4SLinus Torvalds #define FB_EVENT_FB_REGISTERED          0x05
138e614b18dSAntonino A. Daplas #define FB_EVENT_FB_UNREGISTERED        0x06
13997b67986SDaniel Vetter #endif
14097b67986SDaniel Vetter 
1417a625549SDaniel Vetter /*      A display blank is requested       */
142e614b18dSAntonino A. Daplas #define FB_EVENT_BLANK                  0x09
1431da177e4SLinus Torvalds 
1441da177e4SLinus Torvalds struct fb_event {
1451da177e4SLinus Torvalds 	struct fb_info *info;
1461da177e4SLinus Torvalds 	void *data;
1471da177e4SLinus Torvalds };
1481da177e4SLinus Torvalds 
14915260979SSamuel Thibault /*	Enough for the VT console needs, see its max_font_width/height */
15015260979SSamuel Thibault #define FB_MAX_BLIT_WIDTH	64
15115260979SSamuel Thibault #define FB_MAX_BLIT_HEIGHT	128
15215260979SSamuel Thibault 
15338a3dc51SAntonino A. Daplas struct fb_blit_caps {
15415260979SSamuel Thibault 	DECLARE_BITMAP(x, FB_MAX_BLIT_WIDTH);
15515260979SSamuel Thibault 	DECLARE_BITMAP(y, FB_MAX_BLIT_HEIGHT);
15638a3dc51SAntonino A. Daplas 	u32 len;
15738a3dc51SAntonino A. Daplas 	u32 flags;
15838a3dc51SAntonino A. Daplas };
1591da177e4SLinus Torvalds 
1605ec96538SEzequiel Garcia #ifdef CONFIG_FB_NOTIFY
1611da177e4SLinus Torvalds extern int fb_register_client(struct notifier_block *nb);
1621da177e4SLinus Torvalds extern int fb_unregister_client(struct notifier_block *nb);
163256154fbSAntonino A. Daplas extern int fb_notifier_call_chain(unsigned long val, void *v);
1645ec96538SEzequiel Garcia #else
fb_register_client(struct notifier_block * nb)1655ec96538SEzequiel Garcia static inline int fb_register_client(struct notifier_block *nb)
1665ec96538SEzequiel Garcia {
1675ec96538SEzequiel Garcia 	return 0;
1685ec96538SEzequiel Garcia };
1695ec96538SEzequiel Garcia 
fb_unregister_client(struct notifier_block * nb)1705ec96538SEzequiel Garcia static inline int fb_unregister_client(struct notifier_block *nb)
1715ec96538SEzequiel Garcia {
1725ec96538SEzequiel Garcia 	return 0;
1735ec96538SEzequiel Garcia };
1745ec96538SEzequiel Garcia 
fb_notifier_call_chain(unsigned long val,void * v)1755ec96538SEzequiel Garcia static inline int fb_notifier_call_chain(unsigned long val, void *v)
1765ec96538SEzequiel Garcia {
1775ec96538SEzequiel Garcia 	return 0;
1785ec96538SEzequiel Garcia };
1795ec96538SEzequiel Garcia #endif
1805ec96538SEzequiel Garcia 
1811da177e4SLinus Torvalds /*
1821da177e4SLinus Torvalds  * Pixmap structure definition
1831da177e4SLinus Torvalds  *
1841da177e4SLinus Torvalds  * The purpose of this structure is to translate data
1851da177e4SLinus Torvalds  * from the hardware independent format of fbdev to what
1861da177e4SLinus Torvalds  * format the hardware needs.
1871da177e4SLinus Torvalds  */
1881da177e4SLinus Torvalds 
1891da177e4SLinus Torvalds #define FB_PIXMAP_DEFAULT 1     /* used internally by fbcon */
1901da177e4SLinus Torvalds #define FB_PIXMAP_SYSTEM  2     /* memory is in system RAM  */
1911da177e4SLinus Torvalds #define FB_PIXMAP_IO      4     /* memory is iomapped       */
1921da177e4SLinus Torvalds #define FB_PIXMAP_SYNC    256   /* set if GPU can DMA       */
1931da177e4SLinus Torvalds 
1941da177e4SLinus Torvalds struct fb_pixmap {
1951da177e4SLinus Torvalds 	u8  *addr;		/* pointer to memory			*/
1961da177e4SLinus Torvalds 	u32 size;		/* size of buffer in bytes		*/
1971da177e4SLinus Torvalds 	u32 offset;		/* current offset to buffer		*/
1981da177e4SLinus Torvalds 	u32 buf_align;		/* byte alignment of each bitmap	*/
1991da177e4SLinus Torvalds 	u32 scan_align;		/* alignment per scanline		*/
200f5a9951cSJames Simmons 	u32 access_align;	/* alignment per read/write (bits)	*/
2011da177e4SLinus Torvalds 	u32 flags;		/* see FB_PIXMAP_*			*/
20215260979SSamuel Thibault 				/* supported bit block dimensions	*/
20315260979SSamuel Thibault 				/* Format: test_bit(width - 1, blit_x)	*/
20415260979SSamuel Thibault 				/*	   test_bit(height - 1, blit_y)	*/
20515260979SSamuel Thibault 				/* if zero, will be set to full (all)	*/
20615260979SSamuel Thibault 	DECLARE_BITMAP(blit_x, FB_MAX_BLIT_WIDTH);
20715260979SSamuel Thibault 	DECLARE_BITMAP(blit_y, FB_MAX_BLIT_HEIGHT);
2081da177e4SLinus Torvalds 	/* access methods */
209f5a9951cSJames Simmons 	void (*writeio)(struct fb_info *info, void __iomem *dst, void *src, unsigned int size);
210f5a9951cSJames Simmons 	void (*readio) (struct fb_info *info, void *dst, void __iomem *src, unsigned int size);
2111da177e4SLinus Torvalds };
2121da177e4SLinus Torvalds 
21360b59beaSJaya Kumar #ifdef CONFIG_FB_DEFERRED_IO
21456c134f7SThomas Zimmermann struct fb_deferred_io_pageref {
21556c134f7SThomas Zimmermann 	struct page *page;
21656c134f7SThomas Zimmermann 	unsigned long offset;
21756c134f7SThomas Zimmermann 	/* private */
21856c134f7SThomas Zimmermann 	struct list_head list;
21956c134f7SThomas Zimmermann };
22056c134f7SThomas Zimmermann 
22160b59beaSJaya Kumar struct fb_deferred_io {
22260b59beaSJaya Kumar 	/* delay between mkwrite and deferred handler */
22360b59beaSJaya Kumar 	unsigned long delay;
224e80eec1bSThomas Zimmermann 	bool sort_pagereflist; /* sort pagelist by offset */
225fe9ae05cSTakashi Iwai 	int open_count; /* number of opened files; protected by fb_info lock */
226e80eec1bSThomas Zimmermann 	struct mutex lock; /* mutex that protects the pageref list */
227e80eec1bSThomas Zimmermann 	struct list_head pagereflist; /* list of pagerefs for touched pages */
228*6cdef2ddSLorenzo Stoakes 	struct address_space *mapping; /* page cache object for fb device */
22960b59beaSJaya Kumar 	/* callback */
230747bda7bSThomas Zimmermann 	struct page *(*get_page)(struct fb_info *info, unsigned long offset);
23160b59beaSJaya Kumar 	void (*deferred_io)(struct fb_info *info, struct list_head *pagelist);
23260b59beaSJaya Kumar };
23360b59beaSJaya Kumar #endif
2341da177e4SLinus Torvalds 
2351da177e4SLinus Torvalds /*
2361da177e4SLinus Torvalds  * Frame buffer operations
2371da177e4SLinus Torvalds  *
2381da177e4SLinus Torvalds  * LOCKING NOTE: those functions must _ALL_ be called with the console
239b3c2ffd5SAdrian Bunk  * semaphore held, this is the only suitable locking mechanism we have
2401da177e4SLinus Torvalds  * in 2.6. Some may be called at interrupt time at this point though.
241d219adc1SJesse Barnes  *
242d219adc1SJesse Barnes  * The exception to this is the debug related hooks.  Putting the fb
243d219adc1SJesse Barnes  * into a debug state (e.g. flipping to the kernel console) and restoring
244d219adc1SJesse Barnes  * it must be done in a lock-free manner, so low level drivers should
245d219adc1SJesse Barnes  * keep track of the initial console (if applicable) and may need to
246d219adc1SJesse Barnes  * perform direct, unlocked hardware writes in these hooks.
2471da177e4SLinus Torvalds  */
2481da177e4SLinus Torvalds 
2491da177e4SLinus Torvalds struct fb_ops {
2501da177e4SLinus Torvalds 	/* open/release and usage marking */
2511da177e4SLinus Torvalds 	struct module *owner;
2521da177e4SLinus Torvalds 	int (*fb_open)(struct fb_info *info, int user);
2531da177e4SLinus Torvalds 	int (*fb_release)(struct fb_info *info, int user);
2541da177e4SLinus Torvalds 
2551da177e4SLinus Torvalds 	/* For framebuffers with strange non linear layouts or that do not
2561da177e4SLinus Torvalds 	 * work with normal memory mapped access
2571da177e4SLinus Torvalds 	 */
2583f9b0880SAntonino A. Daplas 	ssize_t (*fb_read)(struct fb_info *info, char __user *buf,
2593f9b0880SAntonino A. Daplas 			   size_t count, loff_t *ppos);
2603f9b0880SAntonino A. Daplas 	ssize_t (*fb_write)(struct fb_info *info, const char __user *buf,
2613f9b0880SAntonino A. Daplas 			    size_t count, loff_t *ppos);
2621da177e4SLinus Torvalds 
2631da177e4SLinus Torvalds 	/* checks var and eventually tweaks it to something supported,
2641da177e4SLinus Torvalds 	 * DO NOT MODIFY PAR */
2651da177e4SLinus Torvalds 	int (*fb_check_var)(struct fb_var_screeninfo *var, struct fb_info *info);
2661da177e4SLinus Torvalds 
2671da177e4SLinus Torvalds 	/* set the video mode according to info->var */
2681da177e4SLinus Torvalds 	int (*fb_set_par)(struct fb_info *info);
2691da177e4SLinus Torvalds 
2701da177e4SLinus Torvalds 	/* set color register */
2711da177e4SLinus Torvalds 	int (*fb_setcolreg)(unsigned regno, unsigned red, unsigned green,
2721da177e4SLinus Torvalds 			    unsigned blue, unsigned transp, struct fb_info *info);
2731da177e4SLinus Torvalds 
27471494376SBenjamin Herrenschmidt 	/* set color registers in batch */
27571494376SBenjamin Herrenschmidt 	int (*fb_setcmap)(struct fb_cmap *cmap, struct fb_info *info);
27671494376SBenjamin Herrenschmidt 
2771da177e4SLinus Torvalds 	/* blank display */
2781da177e4SLinus Torvalds 	int (*fb_blank)(int blank, struct fb_info *info);
2791da177e4SLinus Torvalds 
2801da177e4SLinus Torvalds 	/* pan display */
2811da177e4SLinus Torvalds 	int (*fb_pan_display)(struct fb_var_screeninfo *var, struct fb_info *info);
2821da177e4SLinus Torvalds 
2831da177e4SLinus Torvalds 	/* Draws a rectangle */
2841da177e4SLinus Torvalds 	void (*fb_fillrect) (struct fb_info *info, const struct fb_fillrect *rect);
2851148836fSHelge Deller 	/* Copy data from area to another */
2861da177e4SLinus Torvalds 	void (*fb_copyarea) (struct fb_info *info, const struct fb_copyarea *region);
2871da177e4SLinus Torvalds 	/* Draws a image to the display */
2881da177e4SLinus Torvalds 	void (*fb_imageblit) (struct fb_info *info, const struct fb_image *image);
2891da177e4SLinus Torvalds 
2901da177e4SLinus Torvalds 	/* Draws cursor */
2911da177e4SLinus Torvalds 	int (*fb_cursor) (struct fb_info *info, struct fb_cursor *cursor);
2921da177e4SLinus Torvalds 
2931da177e4SLinus Torvalds 	/* wait for blit idle, optional */
2941da177e4SLinus Torvalds 	int (*fb_sync)(struct fb_info *info);
2951da177e4SLinus Torvalds 
2961da177e4SLinus Torvalds 	/* perform fb specific ioctl (optional) */
29767a6680dSChristoph Hellwig 	int (*fb_ioctl)(struct fb_info *info, unsigned int cmd,
29867a6680dSChristoph Hellwig 			unsigned long arg);
2991da177e4SLinus Torvalds 
3001da177e4SLinus Torvalds 	/* Handle 32bit compat ioctl (optional) */
30167a6680dSChristoph Hellwig 	int (*fb_compat_ioctl)(struct fb_info *info, unsigned cmd,
30267a6680dSChristoph Hellwig 			unsigned long arg);
3031da177e4SLinus Torvalds 
3041da177e4SLinus Torvalds 	/* perform fb specific mmap */
305216d526cSChristoph Hellwig 	int (*fb_mmap)(struct fb_info *info, struct vm_area_struct *vma);
30647434847SAntonino A. Daplas 
30738a3dc51SAntonino A. Daplas 	/* get capability given var */
30838a3dc51SAntonino A. Daplas 	void (*fb_get_caps)(struct fb_info *info, struct fb_blit_caps *caps,
30938a3dc51SAntonino A. Daplas 			    struct fb_var_screeninfo *var);
3104410f391SDave Airlie 
3114410f391SDave Airlie 	/* teardown any resources to do with this framebuffer */
3124410f391SDave Airlie 	void (*fb_destroy)(struct fb_info *info);
313d219adc1SJesse Barnes 
314d219adc1SJesse Barnes 	/* called at KDB enter and leave time to prepare the console */
315d219adc1SJesse Barnes 	int (*fb_debug_enter)(struct fb_info *info);
316d219adc1SJesse Barnes 	int (*fb_debug_leave)(struct fb_info *info);
3171da177e4SLinus Torvalds };
3181da177e4SLinus Torvalds 
3191da177e4SLinus Torvalds #ifdef CONFIG_FB_TILEBLITTING
3201da177e4SLinus Torvalds #define FB_TILE_CURSOR_NONE        0
3211da177e4SLinus Torvalds #define FB_TILE_CURSOR_UNDERLINE   1
3221da177e4SLinus Torvalds #define FB_TILE_CURSOR_LOWER_THIRD 2
3231da177e4SLinus Torvalds #define FB_TILE_CURSOR_LOWER_HALF  3
3241da177e4SLinus Torvalds #define FB_TILE_CURSOR_TWO_THIRDS  4
3251da177e4SLinus Torvalds #define FB_TILE_CURSOR_BLOCK       5
3261da177e4SLinus Torvalds 
3271da177e4SLinus Torvalds struct fb_tilemap {
3281da177e4SLinus Torvalds 	__u32 width;                /* width of each tile in pixels */
3291da177e4SLinus Torvalds 	__u32 height;               /* height of each tile in scanlines */
3301da177e4SLinus Torvalds 	__u32 depth;                /* color depth of each tile */
3311da177e4SLinus Torvalds 	__u32 length;               /* number of tiles in the map */
3322f4516dbSJan Beulich 	const __u8 *data;           /* actual tile map: a bitmap array, packed
3331da177e4SLinus Torvalds 				       to the nearest byte */
3341da177e4SLinus Torvalds };
3351da177e4SLinus Torvalds 
3361da177e4SLinus Torvalds struct fb_tilerect {
3371da177e4SLinus Torvalds 	__u32 sx;                   /* origin in the x-axis */
3381da177e4SLinus Torvalds 	__u32 sy;                   /* origin in the y-axis */
3391da177e4SLinus Torvalds 	__u32 width;                /* number of tiles in the x-axis */
3401da177e4SLinus Torvalds 	__u32 height;               /* number of tiles in the y-axis */
3411da177e4SLinus Torvalds 	__u32 index;                /* what tile to use: index to tile map */
3421da177e4SLinus Torvalds 	__u32 fg;                   /* foreground color */
3431da177e4SLinus Torvalds 	__u32 bg;                   /* background color */
3441da177e4SLinus Torvalds 	__u32 rop;                  /* raster operation */
3451da177e4SLinus Torvalds };
3461da177e4SLinus Torvalds 
3471da177e4SLinus Torvalds struct fb_tilearea {
3481da177e4SLinus Torvalds 	__u32 sx;                   /* source origin in the x-axis */
3491da177e4SLinus Torvalds 	__u32 sy;                   /* source origin in the y-axis */
3501da177e4SLinus Torvalds 	__u32 dx;                   /* destination origin in the x-axis */
3511da177e4SLinus Torvalds 	__u32 dy;                   /* destination origin in the y-axis */
3521da177e4SLinus Torvalds 	__u32 width;                /* number of tiles in the x-axis */
3531da177e4SLinus Torvalds 	__u32 height;               /* number of tiles in the y-axis */
3541da177e4SLinus Torvalds };
3551da177e4SLinus Torvalds 
3561da177e4SLinus Torvalds struct fb_tileblit {
3571da177e4SLinus Torvalds 	__u32 sx;                   /* origin in the x-axis */
3581da177e4SLinus Torvalds 	__u32 sy;                   /* origin in the y-axis */
3591da177e4SLinus Torvalds 	__u32 width;                /* number of tiles in the x-axis */
3601da177e4SLinus Torvalds 	__u32 height;               /* number of tiles in the y-axis */
3611da177e4SLinus Torvalds 	__u32 fg;                   /* foreground color */
3621da177e4SLinus Torvalds 	__u32 bg;                   /* background color */
3631da177e4SLinus Torvalds 	__u32 length;               /* number of tiles to draw */
3641da177e4SLinus Torvalds 	__u32 *indices;             /* array of indices to tile map */
3651da177e4SLinus Torvalds };
3661da177e4SLinus Torvalds 
3671da177e4SLinus Torvalds struct fb_tilecursor {
3681da177e4SLinus Torvalds 	__u32 sx;                   /* cursor position in the x-axis */
3691da177e4SLinus Torvalds 	__u32 sy;                   /* cursor position in the y-axis */
3701da177e4SLinus Torvalds 	__u32 mode;                 /* 0 = erase, 1 = draw */
3711da177e4SLinus Torvalds 	__u32 shape;                /* see FB_TILE_CURSOR_* */
3721da177e4SLinus Torvalds 	__u32 fg;                   /* foreground color */
3731da177e4SLinus Torvalds 	__u32 bg;                   /* background color */
3741da177e4SLinus Torvalds };
3751da177e4SLinus Torvalds 
3761da177e4SLinus Torvalds struct fb_tile_ops {
3771da177e4SLinus Torvalds 	/* set tile characteristics */
3781da177e4SLinus Torvalds 	void (*fb_settile)(struct fb_info *info, struct fb_tilemap *map);
3791da177e4SLinus Torvalds 
3801da177e4SLinus Torvalds 	/* all dimensions from hereon are in terms of tiles */
3811da177e4SLinus Torvalds 
3821da177e4SLinus Torvalds 	/* move a rectangular region of tiles from one area to another*/
3831da177e4SLinus Torvalds 	void (*fb_tilecopy)(struct fb_info *info, struct fb_tilearea *area);
3841da177e4SLinus Torvalds 	/* fill a rectangular region with a tile */
3851da177e4SLinus Torvalds 	void (*fb_tilefill)(struct fb_info *info, struct fb_tilerect *rect);
3861da177e4SLinus Torvalds 	/* copy an array of tiles */
3871da177e4SLinus Torvalds 	void (*fb_tileblit)(struct fb_info *info, struct fb_tileblit *blit);
3881da177e4SLinus Torvalds 	/* cursor */
3891da177e4SLinus Torvalds 	void (*fb_tilecursor)(struct fb_info *info,
3901da177e4SLinus Torvalds 			      struct fb_tilecursor *cursor);
39111f11d52SAntonino A. Daplas 	/* get maximum length of the tile map */
39211f11d52SAntonino A. Daplas 	int (*fb_get_tilemax)(struct fb_info *info);
3931da177e4SLinus Torvalds };
3941da177e4SLinus Torvalds #endif /* CONFIG_FB_TILEBLITTING */
3951da177e4SLinus Torvalds 
3961da177e4SLinus Torvalds /* FBINFO_* = fb_info.flags bit flags */
3971da177e4SLinus Torvalds #define FBINFO_HWACCEL_DISABLED	0x0002
3981da177e4SLinus Torvalds 	/* When FBINFO_HWACCEL_DISABLED is set:
3991da177e4SLinus Torvalds 	 *  Hardware acceleration is turned off.  Software implementations
4001da177e4SLinus Torvalds 	 *  of required functions (copyarea(), fillrect(), and imageblit())
4011da177e4SLinus Torvalds 	 *  takes over; acceleration engine should be in a quiescent state */
4021da177e4SLinus Torvalds 
4031da177e4SLinus Torvalds /* hints */
4047164bb43SKonrad Rzeszutek Wilk #define FBINFO_VIRTFB		0x0004 /* FB is System RAM, not device. */
4051da177e4SLinus Torvalds #define FBINFO_PARTIAL_PAN_OK	0x0040 /* otw use pan only for double-buffering */
4061da177e4SLinus Torvalds #define FBINFO_READS_FAST	0x0080 /* soft-copy faster than rendering */
4071da177e4SLinus Torvalds 
4081da177e4SLinus Torvalds /* hardware supported ops */
4091da177e4SLinus Torvalds /*  semantics: when a bit is set, it indicates that the operation is
4101da177e4SLinus Torvalds  *   accelerated by hardware.
4111da177e4SLinus Torvalds  *  required functions will still work even if the bit is not set.
4121da177e4SLinus Torvalds  *  optional functions may not even exist if the flag bit is not set.
4131da177e4SLinus Torvalds  */
4141da177e4SLinus Torvalds #define FBINFO_HWACCEL_NONE		0x0000
4151da177e4SLinus Torvalds #define FBINFO_HWACCEL_COPYAREA		0x0100 /* required */
4161da177e4SLinus Torvalds #define FBINFO_HWACCEL_FILLRECT		0x0200 /* required */
4171da177e4SLinus Torvalds #define FBINFO_HWACCEL_IMAGEBLIT	0x0400 /* required */
4181da177e4SLinus Torvalds #define FBINFO_HWACCEL_ROTATE		0x0800 /* optional */
4191da177e4SLinus Torvalds #define FBINFO_HWACCEL_XPAN		0x1000 /* optional */
4201da177e4SLinus Torvalds #define FBINFO_HWACCEL_YPAN		0x2000 /* optional */
4211da177e4SLinus Torvalds #define FBINFO_HWACCEL_YWRAP		0x4000 /* optional */
4221da177e4SLinus Torvalds 
4231da177e4SLinus Torvalds #define FBINFO_MISC_TILEBLITTING       0x20000 /* use tile blitting */
4241da177e4SLinus Torvalds 
42539942fd8SKnut Petersen /* A driver may set this flag to indicate that it does want a set_par to be
42639942fd8SKnut Petersen  * called every time when fbcon_switch is executed. The advantage is that with
4277f927fccSAlexey Dobriyan  * this flag set you can really be sure that set_par is always called before
42825985edcSLucas De Marchi  * any of the functions dependent on the correct hardware state or altering
42939942fd8SKnut Petersen  * that state, even if you are using some broken X releases. The disadvantage
43039942fd8SKnut Petersen  * is that it introduces unwanted delays to every console switch if set_par
43139942fd8SKnut Petersen  * is slow. It is a good idea to try this flag in the drivers initialization
43239942fd8SKnut Petersen  * code whenever there is a bug report related to switching between X and the
43339942fd8SKnut Petersen  * framebuffer console.
43439942fd8SKnut Petersen  */
43539942fd8SKnut Petersen #define FBINFO_MISC_ALWAYS_SETPAR   0x40000
43639942fd8SKnut Petersen 
437e4c690e0SAnton Vorontsov /*
438e4c690e0SAnton Vorontsov  * Host and GPU endianness differ.
439e4c690e0SAnton Vorontsov  */
440e4c690e0SAnton Vorontsov #define FBINFO_FOREIGN_ENDIAN	0x100000
441e4c690e0SAnton Vorontsov /*
442e4c690e0SAnton Vorontsov  * Big endian math. This is the same flags as above, but with different
443e4c690e0SAnton Vorontsov  * meaning, it is set by the fb subsystem depending FOREIGN_ENDIAN flag
444e4c690e0SAnton Vorontsov  * and host endianness. Drivers should not use this flag.
445e4c690e0SAnton Vorontsov  */
446e4c690e0SAnton Vorontsov #define FBINFO_BE_MATH  0x100000
447da6c7707SDaniel Vetter /*
448da6c7707SDaniel Vetter  * Hide smem_start in the FBIOGET_FSCREENINFO IOCTL. This is used by modern DRM
449da6c7707SDaniel Vetter  * drivers to stop userspace from trying to share buffers behind the kernel's
450da6c7707SDaniel Vetter  * back. Instead dma-buf based buffer sharing should be used.
451da6c7707SDaniel Vetter  */
452da6c7707SDaniel Vetter #define FBINFO_HIDE_SMEM_START  0x200000
453da6c7707SDaniel Vetter 
454e4c690e0SAnton Vorontsov 
4551da177e4SLinus Torvalds struct fb_info {
4560189cb57SXiyu Yang 	refcount_t count;
4571da177e4SLinus Torvalds 	int node;
4581da177e4SLinus Torvalds 	int flags;
459c9e6a364SHans de Goede 	/*
460c9e6a364SHans de Goede 	 * -1 by default, set to a FB_ROTATE_* value by the driver, if it knows
461c9e6a364SHans de Goede 	 * a lcd is not mounted upright and fbcon should rotate to compensate.
462c9e6a364SHans de Goede 	 */
463c9e6a364SHans de Goede 	int fbcon_rotate_hint;
4643e680aaeSKrzysztof Helt 	struct mutex lock;		/* Lock for open/release/ioctl funcs */
465537a1bf0SKrzysztof Helt 	struct mutex mm_lock;		/* Lock for fb_mmap and smem_* fields */
4661da177e4SLinus Torvalds 	struct fb_var_screeninfo var;	/* Current var */
4671da177e4SLinus Torvalds 	struct fb_fix_screeninfo fix;	/* Current fix */
4681da177e4SLinus Torvalds 	struct fb_monspecs monspecs;	/* Current Monitor specs */
4691da177e4SLinus Torvalds 	struct fb_pixmap pixmap;	/* Image hardware mapper */
4701da177e4SLinus Torvalds 	struct fb_pixmap sprite;	/* Cursor hardware mapper */
4711da177e4SLinus Torvalds 	struct fb_cmap cmap;		/* Current cmap */
4721da177e4SLinus Torvalds 	struct list_head modelist;      /* mode list */
4731da177e4SLinus Torvalds 	struct fb_videomode *mode;	/* current mode */
4745474c120SMichael Hanselmann 
475b4a1ed0cSRob Clark #if IS_ENABLED(CONFIG_FB_BACKLIGHT)
4765474c120SMichael Hanselmann 	/* assigned backlight device */
47737ce69a5SRichard Purdie 	/* set before framebuffer registration,
47837ce69a5SRichard Purdie 	   remove after unregister */
4795474c120SMichael Hanselmann 	struct backlight_device *bl_dev;
4805474c120SMichael Hanselmann 
4815474c120SMichael Hanselmann 	/* Backlight level curve */
48237ce69a5SRichard Purdie 	struct mutex bl_curve_mutex;
4835474c120SMichael Hanselmann 	u8 bl_curve[FB_BACKLIGHT_LEVELS];
4845474c120SMichael Hanselmann #endif
48526228256SThomas Zimmermann 
48626228256SThomas Zimmermann 	/*
48726228256SThomas Zimmermann 	 * Assigned LCD device; set before framebuffer
48826228256SThomas Zimmermann 	 * registration, remove after unregister
48926228256SThomas Zimmermann 	 */
49026228256SThomas Zimmermann 	struct lcd_device *lcd_dev;
49126228256SThomas Zimmermann 
49260b59beaSJaya Kumar #ifdef CONFIG_FB_DEFERRED_IO
49360b59beaSJaya Kumar 	struct delayed_work deferred_work;
49456c134f7SThomas Zimmermann 	unsigned long npagerefs;
49556c134f7SThomas Zimmermann 	struct fb_deferred_io_pageref *pagerefs;
49660b59beaSJaya Kumar 	struct fb_deferred_io *fbdefio;
49760b59beaSJaya Kumar #endif
4985474c120SMichael Hanselmann 
499bf9e25ecSJani Nikula 	const struct fb_ops *fbops;
50078cde088SGreg Kroah-Hartman 	struct device *device;		/* This is the parent */
501701d2054SThomas Zimmermann #if defined(CONFIG_FB_DEVICE)
50278cde088SGreg Kroah-Hartman 	struct device *dev;		/* This is this fb device */
503701d2054SThomas Zimmermann #endif
5041a6600beSAntonino A. Daplas 	int class_flag;                    /* private sysfs flags */
5051da177e4SLinus Torvalds #ifdef CONFIG_FB_TILEBLITTING
5061da177e4SLinus Torvalds 	struct fb_tile_ops *tileops;    /* Tile Blitting */
5071da177e4SLinus Torvalds #endif
50817a7b0b4SLars Svensson 	union {
5091da177e4SLinus Torvalds 		char __iomem *screen_base;	/* Virtual address */
51017a7b0b4SLars Svensson 		char *screen_buffer;
51117a7b0b4SLars Svensson 	};
5121da177e4SLinus Torvalds 	unsigned long screen_size;	/* Amount of ioremapped VRAM or 0 */
5131da177e4SLinus Torvalds 	void *pseudo_palette;		/* Fake palette of 16 colors */
5141da177e4SLinus Torvalds #define FBINFO_STATE_RUNNING	0
5151da177e4SLinus Torvalds #define FBINFO_STATE_SUSPENDED	1
5161da177e4SLinus Torvalds 	u32 state;			/* Hardware state i.e suspend */
5171da177e4SLinus Torvalds 	void *fbcon_par;                /* fbcon use-only private area */
5181da177e4SLinus Torvalds 	/* From here on everything is device dependent */
5191da177e4SLinus Torvalds 	void *par;
5203cf2667bSJesse Barnes 
5213cf2667bSJesse Barnes 	bool skip_vt_switch; /* no VT switch on suspend/resume required */
522d20a9f56SJocelyn Falempe 	bool skip_panic; /* Do not write to the fb after a panic */
5231da177e4SLinus Torvalds };
5241da177e4SLinus Torvalds 
5251da177e4SLinus Torvalds /* This will go away
5261da177e4SLinus Torvalds  * fbset currently hacks in FB_ACCELF_TEXT into var.accel_flags
5271da177e4SLinus Torvalds  * when it wants to turn the acceleration engine on.  This is
5281da177e4SLinus Torvalds  * really a separate operation, and should be modified via sysfs.
5291da177e4SLinus Torvalds  *  But for now, we leave it broken with the following define
5301da177e4SLinus Torvalds  */
5311da177e4SLinus Torvalds #define STUPID_ACCELF_TEXT_SHIT
5321da177e4SLinus Torvalds 
533e4c690e0SAnton Vorontsov #define FB_LEFT_POS(p, bpp)          (fb_be_math(p) ? (32 - (bpp)) : 0)
534e4c690e0SAnton Vorontsov #define FB_SHIFT_HIGH(p, val, bits)  (fb_be_math(p) ? (val) >> (bits) : \
535e4c690e0SAnton Vorontsov 						      (val) << (bits))
536e4c690e0SAnton Vorontsov #define FB_SHIFT_LOW(p, val, bits)   (fb_be_math(p) ? (val) << (bits) : \
537e4c690e0SAnton Vorontsov 						      (val) >> (bits))
538be0d9b6cSAntonino A. Daplas 
5391da177e4SLinus Torvalds     /*
5401da177e4SLinus Torvalds      *  `Generic' versions of the frame buffer device operations
5411da177e4SLinus Torvalds      */
5421da177e4SLinus Torvalds 
5431da177e4SLinus Torvalds extern int fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var);
5441da177e4SLinus Torvalds extern int fb_pan_display(struct fb_info *info, struct fb_var_screeninfo *var);
5451da177e4SLinus Torvalds extern int fb_blank(struct fb_info *info, int blank);
5466121cd9eSThomas Zimmermann 
5476121cd9eSThomas Zimmermann /*
5489c053ef5SThomas Zimmermann  * Helpers for framebuffers in I/O memory
5496121cd9eSThomas Zimmermann  */
5506121cd9eSThomas Zimmermann 
5511da177e4SLinus Torvalds extern void cfb_fillrect(struct fb_info *info, const struct fb_fillrect *rect);
5521da177e4SLinus Torvalds extern void cfb_copyarea(struct fb_info *info, const struct fb_copyarea *area);
5531da177e4SLinus Torvalds extern void cfb_imageblit(struct fb_info *info, const struct fb_image *image);
5546121cd9eSThomas Zimmermann extern ssize_t fb_io_read(struct fb_info *info, char __user *buf,
5556121cd9eSThomas Zimmermann 			  size_t count, loff_t *ppos);
5566121cd9eSThomas Zimmermann extern ssize_t fb_io_write(struct fb_info *info, const char __user *buf,
5576121cd9eSThomas Zimmermann 			   size_t count, loff_t *ppos);
55833253d9eSThomas Zimmermann int fb_io_mmap(struct fb_info *info, struct vm_area_struct *vma);
5596121cd9eSThomas Zimmermann 
5604520844bSThomas Zimmermann #define __FB_DEFAULT_IOMEM_OPS_RDWR \
561f1061fa6SThomas Zimmermann 	.fb_read	= fb_io_read, \
562f1061fa6SThomas Zimmermann 	.fb_write	= fb_io_write
563f1061fa6SThomas Zimmermann 
5644520844bSThomas Zimmermann #define __FB_DEFAULT_IOMEM_OPS_DRAW \
565f1061fa6SThomas Zimmermann 	.fb_fillrect	= cfb_fillrect, \
566f1061fa6SThomas Zimmermann 	.fb_copyarea	= cfb_copyarea, \
567f1061fa6SThomas Zimmermann 	.fb_imageblit	= cfb_imageblit
568f1061fa6SThomas Zimmermann 
5694520844bSThomas Zimmermann #define __FB_DEFAULT_IOMEM_OPS_MMAP \
57033253d9eSThomas Zimmermann 	.fb_mmap	= fb_io_mmap
571f1061fa6SThomas Zimmermann 
5724520844bSThomas Zimmermann #define FB_DEFAULT_IOMEM_OPS \
5734520844bSThomas Zimmermann 	__FB_DEFAULT_IOMEM_OPS_RDWR, \
5744520844bSThomas Zimmermann 	__FB_DEFAULT_IOMEM_OPS_DRAW, \
5754520844bSThomas Zimmermann 	__FB_DEFAULT_IOMEM_OPS_MMAP
576f1061fa6SThomas Zimmermann 
577f1061fa6SThomas Zimmermann /*
5789c053ef5SThomas Zimmermann  * Helpers for framebuffers in system memory
57968648ed1SAntonino A. Daplas  */
580f1061fa6SThomas Zimmermann 
58168648ed1SAntonino A. Daplas extern void sys_fillrect(struct fb_info *info, const struct fb_fillrect *rect);
58268648ed1SAntonino A. Daplas extern void sys_copyarea(struct fb_info *info, const struct fb_copyarea *area);
58368648ed1SAntonino A. Daplas extern void sys_imageblit(struct fb_info *info, const struct fb_image *image);
58409aaf268SAntonino A. Daplas extern ssize_t fb_sys_read(struct fb_info *info, char __user *buf,
58509aaf268SAntonino A. Daplas 			   size_t count, loff_t *ppos);
58609aaf268SAntonino A. Daplas extern ssize_t fb_sys_write(struct fb_info *info, const char __user *buf,
58709aaf268SAntonino A. Daplas 			    size_t count, loff_t *ppos);
5881da177e4SLinus Torvalds 
589cd8a064fSThomas Zimmermann #define __FB_DEFAULT_SYSMEM_OPS_RDWR \
590f1061fa6SThomas Zimmermann 	.fb_read	= fb_sys_read, \
591f1061fa6SThomas Zimmermann 	.fb_write	= fb_sys_write
592f1061fa6SThomas Zimmermann 
593cd8a064fSThomas Zimmermann #define __FB_DEFAULT_SYSMEM_OPS_DRAW \
594f1061fa6SThomas Zimmermann 	.fb_fillrect	= sys_fillrect, \
595f1061fa6SThomas Zimmermann 	.fb_copyarea	= sys_copyarea, \
596f1061fa6SThomas Zimmermann 	.fb_imageblit	= sys_imageblit
597f1061fa6SThomas Zimmermann 
5986f0f6941SThomas Zimmermann /*
5996f0f6941SThomas Zimmermann  * Helpers for framebuffers in DMA-able memory
6006f0f6941SThomas Zimmermann  */
6016f0f6941SThomas Zimmermann 
602b21f187fSThomas Zimmermann #define __FB_DEFAULT_DMAMEM_OPS_RDWR \
6036f0f6941SThomas Zimmermann 	.fb_read	= fb_sys_read, \
6046f0f6941SThomas Zimmermann 	.fb_write	= fb_sys_write
6056f0f6941SThomas Zimmermann 
606b21f187fSThomas Zimmermann #define __FB_DEFAULT_DMAMEM_OPS_DRAW \
6076f0f6941SThomas Zimmermann 	.fb_fillrect	= sys_fillrect, \
6086f0f6941SThomas Zimmermann 	.fb_copyarea	= sys_copyarea, \
6096f0f6941SThomas Zimmermann 	.fb_imageblit	= sys_imageblit
6106f0f6941SThomas Zimmermann 
6114a9762aaSJonathan Neuschäfer /* fbmem.c */
6121da177e4SLinus Torvalds extern int register_framebuffer(struct fb_info *fb_info);
613deb00d27SDaniel Vetter extern void unregister_framebuffer(struct fb_info *fb_info);
614929c81adSThomas Weißschuh extern int devm_register_framebuffer(struct device *dev, struct fb_info *fb_info);
6151da177e4SLinus Torvalds extern char* fb_get_buffer_offset(struct fb_info *info, struct fb_pixmap *buf, u32 size);
616f1ab5dacSJames Simmons extern void fb_pad_unaligned_buffer(u8 *dst, u32 d_pitch, u8 *src, u32 idx,
6171da177e4SLinus Torvalds 				u32 height, u32 shift_high, u32 shift_low, u32 mod);
618f1ab5dacSJames Simmons extern void fb_pad_aligned_buffer(u8 *dst, u32 d_pitch, u8 *src, u32 s_pitch, u32 height);
6191da177e4SLinus Torvalds extern void fb_set_suspend(struct fb_info *info, int state);
620b8c90945SAntonino A. Daplas extern int fb_get_color_depth(struct fb_var_screeninfo *var,
621b8c90945SAntonino A. Daplas 			      struct fb_fix_screeninfo *fix);
622a66e62aeSVincent Stehlé extern int fb_get_options(const char *name, char **option);
6231da177e4SLinus Torvalds extern int fb_new_modelist(struct fb_info *info);
6241da177e4SLinus Torvalds 
lock_fb_info(struct fb_info * info)625cf4a3ae4SDaniel Vetter static inline void lock_fb_info(struct fb_info *info)
626cf4a3ae4SDaniel Vetter {
627cf4a3ae4SDaniel Vetter 	mutex_lock(&info->lock);
628cf4a3ae4SDaniel Vetter }
6291f5e31d7SAndrea Righi 
unlock_fb_info(struct fb_info * info)6301f5e31d7SAndrea Righi static inline void unlock_fb_info(struct fb_info *info)
6311f5e31d7SAndrea Righi {
6321f5e31d7SAndrea Righi 	mutex_unlock(&info->lock);
6331f5e31d7SAndrea Righi }
6341f5e31d7SAndrea Righi 
__fb_pad_aligned_buffer(u8 * dst,u32 d_pitch,u8 * src,u32 s_pitch,u32 height)635829e79b6SAntonino A. Daplas static inline void __fb_pad_aligned_buffer(u8 *dst, u32 d_pitch,
636829e79b6SAntonino A. Daplas 					   u8 *src, u32 s_pitch, u32 height)
637829e79b6SAntonino A. Daplas {
638ee346873SBrian W Hart 	u32 i, j;
639829e79b6SAntonino A. Daplas 
640829e79b6SAntonino A. Daplas 	d_pitch -= s_pitch;
641829e79b6SAntonino A. Daplas 
642829e79b6SAntonino A. Daplas 	for (i = height; i--; ) {
643829e79b6SAntonino A. Daplas 		/* s_pitch is a few bytes at the most, memcpy is suboptimal */
644829e79b6SAntonino A. Daplas 		for (j = 0; j < s_pitch; j++)
645829e79b6SAntonino A. Daplas 			*dst++ = *src++;
646829e79b6SAntonino A. Daplas 		dst += d_pitch;
647829e79b6SAntonino A. Daplas 	}
648829e79b6SAntonino A. Daplas }
649829e79b6SAntonino A. Daplas 
6504a9762aaSJonathan Neuschäfer /* fb_defio.c */
651ba026334SNoralf Trønnes int fb_deferred_io_mmap(struct fb_info *info, struct vm_area_struct *vma);
65256c134f7SThomas Zimmermann extern int  fb_deferred_io_init(struct fb_info *info);
6530b78f8bcSMatthew Wilcox extern void fb_deferred_io_open(struct fb_info *info,
6540b78f8bcSMatthew Wilcox 				struct inode *inode,
6550b78f8bcSMatthew Wilcox 				struct file *file);
6563efc61d9STakashi Iwai extern void fb_deferred_io_release(struct fb_info *info);
65760b59beaSJaya Kumar extern void fb_deferred_io_cleanup(struct fb_info *info);
65802c24a82SJosef Bacik extern int fb_deferred_io_fsync(struct file *file, loff_t start,
65902c24a82SJosef Bacik 				loff_t end, int datasync);
66060b59beaSJaya Kumar 
661f1061fa6SThomas Zimmermann /*
662f1061fa6SThomas Zimmermann  * Generate callbacks for deferred I/O
663f1061fa6SThomas Zimmermann  */
664f1061fa6SThomas Zimmermann 
665f1061fa6SThomas Zimmermann #define __FB_GEN_DEFAULT_DEFERRED_OPS_RDWR(__prefix, __damage_range, __mode) \
666f1061fa6SThomas Zimmermann 	static ssize_t __prefix ## _defio_read(struct fb_info *info, char __user *buf, \
667f1061fa6SThomas Zimmermann 					       size_t count, loff_t *ppos) \
668f1061fa6SThomas Zimmermann 	{ \
669f1061fa6SThomas Zimmermann 		return fb_ ## __mode ## _read(info, buf, count, ppos); \
670f1061fa6SThomas Zimmermann 	} \
671f1061fa6SThomas Zimmermann 	static ssize_t __prefix ## _defio_write(struct fb_info *info, const char __user *buf, \
672f1061fa6SThomas Zimmermann 						size_t count, loff_t *ppos) \
673f1061fa6SThomas Zimmermann 	{ \
674f1061fa6SThomas Zimmermann 		unsigned long offset = *ppos; \
675f1061fa6SThomas Zimmermann 		ssize_t ret = fb_ ## __mode ## _write(info, buf, count, ppos); \
676f1061fa6SThomas Zimmermann 		if (ret > 0) \
677f1061fa6SThomas Zimmermann 			__damage_range(info, offset, ret); \
678f1061fa6SThomas Zimmermann 		return ret; \
679f1061fa6SThomas Zimmermann 	}
680f1061fa6SThomas Zimmermann 
681f1061fa6SThomas Zimmermann #define __FB_GEN_DEFAULT_DEFERRED_OPS_DRAW(__prefix, __damage_area, __mode) \
682f1061fa6SThomas Zimmermann 	static void __prefix ## _defio_fillrect(struct fb_info *info, \
683f1061fa6SThomas Zimmermann 						const struct fb_fillrect *rect) \
684f1061fa6SThomas Zimmermann 	{ \
685f1061fa6SThomas Zimmermann 		__mode ## _fillrect(info, rect); \
686f1061fa6SThomas Zimmermann 		__damage_area(info, rect->dx, rect->dy, rect->width, rect->height); \
687f1061fa6SThomas Zimmermann 	} \
688f1061fa6SThomas Zimmermann 	static void __prefix ## _defio_copyarea(struct fb_info *info, \
689f1061fa6SThomas Zimmermann 						const struct fb_copyarea *area) \
690f1061fa6SThomas Zimmermann 	{ \
691f1061fa6SThomas Zimmermann 		__mode ## _copyarea(info, area); \
692f1061fa6SThomas Zimmermann 		__damage_area(info, area->dx, area->dy, area->width, area->height); \
693f1061fa6SThomas Zimmermann 	} \
694f1061fa6SThomas Zimmermann 	static void __prefix ## _defio_imageblit(struct fb_info *info, \
695f1061fa6SThomas Zimmermann 						 const struct fb_image *image) \
696f1061fa6SThomas Zimmermann 	{ \
697f1061fa6SThomas Zimmermann 		__mode ## _imageblit(info, image); \
698f1061fa6SThomas Zimmermann 		__damage_area(info, image->dx, image->dy, image->width, image->height); \
699f1061fa6SThomas Zimmermann 	}
700f1061fa6SThomas Zimmermann 
701744d35d3SThomas Zimmermann #define FB_GEN_DEFAULT_DEFERRED_IOMEM_OPS(__prefix, __damage_range, __damage_area) \
702f1061fa6SThomas Zimmermann 	__FB_GEN_DEFAULT_DEFERRED_OPS_RDWR(__prefix, __damage_range, io) \
703f1061fa6SThomas Zimmermann 	__FB_GEN_DEFAULT_DEFERRED_OPS_DRAW(__prefix, __damage_area, cfb)
704f1061fa6SThomas Zimmermann 
705744d35d3SThomas Zimmermann #define FB_GEN_DEFAULT_DEFERRED_SYSMEM_OPS(__prefix, __damage_range, __damage_area) \
706f1061fa6SThomas Zimmermann 	__FB_GEN_DEFAULT_DEFERRED_OPS_RDWR(__prefix, __damage_range, sys) \
707f1061fa6SThomas Zimmermann 	__FB_GEN_DEFAULT_DEFERRED_OPS_DRAW(__prefix, __damage_area, sys)
708f1061fa6SThomas Zimmermann 
70901c0cce8STony Lindgren #define FB_GEN_DEFAULT_DEFERRED_DMAMEM_OPS(__prefix, __damage_range, __damage_area) \
71001c0cce8STony Lindgren 	__FB_GEN_DEFAULT_DEFERRED_OPS_RDWR(__prefix, __damage_range, sys) \
71101c0cce8STony Lindgren 	__FB_GEN_DEFAULT_DEFERRED_OPS_DRAW(__prefix, __damage_area, sys)
71201c0cce8STony Lindgren 
713f1061fa6SThomas Zimmermann /*
714f1061fa6SThomas Zimmermann  * Initializes struct fb_ops for deferred I/O.
715f1061fa6SThomas Zimmermann  */
716f1061fa6SThomas Zimmermann 
717f1061fa6SThomas Zimmermann #define __FB_DEFAULT_DEFERRED_OPS_RDWR(__prefix) \
718f1061fa6SThomas Zimmermann 	.fb_read	= __prefix ## _defio_read, \
719f1061fa6SThomas Zimmermann 	.fb_write	= __prefix ## _defio_write
720f1061fa6SThomas Zimmermann 
721f1061fa6SThomas Zimmermann #define __FB_DEFAULT_DEFERRED_OPS_DRAW(__prefix) \
722f1061fa6SThomas Zimmermann 	.fb_fillrect	= __prefix ## _defio_fillrect, \
723f1061fa6SThomas Zimmermann 	.fb_copyarea	= __prefix ## _defio_copyarea, \
724f1061fa6SThomas Zimmermann 	.fb_imageblit	= __prefix ## _defio_imageblit
725f1061fa6SThomas Zimmermann 
726f1061fa6SThomas Zimmermann #define __FB_DEFAULT_DEFERRED_OPS_MMAP(__prefix) \
727f1061fa6SThomas Zimmermann 	.fb_mmap	= fb_deferred_io_mmap
728f1061fa6SThomas Zimmermann 
729f1061fa6SThomas Zimmermann #define FB_DEFAULT_DEFERRED_OPS(__prefix) \
730f1061fa6SThomas Zimmermann 	__FB_DEFAULT_DEFERRED_OPS_RDWR(__prefix), \
731f1061fa6SThomas Zimmermann 	__FB_DEFAULT_DEFERRED_OPS_DRAW(__prefix), \
732f1061fa6SThomas Zimmermann 	__FB_DEFAULT_DEFERRED_OPS_MMAP(__prefix)
733f1061fa6SThomas Zimmermann 
fb_be_math(struct fb_info * info)734e4c690e0SAnton Vorontsov static inline bool fb_be_math(struct fb_info *info)
735e4c690e0SAnton Vorontsov {
736e4c690e0SAnton Vorontsov #ifdef CONFIG_FB_FOREIGN_ENDIAN
737e4c690e0SAnton Vorontsov #if defined(CONFIG_FB_BOTH_ENDIAN)
738e4c690e0SAnton Vorontsov 	return info->flags & FBINFO_BE_MATH;
739e4c690e0SAnton Vorontsov #elif defined(CONFIG_FB_BIG_ENDIAN)
740e4c690e0SAnton Vorontsov 	return true;
741e4c690e0SAnton Vorontsov #elif defined(CONFIG_FB_LITTLE_ENDIAN)
742e4c690e0SAnton Vorontsov 	return false;
743e4c690e0SAnton Vorontsov #endif /* CONFIG_FB_BOTH_ENDIAN */
744e4c690e0SAnton Vorontsov #else
745e4c690e0SAnton Vorontsov #ifdef __BIG_ENDIAN
746e4c690e0SAnton Vorontsov 	return true;
747e4c690e0SAnton Vorontsov #else
748e4c690e0SAnton Vorontsov 	return false;
749e4c690e0SAnton Vorontsov #endif /* __BIG_ENDIAN */
750e4c690e0SAnton Vorontsov #endif /* CONFIG_FB_FOREIGN_ENDIAN */
751e4c690e0SAnton Vorontsov }
752e4c690e0SAnton Vorontsov 
7531da177e4SLinus Torvalds extern struct fb_info *framebuffer_alloc(size_t size, struct device *dev);
7541da177e4SLinus Torvalds extern void framebuffer_release(struct fb_info *info);
7555474c120SMichael Hanselmann extern void fb_bl_default_curve(struct fb_info *fb_info, u8 off, u8 min, u8 max);
7561da177e4SLinus Torvalds 
757e6c6fea5SThomas Zimmermann #if IS_ENABLED(CONFIG_FB_BACKLIGHT)
758e6c6fea5SThomas Zimmermann struct backlight_device *fb_bl_device(struct fb_info *info);
759e6c6fea5SThomas Zimmermann #else
fb_bl_device(struct fb_info * info)760e6c6fea5SThomas Zimmermann static inline struct backlight_device *fb_bl_device(struct fb_info *info)
761e6c6fea5SThomas Zimmermann {
762e6c6fea5SThomas Zimmermann 	return NULL;
763e6c6fea5SThomas Zimmermann }
764e6c6fea5SThomas Zimmermann #endif
765e6c6fea5SThomas Zimmermann 
fb_lcd_device(struct fb_info * info)76626228256SThomas Zimmermann static inline struct lcd_device *fb_lcd_device(struct fb_info *info)
76726228256SThomas Zimmermann {
76826228256SThomas Zimmermann 	return info->lcd_dev;
76926228256SThomas Zimmermann }
77026228256SThomas Zimmermann 
7714a9762aaSJonathan Neuschäfer /* fbmon.c */
7721da177e4SLinus Torvalds #define FB_MAXTIMINGS		0
7731da177e4SLinus Torvalds #define FB_VSYNCTIMINGS		1
7741da177e4SLinus Torvalds #define FB_HSYNCTIMINGS		2
7751da177e4SLinus Torvalds #define FB_DCLKTIMINGS		3
7761da177e4SLinus Torvalds #define FB_IGNOREMON		0x100
7771da177e4SLinus Torvalds 
7781da177e4SLinus Torvalds #define FB_MODE_IS_UNKNOWN	0
7791da177e4SLinus Torvalds #define FB_MODE_IS_DETAILED	1
7801da177e4SLinus Torvalds #define FB_MODE_IS_STANDARD	2
7811da177e4SLinus Torvalds #define FB_MODE_IS_VESA		4
7821da177e4SLinus Torvalds #define FB_MODE_IS_CALCULATED	8
7831da177e4SLinus Torvalds #define FB_MODE_IS_FIRST	16
7841da177e4SLinus Torvalds #define FB_MODE_IS_FROM_VAR     32
7851da177e4SLinus Torvalds 
7861da177e4SLinus Torvalds extern int fbmon_dpms(const struct fb_info *fb_info);
7871da177e4SLinus Torvalds extern int fb_get_mode(int flags, u32 val, struct fb_var_screeninfo *var,
7881da177e4SLinus Torvalds 		       struct fb_info *info);
7891da177e4SLinus Torvalds extern int fb_validate_mode(const struct fb_var_screeninfo *var,
7901da177e4SLinus Torvalds 			    struct fb_info *info);
7911da177e4SLinus Torvalds extern int fb_parse_edid(unsigned char *edid, struct fb_var_screeninfo *var);
7925e518d76SAntonino A. Daplas extern const unsigned char *fb_firmware_edid(struct device *device);
7935e518d76SAntonino A. Daplas extern void fb_edid_to_monspecs(unsigned char *edid,
7945e518d76SAntonino A. Daplas 				struct fb_monspecs *specs);
7951da177e4SLinus Torvalds extern void fb_destroy_modedb(struct fb_videomode *modedb);
79696fe6a21SAntonino A. Daplas extern int fb_find_mode_cvt(struct fb_videomode *mode, int margins, int rb);
797fc5891c8SDennis Munsie extern unsigned char *fb_ddc_read(struct i2c_adapter *adapter);
7981da177e4SLinus Torvalds 
79979089044SSteffen Trumtrar extern int of_get_fb_videomode(struct device_node *np,
80079089044SSteffen Trumtrar 			       struct fb_videomode *fb,
80179089044SSteffen Trumtrar 			       int index);
8022db54c72SSteffen Trumtrar extern int fb_videomode_from_videomode(const struct videomode *vm,
8032db54c72SSteffen Trumtrar 				       struct fb_videomode *fbmode);
8042db54c72SSteffen Trumtrar 
8054a9762aaSJonathan Neuschäfer /* modedb.c */
80637715f55SDavid Ung #define VESA_MODEDB_SIZE 43
8078f5ee77bSDavid Ung #define DMT_SIZE 0x50
8088f5ee77bSDavid Ung 
8091da177e4SLinus Torvalds extern void fb_var_to_videomode(struct fb_videomode *mode,
8109791d763SGeert Uytterhoeven 				const struct fb_var_screeninfo *var);
8111da177e4SLinus Torvalds extern void fb_videomode_to_var(struct fb_var_screeninfo *var,
8129791d763SGeert Uytterhoeven 				const struct fb_videomode *mode);
8139791d763SGeert Uytterhoeven extern int fb_mode_is_equal(const struct fb_videomode *mode1,
8149791d763SGeert Uytterhoeven 			    const struct fb_videomode *mode2);
8159791d763SGeert Uytterhoeven extern int fb_add_videomode(const struct fb_videomode *mode,
8161da177e4SLinus Torvalds 			    struct list_head *head);
8179791d763SGeert Uytterhoeven extern void fb_delete_videomode(const struct fb_videomode *mode,
8181da177e4SLinus Torvalds 				struct list_head *head);
8199791d763SGeert Uytterhoeven extern const struct fb_videomode *fb_match_mode(const struct fb_var_screeninfo *var,
8201da177e4SLinus Torvalds 						struct list_head *head);
8219791d763SGeert Uytterhoeven extern const struct fb_videomode *fb_find_best_mode(const struct fb_var_screeninfo *var,
8229791d763SGeert Uytterhoeven 						    struct list_head *head);
8239791d763SGeert Uytterhoeven extern const struct fb_videomode *fb_find_nearest_mode(const struct fb_videomode *mode,
8241da177e4SLinus Torvalds 						       struct list_head *head);
8251da177e4SLinus Torvalds extern void fb_destroy_modelist(struct list_head *head);
8269791d763SGeert Uytterhoeven extern void fb_videomode_to_modelist(const struct fb_videomode *modedb, int num,
8271da177e4SLinus Torvalds 				     struct list_head *head);
8289791d763SGeert Uytterhoeven extern const struct fb_videomode *fb_find_best_display(const struct fb_monspecs *specs,
829003cfc0cSAntonino A. Daplas 						       struct list_head *head);
8301da177e4SLinus Torvalds 
8314a9762aaSJonathan Neuschäfer /* fbcmap.c */
8321da177e4SLinus Torvalds extern int fb_alloc_cmap(struct fb_cmap *cmap, int len, int transp);
8331e7c7804SDan Carpenter extern int fb_alloc_cmap_gfp(struct fb_cmap *cmap, int len, int transp, gfp_t flags);
8341da177e4SLinus Torvalds extern void fb_dealloc_cmap(struct fb_cmap *cmap);
835adf6b206SHelge Deller extern int fb_copy_cmap(const struct fb_cmap *from, struct fb_cmap *to);
836adf6b206SHelge Deller extern int fb_cmap_to_user(const struct fb_cmap *from, struct fb_cmap_user *to);
8371da177e4SLinus Torvalds extern int fb_set_cmap(struct fb_cmap *cmap, struct fb_info *fb_info);
8381da177e4SLinus Torvalds extern int fb_set_user_cmap(struct fb_cmap_user *cmap, struct fb_info *fb_info);
839adf6b206SHelge Deller extern const struct fb_cmap *fb_default_cmap(int len);
8401da177e4SLinus Torvalds extern void fb_invert_cmaps(void);
8411da177e4SLinus Torvalds 
8421da177e4SLinus Torvalds struct fb_videomode {
8431da177e4SLinus Torvalds 	const char *name;	/* optional */
8441da177e4SLinus Torvalds 	u32 refresh;		/* optional */
8451da177e4SLinus Torvalds 	u32 xres;
8461da177e4SLinus Torvalds 	u32 yres;
8471da177e4SLinus Torvalds 	u32 pixclock;
8481da177e4SLinus Torvalds 	u32 left_margin;
8491da177e4SLinus Torvalds 	u32 right_margin;
8501da177e4SLinus Torvalds 	u32 upper_margin;
8511da177e4SLinus Torvalds 	u32 lower_margin;
8521da177e4SLinus Torvalds 	u32 hsync_len;
8531da177e4SLinus Torvalds 	u32 vsync_len;
8541da177e4SLinus Torvalds 	u32 sync;
8551da177e4SLinus Torvalds 	u32 vmode;
8561da177e4SLinus Torvalds 	u32 flag;
8571da177e4SLinus Torvalds };
8581da177e4SLinus Torvalds 
8598f5ee77bSDavid Ung struct dmt_videomode {
8608f5ee77bSDavid Ung 	u32 dmt_id;
8618f5ee77bSDavid Ung 	u32 std_2byte_code;
8628f5ee77bSDavid Ung 	u32 cvt_3byte_code;
8638f5ee77bSDavid Ung 	const struct fb_videomode *mode;
8648f5ee77bSDavid Ung };
8658f5ee77bSDavid Ung 
8661da177e4SLinus Torvalds extern const struct fb_videomode vesa_modes[];
8678f5ee77bSDavid Ung extern const struct dmt_videomode dmt_modes[];
8681da177e4SLinus Torvalds 
8691da177e4SLinus Torvalds struct fb_modelist {
8701da177e4SLinus Torvalds 	struct list_head list;
8711da177e4SLinus Torvalds 	struct fb_videomode mode;
8721da177e4SLinus Torvalds };
8731da177e4SLinus Torvalds 
8741da177e4SLinus Torvalds extern int fb_find_mode(struct fb_var_screeninfo *var,
8751da177e4SLinus Torvalds 			struct fb_info *info, const char *mode_option,
8761da177e4SLinus Torvalds 			const struct fb_videomode *db,
8771da177e4SLinus Torvalds 			unsigned int dbsize,
8781da177e4SLinus Torvalds 			const struct fb_videomode *default_mode,
8791da177e4SLinus Torvalds 			unsigned int default_bpp);
8801da177e4SLinus Torvalds 
8810ba2fa8cSThomas Zimmermann bool fb_modesetting_disabled(const char *drvname);
8820ba2fa8cSThomas Zimmermann 
883b3e88137SThomas Zimmermann /*
884b3e88137SThomas Zimmermann  * Convenience logging macros
885b3e88137SThomas Zimmermann  */
886b3e88137SThomas Zimmermann 
887f51a07d0SJoe Perches #define fb_err(fb_info, fmt, ...)					\
888f51a07d0SJoe Perches 	pr_err("fb%d: " fmt, (fb_info)->node, ##__VA_ARGS__)
889f51a07d0SJoe Perches #define fb_notice(info, fmt, ...)					\
890f51a07d0SJoe Perches 	pr_notice("fb%d: " fmt, (fb_info)->node, ##__VA_ARGS__)
891f51a07d0SJoe Perches #define fb_warn(fb_info, fmt, ...)					\
892f51a07d0SJoe Perches 	pr_warn("fb%d: " fmt, (fb_info)->node, ##__VA_ARGS__)
893f51a07d0SJoe Perches #define fb_info(fb_info, fmt, ...)					\
894f51a07d0SJoe Perches 	pr_info("fb%d: " fmt, (fb_info)->node, ##__VA_ARGS__)
895f51a07d0SJoe Perches #define fb_dbg(fb_info, fmt, ...)					\
896f51a07d0SJoe Perches 	pr_debug("fb%d: " fmt, (fb_info)->node, ##__VA_ARGS__)
897f51a07d0SJoe Perches 
898b3e88137SThomas Zimmermann #define fb_warn_once(fb_info, fmt, ...)					\
899b3e88137SThomas Zimmermann 	pr_warn_once("fb%d: " fmt, (fb_info)->node, ##__VA_ARGS__)
900b3e88137SThomas Zimmermann 
9018813e86fSThomas Zimmermann #define fb_WARN_ONCE(fb_info, condition, fmt, ...) \
9028813e86fSThomas Zimmermann 	WARN_ONCE(condition, "fb%d: " fmt, (fb_info)->node, ##__VA_ARGS__)
9038813e86fSThomas Zimmermann #define fb_WARN_ON_ONCE(fb_info, x) \
9048813e86fSThomas Zimmermann 	fb_WARN_ONCE(fb_info, (x), "%s", "fb_WARN_ON_ONCE(" __stringify(x) ")")
9058813e86fSThomas Zimmermann 
9061da177e4SLinus Torvalds #endif /* _LINUX_FB_H */
907