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//------------------------------------------------------------------------------ 507b143edf281bed18c8ebd0733465f3af5af327ebJungtae KimMC_CHECK_VERSION(MCDRVMODULEAPI, 1, 1); 514e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 524e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 537b143edf281bed18c8ebd0733465f3af5af327ebJungtae KimmcResult_t CMcKMod::mapWsm( 547b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim uint32_t len, 557b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim uint32_t *pHandle, 567b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim addr_t *pVirtAddr, 577b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim addr_t *pPhysAddr) 589081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim{ 597b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim int ret = 0; 607b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_V(" mapWsm(): len=%d", len); 619081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim 627b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (!isOpen()) { 637b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_E("no connection to kmod"); 647b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return MC_DRV_ERR_KMOD_NOT_OPEN; 657b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 669081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim 677b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim // mapping response data is in the buffer 687b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kimstruct mc_ioctl_map mapParams = { len: 697b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim len 707b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim }; 719081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim 727b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim ret = ioctl(fdKMod, MC_IO_MAP_WSM, &mapParams); 737b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (ret != 0) { 747b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_ERRNO("ioctl MC_IO_MAP_WSM"); 757b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return MAKE_MC_DRV_KMOD_WITH_ERRNO(errno); 767b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 779081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim 787b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim addr_t virtAddr = ::mmap(0, len, PROT_READ | PROT_WRITE, MAP_SHARED, 797b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim fdKMod, mapParams.phys_addr); 807b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (virtAddr == MAP_FAILED) { 817b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_ERRNO("mmap"); 827b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return MAKE_MC_DRV_KMOD_WITH_ERRNO(errno); 837b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 844e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 854e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 867b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_V(" mapped to %p, handle=%d, phys=%p ", virtAddr, 877b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim mapParams.handle, (addr_t) (mapParams.phys_addr)); 889081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim 897b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (pVirtAddr != NULL) { 907b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim *pVirtAddr = virtAddr; 917b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 929081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim 937b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (pHandle != NULL) { 947b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim *pHandle = mapParams.handle; 957b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 969081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim 977b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (pPhysAddr != NULL) { 987b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim *pPhysAddr = (addr_t) (mapParams.phys_addr); 997b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 1009081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim 1017b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return 0; 1029081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim} 1034e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1044e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 1057b143edf281bed18c8ebd0733465f3af5af327ebJungtae KimmcResult_t CMcKMod::mapMCI( 1067b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim uint32_t len, 1077b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim uint32_t *pHandle, 1087b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim addr_t *pVirtAddr, 1097b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim addr_t *pPhysAddr, 1107b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim bool *pReuse) 1119081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim{ 1127b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_I("Mapping MCI: len=%d", len); 1137b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim // mapping response data is in the buffer 1147b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kimstruct mc_ioctl_map mapParams = { len: 1157b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim len 1167b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim }; 1177b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1187b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (!isOpen()) { 1197b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_E("no connection to kmod"); 1207b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return MC_DRV_ERR_KMOD_NOT_OPEN; 1217b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 1227b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1237b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim int ret = ioctl(fdKMod, MC_IO_MAP_MCI, &mapParams); 1247b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (ret != 0) { 1259081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim LOG_ERRNO("ioctl MC_IO_MAP_MCI"); 1267b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return MAKE_MC_DRV_KMOD_WITH_ERRNO(errno); 1277b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 1287b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1297b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim addr_t virtAddr = ::mmap(0, len, PROT_READ | PROT_WRITE, MAP_SHARED, 1307b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim fdKMod, 0); 1317b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (virtAddr == MAP_FAILED) { 1327b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_ERRNO("mmap"); 1337b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return MAKE_MC_DRV_KMOD_WITH_ERRNO(errno); 1347b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 1357b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim mapParams.addr = (unsigned long)virtAddr; 1367b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim *pReuse = mapParams.reused; 1377b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1387b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_V(" MCI mapped to %p, handle=%d, phys=%p, reused=%s", 1397b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim (void *)mapParams.addr, mapParams.handle, (addr_t) (mapParams.phys_addr), 1407b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim mapParams.reused ? "true" : "false"); 1417b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1427b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (pVirtAddr != NULL) { 1437b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim *pVirtAddr = (void *)mapParams.addr; 1447b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 1457b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1467b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (pHandle != NULL) { 1477b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim *pHandle = mapParams.handle; 1487b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 1497b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1507b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (pPhysAddr != NULL) { 1517b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim *pPhysAddr = (addr_t) (mapParams.phys_addr); 1527b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 1537b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1547b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim // clean memory 1557b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim //memset(pMmapResp, 0, sizeof(*pMmapResp)); 1567b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1577b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return MC_DRV_OK; 1584e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park} 1594e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1604e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 1617b143edf281bed18c8ebd0733465f3af5af327ebJungtae KimmcResult_t CMcKMod::mapPersistent( 1627b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim uint32_t len, 1637b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim uint32_t *pHandle, 1647b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim addr_t *pVirtAddr, 1657b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim addr_t *pPhysAddr) 1669081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim{ 1677b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim // Not currently supported by the driver 1687b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_E("MobiCore Driver does't support persistent buffers"); 1697b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return MC_DRV_ERR_NOT_IMPLEMENTED; 1709081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim} 1714e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1724e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1739081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim//------------------------------------------------------------------------------ 1749081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kimint CMcKMod::read(addr_t buffer, uint32_t len) 1759081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim{ 1767b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim int ret = 0; 1777b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1787b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (!isOpen()) { 1797b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_E("no connection to kmod"); 1807b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return MC_DRV_ERR_KMOD_NOT_OPEN; 1817b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 1827b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1837b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim ret = ::read(fdKMod, buffer, len); 1847b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (ret == -1) { 1857b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_ERRNO("read"); 1867b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 1877b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return ret; 1884e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park} 1894e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1904e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1914e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 1929081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kimbool CMcKMod::waitSSIQ(uint32_t *pCnt) 1939081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim{ 1947b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim uint32_t cnt; 1957b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (read(&cnt, sizeof(cnt)) != sizeof(cnt)) { 1967b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return false; 1977b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 1989081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim 1997b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (pCnt != NULL) { 2007b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim *pCnt = cnt; 2017b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 2029081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim 2037b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return true; 2044e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park} 2054e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 2064e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 2074e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 2089081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kimint CMcKMod::fcInit(uint32_t nqOffset, uint32_t nqLength, uint32_t mcpOffset, 2097b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim uint32_t mcpLength) 2109081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim{ 2117b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim int ret = 0; 2127b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 2137b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (!isOpen()) { 2147b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return MC_DRV_ERR_KMOD_NOT_OPEN; 2157b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 2167b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 2177b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim // Init MC with NQ and MCP buffer addresses 2187b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim struct mc_ioctl_init fcInitParams = { 2197b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kimnq_offset : 2207b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim nqOffset, 2217b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kimnq_length : 2227b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim nqLength, 2237b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kimmcp_offset : 2247b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim mcpOffset, 2257b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kimmcp_length : 2267b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim mcpLength 2277b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim }; 2287b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim ret = ioctl(fdKMod, MC_IO_INIT, &fcInitParams); 2297b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (ret != 0) { 2309081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim LOG_ERRNO("ioctl MC_IO_INIT"); 2317b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 2324e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 2337b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return ret; 2344e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park} 2354e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 2364e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 2379081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kimint CMcKMod::fcInfo(uint32_t extInfoId, uint32_t *pState, uint32_t *pExtInfo) 2389081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim{ 2397b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim int ret = 0; 2407b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 2417b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (!isOpen()) { 2427b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_E("no connection to kmod"); 2437b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return MC_DRV_ERR_KMOD_NOT_OPEN; 2447b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 2457b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 2467b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim // Init MC with NQ and MCP buffer addresses 2477b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kimstruct mc_ioctl_info fcInfoParams = {ext_info_id : 2487b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim extInfoId 2497b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim }; 2507b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim ret = ioctl(fdKMod, MC_IO_INFO, &fcInfoParams); 2517b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (ret != 0) { 2529081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim LOG_ERRNO("ioctl MC_IO_INFO"); 2537b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return ret; 2547b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 2559081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim 2567b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (pState != NULL) { 2577b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim *pState = fcInfoParams.state; 2587b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 2599081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim 2607b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (pExtInfo != NULL) { 2617b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim *pExtInfo = fcInfoParams.ext_info; 2627b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 2634e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 2647b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return ret; 2654e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park} 2664e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 2674e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 2684e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 2699081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kimint CMcKMod::fcYield(void) 2709081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim{ 2717b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim int ret = 0; 2724e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 2737b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (!isOpen()) { 2747b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_E("no connection to kmod"); 2757b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return MC_DRV_ERR_KMOD_NOT_OPEN; 2767b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 2779081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim 2787b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim ret = ioctl(fdKMod, MC_IO_YIELD, NULL); 2797b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (ret != 0) { 2809081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim LOG_ERRNO("ioctl MC_IO_YIELD"); 2819081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim LOG_E("ret = %d", ret); 2827b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 2834e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 2847b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return ret; 2854e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park} 2864e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 2874e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 2884e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 2899081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kimint CMcKMod::fcNSIQ(void) 2909081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim{ 2917b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim int ret = 0; 2924e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 2937b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (!isOpen()) { 2947b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_E("no connection to kmod"); 2957b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return MC_DRV_ERR_KMOD_NOT_OPEN; 2967b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 2979081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim 2987b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim ret = ioctl(fdKMod, MC_IO_NSIQ, NULL); 2997b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (ret != 0) { 3009081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim LOG_ERRNO("ioctl MC_IO_NSIQ"); 3019081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim LOG_E("ret = %d", ret); 3027b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 3034e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 3047b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return ret; 3054e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park} 3064e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 3074e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 3084e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 3097b143edf281bed18c8ebd0733465f3af5af327ebJungtae KimmcResult_t CMcKMod::free(uint32_t handle, addr_t buffer, uint32_t len) 3109081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim{ 3117b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_V("free(): handle=%d", handle); 3127b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 3137b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (!isOpen()) { 3147b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_E("no connection to kmod"); 3157b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return MC_DRV_ERR_KMOD_NOT_OPEN; 3167b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 3177b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 3187b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim // Even if unmap fails we still go on with our request 3197b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (::munmap(buffer, len)) { 3207b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_I("buffer = %p, len = %d", buffer, len); 3217b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_ERRNO("mmap failed"); 3227b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 3237b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 3247b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim int ret = ioctl(fdKMod, MC_IO_FREE, handle); 3257b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (ret != 0) { 3267b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_ERRNO("ioctl MC_IO_FREE"); 3277b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return MAKE_MC_DRV_KMOD_WITH_ERRNO(errno); 3287b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 3297b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 3307b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return MC_DRV_OK; 3317b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim} 3324e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 3334e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 3347b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim//------------------------------------------------------------------------------ 3357b143edf281bed18c8ebd0733465f3af5af327ebJungtae KimmcResult_t CMcKMod::registerWsmL2( 3367b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim addr_t buffer, 3377b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim uint32_t len, 3387b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim uint32_t pid, 3397b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim uint32_t *pHandle, 3407b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim addr_t *pPhysWsmL2) 3417b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim{ 3427b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_I(" Registering virtual buffer at %p, len=%d as World Shared Memory", buffer, len); 3437b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 3447b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (!isOpen()) { 3457b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_E("no connection to kmod"); 3467b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return MC_DRV_ERR_KMOD_NOT_OPEN; 3477b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 3487b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 3497b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim struct mc_ioctl_reg_wsm params = { 3507b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kimbuffer : 3517b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim (uint32_t) buffer, 3527b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kimlen : 3537b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim len, 3547b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kimpid : 3557b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim pid 3567b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim }; 3577b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 3587b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim int ret = ioctl(fdKMod, MC_IO_REG_WSM, ¶ms); 3597b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (ret != 0) { 3607b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_ERRNO("ioctl MC_IO_UNREG_WSM"); 3617b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return MAKE_MC_DRV_KMOD_WITH_ERRNO(errno); 3627b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 3637b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 3647b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_I(" Registered, handle=%d, L2 phys=0x%x ", params.handle, params.table_phys); 3657b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 3667b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (pHandle != NULL) { 3677b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim *pHandle = params.handle; 3687b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 3697b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 3707b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (pPhysWsmL2 != NULL) { 3717b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim *pPhysWsmL2 = (addr_t) params.table_phys; 3727b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 3737b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 3747b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return MC_DRV_OK; 3757b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim} 3764e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 3774e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 3787b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim//------------------------------------------------------------------------------ 3797b143edf281bed18c8ebd0733465f3af5af327ebJungtae KimmcResult_t CMcKMod::unregisterWsmL2(uint32_t handle) 3807b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim{ 3817b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_I(" Unregistering World Shared Memory with handle %d", handle); 3827b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 3837b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (!isOpen()) { 3847b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_E("no connection to kmod"); 3857b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return MC_DRV_ERR_KMOD_NOT_OPEN; 3867b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 3874e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 3887b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim int ret = ioctl(fdKMod, MC_IO_UNREG_WSM, handle); 3897b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (ret != 0) { 3907b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_ERRNO("ioctl MC_IO_UNREG_WSM"); 3917b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return MAKE_MC_DRV_KMOD_WITH_ERRNO(errno); 3927b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 3937b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 3947b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return MC_DRV_OK; 3954e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park} 3964e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 3977b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim//------------------------------------------------------------------------------ 3987b143edf281bed18c8ebd0733465f3af5af327ebJungtae KimmcResult_t CMcKMod::lockWsmL2(uint32_t handle) 3997b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim{ 4007b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim int ret = 0; 4017b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 4027b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_I(" Locking World Shared Memory with handle %d", handle); 4037b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 4047b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (!isOpen()) { 4057b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_E("no connection to kmod"); 4067b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return MC_DRV_ERR_KMOD_NOT_OPEN; 4077b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 4087b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 4097b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim ret = ioctl(fdKMod, MC_IO_LOCK_WSM, handle); 4107b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (ret != 0) { 4117b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_ERRNO("ioctl MC_IO_UNREG_WSM"); 4127b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_E("ret = %d", ret); 4137b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 4147b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 4157b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return ret; 4167b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim} 4174e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 4184e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 4197b143edf281bed18c8ebd0733465f3af5af327ebJungtae KimmcResult_t CMcKMod::unlockWsmL2(uint32_t handle) 4209081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim{ 4217b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim int ret = 0; 4224e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 4237b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_I(" Unlocking World Shared Memory with handle %d", handle); 4249081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim 4257b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (!isOpen()) { 4267b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_E("no connection to kmod"); 4277b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return MC_DRV_ERR_KMOD_NOT_OPEN; 4287b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 4299081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim 4307b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim ret = ioctl(fdKMod, MC_IO_UNLOCK_WSM, handle); 4317b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim // Failure here is not really important 4327b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (ret != 0) { 4337b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_I("ret = %d", ret); 4347b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 4359081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim 4367b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return ret; 4377b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim} 4389081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim 4399081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim 4407b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim//------------------------------------------------------------------------------ 4417b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kimaddr_t CMcKMod::findWsmL2(uint32_t handle) 4427b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim{ 4437b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim int ret = 0; 4447b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim uint32_t param = handle; 4457b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 4467b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_I(" Resolving the WSM l2 for handle=%u", handle); 4479081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim 4487b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (!isOpen()) { 4497b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_E("no connection to kmod"); 4507b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return NULL; 4517b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 4524e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 4537b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim ret = ioctl(fdKMod, MC_IO_RESOLVE_WSM, ¶m); 4547b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (ret != 0 || param == 0) { 4557b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_ERRNO("ioctl MC_IO_RESOLVE_WSM"); 4567b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_E("param %u, ret = %d", param, ret); 4577b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 4587b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 4597b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return (addr_t)param; 4604e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park} 4614e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 4627b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim//------------------------------------------------------------------------------ 4637b143edf281bed18c8ebd0733465f3af5af327ebJungtae KimmcResult_t CMcKMod::findContiguousWsm(uint32_t handle, addr_t *phys, uint32_t *len) 4647b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim{ 4657b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim mcResult_t ret = MC_DRV_OK; 4667b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim struct mc_ioctl_resolv_cont_wsm wsm; 4677b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 4687b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim wsm.handle = handle; 4697b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 4707b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_I(" Resolving the contiguous WSM l2 for handle=%u", handle); 4717b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 4727b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (!isOpen()) { 4737b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_E("no connection to kmod"); 4747b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return NULL; 4757b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 4767b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 4777b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim ret = ioctl(fdKMod, MC_IO_RESOLVE_CONT_WSM, &wsm); 4787b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (ret != 0) { 4797b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_ERRNO("ioctl MC_IO_RESOLVE_CONT_WSM"); 4807b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } else { 4817b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim *phys = (addr_t)wsm.phys; 4827b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim *len = wsm.length; 4837b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 4847b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 4857b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return ret; 4867b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim} 4874e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 4884e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 4897b143edf281bed18c8ebd0733465f3af5af327ebJungtae KimmcResult_t CMcKMod::cleanupWsmL2(void) 4909081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim{ 4917b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim int ret = 0; 4924e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 4937b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_I(" Cleaning up the orphaned bulk buffers"); 4944e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 4957b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (!isOpen()) { 4967b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_E("no connection to kmod"); 4977b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return MC_DRV_ERR_KMOD_NOT_OPEN; 4987b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 4994e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 5007b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim ret = ioctl(fdKMod, MC_IO_CLEAN_WSM, 0); 5017b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (ret != 0) { 5027b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_ERRNO("ioctl MC_IO_UNREG_WSM"); 5037b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_E("ret = %d", ret); 5047b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 5054e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 5067b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return ret; 5074e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park} 5084e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 5094e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 5109081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kimint CMcKMod::fcExecute(addr_t startAddr, uint32_t areaLength) 5119081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim{ 5127b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim int ret = 0; 5137b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim struct mc_ioctl_execute params = { 5147b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kimphys_start_addr : 5157b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim (uint32_t)startAddr, 5167b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kimlength : 5177b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim areaLength 5187b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim }; 5197b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 5207b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (!isOpen()) { 5217b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_E("no connection to kmod"); 5227b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return MC_DRV_ERR_KMOD_NOT_OPEN; 5237b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 5247b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 5257b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim ret = ioctl(fdKMod, MC_IO_EXECUTE, ¶ms); 5267b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (ret != 0) { 5279081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim LOG_ERRNO("ioctl MC_IO_EXECUTE"); 5287b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 5299081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim 5307b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return ret; 5314e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park} 5324e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park//------------------------------------------------------------------------------ 5339081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kimbool CMcKMod::checkVersion(void) 5349081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim{ 5357b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim uint32_t version; 5367b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (!isOpen()) { 5377b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_E("no connection to kmod"); 5387b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return false; 5397b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 5407b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 5417b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim int ret = ioctl(fdKMod, MC_IO_VERSION, &version); 5427b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (ret != 0) { 5439081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim LOG_ERRNO("ioctl MC_IO_VERSION"); 5449081ca65cb7959b6a06ba44823f84a6afa8bca2fJihyun Kim LOG_E("ret = %d", ret); 5457b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return false; 5467b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 5477b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 5487b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim // Run-time check. 5497b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim char *errmsg; 5507b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim if (!checkVersionOkMCDRVMODULEAPI(version, &errmsg)) { 5517b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_E("%s", errmsg); 5527b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return false; 5537b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim } 5547b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim LOG_I("%s", errmsg); 5557b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 5567b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim return true; 5574e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park} 5584e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 5594e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park/** @} */ 560