14e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park/** @addtogroup MCD_MCDIMPL_DAEMON_KERNEL
24e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * @{
34e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * @file
44e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park *
54e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * MobiCore Driver Kernel Module Interface.
64e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park *
74e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * <!-- Copyright Giesecke & Devrient GmbH 2009 - 2012 -->
89081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim *
94e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * Redistribution and use in source and binary forms, with or without
104e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * modification, are permitted provided that the following conditions
114e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * are met:
124e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 1. Redistributions of source code must retain the above copyright
134e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park *    notice, this list of conditions and the following disclaimer.
144e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 2. Redistributions in binary form must reproduce the above copyright
154e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park *    notice, this list of conditions and the following disclaimer in the
164e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park *    documentation and/or other materials provided with the distribution.
174e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 3. The name of the author may not be used to endorse or promote
184e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park *    products derived from this software without specific prior
194e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park *    written permission.
204e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park *
214e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
224e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
234e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
244e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
254e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
264e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
274e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
284e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
294e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
304e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
314e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
324e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park */
334e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#ifndef CMCKMOD_H_
344e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#define CMCKMOD_H_
354e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
364e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include <stdint.h>
374e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
384e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include "McTypes.h"
394e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include "CKMod.h"
404e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
414e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
424e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park/**
434e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * As this is also used by the ClientLib, we do not use exceptions.
444e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park */
457b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kimclass CMcKMod : public CKMod
467b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim{
474e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Parkpublic:
487b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    /**
497b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    * Map data.
507b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    *
517b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    * @param len
527b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    * @param pHandle
537b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    * @param pVirtAddr
547b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    * @param pPhysAddr
557b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    *
567b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    * @return 0 if all went fine
577b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    * @return MC_DRV_ERR_KMOD_NOT_OPEN
587b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    * @return MC_DRV_ERR_KERNEL_MODULE or'ed with errno<<16
597b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    */
607b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    mcResult_t mapWsm(uint32_t  len,
617b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim                      uint32_t    *pHandle,
627b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim                      addr_t      *pVirtAddr,
637b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim                      addr_t      *pPhysAddr);
647b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    /**
657b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    * Map data.
667b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    *
677b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    * @param len
687b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    * @param pHandle
697b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    * @param pVirtAddr
707b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    * @param pPhysAddr
717b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    * @param pMciReuse [in|out] set to true [in] for reusing MCI buffer
727b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    *                 is set to true [out] if MCI buffer has been reused
737b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    * @return 0 if all went fine
747b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    * @return MC_DRV_ERR_KMOD_NOT_OPEN
757b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    * @return MC_DRV_ERR_KERNEL_MODULE or'ed with errno<<16
767b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    */
777b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    mcResult_t mapMCI(
787b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim        uint32_t    len,
797b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim        uint32_t    *pHandle,
807b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim        addr_t      *pVirtAddr,
817b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim        addr_t      *pPhysAddr,
827b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim        bool        *pReuse);
837b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim
847b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    /**
857b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    * Map persistent WSM which will not be freed up once the calling process dies.
867b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    */
877b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    mcResult_t mapPersistent(
887b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim        uint32_t    len,
897b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim        uint32_t    *pHandle,
907b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim        addr_t      *pVirtAddr,
917b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim        addr_t      *pPhysAddr);
927b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim
937b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    int read(addr_t buffer, uint32_t len);
947b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim
957b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    bool waitSSIQ(uint32_t *pCnt);
967b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim
977b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    int fcInit(uint32_t nqOffset,
987b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim               uint32_t    nqLength,
997b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim               uint32_t    mcpOffset,
1007b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim               uint32_t    mcpLength);
1017b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim
1027b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    int fcInfo(
1037b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim        uint32_t    extInfoId,
1047b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim        uint32_t    *pState,
1057b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim        uint32_t    *pExtInfo);
1067b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim
1077b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    int fcYield(void);
1087b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim
1097b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    int fcNSIQ(void);
1107b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim
1117b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    mcResult_t free(uint32_t handle, addr_t buffer, uint32_t len);
1127b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim
1137b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    mcResult_t registerWsmL2(
1147b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim        addr_t      buffer,
1157b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim        uint32_t    len,
1167b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim        uint32_t    pid,
1177b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim        uint32_t    *pHandle,
1187b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim        addr_t      *pPhysWsmL2);
1197b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim
1207b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    mcResult_t unregisterWsmL2(uint32_t handle);
1217b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim
1227b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    mcResult_t lockWsmL2(uint32_t handle);
1237b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim
1247b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    mcResult_t unlockWsmL2(uint32_t handle);
1257b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim
1267b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    mcResult_t cleanupWsmL2(void);
1277b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim
1287b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    addr_t findWsmL2(uint32_t handle);
1297b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim
1307b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    mcResult_t findContiguousWsm(uint32_t handle, addr_t *phys, uint32_t *len);
1317b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim
1327b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    /**
1337b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    * Tell stub to start MobiCore from given physical address
1347b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    */
1357b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    int fcExecute(addr_t startAddr, uint32_t areaLength);
1367b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim
1377b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim    bool checkVersion(void);
1384e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park};
1394e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
1404e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Parktypedef CMcKMod  *CMcKMod_ptr;
1414e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
1424e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#endif // CMCKMOD_H_
143