1bb0aa005SDavid du Colombier /* Portions of this file derived from work with the following copyright */
2bb0aa005SDavid du Colombier
3bb0aa005SDavid du Colombier /***************************************************************************\
4bb0aa005SDavid du Colombier |* *|
5bb0aa005SDavid du Colombier |* Copyright 2003 NVIDIA, Corporation. All rights reserved. *|
6bb0aa005SDavid du Colombier |* *|
7bb0aa005SDavid du Colombier |* NOTICE TO USER: The source code is copyrighted under U.S. and *|
8bb0aa005SDavid du Colombier |* international laws. Users and possessors of this source code are *|
9bb0aa005SDavid du Colombier |* hereby granted a nonexclusive, royalty-free copyright license to *|
10bb0aa005SDavid du Colombier |* use this code in individual and commercial software. *|
11bb0aa005SDavid du Colombier |* *|
12bb0aa005SDavid du Colombier |* Any use of this source code must include, in the user documenta- *|
13bb0aa005SDavid du Colombier |* tion and internal comments to the code, notices to the end user *|
14bb0aa005SDavid du Colombier |* as follows: *|
15bb0aa005SDavid du Colombier |* *|
16bb0aa005SDavid du Colombier |* Copyright 2003 NVIDIA, Corporation. All rights reserved. *|
17bb0aa005SDavid du Colombier |* *|
18bb0aa005SDavid du Colombier |* NVIDIA, CORPORATION MAKES NO REPRESENTATION ABOUT THE SUITABILITY *|
19bb0aa005SDavid du Colombier |* OF THIS SOURCE CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" *|
20bb0aa005SDavid du Colombier |* WITHOUT EXPRESS OR IMPLIED WARRANTY OF ANY KIND. NVIDIA, CORPOR- *|
21bb0aa005SDavid du Colombier |* ATION DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOURCE CODE, *|
22bb0aa005SDavid du Colombier |* INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGE- *|
23bb0aa005SDavid du Colombier |* MENT, AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL *|
24bb0aa005SDavid du Colombier |* NVIDIA, CORPORATION BE LIABLE FOR ANY SPECIAL, INDIRECT, INCI- *|
25bb0aa005SDavid du Colombier |* DENTAL, OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RE- *|
26bb0aa005SDavid du Colombier |* SULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION *|
27bb0aa005SDavid du Colombier |* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF *|
28bb0aa005SDavid du Colombier |* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOURCE CODE. *|
29bb0aa005SDavid du Colombier |* *|
30bb0aa005SDavid du Colombier |* U.S. Government End Users. This source code is a "commercial *|
31bb0aa005SDavid du Colombier |* item," as that term is defined at 48 C.F.R. 2.101 (OCT 1995), *|
32bb0aa005SDavid du Colombier |* consisting of "commercial computer software" and "commercial *|
33bb0aa005SDavid du Colombier |* computer software documentation," as such terms are used in *|
34bb0aa005SDavid du Colombier |* 48 C.F.R. 12.212 (SEPT 1995) and is provided to the U.S. Govern- *|
35bb0aa005SDavid du Colombier |* ment only as a commercial end item. Consistent with 48 C.F.R. *|
36bb0aa005SDavid du Colombier |* 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4 (JUNE 1995), *|
37bb0aa005SDavid du Colombier |* all U.S. Government End Users acquire the source code with only *|
38bb0aa005SDavid du Colombier |* those rights set forth herein. *|
39bb0aa005SDavid du Colombier |* *|
40bb0aa005SDavid du Colombier \***************************************************************************/
41bb0aa005SDavid du Colombier
429a747e4fSDavid du Colombier #include <u.h>
439a747e4fSDavid du Colombier #include <libc.h>
449a747e4fSDavid du Colombier #include <bio.h>
459a747e4fSDavid du Colombier
469a747e4fSDavid du Colombier #include "pci.h"
479a747e4fSDavid du Colombier #include "vga.h"
489a747e4fSDavid du Colombier
499a747e4fSDavid du Colombier typedef struct Nvidia Nvidia;
509a747e4fSDavid du Colombier struct Nvidia {
519a747e4fSDavid du Colombier Pcidev* pci;
52ffa04b9dSDavid du Colombier int did; /* not always == pci->did */
539a747e4fSDavid du Colombier
549a747e4fSDavid du Colombier int arch;
559a747e4fSDavid du Colombier int crystalfreq;
569a747e4fSDavid du Colombier
57ffa04b9dSDavid du Colombier ulong* mmio;
589a747e4fSDavid du Colombier ulong* pfb; /* mmio pointers */
599a747e4fSDavid du Colombier ulong* pramdac;
609a747e4fSDavid du Colombier ulong* pextdev;
619a747e4fSDavid du Colombier ulong* pmc;
629a747e4fSDavid du Colombier ulong* ptimer;
639a747e4fSDavid du Colombier ulong* pfifo;
649a747e4fSDavid du Colombier ulong* pramin;
659a747e4fSDavid du Colombier ulong* pgraph;
669a747e4fSDavid du Colombier ulong* fifo;
67bb0aa005SDavid du Colombier ulong* pcrtc;
689a747e4fSDavid du Colombier
69bb0aa005SDavid du Colombier ushort repaint0;
70bb0aa005SDavid du Colombier ushort repaint1;
71bb0aa005SDavid du Colombier ushort screen;
72bb0aa005SDavid du Colombier ushort pixel;
73bb0aa005SDavid du Colombier ushort horiz;
74bb0aa005SDavid du Colombier ushort cursor0;
75bb0aa005SDavid du Colombier ushort cursor1;
76bb0aa005SDavid du Colombier ushort cursor2;
77bb0aa005SDavid du Colombier ushort interlace;
78bb0aa005SDavid du Colombier ushort extra;
79bb0aa005SDavid du Colombier ushort crtcowner;
80ffa04b9dSDavid du Colombier ushort timingH;
81ffa04b9dSDavid du Colombier ushort timingV;
82bb0aa005SDavid du Colombier
839a747e4fSDavid du Colombier ulong vpll;
84bb0aa005SDavid du Colombier ulong vpllB;
85bb0aa005SDavid du Colombier ulong vpll2;
86bb0aa005SDavid du Colombier ulong vpll2B;
879a747e4fSDavid du Colombier ulong pllsel;
889a747e4fSDavid du Colombier ulong general;
893ff48bf5SDavid du Colombier ulong scale;
909a747e4fSDavid du Colombier ulong config;
91bb0aa005SDavid du Colombier ulong head;
92bb0aa005SDavid du Colombier ulong head2;
93bb0aa005SDavid du Colombier ulong cursorconfig;
94bb0aa005SDavid du Colombier ulong dither;
95ffa04b9dSDavid du Colombier ulong crtcsync;
96ffa04b9dSDavid du Colombier ulong displayV;
973ff48bf5SDavid du Colombier
983ff48bf5SDavid du Colombier int islcd;
9925f7656aSDavid du Colombier int fpwidth;
10025f7656aSDavid du Colombier int fpheight;
101bb0aa005SDavid du Colombier int twoheads;
102bb0aa005SDavid du Colombier int twostagepll;
103bb0aa005SDavid du Colombier int crtcnumber;
1049a747e4fSDavid du Colombier };
1059a747e4fSDavid du Colombier
1069a747e4fSDavid du Colombier static void
getpcixdid(Nvidia * nv)107ffa04b9dSDavid du Colombier getpcixdid(Nvidia* nv)
108ffa04b9dSDavid du Colombier {
109ffa04b9dSDavid du Colombier ulong pcicmd, pciid;
110ffa04b9dSDavid du Colombier ushort vid, did;
111ffa04b9dSDavid du Colombier
112ffa04b9dSDavid du Colombier pcicmd = pcicfgr32(nv->pci, PciPCR);
113ffa04b9dSDavid du Colombier pcicfgw32(nv->pci, PciPCR, pcicmd | 0x02);
114ffa04b9dSDavid du Colombier pciid = nv->mmio[0x1800/4];
115ffa04b9dSDavid du Colombier pcicfgw32(nv->pci, PciPCR, pcicmd);
116ffa04b9dSDavid du Colombier
117ffa04b9dSDavid du Colombier vid = pciid >> 16;
118ffa04b9dSDavid du Colombier did = (pciid & 0xFFFF);
119ffa04b9dSDavid du Colombier if (did == 0x10DE)
120ffa04b9dSDavid du Colombier did = vid;
121ffa04b9dSDavid du Colombier else if (vid == 0xDE10)
122ffa04b9dSDavid du Colombier did = ((pciid << 8) & 0xFF00) | ((pciid >> 8) & 0x00FF);
123ffa04b9dSDavid du Colombier
124ffa04b9dSDavid du Colombier nv->did = did;
125ffa04b9dSDavid du Colombier }
126ffa04b9dSDavid du Colombier
127ffa04b9dSDavid du Colombier static void
snarf(Vga * vga,Ctlr * ctlr)1289a747e4fSDavid du Colombier snarf(Vga* vga, Ctlr* ctlr)
1299a747e4fSDavid du Colombier {
1309a747e4fSDavid du Colombier Nvidia *nv;
1319a747e4fSDavid du Colombier Pcidev *p;
13274f16c81SDavid du Colombier ulong *mmio, tmp;
133bb0aa005SDavid du Colombier int implementation;
1349a747e4fSDavid du Colombier
1359a747e4fSDavid du Colombier if(vga->private == nil){
1369a747e4fSDavid du Colombier vga->private = alloc(sizeof(Nvidia));
1379a747e4fSDavid du Colombier nv = vga->private;
1385130c3f3SDavid du Colombier
1395130c3f3SDavid du Colombier p = nil;
1405130c3f3SDavid du Colombier while((p = pcimatch(p, 0x10DE, 0)) != nil){
1415130c3f3SDavid du Colombier if((p->ccru>>8) == 3)
1425130c3f3SDavid du Colombier break;
1435130c3f3SDavid du Colombier }
1445130c3f3SDavid du Colombier if(p == nil)
1459a747e4fSDavid du Colombier error("%s: not found\n", ctlr->name);
1469a747e4fSDavid du Colombier
147763f64bdSDavid du Colombier vgactlw("type", ctlr->name);
148763f64bdSDavid du Colombier
149763f64bdSDavid du Colombier mmio = segattach(0, "nvidiammio", 0, p->mem[0].size);
150763f64bdSDavid du Colombier if(mmio == (void*)-1)
151763f64bdSDavid du Colombier error("%s: segattach nvidiammio, size %d: %r\n",
152763f64bdSDavid du Colombier ctlr->name, p->mem[0].size);
153763f64bdSDavid du Colombier
154763f64bdSDavid du Colombier nv->pci = p;
155763f64bdSDavid du Colombier nv->mmio = mmio;
156763f64bdSDavid du Colombier
157763f64bdSDavid du Colombier nv->pfb = mmio+0x00100000/4;
158763f64bdSDavid du Colombier nv->pramdac = mmio+0x00680000/4;
159763f64bdSDavid du Colombier nv->pextdev = mmio+0x00101000/4;
1606c83e8f8SDavid du Colombier nv->pmc = mmio;
161763f64bdSDavid du Colombier nv->ptimer = mmio+0x00009000/4;
162763f64bdSDavid du Colombier nv->pfifo = mmio+0x00002000/4;
163763f64bdSDavid du Colombier nv->pramin = mmio+0x00710000/4;
164763f64bdSDavid du Colombier nv->pgraph = mmio+0x00400000/4;
165763f64bdSDavid du Colombier nv->fifo = mmio+0x00800000/4;
166763f64bdSDavid du Colombier nv->pcrtc= mmio+0x00600000/4;
167763f64bdSDavid du Colombier
168ffa04b9dSDavid du Colombier nv->did = p->did;
169ffa04b9dSDavid du Colombier if ((nv->did & 0xfff0) == 0x00f0)
170ffa04b9dSDavid du Colombier getpcixdid(nv);
171ffa04b9dSDavid du Colombier
172ffa04b9dSDavid du Colombier switch (nv->did & 0x0ff0) {
173ffa04b9dSDavid du Colombier case 0x0020:
174ffa04b9dSDavid du Colombier case 0x00A0:
175ffa04b9dSDavid du Colombier nv->arch = 4;
176ffa04b9dSDavid du Colombier break;
177ffa04b9dSDavid du Colombier case 0x0100: /* GeForce 256 */
178ffa04b9dSDavid du Colombier case 0x0110: /* GeForce2 MX */
179ffa04b9dSDavid du Colombier case 0x0150: /* GeForce2 */
180ffa04b9dSDavid du Colombier case 0x0170: /* GeForce4 MX */
181ffa04b9dSDavid du Colombier case 0x0180: /* GeForce4 MX (8x AGP) */
182ffa04b9dSDavid du Colombier case 0x01A0: /* nForce */
183ffa04b9dSDavid du Colombier case 0x01F0: /* nForce2 */
184ffa04b9dSDavid du Colombier nv->arch = 10;
185ffa04b9dSDavid du Colombier break;
186ffa04b9dSDavid du Colombier case 0x0200: /* GeForce3 */
187ffa04b9dSDavid du Colombier case 0x0250: /* GeForce4 Ti */
188ffa04b9dSDavid du Colombier case 0x0280: /* GeForce4 Ti (8x AGP) */
189ffa04b9dSDavid du Colombier nv->arch = 20;
190ffa04b9dSDavid du Colombier break;
191ffa04b9dSDavid du Colombier case 0x0300: /* GeForceFX 5800 */
192ffa04b9dSDavid du Colombier case 0x0310: /* GeForceFX 5600 */
193ffa04b9dSDavid du Colombier case 0x0320: /* GeForceFX 5200 */
194ffa04b9dSDavid du Colombier case 0x0330: /* GeForceFX 5900 */
195ffa04b9dSDavid du Colombier case 0x0340: /* GeForceFX 5700 */
196ffa04b9dSDavid du Colombier nv->arch = 30;
197ffa04b9dSDavid du Colombier break;
198ffa04b9dSDavid du Colombier case 0x0040:
1996c83e8f8SDavid du Colombier case 0x0090:
200ffa04b9dSDavid du Colombier case 0x00C0:
201ffa04b9dSDavid du Colombier case 0x0120:
202ffa04b9dSDavid du Colombier case 0x0130:
203a49e8198SDavid du Colombier case 0x0140: /* GeForce 6600 */
204ffa04b9dSDavid du Colombier case 0x0160:
205ffa04b9dSDavid du Colombier case 0x01D0:
206ffa04b9dSDavid du Colombier case 0x0210:
207c93608ccSDavid du Colombier case 0x0290: /* nvidia 7950 */
2086c83e8f8SDavid du Colombier case 0x0390:
209ffa04b9dSDavid du Colombier nv->arch = 40;
210ffa04b9dSDavid du Colombier break;
211ffa04b9dSDavid du Colombier default:
212c93608ccSDavid du Colombier error("%s: DID %#4.4ux - %#ux unsupported\n",
213c93608ccSDavid du Colombier ctlr->name, nv->did, (nv->did & 0x0ff0));
214ffa04b9dSDavid du Colombier break;
215ffa04b9dSDavid du Colombier }
2169a747e4fSDavid du Colombier }
2179a747e4fSDavid du Colombier nv = vga->private;
218ffa04b9dSDavid du Colombier implementation = nv->did & 0x0ff0;
2199a747e4fSDavid du Colombier
2209a747e4fSDavid du Colombier /*
2219a747e4fSDavid du Colombier * Unlock
2229a747e4fSDavid du Colombier */
2239a747e4fSDavid du Colombier vgaxo(Crtx, 0x1F, 0x57);
2249a747e4fSDavid du Colombier
2256c83e8f8SDavid du Colombier if (nv->pextdev[0] & 0x40)
2269a747e4fSDavid du Colombier nv->crystalfreq = RefFreq;
227bb0aa005SDavid du Colombier else
2289a747e4fSDavid du Colombier nv->crystalfreq = 13500000;
2299a747e4fSDavid du Colombier
230bb0aa005SDavid du Colombier if ((implementation == 0x0170) ||
231bb0aa005SDavid du Colombier (implementation == 0x0180) ||
232bb0aa005SDavid du Colombier (implementation == 0x01F0) ||
233bb0aa005SDavid du Colombier (implementation >= 0x0250))
2346c83e8f8SDavid du Colombier if(nv->pextdev[0] & (1 << 22))
23506f2054cSDavid du Colombier nv->crystalfreq = 27000000;
236bb0aa005SDavid du Colombier
237ffa04b9dSDavid du Colombier nv->twoheads = (nv->arch >= 10) &&
238ffa04b9dSDavid du Colombier (implementation != 0x0100) &&
239bb0aa005SDavid du Colombier (implementation != 0x0150) &&
240bb0aa005SDavid du Colombier (implementation != 0x01A0) &&
241bb0aa005SDavid du Colombier (implementation != 0x0200);
242bb0aa005SDavid du Colombier
243bb0aa005SDavid du Colombier nv->twostagepll = (implementation == 0x0310) ||
2446c83e8f8SDavid du Colombier (implementation == 0x0340) || (nv->arch >= 40);
245ffa04b9dSDavid du Colombier
246ffa04b9dSDavid du Colombier if (nv->twoheads && (implementation != 0x0110))
2476c83e8f8SDavid du Colombier if(nv->pextdev[0] & (1 << 22))
248ffa04b9dSDavid du Colombier nv->crystalfreq = 27000000;
249bb0aa005SDavid du Colombier
250bb0aa005SDavid du Colombier /* laptop chips */
251ffa04b9dSDavid du Colombier switch (nv->did & 0xffff) {
252bb0aa005SDavid du Colombier case 0x0112:
253bb0aa005SDavid du Colombier case 0x0174:
254bb0aa005SDavid du Colombier case 0x0175:
255bb0aa005SDavid du Colombier case 0x0176:
256bb0aa005SDavid du Colombier case 0x0177:
257bb0aa005SDavid du Colombier case 0x0179:
258bb0aa005SDavid du Colombier case 0x017C:
259bb0aa005SDavid du Colombier case 0x017D:
260bb0aa005SDavid du Colombier case 0x0186:
261bb0aa005SDavid du Colombier case 0x0187:
262ffa04b9dSDavid du Colombier case 0x0189: /* 0x0189 not in nwaples's driver */
263ffa04b9dSDavid du Colombier case 0x018D:
264bb0aa005SDavid du Colombier case 0x0286:
265bb0aa005SDavid du Colombier case 0x028C:
266bb0aa005SDavid du Colombier case 0x0316:
267bb0aa005SDavid du Colombier case 0x0317:
268bb0aa005SDavid du Colombier case 0x031A:
269bb0aa005SDavid du Colombier case 0x031B:
270bb0aa005SDavid du Colombier case 0x031C:
271bb0aa005SDavid du Colombier case 0x031D:
272bb0aa005SDavid du Colombier case 0x031E:
273bb0aa005SDavid du Colombier case 0x031F:
274bb0aa005SDavid du Colombier case 0x0324:
275bb0aa005SDavid du Colombier case 0x0325:
276bb0aa005SDavid du Colombier case 0x0328:
277bb0aa005SDavid du Colombier case 0x0329:
278bb0aa005SDavid du Colombier case 0x032C:
279bb0aa005SDavid du Colombier case 0x032D:
280bb0aa005SDavid du Colombier case 0x0347:
281bb0aa005SDavid du Colombier case 0x0348:
282bb0aa005SDavid du Colombier case 0x0349:
283bb0aa005SDavid du Colombier case 0x034B:
284bb0aa005SDavid du Colombier case 0x034C:
285ffa04b9dSDavid du Colombier case 0x0160:
286ffa04b9dSDavid du Colombier case 0x0166:
287ffa04b9dSDavid du Colombier case 0x00C8:
288ffa04b9dSDavid du Colombier case 0x00CC:
289ffa04b9dSDavid du Colombier case 0x0144:
290ffa04b9dSDavid du Colombier case 0x0146:
291ffa04b9dSDavid du Colombier case 0x0148:
292*588b1baaSDavid du Colombier case 0x01D7:
293bb0aa005SDavid du Colombier nv->islcd = 1;
29406f2054cSDavid du Colombier break;
295*588b1baaSDavid du Colombier default:
296*588b1baaSDavid du Colombier break;
29706f2054cSDavid du Colombier }
29806f2054cSDavid du Colombier
2999a747e4fSDavid du Colombier if (nv->arch == 4) {
3006c83e8f8SDavid du Colombier tmp = nv->pfb[0];
3016c83e8f8SDavid du Colombier if (tmp & 0x0100)
3026c83e8f8SDavid du Colombier vga->vmz = ((tmp >> 12) & 0x0F)*1024 + 2*1024;
3036c83e8f8SDavid du Colombier else {
3049a747e4fSDavid du Colombier tmp &= 0x03;
3059a747e4fSDavid du Colombier if (tmp)
3069a747e4fSDavid du Colombier vga->vmz = (1024*1024*2) << tmp;
3079a747e4fSDavid du Colombier else
3089a747e4fSDavid du Colombier vga->vmz = 1024*1024*32;
3099a747e4fSDavid du Colombier }
310ffa04b9dSDavid du Colombier } else if (implementation == 0x01a0) {
311ffa04b9dSDavid du Colombier p = nil;
312ffa04b9dSDavid du Colombier tmp = MKBUS(BusPCI, 0, 0, 1);
313ffa04b9dSDavid du Colombier while((p = pcimatch(p, 0x10DE, 0)) != nil){
314ffa04b9dSDavid du Colombier if(p->tbdf == tmp)
315ffa04b9dSDavid du Colombier break;
316ffa04b9dSDavid du Colombier }
317ffa04b9dSDavid du Colombier tmp = pcicfgr32(p, 0x7C);
318ffa04b9dSDavid du Colombier vga->vmz = (((tmp >> 6) & 31) + 1) * 1024 * 1024;
319ffa04b9dSDavid du Colombier } else if (implementation == 0x01f0) {
320ffa04b9dSDavid du Colombier p = nil;
321ffa04b9dSDavid du Colombier tmp = MKBUS(BusPCI, 0, 0, 1);
322ffa04b9dSDavid du Colombier while((p = pcimatch(p, 0x10DE, 0)) != nil){
323ffa04b9dSDavid du Colombier if(p->tbdf == tmp)
324ffa04b9dSDavid du Colombier break;
325ffa04b9dSDavid du Colombier }
326ffa04b9dSDavid du Colombier tmp = pcicfgr32(p, 0x84);
327ffa04b9dSDavid du Colombier vga->vmz = (((tmp >> 4) & 127) + 1) * 1024*1024;
328bb0aa005SDavid du Colombier } else {
329ffa04b9dSDavid du Colombier tmp = (nv->pfb[0x0000020C/4] >> 20) & 0xFFF;
3309a747e4fSDavid du Colombier if (tmp == 0)
3319a747e4fSDavid du Colombier tmp = 16;
3329a747e4fSDavid du Colombier vga->vmz = 1024*1024*tmp;
3339a747e4fSDavid du Colombier }
3349a747e4fSDavid du Colombier
335bb0aa005SDavid du Colombier nv->repaint0 = vgaxi(Crtx, 0x19);
336bb0aa005SDavid du Colombier nv->repaint1 = vgaxi(Crtx, 0x1A);
337bb0aa005SDavid du Colombier nv->screen = vgaxi(Crtx, 0x25);
338bb0aa005SDavid du Colombier nv->pixel = vgaxi(Crtx, 0x28);
339bb0aa005SDavid du Colombier nv->horiz = vgaxi(Crtx, 0x2D);
340bb0aa005SDavid du Colombier nv->cursor0 = vgaxi(Crtx, 0x30);
341bb0aa005SDavid du Colombier nv->cursor1 = vgaxi(Crtx, 0x31);
342bb0aa005SDavid du Colombier nv->cursor2 = vgaxi(Crtx, 0x2F);
343bb0aa005SDavid du Colombier nv->interlace = vgaxi(Crtx, 0x39);
3449a747e4fSDavid du Colombier
3456c83e8f8SDavid du Colombier nv->vpll = nv->pramdac[0x508/4];
346bb0aa005SDavid du Colombier if (nv->twoheads)
3476c83e8f8SDavid du Colombier nv->vpll2 = nv->pramdac[0x520/4];
348bb0aa005SDavid du Colombier if (nv->twostagepll) {
3496c83e8f8SDavid du Colombier nv->vpllB = nv->pramdac[0x578/4];
3506c83e8f8SDavid du Colombier nv->vpll2B = nv->pramdac[0x57C/4];
351bb0aa005SDavid du Colombier }
3526c83e8f8SDavid du Colombier nv->pllsel = nv->pramdac[0x50C/4];
3536c83e8f8SDavid du Colombier nv->general = nv->pramdac[0x600/4];
3546c83e8f8SDavid du Colombier nv->scale = nv->pramdac[0x848/4];
3556c83e8f8SDavid du Colombier nv->config = nv->pfb[0x200/4];
3569a747e4fSDavid du Colombier
3576c83e8f8SDavid du Colombier if (nv->pixel & 0x80)
358ffa04b9dSDavid du Colombier nv->islcd = 1;
359ffa04b9dSDavid du Colombier
360bb0aa005SDavid du Colombier if (nv->arch >= 10) {
361bb0aa005SDavid du Colombier if (nv->twoheads) {
362bb0aa005SDavid du Colombier nv->head = nv->pcrtc[0x0860/4];
363bb0aa005SDavid du Colombier nv->head2 = nv->pcrtc[0x2860/4];
364bb0aa005SDavid du Colombier nv->crtcowner = vgaxi(Crtx, 0x44);
365bb0aa005SDavid du Colombier }
366bb0aa005SDavid du Colombier nv->extra = vgaxi(Crtx, 0x41);
367bb0aa005SDavid du Colombier nv->cursorconfig = nv->pcrtc[0x0810/4];
3680b712f6bSDavid du Colombier if (implementation == 0x0110)
369bb0aa005SDavid du Colombier nv->dither = nv->pramdac[0x0528/4];
370ffa04b9dSDavid du Colombier else if (nv->twoheads)
371bb0aa005SDavid du Colombier nv->dither = nv->pramdac[0x083C/4];
372*588b1baaSDavid du Colombier if(nv->islcd){
373*588b1baaSDavid du Colombier nv->timingH = vgaxi(Crtx, 0x53);
374*588b1baaSDavid du Colombier nv->timingV = vgaxi(Crtx, 0x54);
375*588b1baaSDavid du Colombier }
376bb0aa005SDavid du Colombier }
377bb0aa005SDavid du Colombier
37825f7656aSDavid du Colombier /*
37925f7656aSDavid du Colombier * DFP.
38025f7656aSDavid du Colombier */
381ffa04b9dSDavid du Colombier if (nv->islcd) {
38225f7656aSDavid du Colombier nv->fpwidth = nv->pramdac[0x0820/4] + 1;
38325f7656aSDavid du Colombier nv->fpheight = nv->pramdac[0x0800/4] + 1;
384ffa04b9dSDavid du Colombier nv->crtcsync = nv->pramdac[0x0828/4];
38525f7656aSDavid du Colombier }
386bb0aa005SDavid du Colombier
387bb0aa005SDavid du Colombier nv->crtcnumber = 0;
388bb0aa005SDavid du Colombier
3899a747e4fSDavid du Colombier ctlr->flag |= Fsnarf;
3909a747e4fSDavid du Colombier }
3919a747e4fSDavid du Colombier
3929a747e4fSDavid du Colombier
3939a747e4fSDavid du Colombier static void
options(Vga *,Ctlr * ctlr)3949a747e4fSDavid du Colombier options(Vga*, Ctlr* ctlr)
3959a747e4fSDavid du Colombier {
3969a747e4fSDavid du Colombier ctlr->flag |= Hlinear|Foptions;
3979a747e4fSDavid du Colombier }
3989a747e4fSDavid du Colombier
3999a747e4fSDavid du Colombier
4009a747e4fSDavid du Colombier static void
clock(Vga * vga,Ctlr * ctlr)4019a747e4fSDavid du Colombier clock(Vga* vga, Ctlr* ctlr)
4029a747e4fSDavid du Colombier {
4039a747e4fSDavid du Colombier int m, n, p, f, d;
4049a747e4fSDavid du Colombier Nvidia *nv;
4059a747e4fSDavid du Colombier double trouble;
406bb0aa005SDavid du Colombier int fmin, mmin, nmin, crystalfreq;
4079a747e4fSDavid du Colombier nv = vga->private;
4089a747e4fSDavid du Colombier
4099a747e4fSDavid du Colombier if(vga->f[0] == 0)
4109a747e4fSDavid du Colombier vga->f[0] = vga->mode->frequency;
4119a747e4fSDavid du Colombier
4129a747e4fSDavid du Colombier vga->d[0] = vga->f[0]+1;
4139a747e4fSDavid du Colombier
414bb0aa005SDavid du Colombier vga->n[1] = 255;
415bb0aa005SDavid du Colombier if (nv->twostagepll) {
416bb0aa005SDavid du Colombier vga->p[1] = 6;
417bb0aa005SDavid du Colombier vga->m[1] = 13;
418bb0aa005SDavid du Colombier vga->f[1] = 400000000 << 2;
419bb0aa005SDavid du Colombier crystalfreq = nv->crystalfreq << 2;
420bb0aa005SDavid du Colombier fmin = 100000000 << 2;
421bb0aa005SDavid du Colombier mmin = 1;
422bb0aa005SDavid du Colombier nmin = 5;
423bb0aa005SDavid du Colombier nv->vpllB = 0x80000401;
424bb0aa005SDavid du Colombier } else {
425bb0aa005SDavid du Colombier vga->p[1] = 4;
426bb0aa005SDavid du Colombier if (nv->crystalfreq == 13500000)
427bb0aa005SDavid du Colombier vga->m[1] = 13;
428bb0aa005SDavid du Colombier else
429bb0aa005SDavid du Colombier vga->m[1] = 14;
430bb0aa005SDavid du Colombier vga->f[1] = 350000000;
431bb0aa005SDavid du Colombier crystalfreq = nv->crystalfreq;
432bb0aa005SDavid du Colombier fmin = 128000000;
433bb0aa005SDavid du Colombier mmin = 7;
434bb0aa005SDavid du Colombier nmin = 0;
435bb0aa005SDavid du Colombier }
436bb0aa005SDavid du Colombier
4379a747e4fSDavid du Colombier for (p=0; p <= vga->p[1]; p++){
4389a747e4fSDavid du Colombier f = vga->f[0] << p;
439bb0aa005SDavid du Colombier if ((f >= fmin) && (f <= vga->f[1])) {
440bb0aa005SDavid du Colombier for (m=mmin; m <= vga->m[1]; m++){
441bb0aa005SDavid du Colombier trouble = (double) crystalfreq / (double) (m << p);
4429a747e4fSDavid du Colombier n = (vga->f[0] / trouble)+0.5;
4439a747e4fSDavid du Colombier f = n*trouble + 0.5;
4449a747e4fSDavid du Colombier d = vga->f[0] - f;
4459a747e4fSDavid du Colombier if (d < 0)
4469a747e4fSDavid du Colombier d = -d;
447bb0aa005SDavid du Colombier if ((n & ~0xFF) && (n >= nmin))
4489a747e4fSDavid du Colombier d = vga->d[0] + 1;
4499a747e4fSDavid du Colombier if (d <= vga->d[0]){
4509a747e4fSDavid du Colombier vga->n[0] = n;
4519a747e4fSDavid du Colombier vga->m[0] = m;
4529a747e4fSDavid du Colombier vga->p[0] = p;
4539a747e4fSDavid du Colombier vga->d[0] = d;
4549a747e4fSDavid du Colombier }
4559a747e4fSDavid du Colombier }
4569a747e4fSDavid du Colombier }
4579a747e4fSDavid du Colombier }
4589a747e4fSDavid du Colombier if (vga->d[0] > vga->f[0])
4599a747e4fSDavid du Colombier error("%s: vclk %lud out of range\n", ctlr->name, vga->f[0]);
4609a747e4fSDavid du Colombier }
4619a747e4fSDavid du Colombier
4629a747e4fSDavid du Colombier
4639a747e4fSDavid du Colombier static void
init(Vga * vga,Ctlr * ctlr)4649a747e4fSDavid du Colombier init(Vga* vga, Ctlr* ctlr)
4659a747e4fSDavid du Colombier {
4669a747e4fSDavid du Colombier Mode *mode;
4679a747e4fSDavid du Colombier Nvidia *nv;
4683ff48bf5SDavid du Colombier char *p, *val;
469bb0aa005SDavid du Colombier int tmp, pixeldepth;
470bb0aa005SDavid du Colombier ulong cursorstart;
4719a747e4fSDavid du Colombier
4729a747e4fSDavid du Colombier mode = vga->mode;
4739a747e4fSDavid du Colombier if(mode->z == 24)
4749a747e4fSDavid du Colombier error("%s: 24-bit colour not supported, use 32-bit\n", ctlr->name);
4759a747e4fSDavid du Colombier
4769a747e4fSDavid du Colombier nv = vga->private;
4779a747e4fSDavid du Colombier
4789a747e4fSDavid du Colombier if(vga->linear && (ctlr->flag & Hlinear))
4799a747e4fSDavid du Colombier ctlr->flag |= Ulinear;
4809a747e4fSDavid du Colombier
4819a747e4fSDavid du Colombier clock(vga, ctlr);
4829a747e4fSDavid du Colombier
4833ff48bf5SDavid du Colombier if(val = dbattr(vga->mode->attr, "lcd")){
4843ff48bf5SDavid du Colombier if((nv->islcd = strtol(val, &p, 0)) == 0 && p == val)
4853ff48bf5SDavid du Colombier error("%s: invalid 'lcd' attr\n", ctlr->name);
4863ff48bf5SDavid du Colombier }
4873ff48bf5SDavid du Colombier
488bb0aa005SDavid du Colombier if(nv->arch == 4) {
4896c83e8f8SDavid du Colombier nv->cursor0 = 0;
490bb0aa005SDavid du Colombier nv->cursor1 = 0xBC;
4919a747e4fSDavid du Colombier nv->cursor2 = 0;
492bb0aa005SDavid du Colombier nv->config = 0x00001114;
493bb0aa005SDavid du Colombier } else if(nv->arch >= 10) {
494bb0aa005SDavid du Colombier cursorstart = vga->vmz - 96 * 1024;
495bb0aa005SDavid du Colombier nv->cursor0 = 0x80 | (cursorstart >> 17);
496bb0aa005SDavid du Colombier nv->cursor1 = (cursorstart >> 11) << 2;
497bb0aa005SDavid du Colombier nv->cursor2 = cursorstart >> 24;
498bb0aa005SDavid du Colombier nv->config = nv->pfb[0x200/4];
499bb0aa005SDavid du Colombier }
500bb0aa005SDavid du Colombier
5019a747e4fSDavid du Colombier nv->vpll = (vga->p[0] << 16) | (vga->n[0] << 8) | vga->m[0];
5029a747e4fSDavid du Colombier nv->pllsel = 0x10000700;
5039a747e4fSDavid du Colombier if (mode->z == 16)
5049a747e4fSDavid du Colombier nv->general = 0x00001100;
5059a747e4fSDavid du Colombier else
5069a747e4fSDavid du Colombier nv->general = 0x00000100;
507*588b1baaSDavid du Colombier if (0 && mode->z != 8)
508*588b1baaSDavid du Colombier nv->general |= 0x00000030;
5099a747e4fSDavid du Colombier
510bb0aa005SDavid du Colombier if (mode->x < 1280)
511bb0aa005SDavid du Colombier nv->repaint1 = 0x04;
512bb0aa005SDavid du Colombier else
513bb0aa005SDavid du Colombier nv->repaint1 = 0;
5149a747e4fSDavid du Colombier
5159a747e4fSDavid du Colombier vga->attribute[0x10] &= ~0x40;
5169a747e4fSDavid du Colombier vga->attribute[0x11] = Pblack;
5176c83e8f8SDavid du Colombier vga->crt[0x14] = 0;
5189a747e4fSDavid du Colombier
519*588b1baaSDavid du Colombier if(1 && vga->f[0] != VgaFreq0 && vga->f[1] != VgaFreq1)
520*588b1baaSDavid du Colombier vga->misc |= 0x08;
521*588b1baaSDavid du Colombier
5229a747e4fSDavid du Colombier /* set vert blanking to cover full overscan */
5239a747e4fSDavid du Colombier
5249a747e4fSDavid du Colombier tmp = vga->crt[0x12];
5259a747e4fSDavid du Colombier vga->crt[0x15] = tmp;
5269a747e4fSDavid du Colombier if(tmp & 0x100)
5279a747e4fSDavid du Colombier vga->crt[0x07] |= 0x08;
5289a747e4fSDavid du Colombier else
5299a747e4fSDavid du Colombier vga->crt[0x07] &= ~0x08;
5309a747e4fSDavid du Colombier if(tmp & 0x200)
5319a747e4fSDavid du Colombier vga->crt[0x09] |= 0x20;
5329a747e4fSDavid du Colombier else
5339a747e4fSDavid du Colombier vga->crt[0x09] &= ~0x20;
5349a747e4fSDavid du Colombier
5359a747e4fSDavid du Colombier vga->crt[0x16] = vga->crt[0x06] + 1;
5369a747e4fSDavid du Colombier
5379a747e4fSDavid du Colombier /* set horiz blanking to cover full overscan */
5389a747e4fSDavid du Colombier
5399a747e4fSDavid du Colombier vga->crt[0x02] = vga->crt[0x01];
5406c83e8f8SDavid du Colombier tmp = vga->crt[0] + 4;
5419a747e4fSDavid du Colombier vga->crt[0x03] = 0x80 | (tmp & 0x1F);
5429a747e4fSDavid du Colombier if (tmp & 0x20)
5439a747e4fSDavid du Colombier vga->crt[0x05] |= 0x80;
5449a747e4fSDavid du Colombier else
5459a747e4fSDavid du Colombier vga->crt[0x05] &= ~0x80;
5469a747e4fSDavid du Colombier if (tmp & 0x40)
547bb0aa005SDavid du Colombier nv->screen = 0x10;
5480b712f6bSDavid du Colombier else
5496c83e8f8SDavid du Colombier nv->screen = 0;
5509a747e4fSDavid du Colombier
5519a747e4fSDavid du Colombier /* overflow bits */
5529a747e4fSDavid du Colombier
553bb0aa005SDavid du Colombier if (nv->islcd){
554bb0aa005SDavid du Colombier tmp = vga->crt[0x06] - 3;
555bb0aa005SDavid du Colombier vga->crt[0x10] = tmp;
556bb0aa005SDavid du Colombier if(tmp & 0x100)
557bb0aa005SDavid du Colombier vga->crt[0x07] |= 0x04;
558bb0aa005SDavid du Colombier else
559bb0aa005SDavid du Colombier vga->crt[0x07] &= ~0x04;
560bb0aa005SDavid du Colombier if(tmp & 0x200)
561bb0aa005SDavid du Colombier vga->crt[0x07] |= 0x80;
562bb0aa005SDavid du Colombier else
563bb0aa005SDavid du Colombier vga->crt[0x07] &= ~0x80;
5649a747e4fSDavid du Colombier
565bb0aa005SDavid du Colombier vga->crt[0x11] = 0x20 | ((vga->crt[0x06] - 2) & 0x0F);
5669a747e4fSDavid du Colombier
567bb0aa005SDavid du Colombier tmp = vga->crt[0x10];
568bb0aa005SDavid du Colombier vga->crt[0x15] = tmp;
569bb0aa005SDavid du Colombier if(tmp & 0x100)
570bb0aa005SDavid du Colombier vga->crt[0x07] |= 0x08;
571bb0aa005SDavid du Colombier else
572bb0aa005SDavid du Colombier vga->crt[0x07] &= ~0x08;
573bb0aa005SDavid du Colombier if(tmp & 0x200)
574bb0aa005SDavid du Colombier vga->crt[0x09] |= 0x20;
575bb0aa005SDavid du Colombier else
576bb0aa005SDavid du Colombier vga->crt[0x09] &= ~0x20;
577bb0aa005SDavid du Colombier
5786c83e8f8SDavid du Colombier vga->crt[0x04] = vga->crt[0] - 5;
579bb0aa005SDavid du Colombier
580bb0aa005SDavid du Colombier vga->crt[0x05] &= ~0x1F;
5816c83e8f8SDavid du Colombier vga->crt[0x05] |= (0x1F & (vga->crt[0] - 2));
582bb0aa005SDavid du Colombier }
583bb0aa005SDavid du Colombier
584bb0aa005SDavid du Colombier nv->repaint0 = (vga->crt[0x13] & 0x0700) >> 3;
585bb0aa005SDavid du Colombier
586bb0aa005SDavid du Colombier pixeldepth = (mode->z +1)/8;
587bb0aa005SDavid du Colombier if (pixeldepth > 3)
588bb0aa005SDavid du Colombier nv->pixel = 3;
589bb0aa005SDavid du Colombier else
590bb0aa005SDavid du Colombier nv->pixel = pixeldepth;
591bb0aa005SDavid du Colombier
592bb0aa005SDavid du Colombier nv->scale &= 0xFFF000FF;
593bb0aa005SDavid du Colombier if(nv->islcd){
594bb0aa005SDavid du Colombier nv->pixel |= 0x80;
595bb0aa005SDavid du Colombier nv->scale |= 0x100;
596bb0aa005SDavid du Colombier }
5979a747e4fSDavid du Colombier
5989a747e4fSDavid du Colombier if (vga->crt[0x06] & 0x400)
599bb0aa005SDavid du Colombier nv->screen |= 0x01;
6009a747e4fSDavid du Colombier if (vga->crt[0x12] & 0x400)
601bb0aa005SDavid du Colombier nv->screen |= 0x02;
6029a747e4fSDavid du Colombier if (vga->crt[0x10] & 0x400)
603bb0aa005SDavid du Colombier nv->screen |= 0x04;
6049a747e4fSDavid du Colombier if (vga->crt[0x15] & 0x400)
605bb0aa005SDavid du Colombier nv->screen |= 0x08;
6069a747e4fSDavid du Colombier if (vga->crt[0x13] & 0x800)
607bb0aa005SDavid du Colombier nv->screen |= 0x20;
6089a747e4fSDavid du Colombier
6096c83e8f8SDavid du Colombier nv->horiz = 0;
6106c83e8f8SDavid du Colombier if (vga->crt[0] & 0x100)
611bb0aa005SDavid du Colombier nv->horiz = 0x01;
6129a747e4fSDavid du Colombier if(vga->crt[0x01] & 0x100)
613bb0aa005SDavid du Colombier nv->horiz |= 0x02;
6149a747e4fSDavid du Colombier if(vga->crt[0x02] & 0x100)
615bb0aa005SDavid du Colombier nv->horiz |= 0x04;
6169a747e4fSDavid du Colombier if(vga->crt[0x04] & 0x100)
617bb0aa005SDavid du Colombier nv->horiz |= 0x08;
618bb0aa005SDavid du Colombier
6196c83e8f8SDavid du Colombier nv->extra = 0;
6200b712f6bSDavid du Colombier if (vga->crt[0x06] & 0x800)
6210b712f6bSDavid du Colombier nv->extra |= 0x01;
6220b712f6bSDavid du Colombier if (vga->crt[0x12] & 0x800)
6230b712f6bSDavid du Colombier nv->extra |= 0x04;
6240b712f6bSDavid du Colombier if (vga->crt[0x10] & 0x800)
6250b712f6bSDavid du Colombier nv->extra |= 0x10;
6260b712f6bSDavid du Colombier if (vga->crt[0x15] & 0x800)
6270b712f6bSDavid du Colombier nv->extra |= 0x40;
6280b712f6bSDavid du Colombier
629bb0aa005SDavid du Colombier nv->interlace = 0xFF;
630bb0aa005SDavid du Colombier if (nv->twoheads) {
631bb0aa005SDavid du Colombier nv->head |= 0x00001000;
632*588b1baaSDavid du Colombier nv->head2 &= ~0x00001000;
633bb0aa005SDavid du Colombier nv->crtcowner = 0;
634ffa04b9dSDavid du Colombier if((nv->did & 0x0ff0) == 0x0110)
635ffa04b9dSDavid du Colombier nv->dither &= ~0x00010000;
636ffa04b9dSDavid du Colombier else
637ffa04b9dSDavid du Colombier nv->dither &= ~1;
638bb0aa005SDavid du Colombier }
639bb0aa005SDavid du Colombier nv->cursorconfig = 0x00000100 | 0x02000000;
6409a747e4fSDavid du Colombier
641ffa04b9dSDavid du Colombier nv->timingH = 0;
642ffa04b9dSDavid du Colombier nv->timingV = 0;
643ffa04b9dSDavid du Colombier nv->displayV = vga->crt[0x12] + 1;
644ffa04b9dSDavid du Colombier
6459a747e4fSDavid du Colombier ctlr->flag |= Finit;
6469a747e4fSDavid du Colombier }
6479a747e4fSDavid du Colombier
6489a747e4fSDavid du Colombier
6499a747e4fSDavid du Colombier static void
load(Vga * vga,Ctlr * ctlr)6509a747e4fSDavid du Colombier load(Vga* vga, Ctlr* ctlr)
6519a747e4fSDavid du Colombier {
6529a747e4fSDavid du Colombier Nvidia *nv;
653a49e8198SDavid du Colombier int i, regions;
654a49e8198SDavid du Colombier ulong tmp;
6559a747e4fSDavid du Colombier
6569a747e4fSDavid du Colombier nv = vga->private;
6579a747e4fSDavid du Colombier
6589a747e4fSDavid du Colombier /*
6599a747e4fSDavid du Colombier * Unlock
6609a747e4fSDavid du Colombier */
6619a747e4fSDavid du Colombier vgaxo(Crtx, 0x1F, 0x57);
6629a747e4fSDavid du Colombier
6636c83e8f8SDavid du Colombier nv->pmc[0x0140/4] = 0;
664bb0aa005SDavid du Colombier nv->pmc[0x0200/4] = 0xFFFF00FF;
665bb0aa005SDavid du Colombier nv->pmc[0x0200/4] = 0xFFFFFFFF;
666bb0aa005SDavid du Colombier
6676c83e8f8SDavid du Colombier nv->ptimer[0x0200] = 8;
6686c83e8f8SDavid du Colombier nv->ptimer[0x0210] = 3;
6696c83e8f8SDavid du Colombier nv->ptimer[0x0140] = 0;
670bb0aa005SDavid du Colombier nv->ptimer[0x0100] = 0xFFFFFFFF;
671bb0aa005SDavid du Colombier
672bb0aa005SDavid du Colombier if (nv->arch == 4)
6739a747e4fSDavid du Colombier nv->pfb[0x00000200/4] = nv->config;
674a49e8198SDavid du Colombier else if((nv->arch < 40) || ((nv->did & 0xfff0) == 0x0040)){
675bb0aa005SDavid du Colombier for(i = 0; i < 8; i++){
676a49e8198SDavid du Colombier nv->pfb[(0x0240 + (i * 0x10))/4] = 0;
677a49e8198SDavid du Colombier nv->pfb[(0x0244 + (i * 0x10))/4] = vga->vmz - 1;;
678a49e8198SDavid du Colombier }
679a49e8198SDavid du Colombier }
680a49e8198SDavid du Colombier else{
681a49e8198SDavid du Colombier if(((nv->did & 0xfff0) == 0x0090)
682a49e8198SDavid du Colombier || ((nv->did & 0xfff0) == 0x01D0)
683a49e8198SDavid du Colombier || ((nv->did & 0xfff0) == 0x0290)
684a49e8198SDavid du Colombier || ((nv->did & 0xfff0) == 0x0390))
685a49e8198SDavid du Colombier regions = 15;
686a49e8198SDavid du Colombier else
687a49e8198SDavid du Colombier regions = 12;
688a49e8198SDavid du Colombier
689a49e8198SDavid du Colombier for(i = 0; i < regions; i++){
690a49e8198SDavid du Colombier nv->pfb[(0x0600 + (i * 0x10))/4] = 0;
691a49e8198SDavid du Colombier nv->pfb[(0x0604 + (i * 0x10))/4] = vga->vmz - 1;
6929a747e4fSDavid du Colombier }
6939a747e4fSDavid du Colombier }
6949a747e4fSDavid du Colombier
695ffa04b9dSDavid du Colombier if (nv->arch >= 40) {
6966c83e8f8SDavid du Colombier nv->pramin[0] = 0x80000010;
697ffa04b9dSDavid du Colombier nv->pramin[0x0001] = 0x00101202;
698ffa04b9dSDavid du Colombier nv->pramin[0x0002] = 0x80000011;
699ffa04b9dSDavid du Colombier nv->pramin[0x0003] = 0x00101204;
700ffa04b9dSDavid du Colombier nv->pramin[0x0004] = 0x80000012;
701ffa04b9dSDavid du Colombier nv->pramin[0x0005] = 0x00101206;
702ffa04b9dSDavid du Colombier nv->pramin[0x0006] = 0x80000013;
703ffa04b9dSDavid du Colombier nv->pramin[0x0007] = 0x00101208;
704ffa04b9dSDavid du Colombier nv->pramin[0x0008] = 0x80000014;
705ffa04b9dSDavid du Colombier nv->pramin[0x0009] = 0x0010120A;
706ffa04b9dSDavid du Colombier nv->pramin[0x000A] = 0x80000015;
707ffa04b9dSDavid du Colombier nv->pramin[0x000B] = 0x0010120C;
708ffa04b9dSDavid du Colombier nv->pramin[0x000C] = 0x80000016;
709ffa04b9dSDavid du Colombier nv->pramin[0x000D] = 0x0010120E;
710ffa04b9dSDavid du Colombier nv->pramin[0x000E] = 0x80000017;
711ffa04b9dSDavid du Colombier nv->pramin[0x000F] = 0x00101210;
712ffa04b9dSDavid du Colombier nv->pramin[0x0800] = 0x00003000;
713ffa04b9dSDavid du Colombier nv->pramin[0x0801] = vga->vmz - 1;
714ffa04b9dSDavid du Colombier nv->pramin[0x0802] = 0x00000002;
715ffa04b9dSDavid du Colombier nv->pramin[0x0808] = 0x02080062;
7166c83e8f8SDavid du Colombier nv->pramin[0x0809] = 0;
717ffa04b9dSDavid du Colombier nv->pramin[0x080A] = 0x00001200;
718ffa04b9dSDavid du Colombier nv->pramin[0x080B] = 0x00001200;
7196c83e8f8SDavid du Colombier nv->pramin[0x080C] = 0;
7206c83e8f8SDavid du Colombier nv->pramin[0x080D] = 0;
721ffa04b9dSDavid du Colombier nv->pramin[0x0810] = 0x02080043;
7226c83e8f8SDavid du Colombier nv->pramin[0x0811] = 0;
7236c83e8f8SDavid du Colombier nv->pramin[0x0812] = 0;
7246c83e8f8SDavid du Colombier nv->pramin[0x0813] = 0;
7256c83e8f8SDavid du Colombier nv->pramin[0x0814] = 0;
7266c83e8f8SDavid du Colombier nv->pramin[0x0815] = 0;
727ffa04b9dSDavid du Colombier nv->pramin[0x0818] = 0x02080044;
728ffa04b9dSDavid du Colombier nv->pramin[0x0819] = 0x02000000;
7296c83e8f8SDavid du Colombier nv->pramin[0x081A] = 0;
7306c83e8f8SDavid du Colombier nv->pramin[0x081B] = 0;
7316c83e8f8SDavid du Colombier nv->pramin[0x081C] = 0;
7326c83e8f8SDavid du Colombier nv->pramin[0x081D] = 0;
733ffa04b9dSDavid du Colombier nv->pramin[0x0820] = 0x02080019;
7346c83e8f8SDavid du Colombier nv->pramin[0x0821] = 0;
7356c83e8f8SDavid du Colombier nv->pramin[0x0822] = 0;
7366c83e8f8SDavid du Colombier nv->pramin[0x0823] = 0;
7376c83e8f8SDavid du Colombier nv->pramin[0x0824] = 0;
7386c83e8f8SDavid du Colombier nv->pramin[0x0825] = 0;
739ffa04b9dSDavid du Colombier nv->pramin[0x0828] = 0x020A005C;
7406c83e8f8SDavid du Colombier nv->pramin[0x0829] = 0;
7416c83e8f8SDavid du Colombier nv->pramin[0x082A] = 0;
7426c83e8f8SDavid du Colombier nv->pramin[0x082B] = 0;
7436c83e8f8SDavid du Colombier nv->pramin[0x082C] = 0;
7446c83e8f8SDavid du Colombier nv->pramin[0x082D] = 0;
745ffa04b9dSDavid du Colombier nv->pramin[0x0830] = 0x0208009F;
7466c83e8f8SDavid du Colombier nv->pramin[0x0831] = 0;
747ffa04b9dSDavid du Colombier nv->pramin[0x0832] = 0x00001200;
748ffa04b9dSDavid du Colombier nv->pramin[0x0833] = 0x00001200;
7496c83e8f8SDavid du Colombier nv->pramin[0x0834] = 0;
7506c83e8f8SDavid du Colombier nv->pramin[0x0835] = 0;
751ffa04b9dSDavid du Colombier nv->pramin[0x0838] = 0x0208004A;
752ffa04b9dSDavid du Colombier nv->pramin[0x0839] = 0x02000000;
7536c83e8f8SDavid du Colombier nv->pramin[0x083A] = 0;
7546c83e8f8SDavid du Colombier nv->pramin[0x083B] = 0;
7556c83e8f8SDavid du Colombier nv->pramin[0x083C] = 0;
7566c83e8f8SDavid du Colombier nv->pramin[0x083D] = 0;
757ffa04b9dSDavid du Colombier nv->pramin[0x0840] = 0x02080077;
7586c83e8f8SDavid du Colombier nv->pramin[0x0841] = 0;
759ffa04b9dSDavid du Colombier nv->pramin[0x0842] = 0x00001200;
760ffa04b9dSDavid du Colombier nv->pramin[0x0843] = 0x00001200;
7616c83e8f8SDavid du Colombier nv->pramin[0x0844] = 0;
7626c83e8f8SDavid du Colombier nv->pramin[0x0845] = 0;
763ffa04b9dSDavid du Colombier nv->pramin[0x084C] = 0x00003002;
764ffa04b9dSDavid du Colombier nv->pramin[0x084D] = 0x00007FFF;
7656c83e8f8SDavid du Colombier nv->pramin[0x084E] = (vga->vmz - 128*1024) | 2;
766ffa04b9dSDavid du Colombier } else {
767bb0aa005SDavid du Colombier nv->pramin[0x0000] = 0x80000010;
768bb0aa005SDavid du Colombier nv->pramin[0x0001] = 0x80011201;
769bb0aa005SDavid du Colombier nv->pramin[0x0002] = 0x80000011;
770bb0aa005SDavid du Colombier nv->pramin[0x0003] = 0x80011202;
771bb0aa005SDavid du Colombier nv->pramin[0x0004] = 0x80000012;
772bb0aa005SDavid du Colombier nv->pramin[0x0005] = 0x80011203;
773bb0aa005SDavid du Colombier nv->pramin[0x0006] = 0x80000013;
774bb0aa005SDavid du Colombier nv->pramin[0x0007] = 0x80011204;
775bb0aa005SDavid du Colombier nv->pramin[0x0008] = 0x80000014;
776bb0aa005SDavid du Colombier nv->pramin[0x0009] = 0x80011205;
777bb0aa005SDavid du Colombier nv->pramin[0x000A] = 0x80000015;
778bb0aa005SDavid du Colombier nv->pramin[0x000B] = 0x80011206;
779bb0aa005SDavid du Colombier nv->pramin[0x000C] = 0x80000016;
780bb0aa005SDavid du Colombier nv->pramin[0x000D] = 0x80011207;
781bb0aa005SDavid du Colombier nv->pramin[0x000E] = 0x80000017;
782bb0aa005SDavid du Colombier nv->pramin[0x000F] = 0x80011208;
783bb0aa005SDavid du Colombier nv->pramin[0x0800] = 0x00003000;
784bb0aa005SDavid du Colombier nv->pramin[0x0801] = vga->vmz - 1;
785bb0aa005SDavid du Colombier nv->pramin[0x0802] = 0x00000002;
786bb0aa005SDavid du Colombier nv->pramin[0x0803] = 0x00000002;
787bb0aa005SDavid du Colombier if (nv->arch >= 10)
788bb0aa005SDavid du Colombier nv->pramin[0x0804] = 0x01008062;
789bb0aa005SDavid du Colombier else
790bb0aa005SDavid du Colombier nv->pramin[0x0804] = 0x01008042;
7916c83e8f8SDavid du Colombier nv->pramin[0x0805] = 0;
792bb0aa005SDavid du Colombier nv->pramin[0x0806] = 0x12001200;
7936c83e8f8SDavid du Colombier nv->pramin[0x0807] = 0;
794bb0aa005SDavid du Colombier nv->pramin[0x0808] = 0x01008043;
7956c83e8f8SDavid du Colombier nv->pramin[0x0809] = 0;
7966c83e8f8SDavid du Colombier nv->pramin[0x080A] = 0;
7976c83e8f8SDavid du Colombier nv->pramin[0x080B] = 0;
798bb0aa005SDavid du Colombier nv->pramin[0x080C] = 0x01008044;
799bb0aa005SDavid du Colombier nv->pramin[0x080D] = 0x00000002;
8006c83e8f8SDavid du Colombier nv->pramin[0x080E] = 0;
8016c83e8f8SDavid du Colombier nv->pramin[0x080F] = 0;
802bb0aa005SDavid du Colombier nv->pramin[0x0810] = 0x01008019;
8036c83e8f8SDavid du Colombier nv->pramin[0x0811] = 0;
8046c83e8f8SDavid du Colombier nv->pramin[0x0812] = 0;
8056c83e8f8SDavid du Colombier nv->pramin[0x0813] = 0;
806bb0aa005SDavid du Colombier nv->pramin[0x0814] = 0x0100A05C;
8076c83e8f8SDavid du Colombier nv->pramin[0x0815] = 0;
8086c83e8f8SDavid du Colombier nv->pramin[0x0816] = 0;
8096c83e8f8SDavid du Colombier nv->pramin[0x0817] = 0;
810bb0aa005SDavid du Colombier nv->pramin[0x0818] = 0x0100805F;
8116c83e8f8SDavid du Colombier nv->pramin[0x0819] = 0;
812bb0aa005SDavid du Colombier nv->pramin[0x081A] = 0x12001200;
8136c83e8f8SDavid du Colombier nv->pramin[0x081B] = 0;
814bb0aa005SDavid du Colombier nv->pramin[0x081C] = 0x0100804A;
815bb0aa005SDavid du Colombier nv->pramin[0x081D] = 0x00000002;
8166c83e8f8SDavid du Colombier nv->pramin[0x081E] = 0;
8176c83e8f8SDavid du Colombier nv->pramin[0x081F] = 0;
818bb0aa005SDavid du Colombier nv->pramin[0x0820] = 0x01018077;
8196c83e8f8SDavid du Colombier nv->pramin[0x0821] = 0;
820bb0aa005SDavid du Colombier nv->pramin[0x0822] = 0x01201200;
8216c83e8f8SDavid du Colombier nv->pramin[0x0823] = 0;
822bb0aa005SDavid du Colombier nv->pramin[0x0824] = 0x00003002;
823bb0aa005SDavid du Colombier nv->pramin[0x0825] = 0x00007FFF;
8246c83e8f8SDavid du Colombier nv->pramin[0x0826] = (vga->vmz - 128*1024) | 2;
825bb0aa005SDavid du Colombier nv->pramin[0x0827] = 0x00000002;
826ffa04b9dSDavid du Colombier }
827bb0aa005SDavid du Colombier if (nv->arch < 10) {
828ffa04b9dSDavid du Colombier if((nv->did & 0x0fff) == 0x0020) {
829bb0aa005SDavid du Colombier nv->pramin[0x0824] |= 0x00020000;
830bb0aa005SDavid du Colombier nv->pramin[0x0826] += nv->pci->mem[1].bar;
831bb0aa005SDavid du Colombier }
832bb0aa005SDavid du Colombier nv->pgraph[0x0080/4] = 0x000001FF;
833bb0aa005SDavid du Colombier nv->pgraph[0x0080/4] = 0x1230C000;
834bb0aa005SDavid du Colombier nv->pgraph[0x0084/4] = 0x72111101;
835bb0aa005SDavid du Colombier nv->pgraph[0x0088/4] = 0x11D5F071;
836bb0aa005SDavid du Colombier nv->pgraph[0x008C/4] = 0x0004FF31;
837ffa04b9dSDavid du Colombier nv->pgraph[0x008C/4] = 0x4004FF31;
838bb0aa005SDavid du Colombier
8396c83e8f8SDavid du Colombier nv->pgraph[0x0140/4] = 0;
840bb0aa005SDavid du Colombier nv->pgraph[0x0100/4] = 0xFFFFFFFF;
841bb0aa005SDavid du Colombier nv->pgraph[0x0170/4] = 0x10010100;
842bb0aa005SDavid du Colombier nv->pgraph[0x0710/4] = 0xFFFFFFFF;
8436c83e8f8SDavid du Colombier nv->pgraph[0x0720/4] = 1;
844bb0aa005SDavid du Colombier
8456c83e8f8SDavid du Colombier nv->pgraph[0x0810/4] = 0;
846ffa04b9dSDavid du Colombier nv->pgraph[0x0608/4] = 0xFFFFFFFF;
847bb0aa005SDavid du Colombier } else {
848bb0aa005SDavid du Colombier nv->pgraph[0x0080/4] = 0xFFFFFFFF;
8496c83e8f8SDavid du Colombier nv->pgraph[0x0080/4] = 0;
850bb0aa005SDavid du Colombier
8516c83e8f8SDavid du Colombier nv->pgraph[0x0140/4] = 0;
852bb0aa005SDavid du Colombier nv->pgraph[0x0100/4] = 0xFFFFFFFF;
853bb0aa005SDavid du Colombier nv->pgraph[0x0144/4] = 0x10010100;
854bb0aa005SDavid du Colombier nv->pgraph[0x0714/4] = 0xFFFFFFFF;
8556c83e8f8SDavid du Colombier nv->pgraph[0x0720/4] = 1;
856ffa04b9dSDavid du Colombier nv->pgraph[0x0710/4] &= 0x0007ff00;
857ffa04b9dSDavid du Colombier nv->pgraph[0x0710/4] |= 0x00020100;
858bb0aa005SDavid du Colombier
859bb0aa005SDavid du Colombier if (nv->arch == 10) {
860bb0aa005SDavid du Colombier nv->pgraph[0x0084/4] = 0x00118700;
861bb0aa005SDavid du Colombier nv->pgraph[0x0088/4] = 0x24E00810;
862bb0aa005SDavid du Colombier nv->pgraph[0x008C/4] = 0x55DE0030;
863bb0aa005SDavid du Colombier
864bb0aa005SDavid du Colombier for(i = 0; i < 32; i++)
8656c83e8f8SDavid du Colombier nv->pgraph[0x0B00/4 + i] = nv->pfb[0x0240/4 + i];
866bb0aa005SDavid du Colombier
867bb0aa005SDavid du Colombier nv->pgraph[0x640/4] = 0;
868bb0aa005SDavid du Colombier nv->pgraph[0x644/4] = 0;
869bb0aa005SDavid du Colombier nv->pgraph[0x684/4] = vga->vmz - 1;
870bb0aa005SDavid du Colombier nv->pgraph[0x688/4] = vga->vmz - 1;
871bb0aa005SDavid du Colombier
8726c83e8f8SDavid du Colombier nv->pgraph[0x0810/4] = 0;
873ffa04b9dSDavid du Colombier nv->pgraph[0x0608/4] = 0xFFFFFFFF;
874bb0aa005SDavid du Colombier } else {
875ffa04b9dSDavid du Colombier if (nv->arch >= 40) {
876ffa04b9dSDavid du Colombier nv->pgraph[0x0084/4] = 0x401287c0;
877ffa04b9dSDavid du Colombier nv->pgraph[0x008C/4] = 0x60de8051;
878ffa04b9dSDavid du Colombier nv->pgraph[0x0090/4] = 0x00008000;
879ffa04b9dSDavid du Colombier nv->pgraph[0x0610/4] = 0x00be3c5f;
880ffa04b9dSDavid du Colombier
881a49e8198SDavid du Colombier
882*588b1baaSDavid du Colombier tmp = nv->pmc[0x1540/4] & 0xff;
883a49e8198SDavid du Colombier for(i = 0; tmp && !(tmp & 1); tmp >>= 1, i++)
884a49e8198SDavid du Colombier ;
885*588b1baaSDavid du Colombier nv->pgraph[0x5000/4] = i;
886a49e8198SDavid du Colombier
887ffa04b9dSDavid du Colombier if ((nv->did & 0xfff0) == 0x0040) {
888ffa04b9dSDavid du Colombier nv->pgraph[0x09b0/4] = 0x83280fff;
889ffa04b9dSDavid du Colombier nv->pgraph[0x09b4/4] = 0x000000a0;
890ffa04b9dSDavid du Colombier } else {
891ffa04b9dSDavid du Colombier nv->pgraph[0x0820/4] = 0x83280eff;
892ffa04b9dSDavid du Colombier nv->pgraph[0x0824/4] = 0x000000a0;
893ffa04b9dSDavid du Colombier }
894ffa04b9dSDavid du Colombier
895ffa04b9dSDavid du Colombier switch(nv->did & 0xfff0) {
896ffa04b9dSDavid du Colombier case 0x0040:
897ffa04b9dSDavid du Colombier nv->pgraph[0x09b8/4] = 0x0078e366;
898ffa04b9dSDavid du Colombier nv->pgraph[0x09bc/4] = 0x0000014c;
899ffa04b9dSDavid du Colombier nv->pfb[0x033C/4] &= 0xffff7fff;
900ffa04b9dSDavid du Colombier break;
901ffa04b9dSDavid du Colombier case 0x00C0:
902a49e8198SDavid du Colombier case 0x0120:
903ffa04b9dSDavid du Colombier nv->pgraph[0x0828/4] = 0x007596ff;
904ffa04b9dSDavid du Colombier nv->pgraph[0x082C/4] = 0x00000108;
905ffa04b9dSDavid du Colombier break;
906ffa04b9dSDavid du Colombier case 0x0160:
907a49e8198SDavid du Colombier case 0x01D0:
908a49e8198SDavid du Colombier case 0x0240:
909ffa04b9dSDavid du Colombier nv->pmc[0x1700/4] = nv->pfb[0x020C/4];
910ffa04b9dSDavid du Colombier nv->pmc[0x1704/4] = 0;
911ffa04b9dSDavid du Colombier nv->pmc[0x1708/4] = 0;
912ffa04b9dSDavid du Colombier nv->pmc[0x170C/4] = nv->pfb[0x020C/4];
913ffa04b9dSDavid du Colombier nv->pgraph[0x0860/4] = 0;
914ffa04b9dSDavid du Colombier nv->pgraph[0x0864/4] = 0;
915ffa04b9dSDavid du Colombier nv->pramdac[0x0608/4] |= 0x00100000;
916ffa04b9dSDavid du Colombier break;
917ffa04b9dSDavid du Colombier case 0x0140:
918ffa04b9dSDavid du Colombier nv->pgraph[0x0828/4] = 0x0072cb77;
919ffa04b9dSDavid du Colombier nv->pgraph[0x082C/4] = 0x00000108;
920ffa04b9dSDavid du Colombier break;
921a49e8198SDavid du Colombier case 0x0220:
922a49e8198SDavid du Colombier nv->pgraph[0x0860/4] = 0;
923a49e8198SDavid du Colombier nv->pgraph[0x0864/4] = 0;
924a49e8198SDavid du Colombier nv->pramdac[0x0608/4] |= 0x00100000;
925a49e8198SDavid du Colombier break;
926a49e8198SDavid du Colombier case 0x0090:
927a49e8198SDavid du Colombier case 0x0290:
928a49e8198SDavid du Colombier case 0x0390:
929a49e8198SDavid du Colombier nv->pgraph[0x0608/4] |= 0x00100000;
930a49e8198SDavid du Colombier nv->pgraph[0x0828/4] = 0x07830610;
931a49e8198SDavid du Colombier nv->pgraph[0x082C/4] = 0x0000016A;
932a49e8198SDavid du Colombier break;
933ffa04b9dSDavid du Colombier default:
934ffa04b9dSDavid du Colombier break;
935a49e8198SDavid du Colombier }
936ffa04b9dSDavid du Colombier
937ffa04b9dSDavid du Colombier nv->pgraph[0x0b38/4] = 0x2ffff800;
938ffa04b9dSDavid du Colombier nv->pgraph[0x0b3c/4] = 0x00006000;
939ffa04b9dSDavid du Colombier nv->pgraph[0x032C/4] = 0x01000000;
940ffa04b9dSDavid du Colombier nv->pgraph[0x0220/4] = 0x00001200;
941ffa04b9dSDavid du Colombier } else if (nv->arch == 30) {
942bb0aa005SDavid du Colombier nv->pgraph[0x0084/4] = 0x40108700;
943bb0aa005SDavid du Colombier nv->pgraph[0x0890/4] = 0x00140000;
944bb0aa005SDavid du Colombier nv->pgraph[0x008C/4] = 0xf00e0431;
945bb0aa005SDavid du Colombier nv->pgraph[0x0090/4] = 0x00008000;
946bb0aa005SDavid du Colombier nv->pgraph[0x0610/4] = 0xf04b1f36;
947bb0aa005SDavid du Colombier nv->pgraph[0x0B80/4] = 0x1002d888;
948bb0aa005SDavid du Colombier nv->pgraph[0x0B88/4] = 0x62ff007f;
949bb0aa005SDavid du Colombier } else {
950bb0aa005SDavid du Colombier nv->pgraph[0x0084/4] = 0x00118700;
951bb0aa005SDavid du Colombier nv->pgraph[0x008C/4] = 0xF20E0431;
9526c83e8f8SDavid du Colombier nv->pgraph[0x0090/4] = 0;
953bb0aa005SDavid du Colombier nv->pgraph[0x009C/4] = 0x00000040;
954bb0aa005SDavid du Colombier
955ffa04b9dSDavid du Colombier if((nv->did & 0x0ff0) >= 0x0250) {
956bb0aa005SDavid du Colombier nv->pgraph[0x0890/4] = 0x00080000;
957bb0aa005SDavid du Colombier nv->pgraph[0x0610/4] = 0x304B1FB6;
958bb0aa005SDavid du Colombier nv->pgraph[0x0B80/4] = 0x18B82880;
959bb0aa005SDavid du Colombier nv->pgraph[0x0B84/4] = 0x44000000;
960bb0aa005SDavid du Colombier nv->pgraph[0x0098/4] = 0x40000080;
961bb0aa005SDavid du Colombier nv->pgraph[0x0B88/4] = 0x000000ff;
962bb0aa005SDavid du Colombier } else {
963bb0aa005SDavid du Colombier nv->pgraph[0x0880/4] = 0x00080000;
964bb0aa005SDavid du Colombier nv->pgraph[0x0094/4] = 0x00000005;
965bb0aa005SDavid du Colombier nv->pgraph[0x0B80/4] = 0x45CAA208;
966bb0aa005SDavid du Colombier nv->pgraph[0x0B84/4] = 0x24000000;
967bb0aa005SDavid du Colombier nv->pgraph[0x0098/4] = 0x00000040;
968bb0aa005SDavid du Colombier nv->pgraph[0x0750/4] = 0x00E00038;
969bb0aa005SDavid du Colombier nv->pgraph[0x0754/4] = 0x00000030;
970bb0aa005SDavid du Colombier nv->pgraph[0x0750/4] = 0x00E10038;
971bb0aa005SDavid du Colombier nv->pgraph[0x0754/4] = 0x00000030;
972bb0aa005SDavid du Colombier }
973b7b24591SDavid du Colombier }
974b7b24591SDavid du Colombier
975a49e8198SDavid du Colombier if((nv->arch < 40) || ((nv->did & 0xfff0) == 0x0040)){
976a49e8198SDavid du Colombier for(i = 0; i < 32; i++) {
977bb0aa005SDavid du Colombier nv->pgraph[(0x0900/4) + i] = nv->pfb[(0x0240/4) + i];
978a49e8198SDavid du Colombier nv->pgraph[(0x6900/4) + i] = nv->pfb[(0x0240/4) + i];
979a49e8198SDavid du Colombier }
980a49e8198SDavid du Colombier }
981a49e8198SDavid du Colombier else{
982a49e8198SDavid du Colombier if(((nv->did & 0xfff0) == 0x0090)
983a49e8198SDavid du Colombier || ((nv->did & 0xfff0) == 0x01D0)
984a49e8198SDavid du Colombier || ((nv->did & 0xfff0) == 0x0290)
985a49e8198SDavid du Colombier || ((nv->did & 0xfff0) == 0x0390)){
986a49e8198SDavid du Colombier for(i = 0; i < 60; i++) {
987a49e8198SDavid du Colombier nv->pgraph[(0x0D00/4) + i] = nv->pfb[(0x0600/4) + i];
988a49e8198SDavid du Colombier nv->pgraph[(0x6900/4) + i] = nv->pfb[(0x0600/4) + i];
989a49e8198SDavid du Colombier }
990a49e8198SDavid du Colombier }
991a49e8198SDavid du Colombier else{
992a49e8198SDavid du Colombier for(i = 0; i < 48; i++) {
993a49e8198SDavid du Colombier nv->pgraph[(0x0900/4) + i] = nv->pfb[(0x0600/4) + i];
994a49e8198SDavid du Colombier if(((nv->did & 0xfff0) != 0x0160)
995a49e8198SDavid du Colombier && ((nv->did & 0xfff0) != 0x0220)
996a49e8198SDavid du Colombier && ((nv->did & 0xfff0) != 0x0240))
997a49e8198SDavid du Colombier nv->pgraph[(0x6900/4) + i] = nv->pfb[(0x0600/4) + i];
998a49e8198SDavid du Colombier }
999a49e8198SDavid du Colombier }
1000a49e8198SDavid du Colombier }
1001b7b24591SDavid du Colombier
1002ffa04b9dSDavid du Colombier if(nv->arch >= 40) {
1003ffa04b9dSDavid du Colombier if((nv->did & 0xfff0) == 0x0040) {
1004ffa04b9dSDavid du Colombier nv->pgraph[0x09A4/4] = nv->pfb[0x0200/4];
1005ffa04b9dSDavid du Colombier nv->pgraph[0x09A8/4] = nv->pfb[0x0204/4];
1006ffa04b9dSDavid du Colombier nv->pgraph[0x69A4/4] = nv->pfb[0x0200/4];
1007ffa04b9dSDavid du Colombier nv->pgraph[0x69A8/4] = nv->pfb[0x0204/4];
1008ffa04b9dSDavid du Colombier
1009ffa04b9dSDavid du Colombier nv->pgraph[0x0820/4] = 0;
1010ffa04b9dSDavid du Colombier nv->pgraph[0x0824/4] = 0;
1011ffa04b9dSDavid du Colombier nv->pgraph[0x0864/4] = vga->vmz - 1;
1012ffa04b9dSDavid du Colombier nv->pgraph[0x0868/4] = vga->vmz - 1;
1013ffa04b9dSDavid du Colombier } else {
1014ffa04b9dSDavid du Colombier nv->pgraph[0x09F0/4] = nv->pfb[0x0200/4];
1015ffa04b9dSDavid du Colombier nv->pgraph[0x09F4/4] = nv->pfb[0x0204/4];
1016ffa04b9dSDavid du Colombier nv->pgraph[0x69F0/4] = nv->pfb[0x0200/4];
1017ffa04b9dSDavid du Colombier nv->pgraph[0x69F4/4] = nv->pfb[0x0204/4];
1018ffa04b9dSDavid du Colombier
1019ffa04b9dSDavid du Colombier nv->pgraph[0x0840/4] = 0;
1020ffa04b9dSDavid du Colombier nv->pgraph[0x0844/4] = 0;
1021ffa04b9dSDavid du Colombier nv->pgraph[0x08a0/4] = vga->vmz - 1;
1022ffa04b9dSDavid du Colombier nv->pgraph[0x08a4/4] = vga->vmz - 1;
1023ffa04b9dSDavid du Colombier }
1024ffa04b9dSDavid du Colombier } else {
1025bb0aa005SDavid du Colombier nv->pgraph[0x09A4/4] = nv->pfb[0x0200/4];
1026bb0aa005SDavid du Colombier nv->pgraph[0x09A8/4] = nv->pfb[0x0204/4];
1027bb0aa005SDavid du Colombier nv->pgraph[0x0750/4] = 0x00EA0000;
1028bb0aa005SDavid du Colombier nv->pgraph[0x0754/4] = nv->pfb[0x0200/4];
1029bb0aa005SDavid du Colombier nv->pgraph[0x0750/4] = 0x00EA0004;
1030bb0aa005SDavid du Colombier nv->pgraph[0x0754/4] = nv->pfb[0x0204/4];
1031bb0aa005SDavid du Colombier
1032bb0aa005SDavid du Colombier nv->pgraph[0x0820/4] = 0;
1033bb0aa005SDavid du Colombier nv->pgraph[0x0824/4] = 0;
1034bb0aa005SDavid du Colombier nv->pgraph[0x0864/4] = vga->vmz - 1;
1035bb0aa005SDavid du Colombier nv->pgraph[0x0868/4] = vga->vmz - 1;
1036ffa04b9dSDavid du Colombier }
1037bb0aa005SDavid du Colombier
10386c83e8f8SDavid du Colombier nv->pgraph[0x0B20/4] = 0;
1039ffa04b9dSDavid du Colombier nv->pgraph[0x0B04/4] = 0xFFFFFFFF;
1040bb0aa005SDavid du Colombier }
1041bb0aa005SDavid du Colombier }
1042bb0aa005SDavid du Colombier
1043bb0aa005SDavid du Colombier nv->pgraph[0x053C/4] = 0;
1044bb0aa005SDavid du Colombier nv->pgraph[0x0540/4] = 0;
1045bb0aa005SDavid du Colombier nv->pgraph[0x0544/4] = 0x00007FFF;
1046bb0aa005SDavid du Colombier nv->pgraph[0x0548/4] = 0x00007FFF;
1047bb0aa005SDavid du Colombier
10486c83e8f8SDavid du Colombier nv->pfifo[0x0140] = 0;
1049bb0aa005SDavid du Colombier nv->pfifo[0x0141] = 0x00000001;
10506c83e8f8SDavid du Colombier nv->pfifo[0x0480] = 0;
10516c83e8f8SDavid du Colombier nv->pfifo[0x0494] = 0;
1052ffa04b9dSDavid du Colombier if (nv->arch >= 40)
1053ffa04b9dSDavid du Colombier nv->pfifo[0x0481] = 0x00010000;
1054ffa04b9dSDavid du Colombier else
1055bb0aa005SDavid du Colombier nv->pfifo[0x0481] = 0x00000100;
10566c83e8f8SDavid du Colombier nv->pfifo[0x0490] = 0;
10576c83e8f8SDavid du Colombier nv->pfifo[0x0491] = 0;
1058ffa04b9dSDavid du Colombier if (nv->arch >= 40)
1059ffa04b9dSDavid du Colombier nv->pfifo[0x048B] = 0x00001213;
1060ffa04b9dSDavid du Colombier else
1061bb0aa005SDavid du Colombier nv->pfifo[0x048B] = 0x00001209;
10626c83e8f8SDavid du Colombier nv->pfifo[0x0400] = 0;
10636c83e8f8SDavid du Colombier nv->pfifo[0x0414] = 0;
1064bb0aa005SDavid du Colombier nv->pfifo[0x0084] = 0x03000100;
1065bb0aa005SDavid du Colombier nv->pfifo[0x0085] = 0x00000110;
1066bb0aa005SDavid du Colombier nv->pfifo[0x0086] = 0x00000112;
1067bb0aa005SDavid du Colombier nv->pfifo[0x0143] = 0x0000FFFF;
1068bb0aa005SDavid du Colombier nv->pfifo[0x0496] = 0x0000FFFF;
10696c83e8f8SDavid du Colombier nv->pfifo[0x0050] = 0;
1070bb0aa005SDavid du Colombier nv->pfifo[0x0040] = 0xFFFFFFFF;
1071bb0aa005SDavid du Colombier nv->pfifo[0x0415] = 0x00000001;
10726c83e8f8SDavid du Colombier nv->pfifo[0x048C] = 0;
10736c83e8f8SDavid du Colombier nv->pfifo[0x04A0] = 0;
1074bb0aa005SDavid du Colombier nv->pfifo[0x0489] = 0x000F0078;
1075bb0aa005SDavid du Colombier nv->pfifo[0x0488] = 0x00000001;
1076bb0aa005SDavid du Colombier nv->pfifo[0x0480] = 0x00000001;
1077bb0aa005SDavid du Colombier nv->pfifo[0x0494] = 0x00000001;
1078bb0aa005SDavid du Colombier nv->pfifo[0x0495] = 0x00000001;
1079bb0aa005SDavid du Colombier nv->pfifo[0x0140] = 0x00000001;
1080bb0aa005SDavid du Colombier
1081bb0aa005SDavid du Colombier if (nv->arch >= 10) {
1082bb0aa005SDavid du Colombier if (nv->twoheads) {
1083bb0aa005SDavid du Colombier nv->pcrtc[0x0860/4] = nv->head;
1084bb0aa005SDavid du Colombier nv->pcrtc[0x2860/4] = nv->head2;
1085bb0aa005SDavid du Colombier }
1086bb0aa005SDavid du Colombier nv->pramdac[0x0404/4] |= (1 << 25);
10879a747e4fSDavid du Colombier
10889a747e4fSDavid du Colombier nv->pmc[0x8704/4] = 1;
10899a747e4fSDavid du Colombier nv->pmc[0x8140/4] = 0;
10909a747e4fSDavid du Colombier nv->pmc[0x8920/4] = 0;
10919a747e4fSDavid du Colombier nv->pmc[0x8924/4] = 0;
1092bb0aa005SDavid du Colombier nv->pmc[0x8908/4] = vga->vmz - 1;
1093bb0aa005SDavid du Colombier nv->pmc[0x890C/4] = vga->vmz - 1;
109406f2054cSDavid du Colombier nv->pmc[0x1588/4] = 0;
10959a747e4fSDavid du Colombier
1096bb0aa005SDavid du Colombier nv->pcrtc[0x0810/4] = nv->cursorconfig;
1097ffa04b9dSDavid du Colombier nv->pcrtc[0x0830/4] = nv->displayV - 3;
1098ffa04b9dSDavid du Colombier nv->pcrtc[0x0834/4] = nv->displayV - 1;
109906f2054cSDavid du Colombier
11003ff48bf5SDavid du Colombier if (nv->islcd) {
1101ffa04b9dSDavid du Colombier if((nv->did & 0x0ff0) == 0x0110)
1102bb0aa005SDavid du Colombier nv->pramdac[0x0528/4] = nv->dither;
1103ffa04b9dSDavid du Colombier else if (nv->twoheads)
1104bb0aa005SDavid du Colombier nv->pramdac[0x083C/4] = nv->dither;
1105ffa04b9dSDavid du Colombier vgaxo(Crtx, 0x53, nv->timingH);
1106ffa04b9dSDavid du Colombier vgaxo(Crtx, 0x54, nv->timingV);
1107bb0aa005SDavid du Colombier vgaxo(Crtx, 0x21, 0xFA);
11083ff48bf5SDavid du Colombier }
1109bb0aa005SDavid du Colombier vgaxo(Crtx, 0x41, nv->extra);
1110bb0aa005SDavid du Colombier }
1111bb0aa005SDavid du Colombier
1112bb0aa005SDavid du Colombier vgaxo(Crtx, 0x19, nv->repaint0);
1113bb0aa005SDavid du Colombier vgaxo(Crtx, 0x1A, nv->repaint1);
1114bb0aa005SDavid du Colombier vgaxo(Crtx, 0x25, nv->screen);
1115bb0aa005SDavid du Colombier vgaxo(Crtx, 0x28, nv->pixel);
1116bb0aa005SDavid du Colombier vgaxo(Crtx, 0x2D, nv->horiz);
1117bb0aa005SDavid du Colombier vgaxo(Crtx, 0x30, nv->cursor0);
1118bb0aa005SDavid du Colombier vgaxo(Crtx, 0x31, nv->cursor1);
1119bb0aa005SDavid du Colombier vgaxo(Crtx, 0x2F, nv->cursor2);
1120bb0aa005SDavid du Colombier vgaxo(Crtx, 0x39, nv->interlace);
1121bb0aa005SDavid du Colombier
1122ffa04b9dSDavid du Colombier if (nv->islcd) {
1123bb0aa005SDavid du Colombier nv->pramdac[0x00000848/4] = nv->scale;
1124ffa04b9dSDavid du Colombier nv->pramdac[0x00000828/4] = nv->crtcsync;
1125ffa04b9dSDavid du Colombier } else {
1126*588b1baaSDavid du Colombier nv->pramdac[0x50C/4] = nv->pllsel;
1127*588b1baaSDavid du Colombier nv->pramdac[0x508/4] = nv->vpll;
1128bb0aa005SDavid du Colombier if (nv->twoheads)
1129*588b1baaSDavid du Colombier nv->pramdac[0x520/4] = nv->vpll2;
1130bb0aa005SDavid du Colombier if (nv->twostagepll) {
1131*588b1baaSDavid du Colombier nv->pramdac[0x578/4] = nv->vpllB;
1132*588b1baaSDavid du Colombier nv->pramdac[0x57C/4] = nv->vpll2B;
1133bb0aa005SDavid du Colombier }
11343ff48bf5SDavid du Colombier }
11359a747e4fSDavid du Colombier nv->pramdac[0x00000600/4] = nv->general;
11369a747e4fSDavid du Colombier
1137bb0aa005SDavid du Colombier nv->pcrtc[0x0140/4] = 0;
1138bb0aa005SDavid du Colombier nv->pcrtc[0x0100/4] = 1;
1139bb0aa005SDavid du Colombier
11409a747e4fSDavid du Colombier ctlr->flag |= Fload;
11419a747e4fSDavid du Colombier }
11429a747e4fSDavid du Colombier
11439a747e4fSDavid du Colombier
11449a747e4fSDavid du Colombier static void
dump(Vga * vga,Ctlr * ctlr)11459a747e4fSDavid du Colombier dump(Vga* vga, Ctlr* ctlr)
11469a747e4fSDavid du Colombier {
11479a747e4fSDavid du Colombier Nvidia *nv;
1148bb0aa005SDavid du Colombier int m, n, p, f;
11499a747e4fSDavid du Colombier double trouble;
11509a747e4fSDavid du Colombier
11519a747e4fSDavid du Colombier if((nv = vga->private) == 0)
11529a747e4fSDavid du Colombier return;
11539a747e4fSDavid du Colombier
11549a747e4fSDavid du Colombier p = (nv->vpll >> 16);
11559a747e4fSDavid du Colombier n = (nv->vpll >> 8) & 0xFF;
11569a747e4fSDavid du Colombier m = nv->vpll & 0xFF;
11579a747e4fSDavid du Colombier trouble = nv->crystalfreq;
11589a747e4fSDavid du Colombier trouble = trouble * n / (m<<p);
11599a747e4fSDavid du Colombier f = trouble+0.5;
11609a747e4fSDavid du Colombier printitem(ctlr->name, "dclk m n p");
11619a747e4fSDavid du Colombier Bprint(&stdout, " %d %d - %d %d\n", f, m, n, p);
11629a747e4fSDavid du Colombier printitem(ctlr->name, "CrystalFreq");
11639a747e4fSDavid du Colombier Bprint(&stdout, " %d Hz\n", nv->crystalfreq);
1164bb0aa005SDavid du Colombier printitem(ctlr->name, "arch");
1165bb0aa005SDavid du Colombier Bprint(&stdout, " %d\n", nv->arch);
1166ffa04b9dSDavid du Colombier printitem(ctlr->name, "did");
1167ffa04b9dSDavid du Colombier Bprint(&stdout, " %.4ux\n", nv->did);
1168bb0aa005SDavid du Colombier printitem(ctlr->name, "repaint0");
1169bb0aa005SDavid du Colombier Bprint(&stdout, " %ux\n", nv->repaint0);
1170bb0aa005SDavid du Colombier printitem(ctlr->name, "repaint1");
1171bb0aa005SDavid du Colombier Bprint(&stdout, " %ux\n", nv->repaint1);
1172bb0aa005SDavid du Colombier printitem(ctlr->name, "screen");
1173bb0aa005SDavid du Colombier Bprint(&stdout, " %ux\n", nv->screen);
1174bb0aa005SDavid du Colombier printitem(ctlr->name, "pixel");
1175bb0aa005SDavid du Colombier Bprint(&stdout, " %ux\n", nv->pixel);
1176bb0aa005SDavid du Colombier printitem(ctlr->name, "horiz");
1177bb0aa005SDavid du Colombier Bprint(&stdout, " %ux\n", nv->horiz);
1178bb0aa005SDavid du Colombier printitem(ctlr->name, "cursor0");
1179bb0aa005SDavid du Colombier Bprint(&stdout, " %ux\n", nv->cursor0);
1180bb0aa005SDavid du Colombier printitem(ctlr->name, "cursor1");
1181bb0aa005SDavid du Colombier Bprint(&stdout, " %ux\n", nv->cursor1);
11829a747e4fSDavid du Colombier printitem(ctlr->name, "cursor2");
1183bb0aa005SDavid du Colombier Bprint(&stdout, " %ux\n", nv->cursor2);
1184bb0aa005SDavid du Colombier printitem(ctlr->name, "interlace");
1185bb0aa005SDavid du Colombier Bprint(&stdout, " %ux\n", nv->interlace);
1186bb0aa005SDavid du Colombier printitem(ctlr->name, "extra");
1187bb0aa005SDavid du Colombier Bprint(&stdout, " %ux\n", nv->extra);
1188bb0aa005SDavid du Colombier printitem(ctlr->name, "crtcowner");
1189bb0aa005SDavid du Colombier Bprint(&stdout, " %ux\n", nv->crtcowner);
1190ffa04b9dSDavid du Colombier printitem(ctlr->name, "timingH");
1191ffa04b9dSDavid du Colombier Bprint(&stdout, " %ux\n", nv->timingH);
1192ffa04b9dSDavid du Colombier printitem(ctlr->name, "timingV");
1193ffa04b9dSDavid du Colombier Bprint(&stdout, " %ux\n", nv->timingV);
11949a747e4fSDavid du Colombier printitem(ctlr->name, "vpll");
11959a747e4fSDavid du Colombier Bprint(&stdout, " %lux\n", nv->vpll);
1196bb0aa005SDavid du Colombier printitem(ctlr->name, "vpllB");
1197bb0aa005SDavid du Colombier Bprint(&stdout, " %lux\n", nv->vpllB);
1198bb0aa005SDavid du Colombier printitem(ctlr->name, "vpll2");
1199bb0aa005SDavid du Colombier Bprint(&stdout, " %lux\n", nv->vpll2);
1200bb0aa005SDavid du Colombier printitem(ctlr->name, "vpll2B");
1201bb0aa005SDavid du Colombier Bprint(&stdout, " %lux\n", nv->vpll2B);
12029a747e4fSDavid du Colombier printitem(ctlr->name, "pllsel");
12039a747e4fSDavid du Colombier Bprint(&stdout, " %lux\n", nv->pllsel);
12049a747e4fSDavid du Colombier printitem(ctlr->name, "general");
12059a747e4fSDavid du Colombier Bprint(&stdout, " %lux\n", nv->general);
12063ff48bf5SDavid du Colombier printitem(ctlr->name, "scale");
12073ff48bf5SDavid du Colombier Bprint(&stdout, " %lux\n", nv->scale);
12089a747e4fSDavid du Colombier printitem(ctlr->name, "config");
12099a747e4fSDavid du Colombier Bprint(&stdout, " %lux\n", nv->config);
1210bb0aa005SDavid du Colombier printitem(ctlr->name, "head");
1211bb0aa005SDavid du Colombier Bprint(&stdout, " %lux\n", nv->head);
1212bb0aa005SDavid du Colombier printitem(ctlr->name, "head2");
1213bb0aa005SDavid du Colombier Bprint(&stdout, " %lux\n", nv->head2);
1214bb0aa005SDavid du Colombier printitem(ctlr->name, "cursorconfig");
1215bb0aa005SDavid du Colombier Bprint(&stdout, " %lux\n", nv->cursorconfig);
1216bb0aa005SDavid du Colombier printitem(ctlr->name, "dither");
1217bb0aa005SDavid du Colombier Bprint(&stdout, " %lux\n", nv->dither);
1218ffa04b9dSDavid du Colombier printitem(ctlr->name, "crtcsync");
1219ffa04b9dSDavid du Colombier Bprint(&stdout, " %lux\n", nv->crtcsync);
12203ff48bf5SDavid du Colombier printitem(ctlr->name, "islcd");
12213ff48bf5SDavid du Colombier Bprint(&stdout, " %d\n", nv->islcd);
1222bb0aa005SDavid du Colombier printitem(ctlr->name, "twoheads");
1223bb0aa005SDavid du Colombier Bprint(&stdout, " %d\n", nv->twoheads);
1224bb0aa005SDavid du Colombier printitem(ctlr->name, "twostagepll");
1225bb0aa005SDavid du Colombier Bprint(&stdout, " %d\n", nv->twostagepll);
1226bb0aa005SDavid du Colombier printitem(ctlr->name, "crtcnumber");
1227bb0aa005SDavid du Colombier Bprint(&stdout, " %d\n", nv->crtcnumber);
122825f7656aSDavid du Colombier
122925f7656aSDavid du Colombier printitem(ctlr->name, "fpwidth");
123025f7656aSDavid du Colombier Bprint(&stdout, " %d\n", nv->fpwidth);
123125f7656aSDavid du Colombier printitem(ctlr->name, "fpheight");
123225f7656aSDavid du Colombier Bprint(&stdout, " %d\n", nv->fpheight);
123325f7656aSDavid du Colombier
12349a747e4fSDavid du Colombier }
12359a747e4fSDavid du Colombier
1236bb0aa005SDavid du Colombier
12379a747e4fSDavid du Colombier Ctlr nvidia = {
12389a747e4fSDavid du Colombier "nvidia", /* name */
12399a747e4fSDavid du Colombier snarf, /* snarf */
12409a747e4fSDavid du Colombier options, /* options */
12419a747e4fSDavid du Colombier init, /* init */
12429a747e4fSDavid du Colombier load, /* load */
12439a747e4fSDavid du Colombier dump, /* dump */
12449a747e4fSDavid du Colombier };
12459a747e4fSDavid du Colombier
12469a747e4fSDavid du Colombier Ctlr nvidiahwgc = {
12479a747e4fSDavid du Colombier "nvidiahwgc", /* name */
12489a747e4fSDavid du Colombier 0, /* snarf */
12499a747e4fSDavid du Colombier 0, /* options */
12509a747e4fSDavid du Colombier 0, /* init */
12519a747e4fSDavid du Colombier 0, /* load */
12529a747e4fSDavid du Colombier 0, /* dump */
12539a747e4fSDavid du Colombier };
1254