CMcKMod.cpp revision 9081ca65cb7959b6a06ba44823f84a6afa8bca2f
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#include <cstdlib>
344e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
354e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include <sys/mman.h>
364e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include <sys/ioctl.h>
374e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include <errno.h>
384e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include <inttypes.h>
394e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include <cstring>
404e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
414e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include "McTypes.h"
429081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim#include "mc_linux.h"
434e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include "mcVersionHelper.h"
444e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
454e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include "CMcKMod.h"
464e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
474e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include "log.h"
484e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
494e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------
504e9e8c9c0169b40318386436d762c3d73cf4c328DongJin ParkMC_CHECK_VERSION(MCDRVMODULEAPI,0,1);
514e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
524e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------
539081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kimint CMcKMod::mapWsm(
544e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	uint32_t	len,
554e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	uint32_t	*pHandle,
564e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	addr_t		*pVirtAddr,
579081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	addr_t		*pPhysAddr)
589081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim{
594e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	int ret = 0;
609081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	LOG_V(" mapWsm(): len=%d", len);
619081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim
629081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (!isOpen())
639081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	{
649081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		LOG_E("no connection to kmod");
659081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		return ERROR_KMOD_NOT_OPEN;
669081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
679081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim
689081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	// mapping response data is in the buffer
699081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	struct mc_ioctl_map mapParams = { len: len};
709081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim
719081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	ret = ioctl(fdKMod, MC_IO_MAP_WSM, &mapParams);
729081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (ret != 0) {
739081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	    LOG_ERRNO("ioctl MC_IO_MAP_WSM");
749081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		return ERROR_MAPPING_FAILED;
759081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
769081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim
779081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	addr_t virtAddr = ::mmap(0, len, PROT_READ | PROT_WRITE, MAP_SHARED,
789081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim			fdKMod, mapParams.phys_addr);
799081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (virtAddr == MAP_FAILED)
804e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	{
819081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	    LOG_ERRNO("mmap");
829081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		return ERROR_MAPPING_FAILED;
839081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
844e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
854e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
869081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	LOG_V(" mapped to %p, handle=%d, phys=%p ", virtAddr,
879081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	      mapParams.handle, (addr_t) (mapParams.phys_addr));
889081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim
899081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (pVirtAddr != NULL) {
909081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		*pVirtAddr = virtAddr;
919081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
929081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim
939081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (pHandle != NULL) {
949081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		*pHandle = mapParams.handle;
959081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
969081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim
979081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (pPhysAddr != NULL) {
989081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		*pPhysAddr = (addr_t) (mapParams.phys_addr);
999081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
1009081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim
1019081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	return 0;
1029081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim}
1034e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
1044e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------
1059081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kimint CMcKMod::mapMCI(
1064e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	uint32_t	len,
1074e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	uint32_t	*pHandle,
1084e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	addr_t		*pVirtAddr,
1099081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	addr_t		*pPhysAddr,
1109081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	bool		*pReuse)
1119081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim{
1124e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	int ret = 0;
1139081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	LOG_I("Mapping MCI: len=%d", len);
1149081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	// mapping response data is in the buffer
1159081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	struct mc_ioctl_map mapParams = { len: len};
1169081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim
1179081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (!isOpen()) {
1189081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		LOG_E("no connection to kmod");
1199081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		return ERROR_KMOD_NOT_OPEN;
1209081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
1219081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim
1229081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	ret = ioctl(fdKMod, MC_IO_MAP_MCI, &mapParams);
1239081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (ret != 0) {
1249081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim        LOG_ERRNO("ioctl MC_IO_MAP_MCI");
1259081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		return ERROR_MAPPING_FAILED;
1269081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
1279081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim
1289081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	addr_t virtAddr = ::mmap(0, len, PROT_READ | PROT_WRITE, MAP_SHARED,
1299081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim			fdKMod, 0);
1309081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (virtAddr == MAP_FAILED)
1314e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	{
1329081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		LOG_ERRNO("mmap");
1339081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		return ERROR_MAPPING_FAILED;
1349081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
1359081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	mapParams.addr = (unsigned long)virtAddr;
1369081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	*pReuse = mapParams.reused;
1374e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
1389081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	LOG_V(" MCI mapped to %p, handle=%d, phys=%p, reused=%s",
1399081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim			(void*)mapParams.addr, mapParams.handle, (addr_t) (mapParams.phys_addr),
1409081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim			mapParams.reused ? "true" : "false");
1414e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
1429081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (pVirtAddr != NULL) {
1439081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		*pVirtAddr = (void*)mapParams.addr;
1449081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
1454e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
1469081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (pHandle != NULL) {
1479081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		*pHandle = mapParams.handle;
1489081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
1494e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
1509081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (pPhysAddr != NULL) {
1519081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		*pPhysAddr = (addr_t) (mapParams.phys_addr);
1529081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
1534e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
1549081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	// clean memory
1559081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	//memset(pMmapResp, 0, sizeof(*pMmapResp));
1564e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
1574e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	return ret;
1584e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park}
1594e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
1604e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------
1619081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kimint CMcKMod::mapPersistent(
1629081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	uint32_t	len,
1639081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	uint32_t	*pHandle,
1649081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	addr_t		*pVirtAddr,
1659081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	addr_t		*pPhysAddr)
1669081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim{
1679081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	// Not currently supported by the driver
1689081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	LOG_E("MobiCore Driver does't support persistent buffers");
1699081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	return ERROR_MAPPING_FAILED;
1709081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim}
1714e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
1724e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
1739081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim//------------------------------------------------------------------------------
1749081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kimint CMcKMod::read(addr_t buffer, uint32_t len)
1759081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim{
1769081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	int ret = 0;
1774e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
1789081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (!isOpen()) {
1799081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		LOG_E("no connection to kmod");
1809081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		return ERROR_KMOD_NOT_OPEN;
1819081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
1824e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
1839081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	ret = ::read(fdKMod, buffer, len);
1849081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if(ret == -1) {
1859081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		LOG_ERRNO("read");
1869081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
1874e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	return ret;
1884e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park}
1894e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
1904e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
1914e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------
1929081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kimbool CMcKMod::waitSSIQ(uint32_t *pCnt)
1939081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim{
1949081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	uint32_t cnt;
1959081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (read(&cnt, sizeof(cnt)) != sizeof(cnt)) {
1969081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim        LOG_ERRNO("read");
1979081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		return false;
1989081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
1999081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim
2009081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (pCnt != NULL) {
2019081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		*pCnt = cnt;
2029081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
2039081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim
2049081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	return true;
2054e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park}
2064e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
2074e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
2084e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------
2099081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kimint CMcKMod::fcInit(uint32_t nqOffset, uint32_t nqLength, uint32_t mcpOffset,
2109081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	uint32_t mcpLength)
2119081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim{
2124e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	int ret = 0;
2134e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
2149081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (!isOpen()) {
2159081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		return ERROR_KMOD_NOT_OPEN;
2169081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
2179081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim
2189081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	// Init MC with NQ and MCP buffer addresses
2199081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	struct mc_ioctl_init fcInitParams = {
2209081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		nq_offset : nqOffset,
2219081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		nq_length : nqLength,
2229081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		mcp_offset : mcpOffset,
2239081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		mcp_length : mcpLength };
2249081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	ret = ioctl(fdKMod, MC_IO_INIT, &fcInitParams);
2259081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (ret != 0) {
2269081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim        LOG_ERRNO("ioctl MC_IO_INIT");
2279081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim        LOG_E("ret = %d", ret);
2289081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
2294e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
2304e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	return ret;
2314e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park}
2324e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
2334e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------
2349081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kimint CMcKMod::fcInfo(uint32_t extInfoId, uint32_t *pState, uint32_t *pExtInfo)
2359081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim{
2364e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	int ret = 0;
2374e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
2389081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (!isOpen()) {
2399081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		LOG_E("no connection to kmod");
2409081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		return ERROR_KMOD_NOT_OPEN;
2419081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
2429081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim
2439081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	// Init MC with NQ and MCP buffer addresses
2449081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	struct mc_ioctl_info fcInfoParams = {ext_info_id : extInfoId };
2459081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	ret = ioctl(fdKMod, MC_IO_INFO, &fcInfoParams);
2469081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (ret != 0)
2474e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	{
2489081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim        LOG_ERRNO("ioctl MC_IO_INFO");
2499081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim        LOG_E("ret = %d", ret);
2509081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		return ret;
2519081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
2529081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim
2539081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (pState != NULL) {
2549081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		*pState = fcInfoParams.state;
2559081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
2569081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim
2579081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (pExtInfo != NULL) {
2589081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		*pExtInfo = fcInfoParams.ext_info;
2599081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
2604e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
2614e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	return ret;
2624e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park}
2634e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
2644e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
2654e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------
2669081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kimint CMcKMod::fcYield(void)
2679081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim{
2684e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	int ret = 0;
2694e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
2709081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (!isOpen()) {
2719081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		LOG_E("no connection to kmod");
2729081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		return ERROR_KMOD_NOT_OPEN;
2739081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
2749081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim
2759081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	ret = ioctl(fdKMod, MC_IO_YIELD, NULL);
2769081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (ret != 0) {
2779081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim        LOG_ERRNO("ioctl MC_IO_YIELD");
2789081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim        LOG_E("ret = %d", ret);
2799081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
2804e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
2814e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	return ret;
2824e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park}
2834e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
2844e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
2854e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------
2869081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kimint CMcKMod::fcNSIQ(void)
2879081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim{
2884e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	int ret = 0;
2894e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
2909081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (!isOpen()) {
2919081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		LOG_E("no connection to kmod");
2929081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		return  ERROR_KMOD_NOT_OPEN;
2939081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
2949081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim
2959081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	ret = ioctl(fdKMod, MC_IO_NSIQ, NULL);
2969081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (ret != 0) {
2979081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim        LOG_ERRNO("ioctl MC_IO_NSIQ");
2989081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim        LOG_E("ret = %d", ret);
2999081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
3004e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
3014e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	return ret;
3024e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park}
3034e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
3044e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
3054e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------
3069081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kimint CMcKMod::free(uint32_t handle, addr_t buffer, uint32_t len)
3079081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim{
3084e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	int ret = 0;
3094e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
3109081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	LOG_V("free(): handle=%d", handle);
3114e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
3129081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (!isOpen()) {
3139081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		LOG_E("no connection to kmod");
3149081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		return ERROR_KMOD_NOT_OPEN;
3159081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
3164e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
3179081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	// Even if unmap fails we still go on with our request
3189081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if(::munmap(buffer, len)) {
3199081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		LOG_I("buffer = %p, len = %d", buffer, len);
3209081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
3214e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
3229081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	ret = ioctl(fdKMod, MC_IO_FREE, handle);
3239081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (ret != 0) {
3249081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		LOG_ERRNO("ioctl MC_IO_FREE");
3259081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		LOG_E("ret = %d", ret);
3269081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
3274e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
3284e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	return ret;
3294e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park}
3304e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
3314e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
3324e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------
3334e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Parkint CMcKMod::registerWsmL2(
3344e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	addr_t		buffer,
3354e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	uint32_t	len,
3364e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	uint32_t	pid,
3374e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	uint32_t	*pHandle,
3389081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	addr_t		*pPhysWsmL2)
3399081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim{
3404e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	int ret = 0;
3414e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
3429081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	LOG_I(" Registering virtual buffer at %p, len=%d as World Shared Memory", buffer, len);
3439081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim
3449081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (!isOpen()) {
3459081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		LOG_E("no connection to kmod");
3469081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		return ERROR_KMOD_NOT_OPEN;
3479081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
3489081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim
3499081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	struct mc_ioctl_reg_wsm params = {
3509081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim			buffer : (uint32_t) buffer,
3519081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim			len : len,
3529081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim			pid : pid };
3539081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim
3549081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	ret = ioctl(fdKMod, MC_IO_REG_WSM, &params);
3559081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (ret != 0) {
3569081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	    LOG_ERRNO("ioctl MC_IO_REG_WSM");
3579081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		return ret;
3589081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
3599081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim
3609081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	LOG_I(" Registered, handle=%d, L2 phys=0x%x ", params.handle, params.table_phys);
3619081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim
3629081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (pHandle != NULL) {
3639081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		*pHandle = params.handle;
3649081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
3659081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim
3669081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (pPhysWsmL2 != NULL) {
3679081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		*pPhysWsmL2 = (addr_t) params.table_phys;
3689081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
3694e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
3704e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	return ret;
3714e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park}
3724e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
3734e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
3744e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------
3759081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kimint CMcKMod::unregisterWsmL2(uint32_t handle)
3769081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim{
3774e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	int ret = 0;
3784e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
3799081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	LOG_I(" Unregistering World Shared Memory with handle %d", handle);
3804e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
3819081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (!isOpen()) {
3829081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		LOG_E("no connection to kmod");
3839081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		return ERROR_KMOD_NOT_OPEN;
3849081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
3854e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
3869081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	ret = ioctl(fdKMod, MC_IO_UNREG_WSM, handle);
3879081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (ret != 0) {
3889081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		LOG_ERRNO("ioctl MC_IO_UNREG_WSM");
3899081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		LOG_E("ret = %d", ret);
3909081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
3914e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
3924e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park	return ret;
3934e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park}
3944e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
3954e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------
3969081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kimint CMcKMod::fcExecute(addr_t startAddr, uint32_t areaLength)
3979081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim{
3989081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	int ret = 0;
3999081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	struct mc_ioctl_execute params = {
4009081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		phys_start_addr : (uint32_t)startAddr,
4019081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		length : areaLength};
4029081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim
4039081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (!isOpen()) {
4049081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		LOG_E("no connection to kmod");
4059081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		return ERROR_KMOD_NOT_OPEN;
4069081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
4079081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim
4089081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	ret = ioctl(fdKMod, MC_IO_EXECUTE, &params);
4099081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (ret != 0) {
4109081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim        LOG_ERRNO("ioctl MC_IO_EXECUTE");
4119081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim        LOG_E("ret = %d", ret);
4129081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
4139081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim
4149081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	return ret;
4154e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park}
4164e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------
4179081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kimbool CMcKMod::checkVersion(void)
4189081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim{
4199081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	uint32_t version;
4209081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (!isOpen()) {
4219081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		LOG_E("no connection to kmod");
4229081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		return false;
4239081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
4249081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim
4259081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	int ret = ioctl(fdKMod, MC_IO_VERSION, &version);
4269081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (ret != 0){
4279081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim        LOG_ERRNO("ioctl MC_IO_VERSION");
4289081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim        LOG_E("ret = %d", ret);
4299081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		return false;
4309081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
4319081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim
4329081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	// Run-time check.
4339081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	char* errmsg;
4349081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	if (!checkVersionOkMCDRVMODULEAPI(version, &errmsg)) {
4359081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		LOG_E("%s", errmsg);
4369081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim		return false;
4379081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	}
4389081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	LOG_I("%s", errmsg);
4399081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim
4409081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim	return true;
4414e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park}
4424e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park
4434e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park/** @} */
444