Commit 857361ee authored by James Simmons's avatar James Simmons

Neomagic and HGA updates. MAde the software accel code modular. So code...

Neomagic and HGA updates. MAde the software accel code modular. So code cleanup in fbcon. More to go.
parent 112483d2
...@@ -210,7 +210,7 @@ static int tosh_emulate_fan(SMMRegisters *regs) ...@@ -210,7 +210,7 @@ static int tosh_emulate_fan(SMMRegisters *regs)
/* /*
* Put the laptop into System Management Mode * Put the laptop into System Management Mode
*/ */
static int tosh_smm(SMMRegisters *regs) int tosh_smm(SMMRegisters *regs)
{ {
int eax; int eax;
......
...@@ -297,7 +297,7 @@ config FB_CT65550 ...@@ -297,7 +297,7 @@ config FB_CT65550
config FB_IMSTT config FB_IMSTT
bool "IMS Twin Turbo display support" bool "IMS Twin Turbo display support"
depends on FB && PPC depends on FB && PCI
help help
The IMS Twin Turbo is a PCI-based frame buffer card bundled with The IMS Twin Turbo is a PCI-based frame buffer card bundled with
many Macintosh and compatible computers. many Macintosh and compatible computers.
......
...@@ -5,7 +5,8 @@ ...@@ -5,7 +5,8 @@
# All of the (potential) objects that export symbols. # All of the (potential) objects that export symbols.
# This list comes from 'grep -l EXPORT_SYMBOL *.[hc]'. # This list comes from 'grep -l EXPORT_SYMBOL *.[hc]'.
export-objs := fbmem.o fbcmap.o fbgen.o fbmon.o modedb.o cyber2000fb.o export-objs := fbmem.o fbcmap.o fbgen.o fbmon.o modedb.o cfbfillrect.o \
cfbcopyarea.o cfbimgblt.o cyber2000fb.o
# Each configuration option enables a list of files. # Each configuration option enables a list of files.
......
...@@ -20,6 +20,8 @@ ...@@ -20,6 +20,8 @@
* the native cpu endians. I also need to deal with MSB position in the word. * the native cpu endians. I also need to deal with MSB position in the word.
* *
*/ */
#include <linux/config.h>
#include <linux/module.h>
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/string.h> #include <linux/string.h>
#include <linux/fb.h> #include <linux/fb.h>
...@@ -667,3 +669,10 @@ void cfb_copyarea(struct fb_info *p, struct fb_copyarea *area) ...@@ -667,3 +669,10 @@ void cfb_copyarea(struct fb_info *p, struct fb_copyarea *area)
} }
} }
} }
EXPORT_SYMBOL(cfb_copyarea);
MODULE_AUTHOR("James Simmons <jsimmons@users.sf.net>");
MODULE_DESCRIPTION("Generic software accelerated copyarea");
MODULE_LICENSE("GPL");
...@@ -17,6 +17,8 @@ ...@@ -17,6 +17,8 @@
* the native cpu endians. I also need to deal with MSB position in the word. * the native cpu endians. I also need to deal with MSB position in the word.
* *
*/ */
#include <linux/config.h>
#include <linux/module.h>
#include <linux/string.h> #include <linux/string.h>
#include <linux/fb.h> #include <linux/fb.h>
#include <asm/types.h> #include <asm/types.h>
...@@ -224,3 +226,9 @@ void cfb_fillrect(struct fb_info *p, struct fb_fillrect *rect) ...@@ -224,3 +226,9 @@ void cfb_fillrect(struct fb_info *p, struct fb_fillrect *rect)
} }
return; return;
} }
EXPORT_SYMBOL(cfb_fillrect);
MODULE_AUTHOR("James Simmons <jsimmons@users.sf.net>");
MODULE_DESCRIPTION("Generic software accelerated fill rectangle");
MODULE_LICENSE("GPL");
...@@ -34,6 +34,8 @@ ...@@ -34,6 +34,8 @@
* the native cpu endians. I also need to deal with MSB position in the word. * the native cpu endians. I also need to deal with MSB position in the word.
* *
*/ */
#include <linux/config.h>
#include <linux/module.h>
#include <linux/string.h> #include <linux/string.h>
#include <linux/fb.h> #include <linux/fb.h>
#include <asm/types.h> #include <asm/types.h>
...@@ -338,3 +340,10 @@ void cfb_imageblit(struct fb_info *p, struct fb_image *image) ...@@ -338,3 +340,10 @@ void cfb_imageblit(struct fb_info *p, struct fb_image *image)
end_mask = 0; end_mask = 0;
} }
} }
EXPORT_SYMBOL(cfb_imageblit);
MODULE_AUTHOR("James Simmons <jsimmons@users.sf.net>");
MODULE_DESCRIPTION("Generic software accelerated imaging drawing");
MODULE_LICENSE("GPL");
...@@ -121,8 +121,8 @@ config FBCON_ADVANCED ...@@ -121,8 +121,8 @@ config FBCON_ADVANCED
config FBCON_ACCEL config FBCON_ACCEL
tristate "Hardware acceleration support" if FBCON_ADVANCED tristate "Hardware acceleration support" if FBCON_ADVANCED
depends on FB depends on FB
default m if !FBCON_ADVANCED && FB_NEOMAGIC!=y && !FB_VESA && !FB_FM2 && FB_HIT!=y && !FB_HP300 && !FB_Q40 && !FB_ANAKIN && !FB_G364 && FB_VIRTUAL!=y && !FB_CLPS711X && !FB_PMAG_BA && !FB_PMAGB_B && FB_3DFX!=y && !FB_TX3912 && !FB_MAXINE && !FB_APOLLO && FB_ATY!=y && !FB_MAC && FB_RIVA!=y && !FB_OF && FB_SGIVW!=y && (FB_NEOMAGIC=m || FB_HIT=m || FB_VIRTUAL=m || FB_3DFX=m || FB_RIVA=m || FB_SGIVW=m) default m if !FBCON_ADVANCED && FB_NEOMAGIC!=y && !FB_VESA && !FB_FM2 && FB_HIT!=y && !FB_HP300 && !FB_Q40 && !FB_ANAKIN && !FB_G364 && FB_VIRTUAL!=y && !FB_CLPS711X && !FB_PMAG_BA && !FB_PMAGB_B && FB_3DFX!=y && !FB_TX3912 && !FB_MAXINE && !FB_APOLLO && FB_ATY!=y && !FB_MAC && FB_RIVA!=y && FB_HGA!=y && !FB_OF && FB_SGIVW!=y && (FB_NEOMAGIC=m || FB_HIT=m || FB_VIRTUAL=m || FB_3DFX=m || FB_RIVA=m || FB_SGIVW=m || FB_HGA=m)
default y if !FBCON_ADVANCED && (FB_NEOMAGIC=y || FB_VESA || FB_FM2 || FB_HIT=y || FB_HP300 || FB_Q40 || FB_ANAKIN || FB_G364 || FB_VIRTUAL=y || FB_CLPS711X || FB_PMAG_BA || FB_PMAGB_B || FB_3DFX=y || FB_TX3912 || FB_MAXINE || FB_APOLLO || FB_ATY=y || FB_MAC || FB_RIVA=y || FB_OF || FB_SGIVW=y) default y if !FBCON_ADVANCED && (FB_NEOMAGIC=y || FB_VESA || FB_FM2 || FB_HIT=y || FB_HP300 || FB_Q40 || FB_ANAKIN || FB_G364 || FB_VIRTUAL=y || FB_CLPS711X || FB_PMAG_BA || FB_PMAGB_B || FB_3DFX=y || FB_TX3912 || FB_MAXINE || FB_APOLLO || FB_ATY=y || FB_MAC || FB_RIVA=y || FB_OF || FB_SGIVW=y || FB_HGA=y)
config FBCON_AFB config FBCON_AFB
tristate "Amiga bitplanes support" if FBCON_ADVANCED tristate "Amiga bitplanes support" if FBCON_ADVANCED
...@@ -166,15 +166,6 @@ config FBCON_IPLAN2P8 ...@@ -166,15 +166,6 @@ config FBCON_IPLAN2P8
This is the low level frame buffer console driver for 8 interleaved This is the low level frame buffer console driver for 8 interleaved
bitplanes (256 colors) on Atari. bitplanes (256 colors) on Atari.
config FBCON_HGA
tristate "HGA monochrome support (EXPERIMENTAL)" if FBCON_ADVANCED
depends on FB
default m if !FBCON_ADVANCED && FB_HGA=m
default y if !FBCON_ADVANCED && FB_HGA=y
help
This is the low level frame buffer console driver for Hercules mono
graphics cards.
# Guess what we need # Guess what we need
config FBCON_STI config FBCON_STI
tristate tristate
......
...@@ -36,7 +36,6 @@ obj-$(CONFIG_FBCON_ILBM) += fbcon-ilbm.o ...@@ -36,7 +36,6 @@ obj-$(CONFIG_FBCON_ILBM) += fbcon-ilbm.o
obj-$(CONFIG_FBCON_IPLAN2P2) += fbcon-iplan2p2.o obj-$(CONFIG_FBCON_IPLAN2P2) += fbcon-iplan2p2.o
obj-$(CONFIG_FBCON_IPLAN2P4) += fbcon-iplan2p4.o obj-$(CONFIG_FBCON_IPLAN2P4) += fbcon-iplan2p4.o
obj-$(CONFIG_FBCON_IPLAN2P8) += fbcon-iplan2p8.o obj-$(CONFIG_FBCON_IPLAN2P8) += fbcon-iplan2p8.o
obj-$(CONFIG_FBCON_HGA) += fbcon-hga.o
obj-$(CONFIG_FBCON_STI) += fbcon-sti.o obj-$(CONFIG_FBCON_STI) += fbcon-sti.o
obj-$(CONFIG_FBCON_ACCEL) += fbcon-accel.o obj-$(CONFIG_FBCON_ACCEL) += fbcon-accel.o
......
/*
* linux/drivers/video/fbcon-hga.c -- Low level frame buffer operations for
* the Hercules graphics adaptor
*
* Created 25 Nov 1999 by Ferenc Bakonyi (fero@drama.obuda.kando.hu)
* Based on fbcon-mfb.c by Geert Uytterhoeven
*
* History:
*
* - Revision 0.1.0 (6 Dec 1999): comment changes
* - First release (25 Nov 1999)
*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file COPYING in the main directory of this archive for
* more details.
*/
#include <linux/module.h>
#include <linux/tty.h>
#include <linux/console.h>
#include <linux/string.h>
#include <linux/fb.h>
#include <video/fbcon.h>
#include <video/fbcon-hga.h>
#if 0
#define DPRINTK(args...) printk(KERN_DEBUG __FILE__": " ##args)
#else
#define DPRINTK(args...)
#endif
#define HGA_ROWADDR(row) ((row%4)*8192 + (row>>2)*90)
/*
* Hercules monochrome
*/
static inline u8* rowaddr(struct display *p, u_int row)
{
return p->fb_info->screen_base + HGA_ROWADDR(row);
}
void fbcon_hga_setup(struct display *p)
{
DPRINTK("fbcon_hga_setup: ll:%d\n", (int)p->line_length);
p->next_line = p->fb_info->fix.line_length;
p->next_plane = 0;
}
void fbcon_hga_bmove(struct display *p, int sy, int sx, int dy, int dx,
int height, int width)
{
u8 *src, *dest;
u_int rows, y1, y2;
#if 0
if (sx == 0 && dx == 0 && width == p->next_line) {
src = p->fb_info->screen_base+sy*fontheight(p)*width;
dest = p->fb_info->screen_base+dy*fontheight(p)*width;
fb_memmove(dest, src, height*fontheight(p)*width);
} else
#endif
if (dy <= sy) {
y1 = sy*fontheight(p);
y2 = dy*fontheight(p);
for (rows = height*fontheight(p); rows--; ) {
src = rowaddr(p, y1)+sx;
dest = rowaddr(p, y2)+dx;
fb_memmove(dest, src, width);
y1++;
y2++;
}
} else {
y1 = (sy+height)*fontheight(p)-1;
y2 = (dy+height)*fontheight(p)-1;
for (rows = height*fontheight(p); rows--;) {
src = rowaddr(p, y1)+sx;
dest = rowaddr(p, y2)+dx;
fb_memmove(dest, src, width);
y1--;
y2--;
}
}
}
void fbcon_hga_clear(struct vc_data *conp, struct display *p, int sy, int sx,
int height, int width)
{
u8 *dest;
u_int rows, y;
int inverse = conp ? attr_reverse(p,conp->vc_video_erase_char) : 0;
DPRINTK("fbcon_hga_clear: sx:%d, sy:%d, height:%d, width:%d\n", sx, sy, height, width);
y = sy*fontheight(p);
#if 0
if (sx == 0 && width == p->next_line) {
if (inverse) {
fb_memset255(dest, height*fontheight(p)*width);
} else {
fb_memclear(dest, height*fontheight(p)*width);
}
} else
#endif
for (rows = height*fontheight(p); rows--; y++) {
dest = rowaddr(p, y)+sx;
if (inverse) {
fb_memset255(dest, width);
} else {
fb_memclear(dest, width);
}
}
}
void fbcon_hga_putc(struct vc_data *conp, struct display *p, int c, int yy,
int xx)
{
u8 *dest, *cdat;
u_int rows, y, bold, revs, underl;
u8 d;
cdat = p->fontdata+(c&p->charmask)*fontheight(p);
bold = attr_bold(p, c);
revs = attr_reverse(p, c);
underl = attr_underline(p, c);
y = yy*fontheight(p);
for (rows = fontheight(p); rows--; y++) {
d = *cdat++;
if (underl && !rows)
d = 0xff;
else if (bold)
d |= d>>1;
if (revs)
d = ~d;
dest = rowaddr(p, y)+xx;
*dest = d;
}
}
void fbcon_hga_putcs(struct vc_data *conp, struct display *p,
const unsigned short *s, int count, int yy, int xx)
{
u8 *dest, *cdat;
u_int rows, y, y0, bold, revs, underl;
u8 d;
u16 c;
c = scr_readw(s);
bold = attr_bold(p, c);
revs = attr_reverse(p, c);
underl = attr_underline(p, c);
y0 = yy*fontheight(p);
while (count--) {
c = scr_readw(s++) & p->charmask;
cdat = p->fontdata+c*fontheight(p);
y = y0;
for (rows = fontheight(p); rows--; y++) {
d = *cdat++;
if (underl && !rows)
d = 0xff;
else if (bold)
d |= d>>1;
if (revs)
d = ~d;
dest = rowaddr(p, y)+xx;
*dest = d;
}
xx++;
}
}
void fbcon_hga_revc(struct display *p, int xx, int yy)
{
u8 *dest;
u_int rows, y;
y = yy*fontheight(p);
for (rows = fontheight(p); rows--; y++) {
dest = rowaddr(p, y)+xx;
*dest = ~*dest;
}
}
void fbcon_hga_clear_margins(struct vc_data *conp, struct display *p,
int bottom_only)
{
u8 *dest;
u_int height, y;
int inverse = conp ? attr_reverse(p,conp->vc_video_erase_char) : 0;
DPRINTK("fbcon_hga_clear_margins: enter\n");
/* No need to handle right margin. */
y = conp->vc_rows * fontheight(p);
for (height = p->var.yres - y; height-- > 0; y++) {
DPRINTK("fbcon_hga_clear_margins: y:%d, height:%d\n", y, height);
dest = rowaddr(p, y);
if (inverse) {
fb_memset255(dest, p->next_line);
} else {
fb_memclear(dest, p->next_line);
}
}
}
/*
* `switch' for the low level operations
*/
struct display_switch fbcon_hga = {
.setup = fbcon_hga_setup,
.bmove = fbcon_hga_bmove,
.clear = fbcon_hga_clear,
.putc = fbcon_hga_putc,
.putcs = fbcon_hga_putcs,
.revc = fbcon_hga_revc,
.clear_margins =fbcon_hga_clear_margins,
.fontwidthmask =FONTWIDTH(8)
};
#ifdef MODULE
MODULE_LICENSE("GPL");
int init_module(void)
{
return 0;
}
void cleanup_module(void)
{
}
#endif /* MODULE */
/*
* Visible symbols for modules
*/
EXPORT_SYMBOL(fbcon_hga);
EXPORT_SYMBOL(fbcon_hga_setup);
EXPORT_SYMBOL(fbcon_hga_bmove);
EXPORT_SYMBOL(fbcon_hga_clear);
EXPORT_SYMBOL(fbcon_hga_putc);
EXPORT_SYMBOL(fbcon_hga_putcs);
EXPORT_SYMBOL(fbcon_hga_revc);
EXPORT_SYMBOL(fbcon_hga_clear_margins);
This diff is collapsed.
...@@ -91,8 +91,6 @@ struct display { ...@@ -91,8 +91,6 @@ struct display {
extern struct display fb_display[MAX_NR_CONSOLES]; extern struct display fb_display[MAX_NR_CONSOLES];
extern char con2fb_map[MAX_NR_CONSOLES]; extern char con2fb_map[MAX_NR_CONSOLES];
extern void set_con2fb_map(int unit, int newidx); extern void set_con2fb_map(int unit, int newidx);
extern int set_all_vcs(int fbidx, struct fb_ops *fb,
struct fb_var_screeninfo *var, struct fb_info *info);
#define fontheight(p) ((p)->_fontheight) #define fontheight(p) ((p)->_fontheight)
#define fontheightlog(p) ((p)->_fontheightlog) #define fontheightlog(p) ((p)->_fontheightlog)
......
...@@ -20,34 +20,6 @@ ...@@ -20,34 +20,6 @@
#include <asm/uaccess.h> #include <asm/uaccess.h>
#include <asm/io.h> #include <asm/io.h>
int fb_set_var(struct fb_var_screeninfo *var, struct fb_info *info)
{
int err;
if (memcmp(&info->var, var, sizeof(struct fb_var_screeninfo))) {
if (!info->fbops->fb_check_var) {
*var = info->var;
return 0;
}
if ((err = info->fbops->fb_check_var(var, info)))
return err;
if ((var->activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW) {
info->var = *var;
if (info->fbops->fb_set_par)
info->fbops->fb_set_par(info);
if (info->fbops->fb_pan_display)
info->fbops->fb_pan_display(&info->var,
info);
fb_set_cmap(&info->cmap, 1, info);
}
}
return 0;
}
int cfb_cursor(struct fb_info *info, struct fbcursor *cursor) int cfb_cursor(struct fb_info *info, struct fbcursor *cursor)
{ {
int i, size = ((cursor->size.x + 7) / 8) * cursor->size.y; int i, size = ((cursor->size.x + 7) / 8) * cursor->size.y;
...@@ -143,7 +115,6 @@ int fb_blank(int blank, struct fb_info *info) ...@@ -143,7 +115,6 @@ int fb_blank(int blank, struct fb_info *info)
} }
/* generic frame buffer operations */ /* generic frame buffer operations */
EXPORT_SYMBOL(fb_set_var);
EXPORT_SYMBOL(cfb_cursor); EXPORT_SYMBOL(cfb_cursor);
EXPORT_SYMBOL(fb_pan_display); EXPORT_SYMBOL(fb_pan_display);
EXPORT_SYMBOL(fb_blank); EXPORT_SYMBOL(fb_blank);
......
...@@ -464,6 +464,34 @@ static void try_to_load(int fb) ...@@ -464,6 +464,34 @@ static void try_to_load(int fb)
} }
#endif /* CONFIG_KMOD */ #endif /* CONFIG_KMOD */
int fb_set_var(struct fb_var_screeninfo *var, struct fb_info *info)
{
int err;
if (memcmp(&info->var, var, sizeof(struct fb_var_screeninfo))) {
if (!info->fbops->fb_check_var) {
*var = info->var;
return 0;
}
if ((err = info->fbops->fb_check_var(var, info)))
return err;
if ((var->activate & FB_ACTIVATE_MASK) == FB_ACTIVATE_NOW) {
info->var = *var;
if (info->fbops->fb_set_par)
info->fbops->fb_set_par(info);
if (info->fbops->fb_pan_display)
info->fbops->fb_pan_display(&info->var, info);
fb_set_cmap(&info->cmap, 1, info);
}
}
return 0;
}
static int static int
fb_ioctl(struct inode *inode, struct file *file, unsigned int cmd, fb_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
unsigned long arg) unsigned long arg)
...@@ -488,12 +516,7 @@ fb_ioctl(struct inode *inode, struct file *file, unsigned int cmd, ...@@ -488,12 +516,7 @@ fb_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
case FBIOPUT_VSCREENINFO: case FBIOPUT_VSCREENINFO:
if (copy_from_user(&var, (void *) arg, sizeof(var))) if (copy_from_user(&var, (void *) arg, sizeof(var)))
return -EFAULT; return -EFAULT;
#ifdef CONFIG_FRAMEBUFFER_CONSOLE i = fb_set_var(&var, info);
if (var.activate & FB_ACTIVATE_ALL)
i = set_all_vcs(fbidx, fb, &var, info);
else
#endif
i = fb_set_var(&var, info);
if (i) return i; if (i) return i;
if (copy_to_user((void *) arg, &var, sizeof(var))) if (copy_to_user((void *) arg, &var, sizeof(var)))
return -EFAULT; return -EFAULT;
......
...@@ -46,8 +46,6 @@ ...@@ -46,8 +46,6 @@
#include <linux/ioport.h> #include <linux/ioport.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/vga.h> #include <asm/vga.h>
#include <video/fbcon.h>
#include <video/fbcon-hga.h>
#ifdef MODULE #ifdef MODULE
...@@ -73,9 +71,15 @@ ...@@ -73,9 +71,15 @@
static unsigned long hga_vram_base; /* Base of video memory */ static unsigned long hga_vram_base; /* Base of video memory */
static unsigned long hga_vram_len; /* Size of video memory */ static unsigned long hga_vram_len; /* Size of video memory */
#define HGA_ROWADDR(row) ((row%4)*8192 + (row>>2)*90)
#define HGA_TXT 0 #define HGA_TXT 0
#define HGA_GFX 1 #define HGA_GFX 1
static inline u8* rowaddr(struct fb_info *info, u_int row)
{
return info->screen_base + HGA_ROWADDR(row);
}
static int hga_mode = -1; /* 0 = txt, 1 = gfx mode */ static int hga_mode = -1; /* 0 = txt, 1 = gfx mode */
static enum { TYPE_HERC, TYPE_HERCPLUS, TYPE_HERCCOLOR } hga_type; static enum { TYPE_HERC, TYPE_HERCPLUS, TYPE_HERCCOLOR } hga_type;
...@@ -137,7 +141,6 @@ static struct fb_fix_screeninfo hga_fix = { ...@@ -137,7 +141,6 @@ static struct fb_fix_screeninfo hga_fix = {
}; };
static struct fb_info fb_info; static struct fb_info fb_info;
static struct display disp;
/* Don't assume that tty1 will be the initial current console. */ /* Don't assume that tty1 will be the initial current console. */
static int release_io_port = 0; static int release_io_port = 0;
...@@ -189,7 +192,6 @@ static void hga_clear_screen(void) ...@@ -189,7 +192,6 @@ static void hga_clear_screen(void)
isa_memset_io(hga_vram_base, fillchar, hga_vram_len); isa_memset_io(hga_vram_base, fillchar, hga_vram_len);
} }
#ifdef MODULE #ifdef MODULE
static void hga_txt_mode(void) static void hga_txt_mode(void)
{ {
...@@ -255,15 +257,13 @@ static void hga_gfx_mode(void) ...@@ -255,15 +257,13 @@ static void hga_gfx_mode(void)
} }
#ifdef MODULE #ifdef MODULE
static void hga_show_logo(void) static void hga_show_logo(struct fb_info *info)
{ {
int x, y; int x, y;
unsigned long dest = hga_vram_base;
char *logo = linux_logo_bw; char *logo = linux_logo_bw;
for (y = 134; y < 134 + 80 ; y++) /* this needs some cleanup */ for (y = 134; y < 134 + 80 ; y++) /* this needs some cleanup */
for (x = 0; x < 10 ; x++) for (x = 0; x < 10 ; x++)
isa_writeb(~*(logo++), isa_writeb(~*(logo++),(dest + HGA_ROWADDR(y) + x + 40));
(dest + (y%4)*8192 + (y>>2)*90 + x + 40));
} }
#endif /* MODULE */ #endif /* MODULE */
...@@ -389,7 +389,6 @@ static int hgafb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, ...@@ -389,7 +389,6 @@ static int hgafb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
/** /**
* hga_pan_display - pan or wrap the display * hga_pan_display - pan or wrap the display
* @var:contains new xoffset, yoffset and vmode values * @var:contains new xoffset, yoffset and vmode values
* @con:unused
* @info:pointer to fb_info object containing info for current hga board * @info:pointer to fb_info object containing info for current hga board
* *
* This function looks only at xoffset, yoffset and the %FB_VMODE_YWRAP * This function looks only at xoffset, yoffset and the %FB_VMODE_YWRAP
...@@ -398,12 +397,8 @@ static int hgafb_setcolreg(u_int regno, u_int red, u_int green, u_int blue, ...@@ -398,12 +397,8 @@ static int hgafb_setcolreg(u_int regno, u_int red, u_int green, u_int blue,
* A zero is returned on success and %-EINVAL for failure. * A zero is returned on success and %-EINVAL for failure.
*/ */
int hga_pan_display(struct fb_var_screeninfo *var, int con, int hgafb_pan_display(struct fb_var_screeninfo *var, struct fb_info *info)
struct fb_info *info)
{ {
CHKINFO(-EINVAL);
DPRINTK("pan_disp: con:%d, wrap:%d, xoff:%d, yoff:%d\n", con, var->vmode & FB_VMODE_YWRAP, var->xoffset, var->yoffset);
if (var->vmode & FB_VMODE_YWRAP) { if (var->vmode & FB_VMODE_YWRAP) {
if (var->yoffset < 0 || if (var->yoffset < 0 ||
var->yoffset >= info->var.yres_virtual || var->yoffset >= info->var.yres_virtual ||
...@@ -442,24 +437,84 @@ int hga_pan_display(struct fb_var_screeninfo *var, int con, ...@@ -442,24 +437,84 @@ int hga_pan_display(struct fb_var_screeninfo *var, int con,
static int hgafb_blank(int blank_mode, struct fb_info *info) static int hgafb_blank(int blank_mode, struct fb_info *info)
{ {
CHKINFO( );
DPRINTK("hgafb_blank: blank_mode:%d, info:%x, fb_info:%x\n", blank_mode, (unsigned)info, (unsigned)&fb_info);
hga_blank(blank_mode); hga_blank(blank_mode);
return 0; return 0;
} }
static void hgafb_fillrect(struct fb_info *info, struct fb_fillrect *rect)
{
u_int rows, y;
u8 *dest;
y = rect->dy;
for (rows = rect->height; rows--; y++) {
dest = rowaddr(info, y) + (rect->dx >> 3);
switch (rect->rop) {
case ROP_COPY:
fb_memset(dest, rect->color, (rect->width >> 3));
break;
case ROP_XOR:
*dest = ~*dest;
break;
}
}
}
static void hgafb_copyarea(struct fb_info *info, struct fb_copyarea *area)
{
u_int rows, y1, y2;
u8 *src, *dest;
if (area->dy <= area->sy) {
y1 = area->sy;
y2 = area->dy;
for (rows = area->height; rows--; ) {
src = rowaddr(info, y1) + (area->sx >> 3);
dest = rowaddr(info, y2) + (area->dx >> 3);
fb_memmove(dest, src, (area->width >> 3));
y1++;
y2++;
}
} else {
y1 = area->sy + area->height - 1;
y2 = area->dy + area->height - 1;
for (rows = area->height; rows--;) {
src = rowaddr(info, y1) + (area->sx >> 3);
dest = rowaddr(info, y2) + (area->dx >> 3);
fb_memmove(dest, src, (area->width >> 3));
y1--;
y2--;
}
}
}
static void hgafb_imageblit(struct fb_info *info, struct fb_image *image)
{
u8 *dest, *cdat = image->data;
u_int rows, y = image->dy;
u8 d;
for (rows = image->height; rows--; y++) {
d = *cdat++;
dest = rowaddr(info, y) + (image->dx >> 3);
*dest = d;
}
}
static struct fb_ops hgafb_ops = { static struct fb_ops hgafb_ops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.fb_set_var = gen_set_var,
.fb_get_cmap = gen_get_cmap,
.fb_set_cmap = gen_set_cmap,
.fb_setcolreg = hgafb_setcolreg, .fb_setcolreg = hgafb_setcolreg,
.fb_pan_display = hga_pan_display, .fb_pan_display = hgafb_pan_display,
.fb_blank = hgafb_blank, .fb_blank = hgafb_blank,
.fb_fillrect = hgafb_fillrect,
.fb_copyarea = hgafb_copyarea,
.fb_imageblit = hgafb_imageblit,
}; };
/* ------------------------------------------------------------------------- * /* ------------------------------------------------------------------------- *
* *
* Functions in fb_info * Functions in fb_info
...@@ -484,27 +539,10 @@ int __init hgafb_init(void) ...@@ -484,27 +539,10 @@ int __init hgafb_init(void)
hga_gfx_mode(); hga_gfx_mode();
hga_clear_screen(); hga_clear_screen();
#ifdef MODULE
if (!nologo) hga_show_logo();
#endif /* MODULE */
hga_fix.smem_start = VGA_MAP_MEM(hga_vram_base); hga_fix.smem_start = VGA_MAP_MEM(hga_vram_base);
hga_fix.smem_len = hga_vram_len; hga_fix.smem_len = hga_vram_len;
disp.var = hga_default_var;
disp.can_soft_blank = 1;
disp.inverse = 0;
#ifdef FBCON_HAS_HGA
disp.dispsw = &fbcon_hga;
#else
#warning HGAFB will not work as a console!
disp.dispsw = &fbcon_dummy;
#endif
disp.dispsw_data = NULL;
disp.scrollmode = SCROLL_YREDRAW;
strcpy (fb_info.modename, hga_fix.id);
fb_info.node = NODEV; fb_info.node = NODEV;
fb_info.flags = FBINFO_FLAG_DEFAULT; fb_info.flags = FBINFO_FLAG_DEFAULT;
fb_info.var = hga_default_var; fb_info.var = hga_default_var;
...@@ -516,18 +554,16 @@ int __init hgafb_init(void) ...@@ -516,18 +554,16 @@ int __init hgafb_init(void)
fb_info.monspecs.dpms = 0; fb_info.monspecs.dpms = 0;
fb_info.fbops = &hgafb_ops; fb_info.fbops = &hgafb_ops;
fb_info.screen_base = (char *)hga_fix.smem_start; fb_info.screen_base = (char *)hga_fix.smem_start;
fb_info.disp = &disp;
fb_info.currcon = 1;
fb_info.changevar = NULL;
fb_info.switch_con = gen_switch;
fb_info.updatevar = gen_update_var;
if (register_framebuffer(&fb_info) < 0) if (register_framebuffer(&fb_info) < 0)
return -EINVAL; return -EINVAL;
#ifdef MODULE
if (!nologo) hga_show_logo(&fb_info);
#endif /* MODULE */
printk(KERN_INFO "fb%d: %s frame buffer device\n", printk(KERN_INFO "fb%d: %s frame buffer device\n",
minor(fb_info.node), fb_info.modename); minor(fb_info.node), fb_info.fix.id);
return 0; return 0;
} }
...@@ -535,49 +571,21 @@ int __init hgafb_init(void) ...@@ -535,49 +571,21 @@ int __init hgafb_init(void)
* Setup * Setup
*/ */
#ifndef MODULE
int __init hgafb_setup(char *options) int __init hgafb_setup(char *options)
{ {
/*
* Parse user speficied options
* `video=hga:font:VGA8x16' or
* `video=hga:font:SUN8x16' recommended
* Other supported fonts: VGA8x8, Acorn8x8, PEARL8x8
* More different fonts can be used with the `setfont' utility.
*/
char *this_opt;
fb_info.fontname[0] = '\0';
if (!options || !*options)
return 0;
while ((this_opt = strsep(&options, ","))) {
if (!strncmp(this_opt, "font:", 5))
strcpy(fb_info.fontname, this_opt+5);
}
return 0; return 0;
} }
#endif /* !MODULE */
/*
* Cleanup
*/
#ifdef MODULE #ifdef MODULE
static void hgafb_cleanup(struct fb_info *info) static void __exit hgafb_exit(void)
{ {
hga_txt_mode(); hga_txt_mode();
hga_clear_screen(); hga_clear_screen();
unregister_framebuffer(info); unregister_framebuffer(&fb_info);
if (release_io_ports) release_region(0x3b0, 12); if (release_io_ports) release_region(0x3b0, 12);
if (release_io_port) release_region(0x3bf, 1); if (release_io_port) release_region(0x3bf, 1);
} }
#endif /* MODULE */ #endif
/* ------------------------------------------------------------------------- /* -------------------------------------------------------------------------
* *
...@@ -585,29 +593,14 @@ static void hgafb_cleanup(struct fb_info *info) ...@@ -585,29 +593,14 @@ static void hgafb_cleanup(struct fb_info *info)
* *
* ------------------------------------------------------------------------- */ * ------------------------------------------------------------------------- */
#ifdef MODULE
int init_module(void)
{
if (font)
strncpy(fb_info.fontname, font, sizeof(fb_info.fontname)-1);
else
fb_info.fontname[0] = '\0';
return hgafb_init();
}
void cleanup_module(void)
{
hgafb_cleanup(&fb_info);
}
MODULE_AUTHOR("Ferenc Bakonyi (fero@drama.obuda.kando.hu)"); MODULE_AUTHOR("Ferenc Bakonyi (fero@drama.obuda.kando.hu)");
MODULE_DESCRIPTION("FBDev driver for Hercules Graphics Adaptor"); MODULE_DESCRIPTION("FBDev driver for Hercules Graphics Adaptor");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_PARM(font, "s");
MODULE_PARM_DESC(font, "Specifies one of the compiled-in fonts (VGA8x8, VGA8x16, SUN8x16, Acorn8x8, PEARL8x8) (default=none)");
MODULE_PARM(nologo, "i"); MODULE_PARM(nologo, "i");
MODULE_PARM_DESC(nologo, "Disables startup logo if != 0 (default=0)"); MODULE_PARM_DESC(nologo, "Disables startup logo if != 0 (default=0)");
#endif /* MODULE */ #ifdef MODULE
module_init(hgafb_init);
module_exit(hgafb_exit);
#endif
This diff is collapsed.
...@@ -1155,8 +1155,6 @@ static void __exit tdfxfb_exit(void) ...@@ -1155,8 +1155,6 @@ static void __exit tdfxfb_exit(void)
MODULE_AUTHOR("Hannu Mallat <hmallat@cc.hut.fi>"); MODULE_AUTHOR("Hannu Mallat <hmallat@cc.hut.fi>");
MODULE_DESCRIPTION("3Dfx framebuffer device driver"); MODULE_DESCRIPTION("3Dfx framebuffer device driver");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_PARM(noaccel, "i");
MODULE_PARM_DESC(noaccel, "Disable hardware acceleration (1 = disabled), enabled by default.");
#ifdef MODULE #ifdef MODULE
module_init(tdfxfb_init); module_init(tdfxfb_init);
......
...@@ -176,6 +176,7 @@ struct neofb_par { ...@@ -176,6 +176,7 @@ struct neofb_par {
int lcd_stretch; int lcd_stretch;
int internal_display; int internal_display;
int external_display; int external_display;
int libretto;
}; };
typedef struct { typedef struct {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment