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