blob: 9d9d2009ad8caa3af457d263afa5c8717227016a [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001/*
2 * linux/drivers/video/tgafb.c -- DEC 21030 TGA frame buffer device
3 *
4 * Copyright (C) 1995 Jay Estabrook
5 * Copyright (C) 1997 Geert Uytterhoeven
6 * Copyright (C) 1999,2000 Martin Lucina, Tom Zerucha
7 * Copyright (C) 2002 Richard Henderson
8 *
9 * This file is subject to the terms and conditions of the GNU General Public
10 * License. See the file COPYING in the main directory of this archive for
11 * more details.
12 */
13
14#include <linux/module.h>
15#include <linux/kernel.h>
16#include <linux/sched.h>
17#include <linux/errno.h>
18#include <linux/string.h>
19#include <linux/mm.h>
20#include <linux/tty.h>
21#include <linux/slab.h>
22#include <linux/delay.h>
23#include <linux/init.h>
24#include <linux/fb.h>
25#include <linux/pci.h>
26#include <linux/selection.h>
27#include <asm/io.h>
28#include <video/tgafb.h>
29#include <linux/selection.h>
30
31/*
32 * Local functions.
33 */
34
35static int tgafb_check_var(struct fb_var_screeninfo *, struct fb_info *);
36static int tgafb_set_par(struct fb_info *);
37static void tgafb_set_pll(struct tga_par *, int);
38static int tgafb_setcolreg(unsigned, unsigned, unsigned, unsigned,
39 unsigned, struct fb_info *);
40static int tgafb_blank(int, struct fb_info *);
41static void tgafb_init_fix(struct fb_info *);
42
43static void tgafb_imageblit(struct fb_info *, const struct fb_image *);
44static void tgafb_fillrect(struct fb_info *, const struct fb_fillrect *);
45static void tgafb_copyarea(struct fb_info *, const struct fb_copyarea *);
46
47static int tgafb_pci_register(struct pci_dev *, const struct pci_device_id *);
Linus Torvalds1da177e2005-04-16 15:20:36 -070048static void tgafb_pci_unregister(struct pci_dev *);
Linus Torvalds1da177e2005-04-16 15:20:36 -070049
50static const char *mode_option = "640x480@60";
51
52
53/*
54 * Frame buffer operations
55 */
56
57static struct fb_ops tgafb_ops = {
58 .owner = THIS_MODULE,
59 .fb_check_var = tgafb_check_var,
60 .fb_set_par = tgafb_set_par,
61 .fb_setcolreg = tgafb_setcolreg,
62 .fb_blank = tgafb_blank,
63 .fb_fillrect = tgafb_fillrect,
64 .fb_copyarea = tgafb_copyarea,
65 .fb_imageblit = tgafb_imageblit,
66 .fb_cursor = soft_cursor,
67};
68
69
70/*
71 * PCI registration operations
72 */
73
74static struct pci_device_id const tgafb_pci_table[] = {
75 { PCI_VENDOR_ID_DEC, PCI_DEVICE_ID_DEC_TGA, PCI_ANY_ID, PCI_ANY_ID,
76 0, 0, 0 }
77};
78
79static struct pci_driver tgafb_driver = {
80 .name = "tgafb",
81 .id_table = tgafb_pci_table,
82 .probe = tgafb_pci_register,
83 .remove = __devexit_p(tgafb_pci_unregister),
84};
85
86
87/**
88 * tgafb_check_var - Optional function. Validates a var passed in.
89 * @var: frame buffer variable screen structure
90 * @info: frame buffer structure that represents a single frame buffer
91 */
92static int
93tgafb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
94{
95 struct tga_par *par = (struct tga_par *)info->par;
96
97 if (par->tga_type == TGA_TYPE_8PLANE) {
98 if (var->bits_per_pixel != 8)
99 return -EINVAL;
100 } else {
101 if (var->bits_per_pixel != 32)
102 return -EINVAL;
103 }
104
105 if (var->xres_virtual != var->xres || var->yres_virtual != var->yres)
106 return -EINVAL;
107 if (var->nonstd)
108 return -EINVAL;
109 if (1000000000 / var->pixclock > TGA_PLL_MAX_FREQ)
110 return -EINVAL;
111 if ((var->vmode & FB_VMODE_MASK) != FB_VMODE_NONINTERLACED)
112 return -EINVAL;
113
114 /* Some of the acceleration routines assume the line width is
115 a multiple of 64 bytes. */
116 if (var->xres * (par->tga_type == TGA_TYPE_8PLANE ? 1 : 4) % 64)
117 return -EINVAL;
118
119 return 0;
120}
121
122/**
123 * tgafb_set_par - Optional function. Alters the hardware state.
124 * @info: frame buffer structure that represents a single frame buffer
125 */
126static int
127tgafb_set_par(struct fb_info *info)
128{
129 static unsigned int const deep_presets[4] = {
130 0x00014000,
131 0x0001440d,
132 0xffffffff,
133 0x0001441d
134 };
135 static unsigned int const rasterop_presets[4] = {
136 0x00000003,
137 0x00000303,
138 0xffffffff,
139 0x00000303
140 };
141 static unsigned int const mode_presets[4] = {
142 0x00002000,
143 0x00002300,
144 0xffffffff,
145 0x00002300
146 };
147 static unsigned int const base_addr_presets[4] = {
148 0x00000000,
149 0x00000001,
150 0xffffffff,
151 0x00000001
152 };
153
154 struct tga_par *par = (struct tga_par *) info->par;
155 u32 htimings, vtimings, pll_freq;
156 u8 tga_type;
157 int i, j;
158
159 /* Encode video timings. */
160 htimings = (((info->var.xres/4) & TGA_HORIZ_ACT_LSB)
161 | (((info->var.xres/4) & 0x600 << 19) & TGA_HORIZ_ACT_MSB));
162 vtimings = (info->var.yres & TGA_VERT_ACTIVE);
163 htimings |= ((info->var.right_margin/4) << 9) & TGA_HORIZ_FP;
164 vtimings |= (info->var.lower_margin << 11) & TGA_VERT_FP;
165 htimings |= ((info->var.hsync_len/4) << 14) & TGA_HORIZ_SYNC;
166 vtimings |= (info->var.vsync_len << 16) & TGA_VERT_SYNC;
167 htimings |= ((info->var.left_margin/4) << 21) & TGA_HORIZ_BP;
168 vtimings |= (info->var.upper_margin << 22) & TGA_VERT_BP;
169
170 if (info->var.sync & FB_SYNC_HOR_HIGH_ACT)
171 htimings |= TGA_HORIZ_POLARITY;
172 if (info->var.sync & FB_SYNC_VERT_HIGH_ACT)
173 vtimings |= TGA_VERT_POLARITY;
174
175 par->htimings = htimings;
176 par->vtimings = vtimings;
177
178 par->sync_on_green = !!(info->var.sync & FB_SYNC_ON_GREEN);
179
180 /* Store other useful values in par. */
181 par->xres = info->var.xres;
182 par->yres = info->var.yres;
183 par->pll_freq = pll_freq = 1000000000 / info->var.pixclock;
184 par->bits_per_pixel = info->var.bits_per_pixel;
185
186 tga_type = par->tga_type;
187
188 /* First, disable video. */
189 TGA_WRITE_REG(par, TGA_VALID_VIDEO | TGA_VALID_BLANK, TGA_VALID_REG);
190
191 /* Write the DEEP register. */
192 while (TGA_READ_REG(par, TGA_CMD_STAT_REG) & 1) /* wait for not busy */
193 continue;
194 mb();
195 TGA_WRITE_REG(par, deep_presets[tga_type], TGA_DEEP_REG);
196 while (TGA_READ_REG(par, TGA_CMD_STAT_REG) & 1) /* wait for not busy */
197 continue;
198 mb();
199
200 /* Write some more registers. */
201 TGA_WRITE_REG(par, rasterop_presets[tga_type], TGA_RASTEROP_REG);
202 TGA_WRITE_REG(par, mode_presets[tga_type], TGA_MODE_REG);
203 TGA_WRITE_REG(par, base_addr_presets[tga_type], TGA_BASE_ADDR_REG);
204
205 /* Calculate & write the PLL. */
206 tgafb_set_pll(par, pll_freq);
207
208 /* Write some more registers. */
209 TGA_WRITE_REG(par, 0xffffffff, TGA_PLANEMASK_REG);
210 TGA_WRITE_REG(par, 0xffffffff, TGA_PIXELMASK_REG);
211
212 /* Init video timing regs. */
213 TGA_WRITE_REG(par, htimings, TGA_HORIZ_REG);
214 TGA_WRITE_REG(par, vtimings, TGA_VERT_REG);
215
216 /* Initalise RAMDAC. */
217 if (tga_type == TGA_TYPE_8PLANE) {
218
219 /* Init BT485 RAMDAC registers. */
220 BT485_WRITE(par, 0xa2 | (par->sync_on_green ? 0x8 : 0x0),
221 BT485_CMD_0);
222 BT485_WRITE(par, 0x01, BT485_ADDR_PAL_WRITE);
223 BT485_WRITE(par, 0x14, BT485_CMD_3); /* cursor 64x64 */
224 BT485_WRITE(par, 0x40, BT485_CMD_1);
225 BT485_WRITE(par, 0x20, BT485_CMD_2); /* cursor off, for now */
226 BT485_WRITE(par, 0xff, BT485_PIXEL_MASK);
227
228 /* Fill palette registers. */
229 BT485_WRITE(par, 0x00, BT485_ADDR_PAL_WRITE);
230 TGA_WRITE_REG(par, BT485_DATA_PAL, TGA_RAMDAC_SETUP_REG);
231
232 for (i = 0; i < 16; i++) {
233 j = color_table[i];
234 TGA_WRITE_REG(par, default_red[j]|(BT485_DATA_PAL<<8),
235 TGA_RAMDAC_REG);
236 TGA_WRITE_REG(par, default_grn[j]|(BT485_DATA_PAL<<8),
237 TGA_RAMDAC_REG);
238 TGA_WRITE_REG(par, default_blu[j]|(BT485_DATA_PAL<<8),
239 TGA_RAMDAC_REG);
240 }
241 for (i = 0; i < 240*3; i += 4) {
242 TGA_WRITE_REG(par, 0x55|(BT485_DATA_PAL<<8),
243 TGA_RAMDAC_REG);
244 TGA_WRITE_REG(par, 0x00|(BT485_DATA_PAL<<8),
245 TGA_RAMDAC_REG);
246 TGA_WRITE_REG(par, 0x00|(BT485_DATA_PAL<<8),
247 TGA_RAMDAC_REG);
248 TGA_WRITE_REG(par, 0x00|(BT485_DATA_PAL<<8),
249 TGA_RAMDAC_REG);
250 }
251
252 } else { /* 24-plane or 24plusZ */
253
254 /* Init BT463 registers. */
255 BT463_WRITE(par, BT463_REG_ACC, BT463_CMD_REG_0, 0x40);
256 BT463_WRITE(par, BT463_REG_ACC, BT463_CMD_REG_1, 0x08);
257 BT463_WRITE(par, BT463_REG_ACC, BT463_CMD_REG_2,
258 (par->sync_on_green ? 0x80 : 0x40));
259
260 BT463_WRITE(par, BT463_REG_ACC, BT463_READ_MASK_0, 0xff);
261 BT463_WRITE(par, BT463_REG_ACC, BT463_READ_MASK_1, 0xff);
262 BT463_WRITE(par, BT463_REG_ACC, BT463_READ_MASK_2, 0xff);
263 BT463_WRITE(par, BT463_REG_ACC, BT463_READ_MASK_3, 0x0f);
264
265 BT463_WRITE(par, BT463_REG_ACC, BT463_BLINK_MASK_0, 0x00);
266 BT463_WRITE(par, BT463_REG_ACC, BT463_BLINK_MASK_1, 0x00);
267 BT463_WRITE(par, BT463_REG_ACC, BT463_BLINK_MASK_2, 0x00);
268 BT463_WRITE(par, BT463_REG_ACC, BT463_BLINK_MASK_3, 0x00);
269
270 /* Fill the palette. */
271 BT463_LOAD_ADDR(par, 0x0000);
272 TGA_WRITE_REG(par, BT463_PALETTE<<2, TGA_RAMDAC_REG);
273
274 for (i = 0; i < 16; i++) {
275 j = color_table[i];
276 TGA_WRITE_REG(par, default_red[j]|(BT463_PALETTE<<10),
277 TGA_RAMDAC_REG);
278 TGA_WRITE_REG(par, default_grn[j]|(BT463_PALETTE<<10),
279 TGA_RAMDAC_REG);
280 TGA_WRITE_REG(par, default_blu[j]|(BT463_PALETTE<<10),
281 TGA_RAMDAC_REG);
282 }
283 for (i = 0; i < 512*3; i += 4) {
284 TGA_WRITE_REG(par, 0x55|(BT463_PALETTE<<10),
285 TGA_RAMDAC_REG);
286 TGA_WRITE_REG(par, 0x00|(BT463_PALETTE<<10),
287 TGA_RAMDAC_REG);
288 TGA_WRITE_REG(par, 0x00|(BT463_PALETTE<<10),
289 TGA_RAMDAC_REG);
290 TGA_WRITE_REG(par, 0x00|(BT463_PALETTE<<10),
291 TGA_RAMDAC_REG);
292 }
293
294 /* Fill window type table after start of vertical retrace. */
295 while (!(TGA_READ_REG(par, TGA_INTR_STAT_REG) & 0x01))
296 continue;
297 TGA_WRITE_REG(par, 0x01, TGA_INTR_STAT_REG);
298 mb();
299 while (!(TGA_READ_REG(par, TGA_INTR_STAT_REG) & 0x01))
300 continue;
301 TGA_WRITE_REG(par, 0x01, TGA_INTR_STAT_REG);
302
303 BT463_LOAD_ADDR(par, BT463_WINDOW_TYPE_BASE);
304 TGA_WRITE_REG(par, BT463_REG_ACC<<2, TGA_RAMDAC_SETUP_REG);
305
306 for (i = 0; i < 16; i++) {
307 TGA_WRITE_REG(par, 0x00|(BT463_REG_ACC<<10),
308 TGA_RAMDAC_REG);
309 TGA_WRITE_REG(par, 0x01|(BT463_REG_ACC<<10),
310 TGA_RAMDAC_REG);
311 TGA_WRITE_REG(par, 0x80|(BT463_REG_ACC<<10),
312 TGA_RAMDAC_REG);
313 }
314
315 }
316
317 /* Finally, enable video scan (and pray for the monitor... :-) */
318 TGA_WRITE_REG(par, TGA_VALID_VIDEO, TGA_VALID_REG);
319
320 return 0;
321}
322
323#define DIFFCHECK(X) \
324do { \
325 if (m <= 0x3f) { \
326 int delta = f - (TGA_PLL_BASE_FREQ * (X)) / (r << shift); \
327 if (delta < 0) \
328 delta = -delta; \
329 if (delta < min_diff) \
330 min_diff = delta, vm = m, va = a, vr = r; \
331 } \
332} while (0)
333
334static void
335tgafb_set_pll(struct tga_par *par, int f)
336{
337 int n, shift, base, min_diff, target;
338 int r,a,m,vm = 34, va = 1, vr = 30;
339
340 for (r = 0 ; r < 12 ; r++)
341 TGA_WRITE_REG(par, !r, TGA_CLOCK_REG);
342
343 if (f > TGA_PLL_MAX_FREQ)
344 f = TGA_PLL_MAX_FREQ;
345
346 if (f >= TGA_PLL_MAX_FREQ / 2)
347 shift = 0;
348 else if (f >= TGA_PLL_MAX_FREQ / 4)
349 shift = 1;
350 else
351 shift = 2;
352
353 TGA_WRITE_REG(par, shift & 1, TGA_CLOCK_REG);
354 TGA_WRITE_REG(par, shift >> 1, TGA_CLOCK_REG);
355
356 for (r = 0 ; r < 10 ; r++)
357 TGA_WRITE_REG(par, 0, TGA_CLOCK_REG);
358
359 if (f <= 120000) {
360 TGA_WRITE_REG(par, 0, TGA_CLOCK_REG);
361 TGA_WRITE_REG(par, 0, TGA_CLOCK_REG);
362 }
363 else if (f <= 200000) {
364 TGA_WRITE_REG(par, 1, TGA_CLOCK_REG);
365 TGA_WRITE_REG(par, 0, TGA_CLOCK_REG);
366 }
367 else {
368 TGA_WRITE_REG(par, 0, TGA_CLOCK_REG);
369 TGA_WRITE_REG(par, 1, TGA_CLOCK_REG);
370 }
371
372 TGA_WRITE_REG(par, 1, TGA_CLOCK_REG);
373 TGA_WRITE_REG(par, 0, TGA_CLOCK_REG);
374 TGA_WRITE_REG(par, 0, TGA_CLOCK_REG);
375 TGA_WRITE_REG(par, 1, TGA_CLOCK_REG);
376 TGA_WRITE_REG(par, 0, TGA_CLOCK_REG);
377 TGA_WRITE_REG(par, 1, TGA_CLOCK_REG);
378
379 target = (f << shift) / TGA_PLL_BASE_FREQ;
380 min_diff = TGA_PLL_MAX_FREQ;
381
382 r = 7 / target;
383 if (!r) r = 1;
384
385 base = target * r;
386 while (base < 449) {
387 for (n = base < 7 ? 7 : base; n < base + target && n < 449; n++) {
388 m = ((n + 3) / 7) - 1;
389 a = 0;
390 DIFFCHECK((m + 1) * 7);
391 m++;
392 DIFFCHECK((m + 1) * 7);
393 m = (n / 6) - 1;
394 if ((a = n % 6))
395 DIFFCHECK(n);
396 }
397 r++;
398 base += target;
399 }
400
401 vr--;
402
403 for (r = 0; r < 8; r++)
404 TGA_WRITE_REG(par, (vm >> r) & 1, TGA_CLOCK_REG);
405 for (r = 0; r < 8 ; r++)
406 TGA_WRITE_REG(par, (va >> r) & 1, TGA_CLOCK_REG);
407 for (r = 0; r < 7 ; r++)
408 TGA_WRITE_REG(par, (vr >> r) & 1, TGA_CLOCK_REG);
409 TGA_WRITE_REG(par, ((vr >> 7) & 1)|2, TGA_CLOCK_REG);
410}
411
412
413/**
414 * tgafb_setcolreg - Optional function. Sets a color register.
415 * @regno: boolean, 0 copy local, 1 get_user() function
416 * @red: frame buffer colormap structure
417 * @green: The green value which can be up to 16 bits wide
418 * @blue: The blue value which can be up to 16 bits wide.
419 * @transp: If supported the alpha value which can be up to 16 bits wide.
420 * @info: frame buffer info structure
421 */
422static int
423tgafb_setcolreg(unsigned regno, unsigned red, unsigned green, unsigned blue,
424 unsigned transp, struct fb_info *info)
425{
426 struct tga_par *par = (struct tga_par *) info->par;
427
428 if (regno > 255)
429 return 1;
430 red >>= 8;
431 green >>= 8;
432 blue >>= 8;
433
434 if (par->tga_type == TGA_TYPE_8PLANE) {
435 BT485_WRITE(par, regno, BT485_ADDR_PAL_WRITE);
436 TGA_WRITE_REG(par, BT485_DATA_PAL, TGA_RAMDAC_SETUP_REG);
437 TGA_WRITE_REG(par, red|(BT485_DATA_PAL<<8),TGA_RAMDAC_REG);
438 TGA_WRITE_REG(par, green|(BT485_DATA_PAL<<8),TGA_RAMDAC_REG);
439 TGA_WRITE_REG(par, blue|(BT485_DATA_PAL<<8),TGA_RAMDAC_REG);
440 } else if (regno < 16) {
441 u32 value = (red << 16) | (green << 8) | blue;
442 ((u32 *)info->pseudo_palette)[regno] = value;
443 }
444
445 return 0;
446}
447
448
449/**
450 * tgafb_blank - Optional function. Blanks the display.
451 * @blank_mode: the blank mode we want.
452 * @info: frame buffer structure that represents a single frame buffer
453 */
454static int
455tgafb_blank(int blank, struct fb_info *info)
456{
457 struct tga_par *par = (struct tga_par *) info->par;
458 u32 vhcr, vvcr, vvvr;
459 unsigned long flags;
460
461 local_irq_save(flags);
462
463 vhcr = TGA_READ_REG(par, TGA_HORIZ_REG);
464 vvcr = TGA_READ_REG(par, TGA_VERT_REG);
465 vvvr = TGA_READ_REG(par, TGA_VALID_REG);
466 vvvr &= ~(TGA_VALID_VIDEO | TGA_VALID_BLANK);
467
468 switch (blank) {
469 case FB_BLANK_UNBLANK: /* Unblanking */
470 if (par->vesa_blanked) {
471 TGA_WRITE_REG(par, vhcr & 0xbfffffff, TGA_HORIZ_REG);
472 TGA_WRITE_REG(par, vvcr & 0xbfffffff, TGA_VERT_REG);
473 par->vesa_blanked = 0;
474 }
475 TGA_WRITE_REG(par, vvvr | TGA_VALID_VIDEO, TGA_VALID_REG);
476 break;
477
478 case FB_BLANK_NORMAL: /* Normal blanking */
479 TGA_WRITE_REG(par, vvvr | TGA_VALID_VIDEO | TGA_VALID_BLANK,
480 TGA_VALID_REG);
481 break;
482
483 case FB_BLANK_VSYNC_SUSPEND: /* VESA blank (vsync off) */
484 TGA_WRITE_REG(par, vvcr | 0x40000000, TGA_VERT_REG);
485 TGA_WRITE_REG(par, vvvr | TGA_VALID_BLANK, TGA_VALID_REG);
486 par->vesa_blanked = 1;
487 break;
488
489 case FB_BLANK_HSYNC_SUSPEND: /* VESA blank (hsync off) */
490 TGA_WRITE_REG(par, vhcr | 0x40000000, TGA_HORIZ_REG);
491 TGA_WRITE_REG(par, vvvr | TGA_VALID_BLANK, TGA_VALID_REG);
492 par->vesa_blanked = 1;
493 break;
494
495 case FB_BLANK_POWERDOWN: /* Poweroff */
496 TGA_WRITE_REG(par, vhcr | 0x40000000, TGA_HORIZ_REG);
497 TGA_WRITE_REG(par, vvcr | 0x40000000, TGA_VERT_REG);
498 TGA_WRITE_REG(par, vvvr | TGA_VALID_BLANK, TGA_VALID_REG);
499 par->vesa_blanked = 1;
500 break;
501 }
502
503 local_irq_restore(flags);
504 return 0;
505}
506
507
508/*
509 * Acceleration.
510 */
511
512/**
513 * tgafb_imageblit - REQUIRED function. Can use generic routines if
514 * non acclerated hardware and packed pixel based.
515 * Copies a image from system memory to the screen.
516 *
517 * @info: frame buffer structure that represents a single frame buffer
518 * @image: structure defining the image.
519 */
520static void
521tgafb_imageblit(struct fb_info *info, const struct fb_image *image)
522{
523 static unsigned char const bitrev[256] = {
524 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
525 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
526 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
527 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
528 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
529 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
530 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
531 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
532 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
533 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
534 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
535 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
536 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
537 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
538 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
539 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
540 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
541 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
542 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
543 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
544 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
545 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
546 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
547 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
548 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
549 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
550 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
551 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
552 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
553 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
554 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
555 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
556 };
557
558 struct tga_par *par = (struct tga_par *) info->par;
559 u32 fgcolor, bgcolor, dx, dy, width, height, vxres, vyres, pixelmask;
560 unsigned long rincr, line_length, shift, pos, is8bpp;
561 unsigned long i, j;
562 const unsigned char *data;
563 void __iomem *regs_base;
564 void __iomem *fb_base;
565
566 dx = image->dx;
567 dy = image->dy;
568 width = image->width;
569 height = image->height;
570 vxres = info->var.xres_virtual;
571 vyres = info->var.yres_virtual;
572 line_length = info->fix.line_length;
573 rincr = (width + 7) / 8;
574
575 /* Crop the image to the screen. */
576 if (dx > vxres || dy > vyres)
577 return;
578 if (dx + width > vxres)
579 width = vxres - dx;
580 if (dy + height > vyres)
581 height = vyres - dy;
582
583 /* For copies that aren't pixel expansion, there's little we
584 can do better than the generic code. */
585 /* ??? There is a DMA write mode; I wonder if that could be
586 made to pull the data from the image buffer... */
587 if (image->depth > 1) {
588 cfb_imageblit(info, image);
589 return;
590 }
591
592 regs_base = par->tga_regs_base;
593 fb_base = par->tga_fb_base;
594 is8bpp = info->var.bits_per_pixel == 8;
595
596 /* Expand the color values to fill 32-bits. */
597 /* ??? Would be nice to notice colour changes elsewhere, so
598 that we can do this only when necessary. */
599 fgcolor = image->fg_color;
600 bgcolor = image->bg_color;
601 if (is8bpp) {
602 fgcolor |= fgcolor << 8;
603 fgcolor |= fgcolor << 16;
604 bgcolor |= bgcolor << 8;
605 bgcolor |= bgcolor << 16;
606 } else {
607 if (fgcolor < 16)
608 fgcolor = ((u32 *)info->pseudo_palette)[fgcolor];
609 if (bgcolor < 16)
610 bgcolor = ((u32 *)info->pseudo_palette)[bgcolor];
611 }
612 __raw_writel(fgcolor, regs_base + TGA_FOREGROUND_REG);
613 __raw_writel(bgcolor, regs_base + TGA_BACKGROUND_REG);
614
615 /* Acquire proper alignment; set up the PIXELMASK register
616 so that we only write the proper character cell. */
617 pos = dy * line_length;
618 if (is8bpp) {
619 pos += dx;
620 shift = pos & 3;
621 pos &= -4;
622 } else {
623 pos += dx * 4;
624 shift = (pos & 7) >> 2;
625 pos &= -8;
626 }
627
628 data = (const unsigned char *) image->data;
629
630 /* Enable opaque stipple mode. */
631 __raw_writel((is8bpp
632 ? TGA_MODE_SBM_8BPP | TGA_MODE_OPAQUE_STIPPLE
633 : TGA_MODE_SBM_24BPP | TGA_MODE_OPAQUE_STIPPLE),
634 regs_base + TGA_MODE_REG);
635
636 if (width + shift <= 32) {
637 unsigned long bwidth;
638
639 /* Handle common case of imaging a single character, in
640 a font less than 32 pixels wide. */
641
642 pixelmask = (1 << width) - 1;
643 pixelmask <<= shift;
644 __raw_writel(pixelmask, regs_base + TGA_PIXELMASK_REG);
645 wmb();
646
647 bwidth = (width + 7) / 8;
648
649 for (i = 0; i < height; ++i) {
650 u32 mask = 0;
651
652 /* The image data is bit big endian; we need
653 little endian. */
654 for (j = 0; j < bwidth; ++j)
655 mask |= bitrev[data[j]] << (j * 8);
656
657 __raw_writel(mask << shift, fb_base + pos);
658
659 pos += line_length;
660 data += rincr;
661 }
662 wmb();
663 __raw_writel(0xffffffff, regs_base + TGA_PIXELMASK_REG);
664 } else if (shift == 0) {
665 unsigned long pos0 = pos;
666 const unsigned char *data0 = data;
667 unsigned long bincr = (is8bpp ? 8 : 8*4);
668 unsigned long bwidth;
669
670 /* Handle another common case in which accel_putcs
671 generates a large bitmap, which happens to be aligned.
672 Allow the tail to be misaligned. This case is
673 interesting because we've not got to hold partial
674 bytes across the words being written. */
675
676 wmb();
677
678 bwidth = (width / 8) & -4;
679 for (i = 0; i < height; ++i) {
680 for (j = 0; j < bwidth; j += 4) {
681 u32 mask = 0;
682 mask |= bitrev[data[j+0]] << (0 * 8);
683 mask |= bitrev[data[j+1]] << (1 * 8);
684 mask |= bitrev[data[j+2]] << (2 * 8);
685 mask |= bitrev[data[j+3]] << (3 * 8);
686 __raw_writel(mask, fb_base + pos + j*bincr);
687 }
688 pos += line_length;
689 data += rincr;
690 }
691 wmb();
692
693 pixelmask = (1ul << (width & 31)) - 1;
694 if (pixelmask) {
695 __raw_writel(pixelmask, regs_base + TGA_PIXELMASK_REG);
696 wmb();
697
698 pos = pos0 + bwidth*bincr;
699 data = data0 + bwidth;
700 bwidth = ((width & 31) + 7) / 8;
701
702 for (i = 0; i < height; ++i) {
703 u32 mask = 0;
704 for (j = 0; j < bwidth; ++j)
705 mask |= bitrev[data[j]] << (j * 8);
706 __raw_writel(mask, fb_base + pos);
707 pos += line_length;
708 data += rincr;
709 }
710 wmb();
711 __raw_writel(0xffffffff, regs_base + TGA_PIXELMASK_REG);
712 }
713 } else {
714 unsigned long pos0 = pos;
715 const unsigned char *data0 = data;
716 unsigned long bincr = (is8bpp ? 8 : 8*4);
717 unsigned long bwidth;
718
719 /* Finally, handle the generic case of misaligned start.
720 Here we split the write into 16-bit spans. This allows
721 us to use only one pixel mask, instead of four as would
722 be required by writing 24-bit spans. */
723
724 pixelmask = 0xffff << shift;
725 __raw_writel(pixelmask, regs_base + TGA_PIXELMASK_REG);
726 wmb();
727
728 bwidth = (width / 8) & -2;
729 for (i = 0; i < height; ++i) {
730 for (j = 0; j < bwidth; j += 2) {
731 u32 mask = 0;
732 mask |= bitrev[data[j+0]] << (0 * 8);
733 mask |= bitrev[data[j+1]] << (1 * 8);
734 mask <<= shift;
735 __raw_writel(mask, fb_base + pos + j*bincr);
736 }
737 pos += line_length;
738 data += rincr;
739 }
740 wmb();
741
742 pixelmask = ((1ul << (width & 15)) - 1) << shift;
743 if (pixelmask) {
744 __raw_writel(pixelmask, regs_base + TGA_PIXELMASK_REG);
745 wmb();
746
747 pos = pos0 + bwidth*bincr;
748 data = data0 + bwidth;
749 bwidth = (width & 15) > 8;
750
751 for (i = 0; i < height; ++i) {
752 u32 mask = bitrev[data[0]];
753 if (bwidth)
754 mask |= bitrev[data[1]] << 8;
755 mask <<= shift;
756 __raw_writel(mask, fb_base + pos);
757 pos += line_length;
758 data += rincr;
759 }
760 wmb();
761 }
762 __raw_writel(0xffffffff, regs_base + TGA_PIXELMASK_REG);
763 }
764
765 /* Disable opaque stipple mode. */
766 __raw_writel((is8bpp
767 ? TGA_MODE_SBM_8BPP | TGA_MODE_SIMPLE
768 : TGA_MODE_SBM_24BPP | TGA_MODE_SIMPLE),
769 regs_base + TGA_MODE_REG);
770}
771
772/**
773 * tgafb_fillrect - REQUIRED function. Can use generic routines if
774 * non acclerated hardware and packed pixel based.
775 * Draws a rectangle on the screen.
776 *
777 * @info: frame buffer structure that represents a single frame buffer
778 * @rect: structure defining the rectagle and operation.
779 */
780static void
781tgafb_fillrect(struct fb_info *info, const struct fb_fillrect *rect)
782{
783 struct tga_par *par = (struct tga_par *) info->par;
784 int is8bpp = info->var.bits_per_pixel == 8;
785 u32 dx, dy, width, height, vxres, vyres, color;
786 unsigned long pos, align, line_length, i, j;
787 void __iomem *regs_base;
788 void __iomem *fb_base;
789
790 dx = rect->dx;
791 dy = rect->dy;
792 width = rect->width;
793 height = rect->height;
794 vxres = info->var.xres_virtual;
795 vyres = info->var.yres_virtual;
796 line_length = info->fix.line_length;
797 regs_base = par->tga_regs_base;
798 fb_base = par->tga_fb_base;
799
800 /* Crop the rectangle to the screen. */
801 if (dx > vxres || dy > vyres || !width || !height)
802 return;
803 if (dx + width > vxres)
804 width = vxres - dx;
805 if (dy + height > vyres)
806 height = vyres - dy;
807
808 pos = dy * line_length + dx * (is8bpp ? 1 : 4);
809
810 /* ??? We could implement ROP_XOR with opaque fill mode
811 and a RasterOp setting of GXxor, but as far as I can
812 tell, this mode is not actually used in the kernel.
813 Thus I am ignoring it for now. */
814 if (rect->rop != ROP_COPY) {
815 cfb_fillrect(info, rect);
816 return;
817 }
818
819 /* Expand the color value to fill 8 pixels. */
820 color = rect->color;
821 if (is8bpp) {
822 color |= color << 8;
823 color |= color << 16;
824 __raw_writel(color, regs_base + TGA_BLOCK_COLOR0_REG);
825 __raw_writel(color, regs_base + TGA_BLOCK_COLOR1_REG);
826 } else {
827 if (color < 16)
828 color = ((u32 *)info->pseudo_palette)[color];
829 __raw_writel(color, regs_base + TGA_BLOCK_COLOR0_REG);
830 __raw_writel(color, regs_base + TGA_BLOCK_COLOR1_REG);
831 __raw_writel(color, regs_base + TGA_BLOCK_COLOR2_REG);
832 __raw_writel(color, regs_base + TGA_BLOCK_COLOR3_REG);
833 __raw_writel(color, regs_base + TGA_BLOCK_COLOR4_REG);
834 __raw_writel(color, regs_base + TGA_BLOCK_COLOR5_REG);
835 __raw_writel(color, regs_base + TGA_BLOCK_COLOR6_REG);
836 __raw_writel(color, regs_base + TGA_BLOCK_COLOR7_REG);
837 }
838
839 /* The DATA register holds the fill mask for block fill mode.
840 Since we're not stippling, this is all ones. */
841 __raw_writel(0xffffffff, regs_base + TGA_DATA_REG);
842
843 /* Enable block fill mode. */
844 __raw_writel((is8bpp
845 ? TGA_MODE_SBM_8BPP | TGA_MODE_BLOCK_FILL
846 : TGA_MODE_SBM_24BPP | TGA_MODE_BLOCK_FILL),
847 regs_base + TGA_MODE_REG);
848 wmb();
849
850 /* We can fill 2k pixels per operation. Notice blocks that fit
851 the width of the screen so that we can take advantage of this
852 and fill more than one line per write. */
853 if (width == line_length)
854 width *= height, height = 1;
855
856 /* The write into the frame buffer must be aligned to 4 bytes,
857 but we are allowed to encode the offset within the word in
858 the data word written. */
859 align = (pos & 3) << 16;
860 pos &= -4;
861
862 if (width <= 2048) {
863 u32 data;
864
865 data = (width - 1) | align;
866
867 for (i = 0; i < height; ++i) {
868 __raw_writel(data, fb_base + pos);
869 pos += line_length;
870 }
871 } else {
872 unsigned long Bpp = (is8bpp ? 1 : 4);
873 unsigned long nwidth = width & -2048;
874 u32 fdata, ldata;
875
876 fdata = (2048 - 1) | align;
877 ldata = ((width & 2047) - 1) | align;
878
879 for (i = 0; i < height; ++i) {
880 for (j = 0; j < nwidth; j += 2048)
881 __raw_writel(fdata, fb_base + pos + j*Bpp);
882 if (j < width)
883 __raw_writel(ldata, fb_base + pos + j*Bpp);
884 pos += line_length;
885 }
886 }
887 wmb();
888
889 /* Disable block fill mode. */
890 __raw_writel((is8bpp
891 ? TGA_MODE_SBM_8BPP | TGA_MODE_SIMPLE
892 : TGA_MODE_SBM_24BPP | TGA_MODE_SIMPLE),
893 regs_base + TGA_MODE_REG);
894}
895
896/**
897 * tgafb_copyarea - REQUIRED function. Can use generic routines if
898 * non acclerated hardware and packed pixel based.
899 * Copies on area of the screen to another area.
900 *
901 * @info: frame buffer structure that represents a single frame buffer
902 * @area: structure defining the source and destination.
903 */
904
905/* Handle the special case of copying entire lines, e.g. during scrolling.
906 We can avoid a lot of needless computation in this case. In the 8bpp
907 case we need to use the COPY64 registers instead of mask writes into
908 the frame buffer to achieve maximum performance. */
909
910static inline void
911copyarea_line_8bpp(struct fb_info *info, u32 dy, u32 sy,
912 u32 height, u32 width)
913{
914 struct tga_par *par = (struct tga_par *) info->par;
915 void __iomem *tga_regs = par->tga_regs_base;
916 unsigned long dpos, spos, i, n64;
917
918 /* Set up the MODE and PIXELSHIFT registers. */
919 __raw_writel(TGA_MODE_SBM_8BPP | TGA_MODE_COPY, tga_regs+TGA_MODE_REG);
920 __raw_writel(0, tga_regs+TGA_PIXELSHIFT_REG);
921 wmb();
922
923 n64 = (height * width) / 64;
924
925 if (dy < sy) {
926 spos = (sy + height) * width;
927 dpos = (dy + height) * width;
928
929 for (i = 0; i < n64; ++i) {
930 spos -= 64;
931 dpos -= 64;
932 __raw_writel(spos, tga_regs+TGA_COPY64_SRC);
933 wmb();
934 __raw_writel(dpos, tga_regs+TGA_COPY64_DST);
935 wmb();
936 }
937 } else {
938 spos = sy * width;
939 dpos = dy * width;
940
941 for (i = 0; i < n64; ++i) {
942 __raw_writel(spos, tga_regs+TGA_COPY64_SRC);
943 wmb();
944 __raw_writel(dpos, tga_regs+TGA_COPY64_DST);
945 wmb();
946 spos += 64;
947 dpos += 64;
948 }
949 }
950
951 /* Reset the MODE register to normal. */
952 __raw_writel(TGA_MODE_SBM_8BPP|TGA_MODE_SIMPLE, tga_regs+TGA_MODE_REG);
953}
954
955static inline void
956copyarea_line_32bpp(struct fb_info *info, u32 dy, u32 sy,
957 u32 height, u32 width)
958{
959 struct tga_par *par = (struct tga_par *) info->par;
960 void __iomem *tga_regs = par->tga_regs_base;
961 void __iomem *tga_fb = par->tga_fb_base;
962 void __iomem *src;
963 void __iomem *dst;
964 unsigned long i, n16;
965
966 /* Set up the MODE and PIXELSHIFT registers. */
967 __raw_writel(TGA_MODE_SBM_24BPP | TGA_MODE_COPY, tga_regs+TGA_MODE_REG);
968 __raw_writel(0, tga_regs+TGA_PIXELSHIFT_REG);
969 wmb();
970
971 n16 = (height * width) / 16;
972
973 if (dy < sy) {
974 src = tga_fb + (sy + height) * width * 4;
975 dst = tga_fb + (dy + height) * width * 4;
976
977 for (i = 0; i < n16; ++i) {
978 src -= 64;
979 dst -= 64;
980 __raw_writel(0xffff, src);
981 wmb();
982 __raw_writel(0xffff, dst);
983 wmb();
984 }
985 } else {
986 src = tga_fb + sy * width * 4;
987 dst = tga_fb + dy * width * 4;
988
989 for (i = 0; i < n16; ++i) {
990 __raw_writel(0xffff, src);
991 wmb();
992 __raw_writel(0xffff, dst);
993 wmb();
994 src += 64;
995 dst += 64;
996 }
997 }
998
999 /* Reset the MODE register to normal. */
1000 __raw_writel(TGA_MODE_SBM_24BPP|TGA_MODE_SIMPLE, tga_regs+TGA_MODE_REG);
1001}
1002
1003/* The general case of forward copy in 8bpp mode. */
1004static inline void
1005copyarea_foreward_8bpp(struct fb_info *info, u32 dx, u32 dy, u32 sx, u32 sy,
1006 u32 height, u32 width, u32 line_length)
1007{
1008 struct tga_par *par = (struct tga_par *) info->par;
1009 unsigned long i, copied, left;
1010 unsigned long dpos, spos, dalign, salign, yincr;
1011 u32 smask_first, dmask_first, dmask_last;
1012 int pixel_shift, need_prime, need_second;
1013 unsigned long n64, n32, xincr_first;
1014 void __iomem *tga_regs;
1015 void __iomem *tga_fb;
1016
1017 yincr = line_length;
1018 if (dy > sy) {
1019 dy += height - 1;
1020 sy += height - 1;
1021 yincr = -yincr;
1022 }
1023
1024 /* Compute the offsets and alignments in the frame buffer.
1025 More than anything else, these control how we do copies. */
1026 dpos = dy * line_length + dx;
1027 spos = sy * line_length + sx;
1028 dalign = dpos & 7;
1029 salign = spos & 7;
1030 dpos &= -8;
1031 spos &= -8;
1032
1033 /* Compute the value for the PIXELSHIFT register. This controls
1034 both non-co-aligned source and destination and copy direction. */
1035 if (dalign >= salign)
1036 pixel_shift = dalign - salign;
1037 else
1038 pixel_shift = 8 - (salign - dalign);
1039
1040 /* Figure out if we need an additional priming step for the
1041 residue register. */
1042 need_prime = (salign > dalign);
1043 if (need_prime)
1044 dpos -= 8;
1045
1046 /* Begin by copying the leading unaligned destination. Copy enough
1047 to make the next destination address 32-byte aligned. */
1048 copied = 32 - (dalign + (dpos & 31));
1049 if (copied == 32)
1050 copied = 0;
1051 xincr_first = (copied + 7) & -8;
1052 smask_first = dmask_first = (1ul << copied) - 1;
1053 smask_first <<= salign;
1054 dmask_first <<= dalign + need_prime*8;
1055 if (need_prime && copied > 24)
1056 copied -= 8;
1057 left = width - copied;
1058
1059 /* Care for small copies. */
1060 if (copied > width) {
1061 u32 t;
1062 t = (1ul << width) - 1;
1063 t <<= dalign + need_prime*8;
1064 dmask_first &= t;
1065 left = 0;
1066 }
1067
1068 /* Attempt to use 64-byte copies. This is only possible if the
1069 source and destination are co-aligned at 64 bytes. */
1070 n64 = need_second = 0;
1071 if ((dpos & 63) == (spos & 63)
1072 && (height == 1 || line_length % 64 == 0)) {
1073 /* We may need a 32-byte copy to ensure 64 byte alignment. */
1074 need_second = (dpos + xincr_first) & 63;
1075 if ((need_second & 32) != need_second)
1076 printk(KERN_ERR "tgafb: need_second wrong\n");
1077 if (left >= need_second + 64) {
1078 left -= need_second;
1079 n64 = left / 64;
1080 left %= 64;
1081 } else
1082 need_second = 0;
1083 }
1084
1085 /* Copy trailing full 32-byte sections. This will be the main
1086 loop if the 64 byte loop can't be used. */
1087 n32 = left / 32;
1088 left %= 32;
1089
1090 /* Copy the trailing unaligned destination. */
1091 dmask_last = (1ul << left) - 1;
1092
1093 tga_regs = par->tga_regs_base;
1094 tga_fb = par->tga_fb_base;
1095
1096 /* Set up the MODE and PIXELSHIFT registers. */
1097 __raw_writel(TGA_MODE_SBM_8BPP|TGA_MODE_COPY, tga_regs+TGA_MODE_REG);
1098 __raw_writel(pixel_shift, tga_regs+TGA_PIXELSHIFT_REG);
1099 wmb();
1100
1101 for (i = 0; i < height; ++i) {
1102 unsigned long j;
1103 void __iomem *sfb;
1104 void __iomem *dfb;
1105
1106 sfb = tga_fb + spos;
1107 dfb = tga_fb + dpos;
1108 if (dmask_first) {
1109 __raw_writel(smask_first, sfb);
1110 wmb();
1111 __raw_writel(dmask_first, dfb);
1112 wmb();
1113 sfb += xincr_first;
1114 dfb += xincr_first;
1115 }
1116
1117 if (need_second) {
1118 __raw_writel(0xffffffff, sfb);
1119 wmb();
1120 __raw_writel(0xffffffff, dfb);
1121 wmb();
1122 sfb += 32;
1123 dfb += 32;
1124 }
1125
1126 if (n64 && (((unsigned long)sfb | (unsigned long)dfb) & 63))
1127 printk(KERN_ERR
1128 "tgafb: misaligned copy64 (s:%p, d:%p)\n",
1129 sfb, dfb);
1130
1131 for (j = 0; j < n64; ++j) {
1132 __raw_writel(sfb - tga_fb, tga_regs+TGA_COPY64_SRC);
1133 wmb();
1134 __raw_writel(dfb - tga_fb, tga_regs+TGA_COPY64_DST);
1135 wmb();
1136 sfb += 64;
1137 dfb += 64;
1138 }
1139
1140 for (j = 0; j < n32; ++j) {
1141 __raw_writel(0xffffffff, sfb);
1142 wmb();
1143 __raw_writel(0xffffffff, dfb);
1144 wmb();
1145 sfb += 32;
1146 dfb += 32;
1147 }
1148
1149 if (dmask_last) {
1150 __raw_writel(0xffffffff, sfb);
1151 wmb();
1152 __raw_writel(dmask_last, dfb);
1153 wmb();
1154 }
1155
1156 spos += yincr;
1157 dpos += yincr;
1158 }
1159
1160 /* Reset the MODE register to normal. */
1161 __raw_writel(TGA_MODE_SBM_8BPP|TGA_MODE_SIMPLE, tga_regs+TGA_MODE_REG);
1162}
1163
1164/* The (almost) general case of backward copy in 8bpp mode. */
1165static inline void
1166copyarea_backward_8bpp(struct fb_info *info, u32 dx, u32 dy, u32 sx, u32 sy,
1167 u32 height, u32 width, u32 line_length,
1168 const struct fb_copyarea *area)
1169{
1170 struct tga_par *par = (struct tga_par *) info->par;
1171 unsigned long i, left, yincr;
1172 unsigned long depos, sepos, dealign, sealign;
1173 u32 mask_first, mask_last;
1174 unsigned long n32;
1175 void __iomem *tga_regs;
1176 void __iomem *tga_fb;
1177
1178 yincr = line_length;
1179 if (dy > sy) {
1180 dy += height - 1;
1181 sy += height - 1;
1182 yincr = -yincr;
1183 }
1184
1185 /* Compute the offsets and alignments in the frame buffer.
1186 More than anything else, these control how we do copies. */
1187 depos = dy * line_length + dx + width;
1188 sepos = sy * line_length + sx + width;
1189 dealign = depos & 7;
1190 sealign = sepos & 7;
1191
1192 /* ??? The documentation appears to be incorrect (or very
1193 misleading) wrt how pixel shifting works in backward copy
1194 mode, i.e. when PIXELSHIFT is negative. I give up for now.
1195 Do handle the common case of co-aligned backward copies,
1196 but frob everything else back on generic code. */
1197 if (dealign != sealign) {
1198 cfb_copyarea(info, area);
1199 return;
1200 }
1201
1202 /* We begin the copy with the trailing pixels of the
1203 unaligned destination. */
1204 mask_first = (1ul << dealign) - 1;
1205 left = width - dealign;
1206
1207 /* Care for small copies. */
1208 if (dealign > width) {
1209 mask_first ^= (1ul << (dealign - width)) - 1;
1210 left = 0;
1211 }
1212
1213 /* Next copy full words at a time. */
1214 n32 = left / 32;
1215 left %= 32;
1216
1217 /* Finally copy the unaligned head of the span. */
1218 mask_last = -1 << (32 - left);
1219
1220 tga_regs = par->tga_regs_base;
1221 tga_fb = par->tga_fb_base;
1222
1223 /* Set up the MODE and PIXELSHIFT registers. */
1224 __raw_writel(TGA_MODE_SBM_8BPP|TGA_MODE_COPY, tga_regs+TGA_MODE_REG);
1225 __raw_writel(0, tga_regs+TGA_PIXELSHIFT_REG);
1226 wmb();
1227
1228 for (i = 0; i < height; ++i) {
1229 unsigned long j;
1230 void __iomem *sfb;
1231 void __iomem *dfb;
1232
1233 sfb = tga_fb + sepos;
1234 dfb = tga_fb + depos;
1235 if (mask_first) {
1236 __raw_writel(mask_first, sfb);
1237 wmb();
1238 __raw_writel(mask_first, dfb);
1239 wmb();
1240 }
1241
1242 for (j = 0; j < n32; ++j) {
1243 sfb -= 32;
1244 dfb -= 32;
1245 __raw_writel(0xffffffff, sfb);
1246 wmb();
1247 __raw_writel(0xffffffff, dfb);
1248 wmb();
1249 }
1250
1251 if (mask_last) {
1252 sfb -= 32;
1253 dfb -= 32;
1254 __raw_writel(mask_last, sfb);
1255 wmb();
1256 __raw_writel(mask_last, dfb);
1257 wmb();
1258 }
1259
1260 sepos += yincr;
1261 depos += yincr;
1262 }
1263
1264 /* Reset the MODE register to normal. */
1265 __raw_writel(TGA_MODE_SBM_8BPP|TGA_MODE_SIMPLE, tga_regs+TGA_MODE_REG);
1266}
1267
1268static void
1269tgafb_copyarea(struct fb_info *info, const struct fb_copyarea *area)
1270{
1271 unsigned long dx, dy, width, height, sx, sy, vxres, vyres;
1272 unsigned long line_length, bpp;
1273
1274 dx = area->dx;
1275 dy = area->dy;
1276 width = area->width;
1277 height = area->height;
1278 sx = area->sx;
1279 sy = area->sy;
1280 vxres = info->var.xres_virtual;
1281 vyres = info->var.yres_virtual;
1282 line_length = info->fix.line_length;
1283
1284 /* The top left corners must be in the virtual screen. */
1285 if (dx > vxres || sx > vxres || dy > vyres || sy > vyres)
1286 return;
1287
1288 /* Clip the destination. */
1289 if (dx + width > vxres)
1290 width = vxres - dx;
1291 if (dy + height > vyres)
1292 height = vyres - dy;
1293
1294 /* The source must be completely inside the virtual screen. */
1295 if (sx + width > vxres || sy + height > vyres)
1296 return;
1297
1298 bpp = info->var.bits_per_pixel;
1299
1300 /* Detect copies of the entire line. */
1301 if (width * (bpp >> 3) == line_length) {
1302 if (bpp == 8)
1303 copyarea_line_8bpp(info, dy, sy, height, width);
1304 else
1305 copyarea_line_32bpp(info, dy, sy, height, width);
1306 }
1307
1308 /* ??? The documentation is unclear to me exactly how the pixelshift
1309 register works in 32bpp mode. Since I don't have hardware to test,
1310 give up for now and fall back on the generic routines. */
1311 else if (bpp == 32)
1312 cfb_copyarea(info, area);
1313
1314 /* Detect overlapping source and destination that requires
1315 a backward copy. */
1316 else if (dy == sy && dx > sx && dx < sx + width)
1317 copyarea_backward_8bpp(info, dx, dy, sx, sy, height,
1318 width, line_length, area);
1319 else
1320 copyarea_foreward_8bpp(info, dx, dy, sx, sy, height,
1321 width, line_length);
1322}
1323
1324
1325/*
1326 * Initialisation
1327 */
1328
1329static void
1330tgafb_init_fix(struct fb_info *info)
1331{
1332 struct tga_par *par = (struct tga_par *)info->par;
1333 u8 tga_type = par->tga_type;
1334 const char *tga_type_name;
1335
1336 switch (tga_type) {
1337 case TGA_TYPE_8PLANE:
1338 tga_type_name = "Digital ZLXp-E1";
1339 break;
1340 case TGA_TYPE_24PLANE:
1341 tga_type_name = "Digital ZLXp-E2";
1342 break;
1343 case TGA_TYPE_24PLUSZ:
1344 tga_type_name = "Digital ZLXp-E3";
1345 break;
1346 default:
1347 tga_type_name = "Unknown";
1348 break;
1349 }
1350
1351 strlcpy(info->fix.id, tga_type_name, sizeof(info->fix.id));
1352
1353 info->fix.type = FB_TYPE_PACKED_PIXELS;
1354 info->fix.type_aux = 0;
1355 info->fix.visual = (tga_type == TGA_TYPE_8PLANE
1356 ? FB_VISUAL_PSEUDOCOLOR
1357 : FB_VISUAL_TRUECOLOR);
1358
1359 info->fix.line_length = par->xres * (par->bits_per_pixel >> 3);
1360 info->fix.smem_start = (size_t) par->tga_fb_base;
1361 info->fix.smem_len = info->fix.line_length * par->yres;
1362 info->fix.mmio_start = (size_t) par->tga_regs_base;
1363 info->fix.mmio_len = 512;
1364
1365 info->fix.xpanstep = 0;
1366 info->fix.ypanstep = 0;
1367 info->fix.ywrapstep = 0;
1368
1369 info->fix.accel = FB_ACCEL_DEC_TGA;
1370}
1371
1372static __devinit int
1373tgafb_pci_register(struct pci_dev *pdev, const struct pci_device_id *ent)
1374{
1375 static unsigned int const fb_offset_presets[4] = {
1376 TGA_8PLANE_FB_OFFSET,
1377 TGA_24PLANE_FB_OFFSET,
1378 0xffffffff,
1379 TGA_24PLUSZ_FB_OFFSET
1380 };
1381
1382 struct all_info {
1383 struct fb_info info;
1384 struct tga_par par;
1385 u32 pseudo_palette[16];
1386 } *all;
1387
1388 void __iomem *mem_base;
1389 unsigned long bar0_start, bar0_len;
1390 u8 tga_type;
1391 int ret;
1392
1393 /* Enable device in PCI config. */
1394 if (pci_enable_device(pdev)) {
1395 printk(KERN_ERR "tgafb: Cannot enable PCI device\n");
1396 return -ENODEV;
1397 }
1398
1399 /* Allocate the fb and par structures. */
1400 all = kmalloc(sizeof(*all), GFP_KERNEL);
1401 if (!all) {
1402 printk(KERN_ERR "tgafb: Cannot allocate memory\n");
1403 return -ENOMEM;
1404 }
1405 memset(all, 0, sizeof(*all));
1406 pci_set_drvdata(pdev, all);
1407
1408 /* Request the mem regions. */
1409 bar0_start = pci_resource_start(pdev, 0);
1410 bar0_len = pci_resource_len(pdev, 0);
1411 ret = -ENODEV;
1412 if (!request_mem_region (bar0_start, bar0_len, "tgafb")) {
1413 printk(KERN_ERR "tgafb: cannot reserve FB region\n");
1414 goto err0;
1415 }
1416
1417 /* Map the framebuffer. */
1418 mem_base = ioremap(bar0_start, bar0_len);
1419 if (!mem_base) {
1420 printk(KERN_ERR "tgafb: Cannot map MMIO\n");
1421 goto err1;
1422 }
1423
1424 /* Grab info about the card. */
1425 tga_type = (readl(mem_base) >> 12) & 0x0f;
1426 all->par.pdev = pdev;
1427 all->par.tga_mem_base = mem_base;
1428 all->par.tga_fb_base = mem_base + fb_offset_presets[tga_type];
1429 all->par.tga_regs_base = mem_base + TGA_REGS_OFFSET;
1430 all->par.tga_type = tga_type;
1431 pci_read_config_byte(pdev, PCI_REVISION_ID, &all->par.tga_chip_rev);
1432
1433 /* Setup framebuffer. */
1434 all->info.flags = FBINFO_DEFAULT | FBINFO_HWACCEL_COPYAREA |
1435 FBINFO_HWACCEL_IMAGEBLIT | FBINFO_HWACCEL_FILLRECT;
1436 all->info.fbops = &tgafb_ops;
1437 all->info.screen_base = all->par.tga_fb_base;
1438 all->info.par = &all->par;
1439 all->info.pseudo_palette = all->pseudo_palette;
1440
1441 /* This should give a reasonable default video mode. */
1442
1443 ret = fb_find_mode(&all->info.var, &all->info, mode_option,
1444 NULL, 0, NULL,
1445 tga_type == TGA_TYPE_8PLANE ? 8 : 32);
1446 if (ret == 0 || ret == 4) {
1447 printk(KERN_ERR "tgafb: Could not find valid video mode\n");
1448 ret = -EINVAL;
1449 goto err1;
1450 }
1451
1452 if (fb_alloc_cmap(&all->info.cmap, 256, 0)) {
1453 printk(KERN_ERR "tgafb: Could not allocate color map\n");
1454 ret = -ENOMEM;
1455 goto err1;
1456 }
1457
1458 tgafb_set_par(&all->info);
1459 tgafb_init_fix(&all->info);
1460
1461 all->info.device = &pdev->dev;
1462 if (register_framebuffer(&all->info) < 0) {
1463 printk(KERN_ERR "tgafb: Could not register framebuffer\n");
1464 ret = -EINVAL;
1465 goto err1;
1466 }
1467
1468 printk(KERN_INFO "tgafb: DC21030 [TGA] detected, rev=0x%02x\n",
1469 all->par.tga_chip_rev);
1470 printk(KERN_INFO "tgafb: at PCI bus %d, device %d, function %d\n",
1471 pdev->bus->number, PCI_SLOT(pdev->devfn),
1472 PCI_FUNC(pdev->devfn));
1473 printk(KERN_INFO "fb%d: %s frame buffer device at 0x%lx\n",
1474 all->info.node, all->info.fix.id, bar0_start);
1475
1476 return 0;
1477
1478 err1:
1479 release_mem_region(bar0_start, bar0_len);
1480 err0:
1481 kfree(all);
1482 return ret;
1483}
1484
Linus Torvalds1da177e2005-04-16 15:20:36 -07001485static void __exit
1486tgafb_pci_unregister(struct pci_dev *pdev)
1487{
1488 struct fb_info *info = pci_get_drvdata(pdev);
1489 struct tga_par *par = info->par;
1490
1491 if (!info)
1492 return;
1493 unregister_framebuffer(info);
1494 iounmap(par->tga_mem_base);
1495 release_mem_region(pci_resource_start(pdev, 0),
1496 pci_resource_len(pdev, 0));
1497 kfree(info);
1498}
1499
Adrian Bunk62b56fa2005-04-21 14:09:42 -07001500#ifdef MODULE
Linus Torvalds1da177e2005-04-16 15:20:36 -07001501static void __exit
1502tgafb_exit(void)
1503{
1504 pci_unregister_driver(&tgafb_driver);
1505}
1506#endif /* MODULE */
1507
1508#ifndef MODULE
1509int __init
1510tgafb_setup(char *arg)
1511{
1512 char *this_opt;
1513
1514 if (arg && *arg) {
1515 while ((this_opt = strsep(&arg, ","))) {
1516 if (!*this_opt)
1517 continue;
1518 if (!strncmp(this_opt, "mode:", 5))
1519 mode_option = this_opt+5;
1520 else
1521 printk(KERN_ERR
1522 "tgafb: unknown parameter %s\n",
1523 this_opt);
1524 }
1525 }
1526
1527 return 0;
1528}
1529#endif /* !MODULE */
1530
1531int __init
1532tgafb_init(void)
1533{
1534#ifndef MODULE
1535 char *option = NULL;
1536
1537 if (fb_get_options("tgafb", &option))
1538 return -ENODEV;
1539 tgafb_setup(option);
1540#endif
1541 return pci_register_driver(&tgafb_driver);
1542}
1543
1544/*
1545 * Modularisation
1546 */
1547
1548module_init(tgafb_init);
1549
1550#ifdef MODULE
1551module_exit(tgafb_exit);
1552#endif
1553
1554MODULE_DESCRIPTION("framebuffer driver for TGA chipset");
1555MODULE_LICENSE("GPL");