2 * linux/arch/m68k/sun3/config.c
4 * Copyright (C) 1996,1997 Pekka Pietik{inen
6 * This file is subject to the terms and conditions of the GNU General Public
7 * License. See the file COPYING in the main directory of this archive
13 #include <linux/config.h>
14 #include <linux/types.h>
15 #include <linux/kernel.h>
18 #include <linux/tty.h>
19 #include <linux/console.h>
20 #include <linux/init.h>
22 #include <asm/oplib.h>
23 #include <asm/setup.h>
24 #include <asm/contregs.h>
26 #include <asm/pgtable.h>
27 #include <asm/sun3-head.h>
28 #include <asm/sun3mmu.h>
29 #include <asm/machdep.h>
30 #include <asm/intersil.h>
32 #include <asm/segment.h>
34 extern char _text
, _end
;
36 static int kernel_start
, kernel_end
;
37 char sun3_reserved_pmeg
[SUN3_PMEGS_NUM
];
39 static unsigned long sun3_gettimeoffset(void);
40 extern int sun3_get_irq_list (char *);
41 extern void sun3_sched_init(void (*handler
)(int, void *, struct pt_regs
*));
42 extern void sun3_init_IRQ (void);
43 extern void (*sun3_default_handler
[]) (int, void *, struct pt_regs
*);
44 extern int sun3_request_irq (unsigned int irq
, void (*handler
)(int, void *, struct pt_regs
*),
45 unsigned long flags
, const char *devname
, void *dev_id
);
46 extern void sun3_free_irq (unsigned int irq
, void *dev_id
);
47 extern void sun3_enable_irq (unsigned int);
48 extern void sun3_disable_irq (unsigned int);
49 extern void sun3_enable_interrupts (void);
50 extern void sun3_disable_interrupts (void);
51 extern void sun3_get_model (unsigned char* model
);
52 extern void idprom_init (void);
53 void sun3_gettod (int *yearp
, int *monp
, int *dayp
,
54 int *hourp
, int *minp
, int *secp
);
56 extern unsigned long sun_serial_setup(unsigned long memory_start
);
57 volatile char* clock_va
;
58 extern unsigned char* sun3_intreg
;
60 void __init
sun3_init(void)
62 unsigned char enable_register
;
65 m68k_machtype
= MACH_SUN3
;
66 m68k_cputype
= CPU_68020
;
67 m68k_fputype
= FPU_68881
; /* mc68881 actually */
68 m68k_mmutype
= MMU_SUN3
;
69 clock_va
= (char *) 0xfe06000; /* dark */
70 sun3_intreg
= (unsigned char *) 0xfe0a000; /* magic */
71 sun3_disable_interrupts();
73 prom_init((void *)LINUX_OPPROM_BEGVM
);
75 GET_CONTROL_BYTE(AC_SENABLE
,enable_register
);
76 enable_register
|= 0x40; /* Enable FPU */
77 SET_CONTROL_BYTE(AC_SENABLE
,enable_register
);
78 GET_CONTROL_BYTE(AC_SENABLE
,enable_register
);
80 /* This code looks suspicious, because it doesn't subtract
81 memory belonging to the kernel from the available space */
84 memset(sun3_reserved_pmeg
, 0, sizeof(sun3_reserved_pmeg
));
86 /* Reserve important PMEGS */
87 /* FIXME: These should be probed instead of hardcoded */
89 for (i
=0; i
<8; i
++) /* Kernel PMEGs */
90 sun3_reserved_pmeg
[i
] = 1;
92 sun3_reserved_pmeg
[247] = 1; /* ROM mapping */
93 sun3_reserved_pmeg
[248] = 1; /* AMD Ethernet */
94 sun3_reserved_pmeg
[251] = 1; /* VB area */
95 sun3_reserved_pmeg
[254] = 1; /* main I/O */
97 sun3_reserved_pmeg
[249] = 1;
98 sun3_reserved_pmeg
[252] = 1;
99 sun3_reserved_pmeg
[253] = 1;
103 /* Without this, Bad Things happen when something calls arch_reset. */
104 static void sun3_reboot (void)
106 prom_reboot ("vmlinux");
109 void __init
config_sun3(unsigned long *start_mem_p
, unsigned long *end_mem_p
)
111 printk("ARCH: SUN3\n");
114 /* Subtract kernel memory from available memory */
116 mach_sched_init
= sun3_sched_init
;
117 mach_init_IRQ
= sun3_init_IRQ
;
118 mach_default_handler
= &sun3_default_handler
;
119 mach_request_irq
= sun3_request_irq
;
120 mach_free_irq
= sun3_free_irq
;
121 // mach_keyb_init = sun3_keyb_init;
122 enable_irq
= sun3_enable_irq
;
123 disable_irq
= sun3_disable_irq
;
124 mach_get_irq_list
= sun3_get_irq_list
;
125 mach_gettod
= sun3_gettod
;
126 mach_reset
= sun3_reboot
;
127 mach_gettimeoffset
= sun3_gettimeoffset
;
128 mach_get_model
= sun3_get_model
;
129 #ifndef CONFIG_SERIAL_CONSOLE
130 conswitchp
= &dummy_con
;
132 kernel_start
= 0x00000000; /* NOT &_text */
133 kernel_end
= ((((int)&_end
) + 0x2000) & ~0x1fff) - 1;
135 *start_mem_p
= kernel_end
+ 1;
136 // PROM seems to want the last couple of physical pages. --m
137 *end_mem_p
= *(romvec
->pv_sun3mem
) + PAGE_OFFSET
- 2*PAGE_SIZE
;
139 m68k_memory
[0].size
=*(romvec
->pv_sun3mem
);
141 *start_mem_p
= sun_serial_setup(*start_mem_p
);
144 void __init
sun3_sched_init(void (*timer_routine
)(int, void *, struct pt_regs
*))
146 sun3_disable_interrupts();
147 intersil_clock
->cmd_reg
=(INTERSIL_RUN
|INTERSIL_INT_DISABLE
|INTERSIL_24H_MODE
);
148 intersil_clock
->int_reg
=INTERSIL_HZ_100_MASK
;
151 intersil_clock
->cmd_reg
=(INTERSIL_RUN
|INTERSIL_INT_ENABLE
|INTERSIL_24H_MODE
);
152 sun3_enable_interrupts();
156 static unsigned long sun3_gettimeoffset(void)
161 void sun3_gettod (int *yearp
, int *monp
, int *dayp
,
162 int *hourp
, int *minp
, int *secp
)
164 struct intersil_dt
* todintersil
;
165 todintersil
= (struct intersil_dt
*) &intersil_clock
->counter
;
166 *secp
= todintersil
->second
;
167 *minp
= todintersil
->minute
;
168 *hourp
= todintersil
->hour
;
169 *dayp
= todintersil
->day
;
170 *monp
= todintersil
->month
;
171 *yearp
= todintersil
->year
+68; /* The base year for sun3 is 1968 */