summaryrefslogtreecommitdiffstats
path: root/bsps/powerpc/beatnik
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2018-04-20 10:35:35 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2018-04-20 13:52:14 +0200
commit99648958668d3a33ee57974479b36201fe303f34 (patch)
tree6f27ea790e2823c6156e71219a4f54680263fac6 /bsps/powerpc/beatnik
parentbsps: Move start files to bsps (diff)
downloadrtems-99648958668d3a33ee57974479b36201fe303f34.tar.bz2
bsps: Move startup files to bsps
Adjust build support files to new directory layout. This patch is a part of the BSP source reorganization. Update #3285.
Diffstat (limited to 'bsps/powerpc/beatnik')
-rw-r--r--bsps/powerpc/beatnik/start/bsp_specs9
-rw-r--r--bsps/powerpc/beatnik/start/bspclean.c25
-rw-r--r--bsps/powerpc/beatnik/start/bspreset.c18
-rw-r--r--bsps/powerpc/beatnik/start/bspstart.c387
-rw-r--r--bsps/powerpc/beatnik/start/i2c_init.c131
-rw-r--r--bsps/powerpc/beatnik/start/linkcmds5
6 files changed, 575 insertions, 0 deletions
diff --git a/bsps/powerpc/beatnik/start/bsp_specs b/bsps/powerpc/beatnik/start/bsp_specs
new file mode 100644
index 0000000000..99ca0adb61
--- /dev/null
+++ b/bsps/powerpc/beatnik/start/bsp_specs
@@ -0,0 +1,9 @@
+%rename endfile old_endfile
+%rename startfile old_startfile
+
+*startfile:
+%{!qrtems: %(old_startfile)} \
+%{!nostdlib: %{qrtems: ecrti%O%s rtems_crti%O%s crtbegin.o%s}}
+
+*endfile:
+%{!qrtems: %(old_endfile)} %{qrtems: crtend.o%s ecrtn.o%s}
diff --git a/bsps/powerpc/beatnik/start/bspclean.c b/bsps/powerpc/beatnik/start/bspclean.c
new file mode 100644
index 0000000000..251d47a46d
--- /dev/null
+++ b/bsps/powerpc/beatnik/start/bspclean.c
@@ -0,0 +1,25 @@
+#include <bsp.h>
+#include <bsp/bootcard.h>
+#include <rtems/bspIo.h>
+
+void bsp_fatal_extension(
+ rtems_fatal_source source,
+ bool always_set_to_false,
+ rtems_fatal_code error
+)
+{
+ printk("fatal source: %s\n", rtems_fatal_source_text(source));
+
+ if (source == RTEMS_FATAL_SOURCE_EXCEPTION) {
+ rtems_exception_frame_print((const rtems_exception_frame *) error);
+ }
+
+ /* We can't go back to MotLoad since we blew it's memory area
+ * and vectors. Just pull the reset line...
+ */
+ printk(
+ "bsp_fatal_extension(): RTEMS terminated -- no way back to MotLoad "
+ "so I reset the card\n"
+ );
+ bsp_reset();
+}
diff --git a/bsps/powerpc/beatnik/start/bspreset.c b/bsps/powerpc/beatnik/start/bspreset.c
new file mode 100644
index 0000000000..68540847ee
--- /dev/null
+++ b/bsps/powerpc/beatnik/start/bspreset.c
@@ -0,0 +1,18 @@
+#include <rtems.h>
+#include <bsp.h>
+#include <bsp/bootcard.h>
+#include <rtems/bspIo.h>
+#include <libcpu/io.h>
+#include <libcpu/stackTrace.h>
+#include <stdint.h>
+
+void bsp_reset()
+{
+
+ printk("Printing a stack trace for your convenience :-)\n");
+ CPU_print_stack();
+
+ printk("RTEMS terminated; Rebooting ...\n");
+ /* Mvme5500 board reset : 2004 S. Kate Feng <feng1@bnl.gov> */
+ out_8((volatile uint8_t*) (BSP_MV64x60_DEV1_BASE +2), 0x80);
+}
diff --git a/bsps/powerpc/beatnik/start/bspstart.c b/bsps/powerpc/beatnik/start/bspstart.c
new file mode 100644
index 0000000000..c3f2c0ceda
--- /dev/null
+++ b/bsps/powerpc/beatnik/start/bspstart.c
@@ -0,0 +1,387 @@
+/*
+ * This routine does the bulk of the system initialization.
+ */
+
+/*
+ * COPYRIGHT (c) 1989-1998.
+ * On-Line Applications Research Corporation (OAR).
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.OARcorp.com/rtems/license.html.
+ *
+ * Modified to support the MCP750.
+ * Modifications Copyright (C) 1999 Eric Valette. valette@crf.canon.fr
+ *
+ * Modified to support the Synergy VGM & Motorola PowerPC boards.
+ * (C) by Till Straumann, <strauman@slac.stanford.edu>, 2002, 2004, 2005
+ *
+ * Modified to support the mvme5500 BSP
+ * (C) by Kate Feng <feng1@bnl.gov>, 2003, 2004
+ * under the contract DE-AC02-98CH10886 with the Deaprtment of Energy
+ *
+ * T. Straumann: 2005-2007; stolen again for 'beatnik'...
+ */
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+#include <rtems/system.h>
+#include <rtems/libio.h>
+#include <rtems/libcsupport.h>
+#include <rtems/bspIo.h>
+#include <rtems/counter.h>
+#include <rtems/powerpc/powerpc.h>
+#include <rtems/sysinit.h>
+/*#include <bsp/consoleIo.h>*/
+#include <libcpu/spr.h> /* registers.h is included here */
+#include <bsp.h>
+#include <bsp/bootcard.h>
+#include <bsp/uart.h>
+#include <bsp/pci.h>
+#include <bsp/gtreg.h>
+#include <bsp/gt_timer.h>
+#include <libcpu/bat.h>
+#include <libcpu/pte121.h>
+#include <libcpu/cpuIdent.h>
+#include <bsp/vectors.h>
+#include <bsp/VME.h>
+#include <bsp/vpd.h>
+
+#define SHOW_MORE_INIT_SETTINGS
+
+BSP_output_char_function_type BSP_output_char = BSP_output_char_via_serial;
+BSP_polling_getchar_function_type BSP_poll_char = NULL;
+
+extern Triv121PgTbl BSP_pgtbl_setup(unsigned int *);
+extern void BSP_pgtbl_activate(Triv121PgTbl);
+extern void BSP_motload_pci_fixup(void);
+
+extern unsigned long __rtems_end[];
+
+/* We really shouldn't use these since MMUoff also sets IP;
+ * nevertheless, during early init I don't care for now
+ */
+extern void MMUoff(void);
+extern void MMUon(void);
+
+extern uint32_t probeMemoryEnd(void);
+
+SPR_RW(SPRG0)
+SPR_RW(SPRG1)
+SPR_RO(HID1)
+
+/* Table of PLL multipliers for 7455/7457:
+01000 2 00010 7.5 00000 11.5 00001 17
+10000 3 11000 8 10111 12 00101 18
+10100 4 01100 8.5 11111 12.5 00111 20
+10110 5 01111 9 01011 13 01001 21
+10010 5.5 01110 9.5 11100 13.5 01101 24
+11010 6 10101 10 11001 14 11101 28
+01010 6.5 10001 10.5 00011 15 00110 bypass
+00100 7 10011 11 11011 16 11110 off
+*/
+
+/* Sorted according to CFG bits and multiplied by 2 it looks
+ * like this (note that this is in sequential order, not
+ * tabulated as above)
+ */
+signed char mpc7450PllMultByTwo[32] = {
+23, 34, 15, 30,
+14, 36, 2/*bypass*/, 40,
+4, 42, 13, 26,
+17, 48, 19, 18,
+6, 21, 11, 22,
+8, 20, 10, 24,
+16, 28, 12, 32,
+27, 56, 0/*off*/, 25,
+};
+
+uint32_t bsp_clicks_per_usec = 0;
+
+/*
+ * Total memory using probing.
+ */
+unsigned int BSP_mem_size;
+
+/*
+ * PCI Bus Frequency
+ */
+unsigned int BSP_bus_frequency = 0xdeadbeef;
+/*
+ * processor clock frequency
+ */
+unsigned int BSP_processor_frequency = 0xdeadbeef;
+
+/*
+ * Time base divisior (bus freq / TB clock)
+ */
+unsigned int BSP_time_base_divisor = 4000; /* most 604+ CPUs seem to use this */
+
+/* Board identification string */
+char BSP_productIdent[20] = {0};
+char BSP_serialNumber[20] = {0};
+
+/* VPD appends an extra char -- what for ? */
+char BSP_enetAddr0[7] = {0};
+char BSP_enetAddr1[7] = {0};
+
+char *rtems_progname;
+
+#define CMDLINE_BUF_SIZE 2048
+
+static char cmdline_buf[CMDLINE_BUF_SIZE];
+char *BSP_commandline_string = cmdline_buf;
+
+/* this routine is called early and must be safe with a not properly
+ * aligned stack
+ */
+char *save_boot_params(
+ void *r3,
+ void *r4,
+ void *r5,
+ char *cmdline_start,
+ char *cmdline_end
+)
+{
+int i=cmdline_end-cmdline_start;
+ if ( i >= CMDLINE_BUF_SIZE )
+ i = CMDLINE_BUF_SIZE-1;
+ else if ( i < 0 )
+ i = 0;
+ memmove(cmdline_buf, cmdline_start, i);
+ cmdline_buf[i]=0;
+ return cmdline_buf;
+}
+
+static BSP_BoardType board_type = Unknown;
+
+BSP_BoardType
+BSP_getBoardType( void )
+{
+ return board_type;
+}
+
+/*
+ * bsp_start
+ *
+ * This routine does the bulk of the system initialization.
+ */
+
+void bsp_start( void )
+{
+ unsigned char *stack;
+ char *chpt;
+ uint32_t intrStackStart;
+ uint32_t intrStackSize;
+
+ Triv121PgTbl pt=0;
+
+ VpdBufRec vpdData [] = {
+ { key: ProductIdent, instance: 0, buf: BSP_productIdent, buflen: sizeof(BSP_productIdent) - 1 },
+ { key: SerialNumber, instance: 0, buf: BSP_serialNumber, buflen: sizeof(BSP_serialNumber) - 1 },
+ { key: CpuClockHz, instance: 0, buf: &BSP_processor_frequency, buflen: sizeof(BSP_processor_frequency) },
+ { key: BusClockHz, instance: 0, buf: &BSP_bus_frequency, buflen: sizeof(BSP_bus_frequency) },
+ { key: EthernetAddr, instance: 0, buf: BSP_enetAddr0, buflen: sizeof(BSP_enetAddr0) },
+ { key: EthernetAddr, instance: 1, buf: BSP_enetAddr1, buflen: sizeof(BSP_enetAddr1) },
+ VPD_END
+ };
+
+ /* T. Straumann: 4/2005
+ *
+ * Need to map the system registers early, so we can printk...
+ * (otherwise we silently die)
+ */
+ /* map the PCI 0, 1 Domain I/O space, GT64260B registers
+ * and the reserved area so that the size is the power of 2.
+ */
+ setdbat(7, BSP_DEV_AND_PCI_IO_BASE, BSP_DEV_AND_PCI_IO_BASE, BSP_DEV_AND_PCI_IO_SIZE, IO_PAGE);
+
+ /* Intersperse messages with actions to help locate problems */
+ printk("-----------------------------------------\n");
+
+ /*
+ * Get CPU identification dynamically. Note that the get_ppc_cpu_type() & friends functions
+ * store the result in global variables so that it can be used latter...
+ * This also verifies that we run on a known CPU.
+ */
+ get_ppc_cpu_type();
+ get_ppc_cpu_revision();
+
+ /* Make sure we detect a known host bridge */
+ BSP_getDiscoveryVersion(/* assert detection */ 1);
+
+ printk("Welcome to RTEMS %s\n", _RTEMS_version );
+
+ /* Leave all caches as MotLoad left them. Seems to be fine */
+
+ /*
+ * the initial stack has aready been set to this value in start.S
+ * so there is no need to set it in r1 again... It is just for info
+ * so that it can be printed without accessing R1.
+ */
+ __asm__ volatile("mr %0, 1":"=r"(stack));
+
+ /* tag the bottom (T. Straumann 6/36/2001 <strauman@slac.stanford.edu>) */
+
+ *((uint32_t *)stack) = 0;
+
+ /*
+ * Initialize the interrupt related settings
+ * SPRG0 = interrupt nesting level count
+ * SPRG1 = software managed IRQ stack
+ *
+ * This could be done latter (e.g in IRQ_INIT) but it helps to understand
+ * some settings below...
+ */
+ intrStackStart = (uint32_t)__rtems_end;
+ intrStackSize = rtems_configuration_get_interrupt_stack_size();
+
+ /*
+ * Initialize default raw exception handlers. See vectors/vectors_init.c
+ */
+ ppc_exc_initialize(intrStackStart, intrStackSize);
+
+ printk("CPU: %s\n", get_ppc_cpu_type_name(current_ppc_cpu));
+
+ /*
+ * Initialize RTEMS IRQ system
+ */
+ BSP_rtems_irq_mng_init(0);
+
+ BSP_vpdRetrieveFields(vpdData);
+
+ if ( !strncmp(BSP_productIdent,"MVME5500",8) )
+ board_type = MVME5500;
+ else if ( !strncmp(BSP_productIdent,"MVME6100",8) )
+ board_type = MVME6100;
+
+ printk("Board Type: %s (S/N %s)\n",
+ BSP_productIdent[0] ? BSP_productIdent : "n/a",
+ BSP_serialNumber[0] ? BSP_serialNumber : "n/a");
+
+ if ( 0xdeadbeef == BSP_bus_frequency ) {
+ BSP_bus_frequency = 133333333;
+ printk("Bus Clock Freq NOT FOUND in VPD; using %10u Hz\n",
+ BSP_bus_frequency);
+ } else {
+ printk("Bus Clock Freq: %10u Hz\n",
+ BSP_bus_frequency);
+ }
+
+ if ( 0xdeadbeef == BSP_processor_frequency ) {
+ BSP_processor_frequency = BSP_bus_frequency/2;
+ BSP_processor_frequency *= mpc7450PllMultByTwo[ (_read_HID1() >> (31-19)) & 31 ];
+ }
+ printk("CPU Clock Freq: %10u Hz\n", BSP_processor_frequency);
+
+ /* probe real memory size; if it's more than 256M we can't currently access it
+ * since at this point only BAT-0 maps 0..256M
+ */
+ BSP_mem_size = probeMemoryEnd();
+
+ if ( (chpt = strstr(BSP_commandline_string,"MEMSZ=")) ) {
+ char *endp;
+ uint32_t sz;
+ chpt+=6 /* strlen("MEMSZ=") */;
+ sz = strtoul(chpt, &endp, 0);
+ if ( endp != chpt )
+ BSP_mem_size = sz;
+ }
+
+ printk("Memory: %10u bytes\n", BSP_mem_size);
+
+ if ( BSP_mem_size > 0x10000000 ) {
+ uint32_t s;
+ if ( BSP_mem_size > 0x80000000 ) {
+ BSP_mem_size = 0x80000000;
+ printk("Memory clipped to 0x%08x for now, sorry\n", BSP_mem_size);
+ }
+ for ( s = 0x20000000; s < BSP_mem_size ; s<<=1)
+ ;
+ MMUoff();
+ /* since it's currently in use we must first surrender it */
+ setdbat(0, 0, 0, 0, 0);
+ setdbat(0, 0, 0, s, _PAGE_RW);
+ MMUon();
+ }
+
+ printk("-----------------------------------------\n");
+
+ /* Maybe not setup yet because of the warning message */
+
+ /* Allocate and set up the page table mappings
+ * This is only available on >604 CPUs.
+ *
+ * NOTE: This setup routine may modify the available memory
+ * size. It is essential to call it before
+ * calculating the workspace etc.
+ */
+ pt = BSP_pgtbl_setup(&BSP_mem_size);
+ if (!pt)
+ printk("WARNING: unable to setup page tables.\n");
+
+#ifdef SHOW_MORE_INIT_SETTINGS
+ printk("Now BSP_mem_size = 0x%x\n",BSP_mem_size);
+#endif
+
+ /*
+ * Set up our hooks
+ */
+
+ bsp_clicks_per_usec = BSP_bus_frequency/(BSP_time_base_divisor * 1000);
+ rtems_counter_initialize_converter(
+ BSP_bus_frequency / (BSP_time_base_divisor / 1000)
+ );
+
+#ifdef SHOW_MORE_INIT_SETTINGS
+ printk(
+ "Configuration.work_space_size = %x\n",
+ rtems_configuration_get_work_space_size()
+ );
+#endif
+
+ /* Activate the page table mappings only after
+ * initializing interrupts because the irq_mng_init()
+ * routine needs to modify the text
+ */
+ if ( pt ) {
+#ifdef SHOW_MORE_INIT_SETTINGS
+ printk("Page table setup finished; will activate it NOW...\n");
+#endif
+ BSP_pgtbl_activate(pt);
+ }
+
+#ifdef SHOW_MORE_INIT_SETTINGS
+ printk("Going to start PCI buses scanning and initialization\n");
+#endif
+ BSP_pci_initialize();
+
+ /* need to tweak the motload setup */
+ BSP_motload_pci_fixup();
+
+ /* map 512M, 256 for PCI 256 for VME */
+ setdbat(5,BSP_PCI_HOSE0_MEM_BASE, BSP_PCI_HOSE0_MEM_BASE, BSP_PCI_HOSE0_MEM_SIZE, IO_PAGE);
+ setdbat(6,BSP_PCI_HOSE1_MEM_BASE, BSP_PCI_HOSE1_MEM_BASE, 0x10000000, IO_PAGE);
+
+#ifdef SHOW_MORE_INIT_SETTINGS
+ printk("Number of PCI buses found is : %d\n", pci_bus_count());
+#endif
+
+ /*
+ * Initialize hardware timer facility (not used by BSP itself)
+ * Needs PCI to identify discovery version...
+ */
+ BSP_timers_initialize();
+
+#ifdef SHOW_MORE_INIT_SETTINGS
+ printk("MSR 0x%lx \n", _read_MSR());
+ printk("Exit from bspstart\n");
+#endif
+}
+
+RTEMS_SYSINIT_ITEM(
+ BSP_vme_config,
+ RTEMS_SYSINIT_BSP_PRE_DRIVERS,
+ RTEMS_SYSINIT_ORDER_MIDDLE
+);
diff --git a/bsps/powerpc/beatnik/start/i2c_init.c b/bsps/powerpc/beatnik/start/i2c_init.c
new file mode 100644
index 0000000000..bc5c5ead02
--- /dev/null
+++ b/bsps/powerpc/beatnik/start/i2c_init.c
@@ -0,0 +1,131 @@
+#include <rtems.h>
+#include <bsp.h>
+#include <rtems/libi2c.h>
+#include <libchip/i2c-2b-eeprom.h>
+#include <libchip/i2c-ds1621.h>
+#include <bsp/gti2c_busdrv.h>
+#include <rtems/libio.h>
+
+#include <stdio.h>
+#include <sys/stat.h>
+
+/* Register i2c bus driver & devices */
+
+/*
+ * Authorship
+ * ----------
+ * This software ('beatnik' RTEMS BSP for MVME6100 and MVME5500) was
+ * created by Till Straumann <strauman@slac.stanford.edu>, 2005-2007,
+ * Stanford Linear Accelerator Center, Stanford University.
+ *
+ * Acknowledgement of sponsorship
+ * ------------------------------
+ * The 'beatnik' BSP was produced by
+ * the Stanford Linear Accelerator Center, Stanford University,
+ * under Contract DE-AC03-76SFO0515 with the Department of Energy.
+ *
+ * Government disclaimer of liability
+ * ----------------------------------
+ * Neither the United States nor the United States Department of Energy,
+ * nor any of their employees, makes any warranty, express or implied, or
+ * assumes any legal liability or responsibility for the accuracy,
+ * completeness, or usefulness of any data, apparatus, product, or process
+ * disclosed, or represents that its use would not infringe privately owned
+ * rights.
+ *
+ * Stanford disclaimer of liability
+ * --------------------------------
+ * Stanford University makes no representations or warranties, express or
+ * implied, nor assumes any liability for the use of this software.
+ *
+ * Stanford disclaimer of copyright
+ * --------------------------------
+ * Stanford University, owner of the copyright, hereby disclaims its
+ * copyright and all other rights in this software. Hence, anyone may
+ * freely use it for any purpose without restriction.
+ *
+ * Maintenance of notices
+ * ----------------------
+ * In the interest of clarity regarding the origin and status of this
+ * SLAC software, this and all the preceding Stanford University notices
+ * are to remain affixed to any copy or derivative of this software made
+ * or distributed by the recipient and are to be affixed to any copy of
+ * software made or distributed by the recipient that contains a copy or
+ * derivative of this software.
+ *
+ * ------------------ SLAC Software Notices, Set 4 OTT.002a, 2004 FEB 03
+ */
+
+int
+BSP_i2c_initialize( void )
+{
+int busno;
+ /* Initialize the library */
+ if ( rtems_libi2c_initialize() ) {
+ fprintf(stderr,"Initializing I2C library failed\n");
+ return -1;
+ }
+
+ /* Register our bus driver */
+ if ( (busno=rtems_libi2c_register_bus(
+ BSP_I2C_BUS0_NAME,
+ BSP_I2C_BUS_DESCRIPTOR) ) < 0 ) {
+ perror("Registering gt64260 i2c bus driver");
+ return -1;
+ }
+
+ /* Now register higher level drivers; note that
+ * the i2c address in the manual is actually left-shifted
+ * by one bit, i.e., as it would go on the bus.
+ */
+
+ /* Use read-only driver for VPD */
+ if ( rtems_libi2c_register_drv(
+ BSP_I2C_VPD_EEPROM_NAME,
+ i2c_2b_eeprom_ro_driver_descriptor,
+ busno,
+ BSP_VPD_I2C_ADDR) < 0 ) {
+ perror("Registering i2c VPD eeprom driver failed");
+ return -1;
+ }
+
+ /* Use read-write driver for user eeprom -- you still might
+ * have to disable HW write-protection on your board.
+ */
+ if ( rtems_libi2c_register_drv(
+ BSP_I2C_USR_EEPROM_NAME,
+ i2c_2b_eeprom_driver_descriptor,
+ busno,
+ BSP_USR_I2C_ADDR) < 0 ) {
+ perror("Registering i2c USR eeprom driver failed");
+ return -1;
+ }
+
+ /* The thermostat */
+ if ( rtems_libi2c_register_drv(
+ BSP_I2C_DS1621_NAME,
+ i2c_ds1621_driver_descriptor,
+ busno,
+ BSP_THM_I2C_ADDR) < 0 ) {
+ perror("Registering i2c ds1621 temp sensor. driver failed");
+ return -1;
+ }
+
+ /* Finally, as an example, register raw access to the
+ * ds1621. The driver above just reads the 8 msb of the
+ * temperature but doesn't support anything else. Using
+ * the raw device node you can write/read individual
+ * control bytes yourself and e.g., program the thermostat...
+ */
+
+ if ( mknod(
+ BSP_I2C_DS1621_RAW_DEV_NAME,
+ 0666 | S_IFCHR,
+ rtems_filesystem_make_dev_t(rtems_libi2c_major,
+ RTEMS_LIBI2C_MAKE_MINOR(busno,BSP_THM_I2C_ADDR))) ) {
+ perror("Creating device node for raw ds1621 access failed");
+ return -1;
+ }
+ printf("I2C devices registered\n");
+ return 0;
+}
diff --git a/bsps/powerpc/beatnik/start/linkcmds b/bsps/powerpc/beatnik/start/linkcmds
new file mode 100644
index 0000000000..b30fb91277
--- /dev/null
+++ b/bsps/powerpc/beatnik/start/linkcmds
@@ -0,0 +1,5 @@
+STARTUP(motld_start.o)
+ENTRY(__rtems_entry_point)
+EXTERN(__vectors)
+
+INCLUDE linkcmds.share