X-Git-Url: http://pilppa.org/gitweb/gitweb.cgi?a=blobdiff_plain;f=drivers%2Fvideo%2Fsvgalib.c;h=9c7106701572409a967e563585209f1e9cb5198c;hb=714f83d5d9f7c785f622259dad1f4fad12d64664;hp=68b30d9eac587dfdf1b939eeedbc08f7c1304089;hpb=59b8175c771040afcd4ad67022b0cc80c216b866;p=linux-2.6-omap-h63xx.git diff --git a/drivers/video/svgalib.c b/drivers/video/svgalib.c index 68b30d9eac5..9c710670157 100644 --- a/drivers/video/svgalib.c +++ b/drivers/video/svgalib.c @@ -194,7 +194,7 @@ void svga_dump_var(struct fb_var_screeninfo *var, int node) void svga_settile(struct fb_info *info, struct fb_tilemap *map) { const u8 *font = map->data; - u8* fb = (u8 *) info->screen_base; + u8 __iomem *fb = (u8 __iomem *)info->screen_base; int i, c; if ((map->width != 8) || (map->height != 16) || @@ -207,7 +207,8 @@ void svga_settile(struct fb_info *info, struct fb_tilemap *map) fb += 2; for (c = 0; c < map->length; c++) { for (i = 0; i < map->height; i++) { - fb[i * 4] = font[i]; + fb_writeb(font[i], fb + i * 4); +// fb[i * 4] = font[i]; } fb += 128; font += map->height; @@ -221,8 +222,8 @@ void svga_tilecopy(struct fb_info *info, struct fb_tilearea *area) /* colstride is halved in this function because u16 are used */ int colstride = 1 << (info->fix.type_aux & FB_AUX_TEXT_SVGA_MASK); int rowstride = colstride * (info->var.xres_virtual / 8); - u16 *fb = (u16 *) info->screen_base; - u16 *src, *dst; + u16 __iomem *fb = (u16 __iomem *) info->screen_base; + u16 __iomem *src, *dst; if ((area->sy > area->dy) || ((area->sy == area->dy) && (area->sx > area->dx))) { @@ -239,10 +240,11 @@ void svga_tilecopy(struct fb_info *info, struct fb_tilearea *area) } for (dy = 0; dy < area->height; dy++) { - u16* src2 = src; - u16* dst2 = dst; + u16 __iomem *src2 = src; + u16 __iomem *dst2 = dst; for (dx = 0; dx < area->width; dx++) { - *dst2 = *src2; + fb_writew(fb_readw(src2), dst2); +// *dst2 = *src2; src2 += colstride; dst2 += colstride; } @@ -258,14 +260,14 @@ void svga_tilefill(struct fb_info *info, struct fb_tilerect *rect) int colstride = 2 << (info->fix.type_aux & FB_AUX_TEXT_SVGA_MASK); int rowstride = colstride * (info->var.xres_virtual / 8); int attr = (0x0F & rect->bg) << 4 | (0x0F & rect->fg); - u8 *fb = (u8 *) info->screen_base; + u8 __iomem *fb = (u8 __iomem *)info->screen_base; fb += rect->sx * colstride + rect->sy * rowstride; for (dy = 0; dy < rect->height; dy++) { - u8* fb2 = fb; + u8 __iomem *fb2 = fb; for (dx = 0; dx < rect->width; dx++) { - fb2[0] = rect->index; - fb2[1] = attr; + fb_writeb(rect->index, fb2); + fb_writeb(attr, fb2 + 1); fb2 += colstride; } fb += rowstride; @@ -279,15 +281,15 @@ void svga_tileblit(struct fb_info *info, struct fb_tileblit *blit) int colstride = 2 << (info->fix.type_aux & FB_AUX_TEXT_SVGA_MASK); int rowstride = colstride * (info->var.xres_virtual / 8); int attr = (0x0F & blit->bg) << 4 | (0x0F & blit->fg); - u8* fb = (u8 *) info->screen_base; + u8 __iomem *fb = (u8 __iomem *)info->screen_base; fb += blit->sx * colstride + blit->sy * rowstride; i=0; for (dy=0; dy < blit->height; dy ++) { - u8* fb2 = fb; + u8 __iomem *fb2 = fb; for (dx = 0; dx < blit->width; dx ++) { - fb2[0] = blit->indices[i]; - fb2[1] = attr; + fb_writeb(blit->indices[i], fb2); + fb_writeb(attr, fb2 + 1); fb2 += colstride; i ++; if (i == blit->length) return; @@ -340,6 +342,28 @@ void svga_tilecursor(struct fb_info *info, struct fb_tilecursor *cursor) vga_wcrt(NULL, 0x0A, cs); /* set cursor start and enable it */ } +int svga_get_tilemax(struct fb_info *info) +{ + return 256; +} + +/* Get capabilities of accelerator based on the mode */ + +void svga_get_caps(struct fb_info *info, struct fb_blit_caps *caps, + struct fb_var_screeninfo *var) +{ + if (var->bits_per_pixel == 0) { + /* can only support 256 8x16 bitmap */ + caps->x = 1 << (8 - 1); + caps->y = 1 << (16 - 1); + caps->len = 256; + } else { + caps->x = (var->bits_per_pixel == 4) ? 1 << (8 - 1) : ~(u32)0; + caps->y = ~(u32)0; + caps->len = ~(u32)0; + } +} +EXPORT_SYMBOL(svga_get_caps); /* ------------------------------------------------------------------------- */ @@ -574,9 +598,11 @@ void svga_set_timings(const struct svga_timing_regs *tm, struct fb_var_screeninf /* ------------------------------------------------------------------------- */ -int svga_match_format(const struct svga_fb_format *frm, struct fb_var_screeninfo *var, struct fb_fix_screeninfo *fix) +static inline int match_format(const struct svga_fb_format *frm, + struct fb_var_screeninfo *var) { int i = 0; + int stored = -EINVAL; while (frm->bits_per_pixel != SVGA_FORMAT_END_VAL) { @@ -585,25 +611,38 @@ int svga_match_format(const struct svga_fb_format *frm, struct fb_var_screeninfo (var->green.length <= frm->green.length) && (var->blue.length <= frm->blue.length) && (var->transp.length <= frm->transp.length) && - (var->nonstd == frm->nonstd)) { - var->bits_per_pixel = frm->bits_per_pixel; - var->red = frm->red; - var->green = frm->green; - var->blue = frm->blue; - var->transp = frm->transp; - var->nonstd = frm->nonstd; - if (fix != NULL) { - fix->type = frm->type; - fix->type_aux = frm->type_aux; - fix->visual = frm->visual; - fix->xpanstep = frm->xpanstep; - } + (var->nonstd == frm->nonstd)) return i; - } + if (var->bits_per_pixel == frm->bits_per_pixel) + stored = i; i++; frm++; } - return -EINVAL; + return stored; +} + +int svga_match_format(const struct svga_fb_format *frm, + struct fb_var_screeninfo *var, + struct fb_fix_screeninfo *fix) +{ + int i = match_format(frm, var); + + if (i >= 0) { + var->bits_per_pixel = frm[i].bits_per_pixel; + var->red = frm[i].red; + var->green = frm[i].green; + var->blue = frm[i].blue; + var->transp = frm[i].transp; + var->nonstd = frm[i].nonstd; + if (fix != NULL) { + fix->type = frm[i].type; + fix->type_aux = frm[i].type_aux; + fix->visual = frm[i].visual; + fix->xpanstep = frm[i].xpanstep; + } + } + + return i; } @@ -621,6 +660,7 @@ EXPORT_SYMBOL(svga_tilecopy); EXPORT_SYMBOL(svga_tilefill); EXPORT_SYMBOL(svga_tileblit); EXPORT_SYMBOL(svga_tilecursor); +EXPORT_SYMBOL(svga_get_tilemax); EXPORT_SYMBOL(svga_compute_pll); EXPORT_SYMBOL(svga_check_timings);