diff options
Diffstat (limited to 'include/linux/fb.h')
| -rw-r--r-- | include/linux/fb.h | 177 | 
1 files changed, 124 insertions, 53 deletions
| diff --git a/include/linux/fb.h b/include/linux/fb.h index 08cb47da71f8..ce7d588edc3e 100644 --- a/include/linux/fb.h +++ b/include/linux/fb.h @@ -15,7 +15,8 @@  #include <linux/list.h>  #include <linux/backlight.h>  #include <linux/slab.h> -#include <asm/io.h> + +#include <asm/fb.h>  struct vm_area_struct;  struct fb_info; @@ -511,58 +512,6 @@ struct fb_info {   */  #define STUPID_ACCELF_TEXT_SHIT -// This will go away -#if defined(__sparc__) - -/* We map all of our framebuffers such that big-endian accesses - * are what we want, so the following is sufficient. - */ - -// This will go away -#define fb_readb sbus_readb -#define fb_readw sbus_readw -#define fb_readl sbus_readl -#define fb_readq sbus_readq -#define fb_writeb sbus_writeb -#define fb_writew sbus_writew -#define fb_writel sbus_writel -#define fb_writeq sbus_writeq -#define fb_memset sbus_memset_io -#define fb_memcpy_fromfb sbus_memcpy_fromio -#define fb_memcpy_tofb sbus_memcpy_toio - -#elif defined(__i386__) || defined(__alpha__) || defined(__x86_64__) ||	\ -	defined(__hppa__) || defined(__sh__) || defined(__powerpc__) ||	\ -	defined(__arm__) || defined(__aarch64__) || defined(__mips__) - -#define fb_readb __raw_readb -#define fb_readw __raw_readw -#define fb_readl __raw_readl -#define fb_readq __raw_readq -#define fb_writeb __raw_writeb -#define fb_writew __raw_writew -#define fb_writel __raw_writel -#define fb_writeq __raw_writeq -#define fb_memset memset_io -#define fb_memcpy_fromfb memcpy_fromio -#define fb_memcpy_tofb memcpy_toio - -#else - -#define fb_readb(addr) (*(volatile u8 *) (addr)) -#define fb_readw(addr) (*(volatile u16 *) (addr)) -#define fb_readl(addr) (*(volatile u32 *) (addr)) -#define fb_readq(addr) (*(volatile u64 *) (addr)) -#define fb_writeb(b,addr) (*(volatile u8 *) (addr) = (b)) -#define fb_writew(b,addr) (*(volatile u16 *) (addr) = (b)) -#define fb_writel(b,addr) (*(volatile u32 *) (addr) = (b)) -#define fb_writeq(b,addr) (*(volatile u64 *) (addr) = (b)) -#define fb_memset memset -#define fb_memcpy_fromfb memcpy -#define fb_memcpy_tofb memcpy - -#endif -  #define FB_LEFT_POS(p, bpp)          (fb_be_math(p) ? (32 - (bpp)) : 0)  #define FB_SHIFT_HIGH(p, val, bits)  (fb_be_math(p) ? (val) >> (bits) : \  						      (val) << (bits)) @@ -576,12 +525,44 @@ struct fb_info {  extern int fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var);  extern int fb_pan_display(struct fb_info *info, struct fb_var_screeninfo *var);  extern int fb_blank(struct fb_info *info, int blank); + +/* + * Drawing operations where framebuffer is in I/O memory + */ +  extern void cfb_fillrect(struct fb_info *info, const struct fb_fillrect *rect);  extern void cfb_copyarea(struct fb_info *info, const struct fb_copyarea *area);  extern void cfb_imageblit(struct fb_info *info, const struct fb_image *image); +extern ssize_t fb_io_read(struct fb_info *info, char __user *buf, +			  size_t count, loff_t *ppos); +extern ssize_t fb_io_write(struct fb_info *info, const char __user *buf, +			   size_t count, loff_t *ppos); + +/* + * Initializes struct fb_ops for framebuffers in I/O memory. + */ + +#define __FB_DEFAULT_IO_OPS_RDWR \ +	.fb_read	= fb_io_read, \ +	.fb_write	= fb_io_write + +#define __FB_DEFAULT_IO_OPS_DRAW \ +	.fb_fillrect	= cfb_fillrect, \ +	.fb_copyarea	= cfb_copyarea, \ +	.fb_imageblit	= cfb_imageblit + +#define __FB_DEFAULT_IO_OPS_MMAP \ +	.fb_mmap	= NULL /* default implementation */ + +#define FB_DEFAULT_IO_OPS \ +	__FB_DEFAULT_IO_OPS_RDWR, \ +	__FB_DEFAULT_IO_OPS_DRAW, \ +	__FB_DEFAULT_IO_OPS_MMAP +  /*   * Drawing operations where framebuffer is in system RAM   */ +  extern void sys_fillrect(struct fb_info *info, const struct fb_fillrect *rect);  extern void sys_copyarea(struct fb_info *info, const struct fb_copyarea *area);  extern void sys_imageblit(struct fb_info *info, const struct fb_image *image); @@ -590,6 +571,27 @@ extern ssize_t fb_sys_read(struct fb_info *info, char __user *buf,  extern ssize_t fb_sys_write(struct fb_info *info, const char __user *buf,  			    size_t count, loff_t *ppos); +/* + * Initializes struct fb_ops for framebuffers in system memory. + */ + +#define __FB_DEFAULT_SYS_OPS_RDWR \ +	.fb_read	= fb_sys_read, \ +	.fb_write	= fb_sys_write + +#define __FB_DEFAULT_SYS_OPS_DRAW \ +	.fb_fillrect	= sys_fillrect, \ +	.fb_copyarea	= sys_copyarea, \ +	.fb_imageblit	= sys_imageblit + +#define __FB_DEFAULT_SYS_OPS_MMAP \ +	.fb_mmap	= NULL /* default implementation */ + +#define FB_DEFAULT_SYS_OPS \ +	__FB_DEFAULT_SYS_OPS_RDWR, \ +	__FB_DEFAULT_SYS_OPS_DRAW, \ +	__FB_DEFAULT_SYS_OPS_MMAP +  /* drivers/video/fbmem.c */  extern int register_framebuffer(struct fb_info *fb_info);  extern void unregister_framebuffer(struct fb_info *fb_info); @@ -645,6 +647,75 @@ extern void fb_deferred_io_cleanup(struct fb_info *info);  extern int fb_deferred_io_fsync(struct file *file, loff_t start,  				loff_t end, int datasync); +/* + * Generate callbacks for deferred I/O + */ + +#define __FB_GEN_DEFAULT_DEFERRED_OPS_RDWR(__prefix, __damage_range, __mode) \ +	static ssize_t __prefix ## _defio_read(struct fb_info *info, char __user *buf, \ +					       size_t count, loff_t *ppos) \ +	{ \ +		return fb_ ## __mode ## _read(info, buf, count, ppos); \ +	} \ +	static ssize_t __prefix ## _defio_write(struct fb_info *info, const char __user *buf, \ +						size_t count, loff_t *ppos) \ +	{ \ +		unsigned long offset = *ppos; \ +		ssize_t ret = fb_ ## __mode ## _write(info, buf, count, ppos); \ +		if (ret > 0) \ +			__damage_range(info, offset, ret); \ +		return ret; \ +	} + +#define __FB_GEN_DEFAULT_DEFERRED_OPS_DRAW(__prefix, __damage_area, __mode) \ +	static void __prefix ## _defio_fillrect(struct fb_info *info, \ +						const struct fb_fillrect *rect) \ +	{ \ +		__mode ## _fillrect(info, rect); \ +		__damage_area(info, rect->dx, rect->dy, rect->width, rect->height); \ +	} \ +	static void __prefix ## _defio_copyarea(struct fb_info *info, \ +						const struct fb_copyarea *area) \ +	{ \ +		__mode ## _copyarea(info, area); \ +		__damage_area(info, area->dx, area->dy, area->width, area->height); \ +	} \ +	static void __prefix ## _defio_imageblit(struct fb_info *info, \ +						 const struct fb_image *image) \ +	{ \ +		__mode ## _imageblit(info, image); \ +		__damage_area(info, image->dx, image->dy, image->width, image->height); \ +	} + +#define FB_GEN_DEFAULT_DEFERRED_IO_OPS(__prefix, __damage_range, __damage_area) \ +	__FB_GEN_DEFAULT_DEFERRED_OPS_RDWR(__prefix, __damage_range, io) \ +	__FB_GEN_DEFAULT_DEFERRED_OPS_DRAW(__prefix, __damage_area, cfb) + +#define FB_GEN_DEFAULT_DEFERRED_SYS_OPS(__prefix, __damage_range, __damage_area) \ +	__FB_GEN_DEFAULT_DEFERRED_OPS_RDWR(__prefix, __damage_range, sys) \ +	__FB_GEN_DEFAULT_DEFERRED_OPS_DRAW(__prefix, __damage_area, sys) + +/* + * Initializes struct fb_ops for deferred I/O. + */ + +#define __FB_DEFAULT_DEFERRED_OPS_RDWR(__prefix) \ +	.fb_read	= __prefix ## _defio_read, \ +	.fb_write	= __prefix ## _defio_write + +#define __FB_DEFAULT_DEFERRED_OPS_DRAW(__prefix) \ +	.fb_fillrect	= __prefix ## _defio_fillrect, \ +	.fb_copyarea	= __prefix ## _defio_copyarea, \ +	.fb_imageblit	= __prefix ## _defio_imageblit + +#define __FB_DEFAULT_DEFERRED_OPS_MMAP(__prefix) \ +	.fb_mmap	= fb_deferred_io_mmap + +#define FB_DEFAULT_DEFERRED_OPS(__prefix) \ +	__FB_DEFAULT_DEFERRED_OPS_RDWR(__prefix), \ +	__FB_DEFAULT_DEFERRED_OPS_DRAW(__prefix), \ +	__FB_DEFAULT_DEFERRED_OPS_MMAP(__prefix) +  static inline bool fb_be_math(struct fb_info *info)  {  #ifdef CONFIG_FB_FOREIGN_ENDIAN |