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, ¶ms); 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, ¶ms); 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