blob: b70bb538f00165df2d46ec87c27217577ec4b95a [file] [log] [blame]
Michal Simek406107d2009-03-27 14:25:11 +01001/*
2 * Copyright (C) 2007-2009 Michal Simek <monstr@monstr.eu>
3 * Copyright (C) 2007-2009 PetaLogix
4 * Copyright (C) 2007 John Williams <john.williams@petalogix.com>
5 *
6 * This file is subject to the terms and conditions of the GNU General Public
7 * License. See the file "COPYING" in the main directory of this archive
8 * for more details.
9 */
10
Michal Simekc1120542013-12-18 17:18:48 +010011#include <linux/clk.h>
Michal Simek406107d2009-03-27 14:25:11 +010012#include <linux/init.h>
Michal Simek406107d2009-03-27 14:25:11 +010013#include <asm/cpuinfo.h>
14#include <asm/pvr.h>
15
16const struct cpu_ver_key cpu_ver_lookup[] = {
17 /* These key value are as per MBV field in PVR0 */
18 {"5.00.a", 0x01},
19 {"5.00.b", 0x02},
20 {"5.00.c", 0x03},
21 {"6.00.a", 0x04},
22 {"6.00.b", 0x06},
23 {"7.00.a", 0x05},
24 {"7.00.b", 0x07},
25 {"7.10.a", 0x08},
26 {"7.10.b", 0x09},
27 {"7.10.c", 0x0a},
28 {"7.10.d", 0x0b},
Michal Simek94ad8eb2009-07-21 12:47:04 +020029 {"7.20.a", 0x0c},
30 {"7.20.b", 0x0d},
John Williamsf97b4f72009-09-22 09:13:04 +100031 {"7.20.c", 0x0e},
Michal Simek6cec7132009-10-15 13:34:31 +020032 {"7.20.d", 0x0f},
Michal Simekc8983a52009-12-08 17:54:07 +010033 {"7.30.a", 0x10},
Michal Simekf66efec2010-08-13 12:44:17 +020034 {"7.30.b", 0x11},
35 {"8.00.a", 0x12},
Michal Simeka3c26952010-12-28 14:44:51 +010036 {"8.00.b", 0x13},
Michal Simeka9dbe5e2011-02-09 14:23:34 +010037 {"8.10.a", 0x14},
Michal Simek2309f7c2011-05-23 13:06:43 +020038 {"8.20.a", 0x15},
Michal Simek2e7ff472012-02-22 13:50:13 +010039 {"8.20.b", 0x16},
40 {"8.30.a", 0x17},
Michal Simek6dc92c92012-12-19 10:52:19 +010041 {"8.40.a", 0x18},
42 {"8.40.b", 0x19},
Michal Simekc0d68ce2013-11-22 09:01:10 +010043 {"8.50.a", 0x1a},
Erico Nunes81653ed2015-01-02 00:40:33 -020044 {"8.50.b", 0x1c},
45 {"8.50.c", 0x1e},
Michal Simekdcd454a2013-09-03 12:35:36 +020046 {"9.0", 0x1b},
47 {"9.1", 0x1d},
Erico Nunes81653ed2015-01-02 00:40:33 -020048 {"9.2", 0x1f},
49 {"9.3", 0x20},
Michal Simek60587db2015-05-13 08:21:45 +020050 {"9.4", 0x21},
51 {"9.5", 0x22},
Michal Simek406107d2009-03-27 14:25:11 +010052 {NULL, 0},
53};
54
55/*
56 * FIXME Not sure if the actual key is defined by Xilinx in the PVR
57 */
58const struct family_string_key family_string_lookup[] = {
59 {"virtex2", 0x4},
60 {"virtex2pro", 0x5},
61 {"spartan3", 0x6},
62 {"virtex4", 0x7},
63 {"virtex5", 0x8},
64 {"spartan3e", 0x9},
65 {"spartan3a", 0xa},
66 {"spartan3an", 0xb},
67 {"spartan3adsp", 0xc},
John Williamsf97b4f72009-09-22 09:13:04 +100068 {"spartan6", 0xd},
69 {"virtex6", 0xe},
Michal Simeked894662015-01-05 12:01:17 +010070 {"virtex7", 0xf},
Michal Simek406107d2009-03-27 14:25:11 +010071 /* FIXME There is no key code defined for spartan2 */
72 {"spartan2", 0xf0},
Michal Simek6dc92c92012-12-19 10:52:19 +010073 {"kintex7", 0x10},
74 {"artix7", 0x11},
75 {"zynq7000", 0x12},
Michal Simeked894662015-01-05 12:01:17 +010076 {"UltraScale Virtex", 0x13},
77 {"UltraScale Kintex", 0x14},
Michal Simek406107d2009-03-27 14:25:11 +010078 {NULL, 0},
79};
80
81struct cpuinfo cpuinfo;
Michal Simekc1120542013-12-18 17:18:48 +010082static struct device_node *cpu;
Michal Simek406107d2009-03-27 14:25:11 +010083
84void __init setup_cpuinfo(void)
85{
Michal Simek406107d2009-03-27 14:25:11 +010086 cpu = (struct device_node *) of_find_node_by_type(NULL, "cpu");
87 if (!cpu)
Michal Simek6bd55f02012-12-27 10:40:38 +010088 pr_err("You don't have cpu!!!\n");
Michal Simek406107d2009-03-27 14:25:11 +010089
Michal Simek6bd55f02012-12-27 10:40:38 +010090 pr_info("%s: initialising\n", __func__);
Michal Simek406107d2009-03-27 14:25:11 +010091
92 switch (cpu_has_pvr()) {
93 case 0:
Michal Simek6bd55f02012-12-27 10:40:38 +010094 pr_warn("%s: No PVR support. Using static CPU info from FDT\n",
Michal Simek406107d2009-03-27 14:25:11 +010095 __func__);
96 set_cpuinfo_static(&cpuinfo, cpu);
97 break;
Michal Simekfbeda672009-04-21 14:06:08 +020098/* FIXME I found weird behavior with MB 7.00.a/b 7.10.a
Michal Simek406107d2009-03-27 14:25:11 +010099 * please do not use FULL PVR with MMU */
100 case 1:
Michal Simek6bd55f02012-12-27 10:40:38 +0100101 pr_info("%s: Using full CPU PVR support\n",
Michal Simek406107d2009-03-27 14:25:11 +0100102 __func__);
103 set_cpuinfo_static(&cpuinfo, cpu);
104 set_cpuinfo_pvr_full(&cpuinfo, cpu);
105 break;
106 default:
Michal Simek6bd55f02012-12-27 10:40:38 +0100107 pr_warn("%s: Unsupported PVR setting\n", __func__);
Michal Simek406107d2009-03-27 14:25:11 +0100108 set_cpuinfo_static(&cpuinfo, cpu);
109 }
John A. Williams89049762011-05-24 18:57:11 +1000110
111 if (cpuinfo.mmu_privins)
Michal Simek6bd55f02012-12-27 10:40:38 +0100112 pr_warn("%s: Stream instructions enabled"
John A. Williams89049762011-05-24 18:57:11 +1000113 " - USERSPACE CAN LOCK THIS KERNEL!\n", __func__);
Michal Simek406107d2009-03-27 14:25:11 +0100114}
Michal Simekc1120542013-12-18 17:18:48 +0100115
116void __init setup_cpuinfo_clk(void)
117{
118 struct clk *clk;
119
120 clk = of_clk_get(cpu, 0);
121 if (IS_ERR(clk)) {
122 pr_err("ERROR: CPU CCF input clock not found\n");
123 /* take timebase-frequency from DTS */
124 cpuinfo.cpu_clock_freq = fcpu(cpu, "timebase-frequency");
125 } else {
126 cpuinfo.cpu_clock_freq = clk_get_rate(clk);
127 }
128
129 if (!cpuinfo.cpu_clock_freq) {
130 pr_err("ERROR: CPU clock frequency not setup\n");
131 BUG();
132 }
133}