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

VxWorks

开发平台:

C/C++

  1. /* sysLib.c - IXP425 ixdp425 Emulator Board Specific routines */
  2. /* Copyright 2002 Wind River Systems, Inc. */
  3. #include "copyright_wrs.h"
  4. /*
  5. modification history
  6. --------------------
  7. 01l,23oct02,jb  Adding CS1 setup
  8. 01k,22oct02,jb  Changing to correct reserved memory name
  9. 01j,07oct02,jb  Fix print statement
  10. 01i,07oct02,jb  Remove IP address size change
  11. 01h,23sep02,jb  Changing sysPhysMemDesc to use LOCAL_MEM_SIZE
  12. 01g,18sep02,jb  Rename appinit
  13. 01f,19aug02,jb  Force redefines for ixe driver
  14. 01e,15aug02,jb  Enabling ixp425IfConfig
  15. 01d,01aug02,jb  Fixing sysToMonitor with ixe
  16. 01c,26jun02,jb  Adding ixp425 End support
  17. 01b,13jun02,jb  Fixing sysToMonitor
  18. 01a,05jun02,jb  initial version... from Peter
  19. */
  20. /*
  21. DESCRIPTION
  22. This library provides board-specific routines.
  23. INCLUDE FILES: sysLib.h
  24. SEE ALSO:
  25. .pG "Configuration"
  26. */
  27. /* includes */
  28. #include "vxWorks.h"
  29. #include "config.h"
  30. #include "stdio.h"
  31. #include "usrLib.h"
  32. #include "sysLib.h"
  33. #include "string.h"
  34. #include "intLib.h"
  35. #include "taskLib.h"
  36. #include "vxLib.h"
  37. #include "inetLib.h"
  38. #include "fioLib.h"
  39. #include "ctype.h"
  40. #include "logLib.h"
  41. #include "errnoLib.h"
  42. #include "bootLib.h"
  43. #include "vme.h"
  44. #include "in.h"
  45. #include "memLib.h"
  46. #include "cacheLib.h"
  47. #include "arch/arm/mmuArmLib.h"
  48. #include "arch/arm/cacheArmLib.h"
  49. #include "private/vmLibP.h"
  50. #include "debugutils.h"
  51. /* Source Drivers */
  52. #ifdef INCLUDE_FLASH
  53.     #include "mem/flashMem.c"
  54.     #ifdef USE_FLASH_STORAGE
  55.         #include "mem/nvRamToFlash.c"
  56.     #endif
  57. #endif /* INCLUDE_FLASH */
  58. #ifdef INCLUDE_EEPROM
  59.     #include "ixp425I2c.c"
  60.     #include "ixp425Eeprom.c"
  61. #endif /* INCLUDE_EEPROM */
  62. /* No non-volatile storage available */
  63. #if !defined(INCLUDE_FLASH) && !defined(INCLUDE_EEPROM)
  64.     #include "mem/nullNvRam.c"
  65. #endif
  66. #include "ixp425Gpio.c"
  67. #ifdef INCLUDE_PCI
  68.     #include "ixp425Pci.c"
  69.     #include "ixp425PciIntLib.c"
  70.     #include "ixp425PciConfigLib.c"
  71.     #include "ixp425PciConfigShow.c"
  72.     #ifdef INCLUDE_PCI_DMA
  73.         #include "ixp425PciDma.c"
  74.     #endif
  75. #endif
  76. #if defined(INCLUDE_END)
  77. #include "end.h"
  78. #if defined(INCLUDE_FEI82557END)
  79.     #include "sysEnd.c"
  80. STATUS sysLanPciInit (void);
  81. #ifdef IXDP_FEIEND_USE_NVRAM_IP
  82. #if defined(IXDP_FEI557_IP0_DEFAULT) && defined(IXDP_FEI557_IP1_DEFAULT) && defined(IXDP_FEI557_IP2_DEFAULT) && defined(IXDP_FEI557_IP3_DEFAULT)
  83. LOCAL char *defaultfeiInetAddr[IXP425_MAX_FEI_DEVS] =
  84.     {
  85.     IXDP_FEI557_IP0_DEFAULT,
  86.     IXDP_FEI557_IP1_DEFAULT,
  87.     IXDP_FEI557_IP2_DEFAULT,
  88.     IXDP_FEI557_IP3_DEFAULT,
  89.     };
  90. #endif /* All DEFAULTS */
  91. #endif /* IXDP_FEIEND_USE_NVRAM_IP */
  92. #endif /* INCLUDE_FEI82557END */
  93. #if defined(INCLUDE_IXETHACCEND)
  94. #include "IxEthAcc.h" /* Always include this */
  95. STATUS ixdp425EthEndMuxInit(void);
  96. STATUS ixdp425EthEndStartUp(void);
  97. #endif /* defined(INCLUDE_IXETHACCEND) */
  98. IMPORT int  ipAttach ();
  99. #endif /* INCLUDE_END */
  100. #include "ixdp425.h"
  101. /*
  102.  * Ixp425 Interrupt Controller Board Specifics. 
  103.  */
  104. /*
  105.  * This array maps interrupt levels to mask patterns.  The interrupt level
  106.  * is the index, the data is the mask value.  A mask bit enables one
  107.  * level.  The mask value is 'and'd with the ixp425IntLvlEnabled value
  108.  * before writing to the chip.
  109.  */
  110. #include "ixp425IntrCtl.h"
  111. LOCAL UINT32 ixp425IntLvlMask [IXP425_INT_NUM_LEVELS + 1] = /* int lvl mask */
  112.     {
  113.     0x0000,                             /* level 0, all disabled */
  114.     0x00000001, 0x00000003, 0x00000007, 0x0000000f,
  115.     0x0000001f, 0x0000003f, 0x0000007f, 0x000000ff,
  116.     0x000001ff, 0x000003ff, 0x000007ff, 0x00000fff,
  117.     0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff,
  118.     0x0001ffff, 0x0003ffff, 0x0007ffff, 0x000fffff,
  119.     0x001fffff, 0x003fffff, 0x007fffff, 0x00ffffff,
  120.     0x01ffffff, 0x03ffffff, 0x07ffffff, 0x0fffffff,
  121.     0x1fffffff, 0x3fffffff, 0x7fffffff, 0xffffffff,
  122.     /* level 32 all enabled */
  123.     };
  124. #if IXP425_INT_NUM_LEVELS != 32
  125.     #error ixp425IntLvlMask is wrong size for number of levels
  126. #endif  
  127. #include "ixp425IntrCtl.c"
  128. #include "ixp425Timer.c"
  129. #include "sysSerial.c"
  130. /* enable interrupts/fiqs on XScale */
  131. extern void sysEnableIRQMasks ();
  132. extern void sysToMonSwitchFlashRam();
  133. /* retrieve auto-sized memory */
  134. extern UINT32 sysPhysMemSize ();
  135. /* find a device using its string name */
  136. extern END_OBJ* endFindByName (char* pName, int unit);
  137. /* externals */
  138. IMPORT char end;                /* end of system, created by ld */
  139. IMPORT VOIDFUNCPTR _func_armIntStackSplit;  /* ptr to fn to split stack */
  140. IMPORT void sysIntStackSplit (char *, long);
  141. /* globals */
  142. /*
  143.  * The following structure describes the various different parts of the
  144.  * memory map to be used only during initialisation by
  145.  * vm(Base)GlobalMapInit() when INCLUDE_MMU_BASIC or INCLUDE_MMU_FULL are
  146.  * defined.
  147.  *
  148.  * The following are not the smallest areas that could be allocated for a
  149.  * working system.  If the amount of memory used by the page tables is
  150.  * critical, they could be reduced.
  151.  */
  152. #ifdef INCLUDE_MMU
  153. void *mmuPhysToVirt(void *physicalAddress);
  154. void *mmuVirtToPhys(void *virtualAddress);
  155. PHYS_MEM_DESC sysPhysMemDesc [] =
  156.     {
  157.     { /* Init Boot Code From Flash Bank 1 */
  158.         (void *) IXP425_SDRAM_BASE,       /* virtual address */
  159.         (void *) IXP425_SDRAM_BASE,       /* physical address */
  160.         LOCAL_MEM_SIZE,                  /* length, then initial state: */  /* Entire SDRAM space */
  161.         VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE | VM_STATE_MASK_BUFFERABLE,
  162.         VM_STATE_VALID  | VM_STATE_WRITABLE  | VM_STATE_CACHEABLE | VM_STATE_BUFFERABLE
  163.     },
  164.     { /* PCI Config space   */
  165.         (void *) IXP425_PCI_CONFIG_BASE ,                 /* virtual address */
  166.         (void *) IXP425_PCI_CONFIG_BASE,                  /* physical address */
  167.         SZ_4K ,                                           /* length, then initial state: */
  168.         VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE | VM_STATE_MASK_BUFFERABLE,
  169.         VM_STATE_VALID      | VM_STATE_WRITABLE      | VM_STATE_CACHEABLE_NOT  | VM_STATE_BUFFERABLE_NOT
  170.     },
  171.     { /* Expansion bus Register Block  */
  172.         (void *) IXP425_EXP_CONFIG_BASE ,             /* virtual address */
  173.         (void *) IXP425_EXP_CONFIG_BASE,              /* physical address */
  174.         SZ_4K,                        /* length, then initial state: */
  175.         VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE | VM_STATE_MASK_BUFFERABLE,
  176.         VM_STATE_VALID  | VM_STATE_WRITABLE  | VM_STATE_CACHEABLE_NOT  | VM_STATE_BUFFERABLE_NOT
  177.     },
  178.     { /* Peripheral Register Block  */
  179.         (void *) IXP425_PERIPHERAL_BASE ,             /* virtual address */
  180.         (void *) IXP425_PERIPHERAL_BASE,              /* physical address */
  181.         SZ_64K,                       /* length, then initial state: */
  182.         VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE | VM_STATE_MASK_BUFFERABLE,
  183.         VM_STATE_VALID  | VM_STATE_WRITABLE  | VM_STATE_CACHEABLE_NOT  | VM_STATE_BUFFERABLE_NOT
  184.     },
  185.     { /* QMgr Register Block  */
  186.         (void *) IXP425_QMGR_BASE ,           /* virtual address */
  187.         (void *) IXP425_QMGR_BASE,            /* physical address */
  188.         SZ_16K,                       /* length, then initial state: */
  189.         VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE | VM_STATE_MASK_BUFFERABLE,
  190.         VM_STATE_VALID  | VM_STATE_WRITABLE  | VM_STATE_CACHEABLE_NOT  | VM_STATE_BUFFERABLE_NOT
  191.     },
  192.     { /* SDRAM Config register space   */
  193.         (void *) IXP425_SDRAM_CONFIG_BASE ,                 /* virtual address */
  194.         (void *) IXP425_SDRAM_CONFIG_BASE,                  /* physical address */
  195.         SZ_4K ,                                            /* length, then initial state: */
  196.         VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE | VM_STATE_MASK_BUFFERABLE,
  197.         VM_STATE_VALID      | VM_STATE_WRITABLE      | VM_STATE_CACHEABLE_NOT  | VM_STATE_BUFFERABLE_NOT
  198.     },
  199. #ifdef INCLUDE_FAST_DRAM
  200.     { /* data cache fast dram option */
  201.       /* No external memory request is made, which means software can map any
  202.        * unallocated area of memory as data RAM. However, the line-allocate operation
  203.        * does validate the target address with the MMU, so system software must ensure
  204.        * that the memory has a valid descriptor in the page table.
  205.        */
  206.         (void *) FD_ORIGIN,               /* virtual address */
  207.         (void *) FD_ORIGIN,               /* physical address */
  208.         FD_MAX_SIZE,                  /* length (plus rounded-up), then initial state: */
  209.         VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE,
  210.         VM_STATE_VALID  | VM_STATE_WRITABLE  | VM_STATE_CACHEABLE
  211.     },
  212. #endif
  213.     { /* Flash Bank CS0 - Relocated base */
  214.         (void *) IXP425_EXPANSION_BUS_BASE2,          /* virtual address */
  215.         (void *) IXP425_EXPANSION_BUS_BASE2,          /* physical address */
  216.         SZ_16M,                   /* length, then initial state: */
  217.         VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE | VM_STATE_MASK_BUFFERABLE,
  218.         VM_STATE_VALID      | VM_STATE_WRITABLE      | VM_STATE_CACHEABLE_NOT  | VM_STATE_BUFFERABLE_NOT
  219.     },
  220.     { /* Chip Select 1 - CS1  */
  221.         (void *) IXP425_EXPANSION_BUS_CS1_BASE,              /* virtual address */
  222.         (void *) IXP425_EXPANSION_BUS_CS1_BASE,              /* physical address */
  223.         SZ_16M,                               /* length, then initial state: */
  224.         VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE | VM_STATE_MASK_BUFFERABLE,
  225.         VM_STATE_VALID      | VM_STATE_WRITABLE      | VM_STATE_CACHEABLE_NOT  | VM_STATE_BUFFERABLE_NOT
  226.     },
  227.     { /* Chip Select 2 - CS2  */
  228.         (void *) IXP425_EXPANSION_BUS_CS2_BASE,              /* virtual address */
  229.         (void *) IXP425_EXPANSION_BUS_CS2_BASE,              /* physical address */
  230.         SZ_16M,                               /* length, then initial state: */
  231.         VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE | VM_STATE_MASK_BUFFERABLE,
  232.         VM_STATE_VALID      | VM_STATE_WRITABLE      | VM_STATE_CACHEABLE_NOT  | VM_STATE_BUFFERABLE_NOT
  233.     },
  234.     { /* Chip Select 3 - CS3  */
  235.         (void *) IXP425_EXPANSION_BUS_CS3_BASE,              /* virtual address */
  236.         (void *) IXP425_EXPANSION_BUS_CS3_BASE,              /* physical address */
  237.         SZ_16M,                               /* length, then initial state: */
  238.         VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE | VM_STATE_MASK_BUFFERABLE,
  239.         VM_STATE_VALID      | VM_STATE_WRITABLE      | VM_STATE_CACHEABLE_NOT  | VM_STATE_BUFFERABLE_NOT
  240.     },
  241.     { /* Chip Select 4 - CS4  */
  242.         (void *) IXP425_EXPANSION_BUS_CS4_BASE,              /* virtual address */
  243.         (void *) IXP425_EXPANSION_BUS_CS4_BASE,              /* physical address */
  244.         SZ_16M,                               /* length, then initial state: */
  245.         VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE | VM_STATE_MASK_BUFFERABLE,
  246.         VM_STATE_VALID      | VM_STATE_WRITABLE      | VM_STATE_CACHEABLE_NOT  | VM_STATE_BUFFERABLE_NOT
  247.     },
  248.     { /* Chip Select 5 - CS5  */
  249.         (void *) IXP425_EXPANSION_BUS_CS5_BASE,              /* virtual address */
  250.         (void *) IXP425_EXPANSION_BUS_CS5_BASE,              /* physical address */
  251.         SZ_16M,                               /* length, then initial state: */
  252.         VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE | VM_STATE_MASK_BUFFERABLE,
  253.         VM_STATE_VALID      | VM_STATE_WRITABLE      | VM_STATE_CACHEABLE_NOT  | VM_STATE_BUFFERABLE_NOT
  254.     },
  255.     { /* Chip Select 6 - CS6  */
  256.         (void *) IXP425_EXPANSION_BUS_CS6_BASE,              /* virtual address */
  257.         (void *) IXP425_EXPANSION_BUS_CS6_BASE,              /* physical address */
  258.         SZ_16M,                               /* length, then initial state: */
  259.         VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE | VM_STATE_MASK_BUFFERABLE,
  260.         VM_STATE_VALID      | VM_STATE_WRITABLE      | VM_STATE_CACHEABLE_NOT  | VM_STATE_BUFFERABLE_NOT
  261.     },
  262.     { /* Chip Select 7 - CS7  */
  263.         (void *) IXP425_EXPANSION_BUS_CS7_BASE,              /* virtual address */
  264.         (void *) IXP425_EXPANSION_BUS_CS7_BASE,              /* physical address */
  265.         SZ_16M,                               /* length, then initial state: */
  266.         VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE | VM_STATE_MASK_BUFFERABLE,
  267.         VM_STATE_VALID      | VM_STATE_WRITABLE      | VM_STATE_CACHEABLE_NOT  | VM_STATE_BUFFERABLE_NOT
  268.     },
  269. #ifdef  INCLUDE_PCI
  270.     { /* PCI Memory,IO,Config   */
  271.         (void *) IXP425_PCI_BASE,              /* virtual address */
  272.         (void *) IXP425_PCI_BASE,              /* physical address */
  273.         IXP425_PCI_SP_SIZE,                    /* length, then initial state: */
  274.         VM_STATE_MASK_VALID | VM_STATE_MASK_WRITABLE | VM_STATE_MASK_CACHEABLE | VM_STATE_MASK_BUFFERABLE,
  275.         VM_STATE_VALID      | VM_STATE_WRITABLE      | VM_STATE_CACHEABLE_NOT  | VM_STATE_BUFFERABLE_NOT
  276.     },
  277. #endif
  278.     };
  279. int sysPhysMemDescNumEnt = NELEMENTS (sysPhysMemDesc);
  280. #endif /*  INCLUDE_MMU */
  281. int sysCpu       = CPU;     /* system CPU type */
  282. char *  sysBootLine = BOOT_LINE_ADRS;   /* address of boot line */
  283. char    sysBootHost [BOOT_FIELD_LEN];   /* name of host from which we booted */
  284. char    sysBootFile [BOOT_FIELD_LEN];   /* name of file from which we booted */
  285. int sysFlags;           /* boot flags */
  286. int sysProcNum = 0;         /* processor number of this CPU */
  287. /* Area used to flush D-cache */
  288. UINT32 sysCacheFlushReadArea[D_CACHE_SIZE/sizeof(UINT32)];
  289. /* Area used to flush mini-cache */
  290. UINT32 sysMinicacheFlushReadArea[MINI_CACHE_SIZE/sizeof(UINT32)];
  291. char    *sysExcMsg   = EXC_MSG_ADRS;    /* catastrophic message area */
  292. /* forward LOCAL function declarations */
  293. /* forward declarations */
  294. char *  sysPhysMemTop (void);
  295. /*** Init Routines ***/
  296. /******************************************************************************
  297. *
  298. * sysHwInit0 - Intialize _func_armVirtToPhys before sysHwInit is called
  299. *
  300. * This function initialises _func_armVirtToPhys and _func_armPhysToVirt
  301. * before sysHwInit is called. It is called from usrInit in bootConfig.c
  302. * before cacheLibInit is called.
  303. *
  304. * RETURNS: N/A
  305. */
  306. void sysHwInit0()
  307.     {
  308. #ifdef LOCAL_MEM_AUTOSIZE
  309.     int i;
  310. #endif
  311.     DEBUG_OUT_INIT;
  312.     ixp425GPIOReset();
  313.     DEBUG_OUT_VAL(INFO_CODE_10);
  314. #if defined(INCLUDE_CACHE_SUPPORT) || defined(INCLUDE_MMU)
  315.     /*
  316.      * Install the appropriate cache libary, using the our
  317.      * address translation routines.
  318.      */
  319.     cacheArmXSCALELibInstall(mmuPhysToVirt, mmuVirtToPhys);
  320. #endif
  321.     DEBUG_OUT_VAL(INFO_CODE_11);
  322. #ifdef INCLUDE_MMU
  323.     /* Install the appropriate MMU library and translation routines */
  324.     mmuArmXSCALELibInstall (mmuPhysToVirt, mmuVirtToPhys);
  325. #endif /* INCLUDE_MMU */
  326.     DEBUG_OUT_VAL(INFO_CODE_12);
  327. #ifdef LOCAL_MEM_AUTOSIZE
  328.     for (i = 0; i < sysPhysMemDescNumEnt; i++)
  329.         {
  330.         if ((sysPhysMemDesc[i].virtualAddr == (void *) IXP425_SDRAM_BASE_ADRS) &&
  331.             (sysPhysMemDesc[i].physicalAddr == (void *) IXP425_SDRAM_BASE_ADRS))
  332.             sysPhysMemDesc[i].len = sysPhysMemSize();
  333.         }
  334. #endif
  335.     DEBUG_OUT_VAL(INFO_CODE_13);
  336.     }
  337. /*******************************************************************************
  338. *
  339. * sysHwInit - initialise the CPU board hardware
  340. *
  341. * This routine initialises various features of the hardware.
  342. * Normally, it is called from usrInit() in usrConfig.c.
  343. *
  344. * NOTE: This routine should not be called directly by the user.
  345. *
  346. * RETURNS: N/A
  347. */
  348. void sysHwInit (void)
  349.     {
  350.     DEBUG_OUT_VAL(INFO_CODE_14);
  351.     /* Call back from the kernel for Interrupt stack setup */
  352.     _func_armIntStackSplit = sysIntStackSplit;
  353.     /* disable all interrupt sources */
  354.     IXP425_MASK_ALL_INTERRUPTS()
  355.     /* Make sure Expansion Bus CS1 is set */
  356.     *((unsigned long *) IXP425_EXP_CS0_REG) = IXDP425_FLASH_CS_SETTING_WR_EN;
  357.     *((unsigned long *) IXP425_EXP_CS1_REG) = IXDP425_FLASH_CS_SETTING_WR_EN;
  358.     *((unsigned long *) IXP425_EXP_CS2_REG) = IXDP425_FLASH_CS_SETTING_WR_EN;
  359.     /* If booted with visionClick, the bootline may be bad */
  360.     if ( strncmp("fei",BOOT_LINE_ADRS, 3) && strncmp("ixe",BOOT_LINE_ADRS, 3))
  361.         {
  362.         /* Not a valid bootline */
  363.         sysNvRamGet (BOOT_LINE_ADRS, BOOT_LINE_SIZE, 0);
  364.         if ( strncmp("fei",BOOT_LINE_ADRS, 3) && strncmp("ixe",BOOT_LINE_ADRS, 3))
  365.             /* bootline in 'nvram' not correct either, override with config.h */
  366.             bcopy(DEFAULT_BOOT_LINE, BOOT_LINE_ADRS, strlen(DEFAULT_BOOT_LINE) + 1);
  367.         }
  368.     DEBUG_OUT_VAL(INFO_CODE_15);
  369.     /* initialise the serial devices */
  370.     sysSerialHwInit ();
  371.     DEBUG_OUT_VAL(INFO_CODE_16);
  372. #ifdef INCLUDE_PCI
  373.     sysPciInit(); 
  374.     DEBUG_OUT_VAL(INFO_CODE_17);
  375.     sysPciAssignAddrs();
  376. #endif
  377.     DEBUG_OUT_VAL(INFO_CODE_18);
  378.     sysEnableIRQMasks ();
  379.     DEBUG_OUT_VAL(INFO_CODE_19);
  380.     }
  381. /*******************************************************************************
  382. *
  383. * sysHwInit2 - additional system configuration and initialisation
  384. *
  385. * This routine connects system interrupts and does any additional
  386. * configuration necessary.
  387. *
  388. * RETURNS: N/A
  389. *
  390. * NOMANUAL
  391. */
  392. void sysHwInit2 (void)
  393.     {
  394.     DEBUG_OUT_VAL(INFO_CODE_20);
  395.     /* Allocate vector table and init handlers */
  396.     intLibInit (IXP425_INT_NUM_LEVELS, IXP425_INT_NUM_LEVELS, IXP425_INT_MODE);
  397.     DEBUG_OUT_VAL(INFO_CODE_21);
  398.     /* initialise the interrupt controller */
  399.     ixp425IntDevInit ();
  400.     DEBUG_OUT_VAL(INFO_CODE_22);
  401.     /* connect serial interrupt */
  402.     sysSerialHwInit2 ();
  403.     DEBUG_OUT_VAL(INFO_CODE_23);
  404. #ifdef INCLUDE_PCI
  405.     /*connect the PCI interrupts*/
  406.     sysPciIntConnect();
  407.     DEBUG_OUT_VAL(INFO_CODE_24);
  408.     /*Enable the PCI interrupt*/
  409.     sysPciIntEnable();
  410. #endif
  411.     DEBUG_OUT_VAL(INFO_CODE_25);
  412. #if defined(INCLUDE_FEI82557END)
  413.     /* map FEI Ethernet PCI device memory and I/O addresses */
  414.     sysLanPciInit ();
  415. #endif /* INCLUDE_FEI82557END */
  416.     DEBUG_OUT_VAL(INFO_CODE_26);
  417. #if defined(INCLUDE_IXETHACCEND)
  418.     ixdp425EthEndMuxInit();
  419. #endif /* INCLUDE_IXETHACCEND */
  420.     DEBUG_OUT_VAL(INFO_CODE_27);
  421.     }
  422. /******************************************************************************
  423.  *
  424.  * ixdp425AppInit - final system configuration
  425.  *
  426.  * This routine is invoked after all other system initialisation has completed.
  427.  * It configures and enables any Ethernet interfaces other than the boot device
  428.  * and then invokes IXP425_APPL_INIT, which must be a valid C block.
  429.  *
  430.  */
  431. void
  432. ixdp425AppInit()
  433.     {
  434. #if defined(INCLUDE_FEI82557END) && defined(IXDP_FEIEND_USE_NVRAM_IP)
  435.     END_OBJ *pEnd;
  436.     UINT32 fei557EndMask;
  437.     UINT8 nvImage[NV_RAM_IF_SIZE+1];
  438.     UINT8 inetAddr[INET_ADDR_LEN];
  439.     UINT8 nameAndUnit[32];
  440.     UINT8 pNetDev[32];
  441.     UINT32 i=0;
  442.     char *colon;
  443.     int index,ipaddrOk;
  444.     /*If there are fei devices that are not already attached, we should
  445.       attach them here*/
  446.     /* Get a copy of the image from EEPROM/FLASH */
  447.     sysNvRamGet(nvImage, NV_RAM_IF_SIZE, NV_RAM_IF_START_OFFSET);
  448.     for (i=0;i<IXP425_MAX_FEI_DEVS;i++)
  449.         {
  450.         sprintf(pNetDev,"%s","fei");
  451.         sprintf(nameAndUnit,"%s%d","fei",i);
  452.         pEnd = endFindByName (pNetDev, i);
  453.         if (pEnd == NULL)
  454.             {
  455.             continue;
  456.             }
  457.         /*need to figure out if this has been configured already*/
  458.         if (ifAddrGet(nameAndUnit,inetAddr)==ERROR)
  459.             {
  460.             if (ipAttach(i, pNetDev) != OK)
  461.                 {
  462.                 logMsg ("Failed to attach to device %s, unit: %d",
  463.                         (int)pNetDev, i, 0, 0, 0, 0);
  464.                 continue;
  465.                 }
  466.             index = NV_IP_ADRS_PCIEND1 + i*SIZE_OF_IP_ADDRESS - NV_RAM_IF_START_OFFSET;
  467.             memcpy(inetAddr, &nvImage[index],SIZE_OF_IP_ADDRESS);
  468.             inetAddr[SIZE_OF_IP_ADDRESS]=0;
  469. #if defined(IXDP_FEI557_IP0_DEFAULT) && defined(IXDP_FEI557_IP1_DEFAULT) && defined(IXDP_FEI557_IP2_DEFAULT) && defined(IXDP_FEI557_IP3_DEFAULT)
  470. feiaddrRetry:
  471. #endif
  472.             ipaddrOk = 1;
  473.             /* See if there is a mask */
  474.             if ( (colon = strchr(inetAddr, ':')) )
  475.                 {
  476.                 *colon = 0;
  477.                 colon++;
  478.                 for(index = 0; index < 6; index++)
  479.                     {
  480.                     if( isxdigit(colon[index] == 0 ) )
  481.                         {
  482.                         printf("ixdp425AppInit: Invalid Mask for fei%d IP: %s:%s Discarding Maskn"
  483.                             ,i,inetAddr, colon);
  484.                         colon = NULL;
  485.                         break;
  486.                         }
  487.                     }
  488.                 if(colon != NULL)
  489.                     {
  490.                     sscanf(colon, "%x", &fei557EndMask);
  491.                     }
  492.                 }
  493.             /* Check to see if its a valid IP address */
  494.             for(index = 0; index < SIZE_OF_IP_ADDRESS; )
  495.                 {
  496.                 if ( !isdigit(inetAddr[index]) && inetAddr[index] != '.' )
  497.                     {
  498. #if defined(IXDP_FEI557_IP0_DEFAULT) && defined(IXDP_FEI557_IP1_DEFAULT) && defined(IXDP_FEI557_IP2_DEFAULT) && defined(IXDP_FEI557_IP3_DEFAULT)
  499.                         printf("ixdp425AppInit: Forcing Hard Coded IP Address for fei%dn",i);
  500.                         sprintf(inetAddr, "%s", defaultfeiInetAddr[i]);
  501.                         goto feiaddrRetry;
  502. #else
  503.                     ipaddrOk = 0;
  504.                     printf("ixdp425AppInit: Invalid Address for fei%d IP: %s Ignoringn",i,inetAddr);
  505.                     break;
  506. #endif
  507.                     }
  508.                 if ( inetAddr[++index] == 0 )
  509.                     break;
  510.                 }
  511.             if ( ipaddrOk )
  512.                 {
  513.                 ifAddrSet(nameAndUnit, inetAddr);
  514.                 if( colon != NULL )
  515.                     {
  516.                     ifMaskSet(nameAndUnit, fei557EndMask);
  517.                     printf("ixdp425AppInit: fei%d: IP Addr set to %s:%xn"
  518.                             ,i, inetAddr, fei557EndMask);
  519.                     }
  520.                 else
  521.                     {
  522.                     printf("ixdp425AppInit: fei%d: IP Addr set to %sn",i, inetAddr);
  523.                     }
  524.                 }
  525.             }
  526.         }
  527. #endif
  528. #if defined(INCLUDE_IXETHACCEND)
  529.     if ( ixdp425EthEndStartUp() != OK )
  530.         {
  531.         ;
  532.         }
  533. #endif /* INCLUDE_IXETHACCEND */
  534.     }
  535. /*******************************************************************************
  536. *
  537. * sysPhysMemTop - get the address of the top of physical memory
  538. *
  539. * This routine returns the address of the first missing byte of memory,
  540. * which indicates the top of memory.
  541. *
  542. * Normally, the user specifies the amount of physical memory with the
  543. * macro LOCAL_MEM_SIZE in config.h.  BSPs that support run-time
  544. * memory sizing do so only if the macro LOCAL_MEM_AUTOSIZE is defined.
  545. * If not defined, then LOCAL_MEM_SIZE is assumed to be, and must be, the
  546. * true size of physical memory.
  547. *
  548. * NOTE: Do not adjust LOCAL_MEM_SIZE to reserve memory for application
  549. * use. See sysMemTop() for more information on reserving memory.
  550. *
  551. * RETURNS: The address of the top of physical memory.
  552. *
  553. * SEE ALSO: sysMemTop()
  554. */
  555. char *sysPhysMemTop (void)
  556.     {
  557.     static char * physTop = NULL;
  558.     if (physTop == NULL)
  559.         {
  560. #ifdef LOCAL_MEM_AUTOSIZE
  561. /* auto-sizing is possible  */
  562.         physTop = (char *)(LOCAL_MEM_LOCAL_ADRS + sysPhysMemSize ());
  563. #else
  564. /* Don't do autosizing, if size is given */
  565.         physTop = (char *)(LOCAL_MEM_LOCAL_ADRS + LOCAL_MEM_SIZE);
  566. #endif /* LOCAL_MEM_AUTOSIZE */
  567.         }
  568.     return physTop;
  569.     }
  570. /*******************************************************************************
  571. *
  572. * sysMemTop - get the address of the top of memory
  573. *
  574. * This routine returns the address of the first missing byte of memory,
  575. * which indicates the top of memory.
  576. *
  577. * RETURNS: The address of the top of memory.
  578. */
  579. char *sysMemTop (void)
  580.     {
  581. #ifdef LOCAL_MEM_AUTOSIZE
  582. /* auto-sizing is possible  */
  583.     return((char *)LOCAL_MEM_LOCAL_ADRS + (sysPhysMemSize () - USER_RESERVED_MEM));
  584. #else
  585. /* Don't do autosizing, if size is given */
  586.     return((char *)LOCAL_MEM_LOCAL_ADRS + (LOCAL_MEM_SIZE - USER_RESERVED_MEM));
  587. #endif /* LOCAL_MEM_AUTOSIZE */
  588.     }
  589. /*******************************************************************************
  590. *
  591. * sysToMonitor - transfer control to the ROM monitor
  592. *
  593. * This routine transfers control to the ROM monitor.  It is usually called
  594. * only by reboot() -- which services ^X -- and bus errors at interrupt
  595. * level.  However, in some circumstances, the user may wish to introduce a
  596. * new <startType> to enable special boot ROM facilities.
  597. *
  598. * startType - passed to ROM to tell it how to boot
  599. *
  600. * RETURNS: Does not return.
  601. */
  602. STATUS sysToMonitor (int startType)
  603.     {
  604.     FUNCPTR pRom;
  605. #if defined(INCLUDE_END)
  606.     END_OBJ * pEnd;
  607.     UINT32      i;
  608. #endif  /* INCLUDE_END */
  609. #if defined(INCLUDE_END)
  610. #ifdef INCLUDE_FEI82557END
  611.     /*
  612.      * If the Ethernet driver were left alone, the controller chip might
  613.      * alter memory, so we stop the controller before jumping to the bootrom.
  614.      */
  615.     for (i = 0; i < IXP425_PCI_MAX_DEV; i++)
  616.         {
  617.         if ( (pEnd = endFindByName ("fei", i)) != NULL)
  618.             pEnd->pFuncTable->stop(pEnd->devObject.pDevice);
  619.         }
  620. #endif /* INCLUDE_FEI82557END */
  621. #ifdef INCLUDE_IXETHACCEND
  622.     for (i = 0; i < IX_ETH_ACC_NUMBER_OF_PORTS; i++)
  623.         {
  624.         if ( (pEnd = endFindByName ("ixe", i)) != NULL)
  625.             pEnd->pFuncTable->stop(pEnd->devObject.pDevice);
  626.         }
  627. #endif /* INCLUDE_IXETHACCEND */
  628. #endif  /* INCLUDE_END */
  629. #if defined(INCLUDE_SERIAL)
  630.     sysSerialReset ();  /* put serial devices into quiet state */
  631. #endif
  632.     sysClkDisable();
  633.     intIFLock ();
  634.     IXP425_MASK_ALL_INTERRUPTS()
  635. #ifdef INCLUDE_MMU
  636.     cacheArmXSCALEDClearDisable ();
  637.     cacheArmXSCALEIClearDisable ();
  638.     mmuArmXSCALETLBIDFlushAll ();
  639.     mmuArmXSCALEADisable ();
  640. #endif 
  641.     /* The problem at this point is that the ROM is mapped to 
  642.      * is alternate position and ram is at zero.
  643.      * We need to jump to an aliased version of the SDRAM.
  644.      * Then put the flash back to zero. 
  645.      * Then jump to the real ROM_TEXT_ADRS.
  646.      */
  647.     sysToMonSwitchFlashRam();
  648.     /* Now running on aliased memory and flash at 0 */
  649.     if (startType != BOOT_COLD)
  650.         pRom = (FUNCPTR) (0x1000 + 4);   /* warm boot */
  651.     else
  652.         pRom = (FUNCPTR) (0x1000);         /* cold boot */
  653.     (*pRom)(startType); /* jump to boot ROM */
  654.     return OK;      /* in case we ever continue from ROM monitor */
  655.     }
  656. /*** BSP Info Routines ***/
  657. /****************************************************************************
  658. *
  659. * sysProcNumGet - get the processor number
  660. *
  661. * This routine returns the processor number for the CPU board, which is
  662. * set with sysProcNumSet().
  663. *
  664. * RETURNS: The processor number for the CPU board.
  665. *
  666. * SEE ALSO: sysProcNumSet()
  667. */
  668. int sysProcNumGet (void)
  669.     {
  670.     return sysProcNum;
  671.     }
  672. /****************************************************************************
  673. *
  674. * sysProcNumSet - set the processor number
  675. *
  676. * Set the processor number for the CPU board.  Processor numbers should be
  677. * unique on a single backplane.
  678. *
  679. * NOTE
  680. * By convention, only processor 0 should dual-port its memory.
  681. *
  682. * RETURNS: N/A
  683. *
  684. * SEE ALSO: sysProcNumGet()
  685. */
  686. void sysProcNumSet
  687. (
  688. int procNum     /* processor number */
  689. )
  690.     {
  691.     sysProcNum = procNum;
  692.     }
  693. /*******************************************************************************
  694. *
  695. * sysModel - return the model name of the CPU board
  696. *
  697. * This routine returns the model name of the CPU board.
  698. *
  699. * RETURNS: A pointer to a string identifying the board and CPU.
  700. */
  701. char *sysModel (void)
  702.     {
  703.     return(BOARD_DESC);
  704.     }
  705. /*******************************************************************************
  706. *
  707. * sysBspRev - return the bsp version with the revision eg 1.1/<x>
  708. *
  709. * This function returns a pointer to a bsp version with the revision.
  710. * for eg. 1.1/<x>. BSP_REV is concatanated to BSP_VERSION to form the
  711. * BSP identification string.
  712. *
  713. * RETURNS: A pointer to the BSP version/revision string.
  714. */
  715. char * sysBspRev (void)
  716.     {
  717.     return(BSP_VERSION BSP_REV);
  718.     }
  719. /*******************************************************************************
  720. *
  721. * ixp425BoardRev - returns board revision
  722. *
  723. * RETURNS: the 4bit integer value contained in the board revision register
  724. */
  725. int ixp425BoardRev (void)
  726.     {
  727.     return(0x0); /* Return a dummy version for the simulator  */
  728.     }
  729. /* Wrappers */
  730. /********************************************************************************
  731. * sysIntDisable - disable an external interrupt level
  732. *
  733. * This routine disables a specified interrupt level.
  734. *
  735. * .nT
  736. *
  737. * RETURNS: OK, or ERROR if <intLevel> is out of range.
  738. *
  739. * SEE ALSO: sysIntEnable(),
  740. * .sA
  741. */
  742. STATUS sysIntDisable
  743. (
  744. int intLevel       /* interrupt level to disable */
  745. )
  746.     {
  747.     return(ixp425IntLvlDisable (intLevel)); /* see ixp425IntrCtl.c */
  748.     }
  749. /********************************************************************************
  750. * sysIntEnable - enable an interrupt level
  751. *
  752. * This routine enables a specified IXP425 interrupt level.
  753. *
  754. * .nT
  755. *
  756. * RETURNS: OK, or ERROR if <intLevel> is out of range.
  757. *
  758. * SEE ALSO: sysIntDisable(),
  759. * .sA
  760. */
  761. STATUS sysIntEnable
  762. (
  763. int intLevel       /* interrupt level to enable (1-31) */
  764. )
  765.     {
  766.     return(ixp425IntLvlEnable (intLevel)); /* see ixp425IntrCtl.c */
  767.     }
  768. /*******************************************************************************
  769. * sysFlashWriteEnable - enable  writes to flash 
  770. *
  771. * This routine enables the writes to cs0
  772. *
  773. * .nT
  774. *
  775. * RETURNS: N/A
  776. *
  777. * SEE ALSO: sysFlashWriteDisable(),
  778. * .sA
  779. */
  780. void sysFlashWriteEnable(void)
  781.     {
  782.     return;
  783.     }
  784. /*******************************************************************************
  785. * sysFlashWriteDisable - Disable  writes to flash 
  786. *
  787. * This routine Disable the writes to cs0
  788. *
  789. * .nT
  790. *
  791. * RETURNS: void 
  792. *
  793. * SEE ALSO: sysFlashWriteEnable(),
  794. * .sA
  795. */
  796. void sysFlashWriteDisable(void)
  797.     {
  798.     return;
  799.     }
  800. #define MAX_LINE        160 /* max line length for input to 'm' routine */
  801. #define MAX_ADR_SIZE  6 
  802. LOCAL STATUS modMac(UINT8* storage, char *inline)
  803.     {
  804.     UINT8 line[8];
  805.     UINT8 *pLine,*pInline = inline;
  806.     UINT32 value;           /* value found in line */
  807.     UINT8 excess;
  808.     UINT32 i;
  809.     for (i = 0; i < 6; i++)
  810.         {
  811.         bcopy(pInline, line,2);
  812.         line[2] = 0;
  813.         for (pLine = line; isspace ((int) *pLine); ++pLine) /* skip leading spaces*/
  814.             ;
  815.         if (*pLine == EOS)          /* skip field if just CR */
  816.             continue;
  817.         if (sscanf (pLine, "%x%1s", &value, &excess) != 1)
  818.             {
  819.             return ERROR;
  820.             }
  821.         storage[i]  = (UINT8)value;     /* assign new value */
  822.         pInline += 2;
  823.         if(*pInline == ':')
  824.             pInline++;
  825.         }
  826.     return OK;
  827.     }
  828. /*****************************************************************************
  829.  * ixdp425IfConfig - configure MAC and IP addresses of all ethernet interfaces
  830.  *
  831.  * This routine permits the programming of all ethernet MAC addresses along
  832.  * with the specification of the IP address to be associated with a
  833.  * given interface.
  834.  *
  835.  * RETURNS: OK or ERROR
  836.  *
  837.  */
  838. STATUS ixdp425IfConfig(void)
  839.     {
  840.     UINT32 i;
  841.     UINT32 changed = 0;
  842.     UINT8 nvImage[NV_RAM_IF_SIZE+1];
  843.     UINT32 index;
  844.     char *colon;
  845. #if defined(INCLUDE_IXETHACCEND)
  846.     UINT8 macAddr[IX_ETH_ACC_NUMBER_OF_PORTS][SIZE_OF_MAC_ADDRESS+1];
  847.     UINT8 inetAddr[IX_ETH_ACC_NUMBER_OF_PORTS][SIZE_OF_IP_ADDRESS+1];
  848. #endif /* INCLUDE_IXETHACCEND */
  849. #if defined(INCLUDE_PCI) && defined(INCLUDE_FEI82557END) && defined(IXDP_FEIEND_USE_NVRAM_IP)
  850.     UINT8 inetAddrPci[IXP425_MAX_FEI_DEVS][SIZE_OF_IP_ADDRESS+1];
  851. #endif /* INCLUDE_PCI && INCLUDE_FEI82557END && IXDP_FEIEND_USE_NVRAM_IP */
  852.     UINT8 line[256];
  853.     sysNvRamGet(nvImage, NV_RAM_IF_SIZE, NV_RAM_IF_START_OFFSET);
  854. #if defined(INCLUDE_IXETHACCEND)
  855.     bzero((char *)inetAddr, sizeof(inetAddr));
  856.     bzero((char *)macAddr, sizeof(macAddr));
  857. #endif /* INCLUDE_IXETHACCEND */
  858. #if defined(INCLUDE_PCI) && defined(INCLUDE_FEI82557END) && defined(IXDP_FEIEND_USE_NVRAM_IP)
  859.     bzero((char *)inetAddrPci, sizeof(inetAddrPci));
  860. #endif /* INCLUDE_PCI && INCLUDE_FEI82557END && IXDP_FEIEND_USE_NVRAM_IP */
  861. #if defined(INCLUDE_IXETHACCEND)
  862.     /* Transfer to individual arrays */
  863.     for (i=0;i<IX_ETH_ACC_NUMBER_OF_PORTS; i++)
  864.         {
  865.         /* Get MAC address */
  866.         index = (NV_MAC_ADRS_NPE1 + i*SIZE_OF_MAC_ADDRESS) - NV_RAM_IF_START_OFFSET;
  867.         memcpy(macAddr[i], &nvImage[index],SIZE_OF_MAC_ADDRESS);
  868.         /* Get IP address */
  869.         index = NV_IP_ADRS_NPE1 + i*SIZE_OF_IP_ADDRESS - NV_RAM_IF_START_OFFSET;
  870.         memcpy(inetAddr[i], &nvImage[index],SIZE_OF_IP_ADDRESS);
  871.         inetAddr[i][SIZE_OF_IP_ADDRESS]=0;
  872.         }
  873. #endif /* INCLUDE_IXETHACCEND */
  874. #if defined(INCLUDE_PCI) && defined(INCLUDE_FEI82557END) && defined(IXDP_FEIEND_USE_NVRAM_IP)
  875.     /*PCI END IP addresses*/
  876.     for (i=0;i<IXP425_MAX_FEI_DEVS;i++)
  877.         {
  878.         index = NV_IP_ADRS_PCIEND1 + i*SIZE_OF_IP_ADDRESS - NV_RAM_IF_START_OFFSET;
  879.         memcpy(inetAddrPci[i], &nvImage[index],SIZE_OF_IP_ADDRESS);
  880.         inetAddrPci[i][SIZE_OF_IP_ADDRESS]=0;
  881.         }
  882. #endif /* INCLUDE_PCI && INCLUDE_FEI82557END && IXDP_FEIEND_USE_NVRAM_IP */
  883.     while(TRUE)
  884.         {
  885.         printf("n");
  886.     /* Display the values */
  887. #if defined(INCLUDE_IXETHACCEND)
  888.         for (i=0;i<IX_ETH_ACC_NUMBER_OF_PORTS; i++)
  889.             {
  890.             printf("ixe%d MAC address: %02x:%02x:%02x:%02x:%02x:%02x n",i, macAddr[i][0], macAddr[i][1],
  891.                    macAddr[i][2], macAddr[i][3], macAddr[i][4], macAddr[i][5]);
  892.             }
  893.         printf("n");
  894.         for (i=0;i<IX_ETH_ACC_NUMBER_OF_PORTS; i++)
  895.             {
  896.             printf("ixe%d IP address: %s  n",i,inetAddr[i]);
  897.             }
  898. #endif /* INCLUDE_IXETHACCEND */
  899. #if defined(INCLUDE_PCI) && defined(INCLUDE_FEI82557END) && defined(IXDP_FEIEND_USE_NVRAM_IP)
  900.         printf("n");
  901.         for (i=0;i<IXP425_MAX_FEI_DEVS;i++)
  902.             {
  903.             printf("fei%d IP address: %sn",i,inetAddrPci[i]);
  904.             }
  905. #endif /* INCLUDE_PCI && INCLUDE_FEI82557END && IXDP_FEIEND_USE_NVRAM_IP */
  906.         printf("nAny Changes (y/n)> ");
  907.         fioRdString (STD_IN, line, MAX_LINE);        
  908.         if (line[0] != 'y')
  909.             break;
  910. #if defined(INCLUDE_IXETHACCEND)
  911.         printf("nChange a MAC address (y/n)> ");
  912.         fioRdString (STD_IN, line, MAX_LINE);        
  913.         if (line[0] == 'y')
  914.             {
  915.             /*NPE MACs next*/
  916.             for (i=0;i<IX_ETH_ACC_NUMBER_OF_PORTS; )
  917.                 {
  918.                 printf("ixe%d MAC address: %02x:%02x:%02x:%02x:%02x:%02x ",i, macAddr[i][0], macAddr[i][1],
  919.                        macAddr[i][2], macAddr[i][3], macAddr[i][4], macAddr[i][5]);
  920.                 fioRdString (STD_IN, line, MAX_LINE);        
  921.                 if (line[0] == '-')
  922.                     {
  923.                     if (i > 0)
  924.                         i--;
  925.                     continue;
  926.                     }
  927.                 if (line[0] != 0 )
  928.                     {
  929.                     if (modMac(macAddr[i], line)==OK)
  930.                         {
  931.                         index = (NV_MAC_ADRS_NPE1 + i*SIZE_OF_MAC_ADDRESS) - NV_RAM_IF_START_OFFSET;
  932.                         memcpy(&nvImage[index], macAddr[i], 6);
  933.                         changed++;
  934.                         }
  935.                      else
  936.                         {
  937.                         printf("Invalid entry, changes discardedn");
  938.                         continue;
  939.                         }
  940.                     }
  941.                 i++;
  942.                 }
  943.             }
  944.         printf("nChange ixe IP address (y/n)> ");
  945.         fioRdString (STD_IN, line, MAX_LINE);        
  946.         if (line[0] == 'y')
  947.             {
  948.             /*NPE IP addresses*/
  949.             for (i=0;i<IX_ETH_ACC_NUMBER_OF_PORTS;)
  950.                 {
  951.                 printf("ixe%d IP address: %s  ",i,inetAddr[i]);
  952.                 fioRdString (STD_IN, line, MAX_LINE);        
  953.                 if (line[0] == '-')
  954.                     {
  955.                     if (i > 0)
  956.                         i--;
  957.                     continue;
  958.                     }
  959.                 if (line[0] != 0 )
  960.                     {
  961.                     bzero(inetAddr[i], SIZE_OF_IP_ADDRESS);
  962.                         /* Do not save "0x" in the mask */
  963.                     if ( (colon = strchr(line, ':')) )
  964.                         {
  965.                         colon++;
  966.                         if(strncmp("0x",colon, 2) == 0)
  967.                             sprintf(colon, "%s", colon+2);
  968.                         }
  969.                     memcpy(inetAddr[i],line, strlen(line));       
  970.                     changed++;
  971.                     }
  972.                 i++;
  973.                 }
  974.             }
  975. #endif /* INCLUDE_IXETHACCEND */
  976. #if defined(INCLUDE_PCI) && defined(INCLUDE_FEI82557END) && defined(IXDP_FEIEND_USE_NVRAM_IP)
  977.         printf("nChange fei IP address (y/n)> ");
  978.         fioRdString (STD_IN, line, MAX_LINE);        
  979.         if (line[0] == 'y')
  980.             {
  981.             /*PCI END IP addresses*/
  982.             for (i=0;i<IXP425_MAX_FEI_DEVS;)
  983.                 {
  984.                 printf("fei%d IP address: %s  ",i,inetAddrPci[i]);
  985.                 fioRdString (STD_IN, line, MAX_LINE);        
  986.                 if (line[0] == '-')
  987.                     {
  988.                     if (i > 0)
  989.                         i--;
  990.                     continue;
  991.                     }
  992.                 if (line[0] != 0 )
  993.                     {
  994.                     bzero(inetAddrPci[i], SIZE_OF_IP_ADDRESS);
  995.                         /* Do not save "0x" in the mask */
  996.                     if ( (colon = strchr(line, ':')) )
  997.                         {
  998.                         colon++;
  999.                         if(strncmp("0x",colon, 2) == 0)
  1000.                             sprintf(colon, "%s", colon+2);
  1001.                         }
  1002.                     memcpy(inetAddrPci[i],line, strlen(line));       
  1003.                     changed++;
  1004.                     }
  1005.                 i++;
  1006.                 }
  1007.             }
  1008. #endif /* INCLUDE_PCI && INCLUDE_FEI82557END && IXDP_FEIEND_USE_NVRAM_IP */
  1009.         }
  1010.     if( changed != 0 )
  1011.         {
  1012.         printf("nWriting interface data to non-volatile storage...n");
  1013. #if defined(INCLUDE_IXETHACCEND)
  1014.         /* Move data back to serial array */
  1015.         for (i=0;i<IX_ETH_ACC_NUMBER_OF_PORTS; i++)
  1016.             {
  1017.             /* Get MAC address */
  1018.             index = (NV_MAC_ADRS_NPE1 + i*SIZE_OF_MAC_ADDRESS) - NV_RAM_IF_START_OFFSET;
  1019.             memcpy(&nvImage[index], macAddr[i],SIZE_OF_MAC_ADDRESS);
  1020.             /* Get IP address */
  1021.             index = NV_IP_ADRS_NPE1 + i*SIZE_OF_IP_ADDRESS - NV_RAM_IF_START_OFFSET;
  1022.             memcpy(&nvImage[index], inetAddr[i],SIZE_OF_IP_ADDRESS);
  1023.             }
  1024. #endif /* INCLUDE_IXETHACCEND */
  1025. #if defined(INCLUDE_PCI) && defined(INCLUDE_FEI82557END) && defined(IXDP_FEIEND_USE_NVRAM_IP)
  1026.         /*PCI END IP addresses*/
  1027.         for (i=0;i<IXP425_MAX_FEI_DEVS;i++)
  1028.             {
  1029.             index = NV_IP_ADRS_PCIEND1 + i*SIZE_OF_IP_ADDRESS - NV_RAM_IF_START_OFFSET;
  1030.             memcpy(&nvImage[index], inetAddrPci[i], SIZE_OF_IP_ADDRESS);
  1031.             }
  1032. #endif /* INCLUDE_PCI && INCLUDE_FEI82557END && IXDP_FEIEND_USE_NVRAM_IP */
  1033.         if ( sysNvRamSet(nvImage,NV_RAM_IF_SIZE,NV_RAM_IF_START_OFFSET) == ERROR)
  1034.             {
  1035.             puts("Error writing interface data to non-volatile storage");
  1036.             return ERROR;
  1037.             }
  1038.         printf("New configuration written, changes will take effect after a rebootn");
  1039.         }
  1040.     return OK;
  1041.     }
  1042. /*****************************************************************************
  1043.  * sysMicroDelay - Microsecond delay
  1044.  *
  1045.  * RETURNS: N/A
  1046.  *
  1047.  */
  1048. void sysMicroDelay(int microseconds)
  1049.     {
  1050.     UINT32 delay = 0;
  1051.     UINT32 lastTimestamp = *((volatile int *)IXP425_OSTS);
  1052.     UINT32 currentTimestamp;
  1053.     UINT32 delta;
  1054.     while (delay < microseconds * IXP425_PERIPHERAL_BUS_CLOCK)
  1055.         {
  1056.         currentTimestamp = *((volatile int *)IXP425_OSTS);
  1057.         delta = currentTimestamp > lastTimestamp ? currentTimestamp - lastTimestamp : 0xffffffff - lastTimestamp + currentTimestamp;
  1058.         delay += delta;
  1059.         lastTimestamp = currentTimestamp;
  1060.         }
  1061.     }
  1062. #ifdef INCLUDE_IXP425_UART_DEBUG
  1063. void serialLog (char *pMsg, UINT32 nValue);
  1064. void serialStringOut (char *pMsg);
  1065. void serialMemDump (UINT32 *addr, UINT32 size);
  1066. void serialHexOut (UINT32 value);
  1067. void serialHexDig (UINT8 value);
  1068. void serialTx (UINT8 value);
  1069.     #define UART_LineStatus 5
  1070.     #define UART_Transmit 0
  1071.     #define UARTLSR_TXHoldingEmpty (1 << 5)
  1072. void serialLog (char *pMsg, UINT32 nValue)
  1073.     {
  1074.     serialStringOut (pMsg);
  1075.     serialHexOut (nValue);
  1076.     serialStringOut ("rn");
  1077.     }
  1078. void serialStringOut (char *pMsg)
  1079.     {
  1080.     while (*pMsg) serialTx (*pMsg++);
  1081.     }
  1082. void serialMemDump (UINT32 *addr, UINT32 size)
  1083.     {
  1084.     while (size)
  1085.         {
  1086.         serialHexOut((UINT32)addr);
  1087.         serialTx (':');
  1088.         serialHexOut (*addr++);
  1089.         serialTx (13);
  1090.         serialTx (10);
  1091.         size -= 4;
  1092.         }
  1093.     }
  1094. void serialHexOut (UINT32 value)
  1095.     {
  1096.     UINT8 dig, ch;
  1097.     UINT8 count = 28;
  1098.     UINT32 temp;
  1099.     for (dig = 0 ; dig < 8; dig++)
  1100.         {
  1101.         temp = (value >> count);
  1102.         temp = temp & 0x0000000f;
  1103.         ch = (UINT8)temp;
  1104.         serialHexDig (ch);
  1105.         count -= 4;
  1106.         }
  1107.     }
  1108. void serialHexDig (UINT8 value)
  1109.     {
  1110.     UINT8 hex;
  1111.     hex = (value < 10) ? (value + 0x30) : (value + 55);
  1112.     serialTx (hex);
  1113.     }
  1114. void serialTx (UINT8 value)
  1115.     {
  1116.     volatile UINT8 status = 0;
  1117.     while (status == 0)
  1118.         status = *(UINT32*)(IXP425_UART2_BASE + UART_LineStatus);
  1119.     *(UINT8*)(IXP425_UART2_BASE + UART_Transmit) = value;
  1120.     }
  1121. #endif
  1122. #ifdef  INCLUDE_MMU_VIRTUAL_MEM_EQUAL_PHY_MEM
  1123. void *mmuPhysToVirt(void *physicalAddress)
  1124.     {
  1125.     return(physicalAddress);
  1126.     }
  1127. void *mmuVirtToPhys(void *virtualAddress)
  1128.     {
  1129.     return(virtualAddress);
  1130.     }
  1131. #endif