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 externchar _text
, _end
; 36 static int kernel_start
, kernel_end
; 37 char sun3_reserved_pmeg
[SUN3_PMEGS_NUM
]; 39 static unsigned longsun3_gettimeoffset(void); 40 externintsun3_get_irq_list(char*); 41 externvoidsun3_sched_init(void(*handler
)(int,void*,struct pt_regs
*)); 42 externvoidsun3_init_IRQ(void); 43 externvoid(*sun3_default_handler
[]) (int,void*,struct pt_regs
*); 44 externintsun3_request_irq(unsigned int irq
,void(*handler
)(int,void*,struct pt_regs
*), 45 unsigned long flags
,const char*devname
,void*dev_id
); 46 externvoidsun3_free_irq(unsigned int irq
,void*dev_id
); 47 externvoidsun3_enable_irq(unsigned int); 48 externvoidsun3_disable_irq(unsigned int); 49 externvoidsun3_enable_interrupts(void); 50 externvoidsun3_disable_interrupts(void); 51 externvoidsun3_get_model(unsigned char* model
); 52 externvoididprom_init(void); 53 voidsun3_gettod(int*yearp
,int*monp
,int*dayp
, 54 int*hourp
,int*minp
,int*secp
); 56 externunsigned longsun_serial_setup(unsigned long memory_start
); 57 volatilechar* clock_va
; 58 externunsigned 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 voidsun3_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 longsun3_gettimeoffset(void) 161 voidsun3_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 */