/*
xgapos.c
I don't need the entire xf86config, so I grabbed the appropriate
chunks of Anders' xf86config mods, hacked some of the extraneous
stuff out (/proc/mca/pos usually doesn't change after boot, for
example, and some sscanf magic), and made it dump the important
stuff - the device section. Plus a bugfix (which he didn't
encounter 'cause his adapter is in the last slot checked).
You may have to change the chipset value for some XGA-1 cards -
I know mine works, but there may be others.
Chris Beauregard ([email protected])
*/
#include
#include
int
main() {
/*
* This part was made by Anders Johansson
* This has only been tested on a IBM 9557 (486SLC-2/50 with onboard XGA-2)
* but should hopefully work with all MCA XGA-2 and probably also XGA-1
* This needs the MCA patch for 2.0.7 kernel from 1 Sep 96. (or at least
* the same format for the /proc/mca/pos file.
*/
const char* const mca_file = "/proc/mca/pos";
int regflag=0;
int i,j;
char ch;
FILE* proc_mca;
int posreg[8];
int xgareg[8];
char tmp[80];
int Instance,IObase,COPbase,MEMbase,BIOSbase;
/*
* Open the message file.
*/
if((proc_mca = fopen( "/proc/mca/pos","r"))== 0)
{
printf(" # /proc/mca/pos was not found, are you useing the MCA patches ?\n");
return 1;
}
while(1) {
/*
* Get one line.
*/
if( fgets(tmp,80,proc_mca) == NULL ) break;
sscanf(tmp,"%*[^:]: %x %x %x %x %x %x %x %x ",&posreg[0],&posreg[1],&posreg[2],&posreg[3],&posreg[4],&posreg[5],&posreg[6],&posreg[7]);
/*
* Check if this looks like a XGA type of card
*/
if(posreg[1] == 0x8f && (posreg[0] > 0xd7 && posreg[0] < 0xdc))
{
regflag++;
for(j=0;j<8;j++)
{
xgareg[j]=posreg[j];
}
}
}
fclose(proc_mca);
if ( regflag==0 )
{
printf( " # Could not find any pos regs in /proc/mca/pos\n# are you useing the MCA patches ?\n");
return 1;
}
if ( regflag > 1 )
printf( " # Warning, looks like more than one XGA card.\n # Selecting the LAST one.");
/*
* Calculating configuration from pos regs.
*/
Instance = (xgareg[2] & 0xe) >> 1;
IObase = 0x2100 + (Instance << 4);
MEMbase = (xgareg[4] & 0x000000fe) * 0x1000000 + (Instance << 22);
COPbase = 0xc1c00 + (((xgareg[2] & 0xf0) >> 4) * 0x2000) + (Instance * 0x80);
BIOSbase = 0xc0000 + (((xgareg[2] & 0xf0) >> 4) * 0x2000);
/*
* Print out result to string.
*/
printf(" CHIPSET \"XGA-2\"\n Instance %d\n IObase 0x%x\n COPbase 0x%x\n MEMbase 0x%x\n BIOSbase 0x%x\n",
Instance, IObase,COPbase, MEMbase,BIOSbase);
return 0;
}