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

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. /*
  739.  * METROCORE_GTO:
  740.  * sysPciAutoConfig only enumerates bus0.
  741.  * Need to be fixed in the future.
  742.  * Comment out sysPciAutoConfig to use bootloader's (CFE)
  743.  * PCI bus enumeration.
  744.  */
  745. #ifndef METROCORE_GTO
  746. #if 0
  747.     if ( *((char*)PCI_AUTO_CONFIG_ADRS) == FALSE )
  748. #endif
  749.         {
  750.         mot85xxBridgeInit();
  751. #ifdef INCLUDE_PCI_AUTOCONF
  752.         sysPciAutoConfig();
  753.         pci_autoconfig_done = TRUE;
  754. #endif
  755.         *((char*)PCI_AUTO_CONFIG_ADRS) = TRUE;
  756.         }
  757. #endif /* METROCORE_GTO */
  758. #endif /* INCLUDE_PCI */
  759. #ifdef E500_L1_PARITY_RECOVERY
  760.     vxIvor1Set(_EXC_OFF_L1_PARITY);
  761. #endif  /* E500_L1_PARITY_RECOVERY */
  762. #ifdef INCLUDE_L1_IPARITY_HDLR
  763.     installL1ICacheParityErrorRecovery();
  764. #endif /* INCLUDE_L1_IPARITY_HDLR */
  765.     /*
  766.      * The power management mode is initialized here. Reduced power mode
  767.      * is activated only when the kernel is idle (cf vxPowerDown).
  768.      * Power management mode is selected via vxPowerModeSet().
  769.      * DEFAULT_POWER_MGT_MODE is defined in config.h.
  770.      */
  771. #if defined(INCLUDE_L2_SRAM)
  772. #if (defined(INCLUDE_L2_CACHE) && defined(INCLUDE_CACHE_SUPPORT))
  773.     sysL2SramEnable(TRUE);
  774. #elif (defined(INCLUDE_L2_SRAM))
  775.     sysL2SramEnable(FALSE);
  776. #endif
  777. #endif
  778.     CACHE_PIPE_FLUSH();
  779.     vxPowerModeSet (DEFAULT_POWER_MGT_MODE);
  780.     }
  781. #ifdef INCLUDE_L2_SRAM
  782. /*************************************************************************
  783. *
  784. * sysL2SramEnable - enables L2SRAM if L2SRAM only
  785. *
  786. * This routine enables L2SRAM if L2SRAM only or initializes blk
  787. * size etc and leaves the rest to L2 cache code.
  788. *
  789. * RETURNS: N/A
  790. *
  791. * ERRNO: N/A
  792. */
  793. LOCAL void sysL2SramEnable
  794. (
  795. BOOL both
  796. )
  797.     {
  798.     volatile int l2CtlVal;
  799.     /*
  800.      * if INCLUDE_L2_CACHE and CACHE_SUPPORT
  801.      * if ((L2_SRAM_SIZE + L2_CACHE_SIZE) > l2Siz)
  802.      */
  803.     /* Setup Windows for L2SRAM */
  804.     *(M85XX_L2SRBAR0(CCSBAR)) = (UINT32)(L2SRAM_ADDR & M85XX_L2SRBAR_ADDR_MSK);
  805.     /* Get present value */
  806.     l2CtlVal = vxL2CTLGet(M85XX_L2CTL(CCSBAR));
  807.     /* Disable L2CTL initially to allow changing of block size */
  808.     l2CtlVal &=(~M85XX_L2CTL_L2E_MSK);
  809.     vxL2CTLSet(l2CtlVal,M85XX_L2CTL(CCSBAR));
  810.     l2CtlVal &= ~M85XX_L2CTL_L2BLKSIZ_MSK;
  811.     l2CtlVal &= ~M85XX_L2CTL_L2SRAM_MSK;
  812.     if (both == TRUE)
  813.         {
  814.         /* Setup size of SRAM */
  815.         l2CtlVal |= (L2SIZ_256KB << M85XX_L2CTL_L2BLKSIZ_BIT) |
  816.                     (0x2 << M85XX_L2CTL_L2SRAM_BIT);
  817.         }
  818.     else
  819.         {
  820.         l2CtlVal |= (L2SIZ_512KB << M85XX_L2CTL_L2BLKSIZ_BIT) |
  821.                     (0x1 << M85XX_L2CTL_L2SRAM_BIT);
  822.         }
  823.     /* Setup L2CTL for SRAM */
  824.     vxL2CTLSet(l2CtlVal,M85XX_L2CTL(CCSBAR));
  825.     if (both == FALSE)
  826.         {
  827.         /* This is done here so L2SRAM is set before enable */
  828.         l2CtlVal |= M85XX_L2CTL_L2E_MSK; /* No cache so go ahead and enable */
  829.         /* Enable L2CTL for SRAM */
  830.         vxL2CTLSet(l2CtlVal,M85XX_L2CTL(CCSBAR));
  831.         }
  832.     }
  833. #endif /* INCLUDE_L2_SRAM */
  834. /**************************************************************************
  835. *
  836. * sysPhysMemTop - get the address of the top of physical memory
  837. *
  838. * This routine returns the address of the first missing byte of memory,
  839. * which indicates the top of memory.
  840. *
  841. * RETURNS: The address of the top of physical memory.
  842. *
  843. * ERRNO: N/A
  844. *
  845. * SEE ALSO: sysMemTop()
  846. */
  847. char * sysPhysMemTop (void)
  848.     {
  849.     if (physTop == NULL)
  850.         {
  851.         physTop = (char *)(LOCAL_MEM_LOCAL_ADRS + LOCAL_MEM_SIZE);
  852.         }
  853.     return(physTop) ;
  854.     }
  855. /***************************************************************************
  856. *
  857. * sysMemTop - get the address of the top of VxWorks memory
  858. *
  859. * This routine returns a pointer to the first byte of memory not
  860. * controlled or used by VxWorks.
  861. *
  862. * The user can reserve memory space by defining the macro USER_RESERVED_MEM
  863. * in config.h.  This routine returns the address of the reserved memory
  864. * area.  The value of USER_RESERVED_MEM is in bytes.
  865. *
  866. * RETURNS: The address of the top of VxWorks memory.
  867. *
  868. * ERRNO: N/A
  869. */
  870. char * sysMemTop (void)
  871.     {
  872.     if (memTop == NULL)
  873.         {
  874.         memTop = sysPhysMemTop () - USER_RESERVED_MEM;
  875. #ifdef INCLUDE_EDR_PM
  876.         /* account for ED&R persistent memory */
  877.         memTop = memTop - PM_RESERVED_MEM;
  878. #endif
  879.         }
  880.     return memTop;
  881.     }
  882. /**************************************************************************
  883. *
  884. * sysToMonitor - transfer control to the ROM monitor
  885. *
  886. * This routine transfers control to the ROM monitor.  Normally, it is called
  887. * only by reboot()--which services ^X--and bus errors at interrupt level.
  888. * However, in some circumstances, the user may wish to introduce a
  889. * <startType> to enable special boot ROM facilities.
  890. *
  891. * RETURNS: Does not return.
  892. *
  893. * ERRNO: N/A
  894. */
  895. int sysToMonitorExcMessage = 0;
  896. int sysToMonitorBacktrace = 1;
  897. int sysToMonitorReboot = 1;
  898. void (*sysToMonitorHook)(void);
  899. STATUS sysToMonitor
  900.     (
  901.     int startType   /* parameter passed to ROM to tell it how to boot */
  902.     )
  903.     {
  904. #if 0
  905.     FUNCPTR pRom = (FUNCPTR) (ROM_TEXT_ADRS + 4);   /* Warm reboot */
  906. #endif
  907.     if (sysToMonitorHook)
  908.         (*sysToMonitorHook)();
  909.     sysReboot();
  910. #if 0
  911.     intLock();
  912. #ifdef INCLUDE_BRANCH_PREDICTION
  913.     disableBranchPrediction();
  914. #endif /* INCLUDE_BRANCH_PREDICTION */
  915. #ifdef INCLUDE_CACHE_SUPPORT
  916.     cacheDisable(INSTRUCTION_CACHE);
  917.     cacheDisable(DATA_CACHE);
  918. #endif
  919.     sysClkDisable();
  920. #ifdef INCLUDE_AUX_CLK
  921.     sysAuxClkDisable();
  922. #endif
  923.     vxMsrSet(0);
  924.     /* Clear unnecessary TLBs */
  925.     mmuE500TlbDynamicInvalidate();
  926.     mmuE500TlbStaticInvalidate();
  927.     (*pRom) (startType);    /* jump to bootrom entry point */
  928. #endif
  929.     return(OK);    /* in case we ever continue from ROM monitor */
  930.     }
  931. /******************************************************************************
  932. *
  933. * sysHwInit2 - additional system configuration and initialization
  934. *
  935. * This routine connects system interrupts and does any additional
  936. * configuration necessary.
  937. *
  938. * RETURNS: N/A
  939. *
  940. * ERRNO: N/A
  941. */
  942. void sysHwInit2 (void)
  943.     {
  944. #ifdef  INCLUDE_VXBUS
  945.     vxbDevInit();
  946. #endif /* INCLUDE_VXBUS */
  947.     excIntConnect ((VOIDFUNCPTR *) _EXC_OFF_DECR,
  948.                    (VOIDFUNCPTR) sysClkInt);
  949.     sysClkRateSet(60);
  950.     sysClkEnable();
  951. #ifdef INCLUDE_AUX_CLK
  952.     excIntConnect ((VOIDFUNCPTR *) _EXC_OFF_FIT, (VOIDFUNCPTR) sysAuxClkInt);
  953. #endif
  954. #  if defined(INCLUDE_AUX_CLK)
  955.      /* initialize and start auxiliary clock support */
  956.      sysAuxClkEnable ();
  957. #  endif /* INCLUDE_AUX_CLK */
  958.     /*
  959.      * This was previously reqd for errata workaround #29, the workaround
  960.      * has been replaced with patch for spr99776, so it now serves as an
  961.      * example of implementing an l1 instruction parity handler
  962.      */
  963. #ifdef INCLUDE_L1_IPARITY_HDLR_INBSP
  964.     memcpy((void*)_EXC_OFF_L1_PARITY, (void *)jumpIParity, sizeof(INSTR));
  965.     cacheTextUpdate((void *)_EXC_OFF_L1_PARITY, sizeof(INSTR));
  966.     sysIvor1Set(_EXC_OFF_L1_PARITY);
  967.     cacheDisable(INSTRUCTION_CACHE);
  968.     vxL1CSR1Set(vxL1CSR1Get() | _PPC_L1CSR_CPE);
  969.     cacheEnable(INSTRUCTION_CACHE);
  970. #endif  /* INCLUDE_L1_IPARITY_HDLR_INBSP */
  971.     /* initialize the EPIC interrupts */
  972.     sysEpicIntrInit ();
  973.     /* initialize serial interrupts */
  974. #if defined(INCLUDE_DUART)
  975.     sysSerialHwInit2 ();
  976. #endif /* INCLUDE_DUART */
  977. #if     defined (INCLUDE_SPE)
  978.     _func_speProbeRtn = sysSpeProbe;
  979. #endif  /* INCLUDE_SPE */
  980. #ifdef INCLUDE_PCI
  981. #ifdef INCLUDE_GEI8254X_END
  982.     sysPciConfigEnable (CDS85XX_PCI_1_BUS);
  983.     pciConfigForeachFunc (0, FALSE, (PCI_FOREACH_FUNC) sys8254xDeviceCheck, (void *)&sysPci1SysNum);
  984. #ifdef INCLUDE_CDS85XX_PCIEX
  985. #ifdef INCLUDE_GEI8254X_END
  986.     sysPciConfigEnable (CDS85XX_PCIEX_BUS);
  987.     pciConfigForeachFunc (PCIEX_BUS_MIN + 1, FALSE, (PCI_FOREACH_FUNC) sys8254xDeviceCheck, (void *)&sysPci3SysNum);
  988. #endif /* INCLUDE_GEI8254X_END */
  989. #endif /* INCLUDE_CDS85XX_PCIEX */
  990. #endif /* INCLUDE_GEI8254X_END */
  991. #endif /* INCLUDE_PCI */
  992.     /* Configure GPIO */
  993.     * (VINT32 *) M85XX_GPOUTDR(CCSBAR) = 0x3;
  994.     * (VINT32 *) M85XX_GPIOCR(CCSBAR) = (1 << 17) | ( 1 << 16) | (1 << 9);
  995. #ifdef INCLUDE_SYSLED
  996.     sysLedOn();
  997. #endif 
  998. #ifdef INCLUDE_I2C_DEV
  999.     i2cDrvInit(0, MPC85XX_I2C_CONTROLLER);
  1000.     i2cDrvInit(1, MPC85XX_I2C_CONTROLLER);
  1001.     usrTimeSync();
  1002. #endif /* INCLUDE_I2C_DEV */
  1003. #ifdef  INCLUDE_VXBUS
  1004.     taskSpawn("devConnect",0,0,10000,vxbDevConnect,0,0,0,0,0,0,0,0,0,0);
  1005. #endif /* INCLUDE_VXBUS */
  1006.     }
  1007. /******************************************************************************
  1008. *
  1009. * sysProcNumGet - get the processor number
  1010. *
  1011. * This routine returns the processor number for the CPU board, which is
  1012. * set with sysProcNumSet().
  1013. *
  1014. * RETURNS: The processor number for the CPU board.
  1015. *
  1016. * ERRNO: N/A
  1017. *
  1018. * SEE ALSO: sysProcNumSet()
  1019. */
  1020. int sysProcNumGet (void)
  1021.     {
  1022.     return(sysProcNum);
  1023.     }
  1024. /******************************************************************************
  1025. *
  1026. * sysProcNumSet - set the processor number
  1027. *
  1028. * This routine sets the processor number for the CPU board.  Processor numbers
  1029. * should be unique on a single backplane.
  1030. *
  1031. * Not applicable for the bus-less 8260Ads.
  1032. *
  1033. * RETURNS: N/A
  1034. *
  1035. * ERRNO: N/A
  1036. *
  1037. * SEE ALSO: sysProcNumGet()
  1038. */
  1039. void sysProcNumSet
  1040.     (
  1041.     int     procNum         /* processor number */
  1042.     )
  1043.     {
  1044.     sysProcNum = procNum;
  1045.     }
  1046. /******************************************************************************
  1047. *
  1048. * sysLocalToBusAdrs - convert a local address to a bus address
  1049. *
  1050. * This routine gets the VMEbus address that accesses a specified local
  1051. * memory address.
  1052. *
  1053. * Not applicable for the 8260Ads
  1054. *
  1055. * RETURNS: ERROR, always.
  1056. *
  1057. * ERRNO: N/A
  1058. *
  1059. * SEE ALSO: sysBusToLocalAdrs()
  1060. */
  1061. STATUS sysLocalToBusAdrs
  1062.     (
  1063.     int     adrsSpace,  /* bus address space where busAdrs resides */
  1064.     char *  localAdrs,  /* local address to convert */
  1065.     char ** pBusAdrs    /* where to return bus address */
  1066.     )
  1067.     {
  1068.     *pBusAdrs = localAdrs;
  1069.     return(OK);
  1070.     }
  1071. /******************************************************************************
  1072. *
  1073. * sysBusToLocalAdrs - convert a bus address to a local address
  1074. *
  1075. * This routine gets the local address that accesses a specified VMEbus
  1076. * physical memory address.
  1077. *
  1078. * Not applicable for the 8260Ads
  1079. *
  1080. * RETURNS: ERROR, always.
  1081. *
  1082. * ERRNO: N/A
  1083. *
  1084. * SEE ALSO: sysLocalToBusAdrs()
  1085. */
  1086. STATUS sysBusToLocalAdrs
  1087.     (
  1088.     int     adrsSpace,  /* bus address space where busAdrs resides */
  1089.     char *  busAdrs,    /* bus address to convert */
  1090.     char ** pLocalAdrs  /* where to return local address */
  1091.     )
  1092.     {
  1093.     *pLocalAdrs = busAdrs;
  1094.     return(OK);
  1095.     }
  1096. #ifdef INCLUDE_PCI  /* board level PCI routines */
  1097. /*******************************************************************************
  1098. * sysPciConfigEnable -  enable PCI 1 or PCI 2 bus configuration
  1099. *
  1100. * This function enables PCI 1 or PCI 2 bus configuration
  1101. *
  1102. * RETURNS: N/A
  1103. *
  1104. * ERRNO: N/A
  1105. */
  1106. void sysPciConfigEnable
  1107.     (
  1108.     int pciHost
  1109.     )
  1110.     {
  1111.     int level;
  1112.     level = intLock ();
  1113.     if (pciHost == CDS85XX_PCI_2_BUS)
  1114.         {
  1115.         sysPciConfAddr = PCI2_CFG_ADR_REG;   /* PCI Configuration Address */
  1116.         sysPciConfData = PCI2_CFG_DATA_REG;  /* PCI Configuration Data */
  1117.         }
  1118.     else if (pciHost == CDS85XX_PCIEX_BUS)
  1119.         {
  1120.         sysPciConfAddr = PCIEX_CFG_ADR_REG;   /* PCI Configuration Address */
  1121.         sysPciConfData = PCIEX_CFG_DATA_REG;  /* PCI Configuration Data */
  1122.         }
  1123.     else /* default is for PCI 1 host */
  1124.         {
  1125.         sysPciConfAddr = PCI_CFG_ADR_REG;   /* PCI Configuration Address */
  1126.         sysPciConfData = PCI_CFG_DATA_REG;  /* PCI Configuration Data */
  1127.         }
  1128.     WRS_ASM("sync;eieio");
  1129.     intUnlock (level);
  1130.     }
  1131. /*******************************************************************************
  1132. *
  1133. * sysPciSpecialCycle - generate a special cycle with a message
  1134. *
  1135. * This routine generates a special cycle with a message.
  1136. *
  1137. * NOMANUAL
  1138. *
  1139. * RETURNS: OK
  1140. *
  1141. * ERRNO: N/A
  1142. */
  1143. STATUS sysPciSpecialCycle
  1144.     (
  1145.     int     busNo,
  1146.     UINT32  message
  1147.     )
  1148.     {
  1149.     int deviceNo    = 0x0000001f;
  1150.     int funcNo      = 0x00000007;
  1151.     if (pci_autoconfig_done) {
  1152.         if (busNo >= PCIEX_BUS_MIN) {
  1153.             busNo = busNo - PCIEX_BUS_MIN;
  1154.             sysPciConfigEnable(CDS85XX_PCIEX_BUS);
  1155.         } else {
  1156.             sysPciConfigEnable(CDS85XX_PCI_1_BUS);
  1157.         }
  1158.     }
  1159.  
  1160.     pciRegWrite ((UINT32 *)sysPciConfAddr,
  1161.                  (UINT32)pciConfigBdfPack (busNo, deviceNo, funcNo) |
  1162.                  0x80000000);
  1163.     PCI_OUT_LONG (sysPciConfData, message);
  1164.     return(OK);
  1165.     }
  1166. /*******************************************************************************
  1167. *
  1168. * sysPciConfigRead - read from the PCI configuration space
  1169. *
  1170. * This routine reads either a byte, word or a long word specified by
  1171. * the argument <width>, from the PCI configuration space
  1172. * This routine works around a problem in the hardware which hangs
  1173. * PCI bus if device no 12 is accessed from the PCI configuration space.
  1174. *
  1175. * NOMANUAL
  1176. *
  1177. * RETURNS: OK, or ERROR if this library is not initialized
  1178. *
  1179. * ERRNO: N/A
  1180. */
  1181. STATUS sysPciConfigRead
  1182.     (
  1183.     int busNo,    /* bus number */
  1184.     int deviceNo, /* device number */
  1185.     int funcNo,   /* function number */
  1186.     int offset,   /* offset into the configuration space */
  1187.     int width,    /* width to be read */
  1188.     void * pData /* data read from the offset */
  1189.     )
  1190.     {
  1191.     UINT8  retValByte = 0;
  1192.     UINT16 retValWord = 0;
  1193.     UINT32 retValLong = 0;
  1194.     STATUS retStat = ERROR;
  1195.     /* Set Default values of data */
  1196.     switch(width) {
  1197.         case 1:
  1198.             *((UINT8 *)pData) = 0xff;
  1199.             break;
  1200.         case 2:
  1201.             *((UINT16 *)pData) = 0xffff; 
  1202.             break;
  1203.         case 4:
  1204.             *((UINT32 *)pData) = 0xffffffff;
  1205.             break;
  1206.         default:
  1207.             return ERROR;
  1208.     }
  1209.  
  1210. #if defined(BCM_DEVICE_ON_PCIE) /* Skip device on PCI BUS */
  1211.     if  (0x1e == deviceNo) {
  1212.         return OK;
  1213.     }
  1214. #else
  1215. #endif
  1216.     if (pci_autoconfig_done) {
  1217.         if (busNo >= PCIEX_BUS_MIN) {
  1218.             if ((busNo > (PCIEX_BUS_MIN + 1)) || (deviceNo > 0))  {
  1219.                 return OK;
  1220.             }
  1221.             busNo = busNo - PCIEX_BUS_MIN;
  1222.             sysPciConfigEnable(CDS85XX_PCIEX_BUS);
  1223.         } else {
  1224.             sysPciConfigEnable(CDS85XX_PCI_1_BUS);
  1225.         }
  1226.     }
  1227.     
  1228.     /* This is for PCI Express */
  1229.     if ((sysPciConfAddr == PCIEX_CFG_ADR_REG) && (busNo > 0))
  1230.     {
  1231.          /* Read LTSSM state status register to make sure that the Link is ready */
  1232.          pciRegWrite ((UINT32 *)sysPciConfAddr,
  1233.                          (UINT32)pciConfigBdfPack (0, 0, 0) |
  1234.                          (0x404 & 0xfc) | 0x80000000 | ((0x404 & 0xf00) << 16));
  1235.           retValLong = PCI_IN_LONG (sysPciConfData);
  1236.           if (retValLong != 0x16) {
  1237.               /* Link training is not completed. Cannot read PCIE config 
  1238.                * space. */
  1239.               return OK;
  1240.           }
  1241.     }
  1242.     switch (width)
  1243.         {
  1244.         case 1: /* byte */
  1245.             pciRegWrite ((UINT32 *)sysPciConfAddr,
  1246.                          (UINT32)pciConfigBdfPack (busNo, deviceNo, funcNo) |
  1247.                          (offset & 0xffc) | 0x80000000 | ((offset & 0xf00) << 16)) ;
  1248.             retValByte = PCI_IN_BYTE (sysPciConfData + (offset & 0x3));
  1249.             *((UINT8 *)pData) = retValByte;
  1250.             retStat = OK;
  1251.             break;
  1252.         case 2: /* word */
  1253.             pciRegWrite ((UINT32 *)sysPciConfAddr,
  1254.                          (UINT32)pciConfigBdfPack (busNo, deviceNo, funcNo) |
  1255.                          (offset & 0xfc) | 0x80000000 | ((offset & 0xf00) << 16));
  1256.             retValWord = PCI_IN_WORD (sysPciConfData + (offset & 0x2));
  1257.             *((UINT16 *)pData) = retValWord;
  1258.             retStat = OK;
  1259.             break;
  1260.         case 4: /* long */
  1261.             pciRegWrite ((UINT32 *)sysPciConfAddr,
  1262.                          (UINT32)pciConfigBdfPack (busNo, deviceNo, funcNo) |
  1263.                          (offset & 0xfc) | 0x80000000 | ((offset & 0xf00) << 16));
  1264.             retValLong = PCI_IN_LONG (sysPciConfData);
  1265.             *((UINT32 *)pData) = retValLong;
  1266.             retStat = OK;
  1267.             break;
  1268.         default:
  1269.             retStat = ERROR;
  1270.             break;
  1271.         }
  1272.     return(retStat);
  1273.     }
  1274. /*******************************************************************************
  1275. *
  1276. * sysPciConfigWrite - write to the PCI configuration space
  1277. *
  1278. * This routine writes either a byte, word or a long word specified by
  1279. * the argument <width>, to the PCI configuration space
  1280. * This routine works around a problem in the hardware which hangs
  1281. * PCI bus if device no 12 is accessed from the PCI configuration space.
  1282. * Errata PCI-Express requires RMW to ensure always write 4byte aligned.
  1283. *
  1284. * NOMANUAL
  1285. *
  1286. * RETURNS: OK, or ERROR if this library is not initialized
  1287. *
  1288. * ERRNO: N/A
  1289. */
  1290. STATUS sysPciConfigWrite
  1291.     (
  1292.     int busNo,    /* bus number */
  1293.     int deviceNo, /* device number */
  1294.     int funcNo,   /* function number */
  1295.     int offset,   /* offset into the configuration space */
  1296.     int width,    /* width to write */
  1297.     ULONG data    /* data to write */
  1298.     )
  1299.     {
  1300.  /*
  1301.   * PCI-Express errata RMW workaround should work for all PCI
  1302.   * Requires always to do 4 byte read/write
  1303.   */
  1304.     ULONG data2,mask;
  1305.    /* Establish the required mask based on width and offset */
  1306.     switch(width)
  1307. {
  1308. case 1:
  1309.     mask=0xff;
  1310.     mask=~(mask << ((offset&0x3)*8));
  1311.     break;
  1312. case 2:
  1313.     mask=0xffff;
  1314.     mask=~(mask << ((offset&0x3)*8));
  1315.     break;
  1316. case 4:
  1317.     mask=0;
  1318.     break;
  1319. default:
  1320.     return(ERROR);
  1321. }
  1322.     if (pci_autoconfig_done) {
  1323.         if (busNo >= PCIEX_BUS_MIN) {
  1324.             /* busNo = busNo - PCIEX_BUS_MIN;*/
  1325.             sysPciConfigEnable(CDS85XX_PCIEX_BUS);
  1326.         } else {
  1327.             sysPciConfigEnable(CDS85XX_PCI_1_BUS);
  1328.         }
  1329.     }
  1330.     sysPciConfigRead(busNo,deviceNo,funcNo,(offset & ~0x3), 4, &data2);
  1331.     if (pci_autoconfig_done) {
  1332.         if (busNo >= PCIEX_BUS_MIN) {
  1333.             busNo = busNo - PCIEX_BUS_MIN;
  1334.             sysPciConfigEnable(CDS85XX_PCIEX_BUS);
  1335.         } else {
  1336.             sysPciConfigEnable(CDS85XX_PCI_1_BUS);
  1337.         }
  1338.     }
  1339.     data2 &= mask;
  1340.     data2 |= data << ((offset&0x3)*8); /* Overwite only part of word reqd */
  1341.     data = data2;             /* final 32 bit value to write */
  1342.     width = 4;                /* always do 32 bit write */
  1343.     offset = (offset & ~0x3); /* align by 32 bits */
  1344. #if 0
  1345.     if ((busNo == 0) && (deviceNo == 0x1f))
  1346.         return(ERROR);
  1347. #endif
  1348.     switch (width)
  1349.         {
  1350.         case 1: /* byte */
  1351.             pciRegWrite ((UINT32 *)sysPciConfAddr,
  1352.                          (UINT32)pciConfigBdfPack (busNo, deviceNo, funcNo) |
  1353.                          (offset & 0xfc) | 0x80000000 | ((offset & 0xf00) << 16));
  1354.             PCI_OUT_BYTE ((sysPciConfData + (offset & 0x3)), data);
  1355.             break;
  1356.         case 2: /* word */
  1357.             pciRegWrite ((UINT32 *)sysPciConfAddr,
  1358.                          (UINT32)pciConfigBdfPack (busNo, deviceNo, funcNo) |
  1359.                          (offset & 0xfc) | 0x80000000 | ((offset & 0xf00) << 16));
  1360.             PCI_OUT_WORD ((sysPciConfData + (offset & 0x2)), data);
  1361.             break;
  1362.         case 4: /* long */
  1363.             pciRegWrite ((UINT32 *)sysPciConfAddr,
  1364.                          (UINT32)pciConfigBdfPack (busNo, deviceNo, funcNo) |
  1365.                          (offset & 0xfc) | 0x80000000 | ((offset & 0xf00) << 16));
  1366.             PCI_OUT_LONG (sysPciConfData, data);
  1367.             break;
  1368.         default:
  1369.             return(ERROR);
  1370.         }
  1371.     return(OK);
  1372.     }
  1373. #endif /* INCLUDE_PCI */
  1374. /******************************************************************************
  1375. *
  1376. * sysUsDelay - delay at least the specified amount of time (in microseconds)
  1377. *
  1378. * This routine will delay for at least the specified amount of time using the
  1379. * lower 32 bit "word" of the Time Base register as the timer.
  1380. *
  1381. * NOTE:  This routine will not relinquish the CPU; it is meant to perform a
  1382. * busy loop delay.  The minimum delay that this routine will provide is
  1383. * approximately 10 microseconds.  The maximum delay is approximately the
  1384. * size of UINT32; however, there is no roll-over compensation for the total
  1385. * delay time, so it is necessary to back off two times the system tick rate
  1386. * from the maximum.
  1387. *
  1388. * RETURNS: N/A
  1389. *
  1390. * ERRNO: N/A
  1391. */
  1392. void sysUsDelay
  1393.     (
  1394.     UINT32    delay        /* length of time in microsec to delay */
  1395.     )
  1396.     {
  1397.     register UINT baselineTickCount;
  1398.     register UINT curTickCount;
  1399.     register UINT terminalTickCount;
  1400.     register int actualRollover = 0;
  1401.     register int calcRollover = 0;
  1402.     UINT ticksToWait;
  1403.     UINT requestedDelay;
  1404.     UINT oneUsDelay;
  1405.     /* Exit if no delay count */
  1406.     if ((requestedDelay = delay) == 0)
  1407.         return;
  1408.     /*
  1409.      * Get the Time Base Lower register tick count, this will be used
  1410.      * as the baseline.
  1411.      */
  1412.     baselineTickCount = sysTimeBaseLGet();
  1413.     /*
  1414.      * Calculate number of ticks equal to 1 microsecond
  1415.      *
  1416.      * The Time Base register and the Decrementer count at the same rate:
  1417.      * once per 8 System Bus cycles.
  1418.      *
  1419.      * e.g., 199999999 cycles     1 tick      1 second            25 ticks
  1420.      *       ----------------  *  ------   *  --------         ~  --------
  1421.      *       second               8 cycles    1000000 microsec    microsec
  1422.      */
  1423.     /* add to round up before div to provide "at least" */
  1424.     oneUsDelay = ((sysTimerClkFreq + 1000000) / 1000000);
  1425.     /* Convert delay time into ticks */
  1426.     ticksToWait = requestedDelay * oneUsDelay;
  1427.     /* Compute when to stop */
  1428.     terminalTickCount = baselineTickCount + ticksToWait;
  1429.     /* Check for expected rollover */
  1430.     if (terminalTickCount < baselineTickCount)
  1431.         {
  1432.         calcRollover = 1;
  1433.         }
  1434.     do
  1435.         {
  1436.         /*
  1437.          * Get current Time Base Lower register count.
  1438.          * The Time Base counts UP from 0 to
  1439.          * all F's.
  1440.          */
  1441.         curTickCount = sysTimeBaseLGet();
  1442.         /* Check for actual rollover */
  1443.         if (curTickCount < baselineTickCount)
  1444.             {
  1445.             actualRollover = 1;
  1446.             }
  1447.         if (((curTickCount >= terminalTickCount)
  1448.              && (actualRollover == calcRollover)) ||
  1449.             ((curTickCount < terminalTickCount)
  1450.              && (actualRollover > calcRollover)))
  1451.             {
  1452.             /* Delay time met */
  1453.             break;
  1454.             }
  1455.         }
  1456.     while (TRUE); /* breaks above when delay time is met */
  1457.     }
  1458. void sysMsDelay
  1459.     (
  1460.     UINT      delay                   /* length of time in MS to delay */
  1461.     )
  1462.     {
  1463.     sysUsDelay ( (UINT32) delay * 1000 );
  1464.     }
  1465. /*********************************************************************
  1466. *
  1467. * sysDelay - Fixed 1ms delay.
  1468. *
  1469. * This routine consumes 1ms of time. It just calls sysMsDelay.
  1470. *
  1471. * RETURNS: N/A
  1472. *
  1473. * ERRNO: N/A
  1474. */
  1475. void sysDelay (void)
  1476.     {
  1477.     sysMsDelay (1);
  1478.     }
  1479. /***************************************************************************
  1480. *
  1481. * sysIntConnect - connect the BSP interrupt to the proper epic/i8259 handler.
  1482. *
  1483. * This routine checks the INT level and connects the proper routine.
  1484. * pciIntConnect() or intConnect().
  1485. *
  1486. * RETURNS:
  1487. * OK, or ERROR if the interrupt handler cannot be built.
  1488. *
  1489. * ERRNO: N/A
  1490. */
  1491. STATUS sysIntConnect
  1492.     (
  1493.     VOIDFUNCPTR *vector,        /* interrupt vector to attach to     */
  1494.     VOIDFUNCPTR routine,        /* routine to be called              */
  1495.     int parameter               /* parameter to be passed to routine */
  1496.     )
  1497.     {
  1498.     int tmpStat = ERROR;
  1499.     UINT32 read;
  1500.     if (((int) vector < 0) || ((int) vector >= EXT_VEC_IRQ0 + EXT_MAX_IRQS))
  1501.         {
  1502.         logMsg ("Error in sysIntConnect: out of range vector = %d.n",
  1503.                 (int)vector,2,3,4,5,6);
  1504.         return(ERROR);
  1505.         }
  1506.     if (vxMemProbe ((char *) routine, VX_READ, 4, (char *) &read) != OK)
  1507.         {
  1508.         logMsg ("Error in sysIntConnect: Cannot access routine.n",
  1509.                 1,2,3,4,5,6);
  1510.         return(ERROR);
  1511.         }
  1512.     if ((int) vector < EXT_VEC_IRQ0)
  1513.         {
  1514.         tmpStat = intConnect (vector, routine, parameter);
  1515.         }
  1516.     else
  1517.         {
  1518.         /* 
  1519.  * call external int controller connect
  1520.          tmpStat = cascadeIntConnect (vector, routine, parameter);
  1521.  */
  1522.         }
  1523.     if (tmpStat == ERROR)
  1524.         {
  1525.         logMsg ("Error in sysIntConnect: Connecting vector = %d.n",
  1526.                 (int)vector,2,3,4,5,6);
  1527.         }
  1528.     return(tmpStat);
  1529.     }
  1530. /*******************************************************************************
  1531. *
  1532. * sysIntEnable - enable an interrupt
  1533. *
  1534. * This function call is used to enable an interrupt.
  1535. *
  1536. * RETURNS: OK or ERROR if unable to enable interrupt.
  1537. *
  1538. * ERRNO: N/A
  1539. */
  1540. STATUS sysIntEnable
  1541.     (
  1542.     int intNum
  1543.     )
  1544.     {
  1545.     int tmpStat = ERROR;
  1546.     if (((int) intNum < 0) || ((int) intNum >= EXT_NUM_IRQ0 + EXT_MAX_IRQS))
  1547.         {
  1548.         logMsg ("Error in sysIntEnable: Out of range intNum = %d.n",
  1549.                 (int)intNum,2,3,4,5,6);
  1550.         return(ERROR);
  1551.         }
  1552.     if ((int) intNum < EXT_NUM_IRQ0)
  1553.         {
  1554.         tmpStat = intEnable (intNum);
  1555.         }
  1556.     else
  1557.         {
  1558.         /* call external int controller connect */
  1559.         tmpStat = sysCascadeIntEnable (intNum - EXT_NUM_IRQ0);
  1560.         }
  1561.     if (tmpStat == ERROR)
  1562.         {
  1563.         logMsg ("Error in sysIntEnable: intNum = %d.n",
  1564.                 (int)intNum,2,3,4,5,6);
  1565.         }
  1566.     return(tmpStat);
  1567.     }
  1568. /****************************************************************************
  1569. *
  1570. * sysCascadeIntEnable - enable an external controller interrupt
  1571. *
  1572. * This function call is used to enable an interrupt outside of the MPC8540 PIC.
  1573. *
  1574. * RETURNS: OK or ERROR if unable to enable interrupt.
  1575. *
  1576. * ERRNO: N/A
  1577. */
  1578. STATUS sysCascadeIntEnable
  1579.     (
  1580.     int intNum
  1581.     )
  1582.     {
  1583.     return(ERROR);
  1584.     }
  1585. /****************************************************************************
  1586. *
  1587. * sysIntDisable - disable an interrupt
  1588. *
  1589. * This function call is used to disable an interrupt.
  1590. *
  1591. * RETURNS: OK or ERROR if unable to disable interrupt.
  1592. *
  1593. * ERRNO: N/A
  1594. */
  1595. STATUS sysIntDisable
  1596.     (
  1597.     int intNum
  1598.     )
  1599.     {
  1600.     int tmpStat = ERROR;
  1601.     if (((int) intNum < 0) || ((int) intNum >= EXT_NUM_IRQ0 + EXT_MAX_IRQS))
  1602.         {
  1603.         logMsg ("Error in sysIntDisable: Out of range intNum = %d.n",
  1604.                 (int)intNum,2,3,4,5,6);
  1605.         return(ERROR);
  1606.         }
  1607.     if ((int) intNum < EXT_NUM_IRQ0)
  1608.         {
  1609.         tmpStat = intDisable (intNum);
  1610.         }
  1611.     else
  1612.         {
  1613.         /* call external int controller connect */
  1614.         tmpStat = sysCascadeIntDisable (intNum - EXT_NUM_IRQ0);
  1615.         }
  1616.     if (tmpStat == ERROR)
  1617.         {
  1618.         logMsg ("Error in sysIntDisable: intNum = %d.n",
  1619.                 (int)intNum,2,3,4,5,6);
  1620.         }
  1621.     return(tmpStat);
  1622.     }
  1623. /**************************************************************************
  1624. *
  1625. * sysCascadeIntDisable - disable an external controller interrupt
  1626. *
  1627. * This function call is used to disable an interrupt outside of the MPC8540 PIC.
  1628. *
  1629. * RETURNS: OK or ERROR if unable to disable interrupt.
  1630. *
  1631. * ERRNO: N/A
  1632. */
  1633. STATUS sysCascadeIntDisable
  1634.     (
  1635.     int intNum
  1636.     )
  1637.     {
  1638.     return(ERROR);
  1639.     }
  1640. #ifdef INCLUDE_CACHE_SUPPORT
  1641. /***********************************************************************
  1642. *
  1643. * sysL1CacheQuery - configure L1 cache size and alignment
  1644. *
  1645. * Populates L1 cache size and alignment from configuration registers.
  1646. *
  1647. * RETURNS: N/A
  1648. *
  1649. * ERRNO: N/A
  1650. */
  1651. LOCAL void sysL1CacheQuery(void)
  1652.     {
  1653.     UINT32 temp;
  1654.     UINT32 align;
  1655.     UINT32 cachesize;
  1656.     temp = vxL1CFG0Get();
  1657.     cachesize = (temp & 0xFF) << 10;
  1658.     align = (temp >> 23) & 0x3;
  1659.     switch (align)
  1660.         {
  1661.         case 0:
  1662.             ppcE500CACHE_ALIGN_SIZE=32;
  1663.             break;
  1664.         case 1:
  1665.             ppcE500CACHE_ALIGN_SIZE=64;
  1666.             break;
  1667.         default:
  1668.             ppcE500CACHE_ALIGN_SIZE=32;
  1669.             break;
  1670.         }
  1671.     ppcE500DCACHE_LINE_NUM = (cachesize / ppcE500CACHE_ALIGN_SIZE);
  1672.     ppcE500ICACHE_LINE_NUM = (cachesize / ppcE500CACHE_ALIGN_SIZE);
  1673.     /*
  1674.      * The core manual suggests for a 32 byte cache line and 8 lines per set
  1675.      * we actually need 12 unique address loads to flush the set.
  1676.      * The number of lines to flush should be ( 3/2 * cache lines )
  1677.      */
  1678.     ppcE500DCACHE_LINE_NUM = (3*ppcE500DCACHE_LINE_NUM)>>1;
  1679.     ppcE500ICACHE_LINE_NUM = (3*ppcE500ICACHE_LINE_NUM)>>1;
  1680.     }
  1681. #endif /* INCLUDE_CACHE_SUPPORT */
  1682. /***************************************************************************
  1683. *
  1684. * saveExcMsg - write exception message to save area for catastrophic error
  1685. *
  1686. * The message will be displayed upon rebooting with a bootrom.
  1687. *
  1688. * RETURNS: N/A
  1689. *
  1690. * ERRNO: N/A
  1691. */
  1692. void saveExcMsg
  1693.     (
  1694.     char *errorMsg
  1695.     )
  1696.     {
  1697.     strcpy ((char *)EXC_MSG_OFFSET, errorMsg);
  1698.     }
  1699. void chipErrataCpu29Print(void)
  1700.     {
  1701.     saveExcMsg("Silicon fault detected, possible machine state corruption.nSystem rebooted to limit damage.");
  1702.     }
  1703. /***************************************************************************
  1704. *
  1705. * vxImmrGet - get the CPM DPRAM base address
  1706. *
  1707. * This routine returns the CPM DP Ram base address for CPM device drivers.
  1708. *
  1709. * RETURNS:
  1710. *
  1711. * ERRNO: N/A
  1712. */
  1713. UINT32 vxImmrGet(void)
  1714.     {
  1715.     return(CCSBAR + 0x80000);
  1716.     }
  1717. /***************************************************************************
  1718. *
  1719. * sysGetPeripheralBase   - Provides CCSRBAR address fro security engine
  1720. *                          drivers.
  1721. *
  1722. * RETURNS:
  1723. *
  1724. * ERRNO: N/A
  1725. */
  1726. UINT32 sysGetPeripheralBase()
  1727.     {
  1728.     return(CCSBAR);
  1729.     }
  1730. #if defined (_GNU_TOOL)
  1731. void sysIntHandler (void)
  1732.     {
  1733.     }
  1734. void vxDecInt (void)
  1735.     {
  1736.     }
  1737. int excRtnTbl = 0;
  1738. #endif  /* _GNU_TOOL */
  1739. #ifdef INCLUDE_SHOW_ROUTINES
  1740. /***************************************************************************
  1741. *
  1742. * coreLbcShow - Show routine for local bus controller
  1743. *
  1744. * This routine shows the local bus controller registers.
  1745. *
  1746. * RETURNS: N/A
  1747. *
  1748. * ERRNO: N/A
  1749. */
  1750. void coreLbcShow(void)
  1751.     {
  1752.     VINT32 tmp, tmp2;
  1753.     tmp = * (VINT32 *) M85XX_BR0(CCSBAR);
  1754.     tmp2 = * (VINT32 *) M85XX_OR0(CCSBAR);
  1755.     printf("Local bus BR0 = 0x%xtOR0 = 0x%xn", tmp, tmp2);
  1756.     tmp = * (VINT32 *) M85XX_BR1(CCSBAR);
  1757.     tmp2 = * (VINT32 *) M85XX_OR1(CCSBAR);
  1758.     printf("Local bus BR1 = 0x%xtOR1 = 0x%xn", tmp, tmp2);
  1759.     tmp = * (VINT32 *) M85XX_BR2(CCSBAR);
  1760.     tmp2 = * (VINT32 *) M85XX_OR2(CCSBAR);
  1761.     printf("Local bus BR2 = 0x%xtOR2 = 0x%xn", tmp, tmp2);
  1762.     tmp = * (VINT32 *) M85XX_BR3(CCSBAR);
  1763.     tmp2 = * (VINT32 *) M85XX_OR3(CCSBAR);
  1764.     printf("Local bus BR3 = 0x%xtOR3 = 0x%xn", tmp, tmp2);
  1765.     tmp = * (VINT32 *) M85XX_BR4(CCSBAR);
  1766.     tmp2 = * (VINT32 *) M85XX_OR4(CCSBAR);
  1767.     printf("Local bus BR4 = 0x%xtOR4 = 0x%xn", tmp, tmp2);
  1768.     tmp = * (VINT32 *) M85XX_BR5(CCSBAR);
  1769.     tmp2 = * (VINT32 *) M85XX_OR5(CCSBAR);
  1770.     printf("Local bus BR5 = 0x%xtOR5 = 0x%xn", tmp, tmp2);
  1771.     tmp = * (VINT32 *) M85XX_BR6(CCSBAR);
  1772.     tmp2 = * (VINT32 *) M85XX_OR6(CCSBAR);
  1773.     printf("Local bus BR6 = 0x%xtOR6 = 0x%xn", tmp, tmp2);
  1774.     tmp = * (VINT32 *) M85XX_BR7(CCSBAR);
  1775.     tmp2 = * (VINT32 *) M85XX_OR7(CCSBAR);
  1776.     printf("Local bus BR7 = 0x%xtOR7 = 0x%xn", tmp, tmp2);
  1777.     tmp = * (VINT32 *) M85XX_LBCR(CCSBAR);
  1778.     printf("Local bus LBCR = 0x%xn", tmp);
  1779.     tmp = * (VINT32 *) M85XX_LCRR(CCSBAR);
  1780.     printf("Local bus LCRR = 0x%xn", tmp);
  1781.     }
  1782.     #define xbit0(x, n)    ((x & (1 << (31 - n))) >> (31 - n))  /* 0..31 */
  1783.     #define xbit32(x, n)   ((x & (1 << (63 - n))) >> (63 - n))  /* 32..63 */
  1784.     #define onoff0(x, n)   xbit0(x, n) ? "ON", "OFF"
  1785.     #define onoff32(x, n)  xbit32(x, n) ? "ON", "OFF"
  1786. /***************************************************************************
  1787. *
  1788. * coreShow - Show routine for core registers
  1789. *
  1790. * This routine shows the core registers.
  1791. *
  1792. * RETURNS: N/A
  1793. *
  1794. * ERRNO: N/A
  1795. */
  1796. void coreShow(void)
  1797.     {
  1798.     VUINT32 tmp, tmp2;
  1799.     tmp = vxMsrGet();
  1800.     printf("MSR - 0x%xn", tmp);
  1801.     printf("      UCLE-%x SPE-%x WE-%x CE-%x EE-%x PR-%x ME-%xn",
  1802.            xbit32(tmp,37), xbit32(tmp,38), xbit32(tmp,45), xbit32(tmp,46),
  1803.            xbit32(tmp,48), xbit32(tmp,49), xbit32(tmp,51));
  1804.     printf("      UBLE-%x DE-%x IS-%x DS-%x PMM-%xn",
  1805.            xbit32(tmp,53), xbit32(tmp,54), xbit32(tmp,58), xbit32(tmp,59),
  1806.            xbit32(tmp,61));
  1807.     tmp = vxHid0Get();
  1808.     tmp2 = vxHid1Get();
  1809.     printf("HID0 = 0x%x, HID1 = 0x%xn", tmp, tmp2);
  1810.     tmp = vxL1CSR0Get();
  1811.     printf("L1CSR0: cache is %s - 0x%xn", tmp&1?"ON":"OFF", tmp);
  1812.     tmp = vxL1CSR1Get();
  1813.     printf("L1CSR1: Icache is %s - 0x%xn", tmp&1?"ON":"OFF", tmp);
  1814.     tmp = vxL1CFG0Get();
  1815.     tmp2 = vxL1CFG1Get();
  1816.     printf("L1CFG0 = 0x%x, L1CFG1 = 0x%xn", tmp, tmp2);
  1817.     tmp = *(VUINT32 *) (CCSBAR + 0x20000);
  1818.     printf("L2CTL - 0x%xn", tmp);
  1819.     printf("        l2 is %sn", tmp&0x80000000?"ON":"OFF");
  1820.     printf("        l2siz-%x l2blksz-%x l2do-%x l2io-%xn",
  1821.            (xbit0(tmp,2)<<1)|xbit0(tmp,3), (xbit0(tmp,4)<<1)|xbit0(tmp,5),
  1822.            xbit0(tmp,9), xbit0(tmp,10));
  1823.     printf("        l2pmextdis-%x l2intdis-%x l2sram-%xn",
  1824.            xbit0(tmp,11), xbit0(tmp,12),
  1825.            (xbit0(tmp,13)<<2)|(xbit0(tmp,14)<<1)|xbit0(tmp,15));
  1826.     tmp = *(VUINT32 *) (CCSBAR + 0x20100);
  1827.     tmp2 = *(VUINT32 *) (CCSBAR + 0x20108);
  1828.     printf("L2SRBAR0 - 0x%xn", tmp);
  1829.     printf("L2SRBAR1 - 0x%xn", tmp2);
  1830.     printf("Core Freq = %3d Hzn",coreFreq);
  1831.     printf("CCB Freq = %3d Hzn",sysClkFreqGet());
  1832.     printf("PCI Freq = %3d Hzn",OSCILLATOR_FREQ);
  1833.     printf("CPM Freq = %3d Hzn",sysClkFreqGet());
  1834.     }
  1835. #endif
  1836. int sysVectorIRQ0 = 0;
  1837. void
  1838. sysReboot(void)
  1839. {
  1840.     int level;
  1841.      level = intLock();
  1842.      * (VINT32 *) M85XX_GPOUTDR(CCSBAR) = ~0x0;
  1843.      * (VINT32 *) M85XX_GPIOCR(CCSBAR) = 0x200;
  1844.      * (VINT32 *) M85XX_GPOUTDR(CCSBAR) &= ~(BCM98548XMC_SYS_RESET);
  1845.      sysMsDelay(500); /* 500 ms delay */
  1846.      * (VINT32 *) M85XX_GPOUTDR(CCSBAR) &=
  1847.                          ~(BCM98548XMC_SYS_RESET| BCM98548XMC_CPU_RESET);
  1848.      for(;;);
  1849. }
  1850. UINT8 sysBoardRev()
  1851. {
  1852.     UINT8 board_id;
  1853.     board_id = 0;
  1854. #ifdef INCLUDE_I2C_DEV
  1855.     if (pcf8574_boardid_get(&board_id) == 0) {
  1856.         return board_id; 
  1857.     }
  1858. #endif
  1859.     return 0;
  1860. }
  1861. STATUS sysRtcGet (struct tm * time)
  1862. {
  1863.     int year, month, date, hour, min, sec;
  1864.     STATUS status;
  1865.  
  1866.     status = ERROR;
  1867. #ifdef INCLUDE_I2C_DEV
  1868.     status = m41t81_tod_get(&year, &month, &date, &hour, &min, &sec);
  1869.     if (status == 0) {
  1870.         time->tm_sec   = sec;
  1871.         time->tm_min   = min;
  1872.         time->tm_hour  = hour;
  1873.         time->tm_mday  = date;
  1874.         time->tm_mon   = month - 1;  /* POSIX needs 0-11 */ 
  1875.         time->tm_year  = year - 1900;
  1876.         time->tm_yday  = 0;          /* unknown */
  1877.         time->tm_isdst = 0;          /* unknown */
  1878.     }
  1879. #endif /* INCLUDE_I2C_DEV */
  1880.     return status;
  1881. }
  1882. void
  1883. pcieShow(int min_bus, int max_bus)
  1884. {
  1885. #define P_MIN_BUS       min_bus
  1886. #define P_MAX_BUS       max_bus
  1887. #define P_MAX_DEV       31
  1888. #define P_MAX_FUNC      0
  1889. #define P_MAX_OFFSET    (0x80 -1)
  1890. #define FOR_EACH_LOOP(curr_id, min_id, max_id, incr_id) 
  1891.         for(curr_id = min_id; curr_id <= max_id; curr_id += incr_id)
  1892.     int bus, devid, func, offset, val, dev_max;
  1893.     printf("BS DV FN OF VALUEn");
  1894.     FOR_EACH_LOOP(bus, P_MIN_BUS, P_MAX_BUS, 1) {
  1895.         dev_max = (bus < PCIEX_BUS_MIN) ? P_MAX_DEV : 0;
  1896.         FOR_EACH_LOOP(devid, 0, dev_max, 1) {
  1897.             FOR_EACH_LOOP(func, 0, P_MAX_FUNC, 1) {
  1898.                 FOR_EACH_LOOP(offset, 0, P_MAX_OFFSET, 4) {
  1899.                     pciConfigInLong(bus, devid, func, offset, &val);
  1900.                     if (val == 0xffffffff) {
  1901.                         break;
  1902.                     }
  1903.                     printf("%02d %02d %02d %02X %08Xn",
  1904.                                 bus, devid, func, offset, val);
  1905.                 }
  1906.             }
  1907.         }
  1908.     }
  1909. }
  1910. void sysPcieConfigShow()
  1911. {
  1912.     int busNo;
  1913.     int devNo;
  1914.     int funcNo;
  1915.     int data;
  1916.     int offset;
  1917.     busNo  = PCIEX_BUS_MIN + 0;
  1918.     devNo  = 0;
  1919.     funcNo = 0;
  1920.     sysPciConfigEnable (CDS85XX_PCIEX_BUS);
  1921.     for (offset = 0; offset <= 0x7c; offset = offset + 4) {
  1922.        if (sysPciConfigRead(busNo, devNo, funcNo, offset, 4, &data)== OK) {
  1923.            printf("offset 0x%08x = 0x%08xn", offset, data);
  1924.        } else {
  1925.            printf("sysPciConfigRead error.n");
  1926.            break;
  1927.        }
  1928.     }
  1929.     printf("PCI-E Extended Configuration Spacen");
  1930.     for (offset = 0x100; offset <= 0x134; offset = offset + 4) {
  1931.        if (sysPciConfigRead(busNo, devNo, funcNo, offset, 4, &data)== OK) {
  1932.            printf("offset 0x%08x = 0x%08xn", offset, data);
  1933.        } else {
  1934.            printf("sysPciConfigRead error.n");
  1935.            break;
  1936.        }
  1937.     }
  1938.     offset = 0x404;
  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 = 0x440;
  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 = 0x450;
  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 = 0x454;
  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 = 0x478;
  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 = 0x4b0;
  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 = 0x590;
  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.     offset = 0x5a0;
  1981.     if (sysPciConfigRead(busNo, devNo, funcNo, offset, 4, &data)== OK) {
  1982.        printf("offset 0x%08x = 0x%08xn", offset, data);
  1983.     } else {
  1984.        printf("sysPciConfigRead error offset 0x%08x.n", offset);
  1985.     }
  1986. }
  1987. static char * e500_ratio[] = {"reserved", "reserved", "1:1", "3:2",
  1988.                              "2:1", "5:2", "3:1", "7:2", "4:1", "9:2",
  1989.                              "reserved", "reserved", "reserved", "reserved",
  1990.                              "reserved", "reserved" };
  1991. static char * tsec_protocol[] = {"FIFO", "MII", "GMII", "TBI"};                        
  1992. static char * io_sel[] = {"reserved", "reserved", "reserved",
  1993.                           "x4 RIO 2.5Gbps, x4 PCI-E", 
  1994.                           "x4 RIO 1.25Gbps, x4 PCI-E", 
  1995.                           "x4 RIO 3.125Gbps", 
  1996.                           "x4 RIO 1.25Gbps", 
  1997.                           "x8 PCI-E"};
  1998. static char * if_mode[] = {"reserved", "10/100 Mbps MII/RMII",
  1999.                            "1000 Mbps GMII/TBI", "resvered"};
  2000. void sysPorStatShow()
  2001. {
  2002.     UINT reg;
  2003.     int  field; 
  2004.     
  2005.     reg = *M85XX_PORPLLSR(CCSBAR);
  2006.     field = (reg >> 16) & 0xf;
  2007.     printf("e500_ratio = %sn", e500_ratio[field]);
  2008.     field = (reg >> 15) & 1;
  2009.     printf("PCI1_clk_sel = %sn", field ? "SYS_CLK" : "PCI1_CLK");
  2010.     field = (reg >> 14) & 1;
  2011.     printf("PCI2_clk_sel = %sn", field ? "SYS_CLK" : "PCI2_CLK");
  2012.     field = (reg >> 1) & 0xf;
  2013.     printf("Plat_Ratio = %d : 1n", field);
  2014.     reg = *M85XX_PORBMSR(CCSBAR);
  2015.     field = (reg >> 31) & 1;
  2016.     printf("BCFG = %sn", field ? "CPU immediate boot" : "CPU wait to boot");
  2017.     reg = *M85XX_PORDEVSR(CCSBAR);
  2018.     field = (reg >> 31) & 1;
  2019.     printf("eTSEC1 and eTSEC2 in %s interface moden", 
  2020.            field ? "full" : "reduced");
  2021.     field = (reg >> 30) & 1;
  2022.     printf("eTSEC3 and eTSEC4 in %s interface moden",
  2023.            field ? "full" : "reduced");
  2024.     field = (reg >> 24) & 3;
  2025.     printf("eTSEC1 operates in %s moden", tsec_protocol[field]); 
  2026.     field = (reg >> 12) & 3;
  2027.     printf("eTSEC2 operates in %s moden", tsec_protocol[field]); 
  2028.     field = (reg >> 10) & 3;
  2029.     printf("eTSEC3 operates in %s moden", tsec_protocol[field]); 
  2030.     field = (reg >> 8) & 3;
  2031.     printf("eTSEC4 operates in %s moden", tsec_protocol[field]); 
  2032.     field = (reg >> 19) & 0xf;
  2033.     printf("%sn", io_sel[field]);
  2034.     reg = *M85XX_PORDEVSR2(CCSBAR);
  2035.     field = (reg >> 2) & 1;
  2036.     printf("Serdes %sn", field ? "enabled" : "disabled");
  2037. }
  2038. void extIsr(int id) {
  2039.     logMsg("Interrupt %dn", id, 0, 0, 0, 0, 0);
  2040. }
  2041. void installExtInt()
  2042. {
  2043.     sysEpicIntConnect((VOIDFUNCPTR *)(EXT_VEC_IRQ0 + 4), (VOIDFUNCPTR)extIsr, 4);
  2044.     sysEpicIntEnable((EXT_VEC_IRQ0 + 4));
  2045.     sysEpicIntConnect((VOIDFUNCPTR *)(EXT_VEC_IRQ0 + 5), (VOIDFUNCPTR)extIsr, 5);
  2046.     sysEpicIntEnable((EXT_VEC_IRQ0 + 5));
  2047.     sysEpicIntConnect((VOIDFUNCPTR *)(EXT_VEC_IRQ0 + 6), (VOIDFUNCPTR)extIsr, 6);
  2048.     sysEpicIntEnable((EXT_VEC_IRQ0 + 6));
  2049.     sysEpicIntConnect((VOIDFUNCPTR *)(EXT_VEC_IRQ0 + 7), (VOIDFUNCPTR)extIsr, 7);
  2050.     sysEpicIntEnable((EXT_VEC_IRQ0 + 7));
  2051.     sysEpicIntConnect((VOIDFUNCPTR *)(EXT_VEC_IRQ0 + 10), (VOIDFUNCPTR)extIsr, 10);
  2052.     sysEpicIntEnable((EXT_VEC_IRQ0 + 10));
  2053.     sysEpicIntConnect((VOIDFUNCPTR *)(EXT_VEC_IRQ0 + 11), (VOIDFUNCPTR)extIsr, 11);
  2054.     sysEpicIntEnable((EXT_VEC_IRQ0 + 11));
  2055. }
  2056. void gpoutSet(int pin, int val)
  2057. {
  2058.     int  key;
  2059.     UINT reg;
  2060.     key = intLock();
  2061.     reg = *M85XX_GPOUTDR(CCSBAR);
  2062.     if (val) {
  2063.         reg |= (0x80000000 >> pin);
  2064.     } else {
  2065.         reg &= ~(0x80000000 >> pin);
  2066.     } 
  2067.     *M85XX_GPOUTDR(CCSBAR) = reg;
  2068.     intUnlock(key);
  2069. }
  2070. void gpinGet()
  2071. {
  2072.     UINT reg;
  2073.     reg = *M85XX_GPINDR(CCSBAR);
  2074.     printf("PMC_EREADY = %dn", (reg & ( 1 << 16)) ? 1 : 0); 
  2075.     printf("~P4_PRST  = %dn", (reg & ( 1 << 17)) ? 1 : 0); 
  2076.     printf("~XMC_PRST = %dn", (reg & ( 1 << 18)) ? 1 : 0); 
  2077.     printf("FLASH_SEL = %dn", (reg & ( 1 << 19)) ? 1 : 0); 
  2078.     printf("XMC_ROOT0 = %dn", (reg & ( 1 << 20)) ? 1 : 0); 
  2079.     printf("PMC_MONARCH = %dn", (reg & ( 1 << 21)) ? 1 : 0); 
  2080.     printf("GPIO0 = %dn", (reg & ( 1 << 22)) ? 1 : 0); 
  2081.     printf("GPIN5 = %dn", (reg & ( 1 << 23)) ? 1 : 0); 
  2082.  
  2083. }
  2084. void autoconfig_done()
  2085. {
  2086.    printf("pci_autoconfig_done = %dn", pci_autoconfig_done);
  2087. }
  2088. void pcieLinkPoll()
  2089. {
  2090.     int poll_count;
  2091.     int data;
  2092.     for(poll_count=1; poll_count <=1000; poll_count++) {
  2093.         if (sysPciConfigRead(128, 0, 0, 0x404, 4, &data)== OK) {
  2094.             if (data != 0x16) {
  2095.                 printf("Link down on %d polln");
  2096.             }
  2097.         } else {
  2098.             printf("(sysPciConfigRead(128, 0, 0, 0x404, 4, &data) Failedn");
  2099.         }
  2100.     }
  2101. }
  2102. void sysTsecShow(int dev)
  2103. {
  2104.     UINT offset; 
  2105.     UINT maccfg1, maccfg2, ecntrl;
  2106.     int  field;
  2107.         offset = dev * 0x1000;
  2108.         maccfg1 = *M85XX_MACCFG1(CCSBAR + offset);
  2109.         maccfg2 = *M85XX_MACCFG2(CCSBAR + offset);
  2110.         ecntrl  = *M85XX_ECNTRL(CCSBAR + offset);
  2111.         printf("nPort %dn", dev);
  2112.         /* MACCFG 1 */
  2113.         printf("MACCFG1 = 0x%08xn", maccfg1);
  2114.   
  2115.         field = (maccfg1 >> 31) & 1;
  2116.         printf("Soft_Reset   = %dn", field);
  2117.         field = (maccfg1 >> 19) & 1;
  2118.         printf("Reset Rx MC  = %dn", field);
  2119.         field = (maccfg1 >> 18) & 1;
  2120.         printf("Reset Tx MC  = %dn", field);
  2121.         field = (maccfg1 >> 17) & 1;
  2122.         printf("Reset Rx Fun = %dn", field);
  2123.         field = (maccfg1 >> 16) & 1;
  2124.         printf("Reset Rx Fun = %dn", field);
  2125.         field = (maccfg1 >> 8) & 1;
  2126.         printf("Loopback     = %dn", field);
  2127.         field = (maccfg1 >> 5) & 1;
  2128.         printf("Rx_Flow      = %dn", field);
  2129.         field = (maccfg1 >> 4) & 1;
  2130.         printf("Tx_Flow      = %dn", field);
  2131.         field = (maccfg1 >> 3) & 1;
  2132.         printf("Sync'd Rx EN = %dn", field);
  2133.         field = (maccfg1 >> 2) & 1;
  2134.         printf("Rx_EN        = %dn", field);
  2135.         field = (maccfg1 >> 1) & 1;
  2136.         printf("Sync'd Tx EN = %dn", field);
  2137.         field = (maccfg1 >>  0) & 1;
  2138.         printf("Tx_EN        = %dn", field);
  2139.         /* MACCFG2 */
  2140.         printf("MACCFG2 = 0x%08xn", maccfg2);
  2141.         field = (maccfg2 >>  16) & 0xf;
  2142.         printf("Preamble     = %dn", field);
  2143.         field = (maccfg2 >>  8) & 3;
  2144.         printf("I/F Mode     = %sn", if_mode[field]);
  2145.         field = (maccfg2 >>  3) & 1;
  2146.         printf("MPEN         = %dn", field);
  2147.         field = (maccfg2 >>  2) & 1;
  2148.         printf("PAD/CRC      = %dn", field);
  2149.         field = (maccfg2 >>  1) & 1;
  2150.         printf("CRC EN       = %dn", field);
  2151.         field = (maccfg2 >>  0) & 1;
  2152.         printf("Full Duplex  = %dn", field);
  2153.         /* ECNTRL */
  2154.         printf("ECNTRL = 0x%08xn", ecntrl);
  2155.         field = (ecntrl >>  15) & 1;
  2156.         printf("FIFM         = %dn", field);
  2157.         field = (ecntrl >>  14) & 1;
  2158.         printf("CLRCNT       = %dn", field);
  2159.         field = (ecntrl >>  13) & 1;
  2160.         printf("AUTOZ        = %dn", field);
  2161.         field = (ecntrl >>  12) & 1;
  2162.         printf("STEN         = %dn", field);
  2163.         field = (ecntrl >>  6) & 1;
  2164.         printf("GMIIM        = %dn", field);
  2165.         field = (ecntrl >>  5) & 1;
  2166.         printf("TBIM         = %dn", field);
  2167.         field = (ecntrl >>  4) & 1;
  2168.         printf("RPM          = %dn", field);
  2169.         field = (ecntrl >>  3) & 1;
  2170.         printf("R100M        = %dn", field);
  2171.         field = (ecntrl >>  2) & 1;
  2172.         printf("RMM          = %dn", field);
  2173. }
  2174. void sysTsecSetup(int speed)
  2175. {
  2176.     UINT offset; 
  2177.     UINT maccfg2, ecntrl;
  2178.     int  dev;
  2179.     if (speed == 10 || speed == 100) {
  2180.         for (dev = 0; dev < 4; dev++) {
  2181.             offset = dev * 0x1000;
  2182.             maccfg2 = *M85XX_MACCFG2(CCSBAR + offset);
  2183.             maccfg2 &= ~0x300;
  2184.             maccfg2 |= 0x100;
  2185.             *M85XX_MACCFG2(CCSBAR + offset) = maccfg2;
  2186.             ecntrl = *M85XX_ECNTRL(CCSBAR + offset);
  2187.             ecntrl &= ~0x38;
  2188.             ecntrl |= (speed == 10) ? 0x10 : 0x18;
  2189.             *M85XX_ECNTRL(CCSBAR + offset) = ecntrl; 
  2190.         }
  2191.     }
  2192.     if (speed == 1000) {
  2193.         for (dev = 0; dev < 4; dev++) {
  2194.             offset = dev * 0x1000;
  2195.             maccfg2 = *M85XX_MACCFG2(CCSBAR + offset);
  2196.             maccfg2 &= ~0x300;
  2197.             maccfg2 |= 0x200;
  2198.             *M85XX_MACCFG2(CCSBAR + offset) = maccfg2;
  2199.             ecntrl = *M85XX_ECNTRL(CCSBAR + offset);
  2200.             ecntrl &= ~0x38;
  2201.             ecntrl |= 0x10;
  2202.             *M85XX_ECNTRL(CCSBAR + offset) = ecntrl; 
  2203.         }
  2204.  
  2205.     }
  2206. }
  2207. #ifdef INCLUDE_SYS_HW_INIT_0
  2208. IMPORT BOOL excExtendedVectors;
  2209. /***************************************************************************
  2210. *
  2211. * SYS_HW_INIT_0 - test for extended vectors
  2212. *
  2213. * This routine is used for testing extended vectors.
  2214. *
  2215. * RETURNS: N/A
  2216. *
  2217. * ERRNO
  2218. */
  2219. void SYS_HW_INIT_0 (void)
  2220.     {
  2221.     excExtendedVectors = TRUE;
  2222.     }
  2223. #endif  /* INCLUDE_SYS_HW_INIT_0 */