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