From: Benjamin Herrenschmidt This patch kills the bogus radeonfb_read/write routines. In order to do so, it adds a new member to fb_info, along with screen_base, which is screen_size, indicating the mapped area. The default fb_read/write will now use that instead of fix->smem_len if it is non-0, and radeonfb now sets it to the mapped size of the framebuffer. Signed-off-by: Benjamin Herrenschmidt Signed-off-by: Andrew Morton --- 25-akpm/drivers/video/aty/radeon_base.c | 72 -------------------------------- 25-akpm/drivers/video/fbmem.c | 30 ++++++++----- 25-akpm/include/linux/fb.h | 1 3 files changed, 22 insertions(+), 81 deletions(-) diff -puN drivers/video/aty/radeon_base.c~fbdev-radeonfb-remove-bogus-radeonfb_read-write drivers/video/aty/radeon_base.c --- 25/drivers/video/aty/radeon_base.c~fbdev-radeonfb-remove-bogus-radeonfb_read-write 2004-09-12 23:02:40.794850600 -0700 +++ 25-akpm/drivers/video/aty/radeon_base.c 2004-09-12 23:02:40.805848928 -0700 @@ -1702,68 +1702,6 @@ int radeonfb_set_par(struct fb_info *inf } - -static ssize_t radeonfb_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) -{ - unsigned long p = *ppos; - struct inode *inode = file->f_dentry->d_inode; - int fbidx = iminor(inode); - struct fb_info *info = registered_fb[fbidx]; - struct radeonfb_info *rinfo = info->par; - - if (p >= rinfo->mapped_vram) - return 0; - if (count >= rinfo->mapped_vram) - count = rinfo->mapped_vram; - if (count + p > rinfo->mapped_vram) - count = rinfo->mapped_vram - p; - radeonfb_sync(info); - if (count) { - void __iomem *base_addr; - - base_addr = info->screen_base; - count -= copy_to_user(buf, base_addr+p, count); /* Ayee!! */ - if (!count) - return -EFAULT; - *ppos += count; - } - return count; -} - -static ssize_t radeonfb_write(struct file *file, const char __user *buf, size_t count, - loff_t *ppos) -{ - unsigned long p = *ppos; - struct inode *inode = file->f_dentry->d_inode; - int fbidx = iminor(inode); - struct fb_info *info = registered_fb[fbidx]; - struct radeonfb_info *rinfo = info->par; - int err; - - if (p > rinfo->mapped_vram) - return -ENOSPC; - if (count >= rinfo->mapped_vram) - count = rinfo->mapped_vram; - err = 0; - if (count + p > rinfo->mapped_vram) { - count = rinfo->mapped_vram - p; - err = -ENOSPC; - } - radeonfb_sync(info); - if (count) { - void __iomem *base_addr; - - base_addr = info->screen_base; - count -= copy_from_user(base_addr+p, buf, count); /* Ayee!! */ - *ppos += count; - err = -EFAULT; - } - if (count) - return count; - return err; -} - - static struct fb_ops radeonfb_ops = { .owner = THIS_MODULE, .fb_check_var = radeonfb_check_var, @@ -1776,8 +1714,6 @@ static struct fb_ops radeonfb_ops = { .fb_fillrect = radeonfb_fillrect, .fb_copyarea = radeonfb_copyarea, .fb_imageblit = radeonfb_imageblit, - .fb_read = radeonfb_read, - .fb_write = radeonfb_write, .fb_cursor = soft_cursor, }; @@ -1796,7 +1732,7 @@ static int __devinit radeon_set_fbinfo ( | FBINFO_HWACCEL_YPAN; info->fbops = &radeonfb_ops; info->screen_base = rinfo->fb_base; - + info->screen_size = rinfo->mapped_vram; /* Fill fix common fields */ strlcpy(info->fix.id, rinfo->name, sizeof(info->fix.id)); info->fix.smem_start = rinfo->fb_base_phys; @@ -2243,12 +2179,6 @@ static int radeonfb_pci_register (struct RTRACE("radeonfb: mapped %ldk videoram\n", rinfo->mapped_vram/1024); - - /* Argh. Scary arch !!! */ -#ifdef CONFIG_PPC64 - rinfo->fb_base = IO_TOKEN_TO_ADDR(rinfo->fb_base); -#endif - /* * Check for required workaround for PLL accesses */ diff -puN drivers/video/fbmem.c~fbdev-radeonfb-remove-bogus-radeonfb_read-write drivers/video/fbmem.c --- 25/drivers/video/fbmem.c~fbdev-radeonfb-remove-bogus-radeonfb_read-write 2004-09-12 23:02:40.796850296 -0700 +++ 25-akpm/drivers/video/fbmem.c 2004-09-12 23:02:40.802849384 -0700 @@ -509,6 +509,7 @@ fb_read(struct file *file, char __user * struct fb_info *info = registered_fb[fbidx]; u32 *buffer, *dst, *src; int c, i, cnt = 0, err = 0; + unsigned long total_size; if (!info || ! info->screen_base) return -ENODEV; @@ -519,12 +520,16 @@ fb_read(struct file *file, char __user * if (info->fbops->fb_read) return info->fbops->fb_read(file, buf, count, ppos); - if (p >= info->fix.smem_len) + total_size = info->screen_size; + if (total_size == 0) + total_size = info->fix.smem_len; + + if (p >= total_size) return 0; - if (count >= info->fix.smem_len) - count = info->fix.smem_len; - if (count + p > info->fix.smem_len) - count = info->fix.smem_len - p; + if (count >= total_size) + count = total_size; + if (count + p > total_size) + count = total_size - p; cnt = 0; buffer = kmalloc((count > PAGE_SIZE) ? PAGE_SIZE : count, @@ -575,6 +580,7 @@ fb_write(struct file *file, const char _ struct fb_info *info = registered_fb[fbidx]; u32 *buffer, *dst, *src; int c, i, cnt = 0, err; + unsigned long total_size; if (!info || !info->screen_base) return -ENODEV; @@ -585,13 +591,17 @@ fb_write(struct file *file, const char _ if (info->fbops->fb_write) return info->fbops->fb_write(file, buf, count, ppos); - if (p > info->fix.smem_len) + total_size = info->screen_size; + if (total_size == 0) + total_size = info->fix.smem_len; + + if (p > total_size) return -ENOSPC; - if (count >= info->fix.smem_len) - count = info->fix.smem_len; + if (count >= total_size) + count = total_size; err = 0; - if (count + p > info->fix.smem_len) { - count = info->fix.smem_len - p; + if (count + p > total_size) { + count = total_size - p; err = -ENOSPC; } cnt = 0; diff -puN include/linux/fb.h~fbdev-radeonfb-remove-bogus-radeonfb_read-write include/linux/fb.h --- 25/include/linux/fb.h~fbdev-radeonfb-remove-bogus-radeonfb_read-write 2004-09-12 23:02:40.798849992 -0700 +++ 25-akpm/include/linux/fb.h 2004-09-12 23:02:40.806848776 -0700 @@ -684,6 +684,7 @@ struct fb_info { struct fb_tile_ops *tileops; /* Tile Blitting */ #endif char __iomem *screen_base; /* Virtual address */ + unsigned long screen_size; /* Amount of ioremapped VRAM or 0 */ int currcon; /* Current VC. */ void *pseudo_palette; /* Fake palette of 16 colors */ #define FBINFO_STATE_RUNNING 0 _