sysBusPci.c
上传用户:dqzhongke1
上传日期:2022-06-26
资源大小:667k
文件大小:11k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* sysBusPci.c - Wind River SBC8548 platform-specific PCI bus support */
  2. /*
  3.  * Copyright (c) 2006-2007 Wind River Systems, Inc.
  4.  *
  5.  * The right to copy, distribute, modify, or otherwise make use
  6.  * of this software may be licensed only pursuant to the terms
  7.  * of an applicable Wind River license agreement.
  8.  */
  9. /*
  10. modification history
  11. --------------------
  12. 01b,03apr07,b_m  modify PCIe interrupt route.
  13. 01a,30jan06,kds  Modify from cds8548/sysBusPci.c/01a
  14. */
  15. /*
  16. DESCRIPTION
  17. This is the  platform specific pciAutoConfigLib information.
  18. INCLUDE FILES:
  19. */
  20. /* includes */
  21. #include <vxWorks.h>
  22. #include <config.h>
  23. #include <sysLib.h>
  24. #include <drv/pci/pciConfigLib.h> 
  25. #include <drv/pci/pciIntLib.h> 
  26. #include <drv/pci/pciAutoConfigLib.h>
  27. #include <sysBusPci.h>
  28. /* static file scope locals */
  29. IMPORT void sysPciOutLong(UINT32*,UINT32);
  30. IMPORT UINT32 sysPciInLong (UINT32*); 
  31. LOCAL PCI_SYSTEM sysParams ;
  32. #ifdef INCLUDE_CDS85XX_PCIEX
  33. LOCAL PCI_SYSTEM sysParams3;
  34. #endif /* INCLUDE_CDS85XX_PCIEX */
  35. /* INT LINE TO IRQ assignment for SBC8548 board. */
  36. LOCAL UCHAR sysPci1IntRoute [NUM_PCI1_SLOTS][4] =
  37.     {{PCI_XINT1_LVL, PCI_XINT2_LVL, PCI_XINT3_LVL, PCI_XINT4_LVL}};
  38. LOCAL UCHAR sysPci2IntRoute [4] = 
  39.     {PCI2_XINT1_LVL, PCI_XINT2_LVL, PCI_XINT3_LVL, PCI_XINT4_LVL};
  40. LOCAL UCHAR sysPci3IntRoute [NUM_PCIEX_SLOTS][4] =
  41.     {{PCIEX_XINT1_LVL, PCIEX_XINT2_LVL, PCIEX_XINT3_LVL, PCIEX_XINT4_LVL}};
  42. /*******************************************************************************
  43. *
  44. * sysPciAutoConfig - PCI autoconfig support routine
  45. *
  46. * This routine performs the PCI auto-configuration support function.
  47. *
  48. * RETURNS: N/A
  49. */
  50. void sysPciAutoConfig (void)
  51.     {
  52.     void * pCookie;
  53.     /* PCI 1 Auto configuration */
  54.     sysPciConfigEnable (CDS85XX_PCI_1_BUS);
  55.     /* 32-bit Prefetchable Memory Space */
  56.     sysParams.pciMem32          = PCI_MEM_ADRS;
  57.     sysParams.pciMem32Size  = PCI_MEM_SIZE;
  58.     /* 32-bit Non-prefetchable Memory Space */
  59.     sysParams.pciMemIo32  = PCI_MEMIO_ADRS;
  60.     sysParams.pciMemIo32Size  = PCI_MEMIO_SIZE;
  61.     /* 32-bit PCI I/O Space */
  62.     sysParams.pciIo32  = PCI_IO_ADRS;
  63.     sysParams.pciIo32Size  = PCI_IO_SIZE;
  64.     /* Configuration space parameters */
  65.     sysParams.maxBus  = 0;
  66.     sysParams.cacheSize  = ( _CACHE_ALIGN_SIZE / 4 );
  67.     sysParams.maxLatency  = PCI_LAT_TIMER;
  68.     /*
  69.      * Interrupt routing strategy
  70.      * across PCI-to-PCI Bridges
  71.      */
  72.     sysParams.autoIntRouting  = TRUE;
  73.     /* Device inclusion and interrupt routing routines */
  74.     sysParams.includeRtn  = sysPci1AutoconfigInclude;
  75.     sysParams.intAssignRtn  = sysPci1AutoconfigIntrAssign;
  76.     /*
  77.      * PCI-to-PCI Bridge Pre-
  78.      * and Post-enumeration init
  79.      * routines
  80.      */
  81.     sysParams.bridgePreConfigInit = NULL;
  82. /* sysPciAutoconfigPreEnumBridgeInit; */
  83.     sysParams.bridgePostConfigInit = NULL;
  84. /* sysPciAutoconfigPostEnumBridgeInit; */
  85.     /*
  86.      * Perform any needed PCI Host Bridge
  87.      * Initialization that needs to be done
  88.      * before pciAutoConfig is invoked here 
  89.      * utilizing the information in the 
  90.      * newly-populated sysParams structure. 
  91.      */
  92.  
  93.     pCookie = pciAutoConfigLibInit (NULL);
  94.     pciAutoCfgCtl (pCookie, PCI_PSYSTEM_STRUCT_COPY, &sysParams);
  95.     pciAutoCfg (pCookie);
  96.     /*
  97.      * Perform any needed post-enumeration
  98.      * PCI Host Bridge Initialization here
  99.      * utilizing the information in the 
  100.      * sysParams structure that has been 
  101.      * updated as a result of the scan 
  102.      * and configuration passes. 
  103.      */
  104. #ifdef INCLUDE_CDS85XX_PCIEX
  105.     /* PCI 2 Auto configuration */
  106.     sysPciConfigEnable (CDS85XX_PCIEX_BUS);
  107.     /* 32-bit Prefetchable Memory Space */
  108.     sysParams3.pciMem32  = PCI_MEM_ADRS3;
  109.     sysParams3.pciMem32Size  = PCI_MEM_SIZE;
  110.     /* 32-bit Non-prefetchable Memory Space */
  111.     sysParams3.pciMemIo32  = PCI_MEMIO_ADRS3;
  112.     sysParams3.pciMemIo32Size  = PCI_MEMIO_SIZE;
  113.     /* 32-bit PCI I/O Space */
  114.     sysParams3.pciIo32  = PCI_IO_ADRS3;
  115.     sysParams3.pciIo32Size  = PCI_IO_SIZE;
  116.     /* Configuration space parameters */
  117.     sysParams3.maxBus  = 0;
  118.     sysParams3.cacheSize  = ( _CACHE_ALIGN_SIZE / 4 );
  119.     sysParams3.maxLatency  = PCI_LAT_TIMER;
  120.     /*
  121.      * Interrupt routing strategy
  122.      * across PCI-to-PCI Bridges
  123.      */
  124.     sysParams3.autoIntRouting  = TRUE;
  125.     /* Device inclusion and interrupt routing routines */
  126.     sysParams3.includeRtn  = sysPci3AutoconfigInclude;
  127.     sysParams3.intAssignRtn  = sysPci3AutoconfigIntrAssign;
  128.     /*
  129.      * PCI-to-PCI Bridge Pre-
  130.      * and Post-enumeration init
  131.      * routines
  132.      */
  133.     sysParams3.bridgePreConfigInit = NULL;
  134. /* sysPciAutoconfigPreEnumBridgeInit; */
  135.     sysParams3.bridgePostConfigInit = NULL;
  136. /* sysPciAutoconfigPostEnumBridgeInit; */
  137.     /*
  138.      * Perform any needed PCI Host Bridge
  139.      * Initialization that needs to be done
  140.      * before pciAutoConfig is invoked here 
  141.      * utilizing the information in the 
  142.      * newly-populated sysParams structure. 
  143.      */
  144.     pCookie = pciAutoConfigLibInit (NULL);
  145.     pciAutoCfgCtl (pCookie, PCI_PSYSTEM_STRUCT_COPY, &sysParams3);
  146.     pciAutoCfg (pCookie);
  147. #endif /* INCLUDE_CDS85XX_PCIEX */
  148.     }
  149. /*******************************************************************************
  150. *
  151. * sysPci1AutoconfigInclude - PCI 1 autoconfig support routine
  152. *
  153. * This routine performs the PCI 1 auto configuration support function. 
  154. *
  155. * RETURNS: OK or ERROR
  156. */
  157. STATUS sysPci1AutoconfigInclude
  158.     (
  159.     PCI_SYSTEM * pSys, /* PCI_SYSTEM structure pointer */
  160.     PCI_LOC * pLoc, /* pointer to function in question */
  161.     UINT devVend /* deviceID/vendorID of device */
  162.     )
  163.     {
  164.     
  165.     /* 
  166.      * Only support BUS 0 .. PCI_MAX_BUS -1;
  167.      * Host controller itself (device number is 0) won't be configured;
  168.      * Bridge on the Arcadia board (device number 17) won't be configured;
  169.      */ 
  170.     if ((pLoc->bus > PCI_MAX_BUS)                                     ||
  171.         (pLoc->bus == 0 && pLoc->device == 0 && pLoc->function == 0)  ||
  172.         (pLoc->bus == 0 && pLoc->device == 18 && pLoc->function == 0) ||
  173.         (devVend == PCI_ARCADIA_BRIDGE_DEV_ID)) 
  174.         return(ERROR);
  175.     
  176.     return (OK); /* Autoconfigure all devices */
  177.     }
  178. /*******************************************************************************
  179. *
  180. * sysPci2AutoconfigInclude - PCI 2 autoconfig support routine
  181. *
  182. * This routine peforms the PCI 2 auto configuration support function.
  183. *
  184. * RETURNS: OK or ERROR
  185. */
  186. STATUS sysPci2AutoconfigInclude
  187.     (
  188.     PCI_SYSTEM * pSys, /* PCI_SYSTEM structure pointer */
  189.     PCI_LOC * pLoc, /* pointer to function in question */
  190.     UINT devVend /* deviceID/vendorID of device */
  191.     )
  192.     {
  193.     
  194.     /* 
  195.      * Only support BUS 0;
  196.      * Host controller itself (device number is 0) won't be configured;
  197.      */ 
  198.     if ((pLoc->bus > 0) ||
  199.         (pLoc->bus == 0 && pLoc->device == 0 && pLoc->function == 0))  
  200.         return(ERROR);
  201.     return OK; /* Autoconfigure all devices */
  202.     }
  203. /*******************************************************************************
  204. *
  205. * sysPci3AutoconfigInclude - PCI Express autoconfig support routine
  206. *
  207. * This routine performs the PCI Express auto configuration support function.
  208. *
  209. * RETURNS: OK or ERROR
  210. */
  211. STATUS sysPci3AutoconfigInclude
  212.     (
  213.     PCI_SYSTEM * pSys, /* PCI_SYSTEM structure pointer */
  214.     PCI_LOC * pLoc, /* pointer to function in question */
  215.     UINT devVend /* deviceID/vendorID of device */
  216.     )
  217.     {
  218.     
  219.     /* 
  220.      * Only support BUS 0;
  221.      * Host controller itself (device number is 0) won't be configured;
  222.      */ 
  223.     if ((pLoc->bus > 2) ||
  224.         (pLoc->bus == 0 && pLoc->device == 0 && pLoc->function == 0) ||
  225. (pLoc->device > 0))  
  226.         return(ERROR);
  227.     return OK; /* Autoconfigure all devices */
  228.     }
  229. /*******************************************************************************
  230. *
  231. * sysPci1AutoconfigIntrAssign - PCI 1 autoconfig support routine
  232. *
  233. * This routine peforms the PCI 1 auto configuration interrupt assignment
  234. * support function.
  235. *
  236. * RETURNS: PCI interrupt line number given pin mask
  237. */
  238. UCHAR sysPci1AutoconfigIntrAssign
  239.     (
  240.     PCI_SYSTEM * pSys, /* PCI_SYSTEM structure pointer */
  241.     PCI_LOC * pLoc, /* pointer to function in question */
  242.     UCHAR pin /* contents of PCI int pin register */
  243.     )
  244.     {
  245.     UCHAR tmpChar = 0xff;
  246.     /* 
  247.      * Ensure this is a reasonable value for bus zero.
  248.      * If OK, return INT level, else we return 0xff.
  249.      */
  250.     if (((pin > 0) && (pin < 5))        && 
  251. (((pLoc->device) - sysPciSlotDeviceNumber) < NUM_PCI1_SLOTS)  &&
  252. (((pLoc->device) - sysPciSlotDeviceNumber) >= 0))
  253. {
  254. tmpChar = 
  255.     sysPci1IntRoute [((pLoc->device) - sysPciSlotDeviceNumber)][(pin-1)];
  256. }
  257.     /* return the value to be assigned to the pin */
  258.     return (tmpChar);
  259.     }
  260. /*******************************************************************************
  261. *
  262. * sysPci2AutoconfigIntrAssign - PCI 2 autoconfig support routine
  263. *
  264. * This routine peforms the PCI 2 auto configuration interrupt assignment
  265. * support function.
  266. *
  267. * RETURNS: PCI interrupt line number given pin mask
  268. */
  269. UCHAR sysPci2AutoconfigIntrAssign
  270.     (
  271.     PCI_SYSTEM * pSys, /* PCI_SYSTEM structure pointer */
  272.     PCI_LOC * pLoc, /* pointer to function in question */
  273.     UCHAR pin /* contents of PCI int pin register */
  274.     )
  275.     {
  276.     UCHAR tmpChar = 0xff;
  277.     /* 
  278.      * Ensure this is a reasonable value for bus zero.
  279.      * If OK, return INT level, else we return 0xff.
  280.      */
  281.     if ((pin > 0) && (pin < 5))
  282. tmpChar = sysPci2IntRoute [(pin-1)];
  283.     /* return the value to be assigned to the pin */
  284.     return (tmpChar);
  285.     }
  286. /*******************************************************************************
  287. *
  288. * sysPci3AutoconfigIntrAssign - PCI Express autoconfig support routine
  289. *
  290. * This routine peforms the PCI Express auto configuration interrupt assignment
  291. * support function.
  292. *
  293. * RETURNS: PCI interrupt line number given pin mask
  294. */
  295. UCHAR sysPci3AutoconfigIntrAssign
  296.     (
  297.     PCI_SYSTEM * pSys, /* PCI_SYSTEM structure pointer */
  298.     PCI_LOC * pLoc, /* pointer to function in question */
  299.     UCHAR pin /* contents of PCI int pin register */
  300.     )
  301.     {
  302.     UCHAR tmpChar = 0xff;
  303.     /* 
  304.      * Ensure this is a reasonable value for bus zero.
  305.      * If OK, return INT level, else we return 0xff.
  306.      */
  307.     if (((pin > 0) && (pin < 5))        && 
  308. (((pLoc->device) - sysPciSlotDeviceNumber) < NUM_PCIEX_SLOTS)  &&
  309. (((pLoc->device) - sysPciSlotDeviceNumber) >= 0))
  310. {
  311. tmpChar = 
  312.     sysPci3IntRoute [((pLoc->device) - sysPciSlotDeviceNumber)][(pin-1)];
  313. }
  314.     /* return the value to be assigned to the pin */
  315.     return (tmpChar);
  316.     }
  317. /*******************************************************************************
  318. *
  319. * sysPciAutoconfigPreEnumBridgeInit - PCI autoconfig support routine
  320. *
  321. * This routine performs the PCI bridge pre-initilaization and enumeration 
  322. * support function.
  323. *
  324. * RETURNS: N/A
  325. */
  326. void sysPciAutoconfigPreEnumBridgeInit
  327.     (
  328.     PCI_SYSTEM * pSys, /* PCI_SYSTEM structure pointer */
  329.     PCI_LOC * pLoc, /* pointer to function in question */
  330.     UINT devVend /* deviceID/vendorID of device */
  331.     )
  332.     {
  333.     return;
  334.     }
  335. /*******************************************************************************
  336. *
  337. * sysPciAutoconfigPostEnumBridgeInit - PCI autoconfig support routine
  338. *
  339. * This routine performs the PCI bridge post-initialization and enumeration
  340. * support function.
  341. *
  342. * RETURNS: N/A
  343. */
  344. void sysPciAutoconfigPostEnumBridgeInit
  345.     (
  346.     PCI_SYSTEM * pSys, /* PCI_SYSTEM structure pointer */
  347.     PCI_LOC * pLoc, /* pointer to function in question */
  348.     UINT devVend /* deviceID/vendorID of device */
  349.     )
  350.     {
  351.     return;
  352.     }