Mercurial > mplayer.hg
annotate drivers/mga_vid.c @ 30795:1001c606f94c
Make emulated Win32 critical sections thread safe.
Earlier, cs->locked was accessed outside the mutex to get around
the problem that default pthread mutexes are not recursive
(ie., you cannot do a double-lock from the same thread), causing
a thread-safety problem, as both detected by Helgrind and showing
up in some multithreaded codecs.
The ideal solution here would be to simply use recursive pthread
mutexes, but there were concerns about reduced debuggability and
possibly portability. Thus, instead, rewrite the critical sections
to be a simple lock count (with owner) protected by a regular mutex.
Whenever a thread wants to enter the critical section and lock_count
is not 0, it sleeps on a special event that tells it when the
critical section is available.
author | sesse |
---|---|
date | Thu, 04 Mar 2010 15:57:08 +0000 |
parents | afc8b80eb027 |
children | 0ad2da052b2e |
rev | line source |
---|---|
1 | 1 /* |
26003
a506a6ab14e1
Add standard license header and make copyright notices consistent.
diego
parents:
23734
diff
changeset
|
2 * Matrox MGA G200/G400 YUV Video Interface module Version 0.1.0 |
a506a6ab14e1
Add standard license header and make copyright notices consistent.
diego
parents:
23734
diff
changeset
|
3 * BES == Back End Scaler |
1 | 4 * |
5 * Copyright (C) 1999 Aaron Holtzman | |
26003
a506a6ab14e1
Add standard license header and make copyright notices consistent.
diego
parents:
23734
diff
changeset
|
6 * |
a506a6ab14e1
Add standard license header and make copyright notices consistent.
diego
parents:
23734
diff
changeset
|
7 * Module skeleton based on gutted agpgart module by |
a506a6ab14e1
Add standard license header and make copyright notices consistent.
diego
parents:
23734
diff
changeset
|
8 * Jeff Hartmann <slicer@ionet.net> |
a506a6ab14e1
Add standard license header and make copyright notices consistent.
diego
parents:
23734
diff
changeset
|
9 * YUY2 support (see config.format) added by A'rpi/ESP-team |
a506a6ab14e1
Add standard license header and make copyright notices consistent.
diego
parents:
23734
diff
changeset
|
10 * double buffering added by A'rpi/ESP-team |
a506a6ab14e1
Add standard license header and make copyright notices consistent.
diego
parents:
23734
diff
changeset
|
11 * brightness/contrast introduced by eyck |
a506a6ab14e1
Add standard license header and make copyright notices consistent.
diego
parents:
23734
diff
changeset
|
12 * multiple card support by Attila Kinali <attila@kinali.ch> |
a506a6ab14e1
Add standard license header and make copyright notices consistent.
diego
parents:
23734
diff
changeset
|
13 * |
27027 | 14 * This file is part of mga_vid. |
1 | 15 * |
27027 | 16 * mga_vid is free software; you can redistribute it and/or modify |
26003
a506a6ab14e1
Add standard license header and make copyright notices consistent.
diego
parents:
23734
diff
changeset
|
17 * it under the terms of the GNU General Public License as published by |
a506a6ab14e1
Add standard license header and make copyright notices consistent.
diego
parents:
23734
diff
changeset
|
18 * the Free Software Foundation; either version 2 of the License, or |
a506a6ab14e1
Add standard license header and make copyright notices consistent.
diego
parents:
23734
diff
changeset
|
19 * (at your option) any later version. |
a506a6ab14e1
Add standard license header and make copyright notices consistent.
diego
parents:
23734
diff
changeset
|
20 * |
27027 | 21 * mga_vid is distributed in the hope that it will be useful, |
26003
a506a6ab14e1
Add standard license header and make copyright notices consistent.
diego
parents:
23734
diff
changeset
|
22 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
a506a6ab14e1
Add standard license header and make copyright notices consistent.
diego
parents:
23734
diff
changeset
|
23 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
a506a6ab14e1
Add standard license header and make copyright notices consistent.
diego
parents:
23734
diff
changeset
|
24 * GNU General Public License for more details. |
a506a6ab14e1
Add standard license header and make copyright notices consistent.
diego
parents:
23734
diff
changeset
|
25 * |
a506a6ab14e1
Add standard license header and make copyright notices consistent.
diego
parents:
23734
diff
changeset
|
26 * You should have received a copy of the GNU General Public License along |
27027 | 27 * with mga_vid; if not, write to the Free Software Foundation, Inc., |
26003
a506a6ab14e1
Add standard license header and make copyright notices consistent.
diego
parents:
23734
diff
changeset
|
28 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
1 | 29 */ |
30 | |
31 //It's entirely possible this major conflicts with something else | |
9639
5422c37e6faa
selectable 'major', patch by Hans-Andreas Engel <engel@node.ch>
alex
parents:
9631
diff
changeset
|
32 //use the 'major' parameter to override the default major number (178) |
1 | 33 /* mknod /dev/mga_vid c 178 0 */ |
34 | |
26004
ffe773647288
cosmetics: Move definitions to a more standard place.
diego
parents:
26003
diff
changeset
|
35 //#define CRTC2 |
ffe773647288
cosmetics: Move definitions to a more standard place.
diego
parents:
26003
diff
changeset
|
36 |
ffe773647288
cosmetics: Move definitions to a more standard place.
diego
parents:
26003
diff
changeset
|
37 // Set this value, if autodetection fails! (video ram size in megabytes) |
ffe773647288
cosmetics: Move definitions to a more standard place.
diego
parents:
26003
diff
changeset
|
38 // #define MGA_MEMORY_SIZE 16 |
ffe773647288
cosmetics: Move definitions to a more standard place.
diego
parents:
26003
diff
changeset
|
39 |
ffe773647288
cosmetics: Move definitions to a more standard place.
diego
parents:
26003
diff
changeset
|
40 //#define MGA_ALLOW_IRQ |
ffe773647288
cosmetics: Move definitions to a more standard place.
diego
parents:
26003
diff
changeset
|
41 |
ffe773647288
cosmetics: Move definitions to a more standard place.
diego
parents:
26003
diff
changeset
|
42 #define MGA_VSYNC_POS 2 |
ffe773647288
cosmetics: Move definitions to a more standard place.
diego
parents:
26003
diff
changeset
|
43 |
1 | 44 #include <linux/config.h> |
45 #include <linux/version.h> | |
46 #include <linux/module.h> | |
47 #include <linux/types.h> | |
48 #include <linux/kernel.h> | |
49 #include <linux/sched.h> | |
50 #include <linux/mm.h> | |
51 #include <linux/string.h> | |
52 #include <linux/errno.h> | |
3125
d62aa0b7fd68
use <linux/slab.h> instead of <linux/malloc.h> for kernels 2.4.9+
szabi
parents:
2345
diff
changeset
|
53 |
d62aa0b7fd68
use <linux/slab.h> instead of <linux/malloc.h> for kernels 2.4.9+
szabi
parents:
2345
diff
changeset
|
54 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,10) |
1 | 55 #include <linux/malloc.h> |
3125
d62aa0b7fd68
use <linux/slab.h> instead of <linux/malloc.h> for kernels 2.4.9+
szabi
parents:
2345
diff
changeset
|
56 #else |
d62aa0b7fd68
use <linux/slab.h> instead of <linux/malloc.h> for kernels 2.4.9+
szabi
parents:
2345
diff
changeset
|
57 #include <linux/slab.h> |
d62aa0b7fd68
use <linux/slab.h> instead of <linux/malloc.h> for kernels 2.4.9+
szabi
parents:
2345
diff
changeset
|
58 #endif |
d62aa0b7fd68
use <linux/slab.h> instead of <linux/malloc.h> for kernels 2.4.9+
szabi
parents:
2345
diff
changeset
|
59 |
1 | 60 #include <linux/pci.h> |
63 | 61 #include <linux/ioport.h> |
1 | 62 #include <linux/init.h> |
63 | |
64 #include "mga_vid.h" | |
65 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
66 #ifdef CONFIG_MTRR |
1 | 67 #include <asm/mtrr.h> |
68 #endif | |
69 | |
5653
39115273d236
Mark Schreiber sent link to Marcus Sundburg patch to mga_vid, which enables
eyck
parents:
5623
diff
changeset
|
70 #ifdef CONFIG_DEVFS_FS |
39115273d236
Mark Schreiber sent link to Marcus Sundburg patch to mga_vid, which enables
eyck
parents:
5623
diff
changeset
|
71 #include <linux/devfs_fs_kernel.h> |
39115273d236
Mark Schreiber sent link to Marcus Sundburg patch to mga_vid, which enables
eyck
parents:
5623
diff
changeset
|
72 #endif |
39115273d236
Mark Schreiber sent link to Marcus Sundburg patch to mga_vid, which enables
eyck
parents:
5623
diff
changeset
|
73 |
1 | 74 #include <asm/uaccess.h> |
75 #include <asm/system.h> | |
76 #include <asm/io.h> | |
77 | |
78 #define TRUE 1 | |
79 #define FALSE 0 | |
80 | |
9639
5422c37e6faa
selectable 'major', patch by Hans-Andreas Engel <engel@node.ch>
alex
parents:
9631
diff
changeset
|
81 #define DEFAULT_MGA_VID_MAJOR 178 |
1 | 82 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
83 #ifndef PCI_DEVICE_ID_MATROX_G200_PCI |
1 | 84 #define PCI_DEVICE_ID_MATROX_G200_PCI 0x0520 |
85 #endif | |
86 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
87 #ifndef PCI_DEVICE_ID_MATROX_G200_AGP |
1 | 88 #define PCI_DEVICE_ID_MATROX_G200_AGP 0x0521 |
89 #endif | |
90 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
91 #ifndef PCI_DEVICE_ID_MATROX_G400 |
1 | 92 #define PCI_DEVICE_ID_MATROX_G400 0x0525 |
93 #endif | |
94 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
95 #ifndef PCI_DEVICE_ID_MATROX_G550 |
1989 | 96 #define PCI_DEVICE_ID_MATROX_G550 0x2527 |
97 #endif | |
98 | |
9518
182d6c136095
workaround wrong detected memory sizes on G400 cards.
attila
parents:
9449
diff
changeset
|
99 #ifndef PCI_SUBSYSTEM_ID_MATROX_G400_DH_16MB |
182d6c136095
workaround wrong detected memory sizes on G400 cards.
attila
parents:
9449
diff
changeset
|
100 #define PCI_SUBSYSTEM_ID_MATROX_G400_DH_16MB 0x2159 |
182d6c136095
workaround wrong detected memory sizes on G400 cards.
attila
parents:
9449
diff
changeset
|
101 #endif |
182d6c136095
workaround wrong detected memory sizes on G400 cards.
attila
parents:
9449
diff
changeset
|
102 |
182d6c136095
workaround wrong detected memory sizes on G400 cards.
attila
parents:
9449
diff
changeset
|
103 #ifndef PCI_SUBSYSTEM_ID_MATROX_G400_16MB_SGRAM |
182d6c136095
workaround wrong detected memory sizes on G400 cards.
attila
parents:
9449
diff
changeset
|
104 #define PCI_SUBSYSTEM_ID_MATROX_G400_16MB_SGRAM 0x19d8 |
182d6c136095
workaround wrong detected memory sizes on G400 cards.
attila
parents:
9449
diff
changeset
|
105 #endif |
182d6c136095
workaround wrong detected memory sizes on G400 cards.
attila
parents:
9449
diff
changeset
|
106 |
182d6c136095
workaround wrong detected memory sizes on G400 cards.
attila
parents:
9449
diff
changeset
|
107 #ifndef PCI_SUBSYSTEM_ID_MATROX_G400_16MB_SDRAM |
182d6c136095
workaround wrong detected memory sizes on G400 cards.
attila
parents:
9449
diff
changeset
|
108 #define PCI_SUBSYSTEM_ID_MATROX_G400_16MB_SDRAM 0x0328 |
182d6c136095
workaround wrong detected memory sizes on G400 cards.
attila
parents:
9449
diff
changeset
|
109 #endif |
182d6c136095
workaround wrong detected memory sizes on G400 cards.
attila
parents:
9449
diff
changeset
|
110 |
1 | 111 MODULE_AUTHOR("Aaron Holtzman <aholtzma@engr.uvic.ca>"); |
2262 | 112 #ifdef MODULE_LICENSE |
113 MODULE_LICENSE("GPL"); | |
114 #endif | |
1 | 115 |
4483
fb4b914eab8a
framework for settings modifications like in radeon_vid ( /dev/mga_vid can
eyck
parents:
3959
diff
changeset
|
116 #define PARAM_BRIGHTNESS "brightness=" |
4487
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
117 #define PARAM_CONTRAST "contrast=" |
4483
fb4b914eab8a
framework for settings modifications like in radeon_vid ( /dev/mga_vid can
eyck
parents:
3959
diff
changeset
|
118 #define PARAM_BLACKIE "blackie=" |
4484 | 119 |
10743 | 120 // set PARAM_BUFF_SIZE to just below 4k because some kernel versions |
121 // store additional information in the memory page which leads to | |
122 // the allocation of an additional page if exactly 4k is used | |
123 #define PARAM_BUFF_SIZE 4000 | |
4484 | 124 |
5764 | 125 #ifndef min |
5013
52c008dd6e93
min() moved out of #if, applied brightness/contrast patch by Brian J. Murrell
arpi
parents:
4728
diff
changeset
|
126 #define min(x,y) (((x)<(y))?(x):(y)) |
5764 | 127 #endif |
5013
52c008dd6e93
min() moved out of #if, applied brightness/contrast patch by Brian J. Murrell
arpi
parents:
4728
diff
changeset
|
128 |
4487
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
129 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,4,0) |
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
130 #include <linux/ctype.h> |
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
131 |
5884 | 132 static unsigned long simple_strtoul(const char *cp,char **endp,unsigned int base) |
4487
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
133 { |
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
134 unsigned long result = 0,value; |
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
135 |
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
136 if (!base) { |
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
137 base = 10; |
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
138 if (*cp == '0') { |
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
139 base = 8; |
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
140 cp++; |
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
141 if ((*cp == 'x') && isxdigit(cp[1])) { |
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
142 cp++; |
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
143 base = 16; |
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
144 } |
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
145 } |
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
146 } |
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
147 while (isxdigit(*cp) && (value = isdigit(*cp) ? *cp-'0' : (islower(*cp) |
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
148 ? toupper(*cp) : *cp)-'A'+10) < base) { |
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
149 result = result*base + value; |
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
150 cp++; |
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
151 } |
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
152 if (endp) |
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
153 *endp = (char *)cp; |
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
154 return result; |
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
155 } |
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
156 |
5884 | 157 static long simple_strtol(const char *cp,char **endp,unsigned int base) |
4487
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
158 { |
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
159 if(*cp=='-') |
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
160 return -simple_strtoul(cp+1,endp,base); |
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
161 return simple_strtoul(cp,endp,base); |
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
162 } |
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
163 #endif |
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
164 |
4483
fb4b914eab8a
framework for settings modifications like in radeon_vid ( /dev/mga_vid can
eyck
parents:
3959
diff
changeset
|
165 |
1 | 166 typedef struct bes_registers_s |
167 { | |
168 //BES Control | |
169 uint32_t besctl; | |
170 //BES Global control | |
171 uint32_t besglobctl; | |
172 //Luma control (brightness and contrast) | |
173 uint32_t beslumactl; | |
174 //Line pitch | |
175 uint32_t bespitch; | |
176 | |
177 //Buffer A-1 Chroma 3 plane org | |
178 uint32_t besa1c3org; | |
179 //Buffer A-1 Chroma org | |
180 uint32_t besa1corg; | |
181 //Buffer A-1 Luma org | |
182 uint32_t besa1org; | |
183 | |
184 //Buffer A-2 Chroma 3 plane org | |
185 uint32_t besa2c3org; | |
186 //Buffer A-2 Chroma org | |
187 uint32_t besa2corg; | |
188 //Buffer A-2 Luma org | |
189 uint32_t besa2org; | |
190 | |
191 //Buffer B-1 Chroma 3 plane org | |
192 uint32_t besb1c3org; | |
193 //Buffer B-1 Chroma org | |
194 uint32_t besb1corg; | |
195 //Buffer B-1 Luma org | |
196 uint32_t besb1org; | |
197 | |
198 //Buffer B-2 Chroma 3 plane org | |
199 uint32_t besb2c3org; | |
200 //Buffer B-2 Chroma org | |
201 uint32_t besb2corg; | |
202 //Buffer B-2 Luma org | |
203 uint32_t besb2org; | |
204 | |
205 //BES Horizontal coord | |
206 uint32_t beshcoord; | |
207 //BES Horizontal inverse scaling [5.14] | |
208 uint32_t beshiscal; | |
209 //BES Horizontal source start [10.14] (for scaling) | |
210 uint32_t beshsrcst; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
211 //BES Horizontal source ending [10.14] (for scaling) |
1 | 212 uint32_t beshsrcend; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
213 //BES Horizontal source last |
1 | 214 uint32_t beshsrclst; |
215 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
216 |
1 | 217 //BES Vertical coord |
218 uint32_t besvcoord; | |
219 //BES Vertical inverse scaling [5.14] | |
220 uint32_t besviscal; | |
221 //BES Field 1 vertical source last position | |
222 uint32_t besv1srclst; | |
223 //BES Field 1 weight start | |
224 uint32_t besv1wght; | |
225 //BES Field 2 vertical source last position | |
226 uint32_t besv2srclst; | |
227 //BES Field 2 weight start | |
228 uint32_t besv2wght; | |
229 | |
4483
fb4b914eab8a
framework for settings modifications like in radeon_vid ( /dev/mga_vid can
eyck
parents:
3959
diff
changeset
|
230 |
fb4b914eab8a
framework for settings modifications like in radeon_vid ( /dev/mga_vid can
eyck
parents:
3959
diff
changeset
|
231 //configurable stuff |
fb4b914eab8a
framework for settings modifications like in radeon_vid ( /dev/mga_vid can
eyck
parents:
3959
diff
changeset
|
232 int blackie; |
fb4b914eab8a
framework for settings modifications like in radeon_vid ( /dev/mga_vid can
eyck
parents:
3959
diff
changeset
|
233 |
1 | 234 } bes_registers_t; |
235 | |
2344 | 236 #ifdef CRTC2 |
237 typedef struct crtc2_registers_s | |
238 { | |
239 uint32_t c2ctl; | |
240 uint32_t c2datactl; | |
241 uint32_t c2misc; | |
242 uint32_t c2hparam; | |
243 uint32_t c2hsync; | |
244 uint32_t c2offset; | |
245 uint32_t c2pl2startadd0; | |
246 uint32_t c2pl2startadd1; | |
247 uint32_t c2pl3startadd0; | |
248 uint32_t c2pl3startadd1; | |
249 uint32_t c2preload; | |
250 uint32_t c2spicstartadd0; | |
251 uint32_t c2spicstartadd1; | |
252 uint32_t c2startadd0; | |
253 uint32_t c2startadd1; | |
254 uint32_t c2subpiclut; | |
255 uint32_t c2vcount; | |
256 uint32_t c2vparam; | |
257 uint32_t c2vsync; | |
258 } crtc2_registers_t; | |
5653
39115273d236
Mark Schreiber sent link to Marcus Sundburg patch to mga_vid, which enables
eyck
parents:
5623
diff
changeset
|
259 #endif |
39115273d236
Mark Schreiber sent link to Marcus Sundburg patch to mga_vid, which enables
eyck
parents:
5623
diff
changeset
|
260 |
10743 | 261 |
2086 | 262 |
10743 | 263 |
1 | 264 |
265 //All register offsets are converted to word aligned offsets (32 bit) | |
266 //because we want all our register accesses to be 32 bits | |
267 #define VCOUNT 0x1e20 | |
268 | |
269 #define PALWTADD 0x3c00 // Index register for X_DATAREG port | |
270 #define X_DATAREG 0x3c0a | |
271 | |
272 #define XMULCTRL 0x19 | |
273 #define BPP_8 0x00 | |
274 #define BPP_15 0x01 | |
275 #define BPP_16 0x02 | |
276 #define BPP_24 0x03 | |
277 #define BPP_32_DIR 0x04 | |
278 #define BPP_32_PAL 0x07 | |
279 | |
280 #define XCOLMSK 0x40 | |
281 #define X_COLKEY 0x42 | |
282 #define XKEYOPMODE 0x51 | |
283 #define XCOLMSK0RED 0x52 | |
284 #define XCOLMSK0GREEN 0x53 | |
285 #define XCOLMSK0BLUE 0x54 | |
286 #define XCOLKEY0RED 0x55 | |
287 #define XCOLKEY0GREEN 0x56 | |
288 #define XCOLKEY0BLUE 0x57 | |
289 | |
2344 | 290 #ifdef CRTC2 |
291 | |
292 /*CRTC2 registers*/ | |
293 #define XMISCCTRL 0x1e | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
294 #define C2CTL 0x3c10 |
2344 | 295 #define C2DATACTL 0x3c4c |
296 #define C2MISC 0x3c44 | |
297 #define C2HPARAM 0x3c14 | |
298 #define C2HSYNC 0x3c18 | |
299 #define C2OFFSET 0x3c40 | |
300 #define C2PL2STARTADD0 0x3c30 // like BESA1CORG | |
301 #define C2PL2STARTADD1 0x3c34 // like BESA2CORG | |
302 #define C2PL3STARTADD0 0x3c38 // like BESA1C3ORG | |
303 #define C2PL3STARTADD1 0x3c3c // like BESA2C3ORG | |
304 #define C2PRELOAD 0x3c24 | |
305 #define C2SPICSTARTADD0 0x3c54 | |
306 #define C2SPICSTARTADD1 0x3c58 | |
307 #define C2STARTADD0 0x3c28 // like BESA1ORG | |
308 #define C2STARTADD1 0x3c2c // like BESA2ORG | |
309 #define C2SUBPICLUT 0x3c50 | |
310 #define C2VCOUNT 0x3c48 | |
311 #define C2VPARAM 0x3c1c | |
312 #define C2VSYNC 0x3c20 | |
313 | |
314 #endif | |
315 | |
1 | 316 // Backend Scaler registers |
317 #define BESCTL 0x3d20 | |
318 #define BESGLOBCTL 0x3dc0 | |
319 #define BESLUMACTL 0x3d40 | |
320 #define BESPITCH 0x3d24 | |
48 | 321 |
1 | 322 #define BESA1C3ORG 0x3d60 |
323 #define BESA1CORG 0x3d10 | |
324 #define BESA1ORG 0x3d00 | |
48 | 325 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
326 #define BESA2C3ORG 0x3d64 |
1 | 327 #define BESA2CORG 0x3d14 |
328 #define BESA2ORG 0x3d04 | |
48 | 329 |
1 | 330 #define BESB1C3ORG 0x3d68 |
331 #define BESB1CORG 0x3d18 | |
332 #define BESB1ORG 0x3d08 | |
48 | 333 |
1 | 334 #define BESB2C3ORG 0x3d6C |
335 #define BESB2CORG 0x3d1C | |
336 #define BESB2ORG 0x3d0C | |
48 | 337 |
1 | 338 #define BESHCOORD 0x3d28 |
339 #define BESHISCAL 0x3d30 | |
340 #define BESHSRCEND 0x3d3C | |
341 #define BESHSRCLST 0x3d50 | |
342 #define BESHSRCST 0x3d38 | |
343 #define BESV1WGHT 0x3d48 | |
344 #define BESV2WGHT 0x3d4c | |
345 #define BESV1SRCLST 0x3d54 | |
346 #define BESV2SRCLST 0x3d58 | |
347 #define BESVISCAL 0x3d34 | |
348 #define BESVCOORD 0x3d2c | |
349 #define BESSTATUS 0x3dc4 | |
350 | |
48 | 351 #define CRTCX 0x1fd4 |
352 #define CRTCD 0x1fd5 | |
353 #define IEN 0x1e1c | |
354 #define ICLEAR 0x1e18 | |
355 #define STATUS 0x1e14 | |
356 | |
10743 | 357 |
358 // global devfs handle for /dev/mga_vid | |
359 #ifdef CONFIG_DEVFS_FS | |
360 static devfs_handle_t dev_handle = NULL; | |
361 #endif | |
362 | |
363 // card local config | |
364 typedef struct mga_card_s { | |
365 | |
366 // local devfs handle for /dev/mga_vidX | |
367 #ifdef CONFIG_DEVFS_FS | |
368 devfs_handle_t dev_handle; | |
369 #endif | |
370 | |
371 uint8_t *param_buff; // buffer for read() | |
372 uint32_t param_buff_size; | |
373 uint32_t param_buff_len; | |
374 bes_registers_t regs; | |
375 #ifdef CRTC2 | |
376 crtc2_registers_t cregs; | |
377 #endif | |
378 uint32_t vid_in_use; | |
379 uint32_t is_g400; | |
380 uint32_t vid_src_ready; | |
381 uint32_t vid_overlay_on; | |
382 | |
383 uint8_t *mmio_base; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
384 uint32_t mem_base; |
10743 | 385 int src_base; // YUV buffer position in video memory |
386 uint32_t ram_size; // how much megabytes videoram we have | |
387 uint32_t top_reserved; // reserved space for console font (matroxfb + fastfont) | |
388 | |
389 int brightness; // initial brightness | |
390 int contrast; // initial contrast | |
391 | |
392 struct pci_dev *pci_dev; | |
393 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
394 mga_vid_config_t config; |
10743 | 395 int configured; // set to 1 when the card is configured over ioctl |
396 | |
397 int colkey_saved; | |
398 int colkey_on; | |
399 unsigned char colkey_color[4]; | |
400 unsigned char colkey_mask[4]; | |
401 | |
402 int irq; // = -1 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
403 int next_frame; |
10743 | 404 } mga_card_t; |
405 | |
406 #define MGA_MAX_CARDS 16 | |
407 // this is used as init value for the parameter arrays | |
408 // it should have exactly MGA_MAX_CARDS elements | |
409 #define MGA_MAX_CARDS_INIT_ARRAY {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} | |
410 static unsigned int mga_cards_num=0; | |
411 static mga_card_t * mga_cards[MGA_MAX_CARDS] = MGA_MAX_CARDS_INIT_ARRAY; | |
412 | |
413 // module parameters | |
414 static int major = DEFAULT_MGA_VID_MAJOR; | |
415 static int mga_ram_size[MGA_MAX_CARDS] = MGA_MAX_CARDS_INIT_ARRAY; | |
416 static int mga_brightness[MGA_MAX_CARDS] = MGA_MAX_CARDS_INIT_ARRAY; | |
417 static int mga_contrast[MGA_MAX_CARDS] = MGA_MAX_CARDS_INIT_ARRAY; | |
418 static int mga_top_reserved[MGA_MAX_CARDS] = MGA_MAX_CARDS_INIT_ARRAY; | |
419 | |
420 MODULE_PARM(mga_ram_size, "1-" __MODULE_STRING(MGA_MAX_CARDS) "i"); | |
421 MODULE_PARM(mga_top_reserved, "1-" __MODULE_STRING(MGA_MAX_CARDS) "i"); | |
422 MODULE_PARM(mga_brightness, "1-" __MODULE_STRING(MGA_MAX_CARDS) "i"); | |
423 MODULE_PARM(mga_contrast, "1-" __MODULE_STRING(MGA_MAX_CARDS) "i"); | |
424 MODULE_PARM(major, "i"); | |
1 | 425 |
2344 | 426 #ifdef CRTC2 |
10743 | 427 static void crtc2_frame_sel(mga_card_t * card, int frame) |
2344 | 428 { |
429 switch(frame) { | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
430 case 0: |
10743 | 431 card->cregs.c2pl2startadd0=card->regs.besa1corg; |
432 card->cregs.c2pl3startadd0=card->regs.besa1c3org; | |
433 card->cregs.c2startadd0=card->regs.besa1org; | |
2344 | 434 break; |
435 case 1: | |
10743 | 436 card->cregs.c2pl2startadd0=card->regs.besa2corg; |
437 card->cregs.c2pl3startadd0=card->regs.besa2c3org; | |
438 card->cregs.c2startadd0=card->regs.besa2org; | |
2344 | 439 break; |
440 case 2: | |
10743 | 441 card->cregs.c2pl2startadd0=card->regs.besb1corg; |
442 card->cregs.c2pl3startadd0=card->regs.besb1c3org; | |
443 card->cregs.c2startadd0=card->regs.besb1org; | |
2344 | 444 break; |
445 case 3: | |
10743 | 446 card->cregs.c2pl2startadd0=card->regs.besb2corg; |
447 card->cregs.c2pl3startadd0=card->regs.besb2c3org; | |
448 card->cregs.c2startadd0=card->regs.besb2org; | |
2344 | 449 break; |
450 } | |
10743 | 451 writel(card->cregs.c2startadd0, card->mmio_base + C2STARTADD0); |
452 writel(card->cregs.c2pl2startadd0, card->mmio_base + C2PL2STARTADD0); | |
453 writel(card->cregs.c2pl3startadd0, card->mmio_base + C2PL3STARTADD0); | |
2344 | 454 } |
455 #endif | |
456 | |
10743 | 457 static void mga_vid_frame_sel(mga_card_t * card, int frame) |
1 | 458 { |
10743 | 459 if ( card->irq != -1 ) { |
460 card->next_frame=frame; | |
48 | 461 } else { |
462 | |
1 | 463 //we don't need the vcount protection as we're only hitting |
464 //one register (and it doesn't seem to be double buffered) | |
10743 | 465 card->regs.besctl = (card->regs.besctl & ~0x07000000) + (frame << 25); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
466 writel( card->regs.besctl, card->mmio_base + BESCTL ); |
68 | 467 |
10743 | 468 // writel( card->regs.besglobctl + ((readl(card->mmio_base + VCOUNT)+2)<<16), |
469 writel( card->regs.besglobctl + (MGA_VSYNC_POS<<16), | |
470 card->mmio_base + BESGLOBCTL); | |
2344 | 471 #ifdef CRTC2 |
10743 | 472 crtc2_frame_sel(card, frame); |
2344 | 473 #endif |
68 | 474 |
48 | 475 } |
1 | 476 } |
477 | |
478 | |
10743 | 479 static void mga_vid_write_regs(mga_card_t * card, int restore) |
1 | 480 { |
481 //Make sure internal registers don't get updated until we're done | |
10743 | 482 writel( (readl(card->mmio_base + VCOUNT)-1)<<16, |
483 card->mmio_base + BESGLOBCTL); | |
1 | 484 |
485 // color or coordinate keying | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
486 |
10743 | 487 if(restore && card->colkey_saved){ |
2086 | 488 // restore it |
10743 | 489 card->colkey_saved=0; |
2086 | 490 |
5623 | 491 #ifdef MP_DEBUG |
2086 | 492 printk("mga_vid: Restoring colorkey (ON: %d %02X:%02X:%02X)\n", |
10743 | 493 card->colkey_on,card->colkey_color[0],card->colkey_color[1],card->colkey_color[2]); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
494 #endif |
2086 | 495 |
496 // Set color key registers: | |
10743 | 497 writeb( XKEYOPMODE, card->mmio_base + PALWTADD); |
498 writeb( card->colkey_on, card->mmio_base + X_DATAREG); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
499 |
10743 | 500 writeb( XCOLKEY0RED, card->mmio_base + PALWTADD); |
501 writeb( card->colkey_color[0], card->mmio_base + X_DATAREG); | |
502 writeb( XCOLKEY0GREEN, card->mmio_base + PALWTADD); | |
503 writeb( card->colkey_color[1], card->mmio_base + X_DATAREG); | |
504 writeb( XCOLKEY0BLUE, card->mmio_base + PALWTADD); | |
505 writeb( card->colkey_color[2], card->mmio_base + X_DATAREG); | |
506 writeb( X_COLKEY, card->mmio_base + PALWTADD); | |
507 writeb( card->colkey_color[3], card->mmio_base + X_DATAREG); | |
2086 | 508 |
10743 | 509 writeb( XCOLMSK0RED, card->mmio_base + PALWTADD); |
510 writeb( card->colkey_mask[0], card->mmio_base + X_DATAREG); | |
511 writeb( XCOLMSK0GREEN, card->mmio_base + PALWTADD); | |
512 writeb( card->colkey_mask[1], card->mmio_base + X_DATAREG); | |
513 writeb( XCOLMSK0BLUE, card->mmio_base + PALWTADD); | |
514 writeb( card->colkey_mask[2], card->mmio_base + X_DATAREG); | |
515 writeb( XCOLMSK, card->mmio_base + PALWTADD); | |
516 writeb( card->colkey_mask[3], card->mmio_base + X_DATAREG); | |
2086 | 517 |
10743 | 518 } else if(!card->colkey_saved){ |
2086 | 519 // save it |
10743 | 520 card->colkey_saved=1; |
2086 | 521 // Get color key registers: |
10743 | 522 writeb( XKEYOPMODE, card->mmio_base + PALWTADD); |
523 card->colkey_on=(unsigned char)readb(card->mmio_base + X_DATAREG) & 1; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
524 |
10743 | 525 writeb( XCOLKEY0RED, card->mmio_base + PALWTADD); |
526 card->colkey_color[0]=(unsigned char)readb(card->mmio_base + X_DATAREG); | |
527 writeb( XCOLKEY0GREEN, card->mmio_base + PALWTADD); | |
528 card->colkey_color[1]=(unsigned char)readb(card->mmio_base + X_DATAREG); | |
529 writeb( XCOLKEY0BLUE, card->mmio_base + PALWTADD); | |
530 card->colkey_color[2]=(unsigned char)readb(card->mmio_base + X_DATAREG); | |
531 writeb( X_COLKEY, card->mmio_base + PALWTADD); | |
532 card->colkey_color[3]=(unsigned char)readb(card->mmio_base + X_DATAREG); | |
2086 | 533 |
10743 | 534 writeb( XCOLMSK0RED, card->mmio_base + PALWTADD); |
535 card->colkey_mask[0]=(unsigned char)readb(card->mmio_base + X_DATAREG); | |
536 writeb( XCOLMSK0GREEN, card->mmio_base + PALWTADD); | |
537 card->colkey_mask[1]=(unsigned char)readb(card->mmio_base + X_DATAREG); | |
538 writeb( XCOLMSK0BLUE, card->mmio_base + PALWTADD); | |
539 card->colkey_mask[2]=(unsigned char)readb(card->mmio_base + X_DATAREG); | |
540 writeb( XCOLMSK, card->mmio_base + PALWTADD); | |
541 card->colkey_mask[3]=(unsigned char)readb(card->mmio_base + X_DATAREG); | |
2086 | 542 |
5623 | 543 #ifdef MP_DEBUG |
2086 | 544 printk("mga_vid: Saved colorkey (ON: %d %02X:%02X:%02X)\n", |
10743 | 545 card->colkey_on, card->colkey_color[0], card->colkey_color[1], card->colkey_color[2]); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
546 #endif |
2086 | 547 |
548 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
549 |
2086 | 550 if(!restore){ |
10743 | 551 writeb( XKEYOPMODE, card->mmio_base + PALWTADD); |
552 writeb( card->config.colkey_on, card->mmio_base + X_DATAREG); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
553 if ( card->config.colkey_on ) |
1 | 554 { |
555 uint32_t r=0, g=0, b=0; | |
556 | |
10743 | 557 writeb( XMULCTRL, card->mmio_base + PALWTADD); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
558 switch (readb (card->mmio_base + X_DATAREG)) |
1 | 559 { |
560 case BPP_8: | |
10743 | 561 /* Need to look up the color index, just using color 0 for now. */ |
1 | 562 break; |
563 | |
564 case BPP_15: | |
10743 | 565 r = card->config.colkey_red >> 3; |
566 g = card->config.colkey_green >> 3; | |
567 b = card->config.colkey_blue >> 3; | |
1 | 568 break; |
569 | |
570 case BPP_16: | |
10743 | 571 r = card->config.colkey_red >> 3; |
572 g = card->config.colkey_green >> 2; | |
573 b = card->config.colkey_blue >> 3; | |
1 | 574 break; |
575 | |
576 case BPP_24: | |
577 case BPP_32_DIR: | |
578 case BPP_32_PAL: | |
10743 | 579 r = card->config.colkey_red; |
580 g = card->config.colkey_green; | |
581 b = card->config.colkey_blue; | |
1 | 582 break; |
583 } | |
584 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
585 // Disable color keying on alpha channel |
10743 | 586 writeb( XCOLMSK, card->mmio_base + PALWTADD); |
587 writeb( 0x00, card->mmio_base + X_DATAREG); | |
588 writeb( X_COLKEY, card->mmio_base + PALWTADD); | |
589 writeb( 0x00, card->mmio_base + X_DATAREG); | |
1 | 590 |
2086 | 591 |
1 | 592 // Set up color key registers |
10743 | 593 writeb( XCOLKEY0RED, card->mmio_base + PALWTADD); |
594 writeb( r, card->mmio_base + X_DATAREG); | |
595 writeb( XCOLKEY0GREEN, card->mmio_base + PALWTADD); | |
596 writeb( g, card->mmio_base + X_DATAREG); | |
597 writeb( XCOLKEY0BLUE, card->mmio_base + PALWTADD); | |
598 writeb( b, card->mmio_base + X_DATAREG); | |
1 | 599 |
600 // Set up color key mask registers | |
10743 | 601 writeb( XCOLMSK0RED, card->mmio_base + PALWTADD); |
602 writeb( 0xff, card->mmio_base + X_DATAREG); | |
603 writeb( XCOLMSK0GREEN, card->mmio_base + PALWTADD); | |
604 writeb( 0xff, card->mmio_base + X_DATAREG); | |
605 writeb( XCOLMSK0BLUE, card->mmio_base + PALWTADD); | |
606 writeb( 0xff, card->mmio_base + X_DATAREG); | |
1 | 607 } |
608 | |
2086 | 609 } |
610 | |
1 | 611 // Backend Scaler |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
612 writel( card->regs.besctl, card->mmio_base + BESCTL); |
10743 | 613 if(card->is_g400) |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
614 writel( card->regs.beslumactl, card->mmio_base + BESLUMACTL); |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
615 writel( card->regs.bespitch, card->mmio_base + BESPITCH); |
1 | 616 |
10743 | 617 writel( card->regs.besa1org, card->mmio_base + BESA1ORG); |
618 writel( card->regs.besa1corg, card->mmio_base + BESA1CORG); | |
619 writel( card->regs.besa2org, card->mmio_base + BESA2ORG); | |
620 writel( card->regs.besa2corg, card->mmio_base + BESA2CORG); | |
621 writel( card->regs.besb1org, card->mmio_base + BESB1ORG); | |
622 writel( card->regs.besb1corg, card->mmio_base + BESB1CORG); | |
623 writel( card->regs.besb2org, card->mmio_base + BESB2ORG); | |
624 writel( card->regs.besb2corg, card->mmio_base + BESB2CORG); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
625 if(card->is_g400) |
1 | 626 { |
10743 | 627 writel( card->regs.besa1c3org, card->mmio_base + BESA1C3ORG); |
628 writel( card->regs.besa2c3org, card->mmio_base + BESA2C3ORG); | |
629 writel( card->regs.besb1c3org, card->mmio_base + BESB1C3ORG); | |
630 writel( card->regs.besb2c3org, card->mmio_base + BESB2C3ORG); | |
1 | 631 } |
632 | |
10743 | 633 writel( card->regs.beshcoord, card->mmio_base + BESHCOORD); |
634 writel( card->regs.beshiscal, card->mmio_base + BESHISCAL); | |
635 writel( card->regs.beshsrcst, card->mmio_base + BESHSRCST); | |
636 writel( card->regs.beshsrcend, card->mmio_base + BESHSRCEND); | |
637 writel( card->regs.beshsrclst, card->mmio_base + BESHSRCLST); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
638 |
10743 | 639 writel( card->regs.besvcoord, card->mmio_base + BESVCOORD); |
640 writel( card->regs.besviscal, card->mmio_base + BESVISCAL); | |
48 | 641 |
10743 | 642 writel( card->regs.besv1srclst, card->mmio_base + BESV1SRCLST); |
643 writel( card->regs.besv1wght, card->mmio_base + BESV1WGHT); | |
644 writel( card->regs.besv2srclst, card->mmio_base + BESV2SRCLST); | |
645 writel( card->regs.besv2wght, card->mmio_base + BESV2WGHT); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
646 |
1 | 647 //update the registers somewhere between 1 and 2 frames from now. |
10743 | 648 writel( card->regs.besglobctl + ((readl(card->mmio_base + VCOUNT)+2)<<16), |
649 card->mmio_base + BESGLOBCTL); | |
1 | 650 |
77 | 651 #if 0 |
61 | 652 printk(KERN_DEBUG "mga_vid: wrote BES registers\n"); |
653 printk(KERN_DEBUG "mga_vid: BESCTL = 0x%08x\n", | |
10743 | 654 readl(card->mmio_base + BESCTL)); |
61 | 655 printk(KERN_DEBUG "mga_vid: BESGLOBCTL = 0x%08x\n", |
10743 | 656 readl(card->mmio_base + BESGLOBCTL)); |
61 | 657 printk(KERN_DEBUG "mga_vid: BESSTATUS= 0x%08x\n", |
10743 | 658 readl(card->mmio_base + BESSTATUS)); |
77 | 659 #endif |
2344 | 660 #ifdef CRTC2 |
10743 | 661 // printk("c2ctl:0x%08x c2datactl:0x%08x\n", readl(card->mmio_base + C2CTL), readl(card->mmio_base + C2DATACTL)); |
662 // printk("c2misc:0x%08x\n", readl(card->mmio_base + C2MISC)); | |
663 // printk("c2ctl:0x%08x c2datactl:0x%08x\n", card->cregs.c2ctl, card->cregs.c2datactl); | |
2344 | 664 |
10743 | 665 // writel(card->cregs.c2ctl, card->mmio_base + C2CTL); |
2344 | 666 |
10743 | 667 writel(((readl(card->mmio_base + C2CTL) & ~0x03e00000) + (card->cregs.c2ctl & 0x03e00000)), card->mmio_base + C2CTL); |
668 writel(((readl(card->mmio_base + C2DATACTL) & ~0x000000ff) + (card->cregs.c2datactl & 0x000000ff)), card->mmio_base + C2DATACTL); | |
2344 | 669 // ctrc2 |
670 // disable CRTC2 acording to specs | |
10743 | 671 // writel(card->cregs.c2ctl & 0xfffffff0, card->mmio_base + C2CTL); |
2344 | 672 // je to treba ??? |
10743 | 673 // writeb((readb(card->mmio_base + XMISCCTRL) & 0x19) | 0xa2, card->mmio_base + XMISCCTRL); // MAFC - mfcsel & vdoutsel |
674 // writeb((readb(card->mmio_base + XMISCCTRL) & 0x19) | 0x92, card->mmio_base + XMISCCTRL); | |
675 // writeb((readb(card->mmio_base + XMISCCTRL) & ~0xe9) + 0xa2, card->mmio_base + XMISCCTRL); | |
676 // writel(card->cregs.c2datactl, card->mmio_base + C2DATACTL); | |
677 // writel(card->cregs.c2hparam, card->mmio_base + C2HPARAM); | |
678 // writel(card->cregs.c2hsync, card->mmio_base + C2HSYNC); | |
679 // writel(card->cregs.c2vparam, card->mmio_base + C2VPARAM); | |
680 // writel(card->cregs.c2vsync, card->mmio_base + C2VSYNC); | |
681 writel(card->cregs.c2misc, card->mmio_base + C2MISC); | |
2344 | 682 |
5623 | 683 #ifdef MP_DEBUG |
10743 | 684 printk("c2offset = %d\n",card->cregs.c2offset); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
685 #endif |
2344 | 686 |
10743 | 687 writel(card->cregs.c2offset, card->mmio_base + C2OFFSET); |
688 writel(card->cregs.c2startadd0, card->mmio_base + C2STARTADD0); | |
689 // writel(card->cregs.c2startadd1, card->mmio_base + C2STARTADD1); | |
690 writel(card->cregs.c2pl2startadd0, card->mmio_base + C2PL2STARTADD0); | |
691 // writel(card->cregs.c2pl2startadd1, card->mmio_base + C2PL2STARTADD1); | |
692 writel(card->cregs.c2pl3startadd0, card->mmio_base + C2PL3STARTADD0); | |
693 // writel(card->cregs.c2pl3startadd1, card->mmio_base + C2PL3STARTADD1); | |
694 writel(card->cregs.c2spicstartadd0, card->mmio_base + C2SPICSTARTADD0); | |
695 // writel(card->cregs.c2spicstartadd1, card->mmio_base + C2SPICSTARTADD1); | |
696 // writel(card->cregs.c2subpiclut, card->mmio_base + C2SUBPICLUT); | |
697 // writel(card->cregs.c2preload, card->mmio_base + C2PRELOAD); | |
2344 | 698 // finaly enable everything |
10743 | 699 // writel(card->cregs.c2ctl, card->mmio_base + C2CTL); |
700 // printk("c2ctl:0x%08x c2datactl:0x%08x\n",readl(card->mmio_base + C2CTL),readl(card->mmio_base + C2DATACTL)); | |
701 // printk("c2misc:0x%08x\n", readl(card->mmio_base + C2MISC)); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
702 #endif |
1 | 703 } |
704 | |
10743 | 705 static int mga_vid_set_config(mga_card_t * card) |
1 | 706 { |
707 int x, y, sw, sh, dw, dh; | |
708 int besleft, bestop, ifactor, ofsleft, ofstop, baseadrofs, weight, weights; | |
10743 | 709 mga_vid_config_t *config = &card->config; |
710 int frame_size = card->config.frame_size; | |
711 | |
2344 | 712 #ifdef CRTC2 |
713 #define right_margin 0 | |
714 #define left_margin 18 | |
715 #define hsync_len 46 | |
716 #define lower_margin 10 | |
717 #define vsync_len 4 | |
718 #define upper_margin 39 | |
719 | |
720 unsigned int hdispend = (config->src_width + 31) & ~31; | |
721 unsigned int hsyncstart = hdispend + (right_margin & ~7); | |
722 unsigned int hsyncend = hsyncstart + (hsync_len & ~7); | |
723 unsigned int htotal = hsyncend + (left_margin & ~7); | |
724 unsigned int vdispend = config->src_height; | |
725 unsigned int vsyncstart = vdispend + lower_margin; | |
726 unsigned int vsyncend = vsyncstart + vsync_len; | |
727 unsigned int vtotal = vsyncend + upper_margin; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
728 #endif |
1 | 729 x = config->x_org; |
730 y = config->y_org; | |
731 sw = config->src_width; | |
732 sh = config->src_height; | |
733 dw = config->dest_width; | |
734 dh = config->dest_height; | |
735 | |
5623 | 736 #ifdef MP_DEBUG |
61 | 737 printk(KERN_DEBUG "mga_vid: Setting up a %dx%d+%d+%d video window (src %dx%d) format %X\n", |
1 | 738 dw, dh, x, y, sw, sh, config->format); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
739 #endif |
1 | 740 |
3959 | 741 if(sw<4 || sh<4 || dw<4 || dh<4){ |
742 printk(KERN_ERR "mga_vid: Invalid src/dest dimenstions\n"); | |
743 return -1; | |
744 } | |
745 | |
1 | 746 //FIXME check that window is valid and inside desktop |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
747 |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
748 //Setup the BES registers for a three plane 4:2:0 video source |
1 | 749 |
10743 | 750 card->regs.besglobctl = 0; |
466 | 751 |
1 | 752 switch(config->format){ |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
753 case MGA_VID_FORMAT_YV12: |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
754 case MGA_VID_FORMAT_I420: |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
755 case MGA_VID_FORMAT_IYUV: |
10743 | 756 card->regs.besctl = 1 // BES enabled |
1 | 757 + (0<<6) // even start polarity |
758 + (1<<10) // x filtering enabled | |
759 + (1<<11) // y filtering enabled | |
760 + (1<<16) // chroma upsampling | |
761 + (1<<17) // 4:2:0 mode | |
762 + (1<<18); // dither enabled | |
466 | 763 #if 0 |
10743 | 764 if(card->is_g400) |
1 | 765 { |
766 //zoom disabled, zoom filter disabled, 420 3 plane format, proc amp | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
767 //disabled, rgb mode disabled |
10743 | 768 card->regs.besglobctl = (1<<5); |
1 | 769 } |
770 else | |
771 { | |
772 //zoom disabled, zoom filter disabled, Cb samples in 0246, Cr | |
773 //in 1357, BES register update on besvcnt | |
10743 | 774 card->regs.besglobctl = 0; |
1 | 775 } |
466 | 776 #endif |
1 | 777 break; |
778 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
779 case MGA_VID_FORMAT_YUY2: |
10743 | 780 card->regs.besctl = 1 // BES enabled |
1 | 781 + (0<<6) // even start polarity |
782 + (1<<10) // x filtering enabled | |
783 + (1<<11) // y filtering enabled | |
784 + (1<<16) // chroma upsampling | |
785 + (0<<17) // 4:2:2 mode | |
786 + (1<<18); // dither enabled | |
787 | |
10743 | 788 card->regs.besglobctl = 0; // YUY2 format selected |
1 | 789 break; |
466 | 790 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
791 case MGA_VID_FORMAT_UYVY: |
10743 | 792 card->regs.besctl = 1 // BES enabled |
466 | 793 + (0<<6) // even start polarity |
794 + (1<<10) // x filtering enabled | |
795 + (1<<11) // y filtering enabled | |
796 + (1<<16) // chroma upsampling | |
797 + (0<<17) // 4:2:2 mode | |
798 + (1<<18); // dither enabled | |
799 | |
10743 | 800 card->regs.besglobctl = 1<<6; // UYVY format selected |
466 | 801 break; |
802 | |
1 | 803 default: |
61 | 804 printk(KERN_ERR "mga_vid: Unsupported pixel format: 0x%X\n",config->format); |
1 | 805 return -1; |
806 } | |
807 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
808 // setting black&white mode |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
809 card->regs.besctl|=(card->regs.blackie<<20); |
1 | 810 |
4483
fb4b914eab8a
framework for settings modifications like in radeon_vid ( /dev/mga_vid can
eyck
parents:
3959
diff
changeset
|
811 //Enable contrast and brightness control |
10743 | 812 card->regs.besglobctl |= (1<<5) + (1<<7); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
813 |
6798 | 814 // brightness (-128..127) && contrast (0..255) |
10743 | 815 card->regs.beslumactl = (card->brightness << 16) | ((card->contrast+0x80)&0xFFFF); |
1 | 816 |
817 //Setup destination window boundaries | |
818 besleft = x > 0 ? x : 0; | |
819 bestop = y > 0 ? y : 0; | |
10743 | 820 card->regs.beshcoord = (besleft<<16) + (x + dw-1); |
821 card->regs.besvcoord = (bestop<<16) + (y + dh-1); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
822 |
1 | 823 //Setup source dimensions |
10743 | 824 card->regs.beshsrclst = (sw - 1) << 16; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
825 card->regs.bespitch = (sw + 31) & ~31 ; |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
826 |
1 | 827 //Setup horizontal scaling |
828 ifactor = ((sw-1)<<14)/(dw-1); | |
829 ofsleft = besleft - x; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
830 |
10743 | 831 card->regs.beshiscal = ifactor<<2; |
832 card->regs.beshsrcst = (ofsleft*ifactor)<<2; | |
833 card->regs.beshsrcend = card->regs.beshsrcst + (((dw - ofsleft - 1) * ifactor) << 2); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
834 |
1 | 835 //Setup vertical scaling |
836 ifactor = ((sh-1)<<14)/(dh-1); | |
837 ofstop = bestop - y; | |
838 | |
10743 | 839 card->regs.besviscal = ifactor<<2; |
1 | 840 |
10743 | 841 baseadrofs = ( (ofstop * card->regs.besviscal) >>16) * card->regs.bespitch; |
57 | 842 //frame_size = ((sw + 31) & ~31) * sh + (((sw + 31) & ~31) * sh) / 2; |
10743 | 843 card->regs.besa1org = (uint32_t) card->src_base + baseadrofs; |
844 card->regs.besa2org = (uint32_t) card->src_base + baseadrofs + 1*frame_size; | |
845 card->regs.besb1org = (uint32_t) card->src_base + baseadrofs + 2*frame_size; | |
846 card->regs.besb2org = (uint32_t) card->src_base + baseadrofs + 3*frame_size; | |
1 | 847 |
470 | 848 if(config->format==MGA_VID_FORMAT_YV12 |
849 ||config->format==MGA_VID_FORMAT_IYUV | |
850 ||config->format==MGA_VID_FORMAT_I420 | |
851 ){ | |
57 | 852 // planar YUV frames: |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
853 if (card->is_g400) |
10743 | 854 baseadrofs = ( ( (ofstop * card->regs.besviscal ) / 4 ) >> 16 ) * card->regs.bespitch; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
855 else |
10743 | 856 baseadrofs = ( ( ( ofstop * card->regs.besviscal ) / 2 ) >> 16 ) * card->regs.bespitch; |
1 | 857 |
10743 | 858 if(config->format==MGA_VID_FORMAT_YV12 || !card->is_g400){ |
859 card->regs.besa1corg = (uint32_t) card->src_base + baseadrofs + card->regs.bespitch * sh ; | |
860 card->regs.besa2corg = (uint32_t) card->src_base + baseadrofs + 1*frame_size + card->regs.bespitch * sh; | |
861 card->regs.besb1corg = (uint32_t) card->src_base + baseadrofs + 2*frame_size + card->regs.bespitch * sh; | |
862 card->regs.besb2corg = (uint32_t) card->src_base + baseadrofs + 3*frame_size + card->regs.bespitch * sh; | |
863 card->regs.besa1c3org = card->regs.besa1corg + ( (card->regs.bespitch * sh) / 4); | |
864 card->regs.besa2c3org = card->regs.besa2corg + ( (card->regs.bespitch * sh) / 4); | |
865 card->regs.besb1c3org = card->regs.besb1corg + ( (card->regs.bespitch * sh) / 4); | |
866 card->regs.besb2c3org = card->regs.besb2corg + ( (card->regs.bespitch * sh) / 4); | |
470 | 867 } else { |
10743 | 868 card->regs.besa1c3org = (uint32_t) card->src_base + baseadrofs + card->regs.bespitch * sh ; |
869 card->regs.besa2c3org = (uint32_t) card->src_base + baseadrofs + 1*frame_size + card->regs.bespitch * sh; | |
870 card->regs.besb1c3org = (uint32_t) card->src_base + baseadrofs + 2*frame_size + card->regs.bespitch * sh; | |
871 card->regs.besb2c3org = (uint32_t) card->src_base + baseadrofs + 3*frame_size + card->regs.bespitch * sh; | |
872 card->regs.besa1corg = card->regs.besa1c3org + ((card->regs.bespitch * sh) / 4); | |
873 card->regs.besa2corg = card->regs.besa2c3org + ((card->regs.bespitch * sh) / 4); | |
874 card->regs.besb1corg = card->regs.besb1c3org + ((card->regs.bespitch * sh) / 4); | |
875 card->regs.besb2corg = card->regs.besb2c3org + ((card->regs.bespitch * sh) / 4); | |
470 | 876 } |
877 | |
57 | 878 } |
1 | 879 |
10743 | 880 weight = ofstop * (card->regs.besviscal >> 2); |
1 | 881 weights = weight < 0 ? 1 : 0; |
10743 | 882 card->regs.besv2wght = card->regs.besv1wght = (weights << 16) + ((weight & 0x3FFF) << 2); |
883 card->regs.besv2srclst = card->regs.besv1srclst = sh - 1 - (((ofstop * card->regs.besviscal) >> 16) & 0x03FF); | |
1 | 884 |
2344 | 885 #ifdef CRTC2 |
886 // pridat hlavni registry - tj. casovani ... | |
887 | |
888 | |
889 switch(config->format){ | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
890 case MGA_VID_FORMAT_YV12: |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
891 case MGA_VID_FORMAT_I420: |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
892 case MGA_VID_FORMAT_IYUV: |
10743 | 893 card->cregs.c2ctl = 1 // CRTC2 enabled |
2344 | 894 + (1<<1) // external clock |
895 + (0<<2) // external clock | |
896 + (1<<3) // pixel clock enable - not needed ??? | |
897 + (0<<4) // high prioryty req | |
898 + (1<<5) // high prioryty req | |
899 + (0<<6) // high prioryty req | |
900 + (1<<8) // high prioryty req max | |
901 + (0<<9) // high prioryty req max | |
902 + (0<<10) // high prioryty req max | |
903 + (0<<20) // CRTC1 to DAC | |
904 + (1<<21) // 420 mode | |
905 + (1<<22) // 420 mode | |
906 + (1<<23) // 420 mode | |
907 + (0<<24) // single chroma line for 420 mode - need to be corrected | |
908 + (0<<25) /*/ interlace mode - need to be corrected*/ | |
909 + (0<<26) // field legth polariry | |
910 + (0<<27) // field identification polariry | |
911 + (1<<28) // VIDRST detection mode | |
912 + (0<<29) // VIDRST detection mode | |
913 + (1<<30) // Horizontal counter preload | |
914 + (1<<31) // Vertical counter preload | |
915 ; | |
10743 | 916 card->cregs.c2datactl = 1 // disable dither - propably not needed, we are already in YUV mode |
2344 | 917 + (1<<1) // Y filter enable |
918 + (1<<2) // CbCr filter enable | |
919 + (0<<3) // subpicture enable (disabled) | |
920 + (0<<4) // NTSC enable (disabled - PAL) | |
921 + (0<<5) // C2 static subpicture enable (disabled) | |
922 + (0<<6) // C2 subpicture offset division (disabled) | |
923 + (0<<7) // 422 subformat selection ! | |
924 /* + (0<<8) // 15 bpp high alpha | |
925 + (0<<9) // 15 bpp high alpha | |
926 + (0<<10) // 15 bpp high alpha | |
927 + (0<<11) // 15 bpp high alpha | |
928 + (0<<12) // 15 bpp high alpha | |
929 + (0<<13) // 15 bpp high alpha | |
930 + (0<<14) // 15 bpp high alpha | |
931 + (0<<15) // 15 bpp high alpha | |
932 + (0<<16) // 15 bpp low alpha | |
933 + (0<<17) // 15 bpp low alpha | |
934 + (0<<18) // 15 bpp low alpha | |
935 + (0<<19) // 15 bpp low alpha | |
936 + (0<<20) // 15 bpp low alpha | |
937 + (0<<21) // 15 bpp low alpha | |
938 + (0<<22) // 15 bpp low alpha | |
939 + (0<<23) // 15 bpp low alpha | |
940 + (0<<24) // static subpicture key | |
941 + (0<<25) // static subpicture key | |
942 + (0<<26) // static subpicture key | |
943 + (0<<27) // static subpicture key | |
944 + (0<<28) // static subpicture key | |
945 */ ; | |
946 break; | |
947 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
948 case MGA_VID_FORMAT_YUY2: |
10743 | 949 card->cregs.c2ctl = 1 // CRTC2 enabled |
2344 | 950 + (1<<1) // external clock |
951 + (0<<2) // external clock | |
952 + (1<<3) // pixel clock enable - not needed ??? | |
953 + (0<<4) // high prioryty req - acc to spec | |
954 + (1<<5) // high prioryty req | |
955 + (0<<6) // high prioryty req | |
956 // 7 reserved | |
957 + (1<<8) // high prioryty req max | |
958 + (0<<9) // high prioryty req max | |
959 + (0<<10) // high prioryty req max | |
960 // 11-19 reserved | |
961 + (0<<20) // CRTC1 to DAC | |
962 + (1<<21) // 422 mode | |
963 + (0<<22) // 422 mode | |
964 + (1<<23) // 422 mode | |
965 + (0<<24) // single chroma line for 420 mode - need to be corrected | |
966 + (0<<25) /*/ interlace mode - need to be corrected*/ | |
967 + (0<<26) // field legth polariry | |
968 + (0<<27) // field identification polariry | |
969 + (1<<28) // VIDRST detection mode | |
970 + (0<<29) // VIDRST detection mode | |
971 + (1<<30) // Horizontal counter preload | |
972 + (1<<31) // Vertical counter preload | |
973 ; | |
10743 | 974 card->cregs.c2datactl = 1 // disable dither - propably not needed, we are already in YUV mode |
2344 | 975 + (1<<1) // Y filter enable |
976 + (1<<2) // CbCr filter enable | |
977 + (0<<3) // subpicture enable (disabled) | |
978 + (0<<4) // NTSC enable (disabled - PAL) | |
979 + (0<<5) // C2 static subpicture enable (disabled) | |
980 + (0<<6) // C2 subpicture offset division (disabled) | |
981 + (0<<7) // 422 subformat selection ! | |
982 /* + (0<<8) // 15 bpp high alpha | |
983 + (0<<9) // 15 bpp high alpha | |
984 + (0<<10) // 15 bpp high alpha | |
985 + (0<<11) // 15 bpp high alpha | |
986 + (0<<12) // 15 bpp high alpha | |
987 + (0<<13) // 15 bpp high alpha | |
988 + (0<<14) // 15 bpp high alpha | |
989 + (0<<15) // 15 bpp high alpha | |
990 + (0<<16) // 15 bpp low alpha | |
991 + (0<<17) // 15 bpp low alpha | |
992 + (0<<18) // 15 bpp low alpha | |
993 + (0<<19) // 15 bpp low alpha | |
994 + (0<<20) // 15 bpp low alpha | |
995 + (0<<21) // 15 bpp low alpha | |
996 + (0<<22) // 15 bpp low alpha | |
997 + (0<<23) // 15 bpp low alpha | |
998 + (0<<24) // static subpicture key | |
999 + (0<<25) // static subpicture key | |
1000 + (0<<26) // static subpicture key | |
1001 + (0<<27) // static subpicture key | |
1002 + (0<<28) // static subpicture key | |
1003 */ ; | |
1004 break; | |
1005 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1006 case MGA_VID_FORMAT_UYVY: |
10743 | 1007 card->cregs.c2ctl = 1 // CRTC2 enabled |
2344 | 1008 + (1<<1) // external clock |
1009 + (0<<2) // external clock | |
1010 + (1<<3) // pixel clock enable - not needed ??? | |
1011 + (0<<4) // high prioryty req | |
1012 + (1<<5) // high prioryty req | |
1013 + (0<<6) // high prioryty req | |
1014 + (1<<8) // high prioryty req max | |
1015 + (0<<9) // high prioryty req max | |
1016 + (0<<10) // high prioryty req max | |
1017 + (0<<20) // CRTC1 to DAC | |
1018 + (1<<21) // 422 mode | |
1019 + (0<<22) // 422 mode | |
1020 + (1<<23) // 422 mode | |
1021 + (1<<24) // single chroma line for 420 mode - need to be corrected | |
1022 + (1<<25) /*/ interlace mode - need to be corrected*/ | |
1023 + (0<<26) // field legth polariry | |
1024 + (0<<27) // field identification polariry | |
1025 + (1<<28) // VIDRST detection mode | |
1026 + (0<<29) // VIDRST detection mode | |
1027 + (1<<30) // Horizontal counter preload | |
1028 + (1<<31) // Vertical counter preload | |
1029 ; | |
10743 | 1030 card->cregs.c2datactl = 0 // enable dither - propably not needed, we are already in YUV mode |
2344 | 1031 + (1<<1) // Y filter enable |
1032 + (1<<2) // CbCr filter enable | |
1033 + (0<<3) // subpicture enable (disabled) | |
1034 + (0<<4) // NTSC enable (disabled - PAL) | |
1035 + (0<<5) // C2 static subpicture enable (disabled) | |
1036 + (0<<6) // C2 subpicture offset division (disabled) | |
1037 + (1<<7) // 422 subformat selection ! | |
1038 /* + (0<<8) // 15 bpp high alpha | |
1039 + (0<<9) // 15 bpp high alpha | |
1040 + (0<<10) // 15 bpp high alpha | |
1041 + (0<<11) // 15 bpp high alpha | |
1042 + (0<<12) // 15 bpp high alpha | |
1043 + (0<<13) // 15 bpp high alpha | |
1044 + (0<<14) // 15 bpp high alpha | |
1045 + (0<<15) // 15 bpp high alpha | |
1046 + (0<<16) // 15 bpp low alpha | |
1047 + (0<<17) // 15 bpp low alpha | |
1048 + (0<<18) // 15 bpp low alpha | |
1049 + (0<<19) // 15 bpp low alpha | |
1050 + (0<<20) // 15 bpp low alpha | |
1051 + (0<<21) // 15 bpp low alpha | |
1052 + (0<<22) // 15 bpp low alpha | |
1053 + (0<<23) // 15 bpp low alpha | |
1054 + (0<<24) // static subpicture key | |
1055 + (0<<25) // static subpicture key | |
1056 + (0<<26) // static subpicture key | |
1057 + (0<<27) // static subpicture key | |
1058 + (0<<28) // static subpicture key | |
1059 */ ; | |
1060 break; | |
1061 | |
1062 default: | |
1063 printk(KERN_ERR "mga_vid: Unsupported pixel format: 0x%X\n",config->format); | |
1064 return -1; | |
1065 } | |
1066 | |
10743 | 1067 card->cregs.c2hparam = ( (hdispend - 8) << 16) | (htotal - 8); |
1068 card->cregs.c2hsync = ( (hsyncend - 8) << 16) | (hsyncstart - 8); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1069 |
10743 | 1070 card->cregs.c2misc=0 // CRTCV2 656 togg f0 |
2344 | 1071 +(0<<1) // CRTCV2 656 togg f0 |
1072 +(0<<2) // CRTCV2 656 togg f0 | |
1073 +(0<<4) // CRTCV2 656 togg f1 | |
1074 +(0<<5) // CRTCV2 656 togg f1 | |
1075 +(0<<6) // CRTCV2 656 togg f1 | |
1076 +(0<<8) // Hsync active high | |
1077 +(0<<9) // Vsync active high | |
1078 // 16-27 c2vlinecomp - nevim co tam dat | |
1079 ; | |
10743 | 1080 card->cregs.c2offset=(card->regs.bespitch << 1); |
2344 | 1081 |
10743 | 1082 card->cregs.c2pl2startadd0=card->regs.besa1corg; |
1083 // card->cregs.c2pl2startadd1=card->regs.besa2corg; | |
1084 card->cregs.c2pl3startadd0=card->regs.besa1c3org; | |
1085 // card->cregs.c2pl3startadd1=card->regs.besa2c3org; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1086 |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1087 card->cregs.c2preload=(vsyncstart << 16) | (hsyncstart); // from |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1088 |
10743 | 1089 card->cregs.c2spicstartadd0=0; // not used |
1090 // card->cregs.c2spicstartadd1=0; // not used | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1091 |
10743 | 1092 card->cregs.c2startadd0=card->regs.besa1org; |
1093 // card->cregs.c2startadd1=card->regs.besa2org; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1094 |
10743 | 1095 card->cregs.c2subpiclut=0; //not used |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1096 |
10743 | 1097 card->cregs.c2vparam = ( (vdispend - 1) << 16) | (vtotal - 1); |
1098 card->cregs.c2vsync = ( (vsyncend - 1) << 16) | (vsyncstart - 1); | |
2344 | 1099 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1100 |
2344 | 1101 #endif |
1102 | |
10743 | 1103 mga_vid_write_regs(card, 0); |
1 | 1104 return 0; |
1105 } | |
1106 | |
68 | 1107 #ifdef MGA_ALLOW_IRQ |
1108 | |
10743 | 1109 static void enable_irq(mga_card_t * card){ |
48 | 1110 long int cc; |
1111 | |
10743 | 1112 cc = readl(card->mmio_base + IEN); |
63 | 1113 // printk(KERN_ALERT "*** !!! IRQREG = %d\n", (int)(cc&0xff)); |
48 | 1114 |
10743 | 1115 writeb(0x11, card->mmio_base + CRTCX); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1116 |
10743 | 1117 writeb(0x20, card->mmio_base + CRTCD); /* clear 0, enable off */ |
1118 writeb(0x00, card->mmio_base + CRTCD); /* enable on */ | |
1119 writeb(0x10, card->mmio_base + CRTCD); /* clear = 1 */ | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1120 |
10743 | 1121 writel(card->regs.besglobctl , card->mmio_base + BESGLOBCTL); |
48 | 1122 |
1123 } | |
1124 | |
10743 | 1125 static void disable_irq(mga_card_t * card){ |
48 | 1126 |
10743 | 1127 writeb(0x11, card->mmio_base + CRTCX); |
1128 writeb(0x20, card->mmio_base + CRTCD); /* clear 0, enable off */ | |
48 | 1129 |
1130 } | |
1131 | |
5884 | 1132 static void mga_handle_irq(int irq, void *dev_id, struct pt_regs *pregs) { |
48 | 1133 // static int frame=0; |
854
76ca00724e12
gcc warnings fixed - patch by Aelius aelius@wish.net
arpi_esp
parents:
662
diff
changeset
|
1134 // static int counter=0; |
48 | 1135 long int cc; |
10743 | 1136 mga_card_t * card = dev_id; |
48 | 1137 |
68 | 1138 // printk(KERN_DEBUG "vcount = %d\n",readl(mga_mmio_base + VCOUNT)); |
1139 | |
48 | 1140 //printk("mga_interrupt #%d\n", irq); |
1141 | |
10743 | 1142 // check whether the interrupt is really for us (irq sharing) |
48 | 1143 if ( irq != -1 ) { |
10743 | 1144 cc = readl(card->mmio_base + STATUS); |
48 | 1145 if ( ! (cc & 0x10) ) return; /* vsyncpen */ |
1146 // debug_irqcnt++; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1147 } |
48 | 1148 |
1149 // if ( debug_irqignore ) { | |
1150 // debug_irqignore = 0; | |
1151 | |
1152 // frame=(frame+1)&1; | |
10743 | 1153 card->regs.besctl = (card->regs.besctl & ~0x07000000) + (card->next_frame << 25); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1154 writel( card->regs.besctl, card->mmio_base + BESCTL ); |
2344 | 1155 |
1156 #ifdef CRTC2 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1157 // sem pridat vyber obrazku !!!! |
23734 | 1158 // i han echt kei ahnig was das obe heisse söll |
10743 | 1159 crtc2_frame_sel(card->next_frame); |
2344 | 1160 #endif |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1161 |
48 | 1162 #if 0 |
1163 ++counter; | |
1164 if(!(counter&63)){ | |
1165 printk("mga irq counter = %d\n",counter); | |
1166 } | |
1167 #endif | |
1168 | |
1169 // } else { | |
1170 // debug_irqignore = 1; | |
1171 // } | |
1172 | |
1173 if ( irq != -1 ) { | |
10743 | 1174 writeb( 0x11, card->mmio_base + CRTCX); |
1175 writeb( 0, card->mmio_base + CRTCD ); | |
1176 writeb( 0x10, card->mmio_base + CRTCD ); | |
48 | 1177 } |
1178 | |
10743 | 1179 // writel( card->regs.besglobctl, card->mmio_base + BESGLOBCTL); |
48 | 1180 |
1181 | |
1182 return; | |
1183 | |
1184 } | |
1185 | |
68 | 1186 #endif |
1 | 1187 |
1188 static int mga_vid_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg) | |
1189 { | |
10743 | 1190 int frame, result; |
5013
52c008dd6e93
min() moved out of #if, applied brightness/contrast patch by Brian J. Murrell
arpi
parents:
4728
diff
changeset
|
1191 uint32_t tmp; |
10743 | 1192 mga_card_t * card = (mga_card_t *) file->private_data; |
1 | 1193 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1194 switch(cmd) |
1 | 1195 { |
27026
9e24bdf7bf97
add MGA_VID_GET_VERSION ioctl to old mga_vid driver for compatibility with "new" mplayer
attila
parents:
26759
diff
changeset
|
1196 case MGA_VID_GET_VERSION: |
9e24bdf7bf97
add MGA_VID_GET_VERSION ioctl to old mga_vid driver for compatibility with "new" mplayer
attila
parents:
26759
diff
changeset
|
1197 tmp = MGA_VID_VERSION; |
9e24bdf7bf97
add MGA_VID_GET_VERSION ioctl to old mga_vid driver for compatibility with "new" mplayer
attila
parents:
26759
diff
changeset
|
1198 if (copy_to_user((uint32_t *) arg, &tmp, sizeof(uint32_t))) { |
9e24bdf7bf97
add MGA_VID_GET_VERSION ioctl to old mga_vid driver for compatibility with "new" mplayer
attila
parents:
26759
diff
changeset
|
1199 printk(KERN_ERR "mga_vid: failed copy %p to userspace %p\n", &tmp, (uint32_t *) arg); |
29717
afc8b80eb027
cosmetics: Remove some pointless parentheses from return calls.
diego
parents:
29263
diff
changeset
|
1200 return -EFAULT; |
27026
9e24bdf7bf97
add MGA_VID_GET_VERSION ioctl to old mga_vid driver for compatibility with "new" mplayer
attila
parents:
26759
diff
changeset
|
1201 } |
9e24bdf7bf97
add MGA_VID_GET_VERSION ioctl to old mga_vid driver for compatibility with "new" mplayer
attila
parents:
26759
diff
changeset
|
1202 break; |
9e24bdf7bf97
add MGA_VID_GET_VERSION ioctl to old mga_vid driver for compatibility with "new" mplayer
attila
parents:
26759
diff
changeset
|
1203 |
1 | 1204 case MGA_VID_CONFIG: |
1205 //FIXME remove | |
10743 | 1206 // printk(KERN_DEBUG "mga_vid: vcount = %d\n",readl(card->mmio_base + VCOUNT)); |
5623 | 1207 #ifdef MP_DEBUG |
10743 | 1208 printk(KERN_DEBUG "mga_vid: mmio_base = %p\n",card->mmio_base); |
1209 printk(KERN_DEBUG "mga_vid: mem_base = %08x\n",card->mem_base); | |
1 | 1210 //FIXME remove |
1211 | |
61 | 1212 printk(KERN_DEBUG "mga_vid: Received configuration\n"); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1213 #endif |
1 | 1214 |
10743 | 1215 if(copy_from_user(&card->config,(mga_vid_config_t*) arg,sizeof(mga_vid_config_t))) |
1 | 1216 { |
61 | 1217 printk(KERN_ERR "mga_vid: failed copy from userspace\n"); |
26759
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26004
diff
changeset
|
1218 return -EFAULT; |
1 | 1219 } |
10743 | 1220 if(card->config.version != MGA_VID_VERSION){ |
1221 printk(KERN_ERR "mga_vid: incompatible version! driver: %X requested: %X\n",MGA_VID_VERSION,card->config.version); | |
26759
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26004
diff
changeset
|
1222 return -EFAULT; |
57 | 1223 } |
1224 | |
10743 | 1225 if(card->config.frame_size==0 || card->config.frame_size>1024*768*2){ |
1226 printk(KERN_ERR "mga_vid: illegal frame_size: %d\n",card->config.frame_size); | |
26759
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26004
diff
changeset
|
1227 return -EFAULT; |
57 | 1228 } |
1229 | |
10743 | 1230 if(card->config.num_frames<1 || card->config.num_frames>4){ |
1231 printk(KERN_ERR "mga_vid: illegal num_frames: %d\n",card->config.num_frames); | |
26759
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26004
diff
changeset
|
1232 return -EFAULT; |
57 | 1233 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1234 |
10743 | 1235 card->src_base = (card->ram_size * 0x100000 - card->config.num_frames * card->config.frame_size - card->top_reserved); |
1236 if(card->src_base<0){ | |
61 | 1237 printk(KERN_ERR "mga_vid: not enough memory for frames!\n"); |
26759
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26004
diff
changeset
|
1238 return -EFAULT; |
57 | 1239 } |
10743 | 1240 card->src_base &= (~0xFFFF); // 64k boundary |
5623 | 1241 #ifdef MP_DEBUG |
10743 | 1242 printk(KERN_DEBUG "mga YUV buffer base: 0x%X\n", card->src_base); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1243 #endif |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1244 |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1245 if (card->is_g400) |
10743 | 1246 card->config.card_type = MGA_G400; |
1 | 1247 else |
10743 | 1248 card->config.card_type = MGA_G200; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1249 |
10743 | 1250 card->config.ram_size = card->ram_size; |
1 | 1251 |
10743 | 1252 if (copy_to_user((mga_vid_config_t *) arg, &card->config, sizeof(mga_vid_config_t))) |
1 | 1253 { |
61 | 1254 printk(KERN_ERR "mga_vid: failed copy to userspace\n"); |
26759
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26004
diff
changeset
|
1255 return -EFAULT; |
1 | 1256 } |
10743 | 1257 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1258 result = mga_vid_set_config(card); |
10743 | 1259 if(!result) card->configured=1; |
1260 return result; | |
1 | 1261 break; |
1262 | |
1263 case MGA_VID_ON: | |
5623 | 1264 #ifdef MP_DEBUG |
61 | 1265 printk(KERN_DEBUG "mga_vid: Video ON\n"); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1266 #endif |
10743 | 1267 card->vid_src_ready = 1; |
1268 if(card->vid_overlay_on) | |
1 | 1269 { |
10743 | 1270 card->regs.besctl |= 1; |
1271 mga_vid_write_regs(card, 0); | |
1 | 1272 } |
68 | 1273 #ifdef MGA_ALLOW_IRQ |
10743 | 1274 if ( card->irq != -1 ) enable_irq(card); |
68 | 1275 #endif |
10743 | 1276 card->next_frame=0; |
1 | 1277 break; |
1278 | |
1279 case MGA_VID_OFF: | |
5623 | 1280 #ifdef MP_DEBUG |
94
fbd99740af99
printk() message for video off when releasing mga without ioctl()
lgb
parents:
93
diff
changeset
|
1281 printk(KERN_DEBUG "mga_vid: Video OFF (ioctl)\n"); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1282 #endif |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1283 card->vid_src_ready = 0; |
68 | 1284 #ifdef MGA_ALLOW_IRQ |
10743 | 1285 if ( card->irq != -1 ) disable_irq(card); |
68 | 1286 #endif |
10743 | 1287 card->regs.besctl &= ~1; |
1288 card->regs.besglobctl &= ~(1<<6); // UYVY format selected | |
1289 mga_vid_write_regs(card, 0); | |
1 | 1290 break; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1291 |
1 | 1292 case MGA_VID_FSEL: |
1293 if(copy_from_user(&frame,(int *) arg,sizeof(int))) | |
1294 { | |
61 | 1295 printk(KERN_ERR "mga_vid: FSEL failed copy from userspace\n"); |
26759
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26004
diff
changeset
|
1296 return -EFAULT; |
1 | 1297 } |
1298 | |
10743 | 1299 mga_vid_frame_sel(card, frame); |
1 | 1300 break; |
1301 | |
5013
52c008dd6e93
min() moved out of #if, applied brightness/contrast patch by Brian J. Murrell
arpi
parents:
4728
diff
changeset
|
1302 case MGA_VID_GET_LUMA: |
10743 | 1303 //tmp = card->regs.beslumactl; |
6798 | 1304 //tmp = (tmp&0xFFFF0000) | (((tmp&0xFFFF) - 0x80)&0xFFFF); |
10743 | 1305 tmp = (card->brightness << 16) | (card->contrast&0xFFFF); |
6798 | 1306 |
5013
52c008dd6e93
min() moved out of #if, applied brightness/contrast patch by Brian J. Murrell
arpi
parents:
4728
diff
changeset
|
1307 if (copy_to_user((uint32_t *) arg, &tmp, sizeof(uint32_t))) |
52c008dd6e93
min() moved out of #if, applied brightness/contrast patch by Brian J. Murrell
arpi
parents:
4728
diff
changeset
|
1308 { |
52c008dd6e93
min() moved out of #if, applied brightness/contrast patch by Brian J. Murrell
arpi
parents:
4728
diff
changeset
|
1309 printk(KERN_ERR "mga_vid: failed copy %p to userspace %p\n", |
52c008dd6e93
min() moved out of #if, applied brightness/contrast patch by Brian J. Murrell
arpi
parents:
4728
diff
changeset
|
1310 &tmp, (uint32_t *) arg); |
26759
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26004
diff
changeset
|
1311 return -EFAULT; |
5013
52c008dd6e93
min() moved out of #if, applied brightness/contrast patch by Brian J. Murrell
arpi
parents:
4728
diff
changeset
|
1312 } |
52c008dd6e93
min() moved out of #if, applied brightness/contrast patch by Brian J. Murrell
arpi
parents:
4728
diff
changeset
|
1313 break; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1314 |
5013
52c008dd6e93
min() moved out of #if, applied brightness/contrast patch by Brian J. Murrell
arpi
parents:
4728
diff
changeset
|
1315 case MGA_VID_SET_LUMA: |
52c008dd6e93
min() moved out of #if, applied brightness/contrast patch by Brian J. Murrell
arpi
parents:
4728
diff
changeset
|
1316 tmp = arg; |
10743 | 1317 card->brightness=tmp>>16; card->contrast=tmp&0xFFFF; |
1318 //card->regs.beslumactl = (tmp&0xFFFF0000) | ((tmp + 0x80)&0xFFFF); | |
1319 card->regs.beslumactl = (card->brightness << 16) | ((card->contrast+0x80)&0xFFFF); | |
1320 mga_vid_write_regs(card, 0); | |
5013
52c008dd6e93
min() moved out of #if, applied brightness/contrast patch by Brian J. Murrell
arpi
parents:
4728
diff
changeset
|
1321 break; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1322 |
1 | 1323 default: |
61 | 1324 printk(KERN_ERR "mga_vid: Invalid ioctl\n"); |
26759
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26004
diff
changeset
|
1325 return -EINVAL; |
1 | 1326 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1327 |
1 | 1328 return 0; |
1329 } | |
1330 | |
10743 | 1331 static void cards_init(mga_card_t * card, struct pci_dev * dev, int card_number, int is_g400); |
1 | 1332 |
10743 | 1333 // returns the number of found cards |
1 | 1334 static int mga_vid_find_card(void) |
1335 { | |
1336 struct pci_dev *dev = NULL; | |
9631
d0b7a6b898c8
multiple mga device support by Hans-Andreas Engel <engel@node.ch>
alex
parents:
9518
diff
changeset
|
1337 char *mga_dev_name; |
10743 | 1338 mga_card_t * card; |
1 | 1339 |
9631
d0b7a6b898c8
multiple mga device support by Hans-Andreas Engel <engel@node.ch>
alex
parents:
9518
diff
changeset
|
1340 while((dev = pci_find_device(PCI_VENDOR_ID_MATROX, PCI_ANY_ID, dev))) |
1989 | 1341 { |
9631
d0b7a6b898c8
multiple mga device support by Hans-Andreas Engel <engel@node.ch>
alex
parents:
9518
diff
changeset
|
1342 mga_dev_name = ""; |
10743 | 1343 mga_cards_num++; |
1344 if(mga_cards_num == MGA_MAX_CARDS) | |
1345 { | |
1346 printk(KERN_WARNING "mga_vid: Trying to initialize more than %d cards\n",MGA_MAX_CARDS); | |
1347 mga_cards_num--; | |
1348 break; | |
1349 } | |
1350 | |
1351 card = kmalloc(sizeof(mga_card_t), GFP_KERNEL); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1352 if(!card) |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1353 { |
10743 | 1354 printk(KERN_ERR "mga_vid: memory allocation failed\n"); |
1355 mga_cards_num--; | |
1356 break; | |
1357 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1358 |
10743 | 1359 mga_cards[mga_cards_num - 1] = card; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1360 |
9631
d0b7a6b898c8
multiple mga device support by Hans-Andreas Engel <engel@node.ch>
alex
parents:
9518
diff
changeset
|
1361 switch(dev->device) { |
d0b7a6b898c8
multiple mga device support by Hans-Andreas Engel <engel@node.ch>
alex
parents:
9518
diff
changeset
|
1362 case PCI_DEVICE_ID_MATROX_G550: |
d0b7a6b898c8
multiple mga device support by Hans-Andreas Engel <engel@node.ch>
alex
parents:
9518
diff
changeset
|
1363 mga_dev_name = "MGA G550"; |
10743 | 1364 printk(KERN_INFO "mga_vid: Found %s at %s [%s]\n", mga_dev_name, dev->slot_name, dev->name); |
1365 cards_init(card, dev, mga_cards_num - 1, 1); | |
9631
d0b7a6b898c8
multiple mga device support by Hans-Andreas Engel <engel@node.ch>
alex
parents:
9518
diff
changeset
|
1366 break; |
d0b7a6b898c8
multiple mga device support by Hans-Andreas Engel <engel@node.ch>
alex
parents:
9518
diff
changeset
|
1367 case PCI_DEVICE_ID_MATROX_G400: |
d0b7a6b898c8
multiple mga device support by Hans-Andreas Engel <engel@node.ch>
alex
parents:
9518
diff
changeset
|
1368 mga_dev_name = "MGA G400/G450"; |
10743 | 1369 printk(KERN_INFO "mga_vid: Found %s at %s [%s]\n", mga_dev_name, dev->slot_name, dev->name); |
1370 cards_init(card, dev, mga_cards_num - 1, 1); | |
9631
d0b7a6b898c8
multiple mga device support by Hans-Andreas Engel <engel@node.ch>
alex
parents:
9518
diff
changeset
|
1371 break; |
d0b7a6b898c8
multiple mga device support by Hans-Andreas Engel <engel@node.ch>
alex
parents:
9518
diff
changeset
|
1372 case PCI_DEVICE_ID_MATROX_G200_AGP: |
d0b7a6b898c8
multiple mga device support by Hans-Andreas Engel <engel@node.ch>
alex
parents:
9518
diff
changeset
|
1373 mga_dev_name = "MGA G200 AGP"; |
10743 | 1374 printk(KERN_INFO "mga_vid: Found %s at %s [%s]\n", mga_dev_name, dev->slot_name, dev->name); |
1375 cards_init(card, dev, mga_cards_num - 1, 0); | |
9631
d0b7a6b898c8
multiple mga device support by Hans-Andreas Engel <engel@node.ch>
alex
parents:
9518
diff
changeset
|
1376 break; |
d0b7a6b898c8
multiple mga device support by Hans-Andreas Engel <engel@node.ch>
alex
parents:
9518
diff
changeset
|
1377 case PCI_DEVICE_ID_MATROX_G200_PCI: |
d0b7a6b898c8
multiple mga device support by Hans-Andreas Engel <engel@node.ch>
alex
parents:
9518
diff
changeset
|
1378 mga_dev_name = "MGA G200"; |
10743 | 1379 printk(KERN_INFO "mga_vid: Found %s at %s [%s]\n", mga_dev_name, dev->slot_name, dev->name); |
1380 cards_init(card, dev, mga_cards_num - 1, 0); | |
9631
d0b7a6b898c8
multiple mga device support by Hans-Andreas Engel <engel@node.ch>
alex
parents:
9518
diff
changeset
|
1381 break; |
d0b7a6b898c8
multiple mga device support by Hans-Andreas Engel <engel@node.ch>
alex
parents:
9518
diff
changeset
|
1382 default: |
10743 | 1383 mga_cards_num--; |
9631
d0b7a6b898c8
multiple mga device support by Hans-Andreas Engel <engel@node.ch>
alex
parents:
9518
diff
changeset
|
1384 printk(KERN_INFO "mga_vid: ignoring matrox device (%d) at %s [%s]\n", dev->device, dev->slot_name, dev->name); |
d0b7a6b898c8
multiple mga device support by Hans-Andreas Engel <engel@node.ch>
alex
parents:
9518
diff
changeset
|
1385 break; |
d0b7a6b898c8
multiple mga device support by Hans-Andreas Engel <engel@node.ch>
alex
parents:
9518
diff
changeset
|
1386 } |
1 | 1387 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1388 |
10743 | 1389 if(!mga_cards_num) |
1 | 1390 { |
10743 | 1391 printk(KERN_ERR "mga_vid: No supported cards found\n"); |
91 | 1392 } else { |
10743 | 1393 printk(KERN_INFO "mga_vid: %d supported cards found\n", mga_cards_num); |
48 | 1394 } |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1395 |
10743 | 1396 return mga_cards_num; |
1 | 1397 } |
1398 | |
10743 | 1399 static void mga_param_buff_fill( mga_card_t * card ) |
4484 | 1400 { |
1401 unsigned len; | |
10743 | 1402 unsigned size = card->param_buff_size; |
1403 char * buf = card->param_buff; | |
4484 | 1404 len = 0; |
10743 | 1405 len += snprintf(&buf[len],size-len,"Interface version: %04X\n",MGA_VID_VERSION); |
1406 len += snprintf(&buf[len],size-len,"Memory: %x:%dM\n",card->mem_base,(unsigned int) card->ram_size); | |
1407 len += snprintf(&buf[len],size-len,"MMIO: %p\n",card->mmio_base); | |
1408 len += snprintf(&buf[len],size-len,"Configurable stuff:\n"); | |
1409 len += snprintf(&buf[len],size-len,"~~~~~~~~~~~~~~~~~~~\n"); | |
1410 len += snprintf(&buf[len],size-len,PARAM_BRIGHTNESS"%d\n",card->brightness); | |
1411 len += snprintf(&buf[len],size-len,PARAM_CONTRAST"%d\n",card->contrast); | |
1412 len += snprintf(&buf[len],size-len,PARAM_BLACKIE"%s\n",card->regs.blackie?"on":"off"); | |
1413 card->param_buff_len = len; | |
4527 | 1414 // check boundaries of mga_param_buff before writing to it!!! |
4484 | 1415 } |
1416 | |
1 | 1417 |
1418 static ssize_t mga_vid_read(struct file *file, char *buf, size_t count, loff_t *ppos) | |
1419 { | |
4484 | 1420 uint32_t size; |
10743 | 1421 mga_card_t * card = (mga_card_t *) file->private_data; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1422 |
10743 | 1423 if(!card->param_buff) return -ESPIPE; |
1424 if(!(*ppos)) mga_param_buff_fill(card); | |
1425 if(*ppos >= card->param_buff_len) return 0; | |
1426 size = min(count,card->param_buff_len-(uint32_t)(*ppos)); | |
1427 memcpy(buf,card->param_buff,size); | |
4484 | 1428 *ppos += size; |
1429 return size; | |
1 | 1430 } |
1431 | |
1432 static ssize_t mga_vid_write(struct file *file, const char *buf, size_t count, loff_t *ppos) | |
1433 { | |
10743 | 1434 mga_card_t * card = (mga_card_t *) file->private_data; |
1435 | |
4483
fb4b914eab8a
framework for settings modifications like in radeon_vid ( /dev/mga_vid can
eyck
parents:
3959
diff
changeset
|
1436 if(memcmp(buf,PARAM_BRIGHTNESS,min(count,strlen(PARAM_BRIGHTNESS))) == 0) |
fb4b914eab8a
framework for settings modifications like in radeon_vid ( /dev/mga_vid can
eyck
parents:
3959
diff
changeset
|
1437 { |
fb4b914eab8a
framework for settings modifications like in radeon_vid ( /dev/mga_vid can
eyck
parents:
3959
diff
changeset
|
1438 short brightness; |
fb4b914eab8a
framework for settings modifications like in radeon_vid ( /dev/mga_vid can
eyck
parents:
3959
diff
changeset
|
1439 brightness=simple_strtol(&buf[strlen(PARAM_BRIGHTNESS)],NULL,10); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1440 if (brightness>127 || brightness<-128) { brightness=0;} |
4483
fb4b914eab8a
framework for settings modifications like in radeon_vid ( /dev/mga_vid can
eyck
parents:
3959
diff
changeset
|
1441 // printk(KERN_DEBUG "mga_vid: brightness modified ( %d ) \n",brightness); |
10743 | 1442 card->brightness=brightness; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1443 } else |
4487
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
1444 if(memcmp(buf,PARAM_CONTRAST,min(count,strlen(PARAM_CONTRAST))) == 0) |
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
1445 { |
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
1446 short contrast; |
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
1447 contrast=simple_strtol(&buf[strlen(PARAM_CONTRAST)],NULL,10); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1448 if (contrast>127 || contrast<-128) { contrast=0;} |
4487
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
1449 // printk(KERN_DEBUG "mga_vid: contrast modified ( %d ) \n",contrast); |
10743 | 1450 card->contrast=contrast; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1451 } else |
4487
e642ff2d5c6d
Attila's Linux 2.2 patch, and contrast control applied
eyck
parents:
4484
diff
changeset
|
1452 |
4483
fb4b914eab8a
framework for settings modifications like in radeon_vid ( /dev/mga_vid can
eyck
parents:
3959
diff
changeset
|
1453 if(memcmp(buf,PARAM_BLACKIE,min(count,strlen(PARAM_BLACKIE))) == 0) |
fb4b914eab8a
framework for settings modifications like in radeon_vid ( /dev/mga_vid can
eyck
parents:
3959
diff
changeset
|
1454 { |
fb4b914eab8a
framework for settings modifications like in radeon_vid ( /dev/mga_vid can
eyck
parents:
3959
diff
changeset
|
1455 short blackie; |
fb4b914eab8a
framework for settings modifications like in radeon_vid ( /dev/mga_vid can
eyck
parents:
3959
diff
changeset
|
1456 blackie=simple_strtol(&buf[strlen(PARAM_BLACKIE)],NULL,10); |
fb4b914eab8a
framework for settings modifications like in radeon_vid ( /dev/mga_vid can
eyck
parents:
3959
diff
changeset
|
1457 // printk(KERN_DEBUG "mga_vid: shadow mode: ( %d ) \n",blackie); |
10743 | 1458 card->regs.blackie=(blackie>0)?1:0; |
4483
fb4b914eab8a
framework for settings modifications like in radeon_vid ( /dev/mga_vid can
eyck
parents:
3959
diff
changeset
|
1459 } else count = -EIO; |
fb4b914eab8a
framework for settings modifications like in radeon_vid ( /dev/mga_vid can
eyck
parents:
3959
diff
changeset
|
1460 // TODO: reset settings |
fb4b914eab8a
framework for settings modifications like in radeon_vid ( /dev/mga_vid can
eyck
parents:
3959
diff
changeset
|
1461 return count; |
1 | 1462 } |
1463 | |
1464 static int mga_vid_mmap(struct file *file, struct vm_area_struct *vma) | |
1465 { | |
10743 | 1466 mga_card_t * card = (mga_card_t *) file->private_data; |
1 | 1467 |
5623 | 1468 #ifdef MP_DEBUG |
61 | 1469 printk(KERN_DEBUG "mga_vid: mapping video memory into userspace\n"); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1470 #endif |
10743 | 1471 |
1472 if(!card->configured) | |
1473 { | |
1474 printk(KERN_ERR "mga_vid: card is not configured, cannot mmap\n"); | |
26759
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26004
diff
changeset
|
1475 return -EAGAIN; |
10743 | 1476 } |
1477 | |
1478 if(remap_page_range(vma->vm_start, card->mem_base + card->src_base, | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1479 vma->vm_end - vma->vm_start, vma->vm_page_prot)) |
1 | 1480 { |
63 | 1481 printk(KERN_ERR "mga_vid: error mapping video memory\n"); |
26759
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26004
diff
changeset
|
1482 return -EAGAIN; |
1 | 1483 } |
1484 | |
26759
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26004
diff
changeset
|
1485 return 0; |
1 | 1486 } |
1487 | |
1488 static int mga_vid_release(struct inode *inode, struct file *file) | |
1489 { | |
10743 | 1490 mga_card_t * card; |
1491 | |
1 | 1492 //Close the window just in case |
5623 | 1493 #ifdef MP_DEBUG |
94
fbd99740af99
printk() message for video off when releasing mga without ioctl()
lgb
parents:
93
diff
changeset
|
1494 printk(KERN_DEBUG "mga_vid: Video OFF (release)\n"); |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1495 #endif |
94
fbd99740af99
printk() message for video off when releasing mga without ioctl()
lgb
parents:
93
diff
changeset
|
1496 |
10743 | 1497 card = (mga_card_t *) file->private_data; |
1498 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1499 card->vid_src_ready = 0; |
10743 | 1500 card->regs.besctl &= ~1; |
1501 card->regs.besglobctl &= ~(1<<6); // UYVY format selected | |
1502 // card->config.colkey_on=0; //!!! | |
1503 mga_vid_write_regs(card, 1); | |
1504 card->vid_in_use = 0; | |
1 | 1505 |
93 | 1506 MOD_DEC_USE_COUNT; |
1 | 1507 return 0; |
1508 } | |
1509 | |
1510 static long long mga_vid_lseek(struct file *file, long long offset, int origin) | |
1511 { | |
1512 return -ESPIPE; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1513 } |
1 | 1514 |
1515 static int mga_vid_open(struct inode *inode, struct file *file) | |
1516 { | |
10743 | 1517 mga_card_t * card; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1518 |
1 | 1519 int minor = MINOR(inode->i_rdev); |
1520 | |
10743 | 1521 if(!file->private_data) |
1522 { | |
1523 // we are not using devfs, use the minor | |
1524 // number to specify the card we are using | |
1525 | |
11000 | 1526 // we don't have that many cards |
10743 | 1527 if(minor >= mga_cards_num) |
26759
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26004
diff
changeset
|
1528 return -ENXIO; |
1 | 1529 |
10743 | 1530 file->private_data = mga_cards[minor]; |
1531 #ifdef MP_DEBUG | |
1532 printk(KERN_DEBUG "mga_vid: Not using devfs\n"); | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1533 #endif |
10743 | 1534 } |
1535 #ifdef MP_DEBUG | |
1536 else { | |
1537 printk(KERN_DEBUG "mga_vid: Using devfs\n"); | |
1538 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1539 #endif |
10743 | 1540 |
1541 card = (mga_card_t *) file->private_data; | |
1542 | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1543 if(card->vid_in_use == 1) |
26759
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26004
diff
changeset
|
1544 return -EBUSY; |
1 | 1545 |
10743 | 1546 card->vid_in_use = 1; |
93 | 1547 MOD_INC_USE_COUNT; |
26759
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26004
diff
changeset
|
1548 return 0; |
1 | 1549 } |
1550 | |
1551 #if LINUX_VERSION_CODE >= 0x020400 | |
1552 static struct file_operations mga_vid_fops = | |
1553 { | |
1554 llseek: mga_vid_lseek, | |
1555 read: mga_vid_read, | |
1556 write: mga_vid_write, | |
1557 ioctl: mga_vid_ioctl, | |
1558 mmap: mga_vid_mmap, | |
1559 open: mga_vid_open, | |
1560 release: mga_vid_release | |
1561 }; | |
1562 #else | |
1563 static struct file_operations mga_vid_fops = | |
1564 { | |
1565 mga_vid_lseek, | |
1566 mga_vid_read, | |
1567 mga_vid_write, | |
1568 NULL, | |
1569 NULL, | |
1570 mga_vid_ioctl, | |
1571 mga_vid_mmap, | |
1572 mga_vid_open, | |
1573 NULL, | |
1574 mga_vid_release | |
1575 }; | |
1576 #endif | |
1577 | |
10743 | 1578 static void cards_init(mga_card_t * card, struct pci_dev * dev, int card_number, int is_g400) |
1579 { | |
1580 unsigned int card_option; | |
1581 // temp buffer for device filename creation used only by devfs | |
1582 #ifdef CONFIG_DEVFS_FS | |
1583 char buffer[16]; | |
1584 #endif | |
1585 | |
1586 memset(card,0,sizeof(mga_card_t)); | |
1587 card->irq = -1; | |
1588 | |
1589 card->pci_dev = dev; | |
1590 card->irq = dev->irq; | |
1591 card->is_g400 = is_g400; | |
1592 | |
1593 card->param_buff = kmalloc(PARAM_BUFF_SIZE,GFP_KERNEL); | |
1594 if(card->param_buff) card->param_buff_size = PARAM_BUFF_SIZE; | |
1595 | |
1596 card->brightness = mga_brightness[card_number]; | |
1597 card->contrast = mga_contrast[card_number]; | |
1598 card->top_reserved = mga_top_reserved[card_number]; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1599 |
10743 | 1600 #if LINUX_VERSION_CODE >= 0x020300 |
1601 card->mmio_base = ioremap_nocache(dev->resource[1].start,0x4000); | |
1602 card->mem_base = dev->resource[0].start; | |
1603 #else | |
1604 card->mmio_base = ioremap_nocache(dev->base_address[1] & PCI_BASE_ADDRESS_MEM_MASK,0x4000); | |
1605 card->mem_base = dev->base_address[0] & PCI_BASE_ADDRESS_MEM_MASK; | |
1606 #endif | |
1607 printk(KERN_INFO "mga_vid: MMIO at 0x%p IRQ: %d framebuffer: 0x%08X\n", card->mmio_base, card->irq, card->mem_base); | |
1608 | |
1609 pci_read_config_dword(dev, 0x40, &card_option); | |
1610 printk(KERN_INFO "mga_vid: OPTION word: 0x%08X mem: 0x%02X %s\n", card_option, | |
1611 (card_option>>10)&0x17, ((card_option>>14)&1)?"SGRAM":"SDRAM"); | |
1612 | |
1613 if (mga_ram_size[card_number]) { | |
1614 printk(KERN_INFO "mga_vid: RAMSIZE forced to %d MB\n", mga_ram_size[card_number]); | |
1615 card->ram_size=mga_ram_size[card_number]; | |
1616 } else { | |
1617 | |
1618 #ifdef MGA_MEMORY_SIZE | |
1619 card->ram_size = MGA_MEMORY_SIZE; | |
1620 printk(KERN_INFO "mga_vid: hard-coded RAMSIZE is %d MB\n", (unsigned int) card->ram_size); | |
1621 | |
1622 #else | |
1623 | |
1624 if (card->is_g400){ | |
1625 switch((card_option>>10)&0x17){ | |
1626 // SDRAM: | |
1627 case 0x00: | |
1628 case 0x04: card->ram_size = 16; break; | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1629 case 0x03: |
10743 | 1630 case 0x05: card->ram_size = 32; break; |
1631 // SGRAM: | |
1632 case 0x10: | |
1633 case 0x14: card->ram_size = 32; break; | |
1634 case 0x11: | |
1635 case 0x12: card->ram_size = 16; break; | |
1636 default: | |
1637 card->ram_size = 16; | |
1638 printk(KERN_INFO "mga_vid: Couldn't detect RAMSIZE, assuming 16MB!"); | |
1639 } | |
1640 /* Check for buggy 16MB cards reporting 32 MB */ | |
1641 if(card->ram_size != 16 && | |
1642 (dev->subsystem_device == PCI_SUBSYSTEM_ID_MATROX_G400_16MB_SDRAM || | |
1643 dev->subsystem_device == PCI_SUBSYSTEM_ID_MATROX_G400_16MB_SGRAM || | |
1644 dev->subsystem_device == PCI_SUBSYSTEM_ID_MATROX_G400_DH_16MB)) | |
1645 { | |
1646 printk(KERN_INFO "mga_vid: Detected 16MB card reporting %d MB RAMSIZE, overriding\n", card->ram_size); | |
1647 card->ram_size = 16; | |
1648 } | |
1649 }else{ | |
1650 switch((card_option>>10)&0x17){ | |
1651 // case 0x10: | |
1652 // case 0x13: card->ram_size = 8; break; | |
1653 default: card->ram_size = 8; | |
1654 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1655 } |
10743 | 1656 #if 0 |
1657 // printk("List resources -----------\n"); | |
1658 for(temp=0;temp<DEVICE_COUNT_RESOURCE;temp++){ | |
1659 struct resource *res=&dev->resource[temp]; | |
1660 if(res->flags){ | |
1661 int size=(1+res->end-res->start)>>20; | |
1662 printk(KERN_DEBUG "res %d: start: 0x%X end: 0x%X (%d MB) flags=0x%X\n",temp,res->start,res->end,size,res->flags); | |
1663 if(res->flags&(IORESOURCE_MEM|IORESOURCE_PREFETCH)){ | |
1664 if(size>card->ram_size && size<=64) card->ram_size=size; | |
1665 } | |
1666 } | |
1667 } | |
1668 #endif | |
1669 printk(KERN_INFO "mga_vid: detected RAMSIZE is %d MB\n", (unsigned int) card->ram_size); | |
1670 #endif | |
1671 } | |
1672 | |
1673 | |
1674 #ifdef MGA_ALLOW_IRQ | |
1675 if ( card->irq != -1 ) { | |
1676 int tmp = request_irq(card->irq, mga_handle_irq, SA_INTERRUPT | SA_SHIRQ, "Syncfb Time Base", card); | |
1677 if ( tmp ) { | |
1678 printk(KERN_INFO "syncfb (mga): cannot register irq %d (Err: %d)\n", card->irq, tmp); | |
1679 card->irq=-1; | |
1680 } else { | |
1681 printk(KERN_DEBUG "syncfb (mga): registered irq %d\n", card->irq); | |
1682 } | |
1683 } else { | |
1684 printk(KERN_INFO "syncfb (mga): No valid irq was found\n"); | |
1685 card->irq=-1; | |
1686 } | |
1687 #else | |
1688 printk(KERN_INFO "syncfb (mga): IRQ disabled in mga_vid.c\n"); | |
1689 card->irq=-1; | |
1690 #endif | |
1691 | |
1692 // register devfs, let the kernel give us major and minor numbers | |
1693 #ifdef CONFIG_DEVFS_FS | |
1694 snprintf(buffer, 16, "mga_vid%d", card_number); | |
1695 card->dev_handle = devfs_register(NULL, buffer, DEVFS_FL_AUTO_DEVNUM, | |
1696 0, 0, | |
1697 S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IFCHR, | |
1698 &mga_vid_fops, card); | |
1699 #endif | |
1700 | |
1701 } | |
1 | 1702 |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1703 /* |
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1704 * Main Initialization Function |
1 | 1705 */ |
1706 | |
1707 static int mga_vid_initialize(void) | |
1708 { | |
10743 | 1709 int i; |
1 | 1710 |
77 | 1711 // printk(KERN_INFO "Matrox MGA G200/G400 YUV Video interface v0.01 (c) Aaron Holtzman \n"); |
4594
ca6d74f72734
g550 memdetect fix - patch by Diego Biurrun <diego@biurrun.de>
arpi
parents:
4559
diff
changeset
|
1712 printk(KERN_INFO "Matrox MGA G200/G400/G450/G550 YUV Video interface v2.01 (c) Aaron Holtzman & A'rpi\n"); |
90 | 1713 |
10743 | 1714 for(i = 0; i < MGA_MAX_CARDS; i++) |
1715 { | |
1716 if (mga_ram_size[i]) { | |
1717 if (mga_ram_size[i]<4 || mga_ram_size[i]>64) { | |
1718 printk(KERN_ERR "mga_vid: invalid RAMSIZE: %d MB\n", mga_ram_size[i]); | |
1719 return -EINVAL; | |
1720 } | |
90 | 1721 } |
1722 } | |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
27027
diff
changeset
|
1723 |
9639
5422c37e6faa
selectable 'major', patch by Hans-Andreas Engel <engel@node.ch>
alex
parents:
9631
diff
changeset
|
1724 if(register_chrdev(major, "mga_vid", &mga_vid_fops)) |
1 | 1725 { |
9639
5422c37e6faa
selectable 'major', patch by Hans-Andreas Engel <engel@node.ch>
alex
parents:
9631
diff
changeset
|
1726 printk(KERN_ERR "mga_vid: unable to get major: %d\n", major); |
1 | 1727 return -EIO; |
1728 } | |
1729 | |
1730 if (!mga_vid_find_card()) | |
1731 { | |
61 | 1732 printk(KERN_ERR "mga_vid: no supported devices found\n"); |
9639
5422c37e6faa
selectable 'major', patch by Hans-Andreas Engel <engel@node.ch>
alex
parents:
9631
diff
changeset
|
1733 unregister_chrdev(major, "mga_vid"); |
1 | 1734 return -EINVAL; |
1735 } | |
10743 | 1736 #ifdef CONFIG_DEVFS_FS |
1737 else { | |
1738 // we assume that this always succeedes | |
1739 dev_handle = devfs_register(NULL, "mga_vid", DEVFS_FL_AUTO_DEVNUM, | |
1740 0,0, | |
1741 S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IFCHR, | |
1742 &mga_vid_fops, mga_cards[0]); | |
1743 } | |
1744 #endif | |
1745 | |
26759
8eff880f638c
cosmetics: Remove useless parentheses from return statements.
diego
parents:
26004
diff
changeset
|
1746 return 0; |
1 | 1747 } |
1748 | |
1749 int init_module(void) | |
1750 { | |
1751 return mga_vid_initialize(); | |
1752 } | |
1753 | |
1754 void cleanup_module(void) | |
1755 { | |
10743 | 1756 int i; |
1757 mga_card_t * card; | |
48 | 1758 |
10743 | 1759 for (i = 0; i < MGA_MAX_CARDS; i++) |
1760 { | |
1761 card = mga_cards[i]; | |
1762 if(card) | |
1763 { | |
68 | 1764 #ifdef MGA_ALLOW_IRQ |
10743 | 1765 if (card->irq != -1) |
1766 free_irq(card->irq, &(card->irq)); | |
68 | 1767 #endif |
48 | 1768 |
10743 | 1769 if(card->mmio_base) |
1770 iounmap(card->mmio_base); | |
1771 if(card->param_buff) | |
1772 kfree(card->param_buff); | |
1773 #ifdef CONFIG_DEVFS_FS | |
1774 if(card->dev_handle) devfs_unregister(card->dev_handle); | |
1775 #endif | |
1776 | |
1777 kfree(card); | |
1778 mga_cards[i]=NULL; | |
1779 } | |
1780 } | |
1 | 1781 |
1782 //FIXME turn off BES | |
63 | 1783 printk(KERN_INFO "mga_vid: Cleaning up module\n"); |
5653
39115273d236
Mark Schreiber sent link to Marcus Sundburg patch to mga_vid, which enables
eyck
parents:
5623
diff
changeset
|
1784 #ifdef CONFIG_DEVFS_FS |
6086 | 1785 if(dev_handle) devfs_unregister(dev_handle); |
5764 | 1786 #endif |
9639
5422c37e6faa
selectable 'major', patch by Hans-Andreas Engel <engel@node.ch>
alex
parents:
9631
diff
changeset
|
1787 unregister_chrdev(major, "mga_vid"); |
1 | 1788 } |