From 0c04c377bc8ac177d28bd0e0096d7c6940d33cd4 Mon Sep 17 00:00:00 2001 From: Joel Sherrill Date: Thu, 18 Feb 1999 16:48:14 +0000 Subject: ./clock/Makefile.in,v ./clock/clock.c,v ./console/Makefile.in,v ./console/config.c,v ./console/console.c,v ./console/console.h,v ./console/debugio.c,v ./console/i8042.c,v ./console/i8042_p.h,v ./console/i8042vga.c,v ./console/i8042vga.h,v ./console/ns16550.c,v ./console/ns16550.h,v ./console/ns16550_p.h,v ./console/ns16550cfg.c,v ./console/ns16550cfg.h,v ./console/vga.c,v ./console/vga_p.h,v ./console/z85c30.c,v ./console/z85c30.h,v ./console/z85c30_p.h,v ./console/z85c30cfg.c,v ./console/z85c30cfg.h,v ./include/Makefile.in,v ./include/bsp.h,v ./include/chain.h,v ./include/coverhd.h,v ./include/extisrdrv.h,v ./include/nvram.h,v ./include/pci.h,v ./include/tod.h,v ./network/Makefile.in,v ./network/amd79c970.c,v ./network/amd79c970.h,v ./nvram/Makefile.in,v ./nvram/ds1385.h,v ./nvram/mk48t18.h,v ./nvram/nvram.c,v ./nvram/prepnvr.h,v ./nvram/stk11c68.h,v ./pci/Makefile.in,v ./pci/pci.c,v ./start/Makefile.in,v ./start/start.s,v ./startup/Makefile.in,v ./startup/bspclean.c,v ./startup/bspstart.c,v ./startup/bsptrap.s,v ./startup/device-tree,v ./startup/genpvec.c,v ./startup/linkcmds,v ./startup/rtems-ctor.cc,v ./startup/sbrk.c,v ./startup/setvec.c,v ./startup/spurious.c,v ./startup/swap.c,v ./timer/Makefile.in,v ./timer/timer.c,v ./tod/Makefile.in,v ./tod/cmos.h,v ./tod/tod.c,v ./universe/Makefile.in,v ./universe/universe.c,v ./vectors/Makefile.in,v ./vectors/README,v ./vectors/align_h.s,v ./vectors/vectors.s,v ./wrapup/Makefile.in,v ./Makefile.in,v ./README,v ./STATUS,v ./bsp_specs,v --- .../lib/libbsp/powerpc/ppcn_60x/startup/bspstart.c | 305 +++++++++++++++++++++ 1 file changed, 305 insertions(+) create mode 100644 c/src/lib/libbsp/powerpc/ppcn_60x/startup/bspstart.c (limited to 'c/src/lib/libbsp/powerpc/ppcn_60x/startup/bspstart.c') diff --git a/c/src/lib/libbsp/powerpc/ppcn_60x/startup/bspstart.c b/c/src/lib/libbsp/powerpc/ppcn_60x/startup/bspstart.c new file mode 100644 index 0000000000..e8ecd15472 --- /dev/null +++ b/c/src/lib/libbsp/powerpc/ppcn_60x/startup/bspstart.c @@ -0,0 +1,305 @@ +/* + * COPYRIGHT (c) 1998 by Radstone Technology + * + * + * THIS FILE IS PROVIDED TO YOU, THE USER, "AS IS", WITHOUT WARRANTY OF ANY + * KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTY OF FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK + * AS TO THE QUALITY AND PERFORMANCE OF ALL CODE IN THIS FILE IS WITH YOU. + * + * You are hereby granted permission to use, copy, modify, and distribute + * this file, provided that this notice, plus the above copyright notice + * and disclaimer, appears in all copies. Radstone Technology will provide + * no support for this code. + * + */ +/* bspstart.c + * + * This set of routines starts the application. It includes application, + * board, and monitor specific initialization and configuration. + * The generic CPU dependent initialization has been performed + * before any of these are invoked. + * + * COPYRIGHT (c) 1989-1997. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may in + * the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id: + */ + +#include +#include +#include + +#include + +unsigned char ucSystemType; +unsigned char ucBoardRevMaj; +unsigned char ucBoardRevMin; +unsigned long ulMemorySize; +unsigned long ulCpuBusClock; + +/* + * The bus speed is expressed in MHz + */ +static unsigned long ulBusSpeed[] = { + 56250000, + 60000000, + 64300000, + 66666667, + 75000000, + 83333333, + 100000000, + 66666667 +}; + +/* + * The original table from the application and our copy of it with + * some changes. + */ + +extern rtems_configuration_table Configuration; +rtems_configuration_table BSP_Configuration; + +rtems_cpu_table Cpu_table; +rtems_unsigned32 bsp_isr_level; + +static int stdin_fd, stdout_fd, stderr_fd; + +/* + * End of RTEMs image imported from linker + */ +extern int end; + +/* + * Use the shared implementations of the following routines + */ + +void bsp_postdriver_hook(void); +void bsp_libc_init( void *, unsigned32, int ); + +/* + * bsp_pretasking_hook + * + * BSP pretasking hook. Called just before drivers are initialized. + * Used to setup libc and install any BSP extensions. + */ + +void bsp_pretasking_hook(void) +{ + rtems_unsigned32 heap_start; + rtems_unsigned32 heap_size; + + heap_start = (rtems_unsigned32) &end; + if (heap_start & (CPU_ALIGNMENT-1)) + heap_start = (heap_start + CPU_ALIGNMENT) & ~(CPU_ALIGNMENT-1); + + heap_size = BSP_Configuration.work_space_start - (void *)&end; + heap_size &= 0xfffffff0; /* keep it as a multiple of 16 bytes */ + + bsp_libc_init((void *) heap_start, heap_size, 0); + + /* + * Initialise RTC hooks based on system type + */ + InitializeRTC(); + + /* + * Initialise NvRAM hooks based on system type + */ + InitializeNvRAM(); + + /* + * Initialise the PCI bus(ses) + */ + InitializePCI(); + + /* + * Initialize the Universe PCI-VME bridge + */ + InitializeUniverse(); + + +#ifdef RTEMS_DEBUG + rtems_debug_enable( RTEMS_DEBUG_ALL_MASK ); +#endif + +} + +/* + * bsp_std_close + * + * Simple routine to close all standard IO streams. + */ + +void bsp_std_close( void ) +{ + close(stdin_fd); + close(stdout_fd); + close(stderr_fd); +} + + +/* + * bsp_predriver_hook + * + * Before drivers are setup. + */ +void bsp_predriver_hook(void) +{ + /* bsp_spurious_initialize; ??*/ + initialize_external_exception_vector(); +} + +/* + * bsp_start + * + * This routine does the bulk of the system initialization. + */ + +void bsp_start( void ) +{ + unsigned char *work_space_start; + unsigned char ucBoardRev, ucMothMemType, ucEquipPres1, ucEquipPres2; + unsigned16 usPVR=0; + unsigned8 ucTempl, ucTemph; + unsigned8 ucBanksPresent; + unsigned8 ucSimmPresent; + unsigned32 ulCurBank, ulTopBank; + + /* + * Determine system type + */ + inport_byte(&((PPLANARREGISTERS)0)->MotherboardMemoryType, ucMothMemType); + inport_byte(&((PPLANARREGISTERS)0)->SimmPresent, ucSimmPresent); + + inport_byte(&((PPLANARREGISTERS)0)->EquipmentPresent1, ucEquipPres1); + inport_byte(&((PPLANARREGISTERS)0)->EquipmentPresent2, ucEquipPres2); + ucSystemType=((ucMothMemType&0x03)<<1) | ((ucEquipPres1&0x80)>>7); + ucSystemType^=7; + + /* + * Determine board revision for use by rev. specific code + */ + inport_byte(&((PPLANARREGISTERS)0)->BoardRevision, ucBoardRev); + ucBoardRevMaj=ucBoardRev>>5; + ucBoardRevMin=ucBoardRev&0x1f; + + /* + * Determine the memory size by reading the end address for top + * assigned bank in the memory controller + */ + (void)PCIConfigRead8(0,0,0,0xa0, &ucBanksPresent); + for(ulCurBank=0;ulCurBank<8;ulCurBank++) + { + if((ucBanksPresent>>ulCurBank)&0x01) + { + ulTopBank=ulCurBank; + } + } + + (void)PCIConfigRead8(0,0,0,0x90+ulTopBank, &ucTempl); + (void)PCIConfigRead8(0,0,0,0x98+ulTopBank, &ucTemph); + ulMemorySize=(ucTempl+(ucTemph<<8)+1)<<20; +#if PPCN_60X_USE_DINK + ulMemorySize=0x01fe0000; +#endif + + /* + * Determine processor bus clock + */ + asm volatile ("mfpvr %0" : "=r" ((usPVR)) : "0" ((usPVR))); + + /* + * Determine processor internal clock + */ + if(ucSystemType==SYS_TYPE_PPC4) + { + if(((ucBoardRevMaj==1) && (ucBoardRevMin==0)) || + ((ucSimmPresent&0x40)==0)) + { + /* + * Rev. 1A is always 66MHz + */ + ulCpuBusClock=66666667; + } + else + { + ulCpuBusClock=83333333; + } + } + else if((((usPVR>>16)==MPC603e) && (ucSystemType!=SYS_TYPE_PPC1)) || + ((usPVR>>16)==MPC603ev) || + ((usPVR>>16)==MPC604e)) + { + ulCpuBusClock=ulBusSpeed[(ucEquipPres2&0x1c)>>2]; + } + else + { + if(((ucSystemType>SYS_TYPE_PPC1) || (ucBoardRevMaj>=5)) && + (ucEquipPres1&0x08)) + { + /* + * 66 MHz bus clock for 005 if indicated + */ + ulCpuBusClock=66666667; + } + else + { + /* + * 33 MHz bus clock for 004 always + */ + ulCpuBusClock=33333333; + } + } + + + /* + * Allocate the memory for the RTEMS Work Space. This can come from + * a variety of places: hard coded address, malloc'ed from outside + * RTEMS world (e.g. simulator or primitive memory manager), or (as + * typically done by stock BSPs) by subtracting the required amount + * of work space from the last physical address on the CPU board. + */ + + work_space_start = + (unsigned char *)ulMemorySize - BSP_Configuration.work_space_size; + + if ( work_space_start <= (unsigned char *)&end ) { + DEBUG_puts( "bspstart: Not enough RAM!!!\n" ); + bsp_cleanup(); + } + + BSP_Configuration.work_space_start = work_space_start; + + /* + * Add 1 region for RTEMS Malloc + */ + + BSP_Configuration.RTEMS_api_configuration->maximum_regions++; + + /* + * Account for the console's resources + */ + + console_reserve_resources( &BSP_Configuration ); + + /* + * initialize the CPU table for this BSP + */ + + Cpu_table.exceptions_in_RAM = TRUE; + Cpu_table.pretasking_hook = bsp_pretasking_hook; /* init libc, etc. */ + Cpu_table.predriver_hook = bsp_predriver_hook; + Cpu_table.postdriver_hook = bsp_postdriver_hook; + Cpu_table.do_zero_of_workspace = TRUE; + Cpu_table.interrupt_stack_size = (32 * 1024); + Cpu_table.clicks_per_usec = ulCpuBusClock/4000000; + + +} + -- cgit v1.2.3