Files
oldlinux-files/Linux-0.98/Yggdrasil-0.98.3/usr/X386/lib/X11/etc/ati.test.c
2024-02-19 00:21:16 -05:00

219 lines
6.5 KiB
C

/* $Header: /home/x_cvs/mit/server/ddx/x386/etc/ati.test.c,v 1.1 1992/08/30 03:57:44 dawes Exp $ */
/* ati.test.c -- Gather information about ATI VGA WONDER cards
* Created: Sun Aug 9 10:15:01 1992
* Revised: Fri Aug 21 14:04:29 1992 by root
* Author: Rickard E. Faith, faith@cs.unc.edu
* Copyright 1992 Rickard E. Faith; All Rights Reserved.
* May be distributed freely for any purpose as long as the
* copyright notice and the warranty disclaimer are kept.
* This program comes with ABSOLUTELY NO WARRANTY.
*
* Log
*/
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <sys/fcntl.h>
/* These are from the x386 compile.h for Linux */
static void inline outb(unsigned short port, char value)
{
__asm__ volatile ("outb %0,%1"
::"a" ((char) value),"d" ((unsigned short) port));
}
static void inline outw(unsigned short port, short value)
{
__asm__ volatile ("outw %0,%1"
::"a" ((short) value),"d" ((unsigned short) port));
}
static unsigned char inline inb(unsigned short port)
{
unsigned char _v;
__asm__ volatile ("inb %1,%0"
:"=a" (_v):"d" ((unsigned short) port));
return _v;
}
static unsigned short inline inw(unsigned short port)
{
unsigned short _v;
__asm__ volatile ("inw %1,%0"
:"=a" (_v):"d" ((unsigned short) port));
return _v;
}
#define FALSE -1
#define TRUE 0
#define ATI_BOARD_V3 0 /* which ATI board does the user have? */
#define ATI_BOARD_V4 1 /* keep these chronologically increasing */
#define ATI_BOARD_V5 2
#define ATI_BOARD_PLUS 3
#define ATI_BOARD_XL 4
int ATIExtReg, ATIBoard;
int main( void )
{
const char signature[] = " 761295520";
const int bios_data_size = 0x50;
char bios_data[bios_data_size];
char bios_signature[10];
int fd;
int videoRam;
if ((fd = open( "/dev/mem", O_RDONLY )) < 0
|| lseek( fd, 0xc0030, SEEK_SET) < 0
|| read( fd, bios_signature, 10 ) != 10) {
if (fd >= 0) close( fd );
printf( "Failed to read VGA BIOS. Cannot detect ATI card.\n" );
return FALSE;
}
if (strncmp( signature, bios_signature, 10 )) {
printf( "Incorrect Signature for ATI BIOS\n" );
return FALSE;
}
close( fd );
/* Assume an ATI card. Now look in the BIOS for magic numbers. */
if ((fd = open( "/dev/mem", O_RDONLY )) < 0
|| lseek( fd, 0xc0000, SEEK_SET ) < 0
|| read( fd, bios_data, bios_data_size ) != bios_data_size) {
if (fd >= 0) close( fd );
printf( "Failed to read VGA BIOS. Cannot set up ATI card.\n" );
return FALSE;
}
close( fd );
printf( "ATI BIOS Information Block:\n" );
printf( " Signature code: %c%c = ",
bios_data[ 0x40 ], bios_data[ 0x41 ] );
if (bios_data[ 0x40 ] != '3') printf( "Unknown\n" );
else switch( bios_data[ 0x41 ] ) {
case '1':
printf( "VGA WONDER\n" );
break;
case '2':
printf( "EGA WONDER800+\n" );
break;
case '3':
printf( "VGA BASIC-16\n" );
break;
default:
printf( "Unknown\n" );
break;
}
printf( " Chip version: %c = ",
bios_data[ 0x43 ] );
switch (bios_data[ 0x43 ] ) {
case '1':
printf( "ATI 18800\n" );
break;
case '2':
printf( "ATI 18800-1\n" );
break;
case '3':
printf( "ATI 28800-2\n" );
break;
case '4': case '5':
printf( "ATI 28800-%c\n", bios_data[ 0x43 ] );
break;
default:
printf( "Unknown\n" );
break;
}
printf( " BIOS version: %d.%d\n",
bios_data[ 0x4c ], bios_data[ 0x4d ] );
printf( "\n Byte at offset 0x42 = 0x%02x\n",
bios_data[ 0x42 ] );
printf( " 8 and 16 bit ROM supported: %s\n",
bios_data[ 0x42 ] & 0x01 ? "Yes" : "No" );
printf( " Mouse chip present: %s\n",
bios_data[ 0x42 ] & 0x02 ? "Yes" : "No" );
printf( " Inport compatible mouse port : %s\n",
bios_data[ 0x42 ] & 0x04 ? "Yes" : "No" );
printf( " Micro Channel supported: %s\n",
bios_data[ 0x42 ] & 0x08 ? "Yes" : "No" );
printf( " Clock chip present: %s\n",
bios_data[ 0x42 ] & 0x10 ? "Yes" : "No" );
printf( " Uses c000:0 to d000:ffff: %s\n",
bios_data[ 0x42 ] & 0x80 ? "Yes" : "No" );
printf( "\n Byte at offset 0x44 = 0x%02x\n",
bios_data[ 0x44 ] );
printf( " Supports 70Hz non-interlaced: %s\n",
bios_data[ 0x44 ] & 0x01 ? "No" : "Yes" );
printf( " Supports Korean characters: %s\n",
bios_data[ 0x44 ] & 0x02 ? "Yes" : "No" );
printf( " Uses 45Mhz memory clock: %s\n",
bios_data[ 0x44 ] & 0x04 ? "Yes" : "No" );
printf( " Supports zero wait states: %s\n",
bios_data[ 0x44 ] & 0x08 ? "Yes" : "No" );
printf( " Uses paged ROMS: %s\n",
bios_data[ 0x44 ] & 0x10 ? "Yes" : "No" );
printf( " 8514/A hardware on board: %s\n",
bios_data[ 0x44 ] & 0x40 ? "No" : "Yes" );
printf( " 32K color DAC on board: %s\n",
bios_data[ 0x44 ] & 0x80 ? "Yes" : "No" );
ATIExtReg = *((short int *)bios_data + 0x08);
ioperm( ATIExtReg, 2, 1 );
switch( bios_data[ 0x43 ] ) {
case '1':
ATIBoard = ATI_BOARD_V3;
break;
case '2':
if (bios_data[ 0x42 ] & 0x10) ATIBoard = ATI_BOARD_V5;
else ATIBoard = ATI_BOARD_V4;
break;
case '3':
case '4':
ATIBoard = ATI_BOARD_PLUS;
break;
case '5':
default:
if (bios_data[ 0x44 ] & 0x80) ATIBoard = ATI_BOARD_XL;
else ATIBoard = ATI_BOARD_PLUS;
}
printf( "\nThis video adapter is a: " );
switch (ATIBoard) {
case ATI_BOARD_V3: printf( "VGA WONDER V3\n" ); break;
case ATI_BOARD_V4: printf( "VGA WONDER V4\n" ); break;
case ATI_BOARD_V5: printf( "VGA WONDER V5\n" ); break;
case ATI_BOARD_PLUS: printf( "VGA WONDER PLUS (V6)\n" ); break;
case ATI_BOARD_XL: printf( "VGA WONDER XL (V7)\n" ); break;
default: printf( "Unknown\n" ); break;
}
videoRam = 0;
if (bios_data[ 0x43 ] <= '2') {
outb( ATIExtReg, 0xbb );
videoRam = (inb( ATIExtReg + 1 ) & 0x20) ? 512 : 256;
} else {
outb( ATIExtReg, 0xb0 );
switch (inb( ATIExtReg + 1 ) & 0x18) {
case 0x00:
videoRam = 256;
break;
case 0x10:
videoRam = 512;
break;
case 0x08:
videoRam = 1024;
break;
}
}
printf( "Amount of RAM on video adapter: %dk\n", videoRam );
printf( "\nThe extended registers (ATIExtREG) are at 0x%x\n", ATIExtReg );
printf( "The x386 ATI driver will set ATIBoard = %d\n", ATIBoard );
return TRUE;
}