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

VxWorks

开发平台:

C/C++

  1. /* sysLib.c - Wind River SBC548 board system-dependent library */
  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  add TFFS map to static tlb table and phyMemDesc table.
  13. 01a,31jan06,kds  Modified from cds8458/sysLib.c/01c
  14. */
  15. /*
  16.  * DESCRIPTION
  17.  * This library provides board-specific routines for SBC8548.
  18.  *
  19.  * INCLUDE FILES:
  20.  *
  21.  * SEE ALSO:
  22.  * .pG "Configuration"
  23. */
  24. /* includes */
  25. #define SYSLIB_CALL
  26. #include <vxWorks.h>
  27. #include <vme.h>
  28. #include <memLib.h>
  29. #include <cacheLib.h>
  30. #include <sysLib.h>
  31. #include "config.h"
  32. #include "configNet.h"
  33. #include <string.h>
  34. #include <intLib.h>
  35. #include <logLib.h>
  36. #include <stdio.h>
  37. #include <taskLib.h>
  38. #include <vxLib.h>
  39. #include <tyLib.h>
  40. #include <arch/ppc/mmuE500Lib.h>
  41. #include <arch/ppc/vxPpcLib.h>
  42. #include <private/vmLibP.h>
  43. #include <miiLib.h>
  44. #ifdef INCLUDE_PCI
  45.     #include <drv/pci/pciConfigLib.h>
  46.     #include <drv/pci/pciIntLib.h>
  47.     #include "mot85xxPci.h"
  48. #endif /* INCLUDE_PCI */
  49. #ifdef INCLUDE_I2C_DEV
  50. #include "i2cPCF8547Ioport.h"
  51. #include "i2cM41T81Clock.h"
  52. #include "usrTime.c"
  53. #endif
  54. /* globals */
  55. TLB_ENTRY_DESC sysStaticTlbDesc [] =
  56. {
  57.     /*
  58.      * effAddr,  Unused,  realAddr, ts | size | attributes | permissions
  59.      *
  60.      * TLB #0.  Flash
  61.      *
  62.      * needed be first entry here
  63.      */
  64.     { FLASH0_BASE_ADRS, 0x0, FLASH0_BASE_ADRS, _MMU_TLB_TS_0 | _MMU_TLB_SZ_256M |
  65.         _MMU_TLB_IPROT | _MMU_TLB_PERM_W | _MMU_TLB_PERM_X | _MMU_TLB_ATTR_I |
  66.         _MMU_TLB_ATTR_G
  67.     },
  68.     /*
  69.      * LOCAL MEMORY needed be second entry here  -
  70.      * one TLB would be 256MB so use to get required 512MB
  71.      */
  72.     { 0x00000000, 0x0, 0x00000000, _MMU_TLB_TS_0 | _MMU_TLB_SZ_256M |
  73.         _MMU_TLB_PERM_W | _MMU_TLB_PERM_X | _MMU_TLB_ATTR_M |
  74.         CAM_DRAM_CACHE_MODE | _MMU_TLB_IPROT
  75.     },
  76. #if (LOCAL_MEM_SIZE > 0x10000000)
  77.     { 0x10000000, 0x0, 0x10000000, _MMU_TLB_TS_0 | _MMU_TLB_SZ_256M |
  78.         _MMU_TLB_PERM_W | _MMU_TLB_PERM_X | _MMU_TLB_ATTR_M |
  79.         CAM_DRAM_CACHE_MODE | _MMU_TLB_IPROT
  80.     },
  81. #endif
  82.     { CCSBAR, 0x0, CCSBAR, _MMU_TLB_TS_0 | _MMU_TLB_SZ_1M |
  83.         _MMU_TLB_ATTR_I | _MMU_TLB_ATTR_G | _MMU_TLB_PERM_W | _MMU_TLB_IPROT
  84.     }
  85. #ifdef INCLUDE_L2_SRAM
  86.     ,
  87.     { L2SRAM_ADDR, 0x0, L2SRAM_ADDR, _MMU_TLB_TS_0 | _MMU_TLB_SZ_256K |
  88.         _MMU_TLB_PERM_W | _MMU_TLB_PERM_X | _MMU_TLB_ATTR_I |
  89.         _MMU_TLB_ATTR_G
  90.     }
  91. #endif /* INCLUDE_L2_SRAM */
  92.     /* Assume PCI space contiguous and within 256MB */
  93. #ifdef INCLUDE_PCI
  94.     ,
  95.     { PCI_MEM_ADRS, 0x0, PCI_MEM_ADRS, _MMU_TLB_TS_0 | PCI_MMU_TLB_SZ |
  96.         _MMU_TLB_ATTR_I | _MMU_TLB_ATTR_G | _MMU_TLB_PERM_W
  97.     }
  98. #ifdef INCLUDE_CDS85XX_PCIEX
  99.     ,
  100.     { PCI_MEM_ADRS3, 0x0, PCI_MEM_ADRS3, _MMU_TLB_TS_0 |  PCI_MMU_TLB_SZ |
  101.         _MMU_TLB_ATTR_I | _MMU_TLB_ATTR_G | _MMU_TLB_PERM_W
  102.     }
  103. #endif /* INCLUDE_CDS85XX_PCIEX */
  104. #endif  /* INCLUDE_PCI */
  105. };
  106. int sysStaticTlbDescNumEnt = NELEMENTS (sysStaticTlbDesc);
  107. #ifdef MMU_ASID_MAX     /* Base 6 MMU library in effect */
  108.   /* macro to compose 64-bit PHYS_ADDRs */
  109. # define PHYS_64BIT_ADDR(h, l)  (((PHYS_ADDR)(h) << 32) + (l))
  110. #endif
  111. /*
  112. * sysPhysMemDesc[] is used to initialize the Page Table Entry (PTE) array
  113. * used by the MMU to translate addresses with single page (4k) granularity.
  114. * PTE memory space should not, in general, overlap BAT memory space but
  115. * may be allowed if only Data or Instruction access is mapped via BAT.
  116. *
  117. * Address translations for local RAM, memory mapped PCI bus, the Board Control and
  118. * Status registers, the MPC8260 Internal Memory Map, and local FLASH RAM are set here.
  119. *
  120. * PTEs are held, strangely enough, in a Page Table.  Page Table sizes are
  121. * integer powers of two based on amount of memory to be mapped and a
  122. * minimum size of 64 kbytes.  The MINIMUM recommended Page Table sizes
  123. * for 32-bit PowerPCs are:
  124. *
  125. * Total mapped memory Page Table size
  126. * ------------------- ---------------
  127. *        8 Meg      64 K
  128. *       16 Meg     128 K
  129. *       32 Meg     256 K
  130. *       64 Meg     512 K
  131. *      128 Meg       1 Meg
  132. *  . .
  133. *  . .
  134. *  . .
  135. *
  136. * [Ref: chapter 7, PowerPC Microprocessor Family: The Programming Environments]
  137. *
  138. */
  139. PHYS_MEM_DESC sysPhysMemDesc [] =
  140. {
  141.     {
  142.         /*
  143.  * Vector Table and Interrupt Stack
  144.          * Must be sysPhysMemDesc [0] to allow adjustment in sysHwInit()
  145.  */
  146.         (VIRT_ADDR) LOCAL_MEM_LOCAL_ADRS,
  147.         (PHYS_ADDR) LOCAL_MEM_LOCAL_ADRS,
  148.         LOCAL_MEM_LOCAL_ADRS + LOCAL_MEM_SIZE,
  149.         VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE | VM_STATE_MASK_MEM_COHERENCY,
  150.         VM_STATE_VALID      | VM_STATE_WRITABLE      | TLB_CACHE_MODE | VM_STATE_MEM_COHERENCY
  151.     }
  152.     ,
  153.     {
  154.         /*
  155.          * CCSBAR
  156.         */
  157.         (VIRT_ADDR) CCSBAR,
  158.         (PHYS_ADDR) CCSBAR,
  159.         0x00100000,
  160.         VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE |
  161.         VM_STATE_MASK_MEM_COHERENCY | VM_STATE_MASK_GUARDED,
  162.         VM_STATE_VALID      | VM_STATE_WRITABLE      | VM_STATE_CACHEABLE_NOT |
  163.         VM_STATE_MEM_COHERENCY | VM_STATE_GUARDED
  164.     }
  165. #ifdef INCLUDE_L2_SRAM
  166.     ,
  167.     {
  168.         (VIRT_ADDR) L2SRAM_ADDR,
  169.         (PHYS_ADDR) L2SRAM_ADDR,
  170.         L2SRAM_WINDOW_SIZE,
  171.         VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE,
  172.         VM_STATE_VALID      | VM_STATE_WRITABLE      | VM_STATE_CACHEABLE_NOT
  173.     }
  174. #endif
  175. #ifdef INCLUDE_PCI
  176.     ,
  177.     {
  178.         (VIRT_ADDR) PCI_MEM_ADRS,
  179.         (PHYS_ADDR) PCI_MEM_ADRS,
  180.         PCI_MEM_SIZE,
  181.         VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE | 
  182.         VM_STATE_MASK_GUARDED | VM_STATE_MASK_MEM_COHERENCY,
  183.         VM_STATE_VALID      | VM_STATE_WRITABLE      | VM_STATE_CACHEABLE_NOT | 
  184.         VM_STATE_GUARDED      | VM_STATE_MEM_COHERENCY
  185.     }
  186.     ,
  187.     {
  188.         (VIRT_ADDR) PCI_MEMIO_ADRS,
  189.         (PHYS_ADDR) PCI_MEMIO_ADRS,
  190.         PCI_MEMIO_SIZE,
  191.         VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE | 
  192.         VM_STATE_MASK_GUARDED | VM_STATE_MASK_MEM_COHERENCY,
  193.         VM_STATE_VALID      | VM_STATE_WRITABLE      | VM_STATE_CACHEABLE_NOT | 
  194.         VM_STATE_GUARDED      | VM_STATE_MEM_COHERENCY
  195.     }
  196.     ,
  197.     {
  198.         (VIRT_ADDR) PCI_IO_ADRS,
  199.         (PHYS_ADDR) PCI_IO_ADRS,
  200.         PCI_IO_SIZE,
  201.         VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE | 
  202.         VM_STATE_MASK_GUARDED | VM_STATE_MASK_MEM_COHERENCY,
  203.         VM_STATE_VALID      | VM_STATE_WRITABLE      | VM_STATE_CACHEABLE_NOT | 
  204.         VM_STATE_GUARDED      | VM_STATE_MEM_COHERENCY
  205.     }
  206. #ifdef INCLUDE_CDS85XX_PCIEX
  207.     ,
  208.     {
  209.         (VIRT_ADDR) PCI_MEM_ADRS3,
  210.         (PHYS_ADDR) PCI_MEM_ADRS3,
  211.         PCI_MEM_SIZE,
  212.         VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE | 
  213.         VM_STATE_MASK_GUARDED | VM_STATE_MASK_MEM_COHERENCY,
  214.         VM_STATE_VALID      | VM_STATE_WRITABLE      | VM_STATE_CACHEABLE_NOT | 
  215.         VM_STATE_GUARDED      | VM_STATE_MEM_COHERENCY
  216.     }
  217.     ,
  218.     {
  219.         (VIRT_ADDR) PCI_MEMIO_ADRS3,
  220.         (PHYS_ADDR) PCI_MEMIO_ADRS3,
  221.         PCI_MEMIO_SIZE,
  222.         VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE | 
  223.         VM_STATE_MASK_GUARDED | VM_STATE_MASK_MEM_COHERENCY,
  224.         VM_STATE_VALID      | VM_STATE_WRITABLE      | VM_STATE_CACHEABLE_NOT | 
  225.         VM_STATE_GUARDED      | VM_STATE_MEM_COHERENCY
  226.     }
  227.     ,
  228.     {
  229.         (VIRT_ADDR) PCI_IO_ADRS3,
  230.         (PHYS_ADDR) PCI_IO_ADRS3,
  231.         PCI_IO_SIZE,
  232.         VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE | 
  233.         VM_STATE_MASK_GUARDED | VM_STATE_MASK_MEM_COHERENCY,
  234.         VM_STATE_VALID      | VM_STATE_WRITABLE      | VM_STATE_CACHEABLE_NOT | 
  235.         VM_STATE_GUARDED      | VM_STATE_MEM_COHERENCY
  236.     }
  237. #endif /* INCLUDE_CDS85XX_PCIEX */
  238. #endif /* INCLUDE_PCI */
  239.     ,
  240.     { 
  241.         (VIRT_ADDR) ALPHA_LED_BASE_ADRS,
  242.         (PHYS_ADDR) ALPHA_LED_BASE_ADRS,
  243.         ALPHA_LED_SIZE,
  244.         VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE | 
  245.         VM_STATE_MASK_GUARDED | VM_STATE_MASK_MEM_COHERENCY,
  246.         VM_STATE_VALID      | VM_STATE_WRITABLE      | VM_STATE_CACHEABLE_NOT | 
  247.         VM_STATE_GUARDED      | VM_STATE_MEM_COHERENCY
  248.     }
  249.     ,
  250.     {
  251.         (VIRT_ADDR) FLASH0_BASE_ADRS,
  252.         (PHYS_ADDR) FLASH0_BASE_ADRS,
  253.         FLASH0_SIZE,
  254.         VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE | 
  255.         VM_STATE_MASK_GUARDED | VM_STATE_MASK_MEM_COHERENCY,
  256.         VM_STATE_VALID      | VM_STATE_WRITABLE      | VM_STATE_CACHEABLE_NOT | 
  257.         VM_STATE_GUARDED      | VM_STATE_MEM_COHERENCY
  258.     }
  259.     ,
  260.     {
  261.         (VIRT_ADDR) FLASH1_BASE_ADRS,
  262.         (PHYS_ADDR) FLASH1_BASE_ADRS,
  263.         FLASH1_SIZE,
  264.         VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE | 
  265.         VM_STATE_MASK_GUARDED | VM_STATE_MASK_MEM_COHERENCY,
  266.         VM_STATE_VALID      | VM_STATE_WRITABLE      | VM_STATE_CACHEABLE_NOT | 
  267.         VM_STATE_GUARDED      | VM_STATE_MEM_COHERENCY
  268.     }
  269. };
  270. int sysPhysMemDescNumEnt = NELEMENTS (sysPhysMemDesc);
  271. /* Clock Ratio Tables */
  272. #define MAX_VALUE_PLAT_RATIO 32
  273. UINT32 platRatioTable[MAX_VALUE_PLAT_RATIO][2] =
  274. {
  275.     { 0, 0},
  276.     { 0, 0},
  277.     { 2, 0},
  278.     { 3, 0},
  279.     { 4, 0},
  280.     { 5, 0},
  281.     { 6, 0},
  282.     { 7, 0},
  283.     { 8, 0},
  284.     { 9, 0},
  285.     { 10, 0},
  286.     { 0, 0},
  287.     { 12, 0},
  288.     { 0, 0},
  289.     { 0, 0},
  290.     { 0, 0},
  291.     { 16, 0},
  292.     { 0, 0},
  293.     { 0, 0},
  294.     { 0, 0},
  295.     { 20, 0},
  296.     { 0, 0}
  297. };
  298. #define MAX_VALUE_E500_RATIO 10
  299. UINT32 e500RatioTable[MAX_VALUE_PLAT_RATIO][2] =
  300. {
  301.     { 0, 0},
  302.     { 0, 0},
  303.     { 1, 0},
  304.     { 3, 1},
  305.     { 2, 0},
  306.     { 5, 1},
  307.     { 3, 0},
  308.     { 7, 1},
  309.     { 4, 0},
  310.     { 9, 1}
  311. };
  312. int      pci_autoconfig_done = FALSE;
  313. UINT32   sysPciMode;
  314. UINT32   sysPciSlotDeviceNumber;
  315. int   sysBus      = BUS_TYPE_NONE;      /* system bus type (VME_BUS, etc) */
  316. int   sysCpu      = CPU;                /* system CPU type (PPC8260) */
  317. char *sysBootLine = BOOT_LINE_ADRS; /* address of boot line */
  318. char *sysExcMsg   = EXC_MSG_ADRS;   /* catastrophic message area */
  319. int   sysProcNum;           /* processor number of this CPU */
  320. BOOL  sysVmeEnable = FALSE;     /* by default no VME */
  321. UINT32  coreFreq;
  322. IMPORT void     mmuE500TlbDynamicInvalidate();
  323. IMPORT void     mmuE500TlbStaticInvalidate();
  324. IMPORT void mmuE500TlbStaticInit (int numDescs,
  325.                                   TLB_ENTRY_DESC *pTlbDesc,
  326.                                   BOOL cacheAllow);
  327. IMPORT BOOL     mmuPpcIEnabled;
  328. IMPORT BOOL     mmuPpcDEnabled;
  329. IMPORT void     sysIvprSet(UINT32);
  330. /* forward declarations */
  331. void   sysUsDelay (UINT32);
  332. void   sysLedClkRoutine (int arg);
  333. #ifdef INCLUDE_L1_IPARITY_HDLR_INBSP
  334.     #define _EXC_OFF_L1_PARITY 0x1500
  335. IMPORT void jumpIParity();
  336. IMPORT void sysIvor1Set(UINT32);
  337. UINT32 instrParityCount = 0;
  338. #endif  /* INCLUDE_L1_IPARITY_HDLR_INBSP */
  339. #ifdef INCLUDE_PCI
  340. STATUS sysPciSpecialCycle (int busNo, UINT32 message);
  341. STATUS sysPciConfigRead   (int busNo, int deviceNo, int funcNo,
  342.                            int offset, int width, void * pData);
  343. STATUS sysPciConfigWrite  (int busNo, int deviceNo, int funcNo,
  344.                            int offset, int width, ULONG data);
  345. void   sysPciConfigEnable (int);
  346. #endif /* INCLUDE_PCI */
  347. /* 8260 Reset Configuration Table (From page 9-2 in Rev0 of 8260 book) */
  348. #define END_OF_TABLE 0
  349. UINT32 sysClkFreqGet(void);
  350. UINT32 ppcE500ICACHE_LINE_NUM = (128 * 12);
  351. UINT32 ppcE500DCACHE_LINE_NUM = (128 * 12);
  352. UINT32 ppcE500CACHE_ALIGN_SIZE = 32;
  353. #ifdef INCLUDE_PCI
  354. LOCAL ULONG sysPciConfAddr = PCI_CFG_ADR_REG;   /* PCI Configuration Address */
  355. LOCAL ULONG sysPciConfData = PCI_CFG_DATA_REG;  /* PCI Configuration Data */
  356. #ifdef INCLUDE_GEI8254X_END
  357. LOCAL int   sysPci1SysNum  = CDS85XX_PCI_1_BUS;
  358. #ifdef  INCLUDE_CDS85XX_PCIEX
  359. LOCAL int   sysPci3SysNum  = CDS85XX_PCIEX_BUS;
  360. #endif /* INCLUDE_CDS85XX_PCIEX */
  361. #endif /* INCLUDE_GEI8254X_END */
  362. #include <pci/pciIntLib.c>           /* PCI int support */
  363. #include <pci/pciConfigLib.c>        /* pci configuration library */
  364. #if (defined(INCLUDE_PCI_CFGSHOW) && !defined(PRJ_BUILD))
  365. #include <pci/pciConfigShow.c>
  366. #endif /* (defined(INCLUDE_PCI_CFGSHOW) && !defined(PRJ_BUILD)) */
  367. /* use pci auto config */
  368. #include <pci/pciAutoConfigLib.c>    /* automatic PCI configuration */
  369. #include <sysBusPci.c>               /* pciAutoConfig BSP support file */
  370. #include <mot85xxPci.c>
  371. #ifdef INCLUDE_GEI8254X_END
  372. #include <sysGei8254xEnd.c>
  373. #endif  /* INCLUDE_GEI_END */
  374. #endif /* INCLUDE_PCI */
  375. #include <m85xxTimer.c>
  376. #include <sysMotI2c.c>
  377. #include <sysMpc85xxI2c.c>
  378. #ifdef INCLUDE_NV_RAM
  379.     #include "i2c24LC128Eeprom.c"
  380.     #include <mem/byteNvRam.c>      /* Generic NVRAM routines */
  381. #else
  382.     #include <mem/nullNvRam.c>
  383. #endif /* INCLUDE_NV_RAM */
  384. #ifdef INCLUDE_L1_IPARITY_HDLR
  385.     #include <sysL1ICacheParity.c>
  386. #endif
  387. UINT32 inFullVxWorksImage=FALSE;
  388. #define EXT_VEC_IRQ0            56
  389. #define EXT_NUM_IRQ0            EXT_VEC_IRQ0
  390. #define EXT_MAX_IRQS            200
  391. STATUS  sysIntEnablePIC     (int intNum);   /* Enable i8259 or EPIC */
  392. STATUS  sysCascadeIntEnable      (int intNum);
  393. STATUS  sysCascadeIntDisable     (int intNum);
  394. void    flashTest(VUINT16 *address,VUINT16 *buffer,VINT32 length);
  395. UINT32   baudRateGenClk;
  396. #include <sysEpic.c>
  397. #ifdef INCLUDE_DUART
  398.     #include <sysDuart.c>
  399. #endif
  400. #include <sysL2Cache.c>
  401. #include <cmdLine.c>
  402. #ifdef INCLUDE_VXBUS
  403. IMPORT void hardWareInterFaceInit();
  404. #endif /* INCLUDE_VXBUS */
  405. #define WB_MAX_IRQS 256
  406. #ifdef INCLUDE_SYSLED
  407. #  include <sysLed.c>
  408. #endif /* INCLUDE_SYSLED */
  409. /* defines */
  410. #define ZERO    0
  411. /* needed to enable timer base */
  412. #ifdef INCLUDE_PCI
  413.     #define      M8260_DPPC_MASK 0x0C000000 /* bits 4 and 5 */
  414.     #define      M8260_DPPC_VALUE 0x0C000000 /* bits (4,5) should be (1,0) */
  415. #else
  416.     #define      M8260_DPPC_MASK 0x0C000000 /* bits 4 and 5 */
  417.     #define      M8260_DPPC_VALUE 0x08000000 /* bits (4,5) should be (1,0) */
  418. #endif /*INCLUDE_PCI */
  419. #define DELTA(a,b)                 (abs((int)a - (int)b))
  420. #define HID0_MCP 0x80000000
  421. #define HID1_ABE 0x00001000
  422. #define HID1_ASTME 0x00002000
  423. #define HID1_RXFE  0x00020000
  424. #ifdef INCLUDE_VXBUS
  425. #include <hwif/vxbus/vxBus.h>
  426. #include <../src/hwif/h/busCtlr/m85xxRio.h>
  427. #endif
  428. #ifdef INCLUDE_MOT_TSEC_END
  429. #include <sysNet.c>
  430. #ifndef INCLUDE_VXBUS
  431. #include <sysMotTsecEnd.c>
  432. #endif /* INCLUDE_VXBUS */
  433. #endif /* INCLUDE_MOT_TSEC_END */
  434. #ifdef INCLUDE_VXBUS
  435. #include <hwconf.c>
  436. #endif
  437. #ifdef INCLUDE_BRANCH_PREDICTION
  438. IMPORT void disableBranchPrediction();
  439. #endif
  440. #ifdef INCLUDE_L2_SRAM
  441. LOCAL void sysL2SramEnable(BOOL both);
  442. #endif /* INCLUDE_L2_SRAM */
  443. #ifdef INCLUDE_SPE
  444.     #include <speLib.h>
  445. IMPORT int       (* _func_speProbeRtn) () ;
  446. #endif /* INCLUDE_SPE */
  447. #ifdef INCLUDE_CACHE_SUPPORT
  448. LOCAL void sysL1CacheQuery();
  449. #endif
  450. UINT32 sysTimerClkFreq = OSCILLATOR_FREQ;
  451. IMPORT  void    sysL1Csr1Set(UINT32);
  452. IMPORT  UINT    sysTimeBaseLGet(void);
  453. LOCAL char * physTop = NULL;
  454. LOCAL char * memTop = NULL;
  455. #if     defined (INCLUDE_SPE)
  456. /*******************************************************************************
  457. *
  458. * sysSpeProbe - Check if the CPU has SPE unit.
  459. *
  460. * This routine returns OK it the CPU has an SPE unit in it.
  461. * Presently it assumes available.
  462. *
  463. * RETURNS: OK
  464. *
  465. * ERRNO: N/A
  466. */
  467. int  sysSpeProbe (void)
  468.     {
  469.     ULONG regVal;
  470.     int speUnitPresent = OK;
  471.     /* The CPU type is indicated in the Processor Version Register (PVR) */
  472.     regVal = 0;
  473.     switch (regVal)
  474.         {
  475.         case 0:
  476.         default:
  477.             speUnitPresent = OK;
  478.             break;
  479.         }      /* switch  */
  480.     return(speUnitPresent);
  481.     }
  482. #endif  /* INCLUDE_SPE */
  483. /****************************************************************************
  484. *
  485. * sysModel - return the model name of the CPU board
  486. *
  487. * This routine returns the model name of the CPU board.
  488. *
  489. * RETURNS: A pointer to the string.
  490. *
  491. * ERRNO: N/A
  492. */
  493. char * sysModel (void)
  494.     {
  495.     UINT device;
  496.     char* retChar = NULL;
  497.     device = *M85XX_SVR(CCSBAR);
  498.     switch(device & 0xffffff00)
  499. {
  500. case 0x80390000:
  501.     retChar = SYS_MODEL_8548E;
  502.     break;
  503. case 0x80310000:
  504.     retChar = SYS_MODEL_8548;
  505.     break;
  506. case 0x80390100:
  507.     retChar = SYS_MODEL_8547E;
  508.     break;
  509. case 0x80390200:
  510.     retChar = SYS_MODEL_8545E;
  511.     break;
  512. case 0x80310200:
  513.     retChar = SYS_MODEL_8545;
  514.     break;
  515. case 0x803A0000:
  516.     retChar = SYS_MODEL_8543E;
  517.     break;
  518. case 0x80320000:
  519.     retChar = SYS_MODEL_8543;
  520.     break;
  521. default:
  522.     retChar = SYS_MODEL_E500;
  523.     break;
  524. }
  525.     device = *M85XX_PVR(CCSBAR);
  526.     if ((device & 0xfff00000) != 0x80200000)
  527.         retChar =SYS_MODEL_UNKNOWN;
  528.     return(retChar);
  529.     }
  530. /******************************************************************************
  531. *
  532. * sysBspRev - return the BSP version with the revision eg 1.0/<x>
  533. *
  534. * This function returns a pointer to a BSP version with the revision.
  535. * for eg. 1.0/<x>. BSP_REV defined in config.h is concatenated to
  536. * BSP_VERSION and returned.
  537. *
  538. * RETURNS: A pointer to the BSP version/revision string.
  539. *
  540. * ERRNO: N/A
  541. */
  542. char * sysBspRev (void)
  543.     {
  544.     return(BSP_VERSION BSP_REV);
  545.     }
  546. /******************************************************************************
  547. *
  548. * sysClkFreqGet - return Core Complex Bus clock freq
  549. *
  550. * This function returns the CCB clock freq.
  551. *
  552. * RETURNS: CCB clock freq
  553. *
  554. * ERRNO: N/A
  555. */
  556. UINT32 sysClkFreqGet
  557. (
  558. void
  559. )
  560.     {
  561.     UINT32  sysClkFreq;
  562.     UINT32 e500Ratio,platRatio;
  563.     platRatio = M85XX_PORPLLSR_PLAT_RATIO(CCSBAR);
  564. #ifdef FORCE_DEFAULT_FREQ
  565.     return(DEFAULT_SYSCLKFREQ);
  566. #endif
  567.     if ((platRatio>MAX_VALUE_PLAT_RATIO)||(platRatioTable[platRatio][0]==0))
  568.         return(DEFAULT_SYSCLKFREQ); /* A default value better than zero or -1 */
  569.     sysClkFreq = ((UINT32)(OSCILLATOR_FREQ * platRatioTable[platRatio][0]))>>((UINT32)platRatioTable[platRatio][1]);
  570.     e500Ratio = M85XX_PORPLLSR_E500_RATIO(CCSBAR);
  571.     coreFreq = ((UINT32)(sysClkFreq * e500RatioTable[e500Ratio][0]))>>((UINT32)e500RatioTable[e500Ratio][1]);
  572.     return(sysClkFreq);
  573.     }
  574. /******************************************************************************
  575. *
  576. * sysCpmFreqGet - Determines the CPM Operating Frequency
  577. *
  578. * This routine determines the CPM Operating Frequency.
  579. *
  580. * From page 9-2 Rev. 0  MPC8260  PowerQUICC II User's Manual
  581. *
  582. * RETURNS: CPM clock frequency for the current MOD_CK and MOD_CK_H settings
  583. *
  584. * ERRNO: N/A
  585. */
  586. UINT32 sysCpmFreqGet (void)
  587.     {
  588.     UINT32 sysClkFreq = sysClkFreqGet();
  589.     return(sysClkFreq);
  590.     }
  591. /******************************************************************************
  592. *
  593. * sysBaudClkFreq - Obtains frequency of the BRG_CLK in Hz
  594. *
  595. * From page 9-5 in Rev. 0 MPC8260 PowerQUICC II User's Manual
  596. *
  597. *     baud clock = 2*cpm_freq/2^2*(DFBRG+1) where DFBRG = 01
  598. *                = 2*cpm_freq/16
  599. *
  600. * RETURNS: frequency of the BRG_CLK in Hz
  601. *
  602. * ERRNO: N/A
  603. */
  604. UINT32 sysBaudClkFreq (void)
  605.     {
  606.     UINT32 cpmFreq = sysCpmFreqGet();
  607.     return cpmFreq*2/16;
  608.     }
  609. /******************************************************************************
  610. *
  611. * sysHwMemInit - initialize and configure system memory.
  612. *
  613. * This routine is called before sysHwInit(). It performs memory auto-sizing
  614. * and updates the system's physical regions table, `sysPhysRgnTbl'. It may
  615. * include the code to do runtime configuration of extra memory controllers.
  616. *
  617. * NOTE: This routine should not be called directly by the user application.  It
  618. * cannot be used to initialize interrupt vectors.
  619. *
  620. * RETURNS: N/A
  621. *
  622. * ERRNO: N/A
  623. */
  624. void sysHwMemInit (void)
  625.     {
  626.     /* Call sysPhysMemTop() to do memory autosizing if available */
  627.     sysPhysMemTop ();
  628.     }
  629. /******************************************************************************
  630. *
  631. * sysHwInit - initialize the system hardware
  632. *
  633. * This routine initializes various feature of the MPC8260 ADS board. It sets up
  634. * the control registers, initializes various devices if they are present.
  635. *
  636. * NOTE: This routine should not be called directly by the user.
  637. *
  638. * RETURNS: NA
  639. *
  640. * ERRNO: N/A
  641. */
  642. void sysHwInit (void)
  643.     {
  644. #ifdef INCLUDE_RAPIDIO_BUS
  645.     /* Errata not yet described - required for rapidIO TAS */
  646.     *(UINT32*)(CCSBAR + 0x1010) = 0x01040004;
  647. #endif
  648.     sysIvprSet(0x0);
  649.     /* Disable L1 Icache */
  650.     sysL1Csr1Set(vxL1CSR1Get() & ~0x1);
  651.     /* Check for architecture support for 36 bit physical addressing */
  652. #if defined(PPC_e500v2)
  653.     vxHid0Set(_PPC_HID0_MAS7EN|vxHid0Get());
  654. #endif
  655.     /* Enable machine check pin */
  656.     vxHid0Set(HID0_MCP|vxHid0Get());
  657. #ifdef E500_L1_PARITY_RECOVERY
  658.     /* Enable Parity in L1 caches */
  659.     vxL1CSR0Set(vxL1CSR0Get() | _PPC_L1CSR_CPE);
  660.     vxL1CSR1Set(vxL1CSR1Get() | _PPC_L1CSR_CPE);
  661. #endif  /* E500_L1_PARITY_RECOVERY */
  662.     /* enable time base for delay use before DEC interrupt is setup */
  663.     vxHid0Set(vxHid0Get() | _PPC_HID0_TBEN);
  664.     sysTimerClkFreq = sysClkFreqGet()>>3 /* Clock div is 8 */;
  665. #ifdef INCLUDE_AUX_CLK
  666.     sysAuxClkRateSet(127);
  667. #endif
  668. #ifdef INCLUDE_CACHE_SUPPORT
  669.     sysL1CacheQuery();
  670. #endif /* INCLUDE_CACHE_SUPPORT */
  671.     /* Initialise L2CTL register */
  672.     vxL2CTLSet(0x28000000,M85XX_L2CTL(CCSBAR));
  673.     /*
  674.      * Need to setup static TLB entries for bootrom or any non-MMU
  675.      * enabled images
  676.      */
  677.     mmuE500TlbDynamicInvalidate();
  678.     mmuE500TlbStaticInvalidate();
  679.     mmuE500TlbStaticInit(sysStaticTlbDescNumEnt, &sysStaticTlbDesc[0], TRUE);
  680. #if (!defined(INCLUDE_MMU_BASIC) && !defined(INCLUDE_MMU_FULL))
  681.     mmuPpcIEnabled=TRUE;
  682.     mmuPpcDEnabled=TRUE;
  683. #else /* !defined(INCLUDE_MMU_BASIC) && !defined(INCLUDE_MMU_FULL) */
  684.     if (inFullVxWorksImage==FALSE)
  685.         {
  686.         mmuPpcIEnabled=TRUE;
  687.         mmuPpcDEnabled=TRUE;
  688.         }
  689.     /* Enable I Cache if instruction mmu disabled */
  690. #if (defined(USER_I_CACHE_ENABLE) && !defined(USER_I_MMU_ENABLE))
  691.     mmuPpcIEnabled=TRUE;
  692. #endif /* (defined(USER_I_CACHE_ENABLE) && !defined(USER_I_MMU_ENABLE)) */
  693. #endif /* !defined(INCLUDE_MMU_BASIC) && !defined(INCLUDE_MMU_FULL) */
  694. #if (defined(INCLUDE_L2_CACHE) && defined(INCLUDE_CACHE_SUPPORT))
  695.     vxHid1Set(HID1_ABE); /* Address Broadcast enable */
  696.     sysL2CacheInit();
  697. #endif /* INCLUDE_L2_CACHE  && INCLUDE_CACHE_SUPPORT*/
  698.     /* Machine check via RXFE for RIO */
  699.     vxHid1Set(vxHid1Get()| HID1_ASTME | HID1_RXFE); /* Address Stream Enable */
  700.     /* enable the flash window */
  701.     *M85XX_LAWBAR3(CCSBAR) = FLASH1_BASE_ADRS >> LAWBAR_ADRS_SHIFT;
  702.     *M85XX_LAWAR3(CCSBAR)  = LAWAR_ENABLE | LAWAR_TGTIF_LBC | LAWAR_SIZE_64MB;
  703.     WRS_ASM("isync");
  704.     /* Initialize the Embedded Programmable Interrupt Controller */
  705.     sysEpicInit();
  706. #ifdef INCLUDE_VXBUS
  707.     hardWareInterFaceInit();
  708. #endif /* INCLUDE_VXBUS */
  709. #ifdef INCLUDE_DUART
  710.     sysDuartHwInit ();
  711. #endif
  712. #ifdef INCLUDE_PCI
  713.     /*
  714.      * PCI slot device number is decoded differently between PCI mode and
  715.      * PCI-X mode. So we read the PORDEVSR register to determine which mode
  716.      * the system is in and assign the proper device number access the slot.
  717.      */
  718.     sysPciMode = M85XX_PORDEVSR_PCI_MODE(CCSBAR);
  719.     if (sysPciMode == PORDEVSR_PCIX_MODE)
  720.        {
  721.           sysPciSlotDeviceNumber = 0x1; /* PCI-X */
  722.        }
  723.    else
  724.        {
  725.        sysPciSlotDeviceNumber = 0x11; /* PCI */
  726.        }
  727. /* config pci */
  728.     if (pciConfigLibInit (PCI_MECHANISM_0,(ULONG) sysPciConfigRead,
  729.                           (ULONG) sysPciConfigWrite,(ULONG) sysPciSpecialCycle) != OK)
  730.         {
  731.         sysToMonitor (BOOT_NO_AUTOBOOT);  /* BAIL */
  732.         }
  733.     /*  Initialize PCI interrupt library. */
  734.     if ((pciIntLibInit ()) != OK)
  735.         {
  736.         sysToMonitor (BOOT_NO_AUTOBOOT);
  737.         }
  738. #if 0
  739.     if ( *((char*)PCI_AUTO_CONFIG_ADRS) == FALSE )
  740. #endif
  741.         {
  742.         mot85xxBridgeInit();
  743. #ifdef INCLUDE_PCI_AUTOCONF
  744.         sysPciAutoConfig();
  745.         pci_autoconfig_done = TRUE;
  746. #endif
  747.         *((char*)PCI_AUTO_CONFIG_ADRS) = TRUE;
  748.         }
  749. #endif /* INCLUDE_PCI */
  750. #ifdef E500_L1_PARITY_RECOVERY
  751.     vxIvor1Set(_EXC_OFF_L1_PARITY);
  752. #endif  /* E500_L1_PARITY_RECOVERY */
  753. #ifdef INCLUDE_L1_IPARITY_HDLR
  754.     installL1ICacheParityErrorRecovery();
  755. #endif /* INCLUDE_L1_IPARITY_HDLR */
  756.     /*
  757.      * The power management mode is initialized here. Reduced power mode
  758.      * is activated only when the kernel is idle (cf vxPowerDown).
  759.      * Power management mode is selected via vxPowerModeSet().
  760.      * DEFAULT_POWER_MGT_MODE is defined in config.h.
  761.      */
  762. #if defined(INCLUDE_L2_SRAM)
  763. #if (defined(INCLUDE_L2_CACHE) && defined(INCLUDE_CACHE_SUPPORT))
  764.     sysL2SramEnable(TRUE);
  765. #elif (defined(INCLUDE_L2_SRAM))
  766.     sysL2SramEnable(FALSE);
  767. #endif
  768. #endif
  769.     CACHE_PIPE_FLUSH();
  770.     vxPowerModeSet (DEFAULT_POWER_MGT_MODE);
  771.     }
  772. #ifdef INCLUDE_L2_SRAM
  773. /*************************************************************************
  774. *
  775. * sysL2SramEnable - enables L2SRAM if L2SRAM only
  776. *
  777. * This routine enables L2SRAM if L2SRAM only or initializes blk
  778. * size etc and leaves the rest to L2 cache code.
  779. *
  780. * RETURNS: N/A
  781. *
  782. * ERRNO: N/A
  783. */
  784. LOCAL void sysL2SramEnable
  785. (
  786. BOOL both
  787. )
  788.     {
  789.     volatile int l2CtlVal;
  790.     /*
  791.      * if INCLUDE_L2_CACHE and CACHE_SUPPORT
  792.      * if ((L2_SRAM_SIZE + L2_CACHE_SIZE) > l2Siz)
  793.      */
  794.     /* Setup Windows for L2SRAM */
  795.     *(M85XX_L2SRBAR0(CCSBAR)) = (UINT32)(L2SRAM_ADDR & M85XX_L2SRBAR_ADDR_MSK);
  796.     /* Get present value */
  797.     l2CtlVal = vxL2CTLGet(M85XX_L2CTL(CCSBAR));
  798.     /* Disable L2CTL initially to allow changing of block size */
  799.     l2CtlVal &=(~M85XX_L2CTL_L2E_MSK);
  800.     vxL2CTLSet(l2CtlVal,M85XX_L2CTL(CCSBAR));
  801.     l2CtlVal &= ~M85XX_L2CTL_L2BLKSIZ_MSK;
  802.     l2CtlVal &= ~M85XX_L2CTL_L2SRAM_MSK;
  803.     if (both == TRUE)
  804.         {
  805.         /* Setup size of SRAM */
  806.         l2CtlVal |= (L2SIZ_256KB << M85XX_L2CTL_L2BLKSIZ_BIT) |
  807.                     (0x2 << M85XX_L2CTL_L2SRAM_BIT);
  808.         }
  809.     else
  810.         {
  811.         l2CtlVal |= (L2SIZ_512KB << M85XX_L2CTL_L2BLKSIZ_BIT) |
  812.                     (0x1 << M85XX_L2CTL_L2SRAM_BIT);
  813.         }
  814.     /* Setup L2CTL for SRAM */
  815.     vxL2CTLSet(l2CtlVal,M85XX_L2CTL(CCSBAR));
  816.     if (both == FALSE)
  817.         {
  818.         /* This is done here so L2SRAM is set before enable */
  819.         l2CtlVal |= M85XX_L2CTL_L2E_MSK; /* No cache so go ahead and enable */
  820.         /* Enable L2CTL for SRAM */
  821.         vxL2CTLSet(l2CtlVal,M85XX_L2CTL(CCSBAR));
  822.         }
  823.     }
  824. #endif /* INCLUDE_L2_SRAM */
  825. /**************************************************************************
  826. *
  827. * sysPhysMemTop - get the address of the top of physical memory
  828. *
  829. * This routine returns the address of the first missing byte of memory,
  830. * which indicates the top of memory.
  831. *
  832. * RETURNS: The address of the top of physical memory.
  833. *
  834. * ERRNO: N/A
  835. *
  836. * SEE ALSO: sysMemTop()
  837. */
  838. char * sysPhysMemTop (void)
  839.     {
  840.     if (physTop == NULL)
  841.         {
  842.         physTop = (char *)(LOCAL_MEM_LOCAL_ADRS + LOCAL_MEM_SIZE);
  843.         }
  844.     return(physTop) ;
  845.     }
  846. /***************************************************************************
  847. *
  848. * sysMemTop - get the address of the top of VxWorks memory
  849. *
  850. * This routine returns a pointer to the first byte of memory not
  851. * controlled or used by VxWorks.
  852. *
  853. * The user can reserve memory space by defining the macro USER_RESERVED_MEM
  854. * in config.h.  This routine returns the address of the reserved memory
  855. * area.  The value of USER_RESERVED_MEM is in bytes.
  856. *
  857. * RETURNS: The address of the top of VxWorks memory.
  858. *
  859. * ERRNO: N/A
  860. */
  861. char * sysMemTop (void)
  862.     {
  863.     if (memTop == NULL)
  864.         {
  865.         memTop = sysPhysMemTop () - USER_RESERVED_MEM;
  866. #ifdef INCLUDE_EDR_PM
  867.         /* account for ED&R persistent memory */
  868.         memTop = memTop - PM_RESERVED_MEM;
  869. #endif
  870.         }
  871.     return memTop;
  872.     }
  873. /**************************************************************************
  874. *
  875. * sysToMonitor - transfer control to the ROM monitor
  876. *
  877. * This routine transfers control to the ROM monitor.  Normally, it is called
  878. * only by reboot()--which services ^X--and bus errors at interrupt level.
  879. * However, in some circumstances, the user may wish to introduce a
  880. * <startType> to enable special boot ROM facilities.
  881. *
  882. * RETURNS: Does not return.
  883. *
  884. * ERRNO: N/A
  885. */
  886. int sysToMonitorExcMessage = 0;
  887. int sysToMonitorBacktrace = 1;
  888. int sysToMonitorReboot = 1;
  889. void (*sysToMonitorHook)(void);
  890. STATUS sysToMonitor
  891.     (
  892.     int startType   /* parameter passed to ROM to tell it how to boot */
  893.     )
  894.     {
  895. #if 0
  896.     FUNCPTR pRom = (FUNCPTR) (ROM_TEXT_ADRS + 4);   /* Warm reboot */
  897. #endif
  898.     if (sysToMonitorHook)
  899.         (*sysToMonitorHook)();
  900.     sysReboot();
  901. #if 0
  902.     intLock();
  903. #ifdef INCLUDE_BRANCH_PREDICTION
  904.     disableBranchPrediction();
  905. #endif /* INCLUDE_BRANCH_PREDICTION */
  906. #ifdef INCLUDE_CACHE_SUPPORT
  907.     cacheDisable(INSTRUCTION_CACHE);
  908.     cacheDisable(DATA_CACHE);
  909. #endif
  910.     sysClkDisable();
  911. #ifdef INCLUDE_AUX_CLK
  912.     sysAuxClkDisable();
  913. #endif
  914.     vxMsrSet(0);
  915.     /* Clear unnecessary TLBs */
  916.     mmuE500TlbDynamicInvalidate();
  917.     mmuE500TlbStaticInvalidate();
  918.     (*pRom) (startType);    /* jump to bootrom entry point */
  919. #endif
  920.     return(OK);    /* in case we ever continue from ROM monitor */
  921.     }
  922. /******************************************************************************
  923. *
  924. * sysHwInit2 - additional system configuration and initialization
  925. *
  926. * This routine connects system interrupts and does any additional
  927. * configuration necessary.
  928. *
  929. * RETURNS: N/A
  930. *
  931. * ERRNO: N/A
  932. */
  933. void sysHwInit2 (void)
  934.     {
  935. #ifdef  INCLUDE_VXBUS
  936.     vxbDevInit();
  937. #endif /* INCLUDE_VXBUS */
  938.     excIntConnect ((VOIDFUNCPTR *) _EXC_OFF_DECR,
  939.                    (VOIDFUNCPTR) sysClkInt);
  940.     sysClkRateSet(60);
  941.     sysClkEnable();
  942. #ifdef INCLUDE_AUX_CLK
  943.     excIntConnect ((VOIDFUNCPTR *) _EXC_OFF_FIT, (VOIDFUNCPTR) sysAuxClkInt);
  944. #endif
  945. #  if defined(INCLUDE_AUX_CLK)
  946.      /* initialize and start auxiliary clock support */
  947.      sysAuxClkEnable ();
  948. #  endif /* INCLUDE_AUX_CLK */
  949.     /*
  950.      * This was previously reqd for errata workaround #29, the workaround
  951.      * has been replaced with patch for spr99776, so it now serves as an
  952.      * example of implementing an l1 instruction parity handler
  953.      */
  954. #ifdef INCLUDE_L1_IPARITY_HDLR_INBSP
  955.     memcpy((void*)_EXC_OFF_L1_PARITY, (void *)jumpIParity, sizeof(INSTR));
  956.     cacheTextUpdate((void *)_EXC_OFF_L1_PARITY, sizeof(INSTR));
  957.     sysIvor1Set(_EXC_OFF_L1_PARITY);
  958.     cacheDisable(INSTRUCTION_CACHE);
  959.     vxL1CSR1Set(vxL1CSR1Get() | _PPC_L1CSR_CPE);
  960.     cacheEnable(INSTRUCTION_CACHE);
  961. #endif  /* INCLUDE_L1_IPARITY_HDLR_INBSP */
  962.     /* initialize the EPIC interrupts */
  963.     sysEpicIntrInit ();
  964.     /* initialize serial interrupts */
  965. #if defined(INCLUDE_DUART)
  966.     sysSerialHwInit2 ();
  967. #endif /* INCLUDE_DUART */
  968. #if     defined (INCLUDE_SPE)
  969.     _func_speProbeRtn = sysSpeProbe;
  970. #endif  /* INCLUDE_SPE */
  971. #ifdef INCLUDE_PCI
  972. #ifdef INCLUDE_GEI8254X_END
  973.     sysPciConfigEnable (CDS85XX_PCI_1_BUS);
  974.     pciConfigForeachFunc (0, FALSE, (PCI_FOREACH_FUNC) sys8254xDeviceCheck, (void *)&sysPci1SysNum);
  975. #ifdef INCLUDE_CDS85XX_PCIEX
  976. #ifdef INCLUDE_GEI8254X_END
  977.     sysPciConfigEnable (CDS85XX_PCIEX_BUS);
  978.     pciConfigForeachFunc (PCIEX_BUS_MIN + 1, FALSE, (PCI_FOREACH_FUNC) sys8254xDeviceCheck, (void *)&sysPci3SysNum);
  979. #endif /* INCLUDE_GEI8254X_END */
  980. #endif /* INCLUDE_CDS85XX_PCIEX */
  981. #endif /* INCLUDE_GEI8254X_END */
  982. #endif /* INCLUDE_PCI */
  983.     /* Configure GPIO */
  984.     * (VINT32 *) M85XX_GPOUTDR(CCSBAR) = 0x3;
  985.     * (VINT32 *) M85XX_GPIOCR(CCSBAR) = (1 << 17) | ( 1 << 16) | (1 << 9);
  986. #ifdef INCLUDE_SYSLED
  987.     sysLedOn();
  988. #endif 
  989. #ifdef INCLUDE_I2C_DEV
  990.     i2cDrvInit(0, MPC85XX_I2C_CONTROLLER);
  991.     i2cDrvInit(1, MPC85XX_I2C_CONTROLLER);
  992.     usrTimeSync();
  993. #endif /* INCLUDE_I2C_DEV */
  994. #ifdef  INCLUDE_VXBUS
  995.     taskSpawn("devConnect",0,0,10000,vxbDevConnect,0,0,0,0,0,0,0,0,0,0);
  996. #endif /* INCLUDE_VXBUS */
  997.     }
  998. /******************************************************************************
  999. *
  1000. * sysProcNumGet - get the processor number
  1001. *
  1002. * This routine returns the processor number for the CPU board, which is
  1003. * set with sysProcNumSet().
  1004. *
  1005. * RETURNS: The processor number for the CPU board.
  1006. *
  1007. * ERRNO: N/A
  1008. *
  1009. * SEE ALSO: sysProcNumSet()
  1010. */
  1011. int sysProcNumGet (void)
  1012.     {
  1013.     return(sysProcNum);
  1014.     }
  1015. /******************************************************************************
  1016. *
  1017. * sysProcNumSet - set the processor number
  1018. *
  1019. * This routine sets the processor number for the CPU board.  Processor numbers
  1020. * should be unique on a single backplane.
  1021. *
  1022. * Not applicable for the bus-less 8260Ads.
  1023. *
  1024. * RETURNS: N/A
  1025. *
  1026. * ERRNO: N/A
  1027. *
  1028. * SEE ALSO: sysProcNumGet()
  1029. */
  1030. void sysProcNumSet
  1031.     (
  1032.     int     procNum         /* processor number */
  1033.     )
  1034.     {
  1035.     sysProcNum = procNum;
  1036.     }
  1037. /******************************************************************************
  1038. *
  1039. * sysLocalToBusAdrs - convert a local address to a bus address
  1040. *
  1041. * This routine gets the VMEbus address that accesses a specified local
  1042. * memory address.
  1043. *
  1044. * Not applicable for the 8260Ads
  1045. *
  1046. * RETURNS: ERROR, always.
  1047. *
  1048. * ERRNO: N/A
  1049. *
  1050. * SEE ALSO: sysBusToLocalAdrs()
  1051. */
  1052. STATUS sysLocalToBusAdrs
  1053.     (
  1054.     int     adrsSpace,  /* bus address space where busAdrs resides */
  1055.     char *  localAdrs,  /* local address to convert */
  1056.     char ** pBusAdrs    /* where to return bus address */
  1057.     )
  1058.     {
  1059.     *pBusAdrs = localAdrs;
  1060.     return(OK);
  1061.     }
  1062. /******************************************************************************
  1063. *
  1064. * sysBusToLocalAdrs - convert a bus address to a local address
  1065. *
  1066. * This routine gets the local address that accesses a specified VMEbus
  1067. * physical memory address.
  1068. *
  1069. * Not applicable for the 8260Ads
  1070. *
  1071. * RETURNS: ERROR, always.
  1072. *
  1073. * ERRNO: N/A
  1074. *
  1075. * SEE ALSO: sysLocalToBusAdrs()
  1076. */
  1077. STATUS sysBusToLocalAdrs
  1078.     (
  1079.     int     adrsSpace,  /* bus address space where busAdrs resides */
  1080.     char *  busAdrs,    /* bus address to convert */
  1081.     char ** pLocalAdrs  /* where to return local address */
  1082.     )
  1083.     {
  1084.     *pLocalAdrs = busAdrs;
  1085.     return(OK);
  1086.     }
  1087. #ifdef INCLUDE_PCI  /* board level PCI routines */
  1088. /*******************************************************************************
  1089. * sysPciConfigEnable -  enable PCI 1 or PCI 2 bus configuration
  1090. *
  1091. * This function enables PCI 1 or PCI 2 bus configuration
  1092. *
  1093. * RETURNS: N/A
  1094. *
  1095. * ERRNO: N/A
  1096. */
  1097. void sysPciConfigEnable
  1098.     (
  1099.     int pciHost
  1100.     )
  1101.     {
  1102.     int level;
  1103.     level = intLock ();
  1104.     if (pciHost == CDS85XX_PCI_2_BUS)
  1105.         {
  1106.         sysPciConfAddr = PCI2_CFG_ADR_REG;   /* PCI Configuration Address */
  1107.         sysPciConfData = PCI2_CFG_DATA_REG;  /* PCI Configuration Data */
  1108.         }
  1109.     else if (pciHost == CDS85XX_PCIEX_BUS)
  1110.         {
  1111.         sysPciConfAddr = PCIEX_CFG_ADR_REG;   /* PCI Configuration Address */
  1112.         sysPciConfData = PCIEX_CFG_DATA_REG;  /* PCI Configuration Data */
  1113.         }
  1114.     else /* default is for PCI 1 host */
  1115.         {
  1116.         sysPciConfAddr = PCI_CFG_ADR_REG;   /* PCI Configuration Address */
  1117.         sysPciConfData = PCI_CFG_DATA_REG;  /* PCI Configuration Data */
  1118.         }
  1119.     WRS_ASM("sync;eieio");
  1120.     intUnlock (level);
  1121.     }
  1122. /*******************************************************************************
  1123. *
  1124. * sysPciSpecialCycle - generate a special cycle with a message
  1125. *
  1126. * This routine generates a special cycle with a message.
  1127. *
  1128. * NOMANUAL
  1129. *
  1130. * RETURNS: OK
  1131. *
  1132. * ERRNO: N/A
  1133. */
  1134. STATUS sysPciSpecialCycle
  1135.     (
  1136.     int     busNo,
  1137.     UINT32  message
  1138.     )
  1139.     {
  1140.     int deviceNo    = 0x0000001f;
  1141.     int funcNo      = 0x00000007;
  1142.     if (pci_autoconfig_done) {
  1143.         if (busNo >= PCIEX_BUS_MIN) {
  1144.             busNo = busNo - PCIEX_BUS_MIN;
  1145.             sysPciConfigEnable(CDS85XX_PCIEX_BUS);
  1146.         } else {
  1147.             sysPciConfigEnable(CDS85XX_PCI_1_BUS);
  1148.         }
  1149.     }
  1150.  
  1151.     pciRegWrite ((UINT32 *)sysPciConfAddr,
  1152.                  (UINT32)pciConfigBdfPack (busNo, deviceNo, funcNo) |
  1153.                  0x80000000);
  1154.     PCI_OUT_LONG (sysPciConfData, message);
  1155.     return(OK);
  1156.     }
  1157. /*******************************************************************************
  1158. *
  1159. * sysPciConfigRead - read from the PCI configuration space
  1160. *
  1161. * This routine reads either a byte, word or a long word specified by
  1162. * the argument <width>, from the PCI configuration space
  1163. * This routine works around a problem in the hardware which hangs
  1164. * PCI bus if device no 12 is accessed from the PCI configuration space.
  1165. *
  1166. * NOMANUAL
  1167. *
  1168. * RETURNS: OK, or ERROR if this library is not initialized
  1169. *
  1170. * ERRNO: N/A
  1171. */
  1172. STATUS sysPciConfigRead
  1173.     (
  1174.     int busNo,    /* bus number */
  1175.     int deviceNo, /* device number */
  1176.     int funcNo,   /* function number */
  1177.     int offset,   /* offset into the configuration space */
  1178.     int width,    /* width to be read */
  1179.     void * pData /* data read from the offset */
  1180.     )
  1181.     {
  1182.     UINT8  retValByte = 0;
  1183.     UINT16 retValWord = 0;
  1184.     UINT32 retValLong = 0;
  1185.     STATUS retStat = ERROR;
  1186.     /* Set Default values of data */
  1187.     switch(width) {
  1188.         case 1:
  1189.             *((UINT8 *)pData) = 0xff;
  1190.             break;
  1191.         case 2:
  1192.             *((UINT16 *)pData) = 0xffff; 
  1193.             break;
  1194.         case 4:
  1195.             *((UINT32 *)pData) = 0xffffffff;
  1196.             break;
  1197.         default:
  1198.             return ERROR;
  1199.     }
  1200.  
  1201. #if defined(BCM_DEVICE_ON_PCIE) /* Skip device on PCI BUS */
  1202.     if  (0x1e == deviceNo) {
  1203.         return OK;
  1204.     }
  1205. #else
  1206. #endif
  1207.     if (pci_autoconfig_done) {
  1208.         if (busNo >= PCIEX_BUS_MIN) {
  1209.             if ((busNo > (PCIEX_BUS_MIN + 1)) || (deviceNo > 0))  {
  1210.                 return OK;
  1211.             }
  1212.             busNo = busNo - PCIEX_BUS_MIN;
  1213.             sysPciConfigEnable(CDS85XX_PCIEX_BUS);
  1214.         } else {
  1215.             sysPciConfigEnable(CDS85XX_PCI_1_BUS);
  1216.         }
  1217.     }
  1218.     
  1219.     /* This is for PCI Express */
  1220.     if ((sysPciConfAddr == PCIEX_CFG_ADR_REG) && (busNo > 0))
  1221.     {
  1222.          /* Read LTSSM state status register to make sure that the Link is ready */
  1223.          pciRegWrite ((UINT32 *)sysPciConfAddr,
  1224.                          (UINT32)pciConfigBdfPack (0, 0, 0) |
  1225.                          (0x404 & 0xfc) | 0x80000000 | ((0x404 & 0xf00) << 16));
  1226.           retValLong = PCI_IN_LONG (sysPciConfData);
  1227.           if (retValLong != 0x16) {
  1228.               /* Link training is not completed. Cannot read PCIE config 
  1229.                * space. */
  1230.               return OK;
  1231.           }
  1232.     }
  1233.     switch (width)
  1234.         {
  1235.         case 1: /* byte */
  1236.             pciRegWrite ((UINT32 *)sysPciConfAddr,
  1237.                          (UINT32)pciConfigBdfPack (busNo, deviceNo, funcNo) |
  1238.                          (offset & 0xffc) | 0x80000000 | ((offset & 0xf00) << 16)) ;
  1239.             retValByte = PCI_IN_BYTE (sysPciConfData + (offset & 0x3));
  1240.             *((UINT8 *)pData) = retValByte;
  1241.             retStat = OK;
  1242.             break;
  1243.         case 2: /* word */
  1244.             pciRegWrite ((UINT32 *)sysPciConfAddr,
  1245.                          (UINT32)pciConfigBdfPack (busNo, deviceNo, funcNo) |
  1246.                          (offset & 0xfc) | 0x80000000 | ((offset & 0xf00) << 16));
  1247.             retValWord = PCI_IN_WORD (sysPciConfData + (offset & 0x2));
  1248.             *((UINT16 *)pData) = retValWord;
  1249.             retStat = OK;
  1250.             break;
  1251.         case 4: /* long */
  1252.             pciRegWrite ((UINT32 *)sysPciConfAddr,
  1253.                          (UINT32)pciConfigBdfPack (busNo, deviceNo, funcNo) |
  1254.                          (offset & 0xfc) | 0x80000000 | ((offset & 0xf00) << 16));
  1255.             retValLong = PCI_IN_LONG (sysPciConfData);
  1256.             *((UINT32 *)pData) = retValLong;
  1257.             retStat = OK;
  1258.             break;
  1259.         default:
  1260.             retStat = ERROR;
  1261.             break;
  1262.         }
  1263.     return(retStat);
  1264.     }
  1265. /*******************************************************************************
  1266. *
  1267. * sysPciConfigWrite - write to the PCI configuration space
  1268. *
  1269. * This routine writes either a byte, word or a long word specified by
  1270. * the argument <width>, to the PCI configuration space
  1271. * This routine works around a problem in the hardware which hangs
  1272. * PCI bus if device no 12 is accessed from the PCI configuration space.
  1273. * Errata PCI-Express requires RMW to ensure always write 4byte aligned.
  1274. *
  1275. * NOMANUAL
  1276. *
  1277. * RETURNS: OK, or ERROR if this library is not initialized
  1278. *
  1279. * ERRNO: N/A
  1280. */
  1281. STATUS sysPciConfigWrite
  1282.     (
  1283.     int busNo,    /* bus number */
  1284.     int deviceNo, /* device number */
  1285.     int funcNo,   /* function number */
  1286.     int offset,   /* offset into the configuration space */
  1287.     int width,    /* width to write */
  1288.     ULONG data    /* data to write */
  1289.     )
  1290.     {
  1291.  /*
  1292.   * PCI-Express errata RMW workaround should work for all PCI
  1293.   * Requires always to do 4 byte read/write
  1294.   */
  1295.     ULONG data2,mask;
  1296.  
  1297.    /* Establish the required mask based on width and offset */
  1298.     switch(width)
  1299. {
  1300. case 1:
  1301.     mask=0xff;
  1302.     mask=~(mask << ((offset&0x3)*8));
  1303.     break;
  1304. case 2:
  1305.     mask=0xffff;
  1306.     mask=~(mask << ((offset&0x3)*8));
  1307.     break;
  1308. case 4:
  1309.     mask=0;
  1310.     break;
  1311. default:
  1312.     return(ERROR);
  1313. }
  1314.     if (pci_autoconfig_done) {
  1315.         if (busNo >= PCIEX_BUS_MIN) {
  1316.             /* busNo = busNo - PCIEX_BUS_MIN;*/
  1317.             sysPciConfigEnable(CDS85XX_PCIEX_BUS);
  1318.         } else {
  1319.             sysPciConfigEnable(CDS85XX_PCI_1_BUS);
  1320.         }
  1321.     }
  1322.     sysPciConfigRead(busNo,deviceNo,funcNo,(offset & ~0x3), 4, &data2);
  1323.     if (pci_autoconfig_done) {
  1324.         if (busNo >= PCIEX_BUS_MIN) {
  1325.             busNo = busNo - PCIEX_BUS_MIN;
  1326.             sysPciConfigEnable(CDS85XX_PCIEX_BUS);
  1327.         } else {
  1328.             sysPciConfigEnable(CDS85XX_PCI_1_BUS);
  1329.         }
  1330.     }
  1331.     data2 &= mask;
  1332.     data2 |= data << ((offset&0x3)*8); /* Overwite only part of word reqd */
  1333.     data = data2;             /* final 32 bit value to write */
  1334.     width = 4;                /* always do 32 bit write */
  1335.     offset = (offset & ~0x3); /* align by 32 bits */
  1336. #if 0
  1337.     if ((busNo == 0) && (deviceNo == 0x1f))
  1338.         return(ERROR);
  1339. #endif
  1340.     switch (width)
  1341.         {
  1342.         case 1: /* byte */
  1343.             pciRegWrite ((UINT32 *)sysPciConfAddr,
  1344.                          (UINT32)pciConfigBdfPack (busNo, deviceNo, funcNo) |
  1345.                          (offset & 0xfc) | 0x80000000 | ((offset & 0xf00) << 16));
  1346.             PCI_OUT_BYTE ((sysPciConfData + (offset & 0x3)), data);
  1347.             break;
  1348.         case 2: /* word */
  1349.             pciRegWrite ((UINT32 *)sysPciConfAddr,
  1350.                          (UINT32)pciConfigBdfPack (busNo, deviceNo, funcNo) |
  1351.                          (offset & 0xfc) | 0x80000000 | ((offset & 0xf00) << 16));
  1352.             PCI_OUT_WORD ((sysPciConfData + (offset & 0x2)), data);
  1353.             break;
  1354.         case 4: /* long */
  1355.             pciRegWrite ((UINT32 *)sysPciConfAddr,
  1356.                          (UINT32)pciConfigBdfPack (busNo, deviceNo, funcNo) |
  1357.                          (offset & 0xfc) | 0x80000000 | ((offset & 0xf00) << 16));
  1358.             PCI_OUT_LONG (sysPciConfData, data);
  1359.             break;
  1360.         default:
  1361.             return(ERROR);
  1362.         }
  1363.     return(OK);
  1364.     }
  1365. #endif /* INCLUDE_PCI */
  1366. /******************************************************************************
  1367. *
  1368. * sysUsDelay - delay at least the specified amount of time (in microseconds)
  1369. *
  1370. * This routine will delay for at least the specified amount of time using the
  1371. * lower 32 bit "word" of the Time Base register as the timer.
  1372. *
  1373. * NOTE:  This routine will not relinquish the CPU; it is meant to perform a
  1374. * busy loop delay.  The minimum delay that this routine will provide is
  1375. * approximately 10 microseconds.  The maximum delay is approximately the
  1376. * size of UINT32; however, there is no roll-over compensation for the total
  1377. * delay time, so it is necessary to back off two times the system tick rate
  1378. * from the maximum.
  1379. *
  1380. * RETURNS: N/A
  1381. *
  1382. * ERRNO: N/A
  1383. */
  1384. void sysUsDelay
  1385.     (
  1386.     UINT32    delay        /* length of time in microsec to delay */
  1387.     )
  1388.     {
  1389.     register UINT baselineTickCount;
  1390.     register UINT curTickCount;
  1391.     register UINT terminalTickCount;
  1392.     register int actualRollover = 0;
  1393.     register int calcRollover = 0;
  1394.     UINT ticksToWait;
  1395.     UINT requestedDelay;
  1396.     UINT oneUsDelay;
  1397.     /* Exit if no delay count */
  1398.     if ((requestedDelay = delay) == 0)
  1399.         return;
  1400.     /*
  1401.      * Get the Time Base Lower register tick count, this will be used
  1402.      * as the baseline.
  1403.      */
  1404.     baselineTickCount = sysTimeBaseLGet();
  1405.     /*
  1406.      * Calculate number of ticks equal to 1 microsecond
  1407.      *
  1408.      * The Time Base register and the Decrementer count at the same rate:
  1409.      * once per 8 System Bus cycles.
  1410.      *
  1411.      * e.g., 199999999 cycles     1 tick      1 second            25 ticks
  1412.      *       ----------------  *  ------   *  --------         ~  --------
  1413.      *       second               8 cycles    1000000 microsec    microsec
  1414.      */
  1415.     /* add to round up before div to provide "at least" */
  1416.     oneUsDelay = ((sysTimerClkFreq + 1000000) / 1000000);
  1417.     /* Convert delay time into ticks */
  1418.     ticksToWait = requestedDelay * oneUsDelay;
  1419.     /* Compute when to stop */
  1420.     terminalTickCount = baselineTickCount + ticksToWait;
  1421.     /* Check for expected rollover */
  1422.     if (terminalTickCount < baselineTickCount)
  1423.         {
  1424.         calcRollover = 1;
  1425.         }
  1426.     do
  1427.         {
  1428.         /*
  1429.          * Get current Time Base Lower register count.
  1430.          * The Time Base counts UP from 0 to
  1431.          * all F's.
  1432.          */
  1433.         curTickCount = sysTimeBaseLGet();
  1434.         /* Check for actual rollover */
  1435.         if (curTickCount < baselineTickCount)
  1436.             {
  1437.             actualRollover = 1;
  1438.             }
  1439.         if (((curTickCount >= terminalTickCount)
  1440.              && (actualRollover == calcRollover)) ||
  1441.             ((curTickCount < terminalTickCount)
  1442.              && (actualRollover > calcRollover)))
  1443.             {
  1444.             /* Delay time met */
  1445.             break;
  1446.             }
  1447.         }
  1448.     while (TRUE); /* breaks above when delay time is met */
  1449.     }
  1450. void sysMsDelay
  1451.     (
  1452.     UINT      delay                   /* length of time in MS to delay */
  1453.     )
  1454.     {
  1455.     sysUsDelay ( (UINT32) delay * 1000 );
  1456.     }
  1457. /*********************************************************************
  1458. *
  1459. * sysDelay - Fixed 1ms delay.
  1460. *
  1461. * This routine consumes 1ms of time. It just calls sysMsDelay.
  1462. *
  1463. * RETURNS: N/A
  1464. *
  1465. * ERRNO: N/A
  1466. */
  1467. void sysDelay (void)
  1468.     {
  1469.     sysMsDelay (1);
  1470.     }
  1471. /***************************************************************************
  1472. *
  1473. * sysIntConnect - connect the BSP interrupt to the proper epic/i8259 handler.
  1474. *
  1475. * This routine checks the INT level and connects the proper routine.
  1476. * pciIntConnect() or intConnect().
  1477. *
  1478. * RETURNS:
  1479. * OK, or ERROR if the interrupt handler cannot be built.
  1480. *
  1481. * ERRNO: N/A
  1482. */
  1483. STATUS sysIntConnect
  1484.     (
  1485.     VOIDFUNCPTR *vector,        /* interrupt vector to attach to     */
  1486.     VOIDFUNCPTR routine,        /* routine to be called              */
  1487.     int parameter               /* parameter to be passed to routine */
  1488.     )
  1489.     {
  1490.     int tmpStat = ERROR;
  1491.     UINT32 read;
  1492.     if (((int) vector < 0) || ((int) vector >= EXT_VEC_IRQ0 + EXT_MAX_IRQS))
  1493.         {
  1494.         logMsg ("Error in sysIntConnect: out of range vector = %d.n",
  1495.                 (int)vector,2,3,4,5,6);
  1496.         return(ERROR);
  1497.         }
  1498.     if (vxMemProbe ((char *) routine, VX_READ, 4, (char *) &read) != OK)
  1499.         {
  1500.         logMsg ("Error in sysIntConnect: Cannot access routine.n",
  1501.                 1,2,3,4,5,6);
  1502.         return(ERROR);
  1503.         }
  1504.     if ((int) vector < EXT_VEC_IRQ0)
  1505.         {
  1506.         tmpStat = intConnect (vector, routine, parameter);
  1507.         }
  1508.     else
  1509.         {
  1510.         /* 
  1511.  * call external int controller connect
  1512.          tmpStat = cascadeIntConnect (vector, routine, parameter);
  1513.  */
  1514.         }
  1515.     if (tmpStat == ERROR)
  1516.         {
  1517.         logMsg ("Error in sysIntConnect: Connecting vector = %d.n",
  1518.                 (int)vector,2,3,4,5,6);
  1519.         }
  1520.     return(tmpStat);
  1521.     }
  1522. /*******************************************************************************
  1523. *
  1524. * sysIntEnable - enable an interrupt
  1525. *
  1526. * This function call is used to enable an interrupt.
  1527. *
  1528. * RETURNS: OK or ERROR if unable to enable interrupt.
  1529. *
  1530. * ERRNO: N/A
  1531. */
  1532. STATUS sysIntEnable
  1533.     (
  1534.     int intNum
  1535.     )
  1536.     {
  1537.     int tmpStat = ERROR;
  1538.     if (((int) intNum < 0) || ((int) intNum >= EXT_NUM_IRQ0 + EXT_MAX_IRQS))
  1539.         {
  1540.         logMsg ("Error in sysIntEnable: Out of range intNum = %d.n",
  1541.                 (int)intNum,2,3,4,5,6);
  1542.         return(ERROR);
  1543.         }
  1544.     if ((int) intNum < EXT_NUM_IRQ0)
  1545.         {
  1546.         tmpStat = intEnable (intNum);
  1547.         }
  1548.     else
  1549.         {
  1550.         /* call external int controller connect */
  1551.         tmpStat = sysCascadeIntEnable (intNum - EXT_NUM_IRQ0);
  1552.         }
  1553.     if (tmpStat == ERROR)
  1554.         {
  1555.         logMsg ("Error in sysIntEnable: intNum = %d.n",
  1556.                 (int)intNum,2,3,4,5,6);
  1557.         }
  1558.     return(tmpStat);
  1559.     }
  1560. /****************************************************************************
  1561. *
  1562. * sysCascadeIntEnable - enable an external controller interrupt
  1563. *
  1564. * This function call is used to enable an interrupt outside of the MPC8540 PIC.
  1565. *
  1566. * RETURNS: OK or ERROR if unable to enable interrupt.
  1567. *
  1568. * ERRNO: N/A
  1569. */
  1570. STATUS sysCascadeIntEnable
  1571.     (
  1572.     int intNum
  1573.     )
  1574.     {
  1575.     return(ERROR);
  1576.     }
  1577. /****************************************************************************
  1578. *
  1579. * sysIntDisable - disable an interrupt
  1580. *
  1581. * This function call is used to disable an interrupt.
  1582. *
  1583. * RETURNS: OK or ERROR if unable to disable interrupt.
  1584. *
  1585. * ERRNO: N/A
  1586. */
  1587. STATUS sysIntDisable
  1588.     (
  1589.     int intNum
  1590.     )
  1591.     {
  1592.     int tmpStat = ERROR;
  1593.     if (((int) intNum < 0) || ((int) intNum >= EXT_NUM_IRQ0 + EXT_MAX_IRQS))
  1594.         {
  1595.         logMsg ("Error in sysIntDisable: Out of range intNum = %d.n",
  1596.                 (int)intNum,2,3,4,5,6);
  1597.         return(ERROR);
  1598.         }
  1599.     if ((int) intNum < EXT_NUM_IRQ0)
  1600.         {
  1601.         tmpStat = intDisable (intNum);
  1602.         }
  1603.     else
  1604.         {
  1605.         /* call external int controller connect */
  1606.         tmpStat = sysCascadeIntDisable (intNum - EXT_NUM_IRQ0);
  1607.         }
  1608.     if (tmpStat == ERROR)
  1609.         {
  1610.         logMsg ("Error in sysIntDisable: intNum = %d.n",
  1611.                 (int)intNum,2,3,4,5,6);
  1612.         }
  1613.     return(tmpStat);
  1614.     }
  1615. /**************************************************************************
  1616. *
  1617. * sysCascadeIntDisable - disable an external controller interrupt
  1618. *
  1619. * This function call is used to disable an interrupt outside of the MPC8540 PIC.
  1620. *
  1621. * RETURNS: OK or ERROR if unable to disable interrupt.
  1622. *
  1623. * ERRNO: N/A
  1624. */
  1625. STATUS sysCascadeIntDisable
  1626.     (
  1627.     int intNum
  1628.     )
  1629.     {
  1630.     return(ERROR);
  1631.     }
  1632. #ifdef INCLUDE_CACHE_SUPPORT
  1633. /***********************************************************************
  1634. *
  1635. * sysL1CacheQuery - configure L1 cache size and alignment
  1636. *
  1637. * Populates L1 cache size and alignment from configuration registers.
  1638. *
  1639. * RETURNS: N/A
  1640. *
  1641. * ERRNO: N/A
  1642. */
  1643. LOCAL void sysL1CacheQuery(void)
  1644.     {
  1645.     UINT32 temp;
  1646.     UINT32 align;
  1647.     UINT32 cachesize;
  1648.     temp = vxL1CFG0Get();
  1649.     cachesize = (temp & 0xFF) << 10;
  1650.     align = (temp >> 23) & 0x3;
  1651.     switch (align)
  1652.         {
  1653.         case 0:
  1654.             ppcE500CACHE_ALIGN_SIZE=32;
  1655.             break;
  1656.         case 1:
  1657.             ppcE500CACHE_ALIGN_SIZE=64;
  1658.             break;
  1659.         default:
  1660.             ppcE500CACHE_ALIGN_SIZE=32;
  1661.             break;
  1662.         }
  1663.     ppcE500DCACHE_LINE_NUM = (cachesize / ppcE500CACHE_ALIGN_SIZE);
  1664.     ppcE500ICACHE_LINE_NUM = (cachesize / ppcE500CACHE_ALIGN_SIZE);
  1665.     /*
  1666.      * The core manual suggests for a 32 byte cache line and 8 lines per set
  1667.      * we actually need 12 unique address loads to flush the set.
  1668.      * The number of lines to flush should be ( 3/2 * cache lines )
  1669.      */
  1670.     ppcE500DCACHE_LINE_NUM = (3*ppcE500DCACHE_LINE_NUM)>>1;
  1671.     ppcE500ICACHE_LINE_NUM = (3*ppcE500ICACHE_LINE_NUM)>>1;
  1672.     }
  1673. #endif /* INCLUDE_CACHE_SUPPORT */
  1674. /***************************************************************************
  1675. *
  1676. * saveExcMsg - write exception message to save area for catastrophic error
  1677. *
  1678. * The message will be displayed upon rebooting with a bootrom.
  1679. *
  1680. * RETURNS: N/A
  1681. *
  1682. * ERRNO: N/A
  1683. */
  1684. void saveExcMsg
  1685.     (
  1686.     char *errorMsg
  1687.     )
  1688.     {
  1689.     strcpy ((char *)EXC_MSG_OFFSET, errorMsg);
  1690.     }
  1691. void chipErrataCpu29Print(void)
  1692.     {
  1693.     saveExcMsg("Silicon fault detected, possible machine state corruption.nSystem rebooted to limit damage.");
  1694.     }
  1695. /***************************************************************************
  1696. *
  1697. * vxImmrGet - get the CPM DPRAM base address
  1698. *
  1699. * This routine returns the CPM DP Ram base address for CPM device drivers.
  1700. *
  1701. * RETURNS:
  1702. *
  1703. * ERRNO: N/A
  1704. */
  1705. UINT32 vxImmrGet(void)
  1706.     {
  1707.     return(CCSBAR + 0x80000);
  1708.     }
  1709. /***************************************************************************
  1710. *
  1711. * sysGetPeripheralBase   - Provides CCSRBAR address fro security engine
  1712. *                          drivers.
  1713. *
  1714. * RETURNS:
  1715. *
  1716. * ERRNO: N/A
  1717. */
  1718. UINT32 sysGetPeripheralBase()
  1719.     {
  1720.     return(CCSBAR);
  1721.     }
  1722. #if defined (_GNU_TOOL)
  1723. void sysIntHandler (void)
  1724.     {
  1725.     }
  1726. void vxDecInt (void)
  1727.     {
  1728.     }
  1729. int excRtnTbl = 0;
  1730. #endif  /* _GNU_TOOL */
  1731. #ifdef INCLUDE_SHOW_ROUTINES
  1732. /***************************************************************************
  1733. *
  1734. * coreLbcShow - Show routine for local bus controller
  1735. *
  1736. * This routine shows the local bus controller registers.
  1737. *
  1738. * RETURNS: N/A
  1739. *
  1740. * ERRNO: N/A
  1741. */
  1742. void coreLbcShow(void)
  1743.     {
  1744.     VINT32 tmp, tmp2;
  1745.     tmp = * (VINT32 *) M85XX_BR0(CCSBAR);
  1746.     tmp2 = * (VINT32 *) M85XX_OR0(CCSBAR);
  1747.     printf("Local bus BR0 = 0x%xtOR0 = 0x%xn", tmp, tmp2);
  1748.     tmp = * (VINT32 *) M85XX_BR1(CCSBAR);
  1749.     tmp2 = * (VINT32 *) M85XX_OR1(CCSBAR);
  1750.     printf("Local bus BR1 = 0x%xtOR1 = 0x%xn", tmp, tmp2);
  1751.     tmp = * (VINT32 *) M85XX_BR2(CCSBAR);
  1752.     tmp2 = * (VINT32 *) M85XX_OR2(CCSBAR);
  1753.     printf("Local bus BR2 = 0x%xtOR2 = 0x%xn", tmp, tmp2);
  1754.     tmp = * (VINT32 *) M85XX_BR3(CCSBAR);
  1755.     tmp2 = * (VINT32 *) M85XX_OR3(CCSBAR);
  1756.     printf("Local bus BR3 = 0x%xtOR3 = 0x%xn", tmp, tmp2);
  1757.     tmp = * (VINT32 *) M85XX_BR4(CCSBAR);
  1758.     tmp2 = * (VINT32 *) M85XX_OR4(CCSBAR);
  1759.     printf("Local bus BR4 = 0x%xtOR4 = 0x%xn", tmp, tmp2);
  1760.     tmp = * (VINT32 *) M85XX_BR5(CCSBAR);
  1761.     tmp2 = * (VINT32 *) M85XX_OR5(CCSBAR);
  1762.     printf("Local bus BR5 = 0x%xtOR5 = 0x%xn", tmp, tmp2);
  1763.     tmp = * (VINT32 *) M85XX_BR6(CCSBAR);
  1764.     tmp2 = * (VINT32 *) M85XX_OR6(CCSBAR);
  1765.     printf("Local bus BR6 = 0x%xtOR6 = 0x%xn", tmp, tmp2);
  1766.     tmp = * (VINT32 *) M85XX_BR7(CCSBAR);
  1767.     tmp2 = * (VINT32 *) M85XX_OR7(CCSBAR);
  1768.     printf("Local bus BR7 = 0x%xtOR7 = 0x%xn", tmp, tmp2);
  1769.     tmp = * (VINT32 *) M85XX_LBCR(CCSBAR);
  1770.     printf("Local bus LBCR = 0x%xn", tmp);
  1771.     tmp = * (VINT32 *) M85XX_LCRR(CCSBAR);
  1772.     printf("Local bus LCRR = 0x%xn", tmp);
  1773.     }
  1774.     #define xbit0(x, n)    ((x & (1 << (31 - n))) >> (31 - n))  /* 0..31 */
  1775.     #define xbit32(x, n)   ((x & (1 << (63 - n))) >> (63 - n))  /* 32..63 */
  1776.     #define onoff0(x, n)   xbit0(x, n) ? "ON", "OFF"
  1777.     #define onoff32(x, n)  xbit32(x, n) ? "ON", "OFF"
  1778. /***************************************************************************
  1779. *
  1780. * coreShow - Show routine for core registers
  1781. *
  1782. * This routine shows the core registers.
  1783. *
  1784. * RETURNS: N/A
  1785. *
  1786. * ERRNO: N/A
  1787. */
  1788. void coreShow(void)
  1789.     {
  1790.     VUINT32 tmp, tmp2;
  1791.     tmp = vxMsrGet();
  1792.     printf("MSR - 0x%xn", tmp);
  1793.     printf("      UCLE-%x SPE-%x WE-%x CE-%x EE-%x PR-%x ME-%xn",
  1794.            xbit32(tmp,37), xbit32(tmp,38), xbit32(tmp,45), xbit32(tmp,46),
  1795.            xbit32(tmp,48), xbit32(tmp,49), xbit32(tmp,51));
  1796.     printf("      UBLE-%x DE-%x IS-%x DS-%x PMM-%xn",
  1797.            xbit32(tmp,53), xbit32(tmp,54), xbit32(tmp,58), xbit32(tmp,59),
  1798.            xbit32(tmp,61));
  1799.     tmp = vxHid0Get();
  1800.     tmp2 = vxHid1Get();
  1801.     printf("HID0 = 0x%x, HID1 = 0x%xn", tmp, tmp2);
  1802.     tmp = vxL1CSR0Get();
  1803.     printf("L1CSR0: cache is %s - 0x%xn", tmp&1?"ON":"OFF", tmp);
  1804.     tmp = vxL1CSR1Get();
  1805.     printf("L1CSR1: Icache is %s - 0x%xn", tmp&1?"ON":"OFF", tmp);
  1806.     tmp = vxL1CFG0Get();
  1807.     tmp2 = vxL1CFG1Get();
  1808.     printf("L1CFG0 = 0x%x, L1CFG1 = 0x%xn", tmp, tmp2);
  1809.     tmp = *(VUINT32 *) (CCSBAR + 0x20000);
  1810.     printf("L2CTL - 0x%xn", tmp);
  1811.     printf("        l2 is %sn", tmp&0x80000000?"ON":"OFF");
  1812.     printf("        l2siz-%x l2blksz-%x l2do-%x l2io-%xn",
  1813.            (xbit0(tmp,2)<<1)|xbit0(tmp,3), (xbit0(tmp,4)<<1)|xbit0(tmp,5),
  1814.            xbit0(tmp,9), xbit0(tmp,10));
  1815.     printf("        l2pmextdis-%x l2intdis-%x l2sram-%xn",
  1816.            xbit0(tmp,11), xbit0(tmp,12),
  1817.            (xbit0(tmp,13)<<2)|(xbit0(tmp,14)<<1)|xbit0(tmp,15));
  1818.     tmp = *(VUINT32 *) (CCSBAR + 0x20100);
  1819.     tmp2 = *(VUINT32 *) (CCSBAR + 0x20108);
  1820.     printf("L2SRBAR0 - 0x%xn", tmp);
  1821.     printf("L2SRBAR1 - 0x%xn", tmp2);
  1822.     printf("Core Freq = %3d Hzn",coreFreq);
  1823.     printf("CCB Freq = %3d Hzn",sysClkFreqGet());
  1824.     printf("PCI Freq = %3d Hzn",OSCILLATOR_FREQ);
  1825.     printf("CPM Freq = %3d Hzn",sysClkFreqGet());
  1826.     }
  1827. #endif
  1828. int sysVectorIRQ0 = 0;
  1829. void
  1830. sysReboot(void)
  1831. {
  1832.     int level;
  1833.      level = intLock();
  1834.      * (VINT32 *) M85XX_GPOUTDR(CCSBAR) = ~0x0;
  1835.      * (VINT32 *) M85XX_GPIOCR(CCSBAR) = 0x200;
  1836.      * (VINT32 *) M85XX_GPOUTDR(CCSBAR) &= ~(BCM98548XMC_SYS_RESET);
  1837.      sysMsDelay(500); /* 500 ms delay */
  1838.      * (VINT32 *) M85XX_GPOUTDR(CCSBAR) &=
  1839.                          ~(BCM98548XMC_SYS_RESET| BCM98548XMC_CPU_RESET);
  1840.  
  1841.      for(;;);
  1842. }
  1843. UINT8 sysBoardRev()
  1844. {
  1845.     UINT8 board_id;
  1846.     board_id = 0;
  1847. #ifdef INCLUDE_I2C_DEV
  1848.     if (pcf8574_boardid_get(&board_id) == 0) {
  1849.         return board_id; 
  1850.     }
  1851. #endif
  1852.     return 0;
  1853. }
  1854. STATUS sysRtcGet (struct tm * time)
  1855. {
  1856.     int year, month, date, hour, min, sec;
  1857.     STATUS status;
  1858.  
  1859.     status = ERROR;
  1860. #ifdef INCLUDE_I2C_DEV
  1861.     status = m41t81_tod_get(&year, &month, &date, &hour, &min, &sec);
  1862.     if (status == 0) {
  1863.         time->tm_sec   = sec;
  1864.         time->tm_min   = min;
  1865.         time->tm_hour  = hour;
  1866.         time->tm_mday  = date;
  1867.         time->tm_mon   = month - 1;  /* POSIX needs 0-11 */ 
  1868.         time->tm_year  = year - 1900;
  1869.         time->tm_yday  = 0;          /* unknown */
  1870.         time->tm_isdst = 0;          /* unknown */
  1871.     }
  1872. #endif /* INCLUDE_I2C_DEV */
  1873.     return status;
  1874. }
  1875. void
  1876. pcieShow()
  1877. {
  1878. int min_bus =129; int max_bus = 129;
  1879. #define P_MIN_BUS       min_bus
  1880. #define P_MAX_BUS       max_bus
  1881. #define P_MAX_DEV       31
  1882. #define P_MAX_FUNC      0
  1883. #define P_MAX_OFFSET    (0x400 -1)
  1884. #define FOR_EACH_LOOP(curr_id, min_id, max_id, incr_id) 
  1885.         for(curr_id = min_id; curr_id <= max_id; curr_id += incr_id)
  1886.     int bus, devid, func, offset, val, dev_max;
  1887.     printf("BS DV FN OF VALUEn");
  1888.     FOR_EACH_LOOP(bus, P_MIN_BUS, P_MAX_BUS, 1) {
  1889.         dev_max = (bus < PCIEX_BUS_MIN) ? P_MAX_DEV : 0;
  1890.         FOR_EACH_LOOP(devid, 0, dev_max, 1) {
  1891.             FOR_EACH_LOOP(func, 0, P_MAX_FUNC, 1) {
  1892.                 FOR_EACH_LOOP(offset, 0, P_MAX_OFFSET, 4) {
  1893.                     pciConfigInLong(bus, devid, func, offset, &val);
  1894.                     if (val == 0xffffffff) {
  1895.                         break;
  1896.                     }
  1897.                     printf("%02d %02d %02d %02X %08Xn",
  1898.                                 bus, devid, func, offset, val);
  1899.                 }
  1900.             }
  1901.         }
  1902.     }
  1903. }
  1904. void sysPcieConfigShow()
  1905. {
  1906.     int busNo;
  1907.     int devNo;
  1908.     int funcNo;
  1909.     int data;
  1910.     int offset;
  1911.     busNo  = PCIEX_BUS_MIN + 0;
  1912.     devNo  = 0;
  1913.     funcNo = 0;
  1914.     sysPciConfigEnable (CDS85XX_PCIEX_BUS);
  1915.     for (offset = 0; offset <= 0x7c; offset = offset + 4) {
  1916.        if (sysPciConfigRead(busNo, devNo, funcNo, offset, 4, &data)== OK) {
  1917.            printf("offset 0x%08x = 0x%08xn", offset, data);
  1918.        } else {
  1919.            printf("sysPciConfigRead error.n");
  1920.            break;
  1921.        }
  1922.     }
  1923.     printf("PCI-E Extended Configuration Spacen");
  1924.     for (offset = 0x100; offset <= 0x134; offset = offset + 4) {
  1925.        if (sysPciConfigRead(busNo, devNo, funcNo, offset, 4, &data)== OK) {
  1926.            printf("offset 0x%08x = 0x%08xn", offset, data);
  1927.        } else {
  1928.            printf("sysPciConfigRead error.n");
  1929.            break;
  1930.        }
  1931.     }
  1932.     offset = 0x404;
  1933.     if (sysPciConfigRead(busNo, devNo, funcNo, offset, 4, &data)== OK) {
  1934.        printf("offset 0x%08x = 0x%08xn", offset, data);
  1935.     } else {
  1936.        printf("sysPciConfigRead error offset 0x%08x.n", offset);
  1937.     }
  1938.     offset = 0x440;
  1939.     if (sysPciConfigRead(busNo, devNo, funcNo, offset, 4, &data)== OK) {
  1940.        printf("offset 0x%08x = 0x%08xn", offset, data);
  1941.     } else {
  1942.        printf("sysPciConfigRead error offset 0x%08x.n", offset);
  1943.     }
  1944.     offset = 0x450;
  1945.     if (sysPciConfigRead(busNo, devNo, funcNo, offset, 4, &data)== OK) {
  1946.        printf("offset 0x%08x = 0x%08xn", offset, data);
  1947.     } else {
  1948.        printf("sysPciConfigRead error offset 0x%08x.n", offset);
  1949.     }
  1950.     offset = 0x454;
  1951.     if (sysPciConfigRead(busNo, devNo, funcNo, offset, 4, &data)== OK) {
  1952.        printf("offset 0x%08x = 0x%08xn", offset, data);
  1953.     } else {
  1954.        printf("sysPciConfigRead error offset 0x%08x.n", offset);
  1955.     }
  1956.     offset = 0x478;
  1957.     if (sysPciConfigRead(busNo, devNo, funcNo, offset, 4, &data)== OK) {
  1958.        printf("offset 0x%08x = 0x%08xn", offset, data);
  1959.     } else {
  1960.        printf("sysPciConfigRead error offset 0x%08x.n", offset);
  1961.     }
  1962.     offset = 0x4b0;
  1963.     if (sysPciConfigRead(busNo, devNo, funcNo, offset, 4, &data)== OK) {
  1964.        printf("offset 0x%08x = 0x%08xn", offset, data);
  1965.     } else {
  1966.        printf("sysPciConfigRead error offset 0x%08x.n", offset);
  1967.     }
  1968.     offset = 0x590;
  1969.     if (sysPciConfigRead(busNo, devNo, funcNo, offset, 4, &data)== OK) {
  1970.        printf("offset 0x%08x = 0x%08xn", offset, data);
  1971.     } else {
  1972.        printf("sysPciConfigRead error offset 0x%08x.n", offset);
  1973.     }
  1974.     offset = 0x5a0;
  1975.     if (sysPciConfigRead(busNo, devNo, funcNo, offset, 4, &data)== OK) {
  1976.        printf("offset 0x%08x = 0x%08xn", offset, data);
  1977.     } else {
  1978.        printf("sysPciConfigRead error offset 0x%08x.n", offset);
  1979.     }
  1980. }
  1981. static char * e500_ratio[] = {"reserved", "reserved", "1:1", "3:2",
  1982.                              "2:1", "5:2", "3:1", "7:2", "4:1", "9:2",
  1983.                              "reserved", "reserved", "reserved", "reserved",
  1984.                              "reserved", "reserved" };
  1985. static char * tsec_protocol[] = {"FIFO", "MII", "GMII", "TBI"};                        
  1986. static char * io_sel[] = {"reserved", "reserved", "reserved",
  1987.                           "x4 RIO 2.5Gbps, x4 PCI-E", 
  1988.                           "x4 RIO 1.25Gbps, x4 PCI-E", 
  1989.                           "x4 RIO 3.125Gbps", 
  1990.                           "x4 RIO 1.25Gbps", 
  1991.                           "x8 PCI-E"};
  1992. void sysPorStatShow()
  1993. {
  1994.     UINT reg;
  1995.     int  field; 
  1996.     
  1997.     reg = *M85XX_PORPLLSR(CCSBAR);
  1998.     field = (reg >> 16) & 0xf;
  1999.     printf("e500_ratio = %sn", e500_ratio[field]);
  2000.     field = (reg >> 15) & 1;
  2001.     printf("PCI1_clk_sel = %sn", field ? "SYS_CLK" : "PCI1_CLK");
  2002.     field = (reg >> 14) & 1;
  2003.     printf("PCI2_clk_sel = %sn", field ? "SYS_CLK" : "PCI2_CLK");
  2004.     field = (reg >> 1) & 0xf;
  2005.     printf("Plat_Ratio = %d : 1n", field);
  2006.     reg = *M85XX_PORBMSR(CCSBAR);
  2007.     field = (reg >> 31) & 1;
  2008.     printf("BCFG = %sn", field ? "CPU immediate boot" : "CPU wait to boot");
  2009.     reg = *M85XX_PORDEVSR(CCSBAR);
  2010.     field = (reg >> 31) & 1;
  2011.     printf("eTSEC1 and eTSEC2 in %s interface moden", 
  2012.            field ? "full" : "reduced");
  2013.     field = (reg >> 30) & 1;
  2014.     printf("eTSEC3 and eTSEC4 in %s interface moden",
  2015.            field ? "full" : "reduced");
  2016.     field = (reg >> 24) & 3;
  2017.     printf("eTSEC1 operates in %s moden", tsec_protocol[field]); 
  2018.     field = (reg >> 12) & 3;
  2019.     printf("eTSEC2 operates in %s moden", tsec_protocol[field]); 
  2020.     field = (reg >> 10) & 3;
  2021.     printf("eTSEC3 operates in %s moden", tsec_protocol[field]); 
  2022.     field = (reg >> 8) & 3;
  2023.     printf("eTSEC4 operates in %s moden", tsec_protocol[field]); 
  2024.     field = (reg >> 19) & 0xf;
  2025.     printf("%sn", io_sel[field]);
  2026.     reg = *M85XX_PORDEVSR2(CCSBAR);
  2027.     field = (reg >> 2) & 1;
  2028.     printf("Serdes %sn", field ? "enabled" : "disabled");
  2029. }
  2030. void extIsr(int id) {
  2031.     logMsg("Interrupt %dn", id, 0, 0, 0, 0, 0);
  2032. }
  2033. void installExtInt()
  2034. {
  2035.     sysEpicIntConnect((VOIDFUNCPTR *)(EXT_VEC_IRQ0 + 4), (VOIDFUNCPTR)extIsr, 4);
  2036.     sysEpicIntEnable((EXT_VEC_IRQ0 + 4));
  2037.     sysEpicIntConnect((VOIDFUNCPTR *)(EXT_VEC_IRQ0 + 5), (VOIDFUNCPTR)extIsr, 5);
  2038.     sysEpicIntEnable((EXT_VEC_IRQ0 + 5));
  2039.     sysEpicIntConnect((VOIDFUNCPTR *)(EXT_VEC_IRQ0 + 6), (VOIDFUNCPTR)extIsr, 6);
  2040.     sysEpicIntEnable((EXT_VEC_IRQ0 + 6));
  2041.     sysEpicIntConnect((VOIDFUNCPTR *)(EXT_VEC_IRQ0 + 7), (VOIDFUNCPTR)extIsr, 7);
  2042.     sysEpicIntEnable((EXT_VEC_IRQ0 + 7));
  2043.     sysEpicIntConnect((VOIDFUNCPTR *)(EXT_VEC_IRQ0 + 10), (VOIDFUNCPTR)extIsr, 10);
  2044.     sysEpicIntEnable((EXT_VEC_IRQ0 + 10));
  2045.     sysEpicIntConnect((VOIDFUNCPTR *)(EXT_VEC_IRQ0 + 11), (VOIDFUNCPTR)extIsr, 11);
  2046.     sysEpicIntEnable((EXT_VEC_IRQ0 + 11));
  2047. }
  2048. void gpoutSet(int pin, int val)
  2049. {
  2050.     int  key;
  2051.     UINT reg;
  2052.     key = intLock();
  2053.     reg = *M85XX_GPOUTDR(CCSBAR);
  2054.     if (val) {
  2055.         reg |= (0x80000000 >> pin);
  2056.     } else {
  2057.         reg &= ~(0x80000000 >> pin);
  2058.     } 
  2059.     *M85XX_GPOUTDR(CCSBAR) = reg;
  2060.     intUnlock(key);
  2061. }
  2062. void gpinGet()
  2063. {
  2064.     UINT reg;
  2065.     reg = *M85XX_GPINDR(CCSBAR);
  2066.     printf("PMC_EREADY = %dn", (reg & ( 1 << 16)) ? 1 : 0); 
  2067.     printf("~P4_PRST  = %dn", (reg & ( 1 << 17)) ? 1 : 0); 
  2068.     printf("~XMC_PRST = %dn", (reg & ( 1 << 18)) ? 1 : 0); 
  2069.     printf("FLASH_SEL = %dn", (reg & ( 1 << 19)) ? 1 : 0); 
  2070.     printf("XMC_ROOT0 = %dn", (reg & ( 1 << 20)) ? 1 : 0); 
  2071.     printf("PMC_MONARCH = %dn", (reg & ( 1 << 21)) ? 1 : 0); 
  2072.     printf("GPIO0 = %dn", (reg & ( 1 << 22)) ? 1 : 0); 
  2073.     printf("GPIN5 = %dn", (reg & ( 1 << 23)) ? 1 : 0); 
  2074.  
  2075. }
  2076. void autoconfig_done()
  2077. {
  2078.    printf("pci_autoconfig_done = %dn", pci_autoconfig_done);
  2079. }
  2080. void pcieLinkPoll()
  2081. {
  2082.     int poll_count;
  2083.     int data;
  2084.     for(poll_count=1; poll_count <=1000; poll_count++) {
  2085.         if (sysPciConfigRead(128, 0, 0, 0x404, 4, &data)== OK) {
  2086.             if (data != 0x16) {
  2087.                 printf("Link down on %d polln");
  2088.             }
  2089.         } else {
  2090.             printf("(sysPciConfigRead(128, 0, 0, 0x404, 4, &data) Failedn");
  2091.         }
  2092.     }
  2093. }
  2094. #ifdef INCLUDE_SYS_HW_INIT_0
  2095. IMPORT BOOL excExtendedVectors;
  2096. /***************************************************************************
  2097. *
  2098. * SYS_HW_INIT_0 - test for extended vectors
  2099. *
  2100. * This routine is used for testing extended vectors.
  2101. *
  2102. * RETURNS: N/A
  2103. *
  2104. * ERRNO
  2105. */
  2106. void SYS_HW_INIT_0 (void)
  2107.     {
  2108.     excExtendedVectors = TRUE;
  2109.     }
  2110. #endif  /* INCLUDE_SYS_HW_INIT_0 */