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 } ,
2015-01-02 00:40:33 -02:00
{ " 8.50.b " , 0x1c } ,
{ " 8.50.c " , 0x1e } ,
2013-09-03 12:35:36 +02:00
{ " 9.0 " , 0x1b } ,
{ " 9.1 " , 0x1d } ,
2015-01-02 00:40:33 -02:00
{ " 9.2 " , 0x1f } ,
{ " 9.3 " , 0x20 } ,
2015-05-13 08:21:45 +02:00
{ " 9.4 " , 0x21 } ,
{ " 9.5 " , 0x22 } ,
2016-11-15 12:22:32 +01:00
{ " 9.6 " , 0x23 } ,
{ " 10.0 " , 0x24 } ,
2020-01-14 14:42:51 +01:00
{ " 11.0 " , 0x25 } ,
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 } ,
2015-01-05 12:01:17 +01:00
{ " virtex7 " , 0xf } ,
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 } ,
2015-01-05 12:01:17 +01:00
{ " UltraScale Virtex " , 0x13 } ,
{ " UltraScale Kintex " , 0x14 } ,
2016-11-15 12:25:46 +01:00
{ " UltraScale+ Zynq " , 0x15 } ,
{ " UltraScale+ Virtex " , 0x16 } ,
{ " UltraScale+ Kintex " , 0x17 } ,
{ " Spartan7 " , 0x18 } ,
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 )
{
2018-08-27 13:27:03 -05:00
cpu = of_get_cpu_node ( 0 , NULL ) ;
2009-03-27 14:25:11 +01:00
if ( ! cpu )
2018-08-27 13:27:03 -05:00
pr_err ( " You don't have cpu or are missing cpu reg property!!! \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__ ) ;
2018-08-27 13:27:03 -05:00
of_node_put ( cpu ) ;
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 ( ) ;
}
}