pciConfigLib.c
上传用户:yuanda199
上传日期:2022-06-26
资源大小:412k
文件大小:35k
源码类别:

VxWorks

开发平台:

C/C++

  1. /*
  2.     EXTERNAL SOURCE RELEASE on 12/03/2001 3.0 - Subject to change without notice.
  3. */
  4. /*
  5.     Copyright 2001, Broadcom Corporation
  6.     All Rights Reserved.
  7.     
  8.     This is UNPUBLISHED PROPRIETARY SOURCE CODE of Broadcom Corporation;
  9.     the contents of this file may not be disclosed to third parties, copied or
  10.     duplicated in any form, in whole or in part, without the prior written
  11.     permission of Broadcom Corporation.
  12. */
  13. /*
  14. modification history
  15. --------------------
  16. 01c,06sep02,jmb   Add missing ConfigOut functions and support for config
  17.                   cycles on secondary buses, fix byte-swap on ConfigIn's
  18. 01b,14aug02,jmb   Nithya's patches to do pciConfig cycles to devices with
  19.                   devNo > PCI_IDSEL_ALINE_INDIRECT_DEV.
  20.                   Move PCI memory space to uncached address.
  21.                   Also a bunch of temporary patches for PCI testing.
  22. 01a,11aug02,jmb   created from sysLib.c,v 1.33 for HNBU 4710 eval board.  Merged
  23.                   in code from Strata idtrp334 BSP.
  24. */
  25. /* pciConfigLib.c - PCI Configuration space access support for the bcm4710 */
  26. /* This module allows the SB Bus devices to mimic PCI devices on bus 0 */
  27. #include "vxWorks.h"
  28. #include "config.h"
  29. #if defined(INCLUDE_PCI)
  30. #include "dllLib.h"
  31. #include "sysLib.h"
  32. #include "intLib.h"
  33. #include "taskLib.h"
  34. #include "stdio.h"
  35. #include "stdlib.h"
  36. #include "string.h"
  37. #include "config.h"
  38. #include "drv/pci/pciConfigLib.h"
  39. /* SB -> PCI mapping */
  40. #include "sb2pci.h"
  41. #include "sbconfig.h"
  42. #include "sbextif.h"
  43. #include "sbpci.h"
  44. #include "sbchipc.h"
  45. #ifndef BROADCOM_BSP  /* Don't need for MBZ */
  46. #include "bcmnvram.h"
  47. #endif
  48. #include "vx_osl.h"
  49. #include "bcmenet47xx.h"
  50. void sb_error(void);
  51. /* globals */
  52. int     pciMaxBus = PCI_MAX_BUS; /* Max number of sub-busses */
  53. STATUS  pciLibInitStatus = NONE; /* initialization done */
  54. unsigned long pci_intnum = NONE;
  55. #ifdef BROADCOM_BSP
  56. int     pciConfigMech = NONE;
  57. #endif
  58. #define MAX_SB_CORES  9  /* temp limit until sb_errors are handled correctly */
  59. sb2pci_t sbDevices[MAX_SB_CORES];
  60. #define PCI_HOSTBRIDGE_DEV    4
  61. #define PCI_IDSEL_ALINE_START 12
  62. #define PCI_IDSEL_ALINE_INDIRECT_DEV (31 - 6 - PCI_IDSEL_ALINE_START)
  63. #define PCI_IND_DEV (PCI_IDSEL_ALINE_INDIRECT_DEV + 1)
  64. #define PCI_CFG_47XX(d, f, o)  
  65.         (0xAC000000 | (1 << (PCI_IDSEL_ALINE_START+(d))) | ((f) << 8) | (o)) 
  66. static uint32 sbclk=0;
  67. uint32 wd_ms=0;
  68. static int sb_extif_tpsflag=-1;
  69. static chipcregs_t *cc=NULL;
  70. static extifregs_t *extif=NULL;
  71. static volatile sbpciregs_t *pci;
  72. void platform_init(void);
  73. void unmask_pci_interrupt(unsigned long bit);
  74. void mask_pci_interrupt(unsigned long bit);
  75. /* routine to return the sb clock speed (discovered during init ) */
  76. uint32 get_sb_clock(void) {
  77.     ASSERT(sbclk);
  78.     return(sbclk);
  79. }
  80. /* routine to return the extif tpsflag (discovered during init )  */
  81. uint32 get_sb_extif_tpsflag(void) {
  82.     return(sb_extif_tpsflag);
  83. }
  84. STATUS pciConfigLibInit
  85.     (
  86.     int mechanism, /* configuration mechanism: 0, 1, 2 */
  87.     ULONG addr0,   /* config-addr-reg / CSE-reg */
  88.     ULONG addr1,   /* config-data-reg / Forward-reg */
  89.     ULONG addr2    /* none            / Base-address */
  90.     )
  91.     {
  92. char buf[200];
  93.     void    *sbaddr;
  94.     void    *sbh;
  95.     int     dev;
  96.     unsigned long sbvalue, flag, irq;
  97.     unsigned short vendor, core;
  98.     unsigned long class;
  99.     unsigned char revision;
  100.     unsigned long sbips_int_mask[] = { 0, SBIPS_INT1_MASK, SBIPS_INT2_MASK, 
  101.         SBIPS_INT3_MASK, SBIPS_INT4_MASK };
  102.     unsigned long sbips_int_shift[] = { 0, 0, SBIPS_INT2_SHIFT, 
  103.         SBIPS_INT3_SHIFT, SBIPS_INT4_SHIFT };
  104.     sbconfig_t * sbregs;
  105.     if (pciLibInitStatus != NONE)
  106.         return (pciLibInitStatus);
  107.     pciLibInitStatus = OK;
  108. #ifdef BROADCOM_BSP
  109.     pciConfigMech = PCI_MECHANISM_0;
  110. #endif
  111.     /* zero out the sbdevices array */
  112.     memset(sbDevices, 0, (sizeof(sb2pci_t)*MAX_SB_CORES));
  113.     /* init sbutils handle */
  114.     sbh = sb_kattach(BCM4710_DEVICE_ID, 0);
  115.         ASSERT(sbh);
  116.     sbclk = sb_clock(sbh);            /* save the sb_clock speed */
  117.     
  118.     /* Scan SB and create a sbDevices table */
  119.     for( dev=0; dev < MAX_SB_CORES; dev++) {
  120.     
  121.         sbaddr = (void*)KSEG1ADDR(SB_ENUM_BASE + (SB_CORE_SIZE*dev) + SBCONFIGOFF);
  122.         sbregs = (sbconfig_t *)sbaddr;
  123.         
  124.                 sbvalue = 0;
  125.                 /* check if core exists */
  126.                 BUSPROBE(sbvalue, (&sbregs->sbidhigh));
  127.                 if ((sbvalue == 0) || (sbvalue == 0xffffffff))
  128.                         break;
  129.                 sbvalue = sbregs->sbidhigh;
  130.         vendor = (sbvalue & SBIDH_VC_MASK) >> SBIDH_VC_SHIFT;
  131.         core = (sbvalue & SBIDH_CC_MASK) >> SBIDH_CC_SHIFT;
  132.         revision = (sbvalue & SBIDH_RC_MASK);
  133.         /*
  134.         * vendor = sb_corevendor(sbregs);
  135.         * core = sb_coreid(sbregs);
  136.         * revision = sb_corerev(sbregs);
  137.         */
  138.         /* Known vendor translations */
  139.         switch (vendor) {
  140.         case SB_VEND_BCM:
  141.             vendor = VENDOR_BROADCOM;
  142.             break;
  143.         }
  144.     
  145.         /* Determine class based on known core codes */
  146.         switch (core) {
  147.         case SB_ILINE20:
  148.             class = PCI_CLASS_NETWORK_ETHERNET;
  149.             core = BCM47XX_ILINE_ID;
  150.             break;
  151.         case SB_ENET:
  152.             class = PCI_CLASS_NETWORK_ETHERNET;
  153.             core = BCM47XX_ENET_ID;
  154.             break;
  155.         case SB_SDRAM:
  156.             class = PCI_CLASS_MEMORY_RAM;
  157.             break;
  158.         case SB_PCI:
  159.             sb_setcore(sbh, SB_PCI, 0);
  160.             sb_core_reset(sbh, 0);
  161.             class = PCI_CLASS_BRIDGE_PCI;            
  162.             break;
  163.         case SB_MIPS:
  164.             /* Set up the interrupt mappings */
  165.             sbregs->sbipsflag   = DEF_SBIPSFLAG;
  166.             sbregs->sbintvec    = DEF_SBINTVEC;     
  167.             class = PCI_CLASS_PROCESSOR_MIPS;
  168.             break;
  169.         case SB_CODEC:
  170.             class = PCI_CLASS_COMMUNICATION_MODEM;
  171.             core = BCM47XX_V90_ID;
  172.             break;
  173.         case SB_USB:
  174.             class = PCI_CLASS_SERIAL_USB;;
  175.             core = BCM47XX_USB_ID;
  176.             break;
  177.         case SB_EXTIF:
  178.             class = PCI_CLASS_MEMORY_FLASH;
  179.             break;
  180.         default:
  181.             /* Unknown core */
  182.             sbDevices[dev].vendor_devid = 0xffffffff;
  183.             continue;
  184.         }
  185.     
  186.         sbDevices[dev].ibErr = 0;
  187.         sbDevices[dev].toErr = 0;
  188.         sbDevices[dev].vendor_devid = (core << 16) | vendor;
  189.         sbDevices[dev].classcode    = (class << 8) | revision;
  190.         sbDevices[dev].bar0         = (unsigned long)sbaddr - SBCONFIGOFF;
  191.         /* Figure out which vx interrupt num is connected to this core */
  192.         sbDevices[dev].vx_int_num = 0;
  193.         flag = *(unsigned long*)((unsigned long)sbaddr + SBTPSFLAG);
  194.         if(!flag) /* if int not generated by this core leave it as zero */
  195.             continue;
  196.         flag &= SBTPS_NUM0_MASK;
  197.         /* tpsflag for the extif */
  198.         if (core == SB_EXTIF)  sb_extif_tpsflag = flag;
  199.         sbDevices[dev].tpsflag = flag;
  200.         sbvalue = DEF_SBIPSFLAG; 
  201.         for (irq = 1; irq <= 4; irq++) 
  202.     {
  203.             if (((sbvalue & sbips_int_mask[irq]) >> sbips_int_shift[irq]) == flag) 
  204.                 sbDevices[dev].vx_int_num = irq + IV_IORQ0_VEC;
  205.              }
  206.         if(!sbDevices[dev].vx_int_num)            
  207.             sbDevices[dev].vx_int_num = IV_IORQ0_BIT0_VEC + flag;
  208.         if ((sbDevices[dev].classcode >> 8) == PCI_CLASS_BRIDGE_PCI)
  209.             pci_intnum = sbDevices[dev].vx_int_num;
  210.         }
  211.     sb_detach (sbh);
  212.     sb_detach (sbh);
  213.     return (pciLibInitStatus);
  214.     }
  215. /* Handler for SB errors */
  216. void sb_error(void)
  217. {
  218.     sbconfig_t *cfg;
  219.     unsigned long sbimstate;
  220.     int dev;
  221.     for (dev=0; dev < MAX_SB_CORES; dev++) 
  222.         {
  223.         if (sbDevices[dev].vendor_devid != 0xffffffff) 
  224.             {      /* Skip non-SB devices */ 
  225.             cfg = (sbconfig_t *) 
  226.                 KSEG1ADDR(SB_ENUM_BASE + (SB_CORE_SIZE*dev) + SBCONFIGOFF);
  227.             sbimstate = *(unsigned long *)&cfg->sbimstate;
  228.             if (sbimstate & SBIM_TO) 
  229.                 {
  230.                 *(unsigned long *)&cfg->sbimstate = sbimstate & ~SBIM_TO;
  231.                 sbDevices[dev].toErr++;
  232.              }
  233.             if (sbimstate & SBIM_IBE) 
  234.                 {
  235.                 *(unsigned long *)&cfg->sbimstate = sbimstate & ~SBIM_IBE;
  236.                 sbDevices[dev].ibErr++;
  237.                 }
  238.             }
  239.         }
  240.     }
  241. void dumpSB(void)
  242.     {
  243.     unsigned char dev;
  244.     for (dev=0; dev < MAX_SB_CORES; dev++) 
  245.         if ( sbDevices[dev].vendor_devid != 0xffffffff)
  246.             printf ("DEVID: 0x%x  BAR0: 0x%x   INT: 0x%x  CLASS: 0x%x SB TO: 0x%x SB IBE 0x%xn", 
  247.                 (unsigned int)sbDevices[dev].vendor_devid, 
  248.                 (unsigned int)sbDevices[dev].bar0, 
  249.                 (unsigned int)sbDevices[dev].vx_int_num, 
  250.                 (unsigned int)sbDevices[dev].classcode,
  251.                 (unsigned int)sbDevices[dev].toErr, 
  252.                 (unsigned int)sbDevices[dev].ibErr);
  253.     }
  254. /*******************************************************************************
  255. *
  256. * pciFindDevice - find the nth device with the given device & vendor ID
  257. *
  258. * This routine finds the nth device with the given device & vendor ID.
  259. *
  260. * RETURNS:
  261. * OK, or ERROR if the deviceId and vendorId didn't match.
  262. */
  263. STATUS pciFindDevice
  264.     (
  265.     int    vendorId, /* vendor ID */
  266.     int    deviceId, /* device ID */
  267.     int    index, /* desired instance of device */
  268.     int *  pBusNo, /* bus number */
  269.     int *  pDeviceNo, /* device number */
  270.     int *  pFuncNo /* function number */
  271.     )
  272.     {
  273.     STATUS status = ERROR;
  274.     int    busNo;
  275.     int    deviceNo;
  276.     int    funcNo;
  277.     UINT32 device;
  278.     volatile UINT32 vendor;
  279.     unsigned char   header;
  280.     if (pciLibInitStatus != OK) /* sanity check */
  281.         return(status);
  282.     /* PCI bus numbers start at 1 */
  283.     for (busNo = 1; busNo <= pciMaxBus; busNo++)
  284.         {
  285.         for (deviceNo = 0;
  286.      ((deviceNo < PCI_MAX_DEV));
  287.      ++deviceNo)
  288.             for (funcNo = 0; funcNo < PCI_MAX_FUNC; funcNo++)
  289. {
  290. /* avoid a special bus cycle */
  291. if ((deviceNo == 0x1f) && (funcNo == 0x07))
  292.     continue;
  293.         
  294. pciConfigInLong (busNo, deviceNo, funcNo, PCI_CFG_VENDOR_ID,
  295.  &vendor);
  296. /*
  297.  * If nonexistent device, skip to next, only look at
  298.  * vendor ID field for existence check
  299.  */
  300.                 OSL_DELAY(10);
  301. if (((vendor & 0x0000ffff) == 0x0000FFFF) && (funcNo == 0))
  302.     break;
  303. device  = vendor >> 16;
  304. device &= 0x0000FFFF;
  305. vendor &= 0x0000FFFF;
  306. if ((vendor == (UINT32)vendorId) &&
  307.     (device == (UINT32)deviceId) &&
  308.     (index-- == 0))
  309.     {
  310.                         *pBusNo = busNo;
  311.                         *pDeviceNo = deviceNo;
  312.                         *pFuncNo = funcNo;
  313.                         status = OK;
  314.                         return(status);
  315.     } else {
  316.                         /* goto next if current device is single function */
  317.                         pciConfigInByte (busNo, deviceNo, funcNo,
  318.                                             PCI_CFG_HEADER_TYPE, &header);
  319.                         if ((header & PCI_HEADER_MULTI_FUNC) !=
  320.                                     PCI_HEADER_MULTI_FUNC && funcNo == 0) {
  321.                             break;
  322.                         }
  323.                     }
  324.                 }
  325.         }
  326.     return (status);
  327.     }
  328. /*******************************************************************************
  329. *
  330. * pciFindClass - find the nth occurence of a device by PCI class code.
  331. *
  332. * This routine finds the nth device with the given 24-bit PCI class code
  333. * (class subclass prog_if).
  334. *
  335. * RETURNS:
  336. * OK, or ERROR if the class didn't match.
  337. */
  338. STATUS pciFindClass
  339.     (
  340.     int    classCode, /* 24-bit class code */
  341.     int    index, /* desired instance of device */
  342.     int *  pBusNo, /* bus number */
  343.     int *  pDeviceNo, /* device number */
  344.     int *  pFuncNo /* function number */
  345.     )
  346.     {
  347.     STATUS status = ERROR;
  348.     BOOL   cont   = TRUE;
  349.     int    busNo;
  350.     int    deviceNo;
  351.     int    funcNo;
  352.     UINT32    classCodeReg;
  353.     UINT32    vendor;
  354.     unsigned char   header;
  355.     if (pciLibInitStatus != OK) /* sanity check */
  356.         return(ERROR);
  357.     for (busNo = 0; cont == TRUE && busNo <= pciMaxBus; busNo++)
  358.         for (deviceNo = 0;
  359.      ((cont == TRUE) && (deviceNo < PCI_MAX_DEV));
  360.      ++deviceNo)
  361.             for (funcNo = 0; cont == TRUE && funcNo < PCI_MAX_FUNC; funcNo++)
  362. {
  363. /* avoid a special bus cycle */
  364. if ((deviceNo == 0x1f) && (funcNo == 0x07))
  365.     continue;
  366. pciConfigInLong (busNo, deviceNo, funcNo, PCI_CFG_VENDOR_ID,
  367.  &vendor);
  368. /*
  369.  * If nonexistent device, skip to next, only look at
  370.  * vendor ID field for existence check
  371.  */
  372. if (((vendor & 0x0000ffff) == 0x0000FFFF) && (funcNo == 0))
  373.     break;
  374. pciConfigInLong (busNo, deviceNo, funcNo, PCI_CFG_REVISION,
  375.  &classCodeReg);
  376. if ((((classCodeReg >> 8) & 0x00ffffff) == classCode) &&
  377.     (index-- == 0))
  378.     {
  379.     *pBusNo = busNo;
  380.     *pDeviceNo = deviceNo;
  381.     *pFuncNo = funcNo;
  382.     status = OK;
  383.     cont  = FALSE; /* terminate all loops */
  384.     continue;
  385.     }
  386. /* goto next if current device is single function */
  387. pciConfigInByte (busNo, deviceNo, funcNo, PCI_CFG_HEADER_TYPE, 
  388.  &header);
  389. if ((header & PCI_HEADER_MULTI_FUNC) != PCI_HEADER_MULTI_FUNC &&
  390.     funcNo == 0)
  391.     break;
  392. }
  393.     return (status);
  394.     }
  395. /*******************************************************************************
  396. *
  397. * pciConfigBdfPack - pack parameters for the Configuration Address Register
  398. *
  399. * This routine packs three parameters into one integer for accessing the
  400. * Configuration Address Register
  401. *
  402. * RETURNS: packed integer encoded version of bus, device, and function numbers.
  403. */
  404. int pciConfigBdfPack
  405.     (
  406.     int busNo,    /* bus number */
  407.     int deviceNo, /* device number */
  408.     int funcNo    /* function number */
  409.     )
  410.     {
  411.     return (((busNo    << 16) & 0x00ff0000) |
  412.             ((deviceNo << 11) & 0x0000f800) |
  413.             ((funcNo   << 8)  & 0x00000700));
  414.     }
  415. /*******************************************************************************
  416. *
  417. * pciConfigInByte - read one byte from the PCI configuration space
  418. *
  419. * This routine reads one byte from the PCI configuration space
  420. *
  421. * RETURNS: OK, or ERROR if this library is not initialized
  422. */
  423. STATUS pciConfigInByte
  424.     (
  425.     int busNo,    /* bus number */
  426.     int deviceNo, /* device number */
  427.     int funcNo,   /* function number */
  428.     int offset,   /* offset into the configuration space */
  429.     UINT8 * pData /* data read from the offset */
  430.     )
  431.     {
  432.     int key;
  433.     unsigned char tmpdata;
  434.     STATUS rval;
  435.     if (pciLibInitStatus != OK) /* sanity check */
  436.         return (ERROR);
  437.     if (busNo > pciMaxBus)
  438.         {
  439.         *pData = 0xff;
  440.         return (OK);
  441.         }
  442.     rval = OK;
  443.     /* Bus 0 is hijacked by the sb bus */
  444.     if(busNo == 0) 
  445.         {
  446.         if (funcNo == 0)
  447.             {
  448.             /* Silicon Backplane only supports IRQ byte and multi func byte */
  449.             switch(offset) 
  450.                 {
  451.                 case PCI_CFG_HEADER_TYPE:
  452.                     *pData = (UINT8)PCI_HEADER_TYPE0;
  453.                     break;
  454.             
  455.                 case PCI_CFG_DEV_INT_LINE:
  456.                     *pData = (UINT8)sbDevices[deviceNo].vx_int_num;
  457.                     break;
  458.         
  459.                 default:
  460.                     *pData = 0xff;
  461.                     rval = ERROR;
  462.                     break;
  463.                 }
  464.             }
  465.         else
  466.             {
  467.             *pData = 0xff;
  468.             rval = ERROR;
  469.             }
  470.         return (rval);
  471.         }
  472.     offset ^= 3;
  473.     if (busNo == 1)
  474. {
  475. if (deviceNo > PCI_IDSEL_ALINE_INDIRECT_DEV) 
  476.             {
  477.             key = intLock ();  
  478.     pci->sbtopci1 = SBTOPCI_CFG0 | (1<<(PCI_IDSEL_ALINE_START +deviceNo)); 
  479.             OSL_DELAY(2);
  480.             if (vxMemProbe ((void *) PCI_CFG_47XX (PCI_IND_DEV, funcNo, offset),
  481.                 VX_READ, 1, (char *) &tmpdata) == OK)
  482.                 *pData=tmpdata;
  483.             else
  484.                 *pData=0xff;
  485.     pci->sbtopci1 = SBTOPCI_CFG0; 
  486.             OSL_DELAY(2);
  487.             intUnlock (key);
  488.     } 
  489.         else 
  490.             {
  491.             key = intLock();
  492.             if (vxMemProbe ((void *) PCI_CFG_47XX (deviceNo, funcNo, offset),
  493.                 VX_READ, 1, (char *)&tmpdata) == OK)
  494.                 *pData=tmpdata;
  495.             else
  496.                 *pData=0xff;
  497.             intUnlock(key);
  498.             }
  499.         }
  500.     else 
  501.         {
  502.         key = intLock ();
  503.         pci->sbtopci1 = SBTOPCI_CFG1; 
  504.         OSL_DELAY(2); 
  505.         if (vxMemProbe ( (void *) (PCI_CFG_47XX(PCI_IND_DEV, 0, offset) | 
  506.                 pciConfigBdfPack (busNo, deviceNo, funcNo)),
  507.                 VX_READ, 1, (char *)&tmpdata) == OK)
  508.             *pData=tmpdata;
  509.         else
  510.             *pData=0xff;
  511.         pci->sbtopci1 = SBTOPCI_CFG0; 
  512.         OSL_DELAY(2);
  513.         intUnlock (key);
  514.         }
  515.     return (rval);
  516.     }
  517. /*******************************************************************************
  518. *
  519. * pciConfigInLong - read one longword from the PCI configuration space
  520. *
  521. * This routine reads one longword from the PCI configuration space
  522. *
  523. * RETURNS: OK, or ERROR if this library is not initialized
  524. */
  525. STATUS pciConfigInLong
  526.     (
  527.     int busNo,     /* bus number */
  528.     int deviceNo,  /* device number */
  529.     int funcNo,    /* function number */
  530.     int offset,    /* offset into the configuration space */
  531.     UINT32 * pData /* data read from the offset */
  532.     )
  533.     {
  534.     int  key;
  535.     char buf[120];
  536.     STATUS rval;
  537.     int tmpdata;
  538.     /* Check lib initialized */
  539.     if (pciLibInitStatus != OK)
  540. {
  541.         return (ERROR);
  542. }
  543.     if (busNo > pciMaxBus)
  544.             {
  545.             *pData = 0xffffffff;
  546.             return (OK);
  547.             }
  548.     rval = OK;
  549.     /* Bus 0 is hijacked by the sb bus */
  550.     if (busNo == 0) 
  551.         {
  552.         if (funcNo == 0)
  553.             /* Silicon Backplane only supports IRQ byte and multi func byte */
  554.             switch(offset) 
  555.                 {
  556.                 case PCI_CFG_BASE_ADDRESS_0:
  557.                     *pData = (UINT32)sbDevices[deviceNo].bar0;
  558.                     break;
  559.             
  560.                 case PCI_CFG_VENDOR_ID:
  561.                     *pData = (UINT32)sbDevices[deviceNo].vendor_devid;
  562.                     break;
  563.         
  564.                 case PCI_CFG_REVISION:
  565.                     *pData = (UINT32)sbDevices[deviceNo].classcode;
  566.                     break;
  567.                 default:
  568.                     *pData = 0xFFFFFFFF;
  569.                     rval = ERROR;
  570.                     break;
  571.                 }
  572.         else
  573.             {
  574.             *pData = 0xFFFFFFFF;
  575.             rval = ERROR;
  576.             }
  577.         return (rval);
  578.         }
  579.     if (busNo == 1)
  580. {
  581. if (deviceNo > PCI_IDSEL_ALINE_INDIRECT_DEV) 
  582.             {
  583.             key = intLock ();  /* mutual exclusion start */
  584.     pci->sbtopci1 = SBTOPCI_CFG0 | (1<<(PCI_IDSEL_ALINE_START +deviceNo)); 
  585.             OSL_DELAY(2);
  586.             if (vxMemProbe ((void *) PCI_CFG_47XX (PCI_IND_DEV, funcNo, offset),
  587.                 VX_READ, 4, (char *) &tmpdata) == OK)
  588.                 *pData=tmpdata;
  589.             else
  590.                 *pData=0xffffffff;
  591.     pci->sbtopci1 = SBTOPCI_CFG0; 
  592.             OSL_DELAY(2);
  593.             intUnlock (key);
  594.     } 
  595.         else 
  596.             {
  597.             key = intLock();
  598.             if (vxMemProbe ((void *) PCI_CFG_47XX (deviceNo, funcNo, offset),
  599.                 VX_READ, 4, (char *)&tmpdata) == OK)
  600.                 *pData=tmpdata;
  601.             else
  602.                 *pData=0xffffffff;
  603.             intUnlock(key);
  604.             }
  605.         }
  606.     else 
  607.         {
  608.         key = intLock ();
  609.         pci->sbtopci1 = SBTOPCI_CFG1; 
  610.         OSL_DELAY(2); 
  611.         if (vxMemProbe ( (void *) (PCI_CFG_47XX(PCI_IND_DEV, 0, offset) | 
  612.                 pciConfigBdfPack (busNo, deviceNo, funcNo)),
  613.                 VX_READ, 4, (char *)&tmpdata) == OK)
  614.             *pData=tmpdata;
  615.         else
  616.             *pData=0xffffffff;
  617.         pci->sbtopci1 = SBTOPCI_CFG0; 
  618.         OSL_DELAY(2);
  619.         intUnlock (key);
  620.         }
  621.     return (OK);
  622.     }
  623. /*******************************************************************************
  624. *
  625. * pciConfigOutLong - write one longword to PCI configuration space
  626. *
  627. * This routine writes one longword to PCI configuration space
  628. *
  629. * RETURNS: OK, or ERROR if this library is not initialized
  630. */
  631. STATUS pciConfigOutLong
  632.     (
  633.     int busNo,     /* bus number */
  634.     int deviceNo,  /* device number */
  635.     int funcNo,    /* function number */
  636.     int offset,    /* offset into the configuration space */
  637.     UINT32 data    /* data to write at the offset */
  638.     )
  639.     {
  640.     int  key;
  641.     STATUS rval;
  642.     int tmpdata;
  643.     if (pciLibInitStatus != OK)
  644. {
  645.         return (ERROR);
  646. }
  647.     if(busNo == 0 || busNo > pciMaxBus) 
  648.         {
  649.         /* 
  650.         *  pciConfigOutLong is supplied only for use on the PCI
  651.         *  bus, not the silicon backplane.
  652.         */
  653.         return (ERROR);
  654.         }
  655.     rval = OK;
  656.     tmpdata = data;
  657.     key = intLock (); /* INTLOCK */
  658.     if (busNo == 1) 
  659.         {
  660.         if (deviceNo > PCI_IDSEL_ALINE_INDIRECT_DEV) 
  661.             {
  662.             pci->sbtopci1 = SBTOPCI_CFG0 | (1<<(PCI_IDSEL_ALINE_START +deviceNo)); OSL_DELAY(2);
  663.             if (vxMemProbe((void *)PCI_CFG_47XX(PCI_IND_DEV, funcNo, offset),
  664.                 VX_WRITE, 4, (char *)&tmpdata) != OK) 
  665.                 rval = ERROR;
  666.             pci->sbtopci1 = SBTOPCI_CFG0; OSL_DELAY(2);
  667.             } 
  668.         else 
  669.             if (vxMemProbe((void *)PCI_CFG_47XX(deviceNo, funcNo, offset),
  670.                 VX_WRITE, 4, (char *)&tmpdata) != OK) 
  671.                 rval = ERROR;
  672. }
  673.     else  /* Do Type 1 config transaction on secondary bus */
  674.         {
  675.         pci->sbtopci1 = SBTOPCI_CFG1;
  676.         OSL_DELAY(2);
  677.         if (vxMemProbe ((void *) (PCI_CFG_47XX(PCI_IND_DEV, 0, offset) |
  678.             pciConfigBdfPack (busNo, deviceNo, funcNo)),
  679.             VX_WRITE, 4, (char *) &tmpdata) != OK)
  680.             rval = ERROR;
  681.         pci->sbtopci1 = SBTOPCI_CFG0; 
  682.         OSL_DELAY(2);
  683.         }
  684.     intUnlock (key); /* UNLOCK INTERRUPTS */
  685.     return (rval);
  686.     }
  687. /*******************************************************************************
  688. *
  689. * pciConfigOutWord - write a 2-byte word to PCI configuration space
  690. *
  691. * This routine writes one longword to PCI configuration space
  692. *
  693. * RETURNS: OK, or ERROR if this library is not initialized
  694. */
  695. STATUS pciConfigOutWord
  696.     (
  697.     int busNo,     /* bus number */
  698.     int deviceNo,  /* device number */
  699.     int funcNo,    /* function number */
  700.     int offset,    /* offset into the configuration space */
  701.     UINT16 data    /* data to write at the offset */
  702.     )
  703.     {
  704.     int  key;
  705.     STATUS rval;
  706.     unsigned short tmpdata;
  707.     if (pciLibInitStatus != OK)
  708.         {
  709.         return (ERROR);
  710.         }
  711.     if(busNo == 0 || busNo > pciMaxBus)
  712.         {
  713.         /*
  714.         *  pciConfigOutWord is supplied only for use on the PCI
  715.         *  bus, not the silicon backplane.
  716.         */
  717.         return (ERROR);
  718.         }
  719.     rval = OK;
  720.     tmpdata = data;
  721.     offset ^= 2;
  722.     key = intLock (); /* mutual exclusion start */
  723.     if (busNo == 1) 
  724.         {
  725.         if (deviceNo > PCI_IDSEL_ALINE_INDIRECT_DEV) 
  726.             {
  727.             pci->sbtopci1 = SBTOPCI_CFG0 | (1<<(PCI_IDSEL_ALINE_START +deviceNo)); 
  728.             OSL_DELAY(2);
  729.             if (vxMemProbe((void *)PCI_CFG_47XX(PCI_IND_DEV, funcNo, offset),
  730.                 VX_WRITE, 2, (char *)&tmpdata) != OK)
  731.                 rval = ERROR; 
  732.             pci->sbtopci1 = SBTOPCI_CFG0; 
  733.             OSL_DELAY(2);
  734.             } 
  735.         else 
  736.             {
  737.             if (vxMemProbe((void *)PCI_CFG_47XX(deviceNo, funcNo, offset),
  738.                 VX_WRITE, 2, (char *)&tmpdata) != OK) 
  739.                 rval = ERROR;
  740.             }
  741. }
  742.     else 
  743.         {
  744.         pci->sbtopci1 = SBTOPCI_CFG1;
  745.         OSL_DELAY (1);
  746.         if (vxMemProbe ((void *) (PCI_CFG_47XX(PCI_IND_DEV, 0, offset) |
  747.             pciConfigBdfPack (busNo, deviceNo, funcNo)),
  748.             VX_WRITE, 2, (char *) &tmpdata) != OK)
  749.             rval = ERROR;
  750.         pci->sbtopci1 = SBTOPCI_CFG0; 
  751.         OSL_DELAY(2);
  752.         }
  753.     intUnlock (key); /* mutual exclusion stop */
  754.     return (rval);
  755.     }
  756. /*******************************************************************************
  757. *
  758. * pciConfigOutByte - write a byte to PCI configuration space
  759. *
  760. * This routine writes one byte to PCI configuration space
  761. *
  762. * RETURNS: OK, or ERROR if this library is not initialized
  763. */
  764. STATUS pciConfigOutByte
  765.     (
  766.     int busNo,     /* bus number */
  767.     int deviceNo,  /* device number */
  768.     int funcNo,    /* function number */
  769.     int offset,    /* offset into the configuration space */
  770.     UINT8 data    /* data to write at the offset */
  771.     )
  772.     {
  773.     int  key;
  774.     STATUS rval;
  775.     UINT8 tmpdata;
  776.     if (pciLibInitStatus != OK)
  777.         {
  778.         return (ERROR);
  779.         }
  780.     if(busNo == 0 || busNo > pciMaxBus)
  781.         {
  782.         /*
  783.         *  pciConfigOutByte is supplied only for use on the PCI
  784.         *  bus, not the silicon backplane.
  785.         */
  786.         return (ERROR);
  787.         }
  788.     rval = OK;
  789.     tmpdata = data;
  790.     key = intLock ();                   /* mutual exclusion start */
  791.     offset ^= 3;
  792.     if (busNo == 1)
  793.         {
  794.         if (deviceNo > PCI_IDSEL_ALINE_INDIRECT_DEV)
  795.             {
  796.             pci->sbtopci1 = SBTOPCI_CFG0 | (1<<(PCI_IDSEL_ALINE_START +deviceNo));
  797.             OSL_DELAY(2);
  798.             if (vxMemProbe((void *)PCI_CFG_47XX(PCI_IND_DEV, funcNo, offset),
  799.                 VX_WRITE, 1, (char *)&tmpdata) != OK)
  800.                 rval = ERROR;
  801.             pci->sbtopci1 = SBTOPCI_CFG0;
  802.             OSL_DELAY(2);
  803.             }
  804.         else
  805.             {
  806.             if (vxMemProbe((void *)PCI_CFG_47XX(deviceNo, funcNo, offset),
  807.                 VX_WRITE, 1, (char *)&tmpdata) != OK)
  808.                 rval = ERROR;
  809.             }
  810.         }
  811.     else
  812.         {
  813.         pci->sbtopci1 = SBTOPCI_CFG1;
  814.         OSL_DELAY (1);
  815.         if (vxMemProbe ((void *) (PCI_CFG_47XX(PCI_IND_DEV, 0, offset) |
  816.             pciConfigBdfPack (busNo, deviceNo, funcNo)),
  817.             VX_WRITE, 1, (char *) &tmpdata) != OK)
  818.             rval = ERROR;
  819.         pci->sbtopci1 = SBTOPCI_CFG0;
  820.         OSL_DELAY(2);
  821.         }
  822.     intUnlock (key);                            /* mutual exclusion stop */
  823.     return (rval);
  824.     }
  825. /*******************************************************************************
  826. *
  827. * pciConfigInWord - read one 2-byte word from the PCI configuration space
  828. *
  829. * This routine reads one 2-byte word from the PCI configuration space
  830. *
  831. * RETURNS: OK, or ERROR if this library is not initialized
  832. */
  833. STATUS pciConfigInWord
  834.     (
  835.     int busNo,     /* bus number */
  836.     int deviceNo,  /* device number */
  837.     int funcNo,    /* function number */
  838.     int offset,    /* offset into the configuration space */
  839.     UINT16 * pData /* data read from the offset */
  840.     )
  841.     {
  842.     int  key;
  843.     char buf[100];
  844.     UINT16 tmpdata;
  845.     /* Check lib initialized */
  846.     if (pciLibInitStatus != OK)
  847. {
  848.         return (ERROR);
  849. }
  850.     if (busNo > pciMaxBus)
  851.         {
  852.         *pData = 0xffff;
  853.         return (OK);
  854.         }
  855.  
  856.     /* Bus 0 is hijacked by the sb bus */
  857.     if (busNo == 0)
  858.         {
  859.         if (funcNo == 0)
  860.             {
  861.         /* Silicon Backplane only supports IRQ byte and multi func byte */
  862.             switch(offset) 
  863.                 {
  864.                 case 0:
  865.                     *pData = (UINT16)
  866.                          (sbDevices[deviceNo].vendor_devid & 0xFFFF);
  867.                      break;
  868.                 case 2:
  869.                     *pData = (UINT16)
  870.                         ((sbDevices[deviceNo].vendor_devid >> 16)  & 0xFFFF);
  871.                     break;
  872.                 default:
  873.                     *pData = 0xFFFF;
  874.                 }
  875.             }
  876.         else
  877.             *pData = 0xFFFF;
  878.         return (OK);
  879.         }
  880.      
  881.     offset ^= 2;
  882.     if (busNo == 1)
  883. {
  884. if (deviceNo > PCI_IDSEL_ALINE_INDIRECT_DEV) 
  885.             {
  886.             key = intLock ();  
  887.     pci->sbtopci1 = SBTOPCI_CFG0 | (1<<(PCI_IDSEL_ALINE_START +deviceNo)); 
  888.             OSL_DELAY(2);
  889.             if (vxMemProbe((void *)PCI_CFG_47XX(PCI_IND_DEV, funcNo, offset),
  890.                 VX_READ, 2, (char *)&tmpdata) == OK)
  891.                 *pData=tmpdata;
  892.             else
  893.                 *pData=0xffff;
  894.     pci->sbtopci1 = SBTOPCI_CFG0; 
  895.             OSL_DELAY(2);
  896.             intUnlock (key);
  897.     } 
  898.         else 
  899.             {
  900.             key = intLock();
  901.             if (vxMemProbe((void *)PCI_CFG_47XX(deviceNo, funcNo, offset),
  902.                 VX_READ, 2, (char *)&tmpdata) == OK)
  903.                 *pData=tmpdata;
  904.             else
  905.                 *pData=0xffff;
  906.             intUnlock(key);
  907.             }
  908.         }
  909.     else
  910.         {
  911.         key = intLock ();
  912.         pci->sbtopci1 = SBTOPCI_CFG1; 
  913.         OSL_DELAY(2); 
  914.         if (vxMemProbe ( (void *) (PCI_CFG_47XX(PCI_IND_DEV, 0, offset) | 
  915.                 pciConfigBdfPack (busNo, deviceNo, funcNo)),
  916.                 VX_READ, 2, (char *)&tmpdata) == OK)
  917.             *pData=tmpdata;
  918.         else
  919.             *pData=0xffff;
  920.         pci->sbtopci1 = SBTOPCI_CFG0; 
  921.         OSL_DELAY(2);
  922.         intUnlock (key);
  923.         }
  924.     return (OK);
  925.     }
  926. void
  927. platform_init()
  928. {
  929. #ifndef BROADCOM_BSP
  930. char *board, *cf;
  931. #endif
  932. uint32  pci_clock, req_sb, req_pci, cpu_clock;
  933.     int     ext_pci_clk = 0;
  934.     int     ext_pci_arb = 0;
  935.     void    *sbh;
  936.     sbh = sb_kattach(BCM4710_DEVICE_ID, 0);
  937.     ASSERT(sbh);
  938.     extif = (extifregs_t *) sb_setcore(sbh, SB_EXTIF, 0);
  939.     if (!extif) {
  940.             cc = (chipcregs_t *) sb_setcore(sbh, SB_CC, 0);
  941.             ASSERT(cc);
  942.      }
  943.     pci = (sbpciregs_t *) sb_setcore(sbh, SB_PCI, 0);
  944. sysLedDsply("PFIN");
  945.     {
  946.     char buf[100];
  947.     sprintf(buf,"pci = %08xn", pci);
  948.     sysSerialPrintString(buf);
  949.     }
  950.     sysSerialPrintString(" PCI Initn");
  951.     switch(SYS_REVID_GET()) {
  952.         case BOARD_ID_MBZ_5645_REF:
  953.             sysSerialPrintString(" 5645_REF!n");
  954.             ext_pci_arb = 0;            /* use internal arbiter */
  955.             ext_pci_clk = 1;            /* Use external clock */
  956.             break;
  957.         case BOARD_ID_LM_1:
  958.             sysSerialPrintString(" Line Module!n");
  959. #ifndef LM_INT_PCI_ARB
  960.             sysSerialPrintString(" External Arbiter!n");
  961.             ext_pci_arb = 1; /* use external arbiter */
  962. #else
  963.             sysSerialPrintString(" Internal Arbiter!n");
  964.             ext_pci_arb = 0; /* use internal arbiter */
  965. #endif
  966. #ifdef LM_EXT_PCI_CLK
  967.             ext_pci_clk = 1;            /* Use external clock */
  968. #else
  969.             ext_pci_clk = 0;            /* Use internal clock */
  970. #endif
  971.             break;
  972.         case BOARD_ID_MBZ_2:
  973.         case BOARD_ID_MBZ_1:
  974.             sysSerialPrintString(" MBZ CPCI!n");
  975.         default:
  976.             ext_pci_arb = 0;            /* use internal arbiter */
  977.             ext_pci_clk = 0;            /* Use internal clock */
  978.             break;
  979.     }
  980.     /*
  981.      * Init the pci interface 
  982.      */
  983.     if (ext_pci_clk) {
  984.         sysSerialPrintString(" External Clock!n");
  985.         pci->control = 0x1;             /* PCI reset, no clock */
  986.         OSL_DELAY(100);
  987.         pci->control = 0x3;
  988.     } else {
  989.         sysSerialPrintString(" Internal Clock!n");
  990.         pci->control = 0x5; /* enable the tristate drivers */
  991.         OSL_DELAY(100);     /* delay 100 us */
  992.         pci->control = 0xd; /* enable the PCI clock */
  993.         OSL_DELAY(100);     /* delay 100 us */
  994.         pci->control = 0xf; /* deassert PCI reset */
  995.     }
  996.     pci->arbcontrol = (ext_pci_arb) ? PCI_EXT_ARB : PCI_INT_ARB;
  997.     OSL_DELAY(2); /* delay 1 us */
  998. sysSerialPrintString(" mask PCI interruptsn");
  999. #define MAPPED_ADDR 0xa8000000
  1000. /* mask off pci core interrupts */
  1001.     pci->intmask &= ~(0xffff);
  1002. sysSerialPrintString(" map PCI spacen");
  1003. /* set up SB to PCI windows for memory mapped device.  
  1004. For io mapped device, set only SBTOPCI_IO to stbopci0
  1005. and the base register address is the value put in pci 
  1006. device configuration register 0x10 plus 0xa8000000 */
  1007. pci->sbtopci0 = SBTOPCI_MEM | MAPPED_ADDR; OSL_DELAY(2);
  1008. pci->sbtopci1 = SBTOPCI_CFG0; OSL_DELAY(2);
  1009. sysSerialPrintString(" first PCI config access!n");
  1010. *(unsigned long*)(PCI_CFG_47XX(4, 0, 0x04)) = 0xffffffff; OSL_DELAY(2);
  1011. sysSerialPrintString(" first PCI config access ok!n");
  1012. /* Enable 2 func's and enable func1 bar1 with size 128M */ 
  1013. *(uint32 *)&pci->sprom[0x00] = 0x03;
  1014. *(uint32 *)&pci->sprom[0x10] = 0x0f;
  1015. sysSerialPrintString(" second PCI config access n");
  1016. /* Func 0, BAR0 = 0xffff0000, BAR1 = 0 */
  1017.     *(unsigned long*)(PCI_CFG_47XX(4, 0, 0x4)) = 0x146;
  1018. *(unsigned long*)(PCI_CFG_47XX(4, 0, 0x10)) = MAPPED_ADDR + 0x4000; OSL_DELAY(2);
  1019. *(unsigned long*)(PCI_CFG_47XX(4, 0, 0x14)) = 0xa0000000; OSL_DELAY(2);
  1020. *(unsigned long*)(PCI_CFG_47XX(4, 0, 0x3c)) = 0x00000101; OSL_DELAY(2);
  1021. *(unsigned long*)(PCI_CFG_47XX(4, 0, 0x84)) = 0; OSL_DELAY(2);
  1022. sysSerialPrintString(" func1 PCI config access n");
  1023.     /* Func 1, BAR0 = 0xffff2000, BAR1 = PCI SWAP REGION */
  1024.     *(unsigned long*)(PCI_CFG_47XX(4, 1, 0x4)) = 0x146;
  1025. *(unsigned long*)(PCI_CFG_47XX(4, 1, 0x04)) = 0xffffffff; OSL_DELAY(2);
  1026. *(unsigned long*)(PCI_CFG_47XX(4, 1, 0x10)) = MAPPED_ADDR + 0x6000; OSL_DELAY(2);
  1027. *(unsigned long*)(PCI_CFG_47XX(4, 1, 0x14)) = BCM4710_SDRAM_SWAPPED; OSL_DELAY(2);
  1028. *(unsigned long*)(PCI_CFG_47XX(4, 1, 0x3c)) = 0x00000101; OSL_DELAY(2);
  1029. *(unsigned long*)(PCI_CFG_47XX(4, 1, 0x84)) = BCM4710_SDRAM_SWAPPED; OSL_DELAY(2);
  1030. sysSerialPrintString(" enable prefetch PCI config access n");
  1031.     /* Enable prefetch & burst for f0 & f1's bar1*/
  1032. *(unsigned long*)(PCI_CFG_47XX(4, 0, 0x8c)) = 0x03; OSL_DELAY(2);
  1033. *(unsigned long*)(PCI_CFG_47XX(4, 1, 0x8c)) = 0x03; OSL_DELAY(2);
  1034. sysSerialPrintString(" PCI n");
  1035. pci->intmask |= PCI_INTA + PCI_INTB;
  1036.     sb_detach(sbh);
  1037. }
  1038. void unmask_pci_interrupt(unsigned long bit)
  1039. {
  1040. int s;
  1041. s = intLock();
  1042. pci->intmask |= bit;
  1043. intUnlock(s);
  1044. }
  1045. void mask_pci_interrupt(unsigned long bit)
  1046. {
  1047. int s;
  1048. s = intLock();
  1049. pci->intmask &= ~bit;
  1050. intUnlock(s);
  1051. }
  1052. #endif /* defined(INCLUDE_PCI) */
  1053. void pctest(int d, int f, int o,int ed,int count)
  1054. {
  1055. int fc=0;
  1056. int pc=0;
  1057. int nt;
  1058. unsigned int data;
  1059. int vd;
  1060. unsigned int pd;
  1061. unsigned int err;
  1062. printf("d = %d f = %d o = %d ed = %08xn",d,f,o,ed);
  1063. vd = d;
  1064. if (d > PCI_IDSEL_ALINE_INDIRECT_DEV) {
  1065.   pci->sbtopci1 = SBTOPCI_CFG0 | (1<<(PCI_IDSEL_ALINE_START +d)); OSL_DELAY(2);
  1066.   vd = 10;
  1067. }
  1068. if (ed  == 0xFFFFFFFF) {
  1069. /*  ed = *(volatile unsigned *)(PCI_CFG_47XX(vd, f, o)); */
  1070.  vxMemProbe((void *)PCI_CFG_47XX(vd, f, o),
  1071.                        VX_READ, 4, (char *)&ed);
  1072. }
  1073. err=ed;
  1074. for(;count>0;count--) {
  1075. fc =0;
  1076. pc=0;
  1077. for(nt=256;nt>0;nt--) {
  1078. /* data = *(volatile unsigned *)(PCI_CFG_47XX(vd, f, o)); */
  1079.                  vxMemProbe((void *)PCI_CFG_47XX(vd, f, o),
  1080.                        VX_READ, 4, (char *)&data);
  1081. if (ed != data) {
  1082. err=data; fc++;
  1083.  vxMemProbe((void *)PCI_CFG_47XX((vd+1), f, o),
  1084.        VX_READ, 4, (char *)&data);
  1085. } else pc++;
  1086. }
  1087. printf("pass count = %d Fail Count = %d Expected = %08x Error data = %08xn",
  1088. pc,
  1089. fc,
  1090. ed,
  1091. err
  1092. );
  1093. }
  1094. pci->sbtopci1 = SBTOPCI_CFG0; OSL_DELAY(2);
  1095. }
  1096. void pcteste(int d, int f, int o,int ed)
  1097. {
  1098. int fc=0;
  1099. int pc=0;
  1100. int nt=256;
  1101. unsigned int data;
  1102. int vd;
  1103. unsigned int pd;
  1104. unsigned int err;
  1105. printf("d = %d f = %d o = %d ed = %08xn",d,f,o,ed);
  1106. vd = d;
  1107. if (d > PCI_IDSEL_ALINE_INDIRECT_DEV) {
  1108.   pci->sbtopci1 = SBTOPCI_CFG0 | (1<<(PCI_IDSEL_ALINE_START +d)); OSL_DELAY(2);
  1109.   vd = 10;
  1110. }
  1111. if (ed  == 0xFFFFFFFF) {
  1112. ed = *(volatile unsigned *)(PCI_CFG_47XX(vd, f, o));
  1113.  /* vxMemProbe((void *)PCI_CFG_47XX(vd, f, o),
  1114.                        VX_READ, 4, (char *)&ed); */
  1115. }
  1116. err=ed;
  1117. for(nt=256;nt>0;nt--) {
  1118. data = *(volatile unsigned *)(PCI_CFG_47XX(vd, f, o));
  1119.                  /* vxMemProbe((void *)PCI_CFG_47XX(vd, f, o),
  1120.                        VX_READ, 4, (char *)&data); */
  1121. if (ed != data) { err=data; fc++;} else pc++;
  1122. }
  1123. pci->sbtopci1 = SBTOPCI_CFG0; OSL_DELAY(2);
  1124. printf("pass count = %d Fail Count = %d Expected = %08x Error data = %08xn",
  1125. pc,
  1126. fc,
  1127. ed,
  1128. err
  1129. );
  1130. }