Home Home > GIT Browse > vanilla
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>2004-09-12 08:08:19 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2004-09-12 08:08:19 -0700
commite3e7f9145b2e3d58955c50a7650051c4b3501674 (patch)
tree4fcb27bc8a870167a3ee87718346fa12e97ce1c6
parent358c65b2f9b92fcc0e93d35f3a52ef054ff206b2 (diff)
[PATCH] fbdev/radeonfb: Remove bugus radeonfb_read/write
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 <benh@kernel.crashing.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
-rw-r--r--drivers/video/aty/radeon_base.c72
-rw-r--r--drivers/video/fbmem.c30
-rw-r--r--include/linux/fb.h1
3 files changed, 22 insertions, 81 deletions
diff --git a/drivers/video/aty/radeon_base.c b/drivers/video/aty/radeon_base.c
index f86fbf6de972..5c90f98844ad 100644
--- a/drivers/video/aty/radeon_base.c
+++ b/drivers/video/aty/radeon_base.c
@@ -1702,68 +1702,6 @@ int radeonfb_set_par(struct fb_info *info)
}
-
-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 (struct radeonfb_info *rinfo)
| 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 pci_dev *pdev,
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 --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c
index 81cefec201d1..ae49af346d5b 100644
--- a/drivers/video/fbmem.c
+++ b/drivers/video/fbmem.c
@@ -506,6 +506,7 @@ fb_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
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;
@@ -516,12 +517,16 @@ fb_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
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,
@@ -572,6 +577,7 @@ fb_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
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;
@@ -582,13 +588,17 @@ fb_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
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 --git a/include/linux/fb.h b/include/linux/fb.h
index 190dcfd2e0b7..ca97cbc29414 100644
--- a/include/linux/fb.h
+++ b/include/linux/fb.h
@@ -603,6 +603,7 @@ struct fb_info {
struct fb_cmap cmap; /* Current cmap */
struct fb_ops *fbops;
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