14e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park/** @addtogroup MCD_MCDIMPL_DAEMON_DEV 24e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * @{ 34e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * @file 44e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 54e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * Class for TrustZone Devices. 64e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * TrustZone device implements communication functions needed for 74e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * accessing MobiCore located in an TrustZone environment. 84e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 94e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * <!-- Copyright Giesecke & Devrient GmbH 2009 - 2012 --> 107b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim * 114e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * Redistribution and use in source and binary forms, with or without 124e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * modification, are permitted provided that the following conditions 134e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * are met: 144e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 1. Redistributions of source code must retain the above copyright 154e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * notice, this list of conditions and the following disclaimer. 164e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 2. Redistributions in binary form must reproduce the above copyright 174e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * notice, this list of conditions and the following disclaimer in the 184e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * documentation and/or other materials provided with the distribution. 194e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 3. The name of the author may not be used to endorse or promote 204e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * products derived from this software without specific prior 214e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * written permission. 224e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * 234e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS 244e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 254e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 264e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 274e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 284e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE 294e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 304e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 314e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 324e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 334e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 344e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park */ 354e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#ifndef TRUSTZONEDEVICE_H_ 364e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#define TRUSTZONEDEVICE_H_ 374e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 384e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 394e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include <stdint.h> 404e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 414e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include "McTypes.h" 424e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 434e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include "CSemaphore.h" 444e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include "CMcKMod.h" 454e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include "CWsm.h" 464e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 474e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include "ExcDevice.h" 484e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#include "MobiCoreDevice.h" 494e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 504e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 514e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#define SCHEDULING_FREQ 5 /**< N-SIQ every n-th time */ 524e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 537b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kimclass TrustZoneDevice : public MobiCoreDevice 547b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim{ 554e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 564e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Parkprotected: 577b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim bool schedulerEnabled; /**< NQ IRQ Scheduler enabling */ 587b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim CSemaphore schedSync; /**< Semaphore to synchronize S-SIQs with scheduler thread */ 597b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim CMcKMod_ptr pMcKMod; /**< kernel module */ 604e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park CWsm_ptr pWsmMcp; /**< WSM use for MCP */ 614e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park CWsm_ptr mobicoreInDDR; /**< WSM used for Mobicore binary */ 624e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 637b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim /** Access functions to the MC Linux kernel module 647b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim */ 657b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim bool yield(void); 664e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 677b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim bool nsiq(void); 684e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 697b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim bool waitSsiq(void); 704e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 714e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Parkpublic: 724e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 737b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim TrustZoneDevice(void); 747b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 757b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim virtual ~TrustZoneDevice(void); 767b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 777b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim// static MobiCoreDevice* getDeviceInstance( 787b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim// void 797b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim// ); 807b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim /** Set up MCI and wait till MC is initialized 817b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim * 827b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim * @param devFile the device node to speak to. 837b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim * @param loadMobiCore 847b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim * @param mobicoreImage 857b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim * @param enableScheduler 867b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim * 877b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim * @return true if mobicore is initialized 887b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim * @trows ExcDevice 897b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim */ 907b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim bool initDevice( 917b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim const char *devFile, 927b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim bool loadMobiCore, 937b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim const char *mobicoreImage, 947b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim bool enableScheduler 954e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park ); 964e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 977b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim void initDeviceStep2(void); 984e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 997b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim void notify(uint32_t sessionId); 1004e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1017b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim void dumpMobicoreStatus(void); 1024e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1037b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim uint32_t getMobicoreStatus(void); 1047b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1057b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim bool checkMciVersion(void); 1067b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1077b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim /** Memory allocation functions */ 1087b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim bool getMciInstance(uint32_t len, CWsm_ptr *mci, bool *reused); 1097b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1107b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim //bool freeWsm(CWsm_ptr pWsm); 1117b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1127b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim CWsm_ptr registerWsmL2(addr_t buffer, uint32_t len, uint32_t pid); 1137b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1147b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim bool unregisterWsmL2(CWsm_ptr pWsm); 1157b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1167b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim bool lockWsmL2(uint32_t handle); 1177b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1187b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim bool unlockWsmL2(uint32_t handle); 1197b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1207b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim addr_t findWsmL2(uint32_t handle); 1217b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1227b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim bool findContiguousWsm(uint32_t handle, addr_t *phys, uint32_t *len); 1237b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim 1247b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim /** 1257b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim * Cleanup all orphaned bulk buffers. 1267b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim */ 1277b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim bool cleanupWsmL2(void); 1284e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1294e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park /** 1304e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park * Allocates persistent WSM memory for TL (won't be fried when TLC exits). 1314e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park */ 1327b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim CWsm_ptr allocateContiguousPersistentWsm(uint32_t len); 1334e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1347b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim bool schedulerAvailable(void); 1354e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1367b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim void schedule(void); 1374e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1387b143edf281bed18c8ebd0733465f3af5af327ebJungtae Kim void handleIrq(void); 1394e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park}; 1404e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1414e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park#endif /* TRUSTZONEDEVICE_H_ */ 1424e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park 1434e9e8c9c0169b40318386436d762c3d73cf4c328DongJin Park/** @} */ 144