示例#1
0
文件: linhwc.c 项目: basecq/q2dos
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;
}
示例#2
0
//----------------------------------------------------------------------
// 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;
}