cfe_api.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502
  1. /*
  2. * Copyright (C) 2000, 2001, 2002 Broadcom Corporation
  3. *
  4. * This program is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU General Public License
  6. * as published by the Free Software Foundation; either version 2
  7. * of the License, or (at your option) any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program; if not, write to the Free Software
  16. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  17. */
  18. /* *********************************************************************
  19. *
  20. * Broadcom Common Firmware Environment (CFE)
  21. *
  22. * Device Function stubs File: cfe_api.c
  23. *
  24. * This module contains device function stubs (small routines to
  25. * call the standard "iocb" interface entry point to CFE).
  26. * There should be one routine here per iocb function call.
  27. *
  28. * Authors: Mitch Lichtenberg, Chris Demetriou
  29. *
  30. ********************************************************************* */
  31. #include "cfe_api.h"
  32. #include "cfe_api_int.h"
  33. /* Cast from a native pointer to a cfe_xptr_t and back. */
  34. #define XPTR_FROM_NATIVE(n) ((cfe_xptr_t) (intptr_t) (n))
  35. #define NATIVE_FROM_XPTR(x) ((void *) (intptr_t) (x))
  36. #ifdef CFE_API_IMPL_NAMESPACE
  37. #define cfe_iocb_dispatch(a) __cfe_iocb_dispatch(a)
  38. #endif
  39. int cfe_iocb_dispatch(cfe_xiocb_t * xiocb);
  40. #if defined(CFE_API_common) || defined(CFE_API_ALL)
  41. /*
  42. * Declare the dispatch function with args of "intptr_t".
  43. * This makes sure whatever model we're compiling in
  44. * puts the pointers in a single register. For example,
  45. * combining -mlong64 and -mips1 or -mips2 would lead to
  46. * trouble, since the handle and IOCB pointer will be
  47. * passed in two registers each, and CFE expects one.
  48. */
  49. static int (*cfe_dispfunc) (intptr_t handle, intptr_t xiocb) = 0;
  50. static cfe_xuint_t cfe_handle = 0;
  51. int cfe_init(cfe_xuint_t handle, cfe_xuint_t ept)
  52. {
  53. cfe_dispfunc = NATIVE_FROM_XPTR(ept);
  54. cfe_handle = handle;
  55. return 0;
  56. }
  57. int cfe_iocb_dispatch(cfe_xiocb_t * xiocb)
  58. {
  59. if (!cfe_dispfunc)
  60. return -1;
  61. return (*cfe_dispfunc) ((intptr_t) cfe_handle, (intptr_t) xiocb);
  62. }
  63. #endif /* CFE_API_common || CFE_API_ALL */
  64. #if defined(CFE_API_close) || defined(CFE_API_ALL)
  65. int cfe_close(int handle)
  66. {
  67. cfe_xiocb_t xiocb;
  68. xiocb.xiocb_fcode = CFE_CMD_DEV_CLOSE;
  69. xiocb.xiocb_status = 0;
  70. xiocb.xiocb_handle = handle;
  71. xiocb.xiocb_flags = 0;
  72. xiocb.xiocb_psize = 0;
  73. cfe_iocb_dispatch(&xiocb);
  74. return xiocb.xiocb_status;
  75. }
  76. #endif /* CFE_API_close || CFE_API_ALL */
  77. #if defined(CFE_API_cpu_start) || defined(CFE_API_ALL)
  78. int cfe_cpu_start(int cpu, void (*fn) (void), long sp, long gp, long a1)
  79. {
  80. cfe_xiocb_t xiocb;
  81. xiocb.xiocb_fcode = CFE_CMD_FW_CPUCTL;
  82. xiocb.xiocb_status = 0;
  83. xiocb.xiocb_handle = 0;
  84. xiocb.xiocb_flags = 0;
  85. xiocb.xiocb_psize = sizeof(xiocb_cpuctl_t);
  86. xiocb.plist.xiocb_cpuctl.cpu_number = cpu;
  87. xiocb.plist.xiocb_cpuctl.cpu_command = CFE_CPU_CMD_START;
  88. xiocb.plist.xiocb_cpuctl.gp_val = gp;
  89. xiocb.plist.xiocb_cpuctl.sp_val = sp;
  90. xiocb.plist.xiocb_cpuctl.a1_val = a1;
  91. xiocb.plist.xiocb_cpuctl.start_addr = (long) fn;
  92. cfe_iocb_dispatch(&xiocb);
  93. return xiocb.xiocb_status;
  94. }
  95. #endif /* CFE_API_cpu_start || CFE_API_ALL */
  96. #if defined(CFE_API_cpu_stop) || defined(CFE_API_ALL)
  97. int cfe_cpu_stop(int cpu)
  98. {
  99. cfe_xiocb_t xiocb;
  100. xiocb.xiocb_fcode = CFE_CMD_FW_CPUCTL;
  101. xiocb.xiocb_status = 0;
  102. xiocb.xiocb_handle = 0;
  103. xiocb.xiocb_flags = 0;
  104. xiocb.xiocb_psize = sizeof(xiocb_cpuctl_t);
  105. xiocb.plist.xiocb_cpuctl.cpu_number = cpu;
  106. xiocb.plist.xiocb_cpuctl.cpu_command = CFE_CPU_CMD_STOP;
  107. cfe_iocb_dispatch(&xiocb);
  108. return xiocb.xiocb_status;
  109. }
  110. #endif /* CFE_API_cpu_stop || CFE_API_ALL */
  111. #if defined(CFE_API_enumenv) || defined(CFE_API_ALL)
  112. int cfe_enumenv(int idx, char *name, int namelen, char *val, int vallen)
  113. {
  114. cfe_xiocb_t xiocb;
  115. xiocb.xiocb_fcode = CFE_CMD_ENV_SET;
  116. xiocb.xiocb_status = 0;
  117. xiocb.xiocb_handle = 0;
  118. xiocb.xiocb_flags = 0;
  119. xiocb.xiocb_psize = sizeof(xiocb_envbuf_t);
  120. xiocb.plist.xiocb_envbuf.enum_idx = idx;
  121. xiocb.plist.xiocb_envbuf.name_ptr = XPTR_FROM_NATIVE(name);
  122. xiocb.plist.xiocb_envbuf.name_length = namelen;
  123. xiocb.plist.xiocb_envbuf.val_ptr = XPTR_FROM_NATIVE(val);
  124. xiocb.plist.xiocb_envbuf.val_length = vallen;
  125. cfe_iocb_dispatch(&xiocb);
  126. return xiocb.xiocb_status;
  127. }
  128. #endif /* CFE_API_enumenv || CFE_API_ALL */
  129. #if defined(CFE_API_enummem) || defined(CFE_API_ALL)
  130. int
  131. cfe_enummem(int idx, int flags, cfe_xuint_t * start, cfe_xuint_t * length,
  132. cfe_xuint_t * type)
  133. {
  134. cfe_xiocb_t xiocb;
  135. xiocb.xiocb_fcode = CFE_CMD_FW_MEMENUM;
  136. xiocb.xiocb_status = 0;
  137. xiocb.xiocb_handle = 0;
  138. xiocb.xiocb_flags = flags;
  139. xiocb.xiocb_psize = sizeof(xiocb_meminfo_t);
  140. xiocb.plist.xiocb_meminfo.mi_idx = idx;
  141. cfe_iocb_dispatch(&xiocb);
  142. if (xiocb.xiocb_status < 0)
  143. return xiocb.xiocb_status;
  144. *start = xiocb.plist.xiocb_meminfo.mi_addr;
  145. *length = xiocb.plist.xiocb_meminfo.mi_size;
  146. *type = xiocb.plist.xiocb_meminfo.mi_type;
  147. return 0;
  148. }
  149. #endif /* CFE_API_enummem || CFE_API_ALL */
  150. #if defined(CFE_API_exit) || defined(CFE_API_ALL)
  151. int cfe_exit(int warm, int status)
  152. {
  153. cfe_xiocb_t xiocb;
  154. xiocb.xiocb_fcode = CFE_CMD_FW_RESTART;
  155. xiocb.xiocb_status = 0;
  156. xiocb.xiocb_handle = 0;
  157. xiocb.xiocb_flags = warm ? CFE_FLG_WARMSTART : 0;
  158. xiocb.xiocb_psize = sizeof(xiocb_exitstat_t);
  159. xiocb.plist.xiocb_exitstat.status = status;
  160. cfe_iocb_dispatch(&xiocb);
  161. return xiocb.xiocb_status;
  162. }
  163. #endif /* CFE_API_exit || CFE_API_ALL */
  164. #if defined(CFE_API_flushcache) || defined(CFE_API_ALL)
  165. int cfe_flushcache(int flg)
  166. {
  167. cfe_xiocb_t xiocb;
  168. xiocb.xiocb_fcode = CFE_CMD_FW_FLUSHCACHE;
  169. xiocb.xiocb_status = 0;
  170. xiocb.xiocb_handle = 0;
  171. xiocb.xiocb_flags = flg;
  172. xiocb.xiocb_psize = 0;
  173. cfe_iocb_dispatch(&xiocb);
  174. return xiocb.xiocb_status;
  175. }
  176. #endif /* CFE_API_flushcache || CFE_API_ALL */
  177. #if defined(CFE_API_getdevinfo) || defined(CFE_API_ALL)
  178. int cfe_getdevinfo(char *name)
  179. {
  180. cfe_xiocb_t xiocb;
  181. xiocb.xiocb_fcode = CFE_CMD_DEV_GETINFO;
  182. xiocb.xiocb_status = 0;
  183. xiocb.xiocb_handle = 0;
  184. xiocb.xiocb_flags = 0;
  185. xiocb.xiocb_psize = sizeof(xiocb_buffer_t);
  186. xiocb.plist.xiocb_buffer.buf_offset = 0;
  187. xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(name);
  188. xiocb.plist.xiocb_buffer.buf_length = cfe_strlen(name);
  189. cfe_iocb_dispatch(&xiocb);
  190. if (xiocb.xiocb_status < 0)
  191. return xiocb.xiocb_status;
  192. return xiocb.plist.xiocb_buffer.buf_devflags;
  193. }
  194. #endif /* CFE_API_getdevinfo || CFE_API_ALL */
  195. #if defined(CFE_API_getenv) || defined(CFE_API_ALL)
  196. int cfe_getenv(char *name, char *dest, int destlen)
  197. {
  198. cfe_xiocb_t xiocb;
  199. *dest = 0;
  200. xiocb.xiocb_fcode = CFE_CMD_ENV_GET;
  201. xiocb.xiocb_status = 0;
  202. xiocb.xiocb_handle = 0;
  203. xiocb.xiocb_flags = 0;
  204. xiocb.xiocb_psize = sizeof(xiocb_envbuf_t);
  205. xiocb.plist.xiocb_envbuf.enum_idx = 0;
  206. xiocb.plist.xiocb_envbuf.name_ptr = XPTR_FROM_NATIVE(name);
  207. xiocb.plist.xiocb_envbuf.name_length = cfe_strlen(name);
  208. xiocb.plist.xiocb_envbuf.val_ptr = XPTR_FROM_NATIVE(dest);
  209. xiocb.plist.xiocb_envbuf.val_length = destlen;
  210. cfe_iocb_dispatch(&xiocb);
  211. return xiocb.xiocb_status;
  212. }
  213. #endif /* CFE_API_getenv || CFE_API_ALL */
  214. #if defined(CFE_API_getfwinfo) || defined(CFE_API_ALL)
  215. int cfe_getfwinfo(cfe_fwinfo_t * info)
  216. {
  217. cfe_xiocb_t xiocb;
  218. xiocb.xiocb_fcode = CFE_CMD_FW_GETINFO;
  219. xiocb.xiocb_status = 0;
  220. xiocb.xiocb_handle = 0;
  221. xiocb.xiocb_flags = 0;
  222. xiocb.xiocb_psize = sizeof(xiocb_fwinfo_t);
  223. cfe_iocb_dispatch(&xiocb);
  224. if (xiocb.xiocb_status < 0)
  225. return xiocb.xiocb_status;
  226. info->fwi_version = xiocb.plist.xiocb_fwinfo.fwi_version;
  227. info->fwi_totalmem = xiocb.plist.xiocb_fwinfo.fwi_totalmem;
  228. info->fwi_flags = xiocb.plist.xiocb_fwinfo.fwi_flags;
  229. info->fwi_boardid = xiocb.plist.xiocb_fwinfo.fwi_boardid;
  230. info->fwi_bootarea_va = xiocb.plist.xiocb_fwinfo.fwi_bootarea_va;
  231. info->fwi_bootarea_pa = xiocb.plist.xiocb_fwinfo.fwi_bootarea_pa;
  232. info->fwi_bootarea_size =
  233. xiocb.plist.xiocb_fwinfo.fwi_bootarea_size;
  234. #if 0
  235. info->fwi_reserved1 = xiocb.plist.xiocb_fwinfo.fwi_reserved1;
  236. info->fwi_reserved2 = xiocb.plist.xiocb_fwinfo.fwi_reserved2;
  237. info->fwi_reserved3 = xiocb.plist.xiocb_fwinfo.fwi_reserved3;
  238. #endif
  239. return 0;
  240. }
  241. #endif /* CFE_API_getfwinfo || CFE_API_ALL */
  242. #if defined(CFE_API_getstdhandle) || defined(CFE_API_ALL)
  243. int cfe_getstdhandle(int flg)
  244. {
  245. cfe_xiocb_t xiocb;
  246. xiocb.xiocb_fcode = CFE_CMD_DEV_GETHANDLE;
  247. xiocb.xiocb_status = 0;
  248. xiocb.xiocb_handle = 0;
  249. xiocb.xiocb_flags = flg;
  250. xiocb.xiocb_psize = 0;
  251. cfe_iocb_dispatch(&xiocb);
  252. if (xiocb.xiocb_status < 0)
  253. return xiocb.xiocb_status;
  254. return xiocb.xiocb_handle;
  255. }
  256. #endif /* CFE_API_getstdhandle || CFE_API_ALL */
  257. #if defined(CFE_API_getticks) || defined(CFE_API_ALL)
  258. int64_t
  259. #ifdef CFE_API_IMPL_NAMESPACE
  260. __cfe_getticks(void)
  261. #else
  262. cfe_getticks(void)
  263. #endif
  264. {
  265. cfe_xiocb_t xiocb;
  266. xiocb.xiocb_fcode = CFE_CMD_FW_GETTIME;
  267. xiocb.xiocb_status = 0;
  268. xiocb.xiocb_handle = 0;
  269. xiocb.xiocb_flags = 0;
  270. xiocb.xiocb_psize = sizeof(xiocb_time_t);
  271. xiocb.plist.xiocb_time.ticks = 0;
  272. cfe_iocb_dispatch(&xiocb);
  273. return xiocb.plist.xiocb_time.ticks;
  274. }
  275. #endif /* CFE_API_getticks || CFE_API_ALL */
  276. #if defined(CFE_API_inpstat) || defined(CFE_API_ALL)
  277. int cfe_inpstat(int handle)
  278. {
  279. cfe_xiocb_t xiocb;
  280. xiocb.xiocb_fcode = CFE_CMD_DEV_INPSTAT;
  281. xiocb.xiocb_status = 0;
  282. xiocb.xiocb_handle = handle;
  283. xiocb.xiocb_flags = 0;
  284. xiocb.xiocb_psize = sizeof(xiocb_inpstat_t);
  285. xiocb.plist.xiocb_inpstat.inp_status = 0;
  286. cfe_iocb_dispatch(&xiocb);
  287. if (xiocb.xiocb_status < 0)
  288. return xiocb.xiocb_status;
  289. return xiocb.plist.xiocb_inpstat.inp_status;
  290. }
  291. #endif /* CFE_API_inpstat || CFE_API_ALL */
  292. #if defined(CFE_API_ioctl) || defined(CFE_API_ALL)
  293. int
  294. cfe_ioctl(int handle, unsigned int ioctlnum, unsigned char *buffer,
  295. int length, int *retlen, cfe_xuint_t offset)
  296. {
  297. cfe_xiocb_t xiocb;
  298. xiocb.xiocb_fcode = CFE_CMD_DEV_IOCTL;
  299. xiocb.xiocb_status = 0;
  300. xiocb.xiocb_handle = handle;
  301. xiocb.xiocb_flags = 0;
  302. xiocb.xiocb_psize = sizeof(xiocb_buffer_t);
  303. xiocb.plist.xiocb_buffer.buf_offset = offset;
  304. xiocb.plist.xiocb_buffer.buf_ioctlcmd = ioctlnum;
  305. xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(buffer);
  306. xiocb.plist.xiocb_buffer.buf_length = length;
  307. cfe_iocb_dispatch(&xiocb);
  308. if (retlen)
  309. *retlen = xiocb.plist.xiocb_buffer.buf_retlen;
  310. return xiocb.xiocb_status;
  311. }
  312. #endif /* CFE_API_ioctl || CFE_API_ALL */
  313. #if defined(CFE_API_open) || defined(CFE_API_ALL)
  314. int cfe_open(char *name)
  315. {
  316. cfe_xiocb_t xiocb;
  317. xiocb.xiocb_fcode = CFE_CMD_DEV_OPEN;
  318. xiocb.xiocb_status = 0;
  319. xiocb.xiocb_handle = 0;
  320. xiocb.xiocb_flags = 0;
  321. xiocb.xiocb_psize = sizeof(xiocb_buffer_t);
  322. xiocb.plist.xiocb_buffer.buf_offset = 0;
  323. xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(name);
  324. xiocb.plist.xiocb_buffer.buf_length = cfe_strlen(name);
  325. cfe_iocb_dispatch(&xiocb);
  326. if (xiocb.xiocb_status < 0)
  327. return xiocb.xiocb_status;
  328. return xiocb.xiocb_handle;
  329. }
  330. #endif /* CFE_API_open || CFE_API_ALL */
  331. #if defined(CFE_API_read) || defined(CFE_API_ALL)
  332. int cfe_read(int handle, unsigned char *buffer, int length)
  333. {
  334. return cfe_readblk(handle, 0, buffer, length);
  335. }
  336. #endif /* CFE_API_read || CFE_API_ALL */
  337. #if defined(CFE_API_readblk) || defined(CFE_API_ALL)
  338. int
  339. cfe_readblk(int handle, cfe_xint_t offset, unsigned char *buffer,
  340. int length)
  341. {
  342. cfe_xiocb_t xiocb;
  343. xiocb.xiocb_fcode = CFE_CMD_DEV_READ;
  344. xiocb.xiocb_status = 0;
  345. xiocb.xiocb_handle = handle;
  346. xiocb.xiocb_flags = 0;
  347. xiocb.xiocb_psize = sizeof(xiocb_buffer_t);
  348. xiocb.plist.xiocb_buffer.buf_offset = offset;
  349. xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(buffer);
  350. xiocb.plist.xiocb_buffer.buf_length = length;
  351. cfe_iocb_dispatch(&xiocb);
  352. if (xiocb.xiocb_status < 0)
  353. return xiocb.xiocb_status;
  354. return xiocb.plist.xiocb_buffer.buf_retlen;
  355. }
  356. #endif /* CFE_API_readblk || CFE_API_ALL */
  357. #if defined(CFE_API_setenv) || defined(CFE_API_ALL)
  358. int cfe_setenv(char *name, char *val)
  359. {
  360. cfe_xiocb_t xiocb;
  361. xiocb.xiocb_fcode = CFE_CMD_ENV_SET;
  362. xiocb.xiocb_status = 0;
  363. xiocb.xiocb_handle = 0;
  364. xiocb.xiocb_flags = 0;
  365. xiocb.xiocb_psize = sizeof(xiocb_envbuf_t);
  366. xiocb.plist.xiocb_envbuf.enum_idx = 0;
  367. xiocb.plist.xiocb_envbuf.name_ptr = XPTR_FROM_NATIVE(name);
  368. xiocb.plist.xiocb_envbuf.name_length = cfe_strlen(name);
  369. xiocb.plist.xiocb_envbuf.val_ptr = XPTR_FROM_NATIVE(val);
  370. xiocb.plist.xiocb_envbuf.val_length = cfe_strlen(val);
  371. cfe_iocb_dispatch(&xiocb);
  372. return xiocb.xiocb_status;
  373. }
  374. #endif /* CFE_API_setenv || CFE_API_ALL */
  375. #if (defined(CFE_API_strlen) || defined(CFE_API_ALL)) \
  376. && !defined(CFE_API_STRLEN_CUSTOM)
  377. int cfe_strlen(char *name)
  378. {
  379. int count = 0;
  380. while (*name++)
  381. count++;
  382. return count;
  383. }
  384. #endif /* CFE_API_strlen || CFE_API_ALL */
  385. #if defined(CFE_API_write) || defined(CFE_API_ALL)
  386. int cfe_write(int handle, unsigned char *buffer, int length)
  387. {
  388. return cfe_writeblk(handle, 0, buffer, length);
  389. }
  390. #endif /* CFE_API_write || CFE_API_ALL */
  391. #if defined(CFE_API_writeblk) || defined(CFE_API_ALL)
  392. int
  393. cfe_writeblk(int handle, cfe_xint_t offset, unsigned char *buffer,
  394. int length)
  395. {
  396. cfe_xiocb_t xiocb;
  397. xiocb.xiocb_fcode = CFE_CMD_DEV_WRITE;
  398. xiocb.xiocb_status = 0;
  399. xiocb.xiocb_handle = handle;
  400. xiocb.xiocb_flags = 0;
  401. xiocb.xiocb_psize = sizeof(xiocb_buffer_t);
  402. xiocb.plist.xiocb_buffer.buf_offset = offset;
  403. xiocb.plist.xiocb_buffer.buf_ptr = XPTR_FROM_NATIVE(buffer);
  404. xiocb.plist.xiocb_buffer.buf_length = length;
  405. cfe_iocb_dispatch(&xiocb);
  406. if (xiocb.xiocb_status < 0)
  407. return xiocb.xiocb_status;
  408. return xiocb.plist.xiocb_buffer.buf_retlen;
  409. }
  410. #endif /* CFE_API_writeblk || CFE_API_ALL */