| 
									
										
										
										
											2009-03-27 14:25:11 +01:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (C) 2007-2009 Michal Simek <monstr@monstr.eu> | 
					
						
							|  |  |  |  * Copyright (C) 2007-2009 PetaLogix | 
					
						
							|  |  |  |  * Copyright (C) 2007 John Williams <john.williams@petalogix.com> | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This file is subject to the terms and conditions of the GNU General Public | 
					
						
							|  |  |  |  * License. See the file "COPYING" in the main directory of this archive | 
					
						
							|  |  |  |  * for more details. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-18 17:18:48 +01:00
										 |  |  | #include <linux/clk.h>
 | 
					
						
							| 
									
										
										
										
											2009-03-27 14:25:11 +01:00
										 |  |  | #include <linux/init.h>
 | 
					
						
							|  |  |  | #include <asm/cpuinfo.h>
 | 
					
						
							|  |  |  | #include <asm/pvr.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const struct cpu_ver_key cpu_ver_lookup[] = { | 
					
						
							|  |  |  | 	/* These key value are as per MBV field in PVR0 */ | 
					
						
							|  |  |  | 	{"5.00.a", 0x01}, | 
					
						
							|  |  |  | 	{"5.00.b", 0x02}, | 
					
						
							|  |  |  | 	{"5.00.c", 0x03}, | 
					
						
							|  |  |  | 	{"6.00.a", 0x04}, | 
					
						
							|  |  |  | 	{"6.00.b", 0x06}, | 
					
						
							|  |  |  | 	{"7.00.a", 0x05}, | 
					
						
							|  |  |  | 	{"7.00.b", 0x07}, | 
					
						
							|  |  |  | 	{"7.10.a", 0x08}, | 
					
						
							|  |  |  | 	{"7.10.b", 0x09}, | 
					
						
							|  |  |  | 	{"7.10.c", 0x0a}, | 
					
						
							|  |  |  | 	{"7.10.d", 0x0b}, | 
					
						
							| 
									
										
										
										
											2009-07-21 12:47:04 +02:00
										 |  |  | 	{"7.20.a", 0x0c}, | 
					
						
							|  |  |  | 	{"7.20.b", 0x0d}, | 
					
						
							| 
									
										
										
										
											2009-09-22 09:13:04 +10:00
										 |  |  | 	{"7.20.c", 0x0e}, | 
					
						
							| 
									
										
										
										
											2009-10-15 13:34:31 +02:00
										 |  |  | 	{"7.20.d", 0x0f}, | 
					
						
							| 
									
										
										
										
											2009-12-08 17:54:07 +01:00
										 |  |  | 	{"7.30.a", 0x10}, | 
					
						
							| 
									
										
										
										
											2010-08-13 12:44:17 +02:00
										 |  |  | 	{"7.30.b", 0x11}, | 
					
						
							|  |  |  | 	{"8.00.a", 0x12}, | 
					
						
							| 
									
										
										
										
											2010-12-28 14:44:51 +01:00
										 |  |  | 	{"8.00.b", 0x13}, | 
					
						
							| 
									
										
										
										
											2011-02-09 14:23:34 +01:00
										 |  |  | 	{"8.10.a", 0x14}, | 
					
						
							| 
									
										
										
										
											2011-05-23 13:06:43 +02:00
										 |  |  | 	{"8.20.a", 0x15}, | 
					
						
							| 
									
										
										
										
											2012-02-22 13:50:13 +01:00
										 |  |  | 	{"8.20.b", 0x16}, | 
					
						
							|  |  |  | 	{"8.30.a", 0x17}, | 
					
						
							| 
									
										
										
										
											2012-12-19 10:52:19 +01:00
										 |  |  | 	{"8.40.a", 0x18}, | 
					
						
							|  |  |  | 	{"8.40.b", 0x19}, | 
					
						
							| 
									
										
										
										
											2013-11-22 09:01:10 +01:00
										 |  |  | 	{"8.50.a", 0x1a}, | 
					
						
							| 
									
										
										
										
											2013-09-03 12:35:36 +02:00
										 |  |  | 	{"9.0", 0x1b}, | 
					
						
							|  |  |  | 	{"9.1", 0x1d}, | 
					
						
							| 
									
										
										
										
											2009-03-27 14:25:11 +01:00
										 |  |  | 	{NULL, 0}, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * FIXME Not sure if the actual key is defined by Xilinx in the PVR | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | const struct family_string_key family_string_lookup[] = { | 
					
						
							|  |  |  | 	{"virtex2", 0x4}, | 
					
						
							|  |  |  | 	{"virtex2pro", 0x5}, | 
					
						
							|  |  |  | 	{"spartan3", 0x6}, | 
					
						
							|  |  |  | 	{"virtex4", 0x7}, | 
					
						
							|  |  |  | 	{"virtex5", 0x8}, | 
					
						
							|  |  |  | 	{"spartan3e", 0x9}, | 
					
						
							|  |  |  | 	{"spartan3a", 0xa}, | 
					
						
							|  |  |  | 	{"spartan3an", 0xb}, | 
					
						
							|  |  |  | 	{"spartan3adsp", 0xc}, | 
					
						
							| 
									
										
										
										
											2009-09-22 09:13:04 +10:00
										 |  |  | 	{"spartan6", 0xd}, | 
					
						
							|  |  |  | 	{"virtex6", 0xe}, | 
					
						
							| 
									
										
										
										
											2009-03-27 14:25:11 +01:00
										 |  |  | 	/* FIXME There is no key code defined for spartan2 */ | 
					
						
							|  |  |  | 	{"spartan2", 0xf0}, | 
					
						
							| 
									
										
										
										
											2012-12-19 10:52:19 +01:00
										 |  |  | 	{"kintex7", 0x10}, | 
					
						
							|  |  |  | 	{"artix7", 0x11}, | 
					
						
							|  |  |  | 	{"zynq7000", 0x12}, | 
					
						
							| 
									
										
										
										
											2009-03-27 14:25:11 +01:00
										 |  |  | 	{NULL, 0}, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct cpuinfo cpuinfo; | 
					
						
							| 
									
										
										
										
											2013-12-18 17:18:48 +01:00
										 |  |  | static struct device_node *cpu; | 
					
						
							| 
									
										
										
										
											2009-03-27 14:25:11 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | void __init setup_cpuinfo(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	cpu = (struct device_node *) of_find_node_by_type(NULL, "cpu"); | 
					
						
							|  |  |  | 	if (!cpu) | 
					
						
							| 
									
										
										
										
											2012-12-27 10:40:38 +01:00
										 |  |  | 		pr_err("You don't have cpu!!!\n"); | 
					
						
							| 
									
										
										
										
											2009-03-27 14:25:11 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-12-27 10:40:38 +01:00
										 |  |  | 	pr_info("%s: initialising\n", __func__); | 
					
						
							| 
									
										
										
										
											2009-03-27 14:25:11 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	switch (cpu_has_pvr()) { | 
					
						
							|  |  |  | 	case 0: | 
					
						
							| 
									
										
										
										
											2012-12-27 10:40:38 +01:00
										 |  |  | 		pr_warn("%s: No PVR support. Using static CPU info from FDT\n", | 
					
						
							| 
									
										
										
										
											2009-03-27 14:25:11 +01:00
										 |  |  | 			__func__); | 
					
						
							|  |  |  | 		set_cpuinfo_static(&cpuinfo, cpu); | 
					
						
							|  |  |  | 		break; | 
					
						
							| 
									
										
										
										
											2009-04-21 14:06:08 +02:00
										 |  |  | /* FIXME I found weird behavior with MB 7.00.a/b 7.10.a
 | 
					
						
							| 
									
										
										
										
											2009-03-27 14:25:11 +01:00
										 |  |  |  * please do not use FULL PVR with MMU */ | 
					
						
							|  |  |  | 	case 1: | 
					
						
							| 
									
										
										
										
											2012-12-27 10:40:38 +01:00
										 |  |  | 		pr_info("%s: Using full CPU PVR support\n", | 
					
						
							| 
									
										
										
										
											2009-03-27 14:25:11 +01:00
										 |  |  | 			__func__); | 
					
						
							|  |  |  | 		set_cpuinfo_static(&cpuinfo, cpu); | 
					
						
							|  |  |  | 		set_cpuinfo_pvr_full(&cpuinfo, cpu); | 
					
						
							|  |  |  | 		break; | 
					
						
							|  |  |  | 	default: | 
					
						
							| 
									
										
										
										
											2012-12-27 10:40:38 +01:00
										 |  |  | 		pr_warn("%s: Unsupported PVR setting\n", __func__); | 
					
						
							| 
									
										
										
										
											2009-03-27 14:25:11 +01:00
										 |  |  | 		set_cpuinfo_static(&cpuinfo, cpu); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2011-05-24 18:57:11 +10:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (cpuinfo.mmu_privins) | 
					
						
							| 
									
										
										
										
											2012-12-27 10:40:38 +01:00
										 |  |  | 		pr_warn("%s: Stream instructions enabled" | 
					
						
							| 
									
										
										
										
											2011-05-24 18:57:11 +10:00
										 |  |  | 			" - USERSPACE CAN LOCK THIS KERNEL!\n", __func__); | 
					
						
							| 
									
										
										
										
											2009-03-27 14:25:11 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2013-12-18 17:18:48 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | void __init setup_cpuinfo_clk(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	struct clk *clk; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	clk = of_clk_get(cpu, 0); | 
					
						
							|  |  |  | 	if (IS_ERR(clk)) { | 
					
						
							|  |  |  | 		pr_err("ERROR: CPU CCF input clock not found\n"); | 
					
						
							|  |  |  | 		/* take timebase-frequency from DTS */ | 
					
						
							|  |  |  | 		cpuinfo.cpu_clock_freq = fcpu(cpu, "timebase-frequency"); | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		cpuinfo.cpu_clock_freq = clk_get_rate(clk); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (!cpuinfo.cpu_clock_freq) { | 
					
						
							|  |  |  | 		pr_err("ERROR: CPU clock frequency not setup\n"); | 
					
						
							|  |  |  | 		BUG(); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } |