1210284Sjmallett/***********************license start***************
2232812Sjmallett * Copyright (c) 2003-2010  Cavium Inc. (support@cavium.com). All rights
3215990Sjmallett * reserved.
4210284Sjmallett *
5210284Sjmallett *
6215990Sjmallett * Redistribution and use in source and binary forms, with or without
7215990Sjmallett * modification, are permitted provided that the following conditions are
8215990Sjmallett * met:
9210284Sjmallett *
10215990Sjmallett *   * Redistributions of source code must retain the above copyright
11215990Sjmallett *     notice, this list of conditions and the following disclaimer.
12210284Sjmallett *
13215990Sjmallett *   * Redistributions in binary form must reproduce the above
14215990Sjmallett *     copyright notice, this list of conditions and the following
15215990Sjmallett *     disclaimer in the documentation and/or other materials provided
16215990Sjmallett *     with the distribution.
17215990Sjmallett
18232812Sjmallett *   * Neither the name of Cavium Inc. nor the names of
19215990Sjmallett *     its contributors may be used to endorse or promote products
20215990Sjmallett *     derived from this software without specific prior written
21215990Sjmallett *     permission.
22215990Sjmallett
23215990Sjmallett * This Software, including technical data, may be subject to U.S. export  control
24215990Sjmallett * laws, including the U.S. Export Administration Act and its  associated
25215990Sjmallett * regulations, and may be subject to export or import  regulations in other
26215990Sjmallett * countries.
27215990Sjmallett
28215990Sjmallett * 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
30215990Sjmallett * WARRANTIES, EITHER EXPRESS, IMPLIED, STATUTORY, OR OTHERWISE, WITH RESPECT TO
31215990Sjmallett * THE SOFTWARE, INCLUDING ITS CONDITION, ITS CONFORMITY TO ANY REPRESENTATION OR
32215990Sjmallett * DESCRIPTION, OR THE EXISTENCE OF ANY LATENT OR PATENT DEFECTS, AND CAVIUM
33215990Sjmallett * SPECIFICALLY DISCLAIMS ALL IMPLIED (IF ANY) WARRANTIES OF TITLE,
34215990Sjmallett * MERCHANTABILITY, NONINFRINGEMENT, FITNESS FOR A PARTICULAR PURPOSE, LACK OF
35215990Sjmallett * VIRUSES, ACCURACY OR COMPLETENESS, QUIET ENJOYMENT, QUIET POSSESSION OR
36215990Sjmallett * CORRESPONDENCE TO DESCRIPTION. THE ENTIRE  RISK ARISING OUT OF USE OR
37215990Sjmallett * PERFORMANCE OF THE SOFTWARE LIES WITH YOU.
38210284Sjmallett ***********************license end**************************************/
39210284Sjmallett
40210284Sjmallett
41210284Sjmallett
42210284Sjmallett
43210284Sjmallett
44210284Sjmallett
45215990Sjmallett
46210284Sjmallett/**
47210284Sjmallett * @file
48210284Sjmallett *
49210284Sjmallett * This file is resposible for including all system dependent
50210284Sjmallett * headers for the cvmx-* files.
51210284Sjmallett *
52232812Sjmallett * <hr>$Revision: 70030 $<hr>
53210284Sjmallett*/
54210284Sjmallett
55210284Sjmallett#ifndef __CVMX_PLATFORM_H__
56210284Sjmallett#define __CVMX_PLATFORM_H__
57210284Sjmallett
58210284Sjmallett#include "cvmx-abi.h"
59210284Sjmallett
60210284Sjmallett#ifdef __cplusplus
61210284Sjmallett#define EXTERN_ASM extern "C"
62210284Sjmallett#else
63210284Sjmallett#define EXTERN_ASM extern
64210284Sjmallett#endif
65210284Sjmallett
66210284Sjmallett/* This file defines macros for use in determining the current
67210284Sjmallett    building environment. It defines a single CVMX_BUILD_FOR_*
68210284Sjmallett    macro representing the target of the build. The current
69210284Sjmallett    possibilities are:
70210284Sjmallett        CVMX_BUILD_FOR_UBOOT
71210284Sjmallett        CVMX_BUILD_FOR_LINUX_KERNEL
72210284Sjmallett        CVMX_BUILD_FOR_LINUX_USER
73210284Sjmallett        CVMX_BUILD_FOR_LINUX_HOST
74210284Sjmallett        CVMX_BUILD_FOR_VXWORKS
75210284Sjmallett        CVMX_BUILD_FOR_STANDALONE */
76210284Sjmallett#if defined(__U_BOOT__)
77210284Sjmallett    /* We are being used inside of Uboot */
78210284Sjmallett    #define CVMX_BUILD_FOR_UBOOT
79210284Sjmallett#elif defined(__linux__)
80210284Sjmallett    #if defined(__KERNEL__)
81210284Sjmallett        /* We are in the Linux kernel on Octeon */
82210284Sjmallett        #define CVMX_BUILD_FOR_LINUX_KERNEL
83210284Sjmallett    #elif !defined(__mips__)
84210284Sjmallett        /* We are being used under Linux but not on Octeon. Assume
85210284Sjmallett            we are on a Linux host with an Octeon target over PCI/PCIe */
86210284Sjmallett        #ifndef CVMX_BUILD_FOR_LINUX_HOST
87210284Sjmallett        #define CVMX_BUILD_FOR_LINUX_HOST
88210284Sjmallett        #endif
89210284Sjmallett    #else
90210284Sjmallett        #ifdef CVMX_BUILD_FOR_LINUX_HOST
91210284Sjmallett            /* This is a manual special case. The host PCI utilities can
92210284Sjmallett                be configured to run on Octeon. In this case it is impossible
93210284Sjmallett                to tell the difference between the normal userspace setup
94210284Sjmallett                and using cvmx_read/write_csr over the PCI bus. The host
95210284Sjmallett                utilites force this define to fix this */
96210284Sjmallett        #else
97210284Sjmallett            /* We are in the Linux userspace on Octeon */
98210284Sjmallett            #define CVMX_BUILD_FOR_LINUX_USER
99210284Sjmallett        #endif
100210284Sjmallett    #endif
101210284Sjmallett#elif defined(_WRS_KERNEL) || defined(VXWORKS_USER_MAPPINGS)
102210284Sjmallett    /* We are in VxWorks on Octeon */
103210284Sjmallett    #define CVMX_BUILD_FOR_VXWORKS
104210284Sjmallett#elif defined(_OCTEON_TOOLCHAIN_RUNTIME)
105210284Sjmallett    /* To build the simple exec toolchain runtime (newlib) library. We
106210284Sjmallett       should only use features available on all Octeon models.  */
107210284Sjmallett    #define CVMX_BUILD_FOR_TOOLCHAIN
108210311Sjmallett#elif defined(__FreeBSD__) && defined(_KERNEL)
109215990Sjmallett    #define CVMX_BUILD_FOR_FREEBSD_KERNEL
110210284Sjmallett#else
111210284Sjmallett    /* We are building a simple exec standalone image for Octeon */
112210284Sjmallett    #define CVMX_BUILD_FOR_STANDALONE
113210284Sjmallett#endif
114210284Sjmallett
115210284Sjmallett
116210284Sjmallett/* To have a global variable be shared among all cores,
117210284Sjmallett * declare with the CVMX_SHARED attribute.  Ex:
118210284Sjmallett * CVMX_SHARED int myglobal;
119210284Sjmallett * This will cause the variable to be placed in a special
120210284Sjmallett * section that the loader will map as shared for all cores
121210284Sjmallett * This is for data structures use by software ONLY,
122210284Sjmallett * as it is not 1-1 VA-PA mapped.
123210284Sjmallett */
124215990Sjmallett#if defined(CVMX_BUILD_FOR_FREEBSD_KERNEL)
125210311Sjmallett#define CVMX_SHARED
126210311Sjmallett#else
127215990Sjmallett#ifndef CVMX_BUILD_FOR_LINUX_HOST
128210284Sjmallett#define CVMX_SHARED __attribute__ ((cvmx_shared))
129215990Sjmallett#else
130215990Sjmallett#define CVMX_SHARED
131210311Sjmallett#endif
132215990Sjmallett#endif
133210284Sjmallett
134210284Sjmallett#if defined(CVMX_BUILD_FOR_UBOOT)
135210284Sjmallett
136210284Sjmallett    #include <common.h>
137210284Sjmallett    #include "cvmx-sysinfo.h"
138210284Sjmallett
139210284Sjmallett#elif defined(CVMX_BUILD_FOR_LINUX_KERNEL)
140210284Sjmallett
141210284Sjmallett    #include <linux/kernel.h>
142210284Sjmallett    #include <linux/string.h>
143210284Sjmallett    #include <linux/types.h>
144210284Sjmallett    #include <stdarg.h>
145210284Sjmallett
146210284Sjmallett#elif defined(CVMX_BUILD_FOR_LINUX_USER)
147210284Sjmallett
148210284Sjmallett    #include <stddef.h>
149210284Sjmallett    #include <stdint.h>
150210284Sjmallett    #include <stdio.h>
151210284Sjmallett    #include <stdlib.h>
152210284Sjmallett    #include <stdarg.h>
153210284Sjmallett    #include <string.h>
154210284Sjmallett    #include <assert.h>
155210284Sjmallett    #include <fcntl.h>
156210284Sjmallett    #include <sys/mman.h>
157210284Sjmallett    #include <unistd.h>
158215990Sjmallett    #include <errno.h>
159215990Sjmallett    #include <sys/sysmips.h>
160215990Sjmallett    #define MIPS_CAVIUM_XKPHYS_READ	   2010	/* XKPHYS */
161215990Sjmallett    #define MIPS_CAVIUM_XKPHYS_WRITE	   2011	/* XKPHYS */
162210284Sjmallett
163215990Sjmallett/* Enable access to XKPHYS segments. Warning message is printed in case of
164215990Sjmallett   error. If warn_count is set, the warning message is not displayed. */
165215990Sjmallettstatic inline void cvmx_linux_enable_xkphys_access(int32_t warn_count)
166215990Sjmallett{
167215990Sjmallett    int ret;
168215990Sjmallett    ret = sysmips(MIPS_CAVIUM_XKPHYS_WRITE, getpid(), 3, 0);
169215990Sjmallett    if (ret != 0 && !warn_count) {
170215990Sjmallett        switch(errno) {
171215990Sjmallett            case EINVAL:
172215990Sjmallett                perror("sysmips(MIPS_CAVIUM_XKPHYS_WRITE) failed.\n"
173215990Sjmallett	             "  Did you configure your kernel with both:\n"
174215990Sjmallett	             "     CONFIG_CAVIUM_OCTEON_USER_MEM_PER_PROCESS *and*\n"
175215990Sjmallett	             "     CONFIG_CAVIUM_OCTEON_USER_IO_PER_PROCESS?");
176215990Sjmallett                break;
177215990Sjmallett            case EPERM:
178215990Sjmallett                perror("sysmips(MIPS_CAVIUM_XKPHYS_WRITE) failed.\n"
179215990Sjmallett	             "  Are you running as root?");
180215990Sjmallett                break;
181215990Sjmallett            default:
182215990Sjmallett                perror("sysmips(MIPS_CAVIUM_XKPHYS_WRITE) failed");
183215990Sjmallett                break;
184215990Sjmallett        }
185215990Sjmallett    }
186215990Sjmallett}
187215990Sjmallett
188210284Sjmallett#elif defined(CVMX_BUILD_FOR_LINUX_HOST)
189210284Sjmallett
190210284Sjmallett    #include <stddef.h>
191210284Sjmallett    #include <stdint.h>
192210284Sjmallett    #include <stdio.h>
193210284Sjmallett    #include <stdlib.h>
194210284Sjmallett    #include <stdarg.h>
195210284Sjmallett    #include <string.h>
196210284Sjmallett    #include <assert.h>
197210284Sjmallett    #include <fcntl.h>
198210284Sjmallett    #include <sys/mman.h>
199210284Sjmallett    #include <unistd.h>
200210284Sjmallett
201210284Sjmallett#elif defined(CVMX_BUILD_FOR_VXWORKS)
202210284Sjmallett
203210284Sjmallett    #include <stdint.h>
204210284Sjmallett    #include <stdio.h>
205210284Sjmallett    #include <stdlib.h>
206210284Sjmallett    #include <stdarg.h>
207210284Sjmallett    #include <string.h>
208210284Sjmallett    #include <assert.h>
209210284Sjmallett
210210284Sjmallett#elif defined(CVMX_BUILD_FOR_STANDALONE)
211210284Sjmallett
212210284Sjmallett    #include <stddef.h>
213210284Sjmallett    #include <stdint.h>
214210284Sjmallett    #include <stdio.h>
215210284Sjmallett    #include <stdlib.h>
216210284Sjmallett    #include <stdarg.h>
217210284Sjmallett    #include <string.h>
218210284Sjmallett    #include <assert.h>
219210284Sjmallett
220210284Sjmallett#elif defined(CVMX_BUILD_FOR_TOOLCHAIN)
221210284Sjmallett
222232812Sjmallett    #ifndef __ASSEMBLY__
223210284Sjmallett    #include <stddef.h>
224210284Sjmallett    #include <stdint.h>
225210284Sjmallett    #include <stdio.h>
226210284Sjmallett    #include <stdlib.h>
227210284Sjmallett    #include <stdarg.h>
228210284Sjmallett    #include <string.h>
229210284Sjmallett    #include <assert.h>
230232812Sjmallett    #endif
231232812Sjmallett    #include "rename-cvmx.h"
232210284Sjmallett
233215990Sjmallett#elif defined(CVMX_BUILD_FOR_FREEBSD_KERNEL)
234210311Sjmallett
235210311Sjmallett    #include <mips/cavium/cvmx_config.h>
236210311Sjmallett
237210284Sjmallett#else
238210284Sjmallett
239210284Sjmallett    #error Unexpected CVMX_BUILD_FOR_* macro
240210284Sjmallett
241210284Sjmallett#endif
242210284Sjmallett
243210284Sjmallett#endif /* __CVMX_PLATFORM_H__ */
244