18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright (C) 2000, 2001, 2002 Broadcom Corporation
48c2ecf20Sopenharmony_ci */
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci/*
78c2ecf20Sopenharmony_ci *
88c2ecf20Sopenharmony_ci * Broadcom Common Firmware Environment (CFE)
98c2ecf20Sopenharmony_ci *
108c2ecf20Sopenharmony_ci * This module contains device function stubs (small routines to
118c2ecf20Sopenharmony_ci * call the standard "iocb" interface entry point to CFE).
128c2ecf20Sopenharmony_ci * There should be one routine here per iocb function call.
138c2ecf20Sopenharmony_ci *
148c2ecf20Sopenharmony_ci * Authors:  Mitch Lichtenberg, Chris Demetriou
158c2ecf20Sopenharmony_ci */
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci#include <asm/fw/cfe/cfe_api.h>
188c2ecf20Sopenharmony_ci#include "cfe_api_int.h"
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci/* Cast from a native pointer to a cfe_xptr_t and back.	 */
218c2ecf20Sopenharmony_ci#define XPTR_FROM_NATIVE(n)	((cfe_xptr_t) (intptr_t) (n))
228c2ecf20Sopenharmony_ci#define NATIVE_FROM_XPTR(x)	((void *) (intptr_t) (x))
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ciint cfe_iocb_dispatch(struct cfe_xiocb *xiocb);
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ci/*
278c2ecf20Sopenharmony_ci * Declare the dispatch function with args of "intptr_t".
288c2ecf20Sopenharmony_ci * This makes sure whatever model we're compiling in
298c2ecf20Sopenharmony_ci * puts the pointers in a single register.  For example,
308c2ecf20Sopenharmony_ci * combining -mlong64 and -mips1 or -mips2 would lead to
318c2ecf20Sopenharmony_ci * trouble, since the handle and IOCB pointer will be
328c2ecf20Sopenharmony_ci * passed in two registers each, and CFE expects one.
338c2ecf20Sopenharmony_ci */
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_cistatic int (*cfe_dispfunc) (intptr_t handle, intptr_t xiocb);
368c2ecf20Sopenharmony_cistatic u64 cfe_handle;
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ciint cfe_init(u64 handle, u64 ept)
398c2ecf20Sopenharmony_ci{
408c2ecf20Sopenharmony_ci	cfe_dispfunc = NATIVE_FROM_XPTR(ept);
418c2ecf20Sopenharmony_ci	cfe_handle = handle;
428c2ecf20Sopenharmony_ci	return 0;
438c2ecf20Sopenharmony_ci}
448c2ecf20Sopenharmony_ci
458c2ecf20Sopenharmony_ciint cfe_iocb_dispatch(struct cfe_xiocb * xiocb)
468c2ecf20Sopenharmony_ci{
478c2ecf20Sopenharmony_ci	if (!cfe_dispfunc)
488c2ecf20Sopenharmony_ci		return -1;
498c2ecf20Sopenharmony_ci	return (*cfe_dispfunc) ((intptr_t) cfe_handle, (intptr_t) xiocb);
508c2ecf20Sopenharmony_ci}
518c2ecf20Sopenharmony_ci
528c2ecf20Sopenharmony_ciint cfe_close(int handle)
538c2ecf20Sopenharmony_ci{
548c2ecf20Sopenharmony_ci	struct cfe_xiocb xiocb;
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ci	xiocb.xiocb_fcode = CFE_CMD_DEV_CLOSE;
578c2ecf20Sopenharmony_ci	xiocb.xiocb_status = 0;
588c2ecf20Sopenharmony_ci	xiocb.xiocb_handle = handle;
598c2ecf20Sopenharmony_ci	xiocb.xiocb_flags = 0;
608c2ecf20Sopenharmony_ci	xiocb.xiocb_psize = 0;
618c2ecf20Sopenharmony_ci
628c2ecf20Sopenharmony_ci	cfe_iocb_dispatch(&xiocb);
638c2ecf20Sopenharmony_ci
648c2ecf20Sopenharmony_ci	return xiocb.xiocb_status;
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_ci}
678c2ecf20Sopenharmony_ci
688c2ecf20Sopenharmony_ciint cfe_cpu_start(int cpu, void (*fn) (void), long sp, long gp, long a1)
698c2ecf20Sopenharmony_ci{
708c2ecf20Sopenharmony_ci	struct cfe_xiocb xiocb;
718c2ecf20Sopenharmony_ci
728c2ecf20Sopenharmony_ci	xiocb.xiocb_fcode = CFE_CMD_FW_CPUCTL;
738c2ecf20Sopenharmony_ci	xiocb.xiocb_status = 0;
748c2ecf20Sopenharmony_ci	xiocb.xiocb_handle = 0;
758c2ecf20Sopenharmony_ci	xiocb.xiocb_flags = 0;
768c2ecf20Sopenharmony_ci	xiocb.xiocb_psize = sizeof(struct xiocb_cpuctl);
778c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_cpuctl.cpu_number = cpu;
788c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_cpuctl.cpu_command = CFE_CPU_CMD_START;
798c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_cpuctl.gp_val = gp;
808c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_cpuctl.sp_val = sp;
818c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_cpuctl.a1_val = a1;
828c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_cpuctl.start_addr = (long) fn;
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_ci	cfe_iocb_dispatch(&xiocb);
858c2ecf20Sopenharmony_ci
868c2ecf20Sopenharmony_ci	return xiocb.xiocb_status;
878c2ecf20Sopenharmony_ci}
888c2ecf20Sopenharmony_ci
898c2ecf20Sopenharmony_ciint cfe_cpu_stop(int cpu)
908c2ecf20Sopenharmony_ci{
918c2ecf20Sopenharmony_ci	struct cfe_xiocb xiocb;
928c2ecf20Sopenharmony_ci
938c2ecf20Sopenharmony_ci	xiocb.xiocb_fcode = CFE_CMD_FW_CPUCTL;
948c2ecf20Sopenharmony_ci	xiocb.xiocb_status = 0;
958c2ecf20Sopenharmony_ci	xiocb.xiocb_handle = 0;
968c2ecf20Sopenharmony_ci	xiocb.xiocb_flags = 0;
978c2ecf20Sopenharmony_ci	xiocb.xiocb_psize = sizeof(struct xiocb_cpuctl);
988c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_cpuctl.cpu_number = cpu;
998c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_cpuctl.cpu_command = CFE_CPU_CMD_STOP;
1008c2ecf20Sopenharmony_ci
1018c2ecf20Sopenharmony_ci	cfe_iocb_dispatch(&xiocb);
1028c2ecf20Sopenharmony_ci
1038c2ecf20Sopenharmony_ci	return xiocb.xiocb_status;
1048c2ecf20Sopenharmony_ci}
1058c2ecf20Sopenharmony_ci
1068c2ecf20Sopenharmony_ciint cfe_enumenv(int idx, char *name, int namelen, char *val, int vallen)
1078c2ecf20Sopenharmony_ci{
1088c2ecf20Sopenharmony_ci	struct cfe_xiocb xiocb;
1098c2ecf20Sopenharmony_ci
1108c2ecf20Sopenharmony_ci	xiocb.xiocb_fcode = CFE_CMD_ENV_SET;
1118c2ecf20Sopenharmony_ci	xiocb.xiocb_status = 0;
1128c2ecf20Sopenharmony_ci	xiocb.xiocb_handle = 0;
1138c2ecf20Sopenharmony_ci	xiocb.xiocb_flags = 0;
1148c2ecf20Sopenharmony_ci	xiocb.xiocb_psize = sizeof(struct xiocb_envbuf);
1158c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_envbuf.enum_idx = idx;
1168c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_envbuf.name_ptr = XPTR_FROM_NATIVE(name);
1178c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_envbuf.name_length = namelen;
1188c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_envbuf.val_ptr = XPTR_FROM_NATIVE(val);
1198c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_envbuf.val_length = vallen;
1208c2ecf20Sopenharmony_ci
1218c2ecf20Sopenharmony_ci	cfe_iocb_dispatch(&xiocb);
1228c2ecf20Sopenharmony_ci
1238c2ecf20Sopenharmony_ci	return xiocb.xiocb_status;
1248c2ecf20Sopenharmony_ci}
1258c2ecf20Sopenharmony_ci
1268c2ecf20Sopenharmony_ciint
1278c2ecf20Sopenharmony_cicfe_enummem(int idx, int flags, u64 *start, u64 *length, u64 *type)
1288c2ecf20Sopenharmony_ci{
1298c2ecf20Sopenharmony_ci	struct cfe_xiocb xiocb;
1308c2ecf20Sopenharmony_ci
1318c2ecf20Sopenharmony_ci	xiocb.xiocb_fcode = CFE_CMD_FW_MEMENUM;
1328c2ecf20Sopenharmony_ci	xiocb.xiocb_status = 0;
1338c2ecf20Sopenharmony_ci	xiocb.xiocb_handle = 0;
1348c2ecf20Sopenharmony_ci	xiocb.xiocb_flags = flags;
1358c2ecf20Sopenharmony_ci	xiocb.xiocb_psize = sizeof(struct xiocb_meminfo);
1368c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_meminfo.mi_idx = idx;
1378c2ecf20Sopenharmony_ci
1388c2ecf20Sopenharmony_ci	cfe_iocb_dispatch(&xiocb);
1398c2ecf20Sopenharmony_ci
1408c2ecf20Sopenharmony_ci	if (xiocb.xiocb_status < 0)
1418c2ecf20Sopenharmony_ci		return xiocb.xiocb_status;
1428c2ecf20Sopenharmony_ci
1438c2ecf20Sopenharmony_ci	*start = xiocb.plist.xiocb_meminfo.mi_addr;
1448c2ecf20Sopenharmony_ci	*length = xiocb.plist.xiocb_meminfo.mi_size;
1458c2ecf20Sopenharmony_ci	*type = xiocb.plist.xiocb_meminfo.mi_type;
1468c2ecf20Sopenharmony_ci
1478c2ecf20Sopenharmony_ci	return 0;
1488c2ecf20Sopenharmony_ci}
1498c2ecf20Sopenharmony_ci
1508c2ecf20Sopenharmony_ciint cfe_exit(int warm, int status)
1518c2ecf20Sopenharmony_ci{
1528c2ecf20Sopenharmony_ci	struct cfe_xiocb xiocb;
1538c2ecf20Sopenharmony_ci
1548c2ecf20Sopenharmony_ci	xiocb.xiocb_fcode = CFE_CMD_FW_RESTART;
1558c2ecf20Sopenharmony_ci	xiocb.xiocb_status = 0;
1568c2ecf20Sopenharmony_ci	xiocb.xiocb_handle = 0;
1578c2ecf20Sopenharmony_ci	xiocb.xiocb_flags = warm ? CFE_FLG_WARMSTART : 0;
1588c2ecf20Sopenharmony_ci	xiocb.xiocb_psize = sizeof(struct xiocb_exitstat);
1598c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_exitstat.status = status;
1608c2ecf20Sopenharmony_ci
1618c2ecf20Sopenharmony_ci	cfe_iocb_dispatch(&xiocb);
1628c2ecf20Sopenharmony_ci
1638c2ecf20Sopenharmony_ci	return xiocb.xiocb_status;
1648c2ecf20Sopenharmony_ci}
1658c2ecf20Sopenharmony_ci
1668c2ecf20Sopenharmony_ciint cfe_flushcache(int flg)
1678c2ecf20Sopenharmony_ci{
1688c2ecf20Sopenharmony_ci	struct cfe_xiocb xiocb;
1698c2ecf20Sopenharmony_ci
1708c2ecf20Sopenharmony_ci	xiocb.xiocb_fcode = CFE_CMD_FW_FLUSHCACHE;
1718c2ecf20Sopenharmony_ci	xiocb.xiocb_status = 0;
1728c2ecf20Sopenharmony_ci	xiocb.xiocb_handle = 0;
1738c2ecf20Sopenharmony_ci	xiocb.xiocb_flags = flg;
1748c2ecf20Sopenharmony_ci	xiocb.xiocb_psize = 0;
1758c2ecf20Sopenharmony_ci
1768c2ecf20Sopenharmony_ci	cfe_iocb_dispatch(&xiocb);
1778c2ecf20Sopenharmony_ci
1788c2ecf20Sopenharmony_ci	return xiocb.xiocb_status;
1798c2ecf20Sopenharmony_ci}
1808c2ecf20Sopenharmony_ci
1818c2ecf20Sopenharmony_ciint cfe_getdevinfo(char *name)
1828c2ecf20Sopenharmony_ci{
1838c2ecf20Sopenharmony_ci	struct cfe_xiocb xiocb;
1848c2ecf20Sopenharmony_ci
1858c2ecf20Sopenharmony_ci	xiocb.xiocb_fcode = CFE_CMD_DEV_GETINFO;
1868c2ecf20Sopenharmony_ci	xiocb.xiocb_status = 0;
1878c2ecf20Sopenharmony_ci	xiocb.xiocb_handle = 0;
1888c2ecf20Sopenharmony_ci	xiocb.xiocb_flags = 0;
1898c2ecf20Sopenharmony_ci	xiocb.xiocb_psize = sizeof(struct xiocb_buffer);
1908c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_buffer.buf_offset = 0;
1918c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(name);
1928c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_buffer.buf_length = strlen(name);
1938c2ecf20Sopenharmony_ci
1948c2ecf20Sopenharmony_ci	cfe_iocb_dispatch(&xiocb);
1958c2ecf20Sopenharmony_ci
1968c2ecf20Sopenharmony_ci	if (xiocb.xiocb_status < 0)
1978c2ecf20Sopenharmony_ci		return xiocb.xiocb_status;
1988c2ecf20Sopenharmony_ci	return xiocb.plist.xiocb_buffer.buf_ioctlcmd;
1998c2ecf20Sopenharmony_ci}
2008c2ecf20Sopenharmony_ci
2018c2ecf20Sopenharmony_ciint cfe_getenv(char *name, char *dest, int destlen)
2028c2ecf20Sopenharmony_ci{
2038c2ecf20Sopenharmony_ci	struct cfe_xiocb xiocb;
2048c2ecf20Sopenharmony_ci
2058c2ecf20Sopenharmony_ci	*dest = 0;
2068c2ecf20Sopenharmony_ci
2078c2ecf20Sopenharmony_ci	xiocb.xiocb_fcode = CFE_CMD_ENV_GET;
2088c2ecf20Sopenharmony_ci	xiocb.xiocb_status = 0;
2098c2ecf20Sopenharmony_ci	xiocb.xiocb_handle = 0;
2108c2ecf20Sopenharmony_ci	xiocb.xiocb_flags = 0;
2118c2ecf20Sopenharmony_ci	xiocb.xiocb_psize = sizeof(struct xiocb_envbuf);
2128c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_envbuf.enum_idx = 0;
2138c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_envbuf.name_ptr = XPTR_FROM_NATIVE(name);
2148c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_envbuf.name_length = strlen(name);
2158c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_envbuf.val_ptr = XPTR_FROM_NATIVE(dest);
2168c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_envbuf.val_length = destlen;
2178c2ecf20Sopenharmony_ci
2188c2ecf20Sopenharmony_ci	cfe_iocb_dispatch(&xiocb);
2198c2ecf20Sopenharmony_ci
2208c2ecf20Sopenharmony_ci	return xiocb.xiocb_status;
2218c2ecf20Sopenharmony_ci}
2228c2ecf20Sopenharmony_ci
2238c2ecf20Sopenharmony_ciint cfe_getfwinfo(cfe_fwinfo_t * info)
2248c2ecf20Sopenharmony_ci{
2258c2ecf20Sopenharmony_ci	struct cfe_xiocb xiocb;
2268c2ecf20Sopenharmony_ci
2278c2ecf20Sopenharmony_ci	xiocb.xiocb_fcode = CFE_CMD_FW_GETINFO;
2288c2ecf20Sopenharmony_ci	xiocb.xiocb_status = 0;
2298c2ecf20Sopenharmony_ci	xiocb.xiocb_handle = 0;
2308c2ecf20Sopenharmony_ci	xiocb.xiocb_flags = 0;
2318c2ecf20Sopenharmony_ci	xiocb.xiocb_psize = sizeof(struct xiocb_fwinfo);
2328c2ecf20Sopenharmony_ci
2338c2ecf20Sopenharmony_ci	cfe_iocb_dispatch(&xiocb);
2348c2ecf20Sopenharmony_ci
2358c2ecf20Sopenharmony_ci	if (xiocb.xiocb_status < 0)
2368c2ecf20Sopenharmony_ci		return xiocb.xiocb_status;
2378c2ecf20Sopenharmony_ci
2388c2ecf20Sopenharmony_ci	info->fwi_version = xiocb.plist.xiocb_fwinfo.fwi_version;
2398c2ecf20Sopenharmony_ci	info->fwi_totalmem = xiocb.plist.xiocb_fwinfo.fwi_totalmem;
2408c2ecf20Sopenharmony_ci	info->fwi_flags = xiocb.plist.xiocb_fwinfo.fwi_flags;
2418c2ecf20Sopenharmony_ci	info->fwi_boardid = xiocb.plist.xiocb_fwinfo.fwi_boardid;
2428c2ecf20Sopenharmony_ci	info->fwi_bootarea_va = xiocb.plist.xiocb_fwinfo.fwi_bootarea_va;
2438c2ecf20Sopenharmony_ci	info->fwi_bootarea_pa = xiocb.plist.xiocb_fwinfo.fwi_bootarea_pa;
2448c2ecf20Sopenharmony_ci	info->fwi_bootarea_size =
2458c2ecf20Sopenharmony_ci	    xiocb.plist.xiocb_fwinfo.fwi_bootarea_size;
2468c2ecf20Sopenharmony_ci
2478c2ecf20Sopenharmony_ci	return 0;
2488c2ecf20Sopenharmony_ci}
2498c2ecf20Sopenharmony_ci
2508c2ecf20Sopenharmony_ciint cfe_getstdhandle(int flg)
2518c2ecf20Sopenharmony_ci{
2528c2ecf20Sopenharmony_ci	struct cfe_xiocb xiocb;
2538c2ecf20Sopenharmony_ci
2548c2ecf20Sopenharmony_ci	xiocb.xiocb_fcode = CFE_CMD_DEV_GETHANDLE;
2558c2ecf20Sopenharmony_ci	xiocb.xiocb_status = 0;
2568c2ecf20Sopenharmony_ci	xiocb.xiocb_handle = 0;
2578c2ecf20Sopenharmony_ci	xiocb.xiocb_flags = flg;
2588c2ecf20Sopenharmony_ci	xiocb.xiocb_psize = 0;
2598c2ecf20Sopenharmony_ci
2608c2ecf20Sopenharmony_ci	cfe_iocb_dispatch(&xiocb);
2618c2ecf20Sopenharmony_ci
2628c2ecf20Sopenharmony_ci	if (xiocb.xiocb_status < 0)
2638c2ecf20Sopenharmony_ci		return xiocb.xiocb_status;
2648c2ecf20Sopenharmony_ci	return xiocb.xiocb_handle;
2658c2ecf20Sopenharmony_ci}
2668c2ecf20Sopenharmony_ci
2678c2ecf20Sopenharmony_ciint64_t
2688c2ecf20Sopenharmony_cicfe_getticks(void)
2698c2ecf20Sopenharmony_ci{
2708c2ecf20Sopenharmony_ci	struct cfe_xiocb xiocb;
2718c2ecf20Sopenharmony_ci
2728c2ecf20Sopenharmony_ci	xiocb.xiocb_fcode = CFE_CMD_FW_GETTIME;
2738c2ecf20Sopenharmony_ci	xiocb.xiocb_status = 0;
2748c2ecf20Sopenharmony_ci	xiocb.xiocb_handle = 0;
2758c2ecf20Sopenharmony_ci	xiocb.xiocb_flags = 0;
2768c2ecf20Sopenharmony_ci	xiocb.xiocb_psize = sizeof(struct xiocb_time);
2778c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_time.ticks = 0;
2788c2ecf20Sopenharmony_ci
2798c2ecf20Sopenharmony_ci	cfe_iocb_dispatch(&xiocb);
2808c2ecf20Sopenharmony_ci
2818c2ecf20Sopenharmony_ci	return xiocb.plist.xiocb_time.ticks;
2828c2ecf20Sopenharmony_ci
2838c2ecf20Sopenharmony_ci}
2848c2ecf20Sopenharmony_ci
2858c2ecf20Sopenharmony_ciint cfe_inpstat(int handle)
2868c2ecf20Sopenharmony_ci{
2878c2ecf20Sopenharmony_ci	struct cfe_xiocb xiocb;
2888c2ecf20Sopenharmony_ci
2898c2ecf20Sopenharmony_ci	xiocb.xiocb_fcode = CFE_CMD_DEV_INPSTAT;
2908c2ecf20Sopenharmony_ci	xiocb.xiocb_status = 0;
2918c2ecf20Sopenharmony_ci	xiocb.xiocb_handle = handle;
2928c2ecf20Sopenharmony_ci	xiocb.xiocb_flags = 0;
2938c2ecf20Sopenharmony_ci	xiocb.xiocb_psize = sizeof(struct xiocb_inpstat);
2948c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_inpstat.inp_status = 0;
2958c2ecf20Sopenharmony_ci
2968c2ecf20Sopenharmony_ci	cfe_iocb_dispatch(&xiocb);
2978c2ecf20Sopenharmony_ci
2988c2ecf20Sopenharmony_ci	if (xiocb.xiocb_status < 0)
2998c2ecf20Sopenharmony_ci		return xiocb.xiocb_status;
3008c2ecf20Sopenharmony_ci	return xiocb.plist.xiocb_inpstat.inp_status;
3018c2ecf20Sopenharmony_ci}
3028c2ecf20Sopenharmony_ci
3038c2ecf20Sopenharmony_ciint
3048c2ecf20Sopenharmony_cicfe_ioctl(int handle, unsigned int ioctlnum, unsigned char *buffer,
3058c2ecf20Sopenharmony_ci	  int length, int *retlen, u64 offset)
3068c2ecf20Sopenharmony_ci{
3078c2ecf20Sopenharmony_ci	struct cfe_xiocb xiocb;
3088c2ecf20Sopenharmony_ci
3098c2ecf20Sopenharmony_ci	xiocb.xiocb_fcode = CFE_CMD_DEV_IOCTL;
3108c2ecf20Sopenharmony_ci	xiocb.xiocb_status = 0;
3118c2ecf20Sopenharmony_ci	xiocb.xiocb_handle = handle;
3128c2ecf20Sopenharmony_ci	xiocb.xiocb_flags = 0;
3138c2ecf20Sopenharmony_ci	xiocb.xiocb_psize = sizeof(struct xiocb_buffer);
3148c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_buffer.buf_offset = offset;
3158c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_buffer.buf_ioctlcmd = ioctlnum;
3168c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(buffer);
3178c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_buffer.buf_length = length;
3188c2ecf20Sopenharmony_ci
3198c2ecf20Sopenharmony_ci	cfe_iocb_dispatch(&xiocb);
3208c2ecf20Sopenharmony_ci
3218c2ecf20Sopenharmony_ci	if (retlen)
3228c2ecf20Sopenharmony_ci		*retlen = xiocb.plist.xiocb_buffer.buf_retlen;
3238c2ecf20Sopenharmony_ci	return xiocb.xiocb_status;
3248c2ecf20Sopenharmony_ci}
3258c2ecf20Sopenharmony_ci
3268c2ecf20Sopenharmony_ciint cfe_open(char *name)
3278c2ecf20Sopenharmony_ci{
3288c2ecf20Sopenharmony_ci	struct cfe_xiocb xiocb;
3298c2ecf20Sopenharmony_ci
3308c2ecf20Sopenharmony_ci	xiocb.xiocb_fcode = CFE_CMD_DEV_OPEN;
3318c2ecf20Sopenharmony_ci	xiocb.xiocb_status = 0;
3328c2ecf20Sopenharmony_ci	xiocb.xiocb_handle = 0;
3338c2ecf20Sopenharmony_ci	xiocb.xiocb_flags = 0;
3348c2ecf20Sopenharmony_ci	xiocb.xiocb_psize = sizeof(struct xiocb_buffer);
3358c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_buffer.buf_offset = 0;
3368c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(name);
3378c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_buffer.buf_length = strlen(name);
3388c2ecf20Sopenharmony_ci
3398c2ecf20Sopenharmony_ci	cfe_iocb_dispatch(&xiocb);
3408c2ecf20Sopenharmony_ci
3418c2ecf20Sopenharmony_ci	if (xiocb.xiocb_status < 0)
3428c2ecf20Sopenharmony_ci		return xiocb.xiocb_status;
3438c2ecf20Sopenharmony_ci	return xiocb.xiocb_handle;
3448c2ecf20Sopenharmony_ci}
3458c2ecf20Sopenharmony_ci
3468c2ecf20Sopenharmony_ciint cfe_read(int handle, unsigned char *buffer, int length)
3478c2ecf20Sopenharmony_ci{
3488c2ecf20Sopenharmony_ci	return cfe_readblk(handle, 0, buffer, length);
3498c2ecf20Sopenharmony_ci}
3508c2ecf20Sopenharmony_ci
3518c2ecf20Sopenharmony_ciint cfe_readblk(int handle, s64 offset, unsigned char *buffer, int length)
3528c2ecf20Sopenharmony_ci{
3538c2ecf20Sopenharmony_ci	struct cfe_xiocb xiocb;
3548c2ecf20Sopenharmony_ci
3558c2ecf20Sopenharmony_ci	xiocb.xiocb_fcode = CFE_CMD_DEV_READ;
3568c2ecf20Sopenharmony_ci	xiocb.xiocb_status = 0;
3578c2ecf20Sopenharmony_ci	xiocb.xiocb_handle = handle;
3588c2ecf20Sopenharmony_ci	xiocb.xiocb_flags = 0;
3598c2ecf20Sopenharmony_ci	xiocb.xiocb_psize = sizeof(struct xiocb_buffer);
3608c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_buffer.buf_offset = offset;
3618c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(buffer);
3628c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_buffer.buf_length = length;
3638c2ecf20Sopenharmony_ci
3648c2ecf20Sopenharmony_ci	cfe_iocb_dispatch(&xiocb);
3658c2ecf20Sopenharmony_ci
3668c2ecf20Sopenharmony_ci	if (xiocb.xiocb_status < 0)
3678c2ecf20Sopenharmony_ci		return xiocb.xiocb_status;
3688c2ecf20Sopenharmony_ci	return xiocb.plist.xiocb_buffer.buf_retlen;
3698c2ecf20Sopenharmony_ci}
3708c2ecf20Sopenharmony_ci
3718c2ecf20Sopenharmony_ciint cfe_setenv(char *name, char *val)
3728c2ecf20Sopenharmony_ci{
3738c2ecf20Sopenharmony_ci	struct cfe_xiocb xiocb;
3748c2ecf20Sopenharmony_ci
3758c2ecf20Sopenharmony_ci	xiocb.xiocb_fcode = CFE_CMD_ENV_SET;
3768c2ecf20Sopenharmony_ci	xiocb.xiocb_status = 0;
3778c2ecf20Sopenharmony_ci	xiocb.xiocb_handle = 0;
3788c2ecf20Sopenharmony_ci	xiocb.xiocb_flags = 0;
3798c2ecf20Sopenharmony_ci	xiocb.xiocb_psize = sizeof(struct xiocb_envbuf);
3808c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_envbuf.enum_idx = 0;
3818c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_envbuf.name_ptr = XPTR_FROM_NATIVE(name);
3828c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_envbuf.name_length = strlen(name);
3838c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_envbuf.val_ptr = XPTR_FROM_NATIVE(val);
3848c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_envbuf.val_length = strlen(val);
3858c2ecf20Sopenharmony_ci
3868c2ecf20Sopenharmony_ci	cfe_iocb_dispatch(&xiocb);
3878c2ecf20Sopenharmony_ci
3888c2ecf20Sopenharmony_ci	return xiocb.xiocb_status;
3898c2ecf20Sopenharmony_ci}
3908c2ecf20Sopenharmony_ci
3918c2ecf20Sopenharmony_ciint cfe_write(int handle, const char *buffer, int length)
3928c2ecf20Sopenharmony_ci{
3938c2ecf20Sopenharmony_ci	return cfe_writeblk(handle, 0, buffer, length);
3948c2ecf20Sopenharmony_ci}
3958c2ecf20Sopenharmony_ci
3968c2ecf20Sopenharmony_ciint cfe_writeblk(int handle, s64 offset, const char *buffer, int length)
3978c2ecf20Sopenharmony_ci{
3988c2ecf20Sopenharmony_ci	struct cfe_xiocb xiocb;
3998c2ecf20Sopenharmony_ci
4008c2ecf20Sopenharmony_ci	xiocb.xiocb_fcode = CFE_CMD_DEV_WRITE;
4018c2ecf20Sopenharmony_ci	xiocb.xiocb_status = 0;
4028c2ecf20Sopenharmony_ci	xiocb.xiocb_handle = handle;
4038c2ecf20Sopenharmony_ci	xiocb.xiocb_flags = 0;
4048c2ecf20Sopenharmony_ci	xiocb.xiocb_psize = sizeof(struct xiocb_buffer);
4058c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_buffer.buf_offset = offset;
4068c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(buffer);
4078c2ecf20Sopenharmony_ci	xiocb.plist.xiocb_buffer.buf_length = length;
4088c2ecf20Sopenharmony_ci
4098c2ecf20Sopenharmony_ci	cfe_iocb_dispatch(&xiocb);
4108c2ecf20Sopenharmony_ci
4118c2ecf20Sopenharmony_ci	if (xiocb.xiocb_status < 0)
4128c2ecf20Sopenharmony_ci		return xiocb.xiocb_status;
4138c2ecf20Sopenharmony_ci	return xiocb.plist.xiocb_buffer.buf_retlen;
4148c2ecf20Sopenharmony_ci}
415