blob: 234acad79b9ec482ac8b240f84332ba8f30e2b83 [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},
Michal Simekdcd454a2013-09-03 12:35:36 +020044 {"9.0", 0x1b},
45 {"9.1", 0x1d},
Michal Simek406107d2009-03-27 14:25:11 +010046 {NULL, 0},
47};
48
49/*
50 * FIXME Not sure if the actual key is defined by Xilinx in the PVR
51 */
52const struct family_string_key family_string_lookup[] = {
53 {"virtex2", 0x4},
54 {"virtex2pro", 0x5},
55 {"spartan3", 0x6},
56 {"virtex4", 0x7},
57 {"virtex5", 0x8},
58 {"spartan3e", 0x9},
59 {"spartan3a", 0xa},
60 {"spartan3an", 0xb},
61 {"spartan3adsp", 0xc},
John Williamsf97b4f72009-09-22 09:13:04 +100062 {"spartan6", 0xd},
63 {"virtex6", 0xe},
Michal Simek406107d2009-03-27 14:25:11 +010064 /* FIXME There is no key code defined for spartan2 */
65 {"spartan2", 0xf0},
Michal Simek6dc92c92012-12-19 10:52:19 +010066 {"kintex7", 0x10},
67 {"artix7", 0x11},
68 {"zynq7000", 0x12},
Michal Simek406107d2009-03-27 14:25:11 +010069 {NULL, 0},
70};
71
72struct cpuinfo cpuinfo;
Michal Simekc1120542013-12-18 17:18:48 +010073static struct device_node *cpu;
Michal Simek406107d2009-03-27 14:25:11 +010074
75void __init setup_cpuinfo(void)
76{
Michal Simek406107d2009-03-27 14:25:11 +010077 cpu = (struct device_node *) of_find_node_by_type(NULL, "cpu");
78 if (!cpu)
Michal Simek6bd55f02012-12-27 10:40:38 +010079 pr_err("You don't have cpu!!!\n");
Michal Simek406107d2009-03-27 14:25:11 +010080
Michal Simek6bd55f02012-12-27 10:40:38 +010081 pr_info("%s: initialising\n", __func__);
Michal Simek406107d2009-03-27 14:25:11 +010082
83 switch (cpu_has_pvr()) {
84 case 0:
Michal Simek6bd55f02012-12-27 10:40:38 +010085 pr_warn("%s: No PVR support. Using static CPU info from FDT\n",
Michal Simek406107d2009-03-27 14:25:11 +010086 __func__);
87 set_cpuinfo_static(&cpuinfo, cpu);
88 break;
Michal Simekfbeda672009-04-21 14:06:08 +020089/* FIXME I found weird behavior with MB 7.00.a/b 7.10.a
Michal Simek406107d2009-03-27 14:25:11 +010090 * please do not use FULL PVR with MMU */
91 case 1:
Michal Simek6bd55f02012-12-27 10:40:38 +010092 pr_info("%s: Using full CPU PVR support\n",
Michal Simek406107d2009-03-27 14:25:11 +010093 __func__);
94 set_cpuinfo_static(&cpuinfo, cpu);
95 set_cpuinfo_pvr_full(&cpuinfo, cpu);
96 break;
97 default:
Michal Simek6bd55f02012-12-27 10:40:38 +010098 pr_warn("%s: Unsupported PVR setting\n", __func__);
Michal Simek406107d2009-03-27 14:25:11 +010099 set_cpuinfo_static(&cpuinfo, cpu);
100 }
John A. Williams89049762011-05-24 18:57:11 +1000101
102 if (cpuinfo.mmu_privins)
Michal Simek6bd55f02012-12-27 10:40:38 +0100103 pr_warn("%s: Stream instructions enabled"
John A. Williams89049762011-05-24 18:57:11 +1000104 " - USERSPACE CAN LOCK THIS KERNEL!\n", __func__);
Michal Simek406107d2009-03-27 14:25:11 +0100105}
Michal Simekc1120542013-12-18 17:18:48 +0100106
107void __init setup_cpuinfo_clk(void)
108{
109 struct clk *clk;
110
111 clk = of_clk_get(cpu, 0);
112 if (IS_ERR(clk)) {
113 pr_err("ERROR: CPU CCF input clock not found\n");
114 /* take timebase-frequency from DTS */
115 cpuinfo.cpu_clock_freq = fcpu(cpu, "timebase-frequency");
116 } else {
117 cpuinfo.cpu_clock_freq = clk_get_rate(clk);
118 }
119
120 if (!cpuinfo.cpu_clock_freq) {
121 pr_err("ERROR: CPU clock frequency not setup\n");
122 BUG();
123 }
124}