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

VxWorks

开发平台:

C/C++

  1. /* pciIomapShow.c - Show routines of PCI bus(IO mapped) library */
  2. /* Copyright 1984-2001 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01e,27oct01,dat  Adding warnings about obsolete drivers
  8. 01d,12jan97,hdn  changed member/variable name "vender" to "vendor".
  9. 01c,12jan97,hdn  changed member/variable name "class" to "classCode".
  10. 01b,14mar96,hdn  re-written.  changed parameters of the functions.
  11.  removed BIOS dependent codes.
  12. 01a,25feb95,bcs  written
  13. */
  14. /*
  15. DESCRIPTION
  16. This module contains show routine to see all devices and bridges on the PCI bus.
  17. This module works in conjunction with pciIomapLib.o.
  18. There are two ways to find out an empty device.
  19.   - check Master Abort bit after the access.
  20.   - check whether the read value is 0xffff.
  21. It uses the second method, since I didn't see the Master Abort bit of
  22. the host/PCI bridge changing.
  23. */
  24. #include "vxWorks.h"
  25. #include "stdio.h"
  26. #include "stdlib.h"
  27. #include "string.h"
  28. #include "drv/pci/pciIomapLib.h"
  29. /* pciIomapShow is being obsoleted. Please use pciConfigLib instead. */
  30. #warning "src/drv/pci/pciIomapShow.c is outdated. Please use pciConfigShow"
  31. /* defines */
  32. /* externs */
  33. IMPORT int pciLibInitDone;
  34. IMPORT int pciLibInitStatus;
  35. /* globals */
  36. /* locals */
  37. /* forward declarations */
  38. LOCAL void pciDheaderPrint (PCI_HEADER_DEVICE * pD);
  39. LOCAL void pciBheaderPrint (PCI_HEADER_BRIDGE * pB);
  40. /*******************************************************************************
  41. *
  42. * pciIomapShowInit - initialize the show routines.
  43. *
  44. * This routine is used to pull in all routines in this library.
  45. *
  46. * NOMANUAL
  47. * RETURNS: N/A
  48. */
  49. void pciIomapShowInit (void)
  50.     {
  51.     }
  52. /*******************************************************************************
  53. *
  54. * pciDeviceShow - print information about PCI devices
  55. *
  56. * This routine prints information about PCI devices
  57. * There are two ways to find out an empty device.
  58. *   - check Master Abort bit after the access.
  59. *   - check whether the read value is 0xffff.
  60. * It uses the second method, since I didn't see the Master Abort bit of
  61. * the host/PCI bridge changing.
  62. *
  63. * RETURNS:
  64. * OK, or ERROR if the library is not initialized.
  65. */
  66. STATUS pciDeviceShow
  67.     (
  68.     int busNo /* bus number */
  69.     )
  70.     {
  71.     int deviceNo;
  72.     int devices;
  73.     ushort_t vendorId;
  74.     ushort_t deviceId;
  75.     union {
  76. int classCode;
  77. char array[4];
  78. } u;
  79.     if (pciLibInitStatus != OK) /* sanity check */
  80.         return (ERROR);
  81.     printf ("Scanning function 0 of each PCI device on bus %dn", busNo);
  82.     printf ("Using configuration mechanism %dn", pciConfigMech);
  83.     printf ("bus       device    function  vendorID  deviceID  classn");
  84.     if (pciConfigMech == PCI_MECHANISM_1)
  85. devices = 0x1f;
  86.     else
  87. devices = 0x0f;
  88.     for (deviceNo=0; deviceNo < devices; deviceNo++)
  89. {
  90. pciConfigInWord (busNo, deviceNo, 0, PCI_CFG_VENDOR_ID, &vendorId);
  91. pciConfigInWord (busNo, deviceNo, 0, PCI_CFG_DEVICE_ID, &deviceId);
  92. pciConfigInByte (busNo, deviceNo, 0, PCI_CFG_PROGRAMMING_IF, 
  93.  &u.array[0]);
  94. pciConfigInByte (busNo, deviceNo, 0, PCI_CFG_SUBCLASS, &u.array[1]);
  95. pciConfigInByte (busNo, deviceNo, 0, PCI_CFG_CLASS, &u.array[2]);
  96. /* There are two ways to find out an empty device.
  97.  *   1. check Master Abort bit after the access.
  98.  *   2. check whether the read value is 0xffff.
  99.  * Since I didn't see the Master Abort bit of the host/PCI bridge
  100.  * changing, I use the second method.
  101.  */
  102. if (vendorId != 0xffff)
  103.     printf ("%.8x  %.8x  %.8x  %.8x  %.8x  %.8xn",
  104.     busNo, deviceNo, 0, vendorId, deviceId, u.classCode);
  105. }
  106.     return (OK);
  107.     }
  108. /*******************************************************************************
  109. *
  110. * pciHeaderShow - print a header of the specified PCI device
  111. *
  112. * This routine prints a header of the PCI device specified by busNo, deviceNo,
  113. * and funcNo.
  114. *
  115. * RETURNS:
  116. * OK, or ERROR if this library is not initialized.
  117. *
  118. */
  119. STATUS pciHeaderShow
  120.     (
  121.     int busNo, /* bus number */
  122.     int deviceNo, /* device number */
  123.     int funcNo /* function number */
  124.     )
  125.     {
  126.     PCI_HEADER_DEVICE headerDevice;
  127.     PCI_HEADER_BRIDGE headerBridge;
  128.     PCI_HEADER_DEVICE * pD = &headerDevice;
  129.     PCI_HEADER_BRIDGE * pB = &headerBridge;
  130.     if (pciLibInitStatus != OK) /* sanity check */
  131.         return (ERROR);
  132.     pciConfigInByte (busNo, deviceNo, funcNo, PCI_CFG_HEADER_TYPE, 
  133.      &pD->headerType);
  134.     if (pD->headerType & 0x01) /* PCI-to-PCI bridge */
  135. {
  136.         pciConfigInWord (busNo, deviceNo, funcNo, PCI_CFG_VENDOR_ID, 
  137.  &pB->vendorId);
  138.         pciConfigInWord (busNo, deviceNo, funcNo, PCI_CFG_DEVICE_ID, 
  139.  &pB->deviceId);
  140.         pciConfigInWord (busNo, deviceNo, funcNo, PCI_CFG_COMMAND, 
  141.  &pB->command);
  142.         pciConfigInWord (busNo, deviceNo, funcNo, PCI_CFG_STATUS, 
  143.  &pB->status);
  144.         pciConfigInByte (busNo, deviceNo, funcNo, PCI_CFG_REVISION, 
  145.  &pB->revisionId);
  146.         pciConfigInByte (busNo, deviceNo, funcNo, PCI_CFG_PROGRAMMING_IF, 
  147.  &pB->progIf);
  148.         pciConfigInByte (busNo, deviceNo, funcNo, PCI_CFG_SUBCLASS, 
  149.  &pB->subClass);
  150.         pciConfigInByte (busNo, deviceNo, funcNo, PCI_CFG_CLASS, 
  151.  &pB->classCode);
  152.         pciConfigInByte (busNo, deviceNo, funcNo, PCI_CFG_CACHE_LINE_SIZE, 
  153.  &pB->cacheLine);
  154.         pciConfigInByte (busNo, deviceNo, funcNo, PCI_CFG_LATENCY_TIMER, 
  155.  &pB->latency);
  156.         pciConfigInByte (busNo, deviceNo, funcNo, PCI_CFG_HEADER_TYPE, 
  157.  &pB->headerType);
  158.         pciConfigInByte (busNo, deviceNo, funcNo, PCI_CFG_BIST, 
  159.  &pB->bist);
  160.         pciConfigInLong (busNo, deviceNo, funcNo, PCI_CFG_BASE_ADDRESS_0, 
  161.  &pB->base0);
  162.         pciConfigInLong (busNo, deviceNo, funcNo, PCI_CFG_BASE_ADDRESS_1, 
  163.  &pB->base1);
  164.         pciConfigInByte (busNo, deviceNo, funcNo, PCI_CFG_PRIMARY_BUS, 
  165.  &pB->priBus);
  166.         pciConfigInByte (busNo, deviceNo, funcNo, PCI_CFG_SECONDARY_BUS, 
  167.  &pB->secBus);
  168.         pciConfigInByte (busNo, deviceNo, funcNo, PCI_CFG_SUBORDINATE_BUS, 
  169.  &pB->subBus);
  170.         pciConfigInByte (busNo, deviceNo, funcNo, PCI_CFG_SEC_LATENCY, 
  171.  &pB->secLatency);
  172.         pciConfigInByte (busNo, deviceNo, funcNo, PCI_CFG_IO_BASE, 
  173.  &pB->ioBase);
  174.         pciConfigInByte (busNo, deviceNo, funcNo, PCI_CFG_IO_LIMIT, 
  175.  &pB->ioLimit);
  176.         pciConfigInWord (busNo, deviceNo, funcNo, PCI_CFG_SEC_STATUS, 
  177.  &pB->secStatus);
  178.         pciConfigInWord (busNo, deviceNo, funcNo, PCI_CFG_MEM_BASE, 
  179.  &pB->memBase);
  180.         pciConfigInWord (busNo, deviceNo, funcNo, PCI_CFG_MEM_LIMIT, 
  181.  &pB->memLimit);
  182.         pciConfigInWord (busNo, deviceNo, funcNo, PCI_CFG_PRE_MEM_BASE, 
  183.  &pB->preBase);
  184.         pciConfigInWord (busNo, deviceNo, funcNo, PCI_CFG_PRE_MEM_LIMIT, 
  185.  &pB->preLimit);
  186.         pciConfigInLong (busNo, deviceNo, funcNo, PCI_CFG_PRE_MEM_BASE_U, 
  187.  &pB->preBaseUpper);
  188.         pciConfigInLong (busNo, deviceNo, funcNo, PCI_CFG_PRE_MEM_LIMIT_U, 
  189.  &pB->preLimitUpper);
  190.         pciConfigInWord (busNo, deviceNo, funcNo, PCI_CFG_IO_BASE_U, 
  191.  &pB->ioBaseUpper);
  192.         pciConfigInWord (busNo, deviceNo, funcNo, PCI_CFG_IO_LIMIT_U, 
  193.  &pB->ioLimitUpper);
  194.         pciConfigInLong (busNo, deviceNo, funcNo, PCI_CFG_ROM_BASE, 
  195.  &pB->romBase);
  196.         pciConfigInByte (busNo, deviceNo, funcNo, PCI_CFG_BRG_INT_LINE, 
  197.  &pB->intLine);
  198.         pciConfigInByte (busNo, deviceNo, funcNo, PCI_CFG_BRG_INT_PIN, 
  199.  &pB->intPin);
  200.         pciConfigInWord (busNo, deviceNo, funcNo, PCI_CFG_BRIDGE_CONTROL, 
  201.  &pB->control);
  202.         pciBheaderPrint (pB);
  203. }
  204.     else /* PCI device */
  205. {
  206.         pciConfigInWord (busNo, deviceNo, funcNo, PCI_CFG_VENDOR_ID, 
  207.  &pD->vendorId);
  208.         pciConfigInWord (busNo, deviceNo, funcNo, PCI_CFG_DEVICE_ID, 
  209.  &pD->deviceId);
  210.         pciConfigInWord (busNo, deviceNo, funcNo, PCI_CFG_COMMAND, 
  211.  &pD->command);
  212.         pciConfigInWord (busNo, deviceNo, funcNo, PCI_CFG_STATUS, 
  213.  &pD->status);
  214.         pciConfigInByte (busNo, deviceNo, funcNo, PCI_CFG_REVISION, 
  215.  &pD->revisionId);
  216.         pciConfigInByte (busNo, deviceNo, funcNo, PCI_CFG_PROGRAMMING_IF, 
  217.  &pD->progIf);
  218.         pciConfigInByte (busNo, deviceNo, funcNo, PCI_CFG_SUBCLASS, 
  219.  &pD->subClass);
  220.         pciConfigInByte (busNo, deviceNo, funcNo, PCI_CFG_CLASS, 
  221.  &pD->classCode);
  222.         pciConfigInByte (busNo, deviceNo, funcNo, PCI_CFG_CACHE_LINE_SIZE, 
  223.  &pD->cacheLine);
  224.         pciConfigInByte (busNo, deviceNo, funcNo, PCI_CFG_LATENCY_TIMER, 
  225.  &pD->latency);
  226.         pciConfigInByte (busNo, deviceNo, funcNo, PCI_CFG_HEADER_TYPE, 
  227.  &pD->headerType);
  228.         pciConfigInByte (busNo, deviceNo, funcNo, PCI_CFG_BIST, 
  229.  &pD->bist);
  230.         pciConfigInLong (busNo, deviceNo, funcNo, PCI_CFG_BASE_ADDRESS_0, 
  231.  &pD->base0);
  232.         pciConfigInLong (busNo, deviceNo, funcNo, PCI_CFG_BASE_ADDRESS_1, 
  233.  &pD->base1);
  234.         pciConfigInLong (busNo, deviceNo, funcNo, PCI_CFG_BASE_ADDRESS_2, 
  235.  &pD->base2);
  236.         pciConfigInLong (busNo, deviceNo, funcNo, PCI_CFG_BASE_ADDRESS_3, 
  237.  &pD->base3);
  238.         pciConfigInLong (busNo, deviceNo, funcNo, PCI_CFG_BASE_ADDRESS_4, 
  239.  &pD->base4);
  240.         pciConfigInLong (busNo, deviceNo, funcNo, PCI_CFG_BASE_ADDRESS_5, 
  241.  &pD->base5);
  242.         pciConfigInLong (busNo, deviceNo, funcNo, PCI_CFG_CIS, 
  243.  &pD->cis);
  244.         pciConfigInWord (busNo, deviceNo, funcNo, PCI_CFG_SUB_VENDER_ID, 
  245.  &pD->subVendorId);
  246.         pciConfigInWord (busNo, deviceNo, funcNo, PCI_CFG_SUB_SYSTEM_ID, 
  247.  &pD->subSystemId);
  248.         pciConfigInLong (busNo, deviceNo, funcNo, PCI_CFG_EXPANSION_ROM, 
  249.  &pD->romBase);
  250.         pciConfigInByte (busNo, deviceNo, funcNo, PCI_CFG_DEV_INT_LINE, 
  251.  &pD->intLine);
  252.         pciConfigInByte (busNo, deviceNo, funcNo, PCI_CFG_DEV_INT_PIN, 
  253.  &pD->intPin);
  254.         pciConfigInByte (busNo, deviceNo, funcNo, PCI_CFG_MIN_GRANT, 
  255.  &pD->minGrant);
  256.         pciConfigInByte (busNo, deviceNo, funcNo, PCI_CFG_MAX_LATENCY, 
  257.  &pD->maxLatency);
  258.         pciDheaderPrint (pD);
  259. }
  260.     return (OK);
  261.     }
  262. /*******************************************************************************
  263. *
  264. * pciFindDeviceShow - find a device by deviceId, then print an information.
  265. *
  266. * This routine finds a device by deviceId, then print an information.
  267. *
  268. * RETURNS:
  269. * OK, or ERROR if this library is not initialized.
  270. *
  271. */
  272. STATUS pciFindDeviceShow
  273.     (
  274.     int vendorId, /* vendor ID */
  275.     int deviceId, /* device ID */
  276.     int index /* desired instance of device */
  277.     )
  278.     {
  279.     int busNo;
  280.     int deviceNo;
  281.     int funcNo;
  282.     if (pciFindDevice (vendorId, deviceId, index, &busNo, &deviceNo, &funcNo)
  283. == OK)
  284. {
  285. printf ("deviceId = 0x%.8xn", deviceId);
  286. printf ("vendorId = 0x%.8xn", vendorId);
  287. printf ("index =    0x%.8xn", index);
  288. printf ("busNo =    0x%.8xn", busNo);
  289. printf ("deviceNo = 0x%.8xn", deviceNo);
  290. printf ("funcNo =   0x%.8xn", funcNo);
  291. return (OK);
  292. }
  293.     return (ERROR);
  294.     }
  295. /*******************************************************************************
  296. *
  297. * pciFindClassShow - find a device by class, then print an information.
  298. *
  299. * This routine finds a device by class, then print an information.
  300. *
  301. * RETURNS:
  302. * OK, or ERROR if this library is not initialized.
  303. *
  304. */
  305. STATUS pciFindClassShow
  306.     (
  307.     int classCode, /* class code */
  308.     int index /* desired instance of device */
  309.     )
  310.     {
  311.     int busNo;
  312.     int deviceNo;
  313.     int funcNo;
  314.     if (pciFindClass (classCode, index, &busNo, &deviceNo, &funcNo) == OK)
  315. {
  316. printf ("class code = 0x%.8xn", classCode);
  317. printf ("index =      0x%.8xn", index);
  318. printf ("busNo =      0x%.8xn", busNo);
  319. printf ("deviceNo =   0x%.8xn", deviceNo);
  320. printf ("funcNo =     0x%.8xn", funcNo);
  321. return (OK);
  322. }
  323.     return (ERROR);
  324.     }
  325. /*******************************************************************************
  326. *
  327. * pciDheaderPrint - print a PCI device header
  328. *
  329. * This routine prints a PCI device header.
  330. *
  331. * RETURNS: N/A
  332. *
  333. */
  334. LOCAL void pciDheaderPrint
  335.     (
  336.     PCI_HEADER_DEVICE * pD
  337.     )
  338.     {
  339.     printf ("vendor ID =                   0x%.4xn", (ushort_t)pD->vendorId);
  340.     printf ("device ID =                   0x%.4xn", (ushort_t)pD->deviceId);
  341.     printf ("command register =            0x%.4xn", (ushort_t)pD->command);
  342.     printf ("status register =             0x%.4xn", (ushort_t)pD->status);
  343.     printf ("revision ID =                 0x%.2xn", (uchar_t)pD->revisionId);
  344.     printf ("class code =                  0x%.2xn", (uchar_t)pD->classCode);
  345.     printf ("sub class code =              0x%.2xn", (uchar_t)pD->subClass);
  346.     printf ("programming interface =       0x%.2xn", (uchar_t)pD->progIf);
  347.     printf ("cache line =                  0x%.2xn", (uchar_t)pD->cacheLine);
  348.     printf ("latency time =                0x%.2xn", (uchar_t)pD->latency);
  349.     printf ("header type =                 0x%.2xn", (uchar_t)pD->headerType);
  350.     printf ("BIST =                        0x%.2xn", (uchar_t)pD->bist);
  351.     printf ("base address 0 =              0x%.8xn", pD->base0);
  352.     printf ("base address 1 =              0x%.8xn", pD->base1);
  353.     printf ("base address 2 =              0x%.8xn", pD->base2);
  354.     printf ("base address 3 =              0x%.8xn", pD->base3);
  355.     printf ("base address 4 =              0x%.8xn", pD->base4);
  356.     printf ("base address 5 =              0x%.8xn", pD->base5);
  357.     printf ("cardBus CIS pointer =         0x%.8xn", pD->cis);
  358.     printf ("sub system vendor ID =        0x%.4xn", (ushort_t)pD->subVendorId);
  359.     printf ("sub system ID =               0x%.4xn", (ushort_t)pD->subSystemId);
  360.     printf ("expansion ROM base address =  0x%.8xn", pD->romBase);
  361.     printf ("interrupt line =              0x%.2xn", (uchar_t)pD->intLine);
  362.     printf ("interrupt pin =               0x%.2xn", (uchar_t)pD->intPin);
  363.     printf ("min Grant =                   0x%.2xn", (uchar_t)pD->minGrant);
  364.     printf ("max Latency =                 0x%.2xn", (uchar_t)pD->maxLatency);
  365.     }
  366. /*******************************************************************************
  367. *
  368. * pciBheaderPrint - print a PCI-to-PCI bridge header
  369. *
  370. * This routine prints a PCI-to-PCI bridge header.
  371. *
  372. * RETURNS: N/A
  373. *
  374. */
  375. LOCAL void pciBheaderPrint
  376.     (
  377.     PCI_HEADER_BRIDGE * pB
  378.     )
  379.     {
  380.     printf ("vendor ID =                   0x%.4xn", (ushort_t)pB->vendorId);
  381.     printf ("device ID =                   0x%.4xn", (ushort_t)pB->deviceId);
  382.     printf ("command register =            0x%.4xn", (ushort_t)pB->command);
  383.     printf ("status register =             0x%.4xn", (ushort_t)pB->status);
  384.     printf ("revision ID =                 0x%.2xn", (uchar_t)pB->revisionId);
  385.     printf ("class code =                  0x%.2xn", (uchar_t)pB->classCode);
  386.     printf ("sub class code =              0x%.2xn", (uchar_t)pB->subClass);
  387.     printf ("programming interface =       0x%.2xn", (uchar_t)pB->progIf);
  388.     printf ("cache line =                  0x%.2xn", (uchar_t)pB->cacheLine);
  389.     printf ("latency time =                0x%.2xn", (uchar_t)pB->latency);
  390.     printf ("header type =                 0x%.2xn", (uchar_t)pB->headerType);
  391.     printf ("BIST =                        0x%.2xn", (uchar_t)pB->bist);
  392.     printf ("base address 0 =              0x%.8xn", pB->base0);
  393.     printf ("base address 1 =              0x%.8xn", pB->base1);
  394.     printf ("primary bus number =          0x%.2xn", (uchar_t)pB->priBus);
  395.     printf ("secondary bus number =        0x%.2xn", (uchar_t)pB->secBus);
  396.     printf ("subordinate bus number =      0x%.2xn", (uchar_t)pB->subBus);
  397.     printf ("secondary latency timer =     0x%.2xn", (uchar_t)pB->secLatency);
  398.     printf ("IO base =                     0x%.2xn", (uchar_t)pB->ioBase);
  399.     printf ("IO limit =                    0x%.2xn", (uchar_t)pB->ioLimit);
  400.     printf ("secondary status =            0x%.4xn", (ushort_t)pB->secStatus);
  401.     printf ("memory base =                 0x%.4xn", (ushort_t)pB->memBase);
  402.     printf ("memory limit =                0x%.4xn", (ushort_t)pB->memLimit);
  403.     printf ("prefetch memory base =        0x%.4xn", (ushort_t)pB->preBase);
  404.     printf ("prefetch memory limit =       0x%.4xn", (ushort_t)pB->preLimit);
  405.     printf ("prefetch memory base upper =  0x%.8xn", pB->preBaseUpper);
  406.     printf ("prefetch memory limit upper = 0x%.8xn", pB->preLimitUpper);
  407.     printf ("IO base upper 16 bits =       0x%.4xn", (ushort_t)pB->ioBaseUpper);
  408.     printf ("IO limit upper 16 bits =      0x%.4xn", (ushort_t)pB->ioLimitUpper);
  409.     printf ("expansion ROM base address =  0x%.8xn", pB->romBase);
  410.     printf ("interrupt line =              0x%.2xn", (uchar_t)pB->intLine);
  411.     printf ("interrupt pin =               0x%.2xn", (uchar_t)pB->intPin);
  412.     printf ("bridge control =              0x%.4xn", (ushort_t)pB->control);
  413.     }