1215976Sjmallett/***********************license start***************
2232812Sjmallett * Copyright (c) 2003-2010  Cavium Inc. (support@cavium.com). All rights
3215976Sjmallett * reserved.
4215976Sjmallett *
5215976Sjmallett *
6215976Sjmallett * Redistribution and use in source and binary forms, with or without
7215976Sjmallett * modification, are permitted provided that the following conditions are
8215976Sjmallett * met:
9215976Sjmallett *
10215976Sjmallett *   * Redistributions of source code must retain the above copyright
11215976Sjmallett *     notice, this list of conditions and the following disclaimer.
12215976Sjmallett *
13215976Sjmallett *   * Redistributions in binary form must reproduce the above
14215976Sjmallett *     copyright notice, this list of conditions and the following
15215976Sjmallett *     disclaimer in the documentation and/or other materials provided
16215976Sjmallett *     with the distribution.
17215976Sjmallett
18232812Sjmallett *   * Neither the name of Cavium Inc. nor the names of
19215976Sjmallett *     its contributors may be used to endorse or promote products
20215976Sjmallett *     derived from this software without specific prior written
21215976Sjmallett *     permission.
22215976Sjmallett
23215976Sjmallett * This Software, including technical data, may be subject to U.S. export  control
24215976Sjmallett * laws, including the U.S. Export Administration Act and its  associated
25215976Sjmallett * regulations, and may be subject to export or import  regulations in other
26215976Sjmallett * countries.
27215976Sjmallett
28215976Sjmallett * TO THE MAXIMUM EXTENT PERMITTED BY LAW, THE SOFTWARE IS PROVIDED "AS IS"
29232812Sjmallett * AND WITH ALL FAULTS AND CAVIUM INC. MAKES NO PROMISES, REPRESENTATIONS OR
30215976Sjmallett * WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT TO
31215976Sjmallett * THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY REPRESENTATION OR
32215976Sjmallett * DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT DEFECTS, AND CAVIUM
33215976Sjmallett * SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES OF TITLE,
34215976Sjmallett * MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE, LACK OF
35215976Sjmallett * VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR
36215976Sjmallett * CORRESPONDENCE TO DESCRIPTION. THE ENTIRE  RISK ARISING OUT OF USE OR
37215976Sjmallett * PERFORMANCE OF THE SOFTWARE LIES WITH YOU.
38215976Sjmallett ***********************license end**************************************/
39215976Sjmallett
40215976Sjmallett
41215976Sjmallett/**
42215976Sjmallett * @file
43215976Sjmallett *
44215976Sjmallett * This is file defines ASM primitives for sim magic functions.
45215976Sjmallett
46232812Sjmallett * <hr>$Revision: 70030 $<hr>
47215976Sjmallett *
48215976Sjmallett *
49215976Sjmallett */
50215976Sjmallett#ifndef __CVMX_SIM_MAGIC_H__
51215976Sjmallett#define __CVMX_SIM_MAGIC_H__
52215976Sjmallett
53215976Sjmallett#ifdef  __cplusplus
54215976Sjmallettextern "C" {
55215976Sjmallett#endif
56215976Sjmallett
57215976Sjmallett/* Note, the following Magic function are only useful in the simulator
58215976Sjmallett * environment. Typical simple executive application should not use
59215976Sjmallett * these functions. Their access functions are defined and implemented in
60215976Sjmallett * the newlib
61215976Sjmallett *  SIM_MAGIC_PUTS
62215976Sjmallett *  SIM_MAGIC_WRITE
63215976Sjmallett *  SIM_MAGIC_READ
64215976Sjmallett *  SIM_MAGIC_OPEN
65215976Sjmallett *  SIM_MAGIC_CLOSE
66215976Sjmallett *  SIM_MAGIC_STAT
67215976Sjmallett *  SIM_MAGIC_FSTAT
68215976Sjmallett *  SIM_MAGIC_LSEEK
69215976Sjmallett *  SIM_MAGIC_ALLOC_MEM
70215976Sjmallett */
71215976Sjmallett
72215976Sjmallett/* Assembler macros for accessing simulator magic functions */
73215976Sjmallett#define OCTEON_SIM_MAGIC_TRAP_ADDRESS 0x8000000feffe0000ull
74215976Sjmallett
75215976Sjmallett/* Reg t9 (r25) specifies the actual magic function*/
76215976Sjmallett#define SIM_MAGIC_PUTS        0x05
77215976Sjmallett#define SIM_MAGIC_SIMPRINTF   0x06
78215976Sjmallett#define SIM_MAGIC_WRITE       0x07
79215976Sjmallett#define SIM_MAGIC_READ        0x08
80215976Sjmallett#define SIM_MAGIC_OPEN        0x09
81215976Sjmallett#define SIM_MAGIC_CLOSE       0x0A
82215976Sjmallett#define SIM_MAGIC_STAT        0x0B
83215976Sjmallett#define SIM_MAGIC_FSTAT       0x0C
84215976Sjmallett#define SIM_MAGIC_LSEEK       0x0D
85215976Sjmallett#define SIM_MAGIC_ALLOC_MEM   0x20
86215976Sjmallett#define SIM_MAGIC_GET_CPUFREQ 0x31      /* SDK 1.9 release and after */
87215976Sjmallett#define SIM_MAGIC_GET_MEMFREQ 0x32      /* SDK 1.9 release and after */
88215976Sjmallett#define SIM_MAGIC_GET_IOFREQ  0x33      /* SDK 2.0 release and after, only set in Octeon2 */
89215976Sjmallett
90215976Sjmallett/**
91215976Sjmallett * @INTERNAL
92215976Sjmallett * sim_magci implementation function with return code.
93215976Sjmallett *
94215976Sjmallett * @param func_no   SIM magic function to invoke
95215976Sjmallett *
96215976Sjmallett * @return Result of the SIM magic function
97215976Sjmallett */
98215976Sjmallettstatic inline int __cvmx_sim_magic_return(unsigned long long func_no)
99215976Sjmallett{
100215976Sjmallett    register unsigned long long  magic_addr asm ("$15");
101215976Sjmallett    register unsigned long long  magic_func asm ("$25");  /* t9 */
102215976Sjmallett    int ret;
103215976Sjmallett
104215976Sjmallett    magic_addr = OCTEON_SIM_MAGIC_TRAP_ADDRESS;
105215976Sjmallett    magic_func = func_no;
106215976Sjmallett    asm volatile (
107215976Sjmallett        "dadd $24, $31, $0 \n"
108215976Sjmallett        "jalr  $15 \n"
109215976Sjmallett        "dadd $31, $24, $0 \n"
110215976Sjmallett        "move %0, $2"
111215976Sjmallett        : "=r" (ret)
112215976Sjmallett        : "r" (magic_addr), "r" (magic_func)
113215976Sjmallett	: "$2", "$24" );
114215976Sjmallett
115215976Sjmallett
116215976Sjmallett    return ret;
117215976Sjmallett}
118215976Sjmallett
119215976Sjmallett/**
120215976Sjmallett * @INTERNAL
121215976Sjmallett * sim_magci implementation function without return code.
122215976Sjmallett *
123215976Sjmallett * @param func_no   SIM magic function to invoke
124215976Sjmallett */
125215976Sjmallettstatic inline void __cvmx_sim_magic_no_return(unsigned long long func_no)
126215976Sjmallett{
127215976Sjmallett    register unsigned long long  magic_addr asm ("$15");
128215976Sjmallett    register unsigned long long  magic_func asm ("$25");  /* t9 */
129215976Sjmallett
130215976Sjmallett    magic_addr = OCTEON_SIM_MAGIC_TRAP_ADDRESS;
131215976Sjmallett    magic_func = func_no;
132215976Sjmallett    asm volatile (
133215976Sjmallett        "dadd $24, $31, $0 \n"
134215976Sjmallett        "jalr  $15 \n"
135215976Sjmallett        "dadd $31, $24, $0 \n"
136215976Sjmallett        :
137215976Sjmallett        : "r" (magic_addr), "r" (magic_func)
138215976Sjmallett	: "$24" );
139215976Sjmallett
140215976Sjmallett}
141215976Sjmallett
142215976Sjmallett/**
143215976Sjmallett * @INTERNAL
144215976Sjmallett * SIM magic printf function, only support up to 8 parameters
145215976Sjmallett *
146215976Sjmallett * @param format
147215976Sjmallett */
148215976Sjmallettstatic inline void __cvmx_sim_magic_simprintf(const char *format, ...)
149215976Sjmallett{
150215976Sjmallett    CVMX_SYNC;
151215976Sjmallett
152215976Sjmallett    __cvmx_sim_magic_no_return( SIM_MAGIC_SIMPRINTF);
153215976Sjmallett}
154215976Sjmallett
155215976Sjmallett/**
156215976Sjmallett * Retrive cpu core clock frequency from the simulator
157215976Sjmallett *
158215976Sjmallett * @return simulating core frequency
159215976Sjmallett */
160215976Sjmallettstatic inline int cvmx_sim_magic_get_cpufreq(void)
161215976Sjmallett{
162215976Sjmallett    CVMX_SYNC;
163215976Sjmallett
164215976Sjmallett    return  __cvmx_sim_magic_return(SIM_MAGIC_GET_CPUFREQ);
165215976Sjmallett}
166215976Sjmallett
167215976Sjmallett/**
168215976Sjmallett * Retrive DDR clock frequency from the simulator
169215976Sjmallett *
170215976Sjmallett * @return simulating DDR frequency
171215976Sjmallett */
172215976Sjmallettstatic inline int cvmx_sim_magic_get_memfreq(void)
173215976Sjmallett{
174215976Sjmallett    CVMX_SYNC;
175215976Sjmallett
176215976Sjmallett    return __cvmx_sim_magic_return(SIM_MAGIC_GET_MEMFREQ);
177215976Sjmallett}
178215976Sjmallett
179215976Sjmallett/**
180215976Sjmallett * Retrive io core clock frequency from the simulator
181215976Sjmallett *
182215976Sjmallett * @return simulating core frequency
183215976Sjmallett */
184215976Sjmallettstatic inline int cvmx_sim_magic_get_iofreq(void)
185215976Sjmallett{
186215976Sjmallett    CVMX_SYNC;
187215976Sjmallett
188232812Sjmallett    if (OCTEON_IS_MODEL(OCTEON_CN6XXX) || OCTEON_IS_MODEL(OCTEON_CNF7XXX))
189215976Sjmallett       return  __cvmx_sim_magic_return(SIM_MAGIC_GET_IOFREQ);
190215976Sjmallett    else
191215976Sjmallett       return 0;
192215976Sjmallett}
193215976Sjmallett
194215976Sjmallett#ifdef  __cplusplus
195215976Sjmallett}
196215976Sjmallett#endif
197215976Sjmallett
198215976Sjmallett#endif /* __CVMX_SIM_MAGIC_H__ */
199