video: Fix the HGA framebuffer driver

Resurrected some old hardware and fixed up the hgafb driver to work
again. Only tested with fbcon, since most fbdev-based software appears
to only support 12bpp and up. It does not appear that this driver has
worked for at least the entire 2.6.x series, perhaps since 2002.

Hercules graphics hardware uses packed pixels horizontally, but rows are
not linear. In other words, the pixels are not packed vertically. This
means that custom imageblit, fillrect and copyarea need to be written
specific to the hardware.

 * Removed the experimental acceleration option, since it is required
   for the hardware to work.
 * Fixed imageblit to work with fb_image's wider than 8 pixels.
 * Updated configuration text (HGA hardware is from 1984)

Signed-off-by: Brent Cook <busterb@gmail.com>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
This commit is contained in:
Brent Cook 2010-12-31 05:56:50 +00:00 committed by Paul Mundt
parent e045da7d83
commit 529ed806d4
2 changed files with 11 additions and 25 deletions

View file

@ -824,24 +824,14 @@ config FB_N411
config FB_HGA config FB_HGA
tristate "Hercules mono graphics support" tristate "Hercules mono graphics support"
depends on FB && X86 depends on FB && X86
select FB_CFB_FILLRECT
select FB_CFB_COPYAREA
select FB_CFB_IMAGEBLIT
help help
Say Y here if you have a Hercules mono graphics card. Say Y here if you have a Hercules mono graphics card.
To compile this driver as a module, choose M here: the To compile this driver as a module, choose M here: the
module will be called hgafb. module will be called hgafb.
As this card technology is 15 years old, most people will answer N As this card technology is at least 25 years old,
here. most people will answer N here.
config FB_HGA_ACCEL
bool "Hercules mono Acceleration functions (EXPERIMENTAL)"
depends on FB_HGA && EXPERIMENTAL
---help---
This will compile the Hercules mono graphics with
acceleration functions.
config FB_SGIVW config FB_SGIVW
tristate "SGI Visual Workstation framebuffer support" tristate "SGI Visual Workstation framebuffer support"

View file

@ -454,7 +454,6 @@ static int hgafb_blank(int blank_mode, struct fb_info *info)
/* /*
* Accel functions * Accel functions
*/ */
#ifdef CONFIG_FB_HGA_ACCEL
static void hgafb_fillrect(struct fb_info *info, const struct fb_fillrect *rect) static void hgafb_fillrect(struct fb_info *info, const struct fb_fillrect *rect)
{ {
u_int rows, y; u_int rows, y;
@ -466,7 +465,7 @@ static void hgafb_fillrect(struct fb_info *info, const struct fb_fillrect *rect)
dest = rowaddr(info, y) + (rect->dx >> 3); dest = rowaddr(info, y) + (rect->dx >> 3);
switch (rect->rop) { switch (rect->rop) {
case ROP_COPY: case ROP_COPY:
//fb_memset(dest, rect->color, (rect->width >> 3)); memset_io(dest, rect->color, (rect->width >> 3));
break; break;
case ROP_XOR: case ROP_XOR:
fb_writeb(~(fb_readb(dest)), dest); fb_writeb(~(fb_readb(dest)), dest);
@ -488,7 +487,7 @@ static void hgafb_copyarea(struct fb_info *info, const struct fb_copyarea *area)
for (rows = area->height; rows--; ) { for (rows = area->height; rows--; ) {
src = rowaddr(info, y1) + (area->sx >> 3); src = rowaddr(info, y1) + (area->sx >> 3);
dest = rowaddr(info, y2) + (area->dx >> 3); dest = rowaddr(info, y2) + (area->dx >> 3);
//fb_memmove(dest, src, (area->width >> 3)); memmove(dest, src, (area->width >> 3));
y1++; y1++;
y2++; y2++;
} }
@ -499,7 +498,7 @@ static void hgafb_copyarea(struct fb_info *info, const struct fb_copyarea *area)
for (rows = area->height; rows--;) { for (rows = area->height; rows--;) {
src = rowaddr(info, y1) + (area->sx >> 3); src = rowaddr(info, y1) + (area->sx >> 3);
dest = rowaddr(info, y2) + (area->dx >> 3); dest = rowaddr(info, y2) + (area->dx >> 3);
//fb_memmove(dest, src, (area->width >> 3)); memmove(dest, src, (area->width >> 3));
y1--; y1--;
y2--; y2--;
} }
@ -511,20 +510,17 @@ static void hgafb_imageblit(struct fb_info *info, const struct fb_image *image)
u8 __iomem *dest; u8 __iomem *dest;
u8 *cdat = (u8 *) image->data; u8 *cdat = (u8 *) image->data;
u_int rows, y = image->dy; u_int rows, y = image->dy;
u_int x;
u8 d; u8 d;
for (rows = image->height; rows--; y++) { for (rows = image->height; rows--; y++) {
d = *cdat++; for (x = 0; x < image->width; x+= 8) {
dest = rowaddr(info, y) + (image->dx >> 3); d = *cdat++;
fb_writeb(d, dest); dest = rowaddr(info, y) + ((image->dx + x)>> 3);
fb_writeb(d, dest);
}
} }
} }
#else /* !CONFIG_FB_HGA_ACCEL */
#define hgafb_fillrect cfb_fillrect
#define hgafb_copyarea cfb_copyarea
#define hgafb_imageblit cfb_imageblit
#endif /* CONFIG_FB_HGA_ACCEL */
static struct fb_ops hgafb_ops = { static struct fb_ops hgafb_ops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,