ixp425PciConfigLib.c
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:23k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* ixp425PciConfigLib.c - PCI Configuration driver for the IXP425 */
  2. /* Copyright 2002 Wind River Systems, Inc. */
  3. /*
  4. modification history
  5. --------------------
  6. 01a,05jun02,jb  initial version...
  7. */
  8. /*
  9. DESCRIPTION
  10. This module provides services to enable the generation of configuration 
  11. cycles on the PCI bus. PCI device drivers will use this code to configure 
  12. and manage the devices they control. The standard configuration routines 
  13. are pciConfigInxxx and pciConfigOutxxx. In addition to these we have provided 
  14. routines for generating IO reads and writes and memory reads and writes.
  15. In order for the functionality defined herein to be available, INCLUDE_PCI 
  16. must be defined in config.h
  17. .SH INITIALIZATION
  18. The function sysPciInit() should be called from
  19. sysHwInit() to initialize the PCI unit on the IXP425.
  20. The function sysPciAssignAddrs() should be called from 
  21. sysHwInit() after the call to sysPciInit to initialise 
  22. devices on the PCI bus.
  23. INCLUDE FILES:
  24. ixp425Pci.h ixp425Pci_p.h
  25. SEE ALSO:
  26. .I "PCI Local Bus Specification, Revision 2.2, December 18, 1998"
  27. ixp425Pci.c
  28. */
  29. #include "vxWorks.h"
  30. #include "config.h" 
  31. #include "ixp425Pci.h"
  32. #include "ixp425Pci_p.h"
  33. extern STATUS pciLibInitStatus;       
  34. /******************************************************************************
  35. *
  36. * pciDeviceExists - checks whether a device is present
  37. *
  38. * This function checks the specified bus, device and function number
  39. * to verify whether a device is actually present on the PCI bus at that
  40. * location
  41. *
  42. * RETURNS: TRUE if a device is found, FALSE otherwise
  43. */
  44. BOOL 
  45. pciDeviceExists (UINT32 busNo,
  46.  UINT32 deviceNo,
  47.  UINT32 funcNo)
  48. {
  49.     UINT32 vendorId;
  50.     UINT32 regval;
  51.     UINT32 key;
  52.     /*we need to lock interrupts here because if we do not, the PCC internal ISR
  53.       (if enabled) will be invoked in the event that we try to read from a non-existent 
  54.       device, the ISR will clear the PFE indicator before we get to read it.*/
  55.     key=intLock();
  56.     pciConfigInLong (busNo, deviceNo, funcNo, PCI_CFG_VENDOR_ID, &vendorId);
  57.     /* There are two ways to find out an empty device.
  58.      *   1. check Master Abort bit after the access.
  59.      *   2. check whether the vendor id read back is 0x0.
  60.      */
  61.     REG_READ (PCI_CSR_BASE, PCI_ISR_OFFSET, regval);
  62.     if ( (vendorId != 0x0) && ((regval & PCI_ISR_PFE)==0))
  63.     {
  64. intUnlock(key);
  65. return TRUE;
  66.     }
  67.     /*no device present, make sure that the master abort bit is reset*/    
  68.     REG_WRITE (PCI_CSR_BASE, PCI_ISR_OFFSET,  PCI_ISR_PFE );
  69.     intUnlock(key);
  70.     return FALSE;
  71. }
  72. /******************************************************************************
  73. *
  74. * pciInfoGet - Retrieves PCI device information
  75. *
  76. * This function retrieves the PCI assignments of the specified device. 
  77. * It returns a pointer to a PciDevice structure.
  78. *
  79. * RETURNS: Pointer to PCI device information, or NULL
  80. */
  81. PciDevice *
  82. pciInfoGet (UINT16 device)
  83. {
  84.     if (device >= nDevices)
  85.     {
  86. return (NULL);
  87.     }
  88.     return (&devices[device]);
  89. }
  90. /******************************************************************************
  91. *
  92. * pciDeviceGet - Retrieves PCI device information
  93. *
  94. * This function returns a pointer to the n'th instance of a specified device.
  95. * If the entry is not found, NULL is returned. Devices are numbered starting
  96. * at zero.
  97. *
  98. * RETURNS: Pointer to PCI device information, or NULL
  99. */
  100. PciDevice *
  101. pciDeviceGet (UINT32 vendor_id, 
  102.       UINT32 device_id, 
  103.       UINT32 count)
  104. {
  105.     UINT32 ix;
  106.     UINT32 cnt = 0;
  107.     
  108.     for (ix = 0; ix < IXP425_PCI_MAX_FUNC_ON_BUS; ix++)
  109.     {
  110.         if (devices[ix].vendor_id == vendor_id &&
  111.      devices[ix].device_id == device_id)
  112. {
  113.             if (cnt == count)
  114.     {
  115. return (&devices[ix]);
  116.     }
  117.             else
  118.     {
  119.                 cnt++;
  120.     }
  121. }
  122.     }
  123.     
  124.     return ((PciDevice *)NULL);
  125. }
  126. /*******************************************************************************
  127. *
  128. * pciFindDevice - find the nth device with the given device & vendor ID
  129. *
  130. * This routine finds the nth device with the given device & vendor ID.
  131. *
  132. * RETURNS:
  133. * OK, or ERROR if the deviceId and vendorId didn't match.
  134. *
  135. */
  136. STATUS 
  137. pciFindDevice (UINT32 vendorId, 
  138.        UINT32 deviceId, 
  139.        UINT32 index, 
  140.        UINT32 * pBusNo, 
  141.        UINT32 * pDeviceNo,  
  142.        UINT32 * pFuncNo)
  143. {
  144.     UINT32 busNo;
  145.     UINT32 deviceNo;
  146.     UINT32 funcNo;
  147.     UINT32 devdidvid;
  148.     UINT32 didvid;
  149.     UINT32 cnt=0;
  150.     
  151.     if (pciLibInitStatus != OK)
  152.     {
  153.         return ERROR;
  154.     }
  155.     
  156.     didvid = ((deviceId << 16 ) & IXP425_PCI_TOP_WORD_OF_LONG_MASK) | 
  157. (vendorId & IXP425_PCI_BOTTOM_WORD_OF_LONG_MASK);
  158.     for (busNo = 0; busNo < IXP425_PCI_MAX_BUS; busNo++)
  159.     {
  160. for (deviceNo = 0; deviceNo < IXP425_PCI_MAX_DEV; deviceNo++)
  161. {
  162.     for (funcNo = 0; funcNo < IXP425_PCI_MAX_FUNC; funcNo++)
  163.     {
  164. pciConfigInLong (busNo, deviceNo, funcNo, PCI_CFG_VENDOR_ID,
  165.  &devdidvid);
  166. if (devdidvid == didvid)
  167. {
  168.     if (cnt == index)
  169.     {
  170. *pBusNo = busNo;
  171. *pDeviceNo = deviceNo;
  172. *pFuncNo   = funcNo;
  173. return OK;
  174.     }
  175.     else
  176.     {
  177. cnt++;
  178.     }
  179. }     
  180.     }
  181. }
  182.     }
  183.     return ERROR;
  184. }
  185. /*******************************************************************************
  186. *
  187. * pciFindClass - find the nth occurence of a device by PCI class code.
  188. *
  189. * This routine finds the nth device with the given 24-bit PCI class code
  190. *
  191. * RETURNS:
  192. * OK, or ERROR if the class didn't match.
  193. *
  194. */
  195. STATUS 
  196. pciFindClass (UINT32 classCode, 
  197.       UINT32 index,     
  198.       UINT32 *pBusNo,   
  199.       UINT32 *pDeviceNo,
  200.       UINT32 *pFuncNo)  
  201. {
  202.     UINT32 busNo;
  203.     UINT32 deviceNo;
  204.     UINT32 funcNo;
  205.     UINT32 classCodeReg;  
  206.     UINT32 cnt=0;
  207.     if (pciLibInitStatus != OK)
  208.     {
  209. return ERROR;
  210.     }
  211.     
  212.     for (busNo = 0; busNo < IXP425_PCI_MAX_BUS; busNo++)
  213.     {
  214.         for (deviceNo = 0; deviceNo < IXP425_PCI_MAX_DEV; deviceNo++)
  215. {
  216.             for (funcNo = 0; funcNo < IXP425_PCI_MAX_FUNC; funcNo++)
  217.     {
  218. pciConfigInLong (busNo, deviceNo, funcNo, PCI_CFG_REVISION,
  219.  &classCodeReg);
  220. if ((((classCodeReg >> 8) & IXP425_PCI_BOTTOM_TRIBYTES_OF_LONG_MASK) == classCode))
  221. {
  222.     if (cnt == index)
  223.     {
  224. *pBusNo = busNo;
  225. *pDeviceNo = deviceNo;
  226. *pFuncNo = funcNo;
  227. return OK;
  228.     }
  229.     else
  230.     {
  231. cnt++;
  232.     }
  233. }     
  234.     }
  235. }
  236.     }
  237.     return ERROR;
  238. }
  239. /* All PCI non-prefetch (single data phase) reads and writes go 
  240. *  through the following access functions.
  241. */
  242. LOCAL void 
  243. nonPrefetchRead (UINT32 addr, 
  244.  UINT32 cmd, 
  245.  UINT32 *data)
  246. {
  247.     UINT32 key;  
  248.     key = intLock (); /* mutual exclusion start */    
  249.     REG_WRITE (PCI_CSR_BASE, PCI_NP_AD_OFFSET, addr);    
  250.     /*set up and execute the read*/    
  251.     REG_WRITE (PCI_CSR_BASE, PCI_NP_CBE_OFFSET, cmd);
  252.     /*The result of the read is now in np_rdata*/
  253.     REG_READ (PCI_CSR_BASE, PCI_NP_RDATA_OFFSET, *data); 
  254.     intUnlock (key); /* mutual exclusion stop */
  255.     return;
  256. }
  257. LOCAL void 
  258. nonPrefetchWrite (UINT32 addr, 
  259.   UINT32 cmd, 
  260.   UINT32 data)
  261. {
  262.     UINT32 key;
  263.     key = intLock (); /* mutual exclusion start */    
  264.     REG_WRITE (PCI_CSR_BASE, PCI_NP_AD_OFFSET, addr);
  265.     /*set up the write*/
  266.     REG_WRITE (PCI_CSR_BASE, PCI_NP_CBE_OFFSET, cmd);
  267.     /*Execute the write by writing to NP_WDATA*/
  268.     REG_WRITE (PCI_CSR_BASE, PCI_NP_WDATA_OFFSET, data);
  269.     
  270.     intUnlock (key); /* mutual exclusion stop */
  271.     return;
  272. }
  273. /*******************************************************************************
  274. *
  275. * pciConfigInByte - read one byte from the PCI configuration space
  276. *
  277. * This routine reads one byte from the PCI configuration space
  278. *
  279. * RETURNS:
  280. * OK, or ERROR if this library is not initialized.
  281. *
  282. */
  283. STATUS 
  284. pciConfigInByte (UINT32 busNo,    /* bus number */
  285.  UINT32 deviceNo, /* device number */
  286.  UINT32 funcNo,   /* function number */
  287.  UINT32 offset,   /* offset into the configuration space */
  288.  UINT8 * pData)   /* data read from the offset */    
  289. {
  290.     UINT32 retval;
  291.     UINT32 n;
  292.     UINT32 byteEnables;
  293.     UINT32 addr;
  294.     
  295.     if (pciLibInitStatus != OK)
  296.     {
  297.         return (ERROR);
  298.     }
  299.     
  300.     n = offset % 4;    
  301.     /*byte enables are 4 bits, active low, the position of each
  302.       bit maps to the byte that it enables*/
  303.     byteEnables = (~BIT (n)) & IXP425_PCI_BOTTOM_NIBBLE_OF_LONG_MASK; 
  304.     byteEnables = byteEnables << PCI_NP_CBE_BESL;
  305.     
  306.     /*address bits 31:28 specify the device, 10:8 specify the function*/    
  307.     /*Set the address to be read*/
  308.     addr = BIT ((31 - deviceNo)) | (funcNo << PCI_NP_AD_FUNCSL) | (offset & ~3);
  309.     nonPrefetchRead (addr, byteEnables | NP_CMD_CONFIGREAD, &retval);
  310.     /*Pick out the byte we are interested in*/
  311.     *pData = (retval >> (8*n));   
  312.     
  313.     return (OK);
  314. }
  315. /*******************************************************************************
  316. *
  317. * pciConfigInWord - read one word from the PCI configuration space
  318. *
  319. * This routine reads one word from the PCI configuration space
  320. *
  321. * RETURNS:
  322. * OK, or ERROR if this library is not initialized.
  323. *
  324. */
  325. STATUS 
  326. pciConfigInWord (UINT32 busNo,    /* bus number */
  327.  UINT32 deviceNo, /* device number */
  328.  UINT32 funcNo,   /* function number */
  329.  UINT32 offset,   /* offset into configuration space */
  330.  UINT16 *pData)   /* data read from the offset */    
  331. {
  332.     UINT32 n;
  333.     UINT32 retval;
  334.     UINT32 addr;
  335.     UINT32 byteEnables;
  336.     if (pciLibInitStatus != OK)
  337.     {
  338. return (ERROR);
  339.     }
  340.     n = offset % 4;
  341.     /*byte enables are 4 bits active low, the position of each
  342.       bit maps to the byte that it enables*/
  343.     byteEnables = (~(BIT (n) | BIT ((n+1)))) & IXP425_PCI_BOTTOM_NIBBLE_OF_LONG_MASK; 
  344.     byteEnables = byteEnables << PCI_NP_CBE_BESL;
  345.     /*address bits 31:28 specify the device 10:8 specify the function*/
  346.     /*Set the address to be read*/
  347.     addr = BIT ((31 - deviceNo)) | (funcNo << PCI_NP_AD_FUNCSL) |  (offset & ~3);
  348.     nonPrefetchRead (addr, byteEnables | NP_CMD_CONFIGREAD, &retval);
  349.     
  350.     /*Pick out the word we are interested in*/
  351.     *pData = (retval >> (8*n));    
  352.     
  353.     return (OK);
  354. }
  355. /*******************************************************************************
  356. *
  357. * pciConfigInLong - read one longword from the PCI configuration space
  358. *
  359. * This routine reads one longword from the PCI configuration space
  360. *
  361. * RETURNS:
  362. * OK, or ERROR if this library is not initialized.
  363. *
  364. */
  365. STATUS 
  366. pciConfigInLong (UINT32 busNo,    /* bus number */
  367.  UINT32 deviceNo, /* device number */
  368.  UINT32 funcNo,   /* function number */
  369.  UINT32 offset,   /* offset into configuration space */
  370.  UINT32 *pData)   /* data read from the offset */    
  371. {
  372.     UINT32 retval;
  373.     UINT32 addr;
  374.     if (pciLibInitStatus != OK)
  375.     {
  376.         return (ERROR);
  377.     }
  378.     /*address bits 31:28 specify the device 10:8 specify the function*/
  379.     /*Set the address to be read*/
  380.     addr = BIT ((31 - deviceNo)) | (funcNo << PCI_NP_AD_FUNCSL) |  (offset & ~3);
  381.     nonPrefetchRead (addr, NP_CMD_CONFIGREAD, &retval);
  382.     *pData = retval;
  383.     return (OK);
  384. }
  385. /*******************************************************************************
  386. *
  387. * pciConfigOutByte - write one byte to the PCI configuration space
  388. *
  389. * This routine writes one byte to the PCI configuration space.
  390. *
  391. * RETURNS:
  392. * OK, or ERROR if this library is not initialized.
  393. *
  394. */
  395. STATUS 
  396. pciConfigOutByte (UINT32 busNo,    /* bus number */
  397.   UINT32 deviceNo, /* device number */
  398.   UINT32 funcNo,   /* function number */
  399.   UINT32 offset,   /* offset into configuration space */
  400.   UINT8 data)      /* data written to the offset */    
  401. {
  402.     UINT32 addr;
  403.     UINT32 byteEnables;
  404.     UINT32 n;
  405.     UINT32 ldata;
  406.     
  407.     if (pciLibInitStatus != OK)
  408.     {
  409.         return (ERROR);
  410.     }
  411.     n = offset % 4;
  412.     /*byte enables are 4 bits active low, the position of each
  413.       bit maps to the byte that it enables*/
  414.     byteEnables = (~BIT (n)) & IXP425_PCI_BOTTOM_NIBBLE_OF_LONG_MASK; 
  415.     byteEnables = byteEnables << PCI_NP_CBE_BESL;
  416.     ldata = data << (8*n);
  417.     /*address bits 31:28 specify the device 10:8 specify the function*/
  418.     /*Set the address to be written*/
  419.     addr = BIT ((31 - deviceNo)) | (funcNo << PCI_NP_AD_FUNCSL) |  (offset & ~3);
  420.     nonPrefetchWrite (addr, byteEnables | NP_CMD_CONFIGWRITE, ldata );    
  421.     
  422.     return (OK);
  423. }
  424. /*******************************************************************************
  425. *
  426. * pciConfigOutWord - write one 16-bit word to the PCI configuration space
  427. *
  428. * This routine writes one 16-bit word to the PCI configuration space.
  429. *
  430. * RETURNS:
  431. * OK, or ERROR if this library is not initialized.
  432. *
  433. */
  434. STATUS 
  435. pciConfigOutWord (UINT32 busNo,    /* bus number */
  436.   UINT32 deviceNo, /* device number */
  437.   UINT32 funcNo,   /* function number */
  438.   UINT32 offset,   /* offset into configuration space */
  439.   UINT16 data)     /* data written to the offset */    
  440. {
  441.     UINT32 addr;
  442.     UINT32 byteEnables;
  443.     UINT32 n;
  444.     UINT32 ldata;
  445.     
  446.     if (pciLibInitStatus != OK)
  447.     {
  448.         return (ERROR);
  449.     }
  450.     n = offset % 4;
  451.     /*byte enables are 4 bits active low, the position of each
  452.       bit maps to the byte that it enables*/
  453.     byteEnables = (~(BIT (n)|BIT ((n+1)))) & IXP425_PCI_BOTTOM_NIBBLE_OF_LONG_MASK; 
  454.     byteEnables = byteEnables << PCI_NP_CBE_BESL;
  455.     ldata = data << (8*n);
  456.     /*address bits 31:28 specify the device 10:8 specify the function*/
  457.     /*Set the address to be written*/
  458.     addr = BIT (31 - deviceNo) | (funcNo << PCI_NP_AD_FUNCSL) |  (offset & ~3);
  459.     nonPrefetchWrite (addr, byteEnables | NP_CMD_CONFIGWRITE, ldata );    
  460.     
  461.     return (OK);
  462. }
  463. /*******************************************************************************
  464. *
  465. * pciConfigOutLong - write one longword to the PCI configuration space
  466. *
  467. * This routine writes one longword to the PCI configuration space.
  468. *
  469. * RETURNS:
  470. * OK, or ERROR if this library is not initialized.
  471. *
  472. */
  473. STATUS 
  474. pciConfigOutLong (UINT32 busNo,    /* bus number */
  475.   UINT32 deviceNo, /* device number */
  476.   UINT32 funcNo,   /* function number */
  477.   UINT32 offset,   /* offset into configuration space */
  478.   UINT32 data)     /* data written to the offset */    
  479. {
  480.     UINT32 addr;
  481.     
  482.     if (pciLibInitStatus != OK)
  483.     {
  484.         return (ERROR);
  485.     }
  486.     
  487.     /*address bits 31:28 specify the device 10:8 specify the function*/
  488.     /*Set the address to be written*/
  489.     addr = BIT (31 - deviceNo) | (funcNo << PCI_NP_AD_FUNCSL) |  (offset & ~3);
  490.     nonPrefetchWrite (addr, NP_CMD_CONFIGWRITE, data );    
  491.     
  492.     return (OK);
  493. }
  494. /*******************************************************************************
  495. *
  496. * pciIOInByte - read a Byte from the PCI IO space
  497. *
  498. * This routine reads using PCI IO non-prefetch transactions
  499. *
  500. * RETURNS:
  501. * OK, or ERROR if this library is not initialized.
  502. *
  503. */
  504. STATUS 
  505. pciIOInByte (void *pciAddr, 
  506.      UINT8 *pData)
  507. {
  508.     UINT32 byteEnables;
  509.     UINT32 n;
  510.     UINT32 retval;
  511.     
  512.     if (pciLibInitStatus != OK)
  513.     {
  514. return (ERROR);
  515.     }
  516.     
  517.     n = (UINT32)pciAddr % 4;
  518.     byteEnables = ~(BIT (n)) & IXP425_PCI_BOTTOM_NIBBLE_OF_LONG_MASK;
  519.     byteEnables = byteEnables << PCI_NP_CBE_BESL;
  520.     nonPrefetchRead ((UINT32)pciAddr,  byteEnables | NP_CMD_IOREAD, &retval);
  521.     *pData = retval >> (8*n) ;
  522.     
  523.     return (OK);
  524. }
  525. /*******************************************************************************
  526. *
  527. * pciIOInWord - read a Word from the PCI IO space
  528. *
  529. * This routine reads using PCI IO non-prefetch transactions
  530. *
  531. * RETURNS:
  532. * OK, or ERROR if this library is not initialized.
  533. *
  534. */
  535. STATUS 
  536. pciIOInWord (void *pciAddr, 
  537.      UINT16 *pData)
  538. {
  539.     UINT32 byteEnables;
  540.     UINT32 n;
  541.     UINT32 retval;
  542.     
  543.     if (pciLibInitStatus != OK)
  544.     {
  545. return (ERROR);
  546.     }
  547.     n = (UINT32)pciAddr % 4;
  548.     byteEnables = ~(BIT (n) | BIT (n+1) ) & IXP425_PCI_BOTTOM_NIBBLE_OF_LONG_MASK;
  549.     byteEnables = byteEnables << PCI_NP_CBE_BESL;
  550.     nonPrefetchRead ((UINT32)pciAddr,  byteEnables | NP_CMD_IOREAD, &retval);
  551.     *pData = retval >> (8*n);
  552.     
  553.     return (OK);
  554. }
  555. /*******************************************************************************
  556. *
  557. * pciIOInLong - read a long from the PCI IO space
  558. *
  559. * This routine reads using PCI IO transactions
  560. *
  561. * RETURNS:
  562. * OK, or ERROR if this library is not initialized.
  563. *
  564. */
  565. STATUS 
  566. pciIOInLong (void *pciAddr, 
  567.      UINT32 *pData)
  568. {
  569.     if (pciLibInitStatus != OK)
  570.     {
  571. return (ERROR);
  572.     }
  573.     nonPrefetchRead ((UINT32)pciAddr,  NP_CMD_IOREAD, pData);    
  574.     return (OK);
  575. }
  576. /*******************************************************************************
  577. *
  578. * pciIOOutByte - write one byte to the PCI IO space
  579. *
  580. * This routine writes one byte to the PCI IO space.
  581. *
  582. * RETURNS:
  583. * OK, or ERROR if this library is not initialized.
  584. *
  585. */
  586. STATUS 
  587. pciIOOutByte (void *pciAddr, 
  588.       UINT8 data)
  589. {
  590.     UINT32 byteEnables;
  591.     UINT32 n;
  592.     UINT32 ldata;
  593.     
  594.     if (pciLibInitStatus != OK)
  595.     {
  596. return (ERROR);
  597.     }
  598.     n = (UINT32)pciAddr % 4;
  599.     byteEnables = ~(BIT (n) ) & IXP425_PCI_BOTTOM_NIBBLE_OF_LONG_MASK;
  600.     byteEnables = byteEnables << PCI_NP_CBE_BESL;
  601.     ldata = data << (8*n);
  602.     nonPrefetchWrite ((UINT32)pciAddr, byteEnables | NP_CMD_IOWRITE, ldata );    
  603.     
  604.     return (OK);
  605. }
  606. /*******************************************************************************
  607. *
  608. * pciIOOutWord - write one word to the PCI IO space
  609. *
  610. * This routine writes one word to the PCI IO space.
  611. *
  612. * RETURNS:
  613. * OK, or ERROR if this library is not initialized.
  614. *
  615. */
  616. STATUS 
  617. pciIOOutWord (void *pciAddr, 
  618.       UINT16 data)
  619. {
  620.     UINT32 byteEnables;
  621.     UINT32 n;
  622.     UINT32 ldata;
  623.     
  624.     if (pciLibInitStatus != OK) /* sanity check */
  625.         return (ERROR);
  626.     
  627.     n = (UINT32)pciAddr % 4;
  628.     byteEnables = ~(BIT (n)|BIT (n+1) ) & IXP425_PCI_BOTTOM_NIBBLE_OF_LONG_MASK;
  629.     byteEnables = byteEnables << PCI_NP_CBE_BESL;
  630.     ldata = data << (8*n);
  631.     nonPrefetchWrite ((UINT32)pciAddr, byteEnables | NP_CMD_IOWRITE, ldata ); 
  632.     
  633.     return (OK);
  634. }
  635. /*******************************************************************************
  636. *
  637. * pciIOOutLong - write one longword to the PCI IO space
  638. *
  639. * This routine writes one longword to the PCI IO space.
  640. *
  641. * RETURNS:
  642. * OK, or ERROR if this library is not initialized.
  643. *
  644. */
  645. STATUS 
  646. pciIOOutLong (void *pciAddr, 
  647.       UINT32 data)
  648. {
  649.     
  650.     if (pciLibInitStatus != OK)  
  651.     {
  652.         return (ERROR);
  653.     }
  654.     
  655.     nonPrefetchWrite ((UINT32)pciAddr, NP_CMD_IOWRITE, data);    
  656.     
  657.     return (OK);
  658. }
  659. /*******************************************************************************
  660. *
  661. * pciMemInByte - read a Byte from the PCI Memory space
  662. *
  663. * This routine reads using PCI Memory non-prefetch transactions
  664. *
  665. * RETURNS:
  666. * OK, or ERROR if this library is not initialized.
  667. *
  668. */
  669. STATUS 
  670. pciMemInByte (void *pciAddr, 
  671.       UINT8 *pData)
  672. {
  673.     UINT32 byteEnables;
  674.     UINT32 n;
  675.     UINT32 retval;
  676.     
  677.     if (pciLibInitStatus != OK)     
  678.     {
  679. return (ERROR);
  680.     }
  681.     n = (UINT32)pciAddr % 4;
  682.     byteEnables = ~(BIT (n)) & IXP425_PCI_BOTTOM_NIBBLE_OF_LONG_MASK;
  683.     byteEnables = byteEnables << PCI_NP_CBE_BESL;
  684.     pciAddr = (UINT32*)((UINT32)pciAddr & ~3);
  685.     nonPrefetchRead ((UINT32)pciAddr,  byteEnables | NP_CMD_MEMREAD, &retval);
  686.     *pData = retval >> (8*n) ;
  687.     
  688.     return (OK);
  689. }
  690. /*******************************************************************************
  691. *
  692. * pciMemInWord - read a Word from the PCI Memory space
  693. *
  694. * This routine reads using PCI Memory non-prefetch transactions
  695. *
  696. * RETURNS:
  697. * OK, or ERROR if this library is not initialized.
  698. *
  699. */
  700. STATUS 
  701. pciMemInWord (void *pciAddr, 
  702.       UINT16 *pData)
  703. {
  704.     UINT32 byteEnables;
  705.     UINT32 n;
  706.     UINT32 retval;
  707.     
  708.     if (pciLibInitStatus != OK)  
  709.     {
  710. return (ERROR);
  711.     }
  712.     n = (UINT32)pciAddr % 4;
  713.     byteEnables = ~(BIT (n) | BIT (n+1) ) & IXP425_PCI_BOTTOM_NIBBLE_OF_LONG_MASK;
  714.     byteEnables = byteEnables << PCI_NP_CBE_BESL;
  715.     pciAddr = (void*)((UINT32)pciAddr & ~3);
  716.     nonPrefetchRead ((UINT32)pciAddr,  byteEnables | NP_CMD_MEMREAD, &retval);
  717.     *pData = retval >> (8*n);
  718.     
  719.     return (OK);
  720. }
  721. /*******************************************************************************
  722. *
  723. * pciMemInLong - read a long from the PCI Memory space
  724. *
  725. * This routine reads using PCI Memory transactions
  726. *
  727. * RETURNS:
  728. * OK, or ERROR if this library is not initialized.
  729. *
  730. */
  731. STATUS 
  732. pciMemInLong (void *pciAddr, 
  733.       UINT32 *pData)
  734. {
  735.     if (pciLibInitStatus != OK)  
  736.     {
  737. return (ERROR);
  738.     }
  739.     pciAddr = (UINT32*)((UINT32)pciAddr & ~3);
  740.     nonPrefetchRead ((UINT32)pciAddr,  NP_CMD_MEMREAD, pData);    
  741.     return (OK);
  742. }
  743. /*******************************************************************************
  744. *
  745. * pciMemOutByte - write one byte to the PCI Memory space
  746. *
  747. * This routine writes one byte to the PCI Memory space.
  748. *
  749. * RETURNS:
  750. * OK, or ERROR if this library is not initialized.
  751. *
  752. */
  753. STATUS 
  754. pciMemOutByte (void *pciAddr, 
  755.        UINT8 data)
  756. {
  757.     UINT32 byteEnables;
  758.     UINT32 n;
  759.     UINT32 ldata;
  760.     
  761.     if (pciLibInitStatus != OK)
  762.     {
  763.         return (ERROR);
  764.     }
  765.     
  766.     n = (UINT32)pciAddr % 4;
  767.     byteEnables = ~(BIT (n)) & IXP425_PCI_BOTTOM_NIBBLE_OF_LONG_MASK;
  768.     byteEnables = byteEnables << PCI_NP_CBE_BESL;
  769.     ldata = data << (8*n);
  770.     pciAddr = (void*)((UINT32)pciAddr & ~3);
  771.     nonPrefetchWrite ((UINT32)pciAddr, byteEnables | NP_CMD_MEMWRITE, ldata );    
  772.     
  773.     return (OK);
  774. }
  775. /*******************************************************************************
  776. *
  777. * pciMemOutWord - write one word to the PCI Memory space
  778. *
  779. * This routine writes one word to the PCI Memory space.
  780. *
  781. * RETURNS: OK, or ERROR if this library is not initialized.
  782. *
  783. */
  784. STATUS 
  785. pciMemOutWord (void *pciAddr, 
  786.        UINT16 data)
  787. {
  788.     UINT32 byteEnables;
  789.     UINT32 n;
  790.     UINT32 ldata;
  791.     
  792.     if (pciLibInitStatus != OK)      
  793.     {
  794.         return (ERROR);
  795.     }
  796.     
  797.     n = (UINT32)pciAddr % 4;
  798.     byteEnables = ~(BIT (n)|BIT (n+1) ) & IXP425_PCI_BOTTOM_NIBBLE_OF_LONG_MASK;
  799.     byteEnables = byteEnables << PCI_NP_CBE_BESL;
  800.     ldata = data << (8*n);
  801.     pciAddr = (void*)((UINT32)pciAddr & ~3);
  802.     nonPrefetchWrite ((UINT32)pciAddr, byteEnables | NP_CMD_MEMWRITE, ldata );    
  803.     
  804.     return (OK);
  805. }
  806. /*******************************************************************************
  807. *
  808. * pciMemOutLong - write one longword to the PCI Memory space
  809. *
  810. * This routine writes one longword to the PCI Memory space.
  811. *
  812. * RETURNS: OK, or ERROR if this library is not initialized.
  813. *
  814. */
  815. STATUS 
  816. pciMemOutLong (void *pciAddr, 
  817.        UINT32 data)
  818. {
  819.     
  820.     if (pciLibInitStatus != OK)      
  821.     {
  822.         return (ERROR);
  823.     }
  824.     pciAddr = (void*)((UINT32)pciAddr & ~3);
  825.     nonPrefetchWrite ((UINT32)pciAddr, NP_CMD_MEMWRITE, data );    
  826.     
  827.     return (OK);
  828. }
  829. /*******************************************************************************
  830. *
  831. * pciSpecialCycle - generate a special cycle with a message
  832. *
  833. * This routine generates a special cycle with a message.
  834. *
  835. * RETURNS: OK, or ERROR if this library is not initialized.
  836. *
  837. */
  838. STATUS 
  839. pciSpecialCycle (UINT32 busNo,   /* bus number */
  840.  UINT32 message) /* data on AD[31:0] during the special cycle */    
  841. {
  842.     if (pciLibInitStatus != OK)
  843.     {
  844.         return (ERROR);
  845.     }
  846.     nonPrefetchWrite (message, NP_CMD_SPECIAL, message);    
  847.     
  848.     return (OK);
  849. }