1183370Simp/* $NetBSD: cfe_api.c,v 1.5 2005/12/11 12:18:07 christos Exp $ */
2183370Simp/* from: SiByte Id: cfe_api.c,v 1.16 2002/07/09 23:29:11 cgd Exp $ */
3183370Simp
4183370Simp/*-
5183370Simp * Copyright 2000, 2001, 2002
6183370Simp * Broadcom Corporation. All rights reserved.
7183370Simp *
8183370Simp * This software is furnished under license and may be used and copied only
9183370Simp * in accordance with the following terms and conditions.  Subject to these
10183370Simp * conditions, you may download, copy, install, use, modify and distribute
11183370Simp * modified or unmodified copies of this software in source and/or binary
12183370Simp * form. No title or ownership is transferred hereby.
13183370Simp *
14183370Simp * 1) Any source code used, modified or distributed must reproduce and
15183370Simp *    retain this copyright notice and list of conditions as they appear in
16183370Simp *    the source file.
17183370Simp *
18183370Simp * 2) No right is granted to use any trade name, trademark, or logo of
19183370Simp *    Broadcom Corporation.  The "Broadcom Corporation" name may not be
20183370Simp *    used to endorse or promote products derived from this software
21183370Simp *    without the prior written permission of Broadcom Corporation.
22183370Simp *
23183370Simp * 3) THIS SOFTWARE IS PROVIDED "AS-IS" AND ANY EXPRESS OR IMPLIED
24183370Simp *    WARRANTIES, INCLUDING BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OF
25183370Simp *    MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
26183370Simp *    NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL BROADCOM BE LIABLE
27183370Simp *    FOR ANY DAMAGES WHATSOEVER, AND IN PARTICULAR, BROADCOM SHALL NOT BE
28183370Simp *    LIABLE FOR DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
29183370Simp *    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
30183370Simp *    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
31183370Simp *    BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
32183370Simp *    WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
33183370Simp *    OR OTHERWISE), EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34183370Simp */
35183370Simp
36183370Simp/*  *********************************************************************
37183370Simp    *
38183370Simp    *  Broadcom Common Firmware Environment (CFE)
39183370Simp    *
40183370Simp    *  Device Function stubs			File: cfe_api.c
41183370Simp    *
42183370Simp    *  This module contains device function stubs (small routines to
43183370Simp    *  call the standard "iocb" interface entry point to CFE).
44183370Simp    *  There should be one routine here per iocb function call.
45183370Simp    *
46183370Simp    *  Authors:  Mitch Lichtenberg, Chris Demetriou
47183370Simp    *
48183370Simp    ********************************************************************* */
49183370Simp
50183370Simp#include <sys/cdefs.h>
51183370Simp__FBSDID("$FreeBSD$");
52183370Simp
53183370Simp#include <dev/cfe/cfe_api.h>
54183370Simp#include <dev/cfe/cfe_api_int.h>
55183370Simp
56183370Simp/* Cast from a native pointer to a cfe_xptr_t and back.  */
57183370Simp#define XPTR_FROM_NATIVE(n)	((cfe_xptr_t) (intptr_t) (n))
58183370Simp#define NATIVE_FROM_XPTR(x)	((void *) (intptr_t) (x))
59183370Simp
60183370Simp#ifdef CFE_API_IMPL_NAMESPACE
61183370Simp#define cfe_iocb_dispatch(a)		__cfe_iocb_dispatch(a)
62183370Simp#endif
63183370Simpint cfe_iocb_dispatch(cfe_xiocb_t *xiocb);
64183370Simp
65183370Simp#if defined(CFE_API_common) || defined(CFE_API_ALL)
66183370Simp/*
67183370Simp * Declare the dispatch function with args of "intptr_t".
68183370Simp * This makes sure whatever model we're compiling in
69183370Simp * puts the pointers in a single register.  For example,
70183370Simp * combining -mlong64 and -mips1 or -mips2 would lead to
71183370Simp * trouble, since the handle and IOCB pointer will be
72183370Simp * passed in two registers each, and CFE expects one.
73183370Simp */
74183370Simp
75183370Simpstatic int (*cfe_dispfunc)(intptr_t handle, intptr_t xiocb) = 0;
76183370Simpstatic cfe_xuint_t cfe_handle = 0;
77183370Simp
78183370Simpint
79183370Simpcfe_init(cfe_xuint_t handle, cfe_xuint_t ept)
80183370Simp{
81183370Simp    cfe_dispfunc = NATIVE_FROM_XPTR(ept);
82183370Simp    cfe_handle = handle;
83183370Simp    return 0;
84183370Simp}
85183370Simp
86183370Simpint
87183370Simpcfe_iocb_dispatch(cfe_xiocb_t *xiocb)
88183370Simp{
89183370Simp    if (!cfe_dispfunc) return -1;
90183370Simp    return (*cfe_dispfunc)((intptr_t)cfe_handle, (intptr_t)xiocb);
91183370Simp}
92183370Simp#endif /* CFE_API_common || CFE_API_ALL */
93183370Simp
94183370Simp#if defined(CFE_API_close) || defined(CFE_API_ALL)
95183370Simpint
96183370Simpcfe_close(int handle)
97183370Simp{
98183370Simp    cfe_xiocb_t xiocb;
99183370Simp
100183370Simp    xiocb.xiocb_fcode = CFE_CMD_DEV_CLOSE;
101183370Simp    xiocb.xiocb_status = 0;
102183370Simp    xiocb.xiocb_handle = handle;
103183370Simp    xiocb.xiocb_flags = 0;
104183370Simp    xiocb.xiocb_psize = 0;
105183370Simp
106183370Simp    cfe_iocb_dispatch(&xiocb);
107183370Simp
108183370Simp    return xiocb.xiocb_status;
109183370Simp
110183370Simp}
111183370Simp#endif /* CFE_API_close || CFE_API_ALL */
112183370Simp
113183370Simp#if defined(CFE_API_cpu_start) || defined(CFE_API_ALL)
114183370Simpint
115183370Simpcfe_cpu_start(int cpu, void (*fn)(void), long sp, long gp, long a1)
116183370Simp{
117183370Simp    cfe_xiocb_t xiocb;
118183370Simp
119183370Simp    xiocb.xiocb_fcode = CFE_CMD_FW_CPUCTL;
120183370Simp    xiocb.xiocb_status = 0;
121183370Simp    xiocb.xiocb_handle = 0;
122183370Simp    xiocb.xiocb_flags  = 0;
123183370Simp    xiocb.xiocb_psize = sizeof(xiocb_cpuctl_t);
124183370Simp    xiocb.plist.xiocb_cpuctl.cpu_number = cpu;
125183370Simp    xiocb.plist.xiocb_cpuctl.cpu_command = CFE_CPU_CMD_START;
126183370Simp    xiocb.plist.xiocb_cpuctl.gp_val = gp;
127183370Simp    xiocb.plist.xiocb_cpuctl.sp_val = sp;
128183370Simp    xiocb.plist.xiocb_cpuctl.a1_val = a1;
129183370Simp    xiocb.plist.xiocb_cpuctl.start_addr = (long)fn;
130183370Simp
131183370Simp    cfe_iocb_dispatch(&xiocb);
132183370Simp
133183370Simp    return xiocb.xiocb_status;
134183370Simp}
135183370Simp#endif /* CFE_API_cpu_start || CFE_API_ALL */
136183370Simp
137183370Simp#if defined(CFE_API_cpu_stop) || defined(CFE_API_ALL)
138183370Simpint
139183370Simpcfe_cpu_stop(int cpu)
140183370Simp{
141183370Simp    cfe_xiocb_t xiocb;
142183370Simp
143183370Simp    xiocb.xiocb_fcode = CFE_CMD_FW_CPUCTL;
144183370Simp    xiocb.xiocb_status = 0;
145183370Simp    xiocb.xiocb_handle = 0;
146183370Simp    xiocb.xiocb_flags  = 0;
147183370Simp    xiocb.xiocb_psize = sizeof(xiocb_cpuctl_t);
148183370Simp    xiocb.plist.xiocb_cpuctl.cpu_number = cpu;
149183370Simp    xiocb.plist.xiocb_cpuctl.cpu_command = CFE_CPU_CMD_STOP;
150183370Simp
151183370Simp    cfe_iocb_dispatch(&xiocb);
152183370Simp
153183370Simp    return xiocb.xiocb_status;
154183370Simp}
155183370Simp#endif /* CFE_API_cpu_stop || CFE_API_ALL */
156183370Simp
157183370Simp#if defined(CFE_API_enumenv) || defined(CFE_API_ALL)
158183370Simpint
159183370Simpcfe_enumenv(int idx, char *name, int namelen, char *val, int vallen)
160183370Simp{
161183370Simp    cfe_xiocb_t xiocb;
162183370Simp
163202091Simp    xiocb.xiocb_fcode = CFE_CMD_ENV_ENUM;
164183370Simp    xiocb.xiocb_status = 0;
165183370Simp    xiocb.xiocb_handle = 0;
166183370Simp    xiocb.xiocb_flags = 0;
167183370Simp    xiocb.xiocb_psize = sizeof(xiocb_envbuf_t);
168183370Simp    xiocb.plist.xiocb_envbuf.enum_idx = idx;
169183370Simp    xiocb.plist.xiocb_envbuf.name_ptr = XPTR_FROM_NATIVE(name);
170183370Simp    xiocb.plist.xiocb_envbuf.name_length = namelen;
171183370Simp    xiocb.plist.xiocb_envbuf.val_ptr = XPTR_FROM_NATIVE(val);
172183370Simp    xiocb.plist.xiocb_envbuf.val_length = vallen;
173183370Simp
174183370Simp    cfe_iocb_dispatch(&xiocb);
175183370Simp
176183370Simp    return xiocb.xiocb_status;
177183370Simp}
178183370Simp#endif /* CFE_API_enumenv || CFE_API_ALL */
179183370Simp
180183370Simp#if defined(CFE_API_enummem) || defined(CFE_API_ALL)
181183370Simpint
182183370Simpcfe_enummem(int idx, int flags, cfe_xuint_t *start, cfe_xuint_t *length,
183183370Simp	    cfe_xuint_t *type)
184183370Simp{
185183370Simp    cfe_xiocb_t xiocb;
186183370Simp
187183370Simp    xiocb.xiocb_fcode = CFE_CMD_FW_MEMENUM;
188183370Simp    xiocb.xiocb_status = 0;
189183370Simp    xiocb.xiocb_handle = 0;
190183370Simp    xiocb.xiocb_flags = flags;
191183370Simp    xiocb.xiocb_psize = sizeof(xiocb_meminfo_t);
192183370Simp    xiocb.plist.xiocb_meminfo.mi_idx = idx;
193183370Simp
194183370Simp    cfe_iocb_dispatch(&xiocb);
195183370Simp
196183370Simp    if (xiocb.xiocb_status < 0)
197183370Simp	return xiocb.xiocb_status;
198183370Simp
199183370Simp    *start = xiocb.plist.xiocb_meminfo.mi_addr;
200183370Simp    *length = xiocb.plist.xiocb_meminfo.mi_size;
201183370Simp    *type = xiocb.plist.xiocb_meminfo.mi_type;
202183370Simp
203183370Simp    return 0;
204183370Simp}
205183370Simp#endif /* CFE_API_enummem || CFE_API_ALL */
206183370Simp
207183370Simp#if defined(CFE_API_exit) || defined(CFE_API_ALL)
208183370Simpint
209183370Simpcfe_exit(int warm, int status)
210183370Simp{
211183370Simp    cfe_xiocb_t xiocb;
212183370Simp
213183370Simp    xiocb.xiocb_fcode = CFE_CMD_FW_RESTART;
214183370Simp    xiocb.xiocb_status = 0;
215183370Simp    xiocb.xiocb_handle = 0;
216183370Simp    xiocb.xiocb_flags = warm ? CFE_FLG_WARMSTART : 0;
217183370Simp    xiocb.xiocb_psize = sizeof(xiocb_exitstat_t);
218183370Simp    xiocb.plist.xiocb_exitstat.status = status;
219183370Simp
220183370Simp    cfe_iocb_dispatch(&xiocb);
221183370Simp
222183370Simp    return xiocb.xiocb_status;
223183370Simp}
224183370Simp#endif /* CFE_API_exit || CFE_API_ALL */
225183370Simp
226183370Simp#if defined(CFE_API_flushcache) || defined(CFE_API_ALL)
227183370Simpint
228183370Simpcfe_flushcache(int flg)
229183370Simp{
230183370Simp    cfe_xiocb_t xiocb;
231183370Simp
232183370Simp    xiocb.xiocb_fcode = CFE_CMD_FW_FLUSHCACHE;
233183370Simp    xiocb.xiocb_status = 0;
234183370Simp    xiocb.xiocb_handle = 0;
235183370Simp    xiocb.xiocb_flags = flg;
236183370Simp    xiocb.xiocb_psize = 0;
237183370Simp
238183370Simp    cfe_iocb_dispatch(&xiocb);
239183370Simp
240183370Simp    return xiocb.xiocb_status;
241183370Simp}
242183370Simp#endif /* CFE_API_flushcache || CFE_API_ALL */
243183370Simp
244183370Simp#if defined(CFE_API_getdevinfo) || defined(CFE_API_ALL)
245183370Simpint
246183370Simpcfe_getdevinfo(char *name)
247183370Simp{
248183370Simp    cfe_xiocb_t xiocb;
249183370Simp
250183370Simp    xiocb.xiocb_fcode = CFE_CMD_DEV_GETINFO;
251183370Simp    xiocb.xiocb_status = 0;
252183370Simp    xiocb.xiocb_handle = 0;
253183370Simp    xiocb.xiocb_flags = 0;
254183370Simp    xiocb.xiocb_psize = sizeof(xiocb_buffer_t);
255183370Simp    xiocb.plist.xiocb_buffer.buf_offset = 0;
256183370Simp    xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(name);
257183370Simp    xiocb.plist.xiocb_buffer.buf_length = cfe_strlen(name);
258183370Simp
259183370Simp    cfe_iocb_dispatch(&xiocb);
260183370Simp
261183370Simp    if (xiocb.xiocb_status < 0)
262183370Simp	return xiocb.xiocb_status;
263183370Simp    return xiocb.plist.xiocb_buffer.buf_devflags;
264183370Simp}
265183370Simp#endif /* CFE_API_getdevinfo || CFE_API_ALL */
266183370Simp
267183370Simp#if defined(CFE_API_getenv) || defined(CFE_API_ALL)
268183370Simpint
269183370Simpcfe_getenv(char *name, char *dest, int destlen)
270183370Simp{
271183370Simp    cfe_xiocb_t xiocb;
272183370Simp
273183370Simp    *dest = 0;
274183370Simp
275183370Simp    xiocb.xiocb_fcode = CFE_CMD_ENV_GET;
276183370Simp    xiocb.xiocb_status = 0;
277183370Simp    xiocb.xiocb_handle = 0;
278183370Simp    xiocb.xiocb_flags = 0;
279183370Simp    xiocb.xiocb_psize = sizeof(xiocb_envbuf_t);
280183370Simp    xiocb.plist.xiocb_envbuf.enum_idx = 0;
281183370Simp    xiocb.plist.xiocb_envbuf.name_ptr = XPTR_FROM_NATIVE(name);
282183370Simp    xiocb.plist.xiocb_envbuf.name_length = cfe_strlen(name);
283183370Simp    xiocb.plist.xiocb_envbuf.val_ptr = XPTR_FROM_NATIVE(dest);
284183370Simp    xiocb.plist.xiocb_envbuf.val_length = destlen;
285183370Simp
286183370Simp    cfe_iocb_dispatch(&xiocb);
287183370Simp
288183370Simp    return xiocb.xiocb_status;
289183370Simp}
290183370Simp#endif /* CFE_API_getenv || CFE_API_ALL */
291183370Simp
292183370Simp#if defined(CFE_API_getfwinfo) || defined(CFE_API_ALL)
293183370Simpint
294183370Simpcfe_getfwinfo(cfe_fwinfo_t *info)
295183370Simp{
296183370Simp    cfe_xiocb_t xiocb;
297183370Simp
298183370Simp    xiocb.xiocb_fcode = CFE_CMD_FW_GETINFO;
299183370Simp    xiocb.xiocb_status = 0;
300183370Simp    xiocb.xiocb_handle = 0;
301183370Simp    xiocb.xiocb_flags = 0;
302183370Simp    xiocb.xiocb_psize = sizeof(xiocb_fwinfo_t);
303183370Simp
304183370Simp    cfe_iocb_dispatch(&xiocb);
305183370Simp
306183370Simp    if (xiocb.xiocb_status < 0)
307183370Simp	return xiocb.xiocb_status;
308183370Simp
309183370Simp    info->fwi_version = xiocb.plist.xiocb_fwinfo.fwi_version;
310183370Simp    info->fwi_totalmem = xiocb.plist.xiocb_fwinfo.fwi_totalmem;
311183370Simp    info->fwi_flags = xiocb.plist.xiocb_fwinfo.fwi_flags;
312183370Simp    info->fwi_boardid = xiocb.plist.xiocb_fwinfo.fwi_boardid;
313183370Simp    info->fwi_bootarea_va = xiocb.plist.xiocb_fwinfo.fwi_bootarea_va;
314183370Simp    info->fwi_bootarea_pa = xiocb.plist.xiocb_fwinfo.fwi_bootarea_pa;
315183370Simp    info->fwi_bootarea_size = xiocb.plist.xiocb_fwinfo.fwi_bootarea_size;
316183370Simp#if 0
317183370Simp    info->fwi_reserved1 = xiocb.plist.xiocb_fwinfo.fwi_reserved1;
318183370Simp    info->fwi_reserved2 = xiocb.plist.xiocb_fwinfo.fwi_reserved2;
319183370Simp    info->fwi_reserved3 = xiocb.plist.xiocb_fwinfo.fwi_reserved3;
320183370Simp#endif
321183370Simp
322183370Simp    return 0;
323183370Simp}
324183370Simp#endif /* CFE_API_getfwinfo || CFE_API_ALL */
325183370Simp
326183370Simp#if defined(CFE_API_getstdhandle) || defined(CFE_API_ALL)
327183370Simpint
328183370Simpcfe_getstdhandle(int flg)
329183370Simp{
330183370Simp    cfe_xiocb_t xiocb;
331183370Simp
332183370Simp    xiocb.xiocb_fcode = CFE_CMD_DEV_GETHANDLE;
333183370Simp    xiocb.xiocb_status = 0;
334183370Simp    xiocb.xiocb_handle = 0;
335183370Simp    xiocb.xiocb_flags = flg;
336183370Simp    xiocb.xiocb_psize = 0;
337183370Simp
338183370Simp    cfe_iocb_dispatch(&xiocb);
339183370Simp
340183370Simp    if (xiocb.xiocb_status < 0)
341183370Simp	return xiocb.xiocb_status;
342183370Simp    return xiocb.xiocb_handle;
343183370Simp
344183370Simp}
345183370Simp#endif /* CFE_API_getstdhandle || CFE_API_ALL */
346183370Simp
347183370Simp#if defined(CFE_API_getticks) || defined(CFE_API_ALL)
348183370Simpint64_t
349183370Simp#ifdef CFE_API_IMPL_NAMESPACE
350183370Simp__cfe_getticks(void)
351183370Simp#else
352183370Simpcfe_getticks(void)
353183370Simp#endif
354183370Simp{
355183370Simp    cfe_xiocb_t xiocb;
356183370Simp
357183370Simp    xiocb.xiocb_fcode = CFE_CMD_FW_GETTIME;
358183370Simp    xiocb.xiocb_status = 0;
359183370Simp    xiocb.xiocb_handle = 0;
360183370Simp    xiocb.xiocb_flags = 0;
361183370Simp    xiocb.xiocb_psize = sizeof(xiocb_time_t);
362183370Simp    xiocb.plist.xiocb_time.ticks = 0;
363183370Simp
364183370Simp    cfe_iocb_dispatch(&xiocb);
365183370Simp
366183370Simp    return xiocb.plist.xiocb_time.ticks;
367183370Simp
368183370Simp}
369183370Simp#endif /* CFE_API_getticks || CFE_API_ALL */
370183370Simp
371183370Simp#if defined(CFE_API_inpstat) || defined(CFE_API_ALL)
372183370Simpint
373183370Simpcfe_inpstat(int handle)
374183370Simp{
375183370Simp    cfe_xiocb_t xiocb;
376183370Simp
377183370Simp    xiocb.xiocb_fcode = CFE_CMD_DEV_INPSTAT;
378183370Simp    xiocb.xiocb_status = 0;
379183370Simp    xiocb.xiocb_handle = handle;
380183370Simp    xiocb.xiocb_flags = 0;
381183370Simp    xiocb.xiocb_psize = sizeof(xiocb_inpstat_t);
382183370Simp    xiocb.plist.xiocb_inpstat.inp_status = 0;
383183370Simp
384183370Simp    cfe_iocb_dispatch(&xiocb);
385183370Simp
386183370Simp    if (xiocb.xiocb_status < 0)
387183370Simp	return xiocb.xiocb_status;
388183370Simp    return xiocb.plist.xiocb_inpstat.inp_status;
389183370Simp
390183370Simp}
391183370Simp#endif /* CFE_API_inpstat || CFE_API_ALL */
392183370Simp
393183370Simp#if defined(CFE_API_ioctl) || defined(CFE_API_ALL)
394183370Simpint
395183370Simpcfe_ioctl(int handle, unsigned int ioctlnum, unsigned char *buffer, int length,
396183370Simp	  int *retlen, cfe_xuint_t offset)
397183370Simp{
398183370Simp    cfe_xiocb_t xiocb;
399183370Simp
400183370Simp    xiocb.xiocb_fcode = CFE_CMD_DEV_IOCTL;
401183370Simp    xiocb.xiocb_status = 0;
402183370Simp    xiocb.xiocb_handle = handle;
403183370Simp    xiocb.xiocb_flags = 0;
404183370Simp    xiocb.xiocb_psize = sizeof(xiocb_buffer_t);
405183370Simp    xiocb.plist.xiocb_buffer.buf_offset = offset;
406183370Simp    xiocb.plist.xiocb_buffer.buf_ioctlcmd = ioctlnum;
407183370Simp    xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(buffer);
408183370Simp    xiocb.plist.xiocb_buffer.buf_length = length;
409183370Simp
410183370Simp    cfe_iocb_dispatch(&xiocb);
411183370Simp
412183370Simp    if (retlen)
413183370Simp	*retlen = xiocb.plist.xiocb_buffer.buf_retlen;
414183370Simp    return xiocb.xiocb_status;
415183370Simp}
416183370Simp#endif /* CFE_API_ioctl || CFE_API_ALL */
417183370Simp
418183370Simp#if defined(CFE_API_open) || defined(CFE_API_ALL)
419183370Simpint
420183370Simpcfe_open(char *name)
421183370Simp{
422183370Simp    cfe_xiocb_t xiocb;
423183370Simp
424183370Simp    xiocb.xiocb_fcode = CFE_CMD_DEV_OPEN;
425183370Simp    xiocb.xiocb_status = 0;
426183370Simp    xiocb.xiocb_handle = 0;
427183370Simp    xiocb.xiocb_flags = 0;
428183370Simp    xiocb.xiocb_psize = sizeof(xiocb_buffer_t);
429183370Simp    xiocb.plist.xiocb_buffer.buf_offset = 0;
430183370Simp    xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(name);
431183370Simp    xiocb.plist.xiocb_buffer.buf_length = cfe_strlen(name);
432183370Simp
433183370Simp    cfe_iocb_dispatch(&xiocb);
434183370Simp
435183370Simp    if (xiocb.xiocb_status < 0)
436183370Simp	return xiocb.xiocb_status;
437183370Simp    return xiocb.xiocb_handle;
438183370Simp}
439183370Simp#endif /* CFE_API_open || CFE_API_ALL */
440183370Simp
441183370Simp#if defined(CFE_API_read) || defined(CFE_API_ALL)
442183370Simpint
443183370Simpcfe_read(int handle, unsigned char *buffer, int length)
444183370Simp{
445183370Simp    return cfe_readblk(handle, 0, buffer, length);
446183370Simp}
447183370Simp#endif /* CFE_API_read || CFE_API_ALL */
448183370Simp
449183370Simp#if defined(CFE_API_readblk) || defined(CFE_API_ALL)
450183370Simpint
451183370Simpcfe_readblk(int handle, cfe_xint_t offset, unsigned char *buffer, int length)
452183370Simp{
453183370Simp    cfe_xiocb_t xiocb;
454183370Simp
455183370Simp    xiocb.xiocb_fcode = CFE_CMD_DEV_READ;
456183370Simp    xiocb.xiocb_status = 0;
457183370Simp    xiocb.xiocb_handle = handle;
458183370Simp    xiocb.xiocb_flags = 0;
459183370Simp    xiocb.xiocb_psize = sizeof(xiocb_buffer_t);
460183370Simp    xiocb.plist.xiocb_buffer.buf_offset = offset;
461183370Simp    xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(buffer);
462183370Simp    xiocb.plist.xiocb_buffer.buf_length = length;
463183370Simp
464183370Simp    cfe_iocb_dispatch(&xiocb);
465183370Simp
466183370Simp    if (xiocb.xiocb_status < 0)
467183370Simp	return xiocb.xiocb_status;
468183370Simp    return xiocb.plist.xiocb_buffer.buf_retlen;
469183370Simp}
470183370Simp#endif /* CFE_API_readblk || CFE_API_ALL */
471183370Simp
472183370Simp#if defined(CFE_API_setenv) || defined(CFE_API_ALL)
473183370Simpint
474183370Simpcfe_setenv(char *name, char *val)
475183370Simp{
476183370Simp    cfe_xiocb_t xiocb;
477183370Simp
478183370Simp    xiocb.xiocb_fcode = CFE_CMD_ENV_SET;
479183370Simp    xiocb.xiocb_status = 0;
480183370Simp    xiocb.xiocb_handle = 0;
481183370Simp    xiocb.xiocb_flags = 0;
482183370Simp    xiocb.xiocb_psize = sizeof(xiocb_envbuf_t);
483183370Simp    xiocb.plist.xiocb_envbuf.enum_idx = 0;
484183370Simp    xiocb.plist.xiocb_envbuf.name_ptr = XPTR_FROM_NATIVE(name);
485183370Simp    xiocb.plist.xiocb_envbuf.name_length = cfe_strlen(name);
486183370Simp    xiocb.plist.xiocb_envbuf.val_ptr = XPTR_FROM_NATIVE(val);
487183370Simp    xiocb.plist.xiocb_envbuf.val_length = cfe_strlen(val);
488183370Simp
489183370Simp    cfe_iocb_dispatch(&xiocb);
490183370Simp
491183370Simp    return xiocb.xiocb_status;
492183370Simp}
493183370Simp#endif /* CFE_API_setenv || CFE_API_ALL */
494183370Simp
495183370Simp#if (defined(CFE_API_strlen) || defined(CFE_API_ALL)) \
496183370Simp    && !defined(CFE_API_STRLEN_CUSTOM)
497183370Simpint
498183370Simpcfe_strlen(char *name)
499183370Simp{
500183370Simp    int count = 0;
501183370Simp
502183370Simp    while (*name++)
503183370Simp	count++;
504183370Simp
505183370Simp    return count;
506183370Simp}
507183370Simp#endif /* CFE_API_strlen || CFE_API_ALL */
508183370Simp
509183370Simp#if defined(CFE_API_write) || defined(CFE_API_ALL)
510183370Simpint
511183370Simpcfe_write(int handle, unsigned char *buffer, int length)
512183370Simp{
513183370Simp    return cfe_writeblk(handle, 0, buffer, length);
514183370Simp}
515183370Simp#endif /* CFE_API_write || CFE_API_ALL */
516183370Simp
517183370Simp#if defined(CFE_API_writeblk) || defined(CFE_API_ALL)
518183370Simpint
519183370Simpcfe_writeblk(int handle, cfe_xint_t offset, unsigned char *buffer, int length)
520183370Simp{
521183370Simp    cfe_xiocb_t xiocb;
522183370Simp
523183370Simp    xiocb.xiocb_fcode = CFE_CMD_DEV_WRITE;
524183370Simp    xiocb.xiocb_status = 0;
525183370Simp    xiocb.xiocb_handle = handle;
526183370Simp    xiocb.xiocb_flags = 0;
527183370Simp    xiocb.xiocb_psize = sizeof(xiocb_buffer_t);
528183370Simp    xiocb.plist.xiocb_buffer.buf_offset = offset;
529183370Simp    xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(buffer);
530183370Simp    xiocb.plist.xiocb_buffer.buf_length = length;
531183370Simp
532183370Simp    cfe_iocb_dispatch(&xiocb);
533183370Simp
534183370Simp    if (xiocb.xiocb_status < 0)
535183370Simp	return xiocb.xiocb_status;
536183370Simp    return xiocb.plist.xiocb_buffer.buf_retlen;
537183370Simp}
538183370Simp#endif /* CFE_API_writeblk || CFE_API_ALL */
539