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