dRegs.c revision c06b6b69
1c06b6b69Smrg/* $XConsortium: dRegs.c /main/2 1996/10/27 11:49:40 kaleb $ */
2c06b6b69Smrg
3c06b6b69Smrg
4c06b6b69Smrg
5c06b6b69Smrg
6c06b6b69Smrg
7c06b6b69Smrg/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/chips/util/dRegs.c,v 1.8 2001/10/01 13:44:04 eich Exp $ */
8c06b6b69Smrg
9c06b6b69Smrg#ifdef __NetBSD__
10c06b6b69Smrg#  include <sys/types.h>
11c06b6b69Smrg#  include <machine/pio.h>
12c06b6b69Smrg#  include <machine/sysarch.h>
13c06b6b69Smrg#else
14c06b6b69Smrg#  if defined(SVR4) && defined(i386)
15c06b6b69Smrg#    include <sys/types.h>
16c06b6b69Smrg#    ifdef NCR
17c06b6b69Smrg       /* broken NCR <sys/sysi86.h> */
18c06b6b69Smrg#      define __STDC
19c06b6b69Smrg#      include <sys/sysi86.h>
20c06b6b69Smrg#      undef __STDC
21c06b6b69Smrg#    else
22c06b6b69Smrg#      include <sys/sysi86.h>
23c06b6b69Smrg#    endif
24c06b6b69Smrg#    ifdef SVR4
25c06b6b69Smrg#      if !defined(sun)
26c06b6b69Smrg#        include <sys/seg.h>
27c06b6b69Smrg#      endif
28c06b6b69Smrg#    endif
29c06b6b69Smrg#    include <sys/v86.h>
30c06b6b69Smrg#    if defined(sun)
31c06b6b69Smrg#      include <sys/psw.h>
32c06b6b69Smrg#    endif
33c06b6b69Smrg#  endif
34c06b6b69Smrg#  include "AsmMacros.h"
35c06b6b69Smrg#endif /* NetBSD */
36c06b6b69Smrg
37c06b6b69Smrg#include <unistd.h>
38c06b6b69Smrg#include <stdio.h>
39c06b6b69Smrg#include <stdlib.h>
40c06b6b69Smrg
41c06b6b69Smrg#ifdef __NetBSD__
42c06b6b69Smrg#  define SET_IOPL() i386_iopl(3)
43c06b6b69Smrg#  define RESET_IOPL() i386_iopl(0)
44c06b6b69Smrg#else
45c06b6b69Smrg#  if defined(SVR4) && defined(i386)
46c06b6b69Smrg#    ifndef SI86IOPL
47c06b6b69Smrg#      define SET_IOPL() sysi86(SI86V86,V86SC_IOPL,PS_IOPL)
48c06b6b69Smrg#      define RESET_IOPL() sysi86(SI86V86,V86SC_IOPL,0)
49c06b6b69Smrg#    else
50c06b6b69Smrg#      define SET_IOPL() sysi86(SI86IOPL,3)
51c06b6b69Smrg#      define RESET_IOPL() sysi86(SI86IOPL,0)
52c06b6b69Smrg#    endif
53c06b6b69Smrg#  else
54c06b6b69Smrg#    ifdef linux
55c06b6b69Smrg#      define SET_IOPL() iopl(3)
56c06b6b69Smrg#      define RESET_IOPL() iopl(0)
57c06b6b69Smrg#    else
58c06b6b69Smrg#      define SET_IOPL() (void)0
59c06b6b69Smrg#      define RESET_IOPL() (void)0
60c06b6b69Smrg#    endif
61c06b6b69Smrg#  endif
62c06b6b69Smrg#endif
63c06b6b69Smrg
64c06b6b69Smrgint main(void)
65c06b6b69Smrg{
66c06b6b69Smrg    int i, HTotal, HDisplay, HSyncStart, HSyncEnd,
67c06b6b69Smrg    VTotal, VDisplay, VSyncStart, VSyncEnd;
68c06b6b69Smrg    unsigned char storeReg, bpp, shift, IOSS = 0, MSS = 0, again = 0;
69c06b6b69Smrg    unsigned short port;
70c06b6b69Smrg    int isHiQV = 0;
71c06b6b69Smrg    int is69030 = 0;
72c06b6b69Smrg
73c06b6b69Smrg    SET_IOPL();
74c06b6b69Smrg
75c06b6b69Smrg    printf("0x3C6\t0x%X\n",inw(0x3C6));
76c06b6b69Smrg
77c06b6b69Smrg/* Check to see if the Chip is HiQV */
78c06b6b69Smrg    outb(0x3D6,0x02);
79c06b6b69Smrg    storeReg = inb(0x3D7);
80c06b6b69Smrg    if (storeReg == 0xE0	/* CT65550 */
81c06b6b69Smrg	|| storeReg == 0xE4	/* CT65554 */
82c06b6b69Smrg	|| storeReg == 0xE5	/* CT65555 */
83c06b6b69Smrg	|| storeReg == 0xF4	/* CT68554 */
84c06b6b69Smrg	|| storeReg == 0xC0)	/* CT69000 */
85c06b6b69Smrg    {
86c06b6b69Smrg	isHiQV = 1;
87c06b6b69Smrg    } else if (storeReg == 0x30) {
88c06b6b69Smrg      outb(0x3D6,0x03);
89c06b6b69Smrg      storeReg = inb(0x3D7);
90c06b6b69Smrg      if (storeReg == 0xC) {
91c06b6b69Smrg	isHiQV = 1;
92c06b6b69Smrg	is69030 = 1;
93c06b6b69Smrg	IOSS=inb(0x3CD);
94c06b6b69Smrg	MSS=inb(0x3CB);
95c06b6b69Smrg	outb(0x3CD,((IOSS&0xE0)| 0x11));  /* Select Channel 0 */
96c06b6b69Smrg	outb(0x3CB,((MSS&0xF0)| 0x8));
97c06b6b69Smrg	again = 1;
98c06b6b69Smrg	printf("Pipeline A:\n");
99c06b6b69Smrg      }
100c06b6b69Smrg    }
101c06b6b69Smrg
102c06b6b69Smrg again:
103c06b6b69Smrg    printf("port 0x3D6 (C&T)\n");
104c06b6b69Smrg    storeReg = inb(0x3D6);
105c06b6b69Smrg    shift = 3;
106c06b6b69Smrg    if (isHiQV==1) {
107c06b6b69Smrg	outw(0x102,1);	/*global enable, VGA awake*/
108c06b6b69Smrg	printf("0x%2.2X\n",inb(0x3C3)&0xFF);
109c06b6b69Smrg	outb(0x3C3,0);	/*disable VGA*/
110c06b6b69Smrg	outb(0x3C3,1);	/*enable VGA*/
111c06b6b69Smrg	for(i = 0;i < 0xFF;i++){
112c06b6b69Smrg	    outb(0x3D6,i);
113c06b6b69Smrg	    printf("XR 0x%2.2X\t0x%2.2X\n",i,inb(0x3D7)&0xFF);
114c06b6b69Smrg	}
115c06b6b69Smrg	outb(0x3D6,0xE2);
116c06b6b69Smrg	bpp = inb(0x3D7)&0xF0;
117c06b6b69Smrg    } else {
118c06b6b69Smrg	outb(0x3D6, 0x70);
119c06b6b69Smrg	outw(0x3D6, (inw(0x3D6) | 0x8070));
120c06b6b69Smrg	outw(0x46E8,0x0016);	/*setup mode*/
121c06b6b69Smrg	outw(0x102,1);	/*global enable, VGA awake*/
122c06b6b69Smrg	outw(0x46E8,0x000E);	/*exit from setup mode*/
123c06b6b69Smrg	printf("0x%2.2X\n",inb(0x3C3)&0xFF);
124c06b6b69Smrg	outb(0x3C3,0);	/*disable VGA*/
125c06b6b69Smrg	outw(0x46E8,0x0000);	/*exit from setup mode*/
126c06b6b69Smrg	outw(0x46E8,0x000E);	/*exit from setup mode*/
127c06b6b69Smrg	outb(0x3C3,1);	/*enable VGA*/
128c06b6b69Smrg	outw(0x46E8,0x0000);	/*exit from setup mode*/
129c06b6b69Smrg	for(i = 0;i < 0x80;i++){
130c06b6b69Smrg	    outb(0x3D6,i);
131c06b6b69Smrg	    printf("XR 0x%2.2X\t0x%2.2X\n",i,inb(0x3D7)&0xFF);
132c06b6b69Smrg	}
133c06b6b69Smrg	outb(0x3D6,0x2B);
134c06b6b69Smrg	bpp = inb(0x3D7)&0xF0;
135c06b6b69Smrg    }
136c06b6b69Smrg
137c06b6b69Smrg    switch(bpp){
138c06b6b69Smrg      case 0x20:
139c06b6b69Smrg	bpp = 4;
140c06b6b69Smrg	break;
141c06b6b69Smrg      case 0x30:
142c06b6b69Smrg	bpp = 8;
143c06b6b69Smrg	break;
144c06b6b69Smrg      case 0x40:
145c06b6b69Smrg	bpp = 16;
146c06b6b69Smrg	shift = 2;
147c06b6b69Smrg	break;
148c06b6b69Smrg      case 0x50:
149c06b6b69Smrg	bpp = 24;
150c06b6b69Smrg	break;
151c06b6b69Smrg      default:
152c06b6b69Smrg	bpp = 0;
153c06b6b69Smrg    }
154c06b6b69Smrg    outb(0x3D6,storeReg);
155c06b6b69Smrg
156c06b6b69Smrg    printf("\nport 0x3D4 (CRTC)\n");
157c06b6b69Smrg    storeReg = inb(0x3D4);
158c06b6b69Smrg    if (isHiQV==1) {
159c06b6b69Smrg	for(i = 0;i < 0x7F;i++){
160c06b6b69Smrg	    outb(0x3D4,i);
161c06b6b69Smrg	    printf("CR 0x%2.2X\t0x%2.2X\n",i,inb(0x3D5)&0xFF);
162c06b6b69Smrg	}
163c06b6b69Smrg	outb(0x3D4,storeReg);
164c06b6b69Smrg	printf("\nport 0x3D0 (Flat Panel)\n");
165c06b6b69Smrg	storeReg = inb(0x3D0);
166c06b6b69Smrg	for(i = 0;i < 0x7F;i++){
167c06b6b69Smrg	    outb(0x3D0,i);
168c06b6b69Smrg	    printf("FR 0x%2.2X\t0x%2.2X\n",i,inb(0x3D1)&0xFF);
169c06b6b69Smrg	}
170c06b6b69Smrg	outb(0x3D1,storeReg);
171c06b6b69Smrg	printf("\nport 0x3D2 (Multimedia)\n");
172c06b6b69Smrg	storeReg = inb(0x3D2);
173c06b6b69Smrg	for(i = 0;i < 0x7F;i++){
174c06b6b69Smrg	    outb(0x3D2,i);
175c06b6b69Smrg	    printf("MR 0x%2.2X\t0x%2.2X\n",i,inb(0x3D3)&0xFF);
176c06b6b69Smrg	}
177c06b6b69Smrg	outb(0x3D3,storeReg);
178c06b6b69Smrg    } else {
179c06b6b69Smrg	for(i = 0;i < 0x40;i++){
180c06b6b69Smrg	    outb(0x3D4,i);
181c06b6b69Smrg	    printf("CR 0x%2.2X\t0x%2.2X\n",i,inb(0x3D5)&0xFF);
182c06b6b69Smrg	}
183c06b6b69Smrg	outb(0x3D4,storeReg);
184c06b6b69Smrg    }
185c06b6b69Smrg
186c06b6b69Smrg
187c06b6b69Smrg    printf("port 0x3CE (GC)\n");
188c06b6b69Smrg    storeReg = inb(0x3CE);
189c06b6b69Smrg    for(i = 0;i < 0x10;i++){
190c06b6b69Smrg	outb(0x3CE,i);
191c06b6b69Smrg	printf("GC 0x%2.2X\t0x%2.2X\n",i,inb(0x3CF)&0xFF);
192c06b6b69Smrg    }
193c06b6b69Smrg    outb(0x3CE,storeReg);
194c06b6b69Smrg    printf("port 0x3C4 (Sequencer)\n");
195c06b6b69Smrg    storeReg = inb(0x3C4);
196c06b6b69Smrg    for(i = 0;i < 0x10;i++){
197c06b6b69Smrg	outb(0x3C4,i);
198c06b6b69Smrg	printf("SQ 0x%2.2X\t0x%X2.2\n",i,inb(0x3C5)&0xFF);
199c06b6b69Smrg    }
200c06b6b69Smrg    outb(0x3C4,storeReg);
201c06b6b69Smrg
202c06b6b69Smrg
203c06b6b69Smrg    printf("port 0x3C0 (Attribute)\n");
204c06b6b69Smrg    inb(0x3DA);
205c06b6b69Smrg    storeReg = inb(0x3C0);
206c06b6b69Smrg    for(i = 0;i < 0xFF;i++){
207c06b6b69Smrg	inb(0x3DA);
208c06b6b69Smrg	outb(0x3C0,i);
209c06b6b69Smrg	printf("AT 0x%2.2X\t0x%2.2X\n",i,inb(0x3C1)&0xFF);
210c06b6b69Smrg    }
211c06b6b69Smrg    inb(0x3DA);
212c06b6b69Smrg    outb(0x3C0,storeReg);
213c06b6b69Smrg
214c06b6b69Smrg    printf("0x3CC\t0x%X\n",inb(0x3CC)&0xFF);
215c06b6b69Smrg    printf("0x3C2\t0x%X\n",inb(0x3C2)&0xFF);
216c06b6b69Smrg    printf("0x3C3\t0x%X\n",inb(0x3C2)&0xFF);
217c06b6b69Smrg    printf("0x3CA\t0x%X\n",inb(0x3CA)&0xFF);
218c06b6b69Smrg    printf("0x3DA\t0x%X\n",inb(0x3DA)&0xFF);
219c06b6b69Smrg
220c06b6b69Smrg    printf("\nRAMDAC\nport\tvalue\n");
221c06b6b69Smrg    for(port = 0x83C6; port < 0x83CA;port++){
222c06b6b69Smrg      printf("0x%4X\t0x%4X\n",port,inw(port));
223c06b6b69Smrg    }
224c06b6b69Smrg
225c06b6b69Smrg    if (isHiQV!=1) {
226c06b6b69Smrg	printf("\nBitBLT\nport\tvalue\n");
227c06b6b69Smrg	for(port = 0x83D0; port <= 0x9FD0;port+=0x400){
228c06b6b69Smrg	    printf("0x%4.4X\t0x%4X\n",port,inw(port));
229c06b6b69Smrg	}
230c06b6b69Smrg
231c06b6b69Smrg	printf("\nH/W cursor\nport\tvalue\n");
232c06b6b69Smrg	for(port = 0xA3D0; port <= 0xB3D0;port+=0x400){
233c06b6b69Smrg	    printf("0x%4.4X\t0x%4X\n",port,inw(port));
234c06b6b69Smrg	}
235c06b6b69Smrg
236c06b6b69Smrg
237c06b6b69Smrg	outb(0x3D6, 0x70);
238c06b6b69Smrg	outw(0x3D6, (inw(0x3D6) | 0x8070));
239c06b6b69Smrg
240c06b6b69Smrg	printf("0x46E8\t0x%8X\n",inl(0x46E8));
241c06b6b69Smrg	printf("0x4AE8\t0x%8X\n",inl(0x4AE8));
242c06b6b69Smrg	printf("0x102\t0x%8X\n",inl(0x102));
243c06b6b69Smrg	printf("0x103\t0x%8X\n",inl(0x103));
244c06b6b69Smrg
245c06b6b69Smrg    }
246c06b6b69Smrg
247c06b6b69Smrg    storeReg = inb(0x3D4);
248c06b6b69Smrg    {
249c06b6b69Smrg	outb(0x3D4,0);
250c06b6b69Smrg	HTotal = ((inb(0x3D5)&0xFF) + 5) << shift;
251c06b6b69Smrg	outb(0x3D4,1);
252c06b6b69Smrg	HDisplay = ((inb(0x3D5)&0xFF) + 1) << shift;
253c06b6b69Smrg	outb(0x3D4,4);
254c06b6b69Smrg	HSyncStart = ((inb(0x3D5)&0xFF) + 1) << shift;
255c06b6b69Smrg	outb(0x3D4,5);
256c06b6b69Smrg	HSyncEnd = inb(0x3D5)&0x1F;
257c06b6b69Smrg	outb(0x3D4,5);
258c06b6b69Smrg	HSyncEnd += HSyncStart >> shift;
259c06b6b69Smrg	HSyncEnd <<= shift;
260c06b6b69Smrg
261c06b6b69Smrg	outb(0x3D4,6);
262c06b6b69Smrg	VTotal = inb(0x3D5)&0xFF;
263c06b6b69Smrg	outb(0x3D4,7);
264c06b6b69Smrg	VTotal |= (inb(0x3D5)&0x1) << 8;
265c06b6b69Smrg	VTotal |= (inb(0x3D5)&0x20) << 4;
266c06b6b69Smrg	VTotal += 2;
267c06b6b69Smrg	VDisplay = (inb(0x3D5)&0x2) << 7;
268c06b6b69Smrg	VDisplay |= (inb(0x3D5)&0x40) << 3;
269c06b6b69Smrg	VSyncStart = (inb(0x3D5)&0x4) << 6;
270c06b6b69Smrg	VSyncStart |= (inb(0x3D5)&0x80) << 2;
271c06b6b69Smrg	outb(0x3D4,0x12);
272c06b6b69Smrg	    VDisplay |= inb(0x3D5)&0xFF;
273c06b6b69Smrg	VDisplay += 1;
274c06b6b69Smrg	outb(0x3D4,0x10);
275c06b6b69Smrg	VSyncStart |= inb(0x3D5)&0xFF;
276c06b6b69Smrg
277c06b6b69Smrg	outb(0x3D4,0x11);
278c06b6b69Smrg	VSyncEnd = inb(0x3D5)&0xF;
279c06b6b69Smrg	VSyncEnd += VSyncStart;
280c06b6b69Smrg
281c06b6b69Smrg    }
282c06b6b69Smrg    outb(0x3D4,storeReg);
283c06b6b69Smrg
284c06b6b69Smrg    printf("\nModeLine with port 0x3D4 (CRTC) %d %d %d %d %d %d %d %d\n",
285c06b6b69Smrg	   HDisplay, HSyncStart, HSyncEnd, HTotal,
286c06b6b69Smrg	   VDisplay, VSyncStart, VSyncEnd, VTotal);
287c06b6b69Smrg
288c06b6b69Smrg
289c06b6b69Smrg    if (is69030==1) {
290c06b6b69Smrg      if (again==1) {
291c06b6b69Smrg	again=0;
292c06b6b69Smrg	printf("\n\nPipeline B:\n");
293c06b6b69Smrg	outb(0x3CD,((IOSS&0xE0)| 0x1F));  /* Select Channel 1 */
294c06b6b69Smrg	outb(0x3CB,((MSS&0xF0)| 0xF));
295c06b6b69Smrg	goto again;
296c06b6b69Smrg      } else {
297c06b6b69Smrg	outb(0x3CD,IOSS);
298c06b6b69Smrg	outb(0x3CB,MSS);
299c06b6b69Smrg	printf("\n\n0x3CB\t0x%X  (MSS)\n",inb(0x3CB)&0xFF);
300c06b6b69Smrg	printf("0x3CD\t0x%X  (IOSS)\n",inb(0x3CD)&0xFF);
301c06b6b69Smrg      }
302c06b6b69Smrg    }
303c06b6b69Smrg    RESET_IOPL();
304c06b6b69Smrg    return 0;
305c06b6b69Smrg}
306