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

📄 cpu-probe.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
		             MIPS_CPU_WATCH | MIPS_CPU_LLSC;		c->tlbsize = 48;		break;	case PRID_IMP_NEVADA:		c->cputype = CPU_NEVADA;		c->isa_level = MIPS_CPU_ISA_IV;		c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR |		             MIPS_CPU_DIVEC | MIPS_CPU_LLSC;		c->tlbsize = 48;		break;	case PRID_IMP_R6000:		c->cputype = CPU_R6000;		c->isa_level = MIPS_CPU_ISA_II;		c->options = MIPS_CPU_TLB | MIPS_CPU_FPU |		             MIPS_CPU_LLSC;		c->tlbsize = 32;		break;	case PRID_IMP_R6000A:		c->cputype = CPU_R6000A;		c->isa_level = MIPS_CPU_ISA_II;		c->options = MIPS_CPU_TLB | MIPS_CPU_FPU |		             MIPS_CPU_LLSC;		c->tlbsize = 32;		break;	case PRID_IMP_RM7000:		c->cputype = CPU_RM7000;		c->isa_level = MIPS_CPU_ISA_IV;		c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR |		             MIPS_CPU_LLSC;		/*		 * Undocumented RM7000:  Bit 29 in the info register of		 * the RM7000 v2.0 indicates if the TLB has 48 or 64		 * entries.		 *		 * 29      1 =>    64 entry JTLB		 *         0 =>    48 entry JTLB		 */		c->tlbsize = (read_c0_info() & (1 << 29)) ? 64 : 48;		break;	case PRID_IMP_RM9000:		c->cputype = CPU_RM9000;		c->isa_level = MIPS_CPU_ISA_IV;		c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR |		             MIPS_CPU_LLSC;		/*		 * Bit 29 in the info register of the RM9000		 * indicates if the TLB has 48 or 64 entries.		 *		 * 29      1 =>    64 entry JTLB		 *         0 =>    48 entry JTLB		 */		c->tlbsize = (read_c0_info() & (1 << 29)) ? 64 : 48;		break;	case PRID_IMP_R8000:		c->cputype = CPU_R8000;		c->isa_level = MIPS_CPU_ISA_IV;		c->options = MIPS_CPU_TLB | MIPS_CPU_4KEX |		             MIPS_CPU_FPU | MIPS_CPU_32FPR |		             MIPS_CPU_LLSC;		c->tlbsize = 384;      /* has weird TLB: 3-way x 128 */		break;	case PRID_IMP_R10000:		c->cputype = CPU_R10000;		c->isa_level = MIPS_CPU_ISA_IV;		c->options = MIPS_CPU_TLB | MIPS_CPU_4K_CACHE | MIPS_CPU_4KEX |		             MIPS_CPU_FPU | MIPS_CPU_32FPR |			     MIPS_CPU_COUNTER | MIPS_CPU_WATCH |		             MIPS_CPU_LLSC;		c->tlbsize = 64;		break;	case PRID_IMP_R12000:		c->cputype = CPU_R12000;		c->isa_level = MIPS_CPU_ISA_IV;		c->options = MIPS_CPU_TLB | MIPS_CPU_4K_CACHE | MIPS_CPU_4KEX |		             MIPS_CPU_FPU | MIPS_CPU_32FPR |			     MIPS_CPU_COUNTER | MIPS_CPU_WATCH |		             MIPS_CPU_LLSC;		c->tlbsize = 64;		break;	}}static inline unsigned int decode_config0(struct cpuinfo_mips *c){	unsigned int config0;	int isa;	config0 = read_c0_config();	if (((config0 & MIPS_CONF_MT) >> 7) == 1)		c->options |= MIPS_CPU_TLB;	isa = (config0 & MIPS_CONF_AT) >> 13;	switch (isa) {	case 0:		c->isa_level = MIPS_CPU_ISA_M32;		break;	case 2:		c->isa_level = MIPS_CPU_ISA_M64;		break;	default:		panic("Unsupported ISA type, cp0.config0.at: %d.", isa);	}	return config0 & MIPS_CONF_M;}static inline unsigned int decode_config1(struct cpuinfo_mips *c){	unsigned int config1;	config1 = read_c0_config1();	if (config1 & MIPS_CONF1_MD)		c->ases |= MIPS_ASE_MDMX;	if (config1 & MIPS_CONF1_WR)		c->options |= MIPS_CPU_WATCH;	if (config1 & MIPS_CONF1_CA)		c->ases |= MIPS_ASE_MIPS16;	if (config1 & MIPS_CONF1_EP)		c->options |= MIPS_CPU_EJTAG;	if (config1 & MIPS_CONF1_FP) {		c->options |= MIPS_CPU_FPU;		c->options |= MIPS_CPU_32FPR;	}	if (cpu_has_tlb)		c->tlbsize = ((config1 & MIPS_CONF1_TLBS) >> 25) + 1;	return config1 & MIPS_CONF_M;}static inline unsigned int decode_config2(struct cpuinfo_mips *c){	unsigned int config2;	config2 = read_c0_config2();	if (config2 & MIPS_CONF2_SL)		c->scache.flags &= ~MIPS_CACHE_NOT_PRESENT;	return config2 & MIPS_CONF_M;}static inline unsigned int decode_config3(struct cpuinfo_mips *c){	unsigned int config3;	config3 = read_c0_config3();	if (config3 & MIPS_CONF3_SM)		c->ases |= MIPS_ASE_SMARTMIPS;	if (config3 & MIPS_CONF3_DSP)		c->ases |= MIPS_ASE_DSP;	if (config3 & MIPS_CONF3_VINT)		c->options |= MIPS_CPU_VINT;	if (config3 & MIPS_CONF3_VEIC)		c->options |= MIPS_CPU_VEIC;	if (config3 & MIPS_CONF3_MT)                c->ases |= MIPS_ASE_MIPSMT;	return config3 & MIPS_CONF_M;}static inline void decode_configs(struct cpuinfo_mips *c){	/* MIPS32 or MIPS64 compliant CPU.  */	c->options = MIPS_CPU_4KEX | MIPS_CPU_4K_CACHE | MIPS_CPU_COUNTER |	             MIPS_CPU_DIVEC | MIPS_CPU_LLSC | MIPS_CPU_MCHECK;	c->scache.flags = MIPS_CACHE_NOT_PRESENT;	/* Read Config registers.  */	if (!decode_config0(c))		return;			/* actually worth a panic() */	if (!decode_config1(c))		return;	if (!decode_config2(c))		return;	if (!decode_config3(c))		return;}static inline void cpu_probe_mips(struct cpuinfo_mips *c){	decode_configs(c);	switch (c->processor_id & 0xff00) {	case PRID_IMP_4KC:		c->cputype = CPU_4KC;		break;	case PRID_IMP_4KEC:		c->cputype = CPU_4KEC;		break;	case PRID_IMP_4KECR2:		c->cputype = CPU_4KEC;		break;	case PRID_IMP_4KSC:	case PRID_IMP_4KSD:		c->cputype = CPU_4KSC;		break;	case PRID_IMP_5KC:		c->cputype = CPU_5KC;		break;	case PRID_IMP_20KC:		c->cputype = CPU_20KC;		break;	case PRID_IMP_24K:	case PRID_IMP_24KE:		c->cputype = CPU_24K;		break;	case PRID_IMP_25KF:		c->cputype = CPU_25KF;		/* Probe for L2 cache */		c->scache.flags &= ~MIPS_CACHE_NOT_PRESENT;		break;	case PRID_IMP_34K:		c->cputype = CPU_34K;		c->isa_level = MIPS_CPU_ISA_M32;		break;	}}static inline void cpu_probe_alchemy(struct cpuinfo_mips *c){	decode_configs(c);	switch (c->processor_id & 0xff00) {	case PRID_IMP_AU1_REV1:	case PRID_IMP_AU1_REV2:		switch ((c->processor_id >> 24) & 0xff) {		case 0: 			c->cputype = CPU_AU1000;			break;		case 1:			c->cputype = CPU_AU1500;			break;		case 2:			c->cputype = CPU_AU1100;			break;		case 3:			c->cputype = CPU_AU1550;			break;		case 4:			c->cputype = CPU_AU1200;			break;		default:			panic("Unknown Au Core!");			break;		}		break;	}}static inline void cpu_probe_sibyte(struct cpuinfo_mips *c){	decode_configs(c);	/*	 * For historical reasons the SB1 comes with it's own variant of	 * cache code which eventually will be folded into c-r4k.c.  Until	 * then we pretend it's got it's own cache architecture.	 */	c->options &= ~MIPS_CPU_4K_CACHE;	c->options |= MIPS_CPU_SB1_CACHE;	switch (c->processor_id & 0xff00) {	case PRID_IMP_SB1:		c->cputype = CPU_SB1;#ifdef CONFIG_SB1_PASS_1_WORKAROUNDS		/* FPU in pass1 is known to have issues. */		c->options &= ~(MIPS_CPU_FPU | MIPS_CPU_32FPR);#endif		break;	case PRID_IMP_SB1A:		c->cputype = CPU_SB1A;		break;	}}static inline void cpu_probe_sandcraft(struct cpuinfo_mips *c){	decode_configs(c);	switch (c->processor_id & 0xff00) {	case PRID_IMP_SR71000:		c->cputype = CPU_SR71000;		c->scache.ways = 8;		c->tlbsize = 64;		break;	}}static inline void cpu_probe_philips(struct cpuinfo_mips *c){	decode_configs(c);	switch (c->processor_id & 0xff00) {	case PRID_IMP_PR4450:		c->cputype = CPU_PR4450;		c->isa_level = MIPS_CPU_ISA_M32;		break;	default:		panic("Unknown Philips Core!"); /* REVISIT: die? */		break;	}}__init void cpu_probe(void){	struct cpuinfo_mips *c = &current_cpu_data;	c->processor_id	= PRID_IMP_UNKNOWN;	c->fpu_id	= FPIR_IMP_NONE;	c->cputype	= CPU_UNKNOWN;	c->processor_id = read_c0_prid();	switch (c->processor_id & 0xff0000) {	case PRID_COMP_LEGACY:		cpu_probe_legacy(c);		break;	case PRID_COMP_MIPS:		cpu_probe_mips(c);		break;	case PRID_COMP_ALCHEMY:		cpu_probe_alchemy(c);		break;	case PRID_COMP_SIBYTE:		cpu_probe_sibyte(c);		break;	case PRID_COMP_SANDCRAFT:		cpu_probe_sandcraft(c);		break; 	case PRID_COMP_PHILIPS:		cpu_probe_philips(c); 		break;	default:		c->cputype = CPU_UNKNOWN;	}	if (c->options & MIPS_CPU_FPU) {		c->fpu_id = cpu_get_fpu_id();		if (c->isa_level == MIPS_CPU_ISA_M32 ||		    c->isa_level == MIPS_CPU_ISA_M64) {			if (c->fpu_id & MIPS_FPIR_3D)				c->ases |= MIPS_ASE_MIPS3D;		}	}}__init void cpu_report(void){	struct cpuinfo_mips *c = &current_cpu_data;	printk("CPU revision is: %08x\n", c->processor_id);	if (c->options & MIPS_CPU_FPU)		printk("FPU revision is: %08x\n", c->fpu_id);}

⌨️ 快捷键说明

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