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