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

VxWorks

开发平台:

C/C++

  1. /* mot85xxPci.c - Wind River SBC8548 PCI/PCI Express Bridge functions */
  2. /*
  3.  * Copyright (c) 2005-2006 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,27jan06,dtr  More comments and clean up.
  13. 01a,04jun05,dtr  File created from cds85xx/mot85xxPci.c/01f.
  14. */
  15. /* PCI Host Bridge setup File */
  16. /*
  17. DESCRIPTION
  18. PCI Host controller setup routines. Enables PCI windows to support the main
  19. pci library functionality including auto config.
  20. INCLUDE FILES: mot85xxPci.h
  21. */
  22. #include <vxWorks.h>
  23. #include "config.h"
  24. #include <sysLib.h>
  25. #include <drv/pci/pciConfigLib.h>
  26. #include <drv/pci/pciIntLib.h>
  27. #include <drv/pci/pciAutoConfigLib.h>
  28. #include "sysBusPci.h"
  29. #include "mot85xxPci.h"
  30. #define MAX_NUM_VECTORS 4
  31. UINT32 pciRegRead(UINT32 *adrs);
  32. void   pciRegWrite(UINT32 *adrs,UINT32 value);
  33. void pciConfigTest();
  34. #define PCI_REG_READ  pciRegRead
  35. #define PCI_REG_WRITE  pciRegWrite
  36. /*************************************************************************
  37. *
  38. * mot85xxBridgeInit - initialize the PCI bridge
  39. *
  40. * This function performs all the initialisation required for the
  41. * Bridge/Interrupts/PCI Bus to function. It does some low level processor
  42. * initialisation which might normally be done in romInit as it is optional
  43. * to do use this and shows what the core changes required to bring up the
  44. * bridge.
  45. *
  46. * RETURNS: N/A
  47. *
  48. * ERRNO: N/A
  49. */
  50. void mot85xxBridgeInit(void)
  51.     {
  52.     STATUS          result;
  53.     volatile UINT32 valRead;
  54.     /* Initialise Local access windows for PCI */
  55.     *M85XX_LAWBAR4(CCSBAR) = PCI_LAW_BASE >> LAWBAR_ADRS_SHIFT;
  56.     *M85XX_LAWAR4(CCSBAR)  = LAWAR_ENABLE | LAWAR_TGTIF_PCI | PCI_LAW_WIN_SZ;
  57.     valRead =  *M85XX_LAWAR4(CCSBAR);
  58. #ifdef INCLUDE_CDS85XX_PCIEX
  59.     *M85XX_LAWBAR6(CCSBAR) = PCIEX_LAW_BASE >> LAWBAR_ADRS_SHIFT;
  60.     *M85XX_LAWAR6(CCSBAR)  = LAWAR_ENABLE | LAWAR_TGTIF_PCIEX |
  61.                              PCIEX_LAW_WIN_SZ;
  62.     valRead =  *M85XX_LAWAR6(CCSBAR);
  63. #endif /* INCLUDE_CDS85XX_PCIEX */
  64.       WRS_ASM("isync");
  65.       /* Set outbound translation window addresses */
  66.       sysPciConfigEnable (CDS85XX_PCI_1_BUS);
  67.       result = sysPciConfigWrite(0,0,0,
  68.  PCI_CFG_BASE_ADDRESS_0,
  69.  0x4,
  70.  PCI_BRIDGE_PIMMR_BASE_ADRS);
  71.       /* for PCI 1 */
  72.       PCI_REG_WRITE((UINT32*)(PCI_OUTBOUND_BASE_ADRS_REG0(CCSBAR)),
  73.     (CPU_PCI_MEM_ADRS>>12) & 0xfffff);
  74.       PCI_REG_WRITE((UINT32*)(PCI_OUTBOUND_TRANS_ADRS_REG0(CCSBAR)),
  75.     (PCI_MEM_ADRS>>12) & 0xfffff);
  76.       PCI_REG_WRITE((UINT32*)(PCI_OUTBOUND_BASE_ADRS_REG1(CCSBAR)),
  77.     (CPU_PCI_MEMIO_ADRS>>12) & 0xfffff);
  78.       PCI_REG_WRITE((UINT32*)(PCI_OUTBOUND_TRANS_ADRS_REG1(CCSBAR)),
  79.     (PCI_MEMIO_ADRS>>12) & 0xfffff);
  80.       PCI_REG_WRITE((UINT32*)(PCI_OUTBOUND_BASE_ADRS_REG2(CCSBAR)),
  81.     (CPU_PCI_IO_ADRS>>12) & 0xfffff);
  82.       PCI_REG_WRITE((UINT32*)(PCI_OUTBOUND_TRANS_ADRS_REG2(CCSBAR)),
  83.     (PCI_IO_ADRS>>12) & 0xfffff);
  84.       PCI_REG_WRITE((UINT32*)(PCI_OUTBOUND_ATTR_REG0(CCSBAR)),
  85.     PCI_WINDOW_ENABLE_BIT | PCI_OUT_ATTR_RTT_MEM | 
  86.                     PCI_OUT_ATTR_WTT_MEM | PCI_MEM_SIZE_MASK);
  87.       PCI_REG_WRITE((UINT32*)(PCI_OUTBOUND_ATTR_REG1(CCSBAR)),
  88.     PCI_WINDOW_ENABLE_BIT |PCI_OUT_ATTR_RTT_MEM | 
  89.                     PCI_OUT_ATTR_WTT_MEM | PCI_MEMIO_SIZE_MASK);
  90.       PCI_REG_WRITE((UINT32*)(PCI_OUTBOUND_ATTR_REG2(CCSBAR)),
  91.     PCI_WINDOW_ENABLE_BIT |PCI_OUT_ATTR_RTT_IO | 
  92.                     PCI_OUT_ATTR_WTT_IO | PCI_IO_SIZE_MASK);
  93.       /* Switch on the inbound windows */
  94.       PCI_REG_WRITE((UINT32*)(PCI_INBOUND_BASE_ADRS_REG1(CCSBAR)),
  95.     (PCI_MSTR_MEM_BUS>>12) & 0xfffff);
  96.       PCI_REG_WRITE((UINT32*)(PCI_INBOUND_TRANS_ADRS_REG1(CCSBAR)),
  97.     (LOCAL_MEM_LOCAL_ADRS>>12) & 0xfffff);
  98.       PCI_REG_WRITE((UINT32*)(PCI_INBOUND_ATTR_REG1(CCSBAR)),
  99.     PCI_WINDOW_ENABLE_BIT | 
  100.     PCI_IN_ATTR_RTT_LM_READ_SNOOP | 
  101.                     PCI_IN_ATTR_RTT_LM_WRITE_SNOOP | PCI_IN_ATTR_TGI_LM | 
  102.     PCI_LOCAL_MEM_SIZE_MASK);
  103.       PCI_REG_WRITE((UINT32*)(PCI_INBOUND_ATTR_REG2(CCSBAR)),
  104.     PCI_IN_ATTR_RTT_LM_READ_SNOOP | 
  105.                     PCI_IN_ATTR_RTT_LM_WRITE_SNOOP | PCI_IN_ATTR_TGI_LM | 
  106.                     PCI_LOCAL_MEM_SIZE_MASK);
  107.       PCI_REG_WRITE((UINT32*)(PCI_INBOUND_ATTR_REG3(CCSBAR)),
  108.     PCI_IN_ATTR_RTT_LM_READ_SNOOP | 
  109.                     PCI_IN_ATTR_RTT_LM_WRITE_SNOOP | PCI_IN_ATTR_TGI_LM | 
  110.                     PCI_LOCAL_MEM_SIZE_MASK);
  111.       /* configure the bridge as bus master */
  112.       result = sysPciConfigWrite(0,0,0,
  113.  COMMAND_REGISTER_OFFSET,
  114.  COMMAND_REGISTER_WIDTH,
  115.  PCI_CMD_IO_ENABLE |
  116.  PCI_CMD_MEM_ENABLE |
  117.  PCI_CMD_MASTER_ENABLE);
  118.       WRS_ASM("sync;eieio");
  119. #ifdef INCLUDE_CDS85XX_PCIEX
  120.       sysPciConfigEnable (CDS85XX_PCIEX_BUS);
  121.       /* for PCI Express */
  122.       PCI_REG_WRITE((UINT32*)(PCIEX_OUTBOUND_BASE_ADRS_REG0(CCSBAR)),
  123.     (CPU_PCI_MEM_ADRS3>>12) & 0xfffff);
  124.       PCI_REG_WRITE((UINT32*)(PCIEX_OUTBOUND_TRANS_ADRS_REG0(CCSBAR)),
  125.     (PCI_MEM_ADRS3>>12) & 0xfffff);
  126.       PCI_REG_WRITE((UINT32*)(PCIEX_OUTBOUND_BASE_ADRS_REG1(CCSBAR)),
  127.     (CPU_PCI_MEMIO_ADRS3>>12) & 0xfffff);
  128.       PCI_REG_WRITE((UINT32*)(PCIEX_OUTBOUND_TRANS_ADRS_REG1(CCSBAR)),
  129.     (PCI_MEMIO_ADRS3>>12) & 0xfffff);
  130.       PCI_REG_WRITE((UINT32*)(PCIEX_OUTBOUND_BASE_ADRS_REG2(CCSBAR)),
  131.     (CPU_PCI_IO_ADRS3>>12) & 0xfffff);
  132.       PCI_REG_WRITE((UINT32*)(PCIEX_OUTBOUND_TRANS_ADRS_REG2(CCSBAR)),
  133.     (PCI_IO_ADRS3>>12) & 0xfffff);
  134.       PCI_REG_WRITE((UINT32*)(PCIEX_OUTBOUND_ATTR_REG0(CCSBAR)),
  135.     PCI_WINDOW_ENABLE_BIT | PCI_OUT_ATTR_RTT_MEM | 
  136.                     PCI_OUT_ATTR_WTT_MEM | PCI_MEM_SIZE_MASK);
  137.       PCI_REG_WRITE((UINT32*)(PCIEX_OUTBOUND_ATTR_REG1(CCSBAR)),
  138.     PCI_WINDOW_ENABLE_BIT |PCI_OUT_ATTR_RTT_MEM | 
  139.                     PCI_OUT_ATTR_WTT_MEM | PCI_MEMIO_SIZE_MASK);
  140.       PCI_REG_WRITE((UINT32*)(PCIEX_OUTBOUND_ATTR_REG2(CCSBAR)),
  141.     PCI_WINDOW_ENABLE_BIT |PCI_OUT_ATTR_RTT_IO | 
  142.                     PCI_OUT_ATTR_WTT_IO | PCI_IO_SIZE_MASK);
  143.       /* Switch on the inbound windows */
  144.       PCI_REG_WRITE((UINT32*)(PCIEX_INBOUND_BASE_ADRS_REG1(CCSBAR)),
  145.     (PCI_MSTR_MEM_BUS>>12) & 0xfffff);
  146.       PCI_REG_WRITE((UINT32*)(PCIEX_INBOUND_TRANS_ADRS_REG1(CCSBAR)),
  147.     (LOCAL_MEM_LOCAL_ADRS>>12) & 0xfffff);
  148.       PCI_REG_WRITE((UINT32*)(PCIEX_INBOUND_ATTR_REG1(CCSBAR)),
  149.     PCI_WINDOW_ENABLE_BIT | 
  150.     PCI_IN_ATTR_RTT_LM_READ_SNOOP | 
  151.                     PCI_IN_ATTR_RTT_LM_WRITE_SNOOP | PCI_IN_ATTR_TGI_LM | 
  152.     PCI_LOCAL_MEM_SIZE_MASK);
  153.       PCI_REG_WRITE((UINT32*)(PCIEX_INBOUND_ATTR_REG2(CCSBAR)),
  154.     PCI_IN_ATTR_RTT_LM_READ_SNOOP | 
  155.                     PCI_IN_ATTR_RTT_LM_WRITE_SNOOP | PCI_IN_ATTR_TGI_LM | 
  156.                     PCI_LOCAL_MEM_SIZE_MASK);
  157.       PCI_REG_WRITE((UINT32*)(PCIEX_INBOUND_ATTR_REG3(CCSBAR)),
  158.     PCI_IN_ATTR_RTT_LM_READ_SNOOP | 
  159.                     PCI_IN_ATTR_RTT_LM_WRITE_SNOOP | PCI_IN_ATTR_TGI_LM | 
  160.                     PCI_LOCAL_MEM_SIZE_MASK);
  161.       result = sysPciConfigWrite(0,0,0,
  162.  COMMAND_REGISTER_OFFSET,
  163.  COMMAND_REGISTER_WIDTH,
  164.  PCI_CMD_IO_ENABLE |
  165.  PCI_CMD_MEM_ENABLE |
  166.  PCI_CMD_MASTER_ENABLE);
  167.       WRS_ASM("sync;eieio");
  168.       /* Make bus 1 visible in configuration space */
  169.       sysPciConfigWrite (0,0,0,0x18,0x4,0xff0100);
  170.       /* MAX read size and MAx payload size = 256 Relax ordering  */
  171.       sysPciConfigWrite (0,0,0,0x54,0x4,0x1820);
  172.       if ((sysPciConfigRead (0,0,0,0x404,0x4,&valRead) == OK) &&
  173.           (valRead == 0x16)) {
  174.           /*
  175.            * Link training complete. PCIE config space access OK.
  176.            * Setup BAR for BUS 1 device 0
  177.            */
  178.           sysPciConfigWrite (1,0,0,PCI_CFG_BASE_ADDRESS_0,0x4, CPU_PCI_MEM_ADRS3);
  179.       }
  180.       /* change to default PCI system 1 */
  181.       sysPciConfigEnable (CDS85XX_PCI_1_BUS);
  182. #endif /* INCLUDE_CDS85XX_PCIEX */
  183.     }
  184. /************************************************************
  185. * pciRegWrite - write to memory-map PCI registers
  186. *
  187. * This function write ATMU registers for PCI.
  188. *
  189. * RETURNS: N/A
  190. *
  191. * ERRNO: N/A
  192. */
  193. void pciRegWrite
  194.     (
  195.     UINT32 *adrs,
  196.     UINT32 value
  197.     )
  198.     {
  199.     *adrs = value;
  200.     WRS_ASM("sync;eieio");
  201.     }
  202. /************************************************************
  203. * pciRegRead - read from memory-map PCI registers
  204. *
  205. * This function read ATMU registers for PCI.
  206. *
  207. * RETURNS: N/A
  208. *
  209. * ERRNO: N/A
  210. */
  211. UINT32 pciRegRead
  212.     (
  213.     UINT32 *adrs
  214.     )
  215.     {
  216.     return (*adrs);
  217.     }
  218. /***********************************************************
  219. * pciConfigTest - dump on-chip PCI configuration header
  220. *
  221. * This function print out PCI configuration header.
  222. *
  223. * RETURNS: N/A
  224. *
  225. * ERRNO: N/A
  226. */
  227. void pciConfigTest
  228.     (
  229.     int pciSys
  230.     )
  231.     {
  232.     int loop;
  233.     UINT32 var;
  234.     switch(pciSys)
  235. {
  236. case CDS85XX_PCI_2_BUS:
  237. case CDS85XX_PCI_1_BUS:
  238. case CDS85XX_PCIEX_BUS:
  239.     sysPciConfigEnable(pciSys);
  240.     break;
  241. default:
  242.     sysPciConfigEnable (CDS85XX_PCI_1_BUS);
  243.     break;
  244. }
  245.     for(loop = 0; loop < 0x40; loop += 4)
  246.         {
  247.         sysPciConfigRead(0,0,0,loop,0x4,&var);
  248.         printf("Word %d Value %xn",loop,var);
  249.         }
  250.     }