aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorAntonino Daplas <adaplas@hotpop.com>2004-08-22 22:50:49 -0700
committerLinus Torvalds <torvalds@ppc970.osdl.org>2004-08-22 22:50:49 -0700
commit82f912ea8ab9c77437900b2dcbeb313986d461ae (patch)
treef4897c00bcb31b9bc4f450d33a1514b499d0087b /drivers
parent27f8601a4ee9fb9a0aacd53e592f63020b3048cc (diff)
downloadhistory-82f912ea8ab9c77437900b2dcbeb313986d461ae.tar.gz
[PATCH] i810fb fixes
1. Fixed cursor corruption if acceleration is enabled 2. Round up fields in var instead of rounding down 3. Set capabilities flags 4. Added myself to the MAINTAINERS file for i810fb 5. Make i810fb depend on X86 but not X86_64 6. Fixed typo in i810_init_monspecs(). Reported by Manuel Lauss <slauss@resi.at>. Signed-off-by: Antonino Daplas <adaplas@pol.net> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/video/Kconfig4
-rw-r--r--drivers/video/i810/i810_dvt.c14
-rw-r--r--drivers/video/i810/i810_main.c68
3 files changed, 51 insertions, 35 deletions
diff --git a/drivers/video/Kconfig b/drivers/video/Kconfig
index 0db1581dc812d6..e67587ce02c961 100644
--- a/drivers/video/Kconfig
+++ b/drivers/video/Kconfig
@@ -470,7 +470,9 @@ config FB_RIVA_DEBUG
config FB_I810
tristate "Intel 810/815 support (EXPERIMENTAL)"
- depends on FB && AGP && AGP_INTEL && EXPERIMENTAL && PCI
+ depends on FB && EXPERIMENTAL && PCI && X86 && !X86_64
+ select AGP
+ select AGP_INTEL
help
This driver supports the on-board graphics built in to the Intel 810
and 815 chipsets. Say Y if you have and plan to use such a board.
diff --git a/drivers/video/i810/i810_dvt.c b/drivers/video/i810/i810_dvt.c
index ffeaef8721c300..27fa703a2e0aad 100644
--- a/drivers/video/i810/i810_dvt.c
+++ b/drivers/video/i810/i810_dvt.c
@@ -193,19 +193,19 @@ struct mode_registers std_modes[] = {
void round_off_xres(u32 *xres)
{
- if (*xres < 800)
+ if (*xres <= 640)
*xres = 640;
- if (*xres < 1024 && *xres >= 800)
+ else if (*xres <= 800)
*xres = 800;
- if (*xres < 1152 && *xres >= 1024)
+ else if (*xres <= 1024)
*xres = 1024;
- if (*xres < 1280 && *xres >= 1152)
+ else if (*xres <= 1152)
*xres = 1152;
- if (*xres < 1600 && *xres >= 1280)
+ else if (*xres <= 1280)
*xres = 1280;
- if (*xres >= 1600)
+ else
*xres = 1600;
-}
+}
inline void round_off_yres(u32 *xres, u32 *yres)
{
diff --git a/drivers/video/i810/i810_main.c b/drivers/video/i810/i810_main.c
index 2633664b44a702..af3c92aebb8e7f 100644
--- a/drivers/video/i810/i810_main.c
+++ b/drivers/video/i810/i810_main.c
@@ -1353,11 +1353,15 @@ static int i810fb_set_par(struct fb_info *info)
encode_fix(&info->fix, info);
- if (info->var.accel_flags && !(par->dev_flags & LOCKUP))
+ if (info->var.accel_flags && !(par->dev_flags & LOCKUP)) {
+ info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN |
+ FBINFO_HWACCEL_COPYAREA | FBINFO_HWACCEL_FILLRECT |
+ FBINFO_HWACCEL_IMAGEBLIT;
info->pixmap.scan_align = 2;
- else
+ } else {
info->pixmap.scan_align = 1;
-
+ info->flags = FBINFO_DEFAULT | FBINFO_HWACCEL_YPAN;
+ }
return 0;
}
@@ -1388,16 +1392,17 @@ static int i810fb_cursor(struct fb_info *info, struct fb_cursor *cursor)
{
struct i810fb_par *par = (struct i810fb_par *)info->par;
u8 *mmio = par->mmio_start_virtual;
- u8 data[64 * 8];
-
+
if (!info->var.accel_flags || par->dev_flags & LOCKUP)
return soft_cursor(info, cursor);
if (cursor->image.width > 64 || cursor->image.height > 64)
return -ENXIO;
- if ((i810_readl(CURBASE, mmio) & 0xf) != par->cursor_heap.physical)
+ if ((i810_readl(CURBASE, mmio) & 0xf) != par->cursor_heap.physical) {
i810_init_cursor(par);
+ cursor->set |= FB_CUR_SETALL;
+ }
i810_enable_cursor(mmio, OFF);
@@ -1409,50 +1414,56 @@ static int i810fb_cursor(struct fb_info *info, struct fb_cursor *cursor)
info->cursor.image.dx = cursor->image.dx;
info->cursor.image.dy = cursor->image.dy;
-
- tmp = cursor->image.dx - info->var.xoffset;
- tmp |= (cursor->image.dy - info->var.yoffset) << 16;
-
+ tmp = (info->cursor.image.dx - info->var.xoffset) & 0xffff;
+ tmp |= (info->cursor.image.dy - info->var.yoffset) << 16;
i810_writel(CURPOS, mmio, tmp);
}
if (cursor->set & FB_CUR_SETSIZE) {
+ i810_reset_cursor_image(par);
info->cursor.image.height = cursor->image.height;
info->cursor.image.width = cursor->image.width;
- i810_reset_cursor_image(par);
}
if (cursor->set & FB_CUR_SETCMAP) {
- info->cursor.image.fg_color = cursor->image.fg_color;
- info->cursor.image.bg_color = cursor->image.bg_color;
i810_load_cursor_colors(cursor->image.fg_color,
cursor->image.bg_color,
info);
+ info->cursor.image.fg_color = cursor->image.fg_color;
+ info->cursor.image.bg_color = cursor->image.bg_color;
+
}
- if (cursor->set & FB_CUR_SETSHAPE) {
+ if (cursor->set & (FB_CUR_SETSHAPE)) {
int size = ((info->cursor.image.width + 7) >> 3) *
- info->cursor.image.height;
+ info->cursor.image.height;
int i;
+ u8 *data = kmalloc(64 * 8, GFP_KERNEL);
+
+ if (data == NULL)
+ return -ENOMEM;
+ info->cursor.image.data = cursor->image.data;
switch (info->cursor.rop) {
case ROP_XOR:
for (i = 0; i < size; i++)
- data[i] = cursor->image.data[i] ^ info->cursor.mask[i];
+ data[i] = info->cursor.image.data[i] ^ info->cursor.mask[i];
break;
case ROP_COPY:
default:
for (i = 0; i < size; i++)
- data[i] = cursor->image.data[i] & info->cursor.mask[i];
+ data[i] = info->cursor.image.data[i] & info->cursor.mask[i];
break;
}
i810_load_cursor_image(info->cursor.image.width,
info->cursor.image.height, data,
par);
+ kfree(data);
}
if (info->cursor.enable)
i810_enable_cursor(mmio, ON);
+
return 0;
}
@@ -1641,9 +1652,11 @@ static void __devinit i810_init_monspecs(struct fb_info *info)
hsync1 = HFMIN;
if (!hsync2)
hsync2 = HFMAX;
- info->monspecs.hfmax = hsync2;
- info->monspecs.hfmin = hsync1;
- if (hsync2 < hsync1)
+ if (!info->monspecs.hfmax)
+ info->monspecs.hfmax = hsync2;
+ if (!info->monspecs.hfmin)
+ info->monspecs.hfmin = hsync1;
+ if (hsync2 < hsync1)
info->monspecs.hfmin = hsync2;
if (!vsync1)
@@ -1652,8 +1665,10 @@ static void __devinit i810_init_monspecs(struct fb_info *info)
vsync2 = VFMAX;
if (IS_DVT && vsync1 < 60)
vsync1 = 60;
- info->monspecs.vfmax = vsync2;
- info->monspecs.vfmin = vsync1;
+ if (!info->monspecs.vfmax)
+ info->monspecs.vfmax = vsync2;
+ if (!info->monspecs.vfmin)
+ info->monspecs.vfmin = vsync1;
if (vsync2 < vsync1)
info->monspecs.vfmin = vsync2;
}
@@ -1724,6 +1739,7 @@ static void __devinit i810_init_device(struct i810fb_par *par)
pci_read_config_byte(par->dev, 0x50, &reg);
reg &= FREQ_MASK;
par->mem_freq = (reg) ? 133 : 100;
+
}
static int __devinit
@@ -1836,8 +1852,9 @@ static int __devinit i810fb_init_pci (struct pci_dev *dev,
{
struct fb_info *info;
struct i810fb_par *par = NULL;
- int err, vfreq, hfreq, pixclock;
+ int i, err = -1, vfreq, hfreq, pixclock;
+ i = 0;
if (!(info = kmalloc(sizeof(struct fb_info), GFP_KERNEL))) {
i810fb_release_resource(info, par);
return -ENOMEM;
@@ -1879,8 +1896,6 @@ static int __devinit i810fb_init_pci (struct pci_dev *dev,
info->screen_base = par->fb.virtual;
info->fbops = &par->i810fb_ops;
info->pseudo_palette = par->pseudo_palette;
- info->flags = FBINFO_FLAG_DEFAULT;
-
fb_alloc_cmap(&info->cmap, 256, 0);
if ((err = info->fbops->fb_check_var(&info->var, info))) {
@@ -1957,8 +1972,7 @@ static void i810fb_release_resource(struct fb_info *info,
kfree(par);
}
- if (info)
- kfree(info);
+ kfree(info);
}
static void __exit i810fb_remove_pci(struct pci_dev *dev)