9 #include <linux/module.h>
10 #include <linux/kernel.h>
11 #include <linux/errno.h>
12 #include <linux/string.h>
30 static int ffb_setcolreg(
unsigned,
unsigned,
unsigned,
unsigned,
32 static int ffb_blank(
int,
struct fb_info *);
37 static int ffb_sync(
struct fb_info *);
39 static int ffb_ioctl(
struct fb_info *,
unsigned int,
unsigned long);
46 static struct fb_ops ffb_ops = {
48 .fb_setcolreg = ffb_setcolreg,
49 .fb_blank = ffb_blank,
50 .fb_pan_display = ffb_pan_display,
51 .fb_fillrect = ffb_fillrect,
52 .fb_copyarea = ffb_copyarea,
53 .fb_imageblit = ffb_imageblit,
56 .fb_ioctl = ffb_ioctl,
63 #define FFB_SFB8R_VOFF 0x00000000
64 #define FFB_SFB8G_VOFF 0x00400000
65 #define FFB_SFB8B_VOFF 0x00800000
66 #define FFB_SFB8X_VOFF 0x00c00000
67 #define FFB_SFB32_VOFF 0x01000000
68 #define FFB_SFB64_VOFF 0x02000000
69 #define FFB_FBC_REGS_VOFF 0x04000000
70 #define FFB_BM_FBC_REGS_VOFF 0x04002000
71 #define FFB_DFB8R_VOFF 0x04004000
72 #define FFB_DFB8G_VOFF 0x04404000
73 #define FFB_DFB8B_VOFF 0x04804000
74 #define FFB_DFB8X_VOFF 0x04c04000
75 #define FFB_DFB24_VOFF 0x05004000
76 #define FFB_DFB32_VOFF 0x06004000
77 #define FFB_DFB422A_VOFF 0x07004000
78 #define FFB_DFB422AD_VOFF 0x07804000
79 #define FFB_DFB24B_VOFF 0x08004000
80 #define FFB_DFB422B_VOFF 0x09004000
81 #define FFB_DFB422BD_VOFF 0x09804000
82 #define FFB_SFB16Z_VOFF 0x0a004000
83 #define FFB_SFB8Z_VOFF 0x0a404000
84 #define FFB_SFB422_VOFF 0x0ac04000
85 #define FFB_SFB422D_VOFF 0x0b404000
86 #define FFB_FBC_KREGS_VOFF 0x0bc04000
87 #define FFB_DAC_VOFF 0x0bc06000
88 #define FFB_PROM_VOFF 0x0bc08000
89 #define FFB_EXP_VOFF 0x0bc18000
91 #define FFB_SFB8R_POFF 0x04000000UL
92 #define FFB_SFB8G_POFF 0x04400000UL
93 #define FFB_SFB8B_POFF 0x04800000UL
94 #define FFB_SFB8X_POFF 0x04c00000UL
95 #define FFB_SFB32_POFF 0x05000000UL
96 #define FFB_SFB64_POFF 0x06000000UL
97 #define FFB_FBC_REGS_POFF 0x00600000UL
98 #define FFB_BM_FBC_REGS_POFF 0x00600000UL
99 #define FFB_DFB8R_POFF 0x01000000UL
100 #define FFB_DFB8G_POFF 0x01400000UL
101 #define FFB_DFB8B_POFF 0x01800000UL
102 #define FFB_DFB8X_POFF 0x01c00000UL
103 #define FFB_DFB24_POFF 0x02000000UL
104 #define FFB_DFB32_POFF 0x03000000UL
105 #define FFB_FBC_KREGS_POFF 0x00610000UL
106 #define FFB_DAC_POFF 0x00400000UL
107 #define FFB_PROM_POFF 0x00000000UL
108 #define FFB_EXP_POFF 0x00200000UL
109 #define FFB_DFB422A_POFF 0x09000000UL
110 #define FFB_DFB422AD_POFF 0x09800000UL
111 #define FFB_DFB24B_POFF 0x0a000000UL
112 #define FFB_DFB422B_POFF 0x0b000000UL
113 #define FFB_DFB422BD_POFF 0x0b800000UL
114 #define FFB_SFB16Z_POFF 0x0c800000UL
115 #define FFB_SFB8Z_POFF 0x0c000000UL
116 #define FFB_SFB422_POFF 0x0d000000UL
117 #define FFB_SFB422D_POFF 0x0d800000UL
120 #define FFB_DRAWOP_DOT 0x00
121 #define FFB_DRAWOP_AADOT 0x01
122 #define FFB_DRAWOP_BRLINECAP 0x02
123 #define FFB_DRAWOP_BRLINEOPEN 0x03
124 #define FFB_DRAWOP_DDLINE 0x04
125 #define FFB_DRAWOP_AALINE 0x05
126 #define FFB_DRAWOP_TRIANGLE 0x06
127 #define FFB_DRAWOP_POLYGON 0x07
128 #define FFB_DRAWOP_RECTANGLE 0x08
129 #define FFB_DRAWOP_FASTFILL 0x09
130 #define FFB_DRAWOP_BCOPY 0x0a
131 #define FFB_DRAWOP_VSCROLL 0x0b
135 #define FFB_PPC_FW_DISABLE 0x800000
136 #define FFB_PPC_FW_ENABLE 0xc00000
138 #define FFB_PPC_ACE_DISABLE 0x040000
139 #define FFB_PPC_ACE_AUX_SUB 0x080000
140 #define FFB_PPC_ACE_AUX_ADD 0x0c0000
142 #define FFB_PPC_DCE_DISABLE 0x020000
143 #define FFB_PPC_DCE_ENABLE 0x030000
145 #define FFB_PPC_ABE_DISABLE 0x008000
146 #define FFB_PPC_ABE_ENABLE 0x00c000
148 #define FFB_PPC_VCE_DISABLE 0x001000
149 #define FFB_PPC_VCE_2D 0x002000
150 #define FFB_PPC_VCE_3D 0x003000
152 #define FFB_PPC_APE_DISABLE 0x000800
153 #define FFB_PPC_APE_ENABLE 0x000c00
155 #define FFB_PPC_TBE_OPAQUE 0x000200
156 #define FFB_PPC_TBE_TRANSPARENT 0x000300
158 #define FFB_PPC_ZS_VAR 0x000080
159 #define FFB_PPC_ZS_CONST 0x0000c0
161 #define FFB_PPC_YS_VAR 0x000020
162 #define FFB_PPC_YS_CONST 0x000030
164 #define FFB_PPC_XS_WID 0x000004
165 #define FFB_PPC_XS_VAR 0x000008
166 #define FFB_PPC_XS_CONST 0x00000c
168 #define FFB_PPC_CS_VAR 0x000002
169 #define FFB_PPC_CS_CONST 0x000003
171 #define FFB_ROP_NEW 0x83
172 #define FFB_ROP_OLD 0x85
173 #define FFB_ROP_NEW_XOR_OLD 0x86
175 #define FFB_UCSR_FIFO_MASK 0x00000fff
176 #define FFB_UCSR_FB_BUSY 0x01000000
177 #define FFB_UCSR_RP_BUSY 0x02000000
178 #define FFB_UCSR_ALL_BUSY (FFB_UCSR_RP_BUSY|FFB_UCSR_FB_BUSY)
179 #define FFB_UCSR_READ_ERR 0x40000000
180 #define FFB_UCSR_FIFO_OVFL 0x80000000
181 #define FFB_UCSR_ALL_ERRORS (FFB_UCSR_READ_ERR|FFB_UCSR_FIFO_OVFL)
336 #define FFB_DAC_UCTRL 0x1001
337 #define FFB_DAC_UCTRL_MANREV 0x00000f00
338 #define FFB_DAC_UCTRL_MANREV_SHIFT 8
339 #define FFB_DAC_TGEN 0x6000
340 #define FFB_DAC_TGEN_VIDE 0x00000001
341 #define FFB_DAC_DID 0x8000
342 #define FFB_DAC_DID_PNUM 0x0ffff000
343 #define FFB_DAC_DID_PNUM_SHIFT 12
344 #define FFB_DAC_DID_REV 0xf0000000
345 #define FFB_DAC_DID_REV_SHIFT 28
347 #define FFB_DAC_CUR_CTRL 0x100
348 #define FFB_DAC_CUR_CTRL_P0 0x00000001
349 #define FFB_DAC_CUR_CTRL_P1 0x00000002
357 #define FFB_FLAG_AFB 0x00000001
358 #define FFB_FLAG_BLANKED 0x00000002
359 #define FFB_FLAG_INVCURSOR 0x00000004
375 static void FFBFifo(
struct ffb_par *par,
int n)
385 }
while (cache - n < 0);
390 static void FFBWait(
struct ffb_par *par)
403 }
while (--limit > 0);
406 static int ffb_sync(
struct fb_info *
p)
418 upa_writel(rop, &par->
fbc->rop);
423 static void ffb_switch_from_graph(
struct ffb_par *par)
436 upa_writel(0x2000707f, &fbc->
fbc);
438 upa_writel(0xffffffff, &fbc->
pmask);
439 upa_writel((1 << 16) | (0 << 0), &fbc->
fontinc);
440 upa_writel(par->fg_cache, &fbc->
fg);
447 upa_writel(0, &dac->
value2);
452 spin_unlock_irqrestore(&par->
lock, flags);
462 ffb_switch_from_graph(par);
488 if (fg != par->fg_cache) {
490 upa_writel(fg, &fbc->
fg);
500 upa_writel(rect->
dy, &fbc->
by);
501 upa_writel(rect->
dx, &fbc->
bx);
503 upa_writel(rect->
width, &fbc->
bw);
505 spin_unlock_irqrestore(&par->
lock, flags);
521 if (area->
dx != area->
sx ||
522 area->
dy == area->
sy) {
533 upa_writel(area->
sy, &fbc->
by);
534 upa_writel(area->
sx, &fbc->
bx);
535 upa_writel(area->
dy, &fbc->
dy);
536 upa_writel(area->
dx, &fbc->
dx);
538 upa_writel(area->
width, &fbc->
bw);
540 spin_unlock_irqrestore(&par->
lock, flags);
567 xy = (image->
dy << 16) | image->
dx;
569 stride = ((
width + 7) >> 3);
573 if (fgbg != *(
u64 *)&par->fg_cache) {
575 upa_writeq(fgbg, &fbc->
fg);
576 *(
u64 *)&par->fg_cache = fgbg;
581 upa_writel(32, &fbc->
fontw);
584 while (
width >= 32) {
585 const u8 *next_data =
data + 4;
588 upa_writel(xy, &fbc->
fontxy);
591 for (i = 0; i < image->
height; i++) {
597 upa_writel(val, &fbc->
font);
609 upa_writel(xy, &fbc->
fontxy);
611 for (i = 0; i < image->
height; i++) {
617 upa_writel(val, &fbc->
font);
623 spin_unlock_irqrestore(&par->
lock, flags);
630 var->
green.offset = 8;
631 var->
green.length = 8;
632 var->
blue.offset = 16;
633 var->
blue.length = 8;
648 static int ffb_setcolreg(
unsigned regno,
661 value = (blue << 16) | (green << 8) |
red;
672 static int ffb_blank(
int blank,
struct fb_info *info)
702 for (i = 0; i < 10; i++) {
704 upa_readl(&dac->
value);
707 spin_unlock_irqrestore(&par->
lock, flags);
860 static int ffb_ioctl(
struct fb_info *info,
unsigned int cmd,
unsigned long arg)
872 static void ffb_init_fix(
struct fb_info *info)
875 const char *ffb_type_name;
879 ffb_type_name =
"Creator 3D";
881 ffb_type_name =
"Creator";
883 ffb_type_name =
"Elite 3D";
891 info->
fix.line_length = 8192;
903 u32 dac_pnum, dac_rev, dac_mrev;
916 sizeof(
struct ffb_fbc),
"ffb fbc");
921 sizeof(
struct ffb_dac),
"ffb dac");
936 info->
fbops = &ffb_ops;
943 ffb_fixup_var_rgb(&info->
var);
958 dac_pnum = upa_readl(&dac->
value);
963 dac_mrev = upa_readl(&dac->
value);
980 ffb_switch_from_graph(par);
996 goto out_dealloc_cmap;
1001 "DAC pnum[%x] rev[%d] manuf_rev[%d]\n",
1005 dac_pnum, dac_rev, dac_mrev);
1058 .of_match_table = ffb_match,
1064 static int __init ffb_init(
void)
1072 static void __exit ffb_exit(
void)