source: rtems/c/src/lib/libbsp/sparc64/shared/clock/ckinit.c @ 566a1806

4.115
Last change on this file since 566a1806 was 566a1806, checked in by Joel Sherrill <joel.sherrill@…>, on 06/17/10 at 16:20:46

2010-06-17 Joel Sherrill <joel.sherrill@…>

  • ChangeLog?, Makefile.am, acinclude.m4, configure.ac, shared/asm/asm.S, shared/clock/ckinit.c, shared/console/conscfg.c, shared/helenos/LICENSE, shared/helenos/README, shared/helenos/boot/genarch/balloc.c, shared/helenos/boot/genarch/ofw.c, shared/helenos/boot/genarch/ofw_tree.c, shared/helenos/boot/generic/string.c, shared/helenos/boot/include/align.h, shared/helenos/boot/include/balloc.h, shared/helenos/boot/include/gentypes.h, shared/helenos/boot/include/main.h, shared/helenos/boot/include/ofw.h, shared/helenos/boot/include/ofw_tree.h, shared/helenos/boot/include/ofwarch.h, shared/helenos/boot/include/register.h, shared/helenos/boot/include/stack.h, shared/helenos/boot/include/types.h, shared/helenos/boot/sparc64/loader/main.c, shared/helenos/boot/sparc64/loader/ofwarch.c, shared/helenos/boot/sparc64/loader/ofwasm.S, shared/helenos/kernel/genarch/include/ofw/ofw_tree.h, shared/helenos/kernel/generic/include/align.h, shared/helenos/kernel/sparc64/include/arch.h, shared/helenos/kernel/sparc64/include/boot.h, shared/helenos/kernel/sparc64/include/regdef.h, shared/helenos/kernel/sparc64/include/stack.h, shared/helenos/kernel/sparc64/include/mm/cache_spec.h, shared/helenos/kernel/sparc64/include/mm/frame.h, shared/helenos/kernel/sparc64/include/mm/mmu.h, shared/helenos/kernel/sparc64/include/mm/page.h, shared/helenos/kernel/sparc64/include/mm/tlb.h, shared/helenos/kernel/sparc64/include/mm/tte.h, shared/helenos/kernel/sparc64/include/mm/sun4u/frame.h, shared/helenos/kernel/sparc64/include/mm/sun4u/mmu.h, shared/helenos/kernel/sparc64/include/mm/sun4u/page.h, shared/helenos/kernel/sparc64/include/mm/sun4u/tlb.h, shared/helenos/kernel/sparc64/include/mm/sun4u/tte.h, shared/helenos/kernel/sparc64/include/sun4u/arch.h, shared/helenos/kernel/sparc64/src/cache.S, shared/helenos/kernel/sparc64/src/sun4u/takemmu.S, shared/include/asm.h, shared/include/traptable.h, shared/start/start.S, shared/start/trap_table.S, shared/startup/bspgetworkarea.c, shared/startup/bspstart.c, shared/startup/linkcmds, shared/startup/setvec.c: New files.
  • Property mode set to 100644
File size: 2.8 KB
Line 
1/*  ckinit.c
2 *
3 *  This file provides a template for the clock device driver initialization.
4 *
5 *  Modified for sun4v - niagara
6 *
7 *  COPYRIGHT (c) 1989-1999.
8 *  On-Line Applications Research Corporation (OAR).
9 *
10 *  Modifications Copyright (c) 2010 Gedare Bloom.
11 *
12 *  The license and distribution terms for this file may be
13 *  found in the file LICENSE in this distribution or at
14 *  http://www.rtems.com/license/LICENSE.
15 *
16 *  $Id$
17 */
18
19#include <stdlib.h>
20
21#include <rtems.h>
22#include <bsp.h>
23#include <bspopts.h>
24#include <boot/ofw.h>
25
26/* this is default frequency for simics simulator of niagara. Use the
27 * get_Frequency function to determine the CPU clock frequency at runtime.
28 */
29#define CPU_FREQ (5000000)
30
31uint64_t sparc64_cycles_per_tick;
32
33/* TICK_CMPR and STICK_CMPR trigger soft interrupt 14 */
34#define CLOCK_VECTOR SPARC_SYNCHRONOUS_TRAP(0x4E)
35
36static unsigned int get_Frequency(void)
37{
38        phandle root = ofw_find_device("/");
39        unsigned int freq;
40        if (ofw_get_property(root, "clock-frequency", &freq, sizeof(freq)) <= 0) {
41                printk("Unable to determine frequency, default: 0x%x\n",CPU_FREQ);
42                return CPU_FREQ;
43        }
44
45        return freq;
46}
47
48
49void Clock_driver_support_at_tick(void)
50{
51  uint64_t tick_reg;
52  int bit_mask;
53
54
55  bit_mask = SPARC_SOFTINT_TM_MASK | SPARC_SOFTINT_SM_MASK | (1<<14);
56  sparc64_clear_interrupt_bits(bit_mask);
57
58  /* Note: sun4v uses stick_cmpr for clock driver for M5 simulator, which
59   * does not currently have tick_cmpr implemented */
60  /* TODO: this could be more efficiently implemented as a single assembly
61   * inline */
62#if defined (SUN4U)
63  sparc64_read_tick(tick_reg);
64#elif defined (SUN4V)
65  sparc64_read_stick(tick_reg);
66#endif
67  tick_reg &= ~(1UL<<63); /* mask out NPT bit, prevents int_dis from being set */
68
69  tick_reg += sparc64_cycles_per_tick;
70
71#if defined (SUN4U)
72  sparc64_write_tick_cmpr(tick_reg);
73#elif defined (SUN4V)
74  sparc64_write_stick_cmpr(tick_reg);
75#endif
76}
77
78#define Clock_driver_support_install_isr(_new, _old) \
79  do { \
80    _old = set_vector( _new, CLOCK_VECTOR, 1 ); \
81  } while ( 0 )
82
83void Clock_driver_support_initialize_hardware(void)
84{
85  uint64_t tick_reg;   
86  int bit_mask;
87
88
89  bit_mask = SPARC_SOFTINT_TM_MASK | SPARC_SOFTINT_SM_MASK | (1<<14);
90  sparc64_clear_interrupt_bits(bit_mask);
91
92  sparc64_cycles_per_tick = rtems_configuration_get_microseconds_per_tick()*(get_Frequency()/1000000);
93
94#if defined (SUN4U)
95  sparc64_read_tick(tick_reg);
96#elif defined (SUN4V)
97  sparc64_read_stick(tick_reg);
98#endif
99
100  tick_reg &= ~(1UL<<63); /* mask out NPT bit, prevents int_dis from being set */
101  tick_reg += sparc64_cycles_per_tick;
102
103#if defined (SUN4U)
104  sparc64_write_tick_cmpr(tick_reg);
105#elif defined (SUN4V)
106  sparc64_write_stick_cmpr(tick_reg);
107#endif
108}
109
110
111#define Clock_driver_support_shutdown_hardware( ) \
112  do { \
113    \
114  } while ( 0 )
115
116
117#include "../../../shared/clockdrv_shell.h"
118
Note: See TracBrowser for help on using the repository browser.