^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * linux/arch/m68k/kernel/setup.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (C) 1995 Hamish Macdonald
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * This file handles the architecture-dependent parts of system setup
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/mm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/sched.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/delay.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include <linux/fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/console.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <linux/genhd.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <linux/errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <linux/string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <linux/init.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <linux/memblock.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <linux/proc_fs.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <linux/seq_file.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include <linux/nvram.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #include <linux/initrd.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #include <asm/bootinfo.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #include <asm/byteorder.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #include <asm/sections.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #include <asm/setup.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #include <asm/fpu.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #include <asm/irq.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #include <asm/io.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #include <asm/machdep.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #ifdef CONFIG_AMIGA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #include <asm/amigahw.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #include <asm/atarihw.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #ifdef CONFIG_ATARI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #include <asm/atari_stram.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #ifdef CONFIG_SUN3X
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #include <asm/dvma.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #include <asm/macintosh.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #include <asm/natfeat.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #if !FPSTATESIZE || !NR_IRQS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #warning No CPU/platform type selected, your kernel will not work!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #warning Are you building an allnoconfig kernel?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) unsigned long m68k_machtype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) EXPORT_SYMBOL(m68k_machtype);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) unsigned long m68k_cputype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) EXPORT_SYMBOL(m68k_cputype);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) unsigned long m68k_fputype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) unsigned long m68k_mmutype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) EXPORT_SYMBOL(m68k_mmutype);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #ifdef CONFIG_VME
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) unsigned long vme_brdtype;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) EXPORT_SYMBOL(vme_brdtype);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) int m68k_is040or060;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) EXPORT_SYMBOL(m68k_is040or060);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) extern unsigned long availmem;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) int m68k_num_memory;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) EXPORT_SYMBOL(m68k_num_memory);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) int m68k_realnum_memory;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) EXPORT_SYMBOL(m68k_realnum_memory);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) unsigned long m68k_memoffset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) struct m68k_mem_info m68k_memory[NUM_MEMINFO];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) EXPORT_SYMBOL(m68k_memory);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) static struct m68k_mem_info m68k_ramdisk __initdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) static char m68k_command_line[CL_SIZE] __initdata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) void (*mach_sched_init) (irq_handler_t handler) __initdata = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) /* machine dependent irq functions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) void (*mach_init_IRQ) (void) __initdata = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) void (*mach_get_model) (char *model);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) void (*mach_get_hardware_list) (struct seq_file *m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) /* machine dependent timer functions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) int (*mach_hwclk) (int, struct rtc_time*);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) EXPORT_SYMBOL(mach_hwclk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) unsigned int (*mach_get_ss)(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) int (*mach_get_rtc_pll)(struct rtc_pll_info *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) int (*mach_set_rtc_pll)(struct rtc_pll_info *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) EXPORT_SYMBOL(mach_get_ss);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) EXPORT_SYMBOL(mach_get_rtc_pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) EXPORT_SYMBOL(mach_set_rtc_pll);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) void (*mach_reset)( void );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) void (*mach_halt)( void );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) void (*mach_power_off)( void );
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) long mach_max_dma_address = 0x00ffffff; /* default set to the lower 16MB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) #ifdef CONFIG_HEARTBEAT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) void (*mach_heartbeat) (int);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) EXPORT_SYMBOL(mach_heartbeat);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) #ifdef CONFIG_M68K_L2_CACHE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) void (*mach_l2_flush) (int);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #if defined(CONFIG_ISA) && defined(MULTI_ISA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) int isa_type;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) int isa_sex;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) EXPORT_SYMBOL(isa_type);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) EXPORT_SYMBOL(isa_sex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) extern int amiga_parse_bootinfo(const struct bi_record *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) extern int atari_parse_bootinfo(const struct bi_record *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) extern int mac_parse_bootinfo(const struct bi_record *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) extern int q40_parse_bootinfo(const struct bi_record *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) extern int bvme6000_parse_bootinfo(const struct bi_record *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) extern int mvme16x_parse_bootinfo(const struct bi_record *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) extern int mvme147_parse_bootinfo(const struct bi_record *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) extern int hp300_parse_bootinfo(const struct bi_record *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) extern int apollo_parse_bootinfo(const struct bi_record *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) extern void config_amiga(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) extern void config_atari(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) extern void config_mac(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) extern void config_sun3(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) extern void config_apollo(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) extern void config_mvme147(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) extern void config_mvme16x(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) extern void config_bvme6000(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) extern void config_hp300(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) extern void config_q40(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) extern void config_sun3x(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) #define MASK_256K 0xfffc0000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) extern void paging_init(void);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) static void __init m68k_parse_bootinfo(const struct bi_record *record)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) uint16_t tag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) save_bootinfo(record);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) while ((tag = be16_to_cpu(record->tag)) != BI_LAST) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) int unknown = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) const void *data = record->data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) uint16_t size = be16_to_cpu(record->size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) switch (tag) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) case BI_MACHTYPE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) case BI_CPUTYPE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) case BI_FPUTYPE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) case BI_MMUTYPE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) /* Already set up by head.S */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) case BI_MEMCHUNK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) if (m68k_num_memory < NUM_MEMINFO) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) const struct mem_info *m = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) m68k_memory[m68k_num_memory].addr =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) be32_to_cpu(m->addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) m68k_memory[m68k_num_memory].size =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) be32_to_cpu(m->size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) m68k_num_memory++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) pr_warn("%s: too many memory chunks\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) __func__);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) case BI_RAMDISK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) const struct mem_info *m = data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) m68k_ramdisk.addr = be32_to_cpu(m->addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) m68k_ramdisk.size = be32_to_cpu(m->size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) case BI_COMMAND_LINE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) strlcpy(m68k_command_line, data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) sizeof(m68k_command_line));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) if (MACH_IS_AMIGA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) unknown = amiga_parse_bootinfo(record);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) else if (MACH_IS_ATARI)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) unknown = atari_parse_bootinfo(record);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) else if (MACH_IS_MAC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) unknown = mac_parse_bootinfo(record);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) else if (MACH_IS_Q40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) unknown = q40_parse_bootinfo(record);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) else if (MACH_IS_BVME6000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) unknown = bvme6000_parse_bootinfo(record);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) else if (MACH_IS_MVME16x)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) unknown = mvme16x_parse_bootinfo(record);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) else if (MACH_IS_MVME147)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) unknown = mvme147_parse_bootinfo(record);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) else if (MACH_IS_HP300)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) unknown = hp300_parse_bootinfo(record);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) else if (MACH_IS_APOLLO)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) unknown = apollo_parse_bootinfo(record);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) unknown = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) if (unknown)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) pr_warn("%s: unknown tag 0x%04x ignored\n", __func__,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) tag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) record = (struct bi_record *)((unsigned long)record + size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) m68k_realnum_memory = m68k_num_memory;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) #ifdef CONFIG_SINGLE_MEMORY_CHUNK
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) if (m68k_num_memory > 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) pr_warn("%s: ignoring last %i chunks of physical memory\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) __func__, (m68k_num_memory - 1));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) m68k_num_memory = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) void __init setup_arch(char **cmdline_p)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) /* The bootinfo is located right after the kernel */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) if (!CPU_IS_COLDFIRE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) m68k_parse_bootinfo((const struct bi_record *)_end);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) if (CPU_IS_040)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) m68k_is040or060 = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) else if (CPU_IS_060)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) m68k_is040or060 = 6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) /* FIXME: m68k_fputype is passed in by Penguin booter, which can
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) * be confused by software FPU emulation. BEWARE.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) * We should really do our own FPU check at startup.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) * [what do we do with buggy 68LC040s? if we have problems
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) * with them, we should add a test to check_bugs() below] */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) #if defined(CONFIG_FPU) && !defined(CONFIG_M68KFPU_EMU_ONLY)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) /* clear the fpu if we have one */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) if (m68k_fputype & (FPU_68881|FPU_68882|FPU_68040|FPU_68060|FPU_COLDFIRE)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) volatile int zero = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) asm volatile ("frestore %0" : : "m" (zero));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) if (CPU_IS_060) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) u32 pcr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) asm (".chip 68060; movec %%pcr,%0; .chip 68k"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) : "=d" (pcr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) if (((pcr >> 8) & 0xff) <= 5) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) pr_warn("Enabling workaround for errata I14\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) asm (".chip 68060; movec %0,%%pcr; .chip 68k"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) : : "d" (pcr | 0x20));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) init_mm.start_code = PAGE_OFFSET;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) init_mm.end_code = (unsigned long)_etext;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) init_mm.end_data = (unsigned long)_edata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) init_mm.brk = (unsigned long)_end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) #if defined(CONFIG_BOOTPARAM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) strncpy(m68k_command_line, CONFIG_BOOTPARAM_STRING, CL_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) m68k_command_line[CL_SIZE - 1] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) #endif /* CONFIG_BOOTPARAM */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) process_uboot_commandline(&m68k_command_line[0], CL_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) *cmdline_p = m68k_command_line;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) memcpy(boot_command_line, *cmdline_p, CL_SIZE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) parse_early_param();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) switch (m68k_machtype) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) #ifdef CONFIG_AMIGA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) case MACH_AMIGA:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) config_amiga();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) #ifdef CONFIG_ATARI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) case MACH_ATARI:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) config_atari();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) #ifdef CONFIG_MAC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) case MACH_MAC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) config_mac();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) #ifdef CONFIG_SUN3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) case MACH_SUN3:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) config_sun3();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) #ifdef CONFIG_APOLLO
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) case MACH_APOLLO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) config_apollo();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) #ifdef CONFIG_MVME147
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) case MACH_MVME147:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) config_mvme147();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) #ifdef CONFIG_MVME16x
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) case MACH_MVME16x:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) config_mvme16x();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) #ifdef CONFIG_BVME6000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) case MACH_BVME6000:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) config_bvme6000();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) #ifdef CONFIG_HP300
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) case MACH_HP300:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) config_hp300();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) #ifdef CONFIG_Q40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) case MACH_Q40:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) config_q40();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) #ifdef CONFIG_SUN3X
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) case MACH_SUN3X:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) config_sun3x();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) #ifdef CONFIG_COLDFIRE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) case MACH_M54XX:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) case MACH_M5441X:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) cf_bootmem_alloc();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) cf_mmu_context_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) config_BSP(NULL, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) panic("No configuration setup");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) paging_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) #ifdef CONFIG_NATFEAT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) nf_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) #ifndef CONFIG_SUN3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) #ifdef CONFIG_BLK_DEV_INITRD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) if (m68k_ramdisk.size) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) memblock_reserve(m68k_ramdisk.addr, m68k_ramdisk.size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) initrd_start = (unsigned long)phys_to_virt(m68k_ramdisk.addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) initrd_end = initrd_start + m68k_ramdisk.size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) pr_info("initrd: %08lx - %08lx\n", initrd_start, initrd_end);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) #ifdef CONFIG_ATARI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) if (MACH_IS_ATARI)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) atari_stram_reserve_pages((void *)availmem);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) #ifdef CONFIG_SUN3X
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) if (MACH_IS_SUN3X) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) dvma_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) #endif /* !CONFIG_SUN3 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) /* set ISA defs early as possible */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) #if defined(CONFIG_ISA) && defined(MULTI_ISA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) if (MACH_IS_Q40) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) isa_type = ISA_TYPE_Q40;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) isa_sex = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) #ifdef CONFIG_AMIGA_PCMCIA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) if (MACH_IS_AMIGA && AMIGAHW_PRESENT(PCMCIA)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) isa_type = ISA_TYPE_AG;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) isa_sex = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) #ifdef CONFIG_ATARI_ROM_ISA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) if (MACH_IS_ATARI) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) isa_type = ISA_TYPE_ENEC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) isa_sex = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) static int show_cpuinfo(struct seq_file *m, void *v)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) const char *cpu, *mmu, *fpu;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) unsigned long clockfreq, clockfactor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) #define LOOP_CYCLES_68020 (8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) #define LOOP_CYCLES_68030 (8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) #define LOOP_CYCLES_68040 (3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) #define LOOP_CYCLES_68060 (1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) #define LOOP_CYCLES_COLDFIRE (2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) if (CPU_IS_020) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) cpu = "68020";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) clockfactor = LOOP_CYCLES_68020;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) } else if (CPU_IS_030) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) cpu = "68030";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) clockfactor = LOOP_CYCLES_68030;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) } else if (CPU_IS_040) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) cpu = "68040";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) clockfactor = LOOP_CYCLES_68040;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) } else if (CPU_IS_060) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) cpu = "68060";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) clockfactor = LOOP_CYCLES_68060;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) } else if (CPU_IS_COLDFIRE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) cpu = "ColdFire";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) clockfactor = LOOP_CYCLES_COLDFIRE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) cpu = "680x0";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) clockfactor = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) #ifdef CONFIG_M68KFPU_EMU_ONLY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) fpu = "none(soft float)";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) if (m68k_fputype & FPU_68881)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) fpu = "68881";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) else if (m68k_fputype & FPU_68882)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) fpu = "68882";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) else if (m68k_fputype & FPU_68040)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) fpu = "68040";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) else if (m68k_fputype & FPU_68060)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) fpu = "68060";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) else if (m68k_fputype & FPU_SUNFPA)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) fpu = "Sun FPA";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) else if (m68k_fputype & FPU_COLDFIRE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) fpu = "ColdFire";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) fpu = "none";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) if (m68k_mmutype & MMU_68851)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) mmu = "68851";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) else if (m68k_mmutype & MMU_68030)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) mmu = "68030";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) else if (m68k_mmutype & MMU_68040)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) mmu = "68040";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) else if (m68k_mmutype & MMU_68060)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) mmu = "68060";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) else if (m68k_mmutype & MMU_SUN3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) mmu = "Sun-3";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) else if (m68k_mmutype & MMU_APOLLO)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) mmu = "Apollo";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) else if (m68k_mmutype & MMU_COLDFIRE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) mmu = "ColdFire";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) mmu = "unknown";
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) clockfreq = loops_per_jiffy * HZ * clockfactor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) seq_printf(m, "CPU:\t\t%s\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) "MMU:\t\t%s\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) "FPU:\t\t%s\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) "Clocking:\t%lu.%1luMHz\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) "BogoMips:\t%lu.%02lu\n"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) "Calibration:\t%lu loops\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) cpu, mmu, fpu,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) clockfreq/1000000,(clockfreq/100000)%10,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) loops_per_jiffy/(500000/HZ),(loops_per_jiffy/(5000/HZ))%100,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) loops_per_jiffy);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) static void *c_start(struct seq_file *m, loff_t *pos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) return *pos < 1 ? (void *)1 : NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) static void *c_next(struct seq_file *m, void *v, loff_t *pos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) ++*pos;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) static void c_stop(struct seq_file *m, void *v)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) const struct seq_operations cpuinfo_op = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) .start = c_start,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) .next = c_next,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) .stop = c_stop,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) .show = show_cpuinfo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) #ifdef CONFIG_PROC_HARDWARE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) static int hardware_proc_show(struct seq_file *m, void *v)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) char model[80];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) unsigned long mem;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) if (mach_get_model)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) mach_get_model(model);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) strcpy(model, "Unknown m68k");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) seq_printf(m, "Model:\t\t%s\n", model);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) for (mem = 0, i = 0; i < m68k_num_memory; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) mem += m68k_memory[i].size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) seq_printf(m, "System Memory:\t%ldK\n", mem >> 10);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) if (mach_get_hardware_list)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) mach_get_hardware_list(m);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) static int __init proc_hardware_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) proc_create_single("hardware", 0, NULL, hardware_proc_show);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) module_init(proc_hardware_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) void check_bugs(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) #if defined(CONFIG_FPU) && !defined(CONFIG_M68KFPU_EMU)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) if (m68k_fputype == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) pr_emerg("*** YOU DO NOT HAVE A FLOATING POINT UNIT, "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) "WHICH IS REQUIRED BY LINUX/M68K ***\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) pr_emerg("Upgrade your hardware or join the FPU "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) "emulation project\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) panic("no FPU");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) #endif /* !CONFIG_M68KFPU_EMU */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) #ifdef CONFIG_ADB
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) static int __init adb_probe_sync_enable (char *str) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) extern int __adb_probe_sync;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) __adb_probe_sync = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) __setup("adb_sync", adb_probe_sync_enable);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) #endif /* CONFIG_ADB */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) #if IS_ENABLED(CONFIG_NVRAM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) #ifdef CONFIG_MAC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) static unsigned char m68k_nvram_read_byte(int addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) if (MACH_IS_MAC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) return mac_pram_read_byte(addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) return 0xff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) static void m68k_nvram_write_byte(unsigned char val, int addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) if (MACH_IS_MAC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) mac_pram_write_byte(val, addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) #endif /* CONFIG_MAC */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) #ifdef CONFIG_ATARI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) static ssize_t m68k_nvram_read(char *buf, size_t count, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) if (MACH_IS_ATARI)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) return atari_nvram_read(buf, count, ppos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) else if (MACH_IS_MAC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) return nvram_read_bytes(buf, count, ppos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) static ssize_t m68k_nvram_write(char *buf, size_t count, loff_t *ppos)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) if (MACH_IS_ATARI)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) return atari_nvram_write(buf, count, ppos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) else if (MACH_IS_MAC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) return nvram_write_bytes(buf, count, ppos);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) static long m68k_nvram_set_checksum(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) if (MACH_IS_ATARI)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) return atari_nvram_set_checksum();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) static long m68k_nvram_initialize(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) if (MACH_IS_ATARI)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) return atari_nvram_initialize();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) #endif /* CONFIG_ATARI */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) static ssize_t m68k_nvram_get_size(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) if (MACH_IS_ATARI)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) return atari_nvram_get_size();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) else if (MACH_IS_MAC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) return mac_pram_get_size();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) /* Atari device drivers call .read (to get checksum validation) whereas
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) * Mac and PowerMac device drivers just use .read_byte.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) const struct nvram_ops arch_nvram_ops = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) #ifdef CONFIG_MAC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) .read_byte = m68k_nvram_read_byte,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) .write_byte = m68k_nvram_write_byte,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) #ifdef CONFIG_ATARI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) .read = m68k_nvram_read,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) .write = m68k_nvram_write,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) .set_checksum = m68k_nvram_set_checksum,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) .initialize = m68k_nvram_initialize,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) .get_size = m68k_nvram_get_size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) EXPORT_SYMBOL(arch_nvram_ops);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) #endif /* CONFIG_NVRAM */