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, &params);
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, &param);
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, &params);
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