📄 prep_setup.c
字号:
/* * arch/ppc/platforms/setup.c * * Copyright (C) 1995 Linus Torvalds * Adapted from 'alpha' version by Gary Thomas * Modified by Cort Dougan (cort@cs.nmt.edu) * * Support for PReP (Motorola MTX/MVME) * by Troy Benjegerdes (hozer@drgw.net) *//* * bootup setup stuff.. */#include <linux/config.h>#include <linux/delay.h>#include <linux/module.h>#include <linux/errno.h>#include <linux/sched.h>#include <linux/kernel.h>#include <linux/mm.h>#include <linux/stddef.h>#include <linux/unistd.h>#include <linux/ptrace.h>#include <linux/slab.h>#include <linux/user.h>#include <linux/a.out.h>#include <linux/tty.h>#include <linux/major.h>#include <linux/interrupt.h>#include <linux/reboot.h>#include <linux/init.h>#include <linux/blk.h>#include <linux/ioport.h>#include <linux/console.h>#include <linux/timex.h>#include <linux/pci.h>#include <linux/ide.h>#include <linux/seq_file.h>#include <asm/sections.h>#include <asm/mmu.h>#include <asm/processor.h>#include <asm/residual.h>#include <asm/io.h>#include <asm/pgtable.h>#include <asm/cache.h>#include <asm/dma.h>#include <asm/machdep.h>#include <asm/mk48t59.h>#include <asm/prep_nvram.h>#include <asm/raven.h>#include <asm/keyboard.h>#include <asm/vga.h>#include <asm/time.h>#include <asm/i8259.h>#include <asm/open_pic.h>#include <asm/pci-bridge.h>#include <asm/bootinfo.h>unsigned char ucSystemType;unsigned char ucBoardRev;unsigned char ucBoardRevMaj, ucBoardRevMin;extern unsigned long mc146818_get_rtc_time(void);extern int mc146818_set_rtc_time(unsigned long nowtime);extern unsigned long mk48t59_get_rtc_time(void);extern int mk48t59_set_rtc_time(unsigned long nowtime);extern unsigned char prep_nvram_read_val(int addr);extern void prep_nvram_write_val(int addr, unsigned char val);extern unsigned char rs_nvram_read_val(int addr);extern void rs_nvram_write_val(int addr, unsigned char val);extern void ibm_prep_init(void);extern int pckbd_setkeycode(unsigned int scancode, unsigned int keycode);extern int pckbd_getkeycode(unsigned int scancode);extern int pckbd_translate(unsigned char scancode, unsigned char *keycode, char raw_mode);extern char pckbd_unexpected_up(unsigned char keycode);extern void pckbd_leds(unsigned char leds);extern void pckbd_init_hw(void);extern unsigned char pckbd_sysrq_xlate[];extern void prep_find_bridges(void);extern char saved_command_line[];int _prep_type;extern void prep_sandalfoot_setup_pci(char *irq_edge_mask_lo, char *irq_edge_mask_hi);extern void prep_thinkpad_setup_pci(char *irq_edge_mask_lo, char *irq_edge_mask_hi);extern void prep_carolina_setup_pci(char *irq_edge_mask_lo, char *irq_edge_mask_hi);extern void prep_tiger1_setup_pci(char *irq_edge_mask_lo, char *irq_edge_mask_hi);#define cached_21 (((char *)(ppc_cached_irq_mask))[3])#define cached_A1 (((char *)(ppc_cached_irq_mask))[2])/* for the mac fs */kdev_t boot_dev;#ifdef CONFIG_SOUND_CS4232 long ppc_cs4232_dma, ppc_cs4232_dma2;#endifextern PTE *Hash, *Hash_end;extern unsigned long Hash_size, Hash_mask;extern int probingmem;extern unsigned long loops_per_jiffy;#ifdef CONFIG_SOUND_CS4232 EXPORT_SYMBOL(ppc_cs4232_dma);EXPORT_SYMBOL(ppc_cs4232_dma2);#endif/* useful ISA ports */#define PREP_SYSCTL 0x81c/* present in the IBM reference design; possibly identical in Mot boxes: */#define PREP_IBM_SIMM_ID 0x803 /* SIMM size: 32 or 8 MiB */#define PREP_IBM_SIMM_PRESENCE 0x804#define PREP_IBM_EQUIPMENT 0x80c#define PREP_IBM_L2INFO 0x80d#define PREP_IBM_PM1 0x82a /* power management register 1 */#define PREP_IBM_PLANAR 0x852 /* planar ID - identifies the motherboard *//* Equipment Present Register masks: */#define PREP_IBM_EQUIPMENT_RESERVED 0x80#define PREP_IBM_EQUIPMENT_SCSIFUSE 0x40#define PREP_IBM_EQUIPMENT_L2_COPYBACK 0x08#define PREP_IBM_EQUIPMENT_L2_256 0x04#define PREP_IBM_EQUIPMENT_CPU 0x02#define PREP_IBM_EQUIPMENT_L2 0x01/* planar ID values: *//* Sandalfoot/Sandalbow (6015/7020) */#define PREP_IBM_SANDALFOOT 0xfc/* Woodfield, Thinkpad 850/860 (6042/7249) */#define PREP_IBM_THINKPAD 0xff /* planar ID unimplemented *//* PowerSeries 830/850 (6050/6070) */#define PREP_IBM_CAROLINA_IDE_0 0xf0#define PREP_IBM_CAROLINA_IDE_1 0xf1#define PREP_IBM_CAROLINA_IDE_2 0xf2/* 7248-43P */#define PREP_IBM_CAROLINA_SCSI_0 0xf4#define PREP_IBM_CAROLINA_SCSI_1 0xf5#define PREP_IBM_CAROLINA_SCSI_2 0xf6#define PREP_IBM_CAROLINA_SCSI_3 0xf7 /* missing from Carolina Tech Spec *//* Tiger1 (7043-140) */#define PREP_IBM_TIGER1_133 0xd1#define PREP_IBM_TIGER1_166 0xd2#define PREP_IBM_TIGER1_180 0xd3#define PREP_IBM_TIGER1_xxx 0xd4 /* unknown, but probably exists */#define PREP_IBM_TIGER1_333 0xd5 /* missing from Tiger Tech Spec *//* setup_ibm_pci: * set Motherboard_map_name, Motherboard_map, Motherboard_routes. * return 8259 edge/level masks. */void (*setup_ibm_pci)(char *irq_lo, char *irq_hi);extern char *Motherboard_map_name; /* for use in *_cpuinfo *//* * As found in the PReP reference implementation. * Used by Thinkpad, Sandalfoot (6015/7020), and all Motorola PReP. */static void __initprep_gen_enable_l2(void){ outb(inb(PREP_SYSCTL) | 0x3, PREP_SYSCTL);}/* Used by Carolina and Tiger1 */static void __initprep_carolina_enable_l2(void){ outb(inb(PREP_SYSCTL) | 0xc0, PREP_SYSCTL);}/* cpuinfo code common to all IBM PReP */static void __prepprep_ibm_cpuinfo(struct seq_file *m){ unsigned int equip_reg = inb(PREP_IBM_EQUIPMENT); seq_printf(m, "machine\t\t: PReP %s\n", Motherboard_map_name); seq_printf(m, "upgrade cpu\t: "); if (equip_reg & PREP_IBM_EQUIPMENT_CPU) { seq_printf(m, "not "); } seq_printf(m, "present\n"); /* print info about the SCSI fuse */ seq_printf(m, "scsi fuse\t: "); if (equip_reg & PREP_IBM_EQUIPMENT_SCSIFUSE) seq_printf(m, "ok"); else seq_printf(m, "bad"); seq_printf(m, "\n");#ifdef CONFIG_PREP_RESIDUAL /* print info about SIMMs */ if (res->ResidualLength != 0) { int i; seq_printf(m, "simms\t\t: "); for (i = 0; (res->ActualNumMemories) && (i < MAX_MEMS); i++) { if (res->Memories[i].SIMMSize != 0) seq_printf(m, "%d:%ldMiB ", i, (res->Memories[i].SIMMSize > 1024) ? res->Memories[i].SIMMSize>>20 : res->Memories[i].SIMMSize); } seq_printf(m, "\n"); }#endif}static int __prepprep_sandalfoot_cpuinfo(struct seq_file *m){ unsigned int equip_reg = inb(PREP_IBM_EQUIPMENT); prep_ibm_cpuinfo(m); /* report amount and type of L2 cache present */ seq_printf(m, "L2 cache\t: "); if (equip_reg & PREP_IBM_EQUIPMENT_L2) { seq_printf(m, "not present"); } else { if (equip_reg & PREP_IBM_EQUIPMENT_L2_256) seq_printf(m, "256KiB"); else seq_printf(m, "unknown size"); if (equip_reg & PREP_IBM_EQUIPMENT_L2_COPYBACK) seq_printf(m, ", copy-back"); else seq_printf(m, ", write-through"); } seq_printf(m, "\n"); return 0;}static int __prepprep_thinkpad_cpuinfo(struct seq_file *m){ unsigned int equip_reg = inb(PREP_IBM_EQUIPMENT); char *cpubus_speed, *pci_speed; prep_ibm_cpuinfo(m); /* report amount and type of L2 cache present */ seq_printf(m, "l2 cache\t: "); if ((equip_reg & 0x1) == 0) { switch ((equip_reg & 0xc) >> 2) { case 0x0: seq_printf(m, "128KiB look-aside 2-way write-through\n"); break; case 0x1: seq_printf(m, "512KiB look-aside direct-mapped write-back\n"); break; case 0x2: seq_printf(m, "256KiB look-aside 2-way write-through\n"); break; case 0x3: seq_printf(m, "256KiB look-aside direct-mapped write-back\n"); break; } } else { seq_printf(m, "not present\n"); } /* report bus speeds because we can */ if ((equip_reg & 0x80) == 0) { switch ((equip_reg & 0x30) >> 4) { case 0x1: cpubus_speed = "50"; pci_speed = "25"; break; case 0x3: cpubus_speed = "66"; pci_speed = "33"; break; default: cpubus_speed = "unknown"; pci_speed = "unknown"; break; } } else { switch ((equip_reg & 0x30) >> 4) { case 0x1: cpubus_speed = "25"; pci_speed = "25"; break; case 0x2: cpubus_speed = "60"; pci_speed = "30"; break; case 0x3: cpubus_speed = "33"; pci_speed = "33"; break; default: cpubus_speed = "unknown"; pci_speed = "unknown"; break; } } seq_printf(m, "60x bus\t\t: %sMHz\n", cpubus_speed); seq_printf(m, "pci bus\t\t: %sMHz\n", pci_speed); return 0;}static int __prepprep_carolina_cpuinfo(struct seq_file *m){ unsigned int equip_reg = inb(PREP_IBM_EQUIPMENT); prep_ibm_cpuinfo(m); /* report amount and type of L2 cache present */ seq_printf(m, "l2 cache\t: "); if ((equip_reg & 0x1) == 0) { unsigned int l2_reg = inb(PREP_IBM_L2INFO); /* L2 size */ switch ((l2_reg & 0x60) >> 5) { case 0: seq_printf(m, "256KiB"); break; case 1: seq_printf(m, "512KiB"); break; default: seq_printf(m, "unknown size"); break; } /* L2 type */ if ((l2_reg & 0x3) == 0) seq_printf(m, ", async"); else if ((l2_reg & 0x3) == 1) seq_printf(m, ", sync"); else seq_printf(m, ", unknown type"); seq_printf(m, "\n"); } else { seq_printf(m, "not present\n"); } return 0;}static int __prepprep_tiger1_cpuinfo(struct seq_file *m){ unsigned int l2_reg = inb(PREP_IBM_L2INFO); prep_ibm_cpuinfo(m); /* report amount and type of L2 cache present */ seq_printf(m, "l2 cache\t: "); if ((l2_reg & 0xf) == 0xf) { seq_printf(m, "not present\n"); } else { if (l2_reg & 0x8) seq_printf(m, "async, "); else seq_printf(m, "sync burst, "); if (l2_reg & 0x4) seq_printf(m, "parity, "); else seq_printf(m, "no parity, "); switch (l2_reg & 0x3) { case 0x0: seq_printf(m, "256KiB\n"); break; case 0x1: seq_printf(m, "512KiB\n"); break; case 0x2: seq_printf(m, "1MiB\n"); break; default: seq_printf(m, "unknown size\n"); break; } } return 0;}/* Used by all Motorola PReP */static int __prepprep_mot_cpuinfo(struct seq_file *m){ unsigned int cachew = *((unsigned char *)CACHECRBA);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -