FxBool hwcInitRegisters(hwcBoardInfo *bInfo) { int dramInit1; if (bInfo->linearInfo.initialized == FXFALSE) { printf(errorString, "hwcInitRegisters Called before hwcMapBoard\n"); return FXFALSE; } bInfo->regInfo.initialized = FXTRUE; bInfo->regInfo.ioMemBase = bInfo->linearInfo.linearAddress[0] + SST_IO_OFFSET; bInfo->regInfo.cmdAGPBase = bInfo->linearInfo.linearAddress[0] + SST_CMDAGP_OFFSET; bInfo->regInfo.waxBase = bInfo->linearInfo.linearAddress[0] + SST_2D_OFFSET; bInfo->regInfo.sstBase = bInfo->linearInfo.linearAddress[0] + SST_3D_OFFSET; bInfo->regInfo.lfbBase = bInfo->linearInfo.linearAddress[0] + SST_LFB_OFFSET; bInfo->regInfo.rawLfbBase = bInfo->linearInfo.linearAddress[1]; bInfo->regInfo.ioPortBase = (FxU16) bInfo->pciInfo.pciBaseAddr[2] & ~0x1; /* Figure out if it's SDRAM */ HWC_IO_LOAD(bInfo->regInfo, dramInit1, dramInit1); dramInit1 &= SST_MCTL_TYPE_SDRAM; if ( dramInit1 & SST_MCTL_TYPE_SDRAM ) bInfo->sdRAM = FXTRUE; else bInfo->sdRAM = FXFALSE; { FxU32 pciInit0, pciCommandReg = BIT(0) | /* enable i/o decode */ BIT(1); /* enable memory decode */ /* Enable PCI memory and I/O decode */ pciSetConfigData(PCI_COMMAND, bInfo->deviceNum, &pciCommandReg); HWC_IO_LOAD(bInfo->regInfo, pciInit0, pciInit0); pciInit0 |= SST_PCI_READ_WS | SST_PCI_WRITE_WS; HWC_IO_STORE(bInfo->regInfo, pciInit0, pciInit0); } return FXTRUE; }
//---------------------------------------------------------------------- // MAIN Program //---------------------------------------------------------------------- int main(int argc, char **argv) { // FxU32 vendorID = 0x1002; // ATI // FxU32 deviceID = 0x4758; // Mach64 int configSpace = 0, loop = 0; FxU32 vendorID = _3DFX_PCI_ID; // 3Dfx FxU32 deviceID = 0xFFFF; // any card FxI32 sizeOfCard = 0x1000000; // 16 Mbytes FxU32 deviceNumber; FxU32 instance = 0; FxU32 *sst, addr,data; CmdCode cmd = CMD_SCAN; //------------------------------------------------------------------ // parse the command line while (--argc > 0 && **++argv == '-') { char *token, *ctmp; for (token = argv[0] + 1; *token; token++) switch (*token) { case '?': usage(); break; case 'b': // set the baseAddress of the card to this value sscanf(GETARG,"%i",&addr); cmd = CMD_BASE; break; case 'c': configSpace = 1; break; case 'd': // override default deviceID sscanf(GETARG,"%i",&deviceID); break; case 'i': // override default instance sscanf(GETARG,"%i",&instance); break; case 'l': loop = 1; break; case 'r': cmd = CMD_READ; sscanf(GETARG,"%i",&addr); break; case 's': cmd = CMD_STATUS; break; case 'v': // override default deviceID sscanf(GETARG,"%i",&vendorID); break; case 'w': cmd = CMD_WRITE; sscanf(GETARG,"%i",&addr); sscanf(GETARG,"%i",&data); break; default: fprintf(stderr,"illegal option %c\n", *token); break; } } if (argc > 2) usage(); if (argc > 0) { sscanf(argv[0],"%i",&addr); if (argc > 1) { cmd = CMD_WRITE; sscanf(argv[1],"%i",&data); } else cmd = CMD_READ; } // if scanning or status, then do it and exit. if (cmd == CMD_SCAN) { cmdScan(); return 0; } if (cmd == CMD_STATUS) { // display PCI status if (pciFindCard(vendorID, deviceID, &deviceNumber)) cmdStatus(deviceNumber, vendorID == _3DFX_PCI_ID); else { fprintf(stderr, "error: could not find card 0x%04x,0x%04x.\n", vendorID, deviceID); exit(2); } return 0; } if (cmd == CMD_BASE) sizeOfCard = -1; // hack //------------------------------------------------------------------ // find and map the card into virtual memory //sst = pciMapCard(vendorID,deviceID,sizeOfCard, &deviceNumber); sst = pciMapCardMulti(vendorID,deviceID,sizeOfCard, &deviceNumber, instance, 0); if (sst == NULL) { fprintf(stderr, "error: could not find card 0x%04x,0x%04x.\n", vendorID, deviceID); exit(2); } //------------------------------------------------------------------ // execute the requested action switch(cmd) { case CMD_BASE: // change the base address of the card pciSetConfigData( PCI_BASE_ADDRESS_0, deviceNumber, &addr ); break; case CMD_READ: // read a DWORD if (addr & 0x3) { fprintf(stderr,"unaligned accesses NYI, addr=0x%x\n",addr); exit(4); } addr >>= 2; // make it a dword index data = sst[addr]; fprintf(stdout,"read 0x%08x(%d) from 0x%x\n",data,data,addr<<2); while (loop) data = sst[addr]; break; case CMD_WRITE: // write a DWORD if (addr & 0x3) { fprintf(stderr,"unaligned accesses NYI, addr=0x%x\n",addr); exit(4); } if (configSpace) { int i; for (i=0; i<sizeof(pciRegArray)/sizeof(*pciRegArray); i++) { if (pciRegArray[i]->regAddress == addr) { if (pciRegArray[i]->rwFlag == READ_ONLY) { fprintf(stderr,"cannot write READ_ONLY address\n"); exit(5); } pciSetConfigData( *pciRegArray[i], deviceNumber, &data ); goto found; } } fprintf(stderr,"config address register 0x%x descriptor not found\n",addr); exit(6); found: ; } else { addr >>= 2; // make it a dword index do {sst[addr] = data;} while (loop); } break; default: usage(); } //---------------------------------------------------------------------- // cleanup: unmap the card, close down the PCI bus and return pciUnmapPhysical( (unsigned long)sst, sizeOfCard ); if ( !pciClose() ) { fprintf(stderr, pciGetErrorString()); exit(3); } return 0; }