xref: /netbsd-src/sys/arch/mips/cfe/cfe_api.c (revision 95e1ffb15694e54f29f8baaa4232152b703c2a5a)
1*95e1ffb1Schristos /* $NetBSD: cfe_api.c,v 1.5 2005/12/11 12:18:07 christos Exp $ */
249c87f08Scgd /* from: SiByte Id: cfe_api.c,v 1.16 2002/07/09 23:29:11 cgd Exp $ */
31b5ddfe4Ssimonb 
41b5ddfe4Ssimonb /*
549c87f08Scgd  * Copyright 2000, 2001, 2002
61b5ddfe4Ssimonb  * Broadcom Corporation. All rights reserved.
71b5ddfe4Ssimonb  *
81b5ddfe4Ssimonb  * This software is furnished under license and may be used and copied only
91b5ddfe4Ssimonb  * in accordance with the following terms and conditions.  Subject to these
101b5ddfe4Ssimonb  * conditions, you may download, copy, install, use, modify and distribute
111b5ddfe4Ssimonb  * modified or unmodified copies of this software in source and/or binary
121b5ddfe4Ssimonb  * form. No title or ownership is transferred hereby.
131b5ddfe4Ssimonb  *
141b5ddfe4Ssimonb  * 1) Any source code used, modified or distributed must reproduce and
151b5ddfe4Ssimonb  *    retain this copyright notice and list of conditions as they appear in
161b5ddfe4Ssimonb  *    the source file.
171b5ddfe4Ssimonb  *
181b5ddfe4Ssimonb  * 2) No right is granted to use any trade name, trademark, or logo of
1949c87f08Scgd  *    Broadcom Corporation.  The "Broadcom Corporation" name may not be
2049c87f08Scgd  *    used to endorse or promote products derived from this software
2149c87f08Scgd  *    without the prior written permission of Broadcom Corporation.
221b5ddfe4Ssimonb  *
231b5ddfe4Ssimonb  * 3) THIS SOFTWARE IS PROVIDED "AS-IS" AND ANY EXPRESS OR IMPLIED
241b5ddfe4Ssimonb  *    WARRANTIES, INCLUDING BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OF
251b5ddfe4Ssimonb  *    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
261b5ddfe4Ssimonb  *    NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL BROADCOM BE LIABLE
271b5ddfe4Ssimonb  *    FOR ANY DAMAGES WHATSOEVER, AND IN PARTICULAR, BROADCOM SHALL NOT BE
281b5ddfe4Ssimonb  *    LIABLE FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
291b5ddfe4Ssimonb  *    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
301b5ddfe4Ssimonb  *    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
311b5ddfe4Ssimonb  *    BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
321b5ddfe4Ssimonb  *    WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
331b5ddfe4Ssimonb  *    OR OTHERWISE), EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
341b5ddfe4Ssimonb  */
351b5ddfe4Ssimonb 
361b5ddfe4Ssimonb /*  *********************************************************************
3749c87f08Scgd     *
381b5ddfe4Ssimonb     *  Broadcom Common Firmware Environment (CFE)
391b5ddfe4Ssimonb     *
401b5ddfe4Ssimonb     *  Device Function stubs			File: cfe_api.c
411b5ddfe4Ssimonb     *
421b5ddfe4Ssimonb     *  This module contains device function stubs (small routines to
431b5ddfe4Ssimonb     *  call the standard "iocb" interface entry point to CFE).
441b5ddfe4Ssimonb     *  There should be one routine here per iocb function call.
451b5ddfe4Ssimonb     *
4649c87f08Scgd     *  Authors:  Mitch Lichtenberg, Chris Demetriou
471b5ddfe4Ssimonb     *
481b5ddfe4Ssimonb     ********************************************************************* */
491b5ddfe4Ssimonb 
504b2744bfSlukem #include <sys/cdefs.h>
51*95e1ffb1Schristos __KERNEL_RCSID(0, "$NetBSD: cfe_api.c,v 1.5 2005/12/11 12:18:07 christos Exp $");
524b2744bfSlukem 
5349c87f08Scgd #include "cfe_api.h"
5449c87f08Scgd #include "cfe_api_int.h"
551b5ddfe4Ssimonb 
5649c87f08Scgd /* Cast from a native pointer to a cfe_xptr_t and back.  */
5749c87f08Scgd #define XPTR_FROM_NATIVE(n)	((cfe_xptr_t) (intptr_t) (n))
5849c87f08Scgd #define NATIVE_FROM_XPTR(x)	((void *) (intptr_t) (x))
591b5ddfe4Ssimonb 
6049c87f08Scgd #ifdef CFE_API_IMPL_NAMESPACE
6149c87f08Scgd #define cfe_iocb_dispatch(a)		__cfe_iocb_dispatch(a)
6249c87f08Scgd #endif
6349c87f08Scgd int cfe_iocb_dispatch(cfe_xiocb_t *xiocb);
641b5ddfe4Ssimonb 
6549c87f08Scgd #if defined(CFE_API_common) || defined(CFE_API_ALL)
661b5ddfe4Ssimonb /*
671b5ddfe4Ssimonb  * Declare the dispatch function with args of "intptr_t".
681b5ddfe4Ssimonb  * This makes sure whatever model we're compiling in
691b5ddfe4Ssimonb  * puts the pointers in a single register.  For example,
701b5ddfe4Ssimonb  * combining -mlong64 and -mips1 or -mips2 would lead to
711b5ddfe4Ssimonb  * trouble, since the handle and IOCB pointer will be
721b5ddfe4Ssimonb  * passed in two registers each, and CFE expects one.
731b5ddfe4Ssimonb  */
741b5ddfe4Ssimonb 
751b5ddfe4Ssimonb static int (*cfe_dispfunc)(intptr_t handle, intptr_t xiocb) = 0;
761b5ddfe4Ssimonb static cfe_xuint_t cfe_handle = 0;
771b5ddfe4Ssimonb 
7849c87f08Scgd int
cfe_init(cfe_xuint_t handle,cfe_xuint_t ept)7949c87f08Scgd cfe_init(cfe_xuint_t handle, cfe_xuint_t ept)
801b5ddfe4Ssimonb {
8149c87f08Scgd     cfe_dispfunc = NATIVE_FROM_XPTR(ept);
8249c87f08Scgd     cfe_handle = handle;
831b5ddfe4Ssimonb     return 0;
841b5ddfe4Ssimonb }
851b5ddfe4Ssimonb 
8649c87f08Scgd int
cfe_iocb_dispatch(cfe_xiocb_t * xiocb)8749c87f08Scgd cfe_iocb_dispatch(cfe_xiocb_t *xiocb)
881b5ddfe4Ssimonb {
891b5ddfe4Ssimonb     if (!cfe_dispfunc) return -1;
901b5ddfe4Ssimonb     return (*cfe_dispfunc)((intptr_t)cfe_handle, (intptr_t)xiocb);
911b5ddfe4Ssimonb }
9249c87f08Scgd #endif /* CFE_API_common || CFE_API_ALL */
931b5ddfe4Ssimonb 
9449c87f08Scgd #if defined(CFE_API_close) || defined(CFE_API_ALL)
9549c87f08Scgd int
cfe_close(int handle)9649c87f08Scgd cfe_close(int handle)
971b5ddfe4Ssimonb {
981b5ddfe4Ssimonb     cfe_xiocb_t xiocb;
991b5ddfe4Ssimonb 
1001b5ddfe4Ssimonb     xiocb.xiocb_fcode = CFE_CMD_DEV_CLOSE;
1011b5ddfe4Ssimonb     xiocb.xiocb_status = 0;
1021b5ddfe4Ssimonb     xiocb.xiocb_handle = handle;
1031b5ddfe4Ssimonb     xiocb.xiocb_flags = 0;
1041b5ddfe4Ssimonb     xiocb.xiocb_psize = 0;
1051b5ddfe4Ssimonb 
1061b5ddfe4Ssimonb     cfe_iocb_dispatch(&xiocb);
1071b5ddfe4Ssimonb 
10849c87f08Scgd     return xiocb.xiocb_status;
1091b5ddfe4Ssimonb 
1101b5ddfe4Ssimonb }
11149c87f08Scgd #endif /* CFE_API_close || CFE_API_ALL */
1121b5ddfe4Ssimonb 
11349c87f08Scgd #if defined(CFE_API_cpu_start) || defined(CFE_API_ALL)
11449c87f08Scgd int
cfe_cpu_start(int cpu,void (* fn)(void),long sp,long gp,long a1)11549c87f08Scgd cfe_cpu_start(int cpu, void (*fn)(void), long sp, long gp, long a1)
1161b5ddfe4Ssimonb {
1171b5ddfe4Ssimonb     cfe_xiocb_t xiocb;
1181b5ddfe4Ssimonb 
11949c87f08Scgd     xiocb.xiocb_fcode = CFE_CMD_FW_CPUCTL;
1201b5ddfe4Ssimonb     xiocb.xiocb_status = 0;
12149c87f08Scgd     xiocb.xiocb_handle = 0;
1221b5ddfe4Ssimonb     xiocb.xiocb_flags  = 0;
12349c87f08Scgd     xiocb.xiocb_psize = sizeof(xiocb_cpuctl_t);
12449c87f08Scgd     xiocb.plist.xiocb_cpuctl.cpu_number = cpu;
12549c87f08Scgd     xiocb.plist.xiocb_cpuctl.cpu_command = CFE_CPU_CMD_START;
12649c87f08Scgd     xiocb.plist.xiocb_cpuctl.gp_val = gp;
12749c87f08Scgd     xiocb.plist.xiocb_cpuctl.sp_val = sp;
12849c87f08Scgd     xiocb.plist.xiocb_cpuctl.a1_val = a1;
12949c87f08Scgd     xiocb.plist.xiocb_cpuctl.start_addr = (long)fn;
1301b5ddfe4Ssimonb 
1311b5ddfe4Ssimonb     cfe_iocb_dispatch(&xiocb);
1321b5ddfe4Ssimonb 
1331b5ddfe4Ssimonb     return xiocb.xiocb_status;
1341b5ddfe4Ssimonb }
13549c87f08Scgd #endif /* CFE_API_cpu_start || CFE_API_ALL */
1361b5ddfe4Ssimonb 
13749c87f08Scgd #if defined(CFE_API_cpu_stop) || defined(CFE_API_ALL)
13849c87f08Scgd int
cfe_cpu_stop(int cpu)13949c87f08Scgd cfe_cpu_stop(int cpu)
1401b5ddfe4Ssimonb {
1411b5ddfe4Ssimonb     cfe_xiocb_t xiocb;
1421b5ddfe4Ssimonb 
14349c87f08Scgd     xiocb.xiocb_fcode = CFE_CMD_FW_CPUCTL;
1441b5ddfe4Ssimonb     xiocb.xiocb_status = 0;
14549c87f08Scgd     xiocb.xiocb_handle = 0;
1461b5ddfe4Ssimonb     xiocb.xiocb_flags  = 0;
14749c87f08Scgd     xiocb.xiocb_psize = sizeof(xiocb_cpuctl_t);
14849c87f08Scgd     xiocb.plist.xiocb_cpuctl.cpu_number = cpu;
14949c87f08Scgd     xiocb.plist.xiocb_cpuctl.cpu_command = CFE_CPU_CMD_STOP;
1501b5ddfe4Ssimonb 
1511b5ddfe4Ssimonb     cfe_iocb_dispatch(&xiocb);
1521b5ddfe4Ssimonb 
15349c87f08Scgd     return xiocb.xiocb_status;
15449c87f08Scgd }
15549c87f08Scgd #endif /* CFE_API_cpu_stop || CFE_API_ALL */
1561b5ddfe4Ssimonb 
15749c87f08Scgd #if defined(CFE_API_enumenv) || defined(CFE_API_ALL)
15849c87f08Scgd int
cfe_enumenv(int idx,char * name,int namelen,char * val,int vallen)15949c87f08Scgd cfe_enumenv(int idx, char *name, int namelen, char *val, int vallen)
16049c87f08Scgd {
16149c87f08Scgd     cfe_xiocb_t xiocb;
16249c87f08Scgd 
16349c87f08Scgd     xiocb.xiocb_fcode = CFE_CMD_ENV_SET;
16449c87f08Scgd     xiocb.xiocb_status = 0;
16549c87f08Scgd     xiocb.xiocb_handle = 0;
16649c87f08Scgd     xiocb.xiocb_flags = 0;
16749c87f08Scgd     xiocb.xiocb_psize = sizeof(xiocb_envbuf_t);
16849c87f08Scgd     xiocb.plist.xiocb_envbuf.enum_idx = idx;
16949c87f08Scgd     xiocb.plist.xiocb_envbuf.name_ptr = XPTR_FROM_NATIVE(name);
17049c87f08Scgd     xiocb.plist.xiocb_envbuf.name_length = namelen;
17149c87f08Scgd     xiocb.plist.xiocb_envbuf.val_ptr = XPTR_FROM_NATIVE(val);
17249c87f08Scgd     xiocb.plist.xiocb_envbuf.val_length = vallen;
17349c87f08Scgd 
17449c87f08Scgd     cfe_iocb_dispatch(&xiocb);
17549c87f08Scgd 
17649c87f08Scgd     return xiocb.xiocb_status;
17749c87f08Scgd }
17849c87f08Scgd #endif /* CFE_API_enumenv || CFE_API_ALL */
17949c87f08Scgd 
18049c87f08Scgd #if defined(CFE_API_enummem) || defined(CFE_API_ALL)
18149c87f08Scgd int
cfe_enummem(int idx,int flags,cfe_xuint_t * start,cfe_xuint_t * length,cfe_xuint_t * type)18249c87f08Scgd cfe_enummem(int idx, int flags, cfe_xuint_t *start, cfe_xuint_t *length,
18349c87f08Scgd 	    cfe_xuint_t *type)
18449c87f08Scgd {
18549c87f08Scgd     cfe_xiocb_t xiocb;
18649c87f08Scgd 
18749c87f08Scgd     xiocb.xiocb_fcode = CFE_CMD_FW_MEMENUM;
18849c87f08Scgd     xiocb.xiocb_status = 0;
18949c87f08Scgd     xiocb.xiocb_handle = 0;
19049c87f08Scgd     xiocb.xiocb_flags = flags;
19149c87f08Scgd     xiocb.xiocb_psize = sizeof(xiocb_meminfo_t);
19249c87f08Scgd     xiocb.plist.xiocb_meminfo.mi_idx = idx;
19349c87f08Scgd 
19449c87f08Scgd     cfe_iocb_dispatch(&xiocb);
19549c87f08Scgd 
19649c87f08Scgd     if (xiocb.xiocb_status < 0)
19749c87f08Scgd 	return xiocb.xiocb_status;
19849c87f08Scgd 
19949c87f08Scgd     *start = xiocb.plist.xiocb_meminfo.mi_addr;
20049c87f08Scgd     *length = xiocb.plist.xiocb_meminfo.mi_size;
20149c87f08Scgd     *type = xiocb.plist.xiocb_meminfo.mi_type;
20249c87f08Scgd 
20349c87f08Scgd     return 0;
20449c87f08Scgd }
20549c87f08Scgd #endif /* CFE_API_enummem || CFE_API_ALL */
20649c87f08Scgd 
20749c87f08Scgd #if defined(CFE_API_exit) || defined(CFE_API_ALL)
20849c87f08Scgd int
cfe_exit(int warm,int status)20949c87f08Scgd cfe_exit(int warm, int status)
21049c87f08Scgd {
21149c87f08Scgd     cfe_xiocb_t xiocb;
21249c87f08Scgd 
21349c87f08Scgd     xiocb.xiocb_fcode = CFE_CMD_FW_RESTART;
21449c87f08Scgd     xiocb.xiocb_status = 0;
21549c87f08Scgd     xiocb.xiocb_handle = 0;
21649c87f08Scgd     xiocb.xiocb_flags = warm ? CFE_FLG_WARMSTART : 0;
21749c87f08Scgd     xiocb.xiocb_psize = sizeof(xiocb_exitstat_t);
21849c87f08Scgd     xiocb.plist.xiocb_exitstat.status = status;
21949c87f08Scgd 
22049c87f08Scgd     cfe_iocb_dispatch(&xiocb);
22149c87f08Scgd 
22249c87f08Scgd     return xiocb.xiocb_status;
22349c87f08Scgd }
22449c87f08Scgd #endif /* CFE_API_exit || CFE_API_ALL */
22549c87f08Scgd 
22649c87f08Scgd #if defined(CFE_API_flushcache) || defined(CFE_API_ALL)
22749c87f08Scgd int
cfe_flushcache(int flg)22849c87f08Scgd cfe_flushcache(int flg)
22949c87f08Scgd {
23049c87f08Scgd     cfe_xiocb_t xiocb;
23149c87f08Scgd 
23249c87f08Scgd     xiocb.xiocb_fcode = CFE_CMD_FW_FLUSHCACHE;
23349c87f08Scgd     xiocb.xiocb_status = 0;
23449c87f08Scgd     xiocb.xiocb_handle = 0;
23549c87f08Scgd     xiocb.xiocb_flags = flg;
23649c87f08Scgd     xiocb.xiocb_psize = 0;
23749c87f08Scgd 
23849c87f08Scgd     cfe_iocb_dispatch(&xiocb);
23949c87f08Scgd 
24049c87f08Scgd     return xiocb.xiocb_status;
24149c87f08Scgd }
24249c87f08Scgd #endif /* CFE_API_flushcache || CFE_API_ALL */
24349c87f08Scgd 
24449c87f08Scgd #if defined(CFE_API_getdevinfo) || defined(CFE_API_ALL)
24549c87f08Scgd int
cfe_getdevinfo(char * name)24649c87f08Scgd cfe_getdevinfo(char *name)
24749c87f08Scgd {
24849c87f08Scgd     cfe_xiocb_t xiocb;
24949c87f08Scgd 
25049c87f08Scgd     xiocb.xiocb_fcode = CFE_CMD_DEV_GETINFO;
25149c87f08Scgd     xiocb.xiocb_status = 0;
25249c87f08Scgd     xiocb.xiocb_handle = 0;
25349c87f08Scgd     xiocb.xiocb_flags = 0;
25449c87f08Scgd     xiocb.xiocb_psize = sizeof(xiocb_buffer_t);
25549c87f08Scgd     xiocb.plist.xiocb_buffer.buf_offset = 0;
25649c87f08Scgd     xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(name);
25749c87f08Scgd     xiocb.plist.xiocb_buffer.buf_length = cfe_strlen(name);
25849c87f08Scgd 
25949c87f08Scgd     cfe_iocb_dispatch(&xiocb);
26049c87f08Scgd 
26149c87f08Scgd     if (xiocb.xiocb_status < 0)
26249c87f08Scgd 	return xiocb.xiocb_status;
26349c87f08Scgd     return xiocb.plist.xiocb_buffer.buf_devflags;
26449c87f08Scgd }
26549c87f08Scgd #endif /* CFE_API_getdevinfo || CFE_API_ALL */
26649c87f08Scgd 
26749c87f08Scgd #if defined(CFE_API_getenv) || defined(CFE_API_ALL)
26849c87f08Scgd int
cfe_getenv(char * name,char * dest,int destlen)26949c87f08Scgd cfe_getenv(char *name, char *dest, int destlen)
27049c87f08Scgd {
27149c87f08Scgd     cfe_xiocb_t xiocb;
27249c87f08Scgd 
27349c87f08Scgd     *dest = 0;
27449c87f08Scgd 
27549c87f08Scgd     xiocb.xiocb_fcode = CFE_CMD_ENV_GET;
27649c87f08Scgd     xiocb.xiocb_status = 0;
27749c87f08Scgd     xiocb.xiocb_handle = 0;
27849c87f08Scgd     xiocb.xiocb_flags = 0;
27949c87f08Scgd     xiocb.xiocb_psize = sizeof(xiocb_envbuf_t);
28049c87f08Scgd     xiocb.plist.xiocb_envbuf.enum_idx = 0;
28149c87f08Scgd     xiocb.plist.xiocb_envbuf.name_ptr = XPTR_FROM_NATIVE(name);
28249c87f08Scgd     xiocb.plist.xiocb_envbuf.name_length = cfe_strlen(name);
28349c87f08Scgd     xiocb.plist.xiocb_envbuf.val_ptr = XPTR_FROM_NATIVE(dest);
28449c87f08Scgd     xiocb.plist.xiocb_envbuf.val_length = destlen;
28549c87f08Scgd 
28649c87f08Scgd     cfe_iocb_dispatch(&xiocb);
28749c87f08Scgd 
28849c87f08Scgd     return xiocb.xiocb_status;
28949c87f08Scgd }
29049c87f08Scgd #endif /* CFE_API_getenv || CFE_API_ALL */
29149c87f08Scgd 
29249c87f08Scgd #if defined(CFE_API_getfwinfo) || defined(CFE_API_ALL)
29349c87f08Scgd int
cfe_getfwinfo(cfe_fwinfo_t * info)29449c87f08Scgd cfe_getfwinfo(cfe_fwinfo_t *info)
29549c87f08Scgd {
29649c87f08Scgd     cfe_xiocb_t xiocb;
29749c87f08Scgd 
29849c87f08Scgd     xiocb.xiocb_fcode = CFE_CMD_FW_GETINFO;
29949c87f08Scgd     xiocb.xiocb_status = 0;
30049c87f08Scgd     xiocb.xiocb_handle = 0;
30149c87f08Scgd     xiocb.xiocb_flags = 0;
30249c87f08Scgd     xiocb.xiocb_psize = sizeof(xiocb_fwinfo_t);
30349c87f08Scgd 
30449c87f08Scgd     cfe_iocb_dispatch(&xiocb);
30549c87f08Scgd 
30649c87f08Scgd     if (xiocb.xiocb_status < 0)
30749c87f08Scgd 	return xiocb.xiocb_status;
30849c87f08Scgd 
30949c87f08Scgd     info->fwi_version = xiocb.plist.xiocb_fwinfo.fwi_version;
31049c87f08Scgd     info->fwi_totalmem = xiocb.plist.xiocb_fwinfo.fwi_totalmem;
31149c87f08Scgd     info->fwi_flags = xiocb.plist.xiocb_fwinfo.fwi_flags;
31249c87f08Scgd     info->fwi_boardid = xiocb.plist.xiocb_fwinfo.fwi_boardid;
31349c87f08Scgd     info->fwi_bootarea_va = xiocb.plist.xiocb_fwinfo.fwi_bootarea_va;
31449c87f08Scgd     info->fwi_bootarea_pa = xiocb.plist.xiocb_fwinfo.fwi_bootarea_pa;
31549c87f08Scgd     info->fwi_bootarea_size = xiocb.plist.xiocb_fwinfo.fwi_bootarea_size;
31649c87f08Scgd #if 0
31749c87f08Scgd     info->fwi_reserved1 = xiocb.plist.xiocb_fwinfo.fwi_reserved1;
31849c87f08Scgd     info->fwi_reserved2 = xiocb.plist.xiocb_fwinfo.fwi_reserved2;
31949c87f08Scgd     info->fwi_reserved3 = xiocb.plist.xiocb_fwinfo.fwi_reserved3;
32049c87f08Scgd #endif
32149c87f08Scgd 
32249c87f08Scgd     return 0;
32349c87f08Scgd }
32449c87f08Scgd #endif /* CFE_API_getfwinfo || CFE_API_ALL */
32549c87f08Scgd 
32649c87f08Scgd #if defined(CFE_API_getstdhandle) || defined(CFE_API_ALL)
32749c87f08Scgd int
cfe_getstdhandle(int flg)32849c87f08Scgd cfe_getstdhandle(int flg)
32949c87f08Scgd {
33049c87f08Scgd     cfe_xiocb_t xiocb;
33149c87f08Scgd 
33249c87f08Scgd     xiocb.xiocb_fcode = CFE_CMD_DEV_GETHANDLE;
33349c87f08Scgd     xiocb.xiocb_status = 0;
33449c87f08Scgd     xiocb.xiocb_handle = 0;
33549c87f08Scgd     xiocb.xiocb_flags = flg;
33649c87f08Scgd     xiocb.xiocb_psize = 0;
33749c87f08Scgd 
33849c87f08Scgd     cfe_iocb_dispatch(&xiocb);
33949c87f08Scgd 
34049c87f08Scgd     if (xiocb.xiocb_status < 0)
34149c87f08Scgd 	return xiocb.xiocb_status;
34249c87f08Scgd     return xiocb.xiocb_handle;
3431b5ddfe4Ssimonb 
3441b5ddfe4Ssimonb }
34549c87f08Scgd #endif /* CFE_API_getstdhandle || CFE_API_ALL */
3461b5ddfe4Ssimonb 
34749c87f08Scgd #if defined(CFE_API_getticks) || defined(CFE_API_ALL)
34849c87f08Scgd int64_t
34949c87f08Scgd #ifdef CFE_API_IMPL_NAMESPACE
__cfe_getticks(void)35049c87f08Scgd __cfe_getticks(void)
35149c87f08Scgd #else
35249c87f08Scgd cfe_getticks(void)
35349c87f08Scgd #endif
3541b5ddfe4Ssimonb {
3551b5ddfe4Ssimonb     cfe_xiocb_t xiocb;
3561b5ddfe4Ssimonb 
3571b5ddfe4Ssimonb     xiocb.xiocb_fcode = CFE_CMD_FW_GETTIME;
3581b5ddfe4Ssimonb     xiocb.xiocb_status = 0;
3591b5ddfe4Ssimonb     xiocb.xiocb_handle = 0;
3601b5ddfe4Ssimonb     xiocb.xiocb_flags = 0;
3611b5ddfe4Ssimonb     xiocb.xiocb_psize = sizeof(xiocb_time_t);
3621b5ddfe4Ssimonb     xiocb.plist.xiocb_time.ticks = 0;
3631b5ddfe4Ssimonb 
3641b5ddfe4Ssimonb     cfe_iocb_dispatch(&xiocb);
3651b5ddfe4Ssimonb 
3661b5ddfe4Ssimonb     return xiocb.plist.xiocb_time.ticks;
3671b5ddfe4Ssimonb 
3681b5ddfe4Ssimonb }
36949c87f08Scgd #endif /* CFE_API_getticks || CFE_API_ALL */
3701b5ddfe4Ssimonb 
37149c87f08Scgd #if defined(CFE_API_inpstat) || defined(CFE_API_ALL)
37249c87f08Scgd int
cfe_inpstat(int handle)37349c87f08Scgd cfe_inpstat(int handle)
3741b5ddfe4Ssimonb {
3751b5ddfe4Ssimonb     cfe_xiocb_t xiocb;
3761b5ddfe4Ssimonb 
37749c87f08Scgd     xiocb.xiocb_fcode = CFE_CMD_DEV_INPSTAT;
3781b5ddfe4Ssimonb     xiocb.xiocb_status = 0;
37949c87f08Scgd     xiocb.xiocb_handle = handle;
3801b5ddfe4Ssimonb     xiocb.xiocb_flags = 0;
38149c87f08Scgd     xiocb.xiocb_psize = sizeof(xiocb_inpstat_t);
38249c87f08Scgd     xiocb.plist.xiocb_inpstat.inp_status = 0;
3831b5ddfe4Ssimonb 
3841b5ddfe4Ssimonb     cfe_iocb_dispatch(&xiocb);
3851b5ddfe4Ssimonb 
38649c87f08Scgd     if (xiocb.xiocb_status < 0)
38749c87f08Scgd 	return xiocb.xiocb_status;
38849c87f08Scgd     return xiocb.plist.xiocb_inpstat.inp_status;
38949c87f08Scgd 
39049c87f08Scgd }
39149c87f08Scgd #endif /* CFE_API_inpstat || CFE_API_ALL */
39249c87f08Scgd 
39349c87f08Scgd #if defined(CFE_API_ioctl) || defined(CFE_API_ALL)
39449c87f08Scgd int
cfe_ioctl(int handle,unsigned int ioctlnum,unsigned char * buffer,int length,int * retlen,cfe_xuint_t offset)39549c87f08Scgd cfe_ioctl(int handle, unsigned int ioctlnum, unsigned char *buffer, int length,
39649c87f08Scgd 	  int *retlen, cfe_xuint_t offset)
39749c87f08Scgd {
39849c87f08Scgd     cfe_xiocb_t xiocb;
39949c87f08Scgd 
40049c87f08Scgd     xiocb.xiocb_fcode = CFE_CMD_DEV_IOCTL;
40149c87f08Scgd     xiocb.xiocb_status = 0;
40249c87f08Scgd     xiocb.xiocb_handle = handle;
40349c87f08Scgd     xiocb.xiocb_flags = 0;
40449c87f08Scgd     xiocb.xiocb_psize = sizeof(xiocb_buffer_t);
40549c87f08Scgd     xiocb.plist.xiocb_buffer.buf_offset = offset;
40649c87f08Scgd     xiocb.plist.xiocb_buffer.buf_ioctlcmd = ioctlnum;
40749c87f08Scgd     xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(buffer);
40849c87f08Scgd     xiocb.plist.xiocb_buffer.buf_length = length;
40949c87f08Scgd 
41049c87f08Scgd     cfe_iocb_dispatch(&xiocb);
41149c87f08Scgd 
41249c87f08Scgd     if (retlen)
41349c87f08Scgd 	*retlen = xiocb.plist.xiocb_buffer.buf_retlen;
4141b5ddfe4Ssimonb     return xiocb.xiocb_status;
4151b5ddfe4Ssimonb }
41649c87f08Scgd #endif /* CFE_API_ioctl || CFE_API_ALL */
4171b5ddfe4Ssimonb 
41849c87f08Scgd #if defined(CFE_API_open) || defined(CFE_API_ALL)
41949c87f08Scgd int
cfe_open(char * name)42049c87f08Scgd cfe_open(char *name)
42149c87f08Scgd {
42249c87f08Scgd     cfe_xiocb_t xiocb;
42349c87f08Scgd 
42449c87f08Scgd     xiocb.xiocb_fcode = CFE_CMD_DEV_OPEN;
42549c87f08Scgd     xiocb.xiocb_status = 0;
42649c87f08Scgd     xiocb.xiocb_handle = 0;
42749c87f08Scgd     xiocb.xiocb_flags = 0;
42849c87f08Scgd     xiocb.xiocb_psize = sizeof(xiocb_buffer_t);
42949c87f08Scgd     xiocb.plist.xiocb_buffer.buf_offset = 0;
43049c87f08Scgd     xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(name);
43149c87f08Scgd     xiocb.plist.xiocb_buffer.buf_length = cfe_strlen(name);
43249c87f08Scgd 
43349c87f08Scgd     cfe_iocb_dispatch(&xiocb);
43449c87f08Scgd 
43549c87f08Scgd     if (xiocb.xiocb_status < 0)
43649c87f08Scgd 	return xiocb.xiocb_status;
43749c87f08Scgd     return xiocb.xiocb_handle;
43849c87f08Scgd }
43949c87f08Scgd #endif /* CFE_API_open || CFE_API_ALL */
44049c87f08Scgd 
44149c87f08Scgd #if defined(CFE_API_read) || defined(CFE_API_ALL)
44249c87f08Scgd int
cfe_read(int handle,unsigned char * buffer,int length)44349c87f08Scgd cfe_read(int handle, unsigned char *buffer, int length)
44449c87f08Scgd {
44549c87f08Scgd     return cfe_readblk(handle, 0, buffer, length);
44649c87f08Scgd }
44749c87f08Scgd #endif /* CFE_API_read || CFE_API_ALL */
44849c87f08Scgd 
44949c87f08Scgd #if defined(CFE_API_readblk) || defined(CFE_API_ALL)
45049c87f08Scgd int
cfe_readblk(int handle,cfe_xint_t offset,unsigned char * buffer,int length)45149c87f08Scgd cfe_readblk(int handle, cfe_xint_t offset, unsigned char *buffer, int length)
45249c87f08Scgd {
45349c87f08Scgd     cfe_xiocb_t xiocb;
45449c87f08Scgd 
45549c87f08Scgd     xiocb.xiocb_fcode = CFE_CMD_DEV_READ;
45649c87f08Scgd     xiocb.xiocb_status = 0;
45749c87f08Scgd     xiocb.xiocb_handle = handle;
45849c87f08Scgd     xiocb.xiocb_flags = 0;
45949c87f08Scgd     xiocb.xiocb_psize = sizeof(xiocb_buffer_t);
46049c87f08Scgd     xiocb.plist.xiocb_buffer.buf_offset = offset;
46149c87f08Scgd     xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(buffer);
46249c87f08Scgd     xiocb.plist.xiocb_buffer.buf_length = length;
46349c87f08Scgd 
46449c87f08Scgd     cfe_iocb_dispatch(&xiocb);
46549c87f08Scgd 
46649c87f08Scgd     if (xiocb.xiocb_status < 0)
46749c87f08Scgd 	return xiocb.xiocb_status;
46849c87f08Scgd     return xiocb.plist.xiocb_buffer.buf_retlen;
46949c87f08Scgd }
47049c87f08Scgd #endif /* CFE_API_readblk || CFE_API_ALL */
47149c87f08Scgd 
47249c87f08Scgd #if defined(CFE_API_setenv) || defined(CFE_API_ALL)
47349c87f08Scgd int
cfe_setenv(char * name,char * val)47449c87f08Scgd cfe_setenv(char *name, char *val)
4751b5ddfe4Ssimonb {
4761b5ddfe4Ssimonb     cfe_xiocb_t xiocb;
4771b5ddfe4Ssimonb 
4781b5ddfe4Ssimonb     xiocb.xiocb_fcode = CFE_CMD_ENV_SET;
4791b5ddfe4Ssimonb     xiocb.xiocb_status = 0;
4801b5ddfe4Ssimonb     xiocb.xiocb_handle = 0;
4811b5ddfe4Ssimonb     xiocb.xiocb_flags = 0;
4821b5ddfe4Ssimonb     xiocb.xiocb_psize = sizeof(xiocb_envbuf_t);
4831b5ddfe4Ssimonb     xiocb.plist.xiocb_envbuf.enum_idx = 0;
48449c87f08Scgd     xiocb.plist.xiocb_envbuf.name_ptr = XPTR_FROM_NATIVE(name);
4851b5ddfe4Ssimonb     xiocb.plist.xiocb_envbuf.name_length = cfe_strlen(name);
48649c87f08Scgd     xiocb.plist.xiocb_envbuf.val_ptr = XPTR_FROM_NATIVE(val);
4871b5ddfe4Ssimonb     xiocb.plist.xiocb_envbuf.val_length = cfe_strlen(val);
4881b5ddfe4Ssimonb 
4891b5ddfe4Ssimonb     cfe_iocb_dispatch(&xiocb);
4901b5ddfe4Ssimonb 
4911b5ddfe4Ssimonb     return xiocb.xiocb_status;
4921b5ddfe4Ssimonb }
49349c87f08Scgd #endif /* CFE_API_setenv || CFE_API_ALL */
4941b5ddfe4Ssimonb 
49549c87f08Scgd #if (defined(CFE_API_strlen) || defined(CFE_API_ALL)) \
49649c87f08Scgd     && !defined(CFE_API_STRLEN_CUSTOM)
49749c87f08Scgd int
cfe_strlen(char * name)49849c87f08Scgd cfe_strlen(char *name)
4991b5ddfe4Ssimonb {
50049c87f08Scgd     int count = 0;
5011b5ddfe4Ssimonb 
50249c87f08Scgd     while (*name++)
50349c87f08Scgd 	count++;
5041b5ddfe4Ssimonb 
50549c87f08Scgd     return count;
5061b5ddfe4Ssimonb }
50749c87f08Scgd #endif /* CFE_API_strlen || CFE_API_ALL */
5081b5ddfe4Ssimonb 
50949c87f08Scgd #if defined(CFE_API_write) || defined(CFE_API_ALL)
51049c87f08Scgd int
cfe_write(int handle,unsigned char * buffer,int length)51149c87f08Scgd cfe_write(int handle, unsigned char *buffer, int length)
5121b5ddfe4Ssimonb {
51349c87f08Scgd     return cfe_writeblk(handle, 0, buffer, length);
5141b5ddfe4Ssimonb }
51549c87f08Scgd #endif /* CFE_API_write || CFE_API_ALL */
5161b5ddfe4Ssimonb 
51749c87f08Scgd #if defined(CFE_API_writeblk) || defined(CFE_API_ALL)
51849c87f08Scgd int
cfe_writeblk(int handle,cfe_xint_t offset,unsigned char * buffer,int length)51949c87f08Scgd cfe_writeblk(int handle, cfe_xint_t offset, unsigned char *buffer, int length)
5201b5ddfe4Ssimonb {
5211b5ddfe4Ssimonb     cfe_xiocb_t xiocb;
5221b5ddfe4Ssimonb 
52349c87f08Scgd     xiocb.xiocb_fcode = CFE_CMD_DEV_WRITE;
5241b5ddfe4Ssimonb     xiocb.xiocb_status = 0;
52549c87f08Scgd     xiocb.xiocb_handle = handle;
5261b5ddfe4Ssimonb     xiocb.xiocb_flags = 0;
5271b5ddfe4Ssimonb     xiocb.xiocb_psize = sizeof(xiocb_buffer_t);
52849c87f08Scgd     xiocb.plist.xiocb_buffer.buf_offset = offset;
52949c87f08Scgd     xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(buffer);
53049c87f08Scgd     xiocb.plist.xiocb_buffer.buf_length = length;
5311b5ddfe4Ssimonb 
5321b5ddfe4Ssimonb     cfe_iocb_dispatch(&xiocb);
5331b5ddfe4Ssimonb 
53449c87f08Scgd     if (xiocb.xiocb_status < 0)
53549c87f08Scgd 	return xiocb.xiocb_status;
53649c87f08Scgd     return xiocb.plist.xiocb_buffer.buf_retlen;
5371b5ddfe4Ssimonb }
53849c87f08Scgd #endif /* CFE_API_writeblk || CFE_API_ALL */
539