138 lines · c
1/*-*- linux-c -*-2 * linux/drivers/video/savage/savage_accel.c -- Hardware Acceleration3 *4 * Copyright (C) 2004 Antonino Daplas<adaplas@pol.net>5 * All Rights Reserved6 *7 * This file is subject to the terms and conditions of the GNU General Public8 * License. See the file COPYING in the main directory of this archive for9 * more details.10 */11#include <linux/kernel.h>12#include <linux/string.h>13#include <linux/fb.h>14#include <linux/module.h>15 16#include "savagefb.h"17 18static u32 savagefb_rop[] = {19 0xCC, /* ROP_COPY */20 0x5A /* ROP_XOR */21};22 23int savagefb_sync(struct fb_info *info)24{25 struct savagefb_par *par = info->par;26 27 par->SavageWaitIdle(par);28 return 0;29}30 31void savagefb_copyarea(struct fb_info *info, const struct fb_copyarea *region)32{33 struct savagefb_par *par = info->par;34 int sx = region->sx, dx = region->dx;35 int sy = region->sy, dy = region->dy;36 int cmd;37 38 if (!region->width || !region->height)39 return;40 par->bci_ptr = 0;41 cmd = BCI_CMD_RECT | BCI_CMD_DEST_GBD | BCI_CMD_SRC_GBD;42 BCI_CMD_SET_ROP(cmd, savagefb_rop[0]);43 44 if (dx <= sx) {45 cmd |= BCI_CMD_RECT_XP;46 } else {47 sx += region->width - 1;48 dx += region->width - 1;49 }50 51 if (dy <= sy) {52 cmd |= BCI_CMD_RECT_YP;53 } else {54 sy += region->height - 1;55 dy += region->height - 1;56 }57 58 par->SavageWaitFifo(par,4);59 BCI_SEND(cmd);60 BCI_SEND(BCI_X_Y(sx, sy));61 BCI_SEND(BCI_X_Y(dx, dy));62 BCI_SEND(BCI_W_H(region->width, region->height));63}64 65void savagefb_fillrect(struct fb_info *info, const struct fb_fillrect *rect)66{67 struct savagefb_par *par = info->par;68 int cmd, color;69 70 if (!rect->width || !rect->height)71 return;72 73 if (info->fix.visual == FB_VISUAL_PSEUDOCOLOR)74 color = rect->color;75 else76 color = ((u32 *)info->pseudo_palette)[rect->color];77 78 cmd = BCI_CMD_RECT | BCI_CMD_RECT_XP | BCI_CMD_RECT_YP |79 BCI_CMD_DEST_GBD | BCI_CMD_SRC_SOLID |80 BCI_CMD_SEND_COLOR;81 82 par->bci_ptr = 0;83 BCI_CMD_SET_ROP(cmd, savagefb_rop[rect->rop]);84 85 par->SavageWaitFifo(par,4);86 BCI_SEND(cmd);87 BCI_SEND(color);88 BCI_SEND( BCI_X_Y(rect->dx, rect->dy) );89 BCI_SEND( BCI_W_H(rect->width, rect->height) );90}91 92void savagefb_imageblit(struct fb_info *info, const struct fb_image *image)93{94 struct savagefb_par *par = info->par;95 int fg, bg, size, i, width;96 int cmd;97 u32 *src = (u32 *) image->data;98 99 if (!image->width || !image->height)100 return;101 102 if (image->depth != 1) {103 cfb_imageblit(info, image);104 return;105 }106 107 if (info->fix.visual == FB_VISUAL_PSEUDOCOLOR) {108 fg = image->fg_color;109 bg = image->bg_color;110 } else {111 fg = ((u32 *)info->pseudo_palette)[image->fg_color];112 bg = ((u32 *)info->pseudo_palette)[image->bg_color];113 }114 115 cmd = BCI_CMD_RECT | BCI_CMD_RECT_XP | BCI_CMD_RECT_YP |116 BCI_CMD_CLIP_LR | BCI_CMD_DEST_GBD | BCI_CMD_SRC_MONO |117 BCI_CMD_SEND_COLOR;118 119 par->bci_ptr = 0;120 BCI_CMD_SET_ROP(cmd, savagefb_rop[0]);121 122 width = (image->width + 31) & ~31;123 size = (width * image->height)/8;124 size >>= 2;125 126 par->SavageWaitFifo(par, size + 5);127 BCI_SEND(cmd);128 BCI_SEND(BCI_CLIP_LR(image->dx, image->dx + image->width - 1));129 BCI_SEND(fg);130 BCI_SEND(bg);131 BCI_SEND(BCI_X_Y(image->dx, image->dy));132 BCI_SEND(BCI_W_H(width, image->height));133 for (i = 0; i < size; i++)134 BCI_SEND(src[i]);135}136 137MODULE_LICENSE("GPL");138