OpenCores
URL https://opencores.org/ocsvn/or1k_soc_on_altera_embedded_dev_kit/or1k_soc_on_altera_embedded_dev_kit/trunk

Subversion Repositories or1k_soc_on_altera_embedded_dev_kit

[/] [or1k_soc_on_altera_embedded_dev_kit/] [trunk/] [linux-2.6/] [linux-2.6.24/] [arch/] [m68k/] [sun3x/] [prom.c] - Blame information for rev 3

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 3 xianfeng
/* Prom access routines for the sun3x */
2
 
3
#include <linux/types.h>
4
#include <linux/kernel.h>
5
#include <linux/tty.h>
6
#include <linux/console.h>
7
#include <linux/init.h>
8
#include <linux/mm.h>
9
#include <linux/string.h>
10
 
11
#include <asm/page.h>
12
#include <asm/pgtable.h>
13
#include <asm/bootinfo.h>
14
#include <asm/setup.h>
15
#include <asm/traps.h>
16
#include <asm/sun3xprom.h>
17
#include <asm/idprom.h>
18
#include <asm/segment.h>
19
#include <asm/sun3ints.h>
20
#include <asm/openprom.h>
21
#include <asm/machines.h>
22
 
23
void (*sun3x_putchar)(int);
24
int (*sun3x_getchar)(void);
25
int (*sun3x_mayget)(void);
26
int (*sun3x_mayput)(int);
27
void (*sun3x_prom_reboot)(void);
28
e_vector sun3x_prom_abort;
29
struct linux_romvec *romvec;
30
 
31
/* prom vector table */
32
e_vector *sun3x_prom_vbr;
33
 
34
/* Handle returning to the prom */
35
void sun3x_halt(void)
36
{
37
        unsigned long flags;
38
 
39
        /* Disable interrupts while we mess with things */
40
        local_irq_save(flags);
41
 
42
        /* Restore prom vbr */
43
        asm volatile ("movec %0,%%vbr" : : "r" ((void*)sun3x_prom_vbr));
44
 
45
        /* Restore prom NMI clock */
46
//      sun3x_disable_intreg(5);
47
        sun3_enable_irq(7);
48
 
49
        /* Let 'er rip */
50
        asm volatile ("trap #14");
51
 
52
        /* Restore everything */
53
        sun3_disable_irq(7);
54
        sun3_enable_irq(5);
55
 
56
        asm volatile ("movec %0,%%vbr" : : "r" ((void*)vectors));
57
        local_irq_restore(flags);
58
}
59
 
60
void sun3x_reboot(void)
61
{
62
        /* This never returns, don't bother saving things */
63
        local_irq_disable();
64
 
65
        /* Restore prom vbr */
66
        asm volatile ("movec %0,%%vbr" : : "r" ((void*)sun3x_prom_vbr));
67
 
68
        /* Restore prom NMI clock */
69
        sun3_disable_irq(5);
70
        sun3_enable_irq(7);
71
 
72
        /* Let 'er rip */
73
        (*romvec->pv_reboot)("vmlinux");
74
}
75
 
76
static void sun3x_prom_write(struct console *co, const char *s,
77
                             unsigned int count)
78
{
79
        while (count--) {
80
                if (*s == '\n')
81
                        sun3x_putchar('\r');
82
                sun3x_putchar(*s++);
83
        }
84
}
85
 
86
/* debug console - write-only */
87
 
88
static struct console sun3x_debug = {
89
        .name   = "debug",
90
        .write  = sun3x_prom_write,
91
        .flags  = CON_PRINTBUFFER,
92
        .index  = -1,
93
};
94
 
95
void __init sun3x_prom_init(void)
96
{
97
        /* Read the vector table */
98
 
99
        sun3x_putchar = *(void (**)(int)) (SUN3X_P_PUTCHAR);
100
        sun3x_getchar = *(int (**)(void)) (SUN3X_P_GETCHAR);
101
        sun3x_mayget = *(int (**)(void))  (SUN3X_P_MAYGET);
102
        sun3x_mayput = *(int (**)(int))   (SUN3X_P_MAYPUT);
103
        sun3x_prom_reboot = *(void (**)(void)) (SUN3X_P_REBOOT);
104
        sun3x_prom_abort = *(e_vector *)  (SUN3X_P_ABORT);
105
        romvec = (struct linux_romvec *)SUN3X_PROM_BASE;
106
 
107
        idprom_init();
108
 
109
        if (!((idprom->id_machtype & SM_ARCH_MASK) == SM_SUN3X)) {
110
                printk("Warning: machine reports strange type %02x\n",
111
                        idprom->id_machtype);
112
                printk("Pretending it's a 3/80, but very afraid...\n");
113
                idprom->id_machtype = SM_SUN3X | SM_3_80;
114
        }
115
 
116
        /* point trap #14 at abort.
117
         * XXX this is futile since we restore the vbr first - oops
118
         */
119
        vectors[VEC_TRAP14] = sun3x_prom_abort;
120
}
121
 
122
static int __init sun3x_debug_setup(char *arg)
123
{
124
        /* If debug=prom was specified, start the debug console */
125
        if (MACH_IS_SUN3X && !strcmp(arg, "prom"))
126
                register_console(&sun3x_debug);
127
        return 0;
128
}
129
 
130
early_param("debug", sun3x_debug_setup);
131
 
132
/* some prom functions to export */
133
int prom_getintdefault(int node, char *property, int deflt)
134
{
135
        return deflt;
136
}
137
 
138
int prom_getbool (int node, char *prop)
139
{
140
        return 1;
141
}
142
 
143
void prom_printf(char *fmt, ...)
144
{
145
}
146
 
147
void prom_halt (void)
148
{
149
        sun3x_halt();
150
}
151
 
152
/* Get the idprom and stuff it into buffer 'idbuf'.  Returns the
153
 * format type.  'num_bytes' is the number of bytes that your idbuf
154
 * has space for.  Returns 0xff on error.
155
 */
156
unsigned char
157
prom_get_idprom(char *idbuf, int num_bytes)
158
{
159
        int i;
160
 
161
        /* make a copy of the idprom structure */
162
        for (i = 0; i < num_bytes; i++)
163
                idbuf[i] = ((char *)SUN3X_IDPROM)[i];
164
 
165
        return idbuf[0];
166
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.