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