1406107daSMichal Simek /* 2406107daSMichal Simek * Copyright (C) 2007-2009 Michal Simek <monstr@monstr.eu> 3406107daSMichal Simek * Copyright (C) 2007-2009 PetaLogix 4406107daSMichal Simek * Copyright (C) 2007 John Williams <john.williams@petalogix.com> 5406107daSMichal Simek * 6406107daSMichal Simek * This file is subject to the terms and conditions of the GNU General Public 7406107daSMichal Simek * License. See the file "COPYING" in the main directory of this archive 8406107daSMichal Simek * for more details. 9406107daSMichal Simek */ 10406107daSMichal Simek 11c1120542SMichal Simek #include <linux/clk.h> 12406107daSMichal Simek #include <linux/init.h> 13406107daSMichal Simek #include <asm/cpuinfo.h> 14406107daSMichal Simek #include <asm/pvr.h> 15406107daSMichal Simek 16406107daSMichal Simek const struct cpu_ver_key cpu_ver_lookup[] = { 17406107daSMichal Simek /* These key value are as per MBV field in PVR0 */ 18406107daSMichal Simek {"5.00.a", 0x01}, 19406107daSMichal Simek {"5.00.b", 0x02}, 20406107daSMichal Simek {"5.00.c", 0x03}, 21406107daSMichal Simek {"6.00.a", 0x04}, 22406107daSMichal Simek {"6.00.b", 0x06}, 23406107daSMichal Simek {"7.00.a", 0x05}, 24406107daSMichal Simek {"7.00.b", 0x07}, 25406107daSMichal Simek {"7.10.a", 0x08}, 26406107daSMichal Simek {"7.10.b", 0x09}, 27406107daSMichal Simek {"7.10.c", 0x0a}, 28406107daSMichal Simek {"7.10.d", 0x0b}, 2994ad8eb8SMichal Simek {"7.20.a", 0x0c}, 3094ad8eb8SMichal Simek {"7.20.b", 0x0d}, 31f97b4f7dSJohn Williams {"7.20.c", 0x0e}, 326cec713bSMichal Simek {"7.20.d", 0x0f}, 33c8983a5cSMichal Simek {"7.30.a", 0x10}, 34f66efecaSMichal Simek {"7.30.b", 0x11}, 35f66efecaSMichal Simek {"8.00.a", 0x12}, 36a3c26959SMichal Simek {"8.00.b", 0x13}, 37a9dbe5ebSMichal Simek {"8.10.a", 0x14}, 382309f7cfSMichal Simek {"8.20.a", 0x15}, 392e7ff478SMichal Simek {"8.20.b", 0x16}, 402e7ff478SMichal Simek {"8.30.a", 0x17}, 416dc92c9cSMichal Simek {"8.40.a", 0x18}, 426dc92c9cSMichal Simek {"8.40.b", 0x19}, 43c0d68ceaSMichal Simek {"8.50.a", 0x1a}, 4481653eddSErico Nunes {"8.50.b", 0x1c}, 4581653eddSErico Nunes {"8.50.c", 0x1e}, 46dcd454afSMichal Simek {"9.0", 0x1b}, 47dcd454afSMichal Simek {"9.1", 0x1d}, 4881653eddSErico Nunes {"9.2", 0x1f}, 4981653eddSErico Nunes {"9.3", 0x20}, 5060587dbbSMichal Simek {"9.4", 0x21}, 5160587dbbSMichal Simek {"9.5", 0x22}, 528ee80500SMichal Simek {"9.6", 0x23}, 538ee80500SMichal Simek {"10.0", 0x24}, 54*6aa71ef9SMichal Simek {"11.0", 0x25}, 55406107daSMichal Simek {NULL, 0}, 56406107daSMichal Simek }; 57406107daSMichal Simek 58406107daSMichal Simek /* 59406107daSMichal Simek * FIXME Not sure if the actual key is defined by Xilinx in the PVR 60406107daSMichal Simek */ 61406107daSMichal Simek const struct family_string_key family_string_lookup[] = { 62406107daSMichal Simek {"virtex2", 0x4}, 63406107daSMichal Simek {"virtex2pro", 0x5}, 64406107daSMichal Simek {"spartan3", 0x6}, 65406107daSMichal Simek {"virtex4", 0x7}, 66406107daSMichal Simek {"virtex5", 0x8}, 67406107daSMichal Simek {"spartan3e", 0x9}, 68406107daSMichal Simek {"spartan3a", 0xa}, 69406107daSMichal Simek {"spartan3an", 0xb}, 70406107daSMichal Simek {"spartan3adsp", 0xc}, 71f97b4f7dSJohn Williams {"spartan6", 0xd}, 72f97b4f7dSJohn Williams {"virtex6", 0xe}, 73ed89466fSMichal Simek {"virtex7", 0xf}, 74406107daSMichal Simek /* FIXME There is no key code defined for spartan2 */ 75406107daSMichal Simek {"spartan2", 0xf0}, 766dc92c9cSMichal Simek {"kintex7", 0x10}, 776dc92c9cSMichal Simek {"artix7", 0x11}, 786dc92c9cSMichal Simek {"zynq7000", 0x12}, 79ed89466fSMichal Simek {"UltraScale Virtex", 0x13}, 80ed89466fSMichal Simek {"UltraScale Kintex", 0x14}, 813400606dSMichal Simek {"UltraScale+ Zynq", 0x15}, 823400606dSMichal Simek {"UltraScale+ Virtex", 0x16}, 833400606dSMichal Simek {"UltraScale+ Kintex", 0x17}, 843400606dSMichal Simek {"Spartan7", 0x18}, 85406107daSMichal Simek {NULL, 0}, 86406107daSMichal Simek }; 87406107daSMichal Simek 88406107daSMichal Simek struct cpuinfo cpuinfo; 89c1120542SMichal Simek static struct device_node *cpu; 90406107daSMichal Simek 91406107daSMichal Simek void __init setup_cpuinfo(void) 92406107daSMichal Simek { 934c29e593SRob Herring cpu = of_get_cpu_node(0, NULL); 94406107daSMichal Simek if (!cpu) 954c29e593SRob Herring pr_err("You don't have cpu or are missing cpu reg property!!!\n"); 96406107daSMichal Simek 976bd55f0bSMichal Simek pr_info("%s: initialising\n", __func__); 98406107daSMichal Simek 99406107daSMichal Simek switch (cpu_has_pvr()) { 100406107daSMichal Simek case 0: 1016bd55f0bSMichal Simek pr_warn("%s: No PVR support. Using static CPU info from FDT\n", 102406107daSMichal Simek __func__); 103406107daSMichal Simek set_cpuinfo_static(&cpuinfo, cpu); 104406107daSMichal Simek break; 105fbeda677SMichal Simek /* FIXME I found weird behavior with MB 7.00.a/b 7.10.a 106406107daSMichal Simek * please do not use FULL PVR with MMU */ 107406107daSMichal Simek case 1: 1086bd55f0bSMichal Simek pr_info("%s: Using full CPU PVR support\n", 109406107daSMichal Simek __func__); 110406107daSMichal Simek set_cpuinfo_static(&cpuinfo, cpu); 111406107daSMichal Simek set_cpuinfo_pvr_full(&cpuinfo, cpu); 112406107daSMichal Simek break; 113406107daSMichal Simek default: 1146bd55f0bSMichal Simek pr_warn("%s: Unsupported PVR setting\n", __func__); 115406107daSMichal Simek set_cpuinfo_static(&cpuinfo, cpu); 116406107daSMichal Simek } 1178904976eSJohn A. Williams 1188904976eSJohn A. Williams if (cpuinfo.mmu_privins) 1196bd55f0bSMichal Simek pr_warn("%s: Stream instructions enabled" 1208904976eSJohn A. Williams " - USERSPACE CAN LOCK THIS KERNEL!\n", __func__); 1214c29e593SRob Herring 1224c29e593SRob Herring of_node_put(cpu); 123406107daSMichal Simek } 124c1120542SMichal Simek 125c1120542SMichal Simek void __init setup_cpuinfo_clk(void) 126c1120542SMichal Simek { 127c1120542SMichal Simek struct clk *clk; 128c1120542SMichal Simek 129c1120542SMichal Simek clk = of_clk_get(cpu, 0); 130c1120542SMichal Simek if (IS_ERR(clk)) { 131c1120542SMichal Simek pr_err("ERROR: CPU CCF input clock not found\n"); 132c1120542SMichal Simek /* take timebase-frequency from DTS */ 133c1120542SMichal Simek cpuinfo.cpu_clock_freq = fcpu(cpu, "timebase-frequency"); 134c1120542SMichal Simek } else { 135c1120542SMichal Simek cpuinfo.cpu_clock_freq = clk_get_rate(clk); 136c1120542SMichal Simek } 137c1120542SMichal Simek 138c1120542SMichal Simek if (!cpuinfo.cpu_clock_freq) { 139c1120542SMichal Simek pr_err("ERROR: CPU clock frequency not setup\n"); 140c1120542SMichal Simek BUG(); 141c1120542SMichal Simek } 142c1120542SMichal Simek } 143