⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 setup.c

📁 Linux内核源代码 为压缩文件 是<<Linux内核>>一书中的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* $Id: setup.c,v 1.4 1999/10/09 00:00:57 ralf Exp $ * * setup.c: Baget/MIPS specific setup, including init of the feature struct. * * Copyright (C) 1998 Gleb Raiko & Vladimir Roganov * */#include <linux/init.h>#include <linux/kernel.h>#include <linux/sched.h>#include <asm/irq.h>#include <asm/addrspace.h>#include <asm/reboot.h>#include <asm/baget/baget.h>extern long mips_memory_upper;#define CACHEABLE_STR(val) ((val) ? "not cached" : "cached")#define MIN(a,b)           (((a)<(b)) ? (a):(b)) 		static void __init vac_show(void){ 	int i;	unsigned short val, decode = vac_inw(VAC_DECODE_CTRL);	unsigned short a24_base = vac_inw(VAC_A24_BASE);	unsigned long  a24_addr = ((unsigned long)					   (a24_base & VAC_A24_MASK)) << 16;	char *decode_mode[]  = { "eprom", "vsb", "shared", "dram" };	char *address_mode[] = { "", ", A16", ", A32/A24", ", A32/A24/A16" };	char *state[] = { "", " on write", " on read", " on read/write", };	char *region_mode[] = { "inactive", "shared", "vsb", "vme" };	char *asiz[]        = { "user", "A32", "A16", "A24" };	unsigned short regs[] = { VAC_REG1,     VAC_REG2, VAC_REG3  };	unsigned short bndr[] = { VAC_DRAM_MASK,VAC_BNDR2,VAC_BNDR3 };	unsigned short io_sels[] = { VAC_IOSEL0_CTRL,				     VAC_IOSEL1_CTRL,				     VAC_IOSEL2_CTRL,				     VAC_IOSEL3_CTRL,				     VAC_IOSEL4_CTRL,				     VAC_IOSEL5_CTRL };		printk("[DSACKi %s, DRAMCS%s qualified, boundary%s qualified%s]\n",	       (decode & VAC_DECODE_DSACKI)     ? "on" : "off",	       (decode & VAC_DECODE_QFY_DRAMCS) ? ""   : " not",	       (decode & VAC_DECODE_QFY_BNDR)   ? ""   : " not",	       (decode & VAC_DECODE_FPUCS)      ? ", fpu" : "");	printk("slave0 ");	if (decode & VAC_DECODE_RDR_SLSEL0)		printk("at %08lx (%d MB)\t[dram %s]\n",		       ((unsigned long)vac_inw(VAC_SLSEL0_BASE))<<16,		       ((0xffff ^ vac_inw(VAC_SLSEL0_MASK)) + 1) >> 4,		       (decode & VAC_DECODE_QFY_SLSEL0) ? "qualified" : "");	else		printk("off\n");	printk("slave1 ");	if (decode & VAC_DECODE_RDR_SLSEL1)		printk("at %08lx (%d MB)\t[%s%s, %s]\n",		       ((unsigned long)vac_inw(VAC_SLSEL1_BASE))<<16,		       ((0xffff ^ vac_inw(VAC_SLSEL1_MASK)) + 1) >> 4,		       decode_mode[VAC_DECODE_MODE_VAL(decode)],		       address_mode[VAC_DECODE_CMP_SLSEL1_VAL(decode)],		       (decode & VAC_DECODE_QFY_SLSEL1) ? "qualified" : "");	else		printk("off\n");	printk("icf global at %04x, module at %04x [%s]\n",		       ((unsigned int)			VAC_ICFSEL_GLOBAL_VAL(vac_inw(VAC_ICFSEL_BASE)))<<4,		       ((unsigned int)			VAC_ICFSEL_MODULE_VAL(vac_inw(VAC_ICFSEL_BASE)))<<4,		       (decode & VAC_DECODE_QFY_ICFSEL) ? "qualified" : "");		printk("region0 at 00000000 (%dMB)\t[dram, %s, delay %d cpuclk"	       ", cached]\n",	       (vac_inw(VAC_DRAM_MASK)+1)>>4,	       (decode & VAC_DECODE_DSACK) ? "D32" : "3state",	       VAC_DECODE_CPUCLK_VAL(decode));		for (i = 0; i < sizeof(regs)/sizeof(regs[0]); i++) {		unsigned long from = 			((unsigned long)vac_inw(bndr[i]))<<16;		unsigned long to   = 			((unsigned long)			 ((i+1 == sizeof(bndr)/sizeof(bndr[0])) ? 			  0xff00 : vac_inw(bndr[i+1])))<<16;						val = vac_inw(regs[i]);		printk("region%d at %08lx (%dMB)\t[%s %s/%s, %s]\n", 		       i+1,		       from,		       (unsigned int)((to - from) >> 20),		       region_mode[VAC_REG_MODE(val)],		       asiz[VAC_REG_ASIZ_VAL(val)],		       ((val & VAC_REG_WORD) ?  "D16" : "D32"),		       CACHEABLE_STR(val&VAC_A24_A24_CACHINH));				if (a24_addr >= from && a24_addr < to)			printk("\ta24 at %08lx (%dMB)\t[vme, A24/%s, %s]\n",			       a24_addr,			       MIN((unsigned int)(a24_addr - from)>>20, 32),			       (a24_base & VAC_A24_DATAPATH) ?  "user" :			       ((a24_base & VAC_A24_D32_ENABLE)  ?  				"D32" : "D16"),			       CACHEABLE_STR(a24_base & VAC_A24_A24_CACHINH));	}	printk("region4 at ff000000 (15MB)\t[eprom]\n");	val = vac_inw(VAC_EPROMCS_CTRL);	printk("\t[ack %d cpuclk%s, %s%srecovery %d cpuclk, "	       "read %d%s, write %d%s, assert %d%s]\n",	       VAC_CTRL_DELAY_DSACKI_VAL(val),	       state[val & (VAC_CTRL_IORD|VAC_CTRL_IOWR)],	       (val & VAC_CTRL_DSACK0) ? "dsack0*, " : "",	       (val & VAC_CTRL_DSACK1) ? "dsack1*, " : "",	       VAC_CTRL_RECOVERY_IOSELI_VAL(val),	       VAC_CTRL_DELAY_IORD_VAL(val)/2,	       (VAC_CTRL_DELAY_IORD_VAL(val)&1) ? ".5" : "",	       VAC_CTRL_DELAY_IOWR_VAL(val)/2,	       (VAC_CTRL_DELAY_IOWR_VAL(val)&1) ? ".5" : "",	       VAC_CTRL_DELAY_IOSELI_VAL(val)/2,	       (VAC_CTRL_DELAY_IOSELI_VAL(val)&1) ? ".5" : "");		printk("region5 at fff00000 (896KB)\t[local io, %s]\n",	       CACHEABLE_STR(vac_inw(VAC_A24_BASE) & VAC_A24_IO_CACHINH));	for (i = 0; i < sizeof(io_sels)/sizeof(io_sels[0]); i++) {		val = vac_inw(io_sels[i]);		printk("\tio%d[ack %d cpuclk%s, %s%srecovery %d cpuclk, "		       "\n\t read %d%s cpuclk, write %d%s cpuclk, "		       "assert %d%s%s cpuclk]\n",		       i, 		       VAC_CTRL_DELAY_DSACKI_VAL(val),		       state[val & (VAC_CTRL_IORD|VAC_CTRL_IOWR)],		       (val & VAC_CTRL_DSACK0) ? "dsack0*, " : "",		       (val & VAC_CTRL_DSACK1) ? "dsack1*, " : "",		       VAC_CTRL_RECOVERY_IOSELI_VAL(val),		       VAC_CTRL_DELAY_IORD_VAL(val)/2,		       (VAC_CTRL_DELAY_IORD_VAL(val)&1) ? ".5" : "",		       VAC_CTRL_DELAY_IOWR_VAL(val)/2,		       (VAC_CTRL_DELAY_IOWR_VAL(val)&1) ? ".5" : "",		       VAC_CTRL_DELAY_IOSELI_VAL(val)/2,		       (VAC_CTRL_DELAY_IOSELI_VAL(val)&1) ? ".5" : "",		       (vac_inw(VAC_DEV_LOC) & VAC_DEV_LOC_IOSEL(i)) ? 		          ", id" : "");	}			printk("region6 at fffe0000 (128KB)\t[vme, A16/%s, "	       "not cached]\n",	       (a24_base & VAC_A24_A16D32_ENABLE) ? 	       ((a24_base & VAC_A24_A16D32) ? "D32" : "D16") : "user");		       	val = vac_inw(VAC_SHRCS_CTRL);	printk("shared[ack %d cpuclk%s, %s%srecovery %d cpuclk, "	       "read %d%s, write %d%s, assert %d%s]\n",	       VAC_CTRL_DELAY_DSACKI_VAL(val),	       state[val & (VAC_CTRL_IORD|VAC_CTRL_IOWR)],	       (val & VAC_CTRL_DSACK0) ? "dsack0*, " : "",	       (val & VAC_CTRL_DSACK1) ? "dsack1*, " : "",	       VAC_CTRL_RECOVERY_IOSELI_VAL(val),	       VAC_CTRL_DELAY_IORD_VAL(val)/2,	       (VAC_CTRL_DELAY_IORD_VAL(val)&1) ? ".5" : "",	       VAC_CTRL_DELAY_IOWR_VAL(val)/2,	       (VAC_CTRL_DELAY_IOWR_VAL(val)&1) ? ".5" : "",	       VAC_CTRL_DELAY_IOSELI_VAL(val)/2,	       (VAC_CTRL_DELAY_IOSELI_VAL(val)&1) ? ".5" : "");}static void __init vac_init(void){	unsigned short mem_limit = ((mips_memory_upper-KSEG0) >> 16);	switch(vac_inw(VAC_ID)) {	case 0x1AC0:		printk("VAC068-F5: ");		break;	case 0x1AC1:		printk("VAC068A: ");		break;	default:		panic("Unknown VAC revision number");	}		vac_outw(mem_limit-1, VAC_DRAM_MASK); 	vac_outw(mem_limit, VAC_BNDR2);	vac_outw(mem_limit, VAC_BNDR3);	vac_outw(((BAGET_A24M_BASE>>16)&~VAC_A24_D32_ENABLE)|VAC_A24_DATAPATH,		 VAC_A24_BASE);	vac_outw(VAC_REG_INACTIVE|VAC_REG_ASIZ0,VAC_REG1);	vac_outw(VAC_REG_INACTIVE|VAC_REG_ASIZ0,VAC_REG2);	vac_outw(VAC_REG_MWB|VAC_REG_ASIZ1,VAC_REG3);	vac_outw(BAGET_A24S_BASE>>16,VAC_SLSEL0_BASE);	vac_outw(BAGET_A24S_MASK>>16,VAC_SLSEL0_MASK);	vac_outw(BAGET_A24S_BASE>>16,VAC_SLSEL1_BASE);	vac_outw(BAGET_A24S_MASK>>16,VAC_SLSEL1_MASK);	vac_outw(BAGET_GSW_BASE|BAGET_MSW_BASE(0),VAC_ICFSEL_BASE);	vac_outw(VAC_DECODE_FPUCS|		 VAC_DECODE_CPUCLK(3)|		 VAC_DECODE_RDR_SLSEL0|VAC_DECODE_RDR_SLSEL1|		 VAC_DECODE_DSACK|		 VAC_DECODE_QFY_BNDR|		 VAC_DECODE_QFY_ICFSEL|		 VAC_DECODE_QFY_SLSEL1|VAC_DECODE_QFY_SLSEL0|		 VAC_DECODE_CMP_SLSEL1_HI|		 VAC_DECODE_DRAMCS|		 VAC_DECODE_QFY_DRAMCS|		 VAC_DECODE_DSACKI,VAC_DECODE_CTRL);	vac_outw(VAC_PIO_FUNC_UART_A_TX|VAC_PIO_FUNC_UART_A_RX|		 VAC_PIO_FUNC_UART_B_TX|VAC_PIO_FUNC_UART_B_RX|		 VAC_PIO_FUNC_IOWR|		 VAC_PIO_FUNC_IOSEL3|		 VAC_PIO_FUNC_IRQ7|VAC_PIO_FUNC_IRQ10|VAC_PIO_FUNC_IRQ11|		 VAC_PIO_FUNC_IOSEL2|		 VAC_PIO_FUNC_FCIACK,VAC_PIO_FUNC);	vac_outw(VAC_PIO_DIR_FCIACK |		 VAC_PIO_DIR_OUT(0) |		 VAC_PIO_DIR_OUT(1) |		 VAC_PIO_DIR_OUT(2) |		 VAC_PIO_DIR_OUT(3) |		 VAC_PIO_DIR_IN(4)  |		 VAC_PIO_DIR_OUT(5) |		 VAC_PIO_DIR_OUT(6) |		 VAC_PIO_DIR_OUT(7) |		 VAC_PIO_DIR_OUT(8) |		 VAC_PIO_DIR_IN(9)  |		 VAC_PIO_DIR_OUT(10)|		 VAC_PIO_DIR_OUT(11)|		 VAC_PIO_DIR_OUT(12)|		 VAC_PIO_DIR_OUT(13),VAC_PIO_DIRECTION);	vac_outw(VAC_DEV_LOC_IOSEL(2),VAC_DEV_LOC);	vac_outw(VAC_CTRL_IOWR|		 VAC_CTRL_DELAY_IOWR(3)|		 VAC_CTRL_DELAY_IORD(3)|		 VAC_CTRL_RECOVERY_IOSELI(1)|		 VAC_CTRL_DELAY_DSACKI(8),VAC_SHRCS_CTRL);	vac_outw(VAC_CTRL_IOWR|		 VAC_CTRL_DELAY_IOWR(3)|		 VAC_CTRL_DELAY_IORD(3)|		 VAC_CTRL_RECOVERY_IOSELI(1)|		 VAC_CTRL_DSACK0|VAC_CTRL_DSACK1|		 VAC_CTRL_DELAY_DSACKI(8),VAC_EPROMCS_CTRL);	vac_outw(VAC_CTRL_IOWR|

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -